replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / stack / src / oicgroup.c
index fa67c28..5114f41 100755 (executable)
 
 #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"
@@ -32,8 +38,6 @@
 #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
 
@@ -113,14 +132,14 @@ typedef struct scheduledresourceinfo
     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)
@@ -137,14 +156,14 @@ void AddScheduledResource(ScheduledResourceInfo **head,
     {
         *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;
 
@@ -176,7 +195,7 @@ ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head)
 
     exit:
 
-    MUTEX_UNLOCK(&lock);
+    MUTEX_UNLOCK(&g_scheduledResourceLock);
 
     if (tmp == NULL)
     {
@@ -189,7 +208,7 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo
 {
     OIC_LOG(INFO, TAG, "GetScheduledResourceByActionSetName Entering...");
 
-    MUTEX_LOCK(&lock);
+    MUTEX_LOCK(&g_scheduledResourceLock);
 
     ScheduledResourceInfo *tmp = NULL;
     tmp = head;
@@ -209,7 +228,7 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo
 
 exit:
 
-    MUTEX_UNLOCK(&lock);
+    MUTEX_UNLOCK(&g_scheduledResourceLock);
 
     if (tmp == NULL)
     {
@@ -222,7 +241,7 @@ void RemoveScheduledResource(ScheduledResourceInfo **head,
         ScheduledResourceInfo* del)
 {
 
-    MUTEX_LOCK(&lock);
+    MUTEX_LOCK(&g_scheduledResourceLock);
 
     OIC_LOG(INFO, TAG, "RemoveScheduledResource Entering...");
     ScheduledResourceInfo *tmp = NULL;
@@ -230,7 +249,7 @@ void RemoveScheduledResource(ScheduledResourceInfo **head,
     if (del == NULL)
     {
 
-        MUTEX_UNLOCK(&lock);
+        MUTEX_UNLOCK(&g_scheduledResourceLock);
 
         return;
     }
@@ -254,8 +273,7 @@ void RemoveScheduledResource(ScheduledResourceInfo **head,
 
     OCFREE(del)
 
-    MUTEX_UNLOCK(&lock);
-
+    MUTEX_UNLOCK(&g_scheduledResourceLock);
 }
 
 typedef struct aggregatehandleinfo
@@ -436,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)
     {
@@ -759,6 +779,7 @@ exit:
     OCFREE(desc)
     OCFREE(capa)
     OCFREE(action)
+    OCFREE((*set)->actionsetName)
     OCFREE(*set)
     OCFREE(key)
     OCFREE(value)
@@ -795,7 +816,7 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc)
         goto exit;
     }
 
-    actionTypeStr = (char *)malloc(1024);
+    actionTypeStr = (char *)OICMalloc(1024);
     if(actionTypeStr != NULL)
     {
         sprintf(actionTypeStr, "%ld %u", actionset->timesteps, actionset->type);
@@ -805,11 +826,11 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc)
             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;
         }
@@ -910,7 +931,7 @@ OCStackApplicationResult ActionSetCB(void* context, OCDoHandle handle,
         }
 
         // 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;
@@ -1083,7 +1104,7 @@ OCStackResult DoAction(OCResource* resource, OCActionSet* actionset,
 void DoScheduledGroupAction()
 {
     OIC_LOG(INFO, TAG, "DoScheduledGroupAction Entering...");
-    ScheduledResourceInfo* info = GetScheduledResource(scheduleResourceList);
+    ScheduledResourceInfo* info = GetScheduledResource(g_scheduleResourceList);
 
     if (info == NULL)
     {
@@ -1106,11 +1127,11 @@ void DoScheduledGroupAction()
         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)
@@ -1126,7 +1147,7 @@ void DoScheduledGroupAction()
 
             if (info->actionset->timesteps > 0)
             {
-                MUTEX_LOCK(&lock);
+                MUTEX_LOCK(&g_scheduledResourceLock);
                 schedule->resource = info->resource;
                 schedule->actionset = info->actionset;
                 schedule->ehRequest = info->ehRequest;
@@ -1135,9 +1156,9 @@ void DoScheduledGroupAction()
                         &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
             {
@@ -1146,7 +1167,7 @@ void DoScheduledGroupAction()
         }
     }
 
-    RemoveScheduledResource(&scheduleResourceList, info);
+    RemoveScheduledResource(&g_scheduleResourceList, info);
 
     exit:
 
@@ -1164,16 +1185,6 @@ OCStackResult BuildCollectionGroupActionCBORResponse(
     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)
@@ -1267,6 +1278,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse(
                 stackRet = OC_STACK_ERROR;
             }
         }
+        OCRepPayloadDestroy(payload);
     }
     else if (method == OC_REST_POST)
     {
@@ -1311,6 +1323,14 @@ OCStackResult BuildCollectionGroupActionCBORResponse(
                 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",
@@ -1318,13 +1338,11 @@ OCStackResult BuildCollectionGroupActionCBORResponse(
                         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
@@ -1344,22 +1362,22 @@ OCStackResult BuildCollectionGroupActionCBORResponse(
                             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;
                             }
@@ -1375,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
@@ -1441,6 +1461,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse(
                 stackRet = OC_STACK_ERROR;
             }
         }
+        OCRepPayloadDestroy(payload);
     }
 
 exit:
@@ -1450,3 +1471,18 @@ 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);
+}