--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sensorservices/sensorserver/src/server/sensrvecomchangelistener.cpp Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,231 @@
+/*
+* Copyright (c) 2007-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: Listener for new ECom plugins
+*
+*/
+
+
+
+#include "sensrvdefines.h"
+#include "sensrvecomchangelistener.h"
+#include "ssycontrol.h"
+
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSensrvEcomChangeListener* CSensrvEcomChangeListener::NewL(MSensrvEcomChangeObserver& aObserver)
+ {
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::NewL(0x%x)" ), &aObserver ) );
+
+ CSensrvEcomChangeListener* self = new (ELeave) CSensrvEcomChangeListener(aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::NewL - return 0x%x" ), self ) );
+
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CSensrvEcomChangeListener::CSensrvEcomChangeListener(MSensrvEcomChangeObserver& aObserver)
+ : CActive(EPriorityHigh),
+ iObserver(aObserver)
+ {
+ // Nothing to do
+ }
+
+// ---------------------------------------------------------------------------
+// 2nd phase of construction.
+// ---------------------------------------------------------------------------
+//
+void CSensrvEcomChangeListener::ConstructL()
+ {
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::ConstructL()" ) ) );
+
+ CActiveScheduler::Add(this);
+
+ // Start listening to ecom
+ iEcom = &(REComSession::OpenL());
+
+ // Create retry timer
+ iTimer = CSensrvEcomChangeListenerTimer::NewL( this );
+
+ // Execute initial check for plugins immediately.
+ // Plugins must be solved before clients start using the server after connect.
+ CheckEcomChanges();
+
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::ConstructL - return" ) ) );
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CSensrvEcomChangeListener::~CSensrvEcomChangeListener()
+ {
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::~CSensrvEcomChangeListener()" ) ) );
+
+ Cancel();
+
+ if (iEcom)
+ {
+ iEcom->Close();
+ }
+
+ if ( iTimer )
+ {
+ iTimer->Cancel();
+ delete iTimer;
+ iTimer = NULL;
+ }
+
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::~CSensrvEcomChangeListener - return" ) ) );
+ }
+
+
+// ---------------------------------------------------------------------------
+// TimerCallBack
+// ---------------------------------------------------------------------------
+//
+void CSensrvEcomChangeListener::TimerCallBack()
+ {
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::TimerCallBack()" ) ) );
+
+ CheckEcomChanges();
+
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::TimerCallBack - return" ) ) );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CheckEcomChanges
+// ---------------------------------------------------------------------------
+//
+void CSensrvEcomChangeListener::CheckEcomChanges()
+ {
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::CheckEcomChanges()" ) ) );
+
+ TBool changeOk( ETrue );
+ TInt err( KErrNone );
+
+ if ( !IsActive() ) //Not active
+ {
+ iEcom->NotifyOnChange(iStatus);
+
+ iTimer->Cancel();
+
+ SetActive();
+ }
+
+ // Scan for SSY plugins
+ RImplInfoPtrArray* implInfoArray = NULL;
+ implInfoArray = new RImplInfoPtrArray();
+ CleanupStack::PushL( implInfoArray );
+
+ if ( implInfoArray )
+ {
+ TRAP(err, REComSession::ListImplementationsL( TUid::Uid(KSsyControlInterfaceUid),
+ *implInfoArray));
+ }
+ else
+ {
+ ERROR_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::RunL() - ERROR: Allocating implInfoArray failed" ) ) );
+ err = KErrNoMemory;
+ }
+
+ // If listing implementations fails, ecom may be busy constructing the index.
+ // Retry after one second in that case.
+ if ( err == KErrNone )
+ {
+ // Everything ok, notify owner about new plugins
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::RunL() - Notifying observer" ) ) );
+ changeOk = iObserver.EcomChanged(implInfoArray);
+
+ // Do not destroy implementation infos, EcomChanged cleans array up if change is ok,
+ // and otherwise they will get cleaned up below
+ }
+
+ CleanupStack::Pop( implInfoArray );
+ if ( err != KErrNone || !changeOk )
+ {
+ ERROR_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::RunL() - ERROR: Scanning for plugins failed or server could not handle new plugins just now, starting retry timer" ) ) );
+
+ if ( implInfoArray )
+ {
+ implInfoArray->ResetAndDestroy();
+ delete implInfoArray;
+ }
+
+ // Start rescan timer
+ iTimer->StartTimer();
+ }
+
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::CheckEcomChanges - return" ) ) );
+ }
+
+
+// -----------------------------------------------------------------------------
+// Handle notification from the other thread.
+// -----------------------------------------------------------------------------
+//
+void CSensrvEcomChangeListener::RunL()
+ {
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::RunL()" ) ) );
+
+ CheckEcomChanges();
+
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::RunL - return" ) ) );
+ }
+
+// -----------------------------------------------------------------------------
+// Handle error in RunL
+// -----------------------------------------------------------------------------
+//
+#ifdef ERROR_TRACE_DEBUG
+TInt CSensrvEcomChangeListener::RunError(TInt aError)
+#else
+TInt CSensrvEcomChangeListener::RunError(TInt /*aError*/)
+#endif
+ {
+ ERROR_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::RunError(%d)" ), aError) );
+
+ // Panic this thread if there is unhandled error in RunL.
+ // This should not be possible.
+ User::Panic(KSensrvPanicCategory, ESensrvPanicEcomChangeRunError);
+
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::RunError - return %d" ), KErrNone ) );
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// Handle cancel order on this active object.
+// -----------------------------------------------------------------------------
+//
+void CSensrvEcomChangeListener::DoCancel()
+ {
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::DoCancel()" ) ) );
+
+ iEcom->CancelNotifyOnChange(iStatus);
+ iTimer->Cancel();
+
+ COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvEcomChangeListener::DoCancel - return" ) ) );
+ }
+