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 // |