phoneclientserver/phoneclient/Src/UssdWrapper/CPhCltUssdImp.cpp
changeset 15 d7fc66ccd6fb
parent 13 e32024264ebb
child 27 7eb70891911c
equal deleted inserted replaced
13:e32024264ebb 15:d7fc66ccd6fb
     1 /*
     1 /*
     2 * Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). 
     2 * Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). 
     3 * All rights reserved.
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
    25 
    25 
    26 #include <etelmm.h>
    26 #include <etelmm.h>
    27 #include <f32file.h>
    27 #include <f32file.h>
    28 #include <charconv.h>
    28 #include <charconv.h>
    29 #include <gsmuelem.h>
    29 #include <gsmuelem.h>
    30 //
    30 #include <coemain.h>  
    31 #include <coemain.h>
    31 //#include <phoneclient.rsg> 
    32 #include <avkon.hrh>
       
    33 #include <avkon.rsg> 
       
    34 
       
    35 #include <phoneclient.rsg> 
       
    36 #include <exterror.h>
    32 #include <exterror.h>
    37 
    33 
    38 #include <gsmerror.h>
    34 #include <gsmerror.h>
    39 #include <etelsat.h>
    35 #include <etelsat.h>
    40 
    36 
    41 #include "mphcltussdnotecontrollercallback.h" 
    37 #include "mphcltussdnotecontrollercallback.h" 
    42 #include "cphcltussdnotecontroller.h" 
    38 #include "cphcltussdnotecontroller.h" 
    43 
    39 #include "cphcltussdcommonconstant.h"
       
    40 #include "tflogger.h"
    44 // CONSTANTS
    41 // CONSTANTS
    45 
    42 
    46 const TUint8 KPhCltUssdDcsDefaultAlphabet = 0x0f; // 00001111
    43 const TUint8 KPhCltUssdDcsDefaultAlphabet = 0x0f; // 00001111
    47                        
    44                        
    48 const TUint8 KPhCltUssdDcsAlphabetDefaultPrecededLanguage = 0x10; // 00010000 
    45 const TUint8 KPhCltUssdDcsAlphabetDefaultPrecededLanguage = 0x10; // 00010000 
   331 // Two-phased constructor.
   328 // Two-phased constructor.
   332 // -----------------------------------------------------------------------------
   329 // -----------------------------------------------------------------------------
   333 //
   330 //
   334 CPhCltUssdImp* CPhCltUssdImp::NewL( TBool aShowNotes )
   331 CPhCltUssdImp* CPhCltUssdImp::NewL( TBool aShowNotes )
   335     {
   332     {
       
   333     TFLOGSTRING("CPhCltUssdImp: NewL call")
   336     CPhCltUssdImp* self = new( ELeave ) CPhCltUssdImp;
   334     CPhCltUssdImp* self = new( ELeave ) CPhCltUssdImp;
   337     CleanupStack::PushL( self );
   335     CleanupStack::PushL( self );
   338     self->ConstructL( aShowNotes );
   336     self->ConstructL( aShowNotes );
   339     CleanupStack::Pop(); // self
   337     CleanupStack::Pop(); // self
       
   338     TFLOGSTRING("CPhCltUssdImp: NewL exit")
   340     return self;
   339     return self;
   341     }
   340     }
   342 
   341 
   343 
   342 
   344 // -----------------------------------------------------------------------------
   343 // -----------------------------------------------------------------------------
   346 // Symbian 2nd phase constructor can leave.
   345 // Symbian 2nd phase constructor can leave.
   347 // -----------------------------------------------------------------------------
   346 // -----------------------------------------------------------------------------
   348 //
   347 //
   349 void CPhCltUssdImp::ConstructL( TBool aShowNotes )
   348 void CPhCltUssdImp::ConstructL( TBool aShowNotes )
   350     {
   349     {
       
   350     TFLOGSTRING("CPhCltUssdImp: ConstructL call")
   351     // The note controller is needed only if the notes are shown.
   351     // The note controller is needed only if the notes are shown.
   352     iNoteController = NULL;
   352     iNoteController = NULL;
   353     
   353     
   354     if ( aShowNotes )
   354     if ( aShowNotes )
   355         {
   355         {
   356         iNoteController = CPhCltUssdNoteController::NewL( 
   356         iNoteController = CPhCltUssdNoteController::NewL( 
   357             *this, 
   357             *this );
   358             CActive::EPriorityStandard );
       
   359         }
   358         }
   360 
   359 
   361     iDCS = KPhCltUssdDcsDefaultAlphabet;
   360     iDCS = KPhCltUssdDcsDefaultAlphabet;
   362     iWait = new( ELeave ) CActiveSchedulerWait;
   361     iWait = new( ELeave ) CActiveSchedulerWait;
   363 
   362 
   364     // The one that send the request forward.
   363     // The one that send the request forward.
   365     iRequestHandler = CPhCltUssdRequestHandler::NewL( 
   364     iRequestHandler = CPhCltUssdRequestHandler::NewL( 
   366         *this, 
   365         *this, 
   367         CActive::EPriorityStandard );
   366         CActive::EPriorityStandard );
       
   367     TFLOGSTRING("CPhCltUssdImp: ConstructL exit")
   368     }
   368     }
   369 
   369 
   370 
   370 
   371 // -----------------------------------------------------------------------------
   371 // -----------------------------------------------------------------------------
   372 // CPhCltUssdImp::CPhCltUssdImp
   372 // CPhCltUssdImp::CPhCltUssdImp
   374 // might leave.
   374 // might leave.
   375 // -----------------------------------------------------------------------------
   375 // -----------------------------------------------------------------------------
   376 //
   376 //
   377 CPhCltUssdImp::CPhCltUssdImp()
   377 CPhCltUssdImp::CPhCltUssdImp()
   378     {
   378     {
       
   379     TFLOGSTRING("CPhCltUssdImp: CPhCltUssdImp call_exit")
   379     } 
   380     } 
   380 
   381 
   381 
   382 
   382 // -----------------------------------------------------------------------------
   383 // -----------------------------------------------------------------------------
   383 // CPhCltUssdImp::~CPhCltUssdImp
   384 // CPhCltUssdImp::~CPhCltUssdImp
   384 // Destructor.
   385 // Destructor.
   385 // -----------------------------------------------------------------------------
   386 // -----------------------------------------------------------------------------
   386 //
   387 //
   387 CPhCltUssdImp::~CPhCltUssdImp()
   388 CPhCltUssdImp::~CPhCltUssdImp()
   388     {
   389     {
       
   390     TFLOGSTRING("CPhCltUssdImp: ~CPhCltUssdImp call") 
   389     if ( iWait )
   391     if ( iWait )
   390         {
   392         {
   391         if ( iWait->IsStarted() )
   393         if ( iWait->IsStarted() )
   392             {
   394             {
   393             iWait->AsyncStop();
   395             iWait->AsyncStop();
   398 
   400 
   399     delete iRequestHandler;
   401     delete iRequestHandler;
   400     iRequestHandler = NULL;
   402     iRequestHandler = NULL;
   401     
   403     
   402     delete iNoteController;
   404     delete iNoteController;
   403     iNoteController = NULL;      
   405     iNoteController = NULL;
       
   406     TFLOGSTRING("CPhCltUssdImp: ~CPhCltUssdImp exit") 
   404     }
   407     }
   405 
   408 
   406 
   409 
   407 // -----------------------------------------------------------------------------
   410 // -----------------------------------------------------------------------------
   408 // CPhCltUssdImp::HandleSendEventL
   411 // CPhCltUssdImp::HandleSendEventL
   412 // -----------------------------------------------------------------------------
   415 // -----------------------------------------------------------------------------
   413 //
   416 //
   414 void CPhCltUssdImp::HandleSendEventL( const TInt aError )
   417 void CPhCltUssdImp::HandleSendEventL( const TInt aError )
   415     {
   418     {
   416     *iSendError = Min( aError , KErrNone );
   419     *iSendError = Min( aError , KErrNone );
   417 
   420     TFLOGSTRING2("CPhCltUssdImp: HandleSendEventL\
       
   421             aError = %d call", aError)
   418     // iNoteController is allocated only if notes are shown.
   422     // iNoteController is allocated only if notes are shown.
   419     if ( iNoteController )
   423     if ( iNoteController )
   420         {
   424         {
   421         // Send request is completed, now destroy the wait note
   425         // Send request is completed, now destroy the wait note
   422         iNoteController->DestroyGlobalWaitNote();
   426         iNoteController->DestroyGlobalWaitNote();
   426             {
   430             {
   427             switch ( aError )
   431             switch ( aError )
   428                 {
   432                 {
   429                 // All Ok.
   433                 // All Ok.
   430                 case KErrNone:
   434                 case KErrNone:
   431                     iNoteController->ShowGlobalConfirmationNoteL( R_TEXT_DONE );
   435                     iNoteController->ShowGlobalInformationNoteL( EPhCltUssdDone );
   432                     break;
   436                     break;
   433 
   437 
   434                 // Operation cancelled.
   438                 // Operation cancelled.
   435                 case KErrCancel:
   439                 case KErrCancel:
   436                     iNoteController->ShowGlobalInformationNoteL( R_TEXT_UNCONFIRMED );
   440                     iNoteController->ShowGlobalInformationNoteL( EPhCltUssdUnconfirme );
   437                     break;
   441                     break;
   438 
   442 
   439                 // Ongoing Ussd session or the string is barred due SS request
   443                 // Ongoing Ussd session or the string is barred due SS request
   440                 // or Fixed Dialling feature.
   444                 // or Fixed Dialling feature.
   441                 case KErrInUse:
   445                 case KErrInUse:
   442                 case KErrAccessDenied:
   446                 case KErrAccessDenied:
   443                 case KErrGsmSSCallBarred:
   447                 case KErrGsmSSCallBarred:
   444                     iNoteController->ShowGlobalInformationNoteL( R_TEXT_NOT_ALLOWED );
   448                     iNoteController->ShowGlobalInformationNoteL( EPhCltUssdNotallowed );
   445                     break;
   449                     break;
   446 
   450 
   447                 // No network coverage.
   451                 // No network coverage.
   448                 case KErrGsmSMSNoNetworkService:
   452                 case KErrGsmSMSNoNetworkService:
   449                     iNoteController->ShowGlobalInformationNoteL( R_TEXT_NO_SERVICE );
   453                     iNoteController->ShowGlobalInformationNoteL(EPhCltUssdNoservice );
   450                     break;
   454                     break;
   451 
   455 
   452                 // Offline mode.
   456                 // Offline mode.
   453                 case KErrGsmOfflineOpNotAllowed:
   457                 case KErrGsmOfflineOpNotAllowed:
   454                     iNoteController->ShowGlobalInformationNoteL( R_TEXT_OFFLINE );
   458                     iNoteController->ShowGlobalInformationNoteL( EPhCltUssdOffline );
   455                     break;
   459                     break;
   456                     
   460                     
   457                 case KErrSatControl:
   461                 case KErrSatControl:
   458                     break; 
   462                     break; 
   459 
   463 
   460                 // Unknown error.
   464                 // Unknown error.
   461                 default:
   465                 default:
   462                     iNoteController->ShowGlobalInformationNoteL( R_TEXT_NOT_DONE );
   466                     iNoteController->ShowGlobalInformationNoteL( EPhCltUssdNotDone );
   463                     break;
   467                     break;
   464                 }
   468                 }
   465             }
   469             }
   466         }
   470         }
   467 
   471 
   468     // Let the original active object (one that did the send request) run again.
   472     // Let the original active object (one that did the send request) run again.
   469     if ( iWait->IsStarted() )
   473     if ( iWait->IsStarted() )
   470         {
   474         {
   471         iWait->AsyncStop();
   475         iWait->AsyncStop();
   472         }
   476         }
       
   477     TFLOGSTRING("CPhCltUssdImp: HandleSendEventL exit")
   473     }
   478     }
   474 
   479 
   475 
   480 
   476 // -----------------------------------------------------------------------------
   481 // -----------------------------------------------------------------------------
   477 // CPhCltUssdImp::SendUssd
   482 // CPhCltUssdImp::SendUssd
   529 //
   534 //
   530 TInt CPhCltUssdImp::SendUssd( 
   535 TInt CPhCltUssdImp::SendUssd( 
   531     const TDesC8& aMsgData, 
   536     const TDesC8& aMsgData, 
   532     const TUint8 iSendDcs )
   537     const TUint8 iSendDcs )
   533     {
   538     {
       
   539     TFLOGSTRING("CPhCltUssdImp: SendUssd call")
   534     __ASSERT_ALWAYS( aMsgData.Length() <= KPhCltUssdMax7BitCharacterOctets,
   540     __ASSERT_ALWAYS( aMsgData.Length() <= KPhCltUssdMax7BitCharacterOctets,
   535         User::Invariant() );
   541         User::Invariant() );
   536 
   542 
   537     RMobileUssdMessaging::TMobileUssdAttributesV1 attribute;
   543     RMobileUssdMessaging::TMobileUssdAttributesV1 attribute;
   538 
   544 
   566         return KErrInUse;
   572         return KErrInUse;
   567         }
   573         }
   568 
   574 
   569     TInt error = KErrNone;
   575     TInt error = KErrNone;
   570     iSendError = &error;
   576     iSendError = &error;
   571   
   577     TFLOGSTRING("CPhCltUssdImp: SendUssd iRequestHandler")
   572     iRequestHandler->SendUssd( aMsgData , attributePckg );
   578     iRequestHandler->SendUssd( aMsgData , attributePckg );
   573     // iNoteController is allocated only if notes are shown.
   579     // iNoteController is allocated only if notes are shown.
       
   580     TFLOGSTRING("CPhCltUssdImp: SendUssd ShowGlobalWaitNoteL")
   574     if ( iNoteController )
   581     if ( iNoteController )
   575         {
   582         {
   576         TRAP_IGNORE( iNoteController->ShowGlobalWaitNoteL( 
   583         TRAP_IGNORE( iNoteController->ShowGlobalWaitNoteL(); 
   577             R_TEXT_SENDING, 
   584                     );
   578             R_AVKON_SOFTKEYS_QUIT ) );
   585         }
   579         }
   586     TFLOGSTRING("CPhCltUssdImp: SendUssd iWait") 
   580 
   587 
   581     // Set this active object to wait the completion of the send request.
   588     // Set this active object to wait the completion of the send request.
   582     iWait->Start();
   589     iWait->Start();
   583 
   590 
   584     // If not deleted:
   591     // If not deleted:
   585     if ( iWait )
   592     if ( iWait )
   586         {
   593         {
   587         iSendError = NULL;
   594         iSendError = NULL;
   588         }
   595         }
       
   596     TFLOGSTRING("CPhCltUssdImp: SendUssd exit") 
   589     return error;
   597     return error;
   590     }
   598     }
   591 
   599 
   592 
   600 
   593 // -----------------------------------------------------------------------------
   601 // -----------------------------------------------------------------------------
   596 // Cancels the out-standing request.
   604 // Cancels the out-standing request.
   597 // -----------------------------------------------------------------------------
   605 // -----------------------------------------------------------------------------
   598 //
   606 //
   599 void CPhCltUssdImp::SendUssdCancel()
   607 void CPhCltUssdImp::SendUssdCancel()
   600     {
   608     {
       
   609     TFLOGSTRING("CPhCltUssdImp: SendUssdCancel call")
   601     iRequestHandler->SendUssdCancel();
   610     iRequestHandler->SendUssdCancel();
       
   611     TFLOGSTRING("CPhCltUssdImp: SendUssdCancel exit")
   602     }
   612     }
   603 
   613 
   604 
   614 
   605 // -----------------------------------------------------------------------------
   615 // -----------------------------------------------------------------------------
   606 // CPhCltUssdImp::StartUssdEditor
   616 // CPhCltUssdImp::StartUssdEditor
   619 // UI informs that it is been created
   629 // UI informs that it is been created
   620 // -----------------------------------------------------------------------------
   630 // -----------------------------------------------------------------------------
   621 //
   631 //
   622 TInt CPhCltUssdImp::AppStarting()
   632 TInt CPhCltUssdImp::AppStarting()
   623     {
   633     {
   624     return iRequestHandler->UssdClient().AppStarting();
   634     TFLOGSTRING("CPhCltUssdImp: AppStarting call")
       
   635     TInt res = iRequestHandler->UssdClient().AppStarting();
       
   636     TFLOGSTRING2("CPhCltUssdImp: AppStarting exit res = %d",res)
       
   637     return res;
   625     }
   638     }
   626     
   639     
   627 // -----------------------------------------------------------------------------
   640 // -----------------------------------------------------------------------------
   628 // CPhCltUssdImp::AppTerminating
   641 // CPhCltUssdImp::AppTerminating
   629 // 
   642 // 
   631 // -----------------------------------------------------------------------------
   644 // -----------------------------------------------------------------------------
   632 //    
   645 //    
   633 TInt CPhCltUssdImp::AppTerminating( 
   646 TInt CPhCltUssdImp::AppTerminating( 
   634       TPhCltUssdAppExitReason aExitReason )
   647       TPhCltUssdAppExitReason aExitReason )
   635     {
   648     {
   636     return iRequestHandler->UssdClient().AppTerminating( aExitReason );
   649     TFLOGSTRING("CPhCltUssdImp: AppTerminating call")
       
   650     TInt res = iRequestHandler->UssdClient().AppTerminating( aExitReason );
       
   651     TFLOGSTRING2("CPhCltUssdImp: AppTerminating exit res = %d",res)
       
   652     return res;
   637     }
   653     }
   638     
   654     
   639 // -----------------------------------------------------------------------------
   655 // -----------------------------------------------------------------------------
   640 // CPhCltUssdImp::AppToForeground
   656 // CPhCltUssdImp::AppToForeground
   641 // 
   657 // 
   642 // UI informs that it is brougth to foreground
   658 // UI informs that it is brougth to foreground
   643 // -----------------------------------------------------------------------------
   659 // -----------------------------------------------------------------------------
   644 //    
   660 //    
   645 TBool CPhCltUssdImp::AppToForeground()
   661 TBool CPhCltUssdImp::AppToForeground()
   646     {
   662     {
   647     return iRequestHandler->UssdClient().AppToForeground();
   663     TFLOGSTRING("CPhCltUssdImp: AppToForeground call")
       
   664     TBool res =  iRequestHandler->UssdClient().AppToForeground();
       
   665     TFLOGSTRING2("CPhCltUssdImp: AppToForeground exit res = %d",res)
       
   666     return res;
   648     }
   667     }
   649     
   668     
   650 // -----------------------------------------------------------------------------
   669 // -----------------------------------------------------------------------------
   651 // CPhCltUssdImp::AppToBackground
   670 // CPhCltUssdImp::AppToBackground
   652 // 
   671 // 
   653 // UI informs that it is gone background
   672 // UI informs that it is gone background
   654 // -----------------------------------------------------------------------------
   673 // -----------------------------------------------------------------------------
   655 //    
   674 //    
   656 TInt CPhCltUssdImp::AppToBackground()
   675 TInt CPhCltUssdImp::AppToBackground()
   657     {
   676     {
   658     return iRequestHandler->UssdClient().AppToBackground();
   677     TFLOGSTRING("CPhCltUssdImp: AppToBackground call")
       
   678     TInt res = iRequestHandler->UssdClient().AppToBackground();
       
   679     TFLOGSTRING2("CPhCltUssdImp: AppToBackground exit res = %d",res)
       
   680     return res;
   659     }
   681     }
   660 
   682 
   661 // -----------------------------------------------------------------------------
   683 // -----------------------------------------------------------------------------
   662 // CPhCltUssdImp::StartSAT
   684 // CPhCltUssdImp::StartSAT
   663 // 
   685 // 
   667 void  CPhCltUssdImp::StartSAT( 
   689 void  CPhCltUssdImp::StartSAT( 
   668             TRequestStatus& aStatus, 
   690             TRequestStatus& aStatus, 
   669             TDes& aReceiveMessage, 
   691             TDes& aReceiveMessage, 
   670             TPckg< TUint >& aShowNotesAndDcs )
   692             TPckg< TUint >& aShowNotesAndDcs )
   671     {
   693     {
       
   694     TFLOGSTRING("CPhCltUssdImp: StartSAT call")
   672     iRequestHandler->UssdClient().StartSAT( aStatus, aReceiveMessage, aShowNotesAndDcs );
   695     iRequestHandler->UssdClient().StartSAT( aStatus, aReceiveMessage, aShowNotesAndDcs );
       
   696     TFLOGSTRING("CPhCltUssdImp: StartSAT exit")
   673     }
   697     }
   674  
   698  
   675 // -----------------------------------------------------------------------------
   699 // -----------------------------------------------------------------------------
   676 // CPhCltUssdImp::StopSAT
   700 // CPhCltUssdImp::StopSAT
   677 // 
   701 // 
   678 // Cancels SAT session
   702 // Cancels SAT session
   679 // -----------------------------------------------------------------------------
   703 // -----------------------------------------------------------------------------
   680 //   
   704 //   
   681  void CPhCltUssdImp::StopSAT()
   705  void CPhCltUssdImp::StopSAT()
   682     {
   706     {
       
   707     TFLOGSTRING("CPhCltUssdImp: StopSAT call")
   683     iRequestHandler->UssdClient().StopSAT();
   708     iRequestHandler->UssdClient().StopSAT();
   684     }
   709     TFLOGSTRING("CPhCltUssdImp: StopSAT exit")
   685 
   710     }
   686 
   711 
   687 // -----------------------------------------------------------------------------
   712 
   688 // CPhCltUssdImp::GlobalNoteDismissedL
   713 // -----------------------------------------------------------------------------
   689 //
   714 // CPhCltUssdImp::GlobalWaitNoteHidden
   690 // Dialog is cancelled by the right softkey.
   715 //
   691 // -----------------------------------------------------------------------------
   716 // Dialog is hidden by the cancel key.
   692 //
   717 // -----------------------------------------------------------------------------
   693 void CPhCltUssdImp::GlobalWaitNoteDismissedL( TInt aButtonId )
   718 //
   694     {
   719 void CPhCltUssdImp::GlobalWaitNoteHidden()
   695     if ( aButtonId == EAknSoftkeyClose || 
   720     {
   696          aButtonId == EAknSoftkeyCancel ||
   721     TFLOGSTRING("CPhCltUssdImp: GlobalWaitNoteHidden call")
   697          aButtonId == EAknSoftkeyQuit )
   722     TFLOGSTRING("CPhCltUssdImp: GlobalWaitNoteHidden exit")
   698         {   
       
   699         SendUssdCancel();
       
   700         }
       
   701     }
   723     }
   702 
   724 
   703 
   725 
   704 // -----------------------------------------------------------------------------
   726 // -----------------------------------------------------------------------------
   705 // CPhCltUssdImp::EncodeL
   727 // CPhCltUssdImp::EncodeL
   707 // Converts a given Uniocde string into 7-bit buffer.
   729 // Converts a given Uniocde string into 7-bit buffer.
   708 // -----------------------------------------------------------------------------
   730 // -----------------------------------------------------------------------------
   709 //
   731 //
   710 void CPhCltUssdImp::EncodeL( const TDesC& aSrc, TDes8& aDes )
   732 void CPhCltUssdImp::EncodeL( const TDesC& aSrc, TDes8& aDes )
   711     {
   733     {
   712     //
   734     TFLOGSTRING("CPhCltUssdImp: EncodeL call")
   713      aDes.Zero();
   735     aDes.Zero();
   714     TSmsDataCodingScheme::TSmsAlphabet alphabet = 
   736     TSmsDataCodingScheme::TSmsAlphabet alphabet = 
   715         TSmsDataCodingScheme::ESmsAlphabet7Bit; // default
   737         TSmsDataCodingScheme::ESmsAlphabet7Bit; // default
   716         
   738         
   717     CCnvCharacterSetConverter* charConv = CCnvCharacterSetConverter::NewLC();
   739     CCnvCharacterSetConverter* charConv = CCnvCharacterSetConverter::NewLC();
   718     
   740     
   811             }
   833             }
   812         // If DCS not 8-bit or UCS2, then EPhCltDcsUnknown is returned.
   834         // If DCS not 8-bit or UCS2, then EPhCltDcsUnknown is returned.
   813         }
   835         }
   814     
   836     
   815     CleanupStack::PopAndDestroy(3); // fs, packer, charConv
   837     CleanupStack::PopAndDestroy(3); // fs, packer, charConv
       
   838     TFLOGSTRING("CPhCltUssdImp: EncodeL exit")
   816     }
   839     }
   817 
   840 
   818 // -----------------------------------------------------------------------------
   841 // -----------------------------------------------------------------------------
   819 // CPhCltUssdImp::SetDCS()
   842 // CPhCltUssdImp::SetDCS()
   820 //
   843 //