--- a/locationrequestmgmt/locationserver/src/EPos_CPosModulesStatus.cpp Thu Aug 19 11:17:26 2010 +0300
+++ b/locationrequestmgmt/locationserver/src/EPos_CPosModulesStatus.cpp Tue Aug 31 16:38:06 2010 +0300
@@ -17,6 +17,8 @@
// INCLUDE FILES
#include <e32base.h>
+#include <e32property.h>
+#include <centralrepository.h>
#include <lbs/epos_cposmodules.h>
#include <lbs/epos_cposmoduleidlist.h>
#include "epos_mposmodulestatuslistener.h"
@@ -24,6 +26,8 @@
#include "EPos_CPosModulesStatus.h"
#include "EPos_Global.h"
#include "EPos_ServerPanic.h"
+#include "lbsrootcenrepdefs.h"
+#include "lbspositioningstatusprops.h"
// CONSTANTS
#ifdef _DEBUG
@@ -131,7 +135,17 @@
User::LeaveIfError(iModuleStatusArray.Append(module));
}
CleanupStack::PopAndDestroy(idList);
+ iActivePosModuleArray.Reset();
+ // Get the CategoryUid from the cenrep file owned by LbsRoot.
+ CRepository* rep = CRepository::NewLC(KLbsCenRepUid);
+ TInt posStatusCategory;
+ DEBUG_TRACE("Opening Status API Settings...", __LINE__)
+ User::LeaveIfError(rep->Get(KMoPositioningStatusAPIKey, posStatusCategory));
+ DEBUG_TRACE("Opened Status API Settings...", __LINE__)
+ CleanupStack::PopAndDestroy(rep);
+ iPosStatusCategory = TUid::Uid(posStatusCategory);
+
iTimer = CPeriodic::NewL(EPriorityLow);
}
@@ -447,6 +461,8 @@
return;
}
+ NotifyPosModuleStatusToSubscriber(aImplementationUid, aStatus);
+
TPosModule& storedModule = iModuleStatusArray[index];
TPositionModuleStatus::TDeviceStatus storedDeviceStatus =
storedModule.iStatus.DeviceStatus();
@@ -472,7 +488,7 @@
storedModule.iDataQualityTimeStamp = iSequenceNo;
event.SetOccurredEvents(KEventQuality | (event.OccurredEvents()));
}
-
+
// Has any event occurred?
if (event.OccurredEvents())
{
@@ -694,6 +710,44 @@
}
/**
+ * Notify event to subscriber
+ */
+void CPosModulesStatus::NotifyPosModuleStatusToSubscriber(const TPositionModuleId& aImplementationUid, const TPositionModuleStatus& aStatus)
+ {
+ //1. Search for uid in the list of active uids
+ //2. If uid doesnt exist, and status is active - add uid in the list
+ //3. If uid exists and status is inactive - remove it from the list
+
+ TPositionModuleStatus::TDeviceStatus devStatus = aStatus.DeviceStatus();
+ TInt item = iActivePosModuleArray.Find(aImplementationUid);
+ if(item == KErrNotFound)
+ {
+ if(devStatus == TPositionModuleStatus::EDeviceActive || devStatus == TPositionModuleStatus::EDeviceReady)
+ {
+ //Ignoring error as RArray by default creates array of Granularity 8
+ iActivePosModuleArray.Append(aImplementationUid);
+ }
+ }
+ else
+ {
+ if(!(devStatus == TPositionModuleStatus::EDeviceActive || devStatus == TPositionModuleStatus::EDeviceReady))
+ {
+ iActivePosModuleArray.Remove(item);
+ }
+ }
+
+ TInt itemCount = iActivePosModuleArray.Count();
+ if(itemCount > 0)
+ {
+ RProperty::Set(iPosStatusCategory, KLbsMoPositioningStatusKey, itemCount);
+ }
+ else
+ {
+ RProperty::Set(iPosStatusCategory, KLbsMoPositioningStatusKey, 0);
+ }
+ }
+
+/**
* Timer callback
*/
TInt CPosModulesStatus::TimerCallback(TAny* aModulesStatus)