diff --git a/src/gui/preview/PreviewModel.cpp b/src/gui/preview/PreviewModel.cpp index 677644517..2f581074b 100644 --- a/src/gui/preview/PreviewModel.cpp +++ b/src/gui/preview/PreviewModel.cpp @@ -5,68 +5,18 @@ #include "PreviewModelException.h" PreviewModel::PreviewModel(): - save(NULL), - saveComments(NULL), - saveData(NULL), doOpen(false), - commentsTotal(0), - commentsPageNumber(1), + save(NULL), + saveData(NULL), + 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 * 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); - } + RequestBroker::Ref().Start(Client::Ref().GetSaveDataAsync(saveID, saveDate), this, 1); + RequestBroker::Ref().Start(Client::Ref().GetSaveAsync(saveID, saveDate), this, 2); - if (!updateSaveInfoInfo) - updateSaveInfoInfo = new threadInfo(saveID, saveDate); - if(updateSaveInfoInfo->threadFinished) + if(!GetDoOpen()) { - updateSaveInfoInfo->threadFinished = false; - pthread_create(&updateSaveInfoThread, 0, &PreviewModel::updateSaveInfoT, updateSaveInfoInfo); - } - - 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; - } - - //resultCount = 0; - commentsPageNumber = pageNumber; - notifySaveCommentsChanged(); - notifyCommentsPageChanged(); - - //Threading - if (!updateSaveCommentsInfo) - updateSaveCommentsInfo = new threadInfo(tSaveID, commentsPageNumber); - if (updateSaveCommentsInfo->threadFinished) - { + if(commentsLoaded){ commentsLoaded = false; - updateSaveCommentsInfo->threadFinished = false; - pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsT, updateSaveCommentsInfo); + 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(); } } +void PreviewModel::OnResponseReady(void * object, int identifier) +{ + if(identifier == 1){ + if(saveData) + delete saveData; + saveData = (std::vector*)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*)object; + std::cout << object << std::endl; + commentsLoaded = true; + notifySaveCommentsChanged(); + } + + 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 * 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 1918552d8..8e8eabf3a 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 observers; SaveInfo * save; - SaveData *saveData; + std::vector * saveData; std::vector * 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(); };