diff -r 000000000000 -r c8caa15ef882 simpleengine/presencedm/src/presencedmadapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpleengine/presencedm/src/presencedmadapter.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,1437 @@ +/* +* Copyright (c) 2006-2009 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: OMA Presence Settings Device Management Adapter's source file +* +*/ + +#include +#include +#include +#include +#include + +#include "presencedmadapter.h" +#include "presencedmlogger.h" + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::NewL() +// ----------------------------------------------------------------------------- +// +CPresenceDMAdapter* CPresenceDMAdapter::NewL(MSmlDmCallback* aDmCallback ) + { + PRES_DM_LOG(LOG_LIT("NewL start")); + CPresenceDMAdapter* self = new (ELeave) CPresenceDMAdapter( aDmCallback ); + PRES_DM_LOG(LOG_LIT(" NewL end")); + return self; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::CPresenceDMAdapter() +// ----------------------------------------------------------------------------- +// +CPresenceDMAdapter::CPresenceDMAdapter(MSmlDmCallback* aDmCallback) : + CSmlDmAdapter( aDmCallback ), iGetSetID(KErrNotFound) + { + PRES_DM_LOG(LOG_LIT("CPresenceDMAdapter")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::~CPresenceDMAdapter() +// ----------------------------------------------------------------------------- +// +CPresenceDMAdapter::~CPresenceDMAdapter() + { + PRES_DM_LOG(LOG_LIT("~CPresenceDMAdapter")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::DDFVersionL +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::DDFVersionL(CBufBase& aDDFVersion) + { + PRES_DM_LOG(LOG_LIT("DDFVersionL")); + aDDFVersion.InsertL( 0, KPresDMDDFVersion ); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::DDFStructureL +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::DDFStructureL( MSmlDmDDFObject& aDDF ) + { + PRES_DM_LOG(LOG_LIT("DDFStructureL")); + + // For OMA_PRESENCE + TSmlDmAccessTypes accessTypeGet; + accessTypeGet.SetGet(); + + // For OMA_PRESENCE/ + TSmlDmAccessTypes accessTypeAll; + accessTypeAll.SetAdd(); + accessTypeAll.SetGet(); + accessTypeAll.SetReplace(); + accessTypeAll.SetDelete(); + + // For leaf nodes + TSmlDmAccessTypes accessTypeNoDelete; + accessTypeNoDelete.SetAdd(); + accessTypeNoDelete.SetGet(); + accessTypeNoDelete.SetReplace(); + + // ./OMA_PRESENCE + MSmlDmDDFObject& omaPresNode = aDDF.AddChildObjectL( KPresDMNodeName ); + FillNodeInfoL( omaPresNode, accessTypeGet, MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, MSmlDmDDFObject::ENode, + KPresDMNodeNameDescription ); + + // ./OMA_PRESENCE/ + MSmlDmDDFObject& runTimeNode = omaPresNode.AddChildObjectGroupL(); + FillNodeInfoL( runTimeNode, accessTypeAll, MSmlDmDDFObject::EZeroOrMore, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode, + KPresDmDynamicDescription ); + + // ./OMA_PRESENCE//NAME + MSmlDmDDFObject& nameNode = runTimeNode.AddChildObjectL( KPresDMName ); + FillNodeInfoL( nameNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KPresDMNameDescription ); + + // ./OMA_PRESENCE//PROVIDER-ID + MSmlDmDDFObject& providerIdNode = runTimeNode.AddChildObjectL( KPresDMProviderId ); + FillNodeInfoL( providerIdNode, accessTypeNoDelete,MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KPresDMProviderIdDescription ); + + // ./OMA_PRESENCE//ToConRef + MSmlDmDDFObject& toConRefNode = runTimeNode.AddChildObjectL( KPresDMToConRef ); + FillNodeInfoL( toConRefNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode, + KPresDMToConRefDescription); + + // ./OMA_PRESENCE//ToConRef/SIP-PROFILE (Towards SIP ID) + MSmlDmDDFObject& napIdSIPNode = toConRefNode.AddChildObjectL( KPresDMSIPProfile ); + FillNodeInfoL( napIdSIPNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode, + KPresDMSIPProfileDescription ); + + // ./OMA_PRESENCE//ToConRef/SIP-PROFILE/ConRef (The actual SIP ID) + MSmlDmDDFObject& conRefSipNode = napIdSIPNode.AddChildObjectL( KPresDMConRef ); + FillNodeInfoL( conRefSipNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KPresDMConRefDescription ); + + // ./OMA_PRESENCE//ToConRef/XDM-SET (To XDM-ID) (Towards XDM ID) + MSmlDmDDFObject& napIdToXDMNode = toConRefNode.AddChildObjectL( KPresDMXDMSet ); + FillNodeInfoL( napIdToXDMNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode, + KPresDMXDMSetDescription ); + + // ./OMA_PRESENCE//ToConRef/XDM-SET/ConRef (actual XDM node) + MSmlDmDDFObject& conRefXDMNode = napIdToXDMNode.AddChildObjectL( KPresDMConRef ); + FillNodeInfoL( conRefXDMNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr, + KPresDMConRefDescription ); + + // ./OMA_PRESENCE//CLIENT-DATA-OBJ-LIMIT + MSmlDmDDFObject& dataObjNode = runTimeNode.AddChildObjectL( KPresDMClientObjDataLim ); + FillNodeInfoL( dataObjNode, accessTypeNoDelete, MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EInt, + KPresDMClientObjDataLimDescription ); + + // ./OMA_PRESENCE//CONTENT-SERVER-URI + MSmlDmDDFObject& ContentSrvNode = runTimeNode.AddChildObjectL( KPresDMContentSrvUri ); + FillNodeInfoL( ContentSrvNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KPresDMContentSrvUriDescription ); + + // ./OMA_PRESENCE//SOURCE-THROTTLE-PUBLISH + MSmlDmDDFObject& srcThrotNode = runTimeNode.AddChildObjectL( KPresDMSrcThPublish ); + FillNodeInfoL( srcThrotNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EInt, + KPresDMSrcThPublishDescription ); + + // ./OMA_PRESENCE//MAX-NUMBER-OF-PRESENCE-SUBSCRIPTIONS + MSmlDmDDFObject& maxSubsNode = runTimeNode.AddChildObjectL( KPresDMMaxPresSubs ); + FillNodeInfoL( maxSubsNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EInt, + KPresDMMaxPresSubsDescription ); + + // ./OMA_PRESENCE//MAX-NUMBER-OF-SUBSCRIPTIONS-IN-PRESENCE-LIST + MSmlDmDDFObject& maxSubsListNode = runTimeNode.AddChildObjectL( KPresDMMaxPresSubsInLists ); + FillNodeInfoL( maxSubsListNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EInt, + KPresDMMaxPresSubsInListsDescription ); + + // ./OMA_PRESENCE//SERVICE-URI-TEMPLATE + MSmlDmDDFObject& serUriTempNode = runTimeNode.AddChildObjectL( KPresDMServiceUriTemp ); + FillNodeInfoL( serUriTempNode, accessTypeNoDelete, MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr, + KPresDMServiceUriTempDescription ); + + PRES_DM_LOG(LOG_LIT(" DDFStructureL end")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::ChildURIListL +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::ChildURIListL( const TDesC8& aUri, + const TDesC8& /*aLUID*/, + const CArrayFix& + /*aPreviousURISegmentList*/, + const TInt aResultsRef, + const TInt aStatusRef ) + { + PRES_DM_LOG(LOG_LIT8("ChildURIListL(%S): begin"), &aUri); + const TInt KPresDMSegmentNameLen = 50; + + CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk; + + CBufBase* currentList = CBufFlat::NewL(1); + CleanupStack::PushL( currentList ); // << currentList + + const TPtrC8 lastUriSeg = NSmlDmURI::LastURISeg( aUri ); + TBuf8 segmentName; + + // ./OMA_PRESENCE + if( !lastUriSeg.Compare( KPresDMNodeName ) ) + { + PRES_DM_LOG(LOG_LIT8(" ./OMA_PRESENCE")); + RArray settingIds; + CleanupClosePushL( settingIds ); // << settingIds + CDesCArray* names = PresSettingsApi::GetAllSetsNamesLC(settingIds); + TInt IdCount = settingIds.Count(); + + PRES_DM_LOG(LOG_LIT(" IdCount = %d"), IdCount); + + for( TInt i(0); i < IdCount; i++ ) + { + TInt id = settingIds[i]; + segmentName.Copy( KNullDesC8 ); + segmentName.AppendNum( id ); + currentList->InsertL( currentList->Size(), segmentName); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + } + CleanupStack::PopAndDestroy(names); + CleanupStack::PopAndDestroy(1); // settingIds, + + Callback().SetResultsL( aResultsRef, *currentList, KNullDesC8 ); + Callback().SetStatusL( aStatusRef, retValue ); + CleanupStack::PopAndDestroy( currentList ); // >>> currentList + currentList = NULL; + return; + } + + // ./OMA_PRESENCE/X + if( NSmlDmURI::NumOfURISegs( aUri ) == KPresDMLevel ) // if Uri segments are 2 + // we are certainly at x + // level + { + PRES_DM_LOG(LOG_LIT8(" ./OMA_PRESENCE/X")); + + segmentName.Copy( KPresDMName ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMProviderId ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMToConRef ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMClientObjDataLim ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMContentSrvUri ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMSrcThPublish ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMMaxPresSubs ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMMaxPresSubsInLists ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMServiceUriTemp ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + } + + // ./OMA_PRESENCE/X/ToConRef + else if ( !lastUriSeg.Compare( KPresDMToConRef ) ) + { + PRES_DM_LOG(LOG_LIT8(" ./OMA_PRESENCE/X/ToConRef")); + segmentName.Copy( KPresDMSIPProfile ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + + segmentName.Copy( KPresDMXDMSet ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + } + + // ./OMA_PRESENCE/X/ToConRef/SIP-ID + else if ( !lastUriSeg.Compare( KPresDMSIPProfile ) ) + { + PRES_DM_LOG(LOG_LIT8(" ./OMA_PRESENCE/X/ToConRef/SIP-ID")); + segmentName.Copy( KPresDMConRef ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + } + + // ./OMA_PRESENCE/X/ToConRef/XDM-ID + else if ( !lastUriSeg.Compare( KPresDMXDMSet ) ) + { + PRES_DM_LOG(LOG_LIT8(" ./OMA_PRESENCE/X/ToConRef/XDM-ID")); + segmentName.Copy( KPresDMConRef ); + currentList->InsertL( currentList->Size(), segmentName ); + currentList->InsertL( currentList->Size(), KPresDMSeparator ); + } + + 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 + PRES_DM_LOG(LOG_LIT(" ChildURIListL(): end") ); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::FetchLeafObjectL +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::FetchLeafObjectL( const TDesC8& aUri, + const TDesC8& /*aLUID*/, + const TDesC8& aType, + const TInt aResultsRef, + const TInt aStatusRef ) + { + PRES_DM_LOG(LOG_LIT8("FetchLeafObjectL(%S): start"), &aUri ); + CBufBase* result = CBufFlat::NewL( KPresDMDefaultResultSize ); + CleanupStack::PushL( result ); // << result + CSmlDmAdapter::TError status = FetchObjectL( aUri, *result ); + if( status == CSmlDmAdapter::EOk ) + { + Callback().SetResultsL( aResultsRef,*result,aType ); + } + Callback().SetStatusL(aStatusRef, status); + CleanupStack::PopAndDestroy(result); // >>> result + + PRES_DM_LOG(LOG_LIT(" FetchLeafObjectL(): end") ); + } + +// ----------------------------------------------------------------------------- +// CSmlDmAdapter::TError FetchObjectL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CPresenceDMAdapter::FetchObjectL( const TDesC8& aUri, + CBufBase& aObject) + { + PRES_DM_LOG(LOG_LIT8("FetchObjectL(%S): start"), &aUri); + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + + TPresSettingsSet tempSet; + TPresSettingsProperty property; + + HBufC8* luid = Callback().GetLuidAllocL( aUri ); + PRES_DM_LOG(LOG_LIT8(" GetLuidAllocL() => '%S'"), luid ); + TInt settingsId = DesToInt( *luid ); + + PRES_DM_LOG(LOG_LIT(" settingsId after callback:%d"), settingsId); + + // check whether above found id is valid or not + if (!IsPresIDValidL(settingsId)) + { + //try to find it another way + if( NSmlDmURI::NumOfURISegs( aUri ) > 1 ) + { + TPtrC8 idSegment = NSmlDmURI::URISeg( aUri, 2 ); + settingsId = DesToInt(idSegment); + if(!IsPresIDValidL(settingsId)) + { + status = CSmlDmAdapter::ENotFound; + } + PRES_DM_LOG(LOG_LIT(" settingsId found local way:%d"), settingsId); + } + } + + // if previous settings id processing was ok + if (status == CSmlDmAdapter::EOk) + { + TPtrC8 lastUriSeg = NSmlDmURI::LastURISeg( aUri ); + // NAME + if( Match(lastUriSeg, KPresDMName ) ) + { + property = EPresPropSetName; + } + // PROVIDER-ID + else if( Match(lastUriSeg, KPresDMProviderId ) ) + { + property = EPresPropProviderID; + } + // Client object data limit + else if( Match(lastUriSeg, KPresDMClientObjDataLim) ) + { + property = EPresPropObjectSize; + } + // content server Uri + else if( Match(lastUriSeg, KPresDMContentSrvUri) ) + { + property = EPresPropContSrvAdd; + } + // Source throttle publish + else if( Match(lastUriSeg, KPresDMSrcThPublish) ) + { + property = EPresPropPubInterval; + } + // Max pres subs + else if( Match(lastUriSeg, KPresDMMaxPresSubs ) ) + { + property = EPresPropMaxSubs; + } + // max subs in lists + else if( Match(lastUriSeg, KPresDMMaxPresSubsInLists ) ) + { + property = EPresPropMaxCntInList; + } + // service uri template + else if( Match(lastUriSeg, KPresDMServiceUriTemp ) ) + { + property = EPresPropDomainSyntax; + } + + // ConRef/TO-SIP + // ConRef/TO-XDM + else if( Match( lastUriSeg, KPresDMConRef) ) + { + TPtrC8 conRefUri = NSmlDmURI::RemoveLastSeg( aUri ); + TPtrC8 lastConRefSeg = NSmlDmURI::LastURISeg( conRefUri ); + + if( Match( lastConRefSeg, KPresDMSIPProfile ) ) + { + property = EPresPropSIPProfile; + } + else if( Match( lastConRefSeg, KPresDMXDMSet ) ) + { + property = EPresPropXDMSet; + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + + // known property + if ( status == CSmlDmAdapter::EOk ) + { + status = GetPropertyL( settingsId, property, aObject ) ; + PRES_DM_LOG(LOG_LIT(" GetPropertyL status: %d"), status); + } + + PRES_DM_LOG(LOG_LIT(" FetchObjectL: ends")); + return status; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::FetchLeafObjectSizeL +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::FetchLeafObjectSizeL( const TDesC8& aUri, + const TDesC8& /*aLUID*/, + const TDesC8& aType, + const TInt aResultsRef, + const TInt aStatusRef ) + { + PRES_DM_LOG(LOG_LIT8("FetchLeafObjectSizeL(%S): begins"), &aUri); + CBufBase* result = CBufFlat::NewL( KPresDMDefaultResultSize ); + CleanupStack::PushL( result ); + CSmlDmAdapter::TError status = FetchObjectL( aUri, *result ); + PRES_DM_LOG(LOG_LIT(" FetchObjectL: status = %d"), status); + if( status == CSmlDmAdapter::EOk ) + { + TInt objSizeInBytes = result->Size(); + PRES_DM_LOG(LOG_LIT(" objSizeInBytes = %d"), objSizeInBytes); + + TBuf8 stringObjSizeInBytes; + stringObjSizeInBytes.Num( objSizeInBytes ); + + result->Reset(); + result->InsertL( 0, stringObjSizeInBytes ); + + Callback().SetResultsL( aResultsRef, *result, aType ); + } + + Callback().SetStatusL( aStatusRef, status) ; + CleanupStack::PopAndDestroy(result); + PRES_DM_LOG(LOG_LIT(" FetchLeafObjectSizeL: ends")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::UpdateLeafObjectL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::UpdateLeafObjectL(const TDesC8& aUri, + const TDesC8& /*aLUID*/, + const TDesC8& aObject, + const TDesC8& /*aType*/, + const TInt aStatusRef) + { + PRES_DM_LOG(LOG_LIT8("UpdateLeafObjectL(%S): starts"), &aUri); + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + + TPresSettingsSet tempSet; + TPresSettingsProperty property; + + HBufC8* luid = Callback().GetLuidAllocL( aUri ); + TInt settingsId = DesToInt( *luid ); + + PRES_DM_LOG(LOG_LIT(" settingsId after callback:%d"), settingsId); + + // check whether above found id is valid or not + if (!IsPresIDValidL(settingsId)) + { + //try to find it another way + if( NSmlDmURI::NumOfURISegs( aUri ) > 1 ) + { + TPtrC8 idSegment = NSmlDmURI::URISeg( aUri, 2 ); + settingsId = DesToInt(idSegment); + if (!IsPresIDValidL(settingsId)) + { + status = CSmlDmAdapter::ENotFound; + } + PRES_DM_LOG(LOG_LIT(" settingsId found local way:%d"), settingsId); + } + } + + // if previous settings id processing was ok + if (status == CSmlDmAdapter::EOk) + { + TPtrC8 lastUriSeg = NSmlDmURI::LastURISeg( aUri ); + + // NAME + if( Match(lastUriSeg, KPresDMName ) ) + { + property = EPresPropSetName; + } + // PROVIDER-ID + else if( Match(lastUriSeg, KPresDMProviderId ) ) + { + property = EPresPropProviderID; + } + // Client object data limit + else if( Match(lastUriSeg, KPresDMClientObjDataLim) ) + { + property = EPresPropObjectSize; + } + // content server Uri + else if( Match(lastUriSeg, KPresDMContentSrvUri) ) + { + property = EPresPropContSrvAdd; + } + // Source throttle publish + else if( Match(lastUriSeg, KPresDMSrcThPublish) ) + { + property = EPresPropPubInterval; + } + // Max pres subs + else if( Match(lastUriSeg, KPresDMMaxPresSubs ) ) + { + property = EPresPropMaxSubs; + } + // max subs in lists + else if( Match(lastUriSeg, KPresDMMaxPresSubsInLists ) ) + { + property = EPresPropMaxCntInList; + } + // service uri template + else if( Match(lastUriSeg, KPresDMServiceUriTemp ) ) + { + property = EPresPropDomainSyntax; + } + + // ToConRef/TO-SIP/ConRef + // ToConRef/TO-XDM/ConRef + else if( Match( lastUriSeg, KPresDMConRef) ) + { + TPtrC8 conRefUri = NSmlDmURI::RemoveLastSeg( aUri ); + TPtrC8 lastConRefSeg = NSmlDmURI::LastURISeg( conRefUri ); + + if( Match( lastConRefSeg, KPresDMSIPProfile ) ) + { + property = EPresPropSIPProfile; + } + else if( Match( lastConRefSeg, KPresDMXDMSet ) ) + { + property = EPresPropXDMSet; + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + else + { + status = CSmlDmAdapter::ENotFound; + } + } + + else // if id is not valid + { + status = CSmlDmAdapter::ENotFound; + } + + // known property and id is ok + if ( status == CSmlDmAdapter::EOk ) + { + status = UpdatePropertyL( settingsId, property, aObject ); + PRES_DM_LOG(LOG_LIT(" UpdatePropertyL status: %d"), status); + } + + Callback().SetStatusL(aStatusRef, status); + + PRES_DM_LOG(LOG_LIT(" UpdateLeafObjectL: ends")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::AddNodeObjectL +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::AddNodeObjectL( const TDesC8& aUri, + const TDesC8& /*aParentLUID*/, + const TInt aStatusRef ) + { + PRES_DM_LOG(LOG_LIT8("AddNodeObjectL(%S): begins"), &aUri); + + CSmlDmAdapter::TError status = CSmlDmAdapter::EError; + HBufC* lastUriSegment; + + if (!NSmlDmURI::RemoveLastSeg( aUri ).Compare( KPresDMNodeName )) + { + // Both the Name and provider id of new set, we are setting from + // lastUrisegment, they will expectedly changed by the next calls + // to this function by the framework + lastUriSegment = ConvertLC(NSmlDmURI::LastURISeg(aUri)); + TPresSettingsSet mySet; // New set to be created + + // Processing for set name + if (lastUriSegment->Length() > KPresSetNameMaxLength) + (mySet.iSetName).Copy(lastUriSegment->Left(KPresSetNameMaxLength)); + else + (mySet.iSetName).Copy(lastUriSegment->Des()); + CheckDuplicateNameL(mySet.iSetName, 0); + + // Processing for provider ID + if (lastUriSegment->Length() > KPresProviderIDMaxLength) + (mySet.iProviderID).Copy(lastUriSegment->Left(KPresProviderIDMaxLength)); + else + (mySet.iProviderID).Copy(lastUriSegment->Des()); + + TInt id = PresSettingsApi::CreateSetL(mySet); + PRES_DM_LOG(LOG_LIT(" New set id(%d)"), id); + HBufC8* luid = IntToDes8LC( id ); // << luid + Callback().SetMappingL( aUri, *luid ); + CleanupStack::PopAndDestroy(luid); // luid + CleanupStack::PopAndDestroy(lastUriSegment); //lastUriSegment + + + if(id>0) // if set is created successfully + { + status = CSmlDmAdapter::EOk; + } + } + Callback().SetStatusL( aStatusRef, status ); + PRES_DM_LOG(LOG_LIT(" status(%d)"), status); + PRES_DM_LOG(LOG_LIT(" AddNodeObjectL: ends")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::DeleteObjectL +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::DeleteObjectL( const TDesC8& aUri, + const TDesC8& aLUID, + const TInt aStatusRef ) + { + PRES_DM_LOG(LOG_LIT8("DeleteObjectL(%S): begins"), &aUri); + //only node object deletion is possible + + CSmlDmAdapter::TError status = CSmlDmAdapter::EError; + if ( !NSmlDmURI::RemoveLastSeg( aUri ).Compare( KPresDMNodeName ) ) + { + TInt id = DesToInt( aLUID ); + TInt error = PresSettingsApi::RemoveSetL(id); + if ( error == KErrNone ) + { + status = CSmlDmAdapter::EOk; + } + PRES_DM_LOG(LOG_LIT(" id(%d), error(%d), satus(%d)"), id, error, status); + } + Callback().SetStatusL( aStatusRef, status ); + PRES_DM_LOG(LOG_LIT(" DeleteObjectL: ends")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::UpdateLeafObjectL +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::UpdateLeafObjectL( const TDesC8& /*aUri*/, + const TDesC8& /*aLUID*/, + RWriteStream*& /*aStream*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + PRES_DM_LOG(LOG_LIT("UpdateLeafObjectL: begins")); + // Update from stream not used + Callback().SetStatusL(aStatusRef, CSmlDmAdapter::EError); + + PRES_DM_LOG(LOG_LIT(" UpdateLeafObjectL(stream): end")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::ExecuteCommandL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::ExecuteCommandL( const TDesC8& /*aUri*/, + const TDesC8& /*aLUID*/, + const TDesC8& /*aArgument*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + // Not supported + PRES_DM_LOG(LOG_LIT("ExecuteCommandL")); + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::ExecuteCommandL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::ExecuteCommandL( const TDesC8& /*aUri*/, + const TDesC8& /*aLUID*/, + RWriteStream*& /*aStream*/, + const TDesC8& /*aType*/, + const TInt aStatusRef ) + { + // Not supported + PRES_DM_LOG(LOG_LIT("ExecuteCommandL")); + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::CopyCommandL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::CopyCommandL( const TDesC8& /*aTargetURI*/, + const TDesC8& /*aTargetLUID*/, + const TDesC8& /*aSourceURI*/, + const TDesC8& /*aSourceLUID*/, + const TDesC8& /*aType*/, + TInt aStatusRef ) + { + // Not supported + PRES_DM_LOG(LOG_LIT("CopyCommandL")); + Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::StartAtomicL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::StartAtomicL() + { + PRES_DM_LOG(LOG_LIT("StartAtomicL")); + // Not supported + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::CommitAtomicL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::CommitAtomicL() + { + PRES_DM_LOG(LOG_LIT("CommitAtomicL")); + // Not supported + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::RollbackAtomicL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::RollbackAtomicL() + { + PRES_DM_LOG(LOG_LIT("RollbackAtomicL")); + // Not supported + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::StreamingSupport() +// ----------------------------------------------------------------------------- +// +TBool CPresenceDMAdapter::StreamingSupport( TInt& /*aItemSize*/ ) + { + PRES_DM_LOG(LOG_LIT("StreamingSupport")); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::StreamCommittedL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::StreamCommittedL() + { + PRES_DM_LOG(LOG_LIT("StreamCommittedL")); + // Not supported + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::CompleteOutstandingCmdsL() +// ----------------------------------------------------------------------------- +// +void CPresenceDMAdapter::CompleteOutstandingCmdsL() + { + PRES_DM_LOG(LOG_LIT("CompleteOutstandingCmdsL")); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::GetPropertyL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CPresenceDMAdapter::GetPropertyL( TInt aSetId, + TPresSettingsProperty aProperty, + CBufBase& aObject ) + { + PRES_DM_LOG(LOG_LIT(" GetPropertyL(%d, %d)"),aSetId,aProperty); + + HBufC* value = NULL; + TInt error( KErrNone ); + + + // Get the set only if we dont have it in internal buffer + if(iGetSetID != aSetId) + { + error = PresSettingsApi:: SettingsSetL(aSetId, iGetSet); + if(error==KErrNone) + iGetSetID = aSetId; + PRES_DM_LOG(LOG_LIT(" error(%d)"),error); + } + + if (error == KErrNone) + { + switch (aProperty) + { + case EPresPropSetName: + value = (iGetSet.iSetName).AllocLC(); + break; + case EPresPropProviderID: + value = (iGetSet.iProviderID).AllocLC(); + break; + case EPresPropSIPProfile: + return GetConRefFromSipIDL(iGetSet.iSipProfile, aObject); + case EPresPropXDMSet: + return GetConRefFromXdmIDL(iGetSet.iXDMSetting, aObject); + case EPresPropObjectSize: + value = IntToDesLC(iGetSet.iObjectSize); + break; + case EPresPropContSrvAdd: + value = (iGetSet.iContSrvrAdd).AllocLC(); + break; + case EPresPropPubInterval: + value = IntToDesLC(iGetSet.iPublicationInt); + break; + case EPresPropMaxSubs: + value = IntToDesLC(iGetSet.iMaxSubscriptions); + break; + case EPresPropMaxCntInList: + value = IntToDesLC(iGetSet.iMaxContactsInList); + break; + case EPresPropDomainSyntax: + value = (iGetSet.iDomainSyntax).AllocLC(); + break; + default: + error = KErrNotFound; + break; + } + } + + PRES_DM_LOG(LOG_LIT(" value = %S"), &(*value)); + + if ( error == KErrNone ) + { + HBufC8* utfValue = ConvertLC( *value ); // << utfValue + aObject.InsertL( 0, *utfValue ); + CleanupStack::PopAndDestroy(utfValue); // >>> utfValue + CleanupStack::PopAndDestroy(value); // >>> value + PRES_DM_LOG(LOG_LIT(" return( EOk )")); + return CSmlDmAdapter::EOk; + } + PRES_DM_LOG(LOG_LIT(" return( ENotFound )")); + return CSmlDmAdapter::ENotFound; + } + + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::UpdatePropertyL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CPresenceDMAdapter::UpdatePropertyL( TInt aSetId, + TPresSettingsProperty aProperty, + const TDesC8& aObject ) + { + PRES_DM_LOG(LOG_LIT(" UpdatePropertyL(%d, %d)"),aSetId,aProperty); + + TInt valueInt(KErrNotFound); + HBufC* value = ConvertLC(aObject); // value + TPtr ptr = value->Des(); + CSmlDmAdapter::TError result = CSmlDmAdapter::EError; + TInt error(KErrNone); + + // we handle SIP and XDM references in a different way + if(aProperty == EPresPropSIPProfile) + { + valueInt = GetSipIdFromConRefL(aObject); + } + + else if(aProperty == EPresPropXDMSet) + { + valueInt = GetXdmIdFromConRefL(aObject); + } + + // for all other properties use normal way to get value + else + { + valueInt = DesToInt(aObject); + } + + // for str properties + if(PresSettingsApi::IsStr(aProperty)) + { + if (SetProperLength(aProperty, ptr)) + { + if(aProperty == EPresPropSetName) + { + CheckDuplicateNameL(ptr, aSetId); + } + PRES_DM_LOG(LOG_LIT(" value = %S"),&(*value)); + error = PresSettingsApi::UpdatePropertyL( aSetId, aProperty, *value); + if(error == KErrNone) + result = CSmlDmAdapter::EOk; + + } + else + result = CSmlDmAdapter::EInvalidObject; + } + // for int properties + else if(valueInt > KErrNotFound) // if valid value + { + PRES_DM_LOG(LOG_LIT(" valueInt = %d"), valueInt); + error = PresSettingsApi::UpdatePropertyL( aSetId, aProperty, valueInt); + if(error == KErrNone) + result = CSmlDmAdapter::EOk; + } + else + result = CSmlDmAdapter::ENotFound; + + CleanupStack::PopAndDestroy(value); + + + PRES_DM_LOG(LOG_LIT(" error(%d) , result(%d)"), error, result); + return result; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::Match +// ----------------------------------------------------------------------------- +// +TBool CPresenceDMAdapter::Match( const TDesC8& aLeft, const TDesC8& aRight ) + { + if ( !aLeft.Compare( aRight ) ) + { + return ETrue; + } + return EFalse; + } + + // ----------------------------------------------------------------------------- +// CPresenceDMAdapter::FillNodeInfoL +// ------------------------------------------------------------------------------ +// +void CPresenceDMAdapter::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( KPresDMTextPlain ); + } + aNode.SetDescriptionL( aDescription ); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::ConvertLC +// ----------------------------------------------------------------------------- +// +HBufC8* CPresenceDMAdapter::ConvertLC( const TDesC& aSource ) const + { + HBufC8* destination = HBufC8::NewLC( aSource.Length() ); + TPtr8 bufferPtr = destination->Des(); + CnvUtfConverter::ConvertFromUnicodeToUtf8( bufferPtr, aSource ); + return destination; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::ConvertLC +// ----------------------------------------------------------------------------- +// +HBufC* CPresenceDMAdapter::ConvertLC( const TDesC8& aSource ) const + { + HBufC* destination = HBufC::NewLC(aSource.Length()); + TPtr bufferPtr = destination->Des(); + CnvUtfConverter::ConvertToUnicodeFromUtf8( bufferPtr, aSource ); + return destination; + } + +// ---------------------------------------------------------------------------- +// CPresenceDMAdapter::DesToInt +// ---------------------------------------------------------------------------- +TInt CPresenceDMAdapter::DesToInt( const TDesC8& aLuid ) const + { + TLex8 lex( aLuid ); + TInt value ( KErrNotFound ); + lex.Val( value ); + return value; + } + +// ---------------------------------------------------------------------------- +// CPresenceDMAdapter::IntToDes8LC +// ---------------------------------------------------------------------------- +HBufC8* CPresenceDMAdapter::IntToDes8LC( const TInt aLuid ) const + { + // 10 = max length of 32bit integer + HBufC8* buf = HBufC8::NewLC( KPresDMMaxIntLength ); // << buf + TPtr8 ptrBuf = buf->Des(); + ptrBuf.Num( aLuid ); + return buf; + } + +// ---------------------------------------------------------------------------- +// CPresenceDMAdapter::IntToDesLC +// ---------------------------------------------------------------------------- +HBufC* CPresenceDMAdapter::IntToDesLC( const TInt aLuid ) const + { + // 10 = max length of 32bit integer + HBufC* buf = HBufC::NewLC( KPresDMMaxIntLength ); // << buf + TPtr ptrBuf = buf->Des(); + ptrBuf.Num( aLuid ); + return buf; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::GetConRefFromSipIDL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CPresenceDMAdapter::GetConRefFromSipIDL( TInt aSipID, + CBufBase& aObject) + { + PRES_DM_LOG(LOG_LIT(" GetConRefFromSipIDL(aSipId:%d)"),aSipID); + + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + + TBool found(EFalse); + + if( aSipID != KErrNotFound ) + { + CBufBase* result = CBufFlat::NewL(1); + CleanupStack::PushL(result); // << result + + // Request all the sip settings identifiers + Callback().FetchLinkL( KPresDMSipDMNode, *result, status); + PRES_DM_LOG(LOG_LIT(" FetchLinkL(SIP) status : %d"), status ); + + if( status == EOk ) + { + TPtr8 uriSeg8Ptr = result->Ptr(0); + + HBufC8* uriSegBuffer = uriSeg8Ptr.AllocLC(); // << uriSegBuffer + PRES_DM_LOG(LOG_LIT8(" uri : '%S'"), uriSegBuffer ); + + TPtr8 uriSegBufferPtr = uriSegBuffer->Des(); + + TInt numOfUriSegs = NSmlDmURI::NumOfURISegs(uriSeg8Ptr); + + TBuf8<100> idLinkBuffer; + + TInt foundId(KErrNotFound); + + + // Check if given SIP set id match with any of found + // SIP settings identifiers + while( numOfUriSegs > 0 ) + { + idLinkBuffer = NSmlDmURI::LastURISeg(uriSegBufferPtr); + uriSegBufferPtr = NSmlDmURI::RemoveLastSeg(uriSegBufferPtr); + + idLinkBuffer.Insert(0, KPresDMSipDMNode); + idLinkBuffer.Insert(3, KPresDMSeparator); + idLinkBuffer.Append(KPresDMSeparator); + idLinkBuffer.Append(KPresDMSipIdPrefix); + + TPtrC8 finalLink = idLinkBuffer; + + //Reqest the ID + result->Reset(); + Callback().FetchLinkL( finalLink, *result, status); + PRES_DM_LOG(LOG_LIT8(" FetchLinkL(%S) status : %d"), &idLinkBuffer, status ); + if( status == EOk ) + { + foundId = DesToInt(result->Ptr(0)); + PRES_DM_LOG(LOG_LIT(" foundId : %d"), foundId ); + if (foundId == aSipID) + { + found = ETrue; + aObject.InsertL(0, NSmlDmURI::RemoveLastSeg(finalLink)); + break; + } + } + + numOfUriSegs--; + } + CleanupStack::PopAndDestroy( uriSegBuffer ); // >>> uriSegBuffer + } + + CleanupStack::PopAndDestroy( result ); // >>> result + } + if(found == EFalse) + { + status = CSmlDmAdapter::ENotFound; + } + + PRES_DM_LOG(LOG_LIT(" GetConRefFromSipIDL(%d): ends"), status); + + return status; + + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::GetConRefFromXdmIDL +// ----------------------------------------------------------------------------- +// +CSmlDmAdapter::TError CPresenceDMAdapter::GetConRefFromXdmIDL( TInt aXdmID, + CBufBase& aObject) + { + PRES_DM_LOG(LOG_LIT(" GetConRefFromXdmIDL(aXdmId:%d)"),aXdmID); + + CSmlDmAdapter::TError status = CSmlDmAdapter::ENotFound; + + if( aXdmID != KErrNotFound ) + { + CBufBase* result = CBufFlat::NewL(1); + CleanupStack::PushL(result); // << result + + // Request all the XDM settings identifiers + Callback().FetchLinkL( KPresDMXdmDMNode, *result, status); + PRES_DM_LOG(LOG_LIT(" FetchLinkL(XDM) status : %d"), status ); + TInt id(KErrNotFound); + + TPtrC8 lastUriSegXdm; + + if( status == EOk ) + { + TPtr8 uriSeg8Ptr = result->Ptr(0); + + HBufC8* uriSegBuffer = uriSeg8Ptr.AllocLC(); + + TPtr8 uriSegBufferPtr = uriSegBuffer->Des(); + + TInt numOfUriSegs = NSmlDmURI::NumOfURISegs(uriSeg8Ptr); + + // Check if the Presence settings XDM settings id match with one of the found + // XDM settings identifiers + while( numOfUriSegs > 0) + { + lastUriSegXdm.Set(NSmlDmURI::LastURISeg(uriSegBufferPtr)); + uriSegBufferPtr = NSmlDmURI::RemoveLastSeg(uriSegBufferPtr); + id = DesToInt(lastUriSegXdm); + + if(id == aXdmID) + { + // Total length of the sip settings link where one is for + // the separator + TInt XDMLinkLength = KPresDMXdmDMNode().Length() + + KPresDMSeparator().Length() + + lastUriSegXdm.Length(); + HBufC8* XDMLink = HBufC8::NewLC( XDMLinkLength ); // <<< XDMLink + + TPtr8 XDMLinkPtr = XDMLink->Des(); + + XDMLinkPtr.Append( KPresDMXdmDMNode ); + XDMLinkPtr.Append( KPresDMSeparator ); + XDMLinkPtr.Append( lastUriSegXdm ); + + aObject.InsertL( 0, XDMLinkPtr ); + + CleanupStack::PopAndDestroy( XDMLink ); // >>> XDMLink + status = CSmlDmAdapter::EOk; + break; + } + numOfUriSegs--; + } + CleanupStack::PopAndDestroy( uriSegBuffer ); // >>> uriSegBuffer + } + CleanupStack::PopAndDestroy( result ); // >>> result + } + + PRES_DM_LOG(LOG_LIT(" GetConRefFromXdmIDL(%d): ends"), status); + return status; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::IsPresIDValidL +// ----------------------------------------------------------------------------- +// +TBool CPresenceDMAdapter::IsPresIDValidL(TInt aSetId) + { + TPresSettingsSet tempSet; + if ((PresSettingsApi::SettingsSetL(aSetId,tempSet)) == KErrNone) + return ETrue; + PRES_DM_LOG(LOG_LIT8(" IsPresIDValidL - Invalid settings : %d"), aSetId ); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::GetSipIdFromConRefL +// ----------------------------------------------------------------------------- +// +TInt CPresenceDMAdapter::GetSipIdFromConRefL(const TDesC8& aUri ) + { + PRES_DM_LOG(LOG_LIT8(" GetSipIdFromConRefL(%S)"),&aUri); + + CSmlDmAdapter::TError status = EOk; + TInt returnId(KErrNotFound); + + CBufBase* result = CBufFlat::NewL(1); + CleanupStack::PushL(result); // << result + + // make all SIP profiles known + Callback().FetchLinkL( KPresDMSipDMNode, *result, status ); + + //TBuf8<300> resultBuf; + //result->Read(0, resultBuf,result->Size()); + + TPtrC8 uri = NSmlDmURI::RemoveDotSlash( aUri ); + TBuf8<50> object = uri; + + object.Append( KPresDMSeparator ); + object.Append( KPresDMSipIdPrefix ); + + result->Reset(); + Callback().FetchLinkL( object, *result, status); + + //resultBuf.Zero(); + //result->Read(0, resultBuf,result->Size()); + + if( status == EOk ) + { + TUint32 id = DesToInt( result->Ptr( 0 ) ); + returnId = (TInt)id; + } + CleanupStack::PopAndDestroy( result ); // >>> result + + PRES_DM_LOG(LOG_LIT(" status(%d), returnId(%d): end"), status, returnId); + + return returnId; + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::GetXdmIdFromConRefL +// ----------------------------------------------------------------------------- +// +TInt CPresenceDMAdapter::GetXdmIdFromConRefL(const TDesC8& aUri ) + { + PRES_DM_LOG(LOG_LIT8(" GetXdmIdFromConRefL(%S)"),&aUri); + const TInt KPresDMIdDesSize = 10; + + CSmlDmAdapter::TError status = EOk; + TInt id( KErrNotFound ); + TBuf8 idDes; + + CBufBase* result = CBufFlat::NewL(1); + CleanupStack::PushL(result); // << result + + TPtrC8 uri = NSmlDmURI::RemoveDotSlash( aUri ); + // Request the xdm settings identifier + Callback().FetchLinkL( uri, *result, status); + + if( status == EOk ) // if the link is valid. Wont use result + { + TPtrC8 idSegment = NSmlDmURI::LastURISeg(aUri); + id = DesToInt(idSegment); + } + CleanupStack::PopAndDestroy( result ); // >>> result + + PRES_DM_LOG(LOG_LIT(" status(%d), id(%d): end"), status, id); + return id; + } + +// --------------------------------------------------------------------------- +// CPresenceDMAdapter::GetPrefixL() +// --------------------------------------------------------------------------- +// +HBufC* CPresenceDMAdapter::GetPrefixL( HBufC* aName ) + { + TPtrC prefix = aName->Des(); + TInt lastBrace = aName->LocateReverse('('); + if ( lastBrace != KErrNotFound ) + { + // aName looks like "". + // See if is an integer number and + // ends to a brace. + TPtrC num = aName->Right( aName->Length() - lastBrace - 1 ); + TInt val; + TLex lex( num ); + if ( lex.Val( val ) == KErrNone && num.Locate(')') == num.Length() - 1 ) + { + // Yes, the trailer is an integer. + prefix.Set( aName->Left( lastBrace ) ); + } + } + return prefix.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::CheckDuplicateNameL +// Checks if duplicate named Presence Settings. Rename if same. +// ----------------------------------------------------------------------------- +void CPresenceDMAdapter::CheckDuplicateNameL( TDes& aSetName, const TInt& aSetId) + { + PRES_DM_LOG(LOG_LIT(" CheckDuplicateNameL(%S, %d)"),&aSetName, aSetId); + + _LIT( KPresDMNumbering, "(%N)" ); + const TInt KPresDMFormatExtraLen = 6; + + HBufC* newName = HBufC::NewLC(KPresSetNameMaxLength); + newName->Des().Copy(aSetName); + + RArray setIds; + CleanupClosePushL( setIds ); + CDesCArray* names = PresSettingsApi::GetAllSetsNamesLC(setIds); + TInt count(setIds.Count()); + + newName = newName->ReAlloc( + newName->Length() + KPresDMFormatExtraLen );// enough for formatting + + HBufC* tempSetName = NULL; + TInt pos = 0;// used as dummy + TInt found = 0; + TInt index = 1; + TPtr ptr = newName->Des(); + + // do the actual checking of name + found = names->Find( *newName, pos ); + while ( found == 0 ) + { + if ( !tempSetName ) + { + tempSetName = GetPrefixL( newName ); + tempSetName = tempSetName->ReAlloc( + tempSetName->Length() + KPresDMFormatExtraLen );// enough for formatting + CleanupStack::PushL( tempSetName ); + tempSetName->Des().Append( KPresDMNumbering ); + } + StringLoader::Format( ptr, *tempSetName, -1, index ); + found = names->Find( *newName, pos ); + index++; + } + + // cleanup + if ( tempSetName ) + { + CleanupStack::PopAndDestroy( tempSetName ); //tempSetName + } + + CleanupStack::PopAndDestroy(names); // names + CleanupStack::PopAndDestroy(1); // setIds + + aSetName.Copy(newName->Des()); + CleanupStack::PopAndDestroy( newName ); + + PRES_DM_LOG(LOG_LIT(" CheckDuplicateNameL(%S): end"),&aSetName); + } + +// ----------------------------------------------------------------------------- +// CPresenceDMAdapter::SetProperLength +// ----------------------------------------------------------------------------- +TBool CPresenceDMAdapter::SetProperLength(TPresSettingsProperty aProp, TPtr& aValue) + { + PRES_DM_LOG(LOG_LIT(" SetProperLength(%d)"),aProp); + + TBool result(ETrue); + switch (aProp) + { + case EPresPropSetName: + if(aValue.Length() > KPresSetNameMaxLength) + aValue = aValue.Left(KPresSetNameMaxLength); + break; + + case EPresPropContSrvAdd: + if(aValue.Length() > KContentSrvrAddMaxLength) + result = EFalse; + break; + + case EPresPropDomainSyntax: + if(aValue.Length() > KPresDomainSyntxMaxLength) + result = EFalse; + break; + + case EPresPropProviderID: + if(aValue.Length() > KPresProviderIDMaxLength) + aValue = aValue.Left(KPresProviderIDMaxLength); + break; + default: + break; + } + PRES_DM_LOG(LOG_LIT(" SetProperLength(%d): end"),result); + return result; + } + +// End of File + + +