X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Focstack.c;h=f5575b1e18e642cc9676933332002c0fb41bb84d;hb=1e743d337b66bda0e44a5ca500d4d7178bb599b5;hp=15bdaeebdc5f26dc756dd4bb9e11e05aec630018;hpb=f9f50e790a1bc47a97e25873ecd4b055efe5cc48;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 15bdaee..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 //----------------------------------------------------------------------------- @@ -1276,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) { @@ -1378,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}}; @@ -1390,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) @@ -1409,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); } @@ -1419,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)); @@ -1486,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; } } @@ -1524,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; } @@ -1538,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); } } @@ -1579,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)); } } @@ -1650,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) @@ -1678,8 +1683,9 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp } } - OICFree(response.resourceUri); + OICFree((void *)response.resourceUri); OCPayloadDestroy(response.payload); + OICFree(response.rcvdVendorSpecificHeaderOptions); } return; } @@ -1826,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, @@ -2195,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); } @@ -2237,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); @@ -2250,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"); } @@ -2357,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); } @@ -2499,7 +2527,7 @@ OCStackResult OCInit2(OCMode mode, OCTransportFlags serverFlags, OCTransportFlag } #endif - InitializeObseverList(); + InitializeObserverList(); exit: if(result != OC_STACK_OK) @@ -2557,7 +2585,7 @@ OCStackResult OCStop() TerminateScheduleResourceList(); // Remove all observers - TerminateObserverList(); + DeleteObserverList(); // Free memory dynamically allocated for resources deleteAllResources(); // Remove all the client callbacks @@ -2569,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; } @@ -3095,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 @@ -3335,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); @@ -4660,7 +4695,7 @@ void deleteResourceElements(OCResource *resource) } if (resource->rsrcChildResourcesHead) { - deleteResourceChild(resource->rsrcChildResourcesHead); + unbindChildResources(resource->rsrcChildResourcesHead); resource->rsrcChildResourcesHead = NULL; } if (resource->rsrcAttributes) @@ -4702,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); } } @@ -5193,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); } } } @@ -5296,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) { @@ -5408,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;