--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/headsetstatusapi/Src/CHeadsetStatusObserver.cpp Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 2005 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:
+* Main functionality of CHeadsetStatusObserver
+*
+*
+*/
+
+
+#ifdef __ACCESSORY_FW
+
+// INCLUDE FILES
+#include "CHeadsetStatusObserver.h"
+#include "HeadsetStatus.h"
+
+#include <AccessoryMode.h>
+
+// UNNAMED NAMESPACE FOR LOCAL DEFINITIONS
+namespace
+ {
+ // CONSTANTS
+ #ifdef _DEBUG
+ _LIT( KPanicCat, "HeadsetStatusObserver" );
+ #endif
+ // DATA TYPES
+ enum TPanicCode
+ {
+ EAlreadyObserving,
+ EInvalidObserver
+ };
+ }
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// C++ constructor.
+// ---------------------------------------------------------------------------
+CHeadsetStatusObserver::CHeadsetStatusObserver( RAccessoryMode& aAccMode ):
+ CActive( CActive::EPriorityStandard ),
+ iAccMode( aAccMode )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::NewL
+//
+// Symbian OS two-phased constructor.
+// ---------------------------------------------------------------------------
+CHeadsetStatusObserver* CHeadsetStatusObserver::NewL( RAccessoryMode& aAccMode )
+ {
+ CHeadsetStatusObserver* self = new ( ELeave )
+ CHeadsetStatusObserver( aAccMode );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::ConstructL
+//
+// Symbian OS two-phased constructor.
+// ---------------------------------------------------------------------------
+void CHeadsetStatusObserver::ConstructL()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// C++ destructor
+// ---------------------------------------------------------------------------
+CHeadsetStatusObserver::~CHeadsetStatusObserver()
+ {
+ Cancel();
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::SetObserver
+// ---------------------------------------------------------------------------
+void CHeadsetStatusObserver::SetObserver( MHeadsetStatusObserver* aObserver )
+ {
+ __ASSERT_DEBUG( aObserver, User::Panic( KPanicCat, EInvalidObserver ) );
+
+ iObserver = aObserver;
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::StartObserving
+// ---------------------------------------------------------------------------
+void CHeadsetStatusObserver::StartObserving()
+ {
+ __ASSERT_DEBUG( !IsActive(), User::Panic( KPanicCat, EAlreadyObserving ) );
+
+ // Set iStatus to pending and request notifications
+ iAccMode.NotifyAccessoryModeChanged( iStatus, iAccPolMode );
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::RunL
+// ---------------------------------------------------------------------------
+void CHeadsetStatusObserver::RunL()
+ {
+ TInt err( iStatus.Int() );
+ if( err == KErrNone )
+ {
+ // Notify observer
+ NotifyObserverL();
+ }
+ else
+ {
+ // Notify error
+ NotifyObserverError( err );
+ }
+
+ // continue observing
+ StartObserving();
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::DoCancel
+// ---------------------------------------------------------------------------
+void CHeadsetStatusObserver::DoCancel()
+ {
+ // cancel acc mode changed notifications
+ iAccMode.CancelNotifyAccessoryModeChanged();
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::RunError
+// ---------------------------------------------------------------------------
+TInt CHeadsetStatusObserver::RunError( TInt aError )
+ {
+ // error notified to observer
+ NotifyObserverError( aError );
+
+ // continue observing
+ StartObserving();
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::NotifyObserverL
+// ---------------------------------------------------------------------------
+void CHeadsetStatusObserver::NotifyObserverL()
+ {
+ __ASSERT_DEBUG( iObserver, User::Panic( KPanicCat, EInvalidObserver ) );
+
+ TBool connected( EFalse );
+
+ switch( iAccPolMode.iAccessoryMode )
+ {
+ // Headset connected
+ case EAccModeWiredHeadset:
+ case EAccModeWirelessHeadset:
+ case EAccModeLoopset:
+ case EAccModeHeadphones:
+ {
+ connected = ETrue;
+ break;
+ }
+ // Headset disconnected
+ case EAccModeHandPortable:
+ case EAccModeWiredCarKit:
+ case EAccModeWirelessCarKit:
+ case EAccModeTextDevice:
+ case EAccModeMusicStand:
+ default:
+ {
+ // nothing to do
+ break;
+ }
+ }
+
+ // notify observer
+ iObserver->HeadsetStatusChangedL( connected );
+ }
+
+// ---------------------------------------------------------------------------
+// CHeadsetStatusObserver::NotifyObserverError
+// ---------------------------------------------------------------------------
+void CHeadsetStatusObserver::NotifyObserverError( TInt aError )
+ {
+ __ASSERT_DEBUG( iObserver, User::Panic( KPanicCat, EInvalidObserver ) );
+
+ iObserver->HeadsetStatusError( aError );
+ }
+#endif // __ACCESSORY_FW
+
+// End of File