--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/location/landmarks/src/clapilmdatabaseeventnotifier.cpp Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,161 @@
+/*
+* 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: Handles native landmark database events
+ *
+*/
+
+
+// INTERNAL INCLUDES
+#include "clapilmdatabaseeventnotifier.h"
+#include "mlapilmdatabaseobserver.h"
+#include "lapipanics.h"
+#include "logger.h"
+
+// EXTERNAL INCLUDES
+#include <EPos_CPosLandmarkDatabase.h>
+
+// ---------------------------------------------------------------------------
+// CLAPILmDatabaseEventNotifier::NewLC
+// ---------------------------------------------------------------------------
+//
+CLAPILmDatabaseEventNotifier* CLAPILmDatabaseEventNotifier::NewLC(
+ CPosLandmarkDatabase& aDatabase)
+{
+ JELOG2(EJavaLocation);
+ CLAPILmDatabaseEventNotifier* self =
+ new(ELeave) CLAPILmDatabaseEventNotifier(aDatabase);
+ CleanupStack::PushL(self);
+ return self;
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILmDatabaseEventNotifier::~CLAPILmDatabaseEventNotifier
+// ---------------------------------------------------------------------------
+//
+CLAPILmDatabaseEventNotifier::~CLAPILmDatabaseEventNotifier()
+{
+ JELOG2(EJavaLocation);
+ Cancel();
+ iEventObservers.Close();
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILmDatabaseEventNotifier::AddObserverL
+// ---------------------------------------------------------------------------
+//
+void CLAPILmDatabaseEventNotifier::AddObserverL(
+ MLAPILmDatabaseObserver* aObserver)
+{
+ JELOG2(EJavaLocation);
+ __ASSERT_DEBUG(aObserver, LAPIError::Panic(ELAPIPanicNullArgument));
+ iEventObservers.AppendL(aObserver);
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILmDatabaseEventNotifier::RemoveObserver
+// ---------------------------------------------------------------------------
+//
+void CLAPILmDatabaseEventNotifier::RemoveObserver(
+ MLAPILmDatabaseObserver* aObserver)
+{
+ JELOG2(EJavaLocation);
+ __ASSERT_DEBUG(aObserver, LAPIError::Panic(ELAPIPanicNullArgument));
+ TInt index = iEventObservers.Find(aObserver);
+ if (index != KErrNotFound)
+ {
+ iEventObservers.Remove(index);
+ }
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILmDatabaseEventNotifier::IsEventListeningSupported
+// ---------------------------------------------------------------------------
+//
+TBool CLAPILmDatabaseEventNotifier::IsEventListeningSupported()
+{
+ JELOG2(EJavaLocation);
+ // Event listening is not supported if the first request has returned
+ // with KErrNotSupported error code. If there are requests pending, it
+ // means that the request is pending and event listening is supported
+ return iStatus != KErrNotSupported;
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILmDatabaseEventNotifier::RunL
+// ---------------------------------------------------------------------------
+//
+void CLAPILmDatabaseEventNotifier::RunL()
+{
+ JELOG2(EJavaLocation);
+ LOG1(EJavaLocation, EInfo, "CLAPILmDatabaseEventNotifier::RunL - event %d",
+ iEvent.iEventType);
+ // Listening database events is not supported. Stop listening and return
+ if (iStatus == KErrNotSupported)
+ {
+ return;
+ }
+ else
+ {
+ TPosLmEvent curEvent(iEvent);
+ TRequestStatus curStatus(iStatus);
+ // Request a new database event. The operation completes when a change
+ // occurs in the native database so the callback does not occur immediately
+ // Call this before notifying the observer because events may occur
+ // very frequently so subsequent events will not be missed
+ iDatabase.NotifyDatabaseEvent(iEvent, iStatus);
+ SetActive();
+
+ // Notify observers if the change occured without any errors. All events
+ // are informed to the observers which are responsible for filtering
+ // incorrect events
+ if (curStatus == KErrNone)
+ {
+ TInt observerCount = iEventObservers.Count();
+ for (TInt i = 0; i < observerCount; i++)
+ {
+ iEventObservers[i]->NotifyEvent(curEvent.iEventType,
+ curEvent.iLandmarkItemId);
+ }
+ }
+ }
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILmDatabaseEventNotifier::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CLAPILmDatabaseEventNotifier::DoCancel()
+{
+ JELOG2(EJavaLocation);
+ // Cancel listening database events
+ iDatabase.CancelNotifyDatabaseEvent();
+}
+
+// ---------------------------------------------------------------------------
+// CLAPILmDatabaseEventNotifier::CLAPILmDatabaseEventNotifier
+// ---------------------------------------------------------------------------
+//
+CLAPILmDatabaseEventNotifier::CLAPILmDatabaseEventNotifier(
+ CPosLandmarkDatabase& aDatabase) :
+ CActive(EPriorityStandard), iDatabase(aDatabase)
+{
+ JELOG2(EJavaLocation);
+ CActiveScheduler::Add(this);
+ // Issue database change request. Note that the request completes only
+ // when a change occurs in the native database
+ iDatabase.NotifyDatabaseEvent(iEvent, iStatus);
+ SetActive();
+}
+
+// End of file