X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Foicgroup.c;h=5114f4166229c299a242df63e93933d091b52954;hb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;hp=00d429b2a98428c585391095fdcdd8974fe79c2c;hpb=b79dc9e23777bca1995ae5fbb63d1b7071a0f079;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/oicgroup.c b/resource/csdk/stack/src/oicgroup.c index 00d429b..5114f41 100755 --- a/resource/csdk/stack/src/oicgroup.c +++ b/resource/csdk/stack/src/oicgroup.c @@ -20,10 +20,16 @@ #define _POSIX_C_SOURCE 200112L +#include "iotivity_config.h" + #include #include "oicgroup.h" +#if defined (__TIZENRT__) +#include +#else #include "cJSON.h" +#endif #include "cbor.h" #include "ocpayload.h" #include "oic_malloc.h" @@ -32,11 +38,7 @@ #include "logger.h" #include "timer.h" -#ifndef WITH_ARDUINO -#include -#endif - -#define TAG PCF("OICGROUP") +#define TAG "OIC_RI_GROUP" #define DESC_DELIMITER "\"" #define ACTION_DELIMITER "*" @@ -71,8 +73,45 @@ pointer = NULL; \ } -#ifndef WITH_ARDUINO -pthread_mutex_t lock; +// Mutex implementation macros +#if defined(HAVE_PTHREAD_H) + + #include + pthread_mutex_t g_scheduledResourceLock; + #define MUTEX_LOCK(ARG_NAME) { pthread_mutex_lock(ARG_NAME); } + #define MUTEX_UNLOCK(ARG_NAME) { pthread_mutex_unlock(ARG_NAME); } + #define MUTEX_INITIALIZE(ARG_NAME) { } + #define MUTEX_TERMINATE(ARG_NAME) { } + +#elif defined(HAVE_WINDOWS_H) + + #include + CRITICAL_SECTION g_scheduledResourceLock; + bool g_initializedScheduledResourceLock = false; + #define MUTEX_LOCK(ARG_NAME) { EnterCriticalSection(ARG_NAME); } + #define MUTEX_UNLOCK(ARG_NAME) { LeaveCriticalSection(ARG_NAME); } + #define MUTEX_INITIALIZE(ARG_NAME) { assert(!g_initializedScheduledResourceLock); \ + InitializeCriticalSection(ARG_NAME); \ + g_initializedScheduledResourceLock = true; \ + } + #define MUTEX_TERMINATE(ARG_NAME) { if (g_initializedScheduledResourceLock) \ + { \ + DeleteCriticalSection(ARG_NAME); \ + g_initializedScheduledResourceLock = false; \ + } \ + } + +#elif defined(WITH_ARDUINO) + + #define MUTEX_LOCK(ARG_NAME) { } + #define MUTEX_UNLOCK(ARG_NAME) { } + #define MUTEX_INITIALIZE(ARG_NAME) { } + #define MUTEX_TERMINATE(ARG_NAME) { } + +#else + + ERROR Need mutex implementation on this platform + #endif enum ACTION_TYPE @@ -93,16 +132,14 @@ typedef struct scheduledresourceinfo struct scheduledresourceinfo* next; } ScheduledResourceInfo; -ScheduledResourceInfo *scheduleResourceList = NULL; +ScheduledResourceInfo *g_scheduleResourceList = NULL; void AddScheduledResource(ScheduledResourceInfo **head, ScheduledResourceInfo* add) { - OC_LOG(INFO, TAG, PCF("AddScheduledResource Entering...")); + OIC_LOG(INFO, TAG, "AddScheduledResource Entering..."); -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); ScheduledResourceInfo *tmp = NULL; if (*head != NULL) @@ -119,25 +156,21 @@ void AddScheduledResource(ScheduledResourceInfo **head, { *head = add; } -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + MUTEX_UNLOCK(&g_scheduledResourceLock); } ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head) { - OC_LOG(INFO, TAG, PCF("GetScheduledResource Entering...")); + OIC_LOG(INFO, TAG, "GetScheduledResource Entering..."); -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); time_t t_now; ScheduledResourceInfo *tmp = NULL; tmp = head; -#ifndef WITH_ARDUINO +#if !defined(WITH_ARDUINO) time(&t_now); #else t_now = now(); @@ -148,15 +181,11 @@ ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head) while (tmp) { time_t diffTm = 0; -#ifndef WITH_ARDUINO diffTm = timespec_diff(tmp->time, t_now); -#else - diffTm = timespec_diff(tmp->time, t_now); -#endif if (diffTm <= (time_t) 0) { - OC_LOG(INFO, TAG, PCF("return Call INFO.")); + OIC_LOG(INFO, TAG, "return Call INFO."); goto exit; } @@ -165,23 +194,22 @@ ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head) } exit: -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); + if (tmp == NULL) { - OC_LOG(INFO, TAG, PCF("Cannot Find Call Info.")); + OIC_LOG(INFO, TAG, "Cannot Find Call Info."); } return tmp; } ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo *head, char *setName) { - OC_LOG(INFO, TAG, PCF("GetScheduledResourceByActionSetName Entering...")); + OIC_LOG(INFO, TAG, "GetScheduledResourceByActionSetName Entering..."); + + MUTEX_LOCK(&g_scheduledResourceLock); -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif ScheduledResourceInfo *tmp = NULL; tmp = head; @@ -191,7 +219,7 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo { if (strcmp(tmp->actionset->actionsetName, setName) == 0) { - OC_LOG(INFO, TAG, PCF("return Call INFO.")); + OIC_LOG(INFO, TAG, "return Call INFO."); goto exit; } tmp = tmp->next; @@ -199,12 +227,12 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo } exit: -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); + if (tmp == NULL) { - OC_LOG(INFO, TAG, PCF("Cannot Find Call Info.")); + OIC_LOG(INFO, TAG, "Cannot Find Call Info."); } return tmp; } @@ -212,14 +240,17 @@ exit: void RemoveScheduledResource(ScheduledResourceInfo **head, ScheduledResourceInfo* del) { -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif - OC_LOG(INFO, TAG, PCF("RemoveScheduledResource Entering...")); + + MUTEX_LOCK(&g_scheduledResourceLock); + + OIC_LOG(INFO, TAG, "RemoveScheduledResource Entering..."); ScheduledResourceInfo *tmp = NULL; if (del == NULL) { + + MUTEX_UNLOCK(&g_scheduledResourceLock); + return; } @@ -241,9 +272,8 @@ void RemoveScheduledResource(ScheduledResourceInfo **head, } OCFREE(del) -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); } typedef struct aggregatehandleinfo @@ -424,11 +454,13 @@ void DeleteAction(OCAction** action) void DeleteActionSet(OCActionSet** actionset) { + OCAction* pointer = NULL; + OCAction* pDel = NULL; + if(*actionset == NULL) return; - OCAction* pointer = (*actionset)->head; - OCAction* pDel = NULL; + pointer = (*actionset)->head; while (pointer) { @@ -493,24 +525,6 @@ OCStackResult FindAndDeleteActionSet(OCResource **resource, return OC_STACK_ERROR; } -OCStackResult DeleteActionSets(OCResource** resource) -{ - OCActionSet *pointer = (*resource)->actionsetHead; - OCActionSet *pDel = pointer; - - while (pointer) - { - pDel = pointer; - pointer = pointer->next; - - DeleteActionSet(&pDel); - pDel->next = NULL; - } - - (*resource)->actionsetHead = NULL; - return OC_STACK_OK; -} - OCStackResult GetActionSet(const char *actionName, OCActionSet *head, OCActionSet** actionset) { @@ -536,7 +550,7 @@ OCStackResult ExtractKeyValueFromRequest(OCEntityHandlerRequest *ehRequest, { OCStackResult result = OC_STACK_OK; - char *actionSetStr; + char *actionSetStr = NULL; if( NULL == ehRequest->payload ) { @@ -600,16 +614,20 @@ exit: OCFREE(*value) } + OCFREE(actionSetStr); + return result; } OCStackResult ExtractActionSetNameAndDelaytime(char *pChar, char **setName, long int *pa) { - char *token, *tokenPtr; + char *token = NULL, *tokenPtr = NULL; OCStackResult result = OC_STACK_OK; token = (char*) strtok_r(pChar, ACTION_DELIMITER, &tokenPtr); + VARIFY_POINTER_NULL(token, result, exit) + *setName = (char *) OICMalloc(strlen(token) + 1); VARIFY_POINTER_NULL(*setName, result, exit) VARIFY_PARAM_NULL(token, result, exit) @@ -640,12 +658,13 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc) OCAction *action = NULL; OCCapability *capa = NULL; - OC_LOG(INFO, TAG, PCF("Build ActionSet Instance.")); + OIC_LOG(INFO, TAG, "Build ActionSet Instance."); *set = (OCActionSet*) OICMalloc(sizeof(OCActionSet)); VARIFY_POINTER_NULL(*set, result, exit) iterToken = (char *) strtok_r(actiondesc, ACTION_DELIMITER, &iterTokenPtr); + VARIFY_POINTER_NULL(iterToken, result, exit); // ActionSet Name memset(*set, 0, sizeof(OCActionSet)); @@ -660,11 +679,15 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc) // yyyy-mm-dd hh:mm:ss d iterToken = (char *) strtok_r(NULL, ACTION_DELIMITER, &iterTokenPtr); VARIFY_PARAM_NULL(iterToken, result, exit) -#ifndef WITH_ARDUINO - sscanf(iterToken, "%ld %u", &(*set)->timesteps, &(*set)->type); +#if !defined(WITH_ARDUINO) + if( 2 != sscanf(iterToken, "%ld %u", &(*set)->timesteps, &(*set)->type) ) + { + // If the return value should be 2, the number of items in the argument. Otherwise, it fails. + goto exit; + } #endif - OC_LOG_V(INFO, TAG, "ActionSet Name : %s", (*set)->actionsetName); + OIC_LOG_V(INFO, TAG, "ActionSet Name : %s", (*set)->actionsetName); iterToken = (char *) strtok_r(NULL, ACTION_DELIMITER, &iterTokenPtr); while (iterToken) @@ -684,6 +707,8 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc) attrIterToken = (char *) strtok_r(attr, ATTR_ASSIGN, &attrIterTokenPtr); + VARIFY_POINTER_NULL(attrIterToken, result, exit); + key = (char *) OICMalloc(strlen(attrIterToken) + 1); VARIFY_POINTER_NULL(key, result, exit) VARIFY_PARAM_NULL(attrIterToken, result, exit) @@ -691,6 +716,7 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc) attrIterToken = (char *) strtok_r(NULL, ATTR_ASSIGN, &attrIterTokenPtr); + VARIFY_POINTER_NULL(attrIterToken, result, exit); value = (char *) OICMalloc(strlen(attrIterToken) + 1); VARIFY_POINTER_NULL(value, result, exit) VARIFY_PARAM_NULL(attrIterToken, result, exit) @@ -698,13 +724,8 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc) if (strcmp(key, "uri") == 0) { - OC_LOG(INFO, TAG, PCF("Build OCAction Instance.")); + OIC_LOG(INFO, TAG, "Build OCAction Instance."); - if(action) - { - OICFree(action->resourceUri); - OICFree(action); - } action = (OCAction*) OICMalloc(sizeof(OCAction)); VARIFY_POINTER_NULL(action, result, exit) memset(action, 0, sizeof(OCAction)); @@ -717,7 +738,7 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc) { if ((key != NULL) && (value != NULL)) { - OC_LOG(INFO, TAG, PCF("Build OCCapability Instance.")); + OIC_LOG(INFO, TAG, "Build OCCapability Instance."); capa = (OCCapability*) OICMalloc(sizeof(OCCapability)); VARIFY_POINTER_NULL(capa, result, exit) @@ -758,6 +779,7 @@ exit: OCFREE(desc) OCFREE(capa) OCFREE(action) + OCFREE((*set)->actionsetName) OCFREE(*set) OCFREE(key) OCFREE(value) @@ -777,14 +799,15 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc) char temp[1024] = { 0 }; size_t remaining = sizeof(temp) - 1; OCStackResult res = OC_STACK_ERROR; + char* actionTypeStr = NULL; OCAction *action = actionset->head; if (remaining >= strlen(actionset->actionsetName) + 1) { - strcat(temp, actionset->actionsetName); + strncat(temp, actionset->actionsetName, strlen(actionset->actionsetName)); remaining -= strlen(actionset->actionsetName); - strcat(temp, ACTION_DELIMITER); + strncat(temp, ACTION_DELIMITER, strlen(ACTION_DELIMITER)); remaining--; } else @@ -793,6 +816,31 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc) goto exit; } + actionTypeStr = (char *)OICMalloc(1024); + if(actionTypeStr != NULL) + { + sprintf(actionTypeStr, "%ld %u", actionset->timesteps, actionset->type); + if(remaining >= strlen(actionTypeStr) + strlen(ACTION_DELIMITER) + 1) + { + strncat(temp, actionTypeStr, strlen(actionTypeStr)); + remaining -= strlen(actionTypeStr); + strncat(temp, ACTION_DELIMITER, strlen(ACTION_DELIMITER)); + remaining -= strlen(ACTION_DELIMITER); + OICFree(actionTypeStr); + } + else + { + OICFree(actionTypeStr); + res = OC_STACK_ERROR; + goto exit; + } + } + else + { + res = OC_STACK_ERROR; + goto exit; + } + while (action != NULL) { if (remaining < (strlen("uri=") + strlen(action->resourceUri) + 1)) @@ -800,6 +848,7 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc) res = OC_STACK_ERROR; goto exit; } + strcat(temp, "uri="); remaining -= strlen("uri="); strcat(temp, action->resourceUri); @@ -833,6 +882,7 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc) goto exit; } strcat(temp, "|"); + remaining --; } } @@ -864,7 +914,7 @@ OCStackApplicationResult ActionSetCB(void* context, OCDoHandle handle, { (void)context; (void)clientResponse; - OC_LOG(INFO, TAG, PCF("Entering ActionSetCB")); + OIC_LOG(INFO, TAG, "Entering ActionSetCB"); ClientRequestInfo *info = GetClientRequestInfo(clientRequstList, handle); @@ -876,12 +926,12 @@ OCStackApplicationResult ActionSetCB(void* context, OCDoHandle handle, if(NULL == clientResponse->payload) { - OC_LOG(ERROR, TAG, "Error sending response"); + OIC_LOG(ERROR, TAG, "Error sending response"); return OC_STACK_DELETE_TRANSACTION; } // Format the response. Note this requires some info about the request - response.requestHandle = info->ehRequest; + response.requestHandle = info->ehRequest->requestId; response.resourceHandle = info->collResource; response.payload = clientResponse->payload; response.numSendVendorSpecificHeaderOptions = 0; @@ -894,7 +944,7 @@ OCStackApplicationResult ActionSetCB(void* context, OCDoHandle handle, // Send the response if (OCDoResponse(&response) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "Error sending response"); + OIC_LOG(ERROR, TAG, "Error sending response"); return OC_STACK_DELETE_TRANSACTION; } @@ -920,7 +970,7 @@ OCStackResult BuildActionJSON(OCAction* action, unsigned char* bufferPtr, char *jsonStr; uint16_t jsonLen; - OC_LOG(INFO, TAG, PCF("Entering BuildActionJSON")); + OIC_LOG(INFO, TAG, "Entering BuildActionJSON"); json = cJSON_CreateObject(); cJSON_AddItemToObject(json, "rep", body = cJSON_CreateObject()); @@ -938,7 +988,7 @@ OCStackResult BuildActionJSON(OCAction* action, unsigned char* bufferPtr, jsonLen = strlen(jsonStr); if (jsonLen < *remaining) { - strcat((char*) bufferPtr, jsonStr); + strncat((char*) bufferPtr, jsonStr, jsonLen); *remaining -= jsonLen; bufferPtr += jsonLen; ret = OC_STACK_OK; @@ -956,7 +1006,7 @@ OCPayload* BuildActionCBOR(OCAction* action) if (!payload) { - OC_LOG(INFO, TAG, PCF("Failed to create put payload object")); + OIC_LOG(INFO, TAG, "Failed to create put payload object"); return NULL; } @@ -1024,7 +1074,10 @@ OCStackResult DoAction(OCResource* resource, OCActionSet* actionset, sizeof(ClientRequestInfo)); if( info == NULL ) + { + OCFREE(payload); return OC_STACK_NO_MEMORY; + } memset(info, 0, sizeof(ClientRequestInfo)); @@ -1050,36 +1103,36 @@ OCStackResult DoAction(OCResource* resource, OCActionSet* actionset, void DoScheduledGroupAction() { - OC_LOG(INFO, TAG, PCF("DoScheduledGroupAction Entering...")); - ScheduledResourceInfo* info = GetScheduledResource(scheduleResourceList); + OIC_LOG(INFO, TAG, "DoScheduledGroupAction Entering..."); + ScheduledResourceInfo* info = GetScheduledResource(g_scheduleResourceList); if (info == NULL) { - OC_LOG(INFO, TAG, PCF("Target resource is NULL")); + OIC_LOG(INFO, TAG, "Target resource is NULL"); goto exit; } else if (info->resource == NULL) { - OC_LOG(INFO, TAG, PCF("Target resource is NULL")); + OIC_LOG(INFO, TAG, "Target resource is NULL"); goto exit; } else if (info->actionset == NULL) { - OC_LOG(INFO, TAG, PCF("Target ActionSet is NULL")); + OIC_LOG(INFO, TAG, "Target ActionSet is NULL"); goto exit; } else if (info->ehRequest == NULL) { - OC_LOG(INFO, TAG, PCF("Target ActionSet is NULL")); + OIC_LOG(INFO, TAG, "Target ActionSet is NULL"); goto exit; } -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + + MUTEX_LOCK(&g_scheduledResourceLock); + DoAction(info->resource, info->actionset, info->ehRequest); -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); + if (info->actionset->type == RECURSIVE) { @@ -1089,14 +1142,12 @@ void DoScheduledGroupAction() if (schedule) { - OC_LOG(INFO, TAG, PCF("Building New Call Info.")); + OIC_LOG(INFO, TAG, "Building New Call Info."); memset(schedule, 0, sizeof(ScheduledResourceInfo)); if (info->actionset->timesteps > 0) { -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); schedule->resource = info->resource; schedule->actionset = info->actionset; schedule->ehRequest = info->ehRequest; @@ -1105,11 +1156,9 @@ void DoScheduledGroupAction() &schedule->timer_id, &DoScheduledGroupAction); - OC_LOG(INFO, TAG, PCF("Reregisteration.")); -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif - AddScheduledResource(&scheduleResourceList, schedule); + OIC_LOG(INFO, TAG, "Reregistration."); + MUTEX_UNLOCK(&g_scheduledResourceLock); + AddScheduledResource(&g_scheduleResourceList, schedule); } else { @@ -1118,7 +1167,7 @@ void DoScheduledGroupAction() } } - RemoveScheduledResource(&scheduleResourceList, info); + RemoveScheduledResource(&g_scheduleResourceList, info); exit: @@ -1131,7 +1180,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( { OCStackResult stackRet = OC_STACK_ERROR; - OC_LOG(INFO, TAG, PCF("Group Action is requested.")); + OIC_LOG(INFO, TAG, "Group Action is requested."); char *doWhat = NULL; char *details = NULL; @@ -1140,7 +1189,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( if(stackRet != OC_STACK_OK) { - OC_LOG_V(ERROR, TAG, "ExtractKeyValueFromRequest failed: %d", stackRet); + OIC_LOG_V(ERROR, TAG, "ExtractKeyValueFromRequest failed: %d", stackRet); return stackRet; } @@ -1148,7 +1197,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( if (method == OC_REST_PUT) { - OC_LOG(INFO, TAG, PCF("Group Action[PUT].")); + OIC_LOG(INFO, TAG, "Group Action[PUT]."); if (strcmp(doWhat, ACTIONSET) == 0) { @@ -1167,7 +1216,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( { DeleteActionSet( &actionSet ); } - OC_LOG(INFO, TAG, PCF("Duplicated ActionSet ")); + OIC_LOG(INFO, TAG, "Duplicated ActionSet "); } } else @@ -1198,7 +1247,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( if(!payload) { - OC_LOG(ERROR, TAG, PCF("Failed to allocate Payload")); + OIC_LOG(ERROR, TAG, "Failed to allocate Payload"); stackRet = OC_STACK_ERROR; } else @@ -1225,10 +1274,11 @@ OCStackResult BuildCollectionGroupActionCBORResponse( // Send the response if (OCDoResponse(&response) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "Error sending response"); + OIC_LOG(ERROR, TAG, "Error sending response"); stackRet = OC_STACK_ERROR; } } + OCRepPayloadDestroy(payload); } else if (method == OC_REST_POST) { @@ -1261,37 +1311,43 @@ OCStackResult BuildCollectionGroupActionCBORResponse( if (GetActionSet(details, resource->actionsetHead, &actionset) != OC_STACK_OK) { - OC_LOG(INFO, TAG, PCF("ERROR")); + OIC_LOG(INFO, TAG, "ERROR"); stackRet = OC_STACK_ERROR; } if (actionset == NULL) { - OC_LOG(INFO, TAG, PCF("Cannot Find ActionSet")); + OIC_LOG(INFO, TAG, "Cannot Find ActionSet"); stackRet = OC_STACK_ERROR; } else { - OC_LOG(INFO, TAG, PCF("Group Action[POST].")); + OIC_LOG(INFO, TAG, "Group Action[POST]."); + OCServerRequest *request = + GetServerRequestUsingHandle(ehRequest->requestHandle); + if (NULL == request) + { + stackRet = OC_STACK_ERROR; + goto exit; + } + if (actionset->type == NONE) { - OC_LOG_V(INFO, TAG, "Execute ActionSet : %s", + OIC_LOG_V(INFO, TAG, "Execute ActionSet : %s", actionset->actionsetName); unsigned int num = GetNumOfTargetResource( actionset->head); - ((OCServerRequest *) ehRequest->requestHandle)->ehResponseHandler = - HandleAggregateResponse; - ((OCServerRequest *) ehRequest->requestHandle)->numResponses = - num + 1; + request->ehResponseHandler = HandleAggregateResponse; + request->numResponses = num + 1; + + DoAction(resource, actionset, request); - DoAction(resource, actionset, - (OCServerRequest*) ehRequest->requestHandle); stackRet = OC_STACK_OK; } else { - OC_LOG_V(INFO, TAG, "Execute Scheduled ActionSet : %s", + OIC_LOG_V(INFO, TAG, "Execute Scheduled ActionSet : %s", actionset->actionsetName); delay = @@ -1303,25 +1359,25 @@ OCStackResult BuildCollectionGroupActionCBORResponse( if (schedule) { - OC_LOG(INFO, TAG, PCF("Building New Call Info.")); + OIC_LOG(INFO, TAG, "Building New Call Info."); memset(schedule, 0, sizeof(ScheduledResourceInfo)); - + MUTEX_LOCK(&g_scheduledResourceLock); schedule->resource = resource; schedule->actionset = actionset; - schedule->ehRequest = - (OCServerRequest*) ehRequest->requestHandle; + schedule->ehRequest = request; + MUTEX_UNLOCK(&g_scheduledResourceLock); if (delay > 0) { - OC_LOG_V(INFO, TAG, "delay_time is %lf seconds.", + OIC_LOG_V(INFO, TAG, "delay_time is %ld seconds.", actionset->timesteps); - + MUTEX_LOCK(&g_scheduledResourceLock); schedule->time = registerTimer(delay, &schedule->timer_id, &DoScheduledGroupAction); - - AddScheduledResource(&scheduleResourceList, + MUTEX_UNLOCK(&g_scheduledResourceLock); + AddScheduledResource(&g_scheduleResourceList, schedule); stackRet = OC_STACK_OK; } @@ -1337,13 +1393,15 @@ OCStackResult BuildCollectionGroupActionCBORResponse( else if (strcmp(doWhat, "CancelAction") == 0) { ScheduledResourceInfo *info = - GetScheduledResourceByActionSetName(scheduleResourceList, details); + GetScheduledResourceByActionSetName(g_scheduleResourceList, details); if(info != NULL) { + MUTEX_LOCK(&g_scheduledResourceLock); unregisterTimer(info->timer_id); + MUTEX_UNLOCK(&g_scheduledResourceLock); - RemoveScheduledResource(&scheduleResourceList, info); + RemoveScheduledResource(&g_scheduleResourceList, info); stackRet = OC_STACK_OK; } else @@ -1373,7 +1431,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( if(!payload) { - OC_LOG(ERROR, TAG, PCF("Failed to allocate Payload")); + OIC_LOG(ERROR, TAG, "Failed to allocate Payload"); stackRet = OC_STACK_ERROR; } else @@ -1399,10 +1457,11 @@ OCStackResult BuildCollectionGroupActionCBORResponse( // Send the response if (OCDoResponse(&response) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "Error sending response"); + OIC_LOG(ERROR, TAG, "Error sending response"); stackRet = OC_STACK_ERROR; } } + OCRepPayloadDestroy(payload); } exit: @@ -1413,3 +1472,17 @@ exit: return stackRet; } +OCStackResult InitializeScheduleResourceList() +{ + MUTEX_INITIALIZE(&g_scheduledResourceLock); + + g_scheduleResourceList = NULL; + return OC_STACK_OK; +} + +void TerminateScheduleResourceList() +{ + assert(g_scheduleResourceList == NULL); + + MUTEX_TERMINATE(&g_scheduledResourceLock); +}