summaryrefslogtreecommitdiff
path: root/src/client/requestbroker/RequestBroker.h
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2013-03-14 11:30:24 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2013-03-14 11:30:24 (GMT)
commit9479b7f3300658156c467980c28d3436a728bc0c (patch)
tree631a10f9fe9628d1250109f6b9c643d008591d39 /src/client/requestbroker/RequestBroker.h
parent7a055a9d90ea3464bbdc314df423e2aa768ce2be (diff)
downloadpowder-9479b7f3300658156c467980c28d3436a728bc0c.zip
powder-9479b7f3300658156c467980c28d3436a728bc0c.tar.gz
Move requestbroker into new folder, make request process function a method of Request
Diffstat (limited to 'src/client/requestbroker/RequestBroker.h')
-rw-r--r--src/client/requestbroker/RequestBroker.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/client/requestbroker/RequestBroker.h b/src/client/requestbroker/RequestBroker.h
new file mode 100644
index 0000000..003ac37
--- /dev/null
+++ b/src/client/requestbroker/RequestBroker.h
@@ -0,0 +1,76 @@
+#pragma once
+#include <queue>
+#include <list>
+#include <utility>
+#include <deque>
+#include <string>
+#include <pthread.h>
+#undef GetUserName //God dammit microsoft!
+
+#include "Singleton.h"
+
+class GameSave;
+class VideoBuffer;
+class RequestListener;
+typedef std::pair<int, RequestListener*> ListenerHandle;
+class RequestBroker: public Singleton<RequestBroker>
+{
+ friend class ImageRequest;
+ friend class ThumbRenderRequest;
+public:
+ class Request;
+private:
+
+ pthread_mutex_t listenersMutex;
+ pthread_mutex_t runningMutex;
+ pthread_mutex_t requestQueueMutex;
+ pthread_mutex_t completeQueueMutex;
+
+ pthread_t thumbnailQueueThread;
+ bool thumbnailQueueRunning;
+
+ std::vector<ListenerHandle> validListeners;
+
+ std::deque<std::pair<std::string, VideoBuffer*> > imageCache;
+
+ std::queue<Request*> completeQueue;
+ std::vector<Request*> requestQueue;
+ std::vector<Request*> activeRequests;
+
+ static void * thumbnailQueueProcessHelper(void * ref);
+ void thumbnailQueueProcessTH();
+ void assureRunning();
+
+ void requestComplete(Request * completedRequest);
+
+public:
+ RequestBroker();
+ virtual ~RequestBroker();
+ void Shutdown();
+
+ void FlushThumbQueue();
+ void RetrieveImage(std::string imageUrl, int width, int height, RequestListener * tListener);
+ void RenderThumbnail(GameSave * gameSave, bool decorations, bool fire, int width, int height, RequestListener * tListener);
+ void RenderThumbnail(GameSave * gameSave, int width, int height, RequestListener * tListener);
+ void RetrieveThumbnail(int saveID, int saveDate, int width, int height, RequestListener * tListener);
+ void RetrieveThumbnail(int saveID, int width, int height, RequestListener * tListener);
+ void RetrieveAvatar(std::string username, int width, int height, RequestListener * tListener);
+
+ bool CheckRequestListener(ListenerHandle handle);
+ ListenerHandle AttachRequestListener(RequestListener * tListener);
+ void DetachRequestListener(RequestListener * tListener);
+ enum ProcessResponse { Finished, OK, Canceled, Failed, Duplicate };
+ class Request
+ {
+ public:
+ enum RequestType { ThumbnailRender, Image };
+ RequestType Type;
+ void * ResultObject;
+ ListenerHandle Listener;
+ std::vector<Request*> Children;
+ Request(RequestType type, ListenerHandle listener);
+ virtual ProcessResponse Process(RequestBroker & rb) { return Failed; }
+ virtual ~Request();
+ virtual void Cleanup();
+ };
+}; \ No newline at end of file