diff -r 000000000000 -r 8e480a14352b messagingfw/biomsgfw/IACPSRC/ISPP.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/biomsgfw/IACPSRC/ISPP.CPP Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,566 @@ +// Copyright (c) 1998-2009 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: +// Internet Service Provider Settings +// +// + +#include "BSP.H" +#include "IACP.H" +#include "ISPP.H" +#include "IACPDEF.H" +#include "IACPERR.H" + +_LIT(KIacpProxyProtocolName, "HTTP"); +_LIT(KCharOne,"1"); +// +// Constructor +// +CIspParser::CIspParser(TInt aSmsType) +:iSmsType(aSmsType) + { + __ASSERT_DEBUG((iSmsType==CIacSettingsParser::EBasicIAP ||iSmsType==CIacSettingsParser::EBasicMailIAP || + iSmsType==CIacSettingsParser::EExtendedIAP), + User::Panic(KIACP, KIacpUnknownSmsType)); + } + +// +// Factory fns +// +CIspParser* CIspParser::NewLC(TInt aSmsType) + { + CIspParser* self=new (ELeave) CIspParser(aSmsType); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CIspParser* CIspParser::NewL(TInt aSmsType) + { + CIspParser* self=CIspParser::NewLC(aSmsType); + CleanupStack::Pop(); + return self; + } + +// +// 2nd stage of construction +// +void CIspParser::ConstructL() + { + iLoginPrompt=ETrue; //Mandatory Data + iSecureProxy=EFalse; + iDbSession = CMDBSession::NewL(CMDBSession::LatestVersion()); + + iAddr = CIpAddress::NewL(); + iDNS1 = CIpAddress::NewL(); + iDNS2 = CIpAddress::NewL(); + iNetMask = CIpAddress::NewL(); + iGateway = CIpAddress::NewL(); + + iProxyExeptions = CIpAddress::NewL(); + iProxyServerName = CIpAddress::NewL(); + iSecureProxySrv = CIpAddress::NewL(); + } + +// +// Destruction +// +CIspParser::~CIspParser() + { + delete iName; + delete iDefaultTelNum; + delete iLoginName; + delete iLoginPass; + delete iAddr; + delete iNetMask; + delete iGateway; + delete iDNS1; + delete iDNS2; + delete iModemInit; + + //Extended IAP data (Proxies Table) + delete iProxyExeptions; + delete iProxyServerName; + delete iSecureProxySrv; + delete iLoginCustomisation; + + delete iDbSession; + } + + +void CIspParser::CheckMandatoryFieldsL(CParsedFieldCollection& aIacpFields) + { + if (aIacpFields.GetFieldValue(SMS_ISP_I_NAME).Length()==0 ) + User::Leave(KIacpMandatoryDataNotSet); + } + + +// +// +// +void CIspParser::ParseL(CParsedFieldCollection& aIacpFields) + { + TPtrC aFieldValueBuf; + + if (aIacpFields.GetFieldValueAndLength(SMS_ISP_I_NAME, aFieldValueBuf) != 0) + { + delete iName; + iName = NULL; + iName = aFieldValueBuf.AllocL(); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_DEFAULT_TEL_NUM, aFieldValueBuf) != 0) + { + delete iDefaultTelNum; + iDefaultTelNum = NULL; + iDefaultTelNum= aFieldValueBuf.AllocL(); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_LOGIN_NAME, aFieldValueBuf) != 0) + { + delete iLoginName; + iLoginName = NULL; + iLoginName= aFieldValueBuf.AllocL(); + } + + if (aIacpFields.FieldNameExists(SMS_LOGIN_PASS)) + { + //should recheck for - if (aIacpFields.GetFieldValueAndLength(SMS_LOGIN_PASS, aFieldValueBuf) != 0) + //to set it if it exists if it doesn't it needs resetting + if (aIacpFields.GetFieldValueAndLength(SMS_LOGIN_PASS, aFieldValueBuf)) + { + delete iLoginPass; + iLoginPass = NULL; + iLoginPass= aFieldValueBuf.AllocL(); + } + } + + if (aIacpFields.GetFieldValueAndLength(SMS_PROMPT_FOR_LOGIN, aFieldValueBuf) != 0) + aIacpFields.GetTBoolL(aFieldValueBuf,iLoginPrompt); + else if((iLoginName) && (iLoginPass) ) + iLoginPrompt=EFalse; // if both the login Name and password are specified then this should be set to EFalse + + if (aIacpFields.GetFieldValueAndLength(SMS_IP_ADDR, aFieldValueBuf) != 0) + { + iAddr->SetAddrL(aFieldValueBuf); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_IP_NETMASK, aFieldValueBuf) != 0) + { + iNetMask->SetAddrL(aFieldValueBuf); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_IP_GATEWAY, aFieldValueBuf) != 0) + { + iGateway->SetAddrL(aFieldValueBuf); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_IP_NAME_SERVER1, aFieldValueBuf) != 0) + { + iDNS1->SetAddrL(aFieldValueBuf); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_IP_NAME_SERVER2, aFieldValueBuf) != 0) + { + iDNS2->SetAddrL(aFieldValueBuf); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_INIT_STRING, aFieldValueBuf) != 0) + { + delete iModemInit; + iModemInit = NULL; + iModemInit = HBufC8::NewL(aFieldValueBuf.Length()); + iModemInit->Des().Copy(aFieldValueBuf); + } + + //Extended IAP + if (aIacpFields.GetFieldValueAndLength(SMS_PROXY_EXCEPTIONS, aFieldValueBuf) != 0) + { + iProxyExeptions->SetAddrL(aFieldValueBuf); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_PROXY_PORT_NUMBER, aFieldValueBuf) != 0) + aIacpFields.GetTUint32NumL(aFieldValueBuf,iProxyPortNum); + + if (aIacpFields.GetFieldValueAndLength(SMS_PROXY_SERVER_NAME, aFieldValueBuf) != 0) + { + iProxyServerName->SetAddrL(aFieldValueBuf); + iSecureProxy=EFalse; + } + + if (aIacpFields.GetFieldValueAndLength(SMS_LOGIN_CUSTOMISATION, aFieldValueBuf) != 0) + { + delete iLoginCustomisation; + iLoginCustomisation = NULL; + iLoginCustomisation= aFieldValueBuf.AllocL(); + } + + if (aIacpFields.GetFieldValueAndLength(SMS_ENABLE_SW_COMP, aFieldValueBuf) != 0) + aIacpFields.GetTBoolL(aFieldValueBuf, iSWCompressionEnabled); //goes to ISP -Dial out Table fields + + if (aIacpFields.GetFieldValueAndLength(SMS_SECURE_PROXY, aFieldValueBuf) != 0) + { + iSecureProxySrv->SetAddrL(aFieldValueBuf); + iSecureProxy=ETrue; + } + + if (aIacpFields.GetFieldValueAndLength(SMS_SECURE_PORT, aFieldValueBuf) != 0) + aIacpFields.GetTUint32NumL(aFieldValueBuf,iSecurePortNum); + } +// +// +// +void CIspParser::ProcessL(CIacSettingsParser::TIacpConnectionPreferenceFlag& aConnectionPreference) + { + iNoExistingIpAddr = ETrue; + iNoExistingDNS = ETrue; + WriteToDialOutISPTableL(); + SetIapIdsL(); + if(iSmsType== CIacSettingsParser::EExtendedIAP) + { + WriteToProxiesTableL(); + } + WriteToDialOutIAPTableL(); + SetGlobalIapL(TPtrC(KCDTypeNameIAP), iRecordId); + iDialOutIap = iRecordId; + + if(aConnectionPreference == CIacSettingsParser::EIacpAttempCreateAsFirstRank || + aConnectionPreference == CIacSettingsParser::EIacpAttempCreateAsSecondRank) + { + WriteToPreferencesTableL(ECommDbConnectionDirectionOutgoing,aConnectionPreference); + } + } +void CIspParser::SetGlobalIapL(const TDesC& aTable, TUint32 aIAP) + { + CCDConnectionPrefsRecord* connectionPrefsRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdConnectionPrefsRecord)); + CleanupStack::PushL(connectionPrefsRecord); + connectionPrefsRecord->iDirection = ECommDbConnectionDirectionOutgoing; + connectionPrefsRecord->iRanking = 1; //rank 1 is like a default value + TBool recExists = connectionPrefsRecord->FindL(*iDbSession); + if (recExists) + { + TInt intValue = connectionPrefsRecord->iDefaultIAP; + if(aTable.CompareF(TPtrC(KCDTypeNameIAP)) && intValue != aIAP) + { + CCDIAPRecord* iapRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); + CleanupStack::PushL(iapRecord); + iapRecord->iRecordTag = intValue; + recExists = iapRecord->FindL(*iDbSession); + CleanupStack::PopAndDestroy(iapRecord); + } + // If there are no IAP record + if(!recExists) + { + connectionPrefsRecord->iDefaultIAP = aIAP; + connectionPrefsRecord->ModifyL(*iDbSession); + } + } + // If there are no ConnPref + else + { + connectionPrefsRecord->iDefaultIAP = aIAP; + connectionPrefsRecord->StoreL(*iDbSession); + } + CleanupStack::PopAndDestroy(connectionPrefsRecord); + + } + +// +// Id of IAP record entry +// +TUint32 CIspParser::IapEntryId() + { + return iDialOutIap; + } +// +// +// +void CIspParser::SetIapIdsL() + { + TUint32 id=0; + GetIapIdL(TPtrC(KCDTypeNameDialOutISP), id); + iIapIsp=id; + iProxyIsp=id; + } + +// +// Get COMMDB_ID from table that matches the COMMDB_NAME extracted from BioMsg +// +void CIspParser::GetIapIdL(const TDesC& aTableName, TUint32& aId) + { + const TPtrC KNameFieldToken(iName->Des()); + if (aTableName.CompareF(TPtrC(KCDTypeNameDialOutISP)) == KErrNone) + { + CCDDialOutISPRecord* dialOutIspRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdDialOutISPRecord)); + CleanupStack::PushL(dialOutIspRecord); + dialOutIspRecord->iRecordName.SetMaxLengthL(KNameFieldToken.Length()); + dialOutIspRecord->iRecordName = KNameFieldToken; + TBool err = dialOutIspRecord->FindL(*iDbSession); + if (err) + { + aId = dialOutIspRecord->iRecordTag.RecordId(); + } + else + { + User::Leave(err); + } + CleanupStack::PopAndDestroy(dialOutIspRecord); + } + } + + +void CIspParser::WriteToDialOutISPTableL() + { + CCDDialOutISPRecord* dialOutIspRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdDialOutISPRecord)); + CleanupStack::PushL(dialOutIspRecord); + (dialOutIspRecord->iRecordName).SetMaxLengthL(iName->Length()); + dialOutIspRecord->iRecordName = *iName; + TBool recordExist = FALSE; + if(!(dialOutIspRecord->FindL(*iDbSession))) + { + dialOutIspRecord->SetRecordId(KCDNewRecordRequest); + } + else + { + recordExist = TRUE; + } + dialOutIspRecord->iDialResolution = ETrue; + if(iDefaultTelNum) + { + (dialOutIspRecord->iDefaultTelNum).SetMaxLengthL(iDefaultTelNum->Length()); + dialOutIspRecord->iDefaultTelNum = LimitStringSize(iDefaultTelNum->Des()); + } + dialOutIspRecord->iPromptForLogin = iLoginPrompt; + + TBool manualCustomisation = EFalse; + if(iLoginCustomisation) + { + // If Ilgn field is found in the BIO message check whether + // it is '1', in which case place TRUE into the CommsDat field. + // Currently it is not possible to handle a script name being + // specified in the Ilgn field of the BIO message because CommsDat + // will only accept a boolean value for ISP_USE_LOGIN_SCRIPT. + // This may need to be changed in the future depending on requirements. + + manualCustomisation = (iLoginCustomisation->Compare(KCharOne) == 0); + } + + dialOutIspRecord->iUseLoginScript = manualCustomisation; + if (iLoginName) + { + (dialOutIspRecord->iLoginName).SetMaxLengthL(iLoginName->Length()); + dialOutIspRecord->iLoginName = LimitStringSize(iLoginName->Des()); + (dialOutIspRecord->iIfAuthName).SetMaxLengthL(iLoginName->Length()); + dialOutIspRecord->iIfAuthName = LimitStringSize(iLoginName->Des()); + } + if(iLoginPass) + { + (dialOutIspRecord->iLoginPass).SetMaxLengthL(iLoginPass->Length()); + dialOutIspRecord->iLoginPass = LimitStringSize(iLoginPass->Des()); + (dialOutIspRecord->iIfAuthPass).SetMaxLengthL(iLoginPass->Length()); + dialOutIspRecord->iIfAuthPass = LimitStringSize(iLoginPass->Des()); + } + + dialOutIspRecord->iDisplayPct = EFalse; + dialOutIspRecord->iIfPromptForAuth = EFalse; + dialOutIspRecord->iIfCallbackEnabled = EFalse; + (dialOutIspRecord->iIpAddr).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + dialOutIspRecord->iIpAddr = iAddr->Addr(); + dialOutIspRecord->iIpAddrFromServer = EFalse; + dialOutIspRecord->iIpAddrFromServer = ETrue; + if(iNetMask) + { + (dialOutIspRecord->iIpNetMask).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + dialOutIspRecord->iIpNetMask = LimitStringSize(iNetMask->Addr()); + } + if(iGateway) + { + (dialOutIspRecord->iIpGateway).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + dialOutIspRecord->iIpGateway = LimitStringSize(iGateway->Addr()); + } + TBool dns1Specified = (iDNS1->Addr().Compare(KNullDesC) != 0); + TBool dns2Specified = (iDNS2->Addr().Compare(KNullDesC) != 0); + if(dns1Specified) + { + (dialOutIspRecord->iIpNameServer1).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + dialOutIspRecord->iIpNameServer1 = iDNS1->Addr(); + } + if(dns2Specified) + { + (dialOutIspRecord->iIpNameServer2).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + dialOutIspRecord->iIpNameServer2 = LimitStringSize(iDNS2->Addr()); + } + if(dns1Specified || dns2Specified || !iNoExistingDNS) + { + dialOutIspRecord->iIpDnsAddrFromServer = EFalse; + } + else + { + dialOutIspRecord->iIpDnsAddrFromServer = ETrue; + } + dialOutIspRecord->iEnableIpHeaderComp = EFalse; + dialOutIspRecord->iDisablePlainTextAuth = EFalse; + dialOutIspRecord->iEnableSwComp = iSWCompressionEnabled; + dialOutIspRecord->iIfNetworks = KIacpIfNetworks; + if(iModemInit) + { + (dialOutIspRecord->iInitString).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + dialOutIspRecord->iInitString = iModemInit->Des(); + } + if(iIapChargeCard) + { + dialOutIspRecord->iChargecard = iIapChargeCard; + } + + if (!recordExist) + { + dialOutIspRecord->StoreL(*iDbSession); + } + else + { + dialOutIspRecord->ModifyL(*iDbSession); + } + CleanupStack::PopAndDestroy(dialOutIspRecord); + } + +void CIspParser::WriteToDialOutIAPTableL() + { + CCDIAPRecord* iapRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); + CleanupStack::PushL(iapRecord); + + (iapRecord->iRecordName).SetMaxLengthL(iName->Length()); + iapRecord->iRecordName = *iName; + TBool recordExist = FALSE; + if(!(iapRecord->FindL(*iDbSession))) + { + iapRecord->SetRecordId(KCDNewRecordRequest); + } + else + { + recordExist = TRUE; + } + iapRecord->iServiceType.SetMaxLengthL(((TPtrC)KCDTypeNameDialOutISP).Length()); + iapRecord->iServiceType = TPtrC(KCDTypeNameDialOutISP); + iapRecord->iService = iIapIsp; + iapRecord->iBearerType.SetMaxLengthL(((TPtrC)KCDTypeNameModemBearer).Length()); + iapRecord->iBearerType = TPtrC(KCDTypeNameModemBearer); + //there are 7 fields in IAP table which cannot have null values, and so when creating an IAP record we were only filling in one of the fields which meant we were submitting a record with lots of null values which can't be handled. + iapRecord->iBearer = 2; + iapRecord->iNetwork = 1; + iapRecord->iNetworkWeighting = 0; + iapRecord->iLocation = 4; + if (!recordExist) + { + iapRecord->StoreL(*iDbSession); + } + else + { + iapRecord->ModifyL(*iDbSession); + } + iRecordId = iapRecord->iRecordTag.RecordId(); + CleanupStack::PopAndDestroy(iapRecord); + } +void CIspParser::WriteToPreferencesTableL(TCommDbConnectionDirection aDirection,CIacSettingsParser::TIacpConnectionPreferenceFlag& aConnectionPreference) + { + // create a new connection prefs record + CCDConnectionPrefsRecord* connectionPrefsRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdConnectionPrefsRecord)); + CleanupStack::PushL(connectionPrefsRecord); + connectionPrefsRecord->iRanking = aConnectionPreference; + connectionPrefsRecord->iDirection = aDirection; + connectionPrefsRecord->iDialogPref = ECommDbDialogPrefPrompt; + connectionPrefsRecord->iBearerSet = ECommDbBearerWcdma; + connectionPrefsRecord->SetRecordId(KCDNewRecordRequest); + if(!(connectionPrefsRecord->FindL(*iDbSession))) + { + connectionPrefsRecord->StoreL(*iDbSession); + } + else + { + aConnectionPreference = CIacSettingsParser::EIacpDoNotCreatePreference; + } + CleanupStack::PopAndDestroy(connectionPrefsRecord); + } +void CIspParser::WriteToProxiesTableL() + { + CCDProxiesRecord *proxiesRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdProxiesRecord)); + CleanupStack::PushL(proxiesRecord); + proxiesRecord->iService = iProxyIsp; + TBool recordExist = FALSE; + if(!(proxiesRecord->FindL(*iDbSession))) + { + proxiesRecord->SetRecordId(KCDNewRecordRequest); + } + else + { + recordExist = TRUE; + } + if(iSecureProxy) + { + if(iSecureProxySrv) + { + (proxiesRecord->iServerName).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + proxiesRecord->iServerName = iSecureProxySrv->Addr(); + } + if(iSecurePortNum) + { + proxiesRecord->iPortNumber = iSecurePortNum; + } + (proxiesRecord->iProtocolName).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + proxiesRecord->iProtocolName = KIacpProxyProtocolName; + + } + else + { + if(iProxyServerName) + { + (proxiesRecord->iServerName).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + proxiesRecord->iServerName = iProxyServerName->Addr(); + } + proxiesRecord->iPortNumber = iProxyPortNum; + proxiesRecord->iProtocolName = KIacpProxyProtocolName; + } + + if(iProxyExeptions) + { + (proxiesRecord->iExceptions).SetMaxLengthL(KCommsDbSvrMaxFieldLength); + proxiesRecord->iExceptions = iProxyExeptions->Addr(); + } + proxiesRecord->iUseProxyServer = EFalse; + + if (!recordExist) + { + proxiesRecord->StoreL(*iDbSession); + } + else + { + proxiesRecord->ModifyL(*iDbSession); + } + CleanupStack::PopAndDestroy(proxiesRecord); + } + + +TPtrC CIspParser::LimitStringSize(const TDesC& aString) + { + if (aString.Length() < KCommsDbSvrMaxFieldLength) + return aString; + else + return aString.Left(KCommsDbSvrMaxFieldLength); + } + +TPtrC8 CIspParser::LimitStringSize(const TDesC8& aString) + { + if (aString.Length() < KCommsDbSvrMaxFieldLength) + return aString; + else + return aString.Left(KCommsDbSvrMaxFieldLength); + }