Renamed submodule of Consumer.
[platform/upstream/iotivity.git] / service / notification / src / consumer / NSConsumerDiscovery.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 #include "NSConsumerDiscovery.h"
22
23 #include <string.h>
24 #include "NSCommon.h"
25 #include "NSConsumerCommon.h"
26 #include "NSConstants.h"
27 #include "ocpayload.h"
28 #include "oic_malloc.h"
29
30 #define NS_PAYLOAD_KEY_ACCEPTER "ACCEPTER"
31 #define NS_DISCOVER_QUERY "/oic/res?rt=oic.r.notification"
32 #define NS_PRESENCE_SUBSCRIBE_QUERY "coap://224.0.1.187:5683/oic/ad?rt=oic.r.notification"
33 #define NS_GET_INFORMATION_QUERY "/notification?if=oic.if.notification"
34
35 OCDoHandle * getPresenceHandle()
36 {
37     static OCDoHandle * g_PresenceHandle = NULL;
38
39     return g_PresenceHandle;
40 }
41
42 OCStackApplicationResult NSConsumerPresenceListener(
43         void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
44 {
45     (void) ctx;
46     (void) handle;
47
48     NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
49     NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
50
51     NS_LOG_V(DEBUG, "Presence income : %s:%d",
52             clientResponse->devAddr.addr, clientResponse->devAddr.port);
53     NS_LOG_V(DEBUG, "Presence result : %d",
54             clientResponse->result);
55     NS_LOG_V(DEBUG, "Presence sequenceNum : %d",
56             clientResponse->sequenceNumber);
57
58     if (!NSIsStartedConsumer())
59     {
60         return OC_STACK_DELETE_TRANSACTION;
61     }
62
63     OCPresencePayload * payload = (OCPresencePayload *)clientResponse->payload;
64     if (payload->trigger == OC_PRESENCE_TRIGGER_DELETE ||
65             clientResponse->result == OC_STACK_PRESENCE_STOPPED)
66     {
67         // TODO find request and cancel
68         NS_LOG(DEBUG, "stopped presence or resource is deleted.");
69         //OCCancel(handle, NS_QOS, NULL, 0);
70     }
71
72     else if (payload->trigger == OC_PRESENCE_TRIGGER_CREATE)
73     {
74         NSInvokeRequest(NULL, OC_REST_DISCOVER, clientResponse->addr,
75             NS_DISCOVER_QUERY, NULL, NSProviderDiscoverListener, NULL);
76     }
77
78     return OC_STACK_KEEP_TRANSACTION;
79 }
80
81 OCStackApplicationResult NSProviderDiscoverListener(
82         void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
83 {
84     (void) ctx;
85     (void) handle;
86
87     NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
88     NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
89
90     NS_LOG_V(DEBUG, "Discover income : %s:%d",
91             clientResponse->devAddr.addr, clientResponse->devAddr.port);
92     NS_LOG_V(DEBUG, "Discover result : %d",
93             clientResponse->result);
94     NS_LOG_V(DEBUG, "Discover sequenceNum : %d",
95             clientResponse->sequenceNumber);
96
97     if (!NSIsStartedConsumer())
98     {
99         return OC_STACK_DELETE_TRANSACTION;
100     }
101
102     if (!clientResponse->payload)
103     {
104         return OC_STACK_KEEP_TRANSACTION;
105     }
106
107     OCResourcePayload * resource = ((OCDiscoveryPayload *)clientResponse->payload)->resources;
108     while (resource)
109     {
110         if (!strcmp(resource->uri, NS_RESOURCE_URI))
111         {
112             NSInvokeRequest(NULL, OC_REST_GET, clientResponse->addr,
113                     NS_RESOURCE_URI, NULL, NSIntrospectProvider, NULL);
114         }
115         resource = resource->next;
116     }
117
118     return OC_STACK_KEEP_TRANSACTION;
119 }
120
121 OCStackApplicationResult NSIntrospectProvider(
122         void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
123 {
124     (void) ctx;
125     (void) handle;
126
127     NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
128     NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
129
130     int64_t accepter = 0;
131
132     NS_LOG_V(DEBUG, "GET response income : %s:%d",
133             clientResponse->devAddr.addr, clientResponse->devAddr.port);
134     NS_LOG_V(DEBUG, "GET response result : %d",
135             clientResponse->result);
136     NS_LOG_V(DEBUG, "GET response sequenceNum : %d",
137             clientResponse->sequenceNumber);
138     NS_LOG_V(DEBUG, "GET response resource uri : %s",
139             clientResponse->resourceUri);
140
141     if (!NSIsStartedConsumer())
142     {
143         return OC_STACK_DELETE_TRANSACTION;
144     }
145
146     if (!clientResponse->payload)
147     {
148         NS_LOG(ERROR, "payload is null");
149         return OC_STACK_KEEP_TRANSACTION;
150     }
151
152     if (!OCRepPayloadGetPropInt((OCRepPayload *)clientResponse->payload,
153             NS_PAYLOAD_KEY_ACCEPTER, & accepter))
154     {
155         NS_LOG(ERROR, "can not seach for accepter");
156         return OC_STACK_KEEP_TRANSACTION;
157     }
158
159     NSProvider * newProvider = (NSProvider *)OICMalloc(sizeof(NSProvider));
160     if (!newProvider)
161     {
162         NS_LOG(DEBUG, "NSProvider allocation fail");
163         return OC_STACK_KEEP_TRANSACTION;
164     }
165
166     // TODO set id
167     newProvider->mId = NULL;
168     newProvider->mUserData = (void *)OICMalloc(sizeof(OCDevAddr));
169     if (!newProvider)
170     {
171         NS_LOG(DEBUG, "OCDevAddr allocation fail");
172         OICFree(newProvider);
173         return OC_STACK_KEEP_TRANSACTION;
174     }
175     memcpy(newProvider->mUserData, clientResponse->addr, sizeof(OCDevAddr));
176
177     {
178         OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
179         while (payload)
180         {
181             NS_LOG_V(DEBUG, "Payload Key : %s", payload->values->name);
182             payload = payload->next;
183         }
184     }
185
186     if (!OCRepPayloadGetPropString((OCRepPayload *)clientResponse->payload,
187             "MESSAGE_URI", & newProvider->messageUri))
188     {
189         OICFree(newProvider->mUserData);
190         OICFree(newProvider);
191         NS_LOG(ERROR, "can not seach for message uri");
192         return OC_STACK_KEEP_TRANSACTION;
193     }
194
195     if (!OCRepPayloadGetPropString((OCRepPayload *)clientResponse->payload,
196             NS_ATTRIBUTE_SYNC, & newProvider->syncUri))
197     {
198         OICFree(newProvider->messageUri);
199         OICFree(newProvider->mUserData);
200         OICFree(newProvider);
201         NS_LOG(ERROR, "can not seach for sync uri");
202         return OC_STACK_KEEP_TRANSACTION;
203     }
204
205     if (accepter == NS_ACCEPTER_CONSUMER)
206     {
207         NS_LOG(DEBUG, "accepter is NS_ACCEPTER_CONSUMER, Callback to user");
208
209         NSDiscoveredProvider(newProvider);
210     }
211     else
212     {
213         NS_LOG(DEBUG, "accepter is NS_ACCEPTER_PROVIDER, request subscribe");
214
215         NSTask * task = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) newProvider);
216         if (!task)
217         {
218             NS_LOG(DEBUG, "NSTask allocation fail");
219             return OC_STACK_KEEP_TRANSACTION;
220         }
221
222         NSConsumerPushEvent(task);
223     }
224
225     return OC_STACK_KEEP_TRANSACTION;
226 }
227
228 void NSConsumerDiscoveryTaskProcessing(NSTask * task)
229 {
230     if (!task)
231     {
232         NS_LOG(ERROR, "task is null");
233         return;
234     }
235
236     NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
237     if (task->taskType == TASK_EVENT_CONNECTED || task->taskType == TASK_CONSUMER_REQ_DISCOVER)
238     {
239         NSInvokeRequest(NULL, OC_REST_DISCOVER, NULL, NS_DISCOVER_QUERY,
240                 NULL, NSProviderDiscoverListener, NULL);
241     }
242     else
243     {
244         NS_LOG(ERROR, "Unknown type message");
245     }
246 }
247