--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/supl/locationomasuplprotocolhandler/syncmlprovhandler/src/epos_comasupldmrepository.cpp Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,636 @@
+/*
+ * 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: SUPL settings respository class
+ *
+ */
+
+
+
+
+#include <utf.h>
+
+#include "epos_comasupltrace.h"
+#include "epos_comasupldmrepository.h"
+
+#include "epos_csuplsettingparams.h"
+#include "epos_tomasuplsettingsmap.h"
+
+_LIT( KTraceSuplDmRepository, "epos_comasupldmrepository.cpp" );
+
+const TInt KMaxBufferLength = 255 ;
+
+//integer values used to set or reset a boolen flag ti indicate which parameters were set NULL
+const TInt KNameBitMask = 1;
+const TInt KPrefConRefBitMask = 2;
+const TInt KProvIdBitMask = 4;
+const TInt KSlpBitMask = 8;
+const TInt KToConRefBitMask = 32;
+const TInt KConRefBitMask = 64;
+const TInt KAddrTypeBitMask = 128;
+
+// -----------------------------------------------------------------------------
+// COMASuplSettingsRepository::NewL
+// Factory method that creates an instance of COMASuplSettings
+// -----------------------------------------------------------------------------
+//
+COMASuplDMRepository* COMASuplDMRepository::NewL()
+ {
+ COMASuplDMRepository* self = new ( ELeave ) COMASuplDMRepository();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+// -----------------------------------------------------------------------------
+//
+COMASuplDMRepository::~COMASuplDMRepository()
+ {
+ if(iSettings)
+ {
+ delete iSettings;
+ iSettings = NULL;
+ }
+ if(iTrace)
+ {
+ delete iTrace;
+ iSettings = NULL;
+ }
+ if(iServerAddress)
+ {
+ delete iServerAddress;
+ iServerAddress = NULL;
+ }
+ if(iIapName)
+ {
+ delete iIapName;
+ iIapName = NULL;
+ }
+ if(iServerId)
+ {
+ delete iServerId;
+ iServerId = NULL;
+ }
+
+ if(iIap1)
+ {
+ delete iIap1;
+ iIap1 = NULL;
+ }
+
+ if(iIap2)
+ {
+ delete iIap2;
+ iIap2 = NULL;
+ }
+
+ if(iSlp)
+ {
+ delete iSlp;
+ iSlp = NULL;
+ }
+
+ if(iServerAddType)
+ {
+ delete iServerAddType;
+ iServerAddType = NULL;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// Retrieves IAP name
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::GetIAPNameLC( TDesC8*& aIAP )
+ {
+
+ iTrace->Trace( _L("COMASuplDMRepository::GetIAPNameLC - Start"),
+ KTraceSuplDmRepository, __LINE__ );
+
+
+ CServerParams* paramValues = CServerParams::NewL();
+ CleanupStack::PushL(paramValues);
+ TInt64 slpId;
+ HBufC* serverAddress = HBufC::NewLC(KMaxBufferLength);
+ HBufC* iapName = HBufC::NewLC(KMaxBufferLength);
+ TBool serverEnabled;
+ TBool simChangeRemove;
+ TBool usageInHomeNw;
+ TBool editable;
+
+ TInt err = iSettings->GetDefaultServer( paramValues );
+
+
+ if ( KErrNone != err)
+ {
+ TBuf<64> errcode;
+ errcode.Append(_L("GetDefaultServer failed with error code :"));
+ errcode.AppendNum(err);
+ iTrace->Trace(errcode,KTraceSuplDmRepository, __LINE__ );
+ User::Leave( err );
+ }
+ paramValues->Get(slpId,serverAddress->Des(),iapName->Des(),serverEnabled,simChangeRemove,usageInHomeNw,editable);
+
+ HBufC8* IAPName = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *iapName );
+
+
+ aIAP = IAPName;
+ iTrace->Trace( _L("COMASuplDMRepository::GetIAPNameLC - End"),
+ KTraceSuplDmRepository, __LINE__ );
+ CleanupStack::PopAndDestroy(3);
+
+ CleanupStack::PushL( IAPName );
+ }
+
+
+// -----------------------------------------------------------------------------
+// Retrieves HSLP address
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::GetHSLPAddressLC( TDesC8*& aHSLP )
+ {
+
+ iTrace->Trace( _L("COMASuplDMRepository::GetHSLPAddressLC - Start"),
+ KTraceSuplDmRepository, __LINE__ );
+
+
+ CServerParams* paramValues = CServerParams::NewL();
+ CleanupStack::PushL(paramValues);
+ TInt64 slpId;
+ HBufC* serverAddress = HBufC::NewLC(KMaxBufferLength);
+ HBufC* iapName = HBufC::NewLC(KMaxBufferLength);
+ TBool serverEnabled;
+ TBool simChangeRemove;
+ TBool usageInHomeNw;
+ TBool editable;
+
+ TInt err = iSettings->GetDefaultServer( paramValues );
+
+ if ( KErrNone != err && KErrNotFound != err )
+ {
+ TBuf<64> errcode;
+ errcode.Append(_L("GetDefaultServer failed with error code :"));
+ errcode.AppendNum(err);
+ iTrace->Trace(errcode,KTraceSuplDmRepository, __LINE__ );
+ User::Leave( err );
+ }
+
+ paramValues->Get(slpId,serverAddress->Des(),iapName->Des(),serverEnabled,simChangeRemove,usageInHomeNw,editable);
+
+ HBufC8* HSLPAddr = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *serverAddress );
+
+
+ aHSLP = HSLPAddr;
+ iTrace->Trace( _L("COMASuplDMRepository::GetHSLPAddressLC - End"),
+ KTraceSuplDmRepository, __LINE__ );
+ CleanupStack::PopAndDestroy(3);
+
+
+
+ CleanupStack::PushL( HSLPAddr );
+ }
+
+
+// -----------------------------------------------------------------------------
+// Starts an atomic transaction
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::StartTransactionL()
+ {
+#if 0
+ User::LeaveIfError( iSettings->LockSettingsL() );
+#endif
+ }
+
+
+// -----------------------------------------------------------------------------
+// Commits changes in an atomic transaction
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::CommitTransactionL()
+ {
+#if 0
+ User::LeaveIfError( iSettings->UnlockSettings() );
+#endif
+ }
+
+
+// -----------------------------------------------------------------------------
+// Reverts changes made in an atomic transaction
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::RollbackTransactionL()
+ {
+#if 0
+ User::LeaveIfError( iSettings->UnlockSettings( EFalse ) );
+#endif
+ }
+
+
+// -----------------------------------------------------------------------------
+// Saves SUPL Settings information
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::SaveL( const TDesC& aValue,TOMASuplSettingsMap::TSuplSettingType aType,TBool aIsAtomic )
+ {
+ if( !aIsAtomic )
+ {
+ StartTransactionL();
+ }
+ TRAPD( err, SaveSettingsL( aValue,aType) );
+ if( KErrNone != err )
+ {
+ if ( !aIsAtomic )
+ {
+ RollbackTransactionL();
+ }
+ User::Leave( err );
+ }
+ if ( !aIsAtomic )
+ {
+ CommitTransactionL();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+COMASuplDMRepository::COMASuplDMRepository()
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// Symbian 2nd phase constructor
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::ConstructL()
+ {
+ iSettings = CSuplSettingsInternal::NewL();
+ iTrace = COMASuplTrace::NewL();
+ iState = ENotInitialized;
+ iSlpId = -1;
+ iServerAddress = HBufC::NewL(KMaxBufferLength);
+ iIapName = HBufC::NewL(KMaxBufferLength);
+ iServerId = HBufC::NewL(KMaxBufferLength);
+ iIap1 = HBufC::NewL(KMaxBufferLength);
+ iIap2 = HBufC::NewL(KMaxBufferLength);
+ iSlp = HBufC::NewL(KMaxBufferLength);
+ iServerAddType = HBufC::NewL(KMaxBufferLength);
+ iNullMask = 0;
+ }
+
+
+// -----------------------------------------------------------------------------
+// Saves SUPL Settings information
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::SaveSettingsL( const TDesC& aValue,TOMASuplSettingsMap::TSuplSettingType aType)
+ {
+
+ iTrace->Trace( _L( "COMASuplSettingsRepository::SaveL() Start" ),
+ KTraceSuplDmRepository, __LINE__ );
+
+ if( iState != EInitialized )
+ {
+ iSettings->Initialize( iStatus );
+ User::WaitForRequest( iStatus );
+
+ if ( KErrNone != iStatus.Int() )
+ {
+ iTrace->Trace( _L( "Error Initializing SUPL Settings" ),
+ KTraceSuplDmRepository, __LINE__ );
+
+ User::Leave( KErrNotReady );
+ }
+ iState = EInitialized;
+ }
+
+ switch(aType)
+ {
+ case TOMASuplSettingsMap::EName :
+ {
+ if ( aValue.Length() )
+ {
+ iTrace->Trace( _L( "Received Server Address of no zero length" ),
+ KTraceSuplDmRepository, __LINE__ );
+ *iServerAddress = aValue;
+ CServerParams* paramValues = CServerParams::NewL();
+ CleanupStack::PushL(paramValues);
+ TInt err = paramValues->Set(*iServerAddress,*iIapName);
+ err = iSettings->AddNewServer(paramValues,iSlpId);
+ if(err == KErrAlreadyExists)
+ {
+ TInt getErr = iSettings->GetSlpInfoAddress(*iServerAddress,paramValues);
+ if(getErr == KErrNone)
+ {
+ HBufC* servername = HBufC::NewLC(KMaxBufferLength);
+ HBufC* iapName = HBufC::NewL(KMaxBufferLength);
+ TBool serverEnabled;
+ TBool simChangeRemove;
+ TBool usageInHomeNw;
+ TBool editable;
+
+ paramValues->Get(iSlpId,servername->Des(),iapName->Des(),serverEnabled,simChangeRemove,usageInHomeNw,editable);
+ delete iapName;
+ CleanupStack::PopAndDestroy();//servername
+ }
+ }
+
+ if ((err == KErrNone || err == KErrAlreadyExists) && iSlpId!= -1)
+ iSettings->SetTopPriority(iSlpId);
+
+
+ if (err!=KErrNone && err != KErrAlreadyExists)
+ {
+ TBuf<64> errcode;
+ errcode.Append(_L( "Error updating SUPL settings" ));
+ errcode.AppendNum(err);
+ iTrace->Trace( errcode,KTraceSuplDmRepository, __LINE__ );
+ User::Leave( err );
+ }
+ CleanupStack::PopAndDestroy(1); //params
+ }
+ else
+ {
+ iTrace->Trace( _L( "Server Name is NULL" ),
+ KTraceSuplDmRepository, __LINE__ );
+ iNullMask |= KNameBitMask;
+ }
+ }
+ break;
+ case TOMASuplSettingsMap::EPrefConRef :
+ {
+ if( aValue.Length() )
+ {
+ iTrace->Trace( _L( "Received EPrefConRef of non zero length" ),
+ KTraceSuplDmRepository, __LINE__ );
+ }
+ else
+ {
+ iTrace->Trace( _L( "EPrefConRef Name is NULL" ),
+ KTraceSuplDmRepository, __LINE__ );
+ iNullMask |= KPrefConRefBitMask;
+ }
+ *iIapName = aValue;
+ }
+ break;
+ case TOMASuplSettingsMap::EProviderId :
+ {
+ if( aValue.Length() )
+ {
+ iTrace->Trace( _L( "Received ProviderId of non zero length" ),
+ KTraceSuplDmRepository, __LINE__ );
+
+ }
+ else
+ {
+ iTrace->Trace( _L( "Provider Id is NULL" ),
+ KTraceSuplDmRepository, __LINE__ );
+ iNullMask |= KProvIdBitMask;
+ }
+ *iServerId = aValue;
+ }
+ break;
+ case TOMASuplSettingsMap::ESlp:
+ {
+ if( aValue.Length() )
+ {
+ iTrace->Trace( _L( "Received name of non zero length" ),
+ KTraceSuplDmRepository, __LINE__ );
+ }
+ else
+ {
+ iTrace->Trace( _L( "name is NULL" ),
+ KTraceSuplDmRepository, __LINE__ );
+ iNullMask |= KSlpBitMask;
+ }
+ *iSlp = aValue;
+ }
+ break;
+ case TOMASuplSettingsMap::EToConRef :
+ {
+ if( aValue.Length() )
+ {
+ iTrace->Trace( _L( "Received IAP1 of non zero length" ),
+ KTraceSuplDmRepository, __LINE__ );
+ }
+ else
+ {
+ iTrace->Trace( _L( "IAP1 is NULL" ),
+ KTraceSuplDmRepository, __LINE__ );
+ iNullMask |= KToConRefBitMask;
+ }
+ *iIap1 = aValue;
+ }
+ break;
+ case TOMASuplSettingsMap::EConRef :
+ {
+ if( aValue.Length() )
+ {
+ iTrace->Trace( _L( "Received name of non zero length" ),
+ KTraceSuplDmRepository, __LINE__ );
+ }
+ else
+ {
+ iTrace->Trace( _L( "IAP2 is NULL" ),
+ KTraceSuplDmRepository, __LINE__ );
+ iNullMask |= KConRefBitMask;
+ }
+ *iIap2 = aValue;
+ }
+ break;
+ case TOMASuplSettingsMap::EAddrType :
+ {
+ if( aValue.Length() )
+ {
+ iTrace->Trace( _L( "Received Address type of non zero length" ),
+ KTraceSuplDmRepository, __LINE__ );
+ }
+ else
+ {
+ iTrace->Trace( _L( "Address type is NULL" ),
+ KTraceSuplDmRepository, __LINE__ );
+ iNullMask |= KAddrTypeBitMask;
+ }
+ *iServerAddType = aValue;
+ }
+ break;
+ }
+
+
+
+
+ if(iSlpId != -1) // a server name was received and added now add buffered values,if any to database
+ {
+ if(iIapName->Length() != 0 || iNullMask & KPrefConRefBitMask)// if IAP Name was recieved add it to the settings DB
+ {
+ iSettings->SetIapName(iSlpId,*iIapName);
+ iSettings->SetTopPriority(iSlpId);
+ }
+
+
+ if(iServerId->Length() != 0 && iIap1->Length() != 0 && iIap2->Length() != 0 &&
+ iSlp->Length() != 0 && iServerAddType->Length() != 0) // if all extended parameters exist add to settings DB directly
+ {
+ CServerExtensionParams* params = CServerExtensionParams::NewL();
+ TInt err=params->Set( iServerId->Des(),iIap1->Des(),iIap2->Des(),iSlp->Des(),iServerAddType->Des());
+
+ iSettings->SetServerExtensionParams(iSlpId,params);
+ iSettings->SetTopPriority(iSlpId);
+ delete params;
+
+ User::LeaveIfError(err);
+
+ }
+ // if 1 or more extended parameters exist but not all of them add to settings DB after retrieving existing params
+ else if(iServerId->Length() != 0 || iIap1->Length() != 0 || iIap2->Length() != 0 ||
+ iSlp->Length() != 0 || iServerAddType->Length() != 0 || iNullMask)
+ {
+ CServerExtensionParams* params = CServerExtensionParams::NewLC();
+
+ iSettings->GetServerExtensionParams(iSlpId,params); //get the already set parameters
+
+ HBufC* serverid=HBufC::NewLC(KMaxBufferLength);
+ HBufC* iap1=HBufC::NewLC(KMaxBufferLength);
+ HBufC* iap2=HBufC::NewLC(KMaxBufferLength);
+ HBufC* serveradd=HBufC::NewLC(KMaxBufferLength);
+ HBufC* serveraddtype=HBufC::NewLC(KMaxBufferLength);
+ params->Get(serverid->Des(),iap1->Des(),iap2->Des(),serveradd->Des(),serveraddtype->Des());
+
+ if(iServerId->Length() == 0 && !(iNullMask & KProvIdBitMask))
+ {
+ *iServerId = *serverid;
+ }
+ if(iIap1->Length() == 0 && !(iNullMask & KToConRefBitMask))
+ {
+ *iIap1 = *iap1;
+ }
+ if(iIap2->Length() == 0 && !(iNullMask & KConRefBitMask))
+ {
+ *iIap2 = *iap2;
+ }
+ if(iSlp->Length() == 0 && !(iNullMask & KSlpBitMask))
+ {
+ *iSlp = *serveradd;
+ }
+ if(iServerAddType->Length() == 0 && !(iNullMask & KAddrTypeBitMask))
+ {
+ *iServerAddType = *serveraddtype;
+ }
+ CleanupStack::PopAndDestroy(5);//serverid,iap1,iap2,serveradd,serveraddtype
+
+ TInt err=params->Set( iServerId->Des(),iIap1->Des(),iIap2->Des(),iSlp->Des(),iServerAddType->Des());
+
+ iSettings->SetServerExtensionParams(iSlpId,params);
+ iSettings->SetTopPriority(iSlpId);
+ CleanupStack::PopAndDestroy(1);//params
+ User::LeaveIfError(err);
+
+ }
+
+ }
+
+
+
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplDMRepository::GetExtnParamsLC(TDesC8*& aValue,TSuplDMExtnParamType aType)
+// Retrieves SUPL Settings Extended Params information
+//
+// -----------------------------------------------------------------------------
+//
+void COMASuplDMRepository::GetExtnParamsLC(TDesC8*& aValue,TOMASuplSettingsMap::TSuplSettingType aType)
+ {
+ TInt64 defaultSlpId = -1;
+ TInt err = iSettings->GetDefaultSlpId(defaultSlpId);
+ User::LeaveIfError(err);
+ CServerExtensionParams* servExtnParams = CServerExtensionParams::NewLC();
+ err = iSettings->GetServerExtensionParams(defaultSlpId,servExtnParams);
+ User::LeaveIfError(err);
+
+ HBufC* serverid=HBufC::NewLC(KMaxBufferLength);
+ HBufC* iap1=HBufC::NewLC(KMaxBufferLength);
+ HBufC* iap2=HBufC::NewLC(KMaxBufferLength);
+ HBufC* serveradd=HBufC::NewLC(KMaxBufferLength);
+ HBufC* serveraddtype=HBufC::NewLC(KMaxBufferLength);
+ servExtnParams->Get(serverid->Des(),iap1->Des(),iap2->Des(),serveradd->Des(),serveraddtype->Des());
+ switch(aType)
+ {
+ case TOMASuplSettingsMap::EProviderId:
+ {
+ HBufC8* provId = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *serverid );
+ aValue = provId;
+
+ CleanupStack::PopAndDestroy(6);//serverid,iap1,iap2,serveradd,serveraddtype,servExtnParams
+ CleanupStack::PushL(provId);
+ }
+ break;
+ case TOMASuplSettingsMap::ESlp:
+ {
+ HBufC8* slpAdd = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *serveradd );
+ aValue = slpAdd;
+
+ CleanupStack::PopAndDestroy(6);//serverid,iap1,iap2,serveradd,serveraddtype,servExtnParams
+ CleanupStack::PushL(slpAdd);
+ }
+ break;
+ case TOMASuplSettingsMap::EToConRef:
+ {
+ HBufC8* toConRef = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *iap1 );
+ aValue = toConRef;
+
+ CleanupStack::PopAndDestroy(6);//serverid,iap1,iap2,serveradd,serveraddtype,servExtnParams
+ CleanupStack::PushL(toConRef);
+ }
+ break;
+ case TOMASuplSettingsMap::EConRef:
+ {
+ HBufC8* conRef = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *iap2 );
+ aValue = conRef;
+
+ CleanupStack::PopAndDestroy(6);//serverid,iap1,iap2,serveradd,serveraddtype,servExtnParams
+ CleanupStack::PushL(conRef);
+ }
+ break;
+ case TOMASuplSettingsMap::EAddrType:
+ {
+ HBufC8* addrType = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *serveraddtype );
+ aValue = addrType;
+
+ CleanupStack::PopAndDestroy(6);//serverid,iap1,iap2,serveradd,serveraddtype,servExtnParams
+ CleanupStack::PushL(addrType);
+ }
+ break;
+
+ }
+ }
+