diff -r 360d55486d7f -r 5de72ea7a065 pimappservices/calendar/server/src/agsentrymodel.cpp --- a/pimappservices/calendar/server/src/agsentrymodel.cpp Fri Jun 11 13:37:54 2010 +0300 +++ b/pimappservices/calendar/server/src/agsentrymodel.cpp Wed Jun 23 18:11:28 2010 +0300 @@ -85,6 +85,10 @@ iAttachmentIndex = new (ELeave) CAgnAttachmentIndex; CreateAlarmForServerL(); } + + User::LeaveIfError(iFs.Connect()); + User::LeaveIfError( iFs.ShareProtected() ); + iIndexFileIsDirty = ETrue; // for safety assume that the index // file is out of date. We can correct this // when we read the file @@ -113,6 +117,7 @@ delete iModelStreamIdSet; delete iEntryManager; delete iCalConverter; + iFs.Close(); } const CAgnServFile& CAgnEntryModel::AgnServFile() @@ -120,6 +125,14 @@ return *iAgnServerFile; } +/** + * Resets delete rollback array before the callback + */ +void CAgnEntryModel::ResetDeleteRollbackArray() + { + iDeleteRollbackArray.ResetAndDestroy(); + } + /** Load up the stream network */ void CAgnEntryModel::DoOpenL(const TStreamId& aModelStreamId) @@ -503,9 +516,11 @@ _DBGLOG_VERBOSE(AgmDebug::DebugLog("StoreL: Existing entry types is different to incoming entry's type");) _DBGLOG_VERBOSE(AgmDebug::DebugLog("StoreL: Delete the existing entry and add the incoming entry as a new one");) - // if the entry is a different type, delete the old entry and add the new one + // if the entry is a different type, add the new one first and delete only later + // This change is needed if the entry having attachments, it will be shared by two + //entries, so that attachments will not be deleted, while deleting it later. + returnId = AddEntryL(aEntry); DeleteEntryL(*existingEntryToReplace, ETrue, iChangeFilter); - returnId = AddEntryL(aEntry); } CleanupStack::PopAndDestroy(existingEntryToReplace); @@ -1398,22 +1413,16 @@ // file needs to be rebuilt and to no try to delete the file more than once. void CAgnEntryModel::MarkIndexFileAsDirtyL() { - if (iIndexFileIsDirty) - { - return; // the file is already marked as dirty - } - - TFileName idxfilename; - if (!GenerateIndexFileName(idxfilename)) - { - User::Leave(KErrBadName); - } - - TInt connectErr = iFs.Connect(); - User::LeaveIfError(connectErr); - - iFs.Delete(idxfilename); // ignore return as there is nothing we can do with it - + + if(IsIndexFileAvailableL()) + { + TFileName idxfilename; + if (!GenerateIndexFileName(idxfilename)) + { + User::Leave(KErrBadName); + } + iFs.Delete(idxfilename); // ignore return as there is nothing we can do with it + } iIndexFileIsDirty = ETrue; } @@ -1447,9 +1456,6 @@ User::Leave(KErrBadName); } - TInt connectErr = iFs.Connect(); - User::LeaveIfError(connectErr); - RFile idxFile; TInt errReadIdx = idxFile.Open(iFs, idxfilename, EFileRead); CleanupClosePushL(idxFile); @@ -1512,6 +1518,29 @@ return EFalse; } +// This method check the index file is exist. +// It returns: +// ETrue - File is already exist +// EFalse - File is not available +TBool CAgnEntryModel::IsIndexFileAvailableL() + { + TFileName idxfilename; + if (!GenerateIndexFileName(idxfilename)) + { + User::Leave(KErrBadName); + } + + RFile idxFile; + TInt errReadIdx = idxFile.Open(iFs, idxfilename, EFileRead); + CleanupClosePushL(idxFile); + if((errReadIdx == KErrNotFound)) + { + CleanupStack::PopAndDestroy(); + return EFalse; + } + CleanupStack::PopAndDestroy(&idxFile); + return ETrue; +} // This method attempts to save all indices to the index file. // If any errors are encountered it will Leave. @@ -1524,9 +1553,7 @@ { User::Leave(KErrBadName); } - TInt connectErr = iFs.Connect(); - User::LeaveIfError(connectErr); - + RFile idxFile; TInt errWriteIdx = idxFile.Replace(iFs, idxfilename, EFileWrite); User::LeaveIfError(errWriteIdx); @@ -2678,6 +2705,15 @@ NotifyingL(MCalChangeCallBack2::EChangeModify, aEntry, instanceInfoBefore); + if(iChangeFilter && iTzRuleIndex) + { + //Remove the tz rule from tz rule index + //we have to do it after CAgnEntryModel::NotifyingL that is indirectly using the + //tz rule in oldEntry. + iTzRuleIndex->RemoveTzRuleL(*oldEntry); + } + + CleanupStack::PopAndDestroy(instanceInfoBefore); CleanupStack::PopAndDestroy(oldEntry);