messagingfw/biomsgfw/IACPSRC/gprsp.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/IACPSRC/gprsp.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,361 @@
+// 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 "gprsp.h"
+#include "IACPDEF.H"
+#include "IACPERR.H"
+
+//#include "t_tabdef.h"
+
+
+#include <ipaddr.h>
+
+_LIT(KGPRSDefaultIpAddress,		"0.0.0.0");
+
+CGprsParser::CGprsParser()
+	{
+	}
+
+CGprsParser* CGprsParser::NewLC()
+	{
+	CGprsParser* self=new (ELeave) CGprsParser();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+CGprsParser* CGprsParser::NewL()
+	{
+	CGprsParser* self=CGprsParser::NewLC();
+	CleanupStack::Pop();
+	return self;
+	}
+
+void CGprsParser::ConstructL()
+	{
+	iLoginPrompt=ETrue;		//Mandatory Data
+	iDnsFromServer= ETrue;
+
+	iPdpAddress = CIpAddress::NewL(KGPRSDefaultIpAddress);
+
+	iDbSession = CMDBSession::NewL(CMDBSession::LatestVersion());
+	}
+
+CGprsParser::~CGprsParser()
+	{
+
+	delete iName;
+	delete iApn;
+	delete iPdpAddress;
+	delete iIfName;
+	delete iLoginName;
+	delete iLoginPass;
+	delete iAddr;
+	delete iNetMask;
+	delete iDNS1;
+	delete iDNS2;
+
+	delete iDbSession;
+	}
+
+
+void CGprsParser::CheckMandatoryFieldsL(CParsedFieldCollection& aIacpFields)
+	{
+	if (aIacpFields.GetFieldValue(GPRSS_APN).Length()==0)
+		User::Leave(KIacpMandatoryDataNotSet);
+	}
+
+void CGprsParser::ParseL(CParsedFieldCollection& aIacpFields)
+	{
+	TPtrC aFieldValueBuf;
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_NAME, aFieldValueBuf) != 0)
+		{
+		delete iName;
+		iName = NULL;
+		iName = aFieldValueBuf.AllocL();
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_APN, aFieldValueBuf) != 0)
+		{
+		delete iApn;
+		iApn = NULL;
+		iApn= aFieldValueBuf.AllocL();
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_PDP_TYPE, aFieldValueBuf) != 0)
+		{
+		aIacpFields.GetTUint32NumL(aFieldValueBuf,iPdpType);
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_PDP_ADDRESS, aFieldValueBuf) != 0)
+		{
+		delete iPdpAddress;
+		iPdpAddress = NULL;
+		iPdpAddress = CIpAddress::NewL(aFieldValueBuf);
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_IF_NAME, aFieldValueBuf) != 0)
+		{
+		delete iIfName;
+		iIfName = NULL;
+		iIfName= CIpAddress::NewL(aFieldValueBuf);
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_LOGIN_NAME, aFieldValueBuf) != 0)
+		{
+		delete iLoginName;
+		iLoginName = NULL;
+		iLoginName= aFieldValueBuf.AllocL();
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_LOGIN_PASS, aFieldValueBuf) != 0)
+		{
+		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 login Name or password is specified then this should be set to EFalse
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_IP_ADDR, aFieldValueBuf) != 0)
+		{
+		delete iAddr;
+		iAddr = NULL;
+		iAddr = CIpAddress::NewL(aFieldValueBuf);
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_IP_NETMASK, aFieldValueBuf) != 0)
+		{
+		delete iNetMask;
+		iNetMask = NULL;
+		iNetMask = CIpAddress::NewL(aFieldValueBuf);
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_IP_NAME_SERVER1, aFieldValueBuf) != 0)
+		{
+		delete iDNS1;
+		iDNS1 = NULL;
+		iDNS1 = CIpAddress::NewL(aFieldValueBuf);
+		}
+
+	if (aIacpFields.GetFieldValueAndLength(GPRSS_IP_NAME_SERVER2, aFieldValueBuf) != 0)	
+		{
+		delete iDNS2;
+		iDNS2 = NULL;
+		iDNS2 = CIpAddress::NewL(aFieldValueBuf);
+		}
+	}
+
+void CGprsParser::ProcessL(CIacSettingsParser::TIacpConnectionPreferenceFlag& aConnectionPreference)
+	{
+	iNoExistingDNS	  = ETrue;
+	
+	
+	WriteToGPRSTableL(EOutgoing);
+	WriteToGPRSTableL(EIncoming);
+
+	WriteToIAPTableL();
+
+	if(aConnectionPreference == CIacSettingsParser::EIacpAttempCreateAsFirstRank ||
+		aConnectionPreference == CIacSettingsParser::EIacpAttempCreateAsSecondRank)
+		CreatePreferencesTableL(ECommDbConnectionDirectionOutgoing,aConnectionPreference);	
+
+	}
+
+void CGprsParser::WriteToIAPTableL()
+	{
+	CCDIAPRecord* iapRecord = static_cast<CCDIAPRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
+	CleanupStack::PushL(iapRecord);
+	iapRecord->iRecordName.SetMaxLengthL(iName->Length());
+	iapRecord->iRecordName = iName->Des();
+	TBool recordExist = FALSE;
+	if(!(iapRecord->FindL(*iDbSession)))
+		{
+		iapRecord->SetRecordId(KCDNewRecordRequest);		
+		}
+	else
+		{
+		recordExist = TRUE;
+		}
+	iapRecord->iServiceType.SetMaxLengthL(((TPtrC)KCDTypeNameOutgoingWCDMA).Length());
+	iapRecord->iServiceType = TPtrC(KCDTypeNameOutgoingWCDMA);
+	iapRecord->iService =  GetIapIdL(TPtrC(KCDTypeNameOutgoingWCDMA));
+	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);	
+		}
+	CleanupStack::PopAndDestroy(iapRecord);
+
+	}
+
+void CGprsParser::CreatePreferencesTableL(TCommDbConnectionDirection aDirection, CIacSettingsParser::TIacpConnectionPreferenceFlag& aConnectionPreference)
+	{
+	CCDConnectionPrefsRecord* connectionPrefsRecord = static_cast<CCDConnectionPrefsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdConnectionPrefsRecord));
+	CleanupStack::PushL(connectionPrefsRecord);
+	connectionPrefsRecord->iRanking = aConnectionPreference;
+	connectionPrefsRecord->iDirection = aDirection;
+	connectionPrefsRecord->iDialogPref = ECommDbDialogPrefPrompt;
+	connectionPrefsRecord->iBearerSet  = ECommDbBearerWcdma;
+	connectionPrefsRecord->SetRecordId(iRecordId);
+	if ( connectionPrefsRecord->FindL(*iDbSession) )
+		{
+		aConnectionPreference = CIacSettingsParser::EIacpDoNotCreatePreference;
+		}
+	else
+		{
+		connectionPrefsRecord->StoreL(*iDbSession);
+		}
+	CleanupStack::PopAndDestroy(connectionPrefsRecord);
+	}
+
+
+//
+// Get COMMDB_ID from table that matches the COMMDB_NAME extracted from BioMsg
+//
+TUint32 CGprsParser::GetIapIdL(const TDesC& aTableName)
+	{
+	const TPtrC KNameFieldToken(iName->Des());
+
+
+	TUint32 ret = 0;
+	if (aTableName.CompareF(TPtrC(KCDTypeNameOutgoingWCDMA)) == KErrNone)
+		{
+		CCDOutgoingGprsRecord* gprsRecord = static_cast<CCDOutgoingGprsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdOutgoingGprsRecord));	
+		CleanupStack::PushL(gprsRecord);
+		gprsRecord->iRecordName.SetMaxLengthL(KNameFieldToken.Length());
+		gprsRecord->iRecordName =  KNameFieldToken;	
+		if (gprsRecord->FindL(*iDbSession))
+			{		
+			ret = gprsRecord->iRecordTag.RecordId();
+			}
+		else
+			{
+			User::Leave(KErrNotFound);
+			}
+		CleanupStack::PopAndDestroy(gprsRecord);	
+		}	
+	return ret;
+	}
+
+void CGprsParser::WriteToGPRSTableL(TDirection aDir)
+	{
+	CCDWCDMAPacketServiceRecord* gprsRecord = NULL;
+	if (aDir == EOutgoing)
+		{
+		gprsRecord = static_cast<CCDOutgoingGprsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdOutgoingGprsRecord));	
+		}
+	else
+		{
+		gprsRecord = static_cast<CCDIncomingGprsRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdIncomingGprsRecord));	
+		}
+	CleanupStack::PushL(gprsRecord);
+	gprsRecord->iRecordName.SetMaxLengthL(iName->Length());
+	gprsRecord->iRecordName = iName->Des();
+	TBool recordExist = FALSE;
+	if(!(gprsRecord->FindL(*iDbSession)))
+		{
+		gprsRecord->SetRecordId(KCDNewRecordRequest);		
+		}
+	else
+		{
+		recordExist = TRUE;
+		}
+	gprsRecord->iGPRSAPN.SetMaxLengthL(iApn->Length());
+	gprsRecord->iGPRSAPN = *iApn;
+	gprsRecord->iGPRSPDPType = iPdpType;
+	gprsRecord->iGPRSPDPAddress.SetMaxLengthL(KCommsDbSvrMaxFieldLength);
+	gprsRecord->iGPRSPDPAddress = iPdpAddress->Addr();
+	gprsRecord->iGPRSIfPromptForAuth = iLoginPrompt;
+	if(iLoginName != NULL)
+		{
+		gprsRecord->iGPRSIfAuthName.SetMaxLengthL(iLoginName->Length());
+		gprsRecord->iGPRSIfAuthName = *iLoginName;			
+		}
+	if(iLoginPass != NULL)
+		{
+		gprsRecord->iGPRSIfAuthPass.SetMaxLengthL(iLoginPass->Length());
+		gprsRecord->iGPRSIfAuthPass = *iLoginPass;
+		}
+	if(iNetMask != NULL)
+		{
+		gprsRecord->iGPRSIPNetMask.SetMaxLengthL(KCommsDbSvrMaxFieldLength);
+		gprsRecord->iGPRSIPNetMask = iNetMask->Addr();	
+		}
+	if(iDNS1 != NULL)
+		{
+		gprsRecord->iGPRSIPNameServer1.SetMaxLengthL(KCommsDbSvrMaxFieldLength);
+		gprsRecord->iGPRSIPNameServer1 = iDNS1->Addr();	
+		}		
+	if(iDNS2 != NULL)
+		{
+		gprsRecord->iGPRSIPNameServer2.SetMaxLengthL(KCommsDbSvrMaxFieldLength);
+		gprsRecord->iGPRSIPNameServer2 = iDNS2->Addr();	
+		}		
+	if(!iDNS1 && !iDNS2 && iNoExistingDNS)
+		{
+		gprsRecord->iGPRSIPDNSAddrFromServer = EFalse;		
+		}
+	else
+		{
+		gprsRecord->iGPRSIPDNSAddrFromServer = ETrue;		
+		}		
+	gprsRecord->iGPRSDisablePlainTextAuth = EFalse;
+	if (!recordExist)
+		{
+		gprsRecord->StoreL(*iDbSession);
+		}
+	else 
+		{
+		gprsRecord->ModifyL(*iDbSession);	
+		}
+	iNoExistingDNS = gprsRecord->iGPRSIPDNSAddrFromServer;
+	CleanupStack::PopAndDestroy(gprsRecord);			
+	}
+
+TPtrC CGprsParser::LimitStringSize(const TDesC& aString)
+	{
+	if (aString.Length() < KCommsDbSvrMaxFieldLength)
+		return aString;
+	else
+		return aString.Left(KCommsDbSvrMaxFieldLength);
+	}
+
+TPtrC8 CGprsParser::LimitStringSize(const TDesC8& aString)
+	{
+	if (aString.Length() < KCommsDbSvrMaxFieldLength)
+		return aString;
+	else
+		return aString.Left(KCommsDbSvrMaxFieldLength);
+	}