cbsatplugin/atmisccmdplugin/src/cusdcommandhandler.cpp
author hgs
Wed, 29 Sep 2010 13:09:05 +0300
changeset 65 001a94c71129
parent 32 19bd632b5100
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26
hgs
parents:
diff changeset
     1
/* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
 * All rights reserved.
hgs
parents:
diff changeset
     3
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     4
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     5
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
 * Initial Contributors:
hgs
parents:
diff changeset
     8
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
     9
 *
hgs
parents:
diff changeset
    10
 * Contributors:
hgs
parents:
diff changeset
    11
 * Description :
hgs
parents:
diff changeset
    12
 *
hgs
parents:
diff changeset
    13
 */
hgs
parents:
diff changeset
    14
#include "cusdcommandhandler.h"
hgs
parents:
diff changeset
    15
hgs
parents:
diff changeset
    16
#include <exterror.h> 
hgs
parents:
diff changeset
    17
32
hgs
parents: 26
diff changeset
    18
#include "ussdreadmessageimpl.h"
hgs
parents: 26
diff changeset
    19
#include "ussdsendmessageimpl.h"
hgs
parents: 26
diff changeset
    20
26
hgs
parents:
diff changeset
    21
#include "atmisccmdpluginconsts.h"
hgs
parents:
diff changeset
    22
#include "debug.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
const TUint8 KPhCltUssdCarriageReturn = 0x0d;
hgs
parents:
diff changeset
    25
const TUint8 KPhCltUssdDcsNotSet  = 0x00; // not set
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
const TUint8 KQuarterShift( 2 );
hgs
parents:
diff changeset
    28
const TUint8 KHighNibbleShift( 4 );
hgs
parents:
diff changeset
    29
const TUint8 KDcsCharacterSet7Bit( 0x00 );
hgs
parents:
diff changeset
    30
const TUint8 KDcsCharacterSet8Bit( 0x01 );
hgs
parents:
diff changeset
    31
const TUint8 KDcsCharacterSet16Bit( 0x02 );
hgs
parents:
diff changeset
    32
const TUint8 KDcsCharacterSet7Bit2( 0x00 );
hgs
parents:
diff changeset
    33
const TUint8 KDcsCharacterSet16Bit2( 0x01 );
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
CCUSDCommandHandler* CCUSDCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone)
hgs
parents:
diff changeset
    36
    {
hgs
parents:
diff changeset
    37
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
    38
    CCUSDCommandHandler* self = new (ELeave) CCUSDCommandHandler(aCallback, aATCmdParser, aPhone);
hgs
parents:
diff changeset
    39
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    40
    self->ConstructL();
hgs
parents:
diff changeset
    41
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    42
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
    43
    return self;
hgs
parents:
diff changeset
    44
    }
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
CCUSDCommandHandler::CCUSDCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
32
hgs
parents: 26
diff changeset
    47
    CATCmdSyncBase(aCallback, aATCmdParser, aPhone)
26
hgs
parents:
diff changeset
    48
    {
hgs
parents:
diff changeset
    49
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
    50
    iSendAttributes.iDcs = KPhCltUssdDcsNotSet;  
hgs
parents:
diff changeset
    51
    iSendAttributes.iType = RMobileUssdMessaging::EUssdMORequest;
hgs
parents:
diff changeset
    52
    iSendAttributes.iFlags = RMobileUssdMessaging::KUssdMessageType | RMobileUssdMessaging::KUssdMessageDcs | RMobileUssdMessaging::KUssdDataFormat;
hgs
parents:
diff changeset
    53
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
    54
    }
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
void CCUSDCommandHandler::ConstructL()
hgs
parents:
diff changeset
    57
    {    
hgs
parents:
diff changeset
    58
    TRACE_FUNC_ENTRY
32
hgs
parents: 26
diff changeset
    59
    iReply.CreateL(KDefaultCmdBufLength);
hgs
parents: 26
diff changeset
    60
26
hgs
parents:
diff changeset
    61
    User::LeaveIfError(iUssdMessaging.Open(iPhone));
hgs
parents:
diff changeset
    62
    
32
hgs
parents: 26
diff changeset
    63
    iUSSDSender = CUSSDSendMessageImpl::NewL(this, iUssdMessaging);
hgs
parents: 26
diff changeset
    64
    iUSSDReader = CUSSDReadMessageImpl::NewL(this, iUssdMessaging);
26
hgs
parents:
diff changeset
    65
    
hgs
parents:
diff changeset
    66
    //start a read session for network based ussd requests
hgs
parents:
diff changeset
    67
    User::LeaveIfError(iUSSDReader->ReadUSSDMessage(iReceivedData, iReceiveAttributes));
hgs
parents:
diff changeset
    68
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
    69
    }
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
CCUSDCommandHandler::~CCUSDCommandHandler()
hgs
parents:
diff changeset
    72
    {
hgs
parents:
diff changeset
    73
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
    74
    delete iUSSDSender;
hgs
parents:
diff changeset
    75
    delete iUSSDReader;
hgs
parents:
diff changeset
    76
    
hgs
parents:
diff changeset
    77
    iReply.Close();
hgs
parents:
diff changeset
    78
    iUssdMessaging.Close();
hgs
parents:
diff changeset
    79
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
    80
    }
hgs
parents:
diff changeset
    81
32
hgs
parents: 26
diff changeset
    82
void CCUSDCommandHandler::HandleCommand( const TDesC8& /*aCmd*/,
26
hgs
parents:
diff changeset
    83
                                         RBuf8& /*aReply*/,
hgs
parents:
diff changeset
    84
                                         TBool /*aReplyNeeded*/ )
hgs
parents:
diff changeset
    85
    {
hgs
parents:
diff changeset
    86
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
    87
    TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
32
hgs
parents: 26
diff changeset
    88
    iReply.Zero();
hgs
parents: 26
diff changeset
    89
26
hgs
parents:
diff changeset
    90
    switch (cmdHandlerType)
hgs
parents:
diff changeset
    91
        {
hgs
parents:
diff changeset
    92
        case (TAtCommandParser::ECmdHandlerTypeTest):
hgs
parents:
diff changeset
    93
            {
hgs
parents:
diff changeset
    94
            iReply.Append(KCRLF);
hgs
parents:
diff changeset
    95
            iReply.Append(KCUSDSupportedCmdsList);
hgs
parents:
diff changeset
    96
            iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );
hgs
parents:
diff changeset
    97
            break;
hgs
parents:
diff changeset
    98
            }
hgs
parents:
diff changeset
    99
        case (TAtCommandParser::ECmdHandlerTypeRead):
hgs
parents:
diff changeset
   100
            {
hgs
parents:
diff changeset
   101
            iReply.Append(KCRLF);
hgs
parents:
diff changeset
   102
            iReply.Append(KAtCUSD);
hgs
parents:
diff changeset
   103
            iReply.AppendNum(iDisplayRetMessage);
hgs
parents:
diff changeset
   104
            iReply.Append(KCRLF);
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
            iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );
hgs
parents:
diff changeset
   107
            break;
hgs
parents:
diff changeset
   108
            }
hgs
parents:
diff changeset
   109
        case (TAtCommandParser::ECmdHandlerTypeSet):
hgs
parents:
diff changeset
   110
            {         
32
hgs
parents: 26
diff changeset
   111
            if(ParseCUSDCmd() == KErrNone)
26
hgs
parents:
diff changeset
   112
               {
hgs
parents:
diff changeset
   113
               if(iUSSDCommand.Length() == 0)
hgs
parents:
diff changeset
   114
                   {
hgs
parents:
diff changeset
   115
                   Trace(KDebugPrintD, "No USSD command: ", iUSSDCommand.Length());
32
hgs
parents: 26
diff changeset
   116
                   
26
hgs
parents:
diff changeset
   117
                   // the USSD command is not set then this is a set                   
32
hgs
parents: 26
diff changeset
   118
                   iReply.Append( KOKCRLF );
hgs
parents: 26
diff changeset
   119
                   iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply);
26
hgs
parents:
diff changeset
   120
                   }
hgs
parents:
diff changeset
   121
                else
hgs
parents:
diff changeset
   122
                    {
32
hgs
parents: 26
diff changeset
   123
                    if(iUSSDSender->SendUSSDCmd(iUSSDCommand, iSendAttributes) == KErrNone)
26
hgs
parents:
diff changeset
   124
                        {
hgs
parents:
diff changeset
   125
                        iSendCommandSent = ETrue;
hgs
parents:
diff changeset
   126
                        }
32
hgs
parents: 26
diff changeset
   127
                    else
26
hgs
parents:
diff changeset
   128
                        {
hgs
parents:
diff changeset
   129
                        iCallback->CreateReplyAndComplete(EReplyTypeError);
hgs
parents:
diff changeset
   130
                        }                 
hgs
parents:
diff changeset
   131
                    }
hgs
parents:
diff changeset
   132
                }
hgs
parents:
diff changeset
   133
            else
hgs
parents:
diff changeset
   134
                {
hgs
parents:
diff changeset
   135
                iCallback->CreateReplyAndComplete(EReplyTypeError);
hgs
parents:
diff changeset
   136
                }
hgs
parents:
diff changeset
   137
                 
hgs
parents:
diff changeset
   138
            break;
hgs
parents:
diff changeset
   139
            }
hgs
parents:
diff changeset
   140
        default:
hgs
parents:
diff changeset
   141
            {
hgs
parents:
diff changeset
   142
            iCallback->CreateReplyAndComplete(EReplyTypeError);
hgs
parents:
diff changeset
   143
            break;
hgs
parents:
diff changeset
   144
            }
hgs
parents:
diff changeset
   145
        }
hgs
parents:
diff changeset
   146
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
void CCUSDCommandHandler::HandleCommandCancel()
hgs
parents:
diff changeset
   150
    {
hgs
parents:
diff changeset
   151
    TRACE_FUNC_ENTRY   
hgs
parents:
diff changeset
   152
    iUSSDSender->Cancel();
32
hgs
parents: 26
diff changeset
   153
    iSendCommandSent = EFalse;
26
hgs
parents:
diff changeset
   154
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   155
    }
hgs
parents:
diff changeset
   156
32
hgs
parents: 26
diff changeset
   157
TInt CCUSDCommandHandler::ParseCUSDCmd()
26
hgs
parents:
diff changeset
   158
    {
hgs
parents:
diff changeset
   159
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   160
    
32
hgs
parents: 26
diff changeset
   161
    TInt tempDispValue;
hgs
parents: 26
diff changeset
   162
    TInt ret = iATCmdParser.NextIntParam(tempDispValue);
hgs
parents: 26
diff changeset
   163
    
hgs
parents: 26
diff changeset
   164
    
hgs
parents: 26
diff changeset
   165
    if (ret == KErrNone && tempDispValue >= 0 && tempDispValue < 3)
26
hgs
parents:
diff changeset
   166
        {
32
hgs
parents: 26
diff changeset
   167
        Trace(KDebugPrintD, "tempDispValue: ", tempDispValue);
hgs
parents: 26
diff changeset
   168
        iDisplayRetMessage = tempDispValue;
hgs
parents: 26
diff changeset
   169
        }    
hgs
parents: 26
diff changeset
   170
    else if (ret != KErrNotFound)
hgs
parents: 26
diff changeset
   171
        {
hgs
parents: 26
diff changeset
   172
        Trace(KDebugPrintD, "First NextIntParam failed: ", ret);
hgs
parents: 26
diff changeset
   173
        TRACE_FUNC_EXIT
hgs
parents: 26
diff changeset
   174
        return KErrGeneral;       
26
hgs
parents:
diff changeset
   175
        }
hgs
parents:
diff changeset
   176
    
hgs
parents:
diff changeset
   177
    // now parse the USSD command
32
hgs
parents: 26
diff changeset
   178
    TPtrC8 command;
hgs
parents: 26
diff changeset
   179
    ret = iATCmdParser.NextTextParam(command);
hgs
parents: 26
diff changeset
   180
    if (ret == KErrNone )
26
hgs
parents:
diff changeset
   181
        {
hgs
parents:
diff changeset
   182
        if(iUSSDCommand.Create(command.Length()) != KErrNone)
hgs
parents:
diff changeset
   183
            {
32
hgs
parents: 26
diff changeset
   184
            Trace(KDebugPrintD, "iUSSDCommand.Create() failed ", ret);
26
hgs
parents:
diff changeset
   185
            TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   186
            return KErrGeneral;
hgs
parents:
diff changeset
   187
            }
32
hgs
parents: 26
diff changeset
   188
    
hgs
parents: 26
diff changeset
   189
        Trace(KDebugPrintS, "command: ", &command);
hgs
parents: 26
diff changeset
   190
        if(Pack(command, iUSSDCommand) < 0)
26
hgs
parents:
diff changeset
   191
            {
32
hgs
parents: 26
diff changeset
   192
            Trace(KDebugPrintS, "Pack() returned error, command: ", &command);
hgs
parents: 26
diff changeset
   193
            TRACE_FUNC_EXIT
hgs
parents: 26
diff changeset
   194
            return KErrGeneral;
hgs
parents: 26
diff changeset
   195
            }    
hgs
parents: 26
diff changeset
   196
        }
hgs
parents: 26
diff changeset
   197
    else if (ret != KErrNotFound)
hgs
parents: 26
diff changeset
   198
        {
hgs
parents: 26
diff changeset
   199
        TRACE_FUNC_EXIT
hgs
parents: 26
diff changeset
   200
        return KErrGeneral;       
hgs
parents: 26
diff changeset
   201
        }
hgs
parents: 26
diff changeset
   202
    TInt dcs = 0; // 3GPP TS 23.038 [25] Cell Broadcast Data Coding Scheme in integer format (default 0)
hgs
parents: 26
diff changeset
   203
    ret = iATCmdParser.NextIntParam(dcs); 
hgs
parents: 26
diff changeset
   204
hgs
parents: 26
diff changeset
   205
    Trace(KDebugPrintD, "ret: ", ret);
hgs
parents: 26
diff changeset
   206
    Trace(KDebugPrintD, "IsDcsValid(dcs): ", IsDcsValid(dcs));
hgs
parents: 26
diff changeset
   207
    Trace(KDebugPrintD, "iATCmdParser.NextParam().Length(): ", iATCmdParser.NextParam().Length());
hgs
parents: 26
diff changeset
   208
    if(ret != KErrNone && ret != KErrNotFound || !IsDcsValid(dcs) || 
hgs
parents: 26
diff changeset
   209
            iATCmdParser.NextParam().Length() != 0)
hgs
parents: 26
diff changeset
   210
        {
hgs
parents: 26
diff changeset
   211
        Trace(KDebugPrintD, "Second NextIntParam failed: ", ret);
hgs
parents: 26
diff changeset
   212
        TRACE_FUNC_EXIT
hgs
parents: 26
diff changeset
   213
        return KErrGeneral;       
hgs
parents: 26
diff changeset
   214
        }
hgs
parents: 26
diff changeset
   215
    else
hgs
parents: 26
diff changeset
   216
        {
hgs
parents: 26
diff changeset
   217
        // dcs will have the default value if no parameter is given in the command line
hgs
parents: 26
diff changeset
   218
        Trace(KDebugPrintD, "dcs ", dcs);   
hgs
parents: 26
diff changeset
   219
        iSendAttributes.iDcs = dcs;
hgs
parents: 26
diff changeset
   220
        }
hgs
parents: 26
diff changeset
   221
26
hgs
parents:
diff changeset
   222
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   223
    return KErrNone;
hgs
parents:
diff changeset
   224
    }
hgs
parents:
diff changeset
   225
32
hgs
parents: 26
diff changeset
   226
void CCUSDCommandHandler::HandleSendMessageComplete(TInt aError)
hgs
parents: 26
diff changeset
   227
    {
hgs
parents: 26
diff changeset
   228
    TRACE_FUNC_ENTRY
hgs
parents: 26
diff changeset
   229
    if (aError != KErrNone)
hgs
parents: 26
diff changeset
   230
        {
hgs
parents: 26
diff changeset
   231
        // Only respond from a Send USSD request if there has been an error
hgs
parents: 26
diff changeset
   232
        iCallback->CreateReplyAndComplete(EReplyTypeError);
hgs
parents: 26
diff changeset
   233
        }
hgs
parents: 26
diff changeset
   234
    else if (iDisplayRetMessage == 0)
hgs
parents: 26
diff changeset
   235
        {
hgs
parents: 26
diff changeset
   236
        // if display mode is 0 then no response apart from OK should be displayed
hgs
parents: 26
diff changeset
   237
        iCallback->CreateReplyAndComplete( EReplyTypeOther, KOKCRLF );
hgs
parents: 26
diff changeset
   238
        }
hgs
parents: 26
diff changeset
   239
   
hgs
parents: 26
diff changeset
   240
    iUSSDCommand.Close();
hgs
parents: 26
diff changeset
   241
    TRACE_FUNC_EXIT
hgs
parents: 26
diff changeset
   242
    }
hgs
parents: 26
diff changeset
   243
hgs
parents: 26
diff changeset
   244
void CCUSDCommandHandler::HandleReadMessageComplete(TInt aError)
26
hgs
parents:
diff changeset
   245
    {
hgs
parents:
diff changeset
   246
    TRACE_FUNC_ENTRY
32
hgs
parents: 26
diff changeset
   247
    if(aError == KErrNone)
26
hgs
parents:
diff changeset
   248
        {
32
hgs
parents: 26
diff changeset
   249
        if(iDisplayRetMessage)
hgs
parents: 26
diff changeset
   250
            {
hgs
parents: 26
diff changeset
   251
            FormatUSSDReceivedData();
hgs
parents: 26
diff changeset
   252
            
hgs
parents: 26
diff changeset
   253
            if(iSendCommandSent)
hgs
parents: 26
diff changeset
   254
                {
hgs
parents: 26
diff changeset
   255
                iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );
hgs
parents: 26
diff changeset
   256
                }
hgs
parents: 26
diff changeset
   257
             else
hgs
parents: 26
diff changeset
   258
                {       
hgs
parents: 26
diff changeset
   259
                iCallback->HandleUnsolicitedRequest(iReply);
hgs
parents: 26
diff changeset
   260
                }
hgs
parents: 26
diff changeset
   261
            }
hgs
parents: 26
diff changeset
   262
        
hgs
parents: 26
diff changeset
   263
        // as we have received the data initiated by the send USSD request we set
hgs
parents: 26
diff changeset
   264
        // this parameter to EFalse
hgs
parents: 26
diff changeset
   265
        iSendCommandSent = EFalse;
hgs
parents: 26
diff changeset
   266
    
hgs
parents: 26
diff changeset
   267
        // re-issue the read request
hgs
parents: 26
diff changeset
   268
        iUSSDReader->ReadUSSDMessage(iReceivedData, iReceiveAttributes);
26
hgs
parents:
diff changeset
   269
        }
hgs
parents:
diff changeset
   270
    else
hgs
parents:
diff changeset
   271
        {
hgs
parents:
diff changeset
   272
        iCallback->CreateReplyAndComplete(EReplyTypeError);
hgs
parents:
diff changeset
   273
        }
hgs
parents:
diff changeset
   274
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   275
    }
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
TInt CCUSDCommandHandler::Pack(const TDesC8& aIn, TDes8& aOut)
hgs
parents:
diff changeset
   278
    {
hgs
parents:
diff changeset
   279
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   280
    TInt startBit = 0; 
hgs
parents:
diff changeset
   281
    
hgs
parents:
diff changeset
   282
    // Ensure we've got the right length
hgs
parents:
diff changeset
   283
    TInt packedOctetsRequired = PackedOctetsRequired( aIn.Length() );
32
hgs
parents: 26
diff changeset
   284
    if (packedOctetsRequired > ( aOut.MaxLength() - aOut.Length() ) )
26
hgs
parents:
diff changeset
   285
        {
hgs
parents:
diff changeset
   286
        Trace(KDebugPrintD, "packedOctetsRequired: ", packedOctetsRequired);
hgs
parents:
diff changeset
   287
        TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   288
        return KErrOverflow;
hgs
parents:
diff changeset
   289
        }
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
    // Do the conversion
hgs
parents:
diff changeset
   292
    TInt elementSizeInBits = ElementSizeInBits(TSmsDataCodingScheme::ESmsAlphabet7Bit);
32
hgs
parents: 26
diff changeset
   293
    
hgs
parents: 26
diff changeset
   294
    Trace(KDebugPrintD, "elementSizeInBits = : ", elementSizeInBits);
hgs
parents: 26
diff changeset
   295
    if (elementSizeInBits == 8) // 8 bit data
26
hgs
parents:
diff changeset
   296
        {
hgs
parents:
diff changeset
   297
        // Straight copy here
hgs
parents:
diff changeset
   298
        aOut.Append( aIn );
hgs
parents:
diff changeset
   299
        }
32
hgs
parents: 26
diff changeset
   300
    else if (elementSizeInBits == 7) // Need packing to 7-bit
hgs
parents: 26
diff changeset
   301
        {
hgs
parents: 26
diff changeset
   302
        Trace(KDebugPrintS, "aOut: ", &aOut);
hgs
parents: 26
diff changeset
   303
        Trace(KDebugPrintS, "aIn: ", &aIn);
hgs
parents: 26
diff changeset
   304
hgs
parents: 26
diff changeset
   305
        // Get raw pointers and do packing
hgs
parents: 26
diff changeset
   306
        TUint8* outPtr = ( TUint8* )aOut.Ptr() + aOut.Length();
hgs
parents: 26
diff changeset
   307
        const TUint8* inPtr = aIn.Ptr();
26
hgs
parents:
diff changeset
   308
    
32
hgs
parents: 26
diff changeset
   309
        TInt inLength = aIn.Length();
hgs
parents: 26
diff changeset
   310
        outPtr[0] = 0;
hgs
parents: 26
diff changeset
   311
        
hgs
parents: 26
diff changeset
   312
        Trace(KDebugPrintD, "inLength = : ", inLength);
hgs
parents: 26
diff changeset
   313
        for (TInt i = 0; i < inLength; ++i)
hgs
parents: 26
diff changeset
   314
           {
hgs
parents: 26
diff changeset
   315
           TUint8 to = inPtr[i];
hgs
parents: 26
diff changeset
   316
           *outPtr |= ( to << startBit );
hgs
parents: 26
diff changeset
   317
            
hgs
parents: 26
diff changeset
   318
           if (startBit)
hgs
parents: 26
diff changeset
   319
               {
hgs
parents: 26
diff changeset
   320
               ++outPtr;
hgs
parents: 26
diff changeset
   321
               *outPtr = ( TUint8 ) ( to >> ( 8 - startBit ) );
hgs
parents: 26
diff changeset
   322
               }
hgs
parents: 26
diff changeset
   323
hgs
parents: 26
diff changeset
   324
           startBit = (startBit + 7) % 8; // roll 0,1,2,3,4,5,6,7,0,1,2,...
hgs
parents: 26
diff changeset
   325
           }
hgs
parents: 26
diff changeset
   326
       
hgs
parents: 26
diff changeset
   327
        Trace(KDebugPrintD, "startBit = : ", startBit);
hgs
parents: 26
diff changeset
   328
        
hgs
parents: 26
diff changeset
   329
        if ((inPtr[inLength - 1] == KPhCltUssdCarriageReturn && startBit == 0) || startBit == 1 )
hgs
parents: 26
diff changeset
   330
            {
hgs
parents: 26
diff changeset
   331
            //We have to add one CR more
hgs
parents: 26
diff changeset
   332
            *outPtr |= ( KPhCltUssdCarriageReturn << startBit );
hgs
parents: 26
diff changeset
   333
hgs
parents: 26
diff changeset
   334
            if (startBit)
26
hgs
parents:
diff changeset
   335
                {
hgs
parents:
diff changeset
   336
                ++outPtr;
32
hgs
parents: 26
diff changeset
   337
                *outPtr = (TUint8) (KPhCltUssdCarriageReturn >> (8 - startBit));
hgs
parents: 26
diff changeset
   338
                }
hgs
parents: 26
diff changeset
   339
            else
hgs
parents: 26
diff changeset
   340
                {
hgs
parents: 26
diff changeset
   341
                ++packedOctetsRequired;
26
hgs
parents:
diff changeset
   342
                }
32
hgs
parents: 26
diff changeset
   343
            startBit = (startBit + 7)%8;
26
hgs
parents:
diff changeset
   344
            }
32
hgs
parents: 26
diff changeset
   345
        
hgs
parents: 26
diff changeset
   346
        // Increment the length for the packed data
hgs
parents: 26
diff changeset
   347
        aOut.SetLength(aOut.Length() + packedOctetsRequired);
hgs
parents: 26
diff changeset
   348
        
hgs
parents: 26
diff changeset
   349
        Trace(KDebugPrintD, "aOut.Length() = : ", aOut.Length());
hgs
parents: 26
diff changeset
   350
        }
26
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
    // Return number of bytes used
hgs
parents:
diff changeset
   353
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   354
    return packedOctetsRequired;
hgs
parents:
diff changeset
   355
    }
hgs
parents:
diff changeset
   356
32
hgs
parents: 26
diff changeset
   357
 TInt CCUSDCommandHandler::PackedOctetsRequired(TInt aNumUDUnits) const
26
hgs
parents:
diff changeset
   358
    {
hgs
parents:
diff changeset
   359
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   360
    TInt startBit = 0; 
hgs
parents:
diff changeset
   361
hgs
parents:
diff changeset
   362
    TInt octetsRequired = 0;
hgs
parents:
diff changeset
   363
    TInt elementSizeInBits = ElementSizeInBits(TSmsDataCodingScheme::ESmsAlphabet7Bit);
32
hgs
parents: 26
diff changeset
   364
    if (elementSizeInBits == 8)
26
hgs
parents:
diff changeset
   365
         {
hgs
parents:
diff changeset
   366
        octetsRequired=aNumUDUnits;
hgs
parents:
diff changeset
   367
         }
hgs
parents:
diff changeset
   368
    else
hgs
parents:
diff changeset
   369
        {
32
hgs
parents: 26
diff changeset
   370
        octetsRequired =  (startBit + aNumUDUnits*elementSizeInBits + 7 )/8;    // Rounds up
26
hgs
parents:
diff changeset
   371
        }
hgs
parents:
diff changeset
   372
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   373
    return octetsRequired;
hgs
parents:
diff changeset
   374
    }
hgs
parents:
diff changeset
   375
hgs
parents:
diff changeset
   376
 TBool CCUSDCommandHandler::IsDcsValid( const TUint8 aDcs ) const
hgs
parents:
diff changeset
   377
     {
hgs
parents:
diff changeset
   378
     TRACE_FUNC_ENTRY
32
hgs
parents: 26
diff changeset
   379
     TBool isDcsValid(EFalse);
26
hgs
parents:
diff changeset
   380
                                                                //      76543210
hgs
parents:
diff changeset
   381
     TUint8 codingGroup  = ( aDcs & 0xF0 ) >> KHighNibbleShift; // bits XXXX____
hgs
parents:
diff changeset
   382
     TUint8 characterSet = ( aDcs & 0x0C ) >> KQuarterShift;    // bits ____XX__
hgs
parents:
diff changeset
   383
     TUint8 lowQuartet   = ( aDcs & 0x0F );                     // bits ____XXXX
hgs
parents:
diff changeset
   384
  
32
hgs
parents: 26
diff changeset
   385
     switch (codingGroup)
26
hgs
parents:
diff changeset
   386
         {
hgs
parents:
diff changeset
   387
         case 0x00:
hgs
parents:
diff changeset
   388
         case 0x02:
hgs
parents:
diff changeset
   389
         case 0x03:
hgs
parents:
diff changeset
   390
         case 0x0F:
hgs
parents:
diff changeset
   391
             {
hgs
parents:
diff changeset
   392
             isDcsValid = ETrue;
hgs
parents:
diff changeset
   393
             break;
hgs
parents:
diff changeset
   394
             }
hgs
parents:
diff changeset
   395
hgs
parents:
diff changeset
   396
         case 0x01:
hgs
parents:
diff changeset
   397
             {
hgs
parents:
diff changeset
   398
             if ( ( KDcsCharacterSet7Bit2 == lowQuartet ) ||
hgs
parents:
diff changeset
   399
                  ( KDcsCharacterSet16Bit2 == lowQuartet ) )
hgs
parents:
diff changeset
   400
                 {
hgs
parents:
diff changeset
   401
                 isDcsValid = ETrue;
hgs
parents:
diff changeset
   402
                 }
hgs
parents:
diff changeset
   403
             break;
hgs
parents:
diff changeset
   404
             }
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
         case 0x04:
hgs
parents:
diff changeset
   407
         case 0x05:
hgs
parents:
diff changeset
   408
         case 0x06:
hgs
parents:
diff changeset
   409
         case 0x07:
hgs
parents:
diff changeset
   410
         case 0x09:
hgs
parents:
diff changeset
   411
             {
hgs
parents:
diff changeset
   412
             if ( ( KDcsCharacterSet7Bit == characterSet ) ||
hgs
parents:
diff changeset
   413
                  ( KDcsCharacterSet8Bit == characterSet ) ||
hgs
parents:
diff changeset
   414
                  ( KDcsCharacterSet16Bit == characterSet ) )
hgs
parents:
diff changeset
   415
                 {
hgs
parents:
diff changeset
   416
                 isDcsValid = ETrue;
hgs
parents:
diff changeset
   417
                 }
hgs
parents:
diff changeset
   418
             break;
hgs
parents:
diff changeset
   419
             }
32
hgs
parents: 26
diff changeset
   420
         default:
hgs
parents: 26
diff changeset
   421
             {
hgs
parents: 26
diff changeset
   422
             break;
hgs
parents: 26
diff changeset
   423
             }
26
hgs
parents:
diff changeset
   424
         }
hgs
parents:
diff changeset
   425
     TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   426
     return isDcsValid;
hgs
parents:
diff changeset
   427
     }
hgs
parents:
diff changeset
   428
 
hgs
parents:
diff changeset
   429
TInt CCUSDCommandHandler::ElementSizeInBits(TSmsDataCodingScheme::TSmsAlphabet aAlphabet) const
hgs
parents:
diff changeset
   430
    {
hgs
parents:
diff changeset
   431
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   432
    TInt ret;
32
hgs
parents: 26
diff changeset
   433
    switch (aAlphabet)
26
hgs
parents:
diff changeset
   434
       {
hgs
parents:
diff changeset
   435
       case TSmsDataCodingScheme::ESmsAlphabet7Bit:
hgs
parents:
diff changeset
   436
           {
hgs
parents:
diff changeset
   437
           ret = 7;
hgs
parents:
diff changeset
   438
           break;
hgs
parents:
diff changeset
   439
           }
hgs
parents:
diff changeset
   440
       case TSmsDataCodingScheme::ESmsAlphabet8Bit:
hgs
parents:
diff changeset
   441
       case TSmsDataCodingScheme::ESmsAlphabetUCS2:
hgs
parents:
diff changeset
   442
           {
hgs
parents:
diff changeset
   443
           ret = 8;
hgs
parents:
diff changeset
   444
           break;
hgs
parents:
diff changeset
   445
           }
hgs
parents:
diff changeset
   446
       default:
hgs
parents:
diff changeset
   447
           {
hgs
parents:
diff changeset
   448
           ret = KErrGsmSMSDataCodingSchemeNotSupported;
hgs
parents:
diff changeset
   449
           }
hgs
parents:
diff changeset
   450
        }
hgs
parents:
diff changeset
   451
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   452
    return ret;
hgs
parents:
diff changeset
   453
    }
hgs
parents:
diff changeset
   454
hgs
parents:
diff changeset
   455
void CCUSDCommandHandler::FormatUSSDReceivedData()
hgs
parents:
diff changeset
   456
    {
hgs
parents:
diff changeset
   457
    TRACE_FUNC_ENTRY
32
hgs
parents: 26
diff changeset
   458
    iReply.Zero();
hgs
parents: 26
diff changeset
   459
    
26
hgs
parents:
diff changeset
   460
    iReply.Append(KCRLF);
hgs
parents:
diff changeset
   461
    iReply.Append(KAtCUSD);
hgs
parents:
diff changeset
   462
    iReply.AppendNum(iDisplayRetMessage);
hgs
parents:
diff changeset
   463
    iReply.Append(',');
hgs
parents:
diff changeset
   464
    iReply.Append('"');
hgs
parents:
diff changeset
   465
    
hgs
parents:
diff changeset
   466
    TInt length = iReceivedData.Length();
hgs
parents:
diff changeset
   467
    for(TInt i = 0; i < length; ++i)
hgs
parents:
diff changeset
   468
       {       
hgs
parents:
diff changeset
   469
       iReply.AppendNum(iReceivedData[i], EHex);
hgs
parents:
diff changeset
   470
       }
hgs
parents:
diff changeset
   471
    iReply.Append('"');
hgs
parents:
diff changeset
   472
    iReply.Append(',');
hgs
parents:
diff changeset
   473
hgs
parents:
diff changeset
   474
    iReply.AppendNum(iReceiveAttributes.iDcs);
hgs
parents:
diff changeset
   475
    iReply.Append(KCRLF);
hgs
parents:
diff changeset
   476
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   477
    }