cbsref/csyrefplugins/csy27010/src/PortFactory.cpp
branchRCL_3
changeset 66 07a122eea281
parent 65 630d2f34d719
child 67 4eff64595c44
child 70 4814c5a49428
--- a/cbsref/csyrefplugins/csy27010/src/PortFactory.cpp	Tue Aug 31 16:23:08 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,982 +0,0 @@
-//
-// * Copyright 2004 Neusoft America Inc.
-// * All rights reserved.
-// * This component and the accompanying materials are made available
-// * under the terms of the Eclipse Public License v1.0
-// * which accompanies this distribution, and is available
-// * at the URL "http://www.eclipse.org/legal/epl-v10.html".
-// *
-// * Contributors:
-// * Keith Collins (Neusoft America Inc.)  original software development and additional code and modifications.
-// * Thomas Gahagen (Neusoft America Inc.)  additional code and modifications.
-// * Zhen Yuan (Neusoft America Inc.)  additional code and modifications.
-// *
-// * Description:  This file contains the implementation for the class CPortFactory.
-// *               This class is used to create C32 port interface instances.
-//
-
-// PortFactory.cpp
-
-/** @file PortFactory.cpp
- *
- */
-
-/*! \mainpage CSY 27.010 Documentation
- *
- * \section intro Introduction
- *
- * This CSY has been designed and implemented by TapRoot Systems.
- * This CSY is part of the TapRoot Systems Communications Platform (CommP)
- * product family for Symbian OS. Please contact TapRoot Systems for 
- * information on CommP.
- * <p>
- * A CSY is a specialized type of DLL that implements API interfaces
- * required by the C32 Serial Communications Server. "CSY" is the file
- * name extension used by CSY modules as in "ecuart.csy", which is the
- * name of Symbian's generic CSY for non-multiplexed serial ports.  
- * TapRoot Systems 27.010 CSY (gsm0701.csy) is compatible with the
- * 3GPP 27.010 v5.0.0 specification.
- * <p>
- * The CSY has been designed and tested with the Intel Lubbock application
- * processor, TI Condat baseband processor and Symbian OS 8.0a.
- * The CSY is not guaranteed to work with other AP's, BP's or Symbian OS versions.
- * The CSY has been integrated with Symbian OS supplied TSY and NIF IP.
- * The CSY is not guaranteed to work with other TSY's and NIF's.
- *
- * \section feat Features
- *
- * The CSY supports the 27.010 Basic Option. The 3GPP 27.010 specification 
- * is derived from the GSM 07.10 specification. 3GPP 27.010 defines a mechanism
- * whereby multiple commands and data streams can be carried over the same
- * physical link. This specification defines a multiplexing protocol between
- * a Terminal Equipment (TE) and a Mobile Station (MS) allowing multiple 
- * simultaneous sessions over a single start-stop, framed, serial link. 
- * Each session (channel) can carry different types of data including voice,
- * fax, data, SMS, CBS, phonebook maintenance, battery status, GPRS, USSD, etc.
- * <p>
- * The multiplexer has three operating options, basic, advanced without error
- * recovery and advanced with error recovery. CSY 27.010 supports the
- * basic option. The basic option is recommended on highly reliable links. 
- * Advanced options are not supported by the CSY. The characteristics of the 
- * basic option are:
- * <li> Length indicator used instead of the HDLC transparency mechanism
- * <li> Different flag octet from that used by HDLC
- * <li> Cannot be used on links that use XON/XOFF flow control
- * <li> May have longer recovery procedure from loss of synchronization
- * <p>
- * Each channel between the TE and MS is called a Data Link Connection (DLC).
- * A special DLC called "control channel" is used to exchange management 
- * information (e.g. parameter negotiation), power saving control information,
- * testing, flow control, close down, etc. between the TE and MS.
- * <p>
- * The multiplexer is activated with the 3GPP 27.007 AT+CMUX command.
- * <p>
- * 
- * \section install Installation
- *
- * Refer to the readme.txt file for installation and build instructions.
- * <br>
- * Please contact TapRoot Systems for information on product updates and
- * additional support.
- */
-
-/** @file PortFactory.cpp
- * This file contains the implementation for the class CPortFactory.
- * This class is used to create C32 port interface instances.
- */
-
-#include <cs_port.h>
-#include <f32file.h>
-#include <commsdattypesv1_1.h>
-#include <commsdat_partner.h>
-using namespace CommsDat;
-#include "Portfactory.h"
-#include "CsyGlobals.h"
-#include "Mux0710Protocol.h"
-#include "ChannelMgrCtrl.h"
-#include "ChannelMgrCmdData.h"
-#include "PortC32InterfaceBase.h"
-#include "PortC32Interface.h"
-#include "PortC32InterfaceIp.h"
-#include "CommFrameWriterAo.h"
-#include "CommFrameReaderAo.h"
-#include "CsyDebugLogger.h"
-
-CPortFactory* CPortFactory::NewL()
-/**
- * This method uses two phase construction and the cleanup stack to create
- * an instance of class CPortFactory. This method is invoked when the user
- * invokes the C32 comm server's LoadCommModule() method to load the CSY.
- * Note that multiple instances of CPortFactory can be created by C32,
- * so no memory allocation or objects should be created when the 
- * port factory is first created.
- *
- * @return Pointer to the created instance of CPortFactory
- */
-	{
-	_LOG_L4C1("CPortFactory::NewL");
-
-	CPortFactory* self = new(ELeave) CPortFactory;
-	TCleanupItem closeSelf(CPortFactory::CloseObject, self);
-	CleanupStack::PushL(closeSelf);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return (self);
-	}
-
-CPortFactory::CPortFactory()
-: iPortC32InterfaceList(_FOFF(CPortC32Interface, iLink)),
-  iPortC32InterfaceIter(iPortC32InterfaceList),
-  iDataChannelList(_FOFF(CChannelMgrCmdData, iLink)),
-  iDataChannelIter(iDataChannelList)
-/**
- * Constructor.
- */
-	{
-	_LOG_L4C1("CPortFactory::CPortFactory");
-	}
-
-CPortFactory::~CPortFactory()
-/**
- * Destructor. Delete all objects and memory created/allocated by this class.
- */
-	{
-	_LOG_L4C1(">>CPortFactory::~CPortFactory");
-
-	// check if the CSY's objects have been created 
-	// C32 creates a new instance of the port factory each time a client
-	// loads the CSY. The C32 recognizes a redundant CSerial name and promptly
-	// destroys the redundant CSY.
-	if (iMuxObjectsCreated)
-		{
-		// client channels
-		CChannelMgrCmdData* anyChannel = NULL;
-		iDataChannelIter.SetToFirst();
-		while ((anyChannel = iDataChannelIter++) != NULL)
-			{
-			iDataChannelList.Remove(*anyChannel);
-			delete anyChannel;
-			}
-
-		// control channel
-		delete iChannelCtrl;
-
-		delete iCommWriterAo;
-		delete iCommReaderAo;
-
-		delete iMux0710Protocol;
-
-		// may not be necessary ???
-		// MAF /\ what does this comment mean
-
-		// delete any remaining C32 port objects that were not closed by the client
-		CPortC32InterfaceBase* port = NULL;
-		iPortC32InterfaceIter.SetToFirst();
-		while ((port = iPortC32InterfaceIter++) != NULL)
-			{
-			delete port;
-			}
-
-		iCommPort.Close();
-		}
-
-	//iMuxObjectsCreated = EFalse;
-
-	_LOG_L4C1("<<CPortFactory::~CPortFactory");
-	_LOG_L3C1(" ");
-	}
-
-void CPortFactory::ConstructL()
-/**
- * 2nd-phase construction. Registers the CSY Name with C32.
- */
-	{
-	_LOG_L4C1("CPortFactory::ConstructL");
-
-#ifdef _DEBUG
-	TInt usedCellCount;
-	TInt freeCellCount;
-	usedCellCount = User::CountAllocCells(freeCellCount);
-	_LOG_L4C3("Cell Counts Used = %d   Free = %d", usedCellCount, freeCellCount);
-#endif
-
-	// inform C32 of the CSY name
-	TName name(KCSY_Gsm0710ServerName);
-	TInt retVal1 = SetName(&name);
-	if (retVal1 != KErrNone)
-		{
-		_LOG_L1C3("** Failed to set CSY:%S in C32. Err: %d **", &name, retVal1);
-		User::Leave(retVal1);
-		}
-	iVersion = TVersion(KCSY_Gsm0710MinorVersionNumber,
-						KCSY_Gsm0710MajorVersionNumber,
-						KCSY_Gsm0710BuildVersionNumber);
-	}
-
-void CPortFactory::CreateCsyObjectsL()
-/**
- * This method is called to create the CSY objects for the multiplexing channels,
- * message queues, i/o interface, etc.  This method should be called when the
- * 1st client request to create a port is received by the CSY via NewPortL().
- */
-	{
-	_LOG_L4C1(">>CPortFactory::CreateCsyObjectsL");
-
-	// set flag
-	iMuxObjectsCreated = ETrue;
-	iOpenPortFailed = EFalse;
-
-	// load physical device drivers for serial port(s)
-
-#ifdef __WINS__
-	// 1st make sure the file server is running
-	RFs fileServer;
-	User::LeaveIfError(fileServer.Connect());
-	fileServer.Close();
-
-	_LIT(KPDDName, "ECDRV");
-	TInt retVal1 = User::LoadPhysicalDevice(KPDDName);
-	if ((retVal1 != KErrNone) && (retVal1 != KErrAlreadyExists))
-		User::Leave(retVal1);
-
-#else  // target
-
-	TBuf<20> commPddName;
-	TInt retVal1;
-
-	commPddName.Copy(KCsyDefaultPDDNameComm1);
-	retVal1 = User::LoadPhysicalDevice(commPddName);
-	if ((retVal1 != KErrNone) && (retVal1 != KErrAlreadyExists))
-		User::Leave(retVal1);
-	// only load 2nd PDD if debugging is enabled 
-
-#ifdef __DEBUGSERIALPORT__
-	commPddName.Copy(KCsyDefaultPDDNameComm2);
-	retVal1 = User::LoadPhysicalDevice(commPddName);
-	if ((retVal1 != KErrNone) && (retVal1 != KErrAlreadyExists))
-		User::Leave(retVal1);
-#endif //__DEBUGSERIALPORT__
-
-#endif  //__WINS__
-
-	// load logical device driver for serial ports
-	_LIT(KLDDName, "ECOMM");
-	retVal1 = User::LoadLogicalDevice(KLDDName);
-	if ((retVal1 != KErrNone) && (retVal1 != KErrAlreadyExists))
-		User::Leave(retVal1);
-
-	ConfigurePhysicalCommPortL();
-	
-	// create 27.010 framer and comm i/o objects
-	iMux0710Protocol = CMux0710Protocol::NewL(*this);
-	iCommWriterAo    = CCommFrameWriterAo::NewL(this, iMux0710Protocol);
-	iMux0710Protocol->SetCommWriter(iCommWriterAo);
-
-	iCommReaderAo    = CCommFrameReaderAo::NewL(this, iMux0710Protocol);
-	iCommReaderAo->Read();  // start it
-	
-	// create the Multiplexer Control Channel
-	iChannelCtrl = CChannelMgrCtrl::NewL(*this, *iMux0710Protocol);
-
-	// create All Multiplexer Channels	
-	for (TUint8 i=1; i < KCsyDefaultMaxDLCChannels; i++)
-		{
-		CChannelMgrCmdData* channelMgrCmd =
-			CChannelMgrCmdData::NewL(i, *this, *iMux0710Protocol);
-		iDataChannelList.AddLast(*channelMgrCmd);
-		}
-
-	// switch to multiplexer mode
-	iMux0710Protocol->SwitchToMuxMode();
-
-#ifdef _DEBUG
-	TInt usedCellCount;
-	TInt freeCellCount;
-	usedCellCount = User::CountAllocCells(freeCellCount);
-	_LOG_L4C3("Cell Counts Used = %d   Free = %d", usedCellCount, freeCellCount);
-#endif
-
-	_LOG_L4C1("<<CPortFactory::CreateCsyObjectsL");
-	}
-
-void CPortFactory::CloseObject(TAny* aObject)
-/**
- * Utility to close objects created by the port factory. 
- * Used during construction with the cleanup stack.
- *
- * @param aObject - The CObject to close.
- * @return void
- */
-	{
-	reinterpret_cast<CObject*>(aObject)->Close();
-	}
-
-CPort* CPortFactory::NewPortL(const TUint aUnit)
-/**
- * This method is called by C32 when a port is opened via RComm::Open().
- * An instance of the CSY's class CPortC32Interface is created.
- * The instance is assigned a channel manager and then is added to
- * the list of C32 port interface objects.
- *
- * @param aUnit - Numeric portion of the port identifier
- * @return Pointer to the created C32 port interface object
- */
-	{
-	_LOG_L4C2(">>CPortFactory::NewPortL [aUnit=%d]", aUnit);
-
-	TC32PortInfo portInfo;
-
-	portInfo.iClientType = GetClientType(aUnit);
-	portInfo.iPortNumber = aUnit;
-
-	// check if port number is valid and translates to a client type
-	if (portInfo.iClientType == EC32ClientUndefined)
-		{
-		_LOG_L4C1("<<CPortFactory::NewPortL - ** Unknown client **");
-		return NULL;
-		}
-
-	// check if this is the 1st port to be opened
-	if (!iMuxObjectsCreated)
-		{
-		_LOG_L4C1("first port to be opened");
-		CreateCsyObjectsL();
-		}
-	else if (iChannelCtrl->GetChannelReady() == EFalse)
-		{
-		_LOG_L4C1("CSY objects already exist");
-		// switch to multiplexer mode
-		iMux0710Protocol->SwitchToMuxMode();
-		}
-
-	// first make sure control channel is already connected
-	iChannelCtrl->WaitForChannelReady();
-	
-	if (! iOpenPortFailed)
-		{
-		// create a new C32 Interface Port based on port number
-		CPortC32InterfaceBase* port = NULL;
-	
-		if (portInfo.iClientType == EC32ClientIpNif)
-			{
-			_LOG_L4C1("Raw IP port");
- 			port = CPortC32InterfaceIp::NewL(*this, portInfo);
- 			}
-		else
-			{
-			_LOG_L4C1("Normal port");
- 			port = CPortC32Interface::NewL(*this, portInfo);
- 			}
-	
-		CleanupStack::PushL(port);
-		CChannelMgrCmdData* channel = FindChannelMgr(aUnit);
-
-		if (channel == NULL)
-			{
-			_LOG_L2C1("** channel is null, delete interface **");
-			CleanupStack::PopAndDestroy(port);
-			User::Leave(KErrNotFound);
-			}
-		TName name;
-		name.Format(_L("%d"), aUnit);
-		port->SetName(&name);
-
-		// channel->Open() will add this port to it's port list, and connect channel if needed
-		// Make sure that during channel init we do not tx/rx through channel
-		channel->Open(port);
-	
-		iNumOfOpenPorts++;
-		_LOG_L4C2("No. of ports = %d",iNumOfOpenPorts);
- 		
-		port->SetMuxChannel(channel);
-
-		channel->WaitForChannelReady();
-
-		//Need to wait for the channel to be ready. How to wait for something without blocking whole thread?
-		// add it to list of ports
-		iPortC32InterfaceList.AddLast(*port);	
-		CleanupStack::Pop(port);
-
-#ifdef _DEBUG
-		TInt usedCellCount;
-		TInt freeCellCount;
-		usedCellCount = User::CountAllocCells(freeCellCount);
-		_LOG_L4C3("Cell Counts Used = %d   Free = %d", usedCellCount, freeCellCount);
-#endif
-
-		_LOG_L4C2("<<CPortFactory::NewPortL [port=%d]", port);
-		return port;
-		}
-	else //iPortOpenFailed == ETrue
-		{
-		_LOG_L4C1("<<CPortFactory::NewPortL [port=NULL]");
-		User::Leave(KErrTimedOut);
-		return NULL;
-		}
-	}
- 
-void CPortFactory::Info(TSerialInfo& aSerialInfo)
-/**
- * Called by C32 to identify the CSY module.
- * @param aSerialInfo - Reference holder for information to be populated by the function.
- * @return void
- */
-	{
-	_LOG_L4C1("CPortFactory::Info");
-
-	aSerialInfo.iDescription	= KCSY_Description;
-	aSerialInfo.iName			= KCSY_Gsm0710ServerName;
-	aSerialInfo.iLowUnit		= KCSY_Gsm0710LowUnit;
-	aSerialInfo.iHighUnit		= KCSY_Gsm0710HighUnit;
-	}
-
-CPortFactory::TC32ClientType CPortFactory::GetClientType(TInt aC32PortNum)
-/**
- * Returns the ClientType for the specified C32 port number.
- * @param aC32PortNum -  C32 port number
- * @return Client type - TSY or NIF
- */
-	{ 
-	_LOG_L4C2("CPortFactory::GetClientType [aC32PortNum=%d]", aC32PortNum);
-
-	if (aC32PortNum >= KCOMMP_IP_NIF_OFFSET)
-		{
-		_LOG_L4C1("Raw Ip");
-		return CPortFactory::EC32ClientIpNif;
-		}
-	else if (aC32PortNum == KCOMMP_CSD_PPP_NUMBER)
-		{ 
-		_LOG_L4C1("Csd PPP");
-		return CPortFactory::EC32ClientNif;
-		}
-
-	_LOG_L4C1("Tsy");
-	return CPortFactory::EC32ClientTsy;
-	}
-
-CPortC32InterfaceBase* CPortFactory::FindPortC32Interface(const TUint8 aDlcNum)
-/**
- * This method returns a pointer to the C32 port interface object 
- * that is associated with the specified DLC number.
- *
- * @param aDlcNum - DLC number
- * @return Pointer to C32 port interface object or NULL if not found
- */
-	{
-	_LOG_L4C2(">>CPortFactory::FindPortC32Interface [aDlcNum=%d]", aDlcNum);
-
-	CPortC32InterfaceBase* port = NULL;
-
-	CChannelMgrCmdData* anyChannel = NULL;
-	iDataChannelIter.SetToFirst();
-	while ((anyChannel = iDataChannelIter++) != NULL)
-		{
-		if (anyChannel->GetDlcNumber() == aDlcNum)
-			{
-			_LOG_L4C1("AT channel");
-			port = anyChannel->GetC32Port();
-			break;
-			}
-		}
-	
-	_LOG_L4C2("<<CPortFactory::FindPortC32Interface [port=0x%x]",port);
-	return port;
-	}
-
-CChannelMgrCmdData* CPortFactory::FindChannelMgr(const TUint aC32PortNum)
-/**
- * This method is only called when a port is created.
- *
- * @param aC32PortNum - C32 port number
- * @return Pointer to the channel manager object or NULL
- */
-	{
-	_LOG_L4C2(">>CPortFactory::FindChannelMgr [aC32PortNum=%d]", aC32PortNum);
-
-	TUint dlcNum = ++iLastDlcNum;
-	_LOG_L4C2("iLastDlcNum: %d", iLastDlcNum);
-
-	//
-	// MAF Horrible
-	// This just counts through the array of channel pointers
-	// and returns a pointer when the count gets to the correct value.
-	// 
-	// We should be able to use an array here and directly access it using
-	// the dlc number!?!?
-	//
-
-	TUint count  = 1;
-	CChannelMgrCmdData* anyChannelCmd;
-
-	iDataChannelIter.SetToFirst();
-	while ((anyChannelCmd = iDataChannelIter++) != NULL)
-		{
-		if (count == dlcNum)
-			{
-			_LOG_L4C2("<<CPortFactory::FindChannelMgr() - found, count %d",count);
-			return anyChannelCmd;
-			}
-		count++;
-		}
-
-	_LOG_L4C1("<<CPortFactory::FindChannelMgr() - *** NOT FOUND ***");
-	return NULL;
-	}
-
-CChannelMgrCmdData* CPortFactory::FindChannelMgrByDlcNum(const TUint8 aDlcNum)
-/**
- * This method returns a pointer to the channel manager object 
- * that has the specified  DLC number.
- *
- * @param aDlcNum -  DLC number
- * @return Pointer to the channel manager object or NULL
- */
-	{
-	_LOG_L4C2(">>CPortFactory::FindChannelMgrByDlcNum [aDlcNum=%d]", aDlcNum);
-
-    CChannelMgrCmdData* channel = NULL;
-	iDataChannelIter.SetToFirst();
-	while ((channel = iDataChannelIter++) != NULL)
-		{
-		if (channel->GetDlcNumber() == aDlcNum)
-			{
-			_LOG_L4C1("AT channel");
-			return channel;
-			}
-		}
-
-	_LOG_L2C1("<<CPortFactory::FindChannelMgrByDlcNum() - NOT FOUND");
-	return NULL;
-	}
-
-TInt CPortFactory::ConfigurePhysicalCommPortL()
-/**
- * This method is used to configure the specified physical comm port.
- * The parameters are read from CommDb or supplied by C32.
- * @param aPhysPortNum - Physical port number
- * @return KErrorNone or KErrAccessDenied.
- */
-	{
-	_LOG_L4C1(">>CPortFactory::ConfigurePhysicalCommPortL");
-
-	// create a package pointer
-	TPckgBuf<TCommConfigV01> newCfg;
-	TInt ret, len;
-
-	// get the modem table	- Get port settings from CommDB.
-	CMDBSession* db = CMDBSession::NewL(KCDLatestVersion);
-
-	CleanupStack::PushL(db);
-
-	TUint32 modemId = 0;
-
-	// We are using the same modem as TSY
-	// Accessing the ModemPhoneServicesSMS field in the Global Settings Table
-	CMDBField<TUint32>* globalSettingsField = new(ELeave) CMDBField<TUint32>(KCDTIdModemPhoneServicesSMS);
-	CleanupStack::PushL(globalSettingsField);
-	globalSettingsField->SetRecordId(1);
-	globalSettingsField->LoadL(*db);
-	modemId = *globalSettingsField;	// The field value gives the record id in the Modem Bearer Table.
-	CleanupStack::PopAndDestroy(globalSettingsField);
-	
-	_LOG_L4C2("Accessing modem entry %d in the modem table", modemId);
-
-	TUint32 rate;
-	TUint32 dataBits;
-	TUint32 stopBits;
-	TUint32 parity;
-	TUint32 handshake;
-	TPckgBuf<TCommConfigV01> config;
-	
-	TUint port = 0;
-	TBuf<KCommsDbSvrMaxFieldLength> controlPort;
-	
-	// Accessing the ControlChannelPort Name from the ModemBearer Table in the record number 
-	//corresponding to modemId
-	CMDBField<TDesC>* portField = new(ELeave) CMDBField<TDesC>(KCDTIdControlChannelPortName);
-	CleanupStack::PushL(portField);
-	portField->SetRecordId(modemId);
-	portField->SetMaxLengthL(KMaxTextLength);
-	portField->LoadL(*db);
-	controlPort = *portField;
-	CleanupStack::PopAndDestroy(portField);
-	// Diagnostics - control port
-	if (controlPort.Length())
-		{
-		TBuf8<16> portName;
-		portName.Copy(controlPort.Left(16));
-		_LOG_L4C2("Control port(MODEM_CONTROL_CHANNEL_PORT_NAME) '%S'",
-			&portName);
-
-		// Get number of port out of the port descriptor.
-		_LIT(KDoubleColon, "::");
-		TInt len = controlPort.Find(KDoubleColon);
-		if (len < KErrNone)
-			{
-			_LOG_L1C1("** finding :: in control port failed **");
-			User::Leave(KErrGeneral);
-			}
-		TUint numPos = len + KDoubleColon.iTypeLength;
-		TPtrC numPtr(&controlPort[numPos], controlPort.Length() - numPos);
-		TLex lexer(numPtr);
-		TInt ret = lexer.Val(port);
-		if (ret)
-			{
-			_LOG_L1C1("** lexing to get port number failed **");
-			User::Leave(ret);
-			}
-		}
-	else
-		{
-		_LOG_L1C1("** Control port not set in commDb **");
-		User::Leave(KErrGeneral);
-		}
-	
-	// Accessing the Rate from the ModemBearer Table in the record number 
-	//corresponding to modemId
-	CMDBField<TUint32>* rateField = new(ELeave) CMDBField<TUint32>(KCDTIdRate);
-	CleanupStack::PushL(rateField);
-	rateField->SetRecordId(modemId);
-	rateField->LoadL(*db);
-	rate = *rateField;
-	CleanupStack::PopAndDestroy(rateField);
-	
-	// Accessing the DataBits from the ModemBearer Table in the record number 
-	//corresponding to modemId
-	CMDBField<TUint32>* dataBitsField = new(ELeave) CMDBField<TUint32>(KCDTIdDataBits);
-	CleanupStack::PushL(dataBitsField);
-	dataBitsField->SetRecordId(modemId);
-	dataBitsField->LoadL(*db);
-	dataBits = *dataBitsField;
-	CleanupStack::PopAndDestroy(dataBitsField);
-
-	// Accessing the StopBits from the ModemBearer Table in the record number 
-	//corresponding to modemId
-	CMDBField<TUint32>* stopBitsField = new(ELeave) CMDBField<TUint32>(KCDTIdStopBits);
-	CleanupStack::PushL(stopBitsField);
-	stopBitsField->SetRecordId(modemId);
-	stopBitsField->LoadL(*db);
-	stopBits = *stopBitsField;
-	CleanupStack::PopAndDestroy(stopBitsField);
-	
-	// Accessing the Parity from the ModemBearer Table in the record number 
-	//corresponding to modemId
-	CMDBField<TUint32>* parityField = new(ELeave) CMDBField<TUint32>(KCDTIdParity);
-	CleanupStack::PushL(parityField);
-	parityField->SetRecordId(modemId);
-	parityField->LoadL(*db);
-	parity = *parityField;
-	CleanupStack::PopAndDestroy(parityField);
-	
-	// Accessing the HandShake from the ModemBearer Table in the record number 
-	//corresponding to modemId
-	CMDBField<TUint32>* handshakeField = new(ELeave) CMDBField<TUint32>(KCDTIdHandshaking);
-	CleanupStack::PushL(handshakeField);
-	handshakeField->SetRecordId(modemId);
-	handshakeField->LoadL(*db);
-	handshake = *handshakeField;
-	CleanupStack::PopAndDestroy(handshakeField);
-
-	config().iRate		  = (TBps)rate;
-	config().iDataBits    = (TDataBits)dataBits;
-	config().iStopBits    = (TStopBits)stopBits;
-	config().iParity      = (TParity)parity;
-	config().iHandshake   = (TUint)handshake;
-	config().iParityError = KConfigParityErrorIgnore;
-	config().iFifo        = static_cast<TUint>(EFifoEnable);
-
-	newCfg.Copy(config);
-
-	ret = iCommPort.Open(port);
-	if (ret)
-		{
-		_LOG_L1C3("** Failed CommPort.Open(%d) ret=%d **", port,ret);
-		User::Leave(ret);
-		}
-
-	// Configure the port
-	len = iCommPort.ReceiveBufferLength();
-	
-	if (len < KErrNone)
-		{
-		_LOG_L1C2("** Leave: CommPort.ReceiveBufferLength() len=%d **", len);
-		User::Leave(KErrGeneral);
-		}
-
-	// Increase the receive buffer to make sure we can operate as slowly as we 
-	// can without filling up the LDD's receive buffer with incoming signals 
-	len *= KCSY_ReceiveBufferSizeIncreaseFactor; 
-	ret = iCommPort.SetReceiveBufferLength(len);
-
-	TCommConfig cbuf;
-	TCommConfigV01 &cfg = cbuf();
-	iCommPort.Config(cbuf);					// Get the Configuration Parameters
-
-	cfg.iRate        = newCfg().iRate;
-	cfg.iDataBits    = newCfg().iDataBits;
-	cfg.iStopBits    = newCfg().iStopBits;
-	cfg.iParity      = newCfg().iParity;
-	cfg.iHandshake   = newCfg().iHandshake;
-	cfg.iParityError = newCfg().iParityError;
-	cfg.iFifo        = newCfg().iFifo;
-
-	_LOG_L4C2("  Set Phys Port Config for Port %d", port);
-	_LOG_L4C2("    Rate = 0x%x", cfg.iRate);
-	_LOG_L4C2("    DataBits = 0x%x", cfg.iDataBits);
-	_LOG_L4C2("    Stop Bits = 0x%x", cfg.iStopBits);
-	_LOG_L4C2("    Parity = 0x%x", cfg.iParity);
-	_LOG_L4C2("    Handshake = 0x%x", cfg.iHandshake);
-	_LOG_L4C2("    Parity Error = 0x%x", cfg.iParityError);
-	_LOG_L4C2("    Fifo = 0x%x", cfg.iFifo);
-
-	ret = iCommPort.SetConfig(cbuf);		// Set the Configuration Parameters
-	if (ret)
-		{
-		_LOG_L1C2("** CommPort.SetConfig ret=%d **", ret);
-		User::Leave(KErrNotSupported);
-		}
-
-	// Clean up the stack
-	CleanupStack::PopAndDestroy(db);
-
-	_LOG_L4C2("<<CPortFactory::ConfigurePhysicalCommPortL [ret=%d]", ret);
-	return ret;
-	}
-
-void CPortFactory::ConnectControlChannel()
-/**
- * This method is called to connect the 27.010 control channel,
- * which is DLC 0.
- */
-	{
-	_LOG_L4C1("CPortFactory::ConnectControlChannel");
-
-	TInt ret = 	iChannelCtrl->Connect();	
-	if (ret != KErrNone)
-		{
-		_LOG_L4C2(("<<CCPortFactory::ConnectControlChannel ret=%d"),ret);
-		}
-	}
-
-void CPortFactory::DisconnectControlChannel()
-/**
- * This method is called to set the 27.010 control channel to the "disconnect" state.
- */
-	{
-	_LOG_L4C1("CPortFactory::DisconnectAllChannels");
-	iChannelCtrl->Disconnect();
-	}
-
-void CPortFactory::ChannelCtrlDoCancel()
-/**
- * This method is called when the port has been opened and the max number of retries has been reached.
- */
-	{
-	_LOG_L4C1(">>CPortFactory::ChannelCtrlDoCancel");
-	
-	iOpenPortFailed = ETrue;
-	iChannelCtrl->NotifyChannelReady();
-
-	_LOG_L4C1("<<CPortFactory::ChannelCtrlDoCancel");
-	}
-	
-
-void CPortFactory::RemoveC32Port(CPortC32InterfaceBase* aPort)
-/**
- * This method removes the specified C32 port object from the
- * port factory's list of current/open C32 port objects.
- * This will allow another client to open that port.
- * @param aPort - Pointer to C32 port object
- * @return void
- */
-	{
-	_LOG_L4C2(">>CPortFactory::RemoveC32Port [aPort=%d]", aPort->GetPortNumber());
-
-	CPortC32InterfaceBase* port = NULL;
-	iPortC32InterfaceIter.SetToFirst();
-	while ((port = iPortC32InterfaceIter++) != NULL)
-		{
-		if (port == aPort)
-			{
-			iPortC32InterfaceList.Remove(*port);
-			_LOG_L4C1("<<CPortFactory::RemoveC32Port - okay");
-			return;
-			}
-		}
-
-	// MAF this is a bad condition
-	_LOG_L4C1("<<CPortFactory::RemoveC32Port ** Not Removed? **");
-	}
-
-void CPortFactory::ConnectIpNifPort(const TUint8 aDlcNum)
-/**
- * This method connects the port interface object
- * in the CSY that are used for a data interface to a NIF.
- * @param void
- */
-	{
-	_LOG_L4C2("CPortFactory::ConnectIpNifPort [aDlcNum=%d]",aDlcNum);
-
-	CPortC32InterfaceBase* port = FindPortC32Interface(aDlcNum);
-
-	if (port)
-		{
-		CChannelMgrCmdData* iMuxChannel = port->GetMuxChannel();
-		if (iMuxChannel)
-			{
-			
-			TInt err = iMuxChannel->Connect();
-			if (err != KErrNone)
-				{
-				_LOG_L1C2("iMuxChannel->Connect() error =%d",err);
-				}
-			}
-		else
-			{
-			// MAF assert here
-			_LOG_L1C2("** Could not find channel for port [0x%x] **",port);
-			}
-		}
-	else
-		{
-		// MAF assert here
-		_LOG_L1C1("** Could not find port for dlcnumber **");
-		}
-	}
-
-TBool CPortFactory::FindDlcToEnable()
-/**
- * We have resources again. Find a dlc that has had its flow control
- * set and re-enable.
- *
- * @return ETrue if there are still dlcs that are stopped due to flow control.
- */
-	{
-	_LOG_L4C1(">>CPortFactory::FindDlcToEnable");
-
-	TInt numberOfStopped = 0;
-	TBool dlcsStillToEnable = EFalse;
-
-    CChannelMgrCmdData* channel = NULL;
-
-	iDataChannelIter.SetToFirst();
-	while ((channel = iDataChannelIter++) != NULL)
-		{
-		if (channel->CsyToModemFlowControl() == EFlowControlOn)
-			{
-			numberOfStopped++;
-			if (numberOfStopped == 1)
-				{
-				_LOG_L4C1("Found a dlc to re-enable");
-				if (channel->SetCsyToModemFlowControl(EFlowControlOff))
-					{
-					_LOG_L4C1("Re-enable failed");
-					dlcsStillToEnable = ETrue;
-					break;
-					}
-				}
-			else
-				{
-				_LOG_L4C1("Other dlc still to re-enable");
-				dlcsStillToEnable = ETrue;
-				}
-			}
-		}
-
-	_LOG_L4C2("<<CPortFactory::FindDlcToEnable numberOfStopped=%d",numberOfStopped);
-	return dlcsStillToEnable;
-	}
-
-void CPortFactory::FindActiveDataDlcToStop()
-/**
- * MAF come up with a better algorithm. Currently this scans sequentially for a data
- * DLC to stop.
- * Check the data dlcs to see if one of them can be stopped
- */
-	{
-	_LOG_L4C1(">>CPortFactory::FindActiveDataDlcToStop");
-
-    CChannelMgrCmdData* channel = NULL;
-	CPortC32InterfaceBase* port = NULL;
-
-	iDataChannelIter.SetToFirst();
-	while ((channel = iDataChannelIter++) != NULL)
-		{
-		port = channel->GetC32Port();
-		if ((port)&&(port->GetClientType() == EC32ClientIpNif))
-			{
-			if (channel->CsyToModemFlowControl() == EFlowControlOff)
-				{
-				_LOG_L4C1("Found a data dlc to stop");
-				if (channel->SetCsyToModemFlowControl(EFlowControlOn))
-					{
-					_LOG_L4C1("Failed to stop dlc");
-					}
-				else
-					break;
-				}
-			}
-		}
-
-	_LOG_L4C1("<<CPortFactory::FindActiveDataDlcToStop");
-	}
-
-void CPortFactory::StopAnyDlc()
-/**
- * Time for drastic action - enforce flow control on any DLC (except ctrl).
- */
-	{
-	_LOG_L4C1(">>CPortFactory::StopAnyDlc");
-
-    CChannelMgrCmdData* channel = NULL;
-
-	iDataChannelIter.SetToFirst();
-	while ((channel = iDataChannelIter++) != NULL)
-		{
-		if (channel->CsyToModemFlowControl() == EFlowControlOff)
-			{
-			_LOG_L4C1("Found a dlc to stop");
-			if (channel->SetCsyToModemFlowControl(EFlowControlOn))
-				{
-				_LOG_L4C1("Failed to stop dlc");
-				}
-			else
-				break;
-			}
-		}
-
-	_LOG_L4C1("<<CPortFactory::StopAnyDlc");
-	}
-
-TBool CPortFactory::DecrementNumOfOpenPorts()
-/**
- * Used to decrement the number of open ports and disconnect if number = 0
- *
- * aReturn returns EFalse if Num of Ports is 0; ETrue otherwise
- */
-{
-	if (iNumOfOpenPorts==0)
-		return EFalse;
-	else if (--iNumOfOpenPorts == 0)
-		{
-		_LOG_L4C1("******* DISCONNECT ALL *********");
-		DisconnectControlChannel();
-		iLastDlcNum = 0;
-		return EFalse;
-		}	
-	return ETrue;
-}
-
-
-TSecurityPolicy CPortFactory::PortPlatSecCapability(TUint /*aPort*/) const
-/**
- * This method returns the capabilities required to open the given port number
- * This 27.010 CSY requires the same capabilities for all port numbers
- *
- * @param aPort - The port number to check against
- * @return TSecurityPolicy - containing the required capabilities to use this CSY
- */
-{
-	return TSecurityPolicy(ECapabilityNetworkServices, ECapabilityNetworkControl, ECapabilityReadUserData, ECapabilityWriteUserData);
-}
-