1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#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 APIRequest;
friend class WebRequest;
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);
void Start(Request * request, RequestListener * tLIstener, int identifier = 0);
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, API, Web };
int Identifier;
RequestType Type;
void * ResultObject;
ListenerHandle Listener;
std::vector<Request*> Children;
Request(RequestType type, ListenerHandle listener, int identifier);
virtual ProcessResponse Process(RequestBroker & rb) { return Failed; }
virtual ~Request();
virtual void Cleanup();
};
};
|