#define _POSIX_C_SOURCE 200112L
+#include "iotivity_config.h"
+
#include <string.h>
#include "oicgroup.h"
+#if defined (__TIZENRT__)
+#include <apps/netutils/cJSON.h>
+#else
#include "cJSON.h"
+#endif
#include "cbor.h"
#include "ocpayload.h"
#include "oic_malloc.h"
#include "logger.h"
#include "timer.h"
-#include "platform_features.h"
-
#define TAG "OIC_RI_GROUP"
#define DESC_DELIMITER "\""
#if defined(HAVE_PTHREAD_H)
#include <pthread.h>
- pthread_mutex_t lock;
- #define MUTEX_LOCK(ARG_NAME) { pthread_mutex_lock(ARG_NAME); }
- #define MUTEX_UNLOCK(ARG_NAME) { pthread_mutex_unlock(ARG_NAME); }
+ 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 <Windows.h>
- CRITICAL_SECTION lock;
- #define MUTEX_LOCK(ARG_NAME) { EnterCriticalSection(ARG_NAME); }
- #define MUTEX_UNLOCK(ARG_NAME) { LeaveCriticalSection(ARG_NAME); }
+ #include <windows.h>
+ 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_LOCK(ARG_NAME) { }
+ #define MUTEX_UNLOCK(ARG_NAME) { }
+ #define MUTEX_INITIALIZE(ARG_NAME) { }
+ #define MUTEX_TERMINATE(ARG_NAME) { }
#else
struct scheduledresourceinfo* next;
} ScheduledResourceInfo;
-ScheduledResourceInfo *scheduleResourceList = NULL;
+ScheduledResourceInfo *g_scheduleResourceList = NULL;
void AddScheduledResource(ScheduledResourceInfo **head,
ScheduledResourceInfo* add)
{
OIC_LOG(INFO, TAG, "AddScheduledResource Entering...");
- MUTEX_LOCK(&lock);
+ MUTEX_LOCK(&g_scheduledResourceLock);
ScheduledResourceInfo *tmp = NULL;
if (*head != NULL)
{
*head = add;
}
- MUTEX_UNLOCK(&lock);
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
}
ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head)
{
OIC_LOG(INFO, TAG, "GetScheduledResource Entering...");
- MUTEX_LOCK(&lock);
+ MUTEX_LOCK(&g_scheduledResourceLock);
time_t t_now;
exit:
- MUTEX_UNLOCK(&lock);
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
if (tmp == NULL)
{
{
OIC_LOG(INFO, TAG, "GetScheduledResourceByActionSetName Entering...");
- MUTEX_LOCK(&lock);
+ MUTEX_LOCK(&g_scheduledResourceLock);
ScheduledResourceInfo *tmp = NULL;
tmp = head;
exit:
- MUTEX_UNLOCK(&lock);
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
if (tmp == NULL)
{
ScheduledResourceInfo* del)
{
- MUTEX_LOCK(&lock);
+ MUTEX_LOCK(&g_scheduledResourceLock);
OIC_LOG(INFO, TAG, "RemoveScheduledResource Entering...");
ScheduledResourceInfo *tmp = NULL;
if (del == NULL)
{
- MUTEX_UNLOCK(&lock);
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
return;
}
OCFREE(del)
- MUTEX_UNLOCK(&lock);
-
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
}
typedef struct aggregatehandleinfo
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)
{
OCFREE(desc)
OCFREE(capa)
OCFREE(action)
+ OCFREE((*set)->actionsetName)
OCFREE(*set)
OCFREE(key)
OCFREE(value)
goto exit;
}
- actionTypeStr = (char *)malloc(1024);
+ actionTypeStr = (char *)OICMalloc(1024);
if(actionTypeStr != NULL)
{
sprintf(actionTypeStr, "%ld %u", actionset->timesteps, actionset->type);
remaining -= strlen(actionTypeStr);
strncat(temp, ACTION_DELIMITER, strlen(ACTION_DELIMITER));
remaining -= strlen(ACTION_DELIMITER);
- free(actionTypeStr);
+ OICFree(actionTypeStr);
}
else
{
- free(actionTypeStr);
+ OICFree(actionTypeStr);
res = OC_STACK_ERROR;
goto exit;
}
}
// 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;
void DoScheduledGroupAction()
{
OIC_LOG(INFO, TAG, "DoScheduledGroupAction Entering...");
- ScheduledResourceInfo* info = GetScheduledResource(scheduleResourceList);
+ ScheduledResourceInfo* info = GetScheduledResource(g_scheduleResourceList);
if (info == NULL)
{
goto exit;
}
- MUTEX_LOCK(&lock);
+ MUTEX_LOCK(&g_scheduledResourceLock);
DoAction(info->resource, info->actionset, info->ehRequest);
- MUTEX_UNLOCK(&lock);
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
if (info->actionset->type == RECURSIVE)
if (info->actionset->timesteps > 0)
{
- MUTEX_LOCK(&lock);
+ MUTEX_LOCK(&g_scheduledResourceLock);
schedule->resource = info->resource;
schedule->actionset = info->actionset;
schedule->ehRequest = info->ehRequest;
&schedule->timer_id,
&DoScheduledGroupAction);
- OIC_LOG(INFO, TAG, "Reregisteration.");
- MUTEX_UNLOCK(&lock);
- AddScheduledResource(&scheduleResourceList, schedule);
+ OIC_LOG(INFO, TAG, "Reregistration.");
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
+ AddScheduledResource(&g_scheduleResourceList, schedule);
}
else
{
}
}
- RemoveScheduledResource(&scheduleResourceList, info);
+ RemoveScheduledResource(&g_scheduleResourceList, info);
exit:
char *doWhat = NULL;
char *details = NULL;
-#if defined(_WIN32)
- static bool initializedCriticalSection = false;
-
- if(false == initializedCriticalSection) {
- /** @todo Find a way to DeleteCriticalSection somewhere. */
- InitializeCriticalSection(&lock);
- initializedCriticalSection = true;
- }
-#endif
-
stackRet = ExtractKeyValueFromRequest(ehRequest, &doWhat, &details);
if(stackRet != OC_STACK_OK)
stackRet = OC_STACK_ERROR;
}
}
+ OCRepPayloadDestroy(payload);
}
else if (method == OC_REST_POST)
{
else
{
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)
{
OIC_LOG_V(INFO, TAG, "Execute ActionSet : %s",
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
OIC_LOG(INFO, TAG, "Building New Call Info.");
memset(schedule, 0,
sizeof(ScheduledResourceInfo));
- MUTEX_LOCK(&lock);
+ MUTEX_LOCK(&g_scheduledResourceLock);
schedule->resource = resource;
schedule->actionset = actionset;
- schedule->ehRequest =
- (OCServerRequest*) ehRequest->requestHandle;
- MUTEX_UNLOCK(&lock);
+ schedule->ehRequest = request;
+
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
if (delay > 0)
{
OIC_LOG_V(INFO, TAG, "delay_time is %ld seconds.",
actionset->timesteps);
- MUTEX_LOCK(&lock);
+ MUTEX_LOCK(&g_scheduledResourceLock);
schedule->time = registerTimer(delay,
&schedule->timer_id,
&DoScheduledGroupAction);
- MUTEX_UNLOCK(&lock);
- AddScheduledResource(&scheduleResourceList,
+ MUTEX_UNLOCK(&g_scheduledResourceLock);
+ AddScheduledResource(&g_scheduleResourceList,
schedule);
stackRet = OC_STACK_OK;
}
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
stackRet = OC_STACK_ERROR;
}
}
+ OCRepPayloadDestroy(payload);
}
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);
+}