Use async requests/RequestBroker for PreviewModel
This commit is contained in:
parent
ddd51aed3d
commit
8cfead7d5a
@ -5,68 +5,18 @@
|
|||||||
#include "PreviewModelException.h"
|
#include "PreviewModelException.h"
|
||||||
|
|
||||||
PreviewModel::PreviewModel():
|
PreviewModel::PreviewModel():
|
||||||
save(NULL),
|
|
||||||
saveComments(NULL),
|
|
||||||
saveData(NULL),
|
|
||||||
doOpen(false),
|
doOpen(false),
|
||||||
commentsTotal(0),
|
save(NULL),
|
||||||
commentsPageNumber(1),
|
saveData(NULL),
|
||||||
|
saveComments(NULL),
|
||||||
commentBoxEnabled(false),
|
commentBoxEnabled(false),
|
||||||
updateSaveDataInfo(NULL),
|
commentsLoaded(false),
|
||||||
updateSaveInfoInfo(NULL),
|
commentsTotal(0),
|
||||||
updateSaveCommentsInfo(NULL)
|
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)
|
void PreviewModel::SetFavourite(bool favourite)
|
||||||
{
|
{
|
||||||
if(save)
|
if(save)
|
||||||
@ -107,8 +57,6 @@ void PreviewModel::UpdateSave(int saveID, int saveDate)
|
|||||||
}
|
}
|
||||||
if (saveData)
|
if (saveData)
|
||||||
{
|
{
|
||||||
if (saveData->data)
|
|
||||||
free(saveData->data);
|
|
||||||
delete saveData;
|
delete saveData;
|
||||||
saveData = NULL;
|
saveData = NULL;
|
||||||
}
|
}
|
||||||
@ -123,32 +71,13 @@ void PreviewModel::UpdateSave(int saveID, int saveDate)
|
|||||||
notifySaveChanged();
|
notifySaveChanged();
|
||||||
notifySaveCommentsChanged();
|
notifySaveCommentsChanged();
|
||||||
|
|
||||||
if (!updateSaveDataInfo)
|
RequestBroker::Ref().Start(Client::Ref().GetSaveDataAsync(saveID, saveDate), this, 1);
|
||||||
updateSaveDataInfo = new threadInfo(saveID, saveDate);
|
RequestBroker::Ref().Start(Client::Ref().GetSaveAsync(saveID, saveDate), this, 2);
|
||||||
if (updateSaveDataInfo->threadFinished)
|
|
||||||
{
|
|
||||||
updateSaveDataInfo->threadFinished = false;
|
|
||||||
pthread_create(&updateSaveDataThread, 0, &PreviewModel::updateSaveDataT, updateSaveDataInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!updateSaveInfoInfo)
|
if(!GetDoOpen())
|
||||||
updateSaveInfoInfo = new threadInfo(saveID, saveDate);
|
|
||||||
if(updateSaveInfoInfo->threadFinished)
|
|
||||||
{
|
{
|
||||||
updateSaveInfoInfo->threadFinished = false;
|
commentsLoaded = false;
|
||||||
pthread_create(&updateSaveInfoThread, 0, &PreviewModel::updateSaveInfoT, updateSaveInfoInfo);
|
RequestBroker::Ref().Start(Client::Ref().GetCommentsAsync(saveID, (commentsPageNumber-1)*20, 20), this, 3);
|
||||||
}
|
|
||||||
|
|
||||||
if (!GetDoOpen())
|
|
||||||
{
|
|
||||||
if (!updateSaveCommentsInfo)
|
|
||||||
updateSaveCommentsInfo = new threadInfo(saveID, commentsPageNumber);
|
|
||||||
if (updateSaveCommentsInfo->threadFinished)
|
|
||||||
{
|
|
||||||
commentsLoaded = false;
|
|
||||||
updateSaveCommentsInfo->threadFinished = false;
|
|
||||||
pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsT, updateSaveCommentsInfo);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,32 +113,77 @@ bool PreviewModel::GetCommentsLoaded()
|
|||||||
|
|
||||||
void PreviewModel::UpdateComments(int pageNumber)
|
void PreviewModel::UpdateComments(int pageNumber)
|
||||||
{
|
{
|
||||||
commentsLoaded = false;
|
if(commentsLoaded){
|
||||||
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)
|
|
||||||
{
|
|
||||||
commentsLoaded = false;
|
commentsLoaded = false;
|
||||||
updateSaveCommentsInfo->threadFinished = false;
|
if(saveComments)
|
||||||
pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsT, updateSaveCommentsInfo);
|
{
|
||||||
|
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<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();
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
std::vector<SaveComment*> * PreviewModel::GetComments()
|
||||||
{
|
{
|
||||||
return saveComments;
|
return saveComments;
|
||||||
@ -256,89 +230,14 @@ void PreviewModel::AddObserver(PreviewView * observer)
|
|||||||
observer->NotifyCommentBoxEnabledChanged(this);
|
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()
|
PreviewModel::~PreviewModel()
|
||||||
{
|
{
|
||||||
if (updateSaveDataInfo)
|
RequestBroker::Ref().DetachRequestListener(this);
|
||||||
updateSaveDataInfo->previewExited = true;
|
|
||||||
if (updateSaveInfoInfo)
|
|
||||||
updateSaveInfoInfo->previewExited = true;
|
|
||||||
if (updateSaveCommentsInfo)
|
|
||||||
updateSaveCommentsInfo->previewExited = true;
|
|
||||||
if(save)
|
if(save)
|
||||||
delete save;
|
delete save;
|
||||||
|
if (saveData)
|
||||||
|
delete saveData;
|
||||||
if(saveComments)
|
if(saveComments)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < saveComments->size(); i++)
|
for(int i = 0; i < saveComments->size(); i++)
|
||||||
@ -346,10 +245,4 @@ PreviewModel::~PreviewModel()
|
|||||||
saveComments->clear();
|
saveComments->clear();
|
||||||
delete saveComments;
|
delete saveComments;
|
||||||
}
|
}
|
||||||
if (saveData)
|
|
||||||
{
|
|
||||||
if (saveData->data)
|
|
||||||
free(saveData->data);
|
|
||||||
delete saveData;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -9,41 +9,16 @@
|
|||||||
#include "client/SaveInfo.h"
|
#include "client/SaveInfo.h"
|
||||||
#include "gui/preview/Comment.h"
|
#include "gui/preview/Comment.h"
|
||||||
#include "gui/search/Thumbnail.h"
|
#include "gui/search/Thumbnail.h"
|
||||||
|
#include "client/requestbroker/RequestListener.h"
|
||||||
|
|
||||||
using namespace std;
|
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 PreviewView;
|
||||||
class PreviewModel {
|
class PreviewModel: RequestListener {
|
||||||
bool doOpen;
|
bool doOpen;
|
||||||
bool commentBoxEnabled;
|
|
||||||
vector<PreviewView*> observers;
|
vector<PreviewView*> observers;
|
||||||
SaveInfo * save;
|
SaveInfo * save;
|
||||||
SaveData *saveData;
|
std::vector<unsigned char> * saveData;
|
||||||
std::vector<SaveComment*> * saveComments;
|
std::vector<SaveComment*> * saveComments;
|
||||||
void notifySaveChanged();
|
void notifySaveChanged();
|
||||||
void notifySaveCommentsChanged();
|
void notifySaveCommentsChanged();
|
||||||
@ -55,21 +30,11 @@ class PreviewModel {
|
|||||||
int tSaveDate;
|
int tSaveDate;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
bool commentBoxEnabled;
|
||||||
bool commentsLoaded;
|
bool commentsLoaded;
|
||||||
int commentsTotal;
|
int commentsTotal;
|
||||||
int commentsPageNumber;
|
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:
|
public:
|
||||||
PreviewModel();
|
PreviewModel();
|
||||||
SaveInfo * GetSave();
|
SaveInfo * GetSave();
|
||||||
@ -89,6 +54,7 @@ public:
|
|||||||
bool GetDoOpen();
|
bool GetDoOpen();
|
||||||
void SetDoOpen(bool doOpen);
|
void SetDoOpen(bool doOpen);
|
||||||
void Update();
|
void Update();
|
||||||
|
virtual void OnResponseReady(void * object, int identifier);
|
||||||
virtual ~PreviewModel();
|
virtual ~PreviewModel();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user