diff -r 000000000000 -r 667063e416a2 supl/locationomasuplprotocolhandler/syncmlprovhandler/src/epos_comasupldmrepository.cpp --- /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 + +#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; + + } + } +