diff -r 000000000000 -r 4e1aa6a622a0 resourcemgmt/hwrmfmtxwatcherplugin/src/hwrmfmtxwatcherplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resourcemgmt/hwrmfmtxwatcherplugin/src/hwrmfmtxwatcherplugin.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Fmtx watcher plugin implementation. +* +*/ + + +#include +#include +#include "hwrmfmtxwatcherplugin.h" +#include "hwrmfmtxaccobserver.h" +#include "hwrmfmtxusbobserver.h" +#include "hwrmfmtxplugintimer.h" +#ifdef INSECURE_AUDIO_POLICY_KEYS +#include "hwrmfmtxtestobserver.h" +#endif // INSECURE_AUDIO_POLICY_KEYS +#include "trace.h" + +// Map the interface implementation UIDs to implementation factory functions +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(0x20012402, CHWRMFmtxWatcherPlugin::NewL) + }; + +// ======== OTHER EXPORTED FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// Exported proxy for instantiation method resolution. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::NewL +// ----------------------------------------------------------------------------- +// +CHWRMFmtxWatcherPlugin* CHWRMFmtxWatcherPlugin::NewL() + { + FUNC_LOG; + + CHWRMFmtxWatcherPlugin* self = new(ELeave) CHWRMFmtxWatcherPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::NewL +// ----------------------------------------------------------------------------- +// +CHWRMFmtxWatcherPlugin::~CHWRMFmtxWatcherPlugin() + { + FUNC_LOG; + + iObservers.ResetAndDestroy(); + iTimers.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::CHWRMFmtxWatcherPlugin +// ----------------------------------------------------------------------------- +// +CHWRMFmtxWatcherPlugin::CHWRMFmtxWatcherPlugin() + { + FUNC_LOG; + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::ConstructL +// ----------------------------------------------------------------------------- +// +void CHWRMFmtxWatcherPlugin::ConstructL() + { + FUNC_LOG; + + iConnected.Set( EFmtxWatcherObserverAccessory ); // assume connected + MHWRMFmtxConnObserver* observer = CHWRMFmtxAccObserver::NewL( *this ); + CleanupStack::PushL( observer ); + iObservers.AppendL( observer ); + CleanupStack::Pop( observer ); + +#ifndef __WINS__ // RUsbMan not created because it does not behave well in emulator + iConnected.Set( EFmtxWatcherObserverUsb ); // assume connected + observer = CHWRMFmtxUsbObserver::NewL( *this ); + CleanupStack::PushL( observer ); + iObservers.AppendL( observer ); + CleanupStack::Pop( observer ); +#else // __WINS__ + iObservers.AppendL( NULL ); +#endif // __WINS__ + +// Test observer should be always the last +#ifdef INSECURE_AUDIO_POLICY_KEYS + observer = CHWRMFmtxTestObserver::NewL( *this ); + CleanupStack::PushL( observer ); + iObservers.AppendL( observer ); + CleanupStack::Pop( observer ); +#endif // INSECURE_AUDIO_POLICY_KEYS + + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::ProcessCommandL +// ----------------------------------------------------------------------------- +// +void CHWRMFmtxWatcherPlugin::ProcessCommandL( const TInt aCommandId, + const TUint8 aTransId, + TDesC8& /*aData*/ ) + { + FUNC_LOG; + + INFO_LOG2( "CHWRMFmtxWatcherPlugin::ProcessCommandL, (0x%x, 0x%x)", + aCommandId, aTransId ); + + TInt retVal( KErrNone ); + + switch (aCommandId) + { + case HWRMFmTxCommand::EConnStatusCmdId: + TRAP( retVal, GetStatusL() ); + break; + + case HWRMFmTxCommand::EStartObservingCmdId: + TRAP( retVal, StartObservingL() ); + break; + + case HWRMFmTxCommand::EStopObservingCmdId: + StopObserving(); + break; + + default : + User::Leave( KErrNotSupported ); + break; + } + + // Create new timer for response. + CHWRMFmtxPluginTimer* timer = CHWRMFmtxPluginTimer::NewL( aCommandId, aTransId, retVal, *this ); + CleanupStack::PushL( timer ); + iTimers.AppendL( timer ); + CleanupStack::Pop( timer ); + INFO_LOG1( "CHWRMFmtxWatcherPlugin::ProcessCommandL, timers now %d", + iTimers.Count() ); + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::CancelCommandL +// ----------------------------------------------------------------------------- +// +void CHWRMFmtxWatcherPlugin::CancelCommandL(const TUint8 aTransId, +#if defined(FMTX_WATCHER_INFO_LOG_ENABLED) + const TInt aCommandId) +#else + const TInt /*aCommandId*/) +#endif + { + FUNC_LOG; + + INFO_LOG2( "CHWRMFmtxWatcherPlugin::CancelCommandL, (0x%x, 0x%x)", + aCommandId, aTransId ); + + TInt count = iTimers.Count(); + for( TInt i = 0; i < count; i++ ) + { + if ( iTimers[i]->TransId() == aTransId ) + { + delete iTimers[i]; + iTimers.Remove(i); + INFO_LOG1( "CHWRMFmtxWatcherPlugin::CancelCommandL, removed timer %d", i ); + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::GenericTimerFired +// ----------------------------------------------------------------------------- +// +void CHWRMFmtxWatcherPlugin::GenericTimerFired(TInt aCommandId, const TUint8 aTransId, + TInt aRetVal) + { + FUNC_LOG; + + INFO_LOG3( "CHWRMFmtxWatcherPlugin: GenericTimerFired, (0x%x, 0x%x, %d)", + aCommandId, aTransId, aRetVal ); + + TInt err = KErrNone; + + switch( aCommandId ) + { + case HWRMFmTxCommand::EConnStatusCmdId: + case HWRMFmTxCommand::EStartObservingCmdId: + { + HWRMFmTxCommand::TConnStatusData data; + data.iErrorCode = aRetVal; + data.iConnected = iConnected.Value() ? ETrue : EFalse; + HWRMFmTxCommand::TConnStatusPackage pckg( data ); + TRAP(err, iResponseCallback->ProcessResponseL( aCommandId, aTransId, pckg )); + break; + } + + case HWRMFmTxCommand::EStopObservingCmdId: + { + HWRMFmTxCommand::TErrorCodeResponsePackage pckg( aRetVal ); + TRAP(err, iResponseCallback->ProcessResponseL( aCommandId, aTransId, pckg )); + break; + } + + default : + { + HWRMFmTxCommand::TErrorCodeResponsePackage pckg( KErrNotSupported ); + TRAP(err, iResponseCallback->ProcessResponseL( aCommandId, aTransId, pckg )); + break; + } + } + + LOG_IF_ERROR1( err, "CHWRMFmtxWatcherPlugin::GenericTimerFired, err %d", err ); + + // delete obsolete (if any) timers + for( TInt i = (iTimers.Count()-1); i >= 0 ; i-- ) + { + if ( !iTimers[i]->IsActive() ) + { + delete iTimers[i]; + iTimers.Remove(i); + } + } + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::GetStatusL +// ----------------------------------------------------------------------------- +// +TBool CHWRMFmtxWatcherPlugin::GetStatusL() + { + FUNC_LOG; + + TInt count = iObservers.Count(); + for( TInt i = 0; i < count; i++ ) + { + MHWRMFmtxConnObserver* observer = iObservers[i]; + if ( observer ) + { + iConnected.Assign( i, observer->GetStatusL() ); + } + } + + return iConnected.Value(); + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::StartObservingL +// ----------------------------------------------------------------------------- +// +void CHWRMFmtxWatcherPlugin::StartObservingL() + { + FUNC_LOG; + + TInt count = iObservers.Count(); + for( TInt i = 0; i < count; i++ ) + { + MHWRMFmtxConnObserver* observer = iObservers[i]; + if ( observer ) + { + observer->StartObservingL(); + } + } + + GetStatusL(); + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::StopObserving +// ----------------------------------------------------------------------------- +// +void CHWRMFmtxWatcherPlugin::StopObserving() + { + FUNC_LOG; + + TInt count = iObservers.Count(); + for( TInt i = 0; i < count; i++ ) + { + MHWRMFmtxConnObserver* observer = iObservers[i]; + if ( observer ) + { + observer->StopObserving(); + } + } + } + +// ----------------------------------------------------------------------------- +// CHWRMFmtxWatcherPlugin::HandleConnectionChange +// ----------------------------------------------------------------------------- +// +void CHWRMFmtxWatcherPlugin::HandleConnectionChange( TFmtxWatcherObserverTypes aType, + TBool aConnected ) + { + FUNC_LOG; + + iConnected.Assign( aType, aConnected ); + + HWRMFmTxCommand::TConnStatusData data; + data.iErrorCode = KErrNone; + data.iConnected = iConnected.Value() ? ETrue : EFalse; + HWRMFmTxCommand::TConnStatusPackage pckg( data ); + TRAPD( err, iResponseCallback->EventL( HWRMFmTxCommand::ETxWatcherConnIndId, pckg ) ); + + LOG_IF_ERROR1( err, "CHWRMFmtxWatcherPlugin::HandleConnectionChange: err=%d", err ); + }