diff -r 41a7f70b3818 -r 5266b1f337bd phoneengine/servicehandling/src/cpeservicehandling.cpp --- a/phoneengine/servicehandling/src/cpeservicehandling.cpp Tue Aug 31 15:14:29 2010 +0300 +++ b/phoneengine/servicehandling/src/cpeservicehandling.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -20,8 +20,8 @@ #include #include #include +#include -#include "talogger.h" #include "cpeservicehandling.h" // ======== MEMBER FUNCTIONS ======== @@ -75,28 +75,223 @@ EXPORT_C CPEServiceHandling::~CPEServiceHandling() { TEFLOGSTRING( KTAOBJECT, "PE CPEServiceHandling::~CPEServiceHandling" ); + delete iCchClient; } // --------------------------------------------------------------------------- // CPEServiceHandling::EnableService // --------------------------------------------------------------------------- // -void CPEServiceHandling::EnableServiceL( TInt /*aServiceId*/ ) - { +void CPEServiceHandling::EnableServiceL( TInt aServiceId ) + { TEFLOGSTRING( KTAREQIN, "PE CPEServiceHandling::EnableServiceL" ); - User::LeaveIfError( 0 ); - iModel.SendMessage( MEngineMonitor::EPEMessageServiceEnabled ); + + if ( !iCchClient ) + { + iCchClient = CCch::NewL(); + } + + CCchService* service = iCchClient->GetService( aServiceId ); + + TInt error( KErrNotFound ); + if( service ) + { + iCurrentServiceId = aServiceId; + + TCchServiceStatus serviceStatus; + error = service->GetStatus( ECCHVoIPSub, serviceStatus ); + TCCHSubserviceState state = serviceStatus.State(); + + if( error == KErrNone ) + { + if ( serviceStatus.Error() == KErrNone ) + { + error = EnableServiceIfNeeded( state, *service ); + } + else + { + TEFLOGSTRING2( KTAERROR, + "PE CPEServiceHandling::EnableServiceL, error: %d" + , serviceStatus.Error() ); + SendErrorMessage( serviceStatus.Error()); + } + } + } + + if ( error != KErrNone ) + { + if ( error == KErrNotFound ) + { + iModel.SendMessage( MEngineMonitor::EPEMessageNoService ); + } + else + { + TEFLOGSTRING2( KTAERROR, + "PE CPEServiceHandling::EnableServiceL, Error: %d" + , error ); + SendErrorMessage( error ); + + iCurrentServiceId = KErrNotFound; + service->RemoveObserver( *this ); + } + } + + TEFLOGSTRING2( KTAINT, + "PE CPEServiceHandling::EnableServiceL, error: %d", error ); + } + +// --------------------------------------------------------------------------- +// CPEServiceHandling::EnableServiceIfNeeded +// --------------------------------------------------------------------------- +// +TInt CPEServiceHandling::EnableServiceIfNeeded( + const TCCHSubserviceState& aState, + CCchService& aService ) + { + TEFLOGSTRING( KTAINT, "PE CPEServiceHandling::EnableServiceIfNeeded" ); + TInt error = KErrNone; + + TEFLOGSTRING2( KTAINT, + "PE CPEServiceHandling::EnableServiceIfNeeded, aState: %d", aState ); + switch ( aState ) + { + case ECCHEnabled: + { + iModel.SendMessage( MEngineMonitor::EPEMessageServiceEnabled ); + } + break; + case ECCHUninitialized: + case ECCHDisabled: + case ECCHConnecting: + { + // Temporary solution, it will be fixed as soon as possible. + // Message have to send before enable is called. Reason is so that progress bar + //(global note) doesn't hide Networks's "Connection Needed" global note. + iModel.SendMessage( MEngineMonitor::EPEMessageServiceEnabling ); + aService.AddObserver( *this ); + error = aService.Enable( ECCHUnknown ); + } + break; + case ECCHDisconnecting: + { + error = KErrNotFound; + } + break; + default: + break; + } + TEFLOGSTRING2( KTAINT, + "PE CPEServiceHandling::EnableServiceIfNeeded, error: %d", error ); + return error; } // --------------------------------------------------------------------------- +// CPEServiceHandling::ServiceStatusChanged +// --------------------------------------------------------------------------- +// +void CPEServiceHandling::ServiceStatusChanged( + TInt aServiceId, + const TCCHSubserviceType aType, + const TCchServiceStatus& aServiceStatus ) + { + TEFLOGSTRING( KTAINT, "PE CPEServiceHandling::ServiceStatusChanged <" ); + + if( aServiceId == iCurrentServiceId && aType == ECCHVoIPSub ) + { + TEFLOGSTRING3( KTAINT, + "PE CPEServiceHandling::ServiceStatusChanged, state: %d, error: %d" + , aServiceStatus.State() + , aServiceStatus.Error() ); + + CCchService* service = iCchClient->GetService( aServiceId ); + if( service ) + { + if( aServiceStatus.Error() != KErrNone ) + { + TEFLOGSTRING( KTAERROR, + "PE CPEServiceHandling::ServiceStatusChanged, error" ); + SendErrorMessage( aServiceStatus.Error()); + CancelServiceEnabling(); + } + else + { + if( aServiceStatus.State() == ECCHEnabled ) + { + TEFLOGSTRING( KTAINT, + "PE CPEServiceHandling::ServiceStatusChanged, enabled" ); + iModel.SendMessage( MEngineMonitor::EPEMessageServiceEnabled ); + } + + + // Notify UI, that service is disabled. + else if( aServiceStatus.State() == ECCHDisabled ) + { + TEFLOGSTRING( KTAERROR, + "PE CPEServiceHandling::ServiceStatusChanged, disabled" ); + iModel.SendMessage( MEngineMonitor::EPEMessageServiceDisabled ); + } + } + + // don't remove observer, if state are connecting or disconnecting + if ( aServiceStatus.State() != ECCHConnecting && + aServiceStatus.State() != ECCHDisconnecting ) + { + service->RemoveObserver( *this ); + } + }//if( service ) + else + { + TEFLOGSTRING( KTAERROR, + "PE CPEServiceHandling::ServiceStatusChanged, no service" ); + } + } + TEFLOGSTRING( KTAINT, "PE CPEServiceHandling::ServiceStatusChanged >" ); + } + +// --------------------------------------------------------------------------- // CPEServiceHandling::CancelServiceEnabling // --------------------------------------------------------------------------- // void CPEServiceHandling::CancelServiceEnabling() const { TEFLOGSTRING( KTAREQIN, "PE CPEServiceHandling::CancelServiceEnabling" ); + + if ( iCchClient ) + { + CCchService* service = iCchClient->GetService( iCurrentServiceId ); + + if ( service ) + { + TCchServiceStatus serviceStatus; + TInt error = service->GetStatus( ECCHVoIPSub, serviceStatus ); + TCCHSubserviceState state = serviceStatus.State(); + + // Disable only, if service is connecting state + if ( error == KErrNone && state == ECCHConnecting ) + { + TEFLOGSTRING( KTAREQOUT, + "PE CPEServiceHandling::CancelServiceEnabling, CCchService->Disable" ); + service->Disable( ECCHUnknown ); + } + } + } } - + +// ----------------------------------------------------------------------------- +// CPEServiceHandling::SendErrorMessage +// ----------------------------------------------------------------------------- +// +void CPEServiceHandling::SendErrorMessage( + TInt aErrorCode ) + { + TEFLOGSTRING2( KTAINT, + "PE CPEServiceHandling::SendErrorMessage, aErrorCode: %d", + aErrorCode ); + + iModel.DataStore()->SetErrorCode( aErrorCode ); + iModel.SendMessage( MEngineMonitor::EPEMessageServiceHandlingError ); + } + // ----------------------------------------------------------------------------- // CPEServiceHandling::DisableService // ----------------------------------------------------------------------------- @@ -104,6 +299,15 @@ void CPEServiceHandling::DisableService() const { TEFLOGSTRING( KTAREQIN, "PE CPEServiceHandling::DisableService" ); - } + + CCchService* service = iCchClient->GetService( iCurrentServiceId ); + + if ( service ) + { + TEFLOGSTRING( KTAREQOUT, + "PE CPEServiceHandling::DisableService, CCchService->Disable" ); + service->Disable( ECCHUnknown ); + } + } // End of File