#define MAX_OBSERVER_FAILED_COMM (2)
#define MAX_OBSERVER_NON_COUNT (3)
-#ifdef CA_INT
-// NOTE: These values are based on the observe option values as defined in the CoAP RFC
-// The values should not be changed unless there is a change in the RFC.
-#define OC_RESOURCE_OBSERVE_REGISTER (0)
-#define OC_RESOURCE_OBSERVE_DEREGISTER (1)
-#endif // CA_INT
-
/* This information is stored for each registerd observer */
typedef struct ResourceObserver {
// Observation Identifier for request
OCResource *resource;
// IP address & port of client registered for observe
OCDevAddr *addr;
+#ifdef CA_INT
+ /** Remote Endpoint address **/
+ CAAddress_t addressInfo;
+ /** Connectivity of the endpoint**/
+ CAConnectivityType_t connectivityType;
+ char CAToken[32]; // TODO-CA: What is max CAToken_t length? Get rid of magic number
+#endif
// Quality of service of the request
OCQualityOfService qos;
// number of times the server failed to reach the observer
ResourceObserver* GetObserverUsingId (const OCObservationId observeId);
#ifdef CA_INT
+OCStackResult AddCAObserver (const char *resUri,
+ const char *query,
+ OCObservationId obsId,
+ OCCoAPToken *token,
+ OCDevAddr *addr,
+ OCResource *resHandle,
+ OCQualityOfService qos,
+ CAAddress_t *addressInfo,
+ CAConnectivityType_t connectivityType,
+ char *CAtoken);
+
OCStackResult
CreateObserveHeaderOption (CAHeaderOption_t **caHdrOpt,
OCHeaderOption *ocHdrOpt,
uint8_t numOptions,
uint8_t observeFlag);
+OCStackResult
+GetObserveHeaderOption (uint32_t * observationOption,
+ CAHeaderOption_t *options,
+ uint8_t * numOptions);
#endif // CA_INT
#endif //OC_OBSERVE_H
return OC_STACK_ERROR;
}
+#ifdef CA_INT
+OCStackResult AddCAObserver (const char *resUri,
+ const char *query,
+ OCObservationId obsId,
+ OCCoAPToken *token,
+ OCDevAddr *addr,
+ OCResource *resHandle,
+ OCQualityOfService qos,
+ CAAddress_t *addressInfo,
+ CAConnectivityType_t connectivityType,
+ char *CAtoken)
+{
+ ResourceObserver *obsNode = NULL;
+
+ obsNode = (ResourceObserver *) OCCalloc(1, sizeof(ResourceObserver));
+ if (obsNode)
+ {
+ obsNode->observeId = obsId;
+
+ obsNode->resUri = (unsigned char *)OCMalloc(strlen(resUri)+1);
+ VERIFY_NON_NULL (obsNode->resUri);
+ memcpy (obsNode->resUri, resUri, strlen(resUri)+1);
+
+ obsNode->qos = qos;
+ if(query)
+ {
+ obsNode->query = (unsigned char *)OCMalloc(strlen(query)+1);
+ VERIFY_NON_NULL (obsNode->query);
+ memcpy (obsNode->query, query, strlen(query)+1);
+ }
+
+ if(token)
+ {
+ obsNode->token.tokenLength = token->tokenLength;
+ memcpy (obsNode->token.token, token->token, token->tokenLength);
+ }
+
+ if(addr)
+ {
+ obsNode->addr = (OCDevAddr *)OCMalloc(sizeof(OCDevAddr));
+ VERIFY_NON_NULL (obsNode->addr);
+ memcpy (obsNode->addr, addr, sizeof(OCDevAddr));
+ }
+
+ obsNode->addressInfo = *addressInfo;
+ obsNode->connectivityType = connectivityType;
+ if(CAtoken)
+ {
+ strncpy(obsNode->CAToken, CAtoken, sizeof(obsNode->CAToken) - 1);
+ }
+
+ obsNode->resource = resHandle;
+
+ LL_APPEND (serverObsList, obsNode);
+ return OC_STACK_OK;
+ }
+
+exit:
+ if (obsNode)
+ {
+ OCFree(obsNode->resUri);
+ OCFree(obsNode->query);
+ OCFree(obsNode->addr);
+ OCFree(obsNode);
+ }
+ return OC_STACK_NO_MEMORY;
+}
+#endif //CA_INT
+
OCStackResult AddObserver (const char *resUri,
const char *query,
OCObservationId obsId,
*caHdrOpt = tmpHdrOpt;
return OC_STACK_OK;
}
+
+OCStackResult
+GetObserveHeaderOption (uint32_t * observationOption,
+ CAHeaderOption_t *options,
+ uint8_t * numOptions)
+{
+ *observationOption = OC_OBSERVE_NO_OPTION;
+ uint8_t i = 0;
+ uint8_t c = 0;
+ for(i = 0; i < *numOptions; i++)
+ {
+ if(options[i].protocolID == CA_COAP_ID &&
+ options[i].optionID == COAP_OPTION_OBSERVE)
+ {
+ *observationOption = options[i].optionData[0];
+ for(c = i; c < *numOptions-1; c++)
+ {
+ options[i].protocolID = options[i+1].protocolID;
+ options[i].optionID = options[i+1].optionID;
+ options[i].optionLength = options[i+1].optionLength;
+ memcpy(options[i].optionData, options[i+1].optionData, options[i+1].optionLength);
+ }
+ (*numOptions)--;
+ return OC_STACK_OK;
+ }
+ }
+ return OC_STACK_OK;
+}
#endif // CA_INT
OC_LOG(INFO, TAG, PCF("Registering observation requested"));
result = GenerateObserverId(&ehRequest.obsInfo.obsId);
VERIFY_SUCCESS(result, OC_STACK_OK);
-
+#ifdef CA_INT
+ result = AddCAObserver ((const char*)(request->resourceUrl),
+ (const char *)(request->query),
+ ehRequest.obsInfo.obsId, &request->requestToken,
+ &request->requesterAddr, resource, request->qos,
+ &request->addressInfo, request->connectivityType,
+ request->token);
+#else
result = AddObserver ((const char*)(request->resourceUrl),
(const char *)(request->query),
ehRequest.obsInfo.obsId, &request->requestToken,
&request->requesterAddr, resource, request->qos);
+#endif //CA_INT
if(result == OC_STACK_OK)
{
OC_LOG(DEBUG, TAG, PCF("Added observer successfully"));
responseInfo.info.type = CA_MSG_NONCONFIRM;
break;
}
+
responseInfo.info.token = serverRequest->token;
responseInfo.info.numOptions = ehResponse->numSendVendorSpecificHeaderOptions;
if (ehResponse->numSendVendorSpecificHeaderOptions)
memcpy(responseInfo.info.options, ehResponse->sendVendorSpecificHeaderOptions, sizeof(OCHeaderOption) * ehResponse->numSendVendorSpecificHeaderOptions);
}
-
// Allocate memory for the payload.
char *payload = (char *)OCMalloc(MAX_RESPONSE_LENGTH);
if(!payload)
return OC_STACK_NO_MEMORY;
}
memset(payload, 0, MAX_RESPONSE_LENGTH);
-
// Put the JSON prefix and suffix around the payload
strcpy(payload, (const char *)OC_JSON_PREFIX);
strcat(payload, (const char *)ehResponse->payload);
serverRequest.reqTotalSize = strlen(requestInfo->info.payload) + 1;
memcpy (&(serverRequest.reqJSONPayload), requestInfo->info.payload,
strlen(requestInfo->info.payload));
+ serverRequest.reqTotalSize = strlen((const char *)requestInfo->info.payload) + 1;
}
else
{
memcpy (&(serverRequest.requestToken.token), requestInfo->info.token,
strlen(requestInfo->info.token));
serverRequest.requestToken.tokenLength = strlen(requestInfo->info.token);
- serverRequest.observationOption = OC_OBSERVE_NO_OPTION;
+
if (requestInfo->info.type == CA_MSG_CONFIRM)
{
serverRequest.qos = OC_HIGH_QOS;
// copy vendor specific header options
// TODO-CA: CA is including non-vendor header options as well, like observe.
// Need to filter those out
+ GetObserveHeaderOption(&serverRequest.observationOption, requestInfo->info.options, &(requestInfo->info.numOptions));
+ printf("\n*****************************\nobservation is %u\n**********************************\n",serverRequest.observationOption);
if (requestInfo->info.numOptions > MAX_HEADER_OPTIONS)
{
// TODO-CA: Need to send an error indicating the num of options is incorrect
if ((method == OC_REST_OBSERVE) || (method == OC_REST_OBSERVE_ALL))
{
result = CreateObserveHeaderOption (&(requestData.options), options,
- numOptions, OC_RESOURCE_OBSERVE_REGISTER);
+ numOptions, OC_OBSERVE_REGISTER);
if (result != OC_STACK_OK)
{
goto exit;