diff -r dab8a81a92de -r 95fdac6ccb5c omads/omadsappui/AspSyncUtil/src/AspProfile.cpp --- a/omads/omadsappui/AspSyncUtil/src/AspProfile.cpp Mon Nov 23 14:46:41 2009 +0200 +++ b/omads/omadsappui/AspSyncUtil/src/AspProfile.cpp Thu Dec 17 08:39:39 2009 +0200 @@ -21,6 +21,10 @@ #include #include // FeatureManager +#include +#include +#include +#include #include "AspProfile.h" #include "AspResHandler.h" @@ -28,8 +32,12 @@ #include "AspDebug.h" #include "AspSchedule.h" #include //CRepository - - +#include // Calendar File Meta Data Properties +#include +#include + +_LIT(KDrive ,"C:"); +_LIT(KCharUnderscore, "_"); /******************************************************************************* * class TAspProviderItem @@ -833,6 +841,33 @@ aContentCount = goodContentCount; return EMandatoryNoRemoteDatabase; } + + if (task.iDataProviderId == KUidNSmlAdapterCalendar.iUid) + { + CCalSession* session = CCalSession::NewL(); + CleanupStack::PushL(session); + TRAPD (err, session->OpenL(task.iClientDataSource)); + if (err == KErrNotFound) + { + TInt index = FindProviderIndex(task.iDataProviderId); + TAspProviderItem& provider = ProviderItem(index); + + TBuf localDatabase; + TBuf remoteDatabase; + TInt syncDirection; + TBool taskEnabled; + ReadTaskL(provider.iDataProviderId, localDatabase, remoteDatabase, + taskEnabled, syncDirection); + + //Creating new task creates new calendar local database + CreateTaskL(provider.iDataProviderId, localDatabase, remoteDatabase, + taskEnabled, syncDirection); + + InitAllTasksL(); + InitDataProvidersL(); + } + CleanupStack::PopAndDestroy(session); + } goodContentCount++; } @@ -1150,9 +1185,18 @@ RSyncMLTask task; CleanupClosePushL(task); - task.CreateL(iProfile->Profile(), aDataProvider.iDataProviderId, + if (aDataProvider.iDataProviderId == KUidNSmlAdapterCalendar.iUid ) + { + TBuf<128> calLocalDb ; + CreateCalLocalDatabaseL(calLocalDb); + task.CreateL(iProfile->Profile(), aDataProvider.iDataProviderId, + KNullDesC, calLocalDb); + } + else + { + task.CreateL(iProfile->Profile(), aDataProvider.iDataProviderId, KNullDesC, aDataProvider.iDefaultDataStore); - + } task.SetEnabledL(aDataProvider.iIsIncludedInSync); task.SetDefaultSyncTypeL(SmlSyncDirection()); @@ -1212,14 +1256,39 @@ } else { - task.CreateL(iProfile->Profile(), aDataProviderId, + if (aDataProviderId == KUidNSmlAdapterCalendar.iUid ) + { + TBuf<128> calLocalDb ; + CreateCalLocalDatabaseL(calLocalDb); + task.CreateL(iProfile->Profile(), aDataProviderId, + aRemoteDatabase, calLocalDb); + } + else + { + task.CreateL(iProfile->Profile(), aDataProviderId, aRemoteDatabase, item.iDefaultDataStore); + } } } else { - task.CreateL(iProfile->Profile(), aDataProviderId, - aRemoteDatabase, aLocalDatabase); + if (aDataProviderId == KUidNSmlAdapterCalendar.iUid ) + { + TBuf<128> calLocalDb ; + TRAPD(err ,RetrieveCalLocalDatabaseL(calLocalDb)); + if (err != KErrNone) + { + CreateCalLocalDatabaseL(calLocalDb); + } + + task.CreateL(iProfile->Profile(), aDataProviderId, + aRemoteDatabase, calLocalDb); + } + else + { + task.CreateL(iProfile->Profile(), aDataProviderId, + aRemoteDatabase, aLocalDatabase); + } } task.SetEnabledL(aEnabled); @@ -1255,6 +1324,213 @@ FLOG( _L("CAspContentList::CreateTask END") ); } +// ----------------------------------------------------------------------------- +// CAspContentList::CreateTask +// +// ----------------------------------------------------------------------------- +// +void CAspContentList::CreateCalLocalDatabaseL(TDes& aCalName) + { + + aCalName.Copy(KDrive); + + TBuf<128> buffer; + iProfile->GetName(buffer); + + CCalSession* calSession = CCalSession::NewL(); + CleanupStack::PushL(calSession); + + + TInt suffix = 0; + TInt suffixLen = 0; + TInt delPos = buffer.Length(); + + while (!IsCalNameAvailableL(*calSession ,buffer)) + { + //A db with profile name already exists , try profile_1 ,profile_2 etc.. + if (!suffix) + { + buffer.Append(KCharUnderscore); + ++delPos; + } + else + { + while (suffix/10) + { + ++suffixLen; + } + + buffer.Delete(delPos ,++suffixLen); + suffixLen = 0; + } + buffer.AppendNum(++suffix); + } + + TBuf8<128> keyBuff; + TUint calValue = 0; + CCalCalendarInfo* calinfo = CCalCalendarInfo::NewL(); + CleanupStack::PushL(calinfo); + //Visibility + calinfo->SetEnabled(ETrue); + + calinfo->SetNameL(buffer); + calinfo->SetColor(Math::Random()); + + // Set Meta Data Properties + // LUID Meta Property + keyBuff.Zero(); + keyBuff.AppendNum( EFolderLUID ); + calValue = CCalenMultiCalUtil::GetNextAvailableOffsetL(); + FLOG(_L("CNSmlOviAgendaAdapterPlugin::CreateFolderItemL: 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 ); + CCalenInterimUtils2* interimUtils = CCalenInterimUtils2::NewL(); + CleanupStack::PushL( interimUtils ); + HBufC8* guuid = interimUtils->CalFileGlobalUidL(); + TPtr8 guuidPtr = guuid->Des(); + CleanupStack::PushL( guuid ); + calinfo->SetPropertyL( keyBuff, guuidPtr ); + CleanupStack::PopAndDestroy( guuid ); + CleanupStack::PopAndDestroy( interimUtils ); + + // Owner Name + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncServiceOwner ); + TPckgC pckgAppUIDValue( KCRUidNSmlDSApp.iUid ); + calinfo->SetPropertyL( keyBuff, pckgAppUIDValue ); + + + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncProfileID ); + TPckgC pckgProfileIdValue( iProfile->ProfileId() ); + calinfo->SetPropertyL( keyBuff, pckgProfileIdValue ); + + + // Create the CalFile + HBufC* calfilename = CCalenMultiCalUtil::GetNextAvailableCalFileL(); + calSession->CreateCalFileL( calfilename->Des(), *calinfo ); + + aCalName.Copy( calfilename->Des() ); + + delete calfilename; + + CleanupStack::PopAndDestroy(calinfo); + CleanupStack::PopAndDestroy(calSession); + } + +// ----------------------------------------------------------------------------- +// CAspContentList::IsCalNameAvailableL +// +// ----------------------------------------------------------------------------- +// +TBool CAspContentList::IsCalNameAvailableL(CCalSession& aSession ,TDes& aCalName) + { + CCalSession* vCalSubSession = NULL; + CDesCArray* calfilearr = aSession.ListCalFilesL(); + + for(TInt i = 0; i < calfilearr->Count(); i++) + { + vCalSubSession = CCalSession::NewL(aSession); + CleanupStack::PushL(vCalSubSession); + vCalSubSession->OpenL(calfilearr->MdcaPoint(i)); + + CCalCalendarInfo* caleninfo = vCalSubSession->CalendarInfoL(); + + if (aCalName == caleninfo->NameL()) + { + delete caleninfo; + delete calfilearr; + CleanupStack::PopAndDestroy(vCalSubSession); + return EFalse; + } + + delete caleninfo; + CleanupStack::PopAndDestroy(vCalSubSession); + } + delete calfilearr; + return ETrue; + + } +// ----------------------------------------------------------------------------- +// CAspContentList::RetrieveCalLocalDatabaseL +// +// ----------------------------------------------------------------------------- +// +void CAspContentList::RetrieveCalLocalDatabaseL(TDes& aCalName) + { + + FLOG(_L("CAspContentList::RetrieveCalLocalDatabaseL: BEGIN")); + + TBuf8<128> keyBuff; + CCalSession* vCalSession = NULL; + CCalSession* vCalSubSession = NULL; + + vCalSession = CCalSession::NewL(); + CleanupStack::PushL(vCalSession); + + CDesCArray* calfilearr = vCalSession->ListCalFilesL(); + + TBool dbFound = EFalse; + for(TInt i = 0; i < calfilearr->Count(); i++) + { + vCalSubSession = CCalSession::NewL(*vCalSession); + CleanupStack::PushL(vCalSubSession); + vCalSubSession->OpenL(calfilearr->MdcaPoint(i)); + + CCalCalendarInfo* caleninfo = vCalSubSession->CalendarInfoL(); + CleanupStack::PushL(caleninfo); + + TInt profileId; + keyBuff.Zero(); + keyBuff.AppendNum( EDeviceSyncProfileID ); + TPckgC intBuf(profileId); + TRAP_IGNORE(intBuf.Set(caleninfo->PropertyValueL(keyBuff))); + + profileId = intBuf(); + + if ( profileId == iProfile->ProfileId()) + { + aCalName.Append(caleninfo->FileNameL()); + dbFound = ETrue; + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + break; + } + CleanupStack::PopAndDestroy(caleninfo); + CleanupStack::PopAndDestroy(vCalSubSession); + } + + if( dbFound == EFalse ) + { + delete calfilearr; + User::Leave( KErrNotFound ); + } + + delete calfilearr; + CleanupStack::PopAndDestroy(vCalSession); + } // ----------------------------------------------------------------------------- // CAspContentList::ReadTaskL