diff options
| author | Simon 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) |
| commit | 9479b7f3300658156c467980c28d3436a728bc0c (patch) | |
| tree | 631a10f9fe9628d1250109f6b9c643d008591d39 /src/client/requestbroker/RequestBroker.h | |
| parent | 7a055a9d90ea3464bbdc314df423e2aa768ce2be (diff) | |
| download | powder-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.h | 76 |
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 |
