telephonyserverplugins/multimodetsy/hayes/TSYCONFG.CPP
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/multimodetsy/hayes/TSYCONFG.CPP	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/multimodetsy/hayes/TSYCONFG.CPP	Thu May 06 15:10:38 2010 +0100
@@ -1,645 +1,645 @@
-// Copyright (c) 1997-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:
-// TSY Configuation Class
-// 
-//
-
-#include "ATSTD.H"
-#include "TSYCONFG.H"
-#include "mSLOGGER.H"
-#include <commsdattypesv1_1.h>
-#include <commsdat_partner.h>
-using namespace CommsDat;
-
-// 
-// Macros
-//
-
-#ifdef __LOGDEB__
-_LIT8(KLogEntry,"CTsyConfig::%S\t%S");
-#define LOCAL_LOGTEXT(function,text) {_LIT8(F,function);_LIT8(T,text);LOGTEXT3(KLogEntry,&F,&T);}
-#else
-#define LOCAL_LOGTEXT(function,text)
-#endif
-
-//
-// Define some defaults if the modem settings can't be found
-//
-const TInt KDefaultLocationInternalPref=0;
-const RCall::TMonitorSpeakerControl KDefaultModemSpeakerSetting=RCall::EMonitorSpeakerControlOnUntilCarrier;
-const RCall::TMonitorSpeakerVolume KDefaultMonitorSpeakerVolume=RCall::EMonitorSpeakerVolumeOff;
-const RCall::TWaitForDialTone KDefaultWaitForDialTone=RCall::EDialToneNoWait;
- 
-CTsyConfig* CTsyConfig::NewL(TBool aExplicit) 
-/**
- * Passed a reference to the phone mode so that the default settings will not be altered whilst
- * a call is in progress
- */
-	{
-	CTsyConfig* tsyConfig=new(ELeave) CTsyConfig();
-	CleanupStack::PushL(tsyConfig);
-	tsyConfig->ConstructL(aExplicit); 
-	CleanupStack::Pop();
-	return (tsyConfig);
-	}
-	
-CTsyConfig::CTsyConfig()
-	{}
-
-void CTsyConfig::ConstructL(TBool aExplicit)
-	{
-	iLocationId = 0;
-	TInt r=KErrNone;
-	iManualConfigMode=aExplicit;
-	
-	if(!aExplicit)
-		{
-		for (TInt i=0;i<10;i++)
-			{
-			TRAP(r, GetCurrentTableViewsL()); // Place a cursor on the default modem record in comms database server
-			if (r==KErrAccessDenied) // if we get access denied from DBMS, which is a timing thing, just re-post
-				{
-				User::After(1000000);
-				continue;
-				}
-			else
-				break;
-			}
-		if (r)
-			{
-			LOGTEXT(_L8("CommDB values seem to be corrupt"));
-			ResetCurrentTableViews(); // clean up everything
-			User::Leave(KErrEtelModemSettingsCorrupt);
-			}
-
-		GetLocationModemSettingsL(); // Get other location and modem settings 
-		ResetCurrentTableViews(); // Clear location and modem table views and close handle to CCommsDatabase
-		}
-	}
-
-void CTsyConfig::GetLocationModemSettingsL()
-/**
- * Gets some commonly used settings from the Location and Modem Table Views and stores them
- * internally as these are not likely to change. 
- * If some of these settings are not found in the table view then a predefined default values are
- * used.
- */
-	{
-	if(iLocationId == 0)
-		{
-		iInterval=KDefaultLocationInternalPref;
-		iWaitForDialTonePref=KDefaultWaitForDialTone;
-		}
-	else
-		{
-		TBool value(EFalse);
-		CMDBField<TUint32>* intervalField = new(ELeave) CMDBField<TUint32>(KCDTIdPauseAfterDialOut);
-		CleanupStack::PushL(intervalField);
-		intervalField->SetRecordId(iLocationId);
-		intervalField->LoadL(*iDbSession);
-		iInterval = *intervalField;
-		CleanupStack::PopAndDestroy(intervalField);
-		
-		CMDBField<TUint32>* valueField = new(ELeave) CMDBField<TUint32>(KCDTIdWaitForDialTone);		
-		CleanupStack::PushL(valueField);
-		valueField->SetRecordId(iLocationId);
-		valueField->LoadL(*iDbSession);
-		value = *valueField;
-		CleanupStack::PopAndDestroy(valueField);
-		
-		if (value)
-			iWaitForDialTonePref = RCall::EDialToneWait;
-		else
-			iWaitForDialTonePref = RCall::EDialToneNoWait;
-		}
-
-	if (iModemBearer != 0)
-		{
-		CMDBField<TUint32>* speakerPrefField = new(ELeave) CMDBField<TUint32>(KCDTIdSpeakerPref);
-		CleanupStack::PushL(speakerPrefField);
-		speakerPrefField->SetRecordId(iModemBearer);
-		speakerPrefField->LoadL(*iDbSession);
-		iSpeakerSetting = static_cast<RCall::TMonitorSpeakerControl>(static_cast<TUint32>(*speakerPrefField));
-		CleanupStack::PopAndDestroy(speakerPrefField);
-		
-		CMDBField<TUint32>* speakerVolPrefField = new(ELeave) CMDBField<TUint32>(KCDTIdSpeakerVolPref);
-		CleanupStack::PushL(speakerVolPrefField);
-		speakerVolPrefField->SetRecordId(iModemBearer);
-		speakerVolPrefField->LoadL(*iDbSession);
-		iSpeakerVolume = static_cast<RCall::TMonitorSpeakerVolume>(static_cast<TUint32>(*speakerVolPrefField));			
-		CleanupStack::PopAndDestroy(speakerVolPrefField);
-		}
-
-	TUint32 rate;
-	TUint32 dataBits;
-	TUint32 stopBits;
-	TUint32 parity;
-	TUint32 handshake;
-	
-	if (iModemBearer == 0)
-		{
-		iSpeakerSetting = KDefaultModemSpeakerSetting;
-		iSpeakerVolume = KDefaultMonitorSpeakerVolume;
-		User::Leave(KErrNotFound);
-		}
-
-	CMDBField<TUint32>* rateField = new(ELeave) CMDBField<TUint32>(KCDTIdRate);
-	CleanupStack::PushL(rateField);
-	rateField->SetRecordId(iModemBearer);
-	rateField->LoadL(*iDbSession);
-	rate = *rateField;
-	CleanupStack::PopAndDestroy(rateField);
-	
-	CMDBField<TUint32>* dataBitsField = new(ELeave) CMDBField<TUint32>(KCDTIdDataBits);
-	CleanupStack::PushL(dataBitsField);
-	dataBitsField->SetRecordId(iModemBearer);
-	dataBitsField->LoadL(*iDbSession);
-	dataBits = *dataBitsField;
-	CleanupStack::PopAndDestroy(dataBitsField);
-
-	CMDBField<TUint32>* stopBitsField = new(ELeave) CMDBField<TUint32>(KCDTIdStopBits);
-	CleanupStack::PushL(stopBitsField);
-	stopBitsField->SetRecordId(iModemBearer);
-	stopBitsField->LoadL(*iDbSession);
-	stopBits = *stopBitsField;
-	CleanupStack::PopAndDestroy(stopBitsField);
-	
-	CMDBField<TUint32>* parityField = new(ELeave) CMDBField<TUint32>(KCDTIdParity);
-	CleanupStack::PushL(parityField);
-	parityField->SetRecordId(iModemBearer);
-	parityField->LoadL(*iDbSession);
-	parity = *parityField;
-	CleanupStack::PopAndDestroy(parityField);
-	
-	CMDBField<TUint32>* handshakeField = new(ELeave) CMDBField<TUint32>(KCDTIdHandshaking);
-	CleanupStack::PushL(handshakeField);
-	handshakeField->SetRecordId(iModemBearer);
-	handshakeField->LoadL(*iDbSession);
-	handshake = *handshakeField;
-	CleanupStack::PopAndDestroy(handshakeField);
-
-	iConfig.iRate = (TBps)rate;
-	iConfig.iDataBits = (TDataBits)dataBits;
-	iConfig.iStopBits = (TStopBits)stopBits;
-	iConfig.iParity = (TParity)parity;
-	iConfig.iHandshake = (TUint)handshake;
-	}
-
-CTsyConfig::~CTsyConfig()
-	{
-	// Just in case these have not been cleared
-	delete iDbSession;
-	}
-
-void CTsyConfig::CommConfigL(TCommConfigV01& aConfig)
-	{
-	aConfig = iConfig;
-	}
-
-TInt CTsyConfig::ConfigModemStringL(const TDesC& aStringTag, TDes8& aString)
-	{
-	TInt r=KErrNone;
-	for (TInt i=0;i<10;i++)
-		{
-		TRAP(r, GetCurrentTableViewsL()); // Place a cursor on the default modem record in comms database server
-		if (r==KErrAccessDenied) // if we get access denied from DBMS, which is a timing thing, just re-post
-			{
-			User::After(1000000);
-			continue;
-			}
-		else
-			break;
-		}
-	if (r)
-		{
-		LOGTEXT(_L8("CommDB values seem to be corrupt"));
-		ResetCurrentTableViews(); // clean up everything
-		return (KErrEtelModemSettingsCorrupt);
-		}
-
-	CCDModemBearerRecord* modemRecord = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
-	CleanupStack::PushL(modemRecord);
-	modemRecord->SetRecordId(iModemBearer);
-	modemRecord->LoadL(*iDbSession);
-	
-	TInt ret;
-	TInt type(0);
-	CMDBElement* baseField = NULL;
-	TRAP(ret, baseField = modemRecord->GetFieldByNameL(aStringTag, type));
-	if (ret == KErrNone)
-		{
-		// check for type
-		switch(type)
-			{
-			case EMedText:
-			case EText:
-				{
-				CMDBField<TDesC>* field16 = static_cast<CMDBField<TDesC>*>(baseField);
-				const TDesC& refField = *field16;
-				aString.Copy(refField);
-				ret = KErrNone;
-				}
-				break;
-			case EDesC8:
-				{
-				CMDBField<TDesC8>* field = static_cast<CMDBField<TDesC8>*>(baseField);
-				aString = *field;
-				ret = KErrNone;
-				}
-				break;
-			default:
-				ret = KErrNotFound;
-			}
-    	}
-	CleanupStack::PopAndDestroy(modemRecord);
-
-	ResetCurrentTableViews(); // Clear location and modem table views and close handle to CCommsDatabase
-	return ret;
-	}
-
-TInt CTsyConfig::ConfigModemStringL(const TDesC& aStringTag, TDes16& aString)
-	{
-	TInt r=KErrNone;
-	for (TInt i=0;i<10;i++)
-		{
-		TRAP(r, GetCurrentTableViewsL()); // Place a cursor on the default modem record in comms database server
-		if (r==KErrAccessDenied) // if we get access denied from DBMS, which is a timing thing, just re-post
-			{
-			User::After(1000000);
-			continue;
-			}
-		else
-			break;
-		}
-	if (r)
-		{
-		LOGTEXT(_L8("CommDB values seem to be corrupt"));
-		ResetCurrentTableViews(); // clean up everything
-		return (KErrEtelModemSettingsCorrupt);
-		}
-
-	CCDModemBearerRecord* modemRecord = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
-	CleanupStack::PushL(modemRecord);
-	modemRecord->SetRecordId(iModemBearer);
-	modemRecord->LoadL(*iDbSession);
-
-	
-	TInt ret;
-	TInt type(0);
-	CMDBElement* baseField = NULL;
-	TRAP(ret, baseField = modemRecord->GetFieldByNameL(aStringTag, type));
-	if (ret == KErrNone)
-		{
-		// check for type
-		switch(type)
-			{
-			case EMedText:
-			case EText:
-		
-				{
-				CMDBField<TDesC>* field = static_cast<CMDBField<TDesC>*>(baseField);
-				aString = *field;
-				ret = KErrNone;
-				}
-				break;
-			case EDesC8:
-				{
-				// des16 needs to be cast to des8
-				CMDBField<TDesC8>* field8 = static_cast<CMDBField<TDesC8>*>(baseField);
-				const TDesC8& refField = *field8;
-				aString.Copy(refField);
-				ret = KErrNone;
-				}
-				break;
-			default:
-				ret = KErrNotFound;
-			}
-		}
-	
-	CleanupStack::PopAndDestroy(modemRecord);
-
-	ResetCurrentTableViews(); // Clear location and modem table views and close handle to CCommsDatabase
-	return ret;
-	}
-
-TInt CTsyConfig::ConfigModemString(const TDesC& aStringTag, TDes8& aString)
-	{
-	TInt ret = KErrNone;
-	TRAPD(error, ret = ConfigModemStringL(aStringTag, aString));
-	if(error != KErrNone)
-		{
-		ret = error;
-		}
-	return ret;
-	}
-
-TInt CTsyConfig::ConfigModemString(const TDesC& aStringTag, TDes16& aString)
-	{
-	TInt ret = KErrNone;
-	TRAPD(error, ret = ConfigModemStringL(aStringTag, aString));
-	if(error != KErrNone)
-		{
-		ret = error;
-		}
-	return ret;
-	}
-
-void CTsyConfig::GetIntervalPref(TInt& aInterval)
-/**
- * Stores the Interval Preferences settings internally. These settings are stored on construction
- * of the CTsyConfig object.
- * @param aInterval Interval Preference setting
- */
-	{
-	aInterval = iInterval;
-	}
-
-void CTsyConfig::GetSpeakerSettingPref(RCall::TMonitorSpeakerControl& aSpeakerSetting)
-/**
- * Stores the Speaker Preferences settings internally. These settings are stored on construction
- * of the CTsyConfig object.
- * @param aSpeakerSetting Speaker Preference setting
- */
-	{
-	aSpeakerSetting = iSpeakerSetting;
-	}
-
-void CTsyConfig::GetSpeakerVolumePref(RCall::TMonitorSpeakerVolume& aSpeakerVolume)
-/**
- * Stores the Speaker Volume Preferences settings internally. These settings are stored on construction
- * of the CTsyConfig object.
- * @param aSpeakerVolume Speaker Volume setting
- */
-	{
-	aSpeakerVolume = iSpeakerVolume;
-	}
-
-void CTsyConfig::GetWaitForDialTonePref(RCall::TWaitForDialTone& aWaitForDialTonePref)
-/**
- * Stores the Dial Tone Preferences settings internally. These settings are stored on construction
- * of the CTsyConfig object.
- * @param aWaitForDialTonePref Wait for Dial Tone Preference setting
- */
-	{
-	aWaitForDialTonePref = iWaitForDialTonePref;
-	}
-
-TInt CTsyConfig::PortConfig(TCommConfig& aConfigPckg, TConfigType aConfigType)
-/**
- * Gets the port config settings and masks out appropriate handshaking settings
- * according to whether state is about to initialise, just connected or about to hang up
- */ 
-	{
-	TInt r=KErrNone;
-	for (TInt i=0;i<10;i++)
-		{
-		TRAP(r, GetCurrentTableViewsL()); // Place a cursor on the default modem record in comms database server
-		if (r==KErrAccessDenied) // if we get access denied from DBMS, which is a timing thing, just re-post
-			{
-			User::After(1000000);
-			continue;
-			}
-		else
-			break;
-		}
-	if (r)
-		{
-		LOGTEXT(_L8("CommDB values seem to be corrupt"));
-		ResetCurrentTableViews(); // clean up everything
-		return (KErrEtelModemSettingsCorrupt);
-		}
-
-	TCommConfig configDummyPckg;
-	TCommConfigV01& config=configDummyPckg();
-	if (aConfigType==EConfigTypeHangUp ||
-		aConfigType==EConfigTypeQuickInit)
-		{
-		config = iConfig;
-		config.iHandshake = 0;//&= (~(KConfigFailDCD | KConfigObeyDCD | KConfigFailDSR));
-		}
-	else
-		{
-		TRAPD(ret,CommConfigL(config));
-		if (ret)
-			return ret;
-		switch (aConfigType)
-			{
-		case EConfigTypePreInit:
-			config.iHandshake &= (~(KConfigObeyCTS | KConfigFailCTS | KConfigObeyDCD | KConfigFailDCD | KConfigFailDSR));
-			break;
-		case EConfigTypeInit:
-			config.iHandshake &= (~(KConfigObeyCTS | KConfigFailCTS | KConfigObeyDCD | KConfigFailDCD));
-			break;
-		case EConfigTypeConnect:
-			config.iHandshake &= (~(KConfigFailCTS | KConfigFailDCD));	// fail DCD masked out, as should get NO CARRIER anyway
-			break;
-		case EConfigTypeFull:
-			break;
-		case EConfigTypeDDBugWorkAroundStart:
-			if (config.iRate!=EBps300)	// ensure that something other than handshaking has changed
-				config.iRate=EBps300;	// to work around the bug in the ARM device driver
-			else
-				config.iRate=EBps2400;
-			config.iHandshake=0;
-			break;
-		case EConfigTypeDDBugWorkAroundEnd:
-			config.iHandshake=0;
-			break;
-		default:
-			break;
-			}
-		}
-	aConfigPckg=configDummyPckg;
-	ResetCurrentTableViews(); // Clear location and modem table views and close handle to CCommsDatabase
-	return KErrNone;
-	}
-
-void CTsyConfig::GetCurrentTableViewsL() 
-/**
- * Opens a handle to CCommsDatabase	and positions the view on the default modem specified 
- * in the current Connected Modem record.
- * Note that the TSY does not keep the handle to the CCommsDatabase opened all the time, 
- * therefore this method is used to open the handle only when needed. The methods using 
- * this method are also responsible for calling ResetCurrentTableViews() to close the
- * handle to the CCommsDatabase and to clean up the table views.
- */
-	{
-	if(iManualConfigMode)
-		{	
-		GetRequestedTableViewsL();
-		}
-	else
-		{
-		ResetCurrentTableViews();
-		
-#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
-		iDbSession = CMDBSession::NewL(KCDVersion1_2);
-#else
-		iDbSession = CMDBSession::NewL(KCDVersion1_1);
-#endif
-		__ASSERT_DEBUG(iDbSession,Panic(ETsyConfigNullDBPointer));
-
-		TUint32 modemId(0), locationId(0);
-
-		// 
-		// Search the bearer tables for records using the MM.TSY
-		GetModemBearerIdL(modemId);
-	
-		//
-		// Get the associated locationId
-		
-		GetLocationIdL(modemId,locationId);
-		
-		//Check if the selected bearer is an MMTSY bearer with a valid location
-		if(!modemId || !locationId) 
-			{
-			//
-			// Selected bearer does not mention the MMTSY
-			LOCAL_LOGTEXT("GetCurrentSettingsL","MMTSY not mentioned in the selected bearer");
-			__ASSERT_DEBUG(EFalse,Panic(ETsyConfigMMTSYNotInModemTables));
-			User::Leave(KErrNotFound);
-			}
-		else
-			{
-						
-			iModemBearer = modemId;			
-			iLocationId = locationId;
-				
-			}
-		}
-	}
-void CTsyConfig::SetTableViewsL(RMobilePhone::TMMTableSettings& aMMTableSettings)
-	{
-	if(iManualConfigMode)
-		{
-		iMMTableSettings=aMMTableSettings;
-
-		ResetCurrentTableViews(ETrue); // Clear location and modem table views and close handle to CCommsDatabase
-		GetRequestedTableViewsL();
-		GetLocationModemSettingsL(); // Get other location and modem settings 
-		}
-	}	
-
-
-void CTsyConfig::GetRequestedTableViewsL()
-	{
-	
-	if (iDbSession == NULL)
-		{
-#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
-		iDbSession = CMDBSession::NewL(KCDVersion1_2);
-#else
-		iDbSession = CMDBSession::NewL(KCDVersion1_1);
-#endif
-		__ASSERT_DEBUG(iDbSession,Panic(ETsyConfigNullDBPointer));
-				
-		iModemBearer = 0;
-
-		CMDBField<TUint32>* bearerField = new(ELeave) CMDBField<TUint32>(KCDTIdIAPBearer);
-		CleanupStack::PushL(bearerField);
-		bearerField->SetRecordId(iMMTableSettings.iLocId);
-		bearerField->LoadL(*iDbSession);
-		iModemBearer = *bearerField;
-		CleanupStack::PopAndDestroy(bearerField);
-		}
-		
-		TName modem;
-		CMDBField<TDesC>* tsyField = new(ELeave) CMDBField<TDesC>(KCDTIdTsyName);
-		CleanupStack::PushL(tsyField);
-		tsyField->SetRecordId(iModemBearer);
-		tsyField->SetMaxLengthL(KMaxTextLength);
-		tsyField->LoadL(*iDbSession);
-		modem = *tsyField;
-		CleanupStack::PopAndDestroy(tsyField);
-		
-
-		if(modem.Compare(_L("MM"))!=KErrNone)
-			{
-			// Selected bearer does not mention the MMTSY
-			LOCAL_LOGTEXT("GetCurrentSettingsL","Bearer for selected IAP does not use MMTSY");
-			__ASSERT_DEBUG(EFalse,Panic(ETsyConfigMMTSYNotInModemTables));
-			User::Leave(KErrNotFound);
-			}
-
-
-
-	}
-	
-void CTsyConfig::ResetCurrentTableViews(TBool aForceErase)
-/**
- * Closes the handle to CCommsDatabase and clears the view on the default modem specified 
- * in the current Connected Modem record. This method needs to be called after 
- * GetCurrentTableViewsL().
- */
-	{
-	if( !iManualConfigMode || aForceErase )
-		{
-		delete iDbSession;
-		iDbSession = NULL;		
-
-		}
-	}
-
-void CTsyConfig::GetLocationIdL(const TUint32& aBearerId,TUint32& aLocationId) 
-/*
- *  Scan through the table for records containing MM.TSY
- *  Stop at the first instance of such a record and return the id
- *
- */
- 	{
-    CCDIAPRecord *iapRecord = static_cast<CCDIAPRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
-  	CleanupStack::PushL(iapRecord);
-  	
-  	iapRecord->iBearer = aBearerId;
-  	TBool err = iapRecord->FindL(*iDbSession);
-  	if (err)
-  		{
-  		aLocationId = iapRecord->iLocation;
-  		}
-  	else
-  		{
-  		aLocationId = static_cast<TUint32>(KErrNotFound);
-  		}
-  	
-    CleanupStack::PopAndDestroy(iapRecord);
-    
-	}
-
-void CTsyConfig::GetModemBearerIdL(TUint32& aBearerId) 
-/*
- *  Scan through the table for records containing MM.TSY
- *  Stop at the first instance of such a record and return the id
- *
- */
-	{
-    CCDModemBearerRecord *modemRecord = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
-    CleanupStack::PushL(modemRecord);
-    
-    _LIT(KTsyName,"MM");
-    modemRecord->iTsyName.SetMaxLengthL(KMaxTextLength);
-    modemRecord->iTsyName = KTsyName;
-    
-    TBool searchResult = modemRecord->FindL(*iDbSession);
-    
-    if (searchResult)
-	    {
-		aBearerId = modemRecord->RecordId();	
-	    }
-	else
-		{
-		aBearerId = static_cast<TUint32>(KErrNotFound);
-		}
-    
-    CleanupStack::PopAndDestroy(modemRecord);
-	}
+// Copyright (c) 1997-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:
+// TSY Configuation Class
+// 
+//
+
+#include "ATSTD.H"
+#include "TSYCONFG.H"
+#include "mSLOGGER.H"
+#include <commsdattypesv1_1.h>
+#include <commsdat_partner.h>
+using namespace CommsDat;
+
+// 
+// Macros
+//
+
+#ifdef __LOGDEB__
+_LIT8(KLogEntry,"CTsyConfig::%S\t%S");
+#define LOCAL_LOGTEXT(function,text) {_LIT8(F,function);_LIT8(T,text);LOGTEXT3(KLogEntry,&F,&T);}
+#else
+#define LOCAL_LOGTEXT(function,text)
+#endif
+
+//
+// Define some defaults if the modem settings can't be found
+//
+const TInt KDefaultLocationInternalPref=0;
+const RCall::TMonitorSpeakerControl KDefaultModemSpeakerSetting=RCall::EMonitorSpeakerControlOnUntilCarrier;
+const RCall::TMonitorSpeakerVolume KDefaultMonitorSpeakerVolume=RCall::EMonitorSpeakerVolumeOff;
+const RCall::TWaitForDialTone KDefaultWaitForDialTone=RCall::EDialToneNoWait;
+ 
+CTsyConfig* CTsyConfig::NewL(TBool aExplicit) 
+/**
+ * Passed a reference to the phone mode so that the default settings will not be altered whilst
+ * a call is in progress
+ */
+	{
+	CTsyConfig* tsyConfig=new(ELeave) CTsyConfig();
+	CleanupStack::PushL(tsyConfig);
+	tsyConfig->ConstructL(aExplicit); 
+	CleanupStack::Pop();
+	return (tsyConfig);
+	}
+	
+CTsyConfig::CTsyConfig()
+	{}
+
+void CTsyConfig::ConstructL(TBool aExplicit)
+	{
+	iLocationId = 0;
+	TInt r=KErrNone;
+	iManualConfigMode=aExplicit;
+	
+	if(!aExplicit)
+		{
+		for (TInt i=0;i<10;i++)
+			{
+			TRAP(r, GetCurrentTableViewsL()); // Place a cursor on the default modem record in comms database server
+			if (r==KErrAccessDenied) // if we get access denied from DBMS, which is a timing thing, just re-post
+				{
+				User::After(1000000);
+				continue;
+				}
+			else
+				break;
+			}
+		if (r)
+			{
+			LOGTEXT(_L8("CommDB values seem to be corrupt"));
+			ResetCurrentTableViews(); // clean up everything
+			User::Leave(KErrEtelModemSettingsCorrupt);
+			}
+
+		GetLocationModemSettingsL(); // Get other location and modem settings 
+		ResetCurrentTableViews(); // Clear location and modem table views and close handle to CCommsDatabase
+		}
+	}
+
+void CTsyConfig::GetLocationModemSettingsL()
+/**
+ * Gets some commonly used settings from the Location and Modem Table Views and stores them
+ * internally as these are not likely to change. 
+ * If some of these settings are not found in the table view then a predefined default values are
+ * used.
+ */
+	{
+	if(iLocationId == 0)
+		{
+		iInterval=KDefaultLocationInternalPref;
+		iWaitForDialTonePref=KDefaultWaitForDialTone;
+		}
+	else
+		{
+		TBool value(EFalse);
+		CMDBField<TUint32>* intervalField = new(ELeave) CMDBField<TUint32>(KCDTIdPauseAfterDialOut);
+		CleanupStack::PushL(intervalField);
+		intervalField->SetRecordId(iLocationId);
+		intervalField->LoadL(*iDbSession);
+		iInterval = *intervalField;
+		CleanupStack::PopAndDestroy(intervalField);
+		
+		CMDBField<TUint32>* valueField = new(ELeave) CMDBField<TUint32>(KCDTIdWaitForDialTone);		
+		CleanupStack::PushL(valueField);
+		valueField->SetRecordId(iLocationId);
+		valueField->LoadL(*iDbSession);
+		value = *valueField;
+		CleanupStack::PopAndDestroy(valueField);
+		
+		if (value)
+			iWaitForDialTonePref = RCall::EDialToneWait;
+		else
+			iWaitForDialTonePref = RCall::EDialToneNoWait;
+		}
+
+	if (iModemBearer != 0)
+		{
+		CMDBField<TUint32>* speakerPrefField = new(ELeave) CMDBField<TUint32>(KCDTIdSpeakerPref);
+		CleanupStack::PushL(speakerPrefField);
+		speakerPrefField->SetRecordId(iModemBearer);
+		speakerPrefField->LoadL(*iDbSession);
+		iSpeakerSetting = static_cast<RCall::TMonitorSpeakerControl>(static_cast<TUint32>(*speakerPrefField));
+		CleanupStack::PopAndDestroy(speakerPrefField);
+		
+		CMDBField<TUint32>* speakerVolPrefField = new(ELeave) CMDBField<TUint32>(KCDTIdSpeakerVolPref);
+		CleanupStack::PushL(speakerVolPrefField);
+		speakerVolPrefField->SetRecordId(iModemBearer);
+		speakerVolPrefField->LoadL(*iDbSession);
+		iSpeakerVolume = static_cast<RCall::TMonitorSpeakerVolume>(static_cast<TUint32>(*speakerVolPrefField));			
+		CleanupStack::PopAndDestroy(speakerVolPrefField);
+		}
+
+	TUint32 rate;
+	TUint32 dataBits;
+	TUint32 stopBits;
+	TUint32 parity;
+	TUint32 handshake;
+	
+	if (iModemBearer == 0)
+		{
+		iSpeakerSetting = KDefaultModemSpeakerSetting;
+		iSpeakerVolume = KDefaultMonitorSpeakerVolume;
+		User::Leave(KErrNotFound);
+		}
+
+	CMDBField<TUint32>* rateField = new(ELeave) CMDBField<TUint32>(KCDTIdRate);
+	CleanupStack::PushL(rateField);
+	rateField->SetRecordId(iModemBearer);
+	rateField->LoadL(*iDbSession);
+	rate = *rateField;
+	CleanupStack::PopAndDestroy(rateField);
+	
+	CMDBField<TUint32>* dataBitsField = new(ELeave) CMDBField<TUint32>(KCDTIdDataBits);
+	CleanupStack::PushL(dataBitsField);
+	dataBitsField->SetRecordId(iModemBearer);
+	dataBitsField->LoadL(*iDbSession);
+	dataBits = *dataBitsField;
+	CleanupStack::PopAndDestroy(dataBitsField);
+
+	CMDBField<TUint32>* stopBitsField = new(ELeave) CMDBField<TUint32>(KCDTIdStopBits);
+	CleanupStack::PushL(stopBitsField);
+	stopBitsField->SetRecordId(iModemBearer);
+	stopBitsField->LoadL(*iDbSession);
+	stopBits = *stopBitsField;
+	CleanupStack::PopAndDestroy(stopBitsField);
+	
+	CMDBField<TUint32>* parityField = new(ELeave) CMDBField<TUint32>(KCDTIdParity);
+	CleanupStack::PushL(parityField);
+	parityField->SetRecordId(iModemBearer);
+	parityField->LoadL(*iDbSession);
+	parity = *parityField;
+	CleanupStack::PopAndDestroy(parityField);
+	
+	CMDBField<TUint32>* handshakeField = new(ELeave) CMDBField<TUint32>(KCDTIdHandshaking);
+	CleanupStack::PushL(handshakeField);
+	handshakeField->SetRecordId(iModemBearer);
+	handshakeField->LoadL(*iDbSession);
+	handshake = *handshakeField;
+	CleanupStack::PopAndDestroy(handshakeField);
+
+	iConfig.iRate = (TBps)rate;
+	iConfig.iDataBits = (TDataBits)dataBits;
+	iConfig.iStopBits = (TStopBits)stopBits;
+	iConfig.iParity = (TParity)parity;
+	iConfig.iHandshake = (TUint)handshake;
+	}
+
+CTsyConfig::~CTsyConfig()
+	{
+	// Just in case these have not been cleared
+	delete iDbSession;
+	}
+
+void CTsyConfig::CommConfigL(TCommConfigV01& aConfig)
+	{
+	aConfig = iConfig;
+	}
+
+TInt CTsyConfig::ConfigModemStringL(const TDesC& aStringTag, TDes8& aString)
+	{
+	TInt r=KErrNone;
+	for (TInt i=0;i<10;i++)
+		{
+		TRAP(r, GetCurrentTableViewsL()); // Place a cursor on the default modem record in comms database server
+		if (r==KErrAccessDenied) // if we get access denied from DBMS, which is a timing thing, just re-post
+			{
+			User::After(1000000);
+			continue;
+			}
+		else
+			break;
+		}
+	if (r)
+		{
+		LOGTEXT(_L8("CommDB values seem to be corrupt"));
+		ResetCurrentTableViews(); // clean up everything
+		return (KErrEtelModemSettingsCorrupt);
+		}
+
+	CCDModemBearerRecord* modemRecord = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
+	CleanupStack::PushL(modemRecord);
+	modemRecord->SetRecordId(iModemBearer);
+	modemRecord->LoadL(*iDbSession);
+	
+	TInt ret;
+	TInt type(0);
+	CMDBElement* baseField = NULL;
+	TRAP(ret, baseField = modemRecord->GetFieldByNameL(aStringTag, type));
+	if (ret == KErrNone)
+		{
+		// check for type
+		switch(type)
+			{
+			case EMedText:
+			case EText:
+				{
+				CMDBField<TDesC>* field16 = static_cast<CMDBField<TDesC>*>(baseField);
+				const TDesC& refField = *field16;
+				aString.Copy(refField);
+				ret = KErrNone;
+				}
+				break;
+			case EDesC8:
+				{
+				CMDBField<TDesC8>* field = static_cast<CMDBField<TDesC8>*>(baseField);
+				aString = *field;
+				ret = KErrNone;
+				}
+				break;
+			default:
+				ret = KErrNotFound;
+			}
+    	}
+	CleanupStack::PopAndDestroy(modemRecord);
+
+	ResetCurrentTableViews(); // Clear location and modem table views and close handle to CCommsDatabase
+	return ret;
+	}
+
+TInt CTsyConfig::ConfigModemStringL(const TDesC& aStringTag, TDes16& aString)
+	{
+	TInt r=KErrNone;
+	for (TInt i=0;i<10;i++)
+		{
+		TRAP(r, GetCurrentTableViewsL()); // Place a cursor on the default modem record in comms database server
+		if (r==KErrAccessDenied) // if we get access denied from DBMS, which is a timing thing, just re-post
+			{
+			User::After(1000000);
+			continue;
+			}
+		else
+			break;
+		}
+	if (r)
+		{
+		LOGTEXT(_L8("CommDB values seem to be corrupt"));
+		ResetCurrentTableViews(); // clean up everything
+		return (KErrEtelModemSettingsCorrupt);
+		}
+
+	CCDModemBearerRecord* modemRecord = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
+	CleanupStack::PushL(modemRecord);
+	modemRecord->SetRecordId(iModemBearer);
+	modemRecord->LoadL(*iDbSession);
+
+	
+	TInt ret;
+	TInt type(0);
+	CMDBElement* baseField = NULL;
+	TRAP(ret, baseField = modemRecord->GetFieldByNameL(aStringTag, type));
+	if (ret == KErrNone)
+		{
+		// check for type
+		switch(type)
+			{
+			case EMedText:
+			case EText:
+		
+				{
+				CMDBField<TDesC>* field = static_cast<CMDBField<TDesC>*>(baseField);
+				aString = *field;
+				ret = KErrNone;
+				}
+				break;
+			case EDesC8:
+				{
+				// des16 needs to be cast to des8
+				CMDBField<TDesC8>* field8 = static_cast<CMDBField<TDesC8>*>(baseField);
+				const TDesC8& refField = *field8;
+				aString.Copy(refField);
+				ret = KErrNone;
+				}
+				break;
+			default:
+				ret = KErrNotFound;
+			}
+		}
+	
+	CleanupStack::PopAndDestroy(modemRecord);
+
+	ResetCurrentTableViews(); // Clear location and modem table views and close handle to CCommsDatabase
+	return ret;
+	}
+
+TInt CTsyConfig::ConfigModemString(const TDesC& aStringTag, TDes8& aString)
+	{
+	TInt ret = KErrNone;
+	TRAPD(error, ret = ConfigModemStringL(aStringTag, aString));
+	if(error != KErrNone)
+		{
+		ret = error;
+		}
+	return ret;
+	}
+
+TInt CTsyConfig::ConfigModemString(const TDesC& aStringTag, TDes16& aString)
+	{
+	TInt ret = KErrNone;
+	TRAPD(error, ret = ConfigModemStringL(aStringTag, aString));
+	if(error != KErrNone)
+		{
+		ret = error;
+		}
+	return ret;
+	}
+
+void CTsyConfig::GetIntervalPref(TInt& aInterval)
+/**
+ * Stores the Interval Preferences settings internally. These settings are stored on construction
+ * of the CTsyConfig object.
+ * @param aInterval Interval Preference setting
+ */
+	{
+	aInterval = iInterval;
+	}
+
+void CTsyConfig::GetSpeakerSettingPref(RCall::TMonitorSpeakerControl& aSpeakerSetting)
+/**
+ * Stores the Speaker Preferences settings internally. These settings are stored on construction
+ * of the CTsyConfig object.
+ * @param aSpeakerSetting Speaker Preference setting
+ */
+	{
+	aSpeakerSetting = iSpeakerSetting;
+	}
+
+void CTsyConfig::GetSpeakerVolumePref(RCall::TMonitorSpeakerVolume& aSpeakerVolume)
+/**
+ * Stores the Speaker Volume Preferences settings internally. These settings are stored on construction
+ * of the CTsyConfig object.
+ * @param aSpeakerVolume Speaker Volume setting
+ */
+	{
+	aSpeakerVolume = iSpeakerVolume;
+	}
+
+void CTsyConfig::GetWaitForDialTonePref(RCall::TWaitForDialTone& aWaitForDialTonePref)
+/**
+ * Stores the Dial Tone Preferences settings internally. These settings are stored on construction
+ * of the CTsyConfig object.
+ * @param aWaitForDialTonePref Wait for Dial Tone Preference setting
+ */
+	{
+	aWaitForDialTonePref = iWaitForDialTonePref;
+	}
+
+TInt CTsyConfig::PortConfig(TCommConfig& aConfigPckg, TConfigType aConfigType)
+/**
+ * Gets the port config settings and masks out appropriate handshaking settings
+ * according to whether state is about to initialise, just connected or about to hang up
+ */ 
+	{
+	TInt r=KErrNone;
+	for (TInt i=0;i<10;i++)
+		{
+		TRAP(r, GetCurrentTableViewsL()); // Place a cursor on the default modem record in comms database server
+		if (r==KErrAccessDenied) // if we get access denied from DBMS, which is a timing thing, just re-post
+			{
+			User::After(1000000);
+			continue;
+			}
+		else
+			break;
+		}
+	if (r)
+		{
+		LOGTEXT(_L8("CommDB values seem to be corrupt"));
+		ResetCurrentTableViews(); // clean up everything
+		return (KErrEtelModemSettingsCorrupt);
+		}
+
+	TCommConfig configDummyPckg;
+	TCommConfigV01& config=configDummyPckg();
+	if (aConfigType==EConfigTypeHangUp ||
+		aConfigType==EConfigTypeQuickInit)
+		{
+		config = iConfig;
+		config.iHandshake = 0;//&= (~(KConfigFailDCD | KConfigObeyDCD | KConfigFailDSR));
+		}
+	else
+		{
+		TRAPD(ret,CommConfigL(config));
+		if (ret)
+			return ret;
+		switch (aConfigType)
+			{
+		case EConfigTypePreInit:
+			config.iHandshake &= (~(KConfigObeyCTS | KConfigFailCTS | KConfigObeyDCD | KConfigFailDCD | KConfigFailDSR));
+			break;
+		case EConfigTypeInit:
+			config.iHandshake &= (~(KConfigObeyCTS | KConfigFailCTS | KConfigObeyDCD | KConfigFailDCD));
+			break;
+		case EConfigTypeConnect:
+			config.iHandshake &= (~(KConfigFailCTS | KConfigFailDCD));	// fail DCD masked out, as should get NO CARRIER anyway
+			break;
+		case EConfigTypeFull:
+			break;
+		case EConfigTypeDDBugWorkAroundStart:
+			if (config.iRate!=EBps300)	// ensure that something other than handshaking has changed
+				config.iRate=EBps300;	// to work around the bug in the ARM device driver
+			else
+				config.iRate=EBps2400;
+			config.iHandshake=0;
+			break;
+		case EConfigTypeDDBugWorkAroundEnd:
+			config.iHandshake=0;
+			break;
+		default:
+			break;
+			}
+		}
+	aConfigPckg=configDummyPckg;
+	ResetCurrentTableViews(); // Clear location and modem table views and close handle to CCommsDatabase
+	return KErrNone;
+	}
+
+void CTsyConfig::GetCurrentTableViewsL() 
+/**
+ * Opens a handle to CCommsDatabase	and positions the view on the default modem specified 
+ * in the current Connected Modem record.
+ * Note that the TSY does not keep the handle to the CCommsDatabase opened all the time, 
+ * therefore this method is used to open the handle only when needed. The methods using 
+ * this method are also responsible for calling ResetCurrentTableViews() to close the
+ * handle to the CCommsDatabase and to clean up the table views.
+ */
+	{
+	if(iManualConfigMode)
+		{	
+		GetRequestedTableViewsL();
+		}
+	else
+		{
+		ResetCurrentTableViews();
+		
+#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
+		iDbSession = CMDBSession::NewL(KCDVersion1_2);
+#else
+		iDbSession = CMDBSession::NewL(KCDVersion1_1);
+#endif
+		__ASSERT_DEBUG(iDbSession,Panic(ETsyConfigNullDBPointer));
+
+		TUint32 modemId(0), locationId(0);
+
+		// 
+		// Search the bearer tables for records using the MM.TSY
+		GetModemBearerIdL(modemId);
+	
+		//
+		// Get the associated locationId
+		
+		GetLocationIdL(modemId,locationId);
+		
+		//Check if the selected bearer is an MMTSY bearer with a valid location
+		if(!modemId || !locationId) 
+			{
+			//
+			// Selected bearer does not mention the MMTSY
+			LOCAL_LOGTEXT("GetCurrentSettingsL","MMTSY not mentioned in the selected bearer");
+			__ASSERT_DEBUG(EFalse,Panic(ETsyConfigMMTSYNotInModemTables));
+			User::Leave(KErrNotFound);
+			}
+		else
+			{
+						
+			iModemBearer = modemId;			
+			iLocationId = locationId;
+				
+			}
+		}
+	}
+void CTsyConfig::SetTableViewsL(RMobilePhone::TMMTableSettings& aMMTableSettings)
+	{
+	if(iManualConfigMode)
+		{
+		iMMTableSettings=aMMTableSettings;
+
+		ResetCurrentTableViews(ETrue); // Clear location and modem table views and close handle to CCommsDatabase
+		GetRequestedTableViewsL();
+		GetLocationModemSettingsL(); // Get other location and modem settings 
+		}
+	}	
+
+
+void CTsyConfig::GetRequestedTableViewsL()
+	{
+	
+	if (iDbSession == NULL)
+		{
+#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
+		iDbSession = CMDBSession::NewL(KCDVersion1_2);
+#else
+		iDbSession = CMDBSession::NewL(KCDVersion1_1);
+#endif
+		__ASSERT_DEBUG(iDbSession,Panic(ETsyConfigNullDBPointer));
+				
+		iModemBearer = 0;
+
+		CMDBField<TUint32>* bearerField = new(ELeave) CMDBField<TUint32>(KCDTIdIAPBearer);
+		CleanupStack::PushL(bearerField);
+		bearerField->SetRecordId(iMMTableSettings.iLocId);
+		bearerField->LoadL(*iDbSession);
+		iModemBearer = *bearerField;
+		CleanupStack::PopAndDestroy(bearerField);
+		}
+		
+		TName modem;
+		CMDBField<TDesC>* tsyField = new(ELeave) CMDBField<TDesC>(KCDTIdTsyName);
+		CleanupStack::PushL(tsyField);
+		tsyField->SetRecordId(iModemBearer);
+		tsyField->SetMaxLengthL(KMaxTextLength);
+		tsyField->LoadL(*iDbSession);
+		modem = *tsyField;
+		CleanupStack::PopAndDestroy(tsyField);
+		
+
+		if(modem.Compare(_L("MM"))!=KErrNone)
+			{
+			// Selected bearer does not mention the MMTSY
+			LOCAL_LOGTEXT("GetCurrentSettingsL","Bearer for selected IAP does not use MMTSY");
+			__ASSERT_DEBUG(EFalse,Panic(ETsyConfigMMTSYNotInModemTables));
+			User::Leave(KErrNotFound);
+			}
+
+
+
+	}
+	
+void CTsyConfig::ResetCurrentTableViews(TBool aForceErase)
+/**
+ * Closes the handle to CCommsDatabase and clears the view on the default modem specified 
+ * in the current Connected Modem record. This method needs to be called after 
+ * GetCurrentTableViewsL().
+ */
+	{
+	if( !iManualConfigMode || aForceErase )
+		{
+		delete iDbSession;
+		iDbSession = NULL;		
+
+		}
+	}
+
+void CTsyConfig::GetLocationIdL(const TUint32& aBearerId,TUint32& aLocationId) 
+/*
+ *  Scan through the table for records containing MM.TSY
+ *  Stop at the first instance of such a record and return the id
+ *
+ */
+ 	{
+    CCDIAPRecord *iapRecord = static_cast<CCDIAPRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
+  	CleanupStack::PushL(iapRecord);
+  	
+  	iapRecord->iBearer = aBearerId;
+  	TBool err = iapRecord->FindL(*iDbSession);
+  	if (err)
+  		{
+  		aLocationId = iapRecord->iLocation;
+  		}
+  	else
+  		{
+  		aLocationId = static_cast<TUint32>(KErrNotFound);
+  		}
+  	
+    CleanupStack::PopAndDestroy(iapRecord);
+    
+	}
+
+void CTsyConfig::GetModemBearerIdL(TUint32& aBearerId) 
+/*
+ *  Scan through the table for records containing MM.TSY
+ *  Stop at the first instance of such a record and return the id
+ *
+ */
+	{
+    CCDModemBearerRecord *modemRecord = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
+    CleanupStack::PushL(modemRecord);
+    
+    _LIT(KTsyName,"MM");
+    modemRecord->iTsyName.SetMaxLengthL(KMaxTextLength);
+    modemRecord->iTsyName = KTsyName;
+    
+    TBool searchResult = modemRecord->FindL(*iDbSession);
+    
+    if (searchResult)
+	    {
+		aBearerId = modemRecord->RecordId();	
+	    }
+	else
+		{
+		aBearerId = static_cast<TUint32>(KErrNotFound);
+		}
+    
+    CleanupStack::PopAndDestroy(modemRecord);
+	}