diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/simtsy/src/CSimNtRas.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/simtsy/src/CSimNtRas.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,228 @@ +// 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: +// This file contains the implementation of the CSimNtRas class. +// +// + +/** + @file +*/ + +#include "CSimNtras.h" +#include "Simlog.h" + +_LIT8(KNtRasWriteText,"CLIENT"); // < Solicitation text, send to start the NTRas server +_LIT8(KNtRasReceiveText,"SERVER"); // < NTRas server response, indicating the PPP session can commence. +const TInt KNtRasServerResponseTimeout=5; // < Connection attempt time out value in seconds. + +const TDataBits KDefaultDataBits=EData8; // < Default configuration is 8N1 +const TParity KDefaultParity=EParityNone; // < Default configuration is 8N1 +const TStopBits KDefaultStopBits=EStop1; // < Default configuration is 8N1 +const TText8 KDefaultXon=17; // < Default XON character is Q +const TText8 KDefaultXoff=19; // < Default XOFF character is S +const TInt KTxMaxRetries=3; // < Maximum number of transmit retries before giving up + +CSimNtRas* CSimNtRas::NewL(CSimPhone* aPhone) +/** + * Standard two phase constructor. + */ + { + CSimNtRas* self=new(ELeave) CSimNtRas(aPhone); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CSimNtRas::CSimNtRas(CSimPhone* aPhone) + : iPhone(aPhone), iPortOpen(EFalse) +/** + * Trivial first phase constructor. + */ + { + } + +void CSimNtRas::ConstructL() +/** + * Second phase constructor. Create heap-based objects, in this instance the timer + * and the Comm Port classes. + */ + { + iTimer=CSimTimer::NewL(iPhone); + CommConstructL(CActive::EPriorityStandard,CActive::EPriorityStandard); + } + +CSimNtRas::~CSimNtRas() +/** + * Standard destructor. Close Comm Port and destroy heap-based objects. + */ + { + if(iPortOpen) + { + CommCancel(); + CommClose(); + } + delete iTimer; + } + +TInt CSimNtRas::Connect(const TDesC& aCsyName, const TDesC& aPort, + const TCommConfigV01& aConfig, MNTRasCallBack* aCallback) +/** + * Attempt to connect to an NT Ras "Cable Connection" service. + * @param aCsyName The CSY to be used for the connection. + * @param aPort The Port to be used for the connection. + * @param aConfig The port configuration to be used for the connection. + * @param aCallback The callback class that must be signalled when the connection completes. + * @return TInt Standard error value. + */ + { + LOGDATA1("Starting to attempt a NT RAS Connection"); + iReadBuf.Zero(); + iInputBuf.Zero(); + +// Open and configuration the port + TInt ret=CommOpen(aCsyName,aPort,ECommShared); + if(ret!=KErrNone) + return ret; + iPortOpen=ETrue; + + TCommConfig configPckg; + TCommConfigV01& config=configPckg(); + iCommPort.Config(configPckg); + + config.iDataBits=KDefaultDataBits; + config.iParity=KDefaultParity; + config.iStopBits=KDefaultStopBits; + config.iXonChar=KDefaultXon; + config.iXoffChar=KDefaultXoff; + config.iTerminatorCount=0; + config.iSpecialRate=0; + + config.iRate=aConfig.iRate; + config.iHandshake=aConfig.iHandshake; + ret=iCommPort.SetConfig(configPckg); + if(ret!=KErrNone) + return ret; + +// Power up the port ready for receives and transmits + CommReadReady(); + CommWriteReady(); + + iAttemptCnt=0; + iCallback=aCallback; + CommReadOneOrMore(iReadBuf); + AttemptConnect(); + return KErrNone; + } + +void CSimNtRas::AttemptConnect() +/** + * Transmit "CLIENT" and attempt a connection + */ + { + LOGDATA1("NTRAS Writing CLIENT..."); + iAttemptCnt++; + // Send the soliciting message, and await the NT Ras server's response. + CommWrite(KNtRasWriteText); + iTimer->Start(KNtRasServerResponseTimeout,this); + } + +void CSimNtRas::Cancel() +/** + * Cancel any outstanding comm port reads, writes or timer requests. + */ + { + iTimer->Cancel(); + CommCancel(); + } + +void CSimNtRas::Terminate() +/** + * Terminate the NTRas connection. If opened, cancel any outstanding requests and close + * the port. Also, cancel any outstanding timer request. + */ + { + if(iPortOpen) + { + CommCancel(); + CommClose(); + } + iTimer->Cancel(); + } + +void CSimNtRas::CommReadComplete(TInt aStatus) +/** + * Serial port read completion callback. If there's no read error, append the read + * data to the input buffer and scan for the server's response. + * If no match is found, re-post the read. + * @param aStatus Standard error value, indicating the result of the read request. + */ + { + LOGDATA2("NTRAS Rx Completion: %S",&iInputBuf); + if(aStatus!=KErrNone) + { + iTimer->Cancel(); + iCallback->NTRasCallBack(aStatus); + return; + } + + if((iInputBuf.Length()+iReadBuf.Length())>KInputBufferSize) + { + iTimer->Cancel(); + iCallback->NTRasCallBack(KErrNotFound); + return; + } + + iInputBuf.Append(iReadBuf); + TInt pos=iInputBuf.FindF(KNtRasReceiveText); + if(pos>=0) + { + iTimer->Cancel(); + iCallback->NTRasCallBack(KErrNone); + LOGDATA1("NTRAS Received SERVER!"); + return; + } + + CommReadOneOrMore(iReadBuf); + } + +void CSimNtRas::CommWriteComplete(TInt aStatus) +/** + * Serial port write completion callback. Terminate the connection attempt if an error + * has occurred. + */ + { + LOGDATA1("NTRAS Write Completion"); + if(aStatus!=KErrNone) + { + iTimer->Cancel(); + iCallback->NTRasCallBack(aStatus); + } + } + +void CSimNtRas::TimerCallBack(TInt /*aId*/) +/** + * Timer expired callback. Give up the attempted connection with a time-out error. + */ + { + LOGDATA1("NTRAS Timeout Occurred"); + CommWriteCancel(); + if(iAttemptCntNTRasCallBack(KErrTimedOut); + } + }