summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-07-21 12:09:59 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-07-21 12:09:59 (GMT)
commit5bf0a084ace0e6b673efa4552b40de8b36e0668e (patch)
tree8683ff6c11167cb3b95f7b4ae65269b3cb6dce98 /src
parent78b1ffb11dc78130cdb120acf37d5930807bff6c (diff)
downloadpowder-5bf0a084ace0e6b673efa4552b40de8b36e0668e.zip
powder-5bf0a084ace0e6b673efa4552b40de8b36e0668e.tar.gz
Prevent race condition when reloading local stamps, fix task so "after()" gets called and correct stamp name so they actually get deleted"
Diffstat (limited to 'src')
-rw-r--r--src/client/Client.cpp9
-rw-r--r--src/localbrowser/LocalBrowserController.cpp13
-rw-r--r--src/localbrowser/LocalBrowserController.h1
-rw-r--r--src/tasks/Task.cpp11
4 files changed, 24 insertions, 10 deletions
diff --git a/src/client/Client.cpp b/src/client/Client.cpp
index 5ecb8ac..116fa02 100644
--- a/src/client/Client.cpp
+++ b/src/client/Client.cpp
@@ -371,7 +371,7 @@ SaveFile * Client::GetStamp(string stampID)
stampFile.read((char *)tempData, fileSize);
stampFile.close();
- SaveFile * file = new SaveFile(string(STAMPS_DIR PATH_SEP + stampID + ".stm").c_str());
+ SaveFile * file = new SaveFile(string(stampID).c_str());
GameSave * tempSave = new GameSave((char *)tempData, fileSize);
file->SetGameSave(tempSave);
return file;
@@ -388,7 +388,12 @@ void Client::DeleteStamp(string stampID)
{
if((*iterator) == stampID)
{
- remove(string(STAMPS_DIR PATH_SEP + stampID + ".stm").c_str());
+ stringstream stampFilename;
+ stampFilename << STAMPS_DIR;
+ stampFilename << PATH_SEP;
+ stampFilename << stampID;
+ stampFilename << ".stm";
+ remove(stampFilename.str().c_str());
stampIDs.erase(iterator);
return;
}
diff --git a/src/localbrowser/LocalBrowserController.cpp b/src/localbrowser/LocalBrowserController.cpp
index 47f02bb..28a7c64 100644
--- a/src/localbrowser/LocalBrowserController.cpp
+++ b/src/localbrowser/LocalBrowserController.cpp
@@ -65,8 +65,9 @@ void LocalBrowserController::removeSelectedC()
class RemoveSavesTask : public Task
{
std::vector<std::string> saves;
+ LocalBrowserController * c;
public:
- RemoveSavesTask(std::vector<std::string> saves_) { saves = saves_; }
+ RemoveSavesTask(LocalBrowserController * c, std::vector<std::string> saves_) : c(c) { saves = saves_; }
virtual bool doWork()
{
for(int i = 0; i < saves.size(); i++)
@@ -80,10 +81,18 @@ void LocalBrowserController::removeSelectedC()
}
return true;
}
+ virtual void after()
+ {
+ c->RefreshSavesList();
+ }
};
std::vector<std::string> selected = browserModel->GetSelected();
- new TaskWindow("Removing saves", new RemoveSavesTask(selected));
+ new TaskWindow("Removing saves", new RemoveSavesTask(this, selected));
+}
+
+void LocalBrowserController::RefreshSavesList()
+{
ClearSelection();
browserModel->UpdateSavesList(browserModel->GetPageNum());
}
diff --git a/src/localbrowser/LocalBrowserController.h b/src/localbrowser/LocalBrowserController.h
index 233ff9c..1f81ab6 100644
--- a/src/localbrowser/LocalBrowserController.h
+++ b/src/localbrowser/LocalBrowserController.h
@@ -27,6 +27,7 @@ public:
void removeSelectedC();
void ClearSelection();
void Selected(std::string stampID, bool selected);
+ void RefreshSavesList();
void OpenSave(SaveFile * stamp);
void SetStamp();
void NextPage();
diff --git a/src/tasks/Task.cpp b/src/tasks/Task.cpp
index b2ded16..8ab0ded 100644
--- a/src/tasks/Task.cpp
+++ b/src/tasks/Task.cpp
@@ -86,16 +86,15 @@ void Task::Poll()
notifyStatusMain();
}
- if(done)
+ if(newDone!=done)
{
+ done = newDone;
+
pthread_join(doWorkThread, NULL);
pthread_mutex_destroy(&taskMutex);
+
after();
- }
-
- if(newDone!=done)
- {
- done = newDone;
+
notifyDoneMain();
}
}