--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/tsy/nokiatsy_dll/src/cmmdatautility.cpp Fri Nov 06 17:28:23 2009 +0000
@@ -0,0 +1,906 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+*
+*/
+
+
+
+// Include Files
+#include "cmmdatautility.h"
+#include "cmmdataporthandler.h"
+#include "tsylogger.h"
+
+#include "osttracedefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cmmdatautilitytraces.h"
+#endif
+// EXTERNAL DATA STRUCTURES
+ //None
+
+// EXTERNAL FUNCTION PROTOTYPES
+ //None
+
+// CONSTANTS
+ //None
+
+// MACROS
+ //None
+
+// LOCAL CONSTANTS AND MACROS
+ //None
+
+// MODULE DATA STRUCTURES
+ //None
+
+// LOCAL FUNCTION PROTOTYPES
+ //None
+
+// FORWARD DECLARATIONS
+ //None
+
+// ==================== LOCAL FUNCTIONS =======================================
+
+ //None
+
+// ================= MEMBER FUNCTIONS =========================================
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::NewL
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CDataPortWriter* CDataPortWriter::NewL(
+ CMmDataPortHandler* aMmDataPortHandler,
+ const RComm& aDataPort )
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::NewL");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_NEWL, "CDataPortWriter::NewL" );
+
+ CDataPortWriter* writer = new ( ELeave ) CDataPortWriter();
+ CleanupStack::PushL( writer );
+
+ writer->iDataPortHandler = aMmDataPortHandler;
+ writer->iDataPort = aDataPort;
+ writer->ConstructL();
+
+ CActiveScheduler::Add( writer );
+
+ CleanupStack::Pop( writer );
+
+ return writer;
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::CDataPortWriter
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------------------------
+//
+CDataPortWriter::CDataPortWriter()
+ : CActive( EPriorityStandard ), iDataToDpPtr( NULL, 0 )
+ {
+ //None
+ TFLOGSTRING("TSY: CDataPortWriter::CDataPortWriter");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_CDATAPORTWRITER, "CDataPortWriter::CDataPortWriter" );
+
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ----------------------------------------------------------------------------
+//
+void CDataPortWriter::ConstructL()
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::ConstructL");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_CONSTRUCTL, "CDataPortWriter::ConstructL" );
+
+ // initialisation of menber variables
+ iWriteCompleted = ETrue;
+ iContinueWrite = ETrue;
+ iWriteBuffer = new ( ELeave ) CArrayPtrSeg<HBufC8>(
+ KSentAtCommandLimit );
+ iAtCommandBuffer = new (ELeave) CArrayFixFlat<TUint>(
+ KSentAtCommandLimit );
+ }
+
+// -----------------------------------------------------------------------------
+// CDataPortWriter::~CDataPortWriter
+// Destructor, deletes all allocated resources.
+// -----------------------------------------------------------------------------
+//
+CDataPortWriter::~CDataPortWriter()
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::~CDataPortWriter");
+OstTrace0( TRACE_NORMAL, DUP1_CDATAPORTWRITER_CDATAPORTWRITER, "CDataPortWriter::~CDataPortWriter" );
+
+ Cancel();
+
+ if ( iWriteBuffer )
+ {
+ iWriteBuffer->ResetAndDestroy();
+ delete iWriteBuffer;
+ }
+ //no else
+
+ if ( iAtCommandBuffer )
+ {
+ iAtCommandBuffer->Reset();
+ delete iAtCommandBuffer;
+ }
+ //no else
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::Init
+// This method sends TSY init strings to modem.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortWriter::Init()
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::Init Modem initialisation");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_INIT, "CDataPortWriter::Init" );
+
+ // Initalise modem
+ TBuf8<KDataBufLength> ATString;
+
+ // Common Initialisations
+ ATString.Copy( KModemInitString );
+ ATString.Append( KReturn );
+ Write( ATString, EModemInit );
+ // VT initialisation
+ ATString.Copy( KHscsdMultimedia_64000 );
+ Write( ATString, EModemInit );
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::AppendCommandL
+// This method appends enum for AT command to be sent into iAtCommandBuffer.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortWriter::AppendCommandL(
+ TLastAtCommandSent aCommand )
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::AppendCommandL");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_APPENDCOMMANDL, "CDataPortWriter::AppendCommandL" );
+
+ iAtCommandBuffer->AppendL( aCommand );
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::GetAtBuffer
+// Returns iAtCommandBuffer.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+CArrayFixFlat<TUint>* CDataPortWriter::GetAtBuffer()
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::GetAtBuffer");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_GETATBUFFER, "CDataPortWriter::GetAtBuffer" );
+
+ return iAtCommandBuffer;
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::Write
+// Writes data into dataport.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortWriter::Write(
+ const TDesC8& aData,
+ TLastAtCommandSent aCommand )
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::Write");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_WRITE, "CDataPortWriter::Write" );
+
+ // We are writing data so set the flag to ETrue.
+ iContinueWrite = ETrue;
+
+#ifdef TF_LOGGING_ENABLED
+ // If aData is longer than KDataBufLength, copy only KDataBufLength
+ TBuf< KDataBufLength > data16bit;
+ if ( KDataBufLength < aData.Length() )
+ {
+ data16bit.Copy( aData.Left( KDataBufLength ) );
+ }
+ else
+ {
+ data16bit.Copy( aData.Left( aData.Length() ) );
+ }
+
+ TFLOGSTRING2("TSY: CDataPortWriter::Write - Stored into FIFO buffer: %S", &data16bit );
+
+OstTraceExt1( TRACE_NORMAL, DUP1_CDATAPORTWRITER_WRITE, "CDataPortWriter::Write;Stored into FIFO buffer=%S", data16bit );
+#endif // TF_LOGGING_ENABLED
+
+ HBufC8* tmp = NULL;
+ TInt commandError( KErrNone );
+
+ // Trap possible leave in AppendLs and AllocL.
+ TRAPD( trapError,
+ // Create tmp ptr for data, allocate heap and copy the aData parameter.
+ tmp = aData.AllocL();
+ // Append the ptr into buffer
+ iWriteBuffer->AppendL( tmp );
+ // Append AT command enum into buffer so that we know
+ // what is the AT command.
+ AppendCommandL( aCommand ) );
+
+ // Check if allocation and appends were succesful.
+ if ( ( KErrNone == trapError ) && ( KErrNone == commandError ) )
+ {
+ // If already sent data and pending for completition, continue to wait.
+ // If the last write thas been already completed, write new data.
+ if ( iWriteCompleted )
+ {
+ // Write the data.
+ iStatus = KRequestPending;
+ iWriteCompleted = EFalse;
+
+ // As iWriteBuffer->AppendL() can reorganise the iWriteBuffer,
+ // we need to use a separate iDataToDPPtr with Write.
+ // Otherwise it is possible that the data written before
+ // new CDataPortWriter::Write is called has wrong address.
+ iDataToDpPtr.Set( iWriteBuffer->At( 0 )->Left(
+ iWriteBuffer->At( 0 )->Length() ) );
+ // Write the data to modem
+ iDataPort.Write( iStatus, iDataToDpPtr );
+ // DO NOT DELETE ALLOCATED DATA FROM HEAP AS IT IS DONE IN RUNL
+
+#ifdef TF_LOGGING_ENABLED
+ // If aData is longer than KDataBufLength, copy only KDataBufLength
+ if ( KDataBufLength < aData.Length() )
+ {
+ data16bit.Copy( iDataToDpPtr.Left( iDataToDpPtr.Length() ) );
+ }
+ else
+ {
+ data16bit.Copy( aData.Left( aData.Length() ) );
+ }
+
+ TFLOGSTRING2("TSY: CDataPortWriter::Write - From FIFO buffer: %S", &data16bit);
+
+OstTraceExt1( TRACE_NORMAL, DUP2_CDATAPORTWRITER_WRITE, "CDataPortWriter::Write;From FIFO buffer=%S", data16bit );
+#endif // TF_LOGGING_ENABLED
+
+ if ( !IsActive() )
+ {
+ SetActive();
+ }
+ //no else
+ }
+ //no else
+ }
+
+ // If TRAP caught error, call line to handle the error.
+ else
+ {
+ // If AllocL or AppendL left for the actual data string,
+ // delete tmp if it exists.
+ if ( NULL != tmp )
+ {
+ delete tmp;
+ }
+
+ // If AllocL or AppendL left, handle corresponding error.
+ iDataPortHandler->HandleDataPortError( trapError );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::RunL
+// Activates active object when request is completed.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortWriter::RunL()
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::RunL");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_RUNL, "CDataPortWriter::RunL" );
+
+#ifdef TF_LOGGING_ENABLED
+
+ TBuf< KDataBufLength > data16bit;
+ data16bit.AppendNum( iStatus.Int() );
+
+ TFLOGSTRING2("TSY: CDataPortWriter::RunL - iStatus: %S", &data16bit);
+OstTrace1( TRACE_NORMAL, DUP2_CDATAPORTWRITER_RUNL, "CDataPortWriter::RunL;iStatus: %d", iStatus.Int() );
+#endif // TF_LOGGING_ENABLED
+
+ if ( KRequestPending != iStatus.Int() )
+ {
+ // If write buffer has data, delete first element.
+ if ( 0 < iWriteBuffer->Count() )
+ {
+
+#ifdef TF_LOGGING_ENABLED
+ // If write buffer entry length is longer than KDataBufLength,
+ // log only KDataBufLength bytes of data
+ if ( KDataBufLength < iWriteBuffer->At( 0 )->Length() )
+ {
+ data16bit.Copy( iWriteBuffer->At( 0 )->
+ Left( KDataBufLength ) );
+ }
+ // Else log the whole buffer
+ else
+ {
+ data16bit.Copy( iWriteBuffer->At( 0 )->Left(
+ iWriteBuffer->At( 0 )->Length() ) );
+ }
+
+ TFLOGSTRING2("TSY: CDataPortWriter::RunL - AT command deleted from FIFO buffer: %S", &data16bit);
+OstTraceExt1( TRACE_NORMAL, DUP1_CDATAPORTWRITER_RUNL, "CDataPortWriter::RunL;AT command deleted from FIFO buffer=%S", data16bit );
+#endif // TF_LOGGING_ENABLED
+
+ if ( iWriteBuffer->At( 0 ) )
+ {
+ // Delete the data from heap
+ delete iWriteBuffer->At( 0 );
+ iWriteBuffer->At( 0 ) = NULL;
+ }
+ //no else
+
+ // Delete and compress the buffer
+ iWriteBuffer->Delete( 0 );
+ iWriteBuffer->Compress();
+ // Leave if error, will fall back to RunError.
+ User::LeaveIfError( iStatus.Int() );
+ }
+ //no else
+ }
+ //no else
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::RunError
+// Called when RunL leaves.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+TInt CDataPortWriter::RunError(
+ TInt aError )
+ {
+
+ TFLOGSTRING2("TSY: CDataPortWriter::RunError %d", aError);
+OstTrace1( TRACE_NORMAL, CDATAPORTWRITER_RUNERROR, "CDataPortWriter::RunError;aError=%d", aError );
+
+ // Line object completes client requests in case of an error.
+ iDataPortHandler->HandleDataPortError( aError );
+ // Cancel writes if active.
+ Cancel();
+ // If write buffer has data, delete it.
+ TInt count( iWriteBuffer->Count() );
+
+ if ( 0 < count )
+ {
+ // Loop through each element and delete data from heap.
+ for ( TInt i = 0; i < count; i++ )
+ {
+ if ( iWriteBuffer->At( 0 ) )
+ {
+ delete iWriteBuffer->At( 0 );
+ iWriteBuffer->At( 0 ) = NULL;
+ }
+ //no else
+ }
+ }
+ //no else
+
+ // Delete elements and compress buffer.
+ iWriteBuffer->Delete( 0, iWriteBuffer->Count() );
+ iWriteBuffer->Compress();
+
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::WriteNextL
+// Writes next AT command from iWriteBuffer.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortWriter::WriteNextL()
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::WriteNextL - Write next command from FIFO");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_WRITENEXTL, "CDataPortWriter::WriteNextL, Write next command from FIFO" );
+
+ if ( !IsActive() )
+ {
+ iWriteCompleted = ETrue;
+ User::LeaveIfError( iStatus.Int() );
+
+ // Check if we have AT commands waiting in the buffer and if we are
+ // still supposed to write commands
+ if ( ( 0 < iWriteBuffer->Count() ) &&
+ ( EFalse != iContinueWrite ) )
+ {
+ iWriteCompleted = EFalse;
+ // As iWriteBuffer->AppendL() can reorganise the iWriteBuffer,
+ // we need to use a separate iDataToDPPtr with Write.
+ // Otherwise it is possible that the data written before
+ // new CDataPortWriter::Write is called has wrong address
+ // because of the AppendL().
+ iDataToDpPtr.Set( iWriteBuffer->At( 0 )->Left(
+ iWriteBuffer->At( 0 )->Length() ) );
+ iDataPort.Write( iStatus, iDataToDpPtr );
+
+#ifdef TF_LOGGING_ENABLED
+
+ TBuf<KDataBufLength> data16bit;
+ // If write buffer entry length is longer than KDataBufLength,
+ // log only KDataBufLength bytes of data
+ if ( KDataBufLength < iDataToDpPtr.Length() )
+ {
+ data16bit.Copy( iDataToDpPtr.Left( KDataBufLength ) );
+ }
+ else
+ {
+ data16bit.Copy( iDataToDpPtr.Left( iDataToDpPtr.Length() ) );
+ }
+
+ TFLOGSTRING2("TSY: CDataPortWriter::WriteNextL - AT command: %S", &data16bit);
+
+OstTraceExt1( TRACE_NORMAL, DUP1_CDATAPORTWRITER_WRITENEXTL, "CDataPortWriter::WriteNextL;AT command=%S", data16bit );
+#endif //TF_LOGGING_ENABLED
+
+ // Set active as write is pending
+ if ( !IsActive() )
+ {
+ SetActive();
+ }
+ //no else
+ }
+ //no else
+ }
+ //no else
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::DoCancel
+// Cancels active object request.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortWriter::DoCancel()
+ {
+
+ TFLOGSTRING("CDataPortWriter::DoCancel");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_DOCANCEL, "CDataPortWriter::DoCancel" );
+
+ // Stop writing into DP
+ iContinueWrite = EFalse;
+ iDataPort.WriteCancel();
+ iWriteCompleted = ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortWriter::BlockWrite
+// Blocks writing to dataport
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortWriter::BlockWrite()
+ {
+
+ TFLOGSTRING("TSY: CDataPortWriter::BlockWrite - Blocking writes to DP");
+OstTrace0( TRACE_NORMAL, CDATAPORTWRITER_BLOCKWRITE, "CDataPortWriter::BlockWrite" );
+
+ // Stop writing into DP until DP reader has flushed RX buffer
+ iContinueWrite = EFalse;
+ iWriteCompleted = EFalse;
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::NewL
+// Two-phased constructor.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+CDataPortReader* CDataPortReader::NewL(
+ CMmDataPortHandler* aDataPortHandler,
+ const RComm& aDataPort,
+ CDataPortWriter* aDataPortWriter )
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::NewL");
+OstTrace0( TRACE_NORMAL, CDATAPORTREADER_NEWL, "CDataPortReader::NewL" );
+
+ CDataPortReader* reader = new ( ELeave ) CDataPortReader();
+ CleanupStack::PushL( reader );
+
+ reader->iDataPortHandler = aDataPortHandler;
+ reader->iDataPort = aDataPort;
+ reader->iDataPortWriter = aDataPortWriter;
+
+ CActiveScheduler::Add( reader );
+
+ CleanupStack::Pop( reader );
+
+ return reader;
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::CDataPortReader
+// Dataport reader default constructor.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+CDataPortReader::CDataPortReader()
+ : CActive( EPriorityStandard )
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::CDataPortReader");
+OstTrace0( TRACE_NORMAL, CDATAPORTREADER_CDATAPORTREADER, "CDataPortReader::CDataPortReader" );
+
+ // initialisation of meneber variables
+ iModemInitComplete = EFalse;
+ iContinueRead = ETrue;
+ iReaAllComplete = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CDataPortReader::~CDataPortReader
+// Destructor, deletes all allocated resources.
+// -----------------------------------------------------------------------------
+//
+CDataPortReader::~CDataPortReader()
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::~CDataPortReader");
+OstTrace0( TRACE_NORMAL, DUP1_CDATAPORTREADER_CDATAPORTREADER, "CDataPortReader::~CDataPortReader" );
+
+ Cancel();
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::DoCancel
+// Cancels active object request.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortReader::DoCancel()
+ {
+
+ TFLOGSTRING("CDataPortReader::DoCancel");
+OstTrace0( TRACE_NORMAL, CDATAPORTREADER_DOCANCEL, "CDataPortReader::DoCancel" );
+
+ // Stop reading from DP
+ iContinueRead = EFalse;
+ iDataPort.ReadCancel();
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::Read
+// Reads data from dataport.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortReader::Read()
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::Read Start reading");
+OstTrace0( TRACE_NORMAL, CDATAPORTREADER_READ, "CDataPortReader::Read" );
+
+ iContinueRead = ETrue;
+ // If already active, don't make a new request
+ if ( !IsActive() )
+ {
+ iResp.SetLength( 0 );
+
+ iDataPort.Read( iStatus, iResp );
+ SetActive();
+ }
+ //no else
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::ReadAll
+// Reads all data from dataport (flushing).
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortReader::ReadAll()
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::ReadAll - Read all data from DP");
+OstTrace0( TRACE_NORMAL, CDATAPORTREADER_READALL, "CDataPortReader::ReadAll, Read all data from DP" );
+
+ iContinueRead = ETrue;
+
+ // First get remaining data length in DP
+ TInt dataLen = iDataPort.QueryReceiveBuffer();
+ // If there is data remaining in RX buffer, read it all first.
+ // If modem init is not yet done, then do not empty RX buffer
+ // as line object is doing initialisations before first dial.
+ if ( ( 0 < dataLen ) && ( EFalse != iModemInitComplete ) )
+ {
+
+TFLOGSTRING2("TSY: CDataPortReader::ReadAll - Data remaining: %d",
+ dataLen );
+OstTrace1( TRACE_NORMAL, DUP1_CDATAPORTREADER_READALL, "CDataPortReader::ReadAll;Data remaining=%d", dataLen );
+ // Block DP writer, so that it does not generate more
+ // responses from modem. Continue when RX buffer is empty.
+ iDataPortWriter->BlockWrite();
+ // Set read all complete flag to false
+ iReaAllComplete = EFalse;
+ // If already active, don't make a new request. Wait for RunL
+ if ( !IsActive() )
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::ReadAll - Starting to read remaining data (flushing)");
+OstTrace0( TRACE_NORMAL, DUP2_CDATAPORTREADER_READALL, "CDataPortReader::ReadAll, Starting to read remaining data (flushing)" );
+
+ iResp.SetLength( 0 );
+ iDataPort.Read( iStatus, iResp );
+ SetActive();
+ }
+ else
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::ReadAll - Read still pending!");
+OstTrace0( TRACE_NORMAL, DUP3_CDATAPORTREADER_READALL, "CDataPortReader::ReadAll, Read still pending!" );
+ }
+ }
+ else
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::ReadAll - Init going or no data in RX");
+OstTrace0( TRACE_NORMAL, DUP4_CDATAPORTREADER_READALL, "CDataPortReader::ReadAll, Init going or no data in RX" );
+ if ( 0 >= dataLen )
+ {
+ // Set read all complete flag to true, there is no data waiting
+ iReaAllComplete = ETrue;
+ }
+ //no else
+
+ // Read data if not already
+ if ( !IsActive() )
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::ReadAll - Start normal reading");
+OstTrace0( TRACE_NORMAL, DUP5_CDATAPORTREADER_READALL, "CDataPortReader::ReadAll, Start normal reading" );
+
+ iResp.SetLength( 0 );
+ iDataPort.Read( iStatus, iResp );
+ SetActive();
+ }
+ //no else
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::ReadCancel
+// Cancels reading.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortReader::ReadCancel()
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::ReadCancel");
+OstTrace0( TRACE_NORMAL, CDATAPORTREADER_READCANCEL, "CDataPortReader::ReadCancel" );
+
+ // Stop reading from DP
+ iContinueRead = EFalse;
+ iDataPort.ReadCancel();
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::ModemInitComplete
+// Called by line to inform DP reader that modem initialisation is completed.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortReader::ModemInitComplete()
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::ModemInitComplete");
+OstTrace0( TRACE_NORMAL, CDATAPORTREADER_MODEMINITCOMPLETE, "CDataPortReader::ModemInitComplete" );
+
+ iModemInitComplete = ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::RunL
+// Activates active object when request is completed.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CDataPortReader::RunL()
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::RunL");
+OstTrace0( TRACE_NORMAL, CDATAPORTREADER_RUNL, "CDataPortReader::RunL" );
+
+#ifdef TF_LOGGING_ENABLED
+
+ TBuf< KDataBufLength > data16bit;
+ data16bit.AppendNum( iStatus.Int() );
+
+ TFLOGSTRING2("TSY: CDataPortReader::RunL - iStatus:%S", &data16bit);
+OstTrace1( TRACE_NORMAL, DUP1_CDATAPORTREADER_RUNL, "CDataPortReader::RunL;iStatus=%d", iStatus.Int() );
+#endif // TF_LOGGING_ENABLED
+
+ // KErrNone and KErrCancel are ok, others mean real error
+ TInt ret( iStatus.Int() );
+ if ( KErrNone == ret || KErrCancel == ret )
+ {
+
+#ifdef TF_LOGGING_ENABLED
+ data16bit.SetLength( 0 );
+ // If iResp lenght is more than KDataBufLength,
+ // log only KDataBufLength bytes
+ if ( KDataBufLength < iResp.Length() )
+ {
+ data16bit.Copy( iResp.Left( KDataBufLength ) );
+ }
+ else
+ {
+ data16bit.Copy( iResp.Left( iResp.Length() ) );
+ }
+ const TDesC16 help = data16bit;
+ TFLOGSTRING2("TSY: CDataPortReader::Read Data: %S", &data16bit);
+OstTraceExt1( TRACE_NORMAL, DUP2_CDATAPORTREADER_RUNL, "CDataPortReader::RunL;data16bit=%S", help );
+#endif // TF_LOGGING_ENABLED
+
+ // If flushing the dataport and modem from last connection,
+ // continue until RX buffer is empty
+ if ( EFalse == iReaAllComplete )
+ {
+ // To ensure that NO CARRIER and +CRING (in case of waiting call)
+ // responces are not missed.
+ if ( 0 == iResp.MatchF( KModemNoCarrier ) ||
+ 0 == iResp.MatchF( KModemCRing ) )
+ {
+ iDataPortHandler->ReadResponseFromDataport( iResp );
+ }
+ //no else
+
+ TInt dataLen( iDataPort.QueryReceiveBuffer() );
+ // If there is data remaining in RX buffer, read it all first
+ if ( 0 < dataLen )
+ {
+
+ TFLOGSTRING2("TSY: CDataPortReader::RunL - Data remaining: %d", dataLen );
+
+OstTrace1( TRACE_NORMAL, DUP3_CDATAPORTREADER_RUNL, "CDataPortReader::RunL;Data remaining=%d", dataLen );
+ }
+ else
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::RunL - RX buffer empty, normal read continuing");
+OstTrace0( TRACE_NORMAL, DUP4_CDATAPORTREADER_RUNL, "CDataPortReader::RunL, RX buffer empty, normal read continuing" );
+
+ iReaAllComplete = ETrue;
+ // Request next write from iDataPortWriter
+ iDataPortWriter->WriteNextL();
+ }
+ // Set length to zero
+ iResp.SetLength( 0 );
+ // Make the reader read again...
+ iStatus = KRequestPending;
+ iDataPort.Read( iStatus, iResp );
+ SetActive();
+ }
+ // Normal read prosessing, forward data to line or call object
+ else
+ {
+ // Check what is received from modem
+ if ( 0 < iResp.Length() )
+ {
+ // Skip over line changes and unnecessary data.
+ // CR is in byte 0 and LF is in byte 1.
+ if ( ( KMinModemRespLength < iResp.Length() ) &&
+ ( KCarriageReturn != iResp[0] ) &&
+ ( KLineFeed != iResp[1] ) )
+ {
+ iDataPortHandler->ReadResponseFromDataport( iResp );
+ // If not echo data, send new commands.
+ // Otherwise skip over
+ if ( ( 0 > iResp.MatchF( KInitEcho ) ) )
+ {
+ // Request next write from iDataPortWriter
+ iDataPortWriter->WriteNextL();
+ }
+ //no else
+ }
+ //no else
+
+ // Set length to zero
+ iResp.SetLength( 0 );
+
+ if ( EFalse == iContinueRead )
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::RunL - Cancel reading");
+OstTrace0( TRACE_NORMAL, DUP5_CDATAPORTREADER_RUNL, "CDataPortReader::RunL, Cancel reading" );
+
+ iDataPort.ReadCancel();
+ }
+ else if ( !IsActive() )
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::RunL - Continue reading");
+OstTrace0( TRACE_NORMAL, DUP6_CDATAPORTREADER_RUNL, "CDataPortReader::RunL, Continue reading" );
+ // Make the reader read again...
+ iStatus = KRequestPending;
+ iDataPort.Read( iStatus, iResp );
+ SetActive();
+ }
+ }
+ else if ( !IsActive() && iContinueRead )
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::RunL - Continue reading");
+OstTrace0( TRACE_NORMAL, DUP7_CDATAPORTREADER_RUNL, "CDataPortReader::RunL, Continue reading" );
+ // Make the reader read again...
+ iStatus = KRequestPending;
+ iDataPort.Read( iStatus, iResp );
+ SetActive();
+ }
+ }
+ }
+ // If in use, do no do anything but wait for others to
+ // end using dataport.
+ else if ( KErrInUse == ret )
+ {
+
+ TFLOGSTRING("TSY: CDataPortReader::RunL - Dataport used by other client");
+OstTrace0( TRACE_NORMAL, DUP8_CDATAPORTREADER_RUNL, "CDataPortReader::RunL, Dataport used by other client" );
+ }
+ // These will make the next call object creation fail in
+ // CMmLineTsy::OpenNewObjectL as we can't handle these errors in TSY.
+ else
+ {
+ User::LeaveIfError( ret );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CDataPortReader::RunError
+// Called when RunL leaves.
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+TInt CDataPortReader::RunError(
+ TInt aError )
+ {
+
+ TFLOGSTRING2("TSY: CDataPortReader::RunError %d", aError);
+OstTrace1( TRACE_NORMAL, CDATAPORTREADER_RUNERROR, "CDataPortReader::RunError;aError=%d", aError );
+
+ iDataPortHandler->HandleDataPortError( aError );
+
+ return KErrNone;
+ }
+
+//=============================================================================
+
+// OTHER EXPORTED FUNCTIONS
+ //none
+
+// End of File