diff -r 8e7494275d3a -r 4f0867e42d62 omads/omadsextensions/adapters/agenda/src/nsmlagendadatastore.cpp --- a/omads/omadsextensions/adapters/agenda/src/nsmlagendadatastore.cpp Tue Aug 31 15:05:37 2010 +0300 +++ b/omads/omadsextensions/adapters/agenda/src/nsmlagendadatastore.cpp Wed Sep 01 12:30:02 2010 +0100 @@ -18,12 +18,6 @@ // INCLUDES -#include "nsmldebug.h" -#include "nsmlagendadatastore.h" -#include "nsmlagendadataprovider.h" -#include "nsmlchangefinder.h" -#include "NSmlDataModBase.h" -#include "nsmlagendadefines.hrh" #include #include #include @@ -41,11 +35,23 @@ #include #include #include -#include #include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include "nsmlagendadebug.h" +#include "nsmlagendadatastore.h" +#include "nsmlagendadataprovider.h" +#include "nsmlchangefinder.h" +#include "NSmlDataModBase.h" +#include "nsmlagendadefines.hrh" #ifndef __WINS__ // This lowers the unnecessary compiler warning (armv5) to remark. @@ -70,10 +76,17 @@ iDrive( -1 ), iReplaceItemId( -1 ), iRXEntryType( ENSmlNotSet ), - iTXEntryType( ENSmlNotSet ) + iTXEntryType( ENSmlNotSet ), + iIsHierarchicalSyncSupported( EFalse ), + iParentItemId( 0 ), + iOrphanEvent( EFalse ) { - _DBG_FILE("CNSmlAgendaDataStore::CNSmlAgendaDataStore(): BEGIN"); - _DBG_FILE("CNSmlAgendaDataStore::CNSmlAgendaDataStore(): END"); + FLOG(_L("CNSmlAgendaDataStore::CNSmlAgendaDataStore(): BEGIN")); + // RD_MULTICAL + iDataMimeType = ENSmlNone; + iAgendaAdapterHandler = NULL; + // RD_MULTICAL + FLOG(_L("CNSmlAgendaDataStore::CNSmlAgendaDataStore(): END")); } // ----------------------------------------------------------------------------- @@ -83,7 +96,7 @@ // void CNSmlAgendaDataStore::ConstructL() { - _DBG_FILE("CNSmlAgendaDataStore::ConstructL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::ConstructL: BEGIN")); iStringPool.OpenL(); User::LeaveIfError( iRfs.Connect() ); @@ -96,21 +109,32 @@ iMovedUids = new ( ELeave ) CNSmlDataItemUidSet(); iReplacedUids = new ( ELeave ) CNSmlDataItemUidSet(); - iDefaultStoreName = HBufC::NewL( KNSmlDefaultStoreNameMaxSize ); + iDefaultStoreFileName = HBufC::NewL( KNSmlDefaultStoreNameMaxSize ); + *iDefaultStoreFileName = KNSmlAgendaFileNameForDefaultDB; - iVersitTlsData = &CVersitTlsData::VersitTlsDataL(); - // Create CalSession and CalEntryView instances - iVCalSession = CCalSession::NewL(); - TPtr obptr = iDefaultStoreName->Des(); - obptr = iVCalSession->DefaultFileNameL(); - + // RD_MULTICAL + iAgendaAdapterLog = NULL; + iCalOffsetArr = new (ELeave) CArrayFixFlat( KArrayGranularity ); + iCommittedUidArr = new ( ELeave ) CNSmlDataItemUidSet(); + //iCalOffsetVal = CCalenMultiCalUtil::GetOffsetL(); + // TODO: Tweak code: BEGIN + iCalOffsetVal = 100000; + ListAllAgendaPluginAdaptersL(); + // END + iOwnFormat = DoOwnStoreFormatL(); - iDataMod->SetOwnStoreFormat( *iOwnFormat ); - + // RD_MULTICAL + iDataMod->SetOwnStoreFormat( *iOwnFormat ); iInterimUtils = CCalenInterimUtils2::NewL(); - - _DBG_FILE("CNSmlAgendaDataStore::ConstructL: END"); + + // Initialize the FieldId to a default value [UID3 of the application] + // This value will be rewritten once the exact single CalendarDB is determined + // In case of HF synchronization involving multiple CalendarDB's the below value + // will be retained. + iOpenedStoreId = KNSmlAgendaAdapterUid; + + FLOG(_L("CNSmlAgendaDataStore::ConstructL: END")); } // ----------------------------------------------------------------------------- @@ -120,7 +144,7 @@ // CNSmlAgendaDataStore* CNSmlAgendaDataStore::NewL() { - _DBG_FILE("CNSmlAgendaDataStore::NewL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::NewL: BEGIN")); CNSmlAgendaDataStore* self = new ( ELeave ) CNSmlAgendaDataStore(); CleanupStack::PushL( self ); @@ -128,7 +152,7 @@ self->ConstructL(); CleanupStack::Pop(); // self - _DBG_FILE("CNSmlAgendaDataStore::NewL: END"); + FLOG(_L("CNSmlAgendaDataStore::NewL: END")); return self; } @@ -139,53 +163,61 @@ // CNSmlAgendaDataStore::~CNSmlAgendaDataStore() { - _DBG_FILE("CNSmlAgendaDataStore::~CNSmlAgendaDataStore(): BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::~CNSmlAgendaDataStore(): BEGIN")); // Enable notifications TInt error( KErrNone ); - if ( iVCalSession ) + + // TODO: + /*if ( iVCalSession ) { TRAP_IGNORE( iVCalSession->EnablePubSubNotificationsL() ); TRAP_IGNORE( iVCalSession->EnableChangeBroadcast() ); - } - - delete iOwnFormat; - iRfs.Close(); - iStringPool.Close(); + }*/ if ( iChangeFinder ) { TRAP( error, iChangeFinder->CloseL() ); } - if (iVersitTlsData) - { - iVersitTlsData->VersitTlsDataClose(); - } - delete iChangeFinder; + + delete iChangeFinder; delete iNewUids; delete iDeletedUids; delete iSoftDeletedUids; delete iMovedUids; delete iReplacedUids; - delete iDefaultStoreName; + delete iDefaultStoreFileName; delete iOpenedStoreName; + delete iReceivedStoreName; delete iDataMod; delete iItemData; - - delete iAgendaProgressview; - - delete iImporter; - delete iExporter; - delete iInstanceView; - delete iEntryView; - delete iVCalSession; + delete iInterimUtils; + iAgendaPluginAdapters.ResetAndDestroy(); - // REComSession::FinalClose(); - - _DBG_FILE("CNSmlAgendaDataStore::~CNSmlAgendaDataStore(): END"); + if( iOwnFormat ) + { + delete iOwnFormat; + iOwnFormat = NULL; + } + + iRfs.Close(); + iStringPool.Close(); + + if ( iCalOffsetArr ) + { + iCalOffsetArr->Reset(); + delete iCalOffsetArr; + } + + if ( iCommittedUidArr ) + { + iCommittedUidArr->Reset(); + delete iCommittedUidArr; + } + FLOG(_L("CNSmlAgendaDataStore::~CNSmlAgendaDataStore(): END")); } // ----------------------------------------------------------------------------- @@ -196,7 +228,8 @@ void CNSmlAgendaDataStore::DoOpenL( const TDesC& aStoreName, MSmlSyncRelationship& aContext, TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoOpenL: BEGIN")); + iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if ( iState != ENSmlClosed ) @@ -209,82 +242,41 @@ { RFs::CharToDrive( KNSmlDriveC()[0], iDrive ); } - + + if ( iReceivedStoreName ) + { + delete iReceivedStoreName; + iReceivedStoreName = NULL; + } + iReceivedStoreName = aStoreName.AllocL(); // Open database TInt err( KErrNone ); - TRAP( err, iVCalSession->OpenL( aStoreName ) ); - DBG_ARGS(_S("CNSmlAgendaDataStore::DoOpenL: error while opening '%d'"), err ); - if( err == KErrNotFound ) - { - err = KErrNone; - TRAP( err, iVCalSession->CreateCalFileL( aStoreName )); - DBG_ARGS(_S("CNSmlAgendaDataStore::DoOpenL: creating the new calfile '%d'"), err ); - if( err == KErrNone ) - { - TRAP( err, iVCalSession->OpenL( aStoreName )); - } - } + if ( aStoreName == KNSmlAgendaFileNameForDefaultDB ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenL: Calling the OpenStoreL: '%S'"), &aStoreName); + TRAP( err, OpenStoreL() ); + } + if ( err ) { - DBG_ARGS(_S("CNSmlAgendaDataStore::DoOpenL: end with error '%d'"), err ); User::RequestComplete( iCallerStatus, err ); return; } - // Disable notifications - TRAP_IGNORE( iVCalSession->DisablePubSubNotificationsL() ); - TRAP_IGNORE( iVCalSession->DisableChangeBroadcast() ); - - if ( iOpenedStoreName ) - { - delete iOpenedStoreName; - iOpenedStoreName = NULL; - } - iOpenedStoreName = aStoreName.AllocL(); - - // Initialize some member variables - // Create importer and exporter - iImporter = CCalenImporter::NewL( *iVCalSession ); - iExporter = CCalenExporter::NewL( *iVCalSession ); - - // Progress view - iAgendaProgressview = CNSmlAgendaProgressview::NewL(); - - // Entry View - iEntryView = CCalEntryView::NewL( *iVCalSession, *iAgendaProgressview ); - - // Instance View - iInstanceView = CCalInstanceView::NewL(*iVCalSession); - - CActiveScheduler::Start(); - TInt completedStatus = iAgendaProgressview->GetCompletedStatus(); - if ( completedStatus != KErrNone ) - { - User::RequestComplete( iCallerStatus, completedStatus ); - return; - } - if ( iChangeFinder ) { iChangeFinder->CloseL(); delete iChangeFinder; iChangeFinder = NULL; } + iChangeFinder = CNSmlChangeFinder::NewL( aContext, iKey, iHasHistory, KNSmlAgendaAdapterImplUid ); - - // Get ID of database - iVCalSession->FileIdL( iOpenedStoreId ); - - if( !iSnapshotRegistered ) - { - RegisterSnapshotL(); - } - + iAgendaAdapterLog = CNSmlAgendaAdapterLog::NewL( aContext ); iState = ENSmlOpenAndWaiting; User::RequestComplete( iCallerStatus, err ); - _DBG_FILE("CNSmlAgendaDataStore::DoOpenL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoOpenL: END")); } // ----------------------------------------------------------------------------- @@ -294,7 +286,7 @@ // void CNSmlAgendaDataStore::DoCancelRequest() { - _DBG_FILE("CNSmlAgendaDataStore::DoCancelRequest: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCancelRequest: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iState = ENSmlClosed; @@ -303,7 +295,7 @@ { iState = ENSmlOpenAndWaiting; } - _DBG_FILE("CNSmlAgendaDataStore::DoCancelRequest: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCancelRequest: END")); } // ----------------------------------------------------------------------------- @@ -313,9 +305,9 @@ // const TDesC& CNSmlAgendaDataStore::DoStoreName() const { - _DBG_FILE("CNSmlAgendaDataStore::DoStoreName: BEGIN"); - _DBG_FILE("CNSmlAgendaDataStore::DoStoreName: END"); - return *iOpenedStoreName; + FLOG(_L("CNSmlAgendaDataStore::DoStoreName: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoStoreName: END")); + return *iReceivedStoreName; } // ----------------------------------------------------------------------------- @@ -325,9 +317,9 @@ // void CNSmlAgendaDataStore::DoBeginTransactionL() { - _DBG_FILE("CNSmlAgendaDataStore::DoBeginTransactionL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoBeginTransactionL: BEGIN")); User::Leave( KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoBeginTransactionL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoBeginTransactionL: END")); } // ----------------------------------------------------------------------------- @@ -337,11 +329,11 @@ // void CNSmlAgendaDataStore::DoCommitTransactionL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitTransactionL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitTransactionL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitTransactionL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitTransactionL: END")); } // ----------------------------------------------------------------------------- @@ -351,11 +343,11 @@ // void CNSmlAgendaDataStore::DoRevertTransaction( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoRevertTransaction: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoRevertTransaction: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoRevertTransaction: END"); + FLOG(_L("CNSmlAgendaDataStore::DoRevertTransaction: END")); } // ----------------------------------------------------------------------------- @@ -365,9 +357,9 @@ // void CNSmlAgendaDataStore::DoBeginBatchL() { - _DBG_FILE("CNSmlAgendaDataStore::DoBeginBatchL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoBeginBatchL: BEGIN")); User::Leave( KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoBeginBatchL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoBeginBatchL: END")); } // ----------------------------------------------------------------------------- @@ -378,11 +370,11 @@ void CNSmlAgendaDataStore::DoCommitBatchL( RArray& /*aResultArray*/, TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitBatchL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitBatchL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitBatchL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitBatchL: END")); } // ----------------------------------------------------------------------------- @@ -392,9 +384,9 @@ // void CNSmlAgendaDataStore::DoCancelBatch() { - _DBG_FILE("CNSmlAgendaDataStore::DoCancelBatch: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCancelBatch: BEGIN")); // Nothing to do - _DBG_FILE("CNSmlAgendaDataStore::DoCancelBatch: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCancelBatch: END")); } // ----------------------------------------------------------------------------- @@ -405,7 +397,7 @@ void CNSmlAgendaDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& aServerDataStoreFormat ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: BEGIN")); if ( iOwnFormat ) { @@ -414,6 +406,24 @@ } iOwnFormat = DoOwnStoreFormatL(); + // RD_MULTICAL + if ( aServerDataStoreFormat.IsSupported( + CSmlDataStoreFormat::EOptionHierarchial ) ) + { + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Supports HIERARCHIAL")); + + + iIsHierarchicalSyncSupported = ETrue; + + // Check what properties are supported for folders + iAgendaAdapterHandler->CheckServerSupportForFolder( aServerDataStoreFormat ); + } + else + { + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Do not support HIERARCHIAL")); + iIsHierarchicalSyncSupported = EFalse; + } + // RD_MULTICAL iDataMod->SetOwnStoreFormat( *iOwnFormat ); iDataMod->SetPartnerStoreFormat( ( CSmlDataStoreFormat& ) @@ -426,7 +436,7 @@ #ifdef __NSML_USE_ICAL_FEATURE - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Support iCal"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Support iCal")); returnValue = iDataMod->SetUsedMimeType( iOwnFormat->MimeFormat( 1 ).MimeType(), iOwnFormat->MimeFormat( 1 ).MimeVersion() ); @@ -435,19 +445,19 @@ if ( returnValue == KErrNone ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Sets iCal"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Sets iCal")); iRXEntryType = ENSmlICal; iTXEntryType = ENSmlICal; } else { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Support vCal"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Support vCal")); returnValue = iDataMod->SetUsedMimeType( iOwnFormat->MimeFormat( 0 ).MimeType(), iOwnFormat->MimeFormat( 0 ).MimeVersion() ); if ( returnValue == KErrNone ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Sets vCal"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: Sets vCal")); iRXEntryType = ENSmlVCal; iTXEntryType = ENSmlVCal; } @@ -455,11 +465,18 @@ if ( iRXEntryType == ENSmlNotSet || iTXEntryType == ENSmlNotSet ) { // Leave if server does not support either vCal or iCal - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: MimeType Not supported"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: MimeType Not supported")); User::Leave( KErrNotFound ); } - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: END"); + // RD_MULTICAL + if( !iSnapshotRegistered ) + { + RegisterSnapshotL(); + } + // RD_MULTICAL + + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteStoreFormatL: END")); } // ----------------------------------------------------------------------------- @@ -469,9 +486,9 @@ // void CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize( TInt aServerMaxObjectSize ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize: BEGIN")); iServerMaxObjectSize = aServerMaxObjectSize; - _DBG_FILE("CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize: END"); + FLOG(_L("CNSmlAgendaDataStore::DoSetRemoteMaxObjectSize: END")); } // ----------------------------------------------------------------------------- @@ -481,8 +498,8 @@ // TInt CNSmlAgendaDataStore::DoMaxObjectSize() const { - _DBG_FILE("CNSmlAgendaDataStore::DoMaxObjectSize: BEGIN"); - _DBG_FILE("CNSmlAgendaDataStore::DoMaxObjectSize - Default: END"); + FLOG(_L("CNSmlAgendaDataStore::DoMaxObjectSize: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoMaxObjectSize - Default: END")); return KNSmlAgendaOwnMaxObjectSize; } @@ -491,104 +508,190 @@ // Open calendar item for reading. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoOpenItemL( TSmlDbItemUid aUid, TBool& aFieldChange, - TInt& aSize, TSmlDbItemUid& /*aParent*/, TDes8& aMimeType, - TDes8& aMimeVer, TRequestStatus& aStatus ) +void CNSmlAgendaDataStore::DoOpenItemL( TSmlDbItemUid aUid, + TBool& aFieldChange, + TInt& aSize, + TSmlDbItemUid& aParent, + TDes8& aMimeType, + TDes8& aMimeVer, + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; + // Leave if Data Store is in wrong state if ( iState != ENSmlOpenAndWaiting ) { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:Returing due to invalid state")); User::RequestComplete( iCallerStatus, KErrNotReady ); return; } - iReplaceItemId = aUid; - - CCalEntry* entry = NULL; - TInt err( KErrNone ); - TRAP( err, entry = iEntryView->FetchL( aUid ) ); - CleanupStack::PushL( entry ); + // Add field change info + aFieldChange = EFalse; - if ( err || !entry ) - { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, KErrNotFound ); - return; - } - + // Update the SnapShots if ( !iSnapshotRegistered ) - { - RegisterSnapshotL(); - } - delete iItemData; - iItemData = NULL; - iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); + { + RegisterSnapshotL(); + } + + // Initialize the Buffer + delete iItemData; + iItemData = NULL; + iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); - RBufWriteStream writeStream( *iItemData ); - writeStream.PushL(); - - // Export item from database - if ( iTXEntryType == ENSmlICal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: Export - iCal DB"); - iExporter->ExportICalL( *entry, writeStream ); - aMimeType = iOwnFormat->MimeFormat( 1 ).MimeType().DesC(); - aMimeVer = iOwnFormat->MimeFormat( 1 ).MimeVersion().DesC(); - } - else if ( iTXEntryType == ENSmlVCal ) + RBufWriteStream writeStream( *iItemData ); + writeStream.PushL(); + + // RD_MULTICAL + //Determine the Mime Type + DataMimeType( aUid ); + TInt fetchError( KErrNone ); + switch( iDataMimeType ) { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: Export - vCal DB"); - iExporter->ExportVCalL( *entry, writeStream ); - aMimeType = iOwnFormat->MimeFormat( 0 ).MimeType().DesC(); - aMimeVer = iOwnFormat->MimeFormat( 0 ).MimeVersion().DesC(); + case ENSmlFolder: + { + //Set the Parent UID + aParent = KDbItemUidRoot; // parent is root + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: calling fetch")); + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:writestream before size: '%d'"), writeStream.Sink()->SizeL()); + TRAP( fetchError, iAgendaAdapterHandler->FetchFolderL( aUid, writeStream ) ); + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:writestream size: '%d'"), writeStream.Sink()->SizeL()); + + if(fetchError != KErrNone) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: fetch error: '%d'"), fetchError); + CleanupStack::PopAndDestroy( ); // writeStream + User::RequestComplete( iCallerStatus, fetchError ); + return; + } + + aMimeType.Append( KNSmlContentTypeFolder ); + aMimeVer.Append( KNSmlContentTypeFolderVersion ); + + writeStream.CommitL(); + iItemData->Compress(); + iPos = 0; + } + break; + case ENSmlCalendar: + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: calendar item")); + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + TCalLocalUid parentid(NULL); + TCalLocalUid entryid(aUid); + TInt err( KErrNone ); + + if( iIsHierarchicalSyncSupported ) + { + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:Parent Id is not Valid one")); + CleanupStack::PopAndDestroy( ); // writeStream + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + aParent = parentid; + //Get the Folder Name + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL( parentid )); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL:Invalid CalendarInfo")); + CleanupStack::PopAndDestroy( ); // writeStream + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + iReplaceItemId = entryid; + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, entryid )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: entry is not valid")); + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( ); // writeStream + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + // Export item from database + if ( iTXEntryType == ENSmlICal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: Export - iCal DB")); + agendautil->iExporter->ExportICalL( *agendautil->iEntry, writeStream ); + aMimeType = iOwnFormat->MimeFormat( 1 ).MimeType().DesC(); + aMimeVer = iOwnFormat->MimeFormat( 1 ).MimeVersion().DesC(); + } + else if ( iTXEntryType == ENSmlVCal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: Export - vCal DB")); + agendautil->iExporter->ExportVCalL( *agendautil->iEntry, writeStream ); + aMimeType = iOwnFormat->MimeFormat( 0 ).MimeType().DesC(); + aMimeVer = iOwnFormat->MimeFormat( 0 ).MimeVersion().DesC(); + } + else + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: Export - DB Not Supported")); + delete agendautil; + delete calfilename; + CleanupStack::PopAndDestroy( &writeStream ); + User::RequestComplete( iCallerStatus, KErrNotSupported ); + return; + } + writeStream.CommitL(); + iItemData->Compress(); + iPos = 0; + + iDataMod->StripTxL( *iItemData ); + delete agendautil; + delete calfilename; + } + break; + default: + { + iDataMimeType = ENSmlNone; + CleanupStack::PopAndDestroy( ); // writeStream + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } } - else - { - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: Export - DB Not Supported"); - CleanupStack::PopAndDestroy( 2 ); // writeStream, entry - User::RequestComplete( iCallerStatus, KErrNotSupported ); - return; - } - - writeStream.CommitL(); - iItemData->Compress(); - iPos = 0; + + CleanupStack::PopAndDestroy( ); // writeStream -#ifdef __NSML_MORE_DEBUG_FOR_ITEMS__ - - DBG_DUMP( ( void* )iItemData->Ptr( 0 ).Ptr(), iItemData->Size(), - _S8( "Item from database:" ) ); - -#endif // __NSML_MORE_DEBUG_FOR_ITEMS__ - + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: destroying the stream")); - iDataMod->StripTxL( *iItemData ); - CleanupStack::PopAndDestroy( 2 ); // writeStream, entry - -#ifdef __NSML_MORE_DEBUG_FOR_ITEMS__ - - DBG_DUMP( ( void* )iItemData->Ptr( 0 ).Ptr(), iItemData->Size(), - _S8( "Item from database after strip:" ) ); - -#endif // __NSML_MORE_DEBUG_FOR_ITEMS__ - - aFieldChange = EFalse; + // Set the Size aSize = iItemData->Size(); iState = ENSmlItemOpen; + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: user complete")); + if ( iServerMaxObjectSize == 0 || aSize <= iServerMaxObjectSize ) { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: error none")); User::RequestComplete( iCallerStatus, KErrNone ); } else { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: error too big")); User::RequestComplete( iCallerStatus, KErrTooBig ); } - - _DBG_FILE("CNSmlAgendaDataStore::DoOpenItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: END")); } // ----------------------------------------------------------------------------- @@ -597,87 +700,159 @@ // buffered. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoCreateItemL( TSmlDbItemUid& aUid, TInt aSize, - TSmlDbItemUid /*aParent*/, const TDesC8& aMimeType, - const TDesC8& /*aMimeVer*/, TRequestStatus& aStatus ) +void CNSmlAgendaDataStore::DoCreateItemL( TSmlDbItemUid& aUid, + TInt aSize, + TSmlDbItemUid aParent, + const TDesC8& aMimeType, + const TDesC8& /*aMimeVer*/, + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: Parent id: '%d'"), aParent); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: UID: '%d'"), aUid); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; iAddItemId = &aUid; - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL - KErrNotReady: END"); - return; - } - - if ( KNSmlAgendaOwnMaxObjectSize < aSize ) - { - User::RequestComplete( iCallerStatus, KErrTooBig ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL - KErrTooBig: END"); - return; - } - - if( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive ) ) - { - User::RequestComplete( iCallerStatus, KErrDiskFull ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL - KErrDiskFull: END"); - return; - } - - // Check if MIME type of new item is supported - TBool mimeFound( EFalse ); - // vCal - if ( iOwnFormat->MimeFormat( 0 ).MimeType().DesC().Compare( aMimeType ) - == 0 ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: received vCal"); - mimeFound = ETrue; - iRXEntryType = ENSmlVCal; - } - -#ifdef __NSML_USE_ICAL_FEATURE - - // iCal - else if ( iOwnFormat->MimeFormat( 1 ).MimeType().DesC().Compare( aMimeType ) - == 0 ) + //Leave if Data Store is in wrong state + if ( iState != ENSmlOpenAndWaiting ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: received iCal"); - mimeFound = ETrue; - iRXEntryType = ENSmlICal; + User::RequestComplete( iCallerStatus, KErrNotReady ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - KErrNotReady: END")); + return; } + // Leave if item is larger than we support + if ( KNSmlAgendaOwnMaxObjectSize < aSize ) + { + User::RequestComplete( iCallerStatus, KErrTooBig ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - KErrTooBig: END")); + return; + } + + // Check the drive free space + if( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - KErrDiskFull: END")); + return; + } + + // Check the MIME type + if ( 0 == iOwnFormat->MimeFormat( 0 ).MimeType().DesC().Compare( aMimeType ) ) + { + // vcal + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: received vCal")); + iRXEntryType = ENSmlVCal; + iDataMimeType = ENSmlCalendar; + + TInt err( KErrNone ); + // Check the Sync Status + if( iIsHierarchicalSyncSupported ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL Supports Hierarchichal")); + // Check that parent exists + iParentItemId = aParent; + if ( iParentItemId == KDbItemUidRoot + && iDataMimeType == ENSmlCalendar ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: ParentId is NULL")); + iParentItemId = NULL; + iOrphanEvent = ETrue; + iParentItemId = KDbPersonal; + } + + TInt index = KErrNotFound; + TInt err = KErrNone; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + err = iCalOffsetArr->Find( iParentItemId, key, index ); + + if( err != KErrNone && iDataMimeType == ENSmlCalendar ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: ParentId is NotFound")); + iParentItemId = NULL; + iOrphanEvent = EFalse; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + // Check the Sync Status + TBool syncstatus( EFalse ); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( iParentItemId ) ); + if( err || !syncstatus ) + { + iOrphanEvent = EFalse; + User::RequestComplete( iCallerStatus, err ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - Sync Disabled: END")); + return; + } + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = iOpenedStoreName->AllocL(); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( err || !syncstatus ) + { + delete calfilename; + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL - Sync Disabled: END")); + return; + } + delete calfilename; + } + } +#ifdef __NSML_USE_ICAL_FEATURE + else if ( 0 == iOwnFormat->MimeFormat( 1 ).MimeType().DesC().Compare( aMimeType ) ) + { + //ical + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: received iCal")); + iRXEntryType = ENSmlICal; + iDataMimeType = ENSmlCalendar; + } #endif // __NSML_USE_ICAL_FEATURE - - // Else use original iRXEntryType + // RD_MULTICAL + else if( aMimeType == KNSmlContentTypeFolder() && iIsHierarchicalSyncSupported ) + { + // Check the validity + /*if ( aUid <= 0 || aParent <= 0 ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: Corrupt ids")); + User::RequestComplete( iCallerStatus, KErrCorrupt ); + return; + }*/ + iDataMimeType = ENSmlFolder; + } + // RD_MULTICAL else { - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: \ - mime type not received"); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: \ + mime type not received")); iRXEntryType = iTXEntryType; + iDataMimeType = ENSmlNone; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: end with leave")); + return; } - - if ( !mimeFound ) - { - User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL -KErrNotSupported: END"); - return; - } + + // TODO: Any other validation is required ? + + // Register snapshots if needed + if( !iSnapshotRegistered ) + { + RegisterSnapshotL(); + } + + // Buffer is reinitialized + delete iItemData; + iItemData = NULL; + iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); + iPos = 0; + + iState = ENSmlItemCreating; + User::RequestComplete( iCallerStatus, KErrNone ); - if( !iSnapshotRegistered ) - { - RegisterSnapshotL(); - } - delete iItemData; - iItemData = NULL; - iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); - iPos = 0; - - iState = ENSmlItemCreating; - User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoCreateItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCreateItemL: END")); } // ----------------------------------------------------------------------------- @@ -686,80 +861,171 @@ // writes item's data as buffered. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoReplaceItemL( TSmlDbItemUid aUid, TInt aSize, - TSmlDbItemUid /*aParent*/, TBool aFieldChange, - TRequestStatus& aStatus ) +void CNSmlAgendaDataStore::DoReplaceItemL( TSmlDbItemUid aUid, + TInt aSize, + TSmlDbItemUid aParent, + TBool aFieldChange, + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: Parent id: '%d'"), aParent); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: UID: '%d'"), aUid); + iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; + TInt err( KErrNone ); - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - KErrNotReady: END"); - return; - } - - if ( KNSmlAgendaOwnMaxObjectSize < aSize ) - { - User::RequestComplete( iCallerStatus, KErrTooBig ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - KErrTooBig: END"); - return; - } + // Leave if Data Store is in wrong state + if ( iState != ENSmlOpenAndWaiting ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - KErrNotReady: END")); + return; + } - if ( aFieldChange ) - { - User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL \ - - KErrNotSupported: END"); - return; - } - if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive ) ) - { - User::RequestComplete( iCallerStatus, KErrDiskFull ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - KErrDiskFull: END"); - return; - } - - iReplaceItemId = aUid; - - CCalEntry* entry = NULL; - TInt err( KErrNone ); - TRAP( err, entry = iEntryView->FetchL( aUid ) ); - CleanupStack::PushL( entry ); - - if ( !entry || err == KErrNotFound ) - { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, KErrNotFound ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - KErrNotFound: END"); - return; - } - else if ( err ) + // Leave if item is larger than we support + if ( KNSmlAgendaOwnMaxObjectSize < aSize ) { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, err ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL - Error: END"); - return; + User::RequestComplete( iCallerStatus, KErrTooBig ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - KErrTooBig: END")); + return; } - CleanupStack::PopAndDestroy( entry ); // entry - - if ( !iSnapshotRegistered ) - { - RegisterSnapshotL(); - } - - delete iItemData; - iItemData = NULL; - iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); - iPos = 0; - iReplaceItemId = aUid; + // This adapter does not support Field Level sync + if ( aFieldChange ) + { + User::RequestComplete( iCallerStatus, KErrNotSupported ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL \ + - KErrNotSupported: END")); + return; + } + + // Check the drive free space + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive ) ) + { + User::RequestComplete( iCallerStatus, KErrDiskFull ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - KErrDiskFull: END")); + return; + } + + // Check the Sync Status + if( iIsHierarchicalSyncSupported ) + { + TCalLocalUid parentid( aParent ); + TCalLocalUid entryid( aUid ); + + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: Invalid UID")); + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - Sync Disabled: END")); + return; + } + TBool syncstatus( EFalse ); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( parentid ) ); + if( err || !syncstatus ) + { + User::RequestComplete( iCallerStatus, err ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - Sync Disabled: END")); + return; + } + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = iOpenedStoreName->AllocL(); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( err || !syncstatus ) + { + delete calfilename; + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - Sync Disabled: END")); + return; + } + delete calfilename; + } + + // Determine the Mime Type + DataMimeType( aUid ); + switch( iDataMimeType ) + { + case ENSmlFolder: + { + iReplaceItemId = aUid; + } + break; + case ENSmlCalendar: + { + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + iParentItemId = aParent; + + if( iIsHierarchicalSyncSupported ) + { + iReplaceItemId = aUid - aParent; + //Get the Folder Information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL( aParent )); + } + else + { + iReplaceItemId = aUid; + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL:Invalid CalendarInfo")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: entry id to be fetched: '%d'"), iReplaceItemId); + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, iReplaceItemId )); + CleanupStack::Pop(agendautil); + } + + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: entry is not valid")); + delete agendautil; + delete calfilename; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + delete agendautil; + delete calfilename; + } + break; + default: + { + iDataMimeType = ENSmlNone; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL \ + - KErrNotSupported: END")); + return; + } + } + + if ( !iSnapshotRegistered ) + { + RegisterSnapshotL(); + } + + //Reinitialize the Buffer + delete iItemData; + iItemData = NULL; + iItemData = CBufFlat::NewL( KNSmlItemDataExpandSize ); + iPos = 0; + + iState = ENSmlItemUpdating; + User::RequestComplete( iCallerStatus, KErrNone ); - iState = ENSmlItemUpdating; - User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoReplaceItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL: END")); } // ----------------------------------------------------------------------------- @@ -769,7 +1035,7 @@ // void CNSmlAgendaDataStore::DoReadItemL( TDes8& aBuffer ) { - _DBG_FILE("CNSmlAgendaDataStore::DoReadItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoReadItemL: BEGIN")); if ( iState != ENSmlItemOpen || !iItemData ) { iPos = -1; @@ -791,7 +1057,7 @@ iItemData->Read( iPos, aBuffer, iItemData->Size() - iPos ); iPos = -1; } - _DBG_FILE("CNSmlAgendaDataStore::DoReadItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoReadItemL: END")); } // ----------------------------------------------------------------------------- @@ -801,7 +1067,7 @@ // void CNSmlAgendaDataStore::DoWriteItemL( const TDesC8& aData ) { - _DBG_FILE("CNSmlAgendaDataStore::DoWriteItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoWriteItemL: BEGIN")); if ( iState == ENSmlItemCreating || iState == ENSmlItemUpdating ) { if ( iItemData ) @@ -816,7 +1082,7 @@ } } User::Leave( KErrNotReady ); - _DBG_FILE("CNSmlAgendaDataStore::DoWriteItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoWriteItemL: END")); } // ----------------------------------------------------------------------------- @@ -826,34 +1092,63 @@ // void CNSmlAgendaDataStore::DoCommitItemL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitItemL: BEGIN"); - iCallerStatus = &aStatus; - *iCallerStatus = KRequestPending; - - if ( iState != ENSmlItemCreating && iState != ENSmlItemUpdating ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitItemL - KErrNotReady: END"); - return; - } - - iItemData->Compress(); - TInt error( KErrNone ); - - if ( iState == ENSmlItemCreating ) - { - TRAP( error, DoCommitCreateItemL() ); - } - else // ENSmlItemUpdating - { - TRAP( error, DoCommitReplaceItemL() ); - } - iReplaceItemId = -1; - iPos = -1; - iState = ENSmlOpenAndWaiting; - iRXEntryType = iTXEntryType; + FLOG(_L("CNSmlAgendaDataStore::DoCommitItemL: BEGIN")); + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + + // Leave if Data Store is in wrong state + if ( iState != ENSmlItemCreating && iState != ENSmlItemUpdating ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitItemL - KErrNotReady: END")); + return; + } + + iItemData->Compress(); + TInt error( KErrNone ); + + // RD_MULTICAL + switch(iDataMimeType) + { + case ENSmlCalendar: + { + if( iState == ENSmlItemCreating ) + { + TRAP( error, DoCommitCreateCalItemL() ); + } + else + { + TRAP( error, DoCommitReplaceCalItemL() ); + } + } + break; + case ENSmlFolder: + { + if( iState == ENSmlItemCreating ) + { + TRAP( error, DoCommitCreateFolderItemL() ); + } + else + { + TRAP( error, DoCommitReplaceFolderItemL() ); + } + } + break; + default: + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateItemL - \ + KErrNotSupported: END")); + User::Leave( KErrNotSupported ); + } + } + // RD_MULTICAL + + iReplaceItemId = -1; + iPos = -1; + iState = ENSmlOpenAndWaiting; + iRXEntryType = iTXEntryType; User::RequestComplete( iCallerStatus, error ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitItemL: END")); } // ----------------------------------------------------------------------------- @@ -863,13 +1158,13 @@ // void CNSmlAgendaDataStore::DoCloseItem() { - _DBG_FILE("CNSmlAgendaDataStore::DoCloseItem: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCloseItem: BEGIN")); if ( iState == ENSmlItemOpen ) { iPos = -1; iState = ENSmlOpenAndWaiting; } - _DBG_FILE("CNSmlAgendaDataStore::DoCloseItem: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCloseItem: END")); } // ----------------------------------------------------------------------------- @@ -878,18 +1173,16 @@ // ----------------------------------------------------------------------------- // void CNSmlAgendaDataStore::DoMoveItemL( TSmlDbItemUid /*aUid*/, - TSmlDbItemUid /*aNewParent*/, TRequestStatus& aStatus ) + TSmlDbItemUid /*aNewParent*/, + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoMoveItemL: BEGIN"); - iCallerStatus = &aStatus; - *iCallerStatus = KRequestPending; - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - return; - } - User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoMoveItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoMoveItemL: BEGIN")); + + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + User::RequestComplete( iCallerStatus, KErrNotSupported ); + + FLOG(_L("CNSmlAgendaDataStore::DoMoveItemL: END")); } // ----------------------------------------------------------------------------- @@ -898,46 +1191,234 @@ // ----------------------------------------------------------------------------- // void CNSmlAgendaDataStore::DoDeleteItemL( TSmlDbItemUid aUid, - TRequestStatus& aStatus ) + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoDeleteItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: aUid: '%d'"), aUid); + + TInt err(KErrNone); iCallerStatus = &aStatus; - *iCallerStatus = KRequestPending; - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - return; - } - - CCalEntry* entry = NULL; - TInt err( KErrNone ); - TRAP( err, entry = iEntryView->FetchL( aUid ) ); - CleanupStack::PushL( entry ); + *iCallerStatus = KRequestPending; + + // Leave is Data Store is in wrong state + if ( iState != ENSmlOpenAndWaiting ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + return; + } + + //Check validity of UID + if ( aUid <= 0 ) + { + User::RequestComplete( iCallerStatus, KErrCorrupt ); + return; + } - if ( !entry || err == KErrNotFound ) - { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, KErrNotFound ); - return; - } - else if ( err ) - { - CleanupStack::PopAndDestroy( entry ); // entry - User::RequestComplete( iCallerStatus, err ); - return; - } + // Check the Sync Status + if( iIsHierarchicalSyncSupported ) + { + TCalLocalUid parentid( NULL ); + TCalLocalUid entryid( aUid ); + + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: Invalid UID")); + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL - Sync Disabled: END")); + return; + } + TBool syncstatus( EFalse ); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( parentid ) ); + if( err || !syncstatus ) + { + User::RequestComplete( iCallerStatus, err ); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL - Sync Disabled: END")); + return; + } + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = iOpenedStoreName->AllocL(); + TRAP( err, syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( err || !syncstatus ) + { + delete calfilename; + User::RequestComplete( iCallerStatus, KErrGeneral ); + FLOG(_L("CNSmlAgendaDataStore::DoReplaceItemL - Sync Disabled: END")); + return; + } + delete calfilename; + } + + //Determine the Mime Type + DataMimeType( aUid ); + switch( iDataMimeType ) + { + case ENSmlFolder: + { + HBufC* calfilename = NULL; + //Get the Calendar information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(aUid) ); + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL:Invalid CalendarInfo")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: name exists")); + CCalSession* vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + vCalSession->OpenL(calfilename->Des()); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: before deleting")); + TRAP(err, vCalSession->DeleteCalFileL(calfilename->Des())); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: after deleting err: '%d'"), err); + if( err == KErrInUse ) + { + // Delete all the entries associated with this CalFile + CNSmlAgendaDataStoreUtil* agendautil = NULL; + TBuf8 keyBuff; + TInt aNumSuccessfulDeleted( 0 ); + RArray uidArray; + CleanupClosePushL( uidArray ); + TCalTime zeroTime; + zeroTime.SetTimeUtcL( Time::NullTTime() ); + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL:Invalid CalendarInfo")); + delete calfilename; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + agendautil->iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); + // ... and then delete them + agendautil->iEntryView->DeleteL( uidArray, aNumSuccessfulDeleted ); + CleanupStack::PopAndDestroy( &uidArray ); // uidArray + delete agendautil; + + // Get the CalFile + CCalCalendarInfo* caleninfo = vCalSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + + // Mark the CalFile as Hidden + caleninfo->SetEnabled( EFalse ); + + // Set the SyncStatus to False + keyBuff.Zero(); + keyBuff.AppendNum( ESyncStatus ); + TBool syncstatus( EFalse ); + TPckgC pckgSyncStatusValue( syncstatus ); + caleninfo->SetPropertyL( keyBuff, pckgSyncStatusValue ); + + // Mark the meta property as SoftDeleted + keyBuff.Zero(); + keyBuff.AppendNum(EMarkAsDelete); + TPckgC pkgSoftDelete( ETrue ); + caleninfo->SetPropertyL(keyBuff, pkgSoftDelete); + + vCalSession->SetCalendarInfoL( *caleninfo ); + CleanupStack::PopAndDestroy(caleninfo); + } + else if( err != KErrNone ) + { + CleanupStack::PopAndDestroy(vCalSession); + delete calfilename; + User::RequestComplete( iCallerStatus, KErrGeneral ); + return; + } + CleanupStack::PopAndDestroy(vCalSession); + delete calfilename; + + //Update the array + TInt index = KErrNotFound; + TInt err = KErrNone; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + err = iCalOffsetArr->Find( aUid, key, index ); + + if( err == KErrNone ) + { + iCalOffsetArr->Delete(index); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: updated the array")); + } + } + break; + case ENSmlCalendar: + { + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + TCalLocalUid parentid(NULL); + TCalLocalUid entryid(aUid); + TInt err( KErrNone ); + + if( iIsHierarchicalSyncSupported ) + { + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL:Parent Id is not Valid one")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + //Get the Folder Information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(parentid) ); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL:Invalid CalendarInfo")); + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, entryid )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoOpenItemL: entry is not valid")); + delete agendautil; + delete calfilename; + User::RequestComplete( iCallerStatus, KErrNotFound ); + return; + } + agendautil->iEntryView->DeleteL( *agendautil->iEntry ); + delete agendautil; + delete calfilename; + } + break; + default: + break; + } + + //Update the Snapshots + if ( iChangeFinder ) + { + TNSmlSnapshotItem item( aUid ); + iChangeFinder->ItemDeleted( item ); + } + + User::RequestComplete( iCallerStatus, KErrNone ); - iEntryView->DeleteL( *entry ); - CleanupStack::PopAndDestroy( entry ); // entry - - if ( iChangeFinder ) - { - TNSmlSnapshotItem item( aUid ); - iChangeFinder->ItemDeleted( item ); - } - - User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoDeleteItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoDeleteItemL: END")); } // ----------------------------------------------------------------------------- @@ -946,13 +1427,13 @@ // ----------------------------------------------------------------------------- // void CNSmlAgendaDataStore::DoSoftDeleteItemL( TSmlDbItemUid /*aUid*/, - TRequestStatus& aStatus ) + TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoSoftDeleteItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoSoftDeleteItemL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlAgendaDataStore::DoSoftDeleteItemL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoSoftDeleteItemL: END")); } // ----------------------------------------------------------------------------- @@ -962,40 +1443,62 @@ // void CNSmlAgendaDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoDeleteAllItemsL: BEGIN"); - iCallerStatus = &aStatus; - *iCallerStatus = KRequestPending; - if ( iState != ENSmlOpenAndWaiting ) - { - User::RequestComplete( iCallerStatus, KErrNotReady ); - return; - } - - // Delete all items - // First searh every UIDs ... - TInt aNumSuccessfulDeleted( 0 ); - RArray uidArray; - CleanupClosePushL( uidArray ); - TCalTime zeroTime; - zeroTime.SetTimeUtcL( Time::NullTTime() ); - iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); - - - // ... and then delete them - iEntryView->DeleteL( uidArray, aNumSuccessfulDeleted ); - CleanupStack::PopAndDestroy( &uidArray ); // uidArray - - iSnapshotRegistered = EFalse; + FLOG(_L("CNSmlAgendaDataStore::DoDeleteAllItemsL: BEGIN")); + iCallerStatus = &aStatus; + *iCallerStatus = KRequestPending; + if ( iState != ENSmlOpenAndWaiting ) + { + User::RequestComplete( iCallerStatus, KErrNotReady ); + return; + } + + if( iIsHierarchicalSyncSupported ) + { + // TODO: Have to enable once the delete issue is fixed by Organizer + FLOG(_L("CNSmlAgendaDataStore::DoDeleteAllItemsL: Temporarily doesnot support")); + User::RequestComplete( iCallerStatus, KErrNotSupported ); + return; + } + else + { + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + calfilename = iOpenedStoreName->AllocL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + agendautil->InitializeCalAPIsL( calfilename ); + CleanupStack::Pop(agendautil); + // Delete all items + // First searh every UIDs ... + TInt aNumSuccessfulDeleted( 0 ); + RArray uidArray; + CleanupClosePushL( uidArray ); + TCalTime zeroTime; + zeroTime.SetTimeUtcL( Time::NullTTime() ); + agendautil->iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); + + // ... and then delete them + agendautil->iEntryView->DeleteL( uidArray, aNumSuccessfulDeleted ); + CleanupStack::PopAndDestroy( &uidArray ); // uidArray + } + delete agendautil; + delete calfilename; + } + + iSnapshotRegistered = EFalse; + // Update changefinder - if ( iChangeFinder ) - { - iChangeFinder->ResetL(); - RegisterSnapshotL(); - } - - User::RequestComplete( iCallerStatus, KErrNone ); - - _DBG_FILE("CNSmlAgendaDataStore::DoDeleteAllItemsL: END"); + if ( iChangeFinder ) + { + iChangeFinder->ResetL(); + RegisterSnapshotL(); + } + User::RequestComplete( iCallerStatus, KErrNone ); + + FLOG(_L("CNSmlAgendaDataStore::DoDeleteAllItemsL: END")); } // ----------------------------------------------------------------------------- @@ -1005,7 +1508,7 @@ // TBool CNSmlAgendaDataStore::DoHasSyncHistory() const { - _DBG_FILE("CNSmlAgendaDataStore::DoHasSyncHistory: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoHasSyncHistory: BEGIN")); TBool ret = EFalse; if ( iHasHistory ) { @@ -1022,7 +1525,7 @@ { iChangeFinder->SetDataStoreUid( iOpenedStoreId ); } - _DBG_FILE("CNSmlAgendaDataStore::DoHasSyncHistory: END"); + FLOG(_L("CNSmlAgendaDataStore::DoHasSyncHistory: END")); return ret; } @@ -1033,13 +1536,40 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoAddedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoAddedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoAddedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iNewUids->Reset(); TRAP_IGNORE( iChangeFinder->FindNewItemsL( *iNewUids ) ); + + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE(inactiveuids = ActiveItemsL( *iNewUids )); + delete inactiveuids; + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = NULL; + TRAP_IGNORE( calfilename = iOpenedStoreName->AllocL() ); + TRAP_IGNORE( syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( !syncstatus ) + { + iNewUids->Reset(); + } + delete calfilename; + } + // RD_MULTICAL } - _DBG_FILE("CNSmlAgendaDataStore::DoAddedItems: END"); + + for( TInt count = 0; count < iNewUids->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::DoAddedItems: list '%d'"), iNewUids->ItemAt(count) ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoAddedItems: END")); return *iNewUids; } @@ -1050,13 +1580,93 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoDeletedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoDeletedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoDeletedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iDeletedUids->Reset(); - TRAP_IGNORE( iChangeFinder->FindDeletedItemsL( *iDeletedUids ) ); + TRAP_IGNORE( iChangeFinder->FindDeletedItemsL( *iDeletedUids ) ); + + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + CArrayFixFlat* folderuidarr; + CNSmlDataItemUidSet* tempdeleteuids; + TSmlDbItemUid uid(0); + + folderuidarr = new CArrayFixFlat( KArrayGranularity ); + tempdeleteuids= new CNSmlDataItemUidSet(); + + // Get the list of Folder ids + for( TInt count =0; count < iDeletedUids->ItemCount(); count++ ) + { + uid = iDeletedUids->ItemAt(count); + + if( 0 == (uid % iCalOffsetVal) ) + { + TRAP_IGNORE( folderuidarr->AppendL(uid) ); + FLOG(_L("CNSmlAgendaDataStore::DoDeletedItems: Folderuid: '%d'"), uid); + } + } + + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE( inactiveuids = ActiveItemsL( *iDeletedUids ) ); + delete inactiveuids; + + if( folderuidarr->Count() > 0 ) + { + TInt index = KErrNotFound; + TInt err = KErrNone; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + // Fill the temp uid array + for (TInt folderidcount = 0; folderidcount< folderuidarr->Count(); folderidcount++) + { + tempdeleteuids->AddItem(folderuidarr->At(folderidcount)); + } + + // Filter out ID's of entries for Folder deletion + for( TInt count =0; count < iDeletedUids->ItemCount(); count++ ) + { + uid = iDeletedUids->ItemAt(count); + uid = (uid/iCalOffsetVal)*iCalOffsetVal; + err = folderuidarr->Find( uid, key, index ); + if (err == KErrNone) + { + break; + } + tempdeleteuids->AddItem(uid); + } + // Store the proper UID values + iDeletedUids->Reset(); + for( TInt count =0; count < tempdeleteuids->ItemCount(); count++ ) + { + iDeletedUids->AddItem(tempdeleteuids->ItemAt(count)); + } + } + delete tempdeleteuids; + delete folderuidarr; + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = NULL; + TRAP_IGNORE( calfilename = iOpenedStoreName->AllocL() ); + TRAP_IGNORE( syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( !syncstatus ) + { + iDeletedUids->Reset(); + } + delete calfilename; + } + // RD_MULTICAL } - _DBG_FILE("CNSmlAgendaDataStore::DoDeletedItems: END"); + + for( TInt count = 0; count < iDeletedUids->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::DoDeletedItems: list '%d'"), iDeletedUids->ItemAt(count) ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoDeletedItems: END")); return *iDeletedUids; } @@ -1067,14 +1677,14 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoSoftDeletedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoSoftDeletedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoSoftDeletedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iSoftDeletedUids->Reset(); TRAP_IGNORE( iChangeFinder->FindSoftDeletedItemsL( *iSoftDeletedUids ) ); } - _DBG_FILE("CNSmlAgendaDataStore::DoSoftDeletedItems: END"); + FLOG(_L("CNSmlAgendaDataStore::DoSoftDeletedItems: END")); return *iSoftDeletedUids; } @@ -1085,13 +1695,58 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoModifiedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoModifiedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iReplacedUids->Reset(); TRAP_IGNORE( iChangeFinder->FindChangedItemsL( *iReplacedUids ) ); + + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE( inactiveuids = ActiveItemsL( *iReplacedUids ) ); + + if( inactiveuids ) + { + TRAP_IGNORE( InternalizeCommittedUidL() ); + for( TInt count = 0; count < inactiveuids->ItemCount(); count++ ) + { + TSmlDbItemUid inactiveuid = inactiveuids->ItemAt(count); + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: inactive '%d'"), inactiveuid ); + for( TInt uidcount = 0; uidcount < iCommittedUidArr->ItemCount(); uidcount++ ) + { + if( inactiveuid == iCommittedUidArr->ItemAt( uidcount ) ) + { + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: '%d'"), inactiveuid ); + iReplacedUids->AddItem( inactiveuid ); + } + } + } + delete inactiveuids; + } + } + else + { + TBool syncstatus( EFalse ); + HBufC* calfilename = NULL; + TRAP_IGNORE( calfilename= iOpenedStoreName->AllocL() ); + TRAP_IGNORE( syncstatus = iAgendaAdapterHandler->FolderSyncStatusL( calfilename ) ); + if( !syncstatus ) + { + iReplacedUids->Reset(); + } + delete calfilename; + } + // RD_MULTICAL } - _DBG_FILE("CNSmlAgendaDataStore::DoModifiedItems: END"); + + for( TInt count = 0; count < iReplacedUids->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: list '%d'"), iReplacedUids->ItemAt(count) ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoModifiedItems: END")); return *iReplacedUids; } @@ -1102,13 +1757,19 @@ // const MSmlDataItemUidSet& CNSmlAgendaDataStore::DoMovedItems() const { - _DBG_FILE("CNSmlAgendaDataStore::DoMovedItems: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoMovedItems: BEGIN")); if ( iState == ENSmlOpenAndWaiting ) { iMovedUids->Reset(); TRAP_IGNORE( iChangeFinder->FindMovedItemsL( *iMovedUids ) ); } - _DBG_FILE("CNSmlAgendaDataStore::DoMovedItems: END"); + + for( TInt count = 0; count < iMovedUids->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::DoMovedItems: list '%d'"), iMovedUids->ItemAt(count) ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoMovedItems: END")); return *iMovedUids; } @@ -1119,7 +1780,7 @@ // void CNSmlAgendaDataStore::DoResetChangeInfoL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoResetChangeInfoL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoResetChangeInfoL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if ( iState != ENSmlOpenAndWaiting ) @@ -1134,7 +1795,7 @@ RegisterSnapshotL(); } User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoResetChangeInfoL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoResetChangeInfoL: END")); } // ----------------------------------------------------------------------------- @@ -1145,7 +1806,7 @@ void CNSmlAgendaDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, const MSmlDataItemUidSet& aItems ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitChangeInfoL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitChangeInfoL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if ( iState != ENSmlOpenAndWaiting ) @@ -1154,8 +1815,28 @@ return; } iChangeFinder->CommitChangesL( aItems ); + + // Save the UIDs to the list + iCommittedUidArr->Reset(); + for ( TInt count = 0; count < aItems.ItemCount(); count++ ) + { + iCommittedUidArr->AddItem( aItems.ItemAt( count ) ); + } + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE( inactiveuids = ActiveItemsL( *iCommittedUidArr ) ); + delete inactiveuids; + + // Print the iCommittedUidArr array + FLOG(_L("CNSmlAgendaAdapter::DoCommitChangeInfoL(): CommittedUidArr")); + for( TInt count = 0; count < iCommittedUidArr->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::iCommittedUidArr: list '%d'"), iCommittedUidArr->ItemAt(count) ); + } + + // Store the array in the stream + ExternalizeCommittedUidL(); User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitChangeInfoL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitChangeInfoL: END")); } // ----------------------------------------------------------------------------- @@ -1165,7 +1846,7 @@ // void CNSmlAgendaDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitChangeInfoL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitChangeInfoL: BEGIN")); iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if ( iState != ENSmlOpenAndWaiting ) @@ -1174,8 +1855,17 @@ return; } iChangeFinder->CommitChangesL(); + // Print the iInterCommittedUidArr array + FLOG(_L("CNSmlAgendaAdapter::DoCommitChangeInfoL() Without Param: CommittedUidArr")); + for( TInt count = 0; count < iCommittedUidArr->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::iCommittedUidArr: list '%d'"), iCommittedUidArr->ItemAt(count) ); + } + + // Store the array in the stream + ExternalizeCommittedUidL(); User::RequestComplete( iCallerStatus, KErrNone ); - _DBG_FILE("CNSmlAgendaDataStore::DoCommitChangeInfoL: END"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitChangeInfoL: END")); } // ----------------------------------------------------------------------------- @@ -1185,50 +1875,82 @@ // void CNSmlAgendaDataStore::RegisterSnapshotL() { - _DBG_FILE("CNSmlAgendaAdapter::RegisterSnapshotL(): begin"); + FLOG(_L("CNSmlAgendaAdapter::RegisterSnapshotL(): begin")); CArrayFixSeg* snapshot = new ( ELeave ) CArrayFixSeg( 64 ); CleanupStack::PushL( snapshot ); + RArray uidArray; + CleanupClosePushL( uidArray ); - // First find all entries ... - RPointerArray array; - CleanupRPtrArrayPushL(array); - - TCalTime startDate; - startDate.SetTimeLocalL(TDateTime(1900, EJanuary, 1, 0, 0, 0, 0)); - TCalTime endDate; - endDate.SetTimeLocalL(TDateTime(2100, EJanuary, 30, 0, 0, 0, 0)); - CalCommon::TCalTimeRange timeRange(startDate, endDate); - - iInstanceView->FindInstanceL(array, - CalCommon::EIncludeAppts| - CalCommon::EIncludeReminder| - CalCommon::EIncludeEvents| - CalCommon::EIncludeAnnivs| - CalCommon::EIncludeCompletedTodos| - CalCommon::EIncludeIncompletedTodos| - CalCommon::EIncludeRptsNextInstanceOnly, - timeRange); - TInt i = 0; - - while (i < array.Count()) + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + // First find all entries ... + iAgendaAdapterHandler->SynchronizableCalendarIdsL( iCalOffsetArr ); + // Populate the Entry ID's associated with the CalFile + SynchronizableCalEntryIdsL( uidArray ); + } + else + { + HBufC* calfilename = iOpenedStoreName->AllocL(); + CNSmlAgendaDataStoreUtil* agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + agendautil->InitializeCalAPIsL( calfilename ); + CleanupStack::Pop(agendautil); + } + // First find all entries ... + TCalTime zeroTime; + zeroTime.SetTimeUtcL( Time::NullTTime() ); + agendautil->iEntryView->GetIdsModifiedSinceDateL( zeroTime, uidArray ); + delete agendautil; + delete calfilename; + } + // RD_MULTICAL + + // ... and then create snapshot items + for ( TInt i = 0; i < uidArray.Count(); i++ ) + { + TNSmlSnapshotItem newItem = CreateSnapshotItemL( uidArray[i] ); + if ( newItem.ItemId() != 0 ) + { + snapshot->InsertIsqL( newItem, iKey ); + } + } + + CleanupStack::PopAndDestroy( &uidArray ); + + for ( TInt i = 0; i < snapshot->Count(); i++ ) { - TNSmlSnapshotItem newItem = CreateSnapshotItemL( array[i]->Entry().LocalUidL() ); - if ( newItem.ItemId() != 0 ) - { - snapshot->InsertIsqL( newItem, iKey ); - } - i++; + TNSmlSnapshotItem item = snapshot->At(i); + FLOG(_L("CNSmlAgendaAdapter::RegisterSnapshotL(): id: '%d'"), item.ItemId()); } - CleanupStack::PopAndDestroy(&array); iChangeFinder->SetNewSnapshot( snapshot ); + // Save the UIDs to the list + iCommittedUidArr->Reset(); + for ( TInt count = 0; count < snapshot->Count(); count++ ) + { + iCommittedUidArr->AddItem( snapshot->At( count ).ItemId() ); + } + CNSmlDataItemUidSet* inactiveuids = NULL; + TRAP_IGNORE( inactiveuids = ActiveItemsL( *iCommittedUidArr ) ); + delete inactiveuids; + // Print the iCommittedUidArr array + FLOG(_L("CNSmlAgendaAdapter::RegisterSnapshotL(): CommittedUidArr")); + for( TInt count = 0; count < iCommittedUidArr->ItemCount(); count++ ) + { + FLOG(_L("CNSmlAgendaDataStore::RegisterSnapshotL: list '%d'"), iCommittedUidArr->ItemAt(count) ); + } + // iChangeFinder takes ownership of items CleanupStack::Pop( snapshot ); + iSnapshotRegistered = ETrue; - _DBG_FILE("CNSmlAgendaAdapter::RegisterSnapshotL(): end"); + FLOG(_L("CNSmlAgendaAdapter::RegisterSnapshotL(): end")); } // ----------------------------------------------------------------------------- @@ -1238,25 +1960,85 @@ TNSmlSnapshotItem CNSmlAgendaDataStore::CreateSnapshotItemL( const TCalLocalUid& aUid ) { + FLOG(_L("CNSmlAgendaAdapter::CreateSnapshotItemL(): Begin")); + TNSmlSnapshotItem item( 0 ); - CCalEntry* entry = iEntryView->FetchL( aUid ); - CleanupStack::PushL( entry ); - - if( entry ) - { - CCalEntry::TReplicationStatus replicationStatus = - entry->ReplicationStatusL(); - if ( CanBeSynchronized( replicationStatus ) ) - { - TUint intUid = entry->LocalUidL(); - item.SetItemId( intUid ); - item.SetLastChangedDate( - entry->LastModifiedDateL().TimeUtcL() ); - item.SetSoftDelete( EFalse ); - } - } - - CleanupStack::PopAndDestroy( entry ); // entry + DataMimeType( aUid ); + + switch( iDataMimeType ) + { + case ENSmlFolder: + { + item = iAgendaAdapterHandler->CreateFolderSnapShotItemL( aUid ); + } + break; + case ENSmlCalendar: + { + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + TCalLocalUid parentid(NULL); + TCalLocalUid entryid(aUid); + TInt err( KErrNone ); + + if( iIsHierarchicalSyncSupported ) + { + TRAP( err, GetCalendarEntryIdL( parentid, entryid )); + if ( err ) + { + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL:Parent Id is not Valid one")); + return item; + } + //Get the Folder Information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(parentid) ); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL:Invalid CalendarInfo")); + return item; + } + + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL:Parent Id: '%d'"), parentid); + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL:Entry Id: '%d'"), entryid); + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, entryid )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::CreateSnapshotItemL: entry is not valid")); + delete agendautil; + delete calfilename; + return item; + } + + CCalEntry::TReplicationStatus replicationStatus = + agendautil->iEntry->ReplicationStatusL(); + if ( CanBeSynchronized( replicationStatus ) ) + { + TUint intUid = agendautil->iEntry->LocalUidL() + parentid; + item.SetItemId( intUid ); + item.SetLastChangedDate( + agendautil->iEntry->LastModifiedDateL().TimeUtcL() ); + item.SetSoftDelete( EFalse ); + } + delete agendautil; + delete calfilename; + } + break; + default: + break; + } + FLOG(_L("CNSmlAgendaAdapter::CreateSnapshotItemL(): end")); + return item; } @@ -1267,9 +2049,10 @@ // CDesCArray* CNSmlAgendaDataStore::DoListAgendaFilesLC() const { - CDesCArray* array = iVCalSession->ListCalFilesL(); - CleanupStack::PushL( array ); - return array; + CDesCArray* array = new (ELeave) CDesCArrayFlat(1); + array->AppendL(*iDefaultStoreFileName); + CleanupStack::PushL( array ); + return array; } // ----------------------------------------------------------------------------- @@ -1279,11 +2062,11 @@ // const TDesC& CNSmlAgendaDataStore::DoGetDefaultFileNameL() const { - if ( !iDefaultStoreName ) + if ( !iDefaultStoreFileName ) { User::Leave( KErrGeneral ); } - return *iDefaultStoreName; + return *iDefaultStoreFileName; } // ----------------------------------------------------------------------------- @@ -1306,337 +2089,556 @@ // CSmlDataStoreFormat* CNSmlAgendaDataStore::DoOwnStoreFormatL() { - _DBG_FILE("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): BEGIN"); - TFileName fileName; - TParse parse; + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): BEGIN")); + + AgendaAdapterHandlerL(); - // Check correct Data Sync protocol - TInt value( EDataSyncNotRunning ); - TInt error = RProperty::Get( KPSUidDataSynchronizationInternalKeys, - KDataSyncStatus, - value ); - if ( error == KErrNone && - value == EDataSyncRunning ) + if( NULL == iAgendaAdapterHandler ) { - parse.Set( KNSmlDSAgendaDataStoreRsc_1_1_2, - &KDC_RESOURCE_FILES_DIR, NULL ); - } - else // error or protocol version 1.2 - { - parse.Set( KNSmlDSAgendaDataStoreRsc_1_2, - &KDC_RESOURCE_FILES_DIR, NULL ); + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): Invalid AgendaAdapterHandler Error END")); + User::Leave( KErrGeneral ); } - fileName = parse.FullName(); - RResourceFile resourceFile; - BaflUtils::NearestLanguageFile( iRfs, fileName ); + TFileName fileName; + TParse* parse = NULL; + parse = new(ELeave) TParse(); + CleanupStack::PushL( parse ); + + // Check correct Data Sync protocol + TInt value( EDataSyncNotRunning ); + TInt error = RProperty::Get( KPSUidDataSynchronizationInternalKeys, + KDataSyncStatus, + value ); + + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): SyncStatus: '%d'"), KDataSyncStatus); + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): value: '%d'"), value); + + if ( error == KErrNone && + value == EDataSyncRunning ) + { + parse->Set( KNSmlDSAgendaDataStoreRsc_1_1_2, + &KDC_RESOURCE_FILES_DIR, NULL ); + } + else + { + FLOG(_L("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): Invoking AdapterHandler Implementation")); + CleanupStack::PopAndDestroy( parse ); + return iAgendaAdapterHandler->StoreFormatL( iStringPool ); + } + + fileName = parse->FullName(); + RResourceFile resourceFile; + BaflUtils::NearestLanguageFile( iRfs, fileName ); - TRAPD( leavecode, resourceFile.OpenL( iRfs,fileName ) ); - if ( leavecode != 0 ) - { - CleanupStack::PopAndDestroy(); // parse - _DBG_FILE("CNSmlAgendaDataProvider::DoStoreFormatL(): Resource.OpenL has problem"); - User::Leave( leavecode ); - } - CleanupClosePushL( resourceFile ); - HBufC8* profileRes = resourceFile.AllocReadLC( NSML_AGENDA_DATA_STORE ); - TResourceReader reader; - reader.SetBuffer( profileRes ); + TRAPD( leavecode, resourceFile.OpenL( iRfs,fileName ) ); + if ( leavecode != 0 ) + { + CleanupStack::PopAndDestroy(); // parse + FLOG(_L("CNSmlAgendaDataStore:::StoreFormatL(): Error END")); + User::Leave( leavecode ); + } + + CleanupClosePushL( resourceFile ); + HBufC8* buffer = resourceFile.AllocReadLC( NSML_AGENDA_DATA_STORE ); + TResourceReader reader; + reader.SetBuffer( buffer ); - CSmlDataStoreFormat* dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, - reader ); - CleanupStack::Pop(); - CleanupStack::PopAndDestroy( 2 ); // resourceFile, profileRes - _DBG_FILE("CNSmlAgendaDataStore:::DoOwnStoreFormatL(): END"); - return dsFormat; + CSmlDataStoreFormat* dsFormat = NULL; + dsFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); + CleanupStack::Pop(); // dsFormat + CleanupStack::PopAndDestroy( 3 ); // buffer, resourceFile, parse + + FLOG(_L("CNSmlAgendaDataStore::DoOwnStoreFormatL: END")); + return dsFormat; } // ----------------------------------------------------------------------------- -// CNSmlAgendaDataStore::DoCommitCreateItemL -// Commit item data to database when adding item. +// CNSmlAgendaDataStore::DoCommitCreateCalItemL +// Commit Calendar item data to database when adding item. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoCommitCreateItemL() +void CNSmlAgendaDataStore::DoCommitCreateCalItemL() { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: BEGIN")); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: Parentid: '%d'"), iParentItemId); iState = ENSmlOpenAndWaiting; // iState set to closed to handle leave CCalEntry::TReplicationStatus replicationStatus; - + TInt err(KErrNone); + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; RBufReadStream readStream; readStream.Open( *iItemData ); readStream.PushL(); RPointerArray rdArray; CleanupStack::PushL( PtrArrCleanupItemRArr ( CCalEntry, &rdArray ) ); - if ( iRXEntryType == ENSmlICal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: ImportICalendarL"); - iImporter->ImportICalendarL( readStream, rdArray ); - } + + if( iIsHierarchicalSyncSupported ) + { + //Get the Folder Information + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(iParentItemId) ); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL:Invalid CalendarInfo")); + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + iOrphanEvent = EFalse; + User::Leave( KErrNotFound ); + } + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename )); + CleanupStack::Pop(agendautil); + } + + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL:Invalid CalendarInfo")); + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + delete calfilename; + iOrphanEvent = EFalse; + User::Leave( KErrNotFound ); + } + + if ( iRXEntryType == ENSmlICal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: ImportICalendarL")); + agendautil->iImporter->ImportICalendarL( readStream, rdArray ); + } else if ( iRXEntryType == ENSmlVCal ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: ImportVCalendarL"); - iImporter->ImportVCalendarL( readStream, rdArray ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: ImportVCalendarL")); + agendautil->iImporter->ImportVCalendarL( readStream, rdArray ); } else { CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL - \ - KErrNotSupported: END"); + delete agendautil; + delete calfilename; + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL - \ + KErrNotSupported: END")); + iOrphanEvent = EFalse; User::Leave( KErrNotSupported ); } // If rdArray is empty or there is multiple items then return error - // Multiple items are not supported - if ( rdArray.Count() != 1 ) - { - CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL - \ - Multiple items are not supported: END"); + // Multiple items are not supported + if ( rdArray.Count() != 1 ) + { + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + delete agendautil; + delete calfilename; + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL - \ + Multiple items are not supported: END")); + iOrphanEvent = EFalse; User::Leave( KErrNotSupported ); - } - - TInt err( KErrNone ); - - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: before StoreL"); - TRAP( err, iInterimUtils->StoreL( *iEntryView, *rdArray[0], ETrue ) ); - DBG_ARGS(_S("CNSmlAgendaDataStore::DoCommitCreateItemL: after StoreL '%d'"), err ); + } + + err = KErrNone; + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: before StoreL")); + TRAP( err, iInterimUtils->StoreL( *agendautil->iEntryView, *rdArray[0], ETrue ) ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: after StoreL '%d'"), err ); if ( err ) { CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL - \ - Error at storing item to database: END"); + delete agendautil; + delete calfilename; + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL - \ + Error at storing item to database: END")); + iOrphanEvent = EFalse; User::Leave( KErrGeneral ); } - *iAddItemId = rdArray[0]->LocalUidL(); + *iAddItemId = rdArray[0]->LocalUidL(); + CCalEntry* newEntry = agendautil->iEntryView->FetchL( *iAddItemId ); - CCalEntry* newEntry = iEntryView->FetchL( *iAddItemId ); + // RD_MULTICAL + if( iIsHierarchicalSyncSupported ) + { + *iAddItemId = *iAddItemId + iParentItemId; + } + // RD_MULTICAL if( newEntry ) - { - CleanupStack::PushL( newEntry ); + { + CleanupStack::PushL( newEntry ); - replicationStatus = newEntry->ReplicationStatusL(); - - if ( CanBeSynchronized( replicationStatus ) ) - { - if ( iChangeFinder ) - { - TNSmlSnapshotItem item( *iAddItemId ); - item.SetLastChangedDate( - newEntry->LastModifiedDateL().TimeUtcL() ); - item.SetSoftDelete( EFalse ); - TRAPD( changeFinderError, iChangeFinder->ItemAddedL( item ) ); - if ( changeFinderError == KErrAlreadyExists ) - { - iChangeFinder->ItemUpdatedL( item ); - } - else - { - User::LeaveIfError( changeFinderError ); - } - } - } - CleanupStack::PopAndDestroy();// newEntry, - } - CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitCreateItemL: END"); + replicationStatus = newEntry->ReplicationStatusL(); + + if ( CanBeSynchronized( replicationStatus ) ) + { + if ( iChangeFinder ) + { + TNSmlSnapshotItem item( *iAddItemId ); + item.SetLastChangedDate( + newEntry->LastModifiedDateL().TimeUtcL() ); + item.SetSoftDelete( EFalse ); + TRAPD( changeFinderError, iChangeFinder->ItemAddedL( item ) ); + if ( changeFinderError == KErrAlreadyExists ) + { + iChangeFinder->ItemUpdatedL( item ); + } + else + { + User::LeaveIfError( changeFinderError ); + } + } + } + CleanupStack::PopAndDestroy();// newEntry, + } + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + delete agendautil; + delete calfilename; + + if( iOrphanEvent ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: Exiting with invalidparent")); + // Set the Orphan Event ID to the cenrep + CRepository* rep = CRepository::NewLC(KRepositoryId); + TInt err = rep->Set( KNsmlDsOrphanEvent, *iAddItemId ); + DBG_ARGS(_S("set the cenrep %d "), err); + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(rep); + iOrphanEvent = EFalse; + User::Leave( KErrPathNotFound ); + } + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateCalItemL: END")); } // ----------------------------------------------------------------------------- -// CNSmlAgendaDataStore::DoCommitReplaceItemL -// Commit item data to database when replacing item. +// CNSmlAgendaDataStore::DoCommitReplaceCalItemL +// Commit Calendar item data to database when replacing item. // ----------------------------------------------------------------------------- // -void CNSmlAgendaDataStore::DoCommitReplaceItemL() +void CNSmlAgendaDataStore::DoCommitReplaceCalItemL() { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: BEGIN"); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: BEGIN")); iState = ENSmlOpenAndWaiting; // iState set to closed to handle leave CBufFlat* oldItem = CBufFlat::NewL( KNSmlItemDataExpandSize ); CleanupStack::PushL( oldItem ); RBufWriteStream writeStream( *oldItem ); writeStream.PushL(); - - CCalEntry* entry = NULL; - TInt error( KErrNone ); - TRAP( error, entry = iEntryView->FetchL( iReplaceItemId ) ); - if ( error || !entry ) - { - CleanupStack::PopAndDestroy( 2 ); // writeStream, oldItem - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - Error in fetching the item: END"); - User::Leave( KErrGeneral ); - } - CleanupStack::PushL( entry ); + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + TInt err( KErrNone ); - // Export item from database depending on transmitted item entry type - if ( iTXEntryType == ENSmlVCal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: ExportVCalL"); - iExporter->ExportVCalL( *entry, writeStream ); - } + + if( iIsHierarchicalSyncSupported ) + { + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(iParentItemId) ); + } + else + { + calfilename = iOpenedStoreName->AllocL(); + } + + if( err != KErrNone || NULL == calfilename ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL:Invalid CalendarInfo")); + CleanupStack::PopAndDestroy( 2 ); // olditem, writeStream + User::Leave( KErrNotFound ); + } + + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: entry id: '%d'"), iReplaceItemId); + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename, iReplaceItemId )); + CleanupStack::Pop(agendautil); + } + + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: entry is not valid")); + CleanupStack::PopAndDestroy( 2 ); // olditem, writeStream + delete agendautil; + delete calfilename; + User::Leave( KErrGeneral ); + } + + // Export item from database depending on transmitted item entry type + if ( iTXEntryType == ENSmlVCal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ExportVCalL")); + agendautil->iExporter->ExportVCalL( *agendautil->iEntry, writeStream ); + } #ifdef __NSML_USE_ICAL_FEATURE - else if ( iTXEntryType == ENSmlICal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: ExportICalL"); - iExporter->ExportICalL( *entry, writeStream ); - } + else if ( iTXEntryType == ENSmlICal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ExportICalL")); + agendautil->iExporter->ExportICalL( *agendautil->iEntry, writeStream ); + } #endif // __NSML_USE_ICAL_FEATURE - else + else { - CleanupStack::PopAndDestroy( 2 ); // entry, writeStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - KErrNotSupported: END"); + CleanupStack::PopAndDestroy( 2 ); // olditem, writeStream + delete agendautil; + delete calfilename; + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL - \ + KErrNotSupported: END")); User::Leave( KErrNotSupported ); } - writeStream.CommitL(); - oldItem->Compress(); - - CleanupStack::PopAndDestroy( 2 ); // entry, writeStream - - // Get original UID, geoId and Recurrence-ID properties - HBufC8* uid = NULL; - HBufC8* recurrenceId = NULL; - HBufC8* xRecurrenceId = NULL; - HBufC8* geoId = NULL; - GetPropertiesFromDataL( oldItem, uid, KVersitTokenUID() ); - GetPropertiesFromDataL( oldItem, recurrenceId, KNSmlVersitTokenRecurrenceID() ); - GetPropertiesFromDataL( oldItem, xRecurrenceId, KNSmlVersitTokenXRecurrenceID() ); - GetPropertiesFromDataL( oldItem, geoId, KNSmlVersitTokenGeoID() ); - CleanupStack::PushL( uid ); - CleanupStack::PushL( recurrenceId ); - CleanupStack::PushL( xRecurrenceId ); - CleanupStack::PushL( geoId ); + writeStream.CommitL(); + oldItem->Compress(); -#ifdef __NSML_MORE_DEBUG_FOR_ITEMS__ - - DBG_DUMP( ( void* )oldItem->Ptr( 0 ).Ptr(), oldItem->Size(), - _S8( "Old item from database:" ) ); - -#endif // __NSML_MORE_DEBUG_FOR_ITEMS__ + CleanupStack::PopAndDestroy( 1 ); + + // Get original UID, geoId and Recurrence-ID properties + HBufC8* uid = NULL; + HBufC8* recurrenceId = NULL; + HBufC8* xRecurrenceId = NULL; + HBufC8* geoId = NULL; + GetPropertiesFromDataL( oldItem, uid, KVersitTokenUID() ); + GetPropertiesFromDataL( oldItem, recurrenceId, KNSmlVersitTokenRecurrenceID() ); + GetPropertiesFromDataL( oldItem, xRecurrenceId, KNSmlVersitTokenXRecurrenceID() ); + GetPropertiesFromDataL( oldItem, geoId, KNSmlVersitTokenGeoID() ); + CleanupStack::PushL( uid ); + CleanupStack::PushL( recurrenceId ); + CleanupStack::PushL( xRecurrenceId ); + CleanupStack::PushL( geoId ); - if ( iDataMod->NeedsMerge() ) - { - // Merge data - iDataMod->MergeRxL( *iItemData, *oldItem ); - } - - // Add original UID and Recurrence-ID to merged data - // This first removes UID and Recurrence-ID from merged data - // and then adds original ones - if ( uid ) - { - SetPropertiesToDataL( uid, KVersitTokenUID() ); - } + if ( iDataMod->NeedsMerge() ) + { + // Merge data + iDataMod->MergeRxL( *iItemData, *oldItem ); + } + + // Add original UID and Recurrence-ID to merged data + // This first removes UID and Recurrence-ID from merged data + // and then adds original ones + if ( uid ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: SetPropertiesToDataL :uid")); + SetPropertiesToDataL( uid, KVersitTokenUID() ); + } else { + CleanupStack::PopAndDestroy( 5 ); // xRecurrenceId, recurrenceId, + // uid, oldItem, geoId + delete agendautil; + delete calfilename; + User::Leave( KErrNotSupported ); } - if ( recurrenceId ) - { - SetPropertiesToDataL( recurrenceId, KNSmlVersitTokenRecurrenceID() ); - } - if ( xRecurrenceId ) - { - SetPropertiesToDataL( xRecurrenceId, KNSmlVersitTokenXRecurrenceID() ); - } - if ( geoId ) - { - SetPropertiesToDataL( geoId, KNSmlVersitTokenGeoID() ); - } - -#ifdef __NSML_MORE_DEBUG_FOR_ITEMS__ - - DBG_DUMP( ( void* )iItemData->Ptr( 0 ).Ptr(), iItemData->Size(), - _S8( "New item to database:" ) ); + if ( recurrenceId ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: SetPropertiesToDataL :recurrenceId")); + SetPropertiesToDataL( recurrenceId, KNSmlVersitTokenRecurrenceID() ); + } + if ( xRecurrenceId ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: SetPropertiesToDataL :xRecurrenceId")); + SetPropertiesToDataL( xRecurrenceId, KNSmlVersitTokenXRecurrenceID() ); + } + if ( geoId ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: SetPropertiesToDataL :geoId")); + SetPropertiesToDataL( geoId, KNSmlVersitTokenGeoID() ); + } + + CleanupStack::PopAndDestroy( 5 ); // xRecurrenceId, recurrenceId, + // uid, oldItem, geoId + + // Replace item to database + RBufReadStream readStream; + readStream.Open( *iItemData ); + readStream.PushL(); -#endif // __NSML_MORE_DEBUG_FOR_ITEMS__ - - CleanupStack::PopAndDestroy( 5 ); // xRecurrenceId, recurrenceId, - // uid, oldItem, geoId - - // Replace item to database - RBufReadStream readStream; - readStream.Open( *iItemData ); - readStream.PushL(); + RPointerArray rdArray; + CleanupStack::PushL( PtrArrCleanupItemRArr ( CCalEntry, &rdArray ) ); - RPointerArray rdArray; - CleanupStack::PushL( PtrArrCleanupItemRArr ( CCalEntry, &rdArray ) ); - - // Import item to database depending on received item entry type - if ( iRXEntryType == ENSmlVCal ) + // Import item to database depending on received item entry type + if ( iRXEntryType == ENSmlVCal ) { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: ImportVCalendarL"); - iImporter->ImportVCalendarL( readStream, rdArray ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ImportVCalendarL")); + TRAP( err, agendautil->iImporter->ImportVCalendarL( readStream, rdArray )); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ImportVCalendarL error: '%d'"), err); + if( err != KErrNone) + { + User::Leave(err); + } } #ifdef __NSML_USE_ICAL_FEATURE - else if ( iRXEntryType == ENSmlICal ) - { - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: ImportICalendarL"); - iImporter->ImportICalendarL( readStream, rdArray ); - } + else if ( iRXEntryType == ENSmlICal ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: ImportICalendarL")); + agendautil->iImporter->ImportICalendarL( readStream, rdArray ); + } #endif // __NSML_USE_ICAL_FEATURE else { CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - KErrNotSupported: END"); + delete agendautil; + delete calfilename; + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ + KErrNotSupported: END")); User::Leave( KErrNotSupported ); } // If rdArray is empty or there is multiple items then return error - // Multiple items are not supported - if ( rdArray.Count() != 1 ) - { - CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - Multiple items are not supported: END"); + // Multiple items are not supported + if ( rdArray.Count() != 1 ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: Multiple items are not supported ")); + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + delete agendautil; + delete calfilename; + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ + Multiple items are not supported: END")); User::Leave( KErrNotSupported ); - } - - TInt err( KErrNone ); + } + + err = KErrNone; - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: before StoreL"); - TRAP( err, iInterimUtils->StoreL( *iEntryView, *rdArray[0], ETrue ) ); - DBG_ARGS(_S("CNSmlAgendaDataStore::DoCommitCreateItemL: after StoreL '%d'"), err ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: before StoreL")); + TRAP( err, iInterimUtils->StoreL( *agendautil->iEntryView, *rdArray[0], ETrue ) ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: after StoreL '%d'"), err ); + if ( err ) { CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL - \ - Error at storing item to database: END"); + delete agendautil; + delete calfilename; + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL - \ + Error at storing item to database: END")); User::Leave( KErrGeneral ); } - CCalEntry::TReplicationStatus replicationStatus; - - CCalEntry* replacedEntry = iEntryView->FetchL( iReplaceItemId ); - if( replacedEntry ) - { + CCalEntry::TReplicationStatus replicationStatus; + + CCalEntry* replacedEntry = agendautil->iEntryView->FetchL( iReplaceItemId ); + if( replacedEntry ) + { CleanupStack::PushL( replacedEntry ); - + replicationStatus = replacedEntry->ReplicationStatusL(); - - if ( CanBeSynchronized( replicationStatus ) ) - { - if ( iChangeFinder ) - { - TNSmlSnapshotItem item( iReplaceItemId ); - item.SetLastChangedDate( - replacedEntry->LastModifiedDateL().TimeUtcL()); - item.SetSoftDelete( EFalse ); - iChangeFinder->ItemUpdatedL( item ); - } - } - CleanupStack::PopAndDestroy(); // replacedEntry - } - - CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream - - _DBG_FILE("CNSmlAgendaDataStore::DoCommitReplaceItemL: END"); + + // RD_MULTICAL + if( !iIsHierarchicalSyncSupported ) + { + iParentItemId = 0; + } + // RD_MULTICAL + + if ( CanBeSynchronized( replicationStatus ) ) + { + if ( iChangeFinder ) + { + TNSmlSnapshotItem item( iReplaceItemId + iParentItemId ); + item.SetLastChangedDate( + replacedEntry->LastModifiedDateL().TimeUtcL()); + item.SetSoftDelete( EFalse ); + iChangeFinder->ItemUpdatedL( item ); + } + } + CleanupStack::PopAndDestroy(); // replacedEntry } + CleanupStack::PopAndDestroy( 2 ); // rdArray, readStream + delete agendautil; + delete calfilename; + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceCalItemL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::DoCommitCreateFolderItemL +// Commit Folder item data to database when adding item. +// ----------------------------------------------------------------------------- +// +void CNSmlAgendaDataStore::DoCommitCreateFolderItemL() + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateFolderItemL: BEGIN")); + + TInt err(KErrNone); + RBufReadStream readStream; + readStream.Open( *iItemData ); + readStream.PushL(); + + TRAP(err, *iAddItemId = iAgendaAdapterHandler->CreateFolderL( readStream )); + if( err != KErrNone ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateFolderItemL: Error in Create Folder")); + CleanupStack::PopAndDestroy( &readStream ); + User::Leave( err ); + } + + // Add snapshotitem + if ( iChangeFinder ) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateFolderItemL: item id: '%d'"), *iAddItemId ); + TNSmlSnapshotItem item( *iAddItemId ); + TTime time; + time.HomeTime(); + item.SetLastChangedDate( time ); + item.SetSoftDelete( EFalse ); + TRAPD( changeFinderError, iChangeFinder->ItemAddedL( item ) ); + if ( changeFinderError == KErrAlreadyExists ) + { + iChangeFinder->ItemUpdatedL( item ); + } + else + { + User::LeaveIfError( changeFinderError ); + } + + iCalOffsetArr->AppendL(*iAddItemId); + + } + + CleanupStack::PopAndDestroy( &readStream ); + + FLOG(_L("CNSmlAgendaDataStore::DoCommitCreateFolderItemL: END")); + } + + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::DoCommitReplaceFolderItemL +// Commit Folder item data to database when replacing item. +// ----------------------------------------------------------------------------- +// +void CNSmlAgendaDataStore::DoCommitReplaceFolderItemL() + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceFolderItemL: BEGIN")); + + TBool syncstatus(ETrue); + TInt err(KErrNone); + RBufReadStream readStream; + readStream.Open( *iItemData ); + readStream.PushL(); + + TRAP(err, iAgendaAdapterHandler->ReplaceFolderL( iReplaceItemId, readStream, syncstatus )); + if(err != KErrNone) + { + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceFolderItemL: Error while replacing Folder")); + CleanupStack::PopAndDestroy( &readStream ); + User::Leave(err); + } + + // Update snapshotitem + if ( iChangeFinder && syncstatus ) + { + TNSmlSnapshotItem item( iReplaceItemId ); + TTime time; + time.HomeTime(); + item.SetLastChangedDate(time); + item.SetSoftDelete( EFalse ); + iChangeFinder->ItemUpdatedL( item ); + } + + CleanupStack::PopAndDestroy( &readStream ); + FLOG(_L("CNSmlAgendaDataStore::DoCommitReplaceFolderItemL: END")); + } // ----------------------------------------------------------------------------- // CNSmlAgendaDataStore::GetPropertiesFromDataL // Gets property from old item. @@ -1646,7 +2648,7 @@ HBufC8*& aValue, const TDesC8& aProperty ) { - _DBG_FILE("CNSmlAgendaDataStore::GetPropertiesFromDataL(): begin"); + FLOG(_L("CNSmlAgendaDataStore::GetPropertiesFromDataL(): begin")); // Gemerate property that is searched (Linebreak + property + tokencolon) HBufC8* startBuffer = HBufC8::NewLC( KVersitTokenCRLF().Size() + @@ -1692,7 +2694,7 @@ } CleanupStack::PopAndDestroy( startBuffer ); // startBuffer - _DBG_FILE("CNSmlAgendaDataStore::GetPropertiesFromDataL(): end"); + FLOG(_L("CNSmlAgendaDataStore::GetPropertiesFromDataL(): end")); } // ----------------------------------------------------------------------------- @@ -1703,7 +2705,7 @@ void CNSmlAgendaDataStore::SetPropertiesToDataL( HBufC8*& aValue, const TDesC8& aProperty ) { - _DBG_FILE("CNSmlAgendaDataStore::SetPropertiesToDataL(): begin"); + FLOG(_L("CNSmlAgendaDataStore::SetPropertiesToDataL(): begin")); // Gemerate property that is searched (Linebreak + property + tokencolon) HBufC8* startBuffer = HBufC8::NewLC( KVersitTokenCRLF().Size() + @@ -1787,7 +2789,769 @@ CleanupStack::PopAndDestroy( 3 ); // endVTodo, endVEvent, startBuffer - _DBG_FILE("CNSmlAgendaDataStore::SetPropertiesToDataL(): end"); + FLOG(_L("CNSmlAgendaDataStore::SetPropertiesToDataL(): end")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::GetCalendarEntryIdL +// Method to retrieve the Id of the Calendar Entry +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::GetCalendarEntryIdL( TCalLocalUid& aParentId, TCalLocalUid& aCalId ) const + { + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: BEGIN")); + + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: parentid: '%d'"), aParentId); + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: aCalId: '%d'"), aCalId); + + TInt uidcalentry = aCalId; + + if( uidcalentry < iCalOffsetVal ) + { + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: Invalid CalendarId: '%d'"), aCalId); + User::Leave( KErrGeneral ); + } + else if( uidcalentry == iCalOffsetVal || + 0 == (uidcalentry % iCalOffsetVal) ) + { + aParentId = uidcalentry; + } + else + { + while( uidcalentry > iCalOffsetVal ) + { + uidcalentry = uidcalentry - iCalOffsetVal; + } + aParentId = aCalId - uidcalentry; + aCalId = uidcalentry; + } + + TInt err(KErrNone); + TInt index = KErrNotFound; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + err = iCalOffsetArr->Find( aParentId, key, index ); + + if( err != KErrNone ) + { + User::Leave(err); + } + FLOG(_L("CNSmlAgendaDataStore::GetCalendarEntryIdL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::DataMimeType +// Method to determine the MIME type, provided the UID +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::DataMimeType( TSmlDbItemUid aUid ) + { + FLOG(_L("CNSmlAgendaDataStore::DataMimeType: BEGIN")); + + FLOG(_L("CNSmlAgendaDataStore::DataMimeType: LUID '%d'"), aUid ); + + if( iIsHierarchicalSyncSupported ) + { + // Find a match with the list of Offset values available + TInt index = KErrNotFound; + TInt err = KErrNone; + TKeyArrayFix key( 0, ECmpTInt ); // Find key for Ids. + + err = iCalOffsetArr->Find( aUid, key, index ); + + // Determine the Data Mime Type + if( err == KErrNone ) + { + iDataMimeType = ENSmlFolder; + } + else + { + iDataMimeType = ENSmlCalendar; + } + } + else + { + iDataMimeType = ENSmlCalendar; + } + + FLOG(_L("CNSmlAgendaDataStore::DataMimeType: END, DataMimeType '%d' "), iDataMimeType); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL +// Get All the AdapterHandler instance +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL() + { + FLOG(_L("CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL BEGIN")); + + RImplInfoPtrArray adapterInfoArray; + CNSmlAgendaAdapterHandler* adapterInstance(NULL); + + REComSession::ListImplementationsL( KAgendaAdapterHandlerInterfaceUid, adapterInfoArray ); + TInt adapterCount = adapterInfoArray.Count(); + FLOG(_L("adaptercount:'%d'"),adapterCount); + CImplementationInformation* adapterInfo = NULL; + + for (TInt adapterIndex = 0 ; adapterIndex < adapterCount; adapterIndex++) + { + adapterInfo = adapterInfoArray[ adapterIndex ]; + TUid adapterUid = { adapterInfo->ImplementationUid().iUid }; + FLOG(_L("CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL before newl")); + adapterInstance = CNSmlAgendaAdapterHandler::NewL(adapterUid); + FLOG(_L("CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL after newl")); + if( adapterInstance ) + { + adapterInstance->iOpaqueData = adapterInfo->OpaqueData().Alloc(); + iAgendaPluginAdapters.AppendL( adapterInstance ); + } + } + adapterInfoArray.ResetAndDestroy(); + FLOG(_L("CNSmlAgendaDataStore::ListAllAgendaPluginAdaptersL END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::AgendaAdapterHandlerL +// Get the AdapterHandler instance +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::AgendaAdapterHandlerL() + { + FLOG(_L("CNSmlAgendaDataStore::AgendaAdapterHandlerL BEGIN")); + + // Get the Opaque data / server id from the cenrep + TBuf serverid; + HBufC8* opaquedata; + CRepository* rep = CRepository::NewLC( KNsmlDsSessionInfoKey ); + TInt err = rep->Get(EDSSessionServerId, serverid ); + FLOG(_L("CNSmlAgendaDataStore:::AgendaAdapterHandlerL():serverid '%S'"), &serverid ); + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(rep); + + if( 0 == serverid.Length() ) + { + FLOG(_L("CNSmlAgendaDataStore:::AgendaAdapterHandlerL():serverid length is zero")); + opaquedata = KNSmlDefaultOpaqueData().AllocL(); + } + else + { + opaquedata = HBufC8::NewL( serverid.Length() ); + TPtr8 name( opaquedata->Des() ); + CnvUtfConverter::ConvertFromUnicodeToUtf8(name , serverid ); + } + iAgendaAdapterHandler = NULL; + for( TInt adaptercount = 0; adaptercount < iAgendaPluginAdapters.Count(); adaptercount++ ) + { + if( 0 == opaquedata->Compare(iAgendaPluginAdapters[adaptercount]->iOpaqueData->Des()) ) + { + iAgendaAdapterHandler = iAgendaPluginAdapters[adaptercount]; + break; + } + } + + delete opaquedata; + + if( NULL == iAgendaAdapterHandler ) + { + opaquedata = KNSmlDefaultOpaqueData().AllocL(); + for( TInt adaptercount = 0; adaptercount < iAgendaPluginAdapters.Count(); adaptercount++ ) + { + if( 0 == opaquedata->Compare(iAgendaPluginAdapters[adaptercount]->iOpaqueData->Des()) ) + { + iAgendaAdapterHandler = iAgendaPluginAdapters[adaptercount]; + break; + } + } + delete opaquedata; + } + + FLOG(_L("CNSmlAgendaDataStore::AgendaAdapterHandlerL END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::SynchronizableCalEntryIdsL +// Retrieve the CalendarFile and associated entries ID +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::SynchronizableCalEntryIdsL( RArray& aUidArray ) + { + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL BEGIN")); + + TInt err(KErrNone); + + for( TInt calfilecount = 0; calfilecount < iCalOffsetArr->Count(); calfilecount++ ) + { + TUint calfileid = iCalOffsetArr->At(calfilecount); + CNSmlAgendaDataStoreUtil* agendautil = NULL; + HBufC* calfilename = NULL; + + TRAP(err, calfilename = iAgendaAdapterHandler->FolderNameL(calfileid) ); + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL calfilename: '%S'"), calfilename); + + if( err!= KErrNone || NULL == calfilename) + { + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL Invalid FileName")); + User::Leave(KErrGeneral); + } + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL Initialize")); + + agendautil = CNSmlAgendaDataStoreUtil::NewL(); + if( agendautil ) + { + CleanupStack::PushL(agendautil); + TRAP(err, agendautil->InitializeCalAPIsL( calfilename )); + CleanupStack::Pop(agendautil); + } + if ( err || !agendautil ) + { + FLOG(_L("CNSmlAgendaDataStore::SynchronizableCalEntryIdsL Initialization failed")); + delete calfilename; + User::Leave(KErrGeneral); + } + + TCalTime zeroTime; + RArray entryarray; + CleanupClosePushL( entryarray ); + + aUidArray.AppendL(calfileid); + + zeroTime.SetTimeUtcL( Time::NullTTime() ); + agendautil->iEntryView->GetIdsModifiedSinceDateL( zeroTime, entryarray ); + + for( TInt i=0; i serverid; + TBuf profilename; + TBool isHandlerAvailable( EFalse ); + + // Get the ServerId, ProfileId and ProfileName from the cenrep + CRepository* rep = CRepository::NewLC( KNsmlDsSessionInfoKey ); + TInt err = rep->Get( EDSSessionProfileId, profileid ); + err = rep->Get( EDSSessionProfileName, profilename ); + err = rep->Get(EDSSessionServerId, serverid ); + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(rep); + + // Reintialize the StoreName + if ( iOpenedStoreName ) + { + delete iOpenedStoreName; + iOpenedStoreName = NULL; + } + + // Find the CalendarFile having the given ProfileID + CDesCArray* calfilearr = new (ELeave) CDesCArrayFlat(1); + CleanupStack::PushL(calfilearr); + FLOG(_L("CNSmlAgendaDataStore:::OpenStoreL():Profilename '%S'"), &profilename ); + FLOG(_L("CNSmlAgendaDataStore:::OpenStoreL():serverid '%S'"), &serverid ); + + if( 0 != serverid.Length() ) + { + HBufC8* opaquedata = HBufC8::NewL( serverid.Length() ); + TPtr8 name( opaquedata->Des() ); + CnvUtfConverter::ConvertFromUnicodeToUtf8(name , serverid ); + + for( TInt adaptercount = 0; adaptercount < iAgendaPluginAdapters.Count(); adaptercount++ ) + { + if( 0 == opaquedata->Compare(iAgendaPluginAdapters[adaptercount]->iOpaqueData->Des()) ) + { + FLOG(_L("CNSmlAgendaDataStore::Handler available")); + isHandlerAvailable = ETrue; + break; + } + } + delete opaquedata; + } + + if( isHandlerAvailable ) + { + iOpenedStoreName = iDefaultStoreFileName->AllocL(); + } + else if( IsCalFileAvailableL( profileid, calfilearr ) ) + { + FLOG(_L("CNSmlAgendaDataStore::OpenStoreL Found the assoicated calfile")); + + // TODO: Yet to get clarification for enable/disable the notification + iOpenedStoreName = calfilearr->MdcaPoint(0).AllocL(); + } + else + { + FLOG(_L("CNSmlAgendaDataStore::OpenStoreL CouldNot Find the Calfile")); + + // No association found thus creating a CalendarFile + HBufC* name = profilename.AllocL(); + HBufC* calfilename = CreateCalFileL( name, profileid ); + delete name; + iOpenedStoreName = calfilename; + } + + CCalSession* calsession = CCalSession::NewL(); + CleanupStack::PushL(calsession); + TRAP( err, calsession->OpenL( iOpenedStoreName->Des() ) ); + // Disable notifications + TRAP_IGNORE( calsession->DisablePubSubNotificationsL() ); + TRAP_IGNORE( calsession->DisableChangeBroadcast() ); + // Get ID of database + calsession->FileIdL( iOpenedStoreId ); + CleanupStack::PopAndDestroy( calsession ); + + CleanupStack::PopAndDestroy(calfilearr); + FLOG(_L("CNSmlAgendaDataStore::OpenStoreL END")); } - + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::IsCalFileAvailableL +// Check existance of CalFile with the given ProfileID associativity +// ----------------------------------------------------------------------------- +TBool CNSmlAgendaDataStore::IsCalFileAvailableL( TInt aProfileId, CDesCArray* aCalFileArr ) + { + FLOG(_L("CNSmlAgendaDataStore::IsCalFileAvailable: BEGIN")); + + TBool calfilestatus(EFalse); + TBuf8 keyBuff; + CCalSession* vCalSession = NULL; + CCalSession* vCalSubSession = NULL; + + vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + + CDesCArray* calfilearr = vCalSession->ListCalFilesL(); + CleanupStack::PushL(calfilearr); + + for(TInt i = 0; i < calfilearr->Count(); i++) + { + TInt err = KErrNone; + vCalSubSession = CCalSession::NewL(*vCalSession); + CleanupStack::PushL(vCalSubSession); + vCalSubSession->OpenL(calfilearr->MdcaPoint(i)); + + CCalCalendarInfo* caleninfo = vCalSubSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + + //Get MARKASDELETE MetaData property + keyBuff.Zero(); + TBool markAsdelete = EFalse; + keyBuff.AppendNum( EMarkAsDelete ); + TPckgC pckMarkAsDelete(markAsdelete); + TRAP(err,pckMarkAsDelete.Set(caleninfo->PropertyValueL(keyBuff))); + if ( err == KErrNone ) + { + markAsdelete = pckMarkAsDelete(); + if( markAsdelete ) + { + FLOG(_L("CNSmlAgendaDataStore::IsCalFileAvailableL: Dead Calendar")); + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + continue; + } + } + + //Get the ProfileId MetaData property + TInt ProfileId; + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncProfileID ); + TPckgC intBuf(ProfileId); + TRAP(err,intBuf.Set(caleninfo->PropertyValueL(keyBuff))); + + if( err != KErrNone ) + { + FLOG(_L("CNSmlAgendaDataStore::IsCalFileAvailable: Error while retrieving CalFile Property")); + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + continue; + } + + ProfileId = intBuf(); + + if(aProfileId == ProfileId) + { + aCalFileArr->AppendL(calfilearr->MdcaPoint(i)); + } + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + } + + if( aCalFileArr->Count() > 0 ) + { + calfilestatus = ETrue; + } + else + { + calfilestatus = EFalse; + } + CleanupStack::PopAndDestroy(calfilearr); + CleanupStack::PopAndDestroy(vCalSession); + + FLOG(_L("CNSmlAgendaDataStore::IsCalFileAvailable: END")); + return calfilestatus; + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::OpenStoreL +// Create CalFile with the attributes provided +// ----------------------------------------------------------------------------- +HBufC* CNSmlAgendaDataStore::CreateCalFileL( HBufC* aProfileName, TInt aProfileId ) + { + FLOG(_L("CNSmlAgendaDataStore::CreateCalFileL: BEGIN")); + + TBuf8 keyBuff; + TUint calValue = 0; + CCalSession* calSession = CCalSession::NewL(); + CleanupStack::PushL(calSession); + CCalCalendarInfo* calinfo = CCalCalendarInfo::NewL(); + CleanupStack::PushL(calinfo); + + //Visibility + calinfo->SetEnabled(ETrue); + calinfo->SetNameL(aProfileName->Des()); + // TODO + calinfo->SetColor(Math::Random()); + + // Set Meta Data Properties + // LUID Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( EFolderLUID ); + calValue = CCalenMultiCalUtil::GetNextAvailableOffsetL(); + FLOG(_L("CNSmlAgendaDataStore::CreateCalFileL: nextoffset: '%d'"), calValue); + TPckgC pckgUidValue( calValue ); + calinfo->SetPropertyL( keyBuff, pckgUidValue ); + + // Create & Modified Time Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( ECreationTime ); + TTime time; + time.HomeTime(); + TPckgC pckgCreateTimeValue( time ); + calinfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + keyBuff.Zero(); + keyBuff.AppendNum( EModificationTime ); + calinfo->SetPropertyL( keyBuff, pckgCreateTimeValue ); + + // Sync Status + keyBuff.Zero(); + keyBuff.AppendNum( ESyncStatus ); + TBool syncstatus( ETrue ); + TPckgC pckgSyncStatusValue( syncstatus ); + calinfo->SetPropertyL( keyBuff, pckgSyncStatusValue ); + + // Global UID MetaDataProperty + keyBuff.Zero(); + keyBuff.AppendNum( EGlobalUUID ); + HBufC8* guuid = iInterimUtils->GlobalUidL(); + TPtr8 guuidPtr = guuid->Des(); + CleanupStack::PushL( guuid ); + calinfo->SetPropertyL( keyBuff, guuidPtr ); + CleanupStack::PopAndDestroy( guuid ); + + // Owner + keyBuff.Zero(); + TInt syncowner = iAgendaAdapterHandler->DeviceSyncOwner(); + keyBuff.AppendNum( EDeviceSyncServiceOwner ); + TPckgC pckgAppUIDValue( syncowner ); + calinfo->SetPropertyL( keyBuff, pckgAppUIDValue ); + + // Profile ID Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncProfileID ); + TPckgC pckgProfileIdValue( aProfileId ); + calinfo->SetPropertyL( keyBuff, pckgProfileIdValue ); + + // Lock the SYNC option + keyBuff.Zero(); + keyBuff.AppendNum( ESyncConfigEnabled ); + TBool synclockstatus( ETrue ); + TPckgC pckgSyncLockValue( synclockstatus ); + calinfo->SetPropertyL( keyBuff, pckgSyncLockValue ); + + // Create the CalFile + HBufC* calfilename = CCalenMultiCalUtil::GetNextAvailableCalFileL(); + calSession->CreateCalFileL( calfilename->Des(), *calinfo ); + CleanupStack::PopAndDestroy(calinfo); + CleanupStack::PopAndDestroy(calSession); + + FLOG(_L("CNSmlAgendaDataStore::CreateCalFileL: END")); + + return calfilename; + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::ActiveItemsL +// Filters out the non-active items from the given array +// ----------------------------------------------------------------------------- +CNSmlDataItemUidSet* CNSmlAgendaDataStore::ActiveItemsL( CNSmlDataItemUidSet& aUids ) const + { + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: BEGIN")); + + TInt err(KErrNone); + TCalLocalUid uid(0); + TCalLocalUid parentid(0); + CNSmlDataItemUidSet* tempuids = new ( ELeave ) CNSmlDataItemUidSet(); + CNSmlDataItemUidSet* inactiveuids = new ( ELeave ) CNSmlDataItemUidSet(); + for( TInt count =0; count < aUids.ItemCount(); count++ ) + { + parentid = 0; + uid = aUids.ItemAt(count); + TRAP( err, GetCalendarEntryIdL( parentid, uid )); + if ( err && iIsHierarchicalSyncSupported ) + { + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: Invalid UID")); + delete tempuids; + delete inactiveuids; + User::Leave( KErrGeneral ); + } + if( iAgendaAdapterHandler->FolderSyncStatusL( parentid ) ) + { + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: ActiveItem: '%d'"), aUids.ItemAt(count)); + tempuids->AddItem( aUids.ItemAt(count) ); + } + else + { + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: InActiveItem: '%d'"), aUids.ItemAt(count)); + inactiveuids->AddItem( aUids.ItemAt(count) ); + } + } + if( inactiveuids->ItemCount() > 0 ) + { + aUids.Reset(); + for( TInt count =0; count < tempuids->ItemCount(); count++ ) + { + aUids.AddItem( tempuids->ItemAt(count) ); + } + delete tempuids; + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: END")); + return inactiveuids; + } + else + { + delete tempuids; + delete inactiveuids; + FLOG(_L("CNSmlAgendaDataStore::ActiveItemsL: END")); + return NULL; + } + } + + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::ExternalizeCommittedUidL +// Populate iCommittedUidArr from the Stream +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::ExternalizeCommittedUidL() const + { + FLOG(_L("CNSmlAgendaDataStore::ExternalizeCommittedUidL: BEGIN")); + + TUid uid = {KNSmlAgendaAdapterStreamUid}; + RWriteStream writeStream; + + // Open stream for writing + iAgendaAdapterLog->iSyncRelationship.OpenWriteStreamLC(writeStream, uid); + + // Write the snapshot to the stream + TInt itemCount = iCommittedUidArr->ItemCount(); + FLOG(_L("CNSmlAgendaDataStore::ExternalizeCommittedUidL: count '%d'"), itemCount); + writeStream.WriteInt32L(itemCount); + + if( itemCount > 0 ) + { + for (TInt i = 0; i < itemCount; ++i) + { + writeStream.WriteInt32L(iCommittedUidArr->ItemAt(i)); + FLOG(_L("CNSmlAgendaDataStore::ExternalizeCommittedUidL: item '%d'"), iCommittedUidArr->ItemAt(i)); + } + } + writeStream.CommitL(); + CleanupStack::PopAndDestroy(); // writeStream + FLOG(_L("CNSmlAgendaDataStore::ExternalizeCommittedUidL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStore::InternalizeCommittedUidL +// Write the contents of iCommittedUidArr to the Stream +// ----------------------------------------------------------------------------- +void CNSmlAgendaDataStore::InternalizeCommittedUidL() const + { + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: BEGIN")); + + TUid uid = {KNSmlAgendaAdapterStreamUid}; + TBool hashistory = iAgendaAdapterLog->iSyncRelationship.IsStreamPresentL(uid); + + if (hashistory) + { + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: HasHistory")); + + // Open stream for reading + RReadStream readStream; + iAgendaAdapterLog->iSyncRelationship.OpenReadStreamLC(readStream, uid); + + // Read snapshot from the stream + TSmlDbItemUid item; + TInt itemCount(readStream.ReadInt32L()); + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: count '%d'"), itemCount); + iCommittedUidArr->Reset(); + for (TInt i = 0; i < itemCount; ++i) + { + item = readStream.ReadInt32L(); + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: item '%d'"), item); + iCommittedUidArr->AddItem(item); + } + CleanupStack::PopAndDestroy(); // readStream + } + + FLOG(_L("CNSmlAgendaDataStore::InternalizeCommittedUidL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil::CNSmlAgendaDataStoreUtil +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaDataStoreUtil::CNSmlAgendaDataStoreUtil() : + iCalSession( NULL ), + iExporter( NULL ), + iImporter( NULL ), + iProgressView( NULL ), + iEntryView( NULL ), + iEntry( NULL ), + iFileName( NULL ) + { + FLOG(_L("CNSmlAgendaDataStoreUtil::CNSmlAgendaDataStoreUtil(): BEGIN")); + + FLOG(_L("CNSmlAgendaDataStoreUtil::CNSmlAgendaDataStoreUtil(): END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil::InitializeCalAPIsL +// Initialize Calendar APIs for database access using the provided name and id +// ----------------------------------------------------------------------------- +// +void CNSmlAgendaDataStoreUtil::InitializeCalAPIsL( HBufC* aFileName, TSmlDbItemUid aUid ) + { + FLOG(_L("CNSmlAgendaDataStoreUtil::InitializeCalAPIsL: BEGIN")); + + iCalSession = CCalSession::NewL(); + iCalSession->OpenL(aFileName->Des()); + iExporter = CCalenExporter::NewL( *iCalSession ); + iImporter = CCalenImporter::NewL( *iCalSession ); + iProgressView = CNSmlAgendaProgressview::NewL(); + iEntryView = CCalEntryView::NewL( *iCalSession, *iProgressView ); + CActiveScheduler::Start(); + TInt completedStatus = iProgressView->GetCompletedStatus(); + if ( completedStatus != KErrNone ) + { + FLOG(_L("CNSmlAgendaDataStoreUtil::ConstructL: ERROR in Progressview")); + } + if( aUid != NULL ) + { + iEntry = iEntryView->FetchL( aUid ); + if( NULL == iEntry ) + { + User::Leave( KErrNotFound ); + } + + } + FLOG(_L("CNSmlAgendaDataStoreUtil::InitializeCalAPIsL: END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaDataStoreUtil* CNSmlAgendaDataStoreUtil::NewL() + { + FLOG(_L("CNSmlAgendaDataStoreUtil::NewL: BEGIN")); + + CNSmlAgendaDataStoreUtil* self = new ( ELeave ) CNSmlAgendaDataStoreUtil(); + + FLOG(_L("CNSmlAgendaDataStoreUtil::NewL: END")); + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaDataStoreUtil::~CNSmlAgendaDataStoreUtil +// Destructor. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaDataStoreUtil::~CNSmlAgendaDataStoreUtil() + { + FLOG(_L("CNSmlAgendaDataStoreUtil::~CNSmlAgendaDataStoreUtil(): BEGIN")); + + delete iEntry; + delete iEntryView; + delete iExporter; + delete iImporter; + delete iCalSession; + delete iProgressView; + + FLOG(_L("CNSmlAgendaDataStoreUtil::~CNSmlAgendaDataStoreUtil(): END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaAdapterLog::CNSmlAgendaAdapterLog +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaAdapterLog::CNSmlAgendaAdapterLog( MSmlSyncRelationship& aSyncRelationship ) : + iSyncRelationship( aSyncRelationship ) + { + FLOG(_L("CNSmlAgendaAdapterLog::CNSmlAgendaAdapterLog(): BEGIN")); + + FLOG(_L("CNSmlAgendaAdapterLog::CNSmlAgendaAdapterLog(): END")); + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaAdapterLog::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaAdapterLog* CNSmlAgendaAdapterLog::NewL( MSmlSyncRelationship& aSyncRelationship ) + { + FLOG(_L("CNSmlAgendaAdapterLog::NewL: BEGIN")); + + CNSmlAgendaAdapterLog* self = new ( ELeave ) CNSmlAgendaAdapterLog(aSyncRelationship); + + FLOG(_L("CNSmlAgendaAdapterLog::NewL: END")); + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlAgendaAdapterLog::~CNSmlAgendaAdapterLog +// Destructor. +// ----------------------------------------------------------------------------- +// +CNSmlAgendaAdapterLog::~CNSmlAgendaAdapterLog() + { + FLOG(_L("CNSmlAgendaAdapterLog::~CNSmlAgendaAdapterLog(): BEGIN")); + + FLOG(_L("CNSmlAgendaAdapterLog::~CNSmlAgendaAdapterLog(): END")); + } + + // End of File