--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/omadmadapters/syncmlds/src/NSmlDsSettingsAdapter.cpp Tue Jul 13 03:48:30 2010 +0530
@@ -0,0 +1,3850 @@
+/*
+* Copyright (c) 2005 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: DS-settings adapter
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "NSmlDSSettingsAdapter.h"
+#include "nsmldebug.h"
+#include "nsmlconstants.h"
+#include "nsmldmconstants.h"
+#include "nsmldmimpluids.h"
+#include "nsmldmiapmatcher.h"
+
+#include <implementationproxy.h>
+#include <badesca.h>
+#include <utf.h>
+#include <SyncMLTransportProperties.h>
+
+#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
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CNSmlDSSettingsAdapter* CNSmlDSSettingsAdapter::NewL( MSmlDmCallback* aDmCallback )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::NewL(): begin");
+
+ CNSmlDSSettingsAdapter* self = NewLC( aDmCallback );
+ CleanupStack::Pop();
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::NewL(): end");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::NewLC
+// -----------------------------------------------------------------------------
+CNSmlDSSettingsAdapter* CNSmlDSSettingsAdapter::NewLC(MSmlDmCallback* aDmCallback )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::NewLC(): begin");
+ CNSmlDSSettingsAdapter* self = new ( ELeave ) CNSmlDSSettingsAdapter( aDmCallback );
+ CleanupStack::PushL( self );
+ self->iCallBack = aDmCallback;
+
+ self->ConstructL();
+ self->iLeafType = EDSUnset;
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::NewLC(): end");
+ return self;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::CNSmlDSSettingsAdapter
+//------------------------------------------------------------------------------
+CNSmlDSSettingsAdapter::CNSmlDSSettingsAdapter(TAny* aEcomArguments) : CSmlDmAdapter(aEcomArguments)
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::CNSmlDSSettingsAdapter(): begin");
+ _DBG_FILE("CNSmlDSSettingsAdapter::CNSmlDSSettingsAdapter(): end");
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::~CNSmlDSSettingsAdapter()
+// Class destructor.
+//------------------------------------------------------------------------------
+CNSmlDSSettingsAdapter::~CNSmlDSSettingsAdapter()
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::~CNSmlDSSettingsAdapter(): begin");
+ delete iPrevURI;
+ delete iField;
+
+ // Command buffer cleaning
+ if ( iBuffer )
+ {
+
+ for( TInt i=0; i<iBuffer->Count(); i++ )
+ {
+ delete iBuffer->At(i).iMappingName;
+ delete iBuffer->At(i).iName;
+
+ for( TInt j=0; j<iBuffer->At(i).iNodeBuf->Count(); j++ )
+ {
+ delete iBuffer->At(i).iNodeBuf->At(j).iUri;
+ if( iBuffer->At(i).iNodeBuf->At(j).iData )
+ {
+ delete iBuffer->At(i).iNodeBuf->At(j).iData;
+ }
+ }
+ iBuffer->At(i).iNodeBuf->Reset();
+ delete iBuffer->At(i).iNodeBuf;
+ }
+
+ iBuffer->Reset();
+ delete iBuffer;
+ }
+
+ iDSProfile.Close();
+ iSyncSession.Close();
+ iSyncSessionOpen = EFalse;
+
+ delete iPortNbr;
+ delete iPortBuf;
+ delete iRdbDataStore;
+
+ iBufferExecution = EFalse;
+
+ iCallBack = 0;
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::~CNSmlDSSettingsAdapter(): end");
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::ConstructL
+// Second phase constructor.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::ConstructL()
+ {
+ iField = HBufC8::NewL( KNSmlMaxURLLength );
+ iPrevURI = HBufC8::NewL( KNSmlMaxURLLength );
+ iRdbDataStore = HBufC16::NewL( KNSmlMaxRemoteNameLength );
+//
+// Command buffering used for AddNode + AddLeaf
+//
+ iBuffer = new ( ELeave ) CArrayFixFlat <TNSmlDSBufferElement> ( KNSmlDSGranularity );
+
+ iSyncSessionOpen = EFalse;
+
+ iPortNbr = 0;
+ iBufferExecution = EFalse;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::DDFVersionL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::DDFVersionL(CBufBase& aVersion)
+ {
+ aVersion.InsertL( 0, KVersion );
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::DDFStructureL
+// Fills the DDF structure of the adapter.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::DDFStructureL( MSmlDmDDFObject& aDDF )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DDFStructureL(): begin");
+
+ TSmlDmAccessTypes *aclTypes = new ( ELeave ) TSmlDmAccessTypes();
+ CleanupStack::PushL( aclTypes );
+
+ // Set Get as acceptable operations
+ aclTypes->SetGet();
+
+ MSmlDmDDFObject* ddfRoot = &aDDF;
+ MSmlDmDDFObject& ddf = ddfRoot->AddChildObjectL( KNSmlDdfRoot );
+ FillNodeInfoL( ddf, *aclTypes, MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EPermanent, MSmlDmDDFObject::ENode,
+ KNSmlDdfRootDescription, KNullDesC8, KMimeType );
+
+ ddf.SetDFTitleL( KDSSettingsTitle );
+
+
+ MSmlDmDDFObject& nDSAcc = ddf.AddChildObjectL( KNSmlDefDSAcc );
+ nDSAcc.SetOccurenceL( MSmlDmDDFObject::EOne );
+ nDSAcc.SetDefaultValueL( KNullDesC8 );
+ nDSAcc.SetScopeL( MSmlDmDDFObject::EPermanent );
+ nDSAcc.SetAccessTypesL( *aclTypes );
+ nDSAcc.SetDFFormatL( MSmlDmDDFObject::ENode );
+//
+// Set rest acceptable operations for data itself
+//
+ aclTypes->SetAdd();
+ aclTypes->SetReplace();
+ aclTypes->SetDelete();
+
+ TSmlDmAccessTypes aclTypesLimit;
+ aclTypesLimit.SetGet();
+ aclTypesLimit.SetAdd();
+
+ TSmlDmAccessTypes aclTypesGet;
+ aclTypesGet.SetGet();
+
+ TSmlDmAccessTypes aclTypesNoGet;
+ aclTypesNoGet.SetReplace();
+ aclTypesNoGet.SetAdd();
+ aclTypesNoGet.SetDelete();
+
+ TSmlDmAccessTypes aclTypesNoDelete;
+ aclTypesNoDelete.SetGet();
+ aclTypesNoDelete.SetAdd();
+ aclTypesNoDelete.SetReplace();
+
+ MSmlDmDDFObject& nProDDF = nDSAcc.AddChildObjectGroupL();
+ FillNodeInfoL( nProDDF, *aclTypes, MSmlDmDDFObject::EZeroOrMore,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode,
+ KNullDesC8, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nAddrDDF = nProDDF.AddChildObjectL(KNSmlDdfAddr); // Addr
+ FillNodeInfoL( nAddrDDF, *aclTypes, MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfAddrDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nAddrTypeDDF = nProDDF.AddChildObjectL(KNSmlDdfAddrType); // AddrType
+ FillNodeInfoL( nAddrTypeDDF, *aclTypes, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfAddrTypeDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nPortNbrDDF = nProDDF.AddChildObjectL(KNSmlDdfPortNbr);// PortNbr
+ FillNodeInfoL( nPortNbrDDF, *aclTypes, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EInt,
+ KNSmlDdfPortNbrDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nNameDDF = nProDDF.AddChildObjectL(KNSmlDdfName); // Name
+ FillNodeInfoL( nNameDDF, *aclTypes, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfNameDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nDBrootDDF = nProDDF.AddChildObjectL(KNSmlDdfDB); // DB
+ FillNodeInfoL( nDBrootDDF, *aclTypes, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode,
+ KNSmlDdfDBDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nDBDDF = nDBrootDDF.AddChildObjectGroupL(); // DB/<X>
+ FillNodeInfoL( nDBDDF, *aclTypes, MSmlDmDDFObject::EZeroOrMore,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::ENode,
+ KNullDesC8, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nCTTypeDDF = nDBDDF.AddChildObjectL(KNSmlDdfCTType); // CTType
+ FillNodeInfoL( nCTTypeDDF, aclTypesLimit, MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfCTTypeDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nRDBURIDDF = nDBDDF.AddChildObjectL(KNSmlDdfRDBURI); // RDBURI
+ FillNodeInfoL( nRDBURIDDF, aclTypesNoDelete, MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfRDBURIDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nLDBURIDDF = nDBDDF.AddChildObjectL(KNSmlDdfLDBURI); // LDBURI
+ FillNodeInfoL( nLDBURIDDF, aclTypesNoDelete, MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfLDBURIDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nClientUserNameDDF = nProDDF.AddChildObjectL(KNSmlDdfClientUserName);
+ FillNodeInfoL( nClientUserNameDDF, *aclTypes, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfClientUserNameDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nServerIdDDF = nProDDF.AddChildObjectL(KNSmlDdfServerId);
+ FillNodeInfoL( nServerIdDDF, *aclTypes, MSmlDmDDFObject::EZeroOrOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfServerIdDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nClientPWDDF = nProDDF.AddChildObjectL(KNSmlDdfClientPW);// ClientPW
+ FillNodeInfoL( nClientPWDDF, aclTypesNoGet, MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfClientPWDescription, KNullDesC8, KMimeType );
+
+ MSmlDmDDFObject& nToNAPIDDDF = nProDDF.AddChildObjectL(KNSmlDdfToNAPID);// ToNAPID
+ FillNodeInfoL( nToNAPIDDDF, aclTypesNoDelete, MSmlDmDDFObject::EOne,
+ MSmlDmDDFObject::EDynamic, MSmlDmDDFObject::EChr,
+ KNSmlDdfToNAPIDDescription, KNullDesC8, KMimeType );
+
+ CleanupStack::PopAndDestroy(); //aclTypes
+ _DBG_FILE("CNSmlDSSettingsAdapter::DDFStructureL(): end");
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::UpdateLeafObjectL
+// The function updates the leaf object data.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::UpdateLeafObjectL( const TDesC8& aURI,
+ const TDesC8& aParentLUID,
+ const TDesC8& aObject,
+ const TDesC8& /*aType*/,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::UpdateLeafObjectL(): begin");
+//
+// Check which field going to be handled
+//
+ // Static node feature start
+ TInt profileLUID = -1;
+ if(aParentLUID.Length() == 0 )
+ {
+ iLUID = -1;
+ if( IsDSAccUriFormatMatchPredefined(aURI) )
+ {
+ iLUID = ConstructTreeL(aURI);
+ profileLUID = GetProfileIdFromURIL( aURI );
+ }
+ if ((iLUID == 0 ) && (aURI.Match(_L8("SyncML/DSAcc/DSId*/DB/CTId*")) == KErrNone))
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+ }
+ // Static node feature end
+ SetField( aURI );
+ TInt fieldID = GetDSField();
+ TInt fieldType = GetDSFieldTypeL();
+ if ( fieldType == EWrong || fieldID < 0 )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::UpdateLeafObjectL(): EError end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ return;
+ }
+ if(profileLUID == -1)
+ profileLUID = GetIntObject( aParentLUID );
+
+ if( profileLUID == -1 && fieldType != EParam )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::UpdateLeafObjectL( ): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+
+ if ( fieldType == EParam )
+ {
+ if( GetBufferIndex( aURI ) >= 0 && iBufferExecution == EFalse )
+ {
+ AddLeafBufferL( aURI, aParentLUID, aObject, aStatusRef );
+ return;
+ }
+ profileLUID = GetProfileIdFromURIL( aURI );
+ if( FindProfileIdL( profileLUID ) == EFalse )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+ if( iField->Compare( KNSmlDdfCTType ) == 0 )
+ {
+ if( MimeTypeAllreadyExitsL( profileLUID, aObject ) )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EAlreadyExists );
+ return;
+ }
+ if( aObject.Length() == 0 )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject );
+ return;
+ }
+ }
+ }
+
+ if( profileLUID != iParentLUID && fieldType != EParam )
+ {
+ if( FindProfileIdL( profileLUID ) )
+ {
+ iParentLUID = profileLUID;
+ }
+ else
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+ }
+ if ( fieldType == EStr || fieldType == EInt )
+ {
+//
+// Check if Object length id valid
+//
+ if( NotValidStrLenght( fieldID, aObject ) )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddLeafObjectL(): KErr length end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ETooLargeObject );
+ return;
+ }
+ }
+
+ TInt ret = 0;
+ if ( fieldType == EStr || fieldType == EInt )
+ {
+ if( fieldID == EProfileURL )
+ {
+ TInt num=0;
+ ret = ParseUri( aObject, num );
+ if( ret == KErrNone )
+ {
+ ret = SetProfileServerURIL( iParentLUID, aObject );
+ if( ret != 0 )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddLeafObjectL(): URI set failed");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ return;
+ }
+ }
+ else //if port number not included in URL
+ {
+ ret = SetProfileServerURIL( iParentLUID, aObject );
+ if( ret != 0 )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddLeafObjectL(): URI set failed");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ return;
+ }
+ }
+
+ }
+ else if( fieldID == EProfileURL )
+ {
+ ret = SetProfileServerURIL( iParentLUID, aObject );
+ }
+ else if( fieldID == EProfileMediumType )//AddrType
+ {
+ if ( iLeafType == EDSDelete )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ return;
+ }
+ iObject = GetIntObject( aObject );
+ ret = SetProfileAddrTypeL( iParentLUID, iObject );
+ }
+ else
+ {
+ ret = SetProfileStrValueL( iParentLUID, aObject, fieldID );
+ }
+ }
+ else if ( fieldType == EParam )
+ {
+ TInt sRet = KErrGeneral;
+ if( iField->Compare( KNSmlDdfCTType ) == 0 ) //Task Mime Type
+ {
+// DBG_ARGS8(_S8("NEW: Object <%S>"), &aObject);
+ TInt dataProviderId(-1);
+ if(aParentLUID.Length() == 0 )
+ {
+ dataProviderId = iLUID ;
+ }
+ else
+ {
+ dataProviderId = GetIntObject( aParentLUID );
+ }
+ if( FindTaskIDL( profileLUID, dataProviderId ) == EFalse )
+ {
+ sRet = AddNewDataProviderL( profileLUID, aObject, dataProviderId );
+ }
+ else
+ {
+ sRet = KErrAlreadyExists;
+ }
+ if( sRet == KErrDiskFull )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EDiskFull );
+ }
+ else if( sRet == KErrNotFound )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ }
+ else if( sRet == KErrAlreadyExists )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EAlreadyExists );
+ }
+ else if( sRet != KErrNone )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+ else
+ {
+ TPtrC8 addDBURI = RemoveLastURISeg( aURI );
+ TBuf8<16> dataProvider;
+ dataProvider.Num( dataProviderId );
+ iCallBack->SetMappingL( addDBURI, dataProvider );
+ SetBufferLUID( aURI,dataProviderId );
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+
+
+ }
+ return;
+ }
+ //
+ // Only database values handled
+ //
+/* if( iField->Compare( KNSmlDdfLDBURI ) == 0 )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+*/
+ if( !(iField->Compare( KNSmlDdfLDBURI ) == 0) &&
+ !(iField->Compare( KNSmlDdfRDBURI ) == 0) )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddLeafObjectL(): Param header end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ return;
+ }
+
+
+ TInt dataProviderId(-1);
+ if(aParentLUID.Length() == 0 )
+ {
+ dataProviderId = iLUID ;
+ }
+ else
+ {
+ dataProviderId = GetIntObject( aParentLUID );
+ }
+ if( FindTaskIDL( profileLUID, dataProviderId ) )
+ {
+ ret = UpdateDataSourceL( profileLUID, dataProviderId, aObject, *iField);
+ if( ret != KErrNone )
+ {
+ ret = KErrGeneral;
+ }
+ TPtrC8 dbURI = RemoveLastURISeg( aURI );
+ TBuf8<16> dataProvider;
+ dataProvider.Num( dataProviderId );
+ iCallBack->SetMappingL( dbURI, dataProvider );
+ }
+ else
+ {
+ ret = KErrNone;
+ //ret = KErrNotFound;
+ }
+ }
+
+ if ( ret != KErrNone )
+ {
+ if( ret == KErrDiskFull)
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EDiskFull );
+ }
+ else if( ret == KErrNotFound )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ }
+ else if( ret == KErrArgument )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject );
+ }
+ else if( ret == KErrOverflow)
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ETooLargeObject );
+ }
+ else
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+ }
+ else if ( fieldID == EProfilePort )
+ {
+ // in case port is updated, save status ref to be used in
+ // CompleteOutstandingCmdsL (i.e. status not set yet)
+ iPortBufStatusRef = aStatusRef;
+ }
+ else
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ }
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddLeafObjectL(): end");
+ return;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::DeleteObjectL
+// The function Deletes leaf object data or node data content.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::DeleteObjectL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): begin");
+ iLUID = IntLUID( aLUID );
+ if( aLUID.Length() == 0 )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter DELETE::DeleteObjectL( ): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+
+//
+// Check which field going to be handled
+//
+ SetField( aURI );
+ if ( iField->Compare( KNSmlDdfCTType ) == 0
+ || iField->Compare( KNSmlDdfRDBURI ) == 0
+ || iField->Compare( KNSmlDdfLDBURI ) == 0
+ || iField->Compare( KNSmlDdfToNAPID ) == 0 )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter DELETE::DeleteObjectL( ): EError end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ return;
+ }
+
+ TInt last = aURI.LocateReverse( KNSmlDMUriSeparator );
+ TInt pos = aURI.Find( KNSmlDefDSAcc );
+
+ if(last - 5 == pos )
+ {
+ iLUID = IntLUID( aLUID );
+ if( !FindProfileIdL( iLUID ) )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): notfound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+ else
+ {
+ TInt sRet = DeleteProfileL( iLUID );
+ if( sRet!=KErrNone )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): ENotCommitted end");
+ if( sRet == KErrNotFound )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ }
+ else if( sRet == KErrInUse )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EObjectInUse );
+ }
+ else
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+ return;
+ }
+ else
+ {
+ iPrevURI->Des().Format( KNullDesC8 );
+ iPrevLUID = 0;
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): EOk end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ return;
+ }
+ }
+ }
+ else if( aURI.Match( KDBUri1 ) != KErrNotFound )
+ {
+ iLUID = GetProfileIdFromURIL( aURI ); // Get profile Id for DB-level
+ if (iLUID < 0)
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): EError end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ return;
+ }
+
+ if( !FindProfileIdL( iLUID ) )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+ TInt adapterId = GetIntObject( aLUID );//Get task ID
+ TInt retval = DeleteTaskByIDL( iLUID, adapterId );
+ if( retval != KErrNone )
+ {
+ if( retval == KErrNotFound )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ }
+ else
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): EError end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+ }
+ else
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): EOk end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ }
+ return;
+ }
+
+ iLUID = IntLUID( aLUID );
+
+ if ( iLUID != iParentLUID )
+ {
+ if( !FindProfileIdL( iLUID ) )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+ iParentLUID = iLUID;
+ }
+
+ HBufC8* lObject = HBufC8::NewLC( 15 );
+ lObject->Des().Format( KNullDesC8 );
+
+ iLeafType = EDSDelete;
+ UpdateLeafObjectL( aURI, aLUID, *lObject, KMimeType, aStatusRef );
+ iLeafType = EDSUnset;
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::DeleteObjectL( ): end");
+ CleanupStack::PopAndDestroy(); //lObject
+ return;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::FetchLeafObjectL
+// The function fetches the leaf object data.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::FetchLeafObjectL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TDesC8& aType,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchLeafObjectL(): begin");
+ DBG_ARGS(_S16("DS:Fetch aURI - %S - %S"), &aURI, &aLUID);
+
+ CBufBase *lObject = CBufFlat::NewL( 128 );
+ CleanupStack::PushL( lObject );
+ lObject->Reset();
+ if( FetchObjectL( aURI, aLUID, lObject, aStatusRef ) != KErrNone )
+ {
+ CleanupStack::PopAndDestroy(); //lObject
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchLeafObjectL() : Error end");
+ return;
+ };
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ iCallBack->SetResultsL( aResultsRef, *lObject, aType );
+ CleanupStack::PopAndDestroy(); //object
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchLeafObjectL() : end");
+ return;
+ }
+
+//------------------------------------------------------------------------------
+// CSmlDSSettingsAdapter::ChildURIListL
+// Function returns the list of profiles or leafs of the profile
+// acording to aURI.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::ChildURIListL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList,
+ const TInt aResultsRef, const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): begin");
+// DBG_ARGS(_S16("ChildURIListL URI - <%S>"), &aURI);
+
+ CBufBase *currentURISegmentList = CBufFlat::NewL( 128 );
+ CleanupStack::PushL( currentURISegmentList );
+
+ if( aURI.Match( KDSAccMatch ) != KErrNotFound &&
+ aURI.Match( KDSAccMatch2 ) == KErrNotFound )
+ {
+ //
+ // Check if Profile exists
+ //
+ TInt checkLUID = GetIntObject( aLUID );
+ if( FindProfileIdL( checkLUID ) )
+ {
+ currentURISegmentList->InsertL( currentURISegmentList->Size(), KSegmDSAcc );
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ iCallBack->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 );
+ }
+ else
+ {
+ checkLUID = -1;
+ if( IsDSAccUriFormatMatchPredefined(aURI) )
+ {
+ checkLUID = ConstructTreeL(aURI);
+ }
+ if (checkLUID == -1 )
+ {
+ _DBG_FILE( "CNSmlDMSettingsAdapter::childURI(): ENotFound end" );
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ CleanupStack::PopAndDestroy( ); // currentURISegmentList
+ _DBG_FILE( "CNSmlDMSettingsAdapter::ChildURIListL(): end" );
+ return;
+ }
+ else
+ {
+ currentURISegmentList->InsertL( currentURISegmentList->Size(), KSegmDSAcc );
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ iCallBack->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 );
+ }
+
+ // Static node feature start end
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): end");
+ CleanupStack::PopAndDestroy(); //currentURISegmentList
+ return;
+ }
+ }
+ else if( aURI.Match( KDSDBMatch ) != KErrNotFound )
+ {
+ //
+ // Check if ContenType exists (profileId from adapters)
+ //
+ TInt profileLUID = GetProfileIdFromURIL( aURI ); // ProfileId for DB-level
+ if( OpenSyncSessionAndDSProfileL( profileLUID, ESmlOpenRead ) == KErrNone )
+ {
+ RArray<TSmlTaskId> taskIdArray;
+ CleanupClosePushL( taskIdArray );
+ iDSProfile.ListTasksL( taskIdArray );
+ if( taskIdArray.Count() == 0 )
+ {
+ currentURISegmentList->InsertL( currentURISegmentList->Size(), KNullDesC8 );
+ }
+ else
+ {
+ currentURISegmentList->InsertL( currentURISegmentList->Size(), KSegmDSAcc2 );
+ }
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy();//taskIdArray
+ }
+ else
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): CT-NOTFOUND end");
+ CleanupStack::PopAndDestroy();//currentURISegmentList
+ return;
+ }
+
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ iCallBack->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 );
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): end");
+ CleanupStack::PopAndDestroy(); //currentURISegmentList
+ return;
+ }
+//
+// Handle ContentType (DB) request -> TASKS of the profile
+//
+ if( aURI.Match( KDSDBMatch2 ) != KErrNotFound )
+ {
+ TInt lProfileId = GetIntObject( aLUID );
+
+ if( ! FindProfileIdL( lProfileId ) )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): NOTFOUND CTTYPE end");
+ CleanupStack::PopAndDestroy();// currentURISegmentList
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+
+ TInt ret = CreateURITaskSegmentListL( aURI, lProfileId, currentURISegmentList,
+ aPreviousURISegmentList );
+ if( ret != KErrNone && ret != KErrNotFound )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): ContentType error end");
+ CleanupStack::PopAndDestroy();// currentURISegmentList
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): CTTYPE-OK end");
+ iCallBack->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8);
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ CleanupStack::PopAndDestroy();// currentURISegmentList
+ return;
+ }
+
+
+ TInt ret = CreateURIProfileSegmentListL( currentURISegmentList, aPreviousURISegmentList );
+
+ if( ret != KErrNone )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): Profile not found end");
+ CleanupStack::PopAndDestroy();// currentURISegmentList
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return;
+ }
+
+ iCallBack->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 );
+ CleanupStack::PopAndDestroy(); // currentURISegmentList
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ _DBG_FILE("CNSmlDSSettingsAdapter::ChildURIListL(): end");
+ return;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::AddNodeObjectL
+// The function adds the new node object.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::AddNodeObjectL( const TDesC8& aURI,
+ const TDesC8& aParentLUID,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNodeObjectL(): begin");
+//
+// Check if ContentType-add and insert to Buffer
+//
+ iParentLUID = GetIntObject( aParentLUID );
+
+ if( aURI.Match( KDSDBAddMatch )!= KErrNotFound &&
+ aURI.Match( KDSDBAddMatch2 )== KErrNotFound )
+ {
+ if( aParentLUID.Length() > 0 && iParentLUID >= 0 && iBufferExecution == EFalse )
+ {
+ AddNodeBufferL( aURI, aParentLUID, aStatusRef );
+ }
+ else if( iParentLUID < 0 )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNodeObjectL(): end");
+ }
+ else
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNodeObjectL(): end");
+ }
+ return;
+ }
+
+ if( aURI.Match(KDSDBAddMatch3) != KErrNotFound )
+ {
+ if( FindProfileIdL( iParentLUID ) ) // Profile on database
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNodeObjectL(): end");
+ }
+ else
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNodeObjectL(): end");
+ }
+ return;
+ }
+
+ if( FindProfileIdL( iParentLUID ) )
+ {
+ iCallBack->SetStatusL(aStatusRef,CSmlDmAdapter::EAlreadyExists);
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNodeObjectL(): EAlreadyExists end");
+ return;
+ }
+ else
+ {
+ if( aParentLUID.Length() > 0 )
+ {
+ TInt ret = iCallBack->RemoveMappingL(KNSmlDSSettingsAdapterImplUid,
+ GetDynamicDSNodeUri( aURI ), ETrue );
+ if(ret)
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ return;
+ }
+ }
+ //
+ // Create new profile
+ //
+ TInt newPID = -1;
+ TInt sRet = CreateNewProfileL( newPID );
+ if( sRet != KErrNone || newPID < 0 )
+ {
+ if( sRet == KErrDiskFull )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EDiskFull );
+ }
+ else if( sRet == KErrInUse )
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EObjectInUse );
+ }
+ else
+ {
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+ return;
+ }
+ //
+ // Get new ProfileId from database
+ //
+ iLUID = newPID;
+ //
+ TBuf8<8> newLUID;
+ newLUID.Num( iLUID );
+ iCallBack->SetMappingL( aURI, newLUID );
+ newLUID.Delete( 0, newLUID.Size() );
+ }
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNodeObjectL(): end");
+ return;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::UpdateLeafObjectL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::UpdateLeafObjectL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/,
+ const TInt /*aStatusRef*/ )
+ {
+ //Not supported since streaming is not supported by the adapter.
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::FetchLeafObjectSizeL
+// The function fetches the size of the leaf object data.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::FetchLeafObjectSizeL( const TDesC8& aURI,
+ const TDesC8& aLUID,
+ const TDesC8& aType,
+ const TInt aResultsRef,
+ const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchLeafObjectSizeL() : begin");
+ CBufBase *lObject = CBufFlat::NewL( 128 );
+ CleanupStack::PushL( lObject );
+ lObject->Reset();
+ if( FetchObjectL( aURI, aLUID, lObject, aStatusRef ) != KErrNone )
+ {
+ CleanupStack::PopAndDestroy(); //lObject
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchLeafObjectSizeL() : Error end");
+ return;
+ };
+ TInt objSizeInBytes = lObject->Size();
+ TBuf8<16> stringObjSizeInBytes;
+ stringObjSizeInBytes.Num( objSizeInBytes );
+ lObject->Reset();
+ lObject->InsertL( 0, stringObjSizeInBytes );
+
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ iCallBack->SetResultsL( aResultsRef, *lObject, aType );
+ CleanupStack::PopAndDestroy(); //object
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchLeafObjectSizeL() : end");
+ return;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::ExecuteCommandL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::ExecuteCommandL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ const TDesC8& /*aArgument*/,
+ const TDesC8& /*aType*/,
+ const TInt /*aStatusRef*/ )
+ {
+ // Not supported
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::ExecuteCommandL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::ExecuteCommandL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/,
+ const TInt /*aStatusRef*/ )
+ {
+ // Not supported by the adapter.
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::CopyCommandL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::CopyCommandL( const TDesC8& /*aTargetURI*/,
+ const TDesC8& /*aTargetLUID*/,
+ const TDesC8& /*aSourceURI*/,
+ const TDesC8& /*aSourceLUID*/,
+ const TDesC8& /*aType*/,
+ TInt /*aStatusRef*/ )
+ {
+ // Not supported by the adapter.
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::StartAtomicL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::StartAtomicL()
+ {
+ // Atomic commands not supported by the adapter.
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::CommitAtomicL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::CommitAtomicL()
+ {
+ // Atomic commands not supported by the adapter.
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::RollbackAtomicL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::RollbackAtomicL()
+ {
+ // Atomic commands not supported by the adapter.
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::StreamingSupport()
+// Indicates if streaming is supported.
+//------------------------------------------------------------------------------
+TBool CNSmlDSSettingsAdapter::StreamingSupport( TInt& /*aItemSize*/ )
+ {
+ return EFalse;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::StreamCommittedL
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::StreamCommittedL()
+ {
+ // Not supported since streaming not supported by the adapter.
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::CompleteOutstandingCmdsL
+// The function completes all buffered command from the buffer.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::CompleteOutstandingCmdsL()
+ {
+
+//
+// Handle unhandled nodes if any
+//
+ TInt count = iBuffer->Count();
+ for( TInt h = 0; h < count ; h++ )
+ {
+ TBuf8<150> commandURI;
+ commandURI.Append( iBuffer->At(0).iMappingName->Des() );
+ commandURI.Append( KDummyTxt );
+ TRAP_IGNORE( ExecuteBufferL( commandURI ) );
+ }
+ iBuffer->Reset();
+ CloseDSProfile();
+
+ // if port was updated, set it
+ if ( iPortBuf )
+ {
+ TInt err = SetProfileConnectionPortNrL( iPortBufLUID, *iPortBuf );
+
+ // set status
+ if ( err != KErrNone )
+ {
+ iCallBack->SetStatusL( iPortBufStatusRef, CSmlDmAdapter::EError );
+ }
+ else
+ {
+ iCallBack->SetStatusL( iPortBufStatusRef, CSmlDmAdapter::EOk );
+ }
+
+ delete iPortBuf;
+ iPortBuf = NULL;
+ }
+ }
+
+//------------------------------------------------------------------------------
+// TBool CNSmlDSSettingsAdapter::AcceptDSField
+// The function checks if leaf to be handled is valid for the adapter.
+//------------------------------------------------------------------------------
+TBool CNSmlDSSettingsAdapter::AcceptDSField()
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AcceptDSField(): begin");
+
+ if ( iField->Compare( KNSmlDdfAddrType ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfAddr ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfPortNbr ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfClientUserName ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfName ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfCTType ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfRDBURI ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfLDBURI ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfClientPW ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfToNAPID ) == 0 )
+ {
+ return ETrue;
+ }
+ else if ( iField->Compare( KNSmlDdfHidden ) == 0 )
+ {
+ return EFalse;
+ }
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::AcceptDSField(): end");
+ return EFalse;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetDSField
+// The function checks what leaf to handled and returns enum value for the leaf.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetDSField() const
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetDSField(): begin");
+
+ if ( iField->Compare( KNSmlDdfAddrType ) == 0 )
+ {
+ return EProfileMediumType;
+ }
+ else if ( iField->Compare( KNSmlDdfAddr ) == 0 )
+ {
+ return EProfileURL;
+ }
+ else if ( iField->Compare( KNSmlDdfPortNbr ) == 0 )
+ {
+ return EProfilePort;
+ }
+ else if ( iField->Compare( KNSmlDdfClientUserName ) == 0 )
+ {
+ return EProfileSyncServerUsername;
+ }
+ else if ( iField->Compare( KNSmlDdfServerId ) == 0 )
+ {
+ return EProfileServerId;
+ }
+ else if ( iField->Compare( KNSmlDdfClientPW ) == 0 )
+ {
+ return EProfileSyncServerPassword;
+ }
+ else if ( iField->Compare( KNSmlDdfName ) == 0 )
+ {
+ return EProfileName;
+ }
+ else if ( iField->Compare( KNSmlDdfToNAPID ) == 0 )
+ {
+ return EProfileIAPId;
+ }
+ else if ( iField->Compare( KNSmlDdfHidden ) == 0 )
+ {
+ return EHiddenProfile;
+ }
+ else if ( iField->Compare( KNSmlDdfDB ) == 0 ||
+ iField->Compare( KNSmlDdfCTType ) == 0 ||
+ iField->Compare( KNSmlDdfCTVerL ) == 0 ||
+ iField->Compare( KNSmlDdfRDBURI ) == 0 ||
+ iField->Compare( KNSmlDdfLDBURI ) == 0 )
+ {
+ return ESyncAccepted;
+ }
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetDSField(): end");
+ return KErrNotFound;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetDSFieldTypeL
+// The function return the data type for the leaf.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetDSFieldTypeL() const
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetDSFieldTypeL(): begin");
+
+ if ( iField->Compare( KNSmlDdfAddrType ) == 0 ||
+ iField->Compare( KNSmlDdfPortNbr ) == 0 ||
+ iField->Compare( KNSmlDdfToNAPID ) == 0 ||
+ iField->Compare( KNSmlDdfHidden ) == 0 )
+ {
+ return EInt;
+ }
+ else if ( iField->Compare( KNSmlDdfAddr ) == 0 ||
+ iField->Compare( KNSmlDdfClientUserName ) == 0 ||
+ iField->Compare( KNSmlDdfServerId ) == 0 ||
+ iField->Compare( KNSmlDdfClientPW ) == 0 ||
+ iField->Compare( KNSmlDdfName ) == 0 )
+ {
+ return EStr;
+ }
+ else if ( iField->Compare( KNSmlDdfDB ) == 0 ||
+ iField->Compare( KNSmlDdfCTType ) == 0 ||
+ iField->Compare( KNSmlDdfCTVerL ) == 0 ||
+ iField->Compare( KNSmlDdfRDBURI ) == 0 ||
+ iField->Compare( KNSmlDdfLDBURI ) == 0 )
+ {
+ return EParam;
+ }
+
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetDSFieldTypeL(): end");
+ return EWrong;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::IntLUID
+// Returns IntValue for aLUID.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::IntLUID( const TDesC8& aLUID )
+ {
+
+ TLex8 lLex( aLUID );
+
+ if ( lLex.Val( iLUID ) == KErrNone )
+ {
+ return iLUID;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetIntObject
+// Returns IntValue for a aObject
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetIntObject( const TDesC8& aObject )
+ {
+ TLex8 lLex( aObject );
+
+ TInt value = 0;
+
+ if ( lLex.Val( value ) == KErrNone )
+ {
+ return value;
+ }
+ else
+ {
+ return KErrGeneral;
+ }
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetIntObject16()
+// Returns IntValue for a 16-bit aObject
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetIntObject16( const TDesC& aObject )
+ {
+ TLex lLex( aObject );
+
+ TInt value = 0;
+
+ if ( lLex.Val( value ) == KErrNone )
+ {
+ return value;
+ }
+ else
+ {
+ return KErrGeneral;
+ }
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetIntObjectLC
+// Converts integer to HBufC8 type buffer and returns reference to it.
+//------------------------------------------------------------------------------
+TDesC8& CNSmlDSSettingsAdapter::SetIntObjectLC( const TInt& aObject )
+ {
+ HBufC8* buf = HBufC8::NewLC( 8 );
+ TPtr8 ptrBuf = buf->Des();
+
+ ptrBuf.Num( aObject );
+
+ return *buf;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::NotValidStrLenght
+// The function checks if data length for a leaf is valid.
+//------------------------------------------------------------------------------
+
+TBool CNSmlDSSettingsAdapter::NotValidStrLenght( const TInt& aProfileItem,
+ const TDesC8& aSource )
+ {
+ TInt lLen = aSource.Length();
+ TBool lBool = EFalse;
+
+ switch ( aProfileItem )
+ {
+ case ( EProfileName ) :
+ {
+ if( lLen > KNSmlMaxProfileNameLength )
+ lBool = ETrue;
+ }
+ break;
+
+ case ( EProfileSyncServerUsername ) :
+ {
+ if( lLen > KNSmlMaxUsernameLength )
+ lBool = ETrue;
+ }
+ break;
+
+ case ( EProfileSyncServerPassword ) :
+ {
+ if( lLen > KNSmlMaxPasswordLength )
+ lBool = ETrue;
+ }
+ break;
+
+ case ( EProfileURL ) :
+ {
+ if( lLen > KNSmlMaxURLLength )
+ lBool = ETrue;
+ }
+ break;
+
+ case ( EProfileIAPId ) :
+ {
+ if( lLen > KNSmlMaxURLLength )// Value from InternetAdapter for
+ lBool = ETrue; // given URI ./AP/xxx
+ }
+ break;
+
+ case ( EProfilePort ) :
+ case ( EHiddenProfile ) :
+ case ( EProfileMediumType ) :
+ {
+ if( lLen > 8 )
+ lBool = ETrue;
+ }
+ break;
+
+ case ( EProfileServerId ) :
+ {
+ if( lLen > KNSmlMaxUsernameLength )
+ lBool = ETrue;
+ }
+ break;
+
+ default:
+ {
+ return ETrue;
+ }
+ }
+
+ return lBool;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetField
+// The function finds out the last element of the URI.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetField( const TDesC8& aSource )
+ {
+ if ( aSource.LocateReverse( KNSmlDMUriSeparator ) == KErrNotFound )
+ {
+ iField->Des().Format( aSource );
+ }
+ else
+ {
+ iField->Des().Format( aSource.Mid( aSource.LocateReverse( KNSmlDMUriSeparator ) + 1 ) );
+ }
+
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::ConvertTo8LC
+// Converts 16-bit string value to 8-bit.
+//------------------------------------------------------------------------------
+TDesC8& CNSmlDSSettingsAdapter::ConvertTo8LC( const TDesC& aSource )
+ {
+ HBufC8* buf = HBufC8::NewLC( aSource.Length() * 2 );
+ TPtr8 bufPtr = buf->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( bufPtr, aSource );
+ return *buf;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::ConvertTo16LC
+// Converts 8-bit string value to 16-bit.
+//------------------------------------------------------------------------------
+TDesC16& CNSmlDSSettingsAdapter::ConvertTo16LC( const TDesC8& aSource )
+ {
+ HBufC16* buf16 = HBufC16::NewLC( aSource.Length() );
+ TPtr16 bufPtr16 = buf16->Des();
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( bufPtr16, aSource );
+ return *buf16;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::AddNewDataProviderL
+// Check if data provider exits and required MIME type is supported by the
+// data provider. If supported new task will be created.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::AddNewDataProviderL( TInt aIntLUID,
+ const TDesC8& aMIMEType,
+ TInt& aDataProviderId )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNewDataProviderL(): begin");
+
+ TInt retVal = OpenSyncSessionAndDSProfileL( aIntLUID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return KErrGeneral;
+ }
+ if( iRdbDataStore->Size() <= 0 )
+ {
+ CloseDSProfile();
+ return KErrGeneral;
+ }
+ RArray<TSmlDataProviderId> dataProviderArray;
+ CleanupClosePushL( dataProviderArray );
+ iSyncSession.ListDataProvidersL( dataProviderArray );
+ TInt dataProviderCount = dataProviderArray.Count();
+ if( dataProviderCount == 0 )
+ {
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy(); // dataProviderIdArray
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNewDataProviderL(): dataprovirdercount == 0 End");
+ return KErrNotFound;
+ }
+ HBufC8* object = aMIMEType.AllocLC();
+ TPtr8 objectPtr = object->Des();
+ objectPtr.LowerCase();
+ RSyncMLDataProvider dataProvider;
+
+ for ( TInt i= 0; i < dataProviderCount; i++ )
+ {
+ dataProvider.OpenL( iSyncSession, dataProviderArray[i] );
+ CleanupClosePushL( dataProvider );
+ for ( TInt n = 0; n < dataProvider.MimeTypeCount(); n++ )
+ {
+ HBufC* mimeType = dataProvider.MimeType(n).AllocLC();
+ if( objectPtr.CompareF( ConvertTo8LC( *mimeType ) ) == 0 ) //if MIME match
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNewDataProviderL(): Mimetype found");
+
+ aDataProviderId = dataProvider.Identifier();
+ RSyncMLTask task;
+ CleanupClosePushL( task );
+ if( dataProvider.AllowsMultipleDataStores() )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNewDataProviderL(): AllowsMultipleDataStores");
+ CDesCArray* dataStoreName = new ( ELeave ) CDesCArrayFlat( 1 );
+ CleanupStack::PushL( dataStoreName );
+ dataProvider.GetDataStoreNamesL( *dataStoreName );
+ if ( dataStoreName->Count() == 0 )
+ {
+ // Get default if there are no databases
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNewDataProviderL(): no databases -> get default");
+ HBufC* localDataStoreName = dataProvider.DefaultDataStoreName().AllocLC();
+ task.CreateL( iDSProfile, aDataProviderId, *iRdbDataStore,
+ *localDataStoreName );
+ task.UpdateL();
+ CleanupStack::PopAndDestroy(); //localDataStoreName
+ }
+ else
+ {
+ TPtrC16 ptrDataStoreName = dataStoreName->MdcaPoint(0);
+ task.CreateL( iDSProfile, aDataProviderId, *iRdbDataStore,
+ ptrDataStoreName );
+ task.UpdateL();
+ }
+ CleanupStack::PopAndDestroy();//dataStoreName
+ }
+ else
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNewDataProviderL(): MultipleDataStores not allowed");
+ HBufC* localDataStoreName = dataProvider.DefaultDataStoreName().AllocLC();
+ task.CreateL( iDSProfile, aDataProviderId, *iRdbDataStore,
+ *localDataStoreName );
+ task.UpdateL();
+ CleanupStack::PopAndDestroy(); //localDataStoreName
+ }
+ iDSProfile.UpdateL();
+ CleanupStack::PopAndDestroy( 6 ); //dataProviderArray, dataProvider,
+ //object, mimeType, ConvertTo8LC,
+ //task
+ CloseDSProfile();
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNewDataProviderL(): end KErrNone");
+ return KErrNone;
+ }
+ CleanupStack::PopAndDestroy( 2 ); //mimeType, ConvertTo8LC
+ }
+ CleanupStack::PopAndDestroy( ); //dataProvider
+ }
+
+ CleanupStack::PopAndDestroy( 2 ); //dataProviderArray, object
+ CloseDSProfile();
+ _DBG_FILE("CNSmlDSSettingsAdapter::AddNewDataProviderL(): end KErrNotFound");
+ return KErrNotFound;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetToNAPIDL
+// The function gets URI for given aObject.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetToNAPIDL( const TInt aLUID, CBufBase& aObject )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetToNAPIDL() : begin");
+
+ TInt profIAPid = -1;
+ TInt apIdResponse = GetProfileIAPIdL(aLUID, profIAPid);
+ if( profIAPid < 0 || apIdResponse != KErrNone )
+ {
+ return KErrNotFound;
+ }
+ CNSmlDMIAPMatcher* apmatch = CNSmlDMIAPMatcher::NewL( iCallBack );
+ CleanupStack::PushL( apmatch );
+ HBufC8* uri8 = apmatch->URIFromIAPIdL( profIAPid );
+ if( uri8 )
+ {
+ CleanupStack::PushL( uri8 );
+ aObject.InsertL(aObject.Size(),uri8->Des());
+ CleanupStack::PopAndDestroy(); // uri8
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy(); // apMatch
+ return KErrGeneral;
+ }
+ CleanupStack::PopAndDestroy(); // apMatch
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetToNAPIDL() : end");
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetToNAPIDL
+// The function sets NAPId value according given URI.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetToNAPIDL( const TInt aLUID, const TDesC8& aObject )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetToNAPIDL() : begin");
+ CNSmlDMIAPMatcher* apmatch = CNSmlDMIAPMatcher::NewL( iCallBack );
+ CleanupStack::PushL( apmatch );
+ TInt lIAPid = apmatch->IAPIdFromURIL( aObject );
+ TInt apIdResponse = SetProfileIAPIdL( aLUID, lIAPid );
+ CleanupStack::PopAndDestroy(); // apmatch
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetToNAPIDL() : end");
+ return apIdResponse;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::AddNodeBufferL
+// The function sets the new node to buffer.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::AddNodeBufferL( const TDesC8& aURI,
+ const TDesC8& aParentLUID,
+ const TInt aStatusRef )
+ {
+ TNSmlDSBufferElement newNode;
+ newNode.iMappingName = aURI.AllocLC();
+ newNode.iName = LastURISeg(aURI).AllocLC();
+ newNode.iNodeBuf = new (ELeave) CArrayFixFlat <TNSmlDSAddElement> ( KNSmlDSGranularity );
+ newNode.iExecuted = EFalse;
+ newNode.iLuid = GetIntObject( aParentLUID );
+ iBuffer->AppendL( newNode );
+ CleanupStack::Pop( 2 ); //newNode.iMappingName,newNode.iName
+
+ TNSmlDSAddElement newCommand;
+
+ newCommand.iUri = aURI.AllocLC();
+ newCommand.iData = 0;
+ newCommand.iStatusRef = aStatusRef;
+ newCommand.iLeaf = EFalse;
+ newCommand.iDone = EFalse;
+
+ TInt index = iBuffer->Count() - 1;
+ iBuffer->At(index).iNodeBuf->AppendL( newCommand );
+ CleanupStack::Pop(); //newCommand.iUri
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::AddLeafBufferL
+// The function sets the new leaf to buffer.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::AddLeafBufferL( const TDesC8& aURI,
+ const TDesC8& aParentLUID,
+ const TDesC8& aObject,
+ const TInt aStatusRef )
+ {
+ TInt index = GetBufferIndex( aURI );
+ if(index<0)
+ {
+ DBG_ARGS(_S16("DS-adapter:AddLeafBufferL URI - <%S> <%S> NOTFOUND"), &aURI, &aParentLUID );
+ iCallBack->SetStatusL(aStatusRef, CSmlDmAdapter::ENotFound);
+ return;
+ }
+
+ TNSmlDSAddElement newCommand;
+ newCommand.iUri = aURI.AllocLC();
+ newCommand.iData = aObject.AllocLC();
+ newCommand.iStatusRef = aStatusRef;
+ newCommand.iLeaf = ETrue;
+ newCommand.iDone = EFalse;
+ iBuffer->At(index).iNodeBuf->AppendL( newCommand );
+ CleanupStack::Pop( 2 ); //newCommand.iUri, newCommand.iData
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::LastURISeg
+// The function returns only the last uri segment.
+//------------------------------------------------------------------------------
+TPtrC8 CNSmlDSSettingsAdapter::LastURISeg(const TDesC8& aURI)
+ {
+ TInt i;
+ for( i=aURI.Length() - 1; i >= 0; i-- )
+ {
+ if( aURI[i] == KNSmlDMUriSeparator )
+ {
+ break;
+ }
+ }
+ if( i == 0 )
+ {
+ return aURI;
+ }
+ else
+ {
+ return aURI.Mid( i + 1 );
+ }
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::RemoveLastURISeg
+// The function removes the last URI segment.
+//------------------------------------------------------------------------------
+TPtrC8 CNSmlDSSettingsAdapter::RemoveLastURISeg( const TDesC8& aURI )
+ {
+ TInt i;
+ for( i = aURI.Length() - 1; i >= 0; i-- )
+ {
+ if( aURI[i] == KNSmlDMUriSeparator )
+ {
+ break;
+ }
+ }
+ if( i == 0 )
+ {
+ return aURI;
+ }
+ else
+ {
+ return aURI.Left( i );
+ }
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::ExecuteBufferL
+// Executes commands which have not been executed.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::ExecuteBufferL( const TDesC8& aURI )
+ {
+ TInt index = GetBufferIndex( aURI );
+ if( index < 0 )
+ {
+ return;
+ }
+ //
+ // Execute all commands for Profiles new ContentType
+ //
+ TBool rdburinotfound = ETrue;
+ TInt newcmd = 1;
+
+ TNSmlDSBufferElement& bufElem = iBuffer->At(index);
+
+ for( TInt cmd = bufElem.iNodeBuf->Count() - 1; cmd >= 0; cmd-- )
+ {
+ TBuf8<16> addLUID;
+
+ TNSmlDSAddElement& addElem = bufElem.iNodeBuf->At(cmd);
+
+ if( cmd == 0 )
+ {
+ if( bufElem.iLuid > 0 )
+ {
+ addLUID.Format( KFormat, -1 ); // Set status for addnode command
+ }
+ else
+ {
+ addLUID.Format( KFormat, 0 );
+ }
+ iBufferExecution = ETrue;
+ AddNodeObjectL( addElem.iUri->Des(),
+ addLUID, addElem.iStatusRef );
+
+ bufElem.iExecuted = ETrue;
+ iBufferExecution = EFalse;
+ }
+ else
+ {
+ //First RDBURI leaf must be stored
+ while( rdburinotfound && newcmd < iBuffer->At(index).iNodeBuf->Count() )
+ {
+ if( bufElem.iNodeBuf->At(newcmd).iUri->Des().Find( KNSmlDdfRDBURI ) >= 0 )
+ {
+ SetRDBDataStore( bufElem.iNodeBuf->At(newcmd).iData->Des() );
+ rdburinotfound = EFalse;
+ break;
+ }
+ newcmd++;
+ }//while
+ addLUID.Format( KFormat, bufElem.iLuid );
+ iBufferExecution = ETrue;
+ UpdateLeafObjectL( addElem.iUri->Des(),
+ addLUID,
+ addElem.iData->Des(),
+ KNullDesC8,
+ addElem.iStatusRef );
+ iBufferExecution = EFalse;
+ }
+
+ addElem.iDone = ETrue;
+
+ delete addElem.iUri;
+ addElem.iUri=NULL;
+ if( addElem.iData )
+ {
+ delete addElem.iData;
+ addElem.iData=NULL;
+ }
+ bufElem.iNodeBuf->Delete(cmd);
+ }
+//
+// Remove data from handled ContentType-commands
+//
+ bufElem.iNodeBuf->Reset();
+ delete bufElem.iNodeBuf;
+
+ if( bufElem.iMappingName )
+ {
+ delete bufElem.iMappingName;
+ bufElem.iMappingName=NULL;
+ }
+
+ if( bufElem.iName )
+ {
+ delete bufElem.iName;
+ bufElem.iName=NULL;
+ }
+
+ iBuffer->Delete( index );
+ iBuffer->Compress();
+ }
+
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetProfileIdFromURIL
+// The function gets the Profile Id for given aURI.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetProfileIdFromURIL( const TDesC8& aURI )
+ {
+ HBufC8* apURI = HBufC8::NewLC( aURI.Size() );
+//
+// Second slash after SyncML/DSAcc/XXXX/
+//
+ TInt i = 0;
+
+ for( i = aURI.Find( KDSAcc1 ) + 13; i < aURI.Length(); i++ )
+ {
+ if( aURI[i] == KNSmlDMUriSeparator )
+ {
+ break;
+ }
+ }
+ if( i > 0 )
+ {
+ apURI->Des().Format( aURI.Left(i) );
+ }
+//
+// Same profile as previous
+//
+ if( iPrevURI->Match( *apURI ) != KErrNotFound )
+ {
+ CleanupStack::PopAndDestroy(); // apURI
+ return iPrevLUID;
+ }
+//
+// Fetch Profile-id for URI
+//
+
+ HBufC8* apLUID = iCallBack->GetLuidAllocL( *apURI );
+ CleanupStack::PushL( apLUID );
+ if( apLUID->Length() == 0 )
+ {
+ CleanupStack::PopAndDestroy( 2 );//apURI, apLUID
+ return KErrGeneral;
+ }
+ TInt resLUID = GetIntObject( *apLUID );
+ iPrevURI->Des().Format( *apURI );
+ iPrevLUID = resLUID;
+ CleanupStack::PopAndDestroy(2); //apURI,apLUID
+
+ return resLUID;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetContentTypeL
+// Get CTType (MimeType) for given adapter.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetContentTypeL( const TInt aDataProviderId,
+ const TInt aProfileLUID,
+ CBufBase*& aObject )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetContentTypeL(): begin");
+ TInt retVal = OpenSyncSessionAndDSProfileL( aProfileLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+
+ RArray<TSmlDataProviderId> dataProviderIdArray;
+ CleanupClosePushL( dataProviderIdArray );
+ iSyncSession.ListDataProvidersL( dataProviderIdArray );
+
+ TInt dpIndex = dataProviderIdArray.Find( aDataProviderId );
+ if( dpIndex == KErrNotFound )
+ {
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy( 1 ); // dataProviderIdArray
+ return KErrNotFound;
+ }
+ RSyncMLDataProvider dataProvider;
+ CleanupClosePushL( dataProvider );
+ dataProvider.OpenL( iSyncSession, dataProviderIdArray[dpIndex] );
+ for( TInt i = 0; i < dataProvider.MimeTypeCount(); i++ )
+ {
+ //first mime type will be returned now
+ HBufC* mimeType = dataProvider.MimeType(i).AllocLC();
+ aObject->InsertL( aObject->Size(), ConvertTo8LC( *mimeType ) );
+ CleanupStack::PopAndDestroy( 2 ); //mimeType, ConvertTo8LC
+ break;
+ }
+ CleanupStack::PopAndDestroy( 2 ); // dataProviderIdArray, dataProvider
+ CloseDSProfile();
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetContentTypeL(): end");
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetBufferIndex
+// The function resolves buffer index for given URI.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetBufferIndex( const TDesC8& aURI )
+ {
+ TInt index = -1;
+ for( TInt i = 0; i<iBuffer->Count(); i++ )
+ {
+ TPtrC8 parentUri = RemoveLastURISeg( aURI );
+ if( iBuffer->At(i).iMappingName->Compare( parentUri ) == 0 )
+ {
+ index = i;
+ break;
+ }
+ }
+ return index;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetBufferLUID
+// The function sets the LUID to buffer for given URI.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetBufferLUID( const TDesC8& aURI, const TInt aLUID )
+ {
+ TInt index = GetBufferIndex( aURI );
+ if( index < 0 )
+ {
+ return 0;
+ }
+ iBuffer->At(index).iLuid = aLUID;
+ return 1;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::ParseUri
+// Resolves portnbr (separated with ':') as integer from URI.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::ParseUri( const TDesC8& aRealURI, TInt& aPort )
+ {
+ TInt offset=0;
+ //http:
+ if( aRealURI.Find( KNSmlDSSettingsHTTP )==0 )//http:
+ {
+ offset = KNSmlDSSettingsHTTP().Length();
+ }
+ else if( aRealURI.Find( KNSmlDSSettingsHTTPS )==0 )//https:
+ {
+ offset = KNSmlDSSettingsHTTPS().Length();
+ }
+
+ TBool portFound=EFalse;
+ TBool portExtracted = EFalse;
+ ////123.234.345.456:80/syncml
+ for( TInt i = offset; i < aRealURI.Length() && !portExtracted; i++ )
+ {
+ if( aRealURI[i] == KNSmlDMColon )// ':'
+ {
+ portFound = ETrue;
+ offset=i;
+ }
+ if( portFound && aRealURI[i] == KNSmlDMUriSeparator )// '/'
+ {
+ aPort = GetIntObject( aRealURI.Mid( (offset + 1), (i - offset-1) ) );
+ portExtracted = ETrue;
+ }
+ else if ( portFound && i == aRealURI.Length() - 1 ) // last char
+ {
+ // port is from offset to the end
+ aPort = GetIntObject( aRealURI.Right( aRealURI.Length() - offset - 1 ) );
+ portExtracted = ETrue;
+ }
+ }
+
+ if( aPort != 0 )
+ {
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotFound;
+ }
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::FindProfileIdL
+// The function checkd if profile can be found.
+//------------------------------------------------------------------------------
+TBool CNSmlDSSettingsAdapter::FindProfileIdL( const TInt aIntLUID )
+ {
+ if( iSyncSessionOpen == EFalse )
+ {
+ iSyncSession.OpenL();
+ iSyncSessionOpen = ETrue;
+ }
+ RArray <TSmlProfileId> profileList;
+ CleanupClosePushL( profileList );
+ TSmlUsageType usageType = ESmlDataSync;
+ iSyncSession.ListProfilesL( profileList, usageType );
+ if( profileList.Count() == 0 )
+ {
+ CleanupStack::PopAndDestroy(); //profileList
+ return EFalse;
+ }
+ TInt item = profileList.Find( aIntLUID );
+ CleanupStack::PopAndDestroy(); //profileList
+ if( item != KErrNotFound )
+ {
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetProfileIdentifierL
+// The function gets profile Id from Client API.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetProfileIdentifierL( const TInt aIntLUID,
+ TInt& aProfileID )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aIntLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ aProfileID = iDSProfile.Identifier();
+ CloseDSProfile();
+ return retVal;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetDSFieldDataL
+// The function checks what leaf to be handled and fetches the data for a leaf.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetDSFieldDataL( const TInt aIntLUID,
+ CBufBase*& aObject )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetDSFieldData(): begin");
+
+ if ( iField->Compare( KNSmlDdfAddrType ) == 0 )
+ {
+ TSmlTransportId connType = -1;
+ connType = GetProfileConnectiontypeL( aIntLUID );
+ if ( connType <= 0 )
+ {
+ return KErrNotFound;
+ }
+ aObject->InsertL( aObject->Size(), SetIntObjectLC( connType ) );
+ CleanupStack::PopAndDestroy();//SetIntObjectLC
+ return KErrNone;
+ }
+ else if ( iField->Compare( KNSmlDdfAddr ) == 0 ) //Server URL
+ {
+ TInt retValue1 = GetProfileServerURLL( aIntLUID, aObject );
+ TInt port(0);
+ if(ParseUri(aObject->Ptr(0),port)==KErrNone)
+ {
+ HBufC8* addr = aObject->Ptr(0).AllocLC();
+ aObject->Reset();
+ TInt portStart = addr->LocateReverse(KNSmlDMColon);
+ aObject->InsertL(aObject->Size(),addr->Left(portStart));
+
+ TInt portLen=addr->Mid(portStart).Locate(KNSmlDMUriSeparator);
+ if(portLen!=KErrNotFound)
+ {
+ aObject->InsertL(aObject->Size(),addr->Mid(portStart+portLen));
+ }
+
+ CleanupStack::PopAndDestroy(); //addr
+ }
+
+ if( retValue1 != KErrNone )
+ {
+ return KErrNotFound;
+ }
+ return KErrNone;
+ }
+ else if ( iField->Compare( KNSmlDdfPortNbr ) == 0 )
+ {
+ TInt retValue2 = GetProfileServerURLL( aIntLUID, aObject );
+ if( retValue2 != KErrNone )
+ {
+ return KErrNotFound;
+ }
+ if ( aObject->Size() == 0 )
+ {
+ return KErrNone;
+ }
+ TInt bSize = aObject->Size();
+ HBufC8* buf = HBufC8::NewLC( bSize );
+ TPtr8 bufPtr = buf->Des();
+ aObject->Read( 0, bufPtr, aObject->Size() );
+ aObject->Reset();
+
+ TInt pnum = 0;
+ //find out the port number
+ ParseUri( *buf, pnum );
+ if(pnum)
+ {
+ aObject->InsertL( aObject->Size(), SetIntObjectLC( pnum ) );
+ CleanupStack::PopAndDestroy( ); //SetIntObjectLC( pnum )
+ }
+ CleanupStack::PopAndDestroy( ); //buf
+ return KErrNone;
+ }
+ else if ( iField->Compare( KNSmlDdfClientUserName ) == 0 )
+ {
+ if( GetProfileUserNameL( aIntLUID, aObject ) != KErrNone )
+ {
+ return KErrGeneral;
+ }
+ return KErrNone;
+ }
+ else if ( iField->Compare( KNSmlDdfServerId ) == 0 )
+ {
+ if( GetProfileServerIdL( aIntLUID, aObject ) != KErrNone )
+ {
+ return KErrGeneral;
+ }
+ return KErrNone;
+ }
+ else if ( iField->Compare( KNSmlDdfClientPW ) == 0 ) //Not allowed
+ {
+ return KErrGeneral;
+ }
+ else if ( iField->Compare( KNSmlDdfName ) == 0 )
+ {
+ TInt retValue = GetProfileDisplayNameL( aIntLUID, aObject );
+ if( retValue != KErrNone )
+ {
+ return KErrGeneral;
+ }
+ return KErrNone;
+ }
+ else if ( iField->Compare( KNSmlDdfToNAPID ) == 0 )
+ {
+ TInt retToNaPID = GetToNAPIDL( aIntLUID, *aObject );
+ if ( retToNaPID == KErrNone || retToNaPID == KErrNotFound )
+ {
+ return retToNaPID;
+ }
+ return KErrGeneral;
+ }
+ else if ( iField->Compare( KNSmlDdfHidden ) == 0 )
+ {
+ //Hidden profile not supported
+ return KErrGeneral;
+ }
+ _DBG_FILE("CNSmlDSSettingsAdapter::GetDSFieldData(): end");
+ return KErrGeneral;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetProfileConnectiontypeL()
+// The function what medium type is supported and returns it.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetProfileConnectiontypeL( const TInt aIntLUID )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aIntLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTransportId> transportIdArray;
+ CleanupClosePushL( transportIdArray );
+ iDSProfile.ListConnectionsL( transportIdArray );
+ TInt transportItems = transportIdArray.Count();
+ if( transportItems == 0 )
+ {
+ //No matching items
+ CleanupStack::PopAndDestroy(); //transportIdArray
+ CloseDSProfile();
+ return KErrGeneral;
+ }
+ else if( transportItems > 1 )
+ {
+ //Error case : against specification
+ CleanupStack::PopAndDestroy(); //transportIdArray
+ CloseDSProfile();
+ return KErrGeneral;
+ }
+
+ TInt mediumType = ENone;
+ if ( transportIdArray[0] == KUidNSmlMediumTypeInternet.iUid )
+ {
+ mediumType = EHttp;
+ }
+ else if ( transportIdArray[0] == KUidNSmlMediumTypeBluetooth.iUid ||
+ transportIdArray[0] == KUidNSmlMediumTypeUSB.iUid ||
+ transportIdArray[0] == KUidNSmlMediumTypeIrDA.iUid )
+ {
+ mediumType = EObex;
+ }
+
+ CleanupStack::PopAndDestroy(); //transportIdArray
+ CloseDSProfile();
+ return mediumType;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetProfileServerURLL
+// The function gets the profile Addr leaf value.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetProfileServerURLL( const TInt aIntLUID,
+ CBufBase*& aURL )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aIntLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTransportId> transportIdArray;
+ CleanupClosePushL( transportIdArray );
+ iDSProfile.ListConnectionsL( transportIdArray );
+ if( transportIdArray.Count() > 0 )
+ {
+ RSyncMLConnection profConn;
+ CleanupClosePushL( profConn );
+ profConn.OpenL( iDSProfile, transportIdArray[0] );
+
+ HBufC8* sURI = profConn.ServerURI().AllocL();
+ CleanupStack::PushL( sURI );
+ TPtr8 uriPtr = sURI->Des();
+ if( uriPtr.Length() > 0 )
+ {
+ aURL->InsertL( aURL->Size(),uriPtr );
+ }
+ else
+ {
+ aURL->InsertL( aURL->Size(), KNullDesC8 );
+ }
+ CleanupStack::PopAndDestroy( 2 );//profConn, sURI
+ retVal = KErrNone;
+ }
+ else
+ {
+ retVal = KErrNotFound;
+ }
+ CleanupStack::PopAndDestroy(); //transportIdArray
+ CloseDSProfile();
+ return retVal;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetProfileUserNameL
+// The function gets the ClientUserName leaf value.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetProfileUserNameL( const TInt aIntLUID,
+ CBufBase*& aUserName )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aIntLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ HBufC8* userName = iDSProfile.UserName().AllocL();
+ CleanupStack::PushL( userName );
+ TPtr8 ptrUserName = userName->Des();
+ CloseDSProfile();
+ aUserName->InsertL( aUserName->Size(), ptrUserName );
+ CleanupStack::PopAndDestroy(); //userName
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetProfileServerIdL
+// The function gets the ClientUserName leaf value.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetProfileServerIdL( const TInt aIntLUID,
+ CBufBase*& aUserName )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aIntLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ aUserName->InsertL( aUserName->Size(), iDSProfile.ServerId() );
+ CloseDSProfile();
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetProfileIAPIdL
+// The function gets the IAP id value from Client API.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetProfileIAPIdL( const TInt aIntLUID, TInt& aIAPid )
+ {
+ aIAPid = -1;
+ TInt retVal = OpenSyncSessionAndDSProfileL( aIntLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTransportId> connIdArray;
+ CleanupClosePushL( connIdArray );
+ iDSProfile.ListConnectionsL( connIdArray );
+ if( connIdArray.Count() == 1 )
+ {
+ RSyncMLTransport transport;
+ CleanupClosePushL( transport );
+ transport.OpenL( iSyncSession, connIdArray[0] );
+ const CSyncMLTransportPropertiesArray& props = transport.Properties();
+ TInt index = props.Find( KNSmlIAPId );
+ if( index > 0 )
+ {
+ RSyncMLConnection conn;
+ CleanupClosePushL( conn );
+ conn.OpenL( iDSProfile, connIdArray[0] );
+ HBufC8* iapId = conn.GetPropertyL( KNSmlIAPId ).AllocLC();
+ aIAPid = GetIntObject( *iapId );
+ CleanupStack::PopAndDestroy( 2 ); //conn, iapId
+ retVal = KErrNone;
+ }
+ else
+ {
+ retVal = KErrNotFound;
+ }
+ CleanupStack::PopAndDestroy(); //transport
+ CloseDSProfile();
+ }
+ else
+ {
+ retVal = KErrNotFound;
+ }
+ CleanupStack::PopAndDestroy(); //connIdArray
+ return retVal;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetProfileDisplayNameL
+// The function gets the Name leaf value for a profile.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetProfileDisplayNameL( const TInt aIntLUID,
+ CBufBase*& aDisplayName )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aIntLUID, ESmlOpenRead );
+ if(retVal != KErrNone)
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ HBufC* dataBuf = iDSProfile.DisplayName().AllocL();
+ CleanupStack::PushL( dataBuf );
+ TPtr16 ptrDisplayName = dataBuf->Des();
+ aDisplayName->InsertL( aDisplayName->Size(), ConvertTo8LC( ptrDisplayName ) );
+ CleanupStack::PopAndDestroy( 2 );//dataBuf, ConvertTo8LC
+ CloseDSProfile();
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::CreateNewProfileL
+// The function creates new profile through Client API.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::CreateNewProfileL( TInt& aPID )
+ {
+ if( iSyncSessionOpen == EFalse )
+ {
+ iSyncSession.OpenL();
+ iSyncSessionOpen = ETrue;
+ }
+ TRAPD( trapValue1, iDSProfile.CreateL( iSyncSession ) );
+ if( trapValue1 != KErrNone )
+ {
+ return trapValue1;
+ }
+ //iDSProfile.SetProtocolVersionL(ESmlVersion1_1_2);
+ TRAPD( trapValue2, iDSProfile.UpdateL() );
+ if( trapValue2 != KErrNone )
+ {
+ return trapValue2;
+ }
+ aPID = iDSProfile.Identifier();
+
+
+ CloseDSProfile();
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfileServerURIL
+// The function sets the Addr leaf value.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfileServerURIL( const TInt aPID,
+ const TDesC8& aObj )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aPID, ESmlOpenReadWrite );
+ if(retVal != KErrNone)
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTransportId> transportIdArray;
+ CleanupClosePushL( transportIdArray );
+ iDSProfile.ListConnectionsL( transportIdArray );
+ if( transportIdArray.Count() == 0 )
+ {
+ CleanupStack::PopAndDestroy();//transportIdArray
+ CloseDSProfile();
+ return KErrGeneral;
+ }
+
+ TInt newPort(0);
+
+ RSyncMLConnection conn;
+ CleanupClosePushL( conn );
+ conn.OpenL( iDSProfile, transportIdArray[0] );
+
+ if( transportIdArray[0] == KUidNSmlMediumTypeInternet.iUid )
+ {
+ if(ParseUri(aObj,newPort)==KErrNotFound)
+ {
+ TInt port(0);
+ ParseUri(conn.ServerURI(),port);
+ if(port==0)
+ {
+ // set default port
+ if( aObj.Find( KNSmlDSSettingsHTTPS ) == 0 ) //https://
+ {
+ port = KNSmlDSSettingsHTTPSPort;
+ }
+ else //http://
+ {
+ port = KNSmlDSSettingsHTTPPort;
+ }
+ }
+
+ TBuf8<5> buf;
+ buf.Num( port );
+
+ TInt totalSize = aObj.Length() + buf.Length() + 1;
+ HBufC8* newServerURI = HBufC8::NewLC( totalSize );
+ SetPortNrToAddrStr( aObj, newServerURI, buf );
+
+ conn.SetServerURIL( *newServerURI );
+ conn.UpdateL();
+ CleanupStack::PopAndDestroy( newServerURI );
+
+ }
+ else
+ {
+ conn.SetServerURIL( aObj );
+ conn.UpdateL();
+ }
+ }
+ else // medium type not internet, no port allowed
+ {
+ if(ParseUri(aObj,newPort)==KErrNotFound)
+ {
+ conn.SetServerURIL( aObj );
+ conn.UpdateL();
+ }
+ else
+ {
+ // remove port from uri
+ HBufC8* newServerURI = HBufC8::NewL( aObj.Length() );
+ CleanupStack::PushL( newServerURI );
+ TBuf8<5> buf;
+ buf.Num( 0 );
+ // change iLeafType to EDSDelete -> deleting port
+ TNSmlDSLeafType tmpType(iLeafType); // store current value
+ iLeafType = EDSDelete;
+ SetPortNrToAddrStr( aObj, newServerURI, buf );
+ iLeafType = tmpType; // restore original value
+
+ conn.SetServerURIL( *newServerURI );
+ conn.UpdateL();
+ CleanupStack::PopAndDestroy( newServerURI );
+ }
+ }
+
+
+ iDSProfile.UpdateL();
+ CleanupStack::PopAndDestroy( 2 ); //transportIdArray, conn
+ CloseDSProfile();
+ return retVal;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfileDisplayNameL
+// The function sets the Name leaf value for a profile.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfileDisplayNameL( const TInt aPID,
+ const TDesC8& aObj )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aPID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ iDSProfile.SetDisplayNameL( ConvertTo16LC( aObj ) );
+ iDSProfile.UpdateL();
+ CleanupStack::PopAndDestroy();//ConvertTo16LC
+ CloseDSProfile();
+ return retVal;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfileUserNameL
+// The function sets the ClientUserName leaf value for a profile.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfileUserNameL( const TInt aPID,
+ const TDesC8& aObj )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aPID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ iDSProfile.SetUserNameL( aObj );
+ iDSProfile.UpdateL();
+ CloseDSProfile();
+ return retVal;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfileServerIdL
+// The function sets the ClientUserName leaf value for a profile.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfileServerIdL( const TInt aPID,
+ const TDesC8& aObj )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aPID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ iDSProfile.SetServerIdL( aObj );
+ if(aObj.Length())
+ {
+ iDSProfile.SetProtocolVersionL(ESmlVersion1_2);
+ }
+ else
+ {
+ iDSProfile.SetProtocolVersionL(ESmlVersion1_1_2);
+ }
+ iDSProfile.UpdateL();
+ CloseDSProfile();
+ return retVal;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfilePasswordL
+// The function sets the ClientPW leaf value for a profile.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfilePasswordL( const TInt aPID,
+ const TDesC8& aObj )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aPID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ iDSProfile.SetPasswordL( aObj );
+ iDSProfile.UpdateL();
+ CloseDSProfile();
+ return retVal;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfileStrValueL
+// The function checks what leaf to be handles and calls the proper function to
+// set leaf data.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfileStrValueL( const TInt aPID,
+ const TDesC8& aObj,
+ const TInt aFieldID )
+ {
+ TInt ret = 0;
+ switch ( aFieldID )
+ {
+ case ( EProfileName ) :
+ {
+ ret = SetProfileDisplayNameL( aPID, aObj );
+ }
+ break;
+
+ case ( EProfileSyncServerUsername ) :
+ {
+ ret = SetProfileUserNameL( aPID, aObj );
+ }
+ break;
+
+ case ( EProfileServerId ) :
+ {
+ ret = SetProfileServerIdL( aPID, aObj );
+ }
+ break;
+
+
+ case ( EProfileSyncServerPassword ) :
+ {
+ ret = SetProfilePasswordL( aPID, aObj );
+ }
+ break;
+ case ( EProfileIAPId ) :
+ {
+ ret = SetToNAPIDL( aPID, aObj );
+ }
+ break;
+ case ( EProfilePort ) :
+ {
+ delete iPortBuf;
+ iPortBuf = NULL;
+
+ // check that port is a valid integer
+ TLex8 lex( aObj );
+ TInt port = KErrNotFound;
+ TInt err = lex.Val( port );
+
+ if ( err != KErrNone || !lex.Eos() )
+ {
+ ret = KErrArgument;
+ }
+ else
+ {
+ TInt portval = GetIntObject(aObj);
+ if(portval<0)
+ {
+ ret=KErrArgument;
+ }
+ else if(portval>65535)
+ {
+ ret=KErrOverflow;
+ }
+
+ else
+ {
+ // save information of the port
+ iPortBuf = aObj.AllocL();
+ iPortBufLUID = aPID;
+ SetProfileConnectionPortNrL( iPortBufLUID, *iPortBuf );
+ }
+ }
+ }
+ break;
+ case ( EProfileURL ) :
+ case ( EHiddenProfile ) :
+ case ( EProfileMediumType ) :
+ default:
+ {
+ User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound );
+ }
+ }
+ return ret;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::DeleteProfileL
+// The function deletes profile data content.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::DeleteProfileL( const TInt aPID )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aPID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return KErrGeneral;
+ }
+ RArray<TSmlTaskId> taskIdArray;
+ CleanupClosePushL( taskIdArray );
+ iDSProfile.ListTasksL( taskIdArray );
+ if( taskIdArray.Count() > 0 )
+ {
+ for ( TInt i = 0; i < taskIdArray.Count(); i++ )
+ {
+ iDSProfile.DeleteTaskL( taskIdArray[i] );
+ iDSProfile.UpdateL();
+ }
+ }
+ CloseDSProfile();
+ RArray<TSmlProfileId> profileIdArray;
+ CleanupClosePushL( profileIdArray );
+ TSmlUsageType usageType = ESmlDataSync;
+ iSyncSession.ListProfilesL( profileIdArray, usageType );
+ TInt index = profileIdArray.Find( aPID );
+ iSyncSession.DeleteProfileL( profileIdArray[index] );
+ CleanupStack::PopAndDestroy( 2 ); //profileIdArray, taskIdArray
+ iSyncSession.Close();
+ iSyncSessionOpen = EFalse;
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::CreateURITaskSegmentListL
+// The function creates list of the content types that profile supports.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::CreateURITaskSegmentListL( const TDesC8& aURI,
+ const TInt aPID,
+ CBufBase*& aCurrentURISegmentList,
+ const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aPID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return KErrGeneral;
+ }
+ RArray<TSmlTaskId> taskIdArray;
+ CleanupClosePushL( taskIdArray );
+ iDSProfile.ListTasksL( taskIdArray );
+ if( taskIdArray.Count() == 0 )
+ {
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy();//taskIdArray
+ return KErrNotFound;
+ }
+
+ RSyncMLTask task;
+ CleanupClosePushL( task );
+
+ for ( TInt i = 0; i < taskIdArray.Count(); i++ )
+ {
+ //
+ // Check if ContentType -> Task ID on list
+ //
+ TBool notInList( ETrue );
+ TInt newline( 0 );
+ TInt ddId( 0 );
+ task.OpenL( iDSProfile, taskIdArray[i] );
+ ddId = task.DataProvider();
+ task.Close();
+ while( notInList && newline <aPreviousURISegmentList.Count() )
+ {
+ TInt ppId = GetIntObject( aPreviousURISegmentList.At(newline).iURISegLUID );
+ if( ppId == ddId )
+ {
+ notInList = EFalse;
+ break;
+ }
+ newline++;
+ }//while
+
+ if( notInList )
+ {
+ TBuf8<9> addNAME( Kprev );
+ //Get Task ID
+ addNAME.AppendNumFixedWidth( taskIdArray[i], EDecimal,3 );
+ aCurrentURISegmentList->InsertL( aCurrentURISegmentList->Size(), addNAME );
+ aCurrentURISegmentList->InsertL( aCurrentURISegmentList->Size(), KNSmlDSSlash );
+
+ TBuf8<80> addURI;
+
+ addURI.Append( aURI );
+ addURI.Append( Kprev2 );
+ addURI.AppendNumFixedWidth( taskIdArray[i], EDecimal, 3 );
+
+ TBuf8<16> addLUID;
+ addLUID.Num( ddId );
+
+ iCallBack->SetMappingL( addURI, addLUID );
+ }
+ else //not a new object
+ {
+ aCurrentURISegmentList->InsertL( aCurrentURISegmentList->Size(),
+ aPreviousURISegmentList.At(newline).iURISeg );
+
+ aCurrentURISegmentList->InsertL( aCurrentURISegmentList->Size(), KNSmlDSSlash );
+
+// DBG_ARGS8(_S8("InList: Id = %d Name %S"), newline,
+// aPreviousURISegmentList.At(newline).iURISeg);
+ }
+ } //For
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy(2);// task, taskIdArray
+ return KErrNone;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::CreateURIProfileSegmentListL
+// The function creates list of the profiles.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::CreateURIProfileSegmentListL( CBufBase*& aCurrentURISegmentList,
+ const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList )
+ {
+ if( iSyncSessionOpen == EFalse )
+ {
+ iSyncSession.OpenL();
+ iSyncSessionOpen = ETrue;
+ }
+ RArray<TSmlProfileId> profileIdArray;
+ CleanupClosePushL( profileIdArray );
+ TSmlUsageType usageType = ESmlDataSync;
+ iSyncSession.ListProfilesL( profileIdArray, usageType );
+
+ if(profileIdArray.Count() == 0)
+ {
+ CleanupStack::PopAndDestroy();//profileIdArray
+ return KErrNotFound;
+ }
+
+ for(TInt p = 0; p < profileIdArray.Count(); p++ )
+ {
+ TBool notInList = ETrue;
+ TInt newline = 0;
+ while( notInList && newline < aPreviousURISegmentList.Count() )
+ {
+ TInt ddId = profileIdArray[p];
+ TInt ppId = GetIntObject( aPreviousURISegmentList.At(newline).iURISegLUID );
+ if( ppId == ddId )
+ {
+ notInList = EFalse;
+ break;
+ }
+ newline++;
+ }
+
+ if( notInList )
+ { // Those which not have mapping data
+
+ TBuf8<9> addNAME( KDSprev );
+ addNAME.AppendNumFixedWidth( profileIdArray[p], EDecimal, 3 );
+
+ aCurrentURISegmentList->InsertL( aCurrentURISegmentList->Size(), addNAME );
+ aCurrentURISegmentList->InsertL( aCurrentURISegmentList->Size(), KNSmlDSSlash );
+
+ // KNSmlDSStart includes start text for URISeg
+ TBuf8<20> addURI; // SyncML/DSAcc/DSIdnnn , nnn = profileid
+ addURI.Append( KNSmlDSStart );
+ addURI.AppendNumFixedWidth( profileIdArray[p], EDecimal, 3 );
+
+ TBuf8<16> addLUID;
+ addLUID.Num( profileIdArray[p] );
+
+ iCallBack->SetMappingL( addURI,addLUID );
+ }
+ else
+ { // Add those in PreviousList which are on database
+ aCurrentURISegmentList->InsertL( aCurrentURISegmentList->Size(),
+ aPreviousURISegmentList.At(newline).iURISeg );
+
+ aCurrentURISegmentList->InsertL( aCurrentURISegmentList->Size(), KNSmlDSSlash );
+// DBG_ARGS8(_S8("InList: Id = %d Name %S"), newline,
+// aPreviousURISegmentList.At(newline).iURISeg);
+ }
+ }
+ CleanupStack::PopAndDestroy();//profileIdArray
+ return KErrNone;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::OpenSyncSessionAndDSProfileL
+// The function opens the server session and DS profile.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::OpenSyncSessionAndDSProfileL( const TInt aIntLUID,
+ TSmlOpenMode aMode )
+ {
+ if( iSyncSessionOpen == EFalse )
+ {
+ iSyncSession.OpenL();
+ iSyncSessionOpen = ETrue;
+ }
+ RArray<TSmlProfileId> profileIdArray;
+ CleanupClosePushL( profileIdArray );
+ TSmlUsageType usageType = ESmlDataSync;
+ iSyncSession.ListProfilesL( profileIdArray, usageType );
+ TInt index = profileIdArray.Find( aIntLUID );
+ CleanupStack::PopAndDestroy(); //profileIdArray
+ if( index == KErrNotFound )
+ {
+ return KErrNotFound;
+ }
+ TRAPD( rValue, iDSProfile.OpenL( iSyncSession, aIntLUID, aMode ) );
+ if( rValue != KErrNone )
+ {
+ iDSProfile.Close();
+ iSyncSession.Close();
+ iSyncSessionOpen = EFalse;
+ }
+ return rValue;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::CloseDSProfile
+// The function closes the DS profile connection.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::CloseDSProfile()
+ {
+ iDSProfile.Close();
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::FindTaskIDL
+// The function searches if task can be found from the profile task list.
+//------------------------------------------------------------------------------
+TBool CNSmlDSSettingsAdapter::FindTaskIDL( const TInt aProfLUID, const TInt aDataProviderId )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aProfLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return EFalse;
+ }
+ RArray<TSmlTaskId> taskIdArray;
+ CleanupClosePushL( taskIdArray );//taskIdArray
+ iDSProfile.ListTasksL( taskIdArray );
+
+ RSyncMLTask task;
+ CleanupClosePushL( task );
+ // find task
+ for (TInt i=0; i<taskIdArray.Count(); i++)
+ {
+ task.OpenL( iDSProfile, taskIdArray[i] );
+ if (task.DataProvider() == aDataProviderId)
+ {
+ CleanupStack::PopAndDestroy(2); //taskIdArray, task
+ CloseDSProfile();
+ return ETrue;
+ }
+ task.Close();
+ }
+ // task not found
+ CleanupStack::PopAndDestroy(2); //taskIdArray, task
+ CloseDSProfile();
+ return EFalse;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::DeleteTaskByIDL
+// The function deletes the task by given id.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::DeleteTaskByIDL( const TInt aLUID, const TInt aDataProviderId )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aLUID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTaskId> taskIdArray;
+ CleanupClosePushL( taskIdArray );
+ iDSProfile.ListTasksL( taskIdArray );
+
+ RSyncMLTask task;
+ CleanupClosePushL( task );
+ // find task
+ for (TInt i=0; i<taskIdArray.Count(); i++)
+ {
+ task.OpenL( iDSProfile, taskIdArray[i] );
+ if (task.DataProvider() == aDataProviderId)
+ {
+ task.Close();
+ CleanupStack::PopAndDestroy(); // task
+ iDSProfile.DeleteTaskL( taskIdArray[i] );
+ iDSProfile.UpdateL();
+ CleanupStack::PopAndDestroy(); //taskIdArray
+ CloseDSProfile();
+ return KErrNone;
+ }
+ task.Close();
+ }
+ // task not found
+ CleanupStack::PopAndDestroy(2); //taskIdArray, task
+ CloseDSProfile();
+ return KErrNotFound;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetClientDataSourceL
+// The function gets the local data store (LDBURI).
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetClientDataSourceL( const TInt aDataProviderId,
+ const TInt aProfileLUID,
+ CBufBase*& aObject )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aProfileLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTaskId> taskArray;
+ CleanupClosePushL( taskArray );
+ iDSProfile.ListTasksL( taskArray );
+
+ RSyncMLTask task;
+ CleanupClosePushL( task );
+ // find task
+ for (TInt i=0; i<taskArray.Count(); i++)
+ {
+ task.OpenL( iDSProfile, taskArray[i] );
+ if (task.DataProvider() == aDataProviderId)
+ {
+ HBufC* localDataStore = task.ClientDataSource().AllocLC();
+ aObject->InsertL( aObject->Size(), ConvertTo8LC( *localDataStore ) );
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy(4); //taskIdArray, task, localDataStore, ConvertTo8LC
+
+ return KErrNone;
+ }
+ task.Close();
+ }
+ // task not found
+ CleanupStack::PopAndDestroy(2); //taskArray, task
+ CloseDSProfile();
+ return KErrNotFound;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetServerDataSourceL
+// The function gets the remote data store (RDBURI).
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::GetServerDataSourceL( const TInt aDataProviderId,
+ const TInt aProfileLUID,
+ CBufBase*& aObject )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aProfileLUID, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTaskId> taskArray;
+ CleanupClosePushL( taskArray );
+ iDSProfile.ListTasksL( taskArray );
+
+ RSyncMLTask task;
+ CleanupClosePushL( task );
+ // find task
+ for (TInt i=0; i<taskArray.Count(); i++)
+ {
+ task.OpenL( iDSProfile, taskArray[i] );
+ if (task.DataProvider() == aDataProviderId)
+ {
+ HBufC* serverDataStore = task.ServerDataSource().AllocLC();
+ aObject->InsertL( aObject->Size(), ConvertTo8LC( *serverDataStore ) );
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy(4); //taskIdArray, task, serverDataStore, ConvertTo8LC
+
+ return KErrNone;
+ }
+ task.Close();
+ }
+ // task not found
+ CleanupStack::PopAndDestroy(2); //taskIdArray, task
+ CloseDSProfile();
+ return KErrNotFound;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::UpdateDataSourceL
+// The function updates the LDBURI or RDBURI leaf value.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::UpdateDataSourceL( const TInt aProfileLUID,
+ const TInt aDataProviderId,
+ const TDesC8& aObject,
+ const HBufC8& aField)
+ {
+ // check that aField is RemoteDB or LocalDB
+ if( aField.Compare( KNSmlDdfRDBURI ) != 0 && aField.Compare( KNSmlDdfLDBURI ) != 0)
+ {
+ return KErrGeneral;
+ }
+
+ TInt retVal = OpenSyncSessionAndDSProfileL( aProfileLUID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTaskId> taskArray;
+ CleanupClosePushL( taskArray );
+ iDSProfile.ListTasksL( taskArray );
+
+ RSyncMLTask task;
+ CleanupClosePushL( task );
+ // find correct task
+ for (TInt i=0; i<taskArray.Count(); i++)
+ {
+ task.OpenL( iDSProfile, taskArray[i] );
+ if (task.DataProvider() == aDataProviderId)
+ {
+ // task found, get current localDataStore and remoteDataStore
+ HBufC* localDataStore = task.ClientDataSource().AllocLC();
+ HBufC* remoteDataStore = task.ServerDataSource().AllocLC();
+ task.Close();
+
+ HBufC16* objectBuffer = HBufC16::NewLC( aObject.Size() );
+ TPtr16 ptrDataObject = objectBuffer->Des();
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( ptrDataObject, aObject );
+ iDSProfile.DeleteTaskL( taskArray[i] );
+ iDSProfile.UpdateL();
+
+ // create new task with new values
+ RSyncMLTask newTask;
+ CleanupClosePushL( newTask );
+ if( aField.Compare( KNSmlDdfRDBURI ) == 0 ) //Remote DB, Mandatory
+ {
+ newTask.CreateL( iDSProfile, aDataProviderId, ptrDataObject, *localDataStore );
+ }
+ else if( aField.Compare( KNSmlDdfLDBURI ) == 0 )
+ {
+ newTask.CreateL( iDSProfile, aDataProviderId, *remoteDataStore, ptrDataObject );
+ }
+ newTask.UpdateL();
+
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy( 6 ); //taskArray, task, localDataStore,
+ //remoteDataStore, objectBuffer, newTask
+ return retVal;
+ }
+ task.Close();
+ }
+ // task not found
+ CleanupStack::PopAndDestroy(2);//taskArray, task
+ CloseDSProfile();
+ return KErrNotFound;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::FetchObjectL
+// The function fetches the requested leaf object data.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::FetchObjectL( const TDesC8& aURI, const TDesC8& aLUID,
+ CBufBase*& aObj, const TInt aStatusRef )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): begin");
+//
+ DBG_ARGS(_S16("DS:Fetch aURI - %S - %S"), &aURI, &aLUID);
+
+ TInt retVal = KErrNone;
+ TInt profileLUID = -1;
+
+ iLUID = IntLUID( aLUID );
+
+ if ( aLUID.Length() > 0 &&
+ ( aURI.Match( KCTTypeMatch ) != KErrNotFound ||
+ aURI.Match( KRDBUriMatch ) != KErrNotFound ||
+ aURI.Match( KLDBUriMatch ) != KErrNotFound ) )
+ {
+ profileLUID = GetProfileIdFromURIL( aURI ); // ProfileId for DB-level
+ if( FindTaskIDL( profileLUID, iLUID ) == EFalse )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return KErrNotFound;
+ }
+ }
+ else if ( aLUID.Length() > 0 ) //Profile
+ {
+ TInt profileID = -1;
+ TInt retValue = GetProfileIdentifierL( iLUID, profileID );
+ if( retValue != KErrNone || profileID < 0 )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return KErrNotFound;
+ }
+ iLUID = profileID;
+ }
+ else
+ {
+ // Static node feature start
+ iLUID = -1;
+ if( IsDSAccUriFormatMatchPredefined(aURI) )
+ {
+ iLUID = ConstructTreeL(aURI);
+ profileLUID = GetProfileIdFromURIL( aURI );
+ }
+
+ if ((iLUID == 0 ) && (aURI.Match(_L8("SyncML/DSAcc/DSId*/DB/CTId*")) == KErrNone))
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return KErrNotFound;
+ }
+ // Static node feature end
+ }
+
+ SetField( aURI );
+//
+// Check if valid field
+//
+/* if( !AcceptDSField() )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): EInvalidObject end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EInvalidObject );
+ return KErrGeneral;
+ }
+*/
+//
+// Check which field going to be handled
+//
+ TInt fType = GetDSFieldTypeL();
+ if ( fType == EInt || fType == EStr )
+ {
+ retVal = GetDSFieldDataL( iLUID, aObj );
+ }
+ else if ( fType == EParam )
+ { // DB and CTType (dataprovider info / MIME type)
+ // RDBURI + LDBURI (dataprovider data paths)
+ if( iField->Compare( KNSmlDdfCTType ) == 0 )
+ {
+ retVal = GetContentTypeL( iLUID, profileLUID, aObj );
+ }
+ else if( iField->Compare( KNSmlDdfLDBURI ) == 0 ) // Local database (optional)
+ {
+ //ClientDataSource
+ retVal = GetClientDataSourceL( iLUID, profileLUID, aObj );
+ }
+ else if( iField->Compare( KNSmlDdfRDBURI ) == 0 ) // Remote database
+ {
+ //ServerDataSource
+ retVal = GetServerDataSourceL( iLUID, profileLUID, aObj );
+ }
+ }
+ else
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): Unknown type end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ return KErrNotFound;
+ }
+ if( retVal != KErrNone )
+ {
+ if ( retVal == KErrNotFound )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): ENotFound end");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound );
+ }
+ else
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::FetchObjectL(): retVal != KErrNone");
+ iCallBack->SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+ }
+ return retVal;
+
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::FillNodeInfoL
+// The function fills the node or leaf information.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::FillNodeInfoL( MSmlDmDDFObject& aNode,
+ TSmlDmAccessTypes aAccTypes,
+ MSmlDmDDFObject::TOccurence aOccurrence,
+ MSmlDmDDFObject::TScope aScope,
+ MSmlDmDDFObject::TDFFormat aFormat,
+ const TDesC8& aDescription,
+ const TDesC8& aDefaultValue,
+ const TDesC8& aMimeType )
+ {
+ aNode.AddDFTypeMimeTypeL( aMimeType );
+ aNode.SetAccessTypesL( aAccTypes );
+ aNode.SetDescriptionL( aDescription );
+ aNode.SetOccurenceL( aOccurrence );
+ aNode.SetDefaultValueL( aDefaultValue );
+ aNode.SetScopeL( aScope );
+ aNode.SetDFFormatL( aFormat );
+ return;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfileAddrTypeL
+// The function sets the medium type for a profile.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfileAddrTypeL( const TInt aLUID,
+ const TInt aIntObj )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetProfileAddrTypeL(): begin");
+ TInt retVal = OpenSyncSessionAndDSProfileL( aLUID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetProfileAddrTypeL(): end");
+ return retVal;
+ }
+ TSmlTransportId mediumType = ENone;
+ GetMediumTypeL( aIntObj, mediumType );
+ if( mediumType == ENone )
+ {
+ return KErrGeneral;
+ }
+ RArray<TSmlTransportId> transportIdArray;
+ CleanupClosePushL( transportIdArray );
+ iDSProfile.ListConnectionsL( transportIdArray );
+
+ RSyncMLConnection conn;
+ conn.OpenL( iDSProfile, transportIdArray[0] );
+ CleanupClosePushL( conn );
+
+ HBufC8* sURI = conn.ServerURI().AllocLC();
+ if(mediumType!=transportIdArray[0])
+ {
+ conn.CreateL( iDSProfile, mediumType ); //changes medium type and clears the buffer
+ }
+
+ if(mediumType!=KUidNSmlMediumTypeInternet.iUid && sURI->Length() > 0)
+ {
+ // remove port
+ HBufC8* newServerURI = HBufC8::NewL( sURI->Size() );
+ CleanupStack::PushL( newServerURI );
+ TBuf8<5> buf;
+ buf.Num( 0 );
+ // change iLeafType to EDSDelete -> deleting port
+ TNSmlDSLeafType tmpType(iLeafType); // store old value
+ iLeafType = EDSDelete;
+ SetPortNrToAddrStr( *sURI, newServerURI, buf );
+ iLeafType = tmpType; // restore original value
+
+ conn.SetServerURIL( *newServerURI );
+ conn.UpdateL();
+
+ CleanupStack::PopAndDestroy( newServerURI );
+ }
+ else
+ {
+ conn.SetServerURIL( *sURI );
+ conn.UpdateL();
+ }
+
+ CleanupStack::PopAndDestroy( 3 );//transportIdArray, conn, sURI
+ CloseDSProfile();
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetProfileAddrTypeL(): end");
+ return KErrNone;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfileConnectionPortNrL
+// The function sets the port number (PortNbr) for a profile.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfileConnectionPortNrL( const TInt aLUID,
+ const TDesC8& aPort )
+ {
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetProfileConnectionPortNrL(): begin");
+ TInt retVal = KErrNone;
+
+ if( iPortNbr )
+ {
+ delete iPortNbr;
+ iPortNbr = NULL;
+ }
+ iPortNbr = HBufC8::NewL( aPort.Length() );
+ TPtr8 newPortNbr = iPortNbr->Des();
+ newPortNbr.Append( aPort );
+
+ retVal = OpenSyncSessionAndDSProfileL( aLUID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetProfileConnectionPortNrL(): end");
+ return retVal;
+ }
+
+ RArray<TSmlTransportId> transportIdArray;
+ CleanupClosePushL( transportIdArray );
+ iDSProfile.ListConnectionsL( transportIdArray );
+
+ RSyncMLConnection conn;
+ CleanupClosePushL( conn );
+ conn.OpenL( iDSProfile, transportIdArray[0] );
+
+ // if medium type is not internet -> do not add port
+ if( transportIdArray[0] != KUidNSmlMediumTypeInternet.iUid )
+ {
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy( 2 ); //transportIdArray, conn
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetProfileConnectionPortNrL(): end");
+ return retVal;
+ }
+
+ HBufC8* serverURI = conn.ServerURI().AllocLC();
+ if( serverURI->Length() == 0 )
+ {
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy( 3 ); //transportIdArray, conn, serverURI
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetProfileConnectionPortNrL(): end");
+ return retVal;
+ }
+ TInt totalSize = serverURI->Size() + newPortNbr.Size() + 1;
+ HBufC8* newServerURI = HBufC8::NewL( totalSize );
+ CleanupStack::PushL( newServerURI );
+ SetPortNrToAddrStr( *serverURI, newServerURI, newPortNbr );
+
+ conn.SetServerURIL( *newServerURI );
+ conn.UpdateL();
+
+ CleanupStack::PopAndDestroy( 4 ); //transportIdArray, conn, serverURI, newServerURI
+ CloseDSProfile();
+ _DBG_FILE("CNSmlDSSettingsAdapter::SetProfileConnectionPortNrL(): end");
+ return KErrNone;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetPortNrToAddrStr
+// The function sets or replaces a portnbr (separated with ':') to Addr Uri.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::SetPortNrToAddrStr( const TDesC8& aSrvURI,
+ HBufC8* aNewURI,
+ const TDesC8& aPort )
+ {
+ TInt offset=0;
+ if( aSrvURI.Find( KNSmlDSSettingsHTTP ) == 0 )//http://
+ {
+ offset = KNSmlDSSettingsHTTP().Length();
+ }
+ else if( aSrvURI.Find( KNSmlDSSettingsHTTPS ) == 0 )//https://
+ {
+ offset = KNSmlDSSettingsHTTPS().Length();
+ }
+
+ TInt portStart = -1;
+ TInt separatorPos = aSrvURI.Length();
+
+ TInt i = 0;
+ for( i = offset; i < aSrvURI.Length(); i++ )
+ {
+ if( aSrvURI[i] == KNSmlDMColon )// ':'
+ {
+ portStart = i;
+ }
+ if( aSrvURI[i] == KNSmlDMUriSeparator )// '/'
+ {
+ separatorPos = i;
+ break;
+ }
+ }
+
+ TPtr8 ptrNewSrvURI = aNewURI->Des();
+ if( portStart < 0 && separatorPos > 0 && iLeafType != EDSDelete )
+ {
+ ptrNewSrvURI.Append( aSrvURI.Left( separatorPos ) );//http://123.234.345.456
+ ptrNewSrvURI.Append( KNSmlDMColon );
+ ptrNewSrvURI.Append( aPort );
+ ptrNewSrvURI.Append( aSrvURI.Right( aSrvURI.Length() - separatorPos ) );//123.234.345.456:xx(x)/syncml
+ }
+ else if ( portStart > 0 && separatorPos > 0 && iLeafType != EDSDelete )
+ {
+ ptrNewSrvURI.Append( aSrvURI.Left( portStart + 1 ) );//123.234.345.456:
+ ptrNewSrvURI.Append( aPort );//123.234.345.456:xx(x)
+ ptrNewSrvURI.Append( aSrvURI.Right( aSrvURI.Length() - separatorPos ) );//123.234.345.456:xx(x)/syncml
+ }
+ else if ( portStart > 0 && iLeafType == EDSDelete ) //delete port number from uri
+ {
+ ptrNewSrvURI.Append( aSrvURI.Left( portStart ) );//123.234.345.456
+ ptrNewSrvURI.Append( aSrvURI.Right( aSrvURI.Length() - separatorPos ) );//123.234.345.456:xx(x)/syncml
+ }
+ else
+ {
+ ptrNewSrvURI.Append( aSrvURI );
+ }
+ return;
+ }
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::MimeTypeAllreadyExitsL
+// The function checks if mime type allready exits in this profile.
+//------------------------------------------------------------------------------
+TBool CNSmlDSSettingsAdapter::MimeTypeAllreadyExitsL( const TInt aLuid,
+ const TDesC8& aMimeType )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aLuid, ESmlOpenRead );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return EFalse;
+ }
+ RArray<TSmlDataProviderId> dataProviderArray;
+ CleanupClosePushL( dataProviderArray );
+ iSyncSession.ListDataProvidersL( dataProviderArray );
+ TInt dataProviderCount = dataProviderArray.Count();
+ if( dataProviderCount == 0 )
+ {//error case, data provider not found
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy();//dataProviderIdArray
+ return EFalse;
+ }
+
+ RSyncMLTask task;
+ RSyncMLDataProvider dataProvider;
+ RArray<TSmlTaskId> taskIdArray;
+ iDSProfile.ListTasksL( taskIdArray );
+ CleanupClosePushL(taskIdArray);
+
+ HBufC8* object = aMimeType.AllocLC();
+ TPtr8 objectPtr = object->Des();
+ objectPtr.LowerCase();
+
+ for( TInt i = 0; i<taskIdArray.Count(); i++ )
+ {
+ task.OpenL( iDSProfile, taskIdArray[i] );
+ CleanupClosePushL(task);
+ TInt dataProviderUID = task.DataProvider();
+ TInt dataProviderIndex = dataProviderArray.Find( dataProviderUID );
+ if( dataProviderIndex != KErrNotFound )
+ {
+ dataProvider.OpenL( iSyncSession, dataProviderArray[dataProviderIndex] );
+ CleanupClosePushL(dataProvider);
+ for ( TInt n = 0; n < dataProvider.MimeTypeCount(); n++ )
+ {
+ HBufC* mimeType = dataProvider.MimeType(n).AllocLC();
+ if( objectPtr.Compare( ConvertTo8LC( *mimeType ) ) == 0 ) //if MIME match
+ {
+ CleanupStack::PopAndDestroy( 7 ); //dataProviderArray, task, dataProvider,
+ //taskIdArray, object, mimeType, ConvertTo8LC
+ CloseDSProfile();
+ return ETrue;
+ }
+ CleanupStack::PopAndDestroy( 2 ); //mimeType, ConvertTo8LC
+ }
+ CleanupStack::PopAndDestroy( ); //dataProvider
+ }
+ CleanupStack::PopAndDestroy( ); //task
+ }
+ CleanupStack::PopAndDestroy( 3 ); //dataProviderArray,taskIdArray, object
+ CloseDSProfile();
+ return EFalse;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetRDBDataStore
+// The function sets the RDMURI to memeber variable.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::SetRDBDataStore( const TDesC8& aStore )
+ {
+ TPtr16 bufPtr16 = iRdbDataStore->Des();
+ bufPtr16.Delete(0, bufPtr16.Size());
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( bufPtr16, aStore );
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::SetProfileIAPIdL
+// The function sets the IAPId value to profile connection properties.
+//------------------------------------------------------------------------------
+TInt CNSmlDSSettingsAdapter::SetProfileIAPIdL( const TInt aLUID, const TInt aIAPid )
+ {
+ TInt retVal = OpenSyncSessionAndDSProfileL( aLUID, ESmlOpenReadWrite );
+ if( retVal != KErrNone )
+ {
+ CloseDSProfile();
+ return retVal;
+ }
+ RArray<TSmlTransportId> connIdArray;
+ CleanupClosePushL( connIdArray );
+ iDSProfile.ListConnectionsL( connIdArray );
+ if( connIdArray.Count() == 1 )
+ {
+ RSyncMLTransport transport;
+ CleanupClosePushL( transport );
+ transport.OpenL( iSyncSession, connIdArray[0] );
+ const CSyncMLTransportPropertiesArray& props = transport.Properties();
+ TInt index = props.Find( KNSmlIAPId );
+ if( index > 0 )
+ {
+ RSyncMLConnection conn;
+ CleanupClosePushL( conn );
+ conn.OpenL( iDSProfile, connIdArray[0] );
+ HBufC8* apIdBuffer = HBufC8::NewLC( 4 );
+ TPtr8 ptrIapIdBuf = apIdBuffer->Des();
+ ptrIapIdBuf.Num( aIAPid );
+ conn.SetPropertyL( KNSmlIAPId, ptrIapIdBuf );
+ conn.UpdateL();
+ CleanupStack::PopAndDestroy( 2 ); //conn, apIdBuffer
+ retVal = KErrNone;
+ }
+ else
+ {
+ retVal = KErrNotFound;
+ }
+ CleanupStack::PopAndDestroy(); //transport
+ }
+ else
+ {
+ retVal = KErrNotFound;
+ }
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy(); //connIdArray
+ return retVal;
+ }
+
+//------------------------------------------------------------------------------
+// CNSmlDSSettingsAdapter::GetMediumTypeL
+// The function checks the requested medium type and gets it UID.
+//------------------------------------------------------------------------------
+void CNSmlDSSettingsAdapter::GetMediumTypeL( const TInt aIntObj,
+ TSmlTransportId& aMediumType )
+ {
+ if( aIntObj == EHttp|| aIntObj == ENone || aIntObj == EWsp)
+ {
+ aMediumType = KUidNSmlMediumTypeInternet.iUid;
+ return;
+ }
+ RArray<TSmlTransportId> transportIdArray;
+ CleanupClosePushL( transportIdArray );
+ iSyncSession.ListTransportsL( transportIdArray );
+ if ( transportIdArray.Find( KUidNSmlMediumTypeBluetooth.iUid ) != KErrNotFound )
+ {
+ aMediumType = KUidNSmlMediumTypeBluetooth.iUid;
+ }
+ else if ( transportIdArray.Find( KUidNSmlMediumTypeUSB.iUid ) != KErrNotFound )
+ {
+ aMediumType = KUidNSmlMediumTypeUSB.iUid;
+ }
+ else if ( transportIdArray.Find( KUidNSmlMediumTypeIrDA.iUid ) != KErrNotFound )
+ {
+ aMediumType = KUidNSmlMediumTypeIrDA.iUid;
+ }
+ CleanupStack::PopAndDestroy(); //transportIdArray
+ return;
+ }
+
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//------------------------------------------------------------------------------
+// TImplementationProxy ImplementationTable[]
+//------------------------------------------------------------------------------
+
+#ifndef IMPLEMENTATION_PROXY_ENTRY
+#define IMPLEMENTATION_PROXY_ENTRY(aUid, aFuncPtr) {{aUid},(aFuncPtr)}
+#endif
+
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( KNSmlDSSettingsAdapterImplUid, CNSmlDSSettingsAdapter::NewL )
+ };
+
+//------------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy()
+//------------------------------------------------------------------------------
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+ {
+ _DBG_FILE("ImplementationGroupProxy() for CNSmlDSSettingsAdapter: begin");
+
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+
+ _DBG_FILE("ImplementationGroupProxy() for CNSmlDSSettingsAdapter: end");
+ return ImplementationTable;
+ }
+
+
+//--------------------------------------------------------------------
+//TInt CNSmlDMSettingsAdapter::IsDSAccUriFormatMatchPredefined(const TDesC8 & aURI)
+//
+//-------------------------------------------------------------------
+
+TBool CNSmlDSSettingsAdapter::IsDSAccUriFormatMatchPredefined(const TDesC8 & aURI)
+{
+
+ // include strings for tree for Bearer , DNS related Dynamic nodes .
+
+ if(aURI.Match(_L8("SyncML/DSAcc/DSId*")) != KErrNotFound ||
+ aURI.Match(_L8("SyncML/DSAcc/DSId*/DB/CTId*")) != KErrNotFound)
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+
+
+}
+
+//--------------------------------------------------------------------
+//TInt CNSmlDMSettingsAdapter::ConstructTreeL(const TDesC8& aURI)
+//
+//-------------------------------------------------------------------
+
+TInt CNSmlDSSettingsAdapter::ConstructTreeL(const TDesC8& aURI)
+{
+ TInt profileID = KErrNotFound;
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 1 ")) ;
+ TBool notDBSet(EFalse);
+ if( iSyncSessionOpen == EFalse )
+ {
+ iSyncSession.OpenL();
+ iSyncSessionOpen = ETrue;
+ }
+ RArray<TSmlProfileId> profileIdArray;
+ CleanupClosePushL( profileIdArray );
+ TSmlUsageType usageType = ESmlDataSync;
+ iSyncSession.ListProfilesL( profileIdArray, usageType );
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 1-2 ") );
+
+ for( TInt p = 0; p < profileIdArray.Count(); p++ )
+ {
+ TInt ddId = profileIdArray[p] ; // update remove KMAxDatasyncID - KMaxDataSyncID;
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 1-3 ") );
+
+ _LIT8( Kprev, "DSId" );// update changed from DMId to DSId
+ TBuf8<7> addNAME(Kprev); // DMIdnnn , nnn = profileid
+ TInt fixedProfId = profileIdArray[p] ; // update remove KMAxDatasyncID // - KMaxDataSyncID; //fit to 3 decimal
+ addNAME.AppendNumFixedWidth( fixedProfId, EDecimal, 3 );
+ DBG_ARGS8( _S8("notInList: Id = %d Name %S"), p, &addNAME );
+ RDebug::Print( _L("notInList: Id = %d Name %S"), p, &addNAME );
+ // KNSmlDMStart includes start text for URISeg
+ TBuf8<20> addURI; // SyncML/DMAcc/DMIdnnn , nnn = profileid
+ addURI.Append( KNSmlDSStart );
+ addURI.AppendNumFixedWidth( fixedProfId, EDecimal, 3 );
+ TBuf8<3> addLUID;
+ addLUID.Num( fixedProfId );
+
+ HBufC8* mapInfo = iCallBack->GetLuidAllocL(addURI);
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 1-4 addURI = %S"), &addURI );
+
+ if (mapInfo->Length() == 0)
+ {
+ iCallBack->SetMappingL(addURI,addLUID);
+
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 1-5 ") );
+
+ if(( aURI.Find(addURI) >= 0 ) && !notDBSet)
+ {
+ profileID = fixedProfId;
+ }
+
+ // update , Update ../DB/CTId also
+ TInt retVal = OpenSyncSessionAndDSProfileL( fixedProfId, ESmlOpenRead );
+ if( retVal == KErrNone )
+ {
+
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 2 ") );
+
+
+ RArray<TSmlTaskId> taskIdArray;
+ CleanupClosePushL( taskIdArray );
+ iDSProfile.ListTasksL( taskIdArray );
+ if( taskIdArray.Count() == 0 )
+ {
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 3 ")) ;
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy();//taskIdArray
+ // return KErrNotFound;
+ }
+ else
+ {
+ RSyncMLTask task;
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 4 ")) ;
+
+ CleanupClosePushL( task );
+
+ for ( TInt i = 0; i < taskIdArray.Count(); i++ )
+ {
+ //
+ // Check if ContentType -> Task ID on list
+ //
+ TInt ddId( 0 );
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 5 ")) ;
+
+ task.OpenL( iDSProfile, taskIdArray[i] );
+ ddId = task.DataProvider();
+ task.Close();
+
+ //Get Task ID
+ // addNAME.AppendNumFixedWidth( taskIdArray[i], EDecimal,3 );
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 6 ") );
+
+ TBuf8<80> addDBURI;
+
+ addDBURI.Append( addURI );
+ _LIT8( KDB, "/DB" );// addDb also
+ addDBURI.Append( KDB );
+ addDBURI.Append( Kprev2 );
+ addDBURI.AppendNumFixedWidth( taskIdArray[i], EDecimal, 3 );
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 7 ")) ;
+
+ TBuf8<16> addDBLUID;
+ addDBLUID.Num( ddId );
+ HBufC8* mapInfo = iCallBack->GetLuidAllocL(addDBURI);
+ if (mapInfo->Length() == 0)
+ {
+ iCallBack->SetMappingL(addDBURI,addDBLUID);
+
+ if( aURI.Find(addDBURI) >= 0 )
+ {
+ profileID = ddId;
+ notDBSet = ETrue;
+ }
+ }
+
+ } //For
+ CloseDSProfile();
+ CleanupStack::PopAndDestroy(2);// task, taskIdArray
+ }
+
+ //return KErrGeneral;
+ }
+ else
+ {
+ CloseDSProfile();
+ }
+
+ }
+ else
+ {
+RDebug::Print( _L("jshong FOTA : ConstructTreeL 1-5 ") );
+
+ delete mapInfo;
+ }
+
+
+ }
+
+ CleanupStack::PopAndDestroy( 1 );//profileIdArray
+ return profileID;
+}
+
+//------------------------------------------------------------------------------
+// TPtrC8 CUtils::GetDynamicDSNodeUri( const TDesC8& aURI )
+// returns Syncml/DSAcc/xxx URI
+//------------------------------------------------------------------------------
+TPtrC8 CNSmlDSSettingsAdapter::GetDynamicDSNodeUri(const TDesC8& aURI)
+ {
+ TInt i= 0;
+ TBuf8<50> DsAccRoot(KDSAcc1);
+ for ( i = aURI.Find( KDSAcc1 ) + DsAccRoot.Length() + 1 ; i < aURI.Length(); i++ )
+ {
+ if( aURI[i] == '/' )
+ { break;
+ }
+ }
+
+ return aURI.Left( i );
+ }
+
+// End of File
+