adaptationlayer/modematadaptation/modematcontroller_exe/src/cmodematsrv.cpp
changeset 9 8486d82aef45
parent 8 6295dc2169f3
--- a/adaptationlayer/modematadaptation/modematcontroller_exe/src/cmodematsrv.cpp	Wed Apr 21 14:29:55 2010 +0300
+++ b/adaptationlayer/modematadaptation/modematcontroller_exe/src/cmodematsrv.cpp	Tue Oct 19 13:16:20 2010 +0300
@@ -15,8 +15,8 @@
 *
 */
 
-
-
+#include <pn_const.h>
+#include <iscnokiadefinitions.h>
 #include "cmodematsrv.h"
 #include "modematclientsrv.h"
 #include "modematsecpolicy.h"
@@ -24,17 +24,71 @@
 #include "cmodemathandler.h"
 #include "modemattrace.h"
 #include "catmessage.h"
+#include "cmodematpipecontroller.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cmodematsrvTraces.h"
+#endif
 
+_LIT8( KCursor, ">" );
+_LIT8( KOkResponse, "OK" );
+_LIT8( KErrorResponse, "ERROR" );
+_LIT8( KOkResponseNoVerbose, "0" );
+_LIT8( KErrorResponseNoVerbose, "4" );
+
+_LIT8( KAtv, "ATV" );
+_LIT8( KAtv1, "ATV1" );
+_LIT8( KAtv0, "ATV0" );
+_LIT8( KAtq, "ATQ" );
+_LIT8( KAtq1, "ATQ1" );
+_LIT8( KAtq0, "ATQ0" );
+_LIT8( KAte, "ATE" );
+_LIT8( KAte1, "ATE1" );
+_LIT8( KAte0, "ATE0" );
+
+_LIT8( KCmgs, "+CMGS" );
+_LIT8( KCmgc, "+CMGC" );
+_LIT8( KCmgsQuery, "+CMGS=?" );
+_LIT8( KCmgcQuery, "+CMGC=?" );
+
+// Carriage return needs to be checked from ATS3, or the following AT&V
+// fails, because its not yet informed to upper layers.
+_LIT8( KAts3, "ATS3=" );
+const TUint8 KDefaultCarriageChar( 0xd );  // 13
+
+const TUint8 KOff( 0x00 );
+const TUint8 KOn( 0x01 );
+
+const TInt KEchoOn( 1 );
+const TInt KEchoOff( 2 );
+const TInt KVerboseOn( 3 );
+const TInt KVerboseOff( 4 );
+const TInt KQuietOn( 5 );
+const TInt KQuietOff( 6 );
+const TInt KReplyTypeEditorStart( 1 );
+const TInt KReplyTypeEditorEnd( 2 );
 
 CModemAtSrv::CModemAtSrv( TInt aPriority ) :
     CPolicyServer( aPriority, KSrvPolicy ),
     iHandler(NULL),
-    iDteId( 0 )  // iDteId defaults to 0 and it is updated by PNS_PIPE_CREATE_RESP
+    iEcho( KOn ),
+    iEchoNotified( KInitialValue ),
+    iEchoQueryIsOngoing( EFalse ),
+    iVerbose( KOff ),
+    iVerboseNotified( KInitialValue ),
+    iVerboseQueryIsOngoing( EFalse ),
+    iQuiet( KOff ),
+    iQuietNotified( KInitialValue ),
+    iQuietQueryIsOngoing( EFalse ),
+    iCarriageReturn( KDefaultCarriageChar ),
+    iCarriageReturnFound( EFalse )
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_CMODEMATSRV, "CModemAtSrv::CModemAtSrv" );
     }
 
 CModemAtSrv::~CModemAtSrv()
     {
+    OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_CMODEMATSRV, "CModemAtSrv::~CModemAtSrv" );
     C_TRACE (( _L(">>CModemAtSrv::~CModemAtSrv()") ));
     iAtMessageArray.ResetAndDestroy();
     iAtMessageArray.Close();
@@ -43,6 +97,7 @@
 
 CModemAtSrv* CModemAtSrv::NewLC()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_NEWLC, "CModemAtSrv::NewLC" );
     CModemAtSrv* self = new (ELeave) CModemAtSrv( EPriorityNormal );
     CleanupStack::PushL( self );
     self->ConstructL();
@@ -51,27 +106,60 @@
     return self;
     }
 
-void CModemAtSrv::RemovePipe()
+void CModemAtSrv::RemovePipe( CModemAtHandler* aHandler )
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_REMOVEPIPE, "CModemAtSrv::RemovePipe" );
     C_TRACE((_L("CModemAtSrv::RemovePipe()") ));
-    iHandler->RemovePipe( iDteId );
+    ASSERT_PANIC_ALWAYS( NULL != aHandler );
+    aHandler->RemovePipe();
     }
 
 void CModemAtSrv::ClientClosed( CModemAtSession* aSession )
     {
-    C_TRACE (( _L("CModemAtSrv::ClientClosed()") ));
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_CLIENTCLOSED, "CModemAtSrv::ClientClosed" );
+    C_TRACE (( _L(">>CModemAtSrv::ClientClosed()") ));
     TInt index = iSessions.Find( aSession );
     if( index >= 0 )
         {
-        
-        if( iSessions.Count() == 1 )
+        OstTrace1( TRACE_NORMAL, DUP1_CMODEMATSRV_CLIENTCLOSED, "CModemAtSrv::ClientClosed - Removing session;iSessions[index]->GetPluginType()=%d", iSessions[index]->GetPluginType() );
+        C_TRACE((_L("Removing session (plugin type %d)"), iSessions[index]->GetPluginType() ));
+        iSessions.Remove( index );
+
+        if( ECommonPlugin == aSession->GetPluginType() )
             {
+            OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_CLIENTCLOSED, "CModemAtSrv::ClientClosed - Disconnecting ISI message handler" );
             C_TRACE((_L("Disconnecting ISI message handler ") ));
-            iHandler->Disconnect( iDteId );
+            aSession->GetHandler()->Disconnect();
             }
 
-        C_TRACE((_L("Removing session (plugin type %d)"), iSessions[index]->GetPluginType() ));
-        iSessions.Remove( index );
+        for( int i = 0; i < iDteInfo.Count(); i++ )
+            {
+            if( aSession == iDteInfo[i].iSession )
+                {
+                OstTrace0( TRACE_NORMAL, DUP3_CMODEMATSRV_CLIENTCLOSED, "CModemAtSrv::ClientClosed - removing dte info" );
+                C_TRACE((_T("CModemAtSrv::ClientClosed() removing dte info") ));
+                iDteInfo.Remove( i );
+                }
+            }
+
+        TBool pluginsFound( EFalse );       
+        for( int i = 0; i < iSessions.Count(); i++ )
+            {
+            if( 0 == iSessions[i]->GetName().Compare( aSession->GetName() ) )
+                {
+                pluginsFound = ETrue;
+                break;
+                }
+            }
+
+        if( !pluginsFound &&
+            iHandler != aSession->GetHandler() )
+            {
+            OstTrace0( TRACE_NORMAL, DUP4_CMODEMATSRV_CLIENTCLOSED, "CModemAtSrv::ClientClosed - Deleting handler" );
+            C_TRACE((_L("Deleting handler") ));
+            iFreeChannels.Append( aSession->GetHandler()->GetChannelId() );
+            delete aSession->GetHandler();
+            }
 
         C_TRACE((_T("<<CModemAtSrv::ClientClosed()") ));
         }
@@ -80,6 +168,7 @@
 CSession2* CModemAtSrv::NewSessionL( const TVersion& aVersion,
                                    const RMessage2& /*aMessage*/ ) const
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_NEWSESSIONL, "CModemAtSrv::NewSessionL" );
     C_TRACE (( _T("CModemAtSrv::NewSessionL()") ));
     CModemAtSrv& thisServer = const_cast<CModemAtSrv&>( *this );
     CModemAtSession* session = CModemAtSession::NewL( thisServer, aVersion );
@@ -91,46 +180,105 @@
 
 void CModemAtSrv::ConstructL()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_CONSTRUCTL, "CModemAtSrv::ConstructL" );
     C_TRACE (( _T("CModemAtSrv::ConstructL()") ));
-    iHandler = CModemAtHandler::NewL( *this );
-    } 
+    iHandler = CModemAtHandler::NewL( *this, EIscNokiaAtController );
 
-void CModemAtSrv::HandleSignalInd( const TUint8 aDteId )
+    iFreeChannels.Append( EIscNokiaAtController2 );
+    iFreeChannels.Append( EIscNokiaAtController3 );
+    }
+
+void CModemAtSrv::HandleSignalInd( const TUint8 aDteId, const TInt aCompleteCode )
     {
-    C_TRACE ((_T("CModemAtSrv::HandleSignalInd aDteId = %d sessions = %d"), aDteId, iSessions.Count() ));
+    C_TRACE((_T("CModemAtSrv::HandleSignalInd aDteId = %d sessions = %d, code = %d"), aDteId, iSessions.Count(), aCompleteCode ));
     for( TInt i = 0; i < iSessions.Count(); i++ )
         {
-        if( iDteId == aDteId  && iSessions[i]->IsSignalIndReqActive() )
+        if( iSessions[i]->GetDteId() == aDteId && iSessions[i]->IsSignalIndReqActive() )
             {
             C_TRACE (( _T("CModemAtSrv::HandleSignalInd() session found") ));
-            iSessions[i]->SignalIndReceived();
+            iSessions[i]->SignalIndReceived( aCompleteCode );
             }
         }
     }
 
 void CModemAtSrv::HandleUnsolicitedData( const TUint8 aDteId, const TDesC8& aData )
     {
+    OstTraceExt2( TRACE_NORMAL, CMODEMATSRV_HANDLEUNSOLICITEDDATA, "CModemAtSrv::HandleUnsolicitedData;aDteId=%d;iSessions.Count()=%d", aDteId, iSessions.Count() );
     C_TRACE ((_T("CModemAtSrv::HandleUnsolicitedData aDteId = %d sessions = %d"), aDteId, iSessions.Count() ));
+    TBool unsolicitedDataHandled( EFalse );
+
+    _LIT8( KNoCarrier, "NO CARRIER" );
+    if( aData.Find( KNoCarrier ) != KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_HANDLEUNSOLICITEDDATA, "CModemAtSrv::HandleUnsolicitedData - NO CARRIER -> COMMAND MODE" );
+        C_TRACE(_L("NO CARRIER -> COMMAND MODE"));
+        HandleCommandModeChange( aDteId, ECommandMode );
+        }
+
     for( TInt i = 0; i < iSessions.Count(); i++ )
         {
-        if( ( iDteId == aDteId || aDteId == KUnsolicitedDataDteId )&&
+        if( ( iSessions[i]->GetDteId() == aDteId || aDteId == KUnsolicitedDataDteId )&&
             iSessions[i]->IsUnsolicitedDataReqActive() &&
             iSessions[i]->GetPluginType() == EATExtPlugin )
             {
+            OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_HANDLEUNSOLICITEDDATA, "CModemAtSrv::HandleUnsolicitedData - session found" );
             C_TRACE (( _T("CModemAtSrv::HandleUnsolicitedData() session found") ));
             iSessions[i]->UnsolicitedData( aData );
+            unsolicitedDataHandled = ETrue;
+            return;
             }
         }
+    if( ! unsolicitedDataHandled )
+        {
+        OstTrace0( TRACE_NORMAL, DUP3_CMODEMATSRV_HANDLEUNSOLICITEDDATA, "CModemAtSrv::HandleUnsolicitedData - request is not active yet so save message to the server" );
+        C_TRACE (( _T("CModemAtSrv::HandleSignalInd() request is not active yet so save message to the server") ));
+        
+        // Note: If call is received with unsolicited "RING", it will not be sent, because request is not active in data mode.
+        // After that "NO CARRIER" will copy over the "RING", and it will be sent, when returning to command mode.
+        iTemporaryUnsolicitedData = aData;
+        }
     }
 
-void CModemAtSrv::HandleCommandModeChange( TCommandMode aMode )
+TBool CModemAtSrv::IsUnsolicitedDataInBuffer()
+    {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_ISUNSOLICITEDDATAINBUFFER, "CModemAtSrv::IsUnsolicitedDataInBuffer;%d", (TInt) iTemporaryUnsolicitedData.Length() );
+    C_TRACE ((_T("CModemAtSrv::IsUnsolicitedDataInBuffer %d"), (TInt) iTemporaryUnsolicitedData.Length() ));
+    if( iTemporaryUnsolicitedData.Length() > 0)
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+void CModemAtSrv::ResetUnsolicitedDataInBuffer()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_RESETUNSOLICITEDDATAINBUFFER, "CModemAtSrv::ResetUnsolicitedDataInBuffer" );
+    C_TRACE (( _T("CModemAtSrv::ResetUnsolicitedDataInBuffer()") ));
+    iTemporaryUnsolicitedData.Zero();
+    }
+
+void CModemAtSrv::GetUnsolicitedDataInBuffer( TDes8& aData )
+    {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_GETUNSOLICITEDDATAINBUFFER, "CModemAtSrv::GetUnsolicitedDataInBuffer" );
+    C_TRACE (( _T("CModemAtSrv::GetUnsolicitedDataInBuffer()") ));
+    aData.Copy( iTemporaryUnsolicitedData );
+    }
+
+
+void CModemAtSrv::HandleCommandModeChange( TUint8 aDteId, TCommandMode aMode )
+    {
+    OstTraceExt2( TRACE_NORMAL, CMODEMATSRV_HANDLECOMMANDMODECHANGE, "CModemAtSrv::HandleCommandModeChange;iSessions.Count()=%d;aMode=%d", iSessions.Count(), (TInt)aMode );
     C_TRACE ((_T("CModemAtSrv::HandleCommandModeChange sessions = %d mode = %d"), iSessions.Count(), (TInt) aMode ));
     for( TInt i = 0; i < iSessions.Count(); i++ )
         {
         if( iSessions[i]->IsCommandModeReqActive() &&
-            iSessions[i]->GetPluginType() == ECommonPlugin )
+            ECommonPlugin == iSessions[i]->GetPluginType() &&
+            aDteId == iSessions[i]->GetDteId() )
             {
+            OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_HANDLECOMMANDMODECHANGE, "CModemAtSrv::HandleCommandModeChange - session found" );
             C_TRACE (( _T("CModemAtSrv::HandleCommandModeChange() session found") ));
             iSessions[i]->CommandModeChanged( aMode );
             }
@@ -142,32 +290,135 @@
     const TDesC8& aResponse,
     const TUint8 aCommand )
     {
+    OstTraceExt2( TRACE_NORMAL, CMODEMATSRV_HANDLEINTERMEDIATEDATAIND, "CModemAtSrv::HandleIntermediateDataInd;aDteId=%d;iSessions.Count()=%d", aDteId, iSessions.Count() );
     C_TRACE ((_T("CModemAtSrv::HandleIntermediateDataInd aDteId = %d sessions = %d "), aDteId, iSessions.Count() ));
     C_TRACE ((_T("plugintype = %d command = %d"), (TInt)aPluginType, aCommand ));
     
     if ( iAtMessageArray.Count() > 0 )
         {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_HANDLEINTERMEDIATEDATAIND, "CModemAtSrv::HandleIntermediateDataInd - iAtMessageArray[0]->ReceiveATResponse Intermediate data" );
         C_TRACE((_L("iAtMessageArray[0]->ReceiveATResponse Intermediate data")));
-        iAtMessageArray[0]->ReceiveATResponse( aResponse, EFalse );
+        iAtMessageArray[0]->ReceiveATResponse( aResponse, EFalse, KErrNone );
         }
     else
         {
+        OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_HANDLEINTERMEDIATEDATAIND, "CModemAtSrv::HandleIntermediateDataInd - INTERMEDIATE DATA received but no request active" );
         C_TRACE ((_T("CModemAtSrv::HandleIntermediateDataInd INTERMEDIATE DATA received but no request active") ));
+        HandleUnsolicitedData( aDteId, aResponse);
         }
     }
 
-void CModemAtSrv::HandleATResponse( const TUint8 aDteId, const TDesC8& aResponse, const TUint8 aCommand )
+void CModemAtSrv::HandleATResponse( 
+    const TUint8 aDteId, 
+    CModemAtHandler* aHandler,
+    const TDesC8& aResponse, 
+    const TUint8 aCommand )
     {
+    OstTraceExt2( TRACE_NORMAL, CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse;aDteId=%d;iSessions.Count()=%d", aDteId, iSessions.Count() );
     C_TRACE ((_T(">>CModemAtSrv::HandleATResponse aDteId = %d sessions = %d "), aDteId, iSessions.Count() ));
     C_TRACE ((_T("CModemAtSrv::HandleATResponse command = %d"), aCommand ));
-    
+    TRACE_ASSERT( NULL != aHandler )
+    TInt completeCode( KErrNone );
+    if( IsTextMessageMode( aHandler ) )
+        {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Text message mode is on" );
+        C_TRACE(_L("Text message mode is on"));
+        if( aResponse.Find( KCursor ) != KErrNotFound )
+            {
+            OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - detected during text message mode" );
+            C_TRACE(_L("> detected during text message mode"));
+            completeCode = KReplyTypeEditorStart; // replace later with EReplyTypeEditorStart
+            }
+        else if( aResponse.Find( KOkResponse ) != KErrNotFound ||
+        	  aResponse.Find( KErrorResponse ) != KErrNotFound ||
+        	  aResponse.Find( KOkResponseNoVerbose ) != KErrNotFound ||
+        	  aResponse.Find( KErrorResponseNoVerbose ) != KErrNotFound )
+            {
+            OstTrace0( TRACE_NORMAL, DUP3_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Response detected after text message mode" );
+            C_TRACE(_L("Response detected after text message mode"));
+            aHandler->SetTextMessageMode( EFalse );
+            completeCode = KReplyTypeEditorEnd; // replace later with EReplyTypeEditorEnd
+            }
+        if( completeCode == KErrNone )
+            {
+            OstTrace0( TRACE_NORMAL, DUP4_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Response detected after text message mode (quiet mode)" );
+            C_TRACE(_L("Response detected after text message mode (quiet mode)"));
+            aHandler->SetTextMessageMode( EFalse );
+            completeCode = KReplyTypeEditorEnd;
+            }
+        }
+
+    if( iEchoQueryIsOngoing )
+        {
+        OstTraceExt2( TRACE_NORMAL, DUP5_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Echo query ongoing.;iEcho=%d;iEchoNitified=%d", iEcho, iEchoNotified );
+        C_TRACE((_L("Echo query ongoing. current: %d, notified %d"), iEcho, iEchoNotified ));
+        if( iEcho == KOff && iEchoNotified != KOff )
+            {
+            OstTrace0( TRACE_NORMAL, DUP7_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Echo off, notify common plug-in." );
+            C_TRACE(_L("Echo off, notify common plug-in."));
+            HandleSignalInd( aDteId, KEchoOff );
+            iEchoNotified = KOff;
+            }
+        else if( iEcho == KOn && iEchoNotified != KOn )
+            {
+            OstTrace0( TRACE_NORMAL, DUP8_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Echo on, notify common plug-in." );
+            C_TRACE(_L("Echo on, notify common plug-in."));
+            HandleSignalInd( aDteId, KEchoOn );
+            iEchoNotified = KOn;
+            }
+        iEchoQueryIsOngoing = EFalse;
+        }
+    else if( iVerboseQueryIsOngoing )
+        {
+        OstTraceExt2( TRACE_NORMAL, DUP9_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Verbose query ongoing.;iVerbose=%d;iVerboseNotified=%d", iVerbose, iVerboseNotified );
+        C_TRACE((_L("Verbose query ongoing. current: %d, notified %d"), iVerbose, iVerboseNotified ));
+        if( iVerbose == KOff && iVerboseNotified != KOff )
+            {
+            OstTrace0( TRACE_NORMAL, DUP10_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Verbose off received, notify common plug-in." );
+            C_TRACE(_L("Verbose off received, notify common plug-in."));
+            HandleSignalInd( aDteId, KVerboseOff );
+            iVerboseNotified = KOff;
+            }
+        else if( iVerbose == KOn && iVerboseNotified != KOn )
+            {
+            OstTrace0( TRACE_NORMAL, DUP11_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Verbose on received, notify common plug-in." );
+            C_TRACE(_L("Verbose on received, notify common plug-in."));
+            HandleSignalInd( aDteId, KVerboseOn );
+            iVerboseNotified = KOn;
+            }
+        iVerboseQueryIsOngoing = EFalse;
+        }
+    else if( iQuietQueryIsOngoing )
+        {
+        OstTraceExt2( TRACE_NORMAL, DUP12_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Quiet query ongoing.;iQuiet=%d;iQuietNotified=%d", iQuiet, iQuietNotified );
+        C_TRACE((_L("Quiet query ongoing. current: %d, notified %d"), iQuiet, iQuietNotified ));
+        if( iQuiet == KOff && iQuietNotified != KOff )
+            {
+            OstTrace0( TRACE_NORMAL, DUP13_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Quiet off, notify common plug-in." );
+            C_TRACE(_L("Quiet off, notify common plug-in."));
+            HandleSignalInd( aDteId, KQuietOff );
+            iQuietNotified = KOff;
+            }
+        else if( iQuiet == KOn && iQuietNotified != KOn )
+            {
+            OstTrace0( TRACE_NORMAL, DUP14_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Quiet on, notify common plug-in." );
+            C_TRACE(_L("Quiet on, notify common plug-in."));
+            HandleSignalInd( aDteId, KQuietOn );
+            iQuietNotified = KOn;
+            }
+        iQuietQueryIsOngoing = EFalse;
+        }
+
     if ( iAtMessageArray.Count() > 0 )
         {
         CAtMessage* tmp = iAtMessageArray[0];
+        OstTrace1( TRACE_NORMAL, DUP15_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - iAtMessageArray[0]->ReceiveATResponse;tmp=%x", tmp );
         C_TRACE((_L("iAtMessageArray[0]->ReceiveATResponse 0x%x"), tmp ));
-        tmp->ReceiveATResponse( aResponse, ETrue );
+        tmp->ReceiveATResponse( aResponse, ETrue, completeCode );
+        OstTrace0( TRACE_NORMAL, DUP16_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - Remove the first message in Fifo" );
         C_TRACE((_L("CModemAtSrv::HandleATResponse Remove the first message in Fifo")));
         RemoveFirstFromSendFifo();
+        OstTrace0( TRACE_NORMAL, DUP17_CMODEMATSRV_HANDLEATRESPONSE, "CModemAtSrv::HandleATResponse - SendNextFromFifo" );
         C_TRACE((_L("CModemAtSrv::HandleATResponse SendNextFromFifo")));
         SendNextFromFifo();
         }
@@ -178,56 +429,280 @@
     C_TRACE ((_T("<<CModemAtSrv::HandleATResponse()") ));
     }
 
-TInt CModemAtSrv::ConnectToModem( CModemAtSession* aSession, TATPluginInterface aPluginType ) 
+TInt CModemAtSrv::ConnectToModemL( CModemAtSession* aSession, TATPluginInterface aPluginType ) 
     {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL;aSession=%x", aSession );
     C_TRACE ((_T(">>CModemAtSrv::ConnectToModem 0x%x"), aSession));
 
+    OstTraceExt2( TRACE_NORMAL, DUP1_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL;iSessions.Count()=%d;aPluginType=%d", iSessions.Count(), (TInt)aPluginType );
     C_TRACE(( _L("session count: %d, type: %d"), iSessions.Count(), (TInt) aPluginType ));
 
     if( aPluginType == ECommonPlugin )
         {
+        OstTrace1( TRACE_NORMAL, DUP2_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Common plug-in connecting;aSession=%x", aSession );
         C_TRACE ((_T("Common plug-in connecting")));
-        C_TRACE ((_T("<<CModemAtSrv::ConnectToModem iDteId: %d, session: 0x%x"), iDteId, aSession));
-        return iHandler->Connect( iDteId );
+        C_TRACE ((_T("<<CModemAtSrv::ConnectToModem session: 0x%x"), aSession));
+        
+        if( KMaxDteCount >= GetDteCount() )
+            {
+            TBool handlerAttached( EFalse );
+            for( TInt i = 0; i < iSessions.Count(); i++ )
+                {
+                if( iHandler == iSessions[i]->GetHandler() )
+                    {
+                    handlerAttached = ETrue;
+                    break;
+                    }
+                }
+
+            TUint8 devId( 0 );
+            TUint8 objId( 0 );
+            TBool dteFound( EFalse );
+            OstTrace1( TRACE_NORMAL, DUP3_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL;iDteInfo.Count()=%d", iDteInfo.Count() );
+            C_TRACE ((_T("iDteInfo.Count(): %d"), iDteInfo.Count()));
+            for( TInt j = 0; j < iDteInfo.Count(); j++ )
+                {
+                if( NULL == iDteInfo[j].iSession )
+                    {
+                    dteFound = ETrue;
+                    CModemAtHandler* handler( NULL );
+                    devId = iDteInfo[j].iDevId;
+                    objId = iDteInfo[j].iObjId;
+                    if( handlerAttached )
+                        {
+                        OstTrace0( TRACE_NORMAL, DUP4_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Creating new handler" );
+                        C_TRACE ((_T("Creating new handler")));
+                        TUint8 channelId( 0 );
+                        if( KErrNone == GetFreeChannelId( channelId ) )
+                            {
+                            handler = CModemAtHandler::NewL(
+                                *this,
+                                channelId );
+                            iDteInfo[j].iSession = aSession;
+                            aSession->SetHandler( handler );
+                            }
+                        else
+                            {
+                            TRACE_ASSERT_ALWAYS;
+                            aSession->ModemConnected( KErrGeneral );
+                            OstTrace0( TRACE_NORMAL, DUP14_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL No free channel id" );
+                            C_TRACE ((_T("No free channel id")));
+                            return KErrGeneral;
+                            }
+                        }
+                    else
+                        {
+                        OstTrace0( TRACE_NORMAL, DUP5_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Using already created handler" );
+                        C_TRACE ((_T("Using already created handler")));
+                        iDteInfo[j].iSession = aSession;
+                        aSession->SetHandler( iHandler );
+                        }
+                    break;
+                    }
+                }
+            if( dteFound )
+                {
+                return aSession->GetHandler()->Connect( devId, objId );
+                }
+            else
+                {
+                OstTrace0( TRACE_NORMAL, DUP6_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - No dte info found. Possibly PNS_NAME_ADD_IND not received -> creating default pipe." );
+                C_TRACE ((_T("No dte info found. Possibly PNS_NAME_ADD_IND not received -> creating default pipe.")));
+                
+                CModemAtHandler* handler( NULL );
+                
+                TUint KInitialDpObjId( 0x2f );
+                TUint dataportObjectid( KInitialDpObjId );
+                TBool found( EFalse );
+                    
+                if( !handlerAttached )
+                    {
+                    OstTrace0( TRACE_NORMAL, DUP7_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Using already created handler" );
+                    C_TRACE ((_T("Using already created handler")));
+                    aSession->SetHandler( iHandler );
+
+                    OstTrace0( TRACE_NORMAL, DUP8_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Calling GetDataportObjectId()" );
+                    C_TRACE ((_T("Calling GetDataportObjectId()")));
+                    aSession->GetHandler()->GetDataportObjectId( dataportObjectid );
+                    
+                    OstTrace0( TRACE_NORMAL, DUP9_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Calling AddDevice()" );
+                    C_TRACE ((_T("Calling AddDevice()")));
+                    AddDevice( THIS_DEVICE, (TUint8)dataportObjectid );
+                    
+                    OstTrace0( TRACE_NORMAL, DUP10_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Set session to this device" );
+                    C_TRACE ((_T("Set session to this device")));
+                    for( TInt j = 0; j < iDteInfo.Count(); j++ )
+                        {
+                        if( NULL == iDteInfo[j].iSession ) // if iSession is NULL, the device handler is not attached
+                            {
+                            OstTrace0( TRACE_NORMAL, DUP11_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Device session found" );
+                            C_TRACE ((_T("Device session found")));
+                            iDteInfo[j].iSession = aSession;
+                            found = ETrue;
+                            }
+                        }
+                    if( !found )
+                        {
+                        OstTrace0( TRACE_NORMAL, DUP12_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Device session not found" );
+                        C_TRACE ((_T("Device session not found")));
+                        if( iDteInfo.Count() == 1 )
+                            {
+                            OstTrace0( TRACE_NORMAL, DUP13_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Set session to first device" );
+                            C_TRACE ((_T("Set session to first device")));
+                            iDteInfo[0].iSession = aSession;
+                            }
+                        }
+                    }
+                else
+                    {
+                    // NOTE: It might be possible to have second device attached and then no pipe has been created
+                    // before this, EIscNokiaDataport2 has been used with first device. Now we need use
+                    // EIscNokiaDataport4. EIscNokiaDataport5 is not currently supported without PNS_NAME_ADD_IND.
+                    TUint8 channelId( 0 );
+                    if( KErrNone == GetFreeChannelId( channelId ) )
+                        {
+                        C_TRACE ((_T("Creating new handler")));
+                        handler = CModemAtHandler::NewL(
+                            *this,
+                            channelId );
+                        OstTrace0( TRACE_NORMAL, DUP15_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Using just created handler" );
+                        C_TRACE ((_T("Using just created handler")));
+                        aSession->SetHandler( handler );
+
+                        OstTrace0( TRACE_NORMAL, DUP16_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Calling GetDataportObjectId()" );
+                        C_TRACE ((_T("Calling GetDataportObjectId()")));
+
+                        // Get dataport 4 
+                        aSession->GetHandler()->GetSecondaryDataportObjectId( dataportObjectid );
+
+                        OstTrace0( TRACE_NORMAL, DUP17_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Calling AddDevice()" );
+                        C_TRACE ((_T("Calling AddDevice()")));
+                        AddDevice( THIS_DEVICE, (TUint8)dataportObjectid );
+
+
+                        OstTrace0( TRACE_NORMAL, DUP18_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Set session to the second device" );
+                        C_TRACE ((_T("Set session to the second device")));
+
+                        for( TInt j = 0; j < iDteInfo.Count(); j++ )
+                            {
+                            if( NULL == iDteInfo[j].iSession )
+                                {
+                                OstTrace0( TRACE_NORMAL, DUP19_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Device session found" );
+                                C_TRACE ((_T("Device session found")));
+                                iDteInfo[j].iSession = aSession;
+                                found = ETrue;
+                                }
+                            }
+                        if( !found )
+                            {
+                            OstTrace0( TRACE_NORMAL, DUP20_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Device 2 session not found" );
+                            C_TRACE ((_T("Device 2 session not found")));
+                            if( iDteInfo.Count() == 2 )
+                                {
+                                OstTrace0( TRACE_NORMAL, DUP21_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Set session to second device" );
+                                C_TRACE ((_T("Set session to second device")));
+                                iDteInfo[1].iSession = aSession;
+                                }
+                            }
+                        }
+                    else
+                        {	
+                        TRACE_ASSERT_ALWAYS;
+                        aSession->ModemConnected( KErrGeneral );
+                        OstTrace0( TRACE_NORMAL, DUP26_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL No free channel id" );
+                        C_TRACE ((_T("No free channel id")));
+                        }
+                    }
+                if( found )
+                    {
+                    OstTrace0( TRACE_NORMAL, DUP22_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Calling Connect( THIS_DEVICE, dataportObjectid )" );
+                    C_TRACE ((_T("Calling Connect( THIS_DEVICE, dataportObjectid )")));
+                    return aSession->GetHandler()->Connect( THIS_DEVICE, dataportObjectid );
+                    }
+                else
+                    {
+                    C_TRACE ((_T("no dte info found, connect failed")));
+                    OstTrace0( TRACE_NORMAL, DUP27_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL no dte info found, connect failed" );
+                    aSession->ModemConnected( KErrGeneral );
+                    }
+                }
+            }
+        else
+            {
+            OstTrace0( TRACE_NORMAL, DUP23_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Too many connections, connect failed" );
+            C_TRACE ((_T("Too many connections, connect failed")));
+            aSession->ModemConnected( KErrGeneral );
+            }
         }
     else
         {
+        OstTrace0( TRACE_NORMAL, DUP24_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL - Atext plug-in connecting" );
         C_TRACE ((_T("Atext plug-in connecting")));
 
+        for( TInt i = 0; i < iSessions.Count(); i++ )
+            {
+            if( ECommonPlugin == iSessions[i]->GetPluginType() &&
+                0 == iSessions[i]->GetName().Compare( aSession->GetName() ) )
+                {
+                aSession->SetDteId( iSessions[i]->GetDteId() );
+                aSession->SetHandler( iSessions[i]->GetHandler() );
+                break;
+                }
+            }
         aSession->ModemConnected( KErrNone );
+
+        OstTrace1( TRACE_NORMAL, DUP25_CMODEMATSRV_CONNECTTOMODEML, "CModemAtSrv::ConnectToModemL;aSession=%x", aSession );
         C_TRACE ((_T("<<CModemAtSrv::ConnectToModem 0x%x"), aSession));
-        return KErrNone;
         }
-
+    return KErrNone;
     }
 
 void CModemAtSrv::AddToSendFifo( const TATPluginInterface aPluginType, CAtMessage* aMessage )
     {
+    OstTraceExt2( TRACE_NORMAL, CMODEMATSRV_ADDTOSENDFIFO, "CModemAtSrv::AddToSendFifo;aPluginType=%d;aMessage=%p", (TInt)aPluginType, aMessage );
     C_TRACE (( _T("CModemAtSrv::AddToSendFifo( aPluginType: %d, aMessage: 0x%x)"), (TInt)aPluginType, aMessage));
 
     iAtMessageArray.Append( aMessage ); // only one AT command at the time in modem
 
     if( iAtMessageArray.Count() == 1 ) //if empty Fifo send immediately
         {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_ADDTOSENDFIFO, "CModemAtSrv::AddToSendFifo - Sending message immediately" );
         C_TRACE((_L("Sending message immediately")));
-        iHandler->SendATCommand( iDteId, 
-           aPluginType,
-           aMessage->GetMessageType(),
-           aMessage->GetBuffer() );
+        CModemAtSession* session = aMessage->GetSession();
+        if( session )
+            {
+            CModemAtHandler* handler( session->GetHandler() );
+            PeekAtCommand( handler, aMessage->GetBuffer() );
+
+            handler->SendATCommand( 
+                aPluginType,
+                aMessage->GetMessageType(),
+                aMessage->GetBuffer() );
+            }
+        else
+            {
+            OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_ADDTOSENDFIFO, "CModemAtSrv::AddToSendFifo - Session NULL" );
+            C_TRACE((_L("Session NULL")));
+            TRACE_ASSERT_ALWAYS;
+            }
         }
     }
 
 void CModemAtSrv::RemoveFirstFromSendFifo()
     {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_REMOVEFIRSTFROMSENDFIFO, "CModemAtSrv::RemoveFirstFromSendFifo;iAtMessageArray.Count()=%d", iAtMessageArray.Count() );
     C_TRACE(( _T("CModemAtSrv::RemoveFirstFromSendFifo iAtMessageArray.Count = %d"), iAtMessageArray.Count() ));
     if( iAtMessageArray.Count( ) > 0 )
         {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_REMOVEFIRSTFROMSENDFIFO, "CModemAtSrv::RemoveFirstFromSendFifo - 1" );
         C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 1") ));
         CAtMessage* msg = iAtMessageArray[0];
+        OstTrace1( TRACE_NORMAL, DUP2_CMODEMATSRV_REMOVEFIRSTFROMSENDFIFO, "CModemAtSrv::RemoveFirstFromSendFifo - 2;msg=%x", msg );
         C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 2 0x%x"), msg ));
         iAtMessageArray.Remove(0);
         if( msg )
             {
+            OstTrace0( TRACE_NORMAL, DUP3_CMODEMATSRV_REMOVEFIRSTFROMSENDFIFO, "CModemAtSrv::RemoveFirstFromSendFifo - 3" );
             C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 3") ));
             delete msg;
             }
@@ -235,49 +710,71 @@
             {
             TRACE_ASSERT_ALWAYS;
             }
+        OstTrace0( TRACE_NORMAL, DUP4_CMODEMATSRV_REMOVEFIRSTFROMSENDFIFO, "CModemAtSrv::RemoveFirstFromSendFifo - 4" );
         C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 4") ));
         }
+    OstTrace0( TRACE_NORMAL, DUP5_CMODEMATSRV_REMOVEFIRSTFROMSENDFIFO, "CModemAtSrv::RemoveFirstFromSendFifo - 5" );
     C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 5") ));
     }
 
 void CModemAtSrv::SendNextFromFifo()
     {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_SENDNEXTFROMFIFO, "CModemAtSrv::SendNextFromFifo - fifo message count;iAtMessageArray.Count()=%d", iAtMessageArray.Count() );
     C_TRACE ((_T("CModemAtSrv::SendNextFromFifo fifo has %d message(s)"), iAtMessageArray.Count() ));
     
-    TPtr8 ptr(0,0);
+    TPtr8 ptr( 0, 0 );
     if( iAtMessageArray.Count() > 0 )
         {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_SENDNEXTFROMFIFO, "CModemAtSrv::SendNextFromFifo - Messages in buffer... Sending message" );
         C_TRACE((_L("Messages in buffer... Sending message")));
         ptr.Set( iAtMessageArray[0]->GetBuffer() );
-        
-        C_TRACE (( _T("iHandler->SendATCommand()") ));
-        iHandler->SendATCommand( iDteId, 
-           iAtMessageArray[0]->GetSession()->GetPluginType(),
-           iAtMessageArray[0]->GetMessageType(),
-           ptr );
+
+        CModemAtHandler* handler( iAtMessageArray[0]->GetSession()->GetHandler() );
+        if( handler )
+            {
+            OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_SENDNEXTFROMFIFO, "CModemAtSrv::SendNextFromFifo - iHandler->SendATCommand()" );
+            C_TRACE (( _T("iHandler->SendATCommand()") ));
+            PeekAtCommand( handler, ptr );
+            handler->SendATCommand( 
+                iAtMessageArray[0]->GetSession()->GetPluginType(),
+                iAtMessageArray[0]->GetMessageType(),
+                ptr );
+            }
+        else
+            {
+            OstTrace0( TRACE_NORMAL, DUP3_CMODEMATSRV_SENDNEXTFROMFIFO, "CModemAtSrv::SendNextFromFifo - Handler NULL" );
+            C_TRACE((_L("Handler NULL")));
+            TRACE_ASSERT_ALWAYS;
+            }   
         }
     }
 
 void CModemAtSrv::CancelFifoRequests( const CModemAtSession* aSession )
     {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_CANCELFIFOREQUESTS, "CModemAtSrv::CancelFifoRequests;iAtMessageArray.Count()=%d", iAtMessageArray.Count() );
     C_TRACE((_T(">>CModemAtSrv::CancelFifoRequests count: %d"), iAtMessageArray.Count() ));
     TInt messageCount = iAtMessageArray.Count();
     for( TInt i = 0; i < messageCount; i++ )
         {
+        OstTrace1( TRACE_NORMAL, DUP1_CMODEMATSRV_CANCELFIFOREQUESTS, "CModemAtSrv::CancelFifoRequests - ;i=%d", i );
         C_TRACE((_T("CancelFifoRequests %d"), i ));
         CAtMessage* msg = iAtMessageArray[ i ];
         if( msg )
             {
+            OstTrace1( TRACE_NORMAL, DUP2_CMODEMATSRV_CANCELFIFOREQUESTS, "CModemAtSrv::CancelFifoRequests - Found Request:;msg=%x", msg );
             C_TRACE((_T("Found Request: 0x%x"),msg ));
             if( msg->GetSession() == aSession)
                 {
+                OstTrace0( TRACE_NORMAL, DUP3_CMODEMATSRV_CANCELFIFOREQUESTS, "CModemAtSrv::CancelFifoRequests - canceling request" );
                 C_TRACE((_T("CancelFifoRequests - canceling request") ));
                 msg->CancelRequest();
+                OstTrace0( TRACE_NORMAL, DUP4_CMODEMATSRV_CANCELFIFOREQUESTS, "CModemAtSrv::CancelFifoRequests - delete msg" );
                 C_TRACE (( _T("CModemAtSrv::CancelFifoRequest delete msg") ));
                 delete msg;
                 }
             }
         }
+    OstTrace1( TRACE_NORMAL, DUP5_CMODEMATSRV_CANCELFIFOREQUESTS, "CModemAtSrv::CancelFifoRequests - iAtMessageArray.Remove;messageCount=%d", messageCount );
     C_TRACE (( _T("CModemAtSrv::CancelFifoRequest iAtMessageArray.Remove %d messages"), messageCount ));
     for( TInt j = 0; j < messageCount && iAtMessageArray.Count() > 0; j++ )
         {
@@ -288,23 +785,255 @@
 
 TInt CModemAtSrv::SessionCount()
     {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_SESSIONCOUNT, "CModemAtSrv::SessionCount;iSessions.Count()=%d", iSessions.Count() );
     C_TRACE(( _T("CModemAtSrv::SessionCount() %d"), iSessions.Count() ));
     return iSessions.Count();
     }
 
 void CModemAtSrv::SetDteIdAndConnect( const TUint8 aDteId, const TInt aConnectionError ) 
     {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_SETDTEIDANDCONNECT, "CModemAtSrv::SetDteIdAndConnect;aDteId=%d", aDteId );
     C_TRACE(( _T("CModemAtSrv::SetDteIdAndConnect( %d )"), aDteId ));
-    iDteId = aDteId;
+    OstTrace1( TRACE_NORMAL, DUP1_CMODEMATSRV_SETDTEIDANDCONNECT, "CModemAtSrv::SetDteIdAndConnect;iSessions.Count()=%d", iSessions.Count() );
+    C_TRACE ((_T("sessions = %d"), iSessions.Count() ));
 
-    C_TRACE ((_T("sessions = %d"), iSessions.Count() ));
     for( TInt i = 0; i < iSessions.Count(); i++ )
         {
         if( iSessions[i]->IsConnectReqActive() )
             {
+            OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_SETDTEIDANDCONNECT, "CModemAtSrv::SetDteIdAndConnect - set sessions to connected" );
             C_TRACE (( _T("set sessions to connected") ));
+            iSessions[i]->SetDteId( aDteId );
             iSessions[i]->ModemConnected( aConnectionError );
             }
         }
     }
 
+TBool CModemAtSrv::IsPipeInDataMode( CModemAtHandler* aHandler )
+    {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_ISPIPEINDATAMODE, "CModemAtSrv::IsPipeInDataMode;aHandler=%x", aHandler );
+    C_TRACE(( _T("CModemAtSrv::IsPipeInDataMode() handler: 0x%x"), aHandler ));
+    TRACE_ASSERT( NULL != aHandler )
+    return aHandler->IsPipeInDataMode();
+    }
+
+TBool CModemAtSrv::IsTextMessageMode( CModemAtHandler* aHandler )
+    {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_ISTEXTMESSAGEMODE, "CModemAtSrv::IsTextMessageMode;aHandler=%x", aHandler );
+    C_TRACE(( _T("CModemAtSrv::IsTextMessageMode() handler: 0x%x"), aHandler ));
+    TRACE_ASSERT( NULL != aHandler )
+    return aHandler->IsTextMessageMode();
+    }
+
+void CModemAtSrv::PeekAtCommand( CModemAtHandler* aHandler, TDes8& aCmd )
+    {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand;aHandler=%x", aHandler );
+    C_TRACE(( _T("CModemAtSrv::PeekAtCommand() handler: 0x%x"), aHandler ));
+    TRACE_ASSERT( NULL != aHandler )
+
+    if( ( aCmd.Find( KCmgs ) != KErrNotFound || 
+    	  aCmd.Find( KCmgc ) != KErrNotFound ) &&
+    	  aCmd.Find( KCmgsQuery ) == KErrNotFound &&
+    	  aCmd.Find( KCmgcQuery ) == KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - +CMGS or +CMGC detected. The indications after this will be ignored." );
+        C_TRACE(_L("+CMGS or +CMGC detected. The indications after this will be ignored."));
+        aHandler->SetTextMessageMode( ETrue );
+        }
+    // no else
+
+    if( aCmd.Find( KAtv1 ) != KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - ATV1 received" );
+        C_TRACE(( _T("ATV1 received") ));
+        iVerbose = KOn;
+        iVerboseQueryIsOngoing = ETrue;
+        }
+    else if( aCmd.Find( KAtv0 ) != KErrNotFound || 
+    	  aCmd.Find( KAtv ) != KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP3_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - ATV0 received" );
+        C_TRACE(( _T("ATV(0) received") ));
+        iVerbose = KOff;
+        iVerboseQueryIsOngoing = ETrue;
+        }
+    else if( aCmd.Find( KAtq1 ) != KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP4_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - ATQ1 received" );
+        C_TRACE(( _T("ATQ1 received") ));
+        iQuiet = KOn;
+        iQuietQueryIsOngoing = ETrue;
+        }
+    else if( aCmd.Find( KAtq0 ) != KErrNotFound ||
+    	  aCmd.Find( KAtq ) != KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP5_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - ATQ0 received" );
+        C_TRACE(( _T("ATQ(0) received") ));
+        iQuiet = KOff;
+        iQuietQueryIsOngoing = ETrue;
+        }
+    else if( aCmd.Find( KAte1 ) != KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP6_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - ATE1 received" );
+        C_TRACE(( _T("ATE(1) received") ));
+        iEcho = KOn;
+        iEchoQueryIsOngoing = ETrue;
+        }
+    else if( aCmd.Find( KAte0 ) != KErrNotFound ||
+    	  aCmd.Find( KAte ) != KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP7_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - ATE0 received" );
+        C_TRACE(( _T("ATE(0) received") ));
+        iEcho = KOff;
+        iEchoQueryIsOngoing = ETrue;
+        }
+    else if( aCmd.Find( KAts3 ) != KErrNotFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP8_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - ATS3 received" );
+        C_TRACE(( _T("ATS3= received, saving it for the next profile query") ));
+
+        TInt valueLength = aCmd.Length() - KAts3().Length() - 1;
+		OstTrace1( TRACE_NORMAL, DUP9_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand;valueLength=%d", valueLength );
+		OstTrace1( TRACE_NORMAL, DUP10_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand;KAts3Length=%d", KAts3().Length() );
+        C_TRACE(( _T("Reading %d char's starting from %d."), valueLength, KAts3().Length() ));
+        if( valueLength > 0 )
+            {
+            TLex8 lex( aCmd.Mid( KAts3().Length(), valueLength ) );
+            TInt value;
+            if( lex.Val(value) == KErrNone )
+                {
+                C_TRACE(( _T("iCarriageReturn 0x%x "), value ));
+                iCarriageReturn = (TUint8)value;
+                iCarriageReturnFound = ETrue;
+                }
+            }
+        // no else
+        }
+
+    if( aCmd.Find( KAts3 ) == KErrNotFound &&
+    	  iCarriageReturnFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP11_CMODEMATSRV_PEEKATCOMMAND, "CModemAtSrv::PeekAtCommand - ATE=? received" );
+        C_TRACE(( _T("ATS3 has set the carriage return, using it once for profile query that will notify it to upper layers") ));
+        aCmd.Copy( aCmd.Mid( 0, aCmd.Length() - 1 ) );
+        aCmd.Append( iCarriageReturn );
+        iCarriageReturnFound = EFalse;
+        }
+
+    }
+
+TBool CModemAtSrv::IsEchoNotified( const TUint8 aEchoValue )
+    {
+    OstTrace1( TRACE_NORMAL, CMODEMATSRV_ISECHONOTIFIED, "CModemAtSrv::IsEchoNotified;aEchoValue=%d", aEchoValue );
+    C_TRACE(( _T("CModemAtSrv::IsEchoNotified( %d )"), aEchoValue ));
+    if( aEchoValue != iEchoNotified )
+        {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_ISECHONOTIFIED, "CModemAtSrv::IsEchoNotified - Echo value is not notified yet." );
+        C_TRACE(( _T("Echo value is not notified yet.") ));
+        return EFalse;
+        }
+    else
+        {
+        OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_ISECHONOTIFIED, "CModemAtSrv::IsEchoNotified - Echo value is the same as before" );
+        C_TRACE(( _T("Echo value is the same as before") ));
+        return ETrue;
+        }
+    }
+
+TBool CModemAtSrv::IsSettingQueryOngoing()
+    {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_ISSETTINGQUERYONGOING, "CModemAtSrv::IsSettingQueryOngoing" );
+    C_TRACE(( _T("CModemAtSrv::IsSettingQueryOngoing()") ));
+    if ( iEchoQueryIsOngoing || iVerboseQueryIsOngoing || iQuietQueryIsOngoing )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+
+void CModemAtSrv::AddDevice( TUint8 aDevId, TUint8 aObjId )
+    {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_ADDDEVICE, "CModemAtSrv::AddDevice" );
+    C_TRACE(( _T("CModemAtSrv::AddDevice()") ));
+    TBool alreadyFound( EFalse );
+    
+    for( int i = 0; i < iDteInfo.Count(); i++ )
+        {
+        if( aDevId == iDteInfo[i].iDevId && aObjId == iDteInfo[i].iObjId )
+            {
+            OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_ADDDEVICE, "CModemAtSrv::AddDevice - dte already found" );
+            C_TRACE(( _T("CModemAtSrv::AddDevice() dte already found") ));
+            alreadyFound = ETrue;
+            break;
+            }
+        }
+    if( !alreadyFound )
+        {
+        OstTrace0( TRACE_NORMAL, DUP2_CMODEMATSRV_ADDDEVICE, "CModemAtSrv::AddDevice - adding dte" );
+        C_TRACE(( _T("CModemAtSrv::AddDevice() adding dte") ));
+        TDteInfo devInfo;
+        devInfo.iDevId = aDevId;
+        devInfo.iObjId = aObjId;
+        devInfo.iSession = NULL;
+        iDteInfo.Append( devInfo );
+        }
+    }
+
+
+void CModemAtSrv::RemoveDevice( TUint8 aDevId, TUint8 aObjId )
+    {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_REMOVEDEVICE, "CModemAtSrv::RemoveDevice" );
+    C_TRACE(( _T("CModemAtSrv::RemoveDevice()") ));
+
+    for( int i = 0; i < iDteInfo.Count(); i++ )
+        {
+        if( aDevId == iDteInfo[i].iDevId && aObjId == iDteInfo[i].iObjId )
+            {
+            OstTrace0( TRACE_NORMAL, DUP1_CMODEMATSRV_REMOVEDEVICE, "CModemAtSrv::RemoveDevice - CModemAtSrv::RemoveDevice() device found" );
+            C_TRACE(( _T("CModemAtSrv::RemoveDevice() device found") ));
+            iDteInfo.Remove( i );
+            break;
+            }
+        }
+    }
+
+TUint8 CModemAtSrv::GetDteCount()
+    {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_GETDTECOUNT, "CModemAtSrv::GetDteCount" );
+    C_TRACE(( _T("CModemAtSrv::GetDteCount()") ));
+    TUint8 count( 0 );
+    for( int i = 0; i < iSessions.Count(); i++ )
+        {
+        if( ECommonPlugin == iSessions[i]->GetPluginType() )
+            {
+            count++;
+            }
+        }
+    return count;
+    }
+
+// -----------------------------------------------------------------------------
+// CModemAtSrv::GetFreeChannelId
+// Gets free ISC channel id for new connection
+// -----------------------------------------------------------------------------
+//
+TInt CModemAtSrv::GetFreeChannelId( TUint8& aChannel )
+    {
+    OstTrace0( TRACE_NORMAL, CMODEMATSRV_GETFREECHANNELID, "CModemAtSrv::GetFreeChannelId" );
+    C_TRACE(( _T("CModemAtSrv::GetFreeChannelId()") ));
+    TInt ret( KErrNotFound );
+
+    if( 0 < iFreeChannels.Size() )
+        {
+        ret = KErrNone;
+        aChannel = iFreeChannels[0];
+        iFreeChannels.Delete( 0, 1 );
+        OstTrace1( TRACE_NORMAL, DUP1_CMODEMATSRV_GETFREECHANNELID, "CModemAtSrv::GetFreeChannelId  free channel found: 0x%x", aChannel );
+        C_TRACE(( _T("CModemAtSrv::GetFreeChannelId: free channel found: 0x%x"), aChannel ));
+        }
+    return ret;
+    }