summaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2013-07-27 11:38:52 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2013-07-27 11:38:52 (GMT)
commit3edee42971a4b65cb2830c5ca24a5076f5f770e4 (patch)
tree0b21fd7f5b61a0c5a931f6490e30abc6d52328c0 /src/client
parent39acce4502bdfad7bb1d59cd3dcbe335e8b690a6 (diff)
downloadpowder-3edee42971a4b65cb2830c5ca24a5076f5f770e4.zip
powder-3edee42971a4b65cb2830c5ca24a5076f5f770e4.tar.gz
Call OnResponseReady with an identifier for the request, add a WebRequest class
Diffstat (limited to 'src/client')
-rw-r--r--src/client/Client.cpp12
-rw-r--r--src/client/Client.h2
-rw-r--r--src/client/requestbroker/APIRequest.cpp8
-rw-r--r--src/client/requestbroker/APIRequest.h4
-rw-r--r--src/client/requestbroker/ImageRequest.cpp4
-rw-r--r--src/client/requestbroker/ImageRequest.h2
-rw-r--r--src/client/requestbroker/RequestBroker.cpp7
-rw-r--r--src/client/requestbroker/RequestBroker.h8
-rw-r--r--src/client/requestbroker/RequestListener.h2
-rw-r--r--src/client/requestbroker/ThumbRenderRequest.cpp4
-rw-r--r--src/client/requestbroker/ThumbRenderRequest.h2
-rw-r--r--src/client/requestbroker/WebRequest.cpp134
-rw-r--r--src/client/requestbroker/WebRequest.h17
13 files changed, 187 insertions, 19 deletions
diff --git a/src/client/Client.cpp b/src/client/Client.cpp
index a9f7032..9d819e6 100644
--- a/src/client/Client.cpp
+++ b/src/client/Client.cpp
@@ -45,6 +45,7 @@
#include "gui/preview/Comment.h"
#include "ClientListener.h"
#include "requestbroker/RequestBroker.h"
+#include "requestbroker/WebRequest.h"
#include "requestbroker/APIRequest.h"
#include "requestbroker/APIResultParser.h"
@@ -1196,6 +1197,17 @@ std::vector<unsigned char> Client::GetSaveData(int saveID, int saveDate)
return saveData;
}
+RequestBroker::Request * Client::GetSaveDataAsync(int saveID, int saveDate)
+{
+ std::stringstream urlStream;
+ if(saveDate){
+ urlStream << "http://" << STATICSERVER << "/" << saveID << "_" << saveDate << ".cps";
+ } else {
+ urlStream << "http://" << STATICSERVER << "/" << saveID << ".cps";
+ }
+ return new WebRequest(urlStream.str());
+}
+
RequestBroker::Request * Client::SaveUserInfoAsync(UserInfo info)
{
class StatusParser: public APIResultParser
diff --git a/src/client/Client.h b/src/client/Client.h
index 6429b18..24f5782 100644
--- a/src/client/Client.h
+++ b/src/client/Client.h
@@ -136,8 +136,10 @@ public:
RequestBroker::Request * GetUserInfoAsync(std::string username);
RequestBroker::Request * SaveUserInfoAsync(UserInfo info);
+ RequestBroker::Request * GetSaveDataAsync(int saveID, int saveDate);
unsigned char * GetSaveData(int saveID, int saveDate, int & dataLength);
std::vector<unsigned char> GetSaveData(int saveID, int saveDate);
+
LoginStatus Login(std::string username, std::string password, User & user);
void ClearThumbnailRequests();
std::vector<SaveInfo*> * SearchSaves(int start, int count, std::string query, std::string sort, std::string category, int & resultCount);
diff --git a/src/client/requestbroker/APIRequest.cpp b/src/client/requestbroker/APIRequest.cpp
index 10b2a8b..aa42f10 100644
--- a/src/client/requestbroker/APIRequest.cpp
+++ b/src/client/requestbroker/APIRequest.cpp
@@ -9,8 +9,8 @@
#include "client/HTTP.h"
#include "APIResultParser.h"
-APIRequest::APIRequest(std::string url, APIResultParser * parser, ListenerHandle listener):
- RequestBroker::Request(API, listener)
+APIRequest::APIRequest(std::string url, APIResultParser * parser, ListenerHandle listener, int identifier):
+ RequestBroker::Request(API, listener, identifier)
{
Post = false;
HTTPContext = NULL;
@@ -18,8 +18,8 @@ APIRequest::APIRequest(std::string url, APIResultParser * parser, ListenerHandle
URL = url;
}
-APIRequest::APIRequest(std::string url, std::map<std::string, std::string> postData, APIResultParser * parser, ListenerHandle listener):
- RequestBroker::Request(API, listener)
+APIRequest::APIRequest(std::string url, std::map<std::string, std::string> postData, APIResultParser * parser, ListenerHandle listener, int identifier):
+ RequestBroker::Request(API, listener, identifier)
{
Post = true;
PostData = postData;
diff --git a/src/client/requestbroker/APIRequest.h b/src/client/requestbroker/APIRequest.h
index 6e5bbc5..9001d57 100644
--- a/src/client/requestbroker/APIRequest.h
+++ b/src/client/requestbroker/APIRequest.h
@@ -10,8 +10,8 @@ public:
std::string URL;
std::map<std::string, std::string> PostData;
void * HTTPContext;
- APIRequest(std::string url, APIResultParser * parser, ListenerHandle listener = ListenerHandle(0, (RequestListener*)0));
- APIRequest(std::string url, std::map<std::string, std::string>, APIResultParser * parser, ListenerHandle listener = ListenerHandle(0, (RequestListener*)0));
+ APIRequest(std::string url, APIResultParser * parser, ListenerHandle listener = ListenerHandle(0, (RequestListener*)0), int identifier = 0);
+ APIRequest(std::string url, std::map<std::string, std::string>, APIResultParser * parser, ListenerHandle listener = ListenerHandle(0, (RequestListener*)0), int identifier = 0);
virtual RequestBroker::ProcessResponse Process(RequestBroker & rb);
virtual ~APIRequest();
virtual void Cleanup();
diff --git a/src/client/requestbroker/ImageRequest.cpp b/src/client/requestbroker/ImageRequest.cpp
index 9c8d42c..74c2312 100644
--- a/src/client/requestbroker/ImageRequest.cpp
+++ b/src/client/requestbroker/ImageRequest.cpp
@@ -4,8 +4,8 @@
#include "graphics/Graphics.h"
#include "client/HTTP.h"
-ImageRequest::ImageRequest(std::string url, int width, int height, ListenerHandle listener):
- Request(Image, listener)
+ImageRequest::ImageRequest(std::string url, int width, int height, ListenerHandle listener, int identifier):
+ Request(Image, listener, identifier)
{
URL = url;
HTTPContext = NULL;
diff --git a/src/client/requestbroker/ImageRequest.h b/src/client/requestbroker/ImageRequest.h
index 2fc0b62..58a63ad 100644
--- a/src/client/requestbroker/ImageRequest.h
+++ b/src/client/requestbroker/ImageRequest.h
@@ -7,7 +7,7 @@ public:
std::string URL;
int RequestTime;
void * HTTPContext;
- ImageRequest(std::string url, int width, int height, ListenerHandle listener);
+ ImageRequest(std::string url, int width, int height, ListenerHandle listener, int identifier = 0);
virtual RequestBroker::ProcessResponse Process(RequestBroker & rb);
virtual ~ImageRequest();
virtual void Cleanup();
diff --git a/src/client/requestbroker/RequestBroker.cpp b/src/client/requestbroker/RequestBroker.cpp
index 21194ce..9744fb0 100644
--- a/src/client/requestbroker/RequestBroker.cpp
+++ b/src/client/requestbroker/RequestBroker.cpp
@@ -114,7 +114,7 @@ void RequestBroker::RetrieveAvatar(std::string username, int width, int height,
RetrieveImage(urlStream.str(), width, height, tListener);
}
-void RequestBroker::Start(Request * request, RequestListener * tListener)
+void RequestBroker::Start(Request * request, RequestListener * tListener, int identifier)
{
ListenerHandle handle = AttachRequestListener(tListener);
@@ -152,7 +152,7 @@ void RequestBroker::FlushThumbQueue()
{
if(CheckRequestListener(completeQueue.front()->Listener))
{
- completeQueue.front()->Listener.second->OnResponseReady(completeQueue.front()->ResultObject);
+ completeQueue.front()->Listener.second->OnResponseReady(completeQueue.front()->ResultObject, completeQueue.front()->Identifier);
}
else
{
@@ -288,11 +288,12 @@ void RequestBroker::DetachRequestListener(RequestListener * tListener)
pthread_mutex_unlock(&listenersMutex);
}
-RequestBroker::Request::Request(RequestType type, ListenerHandle listener)
+RequestBroker::Request::Request(RequestType type, ListenerHandle listener, int identifier)
{
Type = type;
Listener = listener;
ResultObject = NULL;
+ Identifier = identifier;
}
RequestBroker::Request::~Request()
{
diff --git a/src/client/requestbroker/RequestBroker.h b/src/client/requestbroker/RequestBroker.h
index f6454a9..58084f0 100644
--- a/src/client/requestbroker/RequestBroker.h
+++ b/src/client/requestbroker/RequestBroker.h
@@ -17,6 +17,7 @@ class RequestBroker: public Singleton<RequestBroker>
{
friend class ImageRequest;
friend class APIRequest;
+ friend class WebRequest;
friend class ThumbRenderRequest;
public:
class Request;
@@ -56,7 +57,7 @@ public:
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);
+ void Start(Request * request, RequestListener * tLIstener, int identifier = 0);
bool CheckRequestListener(ListenerHandle handle);
ListenerHandle AttachRequestListener(RequestListener * tListener);
@@ -65,12 +66,13 @@ public:
class Request
{
public:
- enum RequestType { ThumbnailRender, Image, API };
+ enum RequestType { ThumbnailRender, Image, API, Web };
+ int Identifier;
RequestType Type;
void * ResultObject;
ListenerHandle Listener;
std::vector<Request*> Children;
- Request(RequestType type, ListenerHandle listener);
+ Request(RequestType type, ListenerHandle listener, int identifier);
virtual ProcessResponse Process(RequestBroker & rb) { return Failed; }
virtual ~Request();
virtual void Cleanup();
diff --git a/src/client/requestbroker/RequestListener.h b/src/client/requestbroker/RequestListener.h
index 1f53b2a..b67805c 100644
--- a/src/client/requestbroker/RequestListener.h
+++ b/src/client/requestbroker/RequestListener.h
@@ -7,5 +7,5 @@ public:
RequestListener() { ListenerRand = rand(); }
virtual ~RequestListener() {}
- virtual void OnResponseReady(void * response) {}
+ virtual void OnResponseReady(void * response, int identifier) {}
};
diff --git a/src/client/requestbroker/ThumbRenderRequest.cpp b/src/client/requestbroker/ThumbRenderRequest.cpp
index 1b38529..1ddcef5 100644
--- a/src/client/requestbroker/ThumbRenderRequest.cpp
+++ b/src/client/requestbroker/ThumbRenderRequest.cpp
@@ -5,8 +5,8 @@
#include "graphics/Graphics.h"
#include "simulation/SaveRenderer.h"
-ThumbRenderRequest::ThumbRenderRequest(GameSave * save, bool decorations, bool fire, int width, int height, ListenerHandle listener):
- RequestBroker::Request(ThumbnailRender, listener)
+ThumbRenderRequest::ThumbRenderRequest(GameSave * save, bool decorations, bool fire, int width, int height, ListenerHandle listener, int identifier):
+ RequestBroker::Request(ThumbnailRender, listener, identifier)
{
Save = save;
Width = width;
diff --git a/src/client/requestbroker/ThumbRenderRequest.h b/src/client/requestbroker/ThumbRenderRequest.h
index 97b3982..739b0e7 100644
--- a/src/client/requestbroker/ThumbRenderRequest.h
+++ b/src/client/requestbroker/ThumbRenderRequest.h
@@ -8,7 +8,7 @@ public:
bool Decorations;
bool Fire;
GameSave * Save;
- ThumbRenderRequest(GameSave * save, bool decorations, bool fire, int width, int height, ListenerHandle listener);
+ ThumbRenderRequest(GameSave * save, bool decorations, bool fire, int width, int height, ListenerHandle listener, int identifier = 0);
virtual RequestBroker::ProcessResponse Process(RequestBroker & rb);
virtual ~ThumbRenderRequest();
virtual void Cleanup();
diff --git a/src/client/requestbroker/WebRequest.cpp b/src/client/requestbroker/WebRequest.cpp
new file mode 100644
index 0000000..fffdcc8
--- /dev/null
+++ b/src/client/requestbroker/WebRequest.cpp
@@ -0,0 +1,134 @@
+#include <iostream>
+#include <vector>
+#include <typeinfo>
+#include <cstdlib>
+#include <cstring>
+#include "Config.h"
+#include "Format.h"
+#include "client/Client.h"
+#include "WebRequest.h"
+#include "client/HTTP.h"
+#include "APIResultParser.h"
+
+WebRequest::WebRequest(std::string url, ListenerHandle listener, int identifier):
+ RequestBroker::Request(API, listener, identifier)
+{
+ Post = false;
+ HTTPContext = NULL;
+ URL = url;
+}
+
+WebRequest::WebRequest(std::string url, std::map<std::string, std::string> postData, ListenerHandle listener, int identifier):
+ RequestBroker::Request(API, listener, identifier)
+{
+ Post = true;
+ PostData = postData;
+ HTTPContext = NULL;
+ URL = url;
+}
+
+RequestBroker::ProcessResponse WebRequest::Process(RequestBroker & rb)
+{
+ if(HTTPContext)
+ {
+ if(http_async_req_status(HTTPContext))
+ {
+ char * data;
+ int status, data_size;
+ data = http_async_req_stop(HTTPContext, &status, &data_size);
+
+ if (status == 200 && data)
+ {
+ void * resultObject = new std::vector<unsigned char>(data, data+data_size);
+
+ if(resultObject)
+ {
+ this->ResultObject = resultObject;
+ rb.requestComplete(this);
+ free(data);
+ return RequestBroker::Finished;
+ }
+ else
+ {
+ std::cout << typeid(*this).name() << " Request for " << URL << " could not be parsed: " << data << std::endl;
+ free(data);
+ return RequestBroker::Failed;
+ }
+ }
+ else
+ {
+//#ifdef DEBUG
+ std::cout << typeid(*this).name() << " Request for " << URL << " failed with status " << status << std::endl;
+//#endif
+ if(data)
+ free(data);
+
+ return RequestBroker::Failed;
+ }
+ }
+ }
+ else
+ {
+ std::cout << typeid(*this).name() << " New Request for " << URL << std::endl;
+ if(Post)
+ {
+ char ** postNames = new char*[PostData.size() + 1];
+ char ** postData = new char*[PostData.size()];
+ int * postLength = new int[PostData.size()];
+
+ int i = 0;
+ std::map<std::string, std::string>::iterator iter = PostData.begin();
+ while(iter != PostData.end())
+ {
+ std::string name = iter->first;
+ std::string data = iter->second;
+ char * cName = new char[name.length() + 1];
+ char * cData = new char[data.length() + 1];
+ std::strcpy(cName, name.c_str());
+ std::strcpy(cData, data.c_str());
+ postNames[i] = cName;
+ postData[i] = cData;
+ postLength[i] = data.length();
+ i++;
+ iter++;
+ }
+ postNames[i] = NULL;
+
+ if(Client::Ref().GetAuthUser().ID)
+ {
+ std::cout << typeid(*this).name() << " Authenticated " << std::endl;
+ User user = Client::Ref().GetAuthUser();
+ char userName[12];
+ char *userSession = new char[user.SessionID.length() + 1];
+ std::strcpy(userName, format::NumberToString<int>(user.ID).c_str());
+ std::strcpy(userSession, user.SessionID.c_str());
+ HTTPContext = http_multipart_post_async((char*)URL.c_str(), postNames, postData, postLength, userName, NULL, userSession);
+ delete userSession;
+ }
+ else
+ {
+ HTTPContext = http_multipart_post_async((char*)URL.c_str(), postNames, postData, postLength, NULL, NULL, NULL);
+ }
+
+ }
+ else
+ {
+ HTTPContext = http_async_req_start(NULL, (char *)URL.c_str(), NULL, 0, 0);
+ }
+ }
+ return RequestBroker::OK;
+}
+
+WebRequest::~WebRequest()
+{
+}
+
+void WebRequest::Cleanup()
+{
+ Request::Cleanup();
+ if(ResultObject)
+ {
+ delete (std::vector<unsigned char>*)ResultObject;
+ ResultObject = NULL;
+ }
+}
diff --git a/src/client/requestbroker/WebRequest.h b/src/client/requestbroker/WebRequest.h
new file mode 100644
index 0000000..fff5760
--- /dev/null
+++ b/src/client/requestbroker/WebRequest.h
@@ -0,0 +1,17 @@
+#include <map>
+#include "RequestBroker.h"
+
+class WebRequest: public RequestBroker::Request
+{
+public:
+ bool Post;
+ std::string URL;
+ std::map<std::string, std::string> PostData;
+ void * HTTPContext;
+ WebRequest(std::string url, ListenerHandle listener = ListenerHandle(0, (RequestListener*)0), int identifier = 0);
+ WebRequest(std::string url, std::map<std::string, std::string>, ListenerHandle listener = ListenerHandle(0, (RequestListener*)0), int identifier = 0);
+ virtual RequestBroker::ProcessResponse Process(RequestBroker & rb);
+ virtual ~WebRequest();
+ virtual void Cleanup();
+};
+