diff options
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: |
