\r
#include "NSProviderListener.h"\r
\r
+bool NSProviderIsSyncAttributes(OCRepPayload * payload);\r
+bool NSProviderIsTopicAttributes(OCRepPayload * payload);\r
+OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,\r
+ OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,\r
+ NSInterfaceType interfaceType, NSResourceType resourceType);\r
+\r
OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag,\r
OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
{\r
NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - IN");\r
\r
- OCEntityHandlerResult ehResult = OC_EH_OK;\r
+ OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
\r
(void)callback;\r
\r
if (!entityHandlerRequest)\r
{\r
NS_LOG(ERROR, "Invalid request pointer");\r
- return OC_EH_ERROR;\r
+ return ehResult;\r
}\r
\r
if (flag & OC_REQUEST_FLAG)\r
{\r
NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_GET");\r
\r
+ char * reqInterface =\r
+ NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+ if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
+ && strcmp(reqInterface, NS_INTERFACE_READ) != 0)\r
+ {\r
+ NS_LOG(ERROR, "Invalid interface");\r
+ return ehResult;\r
+ }\r
+\r
NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY,\r
NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
\r
+ ehResult = OC_EH_OK;\r
}\r
else\r
{\r
{\r
NS_LOG(DEBUG, "NSEntityHandlerMessageCb - IN");\r
\r
- OCEntityHandlerResult ehResult = OC_EH_OK;\r
+ OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
+ char * reqInterface = NULL;\r
+ OCRepPayload * payload = NULL;\r
\r
(void)callback;\r
\r
if (!entityHandlerRequest)\r
{\r
NS_LOG (ERROR,"Invalid request pointer");\r
- return OC_EH_ERROR;\r
+ return ehResult;\r
}\r
\r
- OCEntityHandlerResponse response;\r
- response.numSendVendorSpecificHeaderOptions = 0;\r
- memset(response.sendVendorSpecificHeaderOptions, 0,\r
- sizeof response.sendVendorSpecificHeaderOptions);\r
- memset(response.resourceUri, 0, sizeof response.resourceUri);\r
-\r
if (flag & OC_REQUEST_FLAG)\r
{\r
NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
+\r
+ if (OC_REST_GET == entityHandlerRequest->method)\r
+ {\r
+ NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_GET");\r
+\r
+ reqInterface =\r
+ NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+ if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
+ && strcmp(reqInterface, NS_INTERFACE_READ) != 0)\r
+ {\r
+ NS_LOG(ERROR, "Invalid interface");\r
+ return ehResult;\r
+ }\r
+\r
+ ehResult = OC_EH_OK;\r
+ }\r
+ else\r
+ {\r
+ NS_LOG_V (DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
+ }\r
}\r
\r
if (flag & OC_OBSERVE_FLAG)\r
"Register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION,\r
NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
+ ehResult = OC_EH_OK;\r
+\r
+ if (NSGetPolicy() == NS_POLICY_CONSUMER)\r
+ {\r
+ return ehResult;\r
+ }\r
}\r
else if(ocObAction == OC_OBSERVE_DEREGISTER)\r
{\r
"Deregister Message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,\r
NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
+ ehResult = OC_EH_OK;\r
}\r
}\r
\r
- response.requestHandle = entityHandlerRequest->requestHandle;\r
- response.resourceHandle = entityHandlerRequest->resource;\r
- response.persistentBufferFlag = 0;\r
- response.ehResult = OC_EH_OK;\r
- response.payload = (OCPayload *) NULL;\r
-\r
- if (OCDoResponse(&response) != OC_STACK_OK)\r
- {\r
- NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
- return NS_ERROR;\r
- }\r
-\r
NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT");\r
- return ehResult;\r
+ return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
+ NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);\r
}\r
\r
OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,\r
OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
{\r
NS_LOG(DEBUG, "NSEntityHandlerSyncCb - IN");\r
- OCEntityHandlerResult ehResult = OC_EH_OK;\r
+ OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
+ char * reqInterface = NULL;\r
+ OCRepPayload * payload = NULL;\r
\r
(void)callback;\r
\r
if (!entityHandlerRequest)\r
{\r
NS_LOG(ERROR, "Invalid request pointer");\r
- return OC_EH_ERROR;\r
+ return ehResult;\r
}\r
\r
- OCEntityHandlerResponse response;\r
- response.numSendVendorSpecificHeaderOptions = 0;\r
- memset(response.sendVendorSpecificHeaderOptions, 0,\r
- sizeof response.sendVendorSpecificHeaderOptions);\r
- memset(response.resourceUri, 0, sizeof response.resourceUri);\r
-\r
if (flag & OC_REQUEST_FLAG)\r
{\r
NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
\r
- if (OC_REST_POST == entityHandlerRequest->method)\r
+ if (OC_REST_GET == entityHandlerRequest->method)\r
+ {\r
+ reqInterface =\r
+ NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+ if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
+ && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)\r
+ {\r
+ NS_LOG(ERROR, "Invalid interface");\r
+ return ehResult;\r
+ }\r
+\r
+ ehResult = OC_EH_OK;\r
+ }\r
+ else if (OC_REST_POST == entityHandlerRequest->method)\r
{\r
/** Receive sync data from consumer which read or dismiss notification message.\r
And broadcast the sync data to all subscribers including provider app\r
\r
NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");\r
\r
- NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,\r
- NSGetSyncInfo(entityHandlerRequest->payload));\r
-\r
+ if(NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload))\r
+ {\r
+ NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,\r
+ NSGetSyncInfo(entityHandlerRequest->payload));\r
+ ehResult = OC_EH_OK;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
}\r
-\r
- NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
}\r
\r
if (flag & OC_OBSERVE_FLAG)\r
}\r
}\r
\r
- response.requestHandle = entityHandlerRequest->requestHandle;\r
- response.resourceHandle = entityHandlerRequest->resource;\r
- response.persistentBufferFlag = 0;\r
- response.ehResult = OC_EH_OK;\r
- response.payload = (OCPayload *) NULL;\r
-\r
- if (OCDoResponse(&response) != OC_STACK_OK)\r
- {\r
- NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
- return OC_EH_ERROR;\r
- }\r
-\r
NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT");\r
- return ehResult;\r
+ return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
+ NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_SYNC);\r
}\r
\r
OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,\r
OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
{\r
NS_LOG(DEBUG, "NSEntityHandlerTopicCb - IN");\r
- OCEntityHandlerResult ehResult = OC_EH_OK;\r
+ OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
+ char * reqInterface = NULL;\r
+ OCRepPayload * payload = NULL;\r
\r
(void)callback;\r
\r
if (!entityHandlerRequest)\r
{\r
NS_LOG(ERROR, "Invalid request pointer");\r
- return OC_EH_ERROR;\r
+ return ehResult;\r
}\r
\r
if (flag & OC_REQUEST_FLAG)\r
{\r
NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_GET");\r
\r
+ reqInterface =\r
+ NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
+\r
+ if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
+ && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)\r
+ {\r
+ NS_LOG(ERROR, "Invalid interface");\r
+ return ehResult;\r
+ }\r
// send consumer's interesting topic list if consumer id exists\r
// otherwise send registered topic list\r
NSPushQueue(TOPIC_SCHEDULER, TASK_SEND_TOPICS,\r
// Send topic notice message(id = TOPIC) to the consumer \r
// which requests to post.\r
NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST");\r
-\r
// Accepter is provider. our service is not support sendtopiclist from OC_REST_POST\r
- ehResult = OC_EH_ERROR;\r
-\r
// Accepter is consumer. our service is support sendtopiclist from OC_REST_POST\r
if(NSGetPolicy() == false)\r
{\r
NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,\r
NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
ehResult = OC_EH_OK;\r
- OCEntityHandlerResponse response;\r
- response.numSendVendorSpecificHeaderOptions = 0;\r
- memset(response.sendVendorSpecificHeaderOptions, 0,\r
- sizeof response.sendVendorSpecificHeaderOptions);\r
- memset(response.resourceUri, 0, sizeof response.resourceUri);\r
-\r
- response.requestHandle = entityHandlerRequest->requestHandle;\r
- response.resourceHandle = entityHandlerRequest->resource;\r
- response.persistentBufferFlag = 0;\r
- response.ehResult = ehResult;\r
- response.payload = (OCPayload *) NULL;\r
-\r
- if (OCDoResponse(&response) != OC_STACK_OK)\r
- {\r
- NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
- return OC_EH_ERROR;\r
- }\r
}\r
}\r
else\r
}\r
\r
NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");\r
- return ehResult;\r
+ return NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
+ NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC);\r
}\r
\r
void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)\r
{\r
-\r
NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");\r
\r
if (connected)\r
}\r
else\r
{\r
-\r
NS_LOG(DEBUG, "DISCONNECTED");\r
\r
// Set Connection State\r
NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");\r
}\r
\r
+bool NSProviderCompareSyncAttributes(const char * name)\r
+{\r
+ if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||\r
+ !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||\r
+ !strcmp(name, NS_ATTRIBUTE_STATE))\r
+ {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+bool NSProviderIsSyncAttributes(OCRepPayload * payload)\r
+{\r
+ NS_LOG(DEBUG, "get extra info");\r
+\r
+ OCRepPayloadValue * curr = payload->values;\r
+ while(curr)\r
+ {\r
+ if (!NSProviderCompareSyncAttributes(curr->name))\r
+ {\r
+ return false;\r
+ }\r
+ curr = curr->next;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+bool NSProviderCompareTopicAttributes(const char * name)\r
+{\r
+ if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||\r
+ !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))\r
+ {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+bool NSProviderCompareSubTopicAttributes(const char * name)\r
+{\r
+ if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||\r
+ !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))\r
+ {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+bool NSProviderIsTopicAttributes(OCRepPayload * payload)\r
+{\r
+ NS_LOG(DEBUG, "get extra info");\r
+\r
+ OCRepPayloadValue * curr = payload->values;\r
+ while(curr)\r
+ {\r
+ if (!NSProviderCompareSyncAttributes(curr->name))\r
+ {\r
+ return false;\r
+ }\r
+\r
+ if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))\r
+ {\r
+ OCRepPayload ** topicListPayload = NULL;\r
+ OCRepPayloadValue * payloadValue = NULL;\r
+ payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
+ size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
+ size_t dimensions[3] = { dimensionSize, 0, 0 };\r
+\r
+ if (!dimensionSize)\r
+ {\r
+ return false;\r
+ }\r
+\r
+ OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,\r
+ dimensions);\r
+\r
+ for (int i = 0; i < (int) dimensionSize; i++)\r
+ {\r
+ OCRepPayloadValue * subCurr = topicListPayload[i]->values;\r
+ while(subCurr)\r
+ {\r
+ if (!NSProviderCompareSubTopicAttributes(subCurr->name))\r
+ {\r
+ for(int j = i; j < (int) dimensionSize; ++j)\r
+ {\r
+ OCRepPayloadDestroy(topicListPayload[i]);\r
+ }\r
+\r
+ OCRepPayloadDestroy(payload);\r
+ return false;\r
+ }\r
+ subCurr = subCurr->next;\r
+ }\r
+ OCRepPayloadDestroy(topicListPayload[i]);\r
+ }\r
+ }\r
+ curr = curr->next;\r
+ }\r
+\r
+ OCRepPayloadDestroy(payload);\r
+ return true;\r
+}\r
+\r
+OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,\r
+ OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,\r
+ NSInterfaceType interfaceType, NSResourceType resourceType)\r
+{\r
+ if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
+ {\r
+ payload = OCRepPayloadCreate();\r
+\r
+ if (!payload)\r
+ {\r
+ NS_LOG(ERROR, "payload is NULL");\r
+ return ehResult;\r
+ }\r
+\r
+ OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
+ interfaceType == NS_INTERFACE_TYPE_READ ?\r
+ OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)\r
+ : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);\r
+\r
+ char * rtStr = NULL;\r
+ switch (resourceType)\r
+ {\r
+ case NS_RESOURCE_MESSAGE:\r
+ rtStr = NS_COLLECTION_MESSAGE_TYPE;\r
+ break;\r
+ case NS_RESOURCE_SYNC:\r
+ rtStr = NS_COLLECTION_SYNC_TYPE;\r
+ break;\r
+ case NS_RESOURCE_TOPIC:\r
+ rtStr = NS_COLLECTION_TOPIC_TYPE;\r
+ break;\r
+ default:\r
+ NS_LOG(ERROR, "sendResponseError");\r
+ return ehResult;\r
+ }\r
+\r
+ OCResourcePayloadAddStringLL(&payload->types, rtStr);\r
+ }\r
+\r
+ if(resourceType != NS_RESOURCE_TOPIC)\r
+ {\r
+ OCEntityHandlerResponse response;\r
+ response.numSendVendorSpecificHeaderOptions = 0;\r
+ memset(response.sendVendorSpecificHeaderOptions, 0,\r
+ sizeof response.sendVendorSpecificHeaderOptions);\r
+ memset(response.resourceUri, 0, sizeof response.resourceUri);\r
+\r
+ response.requestHandle = entityHandlerRequest->requestHandle;\r
+ response.resourceHandle = entityHandlerRequest->resource;\r
+ response.persistentBufferFlag = 0;\r
+ response.ehResult = ehResult;\r
+ response.payload = (OCPayload *) payload;\r
+\r
+ if (OCDoResponse(&response) != OC_STACK_OK)\r
+ {\r
+ NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
+ OCRepPayloadDestroy(payload);\r
+ return ehResult;\r
+ }\r
+ }\r
+\r
+ OCRepPayloadDestroy(payload);\r
+ return ehResult;\r
+}\r