diff options
author | Alexander Lantsev <aunsane@gmail.com> | 2015-03-17 20:33:47 +0000 |
---|---|---|
committer | Alexander Lantsev <aunsane@gmail.com> | 2015-03-17 20:33:47 +0000 |
commit | dd3d0e59dcd34beb222fcf612a51d3fee82c0e43 (patch) | |
tree | 0ae5a6e0a83399036d1452256ee3f89dc6da8872 /protocols/SkypeWeb/src/request_queue.cpp | |
parent | 076fa9b3142f55fc736fbf58b20bfa45973acd68 (diff) |
SkypeWeb: initial commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@12424 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/SkypeWeb/src/request_queue.cpp')
-rw-r--r-- | protocols/SkypeWeb/src/request_queue.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/protocols/SkypeWeb/src/request_queue.cpp b/protocols/SkypeWeb/src/request_queue.cpp new file mode 100644 index 0000000000..6448186614 --- /dev/null +++ b/protocols/SkypeWeb/src/request_queue.cpp @@ -0,0 +1,88 @@ +#include "common.h"
+
+RequestQueue::RequestQueue(HANDLE hConnection) :
+ hConnection(hConnection), requests(1)
+{
+ hRequestQueueThread = NULL;
+ hRequestQueueEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+}
+
+RequestQueue::~RequestQueue()
+{
+ requests.destroy();
+ CloseHandle(hRequestQueueEvent);
+}
+
+void RequestQueue::Start()
+{
+ if (!isTerminated)
+ return;
+
+ isTerminated = false;
+ if (hRequestQueueThread == NULL)
+ {
+ hRequestQueueThread = mir_forkthread((pThreadFunc)&RequestQueue::WorkerThread, this);
+ }
+}
+
+void RequestQueue::Stop()
+{
+ if (isTerminated)
+ return;
+
+ isTerminated = true;
+ hRequestQueueThread = NULL;
+}
+
+void RequestQueue::Push(HttpRequest *request, HttpResponseCallback response, void *arg)
+{
+ if (isTerminated)
+ return;
+
+ RequestQueueItem *item = new RequestQueueItem(request, response, arg);
+ {
+ mir_cslock lock(requestQueueLock);
+
+ requests.insert(item);
+ }
+ SetEvent(hRequestQueueEvent);
+}
+
+void RequestQueue::Execute(RequestQueueItem *item)
+{
+ NETLIBHTTPREQUEST *response = item->request->Send(hConnection);
+ if (item->responseCallback != NULL)
+ {
+ item->responseCallback(response, item->arg);
+ }
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)response);
+ requests.remove(item);
+ delete item;
+}
+
+unsigned int RequestQueue::WorkerThread(void* owner, void*)
+{
+ RequestQueue *that = (RequestQueue*)owner;
+
+ while (!that->isTerminated)
+ {
+ WaitForSingleObject(that->hRequestQueueEvent, INFINITE);
+ while (true)
+ {
+ RequestQueueItem *item = NULL;
+ {
+ mir_cslock lock(that->requestQueueLock);
+
+ if (that->requests.getCount() == 0)
+ break;
+
+ item = that->requests[0];
+ that->requests.remove(0);
+ }
+ if (item != NULL)
+ that->Execute(item);
+ }
+ }
+
+ return 0;
+}
\ No newline at end of file |