Revision: 201031 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:46:39 +0300
branchRCL_3
changeset 38 3dcb815346df
parent 37 7e0ecb5b116a
child 39 4096754ee773
Revision: 201031 Kit: 201033
localconnectivityservice/dun/atext/bwins/dunatextu.def
localconnectivityservice/dun/atext/eabi/dunatextu.def
localconnectivityservice/dun/atext/inc/DunAtCmdEchoer.h
localconnectivityservice/dun/atext/inc/DunAtCmdHandler.h
localconnectivityservice/dun/atext/inc/DunAtCmdPusher.h
localconnectivityservice/dun/atext/inc/DunAtEcomListen.h
localconnectivityservice/dun/atext/inc/DunAtModeListen.h
localconnectivityservice/dun/atext/inc/DunAtNvramListen.h
localconnectivityservice/dun/atext/inc/DunAtSpecialCmdHandler.h
localconnectivityservice/dun/atext/inc/DunAtUrcHandler.h
localconnectivityservice/dun/atext/src/DunAtCmdHandler.cpp
localconnectivityservice/dun/atext/src/DunAtCmdPusher.cpp
localconnectivityservice/dun/plugins/src/bt/DunBtListen.cpp
localconnectivityservice/dun/utils/inc/DunDataPusher.h
localconnectivityservice/dun/utils/inc/DunDownstream.h
localconnectivityservice/dun/utils/inc/DunUpstream.h
localconnectivityservice/dun/utils/src/DunDataPusher.cpp
localconnectivityservice/dun/utils/src/DunDownstream.cpp
localconnectivityservice/dun/utils/src/DunNoteHandler.cpp
localconnectivityservice/dun/utils/src/DunUpstream.cpp
localconnectivityservice/obexreceiveservices/bip/src/BIPController.cpp
localconnectivityservice/obexreceiveservices/opp/src/oppcontroller.cpp
localconnectivityservice/obexsendservices/obexservicesendutils/src/BTServiceClient.cpp
localconnectivityservice/obexserviceman/utils/inc/obexutilsentryhandler.h
localconnectivityservice/obexserviceman/utils/src/obexutilsentryhandler.cpp
localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp
localconnectivityservice/obexserviceman/utils/src/obexutilsmessagehandler.cpp
--- a/localconnectivityservice/dun/atext/bwins/dunatextu.def	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/bwins/dunatextu.def	Thu Aug 19 10:46:39 2010 +0300
@@ -1,12 +1,11 @@
 EXPORTS
-	?StopUrc@CDunAtCmdHandler@@QAEHXZ @ 1 NONAME ; int CDunAtCmdHandler::StopUrc(void)
-	?Stop@CDunAtCmdHandler@@QAEHXZ @ 2 NONAME ; int CDunAtCmdHandler::Stop(void)
-	?SetEndOfCmdLine@CDunAtCmdHandler@@QAEXH@Z @ 3 NONAME ; void CDunAtCmdHandler::SetEndOfCmdLine(int)
-	?ResetData@CDunAtCmdHandler@@QAEXXZ @ 4 NONAME ; void CDunAtCmdHandler::ResetData(void)
-	?AddCmdModeCallback@CDunAtCmdHandler@@QAEHPAVMDunCmdModeMonitor@@@Z @ 5 NONAME ; int CDunAtCmdHandler::AddCmdModeCallback(class MDunCmdModeMonitor *)
-	?NewL@CDunAtCmdHandler@@SAPAV1@PAVMDunAtCmdStatusReporter@@PAVMDunStreamManipulator@@PBVTDesC8@@@Z @ 6 NONAME ; class CDunAtCmdHandler * CDunAtCmdHandler::NewL(class MDunAtCmdStatusReporter *, class MDunStreamManipulator *, class TDesC8 const *)
-	?ParseCommand@CDunAtCmdHandler@@QAEHAAVTDesC8@@AAH@Z @ 7 NONAME ; int CDunAtCmdHandler::ParseCommand(class TDesC8 &, int &)
-	?StartUrc@CDunAtCmdHandler@@QAEHXZ @ 8 NONAME ; int CDunAtCmdHandler::StartUrc(void)
-	?ManageAbortRequest@CDunAtCmdHandler@@QAEHXZ @ 9 NONAME ; int CDunAtCmdHandler::ManageAbortRequest(void)
-	?SendEchoCharacter@CDunAtCmdHandler@@QAEHPBVTDesC8@@PAVMDunAtCmdEchoer@@@Z @ 10 NONAME ; int CDunAtCmdHandler::SendEchoCharacter(class TDesC8 const *, class MDunAtCmdEchoer *)
+	?AddCmdModeCallback@CDunAtCmdHandler@@QAEHPAVMDunCmdModeMonitor@@@Z @ 1 NONAME ; int CDunAtCmdHandler::AddCmdModeCallback(class MDunCmdModeMonitor *)
+	?AddDataForParsing@CDunAtCmdHandler@@QAEHAAVTDesC8@@AAH@Z @ 2 NONAME ; int CDunAtCmdHandler::AddDataForParsing(class TDesC8 &, int &)
+	?ManageAbortRequest@CDunAtCmdHandler@@QAEHXZ @ 3 NONAME ; int CDunAtCmdHandler::ManageAbortRequest(void)
+	?NewL@CDunAtCmdHandler@@SAPAV1@PAVMDunAtCmdStatusReporter@@PAVMDunStreamManipulator@@PBVTDesC8@@@Z @ 4 NONAME ; class CDunAtCmdHandler * CDunAtCmdHandler::NewL(class MDunAtCmdStatusReporter *, class MDunStreamManipulator *, class TDesC8 const *)
+	?ResetData@CDunAtCmdHandler@@QAEXXZ @ 5 NONAME ; void CDunAtCmdHandler::ResetData(void)
+	?SendEchoCharacter@CDunAtCmdHandler@@QAEHPBVTDesC8@@PAVMDunAtCmdEchoer@@@Z @ 6 NONAME ; int CDunAtCmdHandler::SendEchoCharacter(class TDesC8 const *, class MDunAtCmdEchoer *)
+	?StartUrc@CDunAtCmdHandler@@QAEHXZ @ 7 NONAME ; int CDunAtCmdHandler::StartUrc(void)
+	?Stop@CDunAtCmdHandler@@QAEHXZ @ 8 NONAME ; int CDunAtCmdHandler::Stop(void)
+	?StopUrc@CDunAtCmdHandler@@QAEHXZ @ 9 NONAME ; int CDunAtCmdHandler::StopUrc(void)
 
--- a/localconnectivityservice/dun/atext/eabi/dunatextu.def	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/eabi/dunatextu.def	Thu Aug 19 10:46:39 2010 +0300
@@ -1,12 +1,11 @@
 EXPORTS
-	_ZN16CDunAtCmdHandler12ParseCommandER6TDesC8Ri @ 1 NONAME
-	_ZN16CDunAtCmdHandler15SetEndOfCmdLineEi @ 2 NONAME
+	_ZN16CDunAtCmdHandler17AddDataForParsingER6TDesC8Ri @ 1 NONAME
+	_ZN16CDunAtCmdHandler17SendEchoCharacterEPK6TDesC8P15MDunAtCmdEchoer @ 2 NONAME
 	_ZN16CDunAtCmdHandler18AddCmdModeCallbackEP18MDunCmdModeMonitor @ 3 NONAME
-	_ZN16CDunAtCmdHandler4NewLEP23MDunAtCmdStatusReporterP21MDunStreamManipulatorPK6TDesC8 @ 4 NONAME
-	_ZN16CDunAtCmdHandler4StopEv @ 5 NONAME
-	_ZN16CDunAtCmdHandler7StopUrcEv @ 6 NONAME
-	_ZN16CDunAtCmdHandler8StartUrcEv @ 7 NONAME
-	_ZN16CDunAtCmdHandler9ResetDataEv @ 8 NONAME
-	_ZN16CDunAtCmdHandler18ManageAbortRequestEv @ 9 NONAME
-	_ZN16CDunAtCmdHandler17SendEchoCharacterEPK6TDesC8P15MDunAtCmdEchoer @ 10 NONAME
+	_ZN16CDunAtCmdHandler18ManageAbortRequestEv @ 4 NONAME
+	_ZN16CDunAtCmdHandler4NewLEP23MDunAtCmdStatusReporterP21MDunStreamManipulatorPK6TDesC8 @ 5 NONAME
+	_ZN16CDunAtCmdHandler4StopEv @ 6 NONAME
+	_ZN16CDunAtCmdHandler7StopUrcEv @ 7 NONAME
+	_ZN16CDunAtCmdHandler8StartUrcEv @ 8 NONAME
+	_ZN16CDunAtCmdHandler9ResetDataEv @ 9 NONAME
 
--- a/localconnectivityservice/dun/atext/inc/DunAtCmdEchoer.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/inc/DunAtCmdEchoer.h	Thu Aug 19 10:46:39 2010 +0300
@@ -105,7 +105,7 @@
      * From MDunCompletionReporter.
      * Gets called when data push is complete
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aAllPushed ETrue if all in the queue were pushed, EFalse otherwise
      * @return None
      */
--- a/localconnectivityservice/dun/atext/inc/DunAtCmdHandler.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/inc/DunAtCmdHandler.h	Thu Aug 19 10:46:39 2010 +0300
@@ -32,7 +32,7 @@
 const TInt KDunChSetMaxCharLen = 1;          // Only ASCII supported for now
 const TInt KDunOkBufLength     = 1+1+2+1+1;  // <CR>+<LF>+"OK"+<CR>+<LF>
 const TInt KDunErrorBufLength  = 1+1+5+1+1;  // <CR>+<LF>+"ERROR"+<CR>+<LF>
-const TInt KDunInputBufLength  = (512 + 1);  // 512 chars for command + <CR>
+const TInt KDunLineBufLength   = (512 + 1);  // 512 chars for command + <CR>
 const TInt KDunEscBufLength    = 1;          // Escape (0x1B) character
 
 class CDunAtUrcHandler;
@@ -43,7 +43,7 @@
  *  Class used for storing information related to string conversion and parsing
  *
  *  @lib dunatext.lib
- *  @since S60 v3.2
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( TDunParseInfo )
     {
@@ -51,9 +51,10 @@
 public:
 
     /**
-     * Buffer for sending
+     * Buffer for sending to ATEXT (one command)
+     * (length is part of KDunLineBufLength)
      */
-    TBuf8<KDunInputBufLength> iSendBuffer;
+    TBuf8<KDunLineBufLength> iSendBuffer;
 
     /**
      * Conversion limit for upper case conversion.
@@ -68,7 +69,7 @@
  *  Class used for AT command decoding related functionality
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( TDunDecodeInfo )
     {
@@ -81,12 +82,12 @@
     TBool iFirstDecode;
 
     /**
-     * Index in iInputBuffer for decoding to iDecodeBuffer
+     * Index in iLineBuffer for decoding to iSendBuffer
      */
     TInt iDecodeIndex;
 
     /**
-     * Index in iInputBuffer for extended character position 
+     * Index in iLineBuffer for extended character position
      */
     TInt iExtendedIndex;
 
@@ -106,7 +107,7 @@
     TBool iAssignFound;
 
     /**
-     * Flag to indicate if processing inside quotes 
+     * Flag to indicate if processing inside quotes
      */
     TBool iInQuotes;
 
@@ -114,11 +115,11 @@
      * Flag to indicate if special subcommand found
      */
     TBool iSpecialFound;
-    
+
     /**
-     * Buffer for parsing
+     * Number of commands handled (for debugging purposes)
      */
-    TBuf8<KDunInputBufLength> iDecodeBuffer;
+    TBool iCmdsHandled;
 
     };
 
@@ -140,7 +141,7 @@
 
     /**
      * AT command decoding related information for peeked data
-     * (not to be used if HandleNextDecodedCommand() returns EFalse)
+     * (not to be used if HandleNextSubCommand() returns EFalse)
      */
     TDunDecodeInfo iPeekInfo;
 
@@ -150,7 +151,7 @@
  *  Notification interface class for command mode start/end
  *
  *  @lib dunutils.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( MDunCmdModeMonitor )
     {
@@ -160,7 +161,7 @@
     /**
      * Notifies about command mode start
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     virtual void NotifyCommandModeStart() = 0;
@@ -168,7 +169,7 @@
     /**
      * Notifies about command mode end
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     virtual void NotifyCommandModeEnd() = 0;
@@ -179,7 +180,7 @@
  *  Notification interface class for status changes in AT command handling
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( MDunAtCmdStatusReporter )
     {
@@ -187,21 +188,12 @@
 public:
 
     /**
-     * Notifies about AT command handling start
+     * Notifies about parser's need to get more data
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
-    virtual void NotifyAtCmdHandlingStart() = 0;
-
-    /**
-     * Notifies about AT command handling end
-     *
-     * @since S60 5.0
-     * @param aEndIndex Index to the start of next command
-     * @return None
-     */
-    virtual void NotifyAtCmdHandlingEnd( TInt aStartIndex ) = 0;
+    virtual void NotifyParserNeedsMoreData() = 0;
 
     /**
      * Notifies about editor mode reply
@@ -218,7 +210,7 @@
  *  Class for AT command handler and notifier
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( CDunAtCmdHandler ) : public CBase,
                                         public MDunAtCmdPusher,
@@ -248,7 +240,7 @@
     /**
      * Resets data to initial values
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     IMPORT_C void ResetData();
@@ -257,41 +249,31 @@
      * Adds callback for command mode notification
      * The callback will be called when command mode starts or ends
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aCallback Callback to call when command mode starts or ends
      * @return Symbian error code on error, KErrNone otherwise
      */
     IMPORT_C TInt AddCmdModeCallback( MDunCmdModeMonitor* aCallback );
 
     /**
-     * Parses an AT command
+     * Adds data for parsing and parses if necessary
      *
-     * @since S60 5.0
-     * @param aCommand Command to parse
-     * @param aPartialInput ETrue if partial input, EFalse otherwise
+     * @since TB9.2
+     * @param aInput Data to add for parsing
+     * @param aMoreNeeded ETrue if more data needed, EFalse otherwise
      * @return Symbian error code on error, KErrNone otherwise
      */
-    IMPORT_C TInt ParseCommand( TDesC8& aCommand, TBool& aPartialInput );
+    IMPORT_C TInt AddDataForParsing( TDesC8& aInput, TBool& aMoreNeeded );
 
     /**
      * Manages request to abort command handling
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     IMPORT_C TInt ManageAbortRequest();
 
     /**
-     * Sets end of command line marker on for the possible series of AT
-     * commands.
-     *
-     * @since S60 5.0
-     * @param aClearInput ETrue to clear input buffer, EFalse otherwise
-     * @return None
-     */
-    IMPORT_C void SetEndOfCmdLine( TBool aClearInput );
-
-    /**
      * Sends a character to be echoed
      *
      * @since TB9.2
@@ -305,7 +287,7 @@
     /**
      * Stops sending of AT command from decode buffer
      *
-     * @since S60 3.2
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     IMPORT_C TInt Stop();
@@ -313,7 +295,7 @@
     /**
      * Starts URC message handling
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     IMPORT_C TInt StartUrc();
@@ -321,7 +303,7 @@
     /**
      * Stops URC message handling
      *
-     * @since S60 3.2
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     IMPORT_C TInt StopUrc();
@@ -337,7 +319,7 @@
     /**
      * Initializes this class
      *
-     * @since S60 3.2
+     * @since TB9.2
      * @return None
      */
     void Initialize();
@@ -345,7 +327,7 @@
     /**
      * Creates plugin handlers for this class
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void CreatePluginHandlersL();
@@ -353,7 +335,7 @@
     /**
      * Creates the array of special commands
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void CreateSpecialCommandsL();
@@ -362,7 +344,7 @@
      * Recreates special command data.
      * This is done when a plugin is installed or uninstalled.
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt RecreateSpecialCommands();
@@ -370,7 +352,7 @@
     /**
      * Gets default settings from RATExtCommon and sets them to RATExt
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void GetAndSetDefaultSettingsL();
@@ -378,7 +360,7 @@
     /**
      * Regenerates the reply strings based on settings
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return ETrue if quiet mode, EFalse otherwise
      */
     TBool RegenerateReplyStrings();
@@ -386,7 +368,7 @@
     /**
      * Regenerates the ok reply based on settings
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return ETrue if quiet mode, EFalse otherwise
      */
     TBool RegenerateOkReply();
@@ -394,7 +376,7 @@
     /**
      * Regenerates the error reply based on settings
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return ETrue if quiet mode, EFalse otherwise
      */
     TBool RegenerateErrorReply();
@@ -402,7 +384,7 @@
     /**
      * Gets current mode
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aMask Mask for current mode (only one supported)
      * @return New current mode
      */
@@ -412,7 +394,7 @@
      * Instantiates one URC message handling class instance and adds it to
      * the URC message handler array
      *
-     * @since S60 3.2
+     * @since TB9.2
      * @return None
      */
     CDunAtUrcHandler* AddOneUrcHandlerL();
@@ -420,7 +402,7 @@
     /**
      * Deletes all instantiated URC message handlers
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void DeletePluginHandlers();
@@ -428,86 +410,131 @@
     /**
      * Manages partial AT command
      *
-     * @since S60 5.0
-     * @param aCommand Command to process
-     * @param aNeedsCarriage ETrue if full and non-consumed AT command needs
-     *                       carriage return (AT command "A/")
-     * @return ETrue if no other processing needed, EFalse otherwise
+     * @since TB9.2
+     * @return ETrue if more data needed, EFalse otherwise
      */
-    TBool ManagePartialCommand( TDesC8& aCommand,
-                                TBool& aNeedsCarriage );
+    TBool ManagePartialCommand();
 
     /**
      * Echoes a command if echo is on
      *
-     * @since S60 5.0
-     * @param aDes String descriptor
+     * @since TB9.2
      * @return ETrue if echo push started, EFalse otherwise
      */
-    TBool EchoCommand( TDesC8& aDes );
+    TBool EchoCommand();
 
     /**
      * Handles backspace and cancel characters
      *
-     * @since S60 5.0
-     * @param aCommand Command to process
+     * @since TB9.2
      * @return ETrue if special character found, EFalse otherwise
      */
-    TBool HandleSpecialCharacters( TDesC8& aCommand );
+    TBool HandleSpecialCharacters();
+
+    /**
+     * Extracts line from input buffer to line buffer
+     *
+     * @since TB9.2
+     * @return ETrue if more data needed, EFalse otherwise
+     */
+    TBool ExtractLineFromInputBuffer();
+
+    /**
+     * Handles generic buffer management
+     * (explanation in ExtractLineFromInputBuffer())
+     *
+     * @since TB9.2
+     * @param aStartIndex Start index for buffer to be copied
+     * @param aCopyLength Length for data needed to be copied
+     * @param aCopyNeeded ETrue if buffer copy needed
+     * @return ETrue if more data needed, EFalse otherwise
+     */
+    TBool HandleGenericBufferManagement( TInt& aStartIndex,
+                                         TInt& aCopyLength,
+                                         TBool& aCopyNeeded );
+
+    /**
+     * Handles special buffer management
+     * (explanation in ExtractLineFromInputBuffer())
+     *
+     * @since TB9.2
+     * @param aStartIndex Start index for buffer to be copied
+     * @param aCopyLength Length for data needed to be copied
+     * @param aCopyNeeded ETrue if buffer copy needed
+     * @return ETrue if more data needed, EFalse otherwise
+     */
+    TBool HandleSpecialBufferManagement( TInt aStartIndex,
+                                         TInt& aCopyLength,
+                                         TBool& aCopyNeeded );
 
     /**
-     * Appends command to input buffer
+     * Skips end-of-line characters
+     *
+     * @since TB9.2
+     * @param aStartIndex Start index
+     * @return Index to end of non-end-of-line or Symbian error code on error
+     */
+    TInt SkipEndOfLineCharacters( TInt aStartIndex );
+
+    /**
+     * Skips subcommand delimiter characters
      *
-     * @since S60 5.0
-     * @param aCommand Command to append to input buffer
-     * @param aEndFound ETrue if end (carriage return) was found
-     * @return ETrue if overflow was found, EFalse otherwise
+     * @since TB9.2
+     * @param aStartIndex Start index
+     * @return Index to end of delimiter or Symbian error code on error
      */
-    TBool AppendCommandToInputBuffer( TDesC8& aCommand, TBool& aEndFound );
+    TInt SkipSubCommandDelimiterCharacters( TInt aStartIndex );
+
+    /**
+     * Finds the end of the line
+     *
+     * @since TB9.2
+     * @param aStartIndex Start index
+     * @return Index to end of line or Symbian error code on error
+     */
+    TInt FindEndOfLine( TInt aStartIndex );
 
     /**
-     * Handles next decoded command from input buffer
+     * Handles next subcommand from line buffer
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return ETrue if last command decoded, EFalse otherwise
      */
-    TBool HandleNextDecodedCommand();
+    TBool HandleNextSubCommand();
 
     /**
-     * Finds the start of the next command
+     * Manages end of AT command handling
+     *
+     * @since TB9.2
+     * @param aNotifyLocal Notify local parties
+     * @param aNotifyExternal Notify external parties
+     * @return None
+     */
+    void ManageEndOfCmdHandling( TBool aNotifyLocal,
+                                 TBool aNotifyExternal );
+
+    /**
+     * Extracts next subcommand from line buffer to send buffer
+     *
+     * @since TB9.2
+     * @param aPeek Peek for the next command if ETrue, EFalse otherwise
+     * @return ETrue if command extracted, EFalse otherwise
+     */
+    TBool ExtractNextSubCommand( TBool aPeek=EFalse );
+
+    /**
+     *  Finds the start of subcommand from line buffer
      *
      * @since TB9.2
      * @return Index to the next command or Symbian error code on error
      */
-    TInt FindStartOfNextCommand();
+    TInt FindStartOfSubCommand();
 
     /**
-     * Manages end of AT command handling
-     *
-     * @since S60 5.0
-     * @param aNotifyExternal Notify external parties
-     * @param aNotifyLocal Notify local parties
-     * @param aClearInput ETrue to clear input buffer, EFalse otherwise
-     * @return None
-     */
-    void ManageEndOfCmdHandling( TBool aNotifyExternal,
-                                 TBool aNotifyLocal,
-                                 TBool aClearInput );
-
-    /**
-     * Extracts next decoded command from input buffer to decode buffer
-     *
-     * @since S60 5.0
-     * @param aPeek Peek for the next command if ETrue, EFalse otherwise
-     * @return ETrue if command extracted, EFalse otherwise
-     */
-    TBool ExtractNextDecodedCommand( TBool aPeek=EFalse );
-
-    /**
-     * Restores old decode info. For ExtractNextDecodedCommand() when aPeeks is
+     * Restores old decode info. For ExtractNextSubCommand() when aPeeks is
      * ETrue.
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aPeek Peek for the next command if ETrue, EFalse otherwise
      * @param aOldInfo Old information to restore when aPeek is ETrue
      * @return None
@@ -515,39 +542,18 @@
     void RestoreOldDecodeInfo( TBool aPeek, TDunDecodeInfo& aOldInfo );
 
     /**
-     * Finds end of an AT command
+     * Tests for end of AT command line
      *
-     * @since S60 5.0
-     * @param aDes String descriptor
-     * @param aStartIndex Start index for search
-     * @return Index if found, KErrNotFound otherwise
-     */
-    TInt FindEndOfCommand( TDesC8& aDes, TInt aStartIndex=0 );
-
-    /**
-     * Tests for end of AT command character
-     *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aCharacter Character to test
      * @return ETrue if end of command, EFalse otherwise
      */
-    TBool IsEndOfCommand( TChar& aCharacter );
-
-    /**
-     * Finds start of a decoded AT command
-     *
-     * @since S60 5.0
-     * @param aDes String descriptor
-     * @param aStartIndex Start index for search
-     * @return Index if found, KErrNotFound otherwise
-     */
-    TInt FindStartOfDecodedCommand( TDesC8& aDes,
-                                    TInt aStartIndex );
+    TBool IsEndOfLine( TChar& aCharacter );
 
     /**
      * Checks if character is delimiter character
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aCharacter Character to test
      * @return ETrue if delimiter character, EFalse otherwise
      */
@@ -556,7 +562,7 @@
     /**
      * Checks if character is of extended group
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aCharacter Character to test
      * @return ETrue if extended character, EFalse otherwise
      */
@@ -565,13 +571,11 @@
     /**
      * Checks special command
      *
-     * @since S60 5.0
-     * @param aStartIndex Start index (doesn't change)
+     * @since TB9.2
      * @param aEndIndex End index (changes)
      * @return Symbian error code on error, KErrNone otherwise
      */
-    TBool CheckSpecialCommand( TInt aStartIndex,
-                               TInt& aEndIndex );
+    TBool CheckSpecialCommand( TInt& aEndIndex );
 
     /**
      * Saves character decode state for a found character
@@ -584,7 +588,7 @@
      */
     void SaveFoundCharDecodeState( TChar aCharacter,
                                    TBool aAddSpecial=ETrue );
-    
+
     /**
      * Saves character decode state for a not found character
      *
@@ -616,7 +620,7 @@
      * @return ETrue if in next command's extended border, EFalse otherwise
      */
     TBool IsExtendedBorder( TChar aCharacter, TInt aStartIndex, TInt& aEndIndex );
-    
+
     /**
      * Finds subcommand with alphanumeric borders
      *
@@ -631,16 +635,15 @@
      * Finds subcommand
      *
      * @since TB9.2
-     * @param aStartIndex Start index (doesn't change)
      * @param aEndIndex End index (changes)
      * @return Symbian error code on error, KErrNone otherwise
      */
-    TInt FindSubCommand( TInt aStartIndex, TInt& aEndIndex );
+    TInt FindSubCommand( TInt& aEndIndex );
 
     /**
      * Check if "A/" command
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return ETrue if "A/" command, EFalse otherwise
      */
     TBool IsASlashCommand();
@@ -648,24 +651,15 @@
     /**
      * Handles "A/" command
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return ETrue if error reply push started, EFalse otherwise
      */
     TBool HandleASlashCommand();
 
     /**
-     * Resets parse buffers
-     *
-     * @since S60 5.0
-     * @param aClearInput ETrue to clear input buffer, EFalse otherwise
-     * @return None
-     */
-    void ResetParseBuffers( TBool aClearInput=ETrue );
-
-    /**
      * Manages command mode change
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aMode Mode to manage
      * @return ETrue if command mode change detected, EFalse otherwise
      */
@@ -674,7 +668,7 @@
     /**
      * Reports command mode start/end change
      *
-     * @since S60 3.2
+     * @since TB9.2
      * @param aStart Command mode start if ETrue, end otherwise
      * @return None
      */
@@ -683,7 +677,7 @@
     /**
      * Manages echo mode change
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aMode Mode to manage
      * @return ETrue if echo mode change detected, EFalse otherwise
      */
@@ -692,7 +686,7 @@
     /**
      * Manages quiet mode change
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aMode Mode to manage
      * @return ETrue if quiet mode change detected, EFalse otherwise
      */
@@ -701,7 +695,7 @@
     /**
      * Manages verbose mode change
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aMode Mode to manage
      * @return ETrue if verbose mode change detected, EFalse otherwise
      */
@@ -710,7 +704,7 @@
     /**
      * Manages character change
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aMode Mode to manage
      * @return None
      */
@@ -742,7 +736,7 @@
      * This is after all reply data for an AT command is multiplexed to the
      * downstream.
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aError Error code of command processing completion
      * @return None
      */
@@ -752,15 +746,15 @@
      * Notifies about request to stop AT command handling for the rest of the
      * command line data
      *
-     * @since S60 5.0
-     * @return Symbian error code on error, KErrNone otherwise
+     * @since TB9.2
+     * @return None
      */
-    TInt NotifyEndOfCmdLineProcessing();
+    void NotifyEndOfCmdLineProcessing();
 
     /**
      * Notifies about request to peek for the next command
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return ETrue if next command exists, EFalse otherwise
      */
     TBool NotifyNextCommandPeekRequest();
@@ -789,7 +783,7 @@
      * From MDunAtEcomListen.
      * Notifies about new plugin installation
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     TInt NotifyPluginInstallation( TUid& aPluginUid );
@@ -798,7 +792,7 @@
      * From MDunAtEcomListen.
      * Notifies about existing plugin uninstallation
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     TInt NotifyPluginUninstallation( TUid& aPluginUid );
@@ -809,7 +803,7 @@
      * From MDunAtModeListen.
      * Gets called on mode status change
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aMode Mode to manage
      * @return Symbian error code on error, KErrNone otherwise
      */
@@ -861,10 +855,10 @@
     TInt8 iBackspace;
 
     /**
-     * Current command to ParseCommand()
+     * Current input to AddDataForParsing()
      * Not own.
      */
-    TDesC8* iCommand;
+    TDesC8* iInput;
 
     /**
      * Special commands for parsing
@@ -887,14 +881,14 @@
     TBuf8<KDunErrorBufLength> iErrorBuffer;
 
     /**
-     * Buffer for AT command input
+     * Buffer for AT command (one line)
      */
-    TBuf8<KDunInputBufLength> iInputBuffer;
+    TBuf8<KDunLineBufLength> iLineBuffer;
 
     /**
      * Buffer for last AT command input (for "A/")
      */
-    TBuf8<KDunInputBufLength> iLastBuffer;
+    TBuf8<KDunLineBufLength> iLastBuffer;
 
     /**
      * Buffer for <ESC> command
@@ -973,7 +967,7 @@
     TBool iVerboseOn;
 
     /**
-     * End index for command delimiter
+     * End index for not added data in iCommand
      */
     TInt iEndIndex;
 
--- a/localconnectivityservice/dun/atext/inc/DunAtCmdPusher.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/inc/DunAtCmdPusher.h	Thu Aug 19 10:46:39 2010 +0300
@@ -28,7 +28,7 @@
  *  Notification interface class for data pushing status changes
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( MDunAtCmdPusher )
     {
@@ -40,7 +40,7 @@
      * This is after all reply data for an AT command is multiplexed to the
      * downstream.
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aError Error code of command processing completion
      * @return Symbian error code on error, KErrNone otherwise
      */
@@ -50,15 +50,15 @@
      * Notifies about request to stop AT command handling for the rest of the
      * command line data
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
-    virtual TInt NotifyEndOfCmdLineProcessing() = 0;
+    virtual void NotifyEndOfCmdLineProcessing() = 0;
 
     /**
      * Notifies about request to peek for the next command
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return ETrue if next command exists, EFalse otherwise
      */
     virtual TBool NotifyNextCommandPeekRequest() = 0;
@@ -77,7 +77,7 @@
  *  Class for AT command URC handler
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( CDunAtCmdPusher ) : public CActive,
                                        public MDunCompletionReporter
@@ -119,7 +119,7 @@
     /**
      * Resets data to initial values
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void ResetData();
@@ -127,17 +127,17 @@
     /**
      * Starts AT command handling
      *
-     * @since S60 5.0
-     * @param aCommand AT command or editor mode input to handle
+     * @since TB9.2
+     * @param aInput AT command or editor mode input to handle
      * @param aNormalMode ETrue if request issue for normal mode
      * @return Symbian error code on error, KErrNone otherwise
      */
-    TInt IssueRequest( TDesC8& aCommand, TBool aNormalMode=ETrue );
+    TInt IssueRequest( TDesC8& aInput, TBool aNormalMode=ETrue );
 
     /**
      * Stops AT command handling
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt Stop();
@@ -145,7 +145,7 @@
     /**
      * Manages request to abort command handling
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt ManageAbortRequest();
@@ -154,7 +154,7 @@
      * Sets end of command line marker on for the possible series of AT
      * commands.
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aPushLast ETrue to push last reply, EFalse otherwise
      * @return None
      */
@@ -180,7 +180,7 @@
     /**
      * Initializes this class
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void Initialize();
@@ -188,7 +188,7 @@
     /**
      * Sets state to idle and notifies about subcommand handling completion
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aError Error code for completion
      * @return None
      */
@@ -198,7 +198,7 @@
      * Checks if "OK" (verbose) or "0" (numeric) string or exists at the end of
      * buffer and removes it
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt CheckAndRemoveOkString();
@@ -206,7 +206,7 @@
     /**
      * Sends reply data to downstream
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aRecvBuffer ETrue if using receive buffer
      *                    EFalse if using "OK" buffer
      * @return None
@@ -248,7 +248,7 @@
     /**
      * Manages change in reply type
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void ManageReplyTypeChange();
@@ -259,7 +259,7 @@
      * From CActive.
      * Gets called when AT command handled
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void RunL();
@@ -268,7 +268,7 @@
      * From CActive.
      * Gets called on cancel
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void DoCancel();
@@ -279,7 +279,7 @@
      * From MDunCompletionReporter.
      * Gets called when data push is complete
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aAllPushed ETrue if all in the queue were pushed, EFalse otherwise
      * @return None
      */
--- a/localconnectivityservice/dun/atext/inc/DunAtEcomListen.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/inc/DunAtEcomListen.h	Thu Aug 19 10:46:39 2010 +0300
@@ -26,7 +26,7 @@
  *  Notification interface class for ECOM plugin interface status changes
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( MDunAtEcomListen )
     {
@@ -36,7 +36,7 @@
     /**
      * Notifies about new plugin installation
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aPluginUid UID of installed plugin
      * @return Symbian error code on error, KErrNone otherwise
      */
@@ -45,7 +45,7 @@
     /**
      * Notifies about existing plugin uninstallation
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aPluginUid UID of uninstalled plugin
      * @return Symbian error code on error, KErrNone otherwise
      */
@@ -57,7 +57,7 @@
  *  Class for ECom plugin install/uninstall/version listener
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( CDunAtEcomListen ) : public CActive
     {
@@ -81,7 +81,7 @@
      */
     static CDunAtEcomListen* NewLC( RATExt* aAtCmdExt,
                                     MDunAtEcomListen* aCallback );
-	
+
     /**
     * Destructor.
     */
@@ -90,7 +90,7 @@
     /**
      * Resets data to initial values
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void ResetData();
@@ -98,7 +98,7 @@
     /**
      * Starts waiting for ECom plugin install/uninstall/version status changes
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt IssueRequest();
@@ -106,7 +106,7 @@
     /**
      * Stops waiting for Ecom plugin install/uninstall/version status changes
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt Stop();
@@ -121,7 +121,7 @@
     /**
      * Initializes this class
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void Initialize();
@@ -132,7 +132,7 @@
      * From CActive.
      * Gets called when plugin installed, uninstalled or changed
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void RunL();
@@ -141,7 +141,7 @@
      * From CActive.
      * Gets called on cancel
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void DoCancel();
--- a/localconnectivityservice/dun/atext/inc/DunAtModeListen.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/inc/DunAtModeListen.h	Thu Aug 19 10:46:39 2010 +0300
@@ -27,7 +27,7 @@
  *  Notification interface class for modem's mode listener
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( MDunAtModeListen )
     {
@@ -37,7 +37,7 @@
     /**
      * Notifies about mode status change
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aMode Current modem modes
      * @return Symbian error code on error, KErrNone otherwise
      */
@@ -49,7 +49,7 @@
  *  Class for modem's mode listener and notifier
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( CDunAtModeListen ) : public CActive
     {
@@ -82,7 +82,7 @@
     /**
      * Resets data to initial values
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void ResetData();
@@ -90,7 +90,7 @@
     /**
      * Issues request to start monitoring for mode status changes
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt IssueRequest();
@@ -98,7 +98,7 @@
     /**
      * Stops monitoring for mode status changes
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt Stop();
@@ -113,7 +113,7 @@
     /**
      * Initializes this class
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void Initialize();
@@ -124,7 +124,7 @@
      * From CActive.
      * Gets called when mode changes
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void RunL();
@@ -133,7 +133,7 @@
      * From CActive.
      * Gets called on cancel
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void DoCancel();
--- a/localconnectivityservice/dun/atext/inc/DunAtNvramListen.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/inc/DunAtNvramListen.h	Thu Aug 19 10:46:39 2010 +0300
@@ -26,7 +26,7 @@
  *  Class for AT NVRAM status change listener
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( CDunAtNvramListen ) : public CActive
     {
@@ -61,7 +61,7 @@
     /**
      * Resets data to initial values
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void ResetData();
@@ -69,7 +69,7 @@
     /**
      * Starts waiting for NVRAM status changes
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt IssueRequest();
@@ -77,7 +77,7 @@
     /**
      * Stops waiting for NVRAM status changes
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt Stop();
@@ -92,7 +92,7 @@
     /**
      * Initializes this class
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void Initialize();
@@ -103,7 +103,7 @@
      * From CActive.
      * Gets called when NVRAM has changed
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void RunL();
@@ -112,7 +112,7 @@
      * From CActive.
      * Gets called on cancel
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void DoCancel();
--- a/localconnectivityservice/dun/atext/inc/DunAtSpecialCmdHandler.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/inc/DunAtSpecialCmdHandler.h	Thu Aug 19 10:46:39 2010 +0300
@@ -21,7 +21,7 @@
 #include <e32base.h>
 #include <badesca.h>
 
-const TInt KInputBufLength = (512 + 1);  // Set this the same as in KDunInputBufLength
+const TInt KLineBufLength = (512 + 1);  // Set this the same as in KDunLineBufLength
 
 /**
  *  Class for special AT command handler
@@ -98,7 +98,7 @@
     /**
      * Buffer for temporary AT command input
      */
-    TBuf8<KInputBufLength> iBuffer;
+    TBuf8<KLineBufLength> iBuffer;
 
     /**
      * Special commands for parsing
--- a/localconnectivityservice/dun/atext/inc/DunAtUrcHandler.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/inc/DunAtUrcHandler.h	Thu Aug 19 10:46:39 2010 +0300
@@ -28,7 +28,7 @@
  *  Class for AT command URC handler
  *
  *  @lib dunatext.lib
- *  @since S60 v5.0
+ *  @since TB9.2
  */
 NONSHARABLE_CLASS( CDunAtUrcHandler ) : public CActive,
                                         public MDunCompletionReporter
@@ -62,7 +62,7 @@
     /**
      * Resets data to initial values
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
     void ResetData();
@@ -70,7 +70,7 @@
     /**
      * Starts waiting for an incoming URC message
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt IssueRequest();
@@ -78,7 +78,7 @@
     /**
      * Stops waiting for an incoming URC message
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return Symbian error code on error, KErrNone otherwise
      */
     TInt Stop();
@@ -86,7 +86,7 @@
     /**
      * UID of the owning plugin
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return UID of the owning plugin
      */
     TUid OwnerUid();
@@ -101,7 +101,7 @@
     /**
      * Initializes this class
      *
-     * @since S60 3.2
+     * @since TB9.2
      * @return None
      */
     void Initialize();
@@ -112,7 +112,7 @@
      * From CActive.
      * Gets called when URC command received
      *
-     * @since S60 3.2
+     * @since TB9.2
      * @return None
      */
     void RunL();
@@ -121,7 +121,7 @@
      * From CActive.
      * Gets called on cancel
      *
-     * @since S60 3.2
+     * @since TB9.2
      * @return None
      */
     void DoCancel();
@@ -132,7 +132,7 @@
      * From MDunCompletionReporter.
      * Gets called when data push is complete
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @param aAllPushed ETrue if all in the queue were pushed, EFalse otherwise
      * @return None
      */
--- a/localconnectivityservice/dun/atext/src/DunAtCmdHandler.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/src/DunAtCmdHandler.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -23,6 +23,24 @@
  */
 
 /*
+ * This file has the following functionality:
+ * 1) Line buffer filler:
+ *    AddDataForParsing(), ManagePartialCommand(), ExtractLineFromInputBuffer(),
+ *    etc. This buffer is used for parsing. These functions are used for
+ *    splitter-combiner logic described below. CDunAtCmdPusher is used
+ *    separately for each element in the line buffer.
+ * 2) Parser and splitter-combiner to handle the separater elements (subcommands)
+ *    in the line buffer. When end of line is detected, iEndIndex is used to
+ *    extract the next line in iInput to the line buffer (ManageEndOfCmdHandling()
+ *    and ExtractLineFromInputBuffer()).
+ * 3) When end of iEndIndex is found (ExtractLineFromInputBuffer()), more data
+ *    is asked from CDunUpstream.
+ * Note: There is separate handling for "one character input data" and "A/"
+ * command handling which should be supported only for one line based data
+ * (ManagePartialCommand()).
+ */
+
+/*
  * The AT command handling is splitted to two parts on high level:
  * 1) Splitter: splitting the sub-commands in a command line to multiple ones
  *    for ATEXT to process.
@@ -30,6 +48,13 @@
  *    (the filter categories are explained in DunAtCmdPusher.cpp)
  */
 
+/*
+ * Note1: This file uses AT command parsing based on heuristics.
+ * Refer to test specification if planning to change the heuristic.
+ * Note2: Input buffer management (ExtractLineFromInputBuffer()) can be tested
+ * with non-line based terminals such as HyperTerminal or Realterm.
+ */
+
 #include "DunAtCmdHandler.h"
 #include "DunAtUrcHandler.h"
 #include "DunDownstream.h"
@@ -139,39 +164,38 @@
     }
 
 // ---------------------------------------------------------------------------
-// Parses an AT command
+// Adds data for parsing and parses if necessary
 // ---------------------------------------------------------------------------
 //
-EXPORT_C TInt CDunAtCmdHandler::ParseCommand( TDesC8& aCommand,
-                                              TBool& aPartialInput )
+EXPORT_C TInt CDunAtCmdHandler::AddDataForParsing( TDesC8& aInput,
+                                                   TBool& aMoreNeeded )
     {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::ParseCommand()") ));
-    FTRACE(FPrint( _L("CDunAtCmdHandler::ParseCommand() received:") ));
-    FTRACE(FPrintRaw(aCommand) );
+    FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing()") ));
+    FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() received (%d bytes):"), aInput.Length() ));
+    FTRACE(FPrintRaw(aInput) );
     TBool editorMode = iCmdPusher->EditorMode();
     if ( editorMode )
         {
-        // Note: return here with "no partial input" and some error to fool
+        // Note: return here with "no more data needed" and some error to fool
         // CDunUpstream into not reissuing the read request.
-        iCmdPusher->IssueRequest( aCommand, EFalse );
-        aPartialInput = EFalse;
+        iCmdPusher->IssueRequest( aInput, EFalse );
+        aMoreNeeded = EFalse;
         return KErrGeneral;
         }
-    iCommand = &aCommand;  // iCommand only for normal mode
+    iInput = &aInput;  // iInput only for normal mode
     // Manage partial AT command
-    TBool needsCarriage = ETrue;
-    TBool okToExit = ManagePartialCommand( aCommand, needsCarriage );
-    if ( okToExit )
+    TBool moreNeeded = ManagePartialCommand();
+    if ( moreNeeded )
         {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ParseCommand() (ok to exit) complete") ));
-        aPartialInput = ETrue;
+        aMoreNeeded = ETrue;
+        FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() (more partial) complete") ));
         return KErrNone;
         }
     if ( iHandleState != EDunStateIdle )
         {
-        aPartialInput = EFalse;
-        ResetParseBuffers();
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ParseCommand() (not ready) complete") ));
+        aMoreNeeded = EFalse;
+        ManageEndOfCmdHandling( EFalse, EFalse );
+        FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() (not ready) complete") ));
         return KErrNotReady;
         }
     TBool pushStarted = HandleASlashCommand();
@@ -180,20 +204,21 @@
         // Note: return here with "partial input" status to fool CDunUpstream
         // into reissuing the read request. The AT command has not really
         // started yet so this is necessary.
-        aPartialInput = ETrue;
-        ResetParseBuffers();
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ParseCommand() (A/) complete") ));
+        aMoreNeeded = ETrue;
+        ManageEndOfCmdHandling( EFalse, EFalse );
+        FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() (A/) complete") ));
         return KErrNone;
         }
-    FTRACE(FPrint( _L("CDunAtCmdHandler::ParseCommand() received total:") ));
-    FTRACE(FPrintRaw(iInputBuffer) );
     iHandleState = EDunStateAtCmdHandling;
-    iUpstream->NotifyAtCmdHandlingStart();
     iDecodeInfo.iFirstDecode = ETrue;
     iDecodeInfo.iDecodeIndex = 0;
-    HandleNextDecodedCommand();
-    FTRACE(FPrint( _L("CDunAtCmdHandler::ParseCommand() complete") ));
-    aPartialInput = EFalse;
+    iDecodeInfo.iPrevExists = EFalse;
+    iParseInfo.iLimit = KErrNotFound;
+    iParseInfo.iSendBuffer.Zero();
+    iEditorModeInfo.iContentFound = EFalse;
+    HandleNextSubCommand();
+    FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() complete") ));
+    aMoreNeeded = EFalse;
     return KErrNone;
     }
 
@@ -211,17 +236,6 @@
     }
 
 // ---------------------------------------------------------------------------
-// Sets end of command line marker on for the possible series of AT commands.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CDunAtCmdHandler::SetEndOfCmdLine( TBool aClearInput )
-    {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::SetEndOfCmdLine()") ));
-    ManageEndOfCmdHandling( EFalse, ETrue, aClearInput );
-    FTRACE(FPrint( _L("CDunAtCmdHandler::SetEndOfCmdLine() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
 // Sends a character to be echoed
 // ---------------------------------------------------------------------------
 //
@@ -250,10 +264,10 @@
     iCmdPusher->Stop();
     // The line below is used in the case when this function is called by
     // CDunUpstream as a result of "data mode ON" change notification.
-    // In this case it is possible that HandleNextDecodedCommand() returns
-    // without resetting the iInputBuffer because of the way it checks the
+    // In this case it is possible that HandleNextSubCommand() returns
+    // without resetting the iSendBuffer because of the way it checks the
     // iHandleState.
-    ManageEndOfCmdHandling( EFalse, ETrue, ETrue );
+    ManageEndOfCmdHandling( ETrue, EFalse );
     FTRACE(FPrint( _L("CDunAtCmdHandler::Stop() complete") ));
     return KErrNone;
     }
@@ -374,7 +388,7 @@
     iCarriageReturn = 0;
     iLineFeed = 0;
     iBackspace = 0;
-    iCommand = NULL;
+    iInput = NULL;
     iDecodeInfo.iFirstDecode = ETrue;
     iDecodeInfo.iDecodeIndex = KErrNotFound;
     iDecodeInfo.iExtendedIndex = KErrNotFound;
@@ -383,6 +397,7 @@
     iDecodeInfo.iAssignFound = EFalse;
     iDecodeInfo.iInQuotes = EFalse;
     iDecodeInfo.iSpecialFound = EFalse;
+    iDecodeInfo.iCmdsHandled = 0;
     iEditorModeInfo.iContentFound = EFalse;
     iCmdPusher = NULL;
     iEcomListen = NULL;
@@ -435,19 +450,19 @@
     TBool firstSearch = ETrue;
     for ( ;; )
         {
-        retTemp = iAtCmdExt.GetNextSpecialCommand( iInputBuffer, firstSearch );
+        // Let's borrow iLineBuffer for this purpose
+        retTemp = iAtCmdExt.GetNextSpecialCommand( iLineBuffer, firstSearch );
         if ( retTemp != KErrNone )
             {
             break;
             }
-        HBufC8* specialCmd = HBufC8::NewMaxLC( iInputBuffer.Length() );
-        TPtr8 specialCmdPtr = specialCmd->Des();
-        specialCmdPtr.Copy( iInputBuffer );
-        specialCmdPtr.UpperCase();
+        TInt lineLength = iLineBuffer.Length();
+        HBufC8* specialCmd = HBufC8::NewMaxLC( lineLength );
+        *specialCmd = iLineBuffer;
         iSpecials.AppendL( specialCmd );
         CleanupStack::Pop( specialCmd );
         }
-    iInputBuffer.Zero();
+    iLineBuffer.Zero();
     FTRACE(FPrint( _L("CDunAtCmdHandler::CreateSpecialCommandsL() complete") ));
     }
 
@@ -512,6 +527,11 @@
 TBool CDunAtCmdHandler::RegenerateOkReply()
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateOkReply()") ));
+    if ( iDownstream->IsDataInQueue(&iOkBuffer) )
+        {
+        FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateOkReply() (in queue!) complete") ));
+        return iQuietOn;
+        }
     iOkBuffer.Zero();
     if ( iQuietOn )
         {
@@ -544,6 +564,11 @@
 TBool CDunAtCmdHandler::RegenerateErrorReply()
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateErrorReply()") ));
+    if ( iDownstream->IsDataInQueue(&iErrorBuffer) )
+        {
+        FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateErrorReply() (in queue!) complete") ));
+        return iQuietOn;
+        }
     iErrorBuffer.Zero();
     if ( iQuietOn )
         {
@@ -634,57 +659,39 @@
 // Manages partial AT command
 // ---------------------------------------------------------------------------
 //
-TBool CDunAtCmdHandler::ManagePartialCommand( TDesC8& aCommand,
-                                              TBool& aNeedsCarriage )
+TBool CDunAtCmdHandler::ManagePartialCommand()
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand()") ));
-    aNeedsCarriage = ETrue;
-    // Check length of command
-    if ( aCommand.Length() == 0 )
+    // Check one character (or unit) based input data
+    if ( iInput->Length() == KDunChSetMaxCharLen )
         {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (length zero) complete") ));
-        return ETrue;
-        }
-    // Check one character (or unit) based input data
-    if ( aCommand.Length() == KDunChSetMaxCharLen )
-        {
-        EchoCommand( aCommand );
+        EchoCommand();
         // Handle backspace and cancel characters
-        TBool found = HandleSpecialCharacters( aCommand );
+        TBool found = HandleSpecialCharacters();
         if ( found )
             {
             FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (special) complete") ));
             return ETrue;
             }
         }
-    TBool endFound = EFalse;
-    TBool overflow = AppendCommandToInputBuffer( aCommand, endFound );
-    if ( overflow )
+    TBool moreNeeded = ExtractLineFromInputBuffer();
+    if ( moreNeeded )
         {
-        // Overflow occurred so return ETrue (consumed) to skip all the rest
-        // characters until carriage return is found
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (overflow) complete") ));
-        return ETrue;
+        // More data is not needed with "A/" (no carriage return), check that
+        // special case here, otherwise continue processing
+        if ( !IsASlashCommand() )
+            {
+            FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (more) complete") ));
+            return ETrue;
+            }
         }
     // If something went wrong, do nothing (return consumed)
-    if ( iInputBuffer.Length() <= 0 )
+    if ( iLineBuffer.Length() <= 0 )
         {
         FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (length) complete") ));
         return ETrue;
         }
-    // If "A/", no carriage return is needed, check that now
-    if ( IsASlashCommand() )
-        {
-        aNeedsCarriage = EFalse;
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (A/) complete") ));
-        return EFalse;
-        }
-    // For other commands and if no end, just return with consumed
-    if ( !endFound )
-        {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (void) complete") ));
-        return ETrue;
-        }
+    // For other commands, just return with consumed
     FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() complete") ));
     return EFalse;
     }
@@ -693,17 +700,22 @@
 // Echoes a command if echo is on
 // ---------------------------------------------------------------------------
 //
-TBool CDunAtCmdHandler::EchoCommand( TDesC8& aDes )
+TBool CDunAtCmdHandler::EchoCommand()
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand()") ));
-    if ( aDes.Length() > KDunChSetMaxCharLen )
+    if ( iInput->Length() > KDunChSetMaxCharLen )
         {
         FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand() (wrong length) complete") ));
         return EFalse;
         }
     if ( iEchoOn )
         {
-        iEchoBuffer.Copy( aDes );
+        if ( iDownstream->IsDataInQueue(&iEchoBuffer) )
+            {
+            FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand() (in queue!) complete") ));
+            return EFalse;
+            }
+        iEchoBuffer.Copy( *iInput );
         iDownstream->NotifyDataPushRequest( &iEchoBuffer, NULL );
         FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand() complete") ));
         return ETrue;
@@ -716,27 +728,27 @@
 // Handles backspace and cancel characters
 // ---------------------------------------------------------------------------
 //
-TBool CDunAtCmdHandler::HandleSpecialCharacters( TDesC8& aCommand )
+TBool CDunAtCmdHandler::HandleSpecialCharacters()
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters()") ));
-    if ( aCommand.Length() != KDunChSetMaxCharLen )
+    if ( iInput->Length() != KDunChSetMaxCharLen )
         {
         FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters() (wrong length) complete") ));
         return EFalse;
         }
-    if ( aCommand[0] == iBackspace )
+    if ( (*iInput)[0] == iBackspace )
         {
-        TInt bufferLength = iInputBuffer.Length();
-        if ( bufferLength > 0 )
+        TInt lineLength = iLineBuffer.Length();
+        if ( lineLength > 0 )
             {
-            iInputBuffer.SetLength( bufferLength-1 );
+            iLineBuffer.SetLength( lineLength-1 );
             }
         FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters() (backspace) complete") ));
         return ETrue;
         }
-    if ( aCommand[0] == KDunCancel )
+    if ( (*iInput)[0] == KDunCancel )
         {
-        ResetParseBuffers();  // More processing here?
+        ManageEndOfCmdHandling( EFalse, EFalse );
         FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters() (cancel) complete") ));
         return ETrue;
         }
@@ -745,167 +757,381 @@
     }
 
 // ---------------------------------------------------------------------------
-// Appends command to parse buffer
+// Extracts line from input buffer to line buffer
 // ---------------------------------------------------------------------------
 //
-TBool CDunAtCmdHandler::AppendCommandToInputBuffer( TDesC8& aCommand,
-                                                    TBool& aEndFound )
+TBool CDunAtCmdHandler::ExtractLineFromInputBuffer()
     {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::AppendCommandToInputBuffer()") ));
-    aEndFound = EFalse;
-    TInt cmdBufIndex = 0;
-    TInt cmdBufLim = aCommand.Length();
-    while ( cmdBufIndex < cmdBufLim )
+    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer()") ));
+    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() before (%d bytes):"), iLineBuffer.Length() ));
+    FTRACE(FPrintRaw(iLineBuffer) );
+    // Case1: If no data in iLineBuffer and end-of-line character in iInputBuffer[start]:
+    //     - Skip end-of-line characters, find start-of-line condition, find end-of-line character
+    //     - If partial line found (start-of-line condition and no end-of-line character):
+    //           - Save partial line to iLineBuffer
+    //           - Set iEndIndex to end of iInputBuffer
+    //     - If full line found (start-of-line condition and end-of-line character):
+    //           - Save full line to iLineBuffer
+    //           - Skip multiple end-of-line characters until next start-of-line
+    //             condition or end of iInputBuffer -> save this position to iEndIndex
+    // Case2: If no data in iLineBuffer and non-end-of-line character in iInputBuffer[start]:
+    //     - Find end-of-line character
+    //     - If partial line found (no end-of-line character):
+    //           - Save partial line to iLineBuffer
+    //           - Set iEndIndex to end of iLineBuffer
+    //     - If full line found (end-of-line character):
+    //           - Save full line to iLineBuffer
+    //           - Skip multiple end-of-line characters until next start-of-line
+    //             condition or end of iInputBuffer -> save this position to iEndIndex
+    // Case3: If data in iLineBuffer and end-of-line character in iInputBuffer[start]:
+    //     - Skip end-of-line characters
+    //     - Keep string currently in iLineBuffer
+    //     - Skip end-of-line characters until non-end-of-line or end of
+    //       iInputBuffer -> save this position to iEndIndex
+    // Case4: If data in iLineBuffer and non-end-of-line character in iInputBuffer[start]:
+    //     - Processed the same way as Case1, however "Skip end-of-line characters" does
+    //       not have any effect
+    if ( iInput->Length() <= 0 )
         {
-        if ( iInputBuffer.Length() == iInputBuffer.MaxLength() )
+        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (wrong length) complete") ));
+        return ETrue;
+        }
+    TBool moreNeeded = ETrue;
+    TBool copyNeeded = EFalse;
+    TInt copyLength = KErrNotFound;
+    TInt lineLength = iLineBuffer.Length();
+    TInt lineMaxLength = iLineBuffer.MaxLength();
+    TInt freeLineSpace = lineMaxLength - lineLength;
+    TInt inputLength = iInput->Length();
+    TInt startIndex = ( iEndIndex>=0 ) ? iEndIndex : 0;
+    if ( startIndex >= inputLength )
+        {
+        iEndIndex = KErrNotFound;
+        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (input end) complete") ));
+        return ETrue;
+        }
+    // Cases here:
+    // Case1: If no data in iLineBuffer and end-of-line character in iInputBuffer[start]
+    // Case2: If no data in iLineBuffer and non-end-of-line character in iInputBuffer[start]
+    // Case3: If data in iLineBuffer and end-of-line character in iInputBuffer[start]
+    // Case4: If data in iLineBuffer and non-end-of-line character in iInputBuffer[start]
+    // Summary: Cases 1, 2 and 4 can be combined. Case 3 needs a separate check.
+    TChar character = (*iInput)[startIndex];
+    TBool endOfLine = IsEndOfLine(character);
+    if ( lineLength>0 && endOfLine )
+        {
+        moreNeeded = HandleSpecialBufferManagement( startIndex,
+                                                    copyLength,
+                                                    copyNeeded );
+        }
+    else
+        {
+        moreNeeded = HandleGenericBufferManagement( startIndex,
+                                                    copyLength,
+                                                    copyNeeded );
+        }
+    if ( copyNeeded && copyLength>0 )
+        {
+        // Check the case copyLength does not fit to iLineBuffer
+        // This case should be handled by returning "more data needed"
+        // Also reset the iLineBuffer to ensure the handling doesn't stuck
+        // for rest of the commands (usability case)
+        if ( copyLength > freeLineSpace )
             {
-            // 1) If output is full and end found from input
-            //    -> reset buffers and overflow found
-            // 2) If output is full and end not found from input
-            //    -> don't reset buffers and overflow found
-            TInt foundIndex = FindEndOfCommand( aCommand );
-            if ( foundIndex >= 0 )
-                {
-                aEndFound = ETrue;
-                ResetParseBuffers();
-                FTRACE(FPrint( _L("CDunAtCmdHandler::AppendCommandToInputBuffer() (reset) complete") ));
-                }
-            FTRACE(FPrint( _L("CDunAtCmdHandler::AppendCommandToInputBuffer() (overflow) complete") ));
+            iLineBuffer.Zero();
+            iEndIndex = KErrNotFound;
+            FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() after (%d bytes):"), iLineBuffer.Length() ));
+            FTRACE(FPrintRaw(iLineBuffer) );
+            FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (overflow) complete") ));
             return ETrue;
             }
-        TChar character = aCommand[cmdBufIndex];
-        if ( IsEndOfCommand(character) )
-            {
-            aEndFound = ETrue;
-            iEndIndex = cmdBufIndex;
-            break;
-            }
-        iInputBuffer.Append( aCommand[cmdBufIndex] );
-        cmdBufIndex++;
+        iLineBuffer.Append( &(*iInput)[startIndex], copyLength );
+        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() after (%d bytes):"), iLineBuffer.Length() ));
+        FTRACE(FPrintRaw(iLineBuffer) );
         }
-    FTRACE(FPrint( _L("CDunAtCmdHandler::AppendCommandToInputBuffer() complete") ));
+    if ( moreNeeded )
+        {
+        iEndIndex = KErrNotFound;
+        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (more needed) complete") ));
+        return ETrue;
+        }
+    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (line found) complete") ));
     return EFalse;
     }
 
 // ---------------------------------------------------------------------------
-// Handles next decoded command from input buffer
+// Handles generic buffer management
+// (explanation in ExtractLineFromInputBuffer())
 // ---------------------------------------------------------------------------
 //
-TBool CDunAtCmdHandler::HandleNextDecodedCommand()
+TBool CDunAtCmdHandler::HandleGenericBufferManagement( TInt& aStartIndex,
+                                                       TInt& aCopyLength,
+                                                       TBool& aCopyNeeded )
     {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextDecodedCommand()") ));
-    if ( iHandleState != EDunStateAtCmdHandling )
+    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement()") ));
+    TInt inputLength = iInput->Length();
+    TInt currentIndex = SkipEndOfLineCharacters( aStartIndex );
+    if ( currentIndex >= inputLength )
         {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextDecodedCommand() (not ready) complete") ));
+        // No data in iLineBuffer and only end-of-lines in new buffer
+        // return with "need more data"
+        iEndIndex = inputLength;
+        aCopyLength = 0;
+        aCopyNeeded = EFalse;
+        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement() (new end for old no data) complete") ));
         return ETrue;
         }
-    TBool extracted = ExtractNextDecodedCommand();
-    if ( !extracted )
+    // No data in iLineBuffer and non-end-of-line character found
+    // Try to find the first start-of-line condition
+    TInt lineLength = iLineBuffer.Length();
+    if ( lineLength == 0 )
         {
-        ManageEndOfCmdHandling( ETrue, ETrue, ETrue );
-        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextDecodedCommand() (last) complete") ));
+        currentIndex = SkipSubCommandDelimiterCharacters( aStartIndex );
+        if ( currentIndex >= inputLength )
+            {
+            // No data in iLineBuffer and only end-of-lines+delimiter in new buffer
+            // return with "need more data"
+            iEndIndex = inputLength;
+            aCopyLength = 0;
+            aCopyNeeded = EFalse;
+            FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement() (new end+delim for old no data) complete") ));
+            return ETrue;
+            }
+        }
+    aStartIndex = currentIndex;
+    // No data in iLineBuffer and other than end-of-line or delimiter character found
+    // Variable currentIndex is now the start of new command
+    // Next try to find the end of the command
+    TInt endIndex = FindEndOfLine( aStartIndex );
+    if ( endIndex >= inputLength )
+        {
+        // No data in iLineBuffer and start of command found without end
+        // return with "need more data"
+        iEndIndex = inputLength;
+        aCopyLength = inputLength - aStartIndex;
+        aCopyNeeded = ETrue;
+        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement() (start but no end for old no data) complete") ));
         return ETrue;
         }
-    // Next convert the decoded AT command to uppercase
-    // Don't check for case status -> let mixed cases pass
-    iParseInfo.iSendBuffer.Copy( iDecodeInfo.iDecodeBuffer );
-    TInt maxLength = iParseInfo.iSendBuffer.MaxLength();
-    TPtr8 upperDes( &iParseInfo.iSendBuffer[0], iParseInfo.iLimit, maxLength );
-    upperDes.UpperCase();
-    // Next always send the command to ATEXT
-    iCmdPusher->IssueRequest( iParseInfo.iSendBuffer );
-    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextDecodedCommand() complete") ));
+    // No data in iLineBuffer and end-of-line character found
+    // Try to skip possible multiple end-of-line characters
+    currentIndex = SkipEndOfLineCharacters( endIndex );
+    // Variable currentIndex is now either start of next command or end of iInput
+    // Note that this requires that Case 2 must skip the possible IsDelimiterCharacter()s
+    iEndIndex = currentIndex;
+    aCopyLength = endIndex - aStartIndex;
+    aCopyNeeded = ETrue;
+    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement() (line found) complete") ));
     return EFalse;
     }
 
 // ---------------------------------------------------------------------------
-// Finds the start of the next command
+// Handles special buffer management
+// (explanation in ExtractLineFromInputBuffer())
 // ---------------------------------------------------------------------------
 //
-TInt CDunAtCmdHandler::FindStartOfNextCommand()
+TBool CDunAtCmdHandler::HandleSpecialBufferManagement( TInt aStartIndex,
+                                                       TInt& aCopyLength,
+                                                       TBool& aCopyNeeded )
     {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfNextCommand()") ));
-    // Note: here we need to avoid internal recursion when parsing the
-    // multiple IsEndOfCommand() and IsDelimiterCharacter() markers inside the
-    // same upstream block.
-    // Skip all the extra markers except the one we already know to exist.
-    TInt i;
-    TInt startVal = iEndIndex + 1;
-    TInt foundIndex = KErrNotFound;
-    TInt count = iCommand->Length();
-    for ( i=startVal; i<count; i++ )
+    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialBufferManagement()") ));
+    TInt currentIndex = SkipEndOfLineCharacters( aStartIndex );
+    // Variable currentIndex is now either start of next command or end of iInput
+    iEndIndex = currentIndex;
+    aCopyLength = 0;
+    aCopyNeeded = EFalse;
+    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialBufferManagement() complete") ));
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// Skips end-of-line characters
+// ---------------------------------------------------------------------------
+//
+TInt CDunAtCmdHandler::SkipEndOfLineCharacters( TInt aStartIndex )
+    {
+    FTRACE(FPrint( _L("CDunAtCmdHandler::SkipEndOfLineCharacters()") ));
+    TInt foundIndex = iInput->Length();
+    TInt inputLength = foundIndex;
+    for ( TInt i=aStartIndex; i<inputLength; i++ )
         {
-        TChar character = (*iCommand)[i];
-        if ( !(IsEndOfCommand(character)||IsDelimiterCharacter(character)) )
+        TChar character = (*iInput)[i];
+        if ( !IsEndOfLine(character) )
             {
             foundIndex = i;
             break;
             }
         }
-    FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfNextCommand() complete") ));
+    FTRACE(FPrint( _L("CDunAtCmdHandler::SkipEndOfLineCharacters() complete") ));
+    return foundIndex;
+    }
+
+// ---------------------------------------------------------------------------
+// Skips subcommand delimiter characters
+// ---------------------------------------------------------------------------
+//
+TInt CDunAtCmdHandler::SkipSubCommandDelimiterCharacters( TInt aStartIndex )
+    {
+    FTRACE(FPrint( _L("CDunAtCmdHandler::SkipSubCommandDelimiterCharacters()") ));
+    TInt inputLength = iInput->Length();
+    TInt foundIndex = inputLength;
+    for ( TInt i=aStartIndex; i<inputLength; i++ )
+        {
+        TChar character = (*iInput)[i];
+        if ( !IsDelimiterCharacter(character) )
+            {
+            foundIndex = i;
+            break;
+            }
+        }
+    FTRACE(FPrint( _L("CDunAtCmdHandler::SkipSubCommandDelimiterCharacters() complete") ));
     return foundIndex;
     }
 
 // ---------------------------------------------------------------------------
+// Finds the end of the line
+// ---------------------------------------------------------------------------
+//
+TInt CDunAtCmdHandler::FindEndOfLine( TInt aStartIndex )
+    {
+    FTRACE(FPrint( _L("CDunAtCmdHandler::FindEndOfLine()") ));
+    TInt inputLength = iInput->Length();
+    TInt foundIndex = inputLength;
+    for ( TInt i=aStartIndex; i<inputLength; i++ )
+        {
+        TChar character = (*iInput)[i];
+        // Checking for IsDelimiterCharacter() here needs more logic (a parser).
+        // Just check with "IsEndOfLine()"
+        if ( IsEndOfLine(character) )
+            {
+            foundIndex = i;
+            break;
+            }
+        }
+    FTRACE(FPrint( _L("CDunAtCmdHandler::FindEndOfLine() complete") ));
+    return foundIndex;
+    }
+
+// ---------------------------------------------------------------------------
+// Handles next subcommand from line buffer
+// ---------------------------------------------------------------------------
+//
+TBool CDunAtCmdHandler::HandleNextSubCommand()
+    {
+    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextSubCommand()") ));
+    if ( iHandleState != EDunStateAtCmdHandling )
+        {
+        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextSubCommand() (not ready) complete") ));
+        return EFalse;
+        }
+    TBool extracted = ExtractNextSubCommand();
+    if ( !extracted )
+        {
+        ManageEndOfCmdHandling( ETrue, ETrue );
+        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextSubCommand() (last) complete") ));
+        return EFalse;
+        }
+    // Next convert the decoded AT command to uppercase
+    // Don't check for case status -> let mixed cases pass
+    TInt oldLength = iParseInfo.iSendBuffer.Length();
+    iParseInfo.iSendBuffer.SetLength( iParseInfo.iLimit );
+    iParseInfo.iSendBuffer.UpperCase();
+    iParseInfo.iSendBuffer.SetLength( oldLength );
+    // Next always send the command to ATEXT
+    iCmdPusher->IssueRequest( iParseInfo.iSendBuffer );
+    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextSubCommand() complete") ));
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
 // Manages end of AT command handling
 // ---------------------------------------------------------------------------
 //
-void CDunAtCmdHandler::ManageEndOfCmdHandling( TBool aNotifyExternal,
-                                               TBool aNotifyLocal,
-                                               TBool aClearInput )
+void CDunAtCmdHandler::ManageEndOfCmdHandling( TBool aNotifyLocal,
+                                               TBool aNotifyExternal )
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEndOfCmdHandling()") ));
-    if ( iInputBuffer.Length() > 0 )
+    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEndOfCmdHandling() (loc=%d, ext=%d)"), aNotifyLocal, aNotifyExternal ));
+    // If iEndIndex is (>=0 && <iInput.Length()) it means more data waits in
+    // iInput that didn't fit in iInputBuffer.
+    TInt cmdLength = iInput->Length();
+    TBool subBlock = ( iEndIndex>=0&&iEndIndex<cmdLength ) ? ETrue : EFalse;
+    if ( iLineBuffer.Length()>0 && !subBlock )
         {
-        iLastBuffer.Copy( iInputBuffer );
+        // Line buffer set and no partial subblock, copy to lastbuffer
+        iLastBuffer.Copy( iLineBuffer );
         }
-    ResetParseBuffers( aClearInput );
+    iLineBuffer.Zero();
+    iDecodeInfo.iFirstDecode = ETrue;
+    iDecodeInfo.iDecodeIndex = 0;
+    iDecodeInfo.iPrevExists = EFalse;
+    iParseInfo.iLimit = KErrNotFound;
+    iParseInfo.iSendBuffer.Zero();
+    iEditorModeInfo.iContentFound = EFalse;
     iHandleState = EDunStateIdle;
     if ( aNotifyLocal )
         {
         iCmdPusher->SetEndOfCmdLine();
         }
-    if ( !aNotifyExternal )
+    // iEndIndex must not be reset to KErrNotFound only when
+    // ExtractLineFromInputBuffer() found the next line
+    // (when moreNeeded is EFalse)
+    TBool resetIndex = ETrue;
+    if ( aNotifyExternal )
         {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEndOfCmdHandling() (no external) complete") ));
-        return;
+        TBool moreNeeded = ExtractLineFromInputBuffer();
+        if ( moreNeeded )
+            {
+            iUpstream->NotifyParserNeedsMoreData();
+            }
+        else
+            {
+            // AppendBlockToInputBuffer() was able to fill with known end, handle next
+            iHandleState = EDunStateAtCmdHandling;
+            HandleNextSubCommand();
+            resetIndex = EFalse;
+            }
         }
-    TInt foundIndex = FindStartOfNextCommand();
-    iUpstream->NotifyAtCmdHandlingEnd( foundIndex );
+    if ( resetIndex )
+        {
+        iEndIndex = KErrNotFound;
+        }
     FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEndOfCmdHandling() complete") ));
     }
 
 // ---------------------------------------------------------------------------
-// Extracts next decoded command from input buffer to decode buffer
+// Extracts next subcommand from line buffer to send buffer
 // ---------------------------------------------------------------------------
 //
-TBool CDunAtCmdHandler::ExtractNextDecodedCommand( TBool aPeek )
+TBool CDunAtCmdHandler::ExtractNextSubCommand( TBool aPeek )
     {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextDecodedCommand()") ));
-    iParseInfo.iLimit = KErrNotFound;
+    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextSubCommand()") ));
     TDunDecodeInfo oldInfo = iDecodeInfo;
-    iDecodeInfo.iDecodeBuffer.Zero();
-    // Find start of decode command from input buffer
-    TInt startIndex = iDecodeInfo.iDecodeIndex;
-    startIndex = FindStartOfDecodedCommand( iInputBuffer, startIndex );
+    iParseInfo.iLimit = KErrNotFound;
+    iParseInfo.iSendBuffer.Zero();
+    // Find start of subcommand from line buffer
+    TInt startIndex = FindStartOfSubCommand();
     if ( startIndex < 0 )
         {
         RestoreOldDecodeInfo( aPeek, oldInfo );
         FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextDecodedCommand() (no start) complete") ));
         return EFalse;
         }
-    // Find end of decode command from input buffer
+    iDecodeInfo.iDecodeIndex = startIndex;
     TBool specialCmd = EFalse;
     TInt endIndex = KErrNotFound;
-    specialCmd = CheckSpecialCommand( startIndex, endIndex );
+    specialCmd = CheckSpecialCommand( endIndex );
     if ( !specialCmd )
         {
-        FindSubCommand( startIndex, endIndex );
+        FindSubCommand( endIndex );
         }
-    if ( endIndex < startIndex )
+    TInt lineLength = iLineBuffer.Length();
+    TBool inStartLimits = ( startIndex >= 0 && startIndex < lineLength ) ? ETrue : EFalse;
+    TBool inEndLimits   = ( endIndex   >= 0 && endIndex   < lineLength ) ? ETrue : EFalse;
+    if ( !inStartLimits || !inEndLimits )
         {
         RestoreOldDecodeInfo( aPeek, oldInfo );
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextDecodedCommand() (no end) complete") ));
+        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextSubCommand() (no end) complete") ));
         return EFalse;
         }
     TInt cmdLength = endIndex - startIndex + 1;
@@ -917,8 +1143,8 @@
     // Next create a new command
     if ( !iDecodeInfo.iFirstDecode )
         {
-        _LIT( KAtMsg, "AT" );
-        iDecodeInfo.iDecodeBuffer.Append( KAtMsg );
+        _LIT( KAtPrefix, "AT" );
+        iParseInfo.iSendBuffer.Append( KAtPrefix );
         if ( !specialCmd )  // Already added with CheckSpecialCommand()
             {
             iParseInfo.iLimit += 2;  // Length of "AT"
@@ -926,17 +1152,44 @@
         // Note: The length of iDecodeBuffer is not exceeded here because "AT"
         // is added only for the second commands after that.
         }
-    TPtrC8 decodedCmd = iInputBuffer.Mid( startIndex, cmdLength );
-    iDecodeInfo.iDecodeBuffer.Append( decodedCmd );
-    // Set index for next round
+    iParseInfo.iSendBuffer.Append( &iLineBuffer[startIndex], cmdLength );
+    // Change settings for the next decode round
     iDecodeInfo.iFirstDecode = EFalse;
     iDecodeInfo.iDecodeIndex = endIndex + 1;
     RestoreOldDecodeInfo( aPeek, oldInfo );
-    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextDecodedCommand() complete") ));
+    if ( !aPeek )
+        {
+        iDecodeInfo.iCmdsHandled++;
+        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextSubCommand() (handled=%d)"), iDecodeInfo.iCmdsHandled ));
+        }
+    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextSubCommand() complete") ));
     return ETrue;
     }
 
 // ---------------------------------------------------------------------------
+// Finds the start of subcommand from line buffer
+// ---------------------------------------------------------------------------
+//
+TBool CDunAtCmdHandler::FindStartOfSubCommand()
+    {
+    FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfSubCommand()") ));
+    TInt i;
+    TInt foundIndex = KErrNotFound;
+    TInt lineLength = iLineBuffer.Length();
+    for ( i=iDecodeInfo.iDecodeIndex; i<lineLength; i++ )
+        {
+        TChar character = iLineBuffer[i];
+        if ( !IsDelimiterCharacter(character) )
+            {
+            foundIndex = i;
+            break;
+            }
+        }
+    FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfSubCommand() complete") ));
+    return foundIndex;
+    }
+
+// ---------------------------------------------------------------------------
 // Restores old decode info. For ExtractNextDecodedCommand() when aPeeks is
 // ETrue.
 // ---------------------------------------------------------------------------
@@ -954,32 +1207,10 @@
     }
 
 // ---------------------------------------------------------------------------
-// Finds end of an AT command
+// Tests for end of AT command line
 // ---------------------------------------------------------------------------
 //
-TInt CDunAtCmdHandler::FindEndOfCommand( TDesC8& aDes, TInt aStartIndex )
-    {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::FindEndOfCommand()") ));
-    TInt i;
-    TInt length = aDes.Length();
-    for ( i=aStartIndex; i<length; i++ )
-        {
-        TChar character = aDes[i];
-        if ( IsEndOfCommand(character) )
-            {
-            FTRACE(FPrint( _L("CDunAtCmdHandler::FindEndOfCommand() complete (%d)"), i ));
-            return i;
-            }
-        }
-    FTRACE(FPrint( _L("CDunAtCmdHandler::FindEndOfCommand() (not found) complete") ));
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
-// Tests for end of AT command character
-// ---------------------------------------------------------------------------
-//
-TBool CDunAtCmdHandler::IsEndOfCommand( TChar& aCharacter )
+TBool CDunAtCmdHandler::IsEndOfLine( TChar& aCharacter )
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::IsEndOfCommand()") ));
     if ( aCharacter==iCarriageReturn || aCharacter==iLineFeed )
@@ -992,29 +1223,6 @@
     }
 
 // ---------------------------------------------------------------------------
-// Finds start of a decoded AT command
-// ---------------------------------------------------------------------------
-//
-TInt CDunAtCmdHandler::FindStartOfDecodedCommand( TDesC8& aDes,
-                                                  TInt aStartIndex )
-    {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfDecodedCommand()") ));
-    TInt i;
-    TInt count = aDes.Length();
-    for ( i=aStartIndex; i<count; i++ )
-        {
-        TChar character = aDes[i];
-        if ( !IsDelimiterCharacter(character) )
-            {
-            FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfDecodedCommand() complete (%d)"), i ));
-            return i;
-            }
-        }
-    FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfDecodedCommand() (not found) complete") ));
-    return KErrNotFound;
-    }
-
-// ---------------------------------------------------------------------------
 // Checks if character is delimiter character
 // ---------------------------------------------------------------------------
 //
@@ -1052,22 +1260,22 @@
 // Checks special command
 // ---------------------------------------------------------------------------
 //
-TBool CDunAtCmdHandler::CheckSpecialCommand( TInt aStartIndex,
-                                             TInt& aEndIndex )
+TBool CDunAtCmdHandler::CheckSpecialCommand( TInt& aEndIndex )
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::CheckSpecialCommand()") ));
-    TInt atMsgLen = 0;
-    TInt newLength = iInputBuffer.Length() - aStartIndex;
-    TBuf8<KDunInputBufLength> upperBuf;
+    TInt atPrefixLen = 0;
+    TInt startIndex = iDecodeInfo.iDecodeIndex;
+    TInt newLength = iLineBuffer.Length() - startIndex;
+    TBuf8<KDunLineBufLength> upperBuf;
     if ( !iDecodeInfo.iFirstDecode )
         {
         // For cases such as "ATM1L3DT*99#" "DT" must have "AT"
-        _LIT8( KATMsg, "AT" );
-        upperBuf.Copy( KATMsg );
-        atMsgLen = 2;  // "AT"
-        newLength += atMsgLen;
+        _LIT8( KAtPrefix, "AT" );
+        upperBuf.Copy( KAtPrefix );
+        atPrefixLen = 2;  // "AT"
+        newLength += atPrefixLen;
         }
-    upperBuf.Append( &iInputBuffer[aStartIndex], newLength );
+    upperBuf.Append( &iLineBuffer[startIndex], newLength );
     upperBuf.UpperCase();
     TInt i;
     TInt count = iSpecials.Count();
@@ -1089,7 +1297,7 @@
         if ( cmpResult == 0 )
             {
             iParseInfo.iLimit = specialLength;
-            aEndIndex = (origLength-1) + aStartIndex - atMsgLen;
+            aEndIndex = (origLength-1) + startIndex - atPrefixLen;
             FTRACE(FPrint( _L("CDunAtCmdHandler::CheckSpecialCommand() complete") ));
             return ETrue;
             }
@@ -1191,9 +1399,25 @@
         {
         iDecodeInfo.iExtendedIndex = aEndIndex;
         SaveFoundCharDecodeState( aCharacter );
-        FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedBorder() (no border) complete") ));
+        FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedBorder() (no border normal) complete") ));
         return EFalse;
         }
+    // Now suspect border found so peek the next character after the suspected
+    // extended character. If it is not alphabetical character, return with EFalse.
+    // This case is to detect the cases such as "AT+VTS={*,3000}", where '*' would
+    // be the start of the next command in normal cases.
+    TInt peekIndex = aEndIndex + 1;
+    TInt lineLength = iLineBuffer.Length();
+    if ( peekIndex < lineLength )
+        {
+        TChar nextCharacter = iLineBuffer[peekIndex];
+        if ( !nextCharacter.IsAlpha() )
+            {
+            SaveFoundCharDecodeState( aCharacter );
+            FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedBorder() (no border special) complete") ));
+            return EFalse;
+            }
+        }
     aEndIndex--;
     FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedBorder() (border) complete") ));
     return ETrue;
@@ -1267,21 +1491,22 @@
 // Finds subcommand
 // ---------------------------------------------------------------------------
 //
-TInt CDunAtCmdHandler::FindSubCommand( TInt aStartIndex, TInt& aEndIndex )
+TInt CDunAtCmdHandler::FindSubCommand( TInt& aEndIndex )
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommand()") ));
-    aEndIndex = aStartIndex;
+    TInt startIndex = iDecodeInfo.iDecodeIndex;
+    aEndIndex = startIndex;
     TBool found = EFalse;
-    TInt length = iInputBuffer.Length();
+    TInt lineLength = iLineBuffer.Length();
     iDecodeInfo.iAssignFound = EFalse;
     iDecodeInfo.iInQuotes = EFalse;
     iDecodeInfo.iExtendedIndex = KErrNotFound;
     SaveNotFoundCharDecodeState();
     iAtSpecialCmdHandler->ResetComparisonBuffer();  // just to be sure
-    for ( ; aEndIndex<length; aEndIndex++ )
+    for ( ; aEndIndex<lineLength; aEndIndex++ )
         {
-        TChar character = iInputBuffer[aEndIndex];
-        found = FindSubCommandQuotes( character, aStartIndex, aEndIndex );
+        TChar character = iLineBuffer[aEndIndex];
+        found = FindSubCommandQuotes( character, startIndex, aEndIndex );
         if ( found )
             {
             continue;
@@ -1304,7 +1529,7 @@
         // AT+CMD+CMD [second + as delimiter]
         if ( IsExtendedCharacter(character) )
             {
-            found = IsExtendedBorder( character, aStartIndex, aEndIndex );
+            found = IsExtendedBorder( character, startIndex, aEndIndex );
             if ( !found )
                 {
                 continue;
@@ -1332,10 +1557,10 @@
 TBool CDunAtCmdHandler::IsASlashCommand()
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::IsASlashCommand()") ));
-    if ( iInputBuffer.Length() == 2 )
+    if ( iLineBuffer.Length() == 2 )
         {
-        if ( iInputBuffer[1] == '/' &&
-            (iInputBuffer[0] == 'A' || iInputBuffer[0] == 'a') )
+        if ( iLineBuffer[1] == '/' &&
+            (iLineBuffer[0] == 'A' || iLineBuffer[0] == 'a') )
             {
             FTRACE(FPrint( _L("CDunAtCmdHandler::IsASlashCommand() (found) complete") ));
             return ETrue;
@@ -1358,43 +1583,21 @@
         FTRACE(FPrint( _L("CDunAtCmdHandler::HandleASlashCommand() (no push) complete") ));
         return EFalse;
         }
+    iEndIndex = iInput->Length();  // Causes skipping of last '/' in ManageEndOfCmdHandling()
     // If "A/" command and last buffer exist, set the last buffer as the current buffer
     if ( iLastBuffer.Length() > 0 )
         {
-        iInputBuffer.Copy( iLastBuffer );
+        iLineBuffer.Copy( iLastBuffer );
         FTRACE(FPrint( _L("CDunAtCmdHandler::HandleASlashCommand() (copy) complete") ));
         return EFalse;
         }
-    // Last buffer not set so return "ERROR" if quiet mode not on
-    if ( iQuietOn )
-        {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleASlashCommand() (quiet) complete") ));
-        return EFalse;
-        }
+    // Last buffer not set so return "ERROR"
     iDownstream->NotifyDataPushRequest( &iErrorBuffer, NULL );
     FTRACE(FPrint( _L("CDunAtCmdHandler::HandleASlashCommand() complete") ));
     return ETrue;
     }
 
 // ---------------------------------------------------------------------------
-// Resets parse buffers
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdHandler::ResetParseBuffers( TBool aClearInput )
-    {
-    FTRACE(FPrint( _L("CDunAtCmdHandler::ResetParseBuffers()") ));
-    if ( aClearInput )
-        {
-        iInputBuffer.Zero();
-        }
-    iDecodeInfo.iFirstDecode = ETrue;
-    iDecodeInfo.iDecodeIndex = 0;
-    iDecodeInfo.iPrevExists = EFalse;
-    iDecodeInfo.iDecodeBuffer.Zero();
-    FTRACE(FPrint( _L("CDunAtCmdHandler::ResetParseBuffers() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
 // Manages command mode change
 // ---------------------------------------------------------------------------
 //
@@ -1585,7 +1788,7 @@
     if ( !nextContentFound )
         {
         iUpstream->NotifyEditorModeReply( aStart );
-        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEditorModeReply() complete") ));
+        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEditorModeReply() complete") ));
         return KErrNone;
         }
     // In block mode end the block mode by sending <ESC> and hope it works.
@@ -1608,22 +1811,23 @@
         FTRACE(FPrint( _L("CDunAtCmdHandler::FindNextContent() (skip) complete" ) ));
         return iEditorModeInfo.iContentFound;
         }
-    iEditorModeInfo.iContentFound = EFalse;
-    TInt foundCmdIndex = KErrNotFound;
-    TBool nextContentFound = ExtractNextDecodedCommand( ETrue );  // peek
-    if ( !nextContentFound )
+    // If iEndIndex is (>=0 && <iInput.Length()) it means more data waits in
+    // iInput that didn't fit in iInputBuffer. Only check FindStartOfCommand()
+    // if iEndIndex < 0, meaning more data is needed from CDunUpstream.
+    TBool contentFound = EFalse;
+    TInt cmdLength = iInput->Length();
+    TBool subBlock = ( iEndIndex>=0&&iEndIndex<cmdLength ) ? ETrue : EFalse;
+    if ( subBlock )
         {
-        // Check the next subblock
-        foundCmdIndex = FindStartOfNextCommand();
+        contentFound = ETrue;
         }
-    if ( !nextContentFound && foundCmdIndex<0 )
+    if ( !contentFound )
         {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::FindNextContent() (not found) complete") ));
-        return EFalse;
+        contentFound = ExtractNextSubCommand( ETrue );  // peek
         }
-    iEditorModeInfo.iContentFound = ETrue;
+    iEditorModeInfo.iContentFound = contentFound;
     FTRACE(FPrint( _L("CDunAtCmdHandler::FindNextContent() complete" ) ));
-    return ETrue;
+    return contentFound;
     }
 
 // ---------------------------------------------------------------------------
@@ -1642,7 +1846,7 @@
         FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfProcessing() (editor) complete" ) ));
         return KErrNone;
         }
-    HandleNextDecodedCommand();
+    HandleNextSubCommand();
     FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfProcessing() complete" ) ));
     return KErrNone;
     }
@@ -1653,13 +1857,11 @@
 // command line data
 // ---------------------------------------------------------------------------
 //
-TInt CDunAtCmdHandler::NotifyEndOfCmdLineProcessing()
+void CDunAtCmdHandler::NotifyEndOfCmdLineProcessing()
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfCmdLineProcessing()" ) ));
-    TInt retVal = Stop();
-    ManageEndOfCmdHandling( ETrue, EFalse, ETrue );
+    ManageEndOfCmdHandling( ETrue, ETrue );
     FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfCmdLineProcessing() complete" ) ));
-    return retVal;
     }
 
 // ---------------------------------------------------------------------------
@@ -1670,7 +1872,7 @@
 TBool CDunAtCmdHandler::NotifyNextCommandPeekRequest()
     {
     FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyNextCommandPeekRequest()") ));
-    TBool extracted = ExtractNextDecodedCommand( ETrue );
+    TBool extracted = ExtractNextSubCommand( ETrue );
     FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyNextCommandPeekRequest() complete") ));
     return extracted;
     }
--- a/localconnectivityservice/dun/atext/src/DunAtCmdPusher.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/atext/src/DunAtCmdPusher.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -103,19 +103,24 @@
 // Starts AT command handling
 // ---------------------------------------------------------------------------
 //
-TInt CDunAtCmdPusher::IssueRequest( TDesC8& aCommand, TBool aNormalMode )
+TInt CDunAtCmdPusher::IssueRequest( TDesC8& aInput, TBool aNormalMode )
     {
     FTRACE(FPrint( _L("CDunAtCmdPusher::IssueRequest()") ));
     FTRACE(FPrint( _L("CDunAtCmdPusher::IssueRequest() send ATEXT:") ));
-    FTRACE(FPrintRaw(aCommand) );
+    FTRACE(FPrintRaw(aInput) );
     if ( iAtPushState!=EDunStateIdle && aNormalMode )
         {
         FTRACE(FPrint( _L("CDunAtCmdPusher::IssueRequest() (not ready) complete") ));
         return KErrNotReady;
         }
+    if ( iDownstream->IsDataInQueue(&iRecvBuffer) )
+        {
+        FTRACE(FPrint( _L("CDunAtCmdPusher::IssueRequest() (in queue!) complete") ));
+        return KErrGeneral;
+        }
     iStatus = KRequestPending;
     iAtCmdExt->HandleCommand( iStatus,
-                              aCommand,
+                              aInput,
                               iRecvBuffer,
                               iReplyLeftPckg,
                               iReplyTypePckg );
@@ -132,6 +137,7 @@
 TInt CDunAtCmdPusher::Stop()
     {
     FTRACE(FPrint( _L("CDunAtCmdPusher::Stop()") ));
+    SetEndOfCmdLine();
     if ( iAtPushState != EDunStateAtCmdPushing )
         {
         FTRACE(FPrint( _L("CDunAtCmdHandler::Stop() (not ready) complete" )));
@@ -142,7 +148,6 @@
     // idle eventually), cancel the actual operation in DoCancel()
     Cancel();
     iAtPushState = EDunStateIdle;
-    SetEndOfCmdLine();
     FTRACE(FPrint( _L("CDunAtCmdPusher::Stop() complete") ));
     return KErrNone;
     }
@@ -480,8 +485,9 @@
     // First check if error or stop condition detected
     if ( iReplyType==EReplyTypeError || iStop )
         {
+        SetEndOfCmdLine();
+        iAtPushState = EDunStateIdle;
         iCallback->NotifyEndOfCmdLineProcessing();
-        iAtPushState = EDunStateIdle;
         FTRACE(FPrint( _L("CDunAtCmdPusher::NotifyDataPushComplete() (error reply) complete") ));
         return;
         }
--- a/localconnectivityservice/dun/plugins/src/bt/DunBtListen.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/plugins/src/bt/DunBtListen.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -343,11 +343,11 @@
         return KErrInUse;
         }
     aChannelNum = aListenSocket.LocalPort();
-    
+
     // We try to set the Telephony and Networking bits in our service class.  If this fails we
     // ignore it, as it's better to carry on without it than to fail to start listening.
-    (void)aListenSocket.SetOpt(KBTRegisterCodService, KSolBtRFCOMM, KCoDDunServiceClass);
-    
+    aListenSocket.SetOpt(KBTRegisterCodService, KSolBtRFCOMM, KCoDDunServiceClass);
+
     retTemp = aListenSocket.Listen( KListenQueSize );
     if ( retTemp != KErrNone )
         {
--- a/localconnectivityservice/dun/utils/inc/DunDataPusher.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/utils/inc/DunDataPusher.h	Thu Aug 19 10:46:39 2010 +0300
@@ -38,7 +38,7 @@
     /**
      * Data to push to the stream (not copied)
      */
-    const TDesC8 *iPushedData;
+    const TDesC8* iDataToPush;
 
     /**
      * Callback to call when data is processed by the stream
@@ -127,30 +127,30 @@
      * Adds event notification to queue
      *
      * @since S60 3.2
-     * @param aPushedData Data to push to the stream (not copied)
+     * @param aDataToPush Data to push to the stream (not copied)
      * @param aCallback Callback to call when data is processed by the stream
      * @return Symbian error code on error, KErrNone otherwise
      */
-    TInt AddToEventQueue( const TDesC8 *aPushedData,
+    TInt AddToEventQueue( const TDesC8* aDataToPush,
                           MDunCompletionReporter* aCallback );
 
     /**
      * Finds an event from queue
      *
      * @since S60 5.0
-     * @param aPushedData Data to push to the stream (not copied)
+     * @param aDataToPush Data to push to the stream (not copied)
      * @return Index of found event, Symbian error code otherwise
      */
-    TInt FindEventFromQueue( const TDesC8 *aPushedData );
+    TInt FindEventFromQueue( const TDesC8* aDataToPush );
 
     /**
      * Stops one event in the event queue
      *
      * @since S60 5.0
-     * @param aPushedData Data to push to the stream (not copied)
+     * @param aDataToPush Data to push to the stream (not copied)
      * @return Symbian error code on error, KErrNone otherwise
      */
-    TInt StopOneEvent( const TDesC8 *aPushedData );
+    TInt StopOneEvent( const TDesC8* aDataToPush );
 
     /**
      * Sends queued data in round robin
--- a/localconnectivityservice/dun/utils/inc/DunDownstream.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/utils/inc/DunDownstream.h	Thu Aug 19 10:46:39 2010 +0300
@@ -73,14 +73,23 @@
      * Gets called when outside party wants to push data to the existing stream
      *
      * @since S60 5.0
-     * @param aPushedData Data to push to the stream (not copied)
+     * @param aDataToPush Data to push to the stream (not copied)
      * @param aCallback Callback to call when data is processed by the stream
      * @return Symbian error code on error, KErrNone otherwise
      */
     virtual TInt NotifyDataPushRequest(
-        const TDesC8 *aPushedData,
+        const TDesC8* aDataToPush,
         MDunCompletionReporter* aCallback ) = 0;
 
+    /**
+     * Checks if data is in queue
+     *
+     * @since TB9.2
+     * @param aDataToPush Data to check
+     * @return ETrue if data is in queue, EFalse otherwise
+     */
+    virtual TBool IsDataInQueue( const TDesC8 *aDataToPush ) = 0;
+
     };
 
 /**
@@ -146,14 +155,23 @@
     TInt InitializeForDataPushing( MDunAtCmdHandler* aAtCmdHandler );
 
     /**
+     * Checks if data is in queue
+     *
+     * @since TB9.2
+     * @param aDataToPush Data to check
+     * @return ETrue if data is in queue, EFalse otherwise
+     */
+    TBool IsDataInQueue( const TDesC8* aDataToPush );
+
+    /**
      * Adds data to event queue and starts sending if needed
      *
      * @since S60 5.0
-     * @param aPushedData Data to push to the stream (not copied)
+     * @param aDataToPush Data to push to the stream (not copied)
      * @param aCallback Callback to call when data is processed by the stream
      * @return Symbian error code on error, KErrNone otherwise
      */
-    TInt AddToQueueAndSend( const TDesC8 *aPushedData,
+    TInt AddToQueueAndSend( const TDesC8* aDataToPush,
                             MDunCompletionReporter* aCallback );
 
 private:
@@ -204,11 +222,11 @@
      * Gets called when outside party wants to push data to the existing stream
      *
      * @since S60 3.2
-     * @param aPushedData Data to push to the stream (not copied)
+     * @param aDataToPush Data to push to the stream (not copied)
      * @param aCallback Callback to call when data is processed by the stream
      * @return Symbian error code on error, KErrNone otherwise
      */
-    TInt NotifyDataPushRequest( const TDesC8 *aPushedData,
+    TInt NotifyDataPushRequest( const TDesC8* aDataToPush,
                                 MDunCompletionReporter* aCallback );
 
 // from base class MDunCompletionReporter
--- a/localconnectivityservice/dun/utils/inc/DunUpstream.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/utils/inc/DunUpstream.h	Thu Aug 19 10:46:39 2010 +0300
@@ -77,17 +77,7 @@
     TBool iDataMode;
 
     /**
-     * Flag to indicate whether AT parsing is needed or not
-     */
-    TBool iParseNeeded;
-
-    /**
-     * Flag to be set when AT command handling starts
-     */
-    TBool iHandling;
-
-    /**
-     * AT Command handler. Used if iAtParseNeeded is ETrue
+     * AT Command handler.
      */
     CDunAtCmdHandler* iAtCmdHandler;
 
@@ -270,21 +260,12 @@
 // from base class MDunAtCmdStatusReporter
 
     /**
-     * Notifies about AT command handling start
+     * Notifies about parser's need to get more data
      *
-     * @since S60 5.0
+     * @since TB9.2
      * @return None
      */
-    void NotifyAtCmdHandlingStart();
-
-    /**
-     * Notifies about AT command handling end
-     *
-     * @since S60 5.0
-     * @param aEndIndex Index to the start of next command
-     * @return None
-     */
-    void NotifyAtCmdHandlingEnd( TInt aStartIndex );
+    void NotifyParserNeedsMoreData();
 
     /**
      * Notifies about editor mode reply
--- a/localconnectivityservice/dun/utils/src/DunDataPusher.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/utils/src/DunDataPusher.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -99,17 +99,17 @@
 // Adds event notification to queue
 // ---------------------------------------------------------------------------
 //
-TInt CDunDataPusher::AddToEventQueue( const TDesC8 *aPushedData,
+TInt CDunDataPusher::AddToEventQueue( const TDesC8* aDataToPush,
                                       MDunCompletionReporter* aCallback )
     {
     FTRACE(FPrint( _L("CDunDataPusher::AddToQueue()" )));
-    if ( !aPushedData || aPushedData->Length()<0 )
+    if ( !aDataToPush || aDataToPush->Length()<0 )
         {
         FTRACE(FPrint( _L("CDunDataPusher::AddToQueue() (unknown data) complete" )));
         return KErrGeneral;
         }
     // Check if identical pointer to data already exists
-    TInt foundIndex = FindEventFromQueue( aPushedData );
+    TInt foundIndex = FindEventFromQueue( aDataToPush );
     if ( foundIndex >= 0 )
         {
         FTRACE(FPrint( _L("CDunDataPusher::AddToQueue() (already exists) complete" )));
@@ -117,7 +117,7 @@
         }
     // Unique pointer -> add to event queue
     TDunDataPush dataPush;
-    dataPush.iPushedData = aPushedData;
+    dataPush.iDataToPush = aDataToPush;
     dataPush.iCallback = aCallback;
     TInt retTemp = iEventQueue.Append( dataPush );
     if ( retTemp != KErrNone )
@@ -125,7 +125,7 @@
         FTRACE(FPrint( _L("CDunDataPusher::AddToQueue() (append failed!) complete" )));
         return retTemp;
         }
-    FTRACE(FPrint( _L("CDunDataPusher::AddToQueue() complete (%d)" ), iEventQueue.Count() ));
+    FTRACE(FPrint( _L("CDunDataPusher::AddToQueue() complete (count=%d)" ), iEventQueue.Count() ));
     return KErrNone;
     }
 
@@ -133,14 +133,14 @@
 // Finds an event from queue
 // ---------------------------------------------------------------------------
 //
-TInt CDunDataPusher::FindEventFromQueue( const TDesC8 *aPushedData )
+TInt CDunDataPusher::FindEventFromQueue( const TDesC8* aDataToPush )
     {
     FTRACE(FPrint( _L("CDunDataPusher::FindEventFromQueue()" )));
     TInt i;
     TInt count = iEventQueue.Count();
     for ( i=0; i<count; i++ )
         {
-        if ( iEventQueue[i].iPushedData == aPushedData )
+        if ( iEventQueue[i].iDataToPush == aDataToPush )
             {
             FTRACE(FPrint( _L("CDunDataPusher::FindEventFromQueue() complete" )));
             return i;
@@ -154,15 +154,15 @@
 // Stops one event in the event queue
 // ---------------------------------------------------------------------------
 //
-TInt CDunDataPusher::StopOneEvent( const TDesC8 *aPushedData )
+TInt CDunDataPusher::StopOneEvent( const TDesC8* aDataToPush )
     {
     FTRACE(FPrint( _L("CDunDataPusher::StopOneEvent()" )));
-    if ( !aPushedData )
+    if ( !aDataToPush )
         {
         FTRACE(FPrint( _L("CDunDataPusher::StopOneEvent() (unknown data) complete" )));
         return KErrGeneral;
         }
-    TInt foundIndex = FindEventFromQueue( aPushedData );
+    TInt foundIndex = FindEventFromQueue( aDataToPush );
     if ( foundIndex >= 0 )
         {
         if ( iEventIndex == foundIndex )
@@ -334,17 +334,18 @@
         FTRACE(FPrint( _L("CDunDataPusher::ManageOneEvent() (buffer mismatch) complete" )));
         return KErrGeneral;
         }
-    iStatus = KRequestPending;
-    const TDesC8 *pushedData = iEventQueue[iEventIndex].iPushedData;
+    const TDesC8* dataToPush = iEventQueue[iEventIndex].iDataToPush;
     if ( iComm )
         {
-        iComm->Write( iStatus, *pushedData );
-        FTRACE(FPrint( _L("CDunDataPusher::ManageOneEvent() RComm Write() requested" ) ));
+        iStatus = KRequestPending;
+        iComm->Write( iStatus, *dataToPush );
+        FTRACE(FPrint( _L("CDunDataPusher::ManageOneEvent() RComm Write() requested (buffer=0x%08X)" ), dataToPush ));
         }
     else if ( iSocket )
         {
-        iSocket->Send( *pushedData, 0, iStatus );
-        FTRACE(FPrint( _L("CDunDataPusher::ManageOneEvent() RSocket Send() requested" ) ));
+        iStatus = KRequestPending;
+        iSocket->Send( *dataToPush, 0, iStatus );
+        FTRACE(FPrint( _L("CDunDataPusher::ManageOneEvent() RSocket Send() requested (buffer=0x%08X)" ), dataToPush ));
         }
     else
         {
@@ -385,7 +386,7 @@
 //
 void CDunDataPusher::RunL()
     {
-    FTRACE(FPrint( _L("CDunDataPusher::RunL()" )));
+    FTRACE(FPrint( _L("CDunDataPusher::RunL() (buffer=0x%08X)" ), iEventQueue[iEventIndex].iDataToPush ));
 
     TBool isError;
     TInt retTemp = iStatus.Int();
--- a/localconnectivityservice/dun/utils/src/DunDownstream.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/utils/src/DunDownstream.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -116,10 +116,27 @@
     }
 
 // ---------------------------------------------------------------------------
+// Checks if data is in queue
+// ---------------------------------------------------------------------------
+//
+TBool CDunDownstream::IsDataInQueue( const TDesC8* aDataToPush )
+    {
+    FTRACE(FPrint( _L("CDunDownstream::IsDataInQueue()" ) ));
+    if ( !iPushData.iDataPusher )
+        {
+        FTRACE(FPrint( _L("CDunDownstream::IsDataInQueue() (iPushData.iDataPusher not initialized!) complete" )));
+        return EFalse;
+        }
+    TInt foundIndex = iPushData.iDataPusher->FindEventFromQueue( aDataToPush );
+    FTRACE(FPrint( _L("CDunDownstream::IsDataInQueue() complete" ) ));
+    return ( foundIndex >= 0 ) ? ETrue : EFalse;
+    }
+
+// ---------------------------------------------------------------------------
 // Adds data to event queue and starts sending if needed
 // ---------------------------------------------------------------------------
 //
-TInt CDunDownstream::AddToQueueAndSend( const TDesC8 *aPushedData,
+TInt CDunDownstream::AddToQueueAndSend( const TDesC8* aDataToPush,
                                         MDunCompletionReporter* aCallback )
     {
     FTRACE(FPrint( _L("CDunDownstream::AddToQueueAndSend()" ) ));
@@ -129,7 +146,7 @@
         return KErrGeneral;
         }
     // Add to event queue. If something went wrong, just return
-    TInt retTemp = iPushData.iDataPusher->AddToEventQueue( aPushedData, aCallback );
+    TInt retTemp = iPushData.iDataPusher->AddToEventQueue( aDataToPush, aCallback );
     if ( retTemp != KErrNone )
         {
         FTRACE(FPrint( _L("CDunDownstream::AddToQueueAndSend() (ERROR) complete" )));
@@ -149,6 +166,7 @@
 TInt CDunDownstream::StartStream()
     {
     FTRACE(FPrint( _L("CDunDownstream::StartStream()" ) ));
+    FTRACE(FPrint( _L("CDunDownstream::StartStream() (buffer=0x%08X)" ), iBufferPtr ));
     // Note: only start URC here.
     // The downstream read request is started when command mode ends.
     // This is done to make the data arrive in the correct order (reply vs.
@@ -363,13 +381,13 @@
 // Gets called when outside party wants to push data to the existing stream
 // ---------------------------------------------------------------------------
 //
-TInt CDunDownstream::NotifyDataPushRequest( const TDesC8 *aPushedData,
+TInt CDunDownstream::NotifyDataPushRequest( const TDesC8* aDataToPush,
                                             MDunCompletionReporter* aCallback )
     {
     FTRACE(FPrint( _L("CDunDownstream::NotifyDataPushRequest()" )));
     // If in data mode push the reply anyway as "CONNECT" or "NO CARRIER"
     // reply could arrive before/after the command mode information itself.
-    TInt retVal = AddToQueueAndSend( aPushedData, aCallback );
+    TInt retVal = AddToQueueAndSend( aDataToPush, aCallback );
     FTRACE(FPrint( _L("CDunDownstream::NotifyDataPushRequest() complete" )));
     return retVal;
     }
--- a/localconnectivityservice/dun/utils/src/DunNoteHandler.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/utils/src/DunNoteHandler.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -19,7 +19,7 @@
 #include <bautils.h>
 #include <featmgr.h>
 #include <aknSDData.h>
-#include <SecondaryDisplay/dunsecondarydisplayapi.h>
+#include <secondarydisplay/dunsecondarydisplayapi.h>
 #include "DunNoteHandler.h"
 #include "DunDebug.h"
 
--- a/localconnectivityservice/dun/utils/src/DunUpstream.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/dun/utils/src/DunUpstream.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -124,8 +124,6 @@
     atCmdHandler->AddCmdModeCallback( aCallbackUp );
     atCmdHandler->AddCmdModeCallback( aCallbackDown );
     iParseData.iDataMode = EFalse;
-    iParseData.iParseNeeded = ETrue;
-    iParseData.iHandling = EFalse;
     iParseData.iAtCmdHandler = atCmdHandler;
     FTRACE(FPrint( _L("CDunUpstream::InitializeForAtParsing() complete" ) ));
     return KErrNone;
@@ -245,8 +243,6 @@
     iActivityData.iDataRead = EFalse;
     iActivityData.iNotified = EFalse;
     iParseData.iDataMode = EFalse;
-    iParseData.iParseNeeded = EFalse;
-    iParseData.iHandling = EFalse;
     iParseData.iAtCmdHandler = NULL;
     }
 
@@ -323,7 +319,7 @@
     {
     FTRACE(FPrint( _L("CDunUpstream::ProcessReadData()" )));
     // The following will be transferred to Dataport
-    if ( iParseData.iDataMode || !iParseData.iParseNeeded )
+    if ( iParseData.iDataMode )
         {
         iOperationType = EDunOperationTypeWrite;
         FTRACE(FPrint( _L("CDunUpstream::ProcessReadData() (next write) complete" )));
@@ -336,14 +332,16 @@
         }
     // The following will be transferred to parser
     TInt retTemp = KErrNone;
-    TBool partialInput = EFalse;
-    retTemp = iParseData.iAtCmdHandler->ParseCommand( *iBufferPtr,
-                                                      partialInput );
-    if ( retTemp!=KErrNone || !partialInput )
+    TBool moreNeeded = EFalse;
+    retTemp = iParseData.iAtCmdHandler->AddDataForParsing( *iBufferPtr,
+                                                           moreNeeded );
+    if ( retTemp!=KErrNone || !moreNeeded )
         {
+        // If error or no error but no more data needed, don't reissue
         FTRACE(FPrint( _L("CDunUpstream::ProcessReadData() (no reissue) complete" )));
         return EFalse;
         }
+    // If no error and more data needed, reissue
     FTRACE(FPrint( _L("CDunUpstream::ProcessReadData() (reissue) complete" )));
     return ETrue;
     }
@@ -446,56 +444,14 @@
 
 // ---------------------------------------------------------------------------
 // From class MDunAtCmdStatusReporter
-// Notifies about AT command handling start
-// ---------------------------------------------------------------------------
-//
-void CDunUpstream::NotifyAtCmdHandlingStart()
-    {
-    FTRACE(FPrint( _L("CDunUpstream::NotifyAtCmdHandlingStart()" )));
-    if ( iParseData.iHandling )
-        {
-        FTRACE(FPrint( _L("CDunUpstream::NotifyAtCmdHandlingStart() (already set!)" )));
-        }
-    iParseData.iHandling = ETrue;
-    FTRACE(FPrint( _L("CDunUpstream::NotifyAtCmdHandlingStart() complete" )));
-    }
-
-// ---------------------------------------------------------------------------
-// From class MDunAtCmdStatusReporter
-// Notifies about AT command handling end
+// Notifies about parser's need to get more data
 // ---------------------------------------------------------------------------
 //
-void CDunUpstream::NotifyAtCmdHandlingEnd( TInt aStartIndex )
+void CDunUpstream::NotifyParserNeedsMoreData()
     {
-    FTRACE(FPrint( _L("CDunUpstream::NotifyAtCmdHandlingEnd()" )));
-    if ( !iParseData.iHandling )
-        {
-        FTRACE(FPrint( _L("CDunUpstream::NotifyAtCmdHandlingEnd() (already set!)" )));
-        }
-    iParseData.iHandling = EFalse;
-    // Next check the offset to the next command inside this block
-    TInt length = iBufferPtr->Length();
-    if ( aStartIndex < 0 )
-        {
-        // Start of the next command not found so here we need to just reissue
-        // the read request and not clear the input buffer.
-        iParseData.iAtCmdHandler->SetEndOfCmdLine( EFalse );
-        IssueRequest();  // iOperationType must be read here (don't set)
-        FTRACE(FPrint( _L("CDunUpstream::NotifyAtCmdHandlingEnd() (not found) complete" )));
-        return;
-        }
-    // Here the start of next command was found so try to directly handle that
-    // command using ProcessReadData() for the next subblock.
-    iParseData.iAtCmdHandler->SetEndOfCmdLine( ETrue );
-    TInt maxLength = iBufferPtr->MaxLength();
-    iBufferPtr->Set( &(*iBufferPtr)[aStartIndex], length-aStartIndex, maxLength );
-    TBool reIssue = ProcessReadData();
-    if ( reIssue )
-        {
-        // Note: should come here only if something went wrong
-        IssueRequest();
-        }
-    FTRACE(FPrint( _L("CDunUpstream::NotifyAtCmdHandlingEnd() complete" )));
+    FTRACE(FPrint( _L("CDunUpstream::NotifyParserNeedsMoreData()" )));
+    IssueRequest();  // iOperationType must be read here (don't set)
+    FTRACE(FPrint( _L("CDunUpstream::NotifyParserNeedsMoreData() complete" )));
     }
 
 // ---------------------------------------------------------------------------
--- a/localconnectivityservice/obexreceiveservices/bip/src/BIPController.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/obexreceiveservices/bip/src/BIPController.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -293,8 +293,22 @@
     
     if (iBTObject)
         {
-        iTotalSizeByte = iBTObject->Length();     // get size of receiving file
+        if(iBTTransferState == ETransferPutDiskError)
+            {
+            return KErrDiskFull;
+            }
+        
+        if(iBTObject->Name().Length() > KMaxFileName)
+            {
+            TRACE_INFO( _L( "[oppreceiveservice] COPPController: PutPacketIndication truncating name of file being received\t" ) );
+            TRAPD(err, iBTObject->SetNameL(iBTObject->Name().Left(KMaxFileName)));
+            if(err != KErrNone)
+                {
+                return KErrAccessDenied;
+                }
+            }     
         iReceivingFileName = iBTObject->Name();   // get name of receiving file
+        iTotalSizeByte = iBTObject->Length();     // get size of receiving file                       
         
         // Check that capacity is suitable as soon as possible
         if(!iLengthHeaderReceived && iTotalSizeByte > 0)
@@ -312,14 +326,8 @@
                 return KErrDiskFull;
                 }
             }
-        if(iBTObject->Name().Length() > KMaxFileName)
-            {
-            return KErrAccessDenied;
-            }
-        if(iBTTransferState == ETransferPutDiskError)
-            {
-            return KErrDiskFull;
-            }
+        
+        
         // successfully received put packet if we reached here
         iBTTransferState = ETransferPut;
         
--- a/localconnectivityservice/obexreceiveservices/opp/src/oppcontroller.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/obexreceiveservices/opp/src/oppcontroller.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -106,7 +106,7 @@
 void COPPController::AbortIndication()
 	{
 	TRACE_FUNC
-	HandleError(ETrue); // true because explicit abort
+	HandleError(EFalse); // false because note about receiving failed should appear
 	}
 
 void COPPController::HandleError(TBool aAbort)
@@ -484,7 +484,7 @@
         User::Leave(KErrGeneral);
         }
     
-    User::LeaveIfError(iFile.Open(iFs,iFullPathFilename,EFileWrite));   
+    User::LeaveIfError(iFile.Open(iFs,iFullPathFilename,EFileWrite|EFileShareReadersOrWriters));   
     TObexRFileBackedBuffer bufferdetails(*iBuf,iFile,CObexBufObject::EDoubleBuffering);    
     
     TRAPD(err, iObexObject->SetDataBufL( bufferdetails) );
--- a/localconnectivityservice/obexsendservices/obexservicesendutils/src/BTServiceClient.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/obexsendservices/obexservicesendutils/src/BTServiceClient.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -25,12 +25,12 @@
 #include "BTConnectionTimer.h"
 #include "BTSUDebug.h"
 
-const TUint16 KMtuSizeReceiv    = 0xFFFF;  // 64kB
-const TUint16 KMtuSizeTrans     = 0x3000;  // 12kB 
-const TInt    KBufferSize       = 0x4000;  // 16kB
+const TUint16 KMtuSizeReceiv    = 0xFFFF;	// 64kB - 1 (65535)
+const TUint16 KMtuSizeTrans     = 0x8000;	// 32kB
+const TInt    KBufferSize       = 0x8000;	// 32kB
 
-const TInt KBTConnectionTimeout = 20000000; // 20 seconds
-const TInt KBTAbortTimeout      = 2000000;  // 20 seconds
+const TInt KBTConnectionTimeout = 20 * 1000 * 1000;	// 20 seconds
+const TInt KBTAbortTimeout      = 2 * 1000 * 1000;	// 2 seconds
 
 // CONSTANTS
 
@@ -403,7 +403,8 @@
 
     FTRACE(FPrint(_L("[BTSU]\t CBTServiceClient::GetProgressStatus() completed, bytes sent %d"), iTotalBytesSent + bytesSent ) );
 
-    return iTotalBytesSent + bytesSent;
+   // return iTotalBytesSent + bytesSent;
+    return bytesSent;
     }
 
 // -----------------------------------------------------------------------------
--- a/localconnectivityservice/obexserviceman/utils/inc/obexutilsentryhandler.h	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/obexserviceman/utils/inc/obexutilsentryhandler.h	Thu Aug 19 10:46:39 2010 +0300
@@ -54,19 +54,7 @@
      */
     TInt AddEntryAttachment(const TDesC &aFilePath, CMsvAttachment* anAttachInfo, CMsvStore* aStore );
     
-    /**
-     * Update an entry attachment
-     * @since S60 v5.0
-     * @param aFilePath the absolute file path of the linked attachment file.
-     * @param anAttachInfo the attachment info associated with the file.
-     * @param aStore An interface ove the message store that is associated with a message entry.
-     * @return error code
-     */
-    TInt UpdateEntryAttachment(TFileName& aFileName,
-                              CMsvAttachment* anOldAttachInfo,
-                              CMsvAttachment* aNewAttachInfo,
-                              CMsvStore* aStore );
-    
+   
     // from base class CActive
          
     /**
@@ -97,23 +85,6 @@
      */ 
     void ConstructL();
 
-    /**
-     * Add link attachment 
-     * 
-     * @since S60 v5.0
-     */
-    void DoAddEntryAttachmentL(const TDesC &aFilePath, CMsvAttachment* anAttachInfo, CMsvStore* aStore);
-    
-   
-    /**
-     * Update link attachment 
-     * 
-     * @since S60 v5.0
-     */
-    void DoUpdateEntryAttachmentL(TFileName& aFileName,
-                                 CMsvAttachment* anOldAttachInfo,
-                                 CMsvAttachment* aNewAttachInfo,
-                                 CMsvStore* aStore);
     
 private: // member data
 
--- a/localconnectivityservice/obexserviceman/utils/src/obexutilsentryhandler.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/obexserviceman/utils/src/obexutilsentryhandler.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -81,7 +81,8 @@
     
     iStatus = KRequestPending;
   
-    TRAPD(error, DoAddEntryAttachmentL(aFilePath, anAttachInfo, aStore));
+    TRAPD(error, aStore->AttachmentManagerL().AddLinkedAttachmentL(aFilePath,anAttachInfo, iStatus););
+    
     if (error != KErrNone )
         {        
         //Complete request
@@ -98,76 +99,6 @@
 
 
 // ---------------------------------------------------------------------------
-// DoAddLinkAttachmentL()
-// ---------------------------------------------------------------------------
-//
-void CObexutilsEntryhandler::DoAddEntryAttachmentL(
-    const TDesC &aFilePath, 
-    CMsvAttachment* anAttachInfo, 
-    CMsvStore* aStore)
-    {
-    FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::DoAddEntryAttachmentL()"));   
-        
-    aStore->AttachmentManagerL().AddLinkedAttachmentL(aFilePath,anAttachInfo, iStatus);
-    
-    //Complete request
-    TRequestStatus* status = &iStatus;
-    User::RequestComplete(status, KErrNone);
-        
-    FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::DoAddEntryAttachmentL() completed"));  
-    }
-
-// ---------------------------------------------------------------------------
-// UpdateLinkAttachment()
-// ---------------------------------------------------------------------------
-//
-TInt CObexutilsEntryhandler::UpdateEntryAttachment(
-    TFileName& aFileName,
-    CMsvAttachment* anOldAttachInfo,
-    CMsvAttachment* aNewAttachInfo,
-    CMsvStore* aStore)
-    {
-    FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::UpdateEntryAttachment()"));       
-    
-    iStatus = KRequestPending;
-  
-    TRAPD(error, DoUpdateEntryAttachmentL(aFileName,anOldAttachInfo, aNewAttachInfo, aStore));
-    if (error != KErrNone )
-        {        
-        //Complete request
-        TRequestStatus* status = &iStatus;
-        User::RequestComplete(status, error);
-        }
-       
-    SetActive();
-    iSyncWaiter.Start();
-          
-    FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::UpdateEntryAttachment() Done"));
-    return iStatus.Int();
-    }
-
-// ---------------------------------------------------------------------------
-// DoUpdateEntryAttachmentL()
-// ---------------------------------------------------------------------------
-//
-void CObexutilsEntryhandler::DoUpdateEntryAttachmentL(
-    TFileName& aFileName,
-    CMsvAttachment* anOldAttachInfo,
-    CMsvAttachment* aNewAttachInfo,
-    CMsvStore* aStore)
-    {
-    FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::DoUpdateEntryAttachmentL()"));   
-    aStore->AttachmentManagerL().RemoveAttachmentL(anOldAttachInfo->Id(), iStatus);
-    aStore->AttachmentManagerL().AddLinkedAttachmentL(aFileName,aNewAttachInfo, iStatus);
-   
-    //Complete request
-    TRequestStatus* status = &iStatus;
-    User::RequestComplete(status, KErrNone);
-        
-    FLOG(_L("[OBEXUTILS]\t CObexutilsEntryhandler::DoUpdateEntryAttachmentL() completed"));  
-    }
-
-// ---------------------------------------------------------------------------
 // From class CActive.
 // RunL()
 // ---------------------------------------------------------------------------
--- a/localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/obexserviceman/utils/src/obexutilslaunchwaiter.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -117,19 +117,20 @@
         }// EMsvFile
     
     if ( attachInfo->Type() == CMsvAttachment::EMsvLinkedFile )
-        {
-        CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC();  // 4th push
-        TAiwGenericParam paramSave(EGenericParamFileSaved, ETrue);
-        paramList->AppendL( paramSave );
-        
+        {     
         if ( eikEnv )
-            {            
-            iDocumentHandler = CDocumentHandler::NewL( eikEnv->Process() );
-            iDocumentHandler->SetExitObserver( this );
+            {                        
             RFs rfs;
             User::LeaveIfError( rfs.Connect() );
             if ( BaflUtils::FileExists( rfs, filePath ) )                                 
                 {
+                CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC();  // 4th push
+                TAiwGenericParam paramSave(EGenericParamFileSaved, ETrue);
+                paramList->AppendL( paramSave );
+            
+                iDocumentHandler = CDocumentHandler::NewL( eikEnv->Process() );
+                iDocumentHandler->SetExitObserver( this );
+                
                 RFile64 shareableFile;
                 TRAP( error, iDocumentHandler->OpenTempFileL(filePath,shareableFile));
                 if ( error == KErrNone)
@@ -137,19 +138,17 @@
                     TRAP( error, iDocumentHandler->OpenFileEmbeddedL( shareableFile, dataType, *paramList));
                     }
                 shareableFile.Close();
+                CleanupStack::PopAndDestroy(); // paramList 
                 
                 if ( error == KErrNotSupported )  
-                    {                    
-                    delete iDocumentHandler;
-                    iDocumentHandler = NULL;
-                    
+                    {                                                            
                     const TInt sortMethod = 2;  // 0 = 'By name', 1 = 'By type', 
                                                 // 2 = 'Most recent first' and 3 = 'Largest first'
                     TRAP (error, TObexUtilsUiLayer::LaunchFileManagerL( filePath, 
                                                                         sortMethod, 
-                                                                        ETrue )); // ETrue -> launch file manager in embedded mode.
-                    isCompleteSelf = ETrue;
+                                                                        ETrue )); // ETrue -> launch file manager in embedded mode.                    
                     }  // KErrNotSupported
+                isCompleteSelf = ETrue;                                         
                 }            
             else 
                 {
@@ -172,9 +171,7 @@
                 }  
            
             rfs.Close();
-            } // eikEnv
-        
-        CleanupStack::PopAndDestroy(); // paramList                                     
+            } // eikEnv                                          
         } // EMsvLinkedFile
      
     
--- a/localconnectivityservice/obexserviceman/utils/src/obexutilsmessagehandler.cpp	Thu Jul 15 19:38:28 2010 +0300
+++ b/localconnectivityservice/obexserviceman/utils/src/obexutilsmessagehandler.cpp	Thu Aug 19 10:46:39 2010 +0300
@@ -333,19 +333,23 @@
         FLOG(_L("[OBEXUTILS]\t RecogniseObjectsL() MIME check failed"));
         }
     CleanupStack::PopAndDestroy();  // lsSess
+    
     HBufC* buf16 = HBufC::NewLC(mimeType.Length());
     buf16->Des().Copy(mimeType);
     TPtrC mimeType16(buf16->Des());
     CleanupStack::PopAndDestroy();   //   buf16
     
-    CUpdateMusicCollection* updateMusicCollection = CUpdateMusicCollection::NewL() ;
+    CUpdateMusicCollection* updateMusicCollection = CUpdateMusicCollection::NewL();
+    CleanupStack::PushL(updateMusicCollection);    
     if (updateMusicCollection->isSupported(mimeType16))
         {
         updateMusicCollection->addToCollectionL(aFileName);
         }
+    CleanupStack::PopAndDestroy();  // updateMusicCollection
     
     aAttachInfo->SetMimeTypeL( mimeType );
     
+    
     FLOG(_L("[OBEXUTILS]\t RecogniseObjectsL() completed"));
     }
 
@@ -927,7 +931,7 @@
     //
     TUint setAttMask(0);
     TUint clearAttMask(0);
-    User::LeaveIfError(aFile.Open(fsSess,tempFullName,EFileWrite));
+    User::LeaveIfError(aFile.Open(fsSess,tempFullName,EFileWrite|EFileShareReadersOrWriters));
     User::LeaveIfError(aFile.SetAtt(setAttMask , clearAttMask | KEntryAttHidden));
     aFile.Close();
     
@@ -1000,7 +1004,7 @@
         FLOG(_L("[OBEXUTILS]\t TObexUtilsMessageHandler::AddEntryToInboxL() BIO"));
     
         RFile file;
-        User::LeaveIfError(file.Open(fsSess,aFullName,EFileRead));
+        User::LeaveIfError(file.Open(fsSess,aFullName,EFileRead|EFileShareReadersOrWriters));
         TReceivedData receivedData;
         receivedData.bytesReceived = fileEntry.iSize;
         receivedData.recTime = fileEntry.iModified;
@@ -1056,37 +1060,40 @@
     TFileName& aFullName,
     CMsvEntry* aParentEntry)
     {
+    
     FLOG(_L("[OBEXUTILS]\t TObexUtilsMessageHandler::UpdateEntryAttachmentL() "));
     CDummySessionObserver* sessionObs;
     CMsvSession* msvSession;
     CreateMsvSessionLC(sessionObs, msvSession);
     // 1st, 2nd push
-      
+    
     CMsvEntry* attachEntry = msvSession->GetEntryL(((*aParentEntry)[0]).Id());
     CleanupStack::PushL(attachEntry); // 3th push
-            
+          
     CMsvStore* store = attachEntry->EditStoreL();
     CleanupStack::PushL( store );  // 4th push
-  
+   
     CObexutilsEntryhandler* entryHandler = CObexutilsEntryhandler::NewL();
     CleanupStack::PushL(entryHandler);  // 5th push  
     
     // Note:
     // Because setFilePath() in CMsvAttachment is not implementated by Symbian yet, 
     // we have to delete the original attachment and add another new one to fix the broken link.
-    //
-    
+    //    
     // remove the old attachment first.
     //
     store->AttachmentManagerExtensionsL().RemoveAttachmentL(0);
+
     // Create a new attachment.
     //
+    
     CMsvAttachment* attachInfo = CMsvAttachment::NewL(CMsvAttachment::EMsvLinkedFile);
     CleanupStack::PushL(attachInfo);  // 6th  push
     
     // Get mime type
     //
     RecogniseObjectsL(aFullName, attachInfo);
+   
     RFs& fsSess = msvSession->FileSession();
     
     TParse fileNameParser;
@@ -1099,10 +1106,11 @@
     entryHandler->AddEntryAttachment(aFullName,attachInfo, store);
     CleanupStack::Pop(attachInfo);   // attachInfo, Pass ownership to store
     CleanupStack::PopAndDestroy(entryHandler);  // entryHandler
-    FinaliseMessageL(aParentEntry, store,fileEntry, fileNameParser);
+    FinaliseMessageL(aParentEntry, store,fileEntry, fileNameParser);    
     CleanupStack::PopAndDestroy(4);   // store, 
-                                      // attachEntry, msvSession, sessionObs
+                                      // attachEntry, msvSession, sessionObs                                                                                    
     FLOG(_L("[OBEXUTILS]\t TObexUtilsMessageHandler::UpdateEntryAttachmentL() completed "));
+    
     }