--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/provisioningadapter/src/NSmlDsProvisioningAdapter.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,1067 @@
+/*
+* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: DS Settings Provisioning Adapter
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <badesca.h>
+#include <commdb.h>
+#include <cdbcols.h> // CommsDB columname defs
+#include <utf.h>
+#include <stringresourcereader.h>
+#include <barsread.h>
+#include <NSmlDSProvisioningAdapter.rsg>
+#include <bautils.h>
+#include <ApUtils.h>
+#include <barsc.h>
+
+#include <nsmlconstants.h>
+#include <nsmldebug.h>
+#include <nsmldsconstants.h>
+#include <CWPCharacteristic.h>
+#include <CWPParameter.h>
+#include <CWPEngine.h>
+#include "NSmlDsProvisioningAdapter.h"
+#include "implementationinformation.h"
+#include "NSmlTransportHandler.h"
+#include <WPAdapterUtil.h>
+
+_LIT( KInternetString, "INTERNET" );
+#include <data_caging_path_literals.hrh>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::CNSmlDsProvisioningAdapter
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+CNSmlDsProvisioningAdapter::CNSmlDsProvisioningAdapter() :
+ CWPAdapter(), iToNapIDInternetIndicator(EFalse)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+void CNSmlDsProvisioningAdapter::ConstructL()
+ {
+ iSession.OpenL();
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CNSmlDsProvisioningAdapter* CNSmlDsProvisioningAdapter::NewL()
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::NewL(): begin");
+ CNSmlDsProvisioningAdapter* self = new(ELeave) CNSmlDsProvisioningAdapter;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ _DBG_FILE("CNSmlDsProvisioningAdapter::NewL(): end");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CNSmlDsProvisioningAdapter::~CNSmlDsProvisioningAdapter()
+ {
+ iProfiles.ResetAndDestroy();
+ iProfiles.Close();
+
+ delete iTitle;
+ iSession.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CNSmlDataProviderElement::~CNSmlDataProviderElement()
+ {
+ delete iRemoteDBUri;
+ delete iLocalDBUri;
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CNSmlDsProfileElement::~CNSmlDsProfileElement()
+ {
+ iDataProvElement.ResetAndDestroy();
+ iDataProvElement.Close();
+ iVisitParameter = 0;
+
+ delete iHostAddress;
+ delete iPort;
+ delete iHTTPUserName;
+ delete iHTTPPassword;
+
+ delete iDisplayName;
+ delete iServerId;
+ delete iUsername;
+ delete iPassword;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::CanSetAsDefault
+// -----------------------------------------------------------------------------
+TBool CNSmlDsProvisioningAdapter::CanSetAsDefault(TInt /*aItem*/) const
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::SetAsDefaultL
+// -----------------------------------------------------------------------------
+void CNSmlDsProvisioningAdapter::SetAsDefaultL(TInt /*aItem*/ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::ItemCount
+// -----------------------------------------------------------------------------
+TInt CNSmlDsProvisioningAdapter::ItemCount() const
+ {
+ return iProfiles.Count();
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::SummaryTitle
+// -----------------------------------------------------------------------------
+const TDesC16& CNSmlDsProvisioningAdapter::SummaryTitle(TInt /*aIndex*/) const
+ {
+ return *iTitle;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::SummaryText
+// -----------------------------------------------------------------------------
+const TDesC16& CNSmlDsProvisioningAdapter::SummaryText(TInt aIndex) const
+ {
+ return *iProfiles[aIndex]->iDisplayName;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::SaveL
+// -----------------------------------------------------------------------------
+void CNSmlDsProvisioningAdapter::SaveL(TInt aItem)
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::SaveL(): begin");
+ TPckgBuf<TUint32> uid;
+
+ RSyncMLDataSyncProfile profile;
+ TBool ret = EFalse;
+
+ if(iProfiles[aItem]->iServerId != NULL)
+ {
+ RSyncMLDataSyncProfile ProfileToSearch;
+ RArray<TSmlProfileId> arr;
+ iSession.ListProfilesL( arr, ESmlDataSync );
+
+ TInt ProfileId = KErrNotFound;
+ CleanupClosePushL(arr);
+ for ( TInt index = 0; index < arr.Count(); index++ )
+ {
+ TRAPD( error, ProfileToSearch.OpenL(iSession, arr[index], ESmlOpenRead ) );
+ if ( error == KErrNone )
+ {
+ if ( ( iProfiles[aItem]->iServerId->Des()).Compare(ProfileToSearch.ServerId() ) == 0 )
+ {
+
+ ret = ETrue;
+ ProfileId = (TInt)arr[index];
+ ProfileToSearch.Close();
+ break;
+ }
+ }
+ ProfileToSearch.Close();
+ }
+ CleanupStack::PopAndDestroy( &arr );
+
+ if( ret )
+ {
+ profile.OpenL(iSession, ProfileId , ESmlOpenReadWrite );
+ }
+ else
+ {
+ profile.CreateL( iSession );
+ }
+ CleanupClosePushL( profile );
+ }
+ else
+ {
+
+ profile.CreateL( iSession );
+ CleanupClosePushL( profile );
+ }
+
+ // ui needs this to be set 0
+ profile.SetCreatorId(0);//iProfiles[aItem]->iProfile.SetCreatorId(0);
+ profile.SetSanUserInteractionL( iProfiles[aItem]->iServerAlertedAction );
+
+ if ( iProfiles[aItem]->iDisplayName )
+ {
+ profile.SetDisplayNameL( iProfiles[aItem]->iDisplayName->Des() );
+ }
+
+ if ( iProfiles[aItem]->iServerId )
+ {
+ profile.SetServerIdL( iProfiles[aItem]->iServerId->Des() );
+ }
+
+ if ( iProfiles[aItem]->iUsername )
+ {
+ profile.SetUserNameL( iProfiles[aItem]->iUsername->Des() );
+ }
+
+ if ( iProfiles[aItem]->iPassword )
+ {
+ profile.SetPasswordL( iProfiles[aItem]->iPassword->Des() );
+ }
+
+ // creates profile -> must be done before opening the connection
+ profile.UpdateL();
+
+ RSyncMLConnection connection;
+ connection.OpenL( profile, KUidNSmlMediumTypeInternet.iUid );
+ CleanupClosePushL( connection );
+
+ if ( (iProfiles[aItem]->iVisitParameter
+ && iProfiles[aItem]->iVisitParameter->Data().Length() == uid.MaxLength() )
+ || iToNapIDInternetIndicator)
+ {
+ TUint apId = 0;
+ TInt ERROR = KErrNone;
+ TInt err1 = KErrNone;
+
+ if (iToNapIDInternetIndicator)
+ {
+ //Get Access Point from DB or SNAP
+ TRAP(err1, apId = WPAdapterUtil::GetAPIDL());
+ }
+
+ else
+ {
+ uid.Copy(iProfiles[aItem]->iVisitParameter->Data() );
+
+ CCommsDatabase* commDb = CCommsDatabase::NewL();
+ CleanupStack::PushL(commDb);
+ CApUtils* aputils = CApUtils::NewLC( *commDb);
+
+ TRAP( ERROR, apId = aputils->IapIdFromWapIdL( uid() ) );
+ CleanupStack::PopAndDestroy(2); //commdb, aputils
+ }
+
+ //Get default access point in failure of getting AP
+ if (ERROR != KErrNone || err1 != KErrNone)
+ {
+ apId = GetDefaultIAPL();
+ }
+
+ HBufC8* iapBuf = HBufC8::NewLC( 8 );
+ TPtr8 ptrBuf = iapBuf->Des();
+ ptrBuf.Num( apId );
+
+ connection.SetPropertyL( KNSmlIAPId, *iapBuf );
+
+ CleanupStack::PopAndDestroy(); //iapBuf
+ }
+
+ if( iProfiles[aItem]->iHostAddress )
+ {
+ // see if address contains also port
+ TBool portFound = EFalse;
+ TInt startPos(0);
+ if(iProfiles[aItem]->iHostAddress->Find(KNSmlDsProvisioningHTTP)==0)
+ {
+ startPos=KNSmlDsProvisioningHTTP().Length();
+ }
+ else if(iProfiles[aItem]->iHostAddress->Find(KNSmlDsProvisioningHTTPS)==0)
+ {
+ startPos=KNSmlDsProvisioningHTTPS().Length();
+ }
+ TPtrC uriPtr = iProfiles[aItem]->iHostAddress->Mid(startPos);
+
+ if(uriPtr.Locate(KNSmlDMColon)!=KErrNotFound)
+ {
+ portFound = ETrue;
+ }
+
+ if( portFound == EFalse )
+ {
+ HBufC *uri = 0;
+ // port not found from URI -> see if it is given separately
+ if( iProfiles[aItem]->iPort )
+ {
+ // parse address and port into URI
+
+ if( CombineURILC( iProfiles[aItem]->iHostAddress->Des(),
+ iProfiles[aItem]->iPort->Des(), uri ) == KErrNone )
+ {
+ if(iProfiles[aItem]->iHostAddress)
+ {
+ delete iProfiles[aItem]->iHostAddress;
+ iProfiles[aItem]->iHostAddress = NULL;
+ }
+ iProfiles[aItem]->iHostAddress = uri->Des().AllocL();
+ }
+ CleanupStack::PopAndDestroy(); // uri
+ }
+ else
+ {
+ // use default port
+ if( CombineURILC( iProfiles[aItem]->iHostAddress->Des(),
+ KNSmlDsDefaultPort(), uri ) == KErrNone )
+ {
+ if(iProfiles[aItem]->iHostAddress)
+ {
+ delete iProfiles[aItem]->iHostAddress;
+ iProfiles[aItem]->iHostAddress = NULL;
+ }
+ iProfiles[aItem]->iHostAddress = uri->Des().AllocL();
+ }
+ CleanupStack::PopAndDestroy(); // uri
+ }
+ }
+
+
+ connection.SetServerURIL( ConvertTo8LC( iProfiles[aItem]->iHostAddress->Des() ) );
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+
+ // set authtype, HTTPUserName, HTTPPassword
+ if( iProfiles[aItem]->iHTTPUserName ||
+ iProfiles[aItem]->iHTTPPassword )
+ {
+ connection.SetPropertyL( KNSmlHTTPAuth, KNSmlTrueVal );
+
+ if( iProfiles[aItem]->iHTTPUserName )
+ {
+ connection.SetPropertyL( KNSmlHTTPUsername, iProfiles[aItem]->iHTTPUserName->Des() );
+ }
+ if( iProfiles[aItem]->iHTTPPassword )
+ {
+ connection.SetPropertyL( KNSmlHTTPPassword, iProfiles[aItem]->iHTTPPassword->Des() );
+ }
+ }
+ else
+ {
+ connection.SetPropertyL( KNSmlHTTPAuth, KNSmlFalseVal );
+ }
+
+ connection.UpdateL();
+ CleanupStack::PopAndDestroy(); // connection
+
+
+
+
+
+ if(iProfiles[aItem]->iProtocolVersion == ESmlVersion1_1_2 ||
+ iProfiles[aItem]->iProtocolVersion == ESmlVersion1_2 )
+ {
+ profile.SetProtocolVersionL(iProfiles[aItem]->iProtocolVersion);
+ }
+
+
+
+
+
+
+ TInt iDataProvElementCount = iProfiles[aItem]->iDataProvElement.Count();
+ _DBG_FILE("CNSmlDsProvisioningAdapter::SaveL(): Resource For loop: before Start");
+ for ( TInt i = 0; i < iDataProvElementCount; i++ )
+ {
+ _DBG_FILE(
+ "CNSmlDsProvisioningAdapter::SaveL(): Resource For loop: In");
+ RSyncMLDataProvider dataProvider;
+
+ TRAPD(error, dataProvider.OpenL(iSession,
+ iProfiles[aItem]->iDataProvElement[i]->iUid));
+ if (!error)
+ {
+ CleanupClosePushL(dataProvider);
+ if (ret)
+ {
+ RArray<TSmlTaskId> providers;
+ profile.ListTasksL(providers);
+ TInt dataprovcount = providers.Count();
+
+ for (TInt i = 0; i < dataprovcount; i++)
+ {
+ TSmlTaskId taskID = providers[i];
+ RSyncMLTask task;
+ task.OpenL(profile, taskID);
+ CleanupClosePushL(task);
+
+ if (dataProvider.Identifier() == task.DataProvider())
+ {
+ profile.DeleteTaskL(taskID);
+ CleanupStack::PopAndDestroy();
+ break;
+ }
+
+ CleanupStack::PopAndDestroy();
+
+ }
+ providers.Reset();
+ providers.Close();
+
+ }
+ HBufC* localDB = dataProvider.DefaultDataStoreName().AllocLC();
+ _DBG_FILE("CNSmlDsProvisioningAdapter::SaveL(): DB value");
+ DBG_ARGS(
+ iProfiles[aItem]->iDataProvElement[i]->iRemoteDBUri->Des().Ptr());
+
+ RSyncMLTask task;
+ task.CreateL(
+ profile,
+ iProfiles[aItem]->iDataProvElement[i]->iUid,
+ iProfiles[aItem]->iDataProvElement[i]->iRemoteDBUri->Des(),
+ localDB->Des());
+ CleanupClosePushL(task);
+ TRAPD(err, task.UpdateL());
+ if (err != KErrAlreadyExists && err != KErrNone)
+ {
+ User::Leave(err);
+ }
+ CleanupStack::PopAndDestroy(3); // task, localDB, dataProvider
+ }
+
+ }
+ _DBG_FILE("CNSmlDsProvisioningAdapter::SaveL(): Resource For loop: after End");
+
+ profile.UpdateL();
+ iProfiles[aItem]->iProfileId = profile.Identifier();
+ CleanupStack::PopAndDestroy( &profile );
+ _DBG_FILE("CNSmlDsProvisioningAdapter::SaveL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::Reserved_1
+// -----------------------------------------------------------------------------
+TInt CNSmlDsProvisioningAdapter::Reserved_1()
+ {
+ return KErrNotSupported;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::Reserved_2
+// -----------------------------------------------------------------------------
+TInt CNSmlDsProvisioningAdapter::Reserved_2()
+ {
+ return KErrNotSupported;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::VisitL
+// -----------------------------------------------------------------------------
+void CNSmlDsProvisioningAdapter::VisitL( CWPCharacteristic& aCharacteristic )
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPCharacteristic): begin");
+ if(aCharacteristic.Type() == KWPApplication)
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateApplication;
+ }
+ else if(aCharacteristic.Type() == KWPAppAuth)
+ {
+ iAuthLevel = CNSmlDsProvisioningAdapter::ENone;
+ if(iState == CNSmlDsProvisioningAdapter::EStateDsSettings)
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateAppAuth;
+ }
+ else
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateNull;
+ }
+ }
+ else if(aCharacteristic.Type() == KWPResource)
+ {
+ if(iState != CNSmlDsProvisioningAdapter::EStateNull )
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateResource;
+ }
+ else
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateNull;
+ }
+ }
+ else if(aCharacteristic.Type() == KWPAppAddr || aCharacteristic.Type() == KWPPort)
+ {
+ if( iState != CNSmlDsProvisioningAdapter::EStateNull )
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateDsSettings;
+ }
+ }
+ else
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateNull;
+ }
+
+ if(iState != CNSmlDsProvisioningAdapter::EStateNull)
+ {
+ aCharacteristic.AcceptL( *this );
+ }
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPCharacteristic): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::VisitL
+// -----------------------------------------------------------------------------
+void CNSmlDsProvisioningAdapter::VisitL( CWPParameter& aParameter)
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): begin");
+ TInt num;
+ TInt flag =0;
+
+
+ if( iState == CNSmlDsProvisioningAdapter::EStateApplication )
+ {
+ if( aParameter.ID() == EWPParameterAppID && aParameter.Value().Compare( KNSmlDsProvisioningDMAppIdVal ) == 0 )
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateDsSettings;
+
+ GetTitleL();
+
+ CNSmlDsProfileElement* dsProfileElement = new(ELeave) CNSmlDsProfileElement;
+ CleanupStack::PushL( dsProfileElement );
+
+ dsProfileElement->iDisplayName = KNSmlDsProvisioningDefName().AllocL();
+ dsProfileElement->iServerAlertedAction = ESmlConfirmSync;
+
+ dsProfileElement->iVisitParameter = 0;
+
+ iProfiles.AppendL( dsProfileElement );
+
+ iProfiles[iProfiles.Count()-1]->iProtocolVersion = ESmlVersion1_2;
+ CleanupStack::Pop( dsProfileElement );
+ }
+ else
+ {
+ iState = CNSmlDsProvisioningAdapter::EStateNull;
+ }
+ }
+ else if( iState == CNSmlDsProvisioningAdapter::EStateDsSettings )
+ {
+ switch ( aParameter.ID() )
+ {
+ case EWPParameterName:
+ case EWPParameterName1:
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): Name");
+ DBG_ARGS( aParameter.Value().Ptr() );
+
+ if ( iProfiles[iProfiles.Count()-1]->iDisplayName )
+ {
+ delete iProfiles[iProfiles.Count()-1]->iDisplayName;
+ iProfiles[iProfiles.Count()-1]->iDisplayName = NULL;
+ }
+ /*parameter exceeding 50 characters truncate to 50 and save the item*/
+ if(aParameter.Value().Length()>50)
+ {
+ TPtrC ptr2 = aParameter.Value().Left(50);
+ iProfiles[iProfiles.Count()-1]->iDisplayName = ptr2.AllocL();
+ }
+ else
+ iProfiles[iProfiles.Count()-1]->iDisplayName = aParameter.Value().AllocL();
+
+
+ /* parameter is NULL set to default value*/
+ num = iProfiles[iProfiles.Count()-1]->iDisplayName->Length();
+
+
+ TInt i;
+ /*check for white spaces, If all characters are white spaces set to default*/
+ TPtr temp = iProfiles[iProfiles.Count()-1]->iDisplayName->Des();
+ for(i=0; i<iProfiles[iProfiles.Count()-1]->iDisplayName->Length(); i++)
+ {
+
+
+ if(temp[i] != ' ')
+ break;
+ }
+
+ if(i == num || num == 0 )
+ flag =1;
+
+ if(flag)
+ {
+ if ( iProfiles[iProfiles.Count()-1]->iDisplayName )
+ {
+ delete iProfiles[iProfiles.Count()-1]->iDisplayName;
+ iProfiles[iProfiles.Count()-1]->iDisplayName = NULL;
+ }
+ iProfiles[iProfiles.Count()-1]->iDisplayName = KNSmlDsProvisioningDefName().AllocL();
+ }
+ }
+ break;
+
+ case EWPParameterToProxy:
+ _DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): ToProxy");
+ case EWPParameterToNapID:
+ case EWPParameterToNapID1:
+ {
+ TPtrC ptrToNapID(aParameter.Value());
+ if(ptrToNapID.CompareF(KInternetString)==0)
+ iToNapIDInternetIndicator = ETrue;
+ }
+ break;
+
+ case EWPParameterPortNbr:
+ case EWPParameterPortNbr1:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): PortNbr");
+ DBG_ARGS( aParameter.Value().Ptr() );
+ iProfiles[iProfiles.Count()-1]->iPort = aParameter.Value().AllocL();
+ break;
+
+ case EWPParameterAddr:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): Addr");
+ DBG_ARGS( aParameter.Value().Ptr() );
+ iProfiles[iProfiles.Count()-1]->iHostAddress = aParameter.Value().AllocL();
+ break;
+
+ case EWPParameterProviderID:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): ProviderId");
+ DBG_ARGS( aParameter.Value().Ptr() );
+ if(aParameter.Value().Length()<=150)
+ {
+ iProfiles[iProfiles.Count()-1]->iServerId = ConvertTo8LC( aParameter.Value() ).AllocL();
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+ break;
+
+ case EWPParameterAProtocol:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): AProtocol:Version");
+ DBG_ARGS( aParameter.Value().Ptr() );
+ //TPtrC ptr(aParameter.Value());
+ if(aParameter.Value().Compare(KNSmlVersion112)==0)
+ {
+ iProfiles[iProfiles.Count()-1]->iProtocolVersion = ESmlVersion1_1_2;
+ }
+
+ else
+ if(aParameter.Value().Compare(KNSmlVersion11)==0)
+ {
+ iProfiles[iProfiles.Count()-1]->iProtocolVersion = ESmlVersion1_1_2;
+ }
+
+ else
+ {
+ iProfiles[iProfiles.Count()-1]->iProtocolVersion = ESmlVersion1_2;
+ }
+
+
+
+ break;
+ default:
+ break;
+ }
+
+ }
+ else if( iState == CNSmlDsProvisioningAdapter::EStateAppAuth )
+ {
+ switch ( aParameter.ID() )
+ {
+ case EWPParameterAAuthType:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): AuthType");
+ DBG_ARGS( aParameter.Value().Ptr() );
+ if (( aParameter.Value().Compare( KNSmlDSProvisioningHTTPBasic ) == 0 ) ||
+ ( aParameter.Value().Compare( KNSmlDSProvisioningHTTPDigest ) == 0 ))
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): HTTP");
+ iAuthLevel = CNSmlDsProvisioningAdapter::EHttp;
+ }
+ break;
+
+ case EWPParameterAAuthName:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): AuthName");
+ DBG_ARGS( aParameter.Value().Ptr() );
+ if(aParameter.Value().Length()<=80)
+ {
+ if ( iAuthLevel == CNSmlDsProvisioningAdapter::EHttp )
+ {
+ iProfiles[iProfiles.Count()-1]->iHTTPUserName = ConvertTo8LC( aParameter.Value() ).AllocL();
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+ else
+ {
+ iProfiles[iProfiles.Count()-1]->iUsername = ConvertTo8LC( aParameter.Value() ).AllocL();
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+ }
+ break;
+
+ case EWPParameterAAuthSecret:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): AuthSecret");
+ DBG_ARGS(aParameter.Value().Ptr());
+ if(aParameter.Value().Length()<=22)
+ {
+ if ( iAuthLevel == CNSmlDsProvisioningAdapter::EHttp )
+ {
+ iProfiles[iProfiles.Count()-1]->iHTTPPassword = ConvertTo8LC( aParameter.Value() ).AllocL();
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+ else
+ {
+ iProfiles[iProfiles.Count()-1]->iPassword = ConvertTo8LC( aParameter.Value() ).AllocL();
+ CleanupStack::PopAndDestroy(); // ConvertTo8LC
+ }
+ iState = CNSmlDsProvisioningAdapter::EStateDsSettings;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ else if( iState == CNSmlDsProvisioningAdapter::EStateResource )
+ {
+ TInt iDataProvElementCount = iProfiles[iProfiles.Count()-1]->iDataProvElement.Count();
+ if( iDataProvElementCount == 0 )
+ {
+ CNSmlDataProviderElement* dataProviderElement = new(ELeave) CNSmlDataProviderElement;
+ CleanupStack::PushL( dataProviderElement );
+ iProfiles[iProfiles.Count()-1]->iDataProvElement.AppendL( dataProviderElement );
+ CleanupStack::Pop( dataProviderElement );
+ }
+ else if ( (iProfiles[iProfiles.Count()-1]->iDataProvElement[iDataProvElementCount-1]->iRemoteDBUri != 0) &&
+ (iProfiles[iProfiles.Count()-1]->iDataProvElement[iDataProvElementCount-1]->iUid != 0) &&
+ ( ( aParameter.ID() == EWPParameterURI ) || ( aParameter.ID() == EWPParameterAAccept ) ) )
+ {
+ // another resource element recognized
+ CNSmlDataProviderElement* dataProviderElement = new(ELeave) CNSmlDataProviderElement;
+ CleanupStack::PushL( dataProviderElement );
+ iProfiles[iProfiles.Count()-1]->iDataProvElement.AppendL( dataProviderElement );
+ CleanupStack::Pop( dataProviderElement );
+ }
+
+ switch ( aParameter.ID() )
+ {
+ case EWPParameterName:
+ case EWPParameterName1:
+ break;
+
+ case EWPParameterURI:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): RemoteDBURI");
+ DBG_ARGS( aParameter.Value().Ptr() );
+ if(aParameter.Value().Length() <= 125)
+ {
+ iProfiles[iProfiles.Count()-1]->iDataProvElement[iProfiles[iProfiles.Count()-1]->iDataProvElement.Count()-1]->iRemoteDBUri =
+ aParameter.Value().AllocL();
+ }
+ break;
+
+ case EWPParameterAAccept:
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): AAccept (mime)");
+ StoreAttributesL( aParameter.Value() );
+ iState = CNSmlDsProvisioningAdapter::EStateDsSettings;
+ break;
+ default:
+ break;
+ }
+ }
+
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::VisitLinkL
+// -----------------------------------------------------------------------------
+void CNSmlDsProvisioningAdapter::VisitLinkL( CWPCharacteristic& aParameter)
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitLinkL(): begin");
+
+ if( ( ( aParameter.Type()==KWPNapDef ) || ( aParameter.Type()==KWPPxLogical ) ) &&
+ ( iState != CNSmlDsProvisioningAdapter::EStateNull ) )
+ {
+ if( iProfiles.Count() > 0 )
+ {
+ iProfiles[iProfiles.Count()-1]->iVisitParameter = &aParameter;
+ }
+ }
+ _DBG_FILE("CNSmlDsProvisioningAdapter::VisitLinkL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::ContextExtension
+// -----------------------------------------------------------------------------
+TInt CNSmlDsProvisioningAdapter::ContextExtension( MWPContextExtension*& aContextExtension )
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::ContextExtension(): begin");
+ aContextExtension = this;
+ _DBG_FILE("CNSmlDsProvisioningAdapter::ContextExtension(): end");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::SaveDataL
+// -----------------------------------------------------------------------------
+const TDesC8& CNSmlDsProvisioningAdapter::SaveDataL( TInt aIndex ) const
+ {
+ return iProfiles[aIndex]->iProfileId;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::DeleteL
+// -----------------------------------------------------------------------------
+void CNSmlDsProvisioningAdapter::DeleteL( const TDesC8& aSaveData)
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::DeleteL(): begin");
+ TPckgBuf<TInt> uid;
+ uid.Copy( aSaveData );
+ iSession.DeleteProfileL( uid() );
+ _DBG_FILE("CNSmlDsProvisioningAdapter::DeleteL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::Uid
+// -----------------------------------------------------------------------------
+TUint32 CNSmlDsProvisioningAdapter::Uid() const
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::Uid(): begin");
+ return KNSmlDsProvisioningAdapterImplUid;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::DetailsL( )
+// -----------------------------------------------------------------------------
+TInt CNSmlDsProvisioningAdapter::DetailsL( TInt /*aItem*/, MWPPairVisitor& /*aVisitor*/ )
+ {
+ return KErrNotSupported;
+ }
+
+// -------------------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::GetDefaultIAPL()
+// Gets the default NAPId
+// -------------------------------------------------------------------------------------
+TInt CNSmlDsProvisioningAdapter::GetDefaultIAPL()
+ {
+ TInt iapId = KErrNotFound;
+
+ CCommsDatabase* database = CCommsDatabase::NewL();
+ CleanupStack::PushL( database );
+
+ CCommsDbTableView* tableView = database->OpenTableLC( TPtrC( IAP ) );
+
+ TInt errorCode = tableView->GotoFirstRecord();
+
+ if ( errorCode == KErrNone )
+ {
+ TUint32 value;
+ tableView->ReadUintL( TPtrC( COMMDB_ID ), value );
+ iapId = value;
+ }
+
+ CleanupStack::PopAndDestroy( 2 ); // database, tableView
+
+ return iapId;
+ }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDsProvisioningAdapter::CombineURILC()
+// Combines address and port to URI
+// ------------------------------------------------------------------------------------------------
+TInt CNSmlDsProvisioningAdapter::CombineURILC( const TDesC& aAddr, const TDesC& aPort, HBufC*& aRealURI )
+ {
+ TInt offset = 0;
+ TInt i = 0;
+ if( aAddr.Find( KNSmlDsProvisioningHTTP ) == 0 )
+ {
+ offset = KNSmlDsProvisioningHTTP().Length();
+ }
+ else if( aAddr.Find( KNSmlDsProvisioningHTTPS ) == 0 )
+ {
+ offset = KNSmlDsProvisioningHTTPS().Length();
+ }
+
+ // after skipping double slashes seek next single slash
+ for( i = offset; i < aAddr.Length(); i++ )
+ {
+ if( aAddr[i] == KNSmlDMUriSeparator )
+ {
+ break;
+ }
+ }
+
+ aRealURI = HBufC::NewLC( aAddr.Length() + aPort.Length() + 1 );
+ TPtr uriPtr = aRealURI->Des();
+
+ uriPtr.Copy( aAddr.Ptr(), i );
+ uriPtr.Append( KNSmlDMColon );
+ uriPtr.Append( aPort );
+ uriPtr.Append( aAddr.Right( aAddr.Length() - i ) );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// CNSmlDsProvisioningAdapter::StoreAttributesL
+// ---------------------------------------------------------
+void CNSmlDsProvisioningAdapter::StoreAttributesL( const TDesC& aType )
+ {
+ _DBG_FILE("CNSmlDsProvisioningAdapter::StoreAttributesL(): begin");
+
+ TInt iDataProvElementCount = iProfiles[iProfiles.Count()-1]->iDataProvElement.Count()-1;
+ // Leave if aType cannot be assigned
+ if( ( aType.Length() > 0 ) &&
+ ( iProfiles[iProfiles.Count()-1]->iDataProvElement[iDataProvElementCount]->iRemoteDBUri ) )
+ {
+ // look through every implementation adapter until one found
+ // which supports MIME type in question
+
+ // The first one located in ROM is chosen. If none found in ROM then
+ // the first adapter found is chosen.
+
+ HBufC8 *type = HBufC8::NewLC(aType.Size());
+ TPtr8 typePtr = type->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( typePtr, aType);
+
+ TBool dataProvIdFoundInZ = FALSE;
+ TSmlDataProviderId firstDataProvIdFound = 0;
+ TSmlDataProviderId uidFound = 0;
+
+ // get list of dataproviderIds
+ RImplInfoPtrArray implArray;
+ CleanupStack::PushL( PtrArrCleanupItemRArr( CImplementationInformation, &implArray ) );
+ TUid ifUid = { KNSmlDSInterfaceUid };
+ REComSession::ListImplementationsL( ifUid, implArray );
+
+ TInt countProviders = implArray.Count();
+ for( TInt i = 0; i < countProviders; i++ )
+ {
+ CImplementationInformation* implInfo = implArray[i];
+
+ RSyncMLDataProvider dataProvider;
+ dataProvider.OpenL( iSession, implInfo->ImplementationUid().iUid );
+ CleanupClosePushL( dataProvider );
+
+ TInt mimeTypeCount = dataProvider.MimeTypeCount();
+ for( TInt j = 0; j < mimeTypeCount; j++ )
+ {
+ HBufC* mimeType = dataProvider.MimeType( j ).AllocLC();
+ TPtrC8 convMimeType = ConvertTo8LC( *mimeType );
+ if( typePtr.Find( convMimeType ) == 0)
+ {
+ // MIME type in question was found
+ uidFound = implInfo->ImplementationUid().iUid;
+
+ if( firstDataProvIdFound == 0 )
+ {
+ // save the first in case of none found from ROM
+ firstDataProvIdFound = uidFound;
+ }
+
+ // check whether the provider is located in ROM (drive Z)
+ if( implInfo->Drive() == EDriveZ )
+ {
+ dataProvIdFoundInZ = TRUE;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(2); // mimetype, ConvertTo8LC
+
+ if( uidFound )
+ {
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); // dataProvider
+
+ if ( dataProvIdFoundInZ )
+ {
+ break;
+ }
+ else
+ {
+ uidFound = firstDataProvIdFound;
+ }
+ }
+
+ REComSession::FinalClose();
+ CleanupStack::PopAndDestroy( 2 ); // type, implArray
+
+ if( uidFound )
+ {
+ iProfiles[iProfiles.Count()-1]->iDataProvElement[iDataProvElementCount]->iUid = uidFound;
+ }
+ }
+
+ _DBG_FILE("CNSmlDsProvisioningAdapter::StoreAttributesL(): end");
+ }
+
+// ---------------------------------------------------------
+// CNSmlDsProvisioningAdapter::GetTitleL
+// ---------------------------------------------------------
+void CNSmlDsProvisioningAdapter::GetTitleL()
+ {
+ if( iTitle == 0 )
+ {
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs );
+
+ TFileName fileName;
+ TParse parse;
+ parse.Set( KNSmlDsPovisioningDirAndResource, &KDC_RESOURCE_FILES_DIR, NULL );
+ fileName = parse.FullName();
+
+ RResourceFile resourceFile;
+ BaflUtils::NearestLanguageFile( fs, fileName );
+ resourceFile.OpenL( fs, fileName );
+ CleanupClosePushL( resourceFile );
+
+ HBufC8* dataBuffer = resourceFile.AllocReadLC( R_SYNC_PROVISIONING_TITLE );
+
+ TResourceReader reader;
+ reader.SetBuffer( dataBuffer );
+ iTitle = reader.ReadHBufC16L();
+ CleanupStack::PopAndDestroy( 3 ); //fs, resourcefile, databuffer
+ }
+ }
+
+// ---------------------------------------------------------
+// CNSmlDsProvisioningAdapter::ConvertTo8LC()
+// Converts string value to 8-bit
+// ---------------------------------------------------------
+TDesC8& CNSmlDsProvisioningAdapter::ConvertTo8LC( const TDesC& aSource )
+ {
+ HBufC8* buf = HBufC8::NewLC( aSource.Length()*2 );
+ TPtr8 bufPtr = buf->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( bufPtr, aSource );
+
+ return *buf;
+ }
+
+// ---------------------------------------------------------
+// CNSmlDsProvisioningAdapter::ConvertTo8L()
+// Converts string value to 8-bit
+// ---------------------------------------------------------
+TDesC8& CNSmlDsProvisioningAdapter::ConvertTo8L( const TDesC& aSource )
+ {
+ HBufC8* buf = HBufC8::NewL( aSource.Length()*2 );
+ TPtr8 bufPtr = buf->Des();
+ CnvUtfConverter::ConvertFromUnicodeToUtf8( bufPtr, aSource );
+
+ return *buf;
+ }
+
+
+// End of File