summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
-rw-r--r--src/gui/interface/AvatarButton.cpp2
-rw-r--r--src/gui/interface/AvatarButton.h2
-rw-r--r--src/gui/interface/SaveButton.cpp2
-rw-r--r--src/gui/interface/SaveButton.h2
-rw-r--r--src/gui/preview/PreviewModel.cpp263
-rw-r--r--src/gui/preview/PreviewModel.h44
-rw-r--r--src/gui/profile/ProfileActivity.cpp2
-rw-r--r--src/gui/profile/ProfileActivity.h2
-rw-r--r--src/gui/save/LocalSaveActivity.cpp2
-rw-r--r--src/gui/save/LocalSaveActivity.h2
-rw-r--r--src/gui/save/ServerSaveActivity.cpp2
-rw-r--r--src/gui/save/ServerSaveActivity.h2
25 files changed, 409 insertions, 253 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();
+};
+
diff --git a/src/gui/interface/AvatarButton.cpp b/src/gui/interface/AvatarButton.cpp
index e385c77..9176964 100644
--- a/src/gui/interface/AvatarButton.cpp
+++ b/src/gui/interface/AvatarButton.cpp
@@ -40,7 +40,7 @@ void AvatarButton::Tick(float dt)
}
}
-void AvatarButton::OnResponseReady(void * imagePtr)
+void AvatarButton::OnResponseReady(void * imagePtr, int identifier)
{
VideoBuffer * image = (VideoBuffer*)imagePtr;
if(image)
diff --git a/src/gui/interface/AvatarButton.h b/src/gui/interface/AvatarButton.h
index 26b4348..d13f747 100644
--- a/src/gui/interface/AvatarButton.h
+++ b/src/gui/interface/AvatarButton.h
@@ -38,7 +38,7 @@ public:
virtual void Draw(const Point& screenPos);
virtual void Tick(float dt);
- virtual void OnResponseReady(void * imagePtr);
+ virtual void OnResponseReady(void * imagePtr, int identifier);
virtual void DoAction();
diff --git a/src/gui/interface/SaveButton.cpp b/src/gui/interface/SaveButton.cpp
index 7ea4198..7e67e48 100644
--- a/src/gui/interface/SaveButton.cpp
+++ b/src/gui/interface/SaveButton.cpp
@@ -128,7 +128,7 @@ SaveButton::~SaveButton()
delete file;
}
-void SaveButton::OnResponseReady(void * imagePtr)
+void SaveButton::OnResponseReady(void * imagePtr, int identifier)
{
VideoBuffer * image = (VideoBuffer*)imagePtr;
if(image)
diff --git a/src/gui/interface/SaveButton.h b/src/gui/interface/SaveButton.h
index 7bb77c4..4b9682a 100644
--- a/src/gui/interface/SaveButton.h
+++ b/src/gui/interface/SaveButton.h
@@ -58,7 +58,7 @@ public:
virtual void Draw(const Point& screenPos);
virtual void Tick(float dt);
- virtual void OnResponseReady(void * imagePtr);
+ virtual void OnResponseReady(void * imagePtr, int identifier);
void SetSelected(bool selected_) { selected = selected_; }
bool GetSelected() { return selected; }
diff --git a/src/gui/preview/PreviewModel.cpp b/src/gui/preview/PreviewModel.cpp
index 6776445..2f58107 100644
--- a/src/gui/preview/PreviewModel.cpp
+++ b/src/gui/preview/PreviewModel.cpp
@@ -5,68 +5,18 @@
#include "PreviewModelException.h"
PreviewModel::PreviewModel():
+ doOpen(false),
save(NULL),
- saveComments(NULL),
saveData(NULL),
- doOpen(false),
- commentsTotal(0),
- commentsPageNumber(1),
+ saveComments(NULL),
commentBoxEnabled(false),
- updateSaveDataInfo(NULL),
- updateSaveInfoInfo(NULL),
- updateSaveCommentsInfo(NULL)
+ commentsLoaded(false),
+ commentsTotal(0),
+ commentsPageNumber(1)
{
}
-void * PreviewModel::updateSaveInfoT(void * obj)
-{
- SaveInfo * tempSave = Client::Ref().GetSave(((threadInfo*)obj)->saveID, ((threadInfo*)obj)->saveDate);
- ((threadInfo*)obj)->threadFinished = true;
- if (((threadInfo*)obj)->previewExited)
- {
- if (tempSave)
- delete tempSave;
- delete obj;
- }
- return tempSave;
-}
-
-void * PreviewModel::updateSaveDataT(void * obj)
-{
- int tempDataSize;
- unsigned char * tempData = Client::Ref().GetSaveData(((threadInfo*)obj)->saveID, ((threadInfo*)obj)->saveDate, tempDataSize);
- SaveData * tempSave = new SaveData(tempData, tempDataSize);
- ((threadInfo*)obj)->threadFinished = true;
- if (((threadInfo*)obj)->previewExited)
- {
- if (tempSave)
- delete tempSave;
- if (tempData)
- free(tempData);
- delete obj;
- }
- return tempSave;
-}
-
-void * PreviewModel::updateSaveCommentsT(void * obj)
-{
- std::vector<SaveComment*> * tempComments = Client::Ref().GetComments(((threadInfo*)obj)->saveID, (((threadInfo*)obj)->saveDate-1)*20, 20); //saveDate is used as commentsPageNumber
- ((threadInfo*)obj)->threadFinished = true;
- if (((threadInfo*)obj)->previewExited)
- {
- if (tempComments)
- {
- for(int i = 0; i < tempComments->size(); i++)
- delete tempComments->at(i);
- tempComments->clear();
- delete tempComments;
- }
- delete obj;
- }
- return tempComments;
-}
-
void PreviewModel::SetFavourite(bool favourite)
{
if(save)
@@ -107,8 +57,6 @@ void PreviewModel::UpdateSave(int saveID, int saveDate)
}
if (saveData)
{
- if (saveData->data)
- free(saveData->data);
delete saveData;
saveData = NULL;
}
@@ -123,32 +71,13 @@ void PreviewModel::UpdateSave(int saveID, int saveDate)
notifySaveChanged();
notifySaveCommentsChanged();
- if (!updateSaveDataInfo)
- updateSaveDataInfo = new threadInfo(saveID, saveDate);
- if (updateSaveDataInfo->threadFinished)
- {
- updateSaveDataInfo->threadFinished = false;
- pthread_create(&updateSaveDataThread, 0, &PreviewModel::updateSaveDataT, updateSaveDataInfo);
- }
-
- if (!updateSaveInfoInfo)
- updateSaveInfoInfo = new threadInfo(saveID, saveDate);
- if(updateSaveInfoInfo->threadFinished)
- {
- updateSaveInfoInfo->threadFinished = false;
- pthread_create(&updateSaveInfoThread, 0, &PreviewModel::updateSaveInfoT, updateSaveInfoInfo);
- }
+ RequestBroker::Ref().Start(Client::Ref().GetSaveDataAsync(saveID, saveDate), this, 1);
+ RequestBroker::Ref().Start(Client::Ref().GetSaveAsync(saveID, saveDate), this, 2);
- if (!GetDoOpen())
+ if(!GetDoOpen())
{
- if (!updateSaveCommentsInfo)
- updateSaveCommentsInfo = new threadInfo(saveID, commentsPageNumber);
- if (updateSaveCommentsInfo->threadFinished)
- {
- commentsLoaded = false;
- updateSaveCommentsInfo->threadFinished = false;
- pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsT, updateSaveCommentsInfo);
- }
+ commentsLoaded = false;
+ RequestBroker::Ref().Start(Client::Ref().GetCommentsAsync(saveID, (commentsPageNumber-1)*20, 20), this, 3);
}
}
@@ -184,32 +113,77 @@ bool PreviewModel::GetCommentsLoaded()
void PreviewModel::UpdateComments(int pageNumber)
{
- commentsLoaded = false;
- if(saveComments)
- {
- for(int i = 0; i < saveComments->size(); i++)
- delete saveComments->at(i);
- saveComments->clear();
- delete saveComments;
- saveComments = NULL;
+ if(commentsLoaded){
+ commentsLoaded = false;
+ if(saveComments)
+ {
+ for(int i = 0; i < saveComments->size(); i++)
+ delete saveComments->at(i);
+ saveComments->clear();
+ delete saveComments;
+ saveComments = NULL;
+ }
+
+ commentsPageNumber = pageNumber;
+ if(!GetDoOpen())
+ RequestBroker::Ref().Start(Client::Ref().GetCommentsAsync(tSaveID, (commentsPageNumber-1)*20, 20), this, 3);
+
+ notifySaveCommentsChanged();
+ notifyCommentsPageChanged();
}
+}
- //resultCount = 0;
- commentsPageNumber = pageNumber;
- notifySaveCommentsChanged();
- notifyCommentsPageChanged();
+void PreviewModel::OnResponseReady(void * object, int identifier)
+{
+ if(identifier == 1){
+ if(saveData)
+ delete saveData;
+ saveData = (std::vector<unsigned char>*)object;
+ }
+ if(identifier == 2){
+ if(save)
+ delete save;
+ save = (SaveInfo*)object;
+ }
+ if(identifier == 3){
+ if(saveComments)
+ {
+ for(int i = 0; i < saveComments->size(); i++)
+ delete saveComments->at(i);
+ saveComments->clear();
+ delete saveComments;
+ saveComments = NULL;
+ }
+ saveComments = (std::vector<SaveComment*>*)object;
+ std::cout << object << std::endl;
+ commentsLoaded = true;
+ notifySaveCommentsChanged();
+ }
- //Threading
- if (!updateSaveCommentsInfo)
- updateSaveCommentsInfo = new threadInfo(tSaveID, commentsPageNumber);
- if (updateSaveCommentsInfo->threadFinished)
- {
- commentsLoaded = false;
- updateSaveCommentsInfo->threadFinished = false;
- pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsT, updateSaveCommentsInfo);
+ if(identifier == 1 || identifier == 2) {
+ if (save && saveData)
+ {
+ commentsTotal = save->Comments;
+ try
+ {
+ save->SetGameSave(new GameSave(*saveData));
+ }
+ catch(ParseException &e)
+ {
+ throw PreviewModelException("Save file corrupt or from newer version");
+ }
+ notifySaveChanged();
+ notifyCommentsPageChanged();
+ }
}
}
+
+void PreviewModel::Update()
+{
+
+}
+
std::vector<SaveComment*> * PreviewModel::GetComments()
{
return saveComments;
@@ -256,89 +230,14 @@ void PreviewModel::AddObserver(PreviewView * observer)
observer->NotifyCommentBoxEnabledChanged(this);
}
-void PreviewModel::Update()
-{
- if (updateSaveDataInfo && updateSaveDataInfo->threadFinished)
- {
- pthread_join(updateSaveDataThread, (void**)(&saveData));
- delete updateSaveDataInfo;
- updateSaveDataInfo = NULL;
-
- if (save && saveData)
- {
- commentsTotal = save->Comments;
- try
- {
- save->SetGameSave(new GameSave((char*)saveData->data, saveData->length));
- }
- catch(ParseException &e)
- {
- throw PreviewModelException("Save file corrupt or from newer version");
- }
- notifySaveChanged();
- notifyCommentsPageChanged();
- }
- }
-
- if (updateSaveInfoInfo && updateSaveInfoInfo->threadFinished)
- {
- if (save)
- {
- delete save;
- save = NULL;
- }
- pthread_join(updateSaveInfoThread, (void**)(&save));
- delete updateSaveInfoInfo;
- updateSaveInfoInfo = NULL;
-
- if (save && saveData)
- {
- commentsTotal = save->Comments;
- try
- {
- save->SetGameSave(new GameSave((char*)saveData->data, saveData->length));
- }
- catch(ParseException &e)
- {
- throw PreviewModelException("Save file corrupt or from newer version");
- }
- notifyCommentsPageChanged();
- }
- notifySaveChanged();
-
- if(!save)
- throw PreviewModelException("Unable to load save");
- }
-
- if (updateSaveCommentsInfo && updateSaveCommentsInfo->threadFinished)
- {
- if(saveComments)
- {
- for(int i = 0; i < saveComments->size(); i++)
- delete saveComments->at(i);
- saveComments->clear();
- delete saveComments;
- saveComments = NULL;
- }
-
- commentsLoaded = true;
- pthread_join(updateSaveCommentsThread, (void**)(&saveComments));
- delete updateSaveCommentsInfo;
- updateSaveCommentsInfo = NULL;
- notifySaveCommentsChanged();
- }
-}
PreviewModel::~PreviewModel()
{
- if (updateSaveDataInfo)
- updateSaveDataInfo->previewExited = true;
- if (updateSaveInfoInfo)
- updateSaveInfoInfo->previewExited = true;
- if (updateSaveCommentsInfo)
- updateSaveCommentsInfo->previewExited = true;
+ RequestBroker::Ref().DetachRequestListener(this);
if(save)
delete save;
+ if (saveData)
+ delete saveData;
if(saveComments)
{
for(int i = 0; i < saveComments->size(); i++)
@@ -346,10 +245,4 @@ PreviewModel::~PreviewModel()
saveComments->clear();
delete saveComments;
}
- if (saveData)
- {
- if (saveData->data)
- free(saveData->data);
- delete saveData;
- }
}
diff --git a/src/gui/preview/PreviewModel.h b/src/gui/preview/PreviewModel.h
index 1918552..8e8eabf 100644
--- a/src/gui/preview/PreviewModel.h
+++ b/src/gui/preview/PreviewModel.h
@@ -9,41 +9,16 @@
#include "client/SaveInfo.h"
#include "gui/preview/Comment.h"
#include "gui/search/Thumbnail.h"
+#include "client/requestbroker/RequestListener.h"
using namespace std;
-struct SaveData
-{
- SaveData(unsigned char * data_, int len):
- data(data_),
- length(len)
- {
- }
- unsigned char * data;
- int length;
-};
-
-struct threadInfo {
- threadInfo(int saveID_, int saveDate_):
- threadFinished(true),
- previewExited(false),
- saveID(saveID_),
- saveDate(saveDate_)
- {
- }
- bool threadFinished;
- bool previewExited;
- int saveID;
- int saveDate;
-};
-
class PreviewView;
-class PreviewModel {
+class PreviewModel: RequestListener {
bool doOpen;
- bool commentBoxEnabled;
vector<PreviewView*> observers;
SaveInfo * save;
- SaveData *saveData;
+ std::vector<unsigned char> * saveData;
std::vector<SaveComment*> * saveComments;
void notifySaveChanged();
void notifySaveCommentsChanged();
@@ -55,21 +30,11 @@ class PreviewModel {
int tSaveDate;
//
+ bool commentBoxEnabled;
bool commentsLoaded;
int commentsTotal;
int commentsPageNumber;
- threadInfo * updateSaveDataInfo;
- pthread_t updateSaveDataThread;
- static void * updateSaveDataT(void * obj);
-
- threadInfo * updateSaveInfoInfo;
- pthread_t updateSaveInfoThread;
- static void * updateSaveInfoT(void * obj);
-
- threadInfo * updateSaveCommentsInfo;
- pthread_t updateSaveCommentsThread;
- static void * updateSaveCommentsT(void * obj);
public:
PreviewModel();
SaveInfo * GetSave();
@@ -89,6 +54,7 @@ public:
bool GetDoOpen();
void SetDoOpen(bool doOpen);
void Update();
+ virtual void OnResponseReady(void * object, int identifier);
virtual ~PreviewModel();
};
diff --git a/src/gui/profile/ProfileActivity.cpp b/src/gui/profile/ProfileActivity.cpp
index d690aa5..6c667a4 100644
--- a/src/gui/profile/ProfileActivity.cpp
+++ b/src/gui/profile/ProfileActivity.cpp
@@ -167,7 +167,7 @@ void ProfileActivity::setUserInfo(UserInfo newInfo)
//exit(0);
}
-void ProfileActivity::OnResponseReady(void * userDataPtr)
+void ProfileActivity::OnResponseReady(void * userDataPtr, int identifier)
{
if(loading)
{
diff --git a/src/gui/profile/ProfileActivity.h b/src/gui/profile/ProfileActivity.h
index ed10e65..53966e3 100644
--- a/src/gui/profile/ProfileActivity.h
+++ b/src/gui/profile/ProfileActivity.h
@@ -18,7 +18,7 @@ class ProfileActivity: public WindowActivity, public RequestListener {
public:
ProfileActivity(std::string username);
virtual ~ProfileActivity();
- virtual void OnResponseReady(void * userDataPtr);
+ virtual void OnResponseReady(void * userDataPtr, int identifier);
virtual void OnDraw();
};
diff --git a/src/gui/save/LocalSaveActivity.cpp b/src/gui/save/LocalSaveActivity.cpp
index 65e9dfb..a295987 100644
--- a/src/gui/save/LocalSaveActivity.cpp
+++ b/src/gui/save/LocalSaveActivity.cpp
@@ -133,7 +133,7 @@ void LocalSaveActivity::OnDraw()
}
}
-void LocalSaveActivity::OnResponseReady(void * imagePtr)
+void LocalSaveActivity::OnResponseReady(void * imagePtr, int identifier)
{
if(thumbnail)
delete thumbnail;
diff --git a/src/gui/save/LocalSaveActivity.h b/src/gui/save/LocalSaveActivity.h
index 4668dd3..47d3938 100644
--- a/src/gui/save/LocalSaveActivity.h
+++ b/src/gui/save/LocalSaveActivity.h
@@ -34,6 +34,6 @@ public:
void saveWrite(std::string finalFilename);
virtual void Save();
virtual void OnDraw();
- virtual void OnResponseReady(void * imagePtr);
+ virtual void OnResponseReady(void * imagePtr, int identifier);
virtual ~LocalSaveActivity();
};
diff --git a/src/gui/save/ServerSaveActivity.cpp b/src/gui/save/ServerSaveActivity.cpp
index 7e83847..c129799 100644
--- a/src/gui/save/ServerSaveActivity.cpp
+++ b/src/gui/save/ServerSaveActivity.cpp
@@ -335,7 +335,7 @@ void ServerSaveActivity::OnDraw()
}
}
-void ServerSaveActivity::OnResponseReady(void * imagePtr)
+void ServerSaveActivity::OnResponseReady(void * imagePtr, int identifier)
{
if(thumbnail)
delete thumbnail;
diff --git a/src/gui/save/ServerSaveActivity.h b/src/gui/save/ServerSaveActivity.h
index c18425b..267939b 100644
--- a/src/gui/save/ServerSaveActivity.h
+++ b/src/gui/save/ServerSaveActivity.h
@@ -31,7 +31,7 @@ public:
virtual void ShowPublishingInfo();
virtual void ShowRules();
virtual void OnDraw();
- virtual void OnResponseReady(void * imagePtr);
+ virtual void OnResponseReady(void * imagePtr, int identifier);
virtual void OnTick(float dt);
virtual ~ServerSaveActivity();
protected: