[commit] r2787 - in trunk: Doc GME/Mga Tests/GPyUnit
GMESRC Repository Notifications
gme-commit at list.isis.vanderbilt.edu
Tue Apr 7 10:44:43 CDT 2020
Author: ksmyth
Date: Tue Apr 7 10:44:43 2020
New Revision: 2787
Log:
Fix 'Do you want to save' dialog appearing when no changes have been applied
Modified:
trunk/Doc/README_in.txt
trunk/GME/Mga/MgaFCO.cpp
trunk/GME/Mga/MgaFCO.h
trunk/GME/Mga/MgaProject.cpp
trunk/GME/Mga/MgaProject.h
trunk/GME/Mga/MgaTrukk.h
trunk/Tests/GPyUnit/test_coreTransaction.py
Modified: trunk/Doc/README_in.txt
==============================================================================
--- trunk/Doc/README_in.txt Tue Apr 7 10:44:39 2020 (r2786)
+++ trunk/Doc/README_in.txt Tue Apr 7 10:44:43 2020 (r2787)
@@ -25,6 +25,11 @@
1. Release Notes
************************************************
+Release Notes
+----------------------------------
+ - Binary compatibility with 11.12.2
+ - Fix bug where 'Do you want to save?' dialog appears too often
+
Release Notes of Release 20.2.12
----------------------------------
- Binary compatibility with 11.12.2
Modified: trunk/GME/Mga/MgaFCO.cpp
==============================================================================
--- trunk/GME/Mga/MgaFCO.cpp Tue Apr 7 10:44:39 2020 (r2786)
+++ trunk/GME/Mga/MgaFCO.cpp Tue Apr 7 10:44:43 2020 (r2787)
@@ -80,7 +80,7 @@
//throws!!
long FCO::getstatus() {
if(!mgaproject) COMTHROW(E_MGA_ZOMBIE_NOPROJECT);
- if(!mgaproject->opened) COMTHROW(E_MGA_ZOMBIE_CLOSED_PROJECT);
+ if(!mgaproject->opened_flag) COMTHROW(E_MGA_ZOMBIE_CLOSED_PROJECT);
if(!mgaproject->activeterr) COMTHROW(E_MGA_NOT_IN_TRANSACTION);
VARIANT_BOOL pp;
if(self->get_IsDeleted(&pp) != S_OK) return OBJECT_ZOMBIE;
Modified: trunk/GME/Mga/MgaFCO.h
==============================================================================
--- trunk/GME/Mga/MgaFCO.h Tue Apr 7 10:44:39 2020 (r2786)
+++ trunk/GME/Mga/MgaFCO.h Tue Apr 7 10:44:43 2020 (r2787)
@@ -322,6 +322,8 @@
private:
//Notification
unsigned long changemask, notifymask, temporalmask;
+ // CMgaProject needs changemask
+ friend class CMgaProject;
// PreDelete Notification by Tihamer for the PAMS SynchTool
void PreDeleteNotify();
Modified: trunk/GME/Mga/MgaProject.cpp
==============================================================================
--- trunk/GME/Mga/MgaProject.cpp Tue Apr 7 10:44:39 2020 (r2786)
+++ trunk/GME/Mga/MgaProject.cpp Tue Apr 7 10:44:43 2020 (r2787)
@@ -23,7 +23,7 @@
#ifdef DEBUG
MGA_TRACE("Constructed: %s - %08X\n", sig, this);
#endif
- opened = CLOSED;
+ opened_flag = OPENED_FLAG_CLOSED;
dataproject = NULL;
preferences = 0;
opmask = 0x0026662A;
@@ -56,7 +56,7 @@
#endif
MARKSIG('9');
ASSERT(allterrs.empty());
- if(opened != CLOSED) {
+ if(opened_flag != OPENED_FLAG_CLOSED) {
Close();
}
}
@@ -122,7 +122,6 @@
COMTHROW(metapr->get_RootFolder(&mf));
COMTHROW(mf->get_MetaRef(&mr));
rootfolder[ATTRID_META] = mr;
- notifyqueueprocessed = true;
} COMCATCH_IN_TRANSACTION(;);
}
@@ -195,7 +194,7 @@
STDMETHODIMP CMgaProject::CreateEx(BSTR projectname, BSTR paradigmname, VARIANT paradigmGUID) {
COMTRY {
- if(opened != CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
+ if(opened_flag != OPENED_FLAG_CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
mgaversion = 2;
// Set generic for meta
@@ -208,7 +207,7 @@
int undosize = getMaxUndoSize();
COMTHROW(dataproject->CreateProject2(projectname, undosize, genericproject));
- opened = UNCHANGED;
+ opened_flag = OPENED_FLAG_UNCHANGED;
guidstat = DIRTY;
CComPtr<IMgaTerritory> lm;
@@ -251,7 +250,7 @@
MARKSIG('2');
}
COMCATCH(
- opened = CLOSED;
+ opened_flag = OPENED_FLAG_CLOSED;
guidstat = CLEAN;
if (dataproject) {
dataproject->CloseProject(VARIANT_TRUE);
@@ -277,7 +276,7 @@
// if no guid change skip check
STDMETHODIMP CMgaProject::OpenEx(BSTR projectname, BSTR paradigmname, VARIANT paradigmGUID) {
COMTRY {
- if(opened != CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
+ if(opened_flag != OPENED_FLAG_CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
CComBSTR s;
CComVariant pGUID;
CComBSTR ver;
@@ -290,7 +289,7 @@
projconn = projectname;
- opened = UNCHANGED;
+ opened_flag = OPENED_FLAG_UNCHANGED;
guidstat = CLEAN;
CComPtr<IMgaTerritory> lm;
COMTHROW(CreateTerritory(NULL, &lm));
@@ -302,8 +301,8 @@
COMTHROW(dataproject->get_RootObject(&dataroot.ComPtr()));
s=dataroot[ATTRID_PARADIGM];
mgaversion = dataroot[ATTRID_MGAVERSION];
- if( mgaversion <= 1L) // Core layer changed the project by adding ATTRID_GUID1..4 for CCoreBinFile
- opened = CHANGED;
+ if (mgaversion <= 1L) // Core layer changed the project by adding ATTRID_GUID1..4 for CCoreBinFile
+ opened_flag = OPENED_FLAG_CHANGED;
pGUID=CComVariant(dataroot[ATTRID_PARGUID]);
ver = dataroot[ATTRID_PARVERSION];
@@ -376,7 +375,7 @@
dataroot[ATTRID_PARGUID] = pGUID;
dataroot[ATTRID_PARVERSION] = ver;
COMTHROW(CommitTransaction());
- opened = CHANGED;
+ opened_flag = OPENED_FLAG_CHANGED;
guidstat = DIRTY;
} catch(hresult_exception &e) {
lm->Flush();
@@ -400,7 +399,7 @@
MARKSIG('2');
}
COMCATCH(
- opened = CLOSED;
+ opened_flag = OPENED_FLAG_CLOSED;
guidstat = CLEAN;
if (dataproject)
dataproject->CloseProject(VARIANT_TRUE);
@@ -419,7 +418,7 @@
STDMETHODIMP CMgaProject::Open(BSTR projectname, VARIANT_BOOL *ro_mode)
{
COMTRY {
- if(opened != CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
+ if (opened_flag != OPENED_FLAG_CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
CComBSTR s;
CComVariant pGUID;
CComBSTR ver;
@@ -431,7 +430,7 @@
projconn = projectname;
- opened = UNCHANGED;
+ opened_flag = OPENED_FLAG_UNCHANGED;
guidstat = CLEAN;
CComPtr<IMgaTerritory> lm;
COMTHROW(CreateTerritory(NULL, &lm));
@@ -444,7 +443,7 @@
s=dataroot[ATTRID_PARADIGM];
mgaversion = dataroot[ATTRID_MGAVERSION];
if( mgaversion <= 1L) // Core layer changed the project by adding ATTRID_GUID1..4 for CCoreBinFile
- opened = CHANGED;
+ opened_flag = OPENED_FLAG_CHANGED;
pGUID=CComVariant(dataroot[ATTRID_PARGUID]);
ver=dataroot[ATTRID_PARVERSION];
@@ -498,7 +497,7 @@
COMTHROW(dataproject->get_RootObject(&dataroot.ComPtr()));
dataroot[ATTRID_PARGUID] = nGUID;
COMTHROW(CommitTransaction());
- opened = CHANGED;
+ opened_flag = OPENED_FLAG_CHANGED;
guidstat = DIRTY;
} catch(hresult_exception &e) {
lm->Flush();
@@ -523,7 +522,7 @@
MARKSIG('2');
}
COMCATCH(
- opened = CLOSED;
+ opened_flag = OPENED_FLAG_CLOSED;
if (dataproject)
dataproject->CloseProject(VARIANT_TRUE);
if (metapr)
@@ -595,9 +594,9 @@
COMTHROW(CreateTerritory(NULL, &t));
// if mga_ver<=1 the Core layer changed the project by adding ATTRID_GUID1..4
// (mgaversion <= 1L) -> (opened >= CHANGED)
- ASSERT( !(mgaversion <= 1L) || opened >= CHANGED);
+ ASSERT( !(mgaversion <= 1L) || opened_flag >= OPENED_FLAG_CHANGED);
- if(opened >= CHANGED) {
+ if (opened_flag >= OPENED_FLAG_CHANGED) {
COMTHROW(BeginTransaction(t, TRANSACTION_GENERAL));
try {
CoreObj self;
@@ -616,14 +615,14 @@
if (FAILED(hr))
return hr;
if(CComBSTR(newname).Length()) {
- if (!keepoldname) {
+ if (keepoldname == VARIANT_FALSE) {
projconn = newname;
- opened = UNCHANGED;
+ opened_flag = OPENED_FLAG_UNCHANGED;
transactioncount = 0;
}
} else {
- opened = UNCHANGED;
+ opened_flag = OPENED_FLAG_UNCHANGED;
transactioncount = 0;
}
}
@@ -632,7 +631,7 @@
STDMETHODIMP CMgaProject::Close(VARIANT_BOOL abort)
{
- if(opened == CLOSED) {
+ if (opened_flag == OPENED_FLAG_CLOSED) {
ASSERT(("Project is closed but transaction is active", !baseterr));
return S_OK;
}
@@ -642,7 +641,7 @@
{
CComPtr<IMgaTerritory> t;
COMTHROW(CreateTerritory(NULL, &t));
- bool write = !abort && opened >= CHANGED;
+ bool write = !abort && opened_flag >= OPENED_FLAG_CHANGED;
COMTHROW(BeginTransaction(t, write ? TRANSACTION_GENERAL : TRANSACTION_READ_ONLY));
try {
if(write) {
@@ -669,13 +668,13 @@
}
MARKSIG('8');
- opened = CLOSED;
+ opened_flag = OPENED_FLAG_CLOSED;
guidstat = CLEAN;
projconn.Empty();
parconn.Empty();
transactioncount = 0;
}
- COMCATCH( opened = CLOSEERROR;); // You cannot rollback a failed Close completely, so I did not even try it.
+ COMCATCH( opened_flag = OPENED_FLAG_CLOSEERROR;); // You cannot rollback a failed Close completely, so I did not even try it.
}
#undef mgaproject
@@ -907,7 +906,6 @@
CoreObj self;
COMTHROW(dataproject->get_RootObject(&self.ComPtr()));
self[ATTRID_CREATOR] = newVal;
- notifyqueueprocessed = true;
COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
}
COMCATCH_IN_TRANSACTION(;);
@@ -1008,7 +1006,6 @@
self[ATTRID_GUID] = newVal;
guidstat = MANUAL;
- notifyqueueprocessed = true;
COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
}
COMCATCH_IN_TRANSACTION(;);
@@ -1033,7 +1030,6 @@
CoreObj self;
COMTHROW(dataproject->get_RootObject(&self.ComPtr()));
self[ATTRID_EXTDATA] = newVal;
- notifyqueueprocessed = true;
COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
}
COMCATCH_IN_TRANSACTION(;);
@@ -1047,7 +1043,6 @@
CoreObj self;
COMTHROW(dataproject->get_RootObject(&self.ComPtr()));
self[ATTRID_NAME] = newVal;
- notifyqueueprocessed = true;
COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
}
COMCATCH_IN_TRANSACTION(;);
@@ -1061,7 +1056,6 @@
CoreObj self;
COMTHROW(dataproject->get_RootObject(&self.ComPtr()));
self[ATTRID_VERSION] = newVal;
- notifyqueueprocessed = true;
COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
}
COMCATCH_IN_TRANSACTION(;);
@@ -1271,7 +1265,7 @@
bool bnew = (bEnable == VARIANT_TRUE);
if(bnew == autoaddons) return S_OK;
autoaddons = bnew;
- if(opened != CLOSED) {
+ if (opened_flag != OPENED_FLAG_CLOSED) {
if(autoaddons) StartAutoAddOns();
else StopAutoAddOns();
}
@@ -1373,14 +1367,14 @@
STDMETHODIMP CMgaProject::get_ProjectStatus(long *status) {
COMTRY {
CHECK_OUTPAR(status);
- if(opened == CLOSED) {
+ if (opened_flag == OPENED_FLAG_CLOSED) {
*status = 0;
}
- else if(opened == CLOSEERROR) {
+ else if(opened_flag == OPENED_FLAG_CLOSEERROR) {
*status = 0x80000000;
}
else {
- *status = 1 + (opened == CHANGED ? 4 : 0) + (baseterr ? 8 : 0) + (read_only ? 16 : 0);
+ *status = 1 + (opened_flag == OPENED_FLAG_CHANGED ? 4 : 0) + (baseterr ? 8 : 0) + (read_only ? 16 : 0);
}
} COMCATCH(;);
}
@@ -1425,7 +1419,6 @@
if (FAILED(hr))
COMRETURN(hr);
baseterr = activeterr = t;
- notifyqueueprocessed = false;
MARKSIG('3');
}
COMCATCH(;);
@@ -1487,13 +1480,20 @@
COMTHROW(dataproject->get_NestedTransactionCount(&nestedCount));
if (nestedCount == 1 && !read_only)
COMTHROW(GlobalNotify(GLOBALEVENT_COMMIT_TRANSACTION));
+
+
+ short undosize;
+ short undosizenew;
+ COMTHROW(dataproject->get_UndoQueueSize(&undosize));
COMTHROW(dataproject->CommitTransaction(read_only ? TRANSTYPE_READFIRST: TRANSTYPE_FIRST));
- baseterr = activeterr= NULL;
+ COMTHROW(dataproject->get_UndoQueueSize(&undosizenew));
+ baseterr = activeterr= NULL;
read_only = false;
- if(notifyqueueprocessed) {
+ if (undosize != undosizenew) {
+ // this means there were changes to the core project, and we can undo this transaction
transactioncount++;
- opened = CHANGED;
+ opened_flag = OPENED_FLAG_CHANGED;
if (guidstat == MANUAL) {
guidstat = CLEAN;
}
@@ -1622,8 +1622,6 @@
if(!baseterr)
COMTHROW(E_MGA_NOT_IN_TRANSACTION);
- if(!changedobjs.empty())
- notifyqueueprocessed = true;
while(!changedobjs.empty()) {
FCOPtr f = changedobjs.front();
changedobjs.pop();
@@ -1657,7 +1655,7 @@
ASSERT(!in_nested);
ASSERT(objstocheck.empty());
- objstocheck.clear();
+ objstocheck.clear();
HRESULT hr;
if (non_nestable)
@@ -1665,7 +1663,7 @@
else
hr = dataproject->BeginTransaction(TRANSTYPE_NESTED);
- MARKSIG('4');
+ MARKSIG('4');
if (hr == S_OK)
in_nested = true;
return hr;
@@ -1680,12 +1678,12 @@
HRESULT hr = S_OK;
if (!non_nestable)
hr = dataproject->CommitTransaction(TRANSTYPE_NESTED);
- MARKSIG('6');
+ MARKSIG('6');
if (hr != S_OK)
abortnested();
- else {
+ else {
in_nested = false;
- while(!temporalobjs.empty()) {
+ while (!temporalobjs.empty()) {
temporalobjs.front()->objrecordchange();
temporalobjs.pop();
}
@@ -1697,11 +1695,11 @@
ASSERT(in_nested);
objstocheck.clear();
in_nested = false;
- while(!temporalobjs.empty()) {
- temporalobjs.front()->objforgetchange();
- temporalobjs.pop();
+ while (!temporalobjs.empty()) {
+ temporalobjs.front()->objforgetchange();
+ temporalobjs.pop();
}
- MARKSIG('5');
+ MARKSIG('5');
must_abort = true;
if (non_nestable)
return S_OK;
@@ -1711,16 +1709,16 @@
HRESULT CMgaProject::pushterr(CMgaTerritory &ter) {
- COMTRY {
- ASSERT(("Territorys overwrite each other",activeterr==baseterr));
+ COMTRY{
+ ASSERT(("Territorys overwrite each other",activeterr == baseterr));
activeterr = &ter;
COMTHROW(dataproject->PushTerritory(ter.coreterr));
} COMCATCH(;);
}
HRESULT CMgaProject::popterr() {
- COMTRY {
- activeterr= baseterr;
+ COMTRY{
+ activeterr = baseterr;
COMTHROW(dataproject->PopTerritory());
} COMCATCH(;);
}
@@ -1728,13 +1726,18 @@
STDMETHODIMP CMgaProject::Undo() {
- COMTRY {
- if(baseterr) COMTHROW(E_MGA_ALREADY_IN_TRANSACTION);
+ COMTRY{
+ if (baseterr) COMTHROW(E_MGA_ALREADY_IN_TRANSACTION);
COMTHROW(dataproject->UndoTransaction());
- if(!--transactioncount) {
- opened = UNCHANGED;
+ transactioncount--;
+ if (transactioncount == 0) {
+ opened_flag = OPENED_FLAG_UNCHANGED;
guidstat = CLEAN;
}
+ else {
+ opened_flag = OPENED_FLAG_CHANGED;
+ guidstat = DIRTY;
+ }
{
aurcnt++;
CComPtr<IMgaTerritory> t;
@@ -1743,18 +1746,25 @@
GlobalNotify(GLOBALEVENT_UNDO);
COMTHROW(CommitTransaction());
}
- }
- COMCATCH(;);
+ }
+ COMCATCH(;);
}
STDMETHODIMP CMgaProject::Redo() {
- COMTRY {
- if(baseterr) COMTHROW(E_MGA_ALREADY_IN_TRANSACTION);
+ COMTRY{
+ if (baseterr)
+ COMTHROW(E_MGA_ALREADY_IN_TRANSACTION);
COMTHROW(dataproject->RedoTransaction());
transactioncount++;
- opened = CHANGED;
- guidstat = DIRTY;
+ if (transactioncount == 0) {
+ opened_flag = OPENED_FLAG_UNCHANGED;
+ guidstat = CLEAN;
+ } else {
+ opened_flag = OPENED_FLAG_CHANGED;
+ guidstat = DIRTY;
+ }
+
{
aurcnt++;
CComPtr<IMgaTerritory> t;
Modified: trunk/GME/Mga/MgaProject.h
==============================================================================
--- trunk/GME/Mga/MgaProject.h Tue Apr 7 10:44:39 2020 (r2786)
+++ trunk/GME/Mga/MgaProject.h Tue Apr 7 10:44:43 2020 (r2787)
@@ -229,11 +229,10 @@
CComVariant pendingguid;
enum guidmodes { CLEAN, DIRTY, PENDING, MANUAL};
- enum openmodes { CLOSED = 0, UNCHANGED = 1, CHANGED = 2, CLOSEERROR = 4};
+ enum open_flags { OPENED_FLAG_CLOSED = 0, OPENED_FLAG_UNCHANGED = 1, OPENED_FLAG_CHANGED = 2, OPENED_FLAG_CLOSEERROR = 4};
int transactioncount;
- bool notifyqueueprocessed;
- int opened;
+ int opened_flag;
int aurcnt; // Abort/undo/redo count
coreobjhash objstocheck;
Modified: trunk/GME/Mga/MgaTrukk.h
==============================================================================
--- trunk/GME/Mga/MgaTrukk.h Tue Apr 7 10:44:39 2020 (r2786)
+++ trunk/GME/Mga/MgaTrukk.h Tue Apr 7 10:44:43 2020 (r2787)
@@ -280,7 +280,7 @@
public:
HRESULT Begin(CMgaProject *ppr) {
if(!ppr) { SetStandardOrGMEErrorInfo(E_MGA_ZOMBIE_NOPROJECT); return E_MGA_ZOMBIE_NOPROJECT; }
- if(!ppr->opened) { SetStandardOrGMEErrorInfo(E_MGA_ZOMBIE_CLOSED_PROJECT); return E_MGA_ZOMBIE_CLOSED_PROJECT; }
+ if(!ppr->opened_flag) { SetStandardOrGMEErrorInfo(E_MGA_ZOMBIE_CLOSED_PROJECT); return E_MGA_ZOMBIE_CLOSED_PROJECT; }
if(!ppr->activeterr) { SetStandardOrGMEErrorInfo(E_MGA_NOT_IN_TRANSACTION); return E_MGA_NOT_IN_TRANSACTION; }
if(ppr->alreadynested()) {
pr = NULL;
@@ -418,9 +418,6 @@
} while(0);
-
-#define MODIFIED { if(mgaproject->opened < 1000) mgaproject->opened++; }
-
#undef COMCATCH
#define COMCATCH( CLEANUP ) \
catch(hresult_exception &e) \
Modified: trunk/Tests/GPyUnit/test_coreTransaction.py
==============================================================================
--- trunk/Tests/GPyUnit/test_coreTransaction.py Tue Apr 7 10:44:39 2020 (r2786)
+++ trunk/Tests/GPyUnit/test_coreTransaction.py Tue Apr 7 10:44:43 2020 (r2787)
@@ -106,6 +106,50 @@
project.Close(True)
del(terr)
+ def testModificationDetection(self):
+ project = DispatchEx('Mga.MgaProject')
+ project.Create(self.connstr, 'MetaGME')
+ paradigmSheet = project.RootMeta.RootFolder.DefinedFCOByName('ParadigmSheet', True)
+ self.assertEquals(project.ProjectStatus & 4, 4)
+ project.Preferences = 0x00000080
+ project.BeginTransactionInNewTerr()
+ base = project.RootFolder.CreateRootObject(paradigmSheet)
+ base.CreateChildObject(paradigmSheet.RoleByName('Atom'))
+ for i in range(20):
+ base.ParentFolder.DeriveRootObject(base, True)
+ base_id = base.ID
+ project.CommitTransaction()
+
+ self.assertEquals(project.UndoRedoSize(), (1, 0))
+ self.assertEquals(project.ProjectStatus & 4, 4)
+
+ for i in range(1, 20):
+ terr = project.BeginTransactionInNewTerr()
+ base = project.GetObjectByID(base_id)
+ derived = base.DerivedObjects.Item(i)
+ base.SetRegistryValueDisp('random', 'asdf')
+ base.Name = 'super'
+ project.CommitTransaction()
+ self.assertEquals(project.ProjectStatus & 4, 4)
+ if i == 11:
+ project.Save(project.ProjectConnStr, False)
+ self.assertEquals(project.ProjectStatus & 4, 0)
+ for i in range(7):
+ project.Undo()
+ self.assertEquals(project.ProjectStatus & 4, 4)
+ project.Undo()
+ self.assertEquals(project.ProjectStatus & 4, 0)
+ project.Redo()
+ self.assertEquals(project.ProjectStatus & 4, 4)
+ project.Undo()
+ self.assertEquals(project.ProjectStatus & 4, 0)
+ project.Undo()
+ self.assertEquals(project.ProjectStatus & 4, 4)
+ project.Redo()
+ self.assertEquals(project.ProjectStatus & 4, 0)
+ project.Close(True)
+
+
@property
def connstr(self):
return 'MGA=' + _adjacent_file('tmp.mga')
More information about the gme-commit
mailing list