diff -r 630d2f34d719 -r 07a122eea281 cbsref/csyrefplugins/csy27010/src/PortC32Interface.cpp --- a/cbsref/csyrefplugins/csy27010/src/PortC32Interface.cpp Tue Aug 31 16:23:08 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,368 +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 CPortC32Interface class. -// * This class contains methods which are invoked by C32 when the -// * associated client RComm public API is invoked. These methods -// * are used to create, configure, read, write, and close logical -// * serial ports. Instances of this class are created by the CSY's -// * Port Factory. -// - -// PortC32Interface.cpp - -/** @file PortC32Interface.cpp - * - */ - -#include -#include "PortC32Interface.h" -#include "Portfactory.h" -#include "Mux0710Protocol.h" -#include "CsyMsgBufBPFrame.h" -#include "ChannelMgrCmdData.h" -#include "CommFrameReaderAo.h" -#include "CsyDebugLogger.h" -#include "CsyGlobals.h" -#include "CommFrameWriterAo.h" - -CPortC32Interface* CPortC32Interface::NewL(CPortFactory& aPortFactory, - CPortFactory::TC32PortInfo& aPortInfo) -/** - * This method uses two phase construction and the cleanup stack to create - * an instance of class CPortC32Interface. - * - * @param aPortFactory - Reference to the port factory - * @param aPortInfo - Reference to the port information - * @return Pointer to the created instance - */ - { - _LOG_L4C1( "CPortC32Interface::NewL"); - - CPortC32Interface* self = new(ELeave) CPortC32Interface(aPortFactory, aPortInfo); - TCleanupItem closeSelf(CPortFactory::CloseObject, self); - CleanupStack::PushL(closeSelf); - self->ConstructL(); - CleanupStack::Pop(self); - - return self; - } - -CPortC32Interface::~CPortC32Interface() -/** - * Destructor. - */ - { - _LOG_L4C1( ">>CPortC32Interface::~CPortC32Interface"); - - // let port factory know we are deleted - iPortFactory.RemoveC32Port(this); - CompleteOutstandingRequest(); - - iMuxChannel->Close(this); - - if (iReadBuf) - { - _LOG_L3C1("Delete read buffer"); - delete iReadBuf; - } - - _LOG_L4C1( "<iMsg.Length(); - _LOG_L4C2("iReadBuf aLength=%d", aLength); - } - else if (!iFramesWaitingToBeReadList.IsEmpty()) - { - CCsyMsgBufBpFrame* frame = iFramesWaitingToBeReadList.First(); - if ((frame)&&(frame->iMsg.Length() >= (KAdvOptionHeaderSize + KChecksumSize))) - { -#ifdef _27010ADVANCEOPTION - aLength = frame->iMsg.Length() - (KAdvOptionHeaderSize + KChecksumSize); -#else - aLength = frame->iMsg.Length() - (KBasicOptionHeaderSize + KChecksumSize); -#endif - _LOG_L4C2("iFramesWaitingToBeReadList aLength=%d", aLength); - } - } - - return KErrNone; - } - -void CPortC32Interface::ResetBuffers(TUint aFlags) -/** - * Called by C32 when the client requests to reset the buffers, - * by removing all receive and/or transmit messages according to - * the specified flags. - * - * @param aFlags Indicate which buffers (receive and/or transmit) should be reset - */ - { - _LOG_L4C2(">>CPortC32Interface::ResetBuffers [aFlags=%d]", aFlags); - _LOG_L4C2("[port=%d]", GetPortNumber()); - - if (aFlags & KCommResetRx) - { - _LOG_L4C1("Removing all messages intended for the C32 client"); - - RemoveWaitingAllFrames(); - } - - if (aFlags & KCommResetTx) - { - _LOG_L4C1("Removing all messages intended for the modem"); - - GetMuxChannel()->WriteCancel(); - } - - _LOG_L4C1("<>CPortC32Interface::ReadFromBufOrQueue [port=%d]",GetPortNumber()); - - TBool completedTheReadRequest = EFalse; - - TInt err = KErrGeneral; - TBool cont; - do - { - cont = EFalse; - if(iReadBuf==NULL) - { - //Read data from the frame list - if (!iFramesWaitingToBeReadList.IsEmpty()) - { - _LOG_L4C1("Set to first item"); - iReadBuf = iFramesWaitingToBeReadList.First(); - if (iReadBuf) - { - _LOG_L4C1("iReadBuf not null"); - // remove msg buf from client list - iFramesWaitingToBeReadList.Remove(*iReadBuf); - - // subtract checksum field - TInt frameLength = iReadBuf->iMsg.Length(); - _LOG_L4C2("New read buffer frameLength=%d",frameLength); - - if (frameLength >= KBasicOptionHeaderSize) - { - iReadBuf->iMsg.SetLength(frameLength - KChecksumSize); - - // remove leading header ints from frame -#ifdef _27010ADVANCEOPTION - iReadBuf->iMsg.Delete(0, KAdvOptionHeaderSize); -#else - iReadBuf->iMsg.Delete(0, KBasicOptionHeaderSize); -#endif - } - else - { - _LOG_L4C1("Incorrect frame size - freeing read buffer"); - iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(iReadBuf); - iReadBuf = NULL; - } - } - } - } - if (iReadBuf) - { - TInt length = -1; - if (iClientLength - iPos < iReadBuf->iMsg.Length()) - { - length = iClientLength - iPos; - _LOG_L4C2("length = %d",length); - } - - if (iConfig.iTerminatorCount > 0) - { - _LOG_L4C2("iTerminatorCount = %d",iConfig.iTerminatorCount); - - // First find terminator - TInt terminatorLoc = -1; - TInt loc; - for (TInt i=0; i< iConfig.iTerminatorCount;i++) - { - loc = iReadBuf->iMsg.LocateF(iConfig.iTerminator[i]); - if (loc > KErrNotFound) - { - if (terminatorLoc == KErrNotFound) - { - terminatorLoc = loc; - } - else - { - terminatorLoc = Min(loc,terminatorLoc); - } - } - } - if (terminatorLoc>KErrNotFound) - { - if (length > KErrNotFound) - length = Min(terminatorLoc + 1,length); - else - length = terminatorLoc + 1; - } - _LOG_L4C2("length = %d",length); - } - - _LOG_L4C2("Read buf length %d",iReadBuf->iMsg.Length()); - - if ((iReadBuf->iMsg.Length() >= length) && (length > -1)) - { - _LOG_L2C2("complete partial read: # %d ", length); - - iPartialReadBuf.Copy(&iReadBuf->iMsg[0], length); - iReadBuf->iMsg.Delete(0, length); - - err = IPCWrite(iClientBuffer, iPartialReadBuf, iPos); - if (err) - { - _LOG_L1C2("** IPCWrite Error %d **",err); - } - - CompleteReadRequest(err); - err = KErrGeneral; - - completedTheReadRequest = ETrue; - iPos = 0; - - if (iReadBuf->iMsg.Length()==0) - { - _LOG_L4C1("All data used - freeing read buffer"); - iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(iReadBuf); - iReadBuf = NULL; - } - } - else - { - err = IPCWrite(iClientBuffer, iReadBuf->iMsg, iPos); - if (err) - { - _LOG_L1C2("** IPCWrite Error %d **",err); - } - - _LOG_L4C3( "Read: iPos = %d, add %d bytes", iPos, iReadBuf->iMsg.Length()); - - //try read next frame in the list - cont = ETrue; - iPos += iReadBuf->iMsg.Length(); - - _LOG_L4C1("Freeing read buffer"); - iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(iReadBuf); - iReadBuf = NULL; - } - } - } - while (cont); - - if (iPos>0) - { - if (iOneOrMore) - { - CompleteReadRequest(err); - iPos = 0; - completedTheReadRequest = ETrue; - } - else - { - //normal read and have not filled the buffer yet - _LOG_L4C3( "Not filled buffer yet iPos = %d, iClientLength = %d", iPos, iClientLength); - } - } - - _LOG_L4C2( "<