1 //******************************************************************
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
11 // http://www.apache.org/licenses/LICENSE-2.0
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.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include "NSConsumerDiscovery.h"
25 #include "NSConsumerCommon.h"
26 #include "NSConstants.h"
27 #include "ocpayload.h"
28 #include "oic_malloc.h"
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"
35 OCDoHandle * getPresenceHandle()
37 static OCDoHandle * g_PresenceHandle = NULL;
39 return g_PresenceHandle;
42 OCStackApplicationResult NSConsumerPresenceListener(
43 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
48 NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
49 NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
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);
58 if (!NSIsStartedConsumer())
60 return OC_STACK_DELETE_TRANSACTION;
63 OCPresencePayload * payload = (OCPresencePayload *)clientResponse->payload;
64 if (payload->trigger == OC_PRESENCE_TRIGGER_DELETE ||
65 clientResponse->result == OC_STACK_PRESENCE_STOPPED)
67 // TODO find request and cancel
68 NS_LOG(DEBUG, "stopped presence or resource is deleted.");
69 //OCCancel(handle, NS_QOS, NULL, 0);
72 else if (payload->trigger == OC_PRESENCE_TRIGGER_CREATE)
74 NSInvokeRequest(NULL, OC_REST_DISCOVER, clientResponse->addr,
75 NS_DISCOVER_QUERY, NULL, NSProviderDiscoverListener, NULL);
78 return OC_STACK_KEEP_TRANSACTION;
81 OCStackApplicationResult NSProviderDiscoverListener(
82 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
87 NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
88 NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
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);
97 if (!NSIsStartedConsumer())
99 return OC_STACK_DELETE_TRANSACTION;
102 if (!clientResponse->payload)
104 return OC_STACK_KEEP_TRANSACTION;
107 OCResourcePayload * resource = ((OCDiscoveryPayload *)clientResponse->payload)->resources;
110 if (!strcmp(resource->uri, NS_RESOURCE_URI))
112 NSInvokeRequest(NULL, OC_REST_GET, clientResponse->addr,
113 NS_RESOURCE_URI, NULL, NSIntrospectProvider, NULL);
115 resource = resource->next;
118 return OC_STACK_KEEP_TRANSACTION;
121 OCStackApplicationResult NSIntrospectProvider(
122 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
127 NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
128 NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
130 int64_t accepter = 0;
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);
141 if (!NSIsStartedConsumer())
143 return OC_STACK_DELETE_TRANSACTION;
146 if (!clientResponse->payload)
148 NS_LOG(ERROR, "payload is null");
149 return OC_STACK_KEEP_TRANSACTION;
152 if (!OCRepPayloadGetPropInt((OCRepPayload *)clientResponse->payload,
153 NS_PAYLOAD_KEY_ACCEPTER, & accepter))
155 NS_LOG(ERROR, "can not seach for accepter");
156 return OC_STACK_KEEP_TRANSACTION;
159 NSProvider * newProvider = (NSProvider *)OICMalloc(sizeof(NSProvider));
162 NS_LOG(DEBUG, "NSProvider allocation fail");
163 return OC_STACK_KEEP_TRANSACTION;
167 newProvider->mId = NULL;
168 newProvider->mUserData = (void *)OICMalloc(sizeof(OCDevAddr));
171 NS_LOG(DEBUG, "OCDevAddr allocation fail");
172 OICFree(newProvider);
173 return OC_STACK_KEEP_TRANSACTION;
175 memcpy(newProvider->mUserData, clientResponse->addr, sizeof(OCDevAddr));
178 OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
181 NS_LOG_V(DEBUG, "Payload Key : %s", payload->values->name);
182 payload = payload->next;
186 if (!OCRepPayloadGetPropString((OCRepPayload *)clientResponse->payload,
187 "MESSAGE_URI", & newProvider->messageUri))
189 OICFree(newProvider->mUserData);
190 OICFree(newProvider);
191 NS_LOG(ERROR, "can not seach for message uri");
192 return OC_STACK_KEEP_TRANSACTION;
195 if (!OCRepPayloadGetPropString((OCRepPayload *)clientResponse->payload,
196 NS_ATTRIBUTE_SYNC, & newProvider->syncUri))
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;
205 if (accepter == NS_ACCEPTER_CONSUMER)
207 NS_LOG(DEBUG, "accepter is NS_ACCEPTER_CONSUMER, Callback to user");
209 NSDiscoveredProvider(newProvider);
213 NS_LOG(DEBUG, "accepter is NS_ACCEPTER_PROVIDER, request subscribe");
215 NSTask * task = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) newProvider);
218 NS_LOG(DEBUG, "NSTask allocation fail");
219 return OC_STACK_KEEP_TRANSACTION;
222 NSConsumerPushEvent(task);
225 return OC_STACK_KEEP_TRANSACTION;
228 void NSConsumerDiscoveryTaskProcessing(NSTask * task)
232 NS_LOG(ERROR, "task is null");
236 NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
237 if (task->taskType == TASK_EVENT_CONNECTED || task->taskType == TASK_CONSUMER_REQ_DISCOVER)
239 NSInvokeRequest(NULL, OC_REST_DISCOVER, NULL, NS_DISCOVER_QUERY,
240 NULL, NSProviderDiscoverListener, NULL);
244 NS_LOG(ERROR, "Unknown type message");