[IOT-2908] Build fail for option WITH_CLOUD.
[iotivity.git] / service / notification / examples / linux / cloud_connector.c
1 //******************************************************************
2 //
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 /// This sample provides the way to create cloud sample
22
23 #include <string.h>
24 #include "ocstack.h"
25 #include "ocpayload.h"
26 #include "rd_client.h"
27 #include "cloud_connector.h"
28
29 static bool isCloudLoggedin = false;
30
31 OCStackResult OCCloudSignup(const char *host, const char *deviceId,
32         const char *authprovider,
33         const char *authcode, OCClientResponseHandler response)
34 {
35         char    targetUri[MAX_URI_LENGTH * 2] = { 0, };
36         snprintf(targetUri, MAX_URI_LENGTH * 2, "%s%s", host, DEFAULT_AUTH_SIGNUP);
37
38         OCCallbackData cbData;
39         memset(&cbData, 0, sizeof(OCCallbackData));
40         cbData.cb = response;
41         cbData.cd = NULL;
42         cbData.context = (void *)DEFAULT_CONTEXT_VALUE;
43
44         printf("Host: %s\n", targetUri);
45         printf("Dev id: %s\n", deviceId);
46         printf("Auth Provider: %s\n", authprovider);
47         printf("Auth Code: %s\n", authcode);
48
49         OCRepPayload *registerPayload = OCRepPayloadCreate();
50
51         OCRepPayloadSetPropString(registerPayload, "di", deviceId);
52         OCRepPayloadSetPropString(registerPayload, "authprovider", authprovider);
53         OCRepPayloadSetPropString(registerPayload, "authcode", authcode);
54
55         return OCDoResource(NULL, OC_REST_POST, targetUri, NULL, (OCPayload *)registerPayload,
56                 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
57 }
58
59 OCStackResult OCCloudSession(const char *host, const char *query, const char *uId,
60         const char *deviceId,
61         const char *accesstoken,
62         bool isLogin, OCClientResponseHandler response)
63 {
64         char    targetUri[MAX_URI_LENGTH * 2] = { 0, };
65         snprintf(targetUri, MAX_URI_LENGTH * 2, "%s%s", host, query);
66
67         OCCallbackData cbData;
68         memset(&cbData, 0, sizeof(OCCallbackData));
69         cbData.cb = response;
70         cbData.cd = NULL;
71         cbData.context = (void *)DEFAULT_CONTEXT_VALUE;
72
73         OCRepPayload *loginoutPayload = OCRepPayloadCreate();
74
75         if (uId != NULL)
76         {
77                 OCRepPayloadSetPropString(loginoutPayload, "uid", uId);
78         }
79
80         if (deviceId != NULL)
81         {
82                 OCRepPayloadSetPropString(loginoutPayload, "di", deviceId);
83         }
84
85         if (accesstoken != NULL)
86         {
87                 OCRepPayloadSetPropString(loginoutPayload, "accesstoken", accesstoken);
88         }
89         OCRepPayloadSetPropBool(loginoutPayload, "login", isLogin);
90
91         return OCDoResource(NULL, OC_REST_POST, targetUri, NULL, (OCPayload *)loginoutPayload,
92                 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
93 }
94
95 //Client should call refresh before expiresin or when receive 4.01 during sign-in
96 OCStackResult OCCloudRefresh(const char *host, const char *query, const char *uId,
97         const char *deviceId, const char *refreshtoken, OCClientResponseHandler response)
98 {
99         char    targetUri[MAX_URI_LENGTH * 2] = { 0, };
100         snprintf(targetUri, MAX_URI_LENGTH * 2, "%s%s", host, query);
101
102         OCCallbackData cbData;
103         memset(&cbData, 0, sizeof(OCCallbackData));
104         cbData.cb = response;
105         cbData.cd = NULL;
106         cbData.context = (void *)DEFAULT_CONTEXT_VALUE;
107
108         OCRepPayload *refreshPayload = OCRepPayloadCreate();
109
110         OCRepPayloadSetPropString(refreshPayload, "uid", uId);
111         OCRepPayloadSetPropString(refreshPayload, "di", deviceId);
112         OCRepPayloadSetPropString(refreshPayload, "granttype", "refresh_token");
113         OCRepPayloadSetPropString(refreshPayload, "refreshtoken", refreshtoken);
114
115         return OCDoResource(NULL, OC_REST_POST, targetUri, NULL, (OCPayload *)refreshPayload,
116                 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
117 }
118
119 OCStackResult OCCloudLogin(const char *host, const char *uId, const char *deviceId,
120         const char *accesstoken, OCClientResponseHandler response)
121 {
122         return OCCloudSession(host, DEFAULT_AUTH_SESSION, uId, deviceId, accesstoken, true, response);
123 }
124
125 OCStackResult OCCloudLogout(const char *host, OCClientResponseHandler response)
126 {
127         return OCCloudSession(host, DEFAULT_AUTH_SESSION, NULL, NULL, NULL, false, response);
128 }
129
130 void printRepresentation(OCRepPayloadValue *value)
131 {
132         while (value)
133         {
134                 printf("Key: %s / ", value->name);
135                 switch (value->type)
136                 {
137                     case OCREP_PROP_NULL:
138                             printf("Value: None\n");
139                             break;
140                     case OCREP_PROP_INT:
141                             printf("Value: %"PRId64"\n", value->i);
142                             break;
143                     case OCREP_PROP_DOUBLE:
144                             printf("Value: %f\n", value->d);
145                             break;
146                     case OCREP_PROP_BOOL:
147                             printf("Value: %d\n", value->b);
148                             break;
149                     case OCREP_PROP_STRING:
150                             printf("Value: %s\n", value->str);
151                             break;
152                     case OCREP_PROP_BYTE_STRING:
153                             printf("Value: Byte String\n");
154                             break;
155                     case OCREP_PROP_OBJECT:
156                             printf("Value: Object\n");
157                             break;
158                     case OCREP_PROP_ARRAY:
159                             printf("Value: Array\n");
160                             break;
161                     default:
162                             break;
163                 }
164                 value = value->next;
165         }
166 }
167
168 // callback for sign-up and sign-in
169 OCStackApplicationResult CloudSignupCallback(void *ctx,
170         OCDoHandle handle, OCClientResponse *clientResponse)
171 {
172     (void) handle;
173     if (ctx != (void *)DEFAULT_CONTEXT_VALUE)
174     {
175         printf("Invalid Cloud Login/out callback received\n");
176     }
177
178     printf("Signup response received: %d\n", clientResponse->result);
179
180     if (clientResponse->payload != NULL &&
181             clientResponse->payload->type == PAYLOAD_TYPE_REPRESENTATION)
182     {
183         printf("PAYLOAD_TYPE_REPRESENTATION received\n");
184         printf("Sign-in using retrieved accesstoken when disconnected or reboot\n");
185
186         OCRepPayloadValue *val = ((OCRepPayload *)clientResponse->payload)->values;
187
188         printf("Get payload values\n");
189         printRepresentation(val);
190     }
191     return OC_STACK_KEEP_TRANSACTION;
192 }
193
194 OCStackApplicationResult CloudLoginoutCallback(void *ctx,
195         OCDoHandle handle, OCClientResponse *clientResponse)
196 {
197     (void) handle;
198     if (ctx != (void *)DEFAULT_CONTEXT_VALUE)
199     {
200         printf("Invalid Cloud Login/out callback received\n");
201     }
202
203     printf("Login/out response received: %d\n", clientResponse->result);
204
205     if (clientResponse->payload != NULL &&
206             clientResponse->payload->type == PAYLOAD_TYPE_REPRESENTATION)
207     {
208         printf("PAYLOAD_TYPE_REPRESENTATION received\n");
209
210         OCRepPayloadValue *val = ((OCRepPayload *)clientResponse->payload)->values;
211
212         printf("Get payload values\n");
213         printRepresentation(val);
214
215         if(clientResponse->result < 5)
216         {
217             isCloudLoggedin = true;
218         }
219     }
220
221     return OC_STACK_KEEP_TRANSACTION;
222 }
223
224 bool IsCloudLoggedin()
225 {
226     return isCloudLoggedin;
227 }
228