localconnectivityservice/dun/atext/src/DunAtCmdPusher.cpp
branchRCL_3
changeset 39 4096754ee773
parent 38 3dcb815346df
child 40 52a167391590
--- a/localconnectivityservice/dun/atext/src/DunAtCmdPusher.cpp	Thu Aug 19 10:46:39 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,521 +0,0 @@
-/*
-* Copyright (c) 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"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  AT command pusher for downstream
-*
-*/
-
-/*
- * Filtering categories for multiple commands on one line (DunAtCmdPusher.cpp)
- * (here "OTHER" reply means a reply which is something else than "OK" and "ERROR")
- * One reply:     OK           -> OK
- * One reply:     OTHER        -> OTHER
- * One reply:     ERROR        -> ERROR
- * Two replies:   OK, OK       -> OK
- * Two replies:   OTHER, OTHER -> OTHER, OTHER
- * Two replies:   OK, OTHER    -> OTHER
- * Two replies:   OTHER, OK    -> OTHER
- * Two replies:   OK, ERROR    -> ERROR
- * Two replies:   OTHER, ERROR -> OTHER, ERROR
- * Note: "OK" replies are skipped. The "OK" string is stripped from the "OTHER"
- * replies and manually added the the downstream as the last operation if either
- * "OK" or "OTHER" was received before.
- */
-
-#include "DunAtCmdPusher.h"
-#include "DunDownstream.h"
-#include "DunDebug.h"
-
-// ---------------------------------------------------------------------------
-// Two-phased constructor.
-// ---------------------------------------------------------------------------
-//
-CDunAtCmdPusher* CDunAtCmdPusher::NewL(
-    RATExt* aAtCmdExt,
-    MDunAtCmdPusher* aCallback,
-    MDunStreamManipulator* aDownstream,
-    TDesC8* aOkBuffer )
-    {
-    CDunAtCmdPusher* self = NewLC( aAtCmdExt,
-                                   aCallback,
-                                   aDownstream,
-                                   aOkBuffer );
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// Two-phased constructor.
-// ---------------------------------------------------------------------------
-//
-CDunAtCmdPusher* CDunAtCmdPusher::NewLC(
-    RATExt* aAtCmdExt,
-    MDunAtCmdPusher* aCallback,
-    MDunStreamManipulator* aDownstream,
-    TDesC8* aOkBuffer )
-    {
-    CDunAtCmdPusher* self = new (ELeave) CDunAtCmdPusher( aAtCmdExt,
-                                                          aCallback,
-                                                          aDownstream,
-                                                          aOkBuffer );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// Destructor.
-// ---------------------------------------------------------------------------
-//
-CDunAtCmdPusher::~CDunAtCmdPusher()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::~CDunAtCmdPusher()") ));
-    ResetData();
-    FTRACE(FPrint( _L("CDunAtCmdPusher::~CDunAtCmdPusher() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Resets data to initial values
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::ResetData()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ResetData()") ));
-    // APIs affecting this:
-    // IssueRequest()
-    Stop();
-    // Internal
-    Initialize();
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ResetData() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Starts AT command handling
-// ---------------------------------------------------------------------------
-//
-TInt CDunAtCmdPusher::IssueRequest( TDesC8& aInput, TBool aNormalMode )
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::IssueRequest()") ));
-    FTRACE(FPrint( _L("CDunAtCmdPusher::IssueRequest() send ATEXT:") ));
-    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,
-                              aInput,
-                              iRecvBuffer,
-                              iReplyLeftPckg,
-                              iReplyTypePckg );
-    SetActive();
-    iAtPushState = EDunStateAtCmdPushing;
-    FTRACE(FPrint( _L("CDunAtCmdPusher::IssueRequest() complete") ));
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// Stops AT command handling
-// ---------------------------------------------------------------------------
-//
-TInt CDunAtCmdPusher::Stop()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::Stop()") ));
-    SetEndOfCmdLine();
-    if ( iAtPushState != EDunStateAtCmdPushing )
-        {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::Stop() (not ready) complete" )));
-        return KErrNotReady;
-        }
-    // As the EDunStateAtCmdHandling can be set even when the actual request
-    // has completed (when replying with NotifyDataPushComplete() and setting
-    // idle eventually), cancel the actual operation in DoCancel()
-    Cancel();
-    iAtPushState = EDunStateIdle;
-    FTRACE(FPrint( _L("CDunAtCmdPusher::Stop() complete") ));
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// Manages request to abort command handling
-// ---------------------------------------------------------------------------
-//
-TInt CDunAtCmdPusher::ManageAbortRequest()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageAbortRequest()") ));
-    if ( iAtPushState != EDunStateAtCmdPushing )
-        {
-        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageAbortRequest() (not ready) complete" )));
-        return KErrNotReady;
-        }
-    if ( iCmdAbort )
-        {
-        FTRACE(FPrint( _L("CDunAtCmdPusher::ManageAbortRequest() (already exists) complete") ));
-        return KErrAlreadyExists;
-        }
-    TInt retTemp = iAtCmdExt->ReportHandleCommandAbort( iStop );
-    if ( retTemp != KErrNone )
-        {
-        FTRACE(FPrint( _L("CDunAtCmdPusher::ManageAbortRequest() (ERROR) complete") ));
-        return retTemp;
-        }
-    iCmdAbort = ETrue;
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageAbortRequest() complete") ));
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// Sets end of command line marker on for the possible series of AT commands.
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::SetEndOfCmdLine()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::SetEndOfCmdLine()") ));
-    iNoErrorReceived = EFalse;
-    iLastOkPush = EFalse;
-    iCmdAbort = EFalse;
-    iStop = EFalse;
-    iEditorMode = EFalse;
-    FTRACE(FPrint( _L("CDunAtCmdPusher::SetEndOfCmdLine() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Gets the editor mode status
-// ---------------------------------------------------------------------------
-//
-TBool CDunAtCmdPusher::EditorMode()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::EditorMode()") ));
-    FTRACE(FPrint( _L("CDunAtCmdPusher::EditorMode() complete") ));
-    return iEditorMode;
-    }
-
-// ---------------------------------------------------------------------------
-// CDunAtCmdPusher::CDunAtCmdPusher
-// ---------------------------------------------------------------------------
-//
-CDunAtCmdPusher::CDunAtCmdPusher( RATExt* aAtCmdExt,
-                                  MDunAtCmdPusher* aCallback,
-                                  MDunStreamManipulator* aDownstream,
-                                  TDesC8* aOkBuffer ) :
-    CActive( EPriorityHigh ),
-    iAtCmdExt( aAtCmdExt ),
-    iCallback( aCallback ),
-    iDownstream( aDownstream ),
-    iOkBuffer( aOkBuffer ),
-    iReplyLeftPckg( iReplyBytesLeft ),
-    iReplyTypePckg( iReplyType )
-    {
-    Initialize();
-    }
-
-// ---------------------------------------------------------------------------
-// CDunAtCmdPusher::ConstructL
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::ConstructL()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ConstructL()") ));
-    if ( !iAtCmdExt || !iCallback || !iDownstream || !iOkBuffer )
-        {
-        User::Leave( KErrGeneral );
-        }
-    CActiveScheduler::Add( this );
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ConstructL() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Initializes this class
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::Initialize()
-    {
-    // Don't initialize iAtCmdExt here (it is set through NewL)
-    // Don't initialize iCallback here (it is set through NewL)
-    // Don't initialize iDownstream here (it is set through NewL)
-    // Don't initialize iOkBuffer here (it is set through NewL)
-    iAtPushState = EDunStateIdle;
-    iReplyBytesLeft = 0;
-    iReplyType = EReplyTypeUndefined;
-    SetEndOfCmdLine();
-    }
-
-// ---------------------------------------------------------------------------
-// Sets state to idle and notifies about subcommand handling completion
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::SetToIdleAndNotifyEnd( TInt aError )
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::SetToIdleAndNotifyEnd()") ));
-    iCmdAbort = EFalse;
-    iAtPushState = EDunStateIdle;
-    iCallback->NotifyEndOfProcessing( aError );
-    FTRACE(FPrint( _L("CDunAtCmdPusher::SetToIdleAndNotifyEnd() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Checks if "OK" (verbose) or "0" (numeric) string or exists at the end of
-// buffer and removes it
-// ---------------------------------------------------------------------------
-//
-TInt CDunAtCmdPusher::CheckAndRemoveOkString()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::CheckAndRemoveOkString()") ));
-    TInt recvBufferLength = iRecvBuffer.Length();
-    TInt okBufferLength = iOkBuffer->Length();
-    // Skip the removal if removing not possible, if removal results in zero
-    // length (plugin should have used KErrReplyTypeOk) or if string to be
-    // removed is zero.
-    // Note also that if plugin sends a final reply when quiet mode is on, DUN
-    // can't remove the possibly existing result code as it is different from
-    // iOkReply (zero length).
-    if ( recvBufferLength<=okBufferLength || okBufferLength<=0 )
-        {
-        FTRACE(FPrint( _L("CDunAtCmdPusher::CheckAndRemoveOkString() (skip) complete") ));
-        return KErrGeneral;
-        }
-    TInt lengthWithNoOk = recvBufferLength - okBufferLength;
-    TPtr8 recvBufferDes( &iRecvBuffer[lengthWithNoOk], okBufferLength, okBufferLength );
-    if ( recvBufferDes.Compare(*iOkBuffer) != 0 )
-        {
-        FTRACE(FPrint( _L("CDunAtCmdPusher::CheckAndRemoveOkString() (not found) complete") ));
-        return KErrNotFound;
-        }
-    iRecvBuffer.SetLength( lengthWithNoOk );
-    FTRACE(FPrint( _L("CDunAtCmdPusher::CheckAndRemoveOkString() complete") ));
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// Sends reply data to downstream
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::SendReplyData( TBool aRecvBuffer )
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::SendReplyData()") ));
-    TDesC8* sendBuffer = iOkBuffer;
-    if ( aRecvBuffer )
-        {
-        sendBuffer = &iRecvBuffer;
-        // Check if last block of long push and remove "OK" if exists
-        if ( iReplyType==EReplyTypeOther && iReplyBytesLeft==0 )
-            {
-            CheckAndRemoveOkString();
-            }
-        }
-    FTRACE(FPrint( _L("CDunAtCmdPusher::SendReplyData() send reply:") ));
-    FTRACE(FPrintRaw(*sendBuffer) );
-    iDownstream->NotifyDataPushRequest( sendBuffer, this );
-    FTRACE(FPrint( _L("CDunAtCmdPusher::SendReplyData() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Manages change in reply type to EReplyTypeOther
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::ManageReplyTypeChangeToOther()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToOther()") ));
-    iNoErrorReceived = ETrue;
-    SendReplyData();
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToOther() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Manages change in reply type to EReplyTypeOk
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::ManageReplyTypeChangeToOk()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToOk()") ));
-    // Skip the "OK" replies if not last. Only push the "OK" reply at the end.
-    // iStop changes it so that the we have to send the "OK" immediately and
-    // only stop with NotifyDataPushComplete()
-    TBool found = iCallback->NotifyNextCommandPeekRequest();
-    if ( !found || iStop )
-        {
-        SendReplyData();
-        }
-    else
-        {
-        iNoErrorReceived = ETrue;
-        SetToIdleAndNotifyEnd( KErrNone );
-        }
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToOk() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Manages change in reply type to EReplyTypeError
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::ManageReplyTypeChangeToError()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToError()") ));
-    if ( iNoErrorReceived )
-       {
-       iAtCmdExt->ReportExternalHandleCommandError();
-       }
-    SendReplyData();
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToError() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Manages change in reply type to EReplyTypeEditor
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::ManageReplyTypeChangeToEditor()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToEditor()") ));
-    if ( !iEditorMode )
-        {
-        // First change to editor mode: manage it as EReplyTypeOther (prompt)
-        iEditorMode = ETrue;
-        ManageReplyTypeChangeToOther();
-        FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToEditor() (editor) complete") ));
-        return;
-        }
-    // The same reply to editor mode as before: no reply, only notification for
-    // echo/forwarding purposes
-    iCallback->NotifyEditorModeReply();
-    // Do nothing after notifying. The next ForwardEditorModeInput() triggers
-    // the next call of this function.
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChangeToEditor() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// Manages change in reply type
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::ManageReplyTypeChange()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChange()") ));
-    switch ( iReplyType )
-        {
-        case EReplyTypeOther:
-            {
-            FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChange() EReplyTypeOther") ));
-            iEditorMode = EFalse;
-            ManageReplyTypeChangeToOther();
-            }
-            break;
-        case EReplyTypeOk:
-            {
-            FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChange() EReplyTypeOk") ));
-            iEditorMode = EFalse;
-            ManageReplyTypeChangeToOk();
-            }
-            break;
-        case EReplyTypeError:
-            {
-            FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChange() EReplyTypeError") ));
-            iEditorMode = EFalse;
-            ManageReplyTypeChangeToError();
-            }
-            break;
-        case EReplyTypeEditor:
-            FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChange() EReplyTypeEditor") ));
-            ManageReplyTypeChangeToEditor();
-            break;
-        default:
-            {
-            FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChange() EReplyTypeUndefined") ));
-            iEditorMode = EFalse;
-            SetToIdleAndNotifyEnd( KErrNone );
-            }
-            break;
-        }
-    FTRACE(FPrint( _L("CDunAtCmdPusher::ManageReplyTypeChange() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// From class CActive.
-// Gets called when AT command handled
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::RunL()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::RunL()") ));
-    TInt retTemp = iStatus.Int();
-    if ( retTemp != KErrNone )
-        {
-        SetToIdleAndNotifyEnd( retTemp );
-        FTRACE(FPrint( _L("CDunAtCmdPusher::RunL() (ERROR) complete (%d)"), retTemp));
-        return;
-        }
-    ManageReplyTypeChange();
-    FTRACE(FPrint( _L("CDunAtCmdPusher::RunL() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// From class CActive.
-// Gets called on cancel
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::DoCancel()
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::DoCancel()") ));
-    iAtCmdExt->CancelHandleCommand();
-    FTRACE(FPrint( _L("CDunAtCmdPusher::DoCancel() complete") ));
-    }
-
-// ---------------------------------------------------------------------------
-// From class MDunCompletionReporter.
-// Gets called when data push is complete
-// ---------------------------------------------------------------------------
-//
-void CDunAtCmdPusher::NotifyDataPushComplete( TBool /*aAllPushed*/ )
-    {
-    FTRACE(FPrint( _L("CDunAtCmdPusher::NotifyDataPushComplete()") ));
-    // First check if error or stop condition detected
-    if ( iReplyType==EReplyTypeError || iStop )
-        {
-        SetEndOfCmdLine();
-        iAtPushState = EDunStateIdle;
-        iCallback->NotifyEndOfCmdLineProcessing();
-        FTRACE(FPrint( _L("CDunAtCmdPusher::NotifyDataPushComplete() (error reply) complete") ));
-        return;
-        }
-    // Secondly check only the case where push restart is required
-    if ( iReplyType==EReplyTypeOther && iReplyBytesLeft>0 )
-        {
-        iAtCmdExt->GetNextPartOfReply( iRecvBuffer, iReplyBytesLeft );
-        SendReplyData();
-        FTRACE(FPrint( _L("CDunAtCmdPusher::NotifyDataPushComplete() (push restart) complete") ));
-        return;
-        }
-    // Next check the case where other than "OK" and "ERROR" reply is received
-    // and that is the last one in the command line. Then just send "OK".
-    if ( !iLastOkPush && iReplyType==EReplyTypeOther )
-        {
-        TBool found = iCallback->NotifyNextCommandPeekRequest();
-        if ( !found )
-            {
-            // Force iReplyType here to match the correct one in NotifyDataPushComplete()
-            iReplyType = EReplyTypeOk;
-            iLastOkPush = ETrue;
-            SendReplyData( EFalse );
-            FTRACE(FPrint( _L("CDunAtCmdPusher::NotifyDataPushComplete() (last OK) complete") ));
-            return;
-            }
-        // Now the next command was found so just fall through
-        }
-    // As a last step just set to idle
-    SetToIdleAndNotifyEnd( KErrNone );
-    FTRACE(FPrint( _L("CDunAtCmdPusher::NotifyDataPushComplete() complete") ));
-    }