diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-12 21:17:19 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2013-03-12 21:17:19 (GMT) |
| commit | 86b7a118004c9f9797d4d898dd587000e5178cea (patch) | |
| tree | d2484bc8120fd6f3ee108cd51e026f1d5ebe860f /src/client/RequestBroker.h | |
| parent | e6bca489c9aae88f1c7bbb44c4e2df71f481cbd3 (diff) | |
| download | powder-86b7a118004c9f9797d4d898dd587000e5178cea.zip powder-86b7a118004c9f9797d4d898dd587000e5178cea.tar.gz | |
Make thumbnailbroker more general purpose, image requests for requestbroker, avatars in previewview
Diffstat (limited to 'src/client/RequestBroker.h')
| -rw-r--r-- | src/client/RequestBroker.h | 166 |
1 files changed, 100 insertions, 66 deletions
diff --git a/src/client/RequestBroker.h b/src/client/RequestBroker.h index b3d1fc3..9244e91 100644 --- a/src/client/RequestBroker.h +++ b/src/client/RequestBroker.h @@ -9,113 +9,147 @@ #include "Singleton.h" class GameSave; -class Thumbnail; -class ThumbnailListener; -typedef std::pair<int, ThumbnailListener*> ListenerHandle; +class VideoBuffer; +class RequestListener; +typedef std::pair<int, RequestListener*> 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 + enum ProcessResponse { Finished, OK, Canceled, Failed, Duplicate }; + + class Request { public: - int SaveID, SaveDate; - bool operator ==(const ThumbnailID & second) + enum RequestType { ThumbnailRender, Image }; + RequestType Type; + void * ResultObject; + ListenerHandle Listener; + std::vector<Request*> Children; + Request(RequestType type, ListenerHandle listener) { - return SaveID == second.SaveID && SaveDate == second.SaveDate; + Type = type; + Listener = listener; + ResultObject = NULL; } - 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) + virtual ~Request() + { + std::vector<Request*>::iterator iter = Children.begin(); + while(iter != Children.end()) + { + delete (*iter); + iter++; + } + } + virtual void Cleanup() + { + std::vector<Request*>::iterator iter = Children.begin(); + while(iter != Children.end()) { - SubRequests.push_back(ThumbnailSpec(width, height, completedListener)); + (*iter)->Cleanup(); + iter++; } - ThumbnailRequest() : Complete(false), HTTPContext(NULL), RequestTime(0) {} + } }; - class ThumbRenderRequest + class ThumbRenderRequest: public Request { 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)) {} + ThumbRenderRequest(GameSave * save, bool decorations, bool fire, int width, int height, ListenerHandle listener): + Request(ThumbnailRender, listener) + { + Save = save; + Width = width; + Height = height; + Decorations = decorations; + Fire = fire; + } + virtual ~ThumbRenderRequest() + { + if(Save) + delete Save; + } + virtual void Cleanup() + { + Request::Cleanup(); + if(ResultObject) + { + delete ((VideoBuffer*)ResultObject); + ResultObject = NULL; + } + } }; - class Request + class ImageRequest: public Request { - enum RequestType { Thumbnail, ThumbnailRender, HTTP }; public: - RequestType Type; - void * RequestObject; - ListenerHandle Listener; + int Width, Height; + std::string URL; + int RequestTime; + void * HTTPContext; + ImageRequest(std::string url, int width, int height, ListenerHandle listener): + Request(Image, listener) + { + URL = url; + HTTPContext = NULL; + Width = width; + Height = height; + } + virtual ~ImageRequest() {} + virtual void Cleanup() + { + Request::Cleanup(); + if(ResultObject) + { + delete ((VideoBuffer*)ResultObject); + ResultObject = NULL; + } + } }; - //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_mutex_t requestQueueMutex; + pthread_mutex_t completeQueueMutex; + 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; + 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(); + ProcessResponse processThumbnailRender(ThumbRenderRequest & request); + ProcessResponse processImage(ImageRequest & request); + + void requestComplete(Request * completedRequest); + 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); + 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 CheckThumbnailListener(ListenerHandle handle); - void AttachThumbnailListener(ThumbnailListener * tListener); - void DetachThumbnailListener(ThumbnailListener * tListener); + bool CheckRequestListener(ListenerHandle handle); + ListenerHandle AttachRequestListener(RequestListener * tListener); + void DetachRequestListener(RequestListener * tListener); };
\ No newline at end of file |
