localconnectivityservice/dun/atext/src/DunAtCmdHandler.cpp
author hgs
Thu, 04 Nov 2010 15:31:42 +0800
changeset 60 841f70763fbe
parent 52 866b4af7ffbe
permissions -rw-r--r--
201044_04
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     1
/*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     2
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     3
* All rights reserved.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     8
*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
     9
* Initial Contributors:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    11
*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    12
* Contributors:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    13
*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    14
* Description:  AT command handler and notifier
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    15
*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    16
*/
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    17
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    18
/*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    19
 * Points to consider:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    20
 * - Each of the AT commands sent to ATEXT are converted to upper case form.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    21
 *   Thus the ATEXT plugins don't need to check for case. The conversion to
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    22
 *   upper case form stops when carriage return or '=' character is found.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    23
 */
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    24
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    25
/*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    26
 * This file has the following functionality:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    27
 * 1) Line buffer filler:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    28
 *    AddDataForParsing(), ManagePartialCommand(), ExtractLineFromInputBuffer(),
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    29
 *    etc. This buffer is used for parsing. These functions are used for
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    30
 *    splitter-combiner logic described below. CDunAtCmdPusher is used
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    31
 *    separately for each element in the line buffer.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    32
 * 2) Parser and splitter-combiner to handle the separater elements (subcommands)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    33
 *    in the line buffer. When end of line is detected, iEndIndex is used to
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    34
 *    extract the next line in iInput to the line buffer (ManageEndOfCmdHandling()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    35
 *    and ExtractLineFromInputBuffer()).
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    36
 * 3) When end of iEndIndex is found (ExtractLineFromInputBuffer()), more data
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    37
 *    is asked from CDunUpstream.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    38
 * Note: There is separate handling for "one character input data" and "A/"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    39
 * command handling which should be supported only for one line based data
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    40
 * (ManagePartialCommand()).
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    41
 */
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    42
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    43
/*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    44
 * The AT command handling is splitted to two parts on high level:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    45
 * 1) Splitter: splitting the sub-commands in a command line to multiple ones
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    46
 *    for ATEXT to process.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    47
 * 2) Combiner: combining the replies coming from ATEXT using a filter
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    48
 *    (the filter categories are explained in DunAtCmdPusher.cpp)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    49
 */
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    50
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    51
/*
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    52
 * Note1: This file uses AT command parsing based on heuristics.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    53
 * Refer to test specification if planning to change the heuristic.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    54
 * Note2: Input buffer management (ExtractLineFromInputBuffer()) can be tested
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    55
 * with non-line based terminals such as HyperTerminal or Realterm.
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
    56
 * Note3: If there is a need to handle commands with random data, the extended
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
    57
 * command checking can interfere with the character set of this random data.
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
    58
 * Best way to handle this random data is to create a handler for these commands
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
    59
 * which skips the valid "not to be parsed" data or use quotes. For these cases
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
    60
 * the CDunAtSpecialCmdHandler could be extended.
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    61
 */
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    62
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    63
#include "DunAtCmdHandler.h"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    64
#include "DunAtUrcHandler.h"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    65
#include "DunDownstream.h"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    66
#include "DunDebug.h"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    67
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    68
const TInt8 KDunCancel = 24;  // Used for line editing, cancel character
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    69
const TInt8 KDunEscape = 27;  // Used for editor ending, escape character
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    70
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    71
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    72
// Two-phased constructor.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    73
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    74
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    75
EXPORT_C CDunAtCmdHandler* CDunAtCmdHandler::NewL(
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    76
    MDunAtCmdStatusReporter* aUpstream,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    77
    MDunStreamManipulator* aDownstream,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    78
    const TDesC8* aConnectionName )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    79
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    80
    CDunAtCmdHandler* self = new (ELeave) CDunAtCmdHandler(
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    81
        aUpstream,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    82
        aDownstream,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    83
        aConnectionName );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    84
    CleanupStack::PushL( self );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    85
    self->ConstructL();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    86
    CleanupStack::Pop( self );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    87
    return self;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    88
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    89
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    90
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    91
// Destructor.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    92
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    93
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    94
CDunAtCmdHandler::~CDunAtCmdHandler()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    95
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    96
    FTRACE(FPrint( _L("CDunAtCmdHandler::~CDunAtCmdHandler()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    97
    ResetData();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    98
    FTRACE(FPrint( _L("CDunAtCmdHandler::~CDunAtCmdHandler() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
    99
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   100
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   101
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   102
// Resets data to initial values
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   103
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   104
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   105
EXPORT_C void CDunAtCmdHandler::ResetData()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   106
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   107
    FTRACE(FPrint( _L("CDunAtCmdHandler::ResetData()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   108
    // APIs affecting this:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   109
    // IssueRequest()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   110
    Stop();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   111
    // NewL()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   112
    DeletePluginHandlers();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   113
    delete iCmdEchoer;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   114
    iCmdEchoer = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   115
    delete iNvramListen;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   116
    iNvramListen = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   117
    delete iModeListen;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   118
    iModeListen = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   119
    delete iEcomListen;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   120
    iEcomListen = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   121
    delete iAtSpecialCmdHandler;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   122
    iAtSpecialCmdHandler = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   123
    if ( iAtCmdExtCommon.Handle() )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   124
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   125
        iAtCmdExtCommon.SynchronousClose();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   126
        iAtCmdExtCommon.Close();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   127
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   128
    if ( iAtCmdExt.Handle() )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   129
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   130
        iAtCmdExt.SynchronousClose();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   131
        iAtCmdExt.Close();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   132
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   133
    iSpecials.ResetAndDestroy();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   134
    iSpecials.Close();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   135
    // AddCmdModeCallback()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   136
    iCmdCallbacks.Close();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   137
    // Internal
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   138
    Initialize();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   139
    FTRACE(FPrint( _L("CDunAtCmdHandler::ResetData() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   140
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   141
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   142
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   143
// Adds callback for command mode notification
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   144
// The callback will be called when command mode starts or ends
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   145
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   146
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   147
EXPORT_C TInt CDunAtCmdHandler::AddCmdModeCallback( MDunCmdModeMonitor* aCallback )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   148
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   149
    FTRACE(FPrint( _L("CDunAtCmdHandler::AddCmdModeCallback()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   150
    if ( !aCallback )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   151
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   152
        FTRACE(FPrint( _L("CDunAtCmdHandler::AddCmdModeCallback() (aCallback) not initialized!" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   153
        return KErrGeneral;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   154
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   155
    TInt retTemp = iCmdCallbacks.Find( aCallback );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   156
    if ( retTemp != KErrNotFound )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   157
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   158
        FTRACE(FPrint( _L("CDunAtCmdHandler::AddCmdModeCallback() (already exists) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   159
        return KErrAlreadyExists;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   160
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   161
    retTemp = iCmdCallbacks.Append( aCallback );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   162
    if ( retTemp != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   163
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   164
        FTRACE(FPrint( _L("CDunAtCmdHandler::AddCmdModeCallback() (append failed!) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   165
        return retTemp;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   166
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   167
    FTRACE(FPrint( _L("CDunAtCmdHandler::AddCmdModeCallback() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   168
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   169
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   170
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   171
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   172
// Adds data for parsing and parses if necessary
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   173
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   174
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   175
EXPORT_C TInt CDunAtCmdHandler::AddDataForParsing( TDesC8& aInput,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   176
                                                   TBool& aMoreNeeded )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   177
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   178
    FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   179
    FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() received (%d bytes):"), aInput.Length() ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   180
    FTRACE(FPrintRaw(aInput) );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   181
    TBool editorMode = iCmdPusher->EditorMode();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   182
    if ( editorMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   183
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   184
        // Note: return here with "no more data needed" and some error to fool
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   185
        // CDunUpstream into not reissuing the read request.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   186
        iCmdPusher->IssueRequest( aInput, EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   187
        aMoreNeeded = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   188
        return KErrGeneral;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   189
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   190
    iInput = &aInput;  // iInput only for normal mode
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   191
    // Manage partial AT command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   192
    TBool moreNeeded = ManagePartialCommand();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   193
    if ( moreNeeded )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   194
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   195
        aMoreNeeded = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   196
        FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() (more partial) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   197
        return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   198
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   199
    if ( iHandleState != EDunStateIdle )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   200
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   201
        aMoreNeeded = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   202
        ManageEndOfCmdHandling( EFalse, EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   203
        FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() (not ready) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   204
        return KErrNotReady;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   205
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   206
    TBool pushStarted = HandleASlashCommand();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   207
    if ( pushStarted )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   208
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   209
        // Note: return here with "partial input" status to fool CDunUpstream
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   210
        // into reissuing the read request. The AT command has not really
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   211
        // started yet so this is necessary.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   212
        aMoreNeeded = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   213
        ManageEndOfCmdHandling( EFalse, EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   214
        FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() (A/) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   215
        return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   216
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   217
    iHandleState = EDunStateAtCmdHandling;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   218
    iDecodeInfo.iFirstDecode = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   219
    iDecodeInfo.iDecodeIndex = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   220
    iDecodeInfo.iPrevExists = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   221
    iParseInfo.iLimit = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   222
    iParseInfo.iSendBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   223
    iEditorModeInfo.iContentFound = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   224
    HandleNextSubCommand();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   225
    FTRACE(FPrint( _L("CDunAtCmdHandler::AddDataForParsing() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   226
    aMoreNeeded = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   227
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   228
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   229
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   230
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   231
// Manages request to abort command handling
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   232
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   233
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   234
EXPORT_C TInt CDunAtCmdHandler::ManageAbortRequest()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   235
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   236
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageAbortRequest()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   237
    // Just forward the request, do no other own processing
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   238
    TInt retVal = iCmdPusher->ManageAbortRequest();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   239
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageAbortRequest() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   240
    return retVal;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   241
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   242
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   243
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   244
// Sends a character to be echoed
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   245
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   246
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   247
EXPORT_C TInt CDunAtCmdHandler::SendEchoCharacter( const TDesC8* aInput,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   248
                                                   MDunAtCmdEchoer* aCallback )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   249
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   250
    FTRACE(FPrint( _L("CDunAtCmdHandler::SendEchoCharacter()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   251
    TInt retVal = iCmdEchoer->SendEchoCharacter( aInput, aCallback );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   252
    FTRACE(FPrint( _L("CDunAtCmdHandler::SendEchoCharacter() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   253
    return retVal;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   254
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   255
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   256
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   257
// Stops sending of AT command from parse buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   258
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   259
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   260
EXPORT_C TInt CDunAtCmdHandler::Stop()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   261
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   262
    FTRACE(FPrint( _L("CDunAtCmdHandler::Stop()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   263
    // Only stop iCmdPusher here, not iUrcHandlers!
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   264
    if ( iHandleState != EDunStateAtCmdHandling )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   265
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   266
        FTRACE(FPrint( _L("CDunAtCmdHandler::Stop() (not ready) complete" )));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   267
        return KErrNotReady;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   268
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   269
    iCmdPusher->Stop();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   270
    // The line below is used in the case when this function is called by
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   271
    // CDunUpstream as a result of "data mode ON" change notification.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   272
    // In this case it is possible that HandleNextSubCommand() returns
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   273
    // without resetting the iSendBuffer because of the way it checks the
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   274
    // iHandleState.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   275
    ManageEndOfCmdHandling( ETrue, EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   276
    FTRACE(FPrint( _L("CDunAtCmdHandler::Stop() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   277
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   278
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   279
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   280
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   281
// Starts URC message handling
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   282
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   283
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   284
EXPORT_C TInt CDunAtCmdHandler::StartUrc()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   285
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   286
    FTRACE(FPrint( _L("CDunAtCmdHandler::StartUrc()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   287
    TInt i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   288
    TInt count = iUrcHandlers.Count();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   289
    for ( i=0; i<count; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   290
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   291
        TInt retTemp = iUrcHandlers[i]->IssueRequest();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   292
        if ( retTemp!=KErrNone && retTemp!=KErrNotReady )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   293
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   294
            FTRACE(FPrint( _L("CDunAtCmdHandler::StartUrc() (ERROR) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   295
            return retTemp;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   296
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   297
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   298
    FTRACE(FPrint( _L("CDunAtCmdHandler::StartUrc() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   299
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   300
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   301
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   302
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   303
// Stops URC message handling
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   304
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   305
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   306
EXPORT_C TInt CDunAtCmdHandler::StopUrc()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   307
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   308
    FTRACE(FPrint( _L("CDunAtCmdHandler::StopUrc()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   309
    TInt i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   310
    TInt count = iUrcHandlers.Count();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   311
    for ( i=0; i<count; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   312
        {
60
841f70763fbe 201044_04
hgs
parents: 52
diff changeset
   313
        iUrcHandlers[i]->Stop();
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   314
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   315
    FTRACE(FPrint( _L("CDunAtCmdHandler::StopUrc() complete") ));
60
841f70763fbe 201044_04
hgs
parents: 52
diff changeset
   316
    return KErrNone;
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   317
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   318
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   319
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   320
// CDunAtCmdHandler::CDunAtCmdHandler
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   321
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   322
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   323
CDunAtCmdHandler::CDunAtCmdHandler( MDunAtCmdStatusReporter* aUpstream,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   324
                                    MDunStreamManipulator* aDownstream,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   325
                                    const TDesC8* aConnectionName ) :
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   326
    iUpstream( aUpstream ),
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   327
    iDownstream( aDownstream ),
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   328
    iConnectionName( aConnectionName )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   329
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   330
    Initialize();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   331
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   332
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   333
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   334
// CDunAtCmdHandler::ConstructL
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   335
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   336
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   337
void CDunAtCmdHandler::ConstructL()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   338
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   339
    FTRACE(FPrint( _L("CDunAtCmdHandler::ConstructL()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   340
    if ( !iUpstream || !iDownstream || !iConnectionName )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   341
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   342
        User::Leave( KErrGeneral );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   343
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   344
    // Connect to AT command extension (must succeed)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   345
    TInt retTemp = KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   346
    CleanupClosePushL( iAtCmdExt );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   347
    retTemp = iAtCmdExt.Connect( EDunATExtension, *iConnectionName );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   348
    if ( retTemp != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   349
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   350
        FTRACE(FPrint( _L("CDunAtCmdHandler::ConstructL() connect (%d)"), retTemp));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   351
        User::Leave( retTemp );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   352
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   353
    CleanupClosePushL( iAtCmdExtCommon );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   354
    retTemp = iAtCmdExtCommon.Connect( *iConnectionName );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   355
    if ( retTemp != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   356
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   357
        FTRACE(FPrint( _L("CDunAtCmdHandler::ConstructL() common connect (%d)"), retTemp));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   358
        User::Leave( retTemp );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   359
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   360
    // Create the array of special commands
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   361
    CreateSpecialCommandsL();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   362
    // Create the plugin handlers
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   363
    CreatePluginHandlersL();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   364
    // Create the echo handler
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   365
    iCmdEchoer = CDunAtCmdEchoer::NewL( iDownstream );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   366
    // Create the listeners
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   367
    iEcomListen = CDunAtEcomListen::NewL( &iAtCmdExt, this );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   368
    iModeListen = CDunAtModeListen::NewL( &iAtCmdExtCommon, this );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   369
    iNvramListen = CDunAtNvramListen::NewL( &iAtCmdExt, &iAtCmdExtCommon );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   370
    iAtSpecialCmdHandler = CDunAtSpecialCmdHandler::NewL();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   371
    // Set the default modes (+report) and characters
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   372
    GetAndSetDefaultSettingsL();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   373
    // Start listening
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   374
    iEcomListen->IssueRequest();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   375
    iModeListen->IssueRequest();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   376
    iNvramListen->IssueRequest();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   377
    CleanupStack::Pop( &iAtCmdExtCommon );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   378
    CleanupStack::Pop( &iAtCmdExt );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   379
    FTRACE(FPrint( _L("CDunAtCmdHandler::ConstructL() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   380
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   381
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   382
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   383
// Initializes this class
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   384
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   385
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   386
void CDunAtCmdHandler::Initialize()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   387
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   388
    // Don't initialize iUpstream here (it is set through NewL)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   389
    // Don't initialize iDownstream here (it is set through NewL)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   390
    // Don't initialize iConnectionName here (it is set through NewL)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   391
    iHandleState = EDunStateIdle;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   392
    iCarriageReturn = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   393
    iLineFeed = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   394
    iBackspace = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   395
    iInput = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   396
    iDecodeInfo.iFirstDecode = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   397
    iDecodeInfo.iDecodeIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   398
    iDecodeInfo.iExtendedIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   399
    iDecodeInfo.iPrevChar = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   400
    iDecodeInfo.iPrevExists = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   401
    iDecodeInfo.iAssignFound = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   402
    iDecodeInfo.iInQuotes = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   403
    iDecodeInfo.iSpecialFound = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   404
    iDecodeInfo.iCmdsHandled = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   405
    iEditorModeInfo.iContentFound = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   406
    iCmdPusher = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   407
    iEcomListen = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   408
    iModeListen = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   409
    iNvramListen = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   410
    iDataMode = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   411
    iEchoOn = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   412
    iQuietOn = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   413
    iVerboseOn = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   414
    iEndIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   415
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   416
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   417
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   418
// Creates plugin handlers for this class
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   419
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   420
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   421
void CDunAtCmdHandler::CreatePluginHandlersL()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   422
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   423
    FTRACE(FPrint( _L("CDunAtCmdHandler::CreatePluginHandlersL()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   424
    if ( !iAtCmdExt.Handle() )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   425
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   426
        FTRACE(FPrint( _L("CDunAtCmdHandler::CreatePluginHandlersL() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   427
        User::Leave( KErrGeneral );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   428
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   429
    // First create the command reply pusher
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   430
    CDunAtCmdPusher* cmdPusher = CDunAtCmdPusher::NewLC( &iAtCmdExt,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   431
                                                         this,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   432
                                                         iDownstream,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   433
                                                         &iOkBuffer );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   434
    // Next create the URC handlers
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   435
    TInt i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   436
    TInt numOfPlugins = iAtCmdExt.NumberOfPlugins();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   437
    for ( i=0; i<numOfPlugins; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   438
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   439
        AddOneUrcHandlerL();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   440
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   441
    CleanupStack::Pop( cmdPusher );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   442
    iCmdPusher = cmdPusher;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   443
    FTRACE(FPrint( _L("CDunAtCmdHandler::CreatePluginHandlersL() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   444
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   445
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   446
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   447
// Creates an array of special commands
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   448
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   449
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   450
void CDunAtCmdHandler::CreateSpecialCommandsL()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   451
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   452
    FTRACE(FPrint( _L("CDunAtCmdHandler::CreateSpecialCommandsL()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   453
    TInt retTemp = KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   454
    TBool firstSearch = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   455
    for ( ;; )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   456
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   457
        // Let's borrow iLineBuffer for this purpose
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   458
        retTemp = iAtCmdExt.GetNextSpecialCommand( iLineBuffer, firstSearch );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   459
        if ( retTemp != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   460
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   461
            break;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   462
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   463
        TInt lineLength = iLineBuffer.Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   464
        HBufC8* specialCmd = HBufC8::NewMaxLC( lineLength );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   465
        *specialCmd = iLineBuffer;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   466
        iSpecials.AppendL( specialCmd );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   467
        CleanupStack::Pop( specialCmd );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   468
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   469
    iLineBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   470
    FTRACE(FPrint( _L("CDunAtCmdHandler::CreateSpecialCommandsL() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   471
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   472
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   473
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   474
// Recreates special command data.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   475
// This is done when a plugin is installed or uninstalled.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   476
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   477
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   478
TInt CDunAtCmdHandler::RecreateSpecialCommands()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   479
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   480
    FTRACE(FPrint( _L("CDunAtCmdHandler::RecreateSpecialCommands()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   481
    iSpecials.ResetAndDestroy();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   482
    TRAPD( retTrap, CreateSpecialCommandsL() );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   483
    FTRACE(FPrint( _L("CDunAtCmdHandler::RecreateSpecialCommands() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   484
    return retTrap;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   485
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   486
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   487
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   488
// Gets default settings from RATExtCommon and sets them to RATExt
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   489
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   490
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   491
void CDunAtCmdHandler::GetAndSetDefaultSettingsL()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   492
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   493
    FTRACE(FPrint( _L("CDunAtCmdHandler::GetAndSetDefaultSettingsL()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   494
    // Note: Let's assume command mode is off by default
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   495
    TUint modeSet = GetCurrentModeL( KModeEcho | KModeQuiet | KModeVerbose );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   496
    iEchoOn    = ( modeSet & KEchoModeBase    ) ? ETrue : EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   497
    iQuietOn   = ( modeSet & KQuietModeBase   ) ? ETrue : EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   498
    iVerboseOn = ( modeSet & KVerboseModeBase ) ? ETrue : EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   499
    iCarriageReturn = GetCurrentModeL( KModeCarriage );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   500
    iLineFeed = GetCurrentModeL( KModeLineFeed );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   501
    iBackspace = GetCurrentModeL( KModeBackspace );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   502
    iAtCmdExt.ReportQuietModeChange( iQuietOn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   503
    iAtCmdExt.ReportVerboseModeChange( iVerboseOn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   504
    iAtCmdExt.ReportCharacterChange( ECharTypeCarriage, iCarriageReturn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   505
    iAtCmdExt.ReportCharacterChange( ECharTypeLineFeed, iLineFeed );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   506
    iAtCmdExt.ReportCharacterChange( ECharTypeBackspace, iBackspace );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   507
    RegenerateReplyStrings();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   508
    FTRACE(FPrint( _L("CDunAtCmdHandler::GetAndSetDefaultSettingsL() settings: E=%d, Q=%d, V=%d"), iEchoOn, iQuietOn, iVerboseOn ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   509
    FTRACE(FPrint( _L("CDunAtCmdHandler::GetAndSetDefaultSettingsL() settings: CR=%u, LF=%u, BS=%u"), iCarriageReturn, iLineFeed, iBackspace ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   510
    FTRACE(FPrint( _L("CDunAtCmdHandler::GetAndSetDefaultSettingsL() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   511
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   512
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   513
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   514
// Regenerates the reply strings based on settings
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   515
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   516
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   517
TBool CDunAtCmdHandler::RegenerateReplyStrings()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   518
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   519
    FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateReplyStrings()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   520
    TBool retVal = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   521
    retVal |= RegenerateOkReply();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   522
    retVal |= RegenerateErrorReply();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   523
    FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateReplyStrings() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   524
    return retVal;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   525
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   526
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   527
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   528
// Regenerates the ok reply based on settings
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   529
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   530
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   531
TBool CDunAtCmdHandler::RegenerateOkReply()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   532
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   533
    FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateOkReply()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   534
    if ( iDownstream->IsDataInQueue(&iOkBuffer) )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   535
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   536
        FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateOkReply() (in queue!) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   537
        return iQuietOn;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   538
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   539
    iOkBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   540
    if ( iQuietOn )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   541
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   542
        FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateOkReply() (quiet) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   543
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   544
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   545
    if ( iVerboseOn )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   546
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   547
        _LIT8( KVerboseOk, "OK" );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   548
        iOkBuffer.Append( iCarriageReturn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   549
        iOkBuffer.Append( iLineFeed );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   550
        iOkBuffer.Append( KVerboseOk );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   551
        iOkBuffer.Append( iCarriageReturn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   552
        iOkBuffer.Append( iLineFeed );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   553
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   554
    else
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   555
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   556
        _LIT8( KNumericOk, "0" );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   557
        iOkBuffer.Append( KNumericOk );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   558
        iOkBuffer.Append( iCarriageReturn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   559
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   560
    FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateOkReply() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   561
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   562
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   563
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   564
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   565
// Regenerates the error reply based on settings
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   566
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   567
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   568
TBool CDunAtCmdHandler::RegenerateErrorReply()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   569
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   570
    FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateErrorReply()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   571
    if ( iDownstream->IsDataInQueue(&iErrorBuffer) )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   572
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   573
        FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateErrorReply() (in queue!) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   574
        return iQuietOn;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   575
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   576
    iErrorBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   577
    if ( iQuietOn )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   578
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   579
        FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateErrorReply() (quiet) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   580
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   581
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   582
    if ( iVerboseOn )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   583
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   584
        _LIT8( KVerboseError, "ERROR" );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   585
        iErrorBuffer.Append( iCarriageReturn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   586
        iErrorBuffer.Append( iLineFeed );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   587
        iErrorBuffer.Append( KVerboseError );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   588
        iErrorBuffer.Append( iCarriageReturn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   589
        iErrorBuffer.Append( iLineFeed );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   590
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   591
    else
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   592
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   593
        _LIT8( KNumericError, "4" );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   594
        iErrorBuffer.Append( KNumericError );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   595
        iErrorBuffer.Append( iCarriageReturn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   596
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   597
    FTRACE(FPrint( _L("CDunAtCmdHandler::RegenerateErrorReply() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   598
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   599
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   600
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   601
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   602
// Gets current mode
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   603
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   604
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   605
TUint CDunAtCmdHandler::GetCurrentModeL( TUint aMask )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   606
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   607
    FTRACE(FPrint( _L("CDunAtCmdHandler::GetCurrentModeL()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   608
    TUint maskCheck = aMask & ( ~KSupportedModes );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   609
    if ( maskCheck != 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   610
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   611
        FTRACE(FPrint( _L("CDunAtCmdHandler::GetCurrentModeL() (not supported) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   612
        User::Leave( KErrNotSupported );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   613
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   614
    TUint newMode = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   615
    TInt retTemp = iAtCmdExtCommon.GetMode( aMask, newMode );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   616
    if ( retTemp != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   617
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   618
        FTRACE(FPrint( _L("CDunAtCmdHandler::GetCurrentModeL() (ERROR) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   619
        User::Leave( retTemp );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   620
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   621
    FTRACE(FPrint( _L("CDunAtCmdHandler::GetCurrentModeL() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   622
    return newMode & (KModeChanged-1);
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   623
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   624
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   625
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   626
// Instantiates one URC message handling class instance and adds it to the URC
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   627
// message handler array
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   628
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   629
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   630
CDunAtUrcHandler* CDunAtCmdHandler::AddOneUrcHandlerL()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   631
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   632
    FTRACE(FPrint( _L("CDunAtCmdHandler::AddOneUrcHandlerL()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   633
    CDunAtUrcHandler* urcHandler = CDunAtUrcHandler::NewLC( &iAtCmdExt,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   634
                                                            iDownstream );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   635
    iUrcHandlers.AppendL( urcHandler );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   636
    CleanupStack::Pop( urcHandler );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   637
    FTRACE(FPrint( _L("CDunAtCmdHandler::AddOneUrcHandlerL() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   638
    return urcHandler;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   639
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   640
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   641
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   642
// Deletes all instantiated URC message handlers
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   643
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   644
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   645
void CDunAtCmdHandler::DeletePluginHandlers()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   646
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   647
    FTRACE(FPrint( _L("CDunAtCmdHandler::DeletePluginHandlers()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   648
    delete iCmdPusher;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   649
    iCmdPusher = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   650
    TInt i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   651
    TInt count = iUrcHandlers.Count();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   652
    for ( i=0; i<count; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   653
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   654
        delete iUrcHandlers[i];
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   655
        iUrcHandlers[i] = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   656
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   657
    iUrcHandlers.Reset();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   658
    iUrcHandlers.Close();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   659
    FTRACE(FPrint( _L("CDunAtCmdHandler::DeletePluginHandlers() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   660
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   661
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   662
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   663
// Manages partial AT command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   664
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   665
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   666
TBool CDunAtCmdHandler::ManagePartialCommand()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   667
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   668
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   669
    // Check one character (or unit) based input data
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   670
    if ( iInput->Length() == KDunChSetMaxCharLen )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   671
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   672
        EchoCommand();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   673
        // Handle backspace and cancel characters
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   674
        TBool found = HandleSpecialCharacters();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   675
        if ( found )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   676
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   677
            FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (special) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   678
            return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   679
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   680
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   681
    TBool moreNeeded = ExtractLineFromInputBuffer();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   682
    if ( moreNeeded )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   683
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   684
        // More data is not needed with "A/" (no carriage return), check that
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   685
        // special case here, otherwise continue processing
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   686
        if ( !IsASlashCommand() )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   687
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   688
            FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (more) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   689
            return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   690
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   691
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   692
    // If something went wrong, do nothing (return consumed)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   693
    if ( iLineBuffer.Length() <= 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   694
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   695
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() (length) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   696
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   697
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   698
    // For other commands, just return with consumed
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   699
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManagePartialCommand() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   700
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   701
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   702
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   703
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   704
// Echoes a command if echo is on
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   705
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   706
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   707
TBool CDunAtCmdHandler::EchoCommand()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   708
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   709
    FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   710
    if ( iInput->Length() > KDunChSetMaxCharLen )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   711
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   712
        FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand() (wrong length) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   713
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   714
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   715
    if ( iEchoOn )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   716
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   717
        if ( iDownstream->IsDataInQueue(&iEchoBuffer) )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   718
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   719
            FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand() (in queue!) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   720
            return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   721
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   722
        iEchoBuffer.Copy( *iInput );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   723
        iDownstream->NotifyDataPushRequest( &iEchoBuffer, NULL );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   724
        FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   725
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   726
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   727
    FTRACE(FPrint( _L("CDunAtCmdHandler::EchoCommand() (not started) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   728
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   729
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   730
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   731
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   732
// Handles backspace and cancel characters
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   733
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   734
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   735
TBool CDunAtCmdHandler::HandleSpecialCharacters()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   736
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   737
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   738
    if ( iInput->Length() != KDunChSetMaxCharLen )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   739
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   740
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters() (wrong length) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   741
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   742
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   743
    if ( (*iInput)[0] == iBackspace )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   744
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   745
        TInt lineLength = iLineBuffer.Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   746
        if ( lineLength > 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   747
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   748
            iLineBuffer.SetLength( lineLength-1 );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   749
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   750
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters() (backspace) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   751
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   752
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   753
    if ( (*iInput)[0] == KDunCancel )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   754
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   755
        ManageEndOfCmdHandling( EFalse, EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   756
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters() (cancel) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   757
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   758
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   759
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialCharacters() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   760
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   761
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   762
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   763
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   764
// Extracts line from input buffer to line buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   765
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   766
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   767
TBool CDunAtCmdHandler::ExtractLineFromInputBuffer()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   768
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   769
    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   770
    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() before (%d bytes):"), iLineBuffer.Length() ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   771
    FTRACE(FPrintRaw(iLineBuffer) );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   772
    // Case1: If no data in iLineBuffer and end-of-line character in iInputBuffer[start]:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   773
    //     - Skip end-of-line characters, find start-of-line condition, find end-of-line character
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   774
    //     - If partial line found (start-of-line condition and no end-of-line character):
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   775
    //           - Save partial line to iLineBuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   776
    //           - Set iEndIndex to end of iInputBuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   777
    //     - If full line found (start-of-line condition and end-of-line character):
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   778
    //           - Save full line to iLineBuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   779
    //           - Skip multiple end-of-line characters until next start-of-line
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   780
    //             condition or end of iInputBuffer -> save this position to iEndIndex
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   781
    // Case2: If no data in iLineBuffer and non-end-of-line character in iInputBuffer[start]:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   782
    //     - Find end-of-line character
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   783
    //     - If partial line found (no end-of-line character):
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   784
    //           - Save partial line to iLineBuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   785
    //           - Set iEndIndex to end of iLineBuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   786
    //     - If full line found (end-of-line character):
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   787
    //           - Save full line to iLineBuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   788
    //           - Skip multiple end-of-line characters until next start-of-line
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   789
    //             condition or end of iInputBuffer -> save this position to iEndIndex
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   790
    // Case3: If data in iLineBuffer and end-of-line character in iInputBuffer[start]:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   791
    //     - Skip end-of-line characters
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   792
    //     - Keep string currently in iLineBuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   793
    //     - Skip end-of-line characters until non-end-of-line or end of
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   794
    //       iInputBuffer -> save this position to iEndIndex
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   795
    // Case4: If data in iLineBuffer and non-end-of-line character in iInputBuffer[start]:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   796
    //     - Processed the same way as Case1, however "Skip end-of-line characters" does
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   797
    //       not have any effect
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   798
    if ( iInput->Length() <= 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   799
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   800
        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (wrong length) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   801
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   802
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   803
    TBool moreNeeded = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   804
    TBool copyNeeded = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   805
    TInt copyLength = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   806
    TInt lineLength = iLineBuffer.Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   807
    TInt lineMaxLength = iLineBuffer.MaxLength();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   808
    TInt freeLineSpace = lineMaxLength - lineLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   809
    TInt inputLength = iInput->Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   810
    TInt startIndex = ( iEndIndex>=0 ) ? iEndIndex : 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   811
    if ( startIndex >= inputLength )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   812
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   813
        iEndIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   814
        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (input end) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   815
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   816
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   817
    // Cases here:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   818
    // Case1: If no data in iLineBuffer and end-of-line character in iInputBuffer[start]
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   819
    // Case2: If no data in iLineBuffer and non-end-of-line character in iInputBuffer[start]
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   820
    // Case3: If data in iLineBuffer and end-of-line character in iInputBuffer[start]
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   821
    // Case4: If data in iLineBuffer and non-end-of-line character in iInputBuffer[start]
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   822
    // Summary: Cases 1, 2 and 4 can be combined. Case 3 needs a separate check.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   823
    TChar character = (*iInput)[startIndex];
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   824
    TBool endOfLine = IsEndOfLine(character);
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   825
    if ( lineLength>0 && endOfLine )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   826
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   827
        moreNeeded = HandleSpecialBufferManagement( startIndex,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   828
                                                    copyLength,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   829
                                                    copyNeeded );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   830
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   831
    else
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   832
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   833
        moreNeeded = HandleGenericBufferManagement( startIndex,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   834
                                                    copyLength,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   835
                                                    copyNeeded );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   836
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   837
    if ( copyNeeded && copyLength>0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   838
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   839
        // Check the case copyLength does not fit to iLineBuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   840
        // This case should be handled by returning "more data needed"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   841
        // Also reset the iLineBuffer to ensure the handling doesn't stuck
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   842
        // for rest of the commands (usability case)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   843
        if ( copyLength > freeLineSpace )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   844
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   845
            iLineBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   846
            iEndIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   847
            FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() after (%d bytes):"), iLineBuffer.Length() ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   848
            FTRACE(FPrintRaw(iLineBuffer) );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   849
            FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (overflow) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   850
            return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   851
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   852
        iLineBuffer.Append( &(*iInput)[startIndex], copyLength );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   853
        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() after (%d bytes):"), iLineBuffer.Length() ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   854
        FTRACE(FPrintRaw(iLineBuffer) );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   855
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   856
    if ( moreNeeded )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   857
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   858
        iEndIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   859
        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (more needed) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   860
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   861
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   862
    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractLineFromInputBuffer() (line found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   863
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   864
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   865
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   866
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   867
// Handles generic buffer management
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   868
// (explanation in ExtractLineFromInputBuffer())
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   869
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   870
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   871
TBool CDunAtCmdHandler::HandleGenericBufferManagement( TInt& aStartIndex,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   872
                                                       TInt& aCopyLength,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   873
                                                       TBool& aCopyNeeded )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   874
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   875
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   876
    TInt inputLength = iInput->Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   877
    TInt currentIndex = SkipEndOfLineCharacters( aStartIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   878
    if ( currentIndex >= inputLength )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   879
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   880
        // No data in iLineBuffer and only end-of-lines in new buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   881
        // return with "need more data"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   882
        iEndIndex = inputLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   883
        aCopyLength = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   884
        aCopyNeeded = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   885
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement() (new end for old no data) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   886
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   887
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   888
    // No data in iLineBuffer and non-end-of-line character found
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   889
    // Try to find the first start-of-line condition
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   890
    TInt lineLength = iLineBuffer.Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   891
    if ( lineLength == 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   892
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   893
        currentIndex = SkipSubCommandDelimiterCharacters( aStartIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   894
        if ( currentIndex >= inputLength )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   895
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   896
            // No data in iLineBuffer and only end-of-lines+delimiter in new buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   897
            // return with "need more data"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   898
            iEndIndex = inputLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   899
            aCopyLength = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   900
            aCopyNeeded = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   901
            FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement() (new end+delim for old no data) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   902
            return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   903
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   904
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   905
    aStartIndex = currentIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   906
    // No data in iLineBuffer and other than end-of-line or delimiter character found
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   907
    // Variable currentIndex is now the start of new command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   908
    // Next try to find the end of the command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   909
    TInt endIndex = FindEndOfLine( aStartIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   910
    if ( endIndex >= inputLength )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   911
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   912
        // No data in iLineBuffer and start of command found without end
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   913
        // return with "need more data"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   914
        iEndIndex = inputLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   915
        aCopyLength = inputLength - aStartIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   916
        aCopyNeeded = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   917
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement() (start but no end for old no data) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   918
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   919
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   920
    // No data in iLineBuffer and end-of-line character found
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   921
    // Try to skip possible multiple end-of-line characters
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   922
    currentIndex = SkipEndOfLineCharacters( endIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   923
    // Variable currentIndex is now either start of next command or end of iInput
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   924
    // Note that this requires that Case 2 must skip the possible IsDelimiterCharacter()s
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   925
    iEndIndex = currentIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   926
    aCopyLength = endIndex - aStartIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   927
    aCopyNeeded = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   928
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleGenericBufferManagement() (line found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   929
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   930
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   931
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   932
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   933
// Handles special buffer management
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   934
// (explanation in ExtractLineFromInputBuffer())
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   935
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   936
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   937
TBool CDunAtCmdHandler::HandleSpecialBufferManagement( TInt aStartIndex,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   938
                                                       TInt& aCopyLength,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   939
                                                       TBool& aCopyNeeded )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   940
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   941
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialBufferManagement()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   942
    TInt currentIndex = SkipEndOfLineCharacters( aStartIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   943
    // Variable currentIndex is now either start of next command or end of iInput
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   944
    iEndIndex = currentIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   945
    aCopyLength = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   946
    aCopyNeeded = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   947
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleSpecialBufferManagement() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   948
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   949
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   950
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   951
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   952
// Skips end-of-line characters
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   953
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   954
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   955
TInt CDunAtCmdHandler::SkipEndOfLineCharacters( TInt aStartIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   956
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   957
    FTRACE(FPrint( _L("CDunAtCmdHandler::SkipEndOfLineCharacters()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   958
    TInt foundIndex = iInput->Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   959
    TInt inputLength = foundIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   960
    for ( TInt i=aStartIndex; i<inputLength; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   961
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   962
        TChar character = (*iInput)[i];
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   963
        if ( !IsEndOfLine(character) )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   964
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   965
            foundIndex = i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   966
            break;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   967
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   968
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   969
    FTRACE(FPrint( _L("CDunAtCmdHandler::SkipEndOfLineCharacters() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   970
    return foundIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   971
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   972
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   973
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   974
// Skips subcommand delimiter characters
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   975
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   976
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   977
TInt CDunAtCmdHandler::SkipSubCommandDelimiterCharacters( TInt aStartIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   978
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   979
    FTRACE(FPrint( _L("CDunAtCmdHandler::SkipSubCommandDelimiterCharacters()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   980
    TInt inputLength = iInput->Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   981
    TInt foundIndex = inputLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   982
    for ( TInt i=aStartIndex; i<inputLength; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   983
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   984
        TChar character = (*iInput)[i];
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
   985
        if ( !IsDelimiterCharacter(character,ETrue,ETrue) )
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   986
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   987
            foundIndex = i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   988
            break;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   989
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   990
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   991
    FTRACE(FPrint( _L("CDunAtCmdHandler::SkipSubCommandDelimiterCharacters() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   992
    return foundIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   993
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   994
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   995
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   996
// Finds the end of the line
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   997
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   998
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
   999
TInt CDunAtCmdHandler::FindEndOfLine( TInt aStartIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1000
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1001
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindEndOfLine()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1002
    TInt inputLength = iInput->Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1003
    TInt foundIndex = inputLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1004
    for ( TInt i=aStartIndex; i<inputLength; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1005
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1006
        TChar character = (*iInput)[i];
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1007
        // Checking for IsDelimiterCharacter() here needs more logic (a parser).
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1008
        // Just check with "IsEndOfLine()"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1009
        if ( IsEndOfLine(character) )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1010
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1011
            foundIndex = i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1012
            break;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1013
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1014
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1015
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindEndOfLine() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1016
    return foundIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1017
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1018
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1019
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1020
// Handles next subcommand from line buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1021
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1022
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1023
TBool CDunAtCmdHandler::HandleNextSubCommand()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1024
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1025
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextSubCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1026
    if ( iHandleState != EDunStateAtCmdHandling )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1027
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1028
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextSubCommand() (not ready) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1029
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1030
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1031
    TBool extracted = ExtractNextSubCommand();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1032
    if ( !extracted )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1033
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1034
        ManageEndOfCmdHandling( ETrue, ETrue );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1035
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextSubCommand() (last) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1036
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1037
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1038
    // Next convert the decoded AT command to uppercase
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1039
    // Don't check for case status -> let mixed cases pass
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1040
    TInt oldLength = iParseInfo.iSendBuffer.Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1041
    iParseInfo.iSendBuffer.SetLength( iParseInfo.iLimit );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1042
    iParseInfo.iSendBuffer.UpperCase();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1043
    iParseInfo.iSendBuffer.SetLength( oldLength );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1044
    // Next always send the command to ATEXT
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1045
    iCmdPusher->IssueRequest( iParseInfo.iSendBuffer );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1046
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleNextSubCommand() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1047
    return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1048
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1049
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1050
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1051
// Manages end of AT command handling
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1052
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1053
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1054
void CDunAtCmdHandler::ManageEndOfCmdHandling( TBool aNotifyLocal,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1055
                                               TBool aNotifyExternal )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1056
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1057
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEndOfCmdHandling()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1058
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEndOfCmdHandling() (loc=%d, ext=%d)"), aNotifyLocal, aNotifyExternal ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1059
    // If iEndIndex is (>=0 && <iInput.Length()) it means more data waits in
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1060
    // iInput that didn't fit in iInputBuffer.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1061
    TInt cmdLength = iInput->Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1062
    TBool subBlock = ( iEndIndex>=0&&iEndIndex<cmdLength ) ? ETrue : EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1063
    if ( iLineBuffer.Length()>0 && !subBlock )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1064
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1065
        // Line buffer set and no partial subblock, copy to lastbuffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1066
        iLastBuffer.Copy( iLineBuffer );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1067
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1068
    iLineBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1069
    iDecodeInfo.iFirstDecode = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1070
    iDecodeInfo.iDecodeIndex = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1071
    iDecodeInfo.iPrevExists = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1072
    iParseInfo.iLimit = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1073
    iParseInfo.iSendBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1074
    iEditorModeInfo.iContentFound = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1075
    iHandleState = EDunStateIdle;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1076
    if ( aNotifyLocal )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1077
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1078
        iCmdPusher->SetEndOfCmdLine();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1079
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1080
    // iEndIndex must not be reset to KErrNotFound only when
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1081
    // ExtractLineFromInputBuffer() found the next line
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1082
    // (when moreNeeded is EFalse)
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1083
    TBool resetIndex = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1084
    if ( aNotifyExternal )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1085
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1086
        TBool moreNeeded = ExtractLineFromInputBuffer();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1087
        if ( moreNeeded )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1088
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1089
            iUpstream->NotifyParserNeedsMoreData();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1090
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1091
        else
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1092
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1093
            // AppendBlockToInputBuffer() was able to fill with known end, handle next
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1094
            iHandleState = EDunStateAtCmdHandling;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1095
            HandleNextSubCommand();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1096
            resetIndex = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1097
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1098
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1099
    if ( resetIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1100
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1101
        iEndIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1102
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1103
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEndOfCmdHandling() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1104
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1105
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1106
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1107
// Extracts next subcommand from line buffer to send buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1108
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1109
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1110
TBool CDunAtCmdHandler::ExtractNextSubCommand( TBool aPeek )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1111
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1112
    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextSubCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1113
    TDunDecodeInfo oldInfo = iDecodeInfo;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1114
    iParseInfo.iLimit = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1115
    iParseInfo.iSendBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1116
    // Find start of subcommand from line buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1117
    TInt startIndex = FindStartOfSubCommand();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1118
    if ( startIndex < 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1119
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1120
        RestoreOldDecodeInfo( aPeek, oldInfo );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1121
        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextDecodedCommand() (no start) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1122
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1123
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1124
    iDecodeInfo.iDecodeIndex = startIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1125
    TBool specialCmd = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1126
    TInt endIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1127
    specialCmd = CheckSpecialCommand( endIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1128
    if ( !specialCmd )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1129
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1130
        FindSubCommand( endIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1131
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1132
    TInt lineLength = iLineBuffer.Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1133
    TBool inStartLimits = ( startIndex >= 0 && startIndex < lineLength ) ? ETrue : EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1134
    TBool inEndLimits   = ( endIndex   >= 0 && endIndex   < lineLength ) ? ETrue : EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1135
    if ( !inStartLimits || !inEndLimits )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1136
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1137
        RestoreOldDecodeInfo( aPeek, oldInfo );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1138
        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextSubCommand() (no end) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1139
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1140
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1141
    TInt cmdLength = endIndex - startIndex + 1;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1142
    // If the limit was not already set then do it now
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1143
    if ( iParseInfo.iLimit < 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1144
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1145
        iParseInfo.iLimit = cmdLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1146
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1147
    // Next create a new command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1148
    if ( !iDecodeInfo.iFirstDecode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1149
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1150
        _LIT( KAtPrefix, "AT" );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1151
        iParseInfo.iSendBuffer.Append( KAtPrefix );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1152
        if ( !specialCmd )  // Already added with CheckSpecialCommand()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1153
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1154
            iParseInfo.iLimit += 2;  // Length of "AT"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1155
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1156
        // Note: The length of iDecodeBuffer is not exceeded here because "AT"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1157
        // is added only for the second commands after that.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1158
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1159
    iParseInfo.iSendBuffer.Append( &iLineBuffer[startIndex], cmdLength );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1160
    // Change settings for the next decode round
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1161
    iDecodeInfo.iFirstDecode = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1162
    iDecodeInfo.iDecodeIndex = endIndex + 1;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1163
    RestoreOldDecodeInfo( aPeek, oldInfo );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1164
    if ( !aPeek )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1165
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1166
        iDecodeInfo.iCmdsHandled++;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1167
        FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextSubCommand() (handled=%d)"), iDecodeInfo.iCmdsHandled ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1168
        }
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1169
    FTRACE(FPrint( _L("CDunAtCmdPusher::ExtractNextSubCommand() extracted:") ));
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1170
    FTRACE(FPrintRaw(iParseInfo.iSendBuffer) );
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1171
    FTRACE(FPrint( _L("CDunAtCmdHandler::ExtractNextSubCommand() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1172
    return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1173
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1174
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1175
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1176
// Finds the start of subcommand from line buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1177
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1178
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1179
TBool CDunAtCmdHandler::FindStartOfSubCommand()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1180
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1181
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfSubCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1182
    TInt i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1183
    TInt foundIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1184
    TInt lineLength = iLineBuffer.Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1185
    for ( i=iDecodeInfo.iDecodeIndex; i<lineLength; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1186
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1187
        TChar character = iLineBuffer[i];
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1188
        if ( !IsDelimiterCharacter(character,ETrue,ETrue) )
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1189
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1190
            foundIndex = i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1191
            break;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1192
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1193
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1194
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindStartOfSubCommand() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1195
    return foundIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1196
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1197
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1198
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1199
// Restores old decode info. For ExtractNextDecodedCommand() when aPeeks is
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1200
// ETrue.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1201
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1202
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1203
void CDunAtCmdHandler::RestoreOldDecodeInfo( TBool aPeek,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1204
                                             TDunDecodeInfo& aOldInfo )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1205
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1206
    FTRACE(FPrint( _L("CDunAtCmdHandler::RestoreOldDecodeInfo()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1207
    if ( aPeek )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1208
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1209
        iEditorModeInfo.iPeekInfo = iDecodeInfo;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1210
        iDecodeInfo = aOldInfo;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1211
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1212
    FTRACE(FPrint( _L("CDunAtCmdHandler::RestoreOldDecodeInfo() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1213
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1214
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1215
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1216
// Tests for end of AT command line
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1217
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1218
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1219
TBool CDunAtCmdHandler::IsEndOfLine( TChar& aCharacter )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1220
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1221
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsEndOfCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1222
    if ( aCharacter==iCarriageReturn || aCharacter==iLineFeed )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1223
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1224
        FTRACE(FPrint( _L("CDunAtCmdHandler::IsEndOfCommand() (found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1225
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1226
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1227
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsEndOfCommand() (not found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1228
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1229
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1230
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1231
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1232
// Checks if character is delimiter character
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1233
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1234
//
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1235
TBool CDunAtCmdHandler::IsDelimiterCharacter( TChar aCharacter,
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1236
                                              TBool aBasic,
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1237
                                              TBool aExtended )
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1238
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1239
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsDelimiterCharacter()") ));
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1240
   if ( aBasic && ( aCharacter.IsSpace()||aCharacter==0x00) )
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1241
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1242
        FTRACE(FPrint( _L("CDunAtCmdHandler::IsDelimiterCharacter() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1243
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1244
        }
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1245
   if ( aExtended && aCharacter == ';' )
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1246
        {
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1247
        FTRACE(FPrint( _L("CDunAtCmdHandler::IsDelimiterCharacter() (extended) complete") ));
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1248
        return ETrue;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1249
        }
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1250
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsDelimiterCharacter() (not delimiter) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1251
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1252
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1253
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1254
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1255
// Checks if character is of extended group
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1256
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1257
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1258
TBool CDunAtCmdHandler::IsExtendedCharacter( TChar aCharacter )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1259
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1260
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedCharacter()") ));
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1261
    // Extended characters supported by this function (parser understands these)
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1262
    // '+': Universal; mentioned in 3GPP TS 27.007, 3GPP TS 27.005, ITU-T V.250
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1263
    // '&': Mentioned in ITU-T V.250 and in some "de facto" commands
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1264
    // '%': Used by some old Hayes modems, left just in case
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1265
    // '\': Used by some old Hayes modems, left just in case
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1266
    // '*': Used by some old Hayes modems, AT&T and others
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1267
    // '#': Used by some old Hayes modems, left just in case
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1268
    // '$': Used by AT&T and Qualcomm
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1269
    // '^': Used by China Mobile
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1270
    // [please maintain this list here for quick reference]
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1271
    if ( aCharacter=='+'  || aCharacter=='&' || aCharacter=='%' ||
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1272
         aCharacter=='\\' || aCharacter=='*' || aCharacter=='#' ||
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1273
         aCharacter=='$'  || aCharacter=='^' )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1274
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1275
        FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedCharacter() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1276
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1277
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1278
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedCharacter() (not extended) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1279
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1280
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1281
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1282
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1283
// Checks special command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1284
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1285
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1286
TBool CDunAtCmdHandler::CheckSpecialCommand( TInt& aEndIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1287
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1288
    FTRACE(FPrint( _L("CDunAtCmdHandler::CheckSpecialCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1289
    TInt atPrefixLen = 0;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1290
    TInt startIndex = iDecodeInfo.iDecodeIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1291
    TInt newLength = iLineBuffer.Length() - startIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1292
    TBuf8<KDunLineBufLength> upperBuf;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1293
    if ( !iDecodeInfo.iFirstDecode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1294
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1295
        // For cases such as "ATM1L3DT*99#" "DT" must have "AT"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1296
        _LIT8( KAtPrefix, "AT" );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1297
        upperBuf.Copy( KAtPrefix );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1298
        atPrefixLen = 2;  // "AT"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1299
        newLength += atPrefixLen;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1300
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1301
    upperBuf.Append( &iLineBuffer[startIndex], newLength );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1302
    upperBuf.UpperCase();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1303
    TInt i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1304
    TInt count = iSpecials.Count();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1305
    for ( i=0; i<count; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1306
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1307
        HBufC8* specialCmd = iSpecials[i];
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1308
        TInt specialLength = specialCmd->Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1309
        if ( newLength < specialLength )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1310
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1311
            continue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1312
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1313
        TInt origLength = newLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1314
        if ( newLength > specialLength )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1315
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1316
            upperBuf.SetLength( specialLength );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1317
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1318
        TInt cmpResult = upperBuf.Compare( *specialCmd );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1319
        upperBuf.SetLength( origLength );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1320
        if ( cmpResult == 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1321
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1322
            iParseInfo.iLimit = specialLength;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1323
            aEndIndex = (origLength-1) + startIndex - atPrefixLen;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1324
            FTRACE(FPrint( _L("CDunAtCmdHandler::CheckSpecialCommand() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1325
            return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1326
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1327
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1328
    FTRACE(FPrint( _L("CDunAtCmdHandler::CheckSpecialCommand() (not found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1329
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1330
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1331
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1332
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1333
// Saves character decode state for a found character
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1334
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1335
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1336
void CDunAtCmdHandler::SaveFoundCharDecodeState( TChar aCharacter,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1337
                                                 TBool aAddSpecial )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1338
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1339
    FTRACE(FPrint( _L("CDunAtCmdHandler::SaveFoundCharDecodeState()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1340
    iDecodeInfo.iPrevExists = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1341
    iDecodeInfo.iPrevChar = aCharacter;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1342
    if ( aAddSpecial )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1343
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1344
        iDecodeInfo.iSpecialFound =
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1345
                iAtSpecialCmdHandler->IsCompleteSubCommand( aCharacter );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1346
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1347
    FTRACE(FPrint( _L("CDunAtCmdHandler::SaveFoundCharDecodeState() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1348
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1349
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1350
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1351
// Saves character decode state for a not found character
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1352
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1353
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1354
void CDunAtCmdHandler::SaveNotFoundCharDecodeState()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1355
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1356
    FTRACE(FPrint( _L("CDunAtCmdHandler::SaveNotFoundCharDecodeState()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1357
    iDecodeInfo.iPrevExists = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1358
    // Note: don't set iAssignFound or iInQuotes here
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1359
    iDecodeInfo.iSpecialFound = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1360
    FTRACE(FPrint( _L("CDunAtCmdHandler::SaveNotFoundCharDecodeState() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1361
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1362
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1363
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1364
// Find quotes within subcommands
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1365
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1366
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1367
TBool CDunAtCmdHandler::FindSubCommandQuotes( TChar aCharacter,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1368
                                              TInt aStartIndex,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1369
                                              TInt& aEndIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1370
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1371
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandQuotes()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1372
    if ( aCharacter == '"' )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1373
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1374
        if ( iParseInfo.iLimit < 0 )  // Only first the first '"'
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1375
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1376
            iParseInfo.iLimit = aEndIndex - aStartIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1377
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1378
        iDecodeInfo.iInQuotes ^= ETrue;  // EFalse to ETrue or ETrue to EFalse
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1379
        SaveFoundCharDecodeState( aCharacter, EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1380
        FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandQuotes() (quote) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1381
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1382
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1383
    // The next ones are those that are not in quotes.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1384
    // We still need to save the iParseInfo.iLimit and skip non-delimiter characters.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1385
    if ( aCharacter == '=' )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1386
        {
60
841f70763fbe 201044_04
hgs
parents: 52
diff changeset
  1387
        if ( iParseInfo.iLimit < 0 )  // Only the first '"'
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1388
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1389
            iParseInfo.iLimit = aEndIndex - aStartIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1390
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1391
        iDecodeInfo.iAssignFound = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1392
        SaveFoundCharDecodeState( aCharacter, EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1393
        FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandQuotes() (equals) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1394
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1395
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1396
    if ( iDecodeInfo.iInQuotes )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1397
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1398
        SaveNotFoundCharDecodeState();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1399
        FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandQuotes() (in quotes) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1400
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1401
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1402
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandQuotes() (not found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1403
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1404
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1405
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1406
// ---------------------------------------------------------------------------
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1407
// Check if in basic command delimiter skip zone
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1408
// ---------------------------------------------------------------------------
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1409
//
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1410
TBool CDunAtCmdHandler::IsBasicDelimiterSkipZone( TChar aCharacter,
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1411
                                                  TInt& aEndIndex )
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1412
    {
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1413
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsBasicDelimiterSkipZone()") ));
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1414
    if ( !IsDelimiterCharacter(aCharacter,ETrue,EFalse) )
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1415
        {
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1416
        FTRACE(FPrint( _L("CDunAtCmdHandler::IsBasicDelimiterSkipZone() complete") ));
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1417
        return EFalse;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1418
        }
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1419
    // Check the case after '='
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1420
    if ( iDecodeInfo.iAssignFound )
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1421
        {
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1422
        FTRACE(FPrint( _L("CDunAtCmdHandler::IsBasicDelimiterSkipZone() (after =) complete") ));
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1423
        return ETrue;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1424
        }
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1425
    // Check the case before '='
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1426
    TInt peekIndex = aEndIndex + 1;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1427
    TInt lineLength = iLineBuffer.Length();
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1428
    for ( ; peekIndex<lineLength; peekIndex++ )
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1429
        {
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1430
        TChar peekCharacter = iLineBuffer[peekIndex];
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1431
        if ( peekCharacter=='?' || peekCharacter=='=' )
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1432
            {
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1433
            aEndIndex = peekIndex;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1434
            FTRACE(FPrint( _L("CDunAtCmdHandler::IsBasicDelimiterSkipZone() (? or =) complete") ));
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1435
            return ETrue;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1436
            }
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1437
        if ( !IsDelimiterCharacter(peekCharacter,ETrue,EFalse) )
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1438
            {
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1439
            break;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1440
            }
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1441
        }
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1442
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsBasicDelimiterSkipZone() complete") ));
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1443
    return EFalse;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1444
    }
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1445
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1446
// ---------------------------------------------------------------------------
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1447
// Check if in next subcommand's extended border
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1448
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1449
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1450
TBool CDunAtCmdHandler::IsExtendedBorder( TChar aCharacter,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1451
                                          TInt aStartIndex,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1452
                                          TInt& aEndIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1453
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1454
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedBorder()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1455
    TInt expectedIndex = 0;  // "+CMD" when iDecodeInfo.iFirstDecode is EFalse
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1456
    TInt extendedIndex = aEndIndex - aStartIndex;  // absolute index to the extended character
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1457
    if ( iDecodeInfo.iFirstDecode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1458
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1459
        expectedIndex = 2;  // "AT+CMD"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1460
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1461
    if ( extendedIndex == expectedIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1462
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1463
        iDecodeInfo.iExtendedIndex = aEndIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1464
        SaveFoundCharDecodeState( aCharacter );
31
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1465
        FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedBorder() (no border normal) complete") ));
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1466
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1467
        }
31
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1468
    // Now suspect border found so peek the next character after the suspected
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1469
    // extended character. If it is not alphabetical character, return with EFalse.
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1470
    // This case is to detect the cases such as "AT+VTS={*,3000}", where '*' would
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1471
    // be the start of the next command in normal cases.
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1472
    TInt peekIndex = aEndIndex + 1;
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1473
    TInt lineLength = iLineBuffer.Length();
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1474
    if ( peekIndex < lineLength )
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1475
        {
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1476
        TChar nextCharacter = iLineBuffer[peekIndex];
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1477
        if ( !nextCharacter.IsAlpha() )
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1478
            {
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1479
            SaveFoundCharDecodeState( aCharacter );
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1480
            FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedBorder() (no border special) complete") ));
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1481
            return EFalse;
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1482
            }
a26669f87b46 201027_03
hgs
parents: 29
diff changeset
  1483
        }
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1484
    aEndIndex--;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1485
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsExtendedBorder() (border) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1486
    return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1487
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1488
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1489
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1490
// Finds subcommand with alphanumeric borders
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1491
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1492
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1493
TBool CDunAtCmdHandler::FindSubCommandAlphaBorder( TChar aCharacter,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1494
                                                   TInt& aEndIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1495
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1496
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandAlphaBorder()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1497
    if ( iDecodeInfo.iAssignFound && !iDecodeInfo.iInQuotes )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1498
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1499
        // Check the special case when assigning a number with "basic" command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1500
        // and there is no delimiter after it. In this case <Numeric>|<Alpha>
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1501
        // border must be detected but only for a "basic" command, not for
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1502
        // extended. This type of case is in active use in initialization
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1503
        // strings where "ATS7=60L1M1X3" is one example
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1504
        if ( iDecodeInfo.iExtendedIndex<0    && iDecodeInfo.iPrevExists &&
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1505
             iDecodeInfo.iPrevChar.IsDigit() && aCharacter.IsAlpha() )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1506
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1507
            aEndIndex--;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1508
            FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandAlphaBorder() (N|A) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1509
            return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1510
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1511
        // The code below is for the following type of cases:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1512
        // (do not check alphanumeric borders if "=" set without quotes):
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1513
        // AT+CMD=a
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1514
        FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandAlphaBorder() (skip) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1515
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1516
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1517
    if ( !iDecodeInfo.iPrevExists || !aCharacter.IsAlpha() )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1518
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1519
        FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandAlphaBorder() (not found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1520
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1521
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1522
    if ( iDecodeInfo.iPrevChar.IsAlpha() )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1523
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1524
        // The check below detects the following type of cases
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1525
        // (note that special handling is needed to separate the Alpha|Alpha boundary):
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1526
        // AT&FE0
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1527
        if ( iDecodeInfo.iSpecialFound )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1528
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1529
            // Special command was found before and this is Alpha|Alpha boundary -> end
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1530
            aEndIndex--;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1531
            FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandAlphaBorder() (special) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1532
            return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1533
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1534
        // The code below is for the following type of cases
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1535
        // (note there is no border between C|M, for example -> continue):
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1536
        // ATCMD
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1537
        FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandAlphaBorder() (continue) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1538
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1539
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1540
    // The code below is for skipping the following type of cases:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1541
    // AT+CMD [the '+' must be skipped]
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1542
    if ( aEndIndex-1 == iDecodeInfo.iExtendedIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1543
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1544
        FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandAlphaBorder() (extended) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1545
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1546
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1547
    // The code below is for the following type of cases:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1548
    // ATCMD?ATCMD
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1549
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommandAlphaBorder() (boundary) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1550
    aEndIndex--;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1551
    return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1552
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1553
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1554
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1555
// Finds subcommand
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1556
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1557
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1558
TInt CDunAtCmdHandler::FindSubCommand( TInt& aEndIndex )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1559
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1560
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1561
    TInt startIndex = iDecodeInfo.iDecodeIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1562
    aEndIndex = startIndex;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1563
    TBool found = EFalse;
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1564
    TBool skipZone = EFalse;
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1565
    TInt lineLength = iLineBuffer.Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1566
    iDecodeInfo.iAssignFound = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1567
    iDecodeInfo.iInQuotes = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1568
    iDecodeInfo.iExtendedIndex = KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1569
    SaveNotFoundCharDecodeState();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1570
    iAtSpecialCmdHandler->ResetComparisonBuffer();  // just to be sure
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1571
    for ( ; aEndIndex<lineLength; aEndIndex++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1572
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1573
        TChar character = iLineBuffer[aEndIndex];
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1574
        // Skip '=', quotes and data in quotes
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1575
        found = FindSubCommandQuotes( character, startIndex, aEndIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1576
        if ( found )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1577
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1578
            continue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1579
            }
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1580
        // Skip basic command delimiter in the following cases:
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1581
        // "ATCOMMAND    ?"
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1582
        // "AT+COMMAND   ="
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1583
        // "AT+COMMAND=PARAM1,     PARAM2"
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1584
        skipZone = IsBasicDelimiterSkipZone( character, aEndIndex );
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1585
        if ( skipZone )
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1586
            {
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1587
            continue;
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1588
            }
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1589
        // If '?', stop immediately
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1590
        if ( character == '?' )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1591
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1592
            FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommand() (?) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1593
            return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1594
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1595
        // The check below detects the following type of cases:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1596
        // ATCMD<delimiter>
52
866b4af7ffbe 201039_01
hgs
parents: 37
diff changeset
  1597
        if ( IsDelimiterCharacter(character,ETrue,ETrue) )
29
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1598
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1599
            aEndIndex--;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1600
            FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommand() (delimiter) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1601
            return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1602
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1603
        // The check below detects the following type of cases:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1604
        // ATCMD+CMD [first + as delimiter]
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1605
        // AT+CMD+CMD [second + as delimiter]
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1606
        if ( IsExtendedCharacter(character) )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1607
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1608
            found = IsExtendedBorder( character, startIndex, aEndIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1609
            if ( !found )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1610
                {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1611
                continue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1612
                }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1613
            FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommand() (extended) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1614
            return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1615
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1616
        found = FindSubCommandAlphaBorder( character, aEndIndex );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1617
        if ( found )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1618
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1619
            FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommand() (alpha sub) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1620
            return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1621
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1622
        SaveFoundCharDecodeState( character );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1623
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1624
    aEndIndex--;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1625
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindSubCommand() (not found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1626
    return KErrNotFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1627
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1628
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1629
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1630
// Check if "A/" command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1631
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1632
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1633
TBool CDunAtCmdHandler::IsASlashCommand()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1634
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1635
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsASlashCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1636
    if ( iLineBuffer.Length() == 2 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1637
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1638
        if ( iLineBuffer[1] == '/' &&
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1639
            (iLineBuffer[0] == 'A' || iLineBuffer[0] == 'a') )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1640
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1641
            FTRACE(FPrint( _L("CDunAtCmdHandler::IsASlashCommand() (found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1642
            return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1643
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1644
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1645
    FTRACE(FPrint( _L("CDunAtCmdHandler::IsASlashCommand() (not found) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1646
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1647
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1648
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1649
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1650
// Handles "A/" command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1651
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1652
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1653
TBool CDunAtCmdHandler::HandleASlashCommand()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1654
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1655
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleASlashCommand()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1656
    // If not "A/" command, return
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1657
    if ( !IsASlashCommand() )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1658
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1659
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleASlashCommand() (no push) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1660
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1661
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1662
    iEndIndex = iInput->Length();  // Causes skipping of last '/' in ManageEndOfCmdHandling()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1663
    // If "A/" command and last buffer exist, set the last buffer as the current buffer
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1664
    if ( iLastBuffer.Length() > 0 )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1665
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1666
        iLineBuffer.Copy( iLastBuffer );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1667
        FTRACE(FPrint( _L("CDunAtCmdHandler::HandleASlashCommand() (copy) complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1668
        return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1669
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1670
    // Last buffer not set so return "ERROR"
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1671
    iDownstream->NotifyDataPushRequest( &iErrorBuffer, NULL );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1672
    FTRACE(FPrint( _L("CDunAtCmdHandler::HandleASlashCommand() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1673
    return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1674
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1675
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1676
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1677
// Manages command mode change
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1678
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1679
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1680
TBool CDunAtCmdHandler::ManageCommandModeChange( TUint aMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1681
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1682
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCommandModeChange()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1683
    if ( aMode & KCommandModeChanged )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1684
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1685
        if ( aMode & KModeCommand )  // command mode ON
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1686
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1687
            ReportCommandModeChange( ETrue );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1688
            FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCommandModeChange() command mode changed ON" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1689
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1690
        else  // command mode OFF
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1691
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1692
            ReportCommandModeChange( EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1693
            FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCommandModeChange() command mode changed OFF" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1694
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1695
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCommandModeChange() (change) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1696
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1697
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1698
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCommandModeChange()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1699
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1700
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1701
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1702
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1703
// Reports command mode start/end change
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1704
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1705
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1706
void CDunAtCmdHandler::ReportCommandModeChange( TBool aStart )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1707
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1708
    FTRACE(FPrint( _L("CDunAtCmdHandler::ReportCommandModeChange()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1709
    TInt i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1710
    TInt count = iCmdCallbacks.Count();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1711
    if ( aStart )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1712
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1713
        if ( iDataMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1714
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1715
            for ( i=0; i<count; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1716
                {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1717
                iCmdCallbacks[i]->NotifyCommandModeStart();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1718
                }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1719
            iDataMode = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1720
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1721
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1722
    else  // end
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1723
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1724
        if ( !iDataMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1725
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1726
            for ( i=0; i<count; i++ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1727
                {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1728
                iCmdCallbacks[i]->NotifyCommandModeEnd();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1729
                }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1730
            iDataMode = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1731
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1732
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1733
    FTRACE(FPrint( _L("CDunAtCmdHandler::ReportCommandModeChange() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1734
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1735
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1736
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1737
// Manages echo mode change
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1738
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1739
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1740
TBool CDunAtCmdHandler::ManageEchoModeChange( TUint aMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1741
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1742
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEchoModeChange()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1743
    if ( aMode & KEchoModeChanged )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1744
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1745
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEchoModeChange() checking echo mode..." ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1746
        if ( aMode & KModeEcho )  // echo mode ON
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1747
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1748
            iEchoOn = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1749
            FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEchoModeChange() echo mode changed ON" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1750
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1751
        else  // echo mode OFF
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1752
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1753
            iEchoOn = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1754
            FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEchoModeChange() echo mode changed OFF" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1755
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1756
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEchoModeChange() (change) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1757
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1758
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1759
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEchoModeChange() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1760
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1761
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1762
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1763
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1764
// Manages quiet mode change
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1765
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1766
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1767
TBool CDunAtCmdHandler::ManageQuietModeChange( TUint aMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1768
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1769
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageQuietModeChange()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1770
    if ( aMode & KQuietModeChanged )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1771
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1772
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEchoModeChange() checking quiet mode..." ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1773
        if ( aMode & KModeQuiet )  // quiet mode ON
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1774
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1775
            iAtCmdExt.ReportQuietModeChange( ETrue );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1776
            iQuietOn = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1777
            FTRACE(FPrint( _L("CDunAtCmdHandler::ManageQuietModeChange() quiet mode changed ON" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1778
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1779
        else  // quiet mode OFF
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1780
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1781
            iAtCmdExt.ReportQuietModeChange( EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1782
            iQuietOn = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1783
            FTRACE(FPrint( _L("CDunAtCmdHandler::ManageQuietModeChange() quiet mode changed OFF" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1784
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1785
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageQuietModeChange() (change) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1786
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1787
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1788
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageQuietModeChange() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1789
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1790
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1791
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1792
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1793
// Manages quiet mode change
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1794
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1795
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1796
TBool CDunAtCmdHandler::ManageVerboseModeChange( TUint aMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1797
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1798
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageVerboseModeChange()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1799
    if ( aMode & KVerboseModeChanged )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1800
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1801
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageVerboseModeChange() checking verbose mode..." ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1802
        if ( aMode & KModeVerbose )  // verbose mode ON
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1803
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1804
            iAtCmdExt.ReportVerboseModeChange( ETrue );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1805
            iVerboseOn = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1806
            FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyVerboseStatusChange() verbose mode changed ON" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1807
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1808
        else  // verbose mode OFF
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1809
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1810
            iAtCmdExt.ReportVerboseModeChange( EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1811
            iVerboseOn = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1812
            FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyVerboseStatusChange() verbose mode changed OFF" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1813
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1814
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageVerboseModeChange() (change) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1815
        return ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1816
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1817
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageVerboseModeChange() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1818
    return EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1819
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1820
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1821
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1822
// Manages character change
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1823
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1824
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1825
void CDunAtCmdHandler::ManageCharacterChange( TUint aMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1826
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1827
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCharacterChange()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1828
    if ( aMode & KCarriageChanged )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1829
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1830
        iCarriageReturn = aMode & (KModeChanged-1);
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1831
        iAtCmdExt.ReportCharacterChange( ECharTypeCarriage, iCarriageReturn );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1832
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCharacterChange() carriage return changed" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1833
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1834
    else if ( aMode & KLineFeedChanged )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1835
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1836
        iLineFeed = aMode & (KModeChanged-1);
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1837
        iAtCmdExt.ReportCharacterChange( ECharTypeLineFeed, iLineFeed );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1838
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCharacterChange() line feed changed" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1839
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1840
    else if ( aMode & KBackspaceChanged )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1841
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1842
        iBackspace = aMode & (KModeChanged-1);
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1843
        iAtCmdExt.ReportCharacterChange( ECharTypeBackspace, iBackspace );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1844
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCharacterChange() backspace changed" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1845
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1846
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageCharacterChange() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1847
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1848
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1849
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1850
// Manages editor mode reply
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1851
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1852
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1853
TInt CDunAtCmdHandler::ManageEditorModeReply( TBool aStart )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1854
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1855
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEditorModeReply()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1856
    // Two modes possible here:
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1857
    // 1) Sending data directly from DTE to DCE, i.e. no subsequent data in
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1858
    //    the input buffer -> Reissue read request from DTE.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1859
    // 2) Sending data from input buffer to DCE -> Do not reissue read request
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1860
    //    from DTE: send the data in a loop
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1861
    // In summary: send data byte-by-byte in editor mode until end of input.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1862
    // When end of input notify CDunUpstream to reissue the read request.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1863
    TBool nextContentFound = FindNextContent( aStart );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1864
    if ( !nextContentFound )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1865
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1866
        iUpstream->NotifyEditorModeReply( aStart );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1867
        FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEditorModeReply() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1868
        return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1869
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1870
    // In block mode end the block mode by sending <ESC> and hope it works.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1871
    iEscapeBuffer.Zero();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1872
    iEscapeBuffer.Append( KDunEscape );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1873
    iCmdPusher->IssueRequest( iEscapeBuffer, EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1874
    FTRACE(FPrint( _L("CDunAtCmdHandler::ManageEditorModeReply() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1875
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1876
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1877
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1878
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1879
// Finds the next content from the input data
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1880
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1881
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1882
TBool CDunAtCmdHandler::FindNextContent( TBool aStart )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1883
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1884
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindNextContent()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1885
    if ( !aStart )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1886
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1887
        FTRACE(FPrint( _L("CDunAtCmdHandler::FindNextContent() (skip) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1888
        return iEditorModeInfo.iContentFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1889
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1890
    // If iEndIndex is (>=0 && <iInput.Length()) it means more data waits in
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1891
    // iInput that didn't fit in iInputBuffer. Only check FindStartOfCommand()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1892
    // if iEndIndex < 0, meaning more data is needed from CDunUpstream.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1893
    TBool contentFound = EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1894
    TInt cmdLength = iInput->Length();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1895
    TBool subBlock = ( iEndIndex>=0&&iEndIndex<cmdLength ) ? ETrue : EFalse;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1896
    if ( subBlock )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1897
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1898
        contentFound = ETrue;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1899
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1900
    if ( !contentFound )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1901
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1902
        contentFound = ExtractNextSubCommand( ETrue );  // peek
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1903
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1904
    iEditorModeInfo.iContentFound = contentFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1905
    FTRACE(FPrint( _L("CDunAtCmdHandler::FindNextContent() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1906
    return contentFound;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1907
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1908
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1909
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1910
// From class MDunAtCmdPusher.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1911
// Notifies about end of AT command processing. This is after all reply data
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1912
// for an AT command is multiplexed to the downstream.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1913
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1914
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1915
TInt CDunAtCmdHandler::NotifyEndOfProcessing( TInt /*aError*/ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1916
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1917
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfProcessing()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1918
    TBool editorMode = iCmdPusher->EditorMode();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1919
    if ( editorMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1920
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1921
        ManageEditorModeReply( ETrue );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1922
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfProcessing() (editor) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1923
        return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1924
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1925
    HandleNextSubCommand();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1926
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfProcessing() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1927
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1928
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1929
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1930
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1931
// From class MDunAtCmdPusher.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1932
// Notifies about request to stop AT command handling for the rest of the
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1933
// command line data
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1934
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1935
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1936
void CDunAtCmdHandler::NotifyEndOfCmdLineProcessing()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1937
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1938
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfCmdLineProcessing()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1939
    ManageEndOfCmdHandling( ETrue, ETrue );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1940
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEndOfCmdLineProcessing() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1941
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1942
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1943
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1944
// From class MDunAtCmdPusher.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1945
// Notifies about request to peek for the next command
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1946
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1947
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1948
TBool CDunAtCmdHandler::NotifyNextCommandPeekRequest()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1949
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1950
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyNextCommandPeekRequest()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1951
    TBool extracted = ExtractNextSubCommand( ETrue );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1952
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyNextCommandPeekRequest() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1953
    return extracted;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1954
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1955
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1956
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1957
// From class MDunAtCmdPusher.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1958
// Notifies about editor mode reply
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1959
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1960
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1961
TInt CDunAtCmdHandler::NotifyEditorModeReply()
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1962
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1963
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEditorModeReply()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1964
    TInt retVal = ManageEditorModeReply( EFalse );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1965
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyEditorModeReply() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1966
    return retVal;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1967
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1968
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1969
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1970
// From class MDunAtEcomListen.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1971
// Notifies about new plugin installation
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1972
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1973
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1974
TInt CDunAtCmdHandler::NotifyPluginInstallation( TUid& /*aPluginUid*/ )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1975
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1976
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyPluginInstallation()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1977
    CDunAtUrcHandler* urcHandler = NULL;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1978
    TRAPD( retTrap, urcHandler=AddOneUrcHandlerL() );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1979
    if ( retTrap != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1980
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1981
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyPluginInstallation() (trapped!) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1982
        return retTrap;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1983
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1984
    TInt retTemp = urcHandler->IssueRequest();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1985
    if ( retTemp != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1986
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1987
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyPluginInstallation() (issuerequest) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1988
        return retTemp;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1989
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1990
    TUid ownerUid = urcHandler->OwnerUid();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1991
    iAtCmdExt.ReportListenerUpdateReady( ownerUid, EEcomTypeInstall );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1992
    // As a last step recreate the special command data
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1993
    retTemp = RecreateSpecialCommands();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1994
    if ( retTemp != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1995
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1996
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyPluginInstallation() (recreate) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1997
        return retTemp;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1998
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  1999
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyPluginInstallation() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2000
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2001
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2002
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2003
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2004
// From class MDunAtEcomListen.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2005
// Notifies about existing plugin uninstallation
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2006
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2007
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2008
TInt CDunAtCmdHandler::NotifyPluginUninstallation( TUid& aPluginUid )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2009
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2010
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyPluginUninstallation()" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2011
    TInt i;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2012
    TInt count = iUrcHandlers.Count();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2013
    for ( i=count-1; i>=0; i-- )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2014
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2015
        TUid ownerUid = iUrcHandlers[i]->OwnerUid();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2016
        if ( ownerUid == aPluginUid )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2017
            {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2018
            delete iUrcHandlers[i];
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2019
            iUrcHandlers.Remove( i );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2020
            iAtCmdExt.ReportListenerUpdateReady( ownerUid,
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2021
                                                 EEcomTypeUninstall );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2022
            }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2023
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2024
    // As a last step recreate the special command data
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2025
    TInt retTemp = RecreateSpecialCommands();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2026
    if ( retTemp != KErrNone )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2027
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2028
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyPluginUninstallation() (recreate) complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2029
        return retTemp;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2030
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2031
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyPluginUninstallation() complete" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2032
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2033
    }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2034
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2035
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2036
// From class MDunAtModeListen.
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2037
// Gets called on mode status change
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2038
// ---------------------------------------------------------------------------
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2039
//
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2040
TInt CDunAtCmdHandler::NotifyModeStatusChange( TUint aMode )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2041
    {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2042
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyModeStatusChange()") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2043
    TBool commandModeSet = ManageCommandModeChange( aMode );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2044
    TBool echoModeSet = ManageEchoModeChange( aMode );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2045
    TBool quietModeSet = ManageQuietModeChange( aMode );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2046
    TBool verboseModeSet = ManageVerboseModeChange( aMode );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2047
    if ( quietModeSet || verboseModeSet )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2048
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2049
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyModeStatusChange() new settings: E=%d, Q=%d, V=%d"), iEchoOn, iQuietOn, iVerboseOn ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2050
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyModeStatusChange() (regenerate) mode set" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2051
        RegenerateReplyStrings();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2052
        return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2053
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2054
    // Keep the following after "quietModeSet || verboseModeSet" in order to
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2055
    // regenerate the reply also if two modes change at the same time
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2056
    if ( commandModeSet || echoModeSet )
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2057
        {
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2058
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyModeStatusChange() new settings: E=%d, Q=%d, V=%d"), iEchoOn, iQuietOn, iVerboseOn ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2059
        FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyModeStatusChange() mode set" ) ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2060
        return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2061
        }
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2062
    ManageCharacterChange( aMode );
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2063
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyModeStatusChange() new settings: CR=%u, LF=%u, BS=%u"), iCarriageReturn, iLineFeed, iBackspace ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2064
    RegenerateReplyStrings();
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2065
    FTRACE(FPrint( _L("CDunAtCmdHandler::NotifyModeStatusChange() complete") ));
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2066
    return KErrNone;
3ae5cb0b4c02 201025_07
hgs
parents:
diff changeset
  2067
    }