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