localconnectivityservice/dun/atext/src/DunAtSpecialCmdHandler.cpp
author hgs
Mon, 17 May 2010 11:02:52 +0300
changeset 33 0b722902461e
parent 31 3b92f7acdc91
permissions -rw-r--r--
201019_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31
hgs
parents:
diff changeset
     1
/*
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
31
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Special AT command handler
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "DunAtSpecialCmdHandler.h"
hgs
parents:
diff changeset
    19
#include "DunDebug.h"
hgs
parents:
diff changeset
    20
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    21
const TInt KDefaultGranularity = 1;
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    22
31
hgs
parents:
diff changeset
    23
// AT command(s) below is part of the AT&FE0Q0V1&C1&D2+IFC=3,1. command which
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    24
// is sent by MAC. There is no delimiter between "AT&F" and "E0".
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    25
// Only list those commands where alphabetical boundary detection is needed
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    26
// (i.e. "AT&F0" is not needed as "AT&F0E0" has non-alphabetical boundary)
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    27
_LIT8( KSpecialATCmd1, "AT&F" );
31
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    30
// Two-phased constructor.
hgs
parents:
diff changeset
    31
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    32
//
hgs
parents:
diff changeset
    33
CDunAtSpecialCmdHandler* CDunAtSpecialCmdHandler::NewL()
hgs
parents:
diff changeset
    34
    {
hgs
parents:
diff changeset
    35
    CDunAtSpecialCmdHandler* self = new (ELeave) CDunAtSpecialCmdHandler();
hgs
parents:
diff changeset
    36
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    37
    self->ConstructL();
hgs
parents:
diff changeset
    38
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    39
    return self;
hgs
parents:
diff changeset
    40
    }
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    43
// CDunAtSpecialCmdHandler::CDunAtSpecialCmdHandler
hgs
parents:
diff changeset
    44
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    45
//
hgs
parents:
diff changeset
    46
CDunAtSpecialCmdHandler::CDunAtSpecialCmdHandler()
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    47
    {
31
hgs
parents:
diff changeset
    48
    }
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
// CDunAtSpecialCmdHandler::ConstructL
hgs
parents:
diff changeset
    52
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    53
//
hgs
parents:
diff changeset
    54
void CDunAtSpecialCmdHandler::ConstructL()
hgs
parents:
diff changeset
    55
    {
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    56
    iSpecialCmds = new (ELeave) CDesC8ArrayFlat( KDefaultGranularity );
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    57
    // Add here all special commands which need to be handled
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    58
    iSpecialCmds->AppendL( KSpecialATCmd1 );
31
hgs
parents:
diff changeset
    59
    }
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    62
// Destructor.
hgs
parents:
diff changeset
    63
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    64
//
hgs
parents:
diff changeset
    65
CDunAtSpecialCmdHandler::~CDunAtSpecialCmdHandler()
hgs
parents:
diff changeset
    66
    {
hgs
parents:
diff changeset
    67
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::~CDunAtSpecialCmdHandler()") ));
hgs
parents:
diff changeset
    68
    delete iSpecialCmds;
hgs
parents:
diff changeset
    69
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::~CDunAtSpecialCmdHandler() complete") ));
hgs
parents:
diff changeset
    70
    }
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
// ---------------------------------------------------------------------------
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    73
// Checks if the command has to be treated special way.
31
hgs
parents:
diff changeset
    74
// For example in case of MAC, it sends command AT&FE0Q0V1&C1&D2+IFC=3,1.
hgs
parents:
diff changeset
    75
// meaning there is no delimiters in the command.
hgs
parents:
diff changeset
    76
// In case of MAC we try to search AT&F (sub command) string from the beginning
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    77
// of the command.
31
hgs
parents:
diff changeset
    78
// Search is done character by character basis.
hgs
parents:
diff changeset
    79
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    80
//
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    81
TBool CDunAtSpecialCmdHandler::IsCompleteSubCommand( TChar aCharacter )
31
hgs
parents:
diff changeset
    82
    {
hgs
parents:
diff changeset
    83
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand()") ));
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    84
    iBuffer.Append( aCharacter );
31
hgs
parents:
diff changeset
    85
    TBool completeSubCmd = EFalse;
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    86
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    87
    if( !IsDataReadyForComparison(iBuffer.Length()) )
31
hgs
parents:
diff changeset
    88
        {
hgs
parents:
diff changeset
    89
        // No need to do comparison because we don't have correct amount of data
hgs
parents:
diff changeset
    90
        FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand(), no need to compare") ));
hgs
parents:
diff changeset
    91
        return completeSubCmd;
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    92
        }
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    93
31
hgs
parents:
diff changeset
    94
    TInt count = iSpecialCmds->Count();
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
    95
    for ( TInt i=0; i<count; i++ )
31
hgs
parents:
diff changeset
    96
        {
hgs
parents:
diff changeset
    97
        if( iSpecialCmds->MdcaPoint(i).Compare(iBuffer) == 0 )
hgs
parents:
diff changeset
    98
            {
hgs
parents:
diff changeset
    99
            FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand(), match found, cmd index %d"), i ));
hgs
parents:
diff changeset
   100
            // Reset internal buffer for next comparison.
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   101
            ResetComparisonBuffer();
31
hgs
parents:
diff changeset
   102
            completeSubCmd = ETrue;
hgs
parents:
diff changeset
   103
            break;
hgs
parents:
diff changeset
   104
            }
hgs
parents:
diff changeset
   105
        }
hgs
parents:
diff changeset
   106
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsCompleteSubCommand() complete") ));
hgs
parents:
diff changeset
   107
    return completeSubCmd;
hgs
parents:
diff changeset
   108
    }
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
// ---------------------------------------------------------------------------
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   111
// Resets the buffer used for comparisons
31
hgs
parents:
diff changeset
   112
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   113
//
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   114
void CDunAtSpecialCmdHandler::ResetComparisonBuffer()
31
hgs
parents:
diff changeset
   115
    {
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   116
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::ResetComparisonBuffer()") ));
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   117
    iBuffer.FillZ();
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   118
    iBuffer.Zero();
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   119
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::ResetComparisonBuffer() complete") ));
31
hgs
parents:
diff changeset
   120
    }
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   123
// Defines when comparison is excecuted, checks if the data lengths are equal.
hgs
parents:
diff changeset
   124
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   125
//
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   126
TBool CDunAtSpecialCmdHandler::IsDataReadyForComparison( TInt aLength )
31
hgs
parents:
diff changeset
   127
    {
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   128
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsDataReadyForComparison()") ));
31
hgs
parents:
diff changeset
   129
    TInt count = iSpecialCmds->Count();
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   130
    for ( TInt i=0; i<count; i++ )
31
hgs
parents:
diff changeset
   131
        {
hgs
parents:
diff changeset
   132
        if( iSpecialCmds->MdcaPoint(i).Length() == aLength )
hgs
parents:
diff changeset
   133
            {
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   134
            FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsDataReadyForComparison() (ready) complete") ));
31
hgs
parents:
diff changeset
   135
            return ETrue;
hgs
parents:
diff changeset
   136
            }
hgs
parents:
diff changeset
   137
        }
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   138
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::IsDataReadyForComparison() (not ready) complete") ));
31
hgs
parents:
diff changeset
   139
    return EFalse;
hgs
parents:
diff changeset
   140
    }
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   143
// Defines minimum length of the special commands.
hgs
parents:
diff changeset
   144
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   145
//
hgs
parents:
diff changeset
   146
TInt CDunAtSpecialCmdHandler::MinimumLength()
hgs
parents:
diff changeset
   147
    {
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   148
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::MinimumLength()") ));
31
hgs
parents:
diff changeset
   149
    TInt length = iSpecialCmds->MdcaPoint(0).Length();
hgs
parents:
diff changeset
   150
    TInt count = iSpecialCmds->Count();
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   151
    for ( TInt i=1; i<count; i++ )
31
hgs
parents:
diff changeset
   152
        {
hgs
parents:
diff changeset
   153
        if( iSpecialCmds->MdcaPoint(i).Length() < length )
hgs
parents:
diff changeset
   154
            {
hgs
parents:
diff changeset
   155
            length = iSpecialCmds->MdcaPoint(i).Length();
hgs
parents:
diff changeset
   156
            break;
hgs
parents:
diff changeset
   157
            }
hgs
parents:
diff changeset
   158
        }
33
0b722902461e 201019_1
hgs
parents: 31
diff changeset
   159
    FTRACE(FPrint( _L("CDunAtSpecialCmdHandler::MinimumLength() complete") ));
31
hgs
parents:
diff changeset
   160
    return length;
hgs
parents:
diff changeset
   161
    }