summaryrefslogtreecommitdiff
path: root/src/client/RequestBroker.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/RequestBroker.h')
-rw-r--r--src/client/RequestBroker.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/client/RequestBroker.h b/src/client/RequestBroker.h
new file mode 100644
index 0000000..b3d1fc3
--- /dev/null
+++ b/src/client/RequestBroker.h
@@ -0,0 +1,121 @@
+#pragma once
+#include <queue>
+#include <list>
+#include <utility>
+#include <deque>
+#include <pthread.h>
+#undef GetUserName //God dammit microsoft!
+
+#include "Singleton.h"
+
+class GameSave;
+class Thumbnail;
+class ThumbnailListener;
+typedef std::pair<int, ThumbnailListener*> ListenerHandle;
+class RequestBroker: public Singleton<RequestBroker>
+{
+private:
+ class ThumbnailSpec
+ {
+ public:
+ int Width, Height;
+ ListenerHandle CompletedListener;
+ ThumbnailSpec(int width, int height, ListenerHandle completedListener) :
+ Width(width), Height(height), CompletedListener(completedListener) {}
+ };
+
+ class ThumbnailID
+ {
+ public:
+ int SaveID, SaveDate;
+ bool operator ==(const ThumbnailID & second)
+ {
+ return SaveID == second.SaveID && SaveDate == second.SaveDate;
+ }
+ ThumbnailID(int saveID, int saveDate) : SaveID(saveID), SaveDate(saveDate) {}
+ ThumbnailID() : SaveID(0), SaveDate(0) {}
+ };
+
+ class ThumbnailRequest
+ {
+ public:
+ bool Complete;
+ void * HTTPContext;
+ int RequestTime;
+
+ ThumbnailID ID;
+ std::vector<ThumbnailSpec> SubRequests;
+
+ ThumbnailRequest(int saveID, int saveDate, int width, int height, ListenerHandle completedListener) :
+ ID(saveID, saveDate), Complete(false), HTTPContext(NULL), RequestTime(0)
+ {
+ SubRequests.push_back(ThumbnailSpec(width, height, completedListener));
+ }
+ ThumbnailRequest() : Complete(false), HTTPContext(NULL), RequestTime(0) {}
+ };
+
+ class ThumbRenderRequest
+ {
+ public:
+ int Width, Height;
+ bool Decorations;
+ bool Fire;
+ GameSave * Save;
+ ListenerHandle CompletedListener;
+ ThumbRenderRequest(GameSave * save, bool decorations, bool fire, int width, int height, ListenerHandle completedListener) :
+ Save(save), Width(width), Height(height), CompletedListener(completedListener), Decorations(decorations), Fire(fire) {}
+ ThumbRenderRequest() : Save(0), Decorations(true), Fire(true), Width(0), Height(0), CompletedListener(ListenerHandle(0, (ThumbnailListener*)NULL)) {}
+ };
+
+ class Request
+ {
+ enum RequestType { Thumbnail, ThumbnailRender, HTTP };
+ public:
+ RequestType Type;
+ void * RequestObject;
+ ListenerHandle Listener;
+ };
+
+ //Thumbnail retreival
+ /*int thumbnailCacheNextID;
+ Thumbnail * thumbnailCache[THUMB_CACHE_SIZE];
+ void * activeThumbRequests[IMGCONNS];
+ int activeThumbRequestTimes[IMGCONNS];
+ int activeThumbRequestCompleteTimes[IMGCONNS];
+ std::string activeThumbRequestIDs[IMGCONNS];*/
+
+ pthread_mutex_t thumbnailQueueMutex;
+ pthread_mutex_t listenersMutex;
+ pthread_mutex_t runningMutex;
+ pthread_t thumbnailQueueThread;
+ bool thumbnailQueueRunning;
+ std::deque<ThumbnailRequest> thumbnailRequests;
+ std::deque<ThumbRenderRequest> renderRequests;
+
+ std::deque<std::pair<ListenerHandle, Thumbnail*> > thumbnailComplete;
+ std::list<ThumbnailRequest> currentRequests;
+ std::deque<std::pair<ThumbnailID, Thumbnail*> > thumbnailCache;
+
+ std::vector<ListenerHandle> validListeners;
+
+ std::deque<Request> requestQueue;
+
+ static void * thumbnailQueueProcessHelper(void * ref);
+ void thumbnailQueueProcessTH();
+ void assureRunning();
+
+public:
+ RequestBroker();
+ virtual ~RequestBroker();
+ void Shutdown();
+
+ void FlushThumbQueue();
+ void RenderThumbnail(GameSave * gameSave, bool decorations, bool fire, int width, int height, ThumbnailListener * tListener);
+ void RenderThumbnail(GameSave * gameSave, int width, int height, ThumbnailListener * tListener);
+ void RetrieveThumbnail(int saveID, int saveDate, int width, int height, ThumbnailListener * tListener);
+ void RetrieveThumbnail(int saveID, int width, int height, ThumbnailListener * tListener);
+
+ bool CheckThumbnailListener(ListenerHandle handle);
+ void AttachThumbnailListener(ThumbnailListener * tListener);
+ void DetachThumbnailListener(ThumbnailListener * tListener);
+}; \ No newline at end of file