--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfw/src/cfserver/cfecomobserver.cpp Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,200 @@
+/*
+* Copyright (c) 2006-2007 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: CCFEcomObserver class implementation.
+*
+*/
+
+
+#include "cfecomobserver.h"
+#include "cftrace.h"
+#include "cfstateobserver.h"
+
+// LOCAL DEFINITIONS
+
+#ifdef _DEBUG
+_LIT( KPanicCat, "CFEcomObs" );
+
+// Panic codes
+enum TPanicReason
+ {
+ EAlreadyActive,
+ EInvalidObserver
+ };
+
+// LOCAL FUNCTIONS
+LOCAL_C void Panic( TInt aReason )
+ {
+ User::Panic( KPanicCat, aReason );
+ }
+#endif
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::CCFEComObserver
+//-----------------------------------------------------------------------------
+//
+CCFEComObserver::CCFEComObserver(): CActive( EPriorityStandard )
+ {
+ FUNC_LOG;
+
+ CActiveScheduler::Add( this );
+ }
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::NewLC
+//-----------------------------------------------------------------------------
+//
+CCFEComObserver* CCFEComObserver::NewLC()
+ {
+ FUNC_LOG;
+
+ CCFEComObserver* self = new ( ELeave ) CCFEComObserver();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::NewL
+//-----------------------------------------------------------------------------
+//
+CCFEComObserver* CCFEComObserver::NewL()
+ {
+ FUNC_LOG;
+
+ CCFEComObserver* self = CCFEComObserver::NewLC();
+ CleanupStack::Pop(); // self;
+ return self;
+ }
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::ConstructL
+//-----------------------------------------------------------------------------
+//
+void CCFEComObserver::ConstructL()
+ {
+ FUNC_LOG;
+
+ iEComSession = &REComSession::OpenL();
+ StartObserving();
+ }
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::~CCFEComObserver
+//-----------------------------------------------------------------------------
+//
+CCFEComObserver::~CCFEComObserver()
+ {
+ FUNC_LOG;
+
+ // Cancel any request, if outstanding
+ Cancel();
+
+ // Clean up memebers
+ iObservers.Close();
+ if( iEComSession )
+ {
+ iEComSession->Close();
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::DoCancel
+//-----------------------------------------------------------------------------
+//
+void CCFEComObserver::DoCancel()
+ {
+ FUNC_LOG;
+
+ iEComSession->CancelNotifyOnChange( iStatus );
+ }
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::StartObserving
+//-----------------------------------------------------------------------------
+//
+void CCFEComObserver::StartObserving()
+ {
+ FUNC_LOG;
+
+ __ASSERT_DEBUG( !IsActive(), Panic( EAlreadyActive) );
+
+ SetActive();
+ iEComSession->NotifyOnChange( iStatus );
+ }
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::AddObserverL
+//-----------------------------------------------------------------------------
+//
+void CCFEComObserver::AddObserverL( MCFStateObserver* aObserver )
+ {
+ FUNC_LOG;
+
+ __ASSERT_DEBUG( aObserver, Panic( EInvalidObserver ) );
+
+ iObservers.AppendL( aObserver );
+ }
+
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::RunL
+//-----------------------------------------------------------------------------
+//
+void CCFEComObserver::RunL()
+ {
+ FUNC_LOG;
+
+ // Store completion status
+ TInt status = iStatus.Int();
+
+ // Continue request
+ StartObserving();
+
+ // Notify observers
+ if( status == KErrNone )
+ {
+ NotifyObservers();
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCFEComObserver::RunError
+//-----------------------------------------------------------------------------
+//
+TInt CCFEComObserver::RunError( TInt aError )
+ {
+ return aError;
+ }
+
+//------------------------------------------------------------------------------
+// CCFEComObserver::NotifyObservers
+//------------------------------------------------------------------------------
+//
+void CCFEComObserver::NotifyObservers()
+ {
+ FUNC_LOG;
+
+ INFO( "CCFEComObserver::NotifyObservers - New plug-ins detected, updating" );
+
+ TInt count = iObservers.Count();
+ for( TInt i = 0; i < count; i++ )
+ {
+ TInt err = KErrNone;
+ TRAP( err, iObservers[i]->UpdatePlugInsL( ) );
+ ERROR( err, "Failed to update plug-ins" );
+ }
+ }
+
+// End of file
+