--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/omadm/omadmextensions/adapters/imps/src/nsmldmimpsadapter.cpp Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,2029 @@
+/*
+* Copyright (c) 2002-2004 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: Device Management IMPS Adapter
+*
+*/
+
+
+
+// TaH 3.6.2005 Added the checking of Name, PrefAddr, AAuthName and AAuthSecret lenght.
+// and corrected the fetching of PrefConRef parameter.
+// TaH 16.6.2005 Some minor changes done according the code review comments.
+// TaH 8.7.2005 Corrected errors ESBA-6DYMFL, ESBA-6DYNMK and ESBA-6DYMNV
+// TaH 27.9.2005 Dynamic node names changed,
+// reduced number of warnings caused by debug logs writtings.
+
+// INCLUDE FILES
+
+
+#include <msvids.h>
+#include <implementationproxy.h> // For TImplementationProxy definition
+#include <utf.h>
+#include <iapprefs.h>
+#include <commdb.h>
+#include <cdbcols.h> // CommsDB columname defs
+#include <sysutil.h>
+#include <e32des8.h>
+#include <cimpssapsettings.h> //CIMPSSAPSettings
+#include <cimpssapsettingsstore.h> //CWWVSAPSettingsStore
+#include <cimpssapsettingslist.h> //CIMPSSAPSettingsList
+#include <featmgr.h>
+#include "nsmldmimpluids.h"
+#include "nsmldmimpsadapter.h"
+#include "nsmldebug.h"
+#include "nsmlconstants.h"
+#include "nsmldmconst.h"
+#include "nsmldmiapmatcher.h"
+#include "nsmldmuri.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+#ifndef __WINS__
+// This lowers the unnecessary compiler warning (armv5) to remark.
+// "Warning: #174-D: expression has no effect..." is caused by
+// DBG_ARGS8 macro in no-debug builds.
+#pragma diag_remark 174
+#endif
+
+// ============================= LOCAL FUNCTIONS ==============================
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::CNSmlDmImpsAdapter()
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------------------------
+
+CNSmlDmImpsAdapter::CNSmlDmImpsAdapter(TAny* aEcomArguments) :
+ CSmlDmAdapter(aEcomArguments)
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::CNSmlDmImpsAdapter(): begin" );
+ _DBG_FILE( "CNSmlDmImpsAdapter::CNSmlDmImpsAdapter(): end" );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// The global variables are created here.
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::ConstructL( MSmlDmCallback *aDmCallback )
+ {
+ iCallBack = aDmCallback;
+ FeatureManager::InitializeLibL();
+ iFeatMgrInitialized = ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter* CNSmlDmImpsAdapter::NewL( )
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+CNSmlDmImpsAdapter* CNSmlDmImpsAdapter::NewL( MSmlDmCallback* aDmCallback )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::NewL(): begin" );
+ CNSmlDmImpsAdapter* self = NewLC( aDmCallback );
+ CleanupStack::Pop();
+ _DBG_FILE( "CNSmlDmImpsAdapter::NewL(): end" );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter* CNSmlDmImpsAdapter::NewLC( )
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+CNSmlDmImpsAdapter* CNSmlDmImpsAdapter::NewLC( MSmlDmCallback* aDmCallback )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::NewLC(): begin" );
+ CNSmlDmImpsAdapter* self = new( ELeave ) CNSmlDmImpsAdapter( aDmCallback );
+ CleanupStack::PushL( self );
+ self->ConstructL( aDmCallback );
+ _DBG_FILE( "CNSmlDmImpsAdapter::NewLC(): end" );
+ return self;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::~CNSmlDmImpsAdapter()
+// Destructor, the global variables are deleted here.
+// ----------------------------------------------------------------------------
+CNSmlDmImpsAdapter::~CNSmlDmImpsAdapter()
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::~CNSmlDmImpsAdapter(): begin" );
+ if(iFeatMgrInitialized)
+ {
+ FeatureManager::UnInitializeLib();
+ }
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::~CNSmlDmImpsAdapter(): end" );
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::DDFVersionL()
+// The method returns the DDFVersion number.
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::DDFVersionL( CBufBase& aDDFVersion )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::DDFVersionL( TDes& aDDFVersion ): begin" );
+ aDDFVersion.InsertL( 0,KNSmlDMImpsDDFVersion );
+ _DBG_FILE( "CNSmlDmImpsAdapter::DDFVersionL( TDes& aDDFVersion ): end" );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::DDFStructureL()
+// The method creates the DDFStructure
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::DDFStructureL( MSmlDmDDFObject& aDDF )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::DDFStructureL(): begin" );
+
+ TSmlDmAccessTypes allAccessTypes;
+ allAccessTypes.SetAdd();
+ allAccessTypes.SetDelete();
+ allAccessTypes.SetGet();
+ allAccessTypes.SetReplace();
+
+ TSmlDmAccessTypes accessTypesAddGet;
+ accessTypesAddGet.SetAdd();
+ accessTypesAddGet.SetGet();
+
+ TSmlDmAccessTypes accessTypesGet;
+ accessTypesGet.SetGet();
+
+ TSmlDmAccessTypes accessTypesNoDel;
+ accessTypesNoDel.SetAdd();
+ accessTypesNoDel.SetGet();
+ accessTypesNoDel.SetReplace();
+
+ TSmlDmAccessTypes accessTypesASecret;
+ accessTypesASecret.SetAdd();
+ accessTypesASecret.SetDelete();
+ accessTypesASecret.SetReplace();
+
+
+ // IMPS
+ MSmlDmDDFObject& imps = aDDF.AddChildObjectL( KNSmlDMImpsNodeName );
+ FillNodeInfoL( imps,
+ accessTypesGet,
+ MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EPermanent,
+ MSmlDmDDFObject::ENode, KNSmlDMImpsDescr );
+
+ // run-time node under IMPS
+ // IMPS/<X>
+ MSmlDmDDFObject& rtNode = imps.AddChildObjectGroupL();
+ FillNodeInfoL( rtNode,
+ allAccessTypes,
+ MSmlDmDDFObject::EZeroOrMore,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::ENode,
+ KNSmlDMDynamicNodeDescr );
+
+ // AppID
+ MSmlDmDDFObject& appId = rtNode.AddChildObjectL( KNSmlDMImpsAppId );
+ FillNodeInfoL( appId,
+ accessTypesAddGet,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EChr,
+ KNSmlDMImpsAppIDDescr );
+
+ // Name
+ MSmlDmDDFObject& name = rtNode.AddChildObjectL( KNSmlDMImpsName );
+ FillNodeInfoL( name,
+ allAccessTypes,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EChr,
+ KNSmlDMImpsNameDescr );
+
+ // PrefConRef
+ MSmlDmDDFObject& prefConRef = rtNode.AddChildObjectL( KNSmlDMImpsPrefConRef );
+ FillNodeInfoL( prefConRef,
+ allAccessTypes,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EChr,
+ KNSmlDMImpsPrefConRefDescr );
+
+ // PrefAddr
+ MSmlDmDDFObject& prefAddr = rtNode.AddChildObjectL( KNSmlDMImpsPrefAddr );
+ FillNodeInfoL( prefAddr,
+ allAccessTypes,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EChr,
+ KNSmlDMImpsPrefAddrDescr );
+
+ // AppAuth
+ MSmlDmDDFObject& appAuth = rtNode.AddChildObjectL( KNSmlDMImpsAppAuth );
+ FillNodeInfoL( appAuth,
+ allAccessTypes,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::ENode,
+ KNSmlDMImpsAppAuthDescr );
+
+ // Run-time node under AppAuth
+ MSmlDmDDFObject& rtNodeAppAuth = appAuth.AddChildObjectGroupL();
+ FillNodeInfoL( rtNodeAppAuth,
+ allAccessTypes,
+ MSmlDmDDFObject::EZeroOrMore,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::ENode,
+ KNSmlDMDynamicNodeDescr );
+
+ // AAuthLevel
+ MSmlDmDDFObject& AAuthLevel = rtNodeAppAuth.AddChildObjectL( KNSmlDMImpsAAuthLevel );
+ FillNodeInfoL( AAuthLevel,
+ allAccessTypes,
+ MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EChr,
+ KNSmlDMImpsAAuthLevelDescr );
+
+ // AAuthName
+ MSmlDmDDFObject& AAuthName = rtNodeAppAuth.AddChildObjectL( KNSmlDMImpsAAuthName );
+ FillNodeInfoL( AAuthName,
+ allAccessTypes,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EChr,
+ KNSmlDMImpsAAuthNameDescr );
+
+ // AAuthSecret
+ MSmlDmDDFObject& AAuthSecret = rtNodeAppAuth.AddChildObjectL( KNSmlDMImpsAAuthSecret );
+ FillNodeInfoL( AAuthSecret,
+ accessTypesASecret,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EChr,
+ KNSmlDMImpsAAuthSecretDescr );
+
+ // Services
+ MSmlDmDDFObject& service = rtNode.AddChildObjectL( KNSmlDMImpsServices );
+ FillNodeInfoL( service,
+ accessTypesNoDel,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EChr,
+ KNSmlDMImpsServicesDescr );
+
+ // Ext
+ MSmlDmDDFObject& extNode = rtNode.AddChildObjectL( KNSmlDMImpsExtNode );
+ FillNodeInfoL( extNode,
+ allAccessTypes,
+ MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::ENode,
+ KNSmlDMImpsExtNodeDescr );
+
+ // PEPCompliant
+ MSmlDmDDFObject& pepCompliant = extNode.AddChildObjectL( KNSmlDMImpsPepCompliant );
+ FillNodeInfoL( pepCompliant,
+ allAccessTypes,
+ MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic,
+ MSmlDmDDFObject::EBool,
+ KNSmlDMImpsPepCompliantDescr );
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::DDFStructureL(): end" );
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::AddNodeObjectL()
+// The method adds new node.
+// - Check number of uri segments
+// - If number of segements = 2
+// - Read all dynamic nodes under IMPS from the DMTree
+// - Check that the new node name does not already exist
+// - If exists
+// --> return error status "AlreadyExists"
+// - If does not exist, create new SAP to the database
+// and use the node name as temporary SAP name
+// - Map the received index to the URI.
+// - If number of segments = 3 or 4
+// - Check that there exists a SAP with given LUID value in db
+// - If does not exist
+// --> return error status "NotFound"
+// - If exists
+// --> if number of segments = 4
+// - check that there does not already exist the dynamic node
+// ( only one dynamic allowed )
+// - if exists
+// --> Return error status invalid object
+// - Set mapping for DB index and URI.
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::AddNodeObjectL( const TDesC8& aURI,
+ const TDesC8& aParentLUID, const TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::AddNodeObjectL(): begin" );
+
+ CIMPSSAPSettings* ownSap = CIMPSSAPSettings::NewL();
+ CleanupStack::PushL( ownSap );
+ CIMPSSAPSettingsStore* ownStore = CIMPSSAPSettingsStore::NewL();
+ CleanupStack::PushL( ownStore );
+ CIMPSSAPSettingsList* ownList = CIMPSSAPSettingsList::NewL();
+ CleanupStack::PushL( ownList );
+
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+ TInt numOfSegs = NSmlDmURI::NumOfURISegs( aURI );
+ TPtrC8 checkedNode = NSmlDmURI::LastURISeg( aURI );
+
+ if ( ( numOfSegs == 2 ) &&
+ ( aURI.Match( KNSmlDMImpsRootAndDyn ) != KErrNotFound ) )
+ {
+ status = CSmlDmAdapter::EOk;
+
+ // Read all dynamic nodes under IMPS from tree
+ CSmlDmAdapter::TError stat;
+ CBufBase *allNodes = CBufFlat::NewL( KNSmlDMReservingData );
+ CleanupStack::PushL( allNodes );
+ iCallBack->FetchLinkL( KNSmlDMImpsNodeName, *allNodes, stat );
+
+ // Check if the second node is found
+ TInt startIndex = 0;
+ for( TInt i = 0; i < allNodes->Size(); i++ )
+ {
+ if( allNodes->Ptr(0)[i] == '/' || i == allNodes->Size()-1 )
+ {
+ TPtrC8 uriSeg8Ptr = allNodes->Ptr( startIndex ).Mid( 0, i-startIndex );
+ if ( uriSeg8Ptr.Compare( checkedNode ) == 0 )
+ {
+ status = EAlreadyExists;
+ break;
+ }
+ startIndex = i + 1;
+ } // if ( allNodes->Ptr )
+ } // for
+ CleanupStack::PopAndDestroy(); // allNodes
+
+ if ( status == CSmlDmAdapter::EOk )
+ {
+ // the item does not exist - create it to the db
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs );
+ if ( SysUtil::FFSSpaceBelowCriticalLevelL( &fs,
+ KNSmlDMSAPSettings ) )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::AddNodeObjectL(): DISK FULL end" );
+ status = CSmlDmAdapter::EDiskFull; // Disk full
+ }
+ else
+ {
+ ResetSapL( ownSap );
+
+ TBufC8<5> tmpName( KNSmlDMImpsName );
+ status = UpdateValueL( tmpName, checkedNode, ownSap );
+ if ( status == CSmlDmAdapter::EOk )
+ {
+ TUint32 uid32 = ownStore->StoreNewSAPL( ownSap, EIMPSIMAccessGroup );
+ TInt uid( uid32 );
+ _DBG_FILE( "CNSmlDmImpsAdapter::AddNodeObjectL(): New SAP added" );
+ HBufC8 *luidDes = IntToDes8LC( uid );
+ iCallBack->SetMappingL( aURI, *luidDes );
+ CleanupStack::PopAndDestroy(); // luidDes
+ }
+ } //disk size
+ CleanupStack::PopAndDestroy(); // fs
+ }
+ }
+ // AppAuth nodes
+ else if ( ( ( numOfSegs == 3 ) &&
+ ( aURI.Match( KNSmlDMImpsWholeAppAuthUri ) != KErrNotFound ) )
+ || ( ( numOfSegs == 4 ) &&
+ ( aURI.Match( KNSmlDMImpsWholeAppAuthDynUri ) != KErrNotFound ) ) )
+ {
+ if( aParentLUID.Length() > 0 )
+ {
+ // Check that Store is not empty
+ // causes leaving if empty db is tried to read
+ TInt count = 0;
+ count = ownStore->SAPCountL( EIMPSAccessFilterAll );
+ DBG_ARGS8(_S8("IMPS::Count of SAPs in store = %d \n"), count );
+ if ( count > 0 )
+ {
+ TInt uid = DesToInt( aParentLUID );
+ TUint32 uid32( uid );
+ ownStore->PopulateSAPSettingsListL( *ownList,
+ EIMPSAccessFilterAll );
+ _DBG_FILE( "CNSmlDmImpsAdapter::AddNodeObjectL(): SAP settings list" );
+ TBool found = EFalse;
+ for ( TInt i = 0; i < count; i++ )
+ {
+ TUint32 id32 = ownList->UidForIndex( i );
+ if ( id32 == uid32 )
+ {
+ found = ETrue;
+ if ( numOfSegs == 4 )
+ {
+ // There can be only one dynamic node,
+ // check that there is not one
+ TPtrC8 ptrToParentUri = NSmlDmURI::RemoveLastSeg( aURI );
+ // Read dynamic nodes under AppAuth from tree
+ CSmlDmAdapter::TError stat;
+ CBufBase *dynNodes = CBufFlat::NewL( KNSmlDMReservingData );
+ CleanupStack::PushL( dynNodes );
+ iCallBack->FetchLinkL( ptrToParentUri, *dynNodes, stat );
+ TInt len = dynNodes->Size();
+ if ( len > 0 )
+ {
+ status = EInvalidObject;
+ }
+ else
+ {
+ iCallBack->SetMappingL( aURI, aParentLUID );
+ }
+ CleanupStack::PopAndDestroy(); // dynNodes
+ }
+ else
+ {
+ iCallBack->SetMappingL( aURI, aParentLUID );
+ }
+ break;
+ }
+ } // for
+
+ if ( !found )
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ } // count
+ } // aParentLUID length
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ } // aParentLUID length
+
+ // Ext node
+ else if ( ( numOfSegs == 3 ) &&
+ ( aURI.Match( KNSmlDMImpsWholeExtUri ) != KErrNotFound ) )
+ {
+ if( aParentLUID.Length() > 0 )
+ {
+ // Check that Store is not empty
+ // causes leaving if empty db is tried to read
+ TInt count = 0;
+ count = ownStore->SAPCountL( EIMPSAccessFilterAll );
+ DBG_ARGS8(_S8("IMPS::Count of SAPs in store = %d \n"), count );
+ if ( count > 0 )
+ {
+ TInt uid = DesToInt( aParentLUID );
+ TUint32 uid32( uid );
+ ownStore->PopulateSAPSettingsListL( *ownList, EIMPSAccessFilterAll );
+ _DBG_FILE( "CNSmlDmImpsAdapter::AddNodeobjectL(): SAP settings list" );
+ TBool found = EFalse;
+ for ( TInt i = 0; i < count; i++ )
+ {
+ TUint32 id32 = ownList->UidForIndex( i );
+ if ( id32 == uid32 )
+ {
+ found = ETrue;
+ iCallBack->SetMappingL( aURI, aParentLUID );
+ break;
+ }
+ } // for
+ if ( !found )
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ } // count
+ } // aParentLUID length
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ } // aParentLUID length
+
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+
+ CleanupStack::PopAndDestroy( 3 ); // ownList, ownStore, ownSap
+
+ iCallBack->SetStatusL( aStatusRef, status );
+ _DBG_FILE( "CNSmlDmImpsAdapter::AddNodeObjectL(): end" );
+
+ return;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::UpdateLeafObjectL()
+// The method updates the leaf value.
+// - Check that LUID length > 0
+// - Check that there exists SAP with uid which is same as received LUID value.
+// - If exists
+// --> update received parameter value to db
+// - else
+// --> return error status
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::UpdateLeafObjectL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TDesC8& aObject,
+ const TDesC8& /*aType*/,
+ TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdateLeafObjectL(): begin" );
+
+// Used only in Test purpose
+// TBuf8<50> tmpUriBuf = aURI;
+// TBuf8<50> tmpLuidBuf = aLUID;
+// DBG_ARGS8(_S8("IMPS Luid / Uri : Luid = %S Uri = %S \n"), &tmpLuidBuf, &tmpUriBuf );
+
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+
+ CIMPSSAPSettings* ownSap = CIMPSSAPSettings::NewL();
+ CleanupStack::PushL( ownSap );
+ CIMPSSAPSettingsStore* ownStore = CIMPSSAPSettingsStore::NewL();
+ CleanupStack::PushL( ownStore );
+
+ TPtrC8 lastSeg = NSmlDmURI::LastURISeg( aURI );
+
+ if( aLUID.Length() > 0 )
+ {
+ // Check that Store is not empty and find the correct SAP
+ TInt sapFound = GetCorrectSapL( aLUID,
+ ownSap,
+ ownStore );
+ if ( sapFound == KErrNone )
+ {
+ if ( lastSeg.Compare( KNSmlDMImpsPepCompliant ) == 0 )
+ {
+ TInt stat = UpdatePEPValueL( aURI,
+ aObject,
+ aLUID,
+ ownSap,
+ ownStore );
+ if ( stat != KErrNone )
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ }
+ else if ( lastSeg.Compare( KNSmlDMImpsAppId ) == 0 )
+ {
+ // Only value "wA" is accepted for AppID parameter
+ if ( aObject.Compare( KNSmlDMImpsDefaultAppID ) != 0 )
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+ }
+ else
+ {
+ TInt uid = DesToInt( aLUID );
+ TUint32 Uid32( uid );
+ status = UpdateValueL( lastSeg, aObject, ownSap );
+ if ( status == KErrNone )
+ {
+ ownStore->UpdateOldSAPL( ownSap, Uid32 );
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdateLeafObjectL(): SAP updated" );
+ }
+ }
+ } // sapFound
+
+ else if ( sapFound == KErrNotFound )
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ else
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ } // aLUID length
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+
+ iCallBack->SetStatusL( aStatusRef, status );
+
+ CleanupStack::PopAndDestroy( 2 ); // ownStore, ownSap
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdateLeafObjectL( ): end" );
+
+ return;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::UpdateLeafObjectL()
+// Method not used. Used if streaming in use.
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::UpdateLeafObjectL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/,
+ TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdateLeafObjectL(): begin" );
+ iCallBack->SetStatusL(aStatusRef, CSmlDmAdapter::EError);
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdateLeafObjectL( ): end" );
+ }
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmImpsAdapter::FetchLeafObjectSizeL()
+// Fetches data object and returns its size.
+// - Take last URI segment and request the value for requested parameter
+// by using method FetchObjectL.
+// - Take the size of received parameter value and change it to descriptor
+// - Return the size and status
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::FetchLeafObjectSizeL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TDesC8& aType,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDmImpsAdapter::FetchLeafObjectSizeL(): begin");
+
+ CBufBase *currentURISegmentList = CBufFlat::NewL( KNSmlDMReservingMaxData );
+ CleanupStack::PushL( currentURISegmentList );
+ TPtrC8 fetchedLeaf = NSmlDmURI::LastURISeg( aURI );
+
+ CSmlDmAdapter::TError status = FetchObjectL( fetchedLeaf,
+ aLUID,
+ *currentURISegmentList );
+
+ if ( status == CSmlDmAdapter::EOk )
+ {
+ TInt objSizeInBytes = currentURISegmentList->Size();
+ TBuf8<16> stringObjSizeInBytes;
+ stringObjSizeInBytes.Num( objSizeInBytes );
+ currentURISegmentList->Reset();
+ currentURISegmentList->InsertL( 0, stringObjSizeInBytes );
+
+ iCallBack->SetResultsL( aResultsRef, *currentURISegmentList, aType );
+ }
+
+ iCallBack->SetStatusL( aStatusRef, status );
+ CleanupStack::PopAndDestroy(); //currentURISegmentList
+
+ _DBG_FILE("CNSmlDmImpsAdapter::FetchLeafObjectSizeL(): end");
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::DeleteObjectL()
+// The method deletes the requested parameter values.
+// - Check number of segments
+// - If number of segments > 2
+// --> check that the SAP which the deletion involves exists in DB
+// and get SAP to ownSap
+// - If number of segments = 2
+// --> delete whole SAP from the DB
+// - If number of segments > 2 and <= 5
+// --> check the requested parameter and delete the value from it in DB
+// - If number of segments < 1 or > 5 or given SAP is not found from DB
+// --> return error status
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::DeleteObjectL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::DeleteLeafObjectL( ): begin" );
+
+ CIMPSSAPSettings* ownSap = CIMPSSAPSettings::NewL();
+ CleanupStack::PushL( ownSap );
+ CIMPSSAPSettingsStore* ownStore = CIMPSSAPSettingsStore::NewL();
+ CleanupStack::PushL( ownStore );
+
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+
+ // Check the number of uri segments to find out is a node or a leaf deleted
+ TInt numOfSegs = NSmlDmURI::NumOfURISegs( aURI );
+
+ if ( numOfSegs < 2 || numOfSegs > 5 )
+ {
+ // Sap does not exist, return error status
+ status = CSmlDmAdapter::EInvalidObject;
+ iCallBack->SetStatusL( aStatusRef, status );
+ return;
+ }
+
+ if( aLUID.Length() > 0 )
+ {
+ // Check that Store is not empty,
+ // causes leaving if empty db is tried to read
+ TInt sapFound = KErrNotFound;
+ sapFound = GetCorrectSapL( aLUID,
+ ownSap,
+ ownStore );
+ if ( sapFound == KErrNone )
+ {
+ TInt uid = DesToInt( aLUID );
+ TUint32 Uid32( uid );
+ if ( numOfSegs == 2 )
+ {
+ // delete SAP
+ ownStore->DeleteSAPL( Uid32 );
+ _DBG_FILE( "CNSmlDmImpsAdapter::DeleteObjectL(): SAP deleted" );
+ } // if numOfSegs
+ else
+ {
+ TPtrC8 deletedLeaf = NSmlDmURI::LastURISeg( aURI );
+ if ( ( deletedLeaf.Compare( KNSmlDMImpsPepCompliant ) == 0 ) ||
+ ( deletedLeaf.Compare( KNSmlDMImpsExtNode ) == 0 ) )
+ {
+ TBuf8<5> tmpPep( KNSmlDMImpsDefaultIM ); //False
+ TInt stat = EOk;
+ if ( deletedLeaf.Compare( KNSmlDMImpsExtNode ) == 0 )
+ {
+ HBufC8 *tmpUri = HBufC8::NewLC( aURI.Length() + 14 );
+ TPtr8 tmpUriPtr = tmpUri->Des();
+
+ // URI: IMPS/<x>/PEPCompliant
+ tmpUriPtr.Format( aURI );
+ tmpUriPtr.Append( KNSmlDMImpsSeparator8 );
+ tmpUriPtr.Append( KNSmlDMImpsPepCompliant );
+ stat = UpdatePEPValueL( tmpUriPtr,
+ tmpPep,
+ aLUID,
+ ownSap,
+ ownStore );
+ CleanupStack::PopAndDestroy(); // tmpUri
+ }
+ else
+ {
+ stat = UpdatePEPValueL( aURI,
+ tmpPep,
+ aLUID,
+ ownSap,
+ ownStore );
+ }
+ if ( stat != KErrNone )
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ } // stat
+ else
+ {
+ status = DeleteValueL( aURI, ownSap );
+ if ( status == EOk )
+ {
+ // update the SAP to db
+ ownStore->UpdateOldSAPL( ownSap, Uid32 );
+ _DBG_FILE( "CNSmlDmImpsAdapter::DeleteObjectL(): SAP updated" );
+ }
+ } // status
+ } // numOfSegs
+ } // sapFound
+ else if ( sapFound == KErrNotFound )
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ else
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ } // LUID length
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+
+ iCallBack->SetStatusL( aStatusRef, status );
+
+ CleanupStack::PopAndDestroy( 2 ); // ownSap, ownStore
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::DeleteLeafObjectL( ): end" );
+
+ return;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::FetchLeafObjectL()
+// The method returns the requested parameter value from DB
+// - Take last URI segment and request the value for requested parameter
+// by using method FetchObjectL.
+// - Return the parameter value and status
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::FetchLeafObjectL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TDesC8& aType,
+ TInt aResultsRef,
+ TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::FetchLeafObjectL(): begin" );
+
+ CBufBase *currentURISegmentList = CBufFlat::NewL( KNSmlDMReservingMaxData );
+ CleanupStack::PushL( currentURISegmentList );
+ TPtrC8 fetchedLeaf = NSmlDmURI::LastURISeg( aURI );
+ CSmlDmAdapter::TError status = FetchObjectL( fetchedLeaf,
+ aLUID,
+ *currentURISegmentList );
+
+ if ( status == CSmlDmAdapter::EOk )
+ {
+ iCallBack->SetResultsL( aResultsRef, *currentURISegmentList, aType );
+ }
+
+ iCallBack->SetStatusL( aStatusRef, status );
+ CleanupStack::PopAndDestroy(); //currentURISegmentList
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::FetchLeafObjectL(): end" );
+
+ return;
+ }
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmImpsAdapter::ChildURIListL()
+// The method returns the child nodes or leafs under requested node.
+// - Check number of URI segments.
+// - If number of segments = 1
+// --> check if the dynamic node name is found by setting the DB uid
+// against the LUID value in aPreviousURISegmentList
+// - If the name is found, it is taken to the result list,
+// - else the index number of SAP is converted to the name
+// and returned as node name
+// - If number of segments > 1 and < 5
+// --> check that given LUID is found as index in DB
+// and get the SAP data to ownSap
+// - if number of segments = 2 or 4
+// --> return parameter under dynamic node
+// - if number of segments = 3
+// --> return the name of dynamic node under AppAuth node.
+// - Return the results and status
+// - In error case return error status
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::ChildURIListL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList,
+ TInt aResultsRef,
+ TInt aStatusRef )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::ChildURIListL(): begin" );
+
+// Used only in Test purpose
+// TBuf8<50> tmpUriBuf = aURI;
+// TBuf8<50> tmpLuidBuf = aLUID;
+// DBG_ARGS8(_S8("IMPS Luid / Uri : Luid = %S Uri = %S \n"), &tmpLuidBuf, &tmpUriBuf );
+
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+
+ CIMPSSAPSettings* ownSap = CIMPSSAPSettings::NewL();
+ CleanupStack::PushL( ownSap );
+ CIMPSSAPSettingsStore* ownStore = CIMPSSAPSettingsStore::NewL();
+ CleanupStack::PushL( ownStore );
+ CIMPSSAPSettingsList* ownList = CIMPSSAPSettingsList::NewL();
+ CleanupStack::PushL( ownList );
+
+ TInt numOfSegs = NSmlDmURI::NumOfURISegs( aURI );
+
+ CBufBase *currentURISegmentList = CBufFlat::NewL( KNSmlDMReservingMaxData );
+ CleanupStack::PushL( currentURISegmentList );
+
+ if ( numOfSegs == 1 )
+ {
+ if ( aURI.Compare( KNSmlDMImpsNodeName ) == 0 )
+ {
+ ownStore->PopulateSAPSettingsListL( *ownList, EIMPSAccessFilterAll );
+ _DBG_FILE( "CNSmlDmImpsAdapter::ChildURIListL(): SAP settings list" );
+ TInt32 id32;
+ TInt count = 0;
+ count = ownStore->SAPCountL( EIMPSAccessFilterAll );
+ DBG_ARGS8(_S8("IMPS::Count of SAPs in store = %d "), count );
+ TInt prevUriSegListCount = aPreviousURISegmentList.Count();
+ DBG_ARGS8(_S8("IMPS::Count of luids in prevUriSegList = %d "),
+ prevUriSegListCount );
+
+ for ( TInt i = 0; i < count; i++ )
+ {
+ id32 = ownList->UidForIndex( i );
+ TInt id( id32 );
+ DBG_ARGS8(_S8("IMPS::Sap id = %d"), id );
+
+ HBufC8* name=0;
+ TBool found = EFalse;
+ // Go through the previousUriSegmentList
+
+ for( TInt prevListIx = 0;
+ prevListIx < aPreviousURISegmentList.Count();
+ prevListIx++ )
+ {
+ // Check if the Sap id is found from segment list
+ if( id == DesToInt( aPreviousURISegmentList.At( prevListIx ).iURISegLUID ) )
+ {
+ found = ETrue;
+ // If id is found, take the urisegment from segment list
+ name = aPreviousURISegmentList.At( prevListIx ).iURISeg.AllocLC();
+ DBG_ARGS8(_S8("InList: Id = %d Seg %S"), id,
+ &aPreviousURISegmentList.At( prevListIx ).iURISeg);
+ break;
+ }
+ } // for prevListIx
+ if( !found )
+ {
+ // id not found from previousUriSegmentList
+ // change the id to segment name
+
+ name = HBufC8::NewLC( 20 );
+ TPtr8 namePtr = name->Des();
+ namePtr = KNSMLDMImpsDynNodeName;
+ namePtr.AppendNum( i+1 );
+
+ HBufC8 *uri = HBufC8::NewLC( aURI.Length() + name->Length() + 1 );
+ TPtr8 uriPtr = uri->Des();
+ // Format the whole URI
+ uriPtr.Format( aURI );
+ uriPtr.Append( KNSmlDMImpsSeparator );
+ uriPtr.Append( name->Des() );
+ HBufC8 *luid = IntToDes8LC( id );
+ // Map the received uri to id
+ iCallBack->SetMappingL( uriPtr, *luid );
+
+// Used only in Test purpose
+// TBuf8<50> uriBuf = uriPtr;
+// DBG_ARGS8(_S8("NotInList, mapping done: Luid = %d Uri = %S "),
+// id, &uriBuf );
+
+ CleanupStack::PopAndDestroy( 2 ); //uri,luid
+ }
+ TPtr8 namePtr = name->Des();
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ namePtr );
+ if( i + 1 < count )
+ {
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMImpsSeparator8 );
+ }
+ CleanupStack::PopAndDestroy( ); // name
+ } // for i < count
+
+ iCallBack->SetResultsL( aResultsRef,
+ *currentURISegmentList,
+ KNullDesC8 );
+ } // aUri
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ } // aUri
+ }
+ else if ( ( numOfSegs > 1 ) && ( numOfSegs < 5 ) )
+ {
+ if( aLUID.Length() > 0 )
+ {
+ // Check that Store is not empty
+ // causes leaving if empty db is tried to read
+ TInt sapFound = KErrNotFound;
+ sapFound = GetCorrectSapL( aLUID, ownSap, ownStore );
+ if ( sapFound == KErrNone)
+ {
+ if ( ( numOfSegs == 2 ) &&
+ ( aURI.Match( KNSmlDMImpsRootAndDyn ) != KErrNotFound ) )
+ {
+ // List leafs
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMImpsRtNode() );
+
+ iCallBack->SetResultsL( aResultsRef,
+ *currentURISegmentList,
+ KNullDesC8 );
+ } // numOfSegs
+ else if ( ( numOfSegs == 3 ) &&
+ ( aURI.Match( KNSmlDMImpsWholeExtUri ) != KErrNotFound ) )
+ {
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMImpsPepCompliant() );
+ iCallBack->SetResultsL( aResultsRef,
+ *currentURISegmentList,
+ KNullDesC8 );
+ }
+ else if ( ( numOfSegs == 3 ) &&
+ ( aURI.Match( KNSmlDMImpsWholeAppAuthUri ) != KErrNotFound ) )
+ {
+ HBufC8* name=0;
+ TInt count = aPreviousURISegmentList.Count();
+ if ( count > 0 )
+ {
+ for( TInt prevListIx = 0; prevListIx < count; prevListIx++ )
+ {
+ name = aPreviousURISegmentList.At( prevListIx ).iURISeg.AllocLC();
+ TPtr8 namePtr = name->Des();
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ namePtr );
+ if( prevListIx + 1 < count )
+ {
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMImpsSeparator8 );
+ }
+ CleanupStack::PopAndDestroy(); // name
+ } // for
+ } // if count > 0
+ else
+ {
+ if ( ( ownSap->SAPUserId().Compare(KNSmlDMImpsNotDefined ) == 0 ) &&
+ ( ownSap->SAPUserPassword().Compare(KNSmlDMImpsNotDefined ) == 0 ) )
+ {
+ }
+ else
+ {
+ HBufC8 *uri = HBufC8::NewLC( aURI.Length() + 9 );
+ TPtr8 uriPtr = uri->Des();
+ uriPtr.Format( aURI );
+ uriPtr.Append( KNSmlDMImpsSeparator );
+ uriPtr.Append( KNSmlDMRtNode );
+ iCallBack->SetMappingL( uriPtr, aLUID );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMRtNode8() );
+ CleanupStack::PopAndDestroy(); //uri
+ }
+ }
+ iCallBack->SetResultsL( aResultsRef,
+ *currentURISegmentList,
+ KNullDesC8 );
+ }
+ else if ( ( numOfSegs == 4 ) &&
+ ( aURI.Match( KNSmlDMImpsWholeAppAuthDynUri ) != KErrNotFound ) )
+ {
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMAppAuthRtNode() );
+ iCallBack->SetResultsL( aResultsRef,
+ *currentURISegmentList,
+ KNullDesC8 );
+ }
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+ } // sapFound
+ else if ( sapFound == KErrNotFound )
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ else
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ } // luid len
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ } // numOfSegs
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+
+// Used only in Test purpose
+ DBG_ARGS8(_S8("Status = %d \n"), status );
+
+ iCallBack->SetStatusL( aStatusRef, status );
+
+ CleanupStack::PopAndDestroy( 4 ); // currentUriSegmentList, ownSap, ownStore, ownList
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::ChildURIListL(): end" );
+ return;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::CompleteOutstandingCmdsL()
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::CompleteOutstandingCmdsL()
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::EndMessageL(): begin" );
+ _DBG_FILE( "CNSmlDmImpsAdapter::EndMessageL(): end" );
+ }
+
+//==============================================================================
+// CNSmlDmImpsAdapter::ExecuteCommandL()
+//==============================================================================
+void CNSmlDmImpsAdapter::ExecuteCommandL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ const TDesC8& /*aArgument*/,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ //Not supported
+ _DBG_FILE( "CNSmlDmImpsAdapter::ExecuteCommandL(): begin" );
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE( "CNSmlDmImpsAdapter::ExecuteCommandL(): end" );
+ }
+
+//==============================================================================
+// CNSmlDmImpsAdapter::ExecuteCommandL()
+//==============================================================================
+void CNSmlDmImpsAdapter::ExecuteCommandL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ //Not supported
+ _DBG_FILE( "CNSmlDmImpsAdapter::ExecuteCommandL(): begin" );
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE( "CNSmlDmImpsAdapter::ExecuteCommandL(): end" );
+ }
+
+//==============================================================================
+// CNSmlDmImpsAdapter::CopyCommandL()
+//==============================================================================
+void CNSmlDmImpsAdapter::CopyCommandL( const TDesC8& /*aTargetURI*/,
+ const TDesC8& /*aTargetLUID*/,
+ const TDesC8& /*aSourceURI*/,
+ const TDesC8& /*aSourceLUID*/,
+ const TDesC8& /*aType*/,
+ TInt aStatusRef )
+ {
+ //Not supported
+ _DBG_FILE( "CNSmlDmImpsAdapter::CopyCommandL(): begin" );
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE( "CNSmlDmImpsAdapter::CopyCommandL(): end" );
+ }
+
+//==============================================================================
+// CNSmlDmImpsAdapter::StartAtomicL()
+//==============================================================================
+void CNSmlDmImpsAdapter::StartAtomicL()
+ {
+ //Not supported
+ _DBG_FILE( "CNSmlDmImpsAdapter::StartAtomicL(): begin" );
+ _DBG_FILE( "CNSmlDmImpsAdapter::StartAtomicL(): end" );
+ }
+
+//==============================================================================
+// CNSmlDmImpsAdapter::CommitAtomicL()
+//==============================================================================
+void CNSmlDmImpsAdapter::CommitAtomicL()
+ {
+ //Not supported
+ _DBG_FILE( "CNSmlDmImpsAdapter::CommitAtomicL(): begin" );
+ _DBG_FILE( "CNSmlDmImpsAdapter::CommitAtomicL(): end" );
+ }
+
+//==============================================================================
+// CNSmlDmImpsAdapter::RollbackAtomicL()
+//==============================================================================
+void CNSmlDmImpsAdapter::RollbackAtomicL()
+ {
+ //Not supported
+ _DBG_FILE( "CNSmlDmImpsAdapter::RollbackAtomicL(): begin" );
+ _DBG_FILE( "CNSmlDmImpsAdapter::RollbackAtomicL(): end" );
+ }
+
+//==============================================================================
+// CNSmlDmImpsAdapter::StreamingSupport()
+//==============================================================================
+TBool CNSmlDmImpsAdapter::StreamingSupport( TInt& /*aItemSize*/ )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::StreamingSupport(): begin" );
+ _DBG_FILE( "CNSmlDmImpsAdapter::StreamingSupport(): end" );
+ return EFalse;
+ }
+
+//==============================================================================
+// CNSmlDmImpsAdapter::StreamCommittedL()
+//==============================================================================
+void CNSmlDmImpsAdapter::StreamCommittedL()
+ {
+ //Not supported
+ _DBG_FILE( "CNSmlDmImpsAdapter::StreamCommittedL(): begin" );
+ _DBG_FILE( "CNSmlDmImpsAdapter::StreamCommittedL(): end" );
+ }
+
+
+// ----------------------------------------------------------------------------
+// Converts 16 bit descriptor to integer value.
+// ----------------------------------------------------------------------------
+TInt CNSmlDmImpsAdapter::DesToInt( const TDesC& aLuid )
+ {
+ TLex16 lex( aLuid );
+ TInt value = 0;
+ lex.Val( value );
+ return value;
+ }
+
+// ----------------------------------------------------------------------------
+// Converts 8 bit descriptor to integer value.
+// ----------------------------------------------------------------------------
+TInt CNSmlDmImpsAdapter::DesToInt( const TDesC8& aLuid )
+ {
+ TLex8 lex( aLuid );
+ TInt value = 0;
+ lex.Val( value );
+ return value;
+ }
+
+// ----------------------------------------------------------------------------
+// Converts integer value to 8 bit descriptor.
+// ----------------------------------------------------------------------------
+HBufC8* CNSmlDmImpsAdapter::IntToDes8LC( const TInt aLuid )
+ {
+ HBufC8* buf = HBufC8::NewLC( 10 ); //10 = max length of 32bit integer
+ TPtr8 ptrBuf = buf->Des();
+ ptrBuf.Num( aLuid );
+ return buf;
+ }
+
+// ----------------------------------------------------------------------------
+// Converts integer value to 16 bit descriptor.
+// ----------------------------------------------------------------------------
+HBufC* CNSmlDmImpsAdapter::IntToDesLC( const TInt aLuid )
+ {
+ HBufC* buf = HBufC::NewLC( 10 ); //10 = max length of 32bit integer
+ TPtr ptrBuf = buf->Des();
+ ptrBuf.Num( aLuid );
+ return buf;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::FillNodeInfoL()
+// Fills the node info in ddf structure
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::FillNodeInfoL( MSmlDmDDFObject& aNode,
+ const 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( KNSmlDMImpsTextPlain );
+ }
+ aNode.SetDescriptionL( aDescription );
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::ConvertTo8LC()
+// Converts string value to 8-bit
+// ----------------------------------------------------------------------------
+TDesC8& CNSmlDmImpsAdapter::ConvertTo8LC( const TDesC& aSource )
+ {
+ HBufC8* buf = HBufC8::NewLC( aSource.Length()*2 );
+ TPtr8 bufPtr = buf->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( bufPtr, aSource );
+
+ return *buf;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::ConvertTo16LC()
+// Converts string value to 16-bit
+// ----------------------------------------------------------------------------
+TDesC16& CNSmlDmImpsAdapter::ConvertTo16LC( const TDesC8& aSource )
+ {
+ HBufC16* buf16 = HBufC16::NewLC( aSource.Length() );
+ TPtr bufPtr16 = buf16->Des();
+
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( bufPtr16, aSource );
+
+ return *buf16;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::ResetSapL();
+// Initializes all fields with empty string.
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::ResetSapL( CIMPSSAPSettings* aSap )
+ {
+ aSap->SetSAPNameL( KNSmlDMImpsNotDefined );
+ aSap->SetSAPAddressL( KNSmlDMImpsNotDefined );
+ aSap->SetSAPUserIdL( KNSmlDMImpsNotDefined );
+ aSap->SetSAPUserPasswordL( KNSmlDMImpsNotDefined );
+ aSap->SetAccessPoint( 0 );
+ aSap->SetHighLevelServices( EIMPSServicesUnknown );
+ return;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::UpdateValueL();
+// Updates the given leaf value.
+// Checks that the object is not too long and returns error status if is.
+// ----------------------------------------------------------------------------
+CSmlDmAdapter::TError CNSmlDmImpsAdapter::UpdateValueL( const TDesC8& aUpdatedLeaf,
+ const TDesC8& aObject,
+ CIMPSSAPSettings* aSap )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdateValueL(): begin" );
+
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+
+ if ( aUpdatedLeaf.Compare( KNSmlDMImpsName ) == 0 )
+ {
+ // Check the length of SapName
+ if ( aObject.Length() <= KNSmlDMMaxNameLen )
+ {
+ aSap->SetSAPNameL( ConvertTo16LC( aObject ) );
+ CleanupStack::PopAndDestroy(); // ConvertTo16LC
+ }
+ else
+ {
+ // length of SapName is too long
+ status = CSmlDmAdapter::ETooLargeObject;
+ }
+ }
+ else if ( aUpdatedLeaf.Compare( KNSmlDMImpsPrefAddr ) == 0 )
+ {
+ // Check the length of PrefAddr
+ if ( aObject.Length() <= KNSmlDMMaxAddrLen )
+ {
+ aSap->SetSAPAddressL( ConvertTo16LC( aObject ) );
+ CleanupStack::PopAndDestroy(); // ConvertTo16LC
+ }
+ else
+ {
+ // length of PrefAddr is too long
+ status = CSmlDmAdapter::ETooLargeObject;
+ }
+ }
+ else if ( aUpdatedLeaf.Compare( KNSmlDMImpsAAuthName ) == 0 )
+ {
+ // Check the length of AAuthName
+ if ( aObject.Length() <= KNSmlDMMaxNameLen )
+ {
+ aSap->SetSAPUserIdL( ConvertTo16LC( aObject ) );
+ CleanupStack::PopAndDestroy(); // ConvertTo16LC
+ }
+ else
+ {
+ // length of AuthName is too long
+ status = CSmlDmAdapter::ETooLargeObject;
+ }
+ }
+ else if ( aUpdatedLeaf.Compare( KNSmlDMImpsAAuthSecret ) == 0 )
+ {
+ // Check the length of AAuthSecret
+ if ( aObject.Length() <= KNSmlDMMaxNameLen )
+ {
+ aSap->SetSAPUserPasswordL( ConvertTo16LC( aObject ) );
+ CleanupStack::PopAndDestroy(); // ConvertTo16LC
+ }
+ else
+ {
+ // length of AuthSecret is too long
+ status = CSmlDmAdapter::ETooLargeObject;
+ }
+ }
+ else if ( aUpdatedLeaf.Compare( KNSmlDMImpsPrefConRef ) == 0 )
+ {
+ // find out the access point link
+ TPtrC8 objectPtr= NSmlDmURI::RemoveDotSlash( aObject );
+
+// Used only in Test purpose
+// TBuf8<50> tmpObjBuf = objectPtr;
+// DBG_ARGS8(_S8("IMPS : AP = %S \n"), &tmpObjBuf );
+
+ HBufC8* luid = iCallBack->GetLuidAllocL( objectPtr );
+ CleanupStack::PushL( luid );
+
+// Used only in Test purpose
+// DBG_ARGS8(_S8("Luid length = %d \n"), luid->Length() );
+
+ if( luid->Length() > 0 )
+ {
+ TInt uid = DesToInt( *luid );
+ TUint32 uid32( uid );
+ aSap->SetAccessPoint( uid32 );
+ }
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+
+ CleanupStack::PopAndDestroy(); // luid
+ }
+
+ else if ( aUpdatedLeaf.Compare( KNSmlDMImpsAAuthLevel ) == 0 )
+ {
+ if ( ( aObject.Length() > 0 ) &&
+ ( aObject.Compare( KNSmlDMImpsDefaultAAuthLevel ) != 0 ) )
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+ }
+ else if ( aUpdatedLeaf.Compare( KNSmlDMImpsServices ) == 0 )
+ {
+ // Change the text to int value
+ TUint32 serv = EIMPSServicesUnknown;
+
+ TBool imFlag = EFalse;
+ TBool psFlag = EFalse;
+ TBool grFlag = EFalse;
+
+ TInt len = aObject.Length();
+ TInt startIndex = 0; // tells the start point of value
+ TInt endIndex = 1; // tells the end point of value
+ while ( endIndex < len )
+ {
+// TPtrC8 objPtr = aObject.Mid( startIndex, 2 );
+ TBufC8<2> str = aObject.Mid( startIndex, 2 );
+ if ( str.Match( KNSmlDMImpsServiceIM ) != KErrNotFound )
+ {
+ if ( imFlag == EFalse )
+ {
+ // IM service found
+ serv |= EIMPSServicesIM;
+ imFlag = ETrue;
+ }
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+ else if ( str.Match( KNSmlDMImpsServicePS ) != KErrNotFound )
+ {
+ if ( psFlag == EFalse )
+ {
+ // PS service found
+ serv |= EIMPSServicesPEC;
+ psFlag = ETrue;
+ }
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+ else if ( str.Match( KNSmlDMImpsServiceGR ) != KErrNotFound )
+ {
+ if ( grFlag == EFalse )
+ {
+ // GR service found
+ serv |= EIMPSServicesGroups;
+ grFlag = ETrue;
+ }
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ startIndex = endIndex + 1;
+ if ( startIndex < len )
+ {
+ TBufC8<1> chr = aObject.Mid( startIndex, 1 );
+ if ( chr.Match( KNSmlDMImpsSemiColon ) == KErrNotFound )
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+ startIndex++;
+ endIndex = startIndex + 1;
+ } // while
+
+ // Set Services
+ if ( status == KErrNone )
+ {
+ aSap->SetHighLevelServices( serv );
+ }
+ } // KNSmlDMImpsServices
+ else // Unknown leaf
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdateValueL(): end" );
+
+ return status;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::UpdatePEPValueL();
+// If PEP value is changed, deletes the existing SAP and creates new one with
+// received access group and sets new mappings to all nodes and leafs
+// ----------------------------------------------------------------------------
+CSmlDmAdapter::TError CNSmlDmImpsAdapter::UpdatePEPValueL( const TDesC8& aURI,
+ const TDesC8& aObject,
+ const TDesC8& aLUID,
+ CIMPSSAPSettings* aSap,
+ CIMPSSAPSettingsStore* aStore )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdatePEPValueL(): begin" );
+
+ HBufC8 *object = HBufC8::NewLC( aObject.Length() );
+ TPtr8 objPtr = object->Des();
+ objPtr.Format( aObject );
+ objPtr.UpperCase();
+
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+ TInt uid = DesToInt ( aLUID );
+ TUint32 uid32( uid );
+
+ TIMPSAccessGroup newAccGroup = EIMPSIMAccessGroup;
+ if ( ( objPtr.Compare( KNSmlDMImpsDefaultPEC ) == 0 )
+ || ( objPtr.Compare( KNSmlDMImpsDefPEC ) == 0 ) )
+ {
+ newAccGroup = EIMPSPECAccessGroup;
+ }
+ else if ( ( objPtr.Compare( KNSmlDMImpsDefaultIM ) == 0 )
+ || ( objPtr.Compare( KNSmlDMImpsDefIM ) == 0 ) )
+ {
+ newAccGroup = EIMPSIMAccessGroup;
+ }
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+
+ CleanupStack::PopAndDestroy(); // object
+
+ TIMPSAccessGroup oldAccGroup = aSap->AccessGroup();
+ if ( oldAccGroup != newAccGroup )
+ {
+ // The AccessGroup should be changed.
+ // Check mapping first
+
+ TPtrC8 ptrToExtUri = NSmlDmURI::RemoveLastSeg( aURI ); // IMPS/<x>/Ext
+ TPtrC8 ptrToDynNode = NSmlDmURI::RemoveLastSeg( ptrToExtUri ); // IMPS/<x>
+
+ HBufC8 *appAuthUri = HBufC8::NewLC( ptrToDynNode.Length() +
+ KNSmlDMMaxNameLen );
+ TPtr8 appAuthPtr= appAuthUri->Des();
+
+ // URI: IMPS/<x>/AppAuth
+ appAuthPtr.Format( ptrToDynNode );
+ appAuthPtr.Append( KNSmlDMImpsSeparator8 );
+ appAuthPtr.Append( KNSmlDMImpsAppAuth );
+
+// Used only in Test purpose
+// TBuf8<50> tmpUriBuf = appAuthPtr;
+// DBG_ARGS8(_S8("Fetched Uri = %S"), &tmpUriBuf );
+
+ // Get dynamic node under AppAuth
+ CBufBase *allNodes = CBufFlat::NewL( KNSmlDMReservingData );
+ CleanupStack::PushL( allNodes );
+ iCallBack->FetchLinkL( appAuthPtr, *allNodes, status );
+
+// Used only in Test purpose
+ DBG_ARGS8(_S8("Status = %d \n"), status );
+
+ if( status == CSmlDmAdapter::EOk )
+ {
+ // Delete existing SAP
+ aStore->DeleteSAPL( uid32 );
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdatePEPValueL(): SAP deleted" );
+
+ // Create new with correct AccessGroup
+ uid32 = aStore->StoreNewSAPL( aSap, newAccGroup );
+ uid = TInt( uid32 );
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdatePEPValueL(): New SAP added" );
+
+ // Set mappings to new UID
+ HBufC8 *luidDes = IntToDes8LC( TInt( uid ) );
+
+ // URI: IMPS/<x>/Ext/PEPCompliant
+ iCallBack->SetMappingL( aURI, *luidDes );
+
+ // URI: IMPS/<x>/Ext
+ iCallBack->SetMappingL( ptrToExtUri, *luidDes );
+
+ // URI: IMPS/<x>
+ iCallBack->SetMappingL( ptrToDynNode, *luidDes );
+
+ // URI: IMPS/<x>/AppAuth
+ iCallBack->SetMappingL( appAuthPtr, *luidDes );
+
+ if ( allNodes->Size() > 0 )
+ {
+ TPtrC8 uriSeg8Ptr = allNodes->Ptr( 0 );
+
+ // URI: IMPS/<x>/AppAuth/<x>
+ HBufC8 *authUri = HBufC8::NewLC( appAuthPtr.Length() +
+ uriSeg8Ptr.Length() );
+ TPtr8 authUriPtr= authUri->Des();
+ authUriPtr.Format( appAuthPtr );
+ authUriPtr.Append( KNSmlDMImpsSeparator8 );
+ authUriPtr.Append( uriSeg8Ptr );
+ iCallBack->SetMappingL( authUriPtr, *luidDes );
+
+ CleanupStack::PopAndDestroy(); // authUri
+ }
+ CleanupStack::PopAndDestroy(); // luidDes
+ }
+
+ CleanupStack::PopAndDestroy( 2 ); // appAuthUri, allNodes
+ } // oldValue != newValue
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::UpdatePEPValueL(): end" );
+
+ return status;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::DeleteValueL();
+// Initializes the given leaf field with empty string.
+// ----------------------------------------------------------------------------
+CSmlDmAdapter::TError CNSmlDmImpsAdapter::DeleteValueL( const TDesC8& aUri,
+ CIMPSSAPSettings* aSap )
+ {
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+
+ TPtrC8 deletedLeaf = NSmlDmURI::LastURISeg( aUri );
+ TPtrC8 ptrToParentUri = NSmlDmURI::RemoveLastSeg( aUri );
+ TPtrC8 parentSeg = NSmlDmURI::LastURISeg( ptrToParentUri );
+
+ if ( deletedLeaf.Compare( KNSmlDMImpsName ) == 0)
+ {
+ aSap->SetSAPNameL( ConvertTo16LC( parentSeg ) );
+ CleanupStack::PopAndDestroy();
+ }
+ else if ( deletedLeaf.Compare( KNSmlDMImpsPrefAddr ) == 0)
+ {
+ aSap->SetSAPAddressL( KNSmlDMImpsNotDefined );
+ }
+ else if ( deletedLeaf.Compare( KNSmlDMImpsAAuthName ) == 0)
+ {
+ aSap->SetSAPUserIdL( KNSmlDMImpsNotDefined );
+ }
+ else if ( deletedLeaf.Compare( KNSmlDMImpsAAuthSecret ) == 0)
+ {
+ aSap->SetSAPUserPasswordL( KNSmlDMImpsNotDefined );
+ }
+ else if ( deletedLeaf.Compare( KNSmlDMImpsPrefConRef ) == 0 )
+ {
+ aSap->SetAccessPoint( 0 );
+ }
+ else if ( deletedLeaf.Compare( KNSmlDMImpsAAuthLevel ) == 0 )
+ {
+ // AAuthLevel is not stored anywhere so it can not be deleted either
+ }
+ else if ( ( aUri.Match( KNSmlDMImpsWholeAppAuthUri ) != KErrNotFound ) ||
+ ( aUri.Match( KNSmlDMImpsWholeAppAuthDynUri ) != KErrNotFound ) )
+ {
+ aSap->SetSAPUserIdL( KNSmlDMImpsNotDefined );
+ aSap->SetSAPUserPasswordL( KNSmlDMImpsNotDefined );
+ }
+ else if ( deletedLeaf.Compare( KNSmlDMImpsServices ) == 0 )
+ {
+ status = CSmlDmAdapter::EError;
+ }
+ else // Unknown leaf
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+
+ return status;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::FetchObjectL();
+// The method reads the requested parameter value from DB
+// - Check that the requested SAP exists in DB by checking that
+// the uid with LUID value exists.
+// - Get SAP data to aSap
+// - Read the requested parameter value
+// - In error case return error status
+// ----------------------------------------------------------------------------
+CSmlDmAdapter::TError CNSmlDmImpsAdapter::FetchObjectL( const TDesC8& aUri,
+ const TDesC8& aLUID,
+ CBufBase& aObject )
+ {
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EOk;
+
+ CIMPSSAPSettings* ownSap = CIMPSSAPSettings::NewL();
+ CleanupStack::PushL( ownSap );
+ CIMPSSAPSettingsStore* ownStore = CIMPSSAPSettingsStore::NewL();
+ CleanupStack::PushL( ownStore );
+
+ if( aLUID.Length() > 0 )
+ {
+ // Check that Store is not empty
+ // causes leaving if empty db is tried to read
+ TInt sapFound = KErrNotFound;
+ sapFound = GetCorrectSapL( aLUID, ownSap, ownStore );
+ if ( sapFound == KErrNone )
+ {
+ // Sap exist, read value of correct leaf
+ if ( aUri.Compare( KNSmlDMImpsName ) == 0 )
+ {
+ aObject.InsertL( 0, ConvertTo8LC( ownSap->SAPName() ) );
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+ else if ( aUri.Compare( KNSmlDMImpsPrefAddr ) == 0 )
+ {
+ aObject.InsertL( 0, ConvertTo8LC( ownSap->SAPAddress() ) );
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+ else if ( aUri.Compare( KNSmlDMImpsAAuthName ) == 0 )
+ {
+ aObject.InsertL( 0, ConvertTo8LC( ownSap->SAPUserId() ) );
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+ else if ( aUri.Compare( KNSmlDMImpsAAuthSecret ) == 0 )
+ {
+ // Requesting password not allowed.
+ status = EError;
+ }
+ else if ( aUri.Compare( KNSmlDMImpsPepCompliant ) == 0 )
+ {
+ TIMPSAccessGroup accGroup = ownSap->AccessGroup();
+ if ( accGroup == EIMPSPECAccessGroup )
+ {
+ aObject.InsertL( 0, KNSmlDMImpsDefaultPEC );
+ }
+ else
+ {
+ aObject.InsertL( 0, KNSmlDMImpsDefaultIM );
+ }
+ } // PEPCompliant
+ else if ( aUri.Compare( KNSmlDMImpsPrefConRef ) == 0 )
+ {
+ HBufC8* buf = IntToDes8LC( ownSap->AccessPoint() );
+ TUint idFromDb = DesToInt( buf->Des() );
+ CleanupStack::PopAndDestroy( ); // buf
+
+ CBufBase *allIAPs = CBufFlat::NewL( KNSmlDMReservingData );
+ CleanupStack::PushL( allIAPs );
+ iCallBack->FetchLinkL( GetConRef(), *allIAPs, status );
+
+ TBool found = EFalse;
+ if( status == CSmlDmAdapter::EOk )
+ {
+ TInt startIndex = 0;
+
+ for( TInt i = 0; i < allIAPs->Size(); i++ )
+ {
+ if( allIAPs->Ptr(0)[i] == '/' || i == allIAPs->Size()-1 )
+ {
+ HBufC8 *uriSegment=0;
+ TPtrC8 uriSeg8Ptr = allIAPs->Ptr( startIndex ).Mid( 0, i-startIndex );
+ uriSegment = uriSeg8Ptr.AllocLC();
+ HBufC8 *uri = HBufC8::NewLC( GetConRef().Length() + 1 + uriSegment->Length() );
+ TPtr8 uriPtr= uri->Des();
+ uriPtr.Format( GetConRef());
+ uriPtr.Append( KNSmlDMImpsSeparator );
+ uriPtr.Append( *uriSegment );
+ HBufC8* luid = iCallBack->GetLuidAllocL( uriPtr );
+ CleanupStack::PushL( luid );
+
+ if( luid->Length() > 0 )
+ {
+ TInt iapId = DesToInt( luid->Des() );
+ if( iapId == idFromDb )
+ {
+ found = ETrue;
+ aObject.InsertL( 0, uriPtr );
+ CleanupStack::PopAndDestroy( 3 ); // uriSegment, uri, luid
+ break;
+ }
+ } // if luid
+
+ startIndex = i + 1;
+ CleanupStack::PopAndDestroy( 3 ); // uriSegment, uri, luid
+ } //end if allIaps...
+ } //end for
+ }
+ CleanupStack::PopAndDestroy(); //allIaps
+ if( !found )
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ } // PrefConRef
+
+ else if ( aUri.Compare( KNSmlDMImpsAppId ) == 0 )
+ {
+ // AppID is not used yet so return default value
+ aObject.InsertL( 0, KNSmlDMImpsDefaultAppID );
+ }
+ else if ( aUri.Compare( KNSmlDMImpsAAuthLevel ) == 0 )
+ {
+ // Check from the database if the AAuthName or AAuthSecret are defined
+ // if they are, return default value
+ if ( ( ownSap->SAPUserId().Compare(KNSmlDMImpsNotDefined ) == 0 ) &&
+ ( ownSap->SAPUserPassword().Compare(KNSmlDMImpsNotDefined ) == 0 ) )
+ // AAuthName and AAuthSecret are not defined
+ {
+ aObject.InsertL( 0, KNSmlDMImpsNotDefined8 );
+ }
+ else
+ {
+ aObject.InsertL( 0, KNSmlDMImpsDefaultAAuthLevel );
+ }
+ } // AppID
+ else if ( aUri.Compare( KNSmlDMImpsServices ) == 0 )
+ {
+ HBufC8 *services=0;
+ TUint32 serv = EIMPSServicesUnknown;
+ services = HBufC8::NewLC( 11 );
+ TPtr8 servicesPtr = services->Des();
+
+ serv = ownSap->HighLevelServices();
+ switch ( serv )
+ {
+ case ( EIMPSServicesIM ):
+ {
+ servicesPtr.Format( KNSmlDMImpsServiceIM );
+ break;
+ }
+ case ( EIMPSServicesPEC ):
+ {
+ servicesPtr.Format( KNSmlDMImpsServicePS );
+ break;
+ }
+ case ( EIMPSServicesIM | EIMPSServicesPEC ):
+ {
+ servicesPtr.Format( KNSmlDMImpsServiceIM );
+ servicesPtr.Append( KNSmlDMImpsSemiColon );
+ servicesPtr.Append( KNSmlDMImpsServicePS );
+ break;
+ }
+ case ( EIMPSServicesGroups ):
+ {
+ servicesPtr.Format( KNSmlDMImpsServiceGR );
+ break;
+ }
+ case ( EIMPSServicesIM | EIMPSServicesGroups ):
+ {
+ servicesPtr.Format( KNSmlDMImpsServiceIM );
+ servicesPtr.Append( KNSmlDMImpsSemiColon );
+ servicesPtr.Append( KNSmlDMImpsServiceGR );
+ break;
+ }
+ case ( EIMPSServicesPEC | EIMPSServicesGroups ):
+ {
+ servicesPtr.Format( KNSmlDMImpsServicePS );
+ servicesPtr.Append( KNSmlDMImpsSemiColon );
+ servicesPtr.Append( KNSmlDMImpsServiceGR );
+ break;
+ }
+ case ( EIMPSServicesIM | EIMPSServicesPEC | EIMPSServicesGroups ):
+ {
+ servicesPtr.Format( KNSmlDMImpsServiceIM );
+ servicesPtr.Append( KNSmlDMImpsSemiColon );
+ servicesPtr.Append( KNSmlDMImpsServicePS );
+ servicesPtr.Append( KNSmlDMImpsSemiColon );
+ servicesPtr.Append( KNSmlDMImpsServiceGR );
+
+ break;
+ }
+ default:
+ {
+ servicesPtr.Format( KNSmlDMImpsNotDefined8 );
+ break;
+ }
+ } // Service
+ aObject.InsertL( 0, servicesPtr );
+ CleanupStack::PopAndDestroy(); // services
+ }
+ else
+ {
+ status = CSmlDmAdapter::EInvalidObject;
+ }
+ } // sapFound
+ else if ( sapFound == KErrNotFound )
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+ else
+ {
+ status = CSmlDmAdapter::EError;
+ }
+
+ } // aLUID length
+ else
+ {
+ status = CSmlDmAdapter::ENotFound;
+ }
+
+ CleanupStack::PopAndDestroy( 2 ); // ownSap, ownStore
+
+ return status;
+ }
+
+// ----------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::GetCorrectSapL();
+// The method reads the requested parameter value from DB
+// - Check that the requested SAP exists in DB by checking
+// that the index with LUID value exists.
+// - Get SAP data to aSap
+// - Read the requested parameter value
+// - In error case return error status
+// ----------------------------------------------------------------------------
+TInt CNSmlDmImpsAdapter::GetCorrectSapL( const TDesC8& aLUID,
+ CIMPSSAPSettings* aSap,
+ CIMPSSAPSettingsStore* aStore )
+ {
+ // If value of Stat is KErrNone, the Sap has been found.
+ // If it is KErrNotFound, the Sap does not exist.
+ // Else the stat returns error status.
+ CIMPSSAPSettingsList* ownList = CIMPSSAPSettingsList::NewL();
+ CleanupStack::PushL( ownList );
+
+ TInt stat = KErrNotFound;
+
+ // Check that Store is not empty
+ // causes leaving if empty db is tried to read
+ TInt count = 0;
+ count = aStore->SAPCountL( EIMPSAccessFilterAll ) ;
+ DBG_ARGS8(_S8("IMPS::Count of SAPs in store = %d \n"), count );
+ if ( count > 0 )
+ {
+ TInt uid = DesToInt( aLUID );
+ TUint32 uid32( uid );
+ aStore->PopulateSAPSettingsListL( *ownList, EIMPSAccessFilterAll );
+ _DBG_FILE( "CNSmlDmImpsAdapter::GetCorrectSapL(): SAP settings list" );
+ for ( TInt i = 0; i < count; i++ )
+ {
+ TUint32 id32 = ownList->UidForIndex( i );
+ if ( id32 == uid32 )
+ {
+ aStore->GetSAPL( uid32, aSap );
+ _DBG_FILE( "CNSmlDmImpsAdapter::GetCorrectSapL(): SAP requested" );
+ stat = KErrNone;
+ break;
+ }
+ } // for
+ } // if count
+
+ CleanupStack::PopAndDestroy(); // ownList
+
+ return stat;
+ }
+
+// ----------------------------------------------------------------------------
+// TImplementationProxy ImplementationTable[]
+// Needed because of ECOM architecture
+// ----------------------------------------------------------------------------
+#ifndef IMPLEMENTATION_PROXY_ENTRY
+#define IMPLEMENTATION_PROXY_ENTRY( aUid, aFuncPtr ) { {aUid}, ( aFuncPtr ) }
+#endif
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( KNSmlDMImpsAdapterImplUid,
+ CNSmlDmImpsAdapter::NewL )
+ };
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+ {
+ _DBG_FILE( "ImplementationGroupProxy() for CNSmlDmImpsAdapter: begin" );
+ aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+ _DBG_FILE( "ImplementationGroupProxy() for CNSmlDmImpsAdapter: end" );
+ return ImplementationTable;
+ }
+
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+void CNSmlDmImpsAdapter::HandleSessionEventL( TMsvSessionEvent /*aEvent*/,
+ TAny* /*aArg1*/,
+ TAny* /*aArg2*/,
+ TAny* /*aArg3*/ )
+ {
+ _DBG_FILE( "CNSmlDmImpsAdapter::HandleSessionEventL(): begin" );
+
+ _DBG_FILE( "CNSmlDmImpsAdapter::HandleSessionEventL(): end" );
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDmImpsAdapter::const TDesC8& GetConRef()
+// Returns the connection reference
+// ------------------------------------------------------------------------------------------------
+const TDesC8& CNSmlDmImpsAdapter::GetConRef()
+ {
+ if(FeatureManager::FeatureSupported(KFeatureIdFfDmConnmoAdapter))
+ {
+ return KNSmlDMImpsConnMOIAPUri();
+ }
+ else
+ {
+ return KNSmlDMImpsIAPUri();
+ }
+ }
+
+
+// End of file
+