Skip to content
This repository was archived by the owner on Mar 15, 2018. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Code/application/Model/ModelServicesImp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "SignatureFileDescriptorAdapter.h"
#include "SignatureLibraryAdapter.h"
#include "SignatureSetAdapter.h"
#include "SubjectImpPrivate.h"
#include "switchOnEncoding.h"
#include "TiePointListAdapter.h"
#include "UtilityServicesImp.h"
Expand Down Expand Up @@ -798,6 +799,9 @@ void ModelServicesImp::clear()
}

mElements.clear();

string name = SIGNAL_NAME(ModelServices, ElementCreated);
clearSlots(name);
}

char* ModelServicesImp::getMemoryBlock(size_t size)
Expand Down
2 changes: 2 additions & 0 deletions Code/application/PlugInUtilities/Interfaces/SubjectImp.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ class SubjectImp
*/
void enableSignals(bool enabled);

void clearSlots(const std::string& signal);

SubjectImpPrivate* mpImpPrivate;
};

Expand Down
6 changes: 6 additions & 0 deletions Code/application/PlugInUtilities/SubjectImp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,9 @@ bool SubjectImp::signalsEnabled() const

return mpImpPrivate->signalsEnabled();
}


void SubjectImp::clearSlots(const std::string& signal)
{
mpImpPrivate->clearSlots(signal);
}
16 changes: 16 additions & 0 deletions Code/application/PlugInUtilities/SubjectImpPrivate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,22 @@ void SubjectImpPrivate::removeEmptySlots(const string& recursion, list<SafeSlot>
}
}

void SubjectImpPrivate::clearSlots(const std::string& signal)
{
if (count(mRecursions.begin(), mRecursions.end(), signal) == 0)
{
MapType::iterator pSlotVec = mSlots.find(signal);
if (pSlotVec != mSlots.end())
{
list<SafeSlot>& slotVec = pSlotVec->second;
for (list<SafeSlot>::iterator pSlot = slotVec.begin(); pSlot != slotVec.end(); )
{
pSlot = slotVec.erase(pSlot);
}
}
}
}

void SubjectImpPrivate::enableSignals(bool enabled)
{
mSignalsEnabled = enabled;
Expand Down
1 change: 1 addition & 0 deletions Code/application/PlugInUtilities/SubjectImpPrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class SubjectImpPrivate
const boost::any& data = boost::any());
const std::list<SafeSlot>& getSlots(const std::string& signal);
void removeEmptySlots(const std::string& recursion, std::list<SafeSlot>& slotVec);
void clearSlots(const std::string& signal);
void enableSignals(bool enabled);
bool signalsEnabled() const;

Expand Down
58 changes: 48 additions & 10 deletions Code/application/Utilities/SessionManagerImp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1090,7 +1090,7 @@ bool SessionManagerImp::open(const string &filename, Progress *pProgress)
pAppWindow->registerPlugIns();
pAppWindow->updateWizardCommands();
IndexFileItem ifi(ModelServicesImp::instance());
restoreSessionItem(ifi);
restoreSessionItem(ifi, false);
createSessionItems(items, pProgress);
populateItemMap(items);
restoreSessionItems(items, pProgress);
Expand Down Expand Up @@ -1211,31 +1211,65 @@ vector<SessionManagerImp::IndexFileItem> SessionManagerImp::readIndexFile(const

void SessionManagerImp::restoreSessionItems(vector<IndexFileItem> &items, Progress *pProgress)
{
int totalNumItems = items.size();
restoreSessionItemsRecursively(items, pProgress, totalNumItems);
}

void SessionManagerImp::restoreSessionItemsRecursively(vector<IndexFileItem> &items, Progress *pProgress, int totalNumItems)
{
vector<IndexFileItem> skippedItems;

int count = items.size();
int i = 0;
vector<IndexFileItem>::iterator pItem;
for (pItem = items.begin(), i = 0; pItem != items.end(); ++pItem, ++i)
{
if (pProgress)
{
pProgress->updateProgress("Restoring session items...", 100*i/count, NORMAL);
int percentageComplete = 100 * (i + ( totalNumItems - count)) / totalNumItems;
pProgress->updateProgress("Restoring session items...", percentageComplete, NORMAL);
}

if (pItem->mpItem)
{
if (!restoreSessionItem(*pItem))
if (!restoreSessionItem(*pItem, true))
{
if (pProgress != NULL)
{
string message = "Error restoring:\n " + pItem->mType + "\n";
message += "Named:\n " +pItem->mName;
pProgress->updateProgress(message, 100 * i / count, WARNING);
skippedItems.push_back(*pItem);
}
}
}
}

if (skippedItems.empty()){
//All plugins loaded. Return.
return;
} else if (skippedItems.size() == items.size()){
//Could not load any more plugins during this iteration. Generate the error message.
string message = "";
for (int j = 0; j < skippedItems.size(); j++)
{
message += "Error restoring:\n " + skippedItems[j].mType + "\n";
message += "Named:\n " + skippedItems[j].mName + "\n";
}
//Destroy the failed session items.
for (int j = skippedItems.size() - 1; j >= 0; j--)
{
destroyFailedSessionItem(skippedItems[j].mType, skippedItems[j].mpItem);
skippedItems[j].mpItem = NULL;
}
//Show the error message.
int percentageComplete = 100 * (totalNumItems - 1) / totalNumItems;
pProgress->updateProgress(message, percentageComplete, WARNING);
return;
} else {
//One or more plugins (but not all) were loaded during this iteration. Perform the recursion again.
restoreSessionItemsRecursively(skippedItems, pProgress, totalNumItems);
}
}

bool SessionManagerImp::restoreSessionItem(IndexFileItem &item)
bool SessionManagerImp::restoreSessionItem(IndexFileItem &item, bool restoreSessionItemsRecursively)
{
SessionItem* pSessionItem = item.mpItem;
VERIFY_MSG(pSessionItem!=NULL,
Expand All @@ -1244,9 +1278,13 @@ bool SessionManagerImp::restoreSessionItem(IndexFileItem &item)
SessionItemDeserializerImp deserializer(mRestoreSessionPath + "/" + filename(item), item.mBlockSizes);
if (pSessionItem->deserialize(deserializer) == false)
{
destroyFailedSessionItem(item.mType, pSessionItem);
item.mpItem = NULL;
return false;
if (restoreSessionItemsRecursively == false){
destroyFailedSessionItem(item.mType, pSessionItem);
item.mpItem = NULL;
return false;
} else {
return false;
}
}
return true;
}
Expand Down
3 changes: 2 additions & 1 deletion Code/application/Utilities/SessionManagerImp.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,9 @@ class SessionManagerImp : public SessionManager, public SubjectImp
void getSessionItemsWindow(std::vector<IndexFileItem> &items) const;
void populateItemMap(const std::vector<IndexFileItem> &items);
std::vector<IndexFileItem> readIndexFile(const std::string &filename);
bool restoreSessionItem(IndexFileItem &item);
bool restoreSessionItem(IndexFileItem &item, bool restoreSessionItemsRecursively);
void restoreSessionItems(std::vector<IndexFileItem> &items, Progress *pProgress);
void restoreSessionItemsRecursively(std::vector<IndexFileItem> &items, Progress *pProgress, int totalNumItems);
bool writeIndexFile(const std::string &filename, const std::vector<IndexFileItem> &items);

static SessionManagerImp* spInstance;
Expand Down