adaptationlayer/modematadaptation/modematext_dll/src/modemat_atext.cpp
changeset 9 8486d82aef45
parent 8 6295dc2169f3
--- a/adaptationlayer/modematadaptation/modematext_dll/src/modemat_atext.cpp	Wed Apr 21 14:29:55 2010 +0300
+++ b/adaptationlayer/modematadaptation/modematext_dll/src/modemat_atext.cpp	Tue Oct 19 13:16:20 2010 +0300
@@ -19,6 +19,19 @@
 
 #include "modemat_atext.h"
 #include "modemattrace.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "modemat_atextTraces.h"
+#endif
+
+const TInt KReplyTypeEditorStart( 1 );
+const TInt KReplyTypeEditorEnd( 2 );
+const TInt KReplyTypeOther( 3 );
+const TInt KReplyTypeEditor( 4 );
+const TUint8 KEscChar( 0x1B ); // from ascii table
+const TUint8 KCtrlZChar( 0x1A ); // from ascii table
+const TUint8 KEscDataSize( 2 );
+const TUint8 KErrorSize( 9 );
 
 const char* const atCommands[] =
     {
@@ -103,10 +116,6 @@
     ("ATO0"),
     ("AT+DS"),
     ("AT+DR"),
-    ("ATB"),
-    ("ATB0"),
-    ("ATB1"),
-    ("ATB2"),
     ("AT+CSTA"),
     ("AT+CHUP"),
     ("AT+CR"),
@@ -151,14 +160,10 @@
     ("AT+CGDSCONT"),
     ("AT+CGTFT"),
     ("AT+CGCMOD"),
-    ("AT+CRSM"),
     ("AT+CSIM"),
     ("AT+CPNET"),
     ("AT+CPNSTAT"),
     ("AT+CGPADDR"),
-    ("AT+CPLS"),
-    ("AT+ES"),
-    ("AT+ESA"),
     ("AT"),
     ("LAST")
     };
@@ -175,6 +180,7 @@
 
 TPtrC8 CModemATExt::GetAtCommand( TInt aNumber )  //list of supported commands for this plugin
     {
+    OstTrace1( TRACE_NORMAL, CMODEMATEXT_GETATCOMMAND, "CModemATExt::GetAtCommand;aNumber=%d", aNumber );
     C_TRACE((_L("CModemATExt::GetAtCommand(%d)"), aNumber));
     const TUint8 **keys = (const TUint8**) atCommands;
     TPtrC8 keyword( aNumber < KMaxCommandCount ? keys[ aNumber ] : keys[ KMaxCommandCount - 1 ] );
@@ -183,6 +189,7 @@
 
 CModemATExt* CModemATExt::NewL()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_NEWL, "CModemATExt::NewL" );
     C_TRACE((_L("CModemATExt::NewL")));
     CModemATExt* self = new (ELeave) CModemATExt();
     CleanupStack::PushL(self);
@@ -193,6 +200,7 @@
 
 CModemATExt::~CModemATExt()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_CMODEMATEXT, "CModemATExt::~CModemATExt" );
     C_TRACE((_L("CModemATExt::~CModemATExt()")));
     if (iReplyBuffer) 
         {
@@ -215,25 +223,31 @@
 
 TBool CModemATExt::IsCommandSupported( const TDesC8& aCmd)
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported" );
     C_TRACE((_L("CModemATExt::IsCommandSupported")));
     DUMP_MESSAGE((aCmd));
 
     if(aCmd.Find( KATDCommand )!=KErrNotFound)  
         {
+        OstTrace0( TRACE_NORMAL, DUP1_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - ATD" );
         C_TRACE((_L("ATD")));
         return ETrue;
         }
     if(aCmd.Find(KATICommand)!=KErrNotFound) 
         {
+        OstTrace0( TRACE_NORMAL, DUP2_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - ATI" );
         C_TRACE((_L("ATI")));
         return ETrue;
         }
     for ( TInt i = 0; i < KMaxCommandCount; i++ ) 
         {
+        OstTrace1( TRACE_NORMAL, DUP3_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - round;i=%d", i );
         C_TRACE((_L("round %d"),i));
         if( GetAtCommand(i).Find(KLastCommand) != KErrNotFound) 
             {
             // All messages have been searched so the command is not supported
+            OstTrace0( TRACE_NORMAL, DUP4_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - ********* COMMAND IS NOT SUPPORTED ********* " );
+            OstTraceExt1( TRACE_NORMAL, DUP5_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported;aCmd=%s", aCmd );
             C_TRACE((_L("********* COMMAND IS NOT SUPPORTED ********* ")));
             DUMP_MESSAGE(aCmd);
             return EFalse;
@@ -242,62 +256,83 @@
         if(aCmd.Find(GetAtCommand(i))!=KErrNotFound)  
             {
             //just command
+            OstTrace1( TRACE_NORMAL, DUP6_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - Command;i=%d", i );
             C_TRACE((_L("Command"),i));
             if(aCmd.Length()==GetAtCommand(i).Length())
                 {
+                OstTrace1( TRACE_NORMAL, DUP7_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - Ok;i=%d", i );
                 C_TRACE((_L("Ok"),i));
                 return ETrue;
                 }
             
             if(aCmd.Length()>GetAtCommand(i).Length()) //setting command 
                 {
+                OstTrace0( TRACE_NORMAL, DUP8_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - Setting" );
                 C_TRACE((_L("Setting")));
                 if( aCmd[GetAtCommand(i).Length()] == '=' ||
                    aCmd[GetAtCommand(i).Length()] == '?' )
                    {
-                    C_TRACE((_L("Ok"),i));
+                   OstTrace1( TRACE_NORMAL, DUP9_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - Ok;i=%d", i );
+                   C_TRACE((_L("Ok"),i));
                    return ETrue;
                    }
                 }
             }
         }
+    OstTrace0( TRACE_NORMAL, DUP10_CMODEMATEXT_ISCOMMANDSUPPORTED, "CModemATExt::IsCommandSupported - return EFalse" );
     C_TRACE((_L("return EFalse")));
     return EFalse; 
     }
 
 void CModemATExt::HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded )
     {
-    C_TRACE((_L("CModemATExt::HandleCommand()" )));
+    OstTrace1( TRACE_NORMAL, CMODEMATEXT_HANDLECOMMAND, "CModemATExt::HandleCommand() - is reply needed;aReplyNeeded=%d", aReplyNeeded );
+    OstTraceExt1( TRACE_NORMAL, DUP1_CMODEMATEXT_HANDLECOMMAND, "CModemATExt::HandleCommand - dump;aCmd=%s", aCmd );
+    C_TRACE((_L("CModemATExt::HandleCommand() is reply needed: %d" ), aReplyNeeded));
     DUMP_MESSAGE(aCmd);
 
-    iReply = &aReply;
-    iReplyNeeded = aReplyNeeded;
-    if( iCommandBuf ) 
-         {
-         delete iCommandBuf;
-         iCommandBuf = NULL;
-         }
-    iCommandBuf = HBufC8::New( aCmd.Length() + 1 );
-    TPtr8 ptr = iCommandBuf->Des();
-    ptr.Append( aCmd );
-    ptr.Append( iCarriageReturn );
-    iRModemAt.HandleATCommand( ptr, iReplyPtr );
+    if( iIsTextInputMode )
+        {
+        OstTrace0( TRACE_NORMAL, DUP2_CMODEMATEXT_HANDLECOMMAND, "CModemATExt::HandleCommand - text mode on" );
+        C_TRACE((_L("CModemATExt::HandleCommand: text mode on") ));
+        AddDataToBuffer( aCmd, aReply );
+        }
+    else
+        {
+        OstTrace0( TRACE_NORMAL, DUP3_CMODEMATEXT_HANDLECOMMAND, "CModemATExt::HandleCommand - normal mode on" );
+        C_TRACE((_L("CModemATExt::HandleCommand: normal mode on") ));
+        iReply = &aReply;
+        iReplyNeeded = aReplyNeeded;
+        if( iCommandBuf ) 
+             {
+             delete iCommandBuf;
+             iCommandBuf = NULL;
+             }
+        iCommandBuf = HBufC8::New( aCmd.Length() + 1 );
+        TPtr8 ptr = iCommandBuf->Des();
+        ptr.Append( aCmd );
+        ptr.Append( iCarriageReturn );
+        iRModemAt.HandleATCommand( ptr, iReplyPtr );
+        }
     }
 
 void CModemATExt::HandleCommandCancel()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_HANDLECOMMANDCANCEL, "CModemATExt::HandleCommandCancel" );
     C_TRACE((_L("CModemATExt::HandleCommandCancel()")));
     iRModemAt.HandleATCommandCancel();
     }
 
 TInt CModemATExt::NextReplyPartLength()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_NEXTREPLYPARTLENGTH, "CModemATExt::NextReplyPartLength" );
     C_TRACE((_L("CModemATExt::NextReplyPartLength()")));
     return Min( iReplyPtr.Length(), KPartLength);
     }
 
 TInt CModemATExt::GetNextPartOfReply( RBuf8& aNextReply )
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_GETNEXTPARTOFREPLY, "CModemATExt::GetNextPartOfReply" );
     C_TRACE((_L("CModemATExt::GetNextPartOfReply()")));
     aNextReply.Create(iReplyPtr,KPartLength);
     iReplyPtr.Delete(0,KPartLength);
@@ -306,12 +341,14 @@
 
 void CModemATExt::ReceiveUnsolicitedResult()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_RECEIVEUNSOLICITEDRESULT, "CModemATExt::ReceiveUnsolicitedResult" );
     C_TRACE((_L("CModemATExt::ReceiveUnsolicitedResult()")));
-    iRModemAt.ReceiveUnsolicitedResult(iUnsolicitedPtr);
+    iRModemAt.ReceiveUnsolicitedResult( iUnsolicitedPtr );
     }
 
 void CModemATExt::ReceiveUnsolicitedResultCancel()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_RECEIVEUNSOLICITEDRESULTCANCEL, "CModemATExt::ReceiveUnsolicitedResultCancel" );
     C_TRACE((_L("CModemATExt::ReceiveUnsolicitedResultCancel")));
     iRModemAt.ReceiveUnsolicitedResultCancel();
     }
@@ -320,12 +357,14 @@
                                                 RBuf8& /*aReply*/,
                                                 TBool& /*aEchoOn*/)
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_HANDLEEDITORMODEINPUT, "CModemATExt::HandleEditorModeInput" );
     C_TRACE((_L("CModemATExt::HandleEditorModeInput()")));
     return EFalse;  //commands are execute commands, this function is newer called
     }
 
 void CModemATExt::ReportNvramStatusChange( const TDesC8& /*aNvram*/ ) 
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_REPORTNVRAMSTATUSCHANGE, "CModemATExt::ReportNvramStatusChange" );
     C_TRACE((_L("CModemATExt::ReportNvramStatusChange()")));
     //Ignored in this plugin
     }
@@ -337,21 +376,27 @@
     iUnsolicitedPtr(0, 0), 
     iUnsolicitedBuffer(NULL),
     iReply(NULL),
-    iReplyNeeded(EFalse)
+    iReplyNeeded(EFalse),
+    iIsTextInputMode( EFalse ),
+    iDiscardNextReply( EFalse )
     {
+    OstTrace0( TRACE_NORMAL, DUP1_CMODEMATEXT_CMODEMATEXT, "CModemATExt::CModemATExt" );
     C_TRACE((_L("CModemATExt::CModemATExt()")));
     }
      
 void CModemATExt::ConstructL()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_CONSTRUCTL, "CModemATExt::ConstructL" );
     C_TRACE((_L("CModemATExt::ConstructL()")));
     iReplyBuffer = HBufC8::NewL( KDefaultCmdBufLength * KPackets ); 
     iReplyPtr.Set( iReplyBuffer->Des() );
-    iUnsolicitedBuffer = HBufC8::NewL(KDefaultCmdBufLength);
+    iUnsolicitedBuffer = HBufC8::NewL( KDefaultCmdBufLength );
+    iUnsolicitedPtr.Set( iUnsolicitedBuffer->Des() );
     }
 
 void CModemATExt::ReportConnectionName( const TDesC8& aName ) 
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_REPORTCONNECTIONNAME, "CModemATExt::ReportConnectionName" );
     C_TRACE((_L("CModemATExt::ReportConnectionName()")));
     DUMP_MESSAGE((aName));
     iName.Copy(aName);
@@ -360,43 +405,110 @@
 
 void CModemATExt::HandleATCommandCompleted( TInt aErr ) 
     {
-    C_TRACE((_L("CModemATExt::HandleATCommandCompleted()")));
-    
-    if(iReplyNeeded) 
+    OstTrace1( TRACE_NORMAL, CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted;aErr=%d", aErr );
+    C_TRACE((_L("CModemATExt::HandleATCommandCompleted( %d )"), aErr));	
+
+    if( !iDiscardNextReply )
         {
-        C_TRACE((_L("Reply needed")));
-        iReply->Create( iReplyPtr,KPartLength );
+        if(iReplyNeeded) 
+            {
+            OstTrace0( TRACE_NORMAL, DUP1_CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted - Reply needed" );
+            C_TRACE((_L("Reply needed")));
+            iReply->Create( iReplyPtr,KPartLength );
+            }
+        iReplyPtr.Delete(0, KPartLength);
+
+        if( aErr == KErrNone) 
+            {
+            OstTrace0( TRACE_NORMAL, DUP2_CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted - No errors" );
+            C_TRACE((_L("No errors")));
+            if( iIsTextInputMode )
+                {
+                iIsTextInputMode = EFalse;
+                }
+            HandleCommandCompleted( aErr, EReplyTypeOk);
+            }
+	    else if( aErr == KErrGeneral )
+            {
+            OstTrace0( TRACE_NORMAL, DUP3_CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted - Not supported (EReplyTypeUndefined)" );
+            C_TRACE((_L("Not supported (EReplyTypeUndefined)")));
+			if( iIsTextInputMode )
+                {
+                iIsTextInputMode = EFalse;
+                }
+            HandleCommandCompleted( aErr, EReplyTypeUndefined );
+            }
+        else if( aErr == KReplyTypeOther )
+            {
+            OstTrace0( TRACE_NORMAL, DUP4_CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted - No errors (EReplyTypeOther)" );
+            C_TRACE((_L("No errors (EReplyTypeOther)")));
+            if( iIsTextInputMode )
+                {
+                iIsTextInputMode = EFalse;
+                }
+            HandleCommandCompleted( KErrNone, EReplyTypeOther);
+            }
+        else if( aErr == KReplyTypeEditorStart ) 
+            {
+            OstTrace0( TRACE_NORMAL, DUP5_CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted - EReplyTypeEditorStart" );
+            C_TRACE((_L("EReplyTypeEditorStart")));
+            if( !iIsTextInputMode )
+                {
+                iIsTextInputMode = ETrue;
+                HandleCommandCompleted( KErrNone, static_cast<TATExtensionReplyType>( KReplyTypeEditor ) );
+                }
+            }
+        else if( aErr == KReplyTypeEditorEnd ) 
+            {
+            OstTrace0( TRACE_NORMAL, DUP6_CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted - EReplyTypeEditorEnd" );
+            C_TRACE((_L("EReplyTypeEditorEnd")));
+            iIsTextInputMode = EFalse;
+            HandleCommandCompleted( KErrNone, EReplyTypeOk);
+            }
+        else 
+            {
+            OstTrace0( TRACE_NORMAL, DUP7_CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted - Reply Error" );
+            C_TRACE((_L("Reply Error")));
+            if( iIsTextInputMode )
+                {
+                iIsTextInputMode = EFalse;
+                }
+            HandleCommandCompleted( aErr, EReplyTypeError );
+            }
         }
-    
-    iReplyPtr.Delete(0, KPartLength);
-    C_TRACE((_L("Error status %d"),aErr));
-    
-    if( aErr == KErrNone) 
+    else
         {
-        C_TRACE((_L("No errors")));
-        HandleCommandCompleted(aErr, EReplyTypeOk);
-        } 
-    else 
-        {
-        C_TRACE((_L("Reply Error")));
-        HandleCommandCompleted(aErr, EReplyTypeError);
+        OstTrace0( TRACE_NORMAL, DUP8_CMODEMATEXT_HANDLEATCOMMANDCOMPLETED, "CModemATExt::HandleATCommandCompleted -  reply discarded" );
+        C_TRACE((_L("CModemATExt::HandleATCommandCompleted: reply discarded")));
+        iDiscardNextReply = EFalse;
         }
     }
 
-void CModemATExt::HandleUnsolicitedResultReceived( TInt /*aErr*/ )
+void CModemATExt::HandleUnsolicitedResultReceived( TInt aErr )
     {
-    C_TRACE((_L("CModemATExt::HandleUnsolicitedResultReceived")));
-    SendUnsolicitedResult( iUnsolicitedPtr );
+    OstTrace1( TRACE_NORMAL, CMODEMATEXT_HANDLEUNSOLICITEDRESULTRECEIVED, "CModemATExt::HandleUnsolicitedResultReceived;aErr=%d", aErr );
+    C_TRACE((_L("CModemATExt::HandleUnsolicitedResultReceived > ( %d )"), aErr));
+    if( KErrNone == aErr )
+        {
+        SendUnsolicitedResult( iUnsolicitedPtr );
+        TInt length = iUnsolicitedPtr.Length();
+        OstTrace1( TRACE_NORMAL, DUP1_CMODEMATEXT_HANDLEUNSOLICITEDRESULTRECEIVED, "CModemATExt::HandleUnsolicitedResultReceived -  reply discarded;length=%d", length );
+        C_TRACE((_L("clear unsolicited data buffer, length %d"), length));
+        iUnsolicitedPtr.Delete( 0, length );
+        }
+    C_TRACE((_L("CModemATExt::HandleUnsolicitedResultReceived <")));
     }
 
 void CModemATExt::HandleSignalIndication( TInt /*aErr*/ )
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_HANDLESIGNALINDICATION, "CModemATExt::HandleSignalIndication" );
     C_TRACE((_L("CModemATExt::HandleSignalIndication")));
     //COMMON plugin handles signal indications
     }
 
 void CModemATExt::ReportExternalHandleCommandError()
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_REPORTEXTERNALHANDLECOMMANDERROR, "CModemATExt::ReportExternalHandleCommandError" );
     C_TRACE((_L("CModemATExt::ReportExternalHandleCommandError()")));
     //external error occurred, cancel AT-command
     iRModemAt.HandleATCommandCancel();
@@ -404,7 +516,142 @@
 
 void CModemATExt::HandleCommandModeChanged( TInt /*aErr*/, TCommandMode /*aMode*/ )
     {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_HANDLECOMMANDMODECHANGED, "CModemATExt::HandleCommandModeChanged" );
     C_TRACE((_L("CModemATExt::HandleCommandModeChanged()")));
     //COMMON plugin handles mode change requests
     }
-//  End of File  
+
+void CModemATExt::AddDataToBuffer( 
+    const TDesC8& aCmd, 
+    RBuf8& aReply )
+    {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer" );
+    C_TRACE((_L("CModemATExt::AddDataToBuffer()")));
+
+    TBool bufferingCanEnd( EFalse );
+    TBool bufferExceeded( EFalse );
+
+    TInt offsetEscChar = aCmd.Locate( KEscChar );
+    TInt offsetCtrlZChar = aCmd.Locate( KCtrlZChar );
+	OstTrace1( TRACE_NORMAL, DUP1_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer: offsetEscChar: %d", offsetEscChar );
+	OstTrace1( TRACE_NORMAL, DUP2_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer: offsetCtrlZChar: %d", offsetCtrlZChar );
+    C_TRACE(( _L("CModemATExt::AddDataToBuffer: offsets: esc: %d, ctrl-z: %d"), offsetEscChar, offsetCtrlZChar ));
+
+    if( KErrNotFound != offsetEscChar || 
+        KErrNotFound != offsetCtrlZChar )
+        {
+        OstTrace0( TRACE_NORMAL, DUP3_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer - end char detected" );
+        C_TRACE((_L("CModemATExt::AddDataToBuffer: end char detected") ));
+        bufferingCanEnd = ETrue;
+        }
+
+    if( KMaxSmsBufferSize < ( aCmd.Length() +  iSmsBuffer.Length() ) )
+        {
+        if( bufferingCanEnd )
+            {
+            TInt offset = 0;
+            if( KErrNotFound != offsetEscChar )
+                {
+                OstTrace0( TRACE_NORMAL, DUP4_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer: (truncated, esc)" );
+                C_TRACE((_L("CModemATExt::AddDataToBuffer: buffering data (truncated) (esc char detected)") ));
+                offset = offsetEscChar + 1;
+                }
+            else
+                {
+				OstTrace0( TRACE_NORMAL, DUP5_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer: (truncated, ctrl-z)" );
+                C_TRACE((_L("CModemATExt::AddDataToBuffer: buffering data (truncated) (ctrl-z detected)") ));
+                offset = offsetCtrlZChar + 1;
+                }
+            TInt smsBufferSize = iSmsBuffer.Length() + aCmd.Mid( 0, offset ).Length();
+            OstTrace1( TRACE_NORMAL, DUP6_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer: current + received: %d", smsBufferSize );
+			C_TRACE((_L("CModemATExt::AddDataToBuffer: current + received buffer length: %d"), smsBufferSize ));
+            if( KMaxSmsBufferSize >= smsBufferSize )
+                {
+                iSmsBuffer.Append( aCmd.Mid( 0, offset ) );
+                C_TRACE((_L("CModemATExt::AddDataToBuffer: sending data (end char detected)") ));
+                SendSmsBuffer( aReply, ETrue, EFalse );
+                }
+            else
+                {
+                bufferExceeded = ETrue;
+                }
+            }
+
+        if( !bufferingCanEnd ||
+            bufferExceeded )
+            {
+			OstTrace0( TRACE_NORMAL, DUP7_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer - too big data or esc" );
+            C_TRACE((_L("CModemATExt::AddDataToBuffer: data is too big to buffer or esc char detected") ));
+
+            iDiscardNextReply = ETrue;
+            iIsTextInputMode = EFalse;
+
+            SendSmsBuffer( aReply, EFalse, ETrue );
+
+            TBuf8<KErrorSize> reply;
+            reply.Append( iCarriageReturn );
+            reply.Append( iLineFeed );
+            reply.Append( _L( "ERROR" ) );
+            reply.Append( iCarriageReturn );
+            reply.Append( iLineFeed );
+
+            aReply.Create( reply, reply.Length() );
+            HandleCommandCompleted( KErrNone, EReplyTypeOk );
+            }
+        }
+    else
+        {
+        OstTrace0( TRACE_NORMAL, DUP8_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer - buffering data" );
+        C_TRACE((_L("CModemATExt::AddDataToBuffer: buffering data") ));
+        iSmsBuffer.Append( aCmd );
+        if( bufferingCanEnd )
+            {
+            OstTrace0( TRACE_NORMAL, DUP9_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer - sending data in text mode" );
+            C_TRACE((_L("CModemATExt::AddDataToBuffer: sending data in text mode") ));
+            SendSmsBuffer( aReply, ETrue, EFalse );
+            }
+        else
+            {
+            OstTrace0( TRACE_NORMAL, DUP10_CMODEMATEXT_ADDDATATOBUFFER, "CModemATExt::AddDataToBuffer - data is not sent yet, completing request" );
+            C_TRACE((_L("CModemATExt::AddDataToBuffer: data is not sent yet, let's complete request") ));
+            HandleCommandCompleted( KErrNone, static_cast<TATExtensionReplyType>( KReplyTypeEditor ) );
+            }
+        }
+    }
+
+void CModemATExt::SendSmsBuffer(
+    RBuf8& aReply,
+    TBool aReplyNeeded,
+    TBool aCancel )
+    {
+    OstTrace0( TRACE_NORMAL, CMODEMATEXT_SENDSMSBUFFER, "CModemATExt::SendSmsBuffer()" );
+	C_TRACE((_L("CModemATExt::SendSmsBuffer() replyNeeded: %d, cancel: %d"), (TInt) aReplyNeeded, (TInt) aCancel ));
+    iReply = &aReply;
+    iReplyNeeded = aReplyNeeded;
+    if( iCommandBuf ) 
+        {
+        delete iCommandBuf;
+        iCommandBuf = NULL;
+        }
+    if( !aCancel )
+        {
+        iCommandBuf = HBufC8::New( iSmsBuffer.Length() + 1 );
+        TPtr8 ptr = iCommandBuf->Des();
+        ptr.Append( iSmsBuffer );
+        ptr.Append( iCarriageReturn );
+        iRModemAt.HandleATCommand( ptr, iReplyPtr );
+        }
+    else
+        {
+        iCommandBuf = HBufC8::New( KEscDataSize );
+        TPtr8 ptr = iCommandBuf->Des();
+        ptr.Append( KEscChar );
+        ptr.Append( iCarriageReturn );
+        iRModemAt.HandleATCommand( ptr, iReplyPtr );
+        }
+    iSmsBuffer.Zero();
+	OstTrace0( TRACE_NORMAL, DUP1_CMODEMATEXT_SENDSMSBUFFER, "CModemATExt::SendSmsBuffer() done" );
+    }
+
+//  End of File
+