X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Focstack.c;h=f5575b1e18e642cc9676933332002c0fb41bb84d;hb=7bd3fb53c0b9c6675297312dbd9ef4a2faf64cbc;hp=c603445c13368ac95df929c6c3a963fb81696680;hpb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index c603445..f5575b1 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -272,11 +272,11 @@ static void deleteResourceType(OCResourceType *resourceType); static void deleteResourceInterface(OCResourceInterface *resourceInterface); /** - * Delete all child resources. + * Unbind all child resources. * - * @param resourceChild Specified binded resource is deleted from parent. + * @param resourceChild Specified binded resource head is deleted from parent. */ -static void deleteResourceChild(OCChildResource *resourceChild); +static void unbindChildResources(OCChildResource *resourceChild); /** * Delete all of the dynamically allocated elements that were created for the resource. @@ -431,15 +431,6 @@ static void OCDefaultAdapterStateChangedHandler(CATransportAdapter_t adapter, bo */ static void OCDefaultConnectionStateChangedHandler(const CAEndpoint_t *info, bool isConnected); -/** - * Register network monitoring callback. - * Network status changes are delivered these callback. - * @param adapterHandler Adapter state monitoring callback. - * @param connectionHandler Connection state monitoring callback. - */ -static void OCSetNetworkMonitorHandler(CAAdapterStateChangedCB adapterHandler, - CAConnectionStateChangedCB connectionHandler); - //----------------------------------------------------------------------------- // Internal functions //----------------------------------------------------------------------------- @@ -588,6 +579,7 @@ OCStackResult OCStackFeedBack(CAToken_t token, uint8_t tokenLength, uint8_t stat 0); if (result != OC_STACK_OK) { + FreeObserver(observer); return result; } @@ -596,6 +588,8 @@ OCStackResult OCStackFeedBack(CAToken_t token, uint8_t tokenLength, uint8_t stat observer->resource->entityHandler(OC_OBSERVE_FLAG, &ehRequest, observer->resource->entityHandlerCallbackParam); } + + FreeObserver(observer); } result = DeleteObserverUsingToken(token, tokenLength); @@ -618,6 +612,7 @@ OCStackResult OCStackFeedBack(CAToken_t token, uint8_t tokenLength, uint8_t stat observer->forceHighQos = 0; observer->failedCommCount = 0; result = OC_STACK_OK; + FreeObserver(observer); } else { @@ -644,6 +639,7 @@ OCStackResult OCStackFeedBack(CAToken_t token, uint8_t tokenLength, uint8_t stat 0); if (result != OC_STACK_OK) { + FreeObserver(observer); return OC_STACK_ERROR; } @@ -672,6 +668,8 @@ OCStackResult OCStackFeedBack(CAToken_t token, uint8_t tokenLength, uint8_t stat observer->failedCommCount); result = OC_STACK_CONTINUE; } + + FreeObserver(observer); } break; default: @@ -1269,9 +1267,9 @@ OCStackResult HandlePresenceResponse(const CAEndpoint_t *endpoint, } } - OIC_LOG(INFO, TAG, "Callback for presence"); - + OIC_LOG(INFO, TAG, "Before calling into application address space for presence"); cbResult = cbNode->callBack(cbNode->context, cbNode->handle, &response); + OIC_LOG(INFO, TAG, "After calling into application address space for presence"); if (cbResult == OC_STACK_DELETE_TRANSACTION) { @@ -1339,9 +1337,6 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp ClientCB *cbNode = GetClientCB(responseInfo->info.token, responseInfo->info.tokenLength, NULL, NULL); - ResourceObserver * observer = GetObserverUsingToken (responseInfo->info.token, - responseInfo->info.tokenLength); - if(cbNode) { OIC_LOG(INFO, TAG, "There is a cbNode associated with the response token"); @@ -1374,7 +1369,6 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp else if(responseInfo->result == CA_RETRANSMIT_TIMEOUT) { OIC_LOG(INFO, TAG, "Receiving A Timeout for this token"); - OIC_LOG(INFO, TAG, "Calling into application address space"); OCClientResponse response = {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}}; @@ -1386,10 +1380,12 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp response.identity.id_length = responseInfo->info.identity.id_length; response.result = CAResponseToOCStackResult(responseInfo->result); + OIC_LOG(INFO, TAG, "Before calling into application address space for reTrans timeout"); cbNode->callBack(cbNode->context, cbNode->handle, &response); + OIC_LOG(INFO, TAG, "After calling into application address space for reTrans timeout"); FindAndDeleteClientCB(cbNode); - OICFree(response.resourceUri); + OICFree((void *)response.resourceUri); } #ifdef __TIZENRT__ else if ((cbNode->method == OC_REST_OBSERVE || cbNode->method == OC_REST_OBSERVE_ALL) @@ -1405,9 +1401,12 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp response.identity.id_length = responseInfo->info.identity.id_length; response.result = OC_STACK_UNAUTHORIZED_REQ; + OIC_LOG(INFO, TAG, "Before calling into application address space for observe resp"); cbNode->callBack(cbNode->context, cbNode->handle, &response); + OIC_LOG(INFO, TAG, "After calling into application address space for observe resp"); + FindAndDeleteClientCB(cbNode); OICFree(response.resourceUri); } @@ -1415,7 +1414,6 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp else { OIC_LOG(INFO, TAG, "This is a regular response, A client call back is found"); - OIC_LOG(INFO, TAG, "Calling into application address space"); OCClientResponse response; memset(&response, 0, sizeof(OCClientResponse)); @@ -1482,7 +1480,7 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp { OIC_LOG_V(ERROR, TAG, "Unknown Payload type in Discovery: %d %s", cbNode->method, cbNode->requestUri); - OICFree(response.resourceUri); + OICFree((void *)response.resourceUri); return; } } @@ -1520,7 +1518,7 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp { OIC_LOG_V(ERROR, TAG, "Unknown Payload type: %d %s", cbNode->method, cbNode->requestUri); - OICFree(response.resourceUri); + OICFree((void *)response.resourceUri); return; } @@ -1534,12 +1532,13 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp { OIC_LOG(ERROR, TAG, "Error converting payload"); OCPayloadDestroy(response.payload); - OICFree(response.resourceUri); + OICFree((void *)response.resourceUri); return; } } else { + OICFree((void *)response.resourceUri); response.resourceUri = OICStrdup(cbNode->requestUri); } } @@ -1575,17 +1574,24 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp { OIC_LOG(ERROR, TAG, "#header options are more than MAX_HEADER_OPTIONS"); OCPayloadDestroy(response.payload); - OICFree(response.resourceUri); + OICFree((void *)response.resourceUri); return; } - for (uint8_t i = start; i < responseInfo->info.numOptions; i++) + if (response.numRcvdVendorSpecificHeaderOptions > 0) { - if(&(responseInfo->info.options[i])) + response.rcvdVendorSpecificHeaderOptions = + (OCHeaderOption *) OICCalloc(response.numRcvdVendorSpecificHeaderOptions, sizeof(OCHeaderOption)); + if (NULL == response.rcvdVendorSpecificHeaderOptions) { - memcpy (&(response.rcvdVendorSpecificHeaderOptions[i-start]), - &(responseInfo->info.options[i]), sizeof(OCHeaderOption)); + OIC_LOG(ERROR, TAG, "Failed to allocate memory for vendor header options"); + OCPayloadDestroy(response.payload); + OICFree((void *)response.resourceUri); + return; } + + memcpy(response.rcvdVendorSpecificHeaderOptions, responseInfo->info.options + start, + response.numRcvdVendorSpecificHeaderOptions*sizeof(OCHeaderOption)); } } @@ -1646,9 +1652,12 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp HandleBatchResponse(cbNode->requestUri, (OCRepPayload **)&response.payload); } + OIC_LOG(INFO, TAG, "Before calling into application address space for handleResponse"); OCStackApplicationResult appFeedback = cbNode->callBack(cbNode->context, cbNode->handle, &response); + OIC_LOG(INFO, TAG, "After calling into application address space for handleResponse"); + cbNode->sequenceNumber = response.sequenceNumber; if (appFeedback == OC_STACK_DELETE_TRANSACTION) @@ -1674,12 +1683,16 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp } } - OICFree(response.resourceUri); + OICFree((void *)response.resourceUri); OCPayloadDestroy(response.payload); + OICFree(response.rcvdVendorSpecificHeaderOptions); } return; } + ResourceObserver * observer = GetObserverUsingToken (responseInfo->info.token, + responseInfo->info.tokenLength); + if(observer) { OIC_LOG(INFO, TAG, "There is an observer associated with the response token"); @@ -1705,6 +1718,8 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp OCStackFeedBack(responseInfo->info.token, responseInfo->info.tokenLength, OC_OBSERVER_FAILED_COMM); } + + FreeObserver(observer); return; } @@ -1817,7 +1832,9 @@ void HandleCAErrorResponse(const CAEndpoint_t *endPoint, const CAErrorInfo_t *er response.identity.id_length = errorInfo->info.identity.id_length; response.result = CAResultToOCResult(errorInfo->result); + OIC_LOG(INFO, TAG, "Before calling into application address space for error response"); cbNode->callBack(cbNode->context, cbNode->handle, &response); + OIC_LOG(INFO, TAG, "After calling into application address space for error response"); } ResourceObserver *observer = GetObserverUsingToken(errorInfo->info.token, @@ -2186,10 +2203,20 @@ void OCHandleRequests(const CAEndpoint_t* endPoint, const CARequestInfo_t* reque OICFree(serverRequest.requestToken); return; } + serverRequest.numRcvdVendorSpecificHeaderOptions = tempNum; if (serverRequest.numRcvdVendorSpecificHeaderOptions && requestInfo->info.options) { - memcpy (&(serverRequest.rcvdVendorSpecificHeaderOptions), requestInfo->info.options, + serverRequest.rcvdVendorSpecificHeaderOptions = (OCHeaderOption*) OICCalloc(tempNum, sizeof(OCHeaderOption)); + if (NULL == serverRequest.rcvdVendorSpecificHeaderOptions) + { + OIC_LOG(ERROR, TAG, "Failed to allocated memory to vnd header options!"); + OICFree(serverRequest.payload); + OICFree(serverRequest.requestToken); + return; + } + + memcpy (serverRequest.rcvdVendorSpecificHeaderOptions, requestInfo->info.options, sizeof(CAHeaderOption_t)*tempNum); } @@ -2228,6 +2255,12 @@ void OCHandleRequests(const CAEndpoint_t* endPoint, const CARequestInfo_t* reque { OIC_LOG_V(ERROR, TAG, "HandleStackRequests failed. error: %d", requestResult); + // Delete observer node if it is OBSERVE failure from app + if (serverRequest.observationOption == OC_OBSERVE_REGISTER) + { + DeleteObserverUsingToken(requestInfo->info.token, requestInfo->info.tokenLength); + } + CAResponseResult_t stackResponse = OCToCAStackResult(requestResult, serverRequest.method); @@ -2241,6 +2274,7 @@ void OCHandleRequests(const CAEndpoint_t* endPoint, const CARequestInfo_t* reque // The token is copied in there, and is thus still owned by this function. OICFree(serverRequest.payload); OICFree(serverRequest.requestToken); + OICFree(serverRequest.rcvdVendorSpecificHeaderOptions); OIC_LOG(INFO, TAG, "Exit OCHandleRequests"); } @@ -2348,6 +2382,9 @@ OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode) OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlags clientFlags) { + OC_UNUSED(serverFlags); + OC_UNUSED(clientFlags); + OIC_LOG(DEBUG, TAG, "call OCInit1"); return OCInit2(mode, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS, OC_DEFAULT_ADAPTER); } @@ -2490,6 +2527,8 @@ OCStackResult OCInit2(OCMode mode, OCTransportFlags serverFlags, OCTransportFlag } #endif + InitializeObserverList(); + exit: if(result != OC_STACK_OK) { @@ -2558,6 +2597,9 @@ OCStackResult OCStop() // TODO after BeachHead delivery: consolidate into single SRMDeInit() SRMDeInitPolicyEngine(); + // Destroy Observer List Mutex + TerminateObserverList(); + stackState = OC_STACK_UNINITIALIZED; return OC_STACK_OK; } @@ -3084,6 +3126,7 @@ OCStackResult OCDoRequest(OCDoHandle *handle, goto exit; } + token = NULL; // Client CB list entry now owns it devAddr = NULL; // Client CB list entry now owns it resourceUri = NULL; // Client CB list entry now owns it resourceType = NULL; // Client CB list entry now owns it @@ -3324,7 +3367,10 @@ OCStackResult OCProcessPresence() OIC_LOG_V(DEBUG, TAG, "moving to TTL level %d", cbNode->presence->TTLlevel); + OIC_LOG(INFO, TAG, "Before calling into application address space for presence timeout"); cbResult = cbNode->callBack(cbNode->context, cbNode->handle, &clientResponse); + OIC_LOG(INFO, TAG, "After calling into application address space for presence timeout"); + if (cbResult == OC_STACK_DELETE_TRANSACTION) { FindAndDeleteClientCB(cbNode); @@ -4649,7 +4695,7 @@ void deleteResourceElements(OCResource *resource) } if (resource->rsrcChildResourcesHead) { - deleteResourceChild(resource->rsrcChildResourcesHead); + unbindChildResources(resource->rsrcChildResourcesHead); resource->rsrcChildResourcesHead = NULL; } if (resource->rsrcAttributes) @@ -4691,18 +4737,13 @@ void deleteResourceInterface(OCResourceInterface *resourceInterface) } } -void deleteResourceChild(OCChildResource *resourceChild) +void unbindChildResources(OCChildResource *head) { OCChildResource *next = NULL; - for (OCChildResource *pointer = resourceChild; pointer; pointer = next) + for (OCChildResource *current = head; current; current = next) { - next = pointer->next ? pointer->next : NULL; - if (pointer->rsrcResource) - { - deleteResourceElements(pointer->rsrcResource); - pointer->rsrcResource = NULL; - } - OICFree(pointer); + next = current->next; + OICFree(current); } } @@ -5182,8 +5223,19 @@ OCStackResult OCUpdateResourceInsWithResponse(const char *requestUri, { OCBindResourceInsToResource(handle, ins); } + + OICFree(uri); + uri = NULL; } } + + // Free links + size_t count = calcDimTotal(dimensions); + for (size_t k = 0; k < count; k++) + { + OCRepPayloadDestroy(links[k]); + } + OICFree(links); } } } @@ -5285,7 +5337,7 @@ OCStackResult OCGetResourceIns(OCResourceHandle handle, int64_t *ins) #endif OCStackResult OCSetHeaderOption(OCHeaderOption* ocHdrOpt, size_t* numOptions, uint16_t optionID, - void* optionData, size_t optionDataLength) + const void* optionData, size_t optionDataLength) { if (!ocHdrOpt) { @@ -5397,14 +5449,6 @@ void OCDefaultConnectionStateChangedHandler(const CAEndpoint_t *info, bool isCon } } -void OCSetNetworkMonitorHandler(CAAdapterStateChangedCB adapterHandler, - CAConnectionStateChangedCB connectionHandler) -{ - OIC_LOG(DEBUG, TAG, "OCSetNetworkMonitorHandler"); - g_adapterHandler = adapterHandler; - g_connectionHandler = connectionHandler; -} - OCStackResult OCGetDeviceId(OCUUIdentity *deviceId) { OicUuid_t oicUuid;