summaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/client')
-rw-r--r--src/client/Client.cpp134
-rw-r--r--src/client/Client.h8
-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.cpp8
-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, 316 insertions, 19 deletions
diff --git a/src/client/Client.cpp b/src/client/Client.cpp
index a9f7032..c446c14 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
@@ -1723,6 +1735,80 @@ SaveInfo * Client::GetSave(int saveID, int saveDate)
return NULL;
}
+RequestBroker::Request * Client::GetSaveAsync(int saveID, int saveDate)
+{
+ std::stringstream urlStream;
+ urlStream << "http://" << SERVER << "/Browse/View.json?ID=" << saveID;
+ if(saveDate)
+ {
+ urlStream << "&Date=" << saveDate;
+ }
+
+ class SaveInfoParser: public APIResultParser
+ {
+ virtual void * ProcessResponse(unsigned char * data, int dataLength)
+ {
+ try
+ {
+ std::istringstream dataStream((char*)data);
+ json::Object objDocument;
+ json::Reader::Read(objDocument, dataStream);
+
+ json::Number tempID = objDocument["ID"];
+ json::Number tempScoreUp = objDocument["ScoreUp"];
+ json::Number tempScoreDown = objDocument["ScoreDown"];
+ json::Number tempMyScore = objDocument["ScoreMine"];
+ json::String tempUsername = objDocument["Username"];
+ json::String tempName = objDocument["Name"];
+ json::String tempDescription = objDocument["Description"];
+ json::Number tempDate = objDocument["Date"];
+ json::Boolean tempPublished = objDocument["Published"];
+ json::Boolean tempFavourite = objDocument["Favourite"];
+ json::Number tempComments = objDocument["Comments"];
+ json::Number tempViews = objDocument["Views"];
+ json::Number tempVersion = objDocument["Version"];
+
+ json::Array tagsArray = objDocument["Tags"];
+ std::vector<std::string> tempTags;
+
+ for(int j = 0; j < tagsArray.Size(); j++)
+ {
+ json::String tempTag = tagsArray[j];
+ tempTags.push_back(tempTag.Value());
+ }
+
+ SaveInfo * tempSave = new SaveInfo(
+ tempID.Value(),
+ tempDate.Value(),
+ tempScoreUp.Value(),
+ tempScoreDown.Value(),
+ tempMyScore.Value(),
+ tempUsername.Value(),
+ tempName.Value(),
+ tempDescription.Value(),
+ tempPublished.Value(),
+ tempTags
+ );
+ tempSave->Comments = tempComments.Value();
+ tempSave->Favourite = tempFavourite.Value();
+ tempSave->Views = tempViews.Value();
+ tempSave->Version = tempVersion.Value();
+ return tempSave;
+ }
+ catch (json::Exception &e)
+ {
+ return NULL;
+ }
+ }
+ virtual void Cleanup(void * objectPtr)
+ {
+ delete (SaveInfo*)objectPtr;
+ }
+ virtual ~SaveInfoParser() { }
+ };
+ return new APIRequest(urlStream.str(), new SaveInfoParser());
+}
+
Thumbnail * Client::GetPreview(int saveID, int saveDate)
{
std::stringstream urlStream;
@@ -1765,6 +1851,54 @@ Thumbnail * Client::GetPreview(int saveID, int saveDate)
return new Thumbnail(saveID, saveDate, (pixel *)malloc((128*128) * PIXELSIZE), ui::Point(128, 128));
}
+RequestBroker::Request * Client::GetCommentsAsync(int saveID, int start, int count)
+{
+ class CommentsParser: public APIResultParser
+ {
+ virtual void * ProcessResponse(unsigned char * data, int dataLength)
+ {
+ std::vector<SaveComment*> * commentArray = new std::vector<SaveComment*>();
+ try
+ {
+ std::istringstream dataStream((char*)data);
+ json::Array commentsArray;
+ json::Reader::Read(commentsArray, dataStream);
+
+ for(int j = 0; j < commentsArray.Size(); j++)
+ {
+ json::Number tempUserID = commentsArray[j]["UserID"];
+ json::String tempUsername = commentsArray[j]["Username"];
+ json::String tempFormattedUsername = commentsArray[j]["FormattedUsername"];
+ json::String tempComment = commentsArray[j]["Text"];
+ commentArray->push_back(
+ new SaveComment(
+ tempUserID.Value(),
+ tempUsername.Value(),
+ tempFormattedUsername.Value(),
+ tempComment.Value()
+ )
+ );
+ }
+ return commentArray;
+ }
+ catch (json::Exception &e)
+ {
+ delete commentArray;
+ return NULL;
+ }
+ }
+ virtual void Cleanup(void * objectPtr)
+ {
+ delete (std::vector<SaveComment*>*)objectPtr;
+ }
+ virtual ~CommentsParser() { }
+ };
+
+ std::stringstream urlStream;
+ urlStream << "http://" << SERVER << "/Browse/Comments.json?ID=" << saveID << "&Start=" << start << "&Count=" << count;
+ return new APIRequest(urlStream.str(), new CommentsParser());
+}
+
std::vector<SaveComment*> * Client::GetComments(int saveID, int start, int count)
{
lastError = "";
diff --git a/src/client/Client.h b/src/client/Client.h
index 6429b18..659f615 100644
--- a/src/client/Client.h
+++ b/src/client/Client.h
@@ -136,16 +136,24 @@ 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);
std::vector<std::pair<std::string, int> > * GetTags(int start, int count, std::string query, int & resultCount);
+
std::vector<SaveComment*> * GetComments(int saveID, int start, int count);
+ RequestBroker::Request * GetCommentsAsync(int saveID, int start, int count);
+
Thumbnail * GetPreview(int saveID, int saveDate);
Thumbnail * GetThumbnail(int saveID, int saveDate);
+
SaveInfo * GetSave(int saveID, int saveDate);
+ RequestBroker::Request * GetSaveAsync(int saveID, int saveDate);
+
RequestStatus DeleteSave(int saveID);
RequestStatus ReportSave(int saveID, std::string message);
RequestStatus UnpublishSave(int saveID);
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..1516b26 100644
--- a/src/client/requestbroker/RequestBroker.cpp
+++ b/src/client/requestbroker/RequestBroker.cpp
@@ -114,10 +114,11 @@ 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);
+ request->Identifier = identifier;
request->Listener = handle;
pthread_mutex_lock(&requestQueueMutex);
requestQueue.push_back(request);
@@ -152,7 +153,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 +289,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();
+};
+