From dd3d0e59dcd34beb222fcf612a51d3fee82c0e43 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Tue, 17 Mar 2015 20:33:47 +0000 Subject: SkypeWeb: initial commit git-svn-id: http://svn.miranda-ng.org/main/trunk@12424 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/SkypeWeb/src/request_queue.cpp | 88 ++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 protocols/SkypeWeb/src/request_queue.cpp (limited to 'protocols/SkypeWeb/src/request_queue.cpp') 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 -- cgit v1.2.3