replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / connectivity / common / src / uqueue.c
index f7c6c52..3124234 100644 (file)
@@ -35,7 +35,7 @@
  * @def TAG
  * @brief Logging tag for module name
  */
-#define TAG PCF("UQUEUE")
+#define TAG "UQUEUE"
 
 u_queue_t *u_queue_create()
 {
@@ -107,8 +107,6 @@ CAResult_t u_queue_add_element(u_queue_t *queue, u_queue_message_t *message)
         queue->element = element;
         queue->count++;
         OIC_LOG_V(DEBUG, TAG, "Queue Count : %d", queue->count);
-
-        return CA_STATUS_OK;
     }
 
     return CA_STATUS_OK;
@@ -116,13 +114,12 @@ CAResult_t u_queue_add_element(u_queue_t *queue, u_queue_message_t *message)
 
 u_queue_message_t *u_queue_get_element(u_queue_t *queue)
 {
-    u_queue_element *next = NULL;
     u_queue_element *element = NULL;
     u_queue_message_t *message = NULL;
 
     if (NULL == queue)
     {
-        OIC_LOG(DEBUG, TAG, "QueueAddElement FAIL, Invalid Queue");
+        OIC_LOG(DEBUG, TAG, "QueueGetElement FAIL, Invalid Queue");
         return NULL;
     }
 
@@ -130,12 +127,10 @@ u_queue_message_t *u_queue_get_element(u_queue_t *queue)
 
     if (NULL == element)
     {
-        OIC_LOG(DEBUG, TAG, "QueueGetElement : empty, no messages");
         return NULL;
     }
 
-    next = element->next;
-    queue->element = next;
+    queue->element = element->next;
     queue->count--;
 
     message = element->message;
@@ -186,8 +181,6 @@ uint32_t u_queue_get_size(u_queue_t *queue)
 
 CAResult_t u_queue_reset(u_queue_t *queue)
 {
-    CAResult_t error = CA_STATUS_FAILED;
-
     if (NULL == queue)
     {
         OIC_LOG(DEBUG, TAG, "QueueReset FAIL, Invalid Queue");
@@ -202,9 +195,7 @@ CAResult_t u_queue_reset(u_queue_t *queue)
 
     while (NULL != queue->element)
     {
-        error = u_queue_remove_element(queue);
-        if (error == CA_STATUS_FAILED)
-            break;
+       u_queue_remove_element(queue);
     }
 
     if (NO_MESSAGES != queue->count)
@@ -253,3 +244,59 @@ u_queue_message_t *u_queue_get_head(u_queue_t *queue)
     }
     return queue->element->message;
 }
+
+CAResult_t u_queue_remove_req_elements(u_queue_t *queue,
+                                       QueueContextDataDestroy callback, void *ctx,
+                                       QueueDataDestroyFunction destroy)
+{
+    if (NULL == queue)
+    {
+        OIC_LOG(DEBUG, TAG, "QueueRemoveReqElement FAIL, Invalid Queue");
+        return CA_STATUS_FAILED;
+    }
+
+    if (NULL == callback)
+    {
+        OIC_LOG(DEBUG, TAG, "QueueRemoveReqElement FAIL, NULL callback");
+        return CA_STATUS_FAILED;
+    }
+
+    u_queue_element *cur = queue->element;
+    u_queue_element *prev = NULL;
+    u_queue_element *remove = NULL;
+
+    while (NULL != cur)
+    {
+        if (cur->message && callback(cur->message->msg, cur->message->size, ctx))
+        {
+            remove = cur;
+            if (NULL != prev)
+            {
+                prev->next = cur->next;
+            }
+            else
+            {
+                queue->element = cur->next;
+            }
+            cur = cur->next;
+            if (NULL != destroy)
+            {
+                destroy(remove->message->msg, remove->message->size);
+            }
+            else
+            {
+                OICFree(remove->message->msg);
+            }
+            OICFree(remove->message);
+            OICFree(remove);
+            queue->count--;
+        }
+        else
+        {
+            prev = cur;
+            cur = cur->next;
+        }
+    }
+    return CA_STATUS_OK;
+}
+