--- /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 <implementationproxy.h>
+#include <nsmldmuri.h>
+#include <utf.h>
+#include <badesca.h>
+#include <StringLoader.h>
+
+#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/<X>
+ 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/<X>
+ MSmlDmDDFObject& runTimeNode = omaPresNode.AddChildObjectGroupL();
+ FillNodeInfoL( runTimeNode, accessTypeAll, MSmlDmDDFObject::EZeroOrMore,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode,
+ KPresDmDynamicDescription );
+
+ // ./OMA_PRESENCE/<X>/NAME
+ MSmlDmDDFObject& nameNode = runTimeNode.AddChildObjectL( KPresDMName );
+ FillNodeInfoL( nameNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KPresDMNameDescription );
+
+ // ./OMA_PRESENCE/<X>/PROVIDER-ID
+ MSmlDmDDFObject& providerIdNode = runTimeNode.AddChildObjectL( KPresDMProviderId );
+ FillNodeInfoL( providerIdNode, accessTypeNoDelete,MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KPresDMProviderIdDescription );
+
+ // ./OMA_PRESENCE/<X>/ToConRef
+ MSmlDmDDFObject& toConRefNode = runTimeNode.AddChildObjectL( KPresDMToConRef );
+ FillNodeInfoL( toConRefNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode,
+ KPresDMToConRefDescription);
+
+ // ./OMA_PRESENCE/<X>/ToConRef/SIP-PROFILE (Towards SIP ID)
+ MSmlDmDDFObject& napIdSIPNode = toConRefNode.AddChildObjectL( KPresDMSIPProfile );
+ FillNodeInfoL( napIdSIPNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode,
+ KPresDMSIPProfileDescription );
+
+ // ./OMA_PRESENCE/<X>/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/<X>/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/<X>/ToConRef/XDM-SET/ConRef (actual XDM node)
+ MSmlDmDDFObject& conRefXDMNode = napIdToXDMNode.AddChildObjectL( KPresDMConRef );
+ FillNodeInfoL( conRefXDMNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KPresDMConRefDescription );
+
+ // ./OMA_PRESENCE/<X>/CLIENT-DATA-OBJ-LIMIT
+ MSmlDmDDFObject& dataObjNode = runTimeNode.AddChildObjectL( KPresDMClientObjDataLim );
+ FillNodeInfoL( dataObjNode, accessTypeNoDelete, MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EInt,
+ KPresDMClientObjDataLimDescription );
+
+ // ./OMA_PRESENCE/<X>/CONTENT-SERVER-URI
+ MSmlDmDDFObject& ContentSrvNode = runTimeNode.AddChildObjectL( KPresDMContentSrvUri );
+ FillNodeInfoL( ContentSrvNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EChr,
+ KPresDMContentSrvUriDescription );
+
+ // ./OMA_PRESENCE/<X>/SOURCE-THROTTLE-PUBLISH
+ MSmlDmDDFObject& srcThrotNode = runTimeNode.AddChildObjectL( KPresDMSrcThPublish );
+ FillNodeInfoL( srcThrotNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EInt,
+ KPresDMSrcThPublishDescription );
+
+ // ./OMA_PRESENCE/<X>/MAX-NUMBER-OF-PRESENCE-SUBSCRIPTIONS
+ MSmlDmDDFObject& maxSubsNode = runTimeNode.AddChildObjectL( KPresDMMaxPresSubs );
+ FillNodeInfoL( maxSubsNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EInt,
+ KPresDMMaxPresSubsDescription );
+
+ // ./OMA_PRESENCE/<X>/MAX-NUMBER-OF-SUBSCRIPTIONS-IN-PRESENCE-LIST
+ MSmlDmDDFObject& maxSubsListNode = runTimeNode.AddChildObjectL( KPresDMMaxPresSubsInLists );
+ FillNodeInfoL( maxSubsListNode, accessTypeNoDelete, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,MSmlDmDDFObject::EInt,
+ KPresDMMaxPresSubsInListsDescription );
+
+ // ./OMA_PRESENCE/<X>/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<TSmlDmMappingInfo>&
+ /*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<KPresDMSegmentNameLen> segmentName;
+
+ // ./OMA_PRESENCE
+ if( !lastUriSeg.Compare( KPresDMNodeName ) )
+ {
+ PRES_DM_LOG(LOG_LIT8(" ./OMA_PRESENCE"));
+ RArray<TInt> 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<KPresDMObjectSizeWidth> 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<KPresDMIdDesSize> 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 "<prefix><brace><something>".
+ // See if <something> is an integer number and
+ // <something> 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<TInt> 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
+
+
+