cbs/cbsserver/ServerSrc/Ccbsrecdecoder.cpp
author hgs
Fri, 06 Aug 2010 13:08:23 +0300
changeset 36 7c428525956b
parent 33 8d5d7fcf9b59
permissions -rw-r--r--
201031
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies). 
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:  This module contains the implementation of CCbsRecDecoder class 
hgs
parents:
diff changeset
    15
*                member functions.
hgs
parents:
diff changeset
    16
*    
hgs
parents:
diff changeset
    17
*                CCCbsRecDecoder handles decoding of message contents.
hgs
parents:
diff changeset
    18
*
hgs
parents:
diff changeset
    19
*                CbsServer receives messages stored in 8-bit descriptors
hgs
parents:
diff changeset
    20
*                from ETel. This class converts them into 16-bit descriptors
hgs
parents:
diff changeset
    21
*                and decodes the message representation into UCS-2 (which
hgs
parents:
diff changeset
    22
*                is used by Symbian OS internally). 
hgs
parents:
diff changeset
    23
*
hgs
parents:
diff changeset
    24
*/
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
// INCLUDE FILES
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#include <e32svr.h>
hgs
parents:
diff changeset
    30
#include <charconv.h>
hgs
parents:
diff changeset
    31
#include "CbsServerConstants.h"
hgs
parents:
diff changeset
    32
#include "CCbsRecDecoder.h"
hgs
parents:
diff changeset
    33
#include "CCbsMessage.h"
hgs
parents:
diff changeset
    34
#include "CCbsRecMessage.h"
hgs
parents:
diff changeset
    35
#include "CCbsRecWcdmaMessage.h"
hgs
parents:
diff changeset
    36
#include "CbsLogger.h"
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// CONSTANTS
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
// Max characters in generated unicode 
hgs
parents:
diff changeset
    41
const TInt KMaxCharsInGeneratedUnicode = 128;   
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
// ================= MEMBER FUNCTIONS =======================
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
// CCbsMcnSession::CCbsMcnSession
hgs
parents:
diff changeset
    47
// C++ default constructor can NOT contain any code, that
hgs
parents:
diff changeset
    48
// might leave.
hgs
parents:
diff changeset
    49
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
//
hgs
parents:
diff changeset
    51
CCbsRecDecoder::CCbsRecDecoder()
hgs
parents:
diff changeset
    52
    {
hgs
parents:
diff changeset
    53
    }
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    56
// CCbsRecDecoder::ConstructL
hgs
parents:
diff changeset
    57
// Symbian 2nd phase constructor can leave.
hgs
parents:
diff changeset
    58
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    59
//
hgs
parents:
diff changeset
    60
void CCbsRecDecoder::ConstructL()
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
    iConverter = CCnvCharacterSetConverter::NewL();
hgs
parents:
diff changeset
    63
    User::LeaveIfError( iFs.Connect() );
hgs
parents:
diff changeset
    64
    }     
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
// CCbsRecDecoder::NewL
hgs
parents:
diff changeset
    68
// Two-phased constructor.
hgs
parents:
diff changeset
    69
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    70
//
hgs
parents:
diff changeset
    71
CCbsRecDecoder* CCbsRecDecoder::NewL()
hgs
parents:
diff changeset
    72
    {
hgs
parents:
diff changeset
    73
    CCbsRecDecoder* self = new(ELeave) CCbsRecDecoder;
hgs
parents:
diff changeset
    74
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    75
    self->ConstructL();
hgs
parents:
diff changeset
    76
    CleanupStack::Pop();
hgs
parents:
diff changeset
    77
    return self;
hgs
parents:
diff changeset
    78
    }
hgs
parents:
diff changeset
    79
    
hgs
parents:
diff changeset
    80
// Destructor
hgs
parents:
diff changeset
    81
CCbsRecDecoder::~CCbsRecDecoder()
hgs
parents:
diff changeset
    82
    {
hgs
parents:
diff changeset
    83
    CBSLOGSTRING("CBSSERVER: >>> CCbsRecDecoder::~CCbsRecDecoder()");    
hgs
parents:
diff changeset
    84
    iFs.Close();
hgs
parents:
diff changeset
    85
    delete iConverter;
hgs
parents:
diff changeset
    86
    CBSLOGSTRING("CBSSERVER: <<< CCbsRecDecoder::~CCbsRecDecoder()");
hgs
parents:
diff changeset
    87
    }
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
// CCbsRecDecoder::DecodeL
hgs
parents:
diff changeset
    91
// Decodes 7-bit, 8-bit and 16-bit representations into UCS-2.
hgs
parents:
diff changeset
    92
// If the message has a language indication prefixed
hgs
parents:
diff changeset
    93
// in the message body, the indication is removed.
hgs
parents:
diff changeset
    94
// Compressed messages are not supported.
hgs
parents:
diff changeset
    95
// (other items were commented in a header).
hgs
parents:
diff changeset
    96
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    97
//
hgs
parents:
diff changeset
    98
void CCbsRecDecoder::DecodeL( 
hgs
parents:
diff changeset
    99
    CCbsMessage& aMessage )
hgs
parents:
diff changeset
   100
    {
hgs
parents:
diff changeset
   101
    if ( aMessage.IsCompressed() )
hgs
parents:
diff changeset
   102
        {
hgs
parents:
diff changeset
   103
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   104
        }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
    // Convert message into plaintext.
hgs
parents:
diff changeset
   107
    DoDecodeL( aMessage );
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    // 8-bit representation not needed anymore.
hgs
parents:
diff changeset
   110
    aMessage.ReleaseEightBitRepresentation();
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    // Determine language of this message (from header or content),
hgs
parents:
diff changeset
   113
    aMessage.ResolveLanguage();
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
    // Remove language indication, if present, from message.
hgs
parents:
diff changeset
   116
    aMessage.RemoveLanguageIndicationFromBodyL();
hgs
parents:
diff changeset
   117
    }
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   120
// CCbsRecDecoder::DoDecodeL
hgs
parents:
diff changeset
   121
// Decodes the given message's content. 
hgs
parents:
diff changeset
   122
// Decodes aMessage's 7-bit/Unicode representation
hgs
parents:
diff changeset
   123
// into internal Unicode representation.
hgs
parents:
diff changeset
   124
// (other items were commented in a header).
hgs
parents:
diff changeset
   125
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   126
//
hgs
parents:
diff changeset
   127
void CCbsRecDecoder::DoDecodeL( 
hgs
parents:
diff changeset
   128
    CCbsMessage& aMessage )
hgs
parents:
diff changeset
   129
    {
hgs
parents:
diff changeset
   130
    CBSLOGSTRING("CBSSERVER: >>> CCbsRecDecoder::DoDecodeL()");
hgs
parents:
diff changeset
   131
    
hgs
parents:
diff changeset
   132
    TCbsRecAlphabet alphabet( aMessage.Alphabet() );
hgs
parents:
diff changeset
   133
    if ( alphabet == ECbsRecAlphabetDefault || 
hgs
parents:
diff changeset
   134
         alphabet == ECbsRecAlphabetUnspecified )
hgs
parents:
diff changeset
   135
        {
hgs
parents:
diff changeset
   136
        DefaultAlphabetDecodeL( aMessage );
hgs
parents:
diff changeset
   137
        }
hgs
parents:
diff changeset
   138
    else if ( alphabet == ECbsRecAlphabet8bit )
hgs
parents:
diff changeset
   139
        {
hgs
parents:
diff changeset
   140
        EightbitAlphabetDecodeL( aMessage );
hgs
parents:
diff changeset
   141
        }
hgs
parents:
diff changeset
   142
    else
hgs
parents:
diff changeset
   143
        {
hgs
parents:
diff changeset
   144
        UnicodeDecodeL( aMessage );
hgs
parents:
diff changeset
   145
        }
hgs
parents:
diff changeset
   146
    CBSLOGSTRING("CBSSERVER: <<< CCbsRecDecoder::DoDecodeL()");
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
    
hgs
parents:
diff changeset
   149
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   150
// CCbsRecDecoder::UnicodeDecodeL
hgs
parents:
diff changeset
   151
// Decodes 8-bit and Unicode message representations.
hgs
parents:
diff changeset
   152
// (other items were commented in a header).
hgs
parents:
diff changeset
   153
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   154
//
hgs
parents:
diff changeset
   155
void CCbsRecDecoder::UnicodeDecodeL( 
hgs
parents:
diff changeset
   156
    CCbsMessage& aMsg )
hgs
parents:
diff changeset
   157
    {
hgs
parents:
diff changeset
   158
    CBSLOGSTRING("CBSSERVER: >>> CCbsRecDecoder::UnicodeDecodeL()");
hgs
parents:
diff changeset
   159
    
hgs
parents:
diff changeset
   160
    TPtrC8 contents( aMsg.Contents8() );
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
    // Reserve enough space for the actual contents plus
hgs
parents:
diff changeset
   163
    // the CR key
hgs
parents:
diff changeset
   164
    aMsg.ReserveContentSizeL( contents.Length()+1 );
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
    // Check if the message is preceded with language.
hgs
parents:
diff changeset
   167
    if( aMsg.DCS() == DCS_MPLI_UCS2 )
hgs
parents:
diff changeset
   168
        {
hgs
parents:
diff changeset
   169
        // The language is encoded as 7-bit USSD. Unpack that
hgs
parents:
diff changeset
   170
        // and add CR after the language to match the default
hgs
parents:
diff changeset
   171
        // alphabet case.
hgs
parents:
diff changeset
   172
        TBuf<3> language;
hgs
parents:
diff changeset
   173
        language.Copy( contents.Left(2) );
hgs
parents:
diff changeset
   174
        language[1] <<= 1;
hgs
parents:
diff changeset
   175
        language[1] |= (language[0] & 0x80) >> 7;
hgs
parents:
diff changeset
   176
        language[0] &= 0x7f;
hgs
parents:
diff changeset
   177
        language.Append( EKeyEnter );
hgs
parents:
diff changeset
   178
        aMsg.AppendContent( language );
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
        // Skip the language indication
hgs
parents:
diff changeset
   181
        contents.Set( contents.Mid(2) );
hgs
parents:
diff changeset
   182
        }
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
    // The rest of the message is UCS2 encoded Unicode. 
hgs
parents:
diff changeset
   185
    // Make sure the byte order is correct.
hgs
parents:
diff changeset
   186
    HBufC* text = HBufC::NewL( contents.Length() / 2 );
hgs
parents:
diff changeset
   187
    CleanupStack::PushL( text );
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
    TPtr ptr( text->Des() );
hgs
parents:
diff changeset
   190
    TInt length( contents.Length() );
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
    // If the length is an odd number, remove the last character.
hgs
parents:
diff changeset
   193
    if ( length & 0x01 )
hgs
parents:
diff changeset
   194
        {
hgs
parents:
diff changeset
   195
        length -= 1;
hgs
parents:
diff changeset
   196
        }
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
    for ( TInt i( 0 ); i < length; i += 2 )
hgs
parents:
diff changeset
   199
        {
hgs
parents:
diff changeset
   200
        ptr.Append( ( contents[ i ] << 8 ) + contents[ i + 1 ] );
hgs
parents:
diff changeset
   201
        }
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    aMsg.AppendContent( RemoveTrailingCR( *text ) );
hgs
parents:
diff changeset
   204
    CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   205
    
hgs
parents:
diff changeset
   206
    CBSLOGSTRING("CBSSERVER: <<< CCbsRecDecoder::UnicodeDecodeL()");
hgs
parents:
diff changeset
   207
    }
hgs
parents:
diff changeset
   208
   
hgs
parents:
diff changeset
   209
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   210
// CCbsRecDecoder::DefaultAlphabetDecodeL
hgs
parents:
diff changeset
   211
// Decodes 7-bit message representation.
hgs
parents:
diff changeset
   212
// (other items were commented in a header).
hgs
parents:
diff changeset
   213
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   214
//
hgs
parents:
diff changeset
   215
void CCbsRecDecoder::DefaultAlphabetDecodeL( 
hgs
parents:
diff changeset
   216
    CCbsMessage& aMsg )
hgs
parents:
diff changeset
   217
    {
hgs
parents:
diff changeset
   218
    CBSLOGSTRING("CBSSERVER: >>> CCbsRecDecoder::DefaultAlphabetDecodeL()");
hgs
parents:
diff changeset
   219
    
hgs
parents:
diff changeset
   220
    // Check that the converter is available
hgs
parents:
diff changeset
   221
    CCnvCharacterSetConverter* characterSetConverter = 
hgs
parents:
diff changeset
   222
        CCnvCharacterSetConverter::NewLC(); // on CS
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
    CCnvCharacterSetConverter::TAvailability availability = 
hgs
parents:
diff changeset
   225
        characterSetConverter->PrepareToConvertToOrFromL(
hgs
parents:
diff changeset
   226
            KCharacterSetIdentifierSms7Bit, iFs );
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
    if ( availability == CCnvCharacterSetConverter::ENotAvailable )
hgs
parents:
diff changeset
   229
        {
hgs
parents:
diff changeset
   230
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   231
        }
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
    // Allocate a buffer for the cleartext message
hgs
parents:
diff changeset
   234
    TBuf8< KCbsMaxCharsInPage + 1 > realMsg;
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
    // Get a pointer to the encoded message
hgs
parents:
diff changeset
   237
    TPtrC8 msgPartOfEtelMsg = aMsg.Contents8();
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
    // Length of the cleartext message.
hgs
parents:
diff changeset
   240
    TInt messageLength( ( msgPartOfEtelMsg.Length() * 8 ) / 7 );
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
    static const TUint mask_table[ 8 ] = 
hgs
parents:
diff changeset
   243
			    { 0x7F, 0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F };
hgs
parents:
diff changeset
   244
    TUint8  si,di;            // Indexes
hgs
parents:
diff changeset
   245
    TInt  tmp_modulo;         // Temporary; to improve efficiency
hgs
parents:
diff changeset
   246
    si = 0;
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
    // The location of the current 7-bit character determines the
hgs
parents:
diff changeset
   249
    // action to be taken. Only every 7th character is not divided into
hgs
parents:
diff changeset
   250
    // two bytes. All other characters will have to be contructed by
hgs
parents:
diff changeset
   251
    // combining bits of two consequent bytes.
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
    for ( di = 0; di < messageLength; di++ )
hgs
parents:
diff changeset
   254
	    {
hgs
parents:
diff changeset
   255
	    TUint num2 = 0;
hgs
parents:
diff changeset
   256
	    tmp_modulo = di % 8;
hgs
parents:
diff changeset
   257
	    switch ( tmp_modulo )
hgs
parents:
diff changeset
   258
	        {
hgs
parents:
diff changeset
   259
	        case 0:
hgs
parents:
diff changeset
   260
		        num2 = msgPartOfEtelMsg[ si ] & 0x7F;
hgs
parents:
diff changeset
   261
		        realMsg.Append( num2 );
hgs
parents:
diff changeset
   262
		        break;
hgs
parents:
diff changeset
   263
	        case 7:
hgs
parents:
diff changeset
   264
		        num2 = ( msgPartOfEtelMsg[ si ] >> 1 ) & 0x7F;
hgs
parents:
diff changeset
   265
		        realMsg.Append( num2 );
hgs
parents:
diff changeset
   266
		        si++;
hgs
parents:
diff changeset
   267
		        break;
hgs
parents:
diff changeset
   268
	        default:
hgs
parents:
diff changeset
   269
	            num2 = msgPartOfEtelMsg[ si ] >> ( 8 - ( tmp_modulo ) );
hgs
parents:
diff changeset
   270
	            num2 &= mask_table[ tmp_modulo ];
hgs
parents:
diff changeset
   271
	            num2 |= msgPartOfEtelMsg[ si + 1 ] << ( tmp_modulo );
hgs
parents:
diff changeset
   272
	            num2 &= 0x7F;
hgs
parents:
diff changeset
   273
	            realMsg.Append( num2 );
hgs
parents:
diff changeset
   274
	            si++;
hgs
parents:
diff changeset
   275
	        break;
hgs
parents:
diff changeset
   276
	        }//switch( tmp_modulo )
hgs
parents:
diff changeset
   277
	    }//for
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
    TBuf16<KMaxCharsInGeneratedUnicode> generatedUnicode;
hgs
parents:
diff changeset
   280
    TInt state( CCnvCharacterSetConverter::KStateDefault ); // has to be ref.
hgs
parents:
diff changeset
   281
    
hgs
parents:
diff changeset
   282
    // Remove all trailing control characters from the end of the Cell info msg
hgs
parents:
diff changeset
   283
    TBuf8<KCbsMaxCharsInPage> cleanedMsg;
hgs
parents:
diff changeset
   284
    if ( aMsg.TopicNumber() == KCellInfoTopic )
hgs
parents:
diff changeset
   285
        {
hgs
parents:
diff changeset
   286
        cleanedMsg = RemoveTrailingControlChars( realMsg );
hgs
parents:
diff changeset
   287
        User::LeaveIfError( characterSetConverter->ConvertToUnicode(
hgs
parents:
diff changeset
   288
            generatedUnicode, cleanedMsg, state ) );
hgs
parents:
diff changeset
   289
        }
hgs
parents:
diff changeset
   290
    else
hgs
parents:
diff changeset
   291
        {
hgs
parents:
diff changeset
   292
        User::LeaveIfError( characterSetConverter->ConvertToUnicode(
hgs
parents:
diff changeset
   293
            generatedUnicode, realMsg, state ) );
hgs
parents:
diff changeset
   294
        } 
hgs
parents:
diff changeset
   295
    
hgs
parents:
diff changeset
   296
    CleanupStack::PopAndDestroy(); // characterSetConverter
hgs
parents:
diff changeset
   297
    
hgs
parents:
diff changeset
   298
    aMsg.ReserveContentSizeL( messageLength );
hgs
parents:
diff changeset
   299
    aMsg.AppendContent( RemoveTrailingCR( generatedUnicode ) );
hgs
parents:
diff changeset
   300
    
hgs
parents:
diff changeset
   301
    CBSLOGSTRING("CBSSERVER: <<< CCbsRecDecoder::DefaultAlphabetDecodeL()");
hgs
parents:
diff changeset
   302
    }
hgs
parents:
diff changeset
   303
    
hgs
parents:
diff changeset
   304
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   305
// CCbsRecDecoder::EightbitAlphabetDecodeL
hgs
parents:
diff changeset
   306
// Decodes 8-bit message representation.
hgs
parents:
diff changeset
   307
// (other items were commented in a header).
hgs
parents:
diff changeset
   308
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   309
//
hgs
parents:
diff changeset
   310
void CCbsRecDecoder::EightbitAlphabetDecodeL( 
hgs
parents:
diff changeset
   311
    CCbsMessage& aMsg )
hgs
parents:
diff changeset
   312
    {
hgs
parents:
diff changeset
   313
    CBSLOGSTRING("CBSSERVER: >>> CCbsRecDecoder::EightbitAlphabetDecodeL()");
hgs
parents:
diff changeset
   314
    
hgs
parents:
diff changeset
   315
    // Copy 8-bit representation to 16-bit
hgs
parents:
diff changeset
   316
    HBufC* hbuf = HBufC::NewL( aMsg.Contents8().Length() );
hgs
parents:
diff changeset
   317
    CleanupStack::PushL( hbuf );
hgs
parents:
diff changeset
   318
    
hgs
parents:
diff changeset
   319
    TPtr16 ptr16 = hbuf->Des();     
hgs
parents:
diff changeset
   320
    ptr16.Copy( aMsg.Contents8() );        
hgs
parents:
diff changeset
   321
    
hgs
parents:
diff changeset
   322
    // Reserve enough space for the actual contents    
hgs
parents:
diff changeset
   323
    aMsg.ReserveContentSizeL( aMsg.Contents8().Length() );  
hgs
parents:
diff changeset
   324
    aMsg.AppendContent( RemoveTrailingCR( *hbuf ) );
hgs
parents:
diff changeset
   325
    
hgs
parents:
diff changeset
   326
    CleanupStack::PopAndDestroy( hbuf );
hgs
parents:
diff changeset
   327
    
hgs
parents:
diff changeset
   328
    CBSLOGSTRING("CBSSERVER: <<< CCbsRecDecoder::EightbitAlphabetDecodeL()");
hgs
parents:
diff changeset
   329
    }
hgs
parents:
diff changeset
   330
hgs
parents:
diff changeset
   331
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   332
// CCbsRecDecoder::RemoveTrailingCR
hgs
parents:
diff changeset
   333
// Removes the trailing CRs from a message.
hgs
parents:
diff changeset
   334
// (other items were commented in a header).
hgs
parents:
diff changeset
   335
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   336
//
hgs
parents:
diff changeset
   337
TPtrC CCbsRecDecoder::RemoveTrailingCR( 
hgs
parents:
diff changeset
   338
    const TDesC& aText )
hgs
parents:
diff changeset
   339
    {
hgs
parents:
diff changeset
   340
    TInt i( aText.Length() );
hgs
parents:
diff changeset
   341
    for ( ; i > 0 && aText[ i - 1 ] == EKeyEnter; i-- )
hgs
parents:
diff changeset
   342
        {
hgs
parents:
diff changeset
   343
        // nothing
hgs
parents:
diff changeset
   344
        }
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
    return aText.Left( i );
hgs
parents:
diff changeset
   347
    }
hgs
parents:
diff changeset
   348
    
hgs
parents:
diff changeset
   349
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   350
// CCbsRecDecoder::RemoveTrailingControlChars
hgs
parents:
diff changeset
   351
// Removes the trailing control characters from a message.
hgs
parents:
diff changeset
   352
// (other items were commented in a header).
hgs
parents:
diff changeset
   353
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   354
//
hgs
parents:
diff changeset
   355
TPtrC8 CCbsRecDecoder::RemoveTrailingControlChars( 
hgs
parents:
diff changeset
   356
    const TDesC8& aText )
hgs
parents:
diff changeset
   357
    {
hgs
parents:
diff changeset
   358
    TInt i( aText.Length() );
hgs
parents:
diff changeset
   359
    for ( ; i > 0 && ( aText[ i - 1 ] == EKeyEnter || aText[ i - 1 ] == EKeyLineFeed ); i-- )
hgs
parents:
diff changeset
   360
        {
hgs
parents:
diff changeset
   361
        // nothing
hgs
parents:
diff changeset
   362
        }
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
    return aText.Left( i );
hgs
parents:
diff changeset
   365
    }
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
// ========================== OTHER EXPORTED FUNCTIONS =========================
hgs
parents:
diff changeset
   368
//  End of File