locationrequestmgmt/locationserver/src/EPos_CPosModulesStatus.cpp
branchRCL_3
changeset 54 0c2046328c85
parent 0 9cfd9a3ee49c
child 55 c92d4f3c47c5
child 57 3267d9ea3e98
--- 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)