diff -r 57a65a3a658c -r 06f47423ecee syncmlfw/ds/provisioningadapter/src/NSmlDsProvisioningAdapter.cpp --- a/syncmlfw/ds/provisioningadapter/src/NSmlDsProvisioningAdapter.cpp Fri Feb 19 23:41:35 2010 +0200 +++ b/syncmlfw/ds/provisioningadapter/src/NSmlDsProvisioningAdapter.cpp Fri Mar 12 15:46:48 2010 +0200 @@ -28,6 +28,8 @@ #include #include #include +#include //For central Repository +#include // KCRUidOperatorDatasyncInternalKeys #include #include @@ -41,6 +43,9 @@ #include _LIT( KInternetString, "INTERNET" ); +_LIT( KXVcardMimeType, "text/x-vcard"); +const TInt KMaxValueLength = 255; + #include // ============================ MEMBER FUNCTIONS =============================== @@ -934,6 +939,28 @@ if( ( aType.Length() > 0 ) && ( iProfiles[iProfiles.Count()-1]->iDataProvElement[iDataProvElementCount]->iRemoteDBUri ) ) { + TBool dataProvIdFoundInZ = FALSE; + TSmlDataProviderId firstDataProvIdFound = 0; + TSmlDataProviderId uidFound = 0; + + TBool doSearch = ETrue; + if ( aType.FindF( KXVcardMimeType ) != KErrNotFound ) + { + if ( IsOperatorProfile( *iProfiles[iProfiles.Count()-1] ) ) + { + const CNSmlDsProfileElement& profile = *iProfiles[iProfiles.Count()-1]; + StoreOperatorUrlL( *profile.iHostAddress ); + + // Do not make a search through adapter implementations + doSearch = EFalse; + uidFound = OperatorAdapterUid(); + if ( !uidFound ) + { + // If OperatorAdapterUid returns 0, do a search + doSearch = ETrue; + } + } + } // look through every implementation adapter until one found // which supports MIME type in question @@ -944,68 +971,67 @@ TPtr8 typePtr = type->Des(); CnvUtfConverter::ConvertFromUnicodeToUtf8( typePtr, aType); - TBool dataProvIdFoundInZ = FALSE; - TSmlDataProviderId firstDataProvIdFound = 0; - TSmlDataProviderId uidFound = 0; - // get list of dataproviderIds RImplInfoPtrArray implArray; CleanupStack::PushL( PtrArrCleanupItemRArr( CImplementationInformation, &implArray ) ); TUid ifUid = { KNSmlDSInterfaceUid }; REComSession::ListImplementationsL( ifUid, implArray ); - TInt countProviders = implArray.Count(); - for( TInt i = 0; i < countProviders; i++ ) - { - CImplementationInformation* implInfo = implArray[i]; - - RSyncMLDataProvider dataProvider; - dataProvider.OpenL( iSession, implInfo->ImplementationUid().iUid ); - CleanupClosePushL( dataProvider ); + if ( doSearch ) + { + TInt countProviders = implArray.Count(); + for( TInt i = 0; i < countProviders; i++ ) + { + CImplementationInformation* implInfo = implArray[i]; + + RSyncMLDataProvider dataProvider; + dataProvider.OpenL( iSession, implInfo->ImplementationUid().iUid ); + CleanupClosePushL( dataProvider ); - TInt mimeTypeCount = dataProvider.MimeTypeCount(); - for( TInt j = 0; j < mimeTypeCount; j++ ) - { - HBufC* mimeType = dataProvider.MimeType( j ).AllocLC(); - TPtrC8 convMimeType = ConvertTo8LC( *mimeType ); - if( typePtr.Find( convMimeType ) == 0) - { - // MIME type in question was found - uidFound = implInfo->ImplementationUid().iUid; - - if( firstDataProvIdFound == 0 ) - { - // save the first in case of none found from ROM - firstDataProvIdFound = uidFound; - } + TInt mimeTypeCount = dataProvider.MimeTypeCount(); + for( TInt j = 0; j < mimeTypeCount; j++ ) + { + HBufC* mimeType = dataProvider.MimeType( j ).AllocLC(); + TPtrC8 convMimeType = ConvertTo8LC( *mimeType ); + if( typePtr.Find( convMimeType ) == 0) + { + // MIME type in question was found + uidFound = implInfo->ImplementationUid().iUid; + + if( firstDataProvIdFound == 0 ) + { + // save the first in case of none found from ROM + firstDataProvIdFound = uidFound; + } - // check whether the provider is located in ROM (drive Z) - if( implInfo->Drive() == EDriveZ ) - { - dataProvIdFoundInZ = TRUE; - } - } - - CleanupStack::PopAndDestroy(2); // mimetype, ConvertTo8LC + // check whether the provider is located in ROM (drive Z) + if( implInfo->Drive() == EDriveZ ) + { + dataProvIdFoundInZ = TRUE; + } + } - if( uidFound ) - { - break; - } - } + CleanupStack::PopAndDestroy(2); // mimetype, ConvertTo8LC + + if( uidFound ) + { + break; + } + } - CleanupStack::PopAndDestroy(); // dataProvider + CleanupStack::PopAndDestroy(); // dataProvider - if ( dataProvIdFoundInZ ) - { - break; - } - else - { - uidFound = firstDataProvIdFound; - } - } - + if ( dataProvIdFoundInZ ) + { + break; + } + else + { + uidFound = firstDataProvIdFound; + } + } + } + REComSession::FinalClose(); CleanupStack::PopAndDestroy( 2 ); // type, implArray @@ -1074,5 +1100,65 @@ return *buf; } +//----------------------------------------------------------------------------- +// CNSmlDsProvisioningAdapter::IsOperatorProfile +// +//----------------------------------------------------------------------------- +// +TBool CNSmlDsProvisioningAdapter::IsOperatorProfile( const CNSmlDsProfileElement& aProfile ) + { + TBuf8 value; + CRepository* rep = NULL; + TRAPD ( err, rep = CRepository::NewL( KCRUidOperatorDatasyncInternalKeys ) ); + if ( err == KErrNone ) + { + rep->Get( KNsmlOpDsOperatorSyncServerId, value ); + delete rep; + } + + if ( aProfile.iServerId ) + { + if ( value.Compare( *aProfile.iServerId ) == 0 ) + { + return ETrue; + } + } + return EFalse; + } + +//----------------------------------------------------------------------------- +// CNSmlDsProvisioningAdapter::OperatorAdapterUid +// +//----------------------------------------------------------------------------- +// +TInt CNSmlDsProvisioningAdapter::OperatorAdapterUid() + { + TInt value = 0; + CRepository* rep = NULL; + TRAPD ( err, rep = CRepository::NewL( KCRUidOperatorDatasyncInternalKeys ) ); + if ( err == KErrNone ) + { + rep->Get( KNsmlOpDsOperatorAdapterUid, value ); + delete rep; + } + return value; + } + +//----------------------------------------------------------------------------- +// CNSmlDsProvisioningAdapter::StoreOperatorUrlL +// +//----------------------------------------------------------------------------- +// +void CNSmlDsProvisioningAdapter::StoreOperatorUrlL( const TDesC& aUrl ) + { + CRepository* rep = NULL; + TRAPD ( err, rep = CRepository::NewL( KCRUidOperatorDatasyncInternalKeys ) ); + if ( err == KErrNone ) + { + CleanupStack::PushL( rep ); + User::LeaveIfError( rep->Set( KNsmlOpDsOperatorSyncServerURL, aUrl )); + CleanupStack::PopAndDestroy( rep ); + } + } // End of File