convergedconnectionhandler/cchclientapi/src/cchserviceimpl.cpp
changeset 0 a4daefaec16c
child 9 bddb6d4447db
equal deleted inserted replaced
-1:000000000000 0:a4daefaec16c
       
     1 /*
       
     2 * Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Cch client api
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32def.h>
       
    21 
       
    22 #include "cchserviceimpl.h"
       
    23 #include "cchlogger.h"
       
    24 #include "cchimpl.h"
       
    25 #include "cchclientobserver.h"
       
    26 #include "cchclientserverinternal.h"
       
    27 
       
    28 #ifdef CCHAPI_USE_CCHUI
       
    29 #include "cchuiprivateapi.h"
       
    30 #endif
       
    31 
       
    32 // EXTERNAL DATA STRUCTURES
       
    33 // None
       
    34 
       
    35 // EXTERNAL FUNCTION PROTOTYPES
       
    36 // None
       
    37 
       
    38 // CONSTANTS
       
    39 // None
       
    40 
       
    41 // MACROS
       
    42 // None
       
    43 
       
    44 // LOCAL CONSTANTS AND MACROS
       
    45 // None
       
    46 
       
    47 // MODULE DATA STRUCTURES
       
    48 // None
       
    49 
       
    50 // LOCAL FUNCTION PROTOTYPES
       
    51 // None
       
    52 
       
    53 // FORWARD DECLARATIONS
       
    54 // None
       
    55 
       
    56 // ============================= LOCAL FUNCTIONS =============================
       
    57 
       
    58 // ============================ MEMBER FUNCTIONS =============================
       
    59 
       
    60 // ---------------------------------------------------------------------------
       
    61 // CCchServiceImpl::CCchServiceImpl
       
    62 // C++ default constructor can NOT contain any code, that might leave.
       
    63 // ---------------------------------------------------------------------------
       
    64 //
       
    65 CCchServiceImpl::CCchServiceImpl( CCchImpl& aCch, 
       
    66                                   TInt aServiceId, 
       
    67                                   CCchUiPrivateApi& aCchUi )
       
    68     : iCch( aCch ), 
       
    69       iServiceId( aServiceId ), 
       
    70       iCchUi( aCchUi )
       
    71 	{
       
    72 	
       
    73     }
       
    74     
       
    75 CCchServiceImpl::~CCchServiceImpl()
       
    76     {
       
    77     if( iObserver )
       
    78     	{
       
    79     	RemoveObserver();
       
    80     	}
       
    81     delete iObserver;
       
    82     }
       
    83 
       
    84 // ---------------------------------------------------------------------------
       
    85 // CCchServiceImpl::ConstructL
       
    86 // Symbian 2nd phase constructor can leave.
       
    87 // ---------------------------------------------------------------------------
       
    88 //
       
    89 void CCchServiceImpl::ConstructL()
       
    90     {
       
    91     CCHLOGSTRING( "CCchServiceImpl::ConstructL: IN" );
       
    92     iObserver = CCchClientObserver::NewL( *this );
       
    93     CCHLOGSTRING( "CCchServiceImpl::ConstructL: OUT" );
       
    94     }
       
    95 // ---------------------------------------------------------------------------
       
    96 // CCchServiceImpl::NewL
       
    97 // Two-phased constructor.
       
    98 // ---------------------------------------------------------------------------
       
    99 //
       
   100 CCchServiceImpl* CCchServiceImpl::NewL( CCchImpl& aCch, 
       
   101                                         TInt aServiceId,
       
   102                                         CCchUiPrivateApi& aCchUi )
       
   103     {
       
   104     CCHLOGSTRING( "CCchServiceImpl::NewL: IN" );
       
   105     CCchServiceImpl* self = 
       
   106         CCchServiceImpl::NewLC( aCch, aServiceId, aCchUi );
       
   107     CleanupStack::Pop( self );
       
   108     CCHLOGSTRING( "CCchServiceImpl::NewL: OUT" );
       
   109     return self;
       
   110     }
       
   111 
       
   112 // ---------------------------------------------------------------------------
       
   113 // CCchServiceImpl::NewLC
       
   114 // Two-phased constructor.
       
   115 // ---------------------------------------------------------------------------
       
   116 //
       
   117 CCchServiceImpl* CCchServiceImpl::NewLC( CCchImpl& aCch, TInt aServiceId,
       
   118     CCchUiPrivateApi& aCchUi )
       
   119     {
       
   120     CCHLOGSTRING( "CCchServiceImpl::NewLC: IN" );
       
   121     CCchServiceImpl* self = 
       
   122         new (ELeave) CCchServiceImpl( aCch, aServiceId, aCchUi );
       
   123     CleanupStack::PushL( self );
       
   124     self->ConstructL();
       
   125     CCHLOGSTRING( "CCchServiceImpl::NewLC: OUT" );
       
   126     return self;
       
   127     }
       
   128 
       
   129 // ---------------------------------------------------------------------------
       
   130 // CCchServiceImpl::Enable
       
   131 // ---------------------------------------------------------------------------
       
   132 //
       
   133 TInt CCchServiceImpl::Enable( TCCHSubserviceType aType )
       
   134     {
       
   135     CCHLOGSTRING( "CCchServiceImpl::Enable: IN" );
       
   136 	
       
   137     TRequestStatus status = KErrNone;
       
   138 	TServiceSelection selection( iServiceId, aType );
       
   139     iCch.CchClient().EnableService( selection, status, EFalse );
       
   140     //even the cchclient api seems to be asynchronous, 
       
   141 	//this method is completed immediately
       
   142 	User::WaitForRequest( status );
       
   143     CCHLOGSTRING( "CCchServiceImpl::Enable: OUT" );
       
   144     
       
   145     if ( iCch.ConnectivityDialogsAllowed() )
       
   146         {        
       
   147         TRAPD( err, iCchUi.ManualEnableResultL( 
       
   148             iServiceId, status.Int() ) );
       
   149         
       
   150         if( err != KErrNone )
       
   151             {
       
   152             return KErrNotReady;
       
   153             }
       
   154         }
       
   155     
       
   156     return status.Int();
       
   157     }
       
   158 
       
   159 // ---------------------------------------------------------------------------
       
   160 // CCchServiceImpl::Disable
       
   161 // ---------------------------------------------------------------------------
       
   162 //
       
   163 TInt CCchServiceImpl::Disable( TCCHSubserviceType aType )
       
   164     {
       
   165     CCHLOGSTRING( "CCchServiceImpl::Disable: IN" );
       
   166     
       
   167     TRequestStatus status = KErrNone;
       
   168 	TServiceSelection selection( iServiceId, aType );
       
   169     iCch.CchClient().DisableService( selection, status );
       
   170     //even the cchclient api seems to be asynchronous, 
       
   171 	//this method is completed immediately
       
   172 	User::WaitForRequest( status );
       
   173     CCHLOGSTRING( "CCchServiceImpl::Disable: OUT" );
       
   174     return status.Int();
       
   175     }
       
   176 
       
   177 // ---------------------------------------------------------------------------
       
   178 // CCchServiceImpl::GetStatus
       
   179 // ---------------------------------------------------------------------------
       
   180 //
       
   181 TInt CCchServiceImpl::GetStatus( TCCHSubserviceType aType, 
       
   182                                  TCchServiceStatus& aStatus ) const
       
   183     {
       
   184     CCHLOGSTRING( "CCchServiceImpl::GetStatus: IN" );
       
   185     TCCHSubserviceState state( ECCHUninitialized );
       
   186     TServiceSelection selection( iServiceId, aType );
       
   187     TInt error = iCch.CchClient().GetServiceState( selection, state );
       
   188     //if this is a cch error, return it in the structure, otherwise in return
       
   189     if( KCCHErrorInvalidIap >= error || KErrNone == error )
       
   190     	{
       
   191         aStatus.SetError( error );
       
   192         aStatus.SetState( state );
       
   193         error = KErrNone;
       
   194     	}
       
   195     CCHLOGSTRING( "CCchServiceImpl::GetStatus: OUT" );
       
   196     return error;
       
   197     }
       
   198 
       
   199 // ---------------------------------------------------------------------------
       
   200 // CCchServiceImpl::GetConnectionParameter
       
   201 // ---------------------------------------------------------------------------
       
   202 //
       
   203 TInt CCchServiceImpl::GetConnectionParameter( TCCHSubserviceType aType, 
       
   204 		TCchConnectionParameter aParameter, TInt& aValue ) const
       
   205     {
       
   206     CCHLOGSTRING( "CCchServiceImpl::GetConnectionParameter: IN" );
       
   207     TRequestStatus status = KErrNone;
       
   208     
       
   209     switch( aParameter )
       
   210     {
       
   211     	case ECchIapId:
       
   212     	case ECchSnapId:
       
   213     	case ECchSnapLocked:
       
   214         case ECchPasswordSet:
       
   215         case ECchReserved:
       
   216     		{
       
   217     		TServiceSelection selection( iServiceId, aType, aParameter );
       
   218     	    TServiceConnectionInfo serviceConnInfo;
       
   219     	    TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
       
   220     	    
       
   221     		iCch.CchClient().GetConnectionInfo( selection, 
       
   222     	    		serviceConnInfoPckg, status );
       
   223     	    //even the cchclient api seems to be asynchronous, 
       
   224     		//this method is completed immediately
       
   225     		User::WaitForRequest( status );
       
   226     		if ( KErrNone == status.Int() )
       
   227     	        {
       
   228     	        serviceConnInfo = serviceConnInfoPckg();
       
   229     	        if( ECchSnapId == aParameter )
       
   230     	        	{
       
   231     	        	aValue = serviceConnInfo.iSNAPId;
       
   232     	        	}
       
   233     	        else if( ECchIapId == aParameter )
       
   234     	        	{
       
   235     	        	aValue = serviceConnInfo.iIapId;
       
   236     	        	}
       
   237     	        else if( ECchSnapLocked == aParameter )
       
   238     	        	{
       
   239     	        	aValue = serviceConnInfo.iSNAPLocked;
       
   240     	        	}
       
   241     	        else  if( ECchPasswordSet == aParameter )
       
   242                     {
       
   243                     aValue = serviceConnInfo.iPasswordSet;
       
   244                     }
       
   245                 else  if( ECchReserved == aParameter )
       
   246                     {
       
   247                     aValue = serviceConnInfo.iReserved;
       
   248                     }
       
   249     	        }
       
   250     		}
       
   251     		break;
       
   252         default:
       
   253             {
       
   254             status = KErrArgument;
       
   255             }
       
   256             break;
       
   257     }
       
   258     
       
   259 	CCHLOGSTRING( "CCchServiceImpl::GetConnectionParameter: OUT" );
       
   260     return status.Int();
       
   261     }
       
   262 
       
   263 // ---------------------------------------------------------------------------
       
   264 // CCchServiceImpl::SetConnectionParameter
       
   265 // ---------------------------------------------------------------------------
       
   266 //
       
   267 TInt CCchServiceImpl::SetConnectionParameter( TCCHSubserviceType aType, 
       
   268 		TCchConnectionParameter aParameter, TInt aValue )
       
   269     {
       
   270     CCHLOGSTRING( "CCchServiceImpl::SetConnectionParameter: IN" );
       
   271     TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
       
   272     TRequestStatus status = KErrNone;
       
   273     TInt error = KErrNone;
       
   274     
       
   275     switch( aParameter )
       
   276     {
       
   277     	case ECchIapId:
       
   278     	case ECchSnapId:
       
   279         case ECchReserved:
       
   280     		{
       
   281     		serviceConnInfoPckg().SetServiceId( iServiceId );
       
   282     	    serviceConnInfoPckg().SetType( aType );
       
   283     	    if( ECchSnapId == aParameter )
       
   284 	        	{
       
   285 	        	serviceConnInfoPckg().iSNAPId = aValue;
       
   286 	        	}
       
   287 	        else if ( ECchIapId == aParameter )
       
   288 	        	{
       
   289 	        	serviceConnInfoPckg().iIapId = aValue;
       
   290 	        	}
       
   291             else if ( ECchReserved == aParameter )
       
   292                 {
       
   293                 serviceConnInfoPckg().SetParameter( aParameter );
       
   294                 serviceConnInfoPckg().iReserved = aValue;
       
   295                 }
       
   296             else
       
   297                 {
       
   298                 return KErrArgument;
       
   299                 }
       
   300     	    iCch.CchClient().SetConnectionInfo( serviceConnInfoPckg, status );
       
   301     	    //even the cchclient api seems to be asynchronous, 
       
   302     		//this method is completed immediately
       
   303     		User::WaitForRequest( status );
       
   304     		error = status.Int();
       
   305     		}
       
   306     		break;
       
   307     	case ECchSnapLocked:
       
   308         case ECchPasswordSet:
       
   309     		{
       
   310     		error = KErrNotSupported;
       
   311     		}
       
   312     		break;
       
   313         default:
       
   314             {
       
   315             error = KErrArgument;
       
   316             }
       
   317             break;
       
   318     }
       
   319     
       
   320     CCHLOGSTRING( "CCchServiceImpl::SetConnectionParameter: OUT" );
       
   321     return error;
       
   322     }
       
   323 
       
   324 // ---------------------------------------------------------------------------
       
   325 // CCchServiceImpl::GetConnectionParameters
       
   326 // ---------------------------------------------------------------------------
       
   327 //
       
   328 TInt CCchServiceImpl::GetConnectionParameter( TCCHSubserviceType aType, 
       
   329 		TCchConnectionParameter aParameter, RBuf& aValue ) const
       
   330     {
       
   331     CCHLOGSTRING( "CCchServiceImpl::GetConnectionParameter: IN" );
       
   332     TServiceSelection selection( iServiceId, aType, aParameter );
       
   333     TRequestStatus status = KErrNone;
       
   334     TInt error = KErrNone; 
       
   335     
       
   336     switch( aParameter )
       
   337     {
       
   338         case ECchServiceInfo:
       
   339     		{
       
   340     		error = iCch.CchClient().GetServiceInfo( selection, aValue );
       
   341     		}
       
   342     		break;
       
   343 
       
   344         case ECchUsername:
       
   345             {
       
   346             TServiceConnectionInfo serviceConnInfo;
       
   347             TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
       
   348             
       
   349             iCch.CchClient().GetConnectionInfo( selection,serviceConnInfoPckg, status );
       
   350             //even the cchclient api seems to be asynchronous, 
       
   351             //this method is completed immediately
       
   352             User::WaitForRequest( status );
       
   353 
       
   354             serviceConnInfo = serviceConnInfoPckg();
       
   355             aValue = serviceConnInfo.iUsername;
       
   356             }
       
   357             break;
       
   358         case ECchPassword:
       
   359             {
       
   360             error = KErrNotSupported;
       
   361             }
       
   362             break;
       
   363         default:
       
   364             {
       
   365             error = KErrArgument;
       
   366     		}
       
   367     		break;
       
   368     }
       
   369     
       
   370 	CCHLOGSTRING( "CCchServiceImpl::GetConnectionParameter: OUT" );
       
   371     return error;
       
   372     }
       
   373 
       
   374 // ---------------------------------------------------------------------------
       
   375 // CCchServiceImpl::SetConnectionParameters
       
   376 // ---------------------------------------------------------------------------
       
   377 //
       
   378 TInt CCchServiceImpl::SetConnectionParameter( TCCHSubserviceType aType, 
       
   379 		TCchConnectionParameter aParameter, const TDesC& aValue )
       
   380     {
       
   381     CCHLOGSTRING( "CCchServiceImpl::SetConnectionParameter: IN" );
       
   382     CCHLOGSTRING2( "    aValue:     %S", &aValue );
       
   383 
       
   384     // Type of subservice has to be ECCHUnknown for username and password
       
   385     __ASSERT_ALWAYS( aType == ECCHUnknown,
       
   386                     User::Panic( KNullDesC, KErrArgument ) );
       
   387     
       
   388     TPckgBuf<TServiceConnectionInfo> serviceConnInfoPckg;
       
   389     TRequestStatus status = KErrNone;
       
   390     TInt error = KErrNone;
       
   391 
       
   392     switch( aParameter )
       
   393     {
       
   394         case ECchUsername:
       
   395             {
       
   396             serviceConnInfoPckg().SetServiceId( iServiceId );
       
   397             serviceConnInfoPckg().SetType( aType );
       
   398             serviceConnInfoPckg().SetParameter( aParameter );
       
   399 
       
   400             if ( aValue.Length() < KCCHMaxUsernameLength )
       
   401                 {
       
   402                 serviceConnInfoPckg().iUsername.Append( aValue );
       
   403                 
       
   404                 iCch.CchClient().SetConnectionInfo( serviceConnInfoPckg, status );
       
   405                 //even the cchclient api seems to be asynchronous, 
       
   406                 //this method is completed immediately
       
   407                 User::WaitForRequest( status );
       
   408                 error = status.Int();
       
   409                 }
       
   410             else
       
   411                 {
       
   412                 error = KErrArgument;
       
   413                 }
       
   414             }
       
   415             break;
       
   416         case ECchPassword:
       
   417             {
       
   418             serviceConnInfoPckg().SetServiceId( iServiceId );
       
   419             serviceConnInfoPckg().SetType( aType );
       
   420             serviceConnInfoPckg().SetParameter( aParameter );
       
   421             if ( aValue.Length() < KCCHMaxPasswordLength )
       
   422                 {
       
   423                 serviceConnInfoPckg().iPassword.Append( aValue );
       
   424                 
       
   425                 iCch.CchClient().SetConnectionInfo( serviceConnInfoPckg, status );
       
   426                 //even the cchclient api seems to be asynchronous, 
       
   427                 //this method is completed immediately
       
   428                 User::WaitForRequest( status );
       
   429                 error = status.Int();
       
   430                 }
       
   431             else
       
   432                 {
       
   433                 error = KErrArgument;
       
   434                 }
       
   435             }
       
   436             break;
       
   437         default:
       
   438             {
       
   439             error = KErrArgument;
       
   440             }
       
   441             break;
       
   442     }
       
   443     
       
   444     CCHLOGSTRING( "CCchServiceImpl::SetConnectionParameter: OUT" );
       
   445     return error;
       
   446     }
       
   447 
       
   448 // ---------------------------------------------------------------------------
       
   449 // CCchServiceImpl::Reserve
       
   450 // ---------------------------------------------------------------------------
       
   451 //
       
   452 TInt CCchServiceImpl::Reserve( TCCHSubserviceType aType )
       
   453     {
       
   454     CCHLOGSTRING( "CCchServiceImpl::Reserve: IN" );
       
   455     TServiceSelection selection( iServiceId, aType );
       
   456     TInt error = iCch.CchClient().ReserveService( selection );
       
   457     CCHLOGSTRING( "CCchServiceImpl::Reserve: OUT" );
       
   458     return error;
       
   459     }
       
   460 
       
   461 // ---------------------------------------------------------------------------
       
   462 // CCchServiceImpl::Free
       
   463 // ---------------------------------------------------------------------------
       
   464 //
       
   465 TInt CCchServiceImpl::Free( TCCHSubserviceType aType )
       
   466     {
       
   467     CCHLOGSTRING( "CCchServiceImpl::Free: IN" );
       
   468     TServiceSelection selection( iServiceId, aType );
       
   469     TInt error = iCch.CchClient().FreeService( selection );
       
   470     CCHLOGSTRING( "CCchServiceImpl::Free: OUT" );
       
   471     return error;
       
   472     }
       
   473 
       
   474 // ---------------------------------------------------------------------------
       
   475 // CCchServiceImpl::IsReserved
       
   476 // ---------------------------------------------------------------------------
       
   477 //
       
   478 TInt CCchServiceImpl::IsReserved( TCCHSubserviceType aType, 
       
   479                                    TBool& aReserved ) const
       
   480     {
       
   481     CCHLOGSTRING( "CCchServiceImpl::IsReserved: IN" );
       
   482     TServiceSelection selection( iServiceId, aType );
       
   483     aReserved = iCch.CchClient().IsReserved( selection );
       
   484     CCHLOGSTRING( "CCchServiceImpl::IsReserved: OUT" );
       
   485     return KErrNone;
       
   486     }
       
   487 
       
   488 // ---------------------------------------------------------------------------
       
   489 // CCchServiceImpl::ServiceId
       
   490 // ---------------------------------------------------------------------------
       
   491 //
       
   492 TInt CCchServiceImpl::ServiceId() const
       
   493     {
       
   494     CCHLOGSTRING( "CCchServiceImpl::ServiceId: IN" );
       
   495     return iServiceId;
       
   496     }
       
   497 
       
   498 // ---------------------------------------------------------------------------
       
   499 // CCchServiceImpl::IsSupported
       
   500 // ---------------------------------------------------------------------------
       
   501 //
       
   502 TInt CCchServiceImpl::IsSupported( TCCHSubserviceType aType, 
       
   503                                    TBool& aSupported ) const
       
   504     {
       
   505     CCHLOGSTRING( "CCchServiceImpl::IsSupported: IN" );
       
   506     TCCHSubserviceState state( ECCHUninitialized );
       
   507     TServiceSelection selection( iServiceId, aType );
       
   508     TInt error = iCch.CchClient().GetServiceState( selection, state );
       
   509     if( error == KErrNone ||
       
   510     	error <= KCCHErrorInvalidIap ) // cch errors are ok
       
   511     	{
       
   512     	aSupported = ETrue;
       
   513     	}
       
   514     else
       
   515     	{
       
   516     	aSupported = EFalse;
       
   517     	}
       
   518 	
       
   519 	CCHLOGSTRING( "CCchServiceImpl::IsSupported: OUT" );
       
   520     return error;
       
   521     }      
       
   522 
       
   523 // ---------------------------------------------------------------------------
       
   524 // CCchClientObserver::SetObserver
       
   525 // ---------------------------------------------------------------------------
       
   526 //
       
   527 void CCchServiceImpl::SetObserver( MCchServiceStatusObserver& aObserver )
       
   528     {
       
   529     CCHLOGSTRING( "CCchServiceImpl::SetObserver: IN - deprecated - do not use this anymore " );
       
   530     iObserver->SetObserver( aObserver );
       
   531     CCHLOGSTRING( "CCchServiceImpl::SetObserver: OUT  - deprecated - do not use this anymore " );
       
   532     }
       
   533     
       
   534 // ---------------------------------------------------------------------------
       
   535 // CCchClientObserver::RemoveObserver
       
   536 // ---------------------------------------------------------------------------
       
   537 //
       
   538 void CCchServiceImpl::RemoveObserver( )
       
   539     {
       
   540     CCHLOGSTRING( "CCchServiceImpl::RemoveObserver: IN - deprecated - do not use this anymore " );
       
   541     iObserver->RemoveObserver( );
       
   542     CCHLOGSTRING( "CCchServiceImpl::RemoveObserver: OUT - deprecated - do not use this anymore " );
       
   543     }
       
   544 
       
   545 // ---------------------------------------------------------------------------
       
   546 // CCchClientObserver::AddObserver
       
   547 // ---------------------------------------------------------------------------
       
   548 //
       
   549 TInt CCchServiceImpl::AddObserver( 
       
   550                       MCchServiceStatusObserver& aObserver )
       
   551     {
       
   552     CCHLOGSTRING( "CCchServiceImpl::AddObserver: IN" );
       
   553     TInt err = iObserver->AddObserver( aObserver );
       
   554     CCHLOGSTRING( "CCchServiceImpl::AddObserver: OUT" );
       
   555     
       
   556     return err;
       
   557     }
       
   558 
       
   559 // ---------------------------------------------------------------------------
       
   560 // CCchClientObserver::RemoveObserver
       
   561 // ---------------------------------------------------------------------------
       
   562 //
       
   563 TInt CCchServiceImpl::RemoveObserver( 
       
   564                      MCchServiceStatusObserver& aObserver )
       
   565     {
       
   566     CCHLOGSTRING( "CCchServiceImpl::RemoveObserver: IN" );
       
   567     TInt err = iObserver->RemoveObserver( aObserver );
       
   568     CCHLOGSTRING( "CCchServiceImpl::RemoveObserver: OUT" );
       
   569     
       
   570     return err;
       
   571     }
       
   572 
       
   573 
       
   574 // ---------------------------------------------------------------------------
       
   575 // CCchClientObserver::CchImpl
       
   576 // ---------------------------------------------------------------------------
       
   577 //
       
   578 CCchImpl* CCchServiceImpl::CchImpl() const
       
   579 	{
       
   580 	return &iCch;
       
   581 	}
       
   582 
       
   583 
       
   584 
       
   585 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   586 
       
   587 
       
   588 //  End of File