diff -r 32463a6c57b3 -r a4b9e097ca0b XDMEngine/XdmDeviceManagement/src/xdmdmadapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/XdmDeviceManagement/src/xdmdmadapter.cpp Thu Sep 02 20:50:11 2010 +0300 @@ -0,0 +1,1244 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: DM OMA XDM Settings Adapter + * +*/ + + + + +#include +#include +#include +#include +#include +#include +#include "xdmdmadapter.h" + +#ifdef _DEBUG + #include +#endif + + + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::NewL( ) +// ----------------------------------------------------------------------------- +// +CXdmDMAdapter* CXdmDMAdapter::NewL( MSmlDmCallback* aDmCallback ) + { + CXdmDMAdapter* self = new (ELeave) CXdmDMAdapter( aDmCallback ); +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::NewL(): end") ); +#endif + return self; + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::CXdmDMAdapter() +// ----------------------------------------------------------------------------- +// +CXdmDMAdapter::CXdmDMAdapter( MSmlDmCallback* aDmCallback ) : +CSmlDmAdapter( aDmCallback ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::CXdmDMAdapter()") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::~CXdmDMAdapter() +// ----------------------------------------------------------------------------- +// +CXdmDMAdapter::~CXdmDMAdapter() + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::~CXdmDMAdapter()") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::DDFVersionL +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::DDFVersionL( CBufBase& aDDFVersion ) + { + aDDFVersion.InsertL( 0, KXdmDDFVersion ); +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::DDFVersionL(TDes& aDDFVersion)") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::DDFStructureL +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::DDFStructureL( MSmlDmDDFObject& aDDF ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::DDFStructureL(): begin") ); +#endif + + // For OMA_XDM + TSmlDmAccessTypes accTypeGet; + accTypeGet.SetGet(); + + // For OMA_XDM/ + TSmlDmAccessTypes accTypeAll; + accTypeAll.SetAdd(); + accTypeAll.SetGet(); + accTypeAll.SetReplace(); + accTypeAll.SetDelete(); + + // For leaf nodes + TSmlDmAccessTypes accTypeNoDelete; + accTypeNoDelete.SetAdd(); + accTypeNoDelete.SetGet(); + accTypeNoDelete.SetReplace(); + + // ./OMA_XDM + MSmlDmDDFObject& omaXdmNode = aDDF.AddChildObjectL( KXdmDmNodeName ); + FillNodeInfoL( omaXdmNode, accTypeGet, MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, MSmlDmDDFObject::ENode, + KXdmDmNodeNameDescription ); + + // ./OMA_XDM/ + MSmlDmDDFObject& rtNode = omaXdmNode.AddChildObjectGroupL(); + FillNodeInfoL( rtNode, accTypeAll, MSmlDmDDFObject::EOneOrMore, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode, + KXdmDmDynamicDescription ); + + // ./OMA_XDM//APPID + MSmlDmDDFObject& appIdNode = rtNode.AddChildObjectL( KXdmDmAppId ); + FillNodeInfoL( appIdNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KXdmDmAppIdDescription ); + + // ./OMA_XDM//NAME + MSmlDmDDFObject& nameNode = rtNode.AddChildObjectL( KXdmDmName ); + FillNodeInfoL( nameNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KXdmDmNameDescription ); + + // ./OMA_XDM//PROVIDER-ID + MSmlDmDDFObject& provIdNode = rtNode.AddChildObjectL( KXdmDmProviderId ); + FillNodeInfoL( provIdNode, accTypeNoDelete,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KXdmDmProviderIdDescription ); + + // ./OMA_XDM//ToConRef + MSmlDmDDFObject& toConRefNode = rtNode.AddChildObjectL( KXdmDmToConRef ); + FillNodeInfoL( toConRefNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode, + KXdmDmToConRefDescription); + + // ./OMA_XDM//ToConRef/ (TO-NAPID) + MSmlDmDDFObject& napIdNode = toConRefNode.AddChildObjectL( KXdmDmToNapId ); + FillNodeInfoL( napIdNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode, + KXdmDmToNapIdDescription ); + + // ./OMA_XDM//ToConRef/TO-NAPID/ConRef + MSmlDmDDFObject& napIdRefNode = napIdNode.AddChildObjectL( KXdmDmConRef ); + FillNodeInfoL( napIdRefNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KXdmDmConRefDescription ); + + // ./OMA_XDM//ToConRef/ (SIP) + MSmlDmDDFObject& sipNode = toConRefNode.AddChildObjectL( KXdmDmSip ); + FillNodeInfoL( sipNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode, + KXdmDmSipDescription ); + + // ./OMA_XDM//ToConRef/SIP/ConRef + MSmlDmDDFObject& sipRefNode = sipNode.AddChildObjectL( KXdmDmConRef ); + FillNodeInfoL( sipRefNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KXdmDmConRefDescription ); + + // ./OMA_XDM//URI + MSmlDmDDFObject& uriNode = rtNode.AddChildObjectL( KXdmDmUri ); + FillNodeInfoL( uriNode, accTypeNoDelete, MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KXdmDmUriDescription ); + + // ./OMA_XDM//AAUTHNAME + MSmlDmDDFObject& userIdNode = rtNode.AddChildObjectL( KXdmDmAAuthName ); + FillNodeInfoL( userIdNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KXdmDmAAuthNameDescription ); + + // ./OMA_XDM//AAUTHSECRET + MSmlDmDDFObject& pwdNode = rtNode.AddChildObjectL( KXdmDmAAuthSecret ); + FillNodeInfoL( pwdNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KXdmDmAAuthSecretDescription ); + + // ./OMA_XDM//AAUTHTYPE + MSmlDmDDFObject& authTypeNode = rtNode.AddChildObjectL( KXdmDmAAuthType ); + FillNodeInfoL( authTypeNode, accTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KXdmDmAAuthTypeDescription ); + +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::DDFStructureL(): end") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::ChildURIListL +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::ChildURIListL( const TDesC8& aUri, + const TDesC8& /*aLUID*/, + const CArrayFix& + /*aPreviousURISegmentList*/, + const TInt aResultsRef, + const TInt aStatusRef ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ChildURIListL(): begin") ); +#endif + + CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk; + + CBufBase* currentList = CBufFlat::NewL( 1 ); + CleanupStack::PushL( currentList ); // << currentList + + const TPtrC8 lastUriSeg = NSmlDmURI::LastURISeg( aUri ); + TBuf8 segmentName; + + // ./OMA_XDM + if( Match( lastUriSeg, KXdmDmNodeName ) ) + { + RArray settingIds; + CleanupClosePushL( settingIds ); // << settingIds + CDesCArray* names = TXdmSettingsApi::CollectionNamesLC( settingIds ); // << names + TInt idCount = settingIds.Count(); + for( TInt i(0); i < idCount; i++ ) + { + segmentName.Copy( KNullDesC8 ); + segmentName.AppendNum( settingIds[i] ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + } + Callback().SetResultsL( aResultsRef, *currentList, KNullDesC8 ); + Callback().SetStatusL( aStatusRef, retValue ); + CleanupStack::PopAndDestroy( 3, currentList ); // >>> settingIds, names, currentList + return; + } + + // ./OMA_XDM/X + if( NSmlDmURI::NumOfURISegs( aUri ) == KXdmDmLevel ) + { + segmentName.Copy( KXdmDmAppId ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + + segmentName.Copy( KXdmDmName ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + + segmentName.Copy( KXdmDmProviderId ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + + segmentName.Copy( KXdmDmToConRef ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + + segmentName.Copy( KXdmDmUri ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + + segmentName.Copy( KXdmDmAAuthName ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + + segmentName.Copy( KXdmDmAAuthSecret ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + + segmentName.Copy( KXdmDmAAuthType ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + } + + // ./OMA_XDM/X/ToConRef + else if ( Match( lastUriSeg, KXdmDmToConRef ) ) + { + segmentName.Copy( KXdmDmSip ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + + segmentName.Copy( KXdmDmToNapId ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + } + + // ./OMA_XDM/X/ToConRef/SIP + else if( Match( lastUriSeg, KXdmDmSip ) ) + { + segmentName.Copy( KXdmDmConRef ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + } + + // ./OMA_XDM/X/ToConRef/TO-NAPID + else if( Match ( lastUriSeg, KXdmDmToNapId ) ) + { + segmentName.Copy( KXdmDmConRef ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KXdmDmSeparator ); + } + else + { + // if none of asked nodes found return error. + retValue = CSmlDmAdapter::ENotFound; + } + + Callback().SetResultsL( aResultsRef, *currentList, KNullDesC8 ); + Callback().SetStatusL( aStatusRef, retValue ); + CleanupStack::PopAndDestroy( currentList ); // >>> currentList +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ChildURIListL(): end") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::FetchLeafObjectL +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::FetchLeafObjectL( const TDesC8& aUri, + const TDesC8& aLUID, + const TDesC8& aType, + const TInt aResultsRef, + const TInt aStatusRef ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FetchLeafObjectL(): begin") ); +#endif + + TInt settingsId = FindSettingsIdL( aLUID, aUri ); + + CBufBase* result = CBufFlat::NewL( KXdmDefaultResultSize ); + CleanupStack::PushL( result ); // << result + CSmlDmAdapter::TError status = FetchObjectL( aUri, *result, settingsId ); + if( status == CSmlDmAdapter::EOk ) + { + Callback().SetResultsL( aResultsRef, *result, aType ); + } + Callback().SetStatusL( aStatusRef, status ); + CleanupStack::PopAndDestroy( result ); // >>> result + +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FetchLeafObjectL(): end") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CSmlDmAdapter::TError FetchObjectL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CXdmDMAdapter::FetchObjectL( const TDesC8& aUri, + CBufBase& aObject, + TInt aSettingsId ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FetchObjectL(): begin") ); +#endif + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + + TXdmSettingsProperty property ( EXdmPropNotFound ); + TPtrC8 lastUriSeg = NSmlDmURI::LastURISeg( aUri ); + // APPID + if( Match( lastUriSeg, KXdmDmAppId ) ) + { + property = EXdmPropAppId; + } + // NAME + else if( Match( lastUriSeg, KXdmDmName ) ) + { + property = EXdmPropName; + } + // PROVIDER-ID + else if( Match( lastUriSeg, KXdmDmProviderId ) ) + { + property = EXdmPropProvId; + } + // URI + else if( Match( lastUriSeg, KXdmDmUri) ) + { + property = EXdmPropUri; + } + // AAUTHNAME + else if( Match( lastUriSeg, KXdmDmAAuthName) ) + { + property = EXdmPropAuthName; + } + // AAUTHSECRET + else if( Match( lastUriSeg, KXdmDmAAuthSecret) ) + { + property = EXdmPropAuthSecret; + } + // AAUTHTYPE + else if( Match( lastUriSeg, KXdmDmAAuthType ) ) + { + property = EXdmPropAuthType; + } + // ToConRef/SIP/ConRef + // ToConRef/TO-NAPID/ConRef + else if( Match( lastUriSeg, KXdmDmConRef) ) + { + TPtrC8 conRefUri = NSmlDmURI::RemoveLastSeg( aUri ); + TPtrC8 lastConRefSeg = NSmlDmURI::LastURISeg( conRefUri ); + + if( Match( lastConRefSeg, KXdmDmSip ) ) + { + return FetchSipConRefL( aSettingsId, aObject ); + } + else if( Match( lastConRefSeg, KXdmDmToNapId ) ) + { + HBufC* value = NULL; + TInt error( KErrNone ); + TRAP( error, ( value = TXdmSettingsApi::PropertyL( aSettingsId, EXdmPropToNapId ) ) ); + if ( error == KErrNone ) + { + CleanupStack::PushL( value ); // << value + TInt iapId = DesToInt( *value ); + CleanupStack::PopAndDestroy( value ); // >>> value + HBufC8* uri = URIFromIapIdL( iapId ); + if( uri ) + { + CleanupStack::PushL( uri ); // << uri + aObject.InsertL( 0, uri->Des() ); + status = CSmlDmAdapter::EOk; + CleanupStack::PopAndDestroy( uri ); // uri + } + else + { + status = CSmlDmAdapter::ENotFound; + } + return status; + } + } + } + else + { + status = CSmlDmAdapter::ENotFound; + } + // known property + if ( status == CSmlDmAdapter::EOk ) + { + status = GetPropertyL( aSettingsId, property, aObject ); + } + +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FetchObjectL(): end") ); +#endif + return status; + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::FetchLeafObjectSizeL +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::FetchLeafObjectSizeL( const TDesC8& aUri, + const TDesC8& aLUID, + const TDesC8& aType, + const TInt aResultsRef, + const TInt aStatusRef ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FetchLeafObjectSizeL(): begin") ); +#endif + + TInt settingsId = FindSettingsIdL( aLUID, aUri ); + + CBufBase* result = CBufFlat::NewL( KXdmDefaultResultSize ); + CleanupStack::PushL( result ); + CSmlDmAdapter::TError status = FetchObjectL( aUri, *result, settingsId ); + + if( status == CSmlDmAdapter::EOk ) + { + TInt objSizeInBytes = result->Size(); + + TBuf8 stringObjSizeInBytes; + stringObjSizeInBytes.Num( objSizeInBytes ); + + result->Reset(); + result->InsertL( 0, stringObjSizeInBytes ); + + Callback().SetResultsL( aResultsRef, *result, aType ); + } + + Callback().SetStatusL( aStatusRef, status ); + CleanupStack::PopAndDestroy( result ); // >>> result +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FetchLeafObjectSizeL(): end") ); + #endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::UpdateLeafObjectL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::UpdateLeafObjectL( const TDesC8& aUri, + const TDesC8& aLUID, + const TDesC8& aObject, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL(): begin") ); +#endif + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + + TInt settingsId = FindSettingsIdL( aLUID, aUri ); + + TXdmSettingsProperty property; + TPtrC8 lastUriSeg = NSmlDmURI::LastURISeg( aUri ); + // APPID + if( Match( lastUriSeg, KXdmDmAppId ) ) + { + property = EXdmPropAppId; + } + // NAME + else if( Match( lastUriSeg, KXdmDmName ) ) + { + // first check if the new value is same as earlier + HBufC* current = NULL; + TInt error( KErrNone ); + TRAP( error, ( current = TXdmSettingsApi::PropertyL( settingsId, EXdmPropName ) ) ); + if ( error == KErrNone ) + { + TBool same ( EFalse ); + CleanupStack::PushL( current ); // << current + HBufC8* current8 = ConvertLC( *current ); // << current8 + if ( Match( current8->Des(), aObject ) ) + { + same = ETrue; + } + CleanupStack::PopAndDestroy( 2, current8 ); // >>> current, current8 + if ( same ) + { + Callback().SetStatusL( aStatusRef, status ); + return; + } + } + // if the name is already in use, new name with index is created + HBufC* value = CheckExistingNamesLC( aObject ); // << value + TRAP( error, TXdmSettingsApi::UpdatePropertyL( settingsId, *value, EXdmPropName ) ); + CleanupStack::PopAndDestroy( value ); // >>> value + if ( error != KErrNone ) + { + status = CSmlDmAdapter::ENotFound; + } + Callback().SetStatusL( aStatusRef, status ); + return; + } + // PROVIDER-ID + else if( Match( lastUriSeg, KXdmDmProviderId ) ) + { + property = EXdmPropProvId; + } + // URI + else if( Match( lastUriSeg, KXdmDmUri) ) + { + property = EXdmPropUri; + } + // AAUTHNAME + else if( Match( lastUriSeg, KXdmDmAAuthName) ) + { + property = EXdmPropAuthName; + } + // AAUTHSECRET + else if( Match( lastUriSeg, KXdmDmAAuthSecret) ) + { + property = EXdmPropAuthSecret; + } + // AAUTHTYPE + else if( Match( lastUriSeg, KXdmDmAAuthType ) ) + { + property = EXdmPropAuthType; + } + // ToConRef/TO-NAPID/ConRef + // ToConRef/SIP/ConRef + else if( Match( lastUriSeg, KXdmDmConRef ) ) + { + TPtrC8 conRefUri = NSmlDmURI::RemoveLastSeg( aUri ); + TPtrC8 lastConRefSeg = NSmlDmURI::LastURISeg( conRefUri ); + if( Match( lastConRefSeg, KXdmDmToNapId ) ) + { + TInt iapId = IapIdFromURIL( aObject ); + HBufC8* idBuf = IntToDes8LC( iapId ); // << idBuf + status = UpdatePropertyL( settingsId, EXdmPropToNapId, *idBuf ); + CleanupStack::PopAndDestroy( idBuf ); // >>> idBuf + Callback().SetStatusL( aStatusRef, status ); + #ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL(): TO_NAPID/ConRef end") ); + #endif + return; + } + else if( Match( lastConRefSeg, KXdmDmSip ) ) + { + TInt sipId = GetSipIdL( aObject ); + HBufC8* idBuf = IntToDes8LC( sipId ); // << idBuf + status = UpdatePropertyL( settingsId, EXdmPropToAppRef, *idBuf ); + CleanupStack::PopAndDestroy( idBuf ); // >>> idBuf + Callback().SetStatusL( aStatusRef, status ); + #ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL(): SIP/ConRef end") ); + #endif + return; + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + else + { + status = CSmlDmAdapter::ENotFound; + } + // known property + if ( status == CSmlDmAdapter::EOk ) + { + status = UpdatePropertyL( settingsId, property, aObject ); + } + + Callback().SetStatusL( aStatusRef, status ); + +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL(): end") ); + #endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::AddNodeObjectL +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::AddNodeObjectL( const TDesC8& aUri, + const TDesC8& /*aParentLUID*/, + const TInt aStatusRef ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::AddNodeObjectL(): begin") ); +#endif + + CSmlDmAdapter::TError status = CSmlDmAdapter::EError; + if ( Match( NSmlDmURI::RemoveLastSeg( aUri ), KXdmDmNodeName ) ) + { + // create new set + CXdmSettingsCollection* collection = new ( ELeave ) CXdmSettingsCollection; + CleanupStack::PushL( collection ); // << collection + collection->AppendL( KXdmDefaultId, EXdmPropSettingsId ); + TInt id = TXdmSettingsApi::CreateCollectionL( *collection ); + HBufC8* luid = IntToDes8LC( id ); // << luid + Callback().SetMappingL( aUri, *luid ); + CleanupStack::PopAndDestroy( 2, luid ); // >>> collection, luid + status = CSmlDmAdapter::EOk; +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::AddNodeObjectL(): Settings created id=%d"), id ); +#endif + } + Callback().SetStatusL( aStatusRef, status ); + +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::AddNodeObjectL(): end") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::DeleteObjectL +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::DeleteObjectL( const TDesC8& aUri, + const TDesC8& aLUID, + const TInt aStatusRef ) + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::DeleteObjectL( ): begin") ); +#endif + + CSmlDmAdapter::TError status = CSmlDmAdapter::EError; + if ( Match( NSmlDmURI::RemoveLastSeg( aUri ), KXdmDmNodeName ) ) + { + TInt id = FindSettingsIdL( aLUID, aUri ); + TInt error (KErrNone ); + TRAP( error, TXdmSettingsApi::RemoveCollectionL( id ) ); + if ( error == KErrNone ) + { + status = CSmlDmAdapter::EOk; + } +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::DeleteObjectL(): Settings deleted id=%d"), id ); +#endif + } + Callback().SetStatusL( aStatusRef, status ); + +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::DeleteObjectL( ): end") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::UpdateLeafObjectL +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::UpdateLeafObjectL( const TDesC8& /*aUri*/, + const TDesC8& /*aLUID*/, + RWriteStream*& /*aStream*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + // Update from stream not used + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::ExecuteCommandL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::ExecuteCommandL( const TDesC8& /*aUri*/, + const TDesC8& /*aLUID*/, + const TDesC8& /*aArgument*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + // Not supported + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::ExecuteCommandL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::ExecuteCommandL( const TDesC8& /*aUri*/, + const TDesC8& /*aLUID*/, + RWriteStream*& /*aStream*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + // Not supported + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::CopyCommandL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::CopyCommandL( const TDesC8& /*aTargetURI*/, + const TDesC8& /*aTargetLUID*/, + const TDesC8& /*aSourceURI*/, + const TDesC8& /*aSourceLUID*/, + const TDesC8& /*aType*/, + TInt aStatusRef ) + { + // Not supported + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::StartAtomicL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::StartAtomicL() + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::CommitAtomicL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::CommitAtomicL() + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::RollbackAtomicL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::RollbackAtomicL() + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::StreamingSupport() +// ----------------------------------------------------------------------------- +// +TBool CXdmDMAdapter::StreamingSupport( TInt& /*aItemSize*/ ) + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::StreamCommittedL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::StreamCommittedL() + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::CompleteOutstandingCmdsL() +// ----------------------------------------------------------------------------- +// +void CXdmDMAdapter::CompleteOutstandingCmdsL() + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::CompleteOutstandingCmdsL()") ); +#endif + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::GetPropertyL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CXdmDMAdapter::GetPropertyL( TInt aSettingsId, + TXdmSettingsProperty aProperty, + CBufBase& aObject ) + { + HBufC* value = NULL; + TInt error( KErrNone ); + TRAP( error, ( value = TXdmSettingsApi::PropertyL( aSettingsId, aProperty ) ) ); + if ( error == KErrNone ) + { + CleanupStack::PushL( value ); // << value + HBufC8* utfValue = ConvertLC( *value ); // << utfValue + aObject.InsertL( 0, *utfValue ); + CleanupStack::PopAndDestroy( 2, utfValue ); // >>> value, utfValue + return CSmlDmAdapter::EOk; + } + return CSmlDmAdapter::ENotFound; + } + + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::UpdatePropertyL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CXdmDMAdapter::UpdatePropertyL( TInt aSettingsId, + TXdmSettingsProperty aProperty, + const TDesC8& aObject ) + { + HBufC* value = ConvertLC( aObject ); // << value + TInt error( KErrNone ); + TRAP( error, TXdmSettingsApi::UpdatePropertyL( aSettingsId, *value, aProperty ) ); + CleanupStack::PopAndDestroy( value ); // >>> value + + if ( error == KErrNone ) + { + return CSmlDmAdapter::EOk; + } + return CSmlDmAdapter::ENotFound; + } + + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::FillNodeInfoL +// ------------------------------------------------------------------------------ +// +void CXdmDMAdapter::FillNodeInfoL( MSmlDmDDFObject& aNode, + TSmlDmAccessTypes aAccTypes, + MSmlDmDDFObject::TOccurence aOccurrence, + MSmlDmDDFObject::TScope aScope, + MSmlDmDDFObject::TDFFormat aFormat, + const TDesC8& aDescription) + { + aNode.SetAccessTypesL( aAccTypes ); + aNode.SetOccurenceL( aOccurrence ); + aNode.SetScopeL( aScope ); + aNode.SetDFFormatL( aFormat ); + + if( aFormat != MSmlDmDDFObject::ENode ) + { + aNode.AddDFTypeMimeTypeL( KXdmDmTextPlain ); + } + aNode.SetDescriptionL( aDescription ); + } + + +// ---------------------------------------------------------------------------- +// CXdmDMAdapter::IapIdFromURIL +// ---------------------------------------------------------------------------- +// +TInt CXdmDMAdapter::IapIdFromURIL( const TDesC8& aUri ) + { + TInt id( KErrNotFound ); + MSmlDmAdapter::TError status( MSmlDmAdapter::EError ); + CBufBase* result = CBufFlat::NewL(1); + CleanupStack::PushL( result ); // << result + + TPtrC8 uri = NSmlDmURI::RemoveDotSlash( aUri ); + // Request the identifier + Callback().FetchLinkL( uri, *result, status ); + + if( status == MSmlDmAdapter::EOk ) + { + HBufC8* luid = Callback().GetLuidAllocL( uri ); + if ( luid && luid->Length() ) + { + id = DesToInt( *luid ); + } + delete luid; + luid = NULL; + } + + CleanupStack::PopAndDestroy( result ); // >>> result + return id; + } + +// ---------------------------------------------------------------------------- +// CXdmDMAdapter::URIFromIapIdL +// ---------------------------------------------------------------------------- +// +HBufC8* CXdmDMAdapter::URIFromIapIdL( TInt aId ) + { + CBufBase *allIds = CBufFlat::NewL(KXdmDmIdTableSize); + CleanupStack::PushL( allIds ); // << allIds + MSmlDmAdapter::TError status; + // Fetch all IAP ids + Callback().FetchLinkL( KXdmDmAP, *allIds, status ); + + if ( status == MSmlDmAdapter::EOk ) + { + TInt index(0); + TInt segStart(0); + while ( index != KErrNotFound ) + { + // Get pointer from segStart + TPtrC8 allIdsPtr = allIds->Ptr(segStart).Mid(0); + // Find the end of the segment + index = allIdsPtr.Locate('/'); + HBufC8* uriSeg = NULL; + // This is the last one + if ( index == KErrNotFound ) + { + TPtrC8 uriSeg8Ptr = allIds->Ptr(segStart); + uriSeg = uriSeg8Ptr.AllocLC(); // << uriSeg + } + else + { + TPtrC8 uriSeg8Ptr = allIds->Ptr(segStart).Mid( 0, index ); + uriSeg = uriSeg8Ptr.AllocLC(); // << uriSeg8Ptr + } + // Construct the uri + HBufC8* uri = HBufC8::NewLC( KXdmDmAP().Length() + + KXdmDmSeparator().Length() + + uriSeg->Length() ); // << uri + TPtr8 uriPtr = uri->Des(); + uriPtr.Format( KXdmDmAP ); + uriPtr.Append( KXdmDmSeparator ); + uriPtr.Append( *uriSeg ); + // Get the luid from the uri + HBufC8* luid = Callback().GetLuidAllocL( uriPtr ); + if ( luid && luid->Length() > 0 ) + { + // No need to push luid to the CleanupStack + TInt id = DesToInt( luid->Des() ); + delete luid; + luid = NULL; + if ( id == aId ) + { + // The correct one found + CleanupStack::Pop(); // >>> uri + CleanupStack::PopAndDestroy( 2, allIds ); // >>> uriSeg, allIds + return uri; + } + } + // This was wrong, delete and get the next one + CleanupStack::PopAndDestroy( 2, uriSeg ); // >>> uri, uriSeg + segStart += index + 1; + } + } + CleanupStack::PopAndDestroy( allIds ); // >>> allIds + return NULL; + } +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::GetSipIdL +// ----------------------------------------------------------------------------- +// +TInt CXdmDMAdapter::GetSipIdL( const TDesC8& aUri ) + { + + CSmlDmAdapter::TError status = EOk; + CBufBase* result = CBufFlat::NewL(1); + CleanupStack::PushL( result ); // << result + + TPtrC8 uri = NSmlDmURI::RemoveDotSlash( aUri ); + // Request the sip settings identifier + Callback().FetchLinkL( uri, *result, status); + + if( status == EOk ) + { + TUint32 id( 0 ); + TPtrC8 hexIndex = uri.Right( KXdmDmHexLength ); + TLex8 lexer( hexIndex ); + lexer.Val( id, EHex ); + CleanupStack::PopAndDestroy( result ); // >>> result + return id; + } + CleanupStack::PopAndDestroy( result ); // >>> result + return KErrNotFound; + } +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::FetchSipConRefL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CXdmDMAdapter::FetchSipConRefL( TInt aSettingsId, + CBufBase& aObject) + { + + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + TInt sipSettingsId( KErrNotFound ); + + HBufC* value = NULL; + TInt error( KErrNone ); + TRAP( error, ( value = TXdmSettingsApi::PropertyL( aSettingsId, EXdmPropToAppRef ) ) ); + if ( error == KErrNone ) + { + sipSettingsId = DesToInt( *value ); + delete value; + value = NULL; + } + + if( sipSettingsId != KErrNotFound ) + { + CBufBase* result = CBufFlat::NewL(1); + CleanupStack::PushL(result); // << result + + // Request all the sip settings identifiers + Callback().FetchLinkL( KXdmDmSip, *result, status); + + if( status == EOk ) + { + TPtr8 uriSeg8Ptr = result->Ptr(0); + + HBufC8* uriSegBuffer = uriSeg8Ptr.AllocL(); + CleanupStack::PushL( uriSegBuffer ); // << uriSegBuffer + + TPtr8 uriSegBufferPtr = uriSegBuffer->Des(); + + TInt numOfUriSegs = NSmlDmURI::NumOfURISegs(uriSeg8Ptr); + + // Check if the SIP settings id match with one of the found + // SIP settings identifiers + while( numOfUriSegs > 1) + { + uriSegBufferPtr = NSmlDmURI::RemoveLastSeg(uriSegBufferPtr); + + TPtrC8 hexIndex = uriSegBufferPtr.Right(KXdmDmHexLength); + + TUint32 id(0); + TLex8 lexer(hexIndex); + if( lexer.Val(id, EHex) == KErrNone ) + { + if( id == sipSettingsId ) + { + TPtrC8 lastUriSegSip = NSmlDmURI::LastURISeg(uriSegBufferPtr); + + // Total length of the sip settings link where one is for + // the separator + TInt sipLinkLength = KXdmDmSip().Length() + + KXdmDmSeparator().Length() + + lastUriSegSip.Length(); + HBufC8* sipLink = HBufC8::NewLC( sipLinkLength ); // <<< sipLink + + TPtr8 sipLinkPtr = sipLink->Des(); + sipLinkPtr.Append( KXdmDmSip ); + sipLinkPtr.Append( KXdmDmSeparator ); + sipLinkPtr.Append( lastUriSegSip ); + + aObject.InsertL( 0, sipLinkPtr ); + + CleanupStack::PopAndDestroy( sipLink ); // >>> sipLink + break; + } + } + + numOfUriSegs -= 1; + } + + CleanupStack::PopAndDestroy( uriSegBuffer ); // >>> uriSegBuffer + } + + CleanupStack::PopAndDestroy( result ); // >>> result + } + else + { + status = CSmlDmAdapter::ENotFound; + } + + return status; + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::FindSettingsIdL +// ----------------------------------------------------------------------------- +// +TInt CXdmDMAdapter::FindSettingsIdL( const TDesC8& aLUID, const TDesC8& aUri ) + { + TInt settingsId(0); + if ( aLUID.Length() > 0 ) + { + settingsId = DesToInt( aLUID ); + return settingsId; + } + else + { + TPtrC8 name = NSmlDmURI:: URISeg( aUri, KXdmDmLevel ); + settingsId = DesToInt( name ); + HBufC8* luid = IntToDes8LC( settingsId ); // << luid + Callback().SetMappingL( aUri, *luid ); + CleanupStack::PopAndDestroy( luid ); // luid + return settingsId; + } + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::CheckExistingNamesLC() +// ----------------------------------------------------------------------------- +// +HBufC* CXdmDMAdapter::CheckExistingNamesLC( const TDesC8& aName ) + { + TBool ready( EFalse ); + RArray settingIds; + CleanupClosePushL( settingIds ); // << settingIds + CDesCArray* settingNames = TXdmSettingsApi::CollectionNamesLC( settingIds ); // << settingNames + TInt index( 0 ); + TBuf<512> tempName; + while ( !ready ) + { + TBool found ( EFalse ); + TInt count = settingNames->MdcaCount(); + tempName.Copy( aName ); + if ( index > 0 ) + { + tempName.Append( KXdmDmStartBracket ); + tempName.AppendNumFixedWidth( index, EDecimal, 2 ); + tempName.Append( KXdmDmCloseBracket ); + } + for ( TInt i(0); i < count && !found; i++ ) + { + if ( !settingNames->MdcaPoint(i).CompareF( tempName ) ) + { + found = ETrue; + index++; + } + } + if ( !found ) + { + ready = ETrue; + } + } + CleanupStack::PopAndDestroy( 2 ); // >>> settingNames, settingIds + HBufC* newName = tempName.AllocLC(); // << newName + return newName; + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::Match +// ----------------------------------------------------------------------------- +// +TBool CXdmDMAdapter::Match( const TDesC8& aLeft, const TDesC8& aRight ) + { + if ( !aLeft.Compare( aRight ) ) + { + return ETrue; + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::ConvertLC +// ----------------------------------------------------------------------------- +// +HBufC8* CXdmDMAdapter::ConvertLC( const TDesC& aSource ) + { + HBufC8* destination = HBufC8::NewLC( aSource.Length() ); // << destination + TPtr8 bufferPtr = destination->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( bufferPtr, aSource ); + return destination; + } + +// ----------------------------------------------------------------------------- +// CXdmDMAdapter::ConvertLC +// ----------------------------------------------------------------------------- +// +HBufC* CXdmDMAdapter::ConvertLC( const TDesC8& aSource ) + { + HBufC* destination = HBufC::NewLC( aSource.Length() ); // << destination + TPtr bufferPtr = destination->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( bufferPtr, aSource ); + return destination; + } +// ---------------------------------------------------------------------------- +// CXdmDMAdapter::DesToInt +// ---------------------------------------------------------------------------- +TInt CXdmDMAdapter::DesToInt( const TDesC& aSource ) const + { + TLex16 lex( aSource ); + TInt value ( KErrNotFound ); + lex.Val( value ); + return value; + } + +// ---------------------------------------------------------------------------- +// CXdmDMAdapter::DesToInt +// ---------------------------------------------------------------------------- +TInt CXdmDMAdapter::DesToInt( const TDesC8& aSource ) const + { + TLex8 lex( aSource ); + TInt value ( KErrNotFound ); + lex.Val( value ); + return value; + } + +// ---------------------------------------------------------------------------- +// CXdmDMAdapter::IntToDes8LC +// ---------------------------------------------------------------------------- +HBufC8* CXdmDMAdapter::IntToDes8LC( const TInt aSource ) + { + // 10 = max length of 32bit integer + HBufC8* buf = HBufC8::NewLC( KXdmDmMaxIntLength ); // << buf + TPtr8 ptrBuf = buf->Des(); + ptrBuf.Num( aSource ); + return buf; + } + +// ---------------------------------------------------- +// CXdmDMAdapter::WriteToLog +// DEBUG only +// ---------------------------------------------------- +// +#ifdef _DEBUG +void CXdmDMAdapter::WriteToLog( TRefByValue aFmt,... ) + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + RFileLogger::Write( KXdmDmLogDir, KXdmDmLogFile, EFileLoggingModeAppend, buf ); + } +#endif + +// End of File + + +