replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / connectivity / common / src / uqueue.c
index 5464ea8..3124234 100644 (file)
@@ -245,3 +245,58 @@ 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;
+}
+