locationrequestmgmt/locationserver/src/EPos_CPositionRequest.cpp
changeset 57 3267d9ea3e98
parent 48 81c9bee26a45
--- a/locationrequestmgmt/locationserver/src/EPos_CPositionRequest.cpp	Tue Jul 13 12:25:28 2010 +0100
+++ b/locationrequestmgmt/locationserver/src/EPos_CPositionRequest.cpp	Wed Sep 08 15:16:57 2010 +0100
@@ -21,6 +21,7 @@
 #include <lbs/epos_cpositioner.h>
 #include <lbs/epos_cposmodules.h>
 #include <lbs/epos_mposmodulesobserver.h>
+#include <centralrepository.h>
 #include "lbsdevloggermacros.h"
 #include "EPos_ServerPanic.h"
 #include "EPos_Global.h"
@@ -28,12 +29,16 @@
 #include "EPos_CPositionRequest.h"
 #include "epos_cposmodulessettings.h"
 
+
 //TODO Verify
 #include "EPos_CPosLocMonitorReqHandlerHub.h"
 #include "OstTraceDefinitions.h"
 #ifdef OST_TRACE_COMPILER_IN_USE
 #include "EPos_CPositionRequestTraces.h"
 #endif
+#include "lbsrootcenrepdefs.h"
+#include "lbspositioningstatusprops.h"
+
 
 
 
@@ -43,6 +48,7 @@
 #endif
 
 const TInt KParamPositionInfo = 0;
+const TTimeIntervalMicroSeconds KIndFlickerTresholdTracking = 30000000; 
 
 // ================= LOCAL FUNCTIONS ========================
 
@@ -78,7 +84,8 @@
     iPositionerParams(aPositionerParams),
     iHasProxyPositioner(aIsProxy),
     iLocMonitorReqHandler(aLocMonitorReqHandlerHub),
-    iModuleSettings(aModuleSettings)
+    iModuleSettings(aModuleSettings),
+    iPositioningActive( EFalse )
     {
     CActiveScheduler::Add(this);
     }
@@ -101,6 +108,14 @@
         User::Leave(KErrNotFound);
         }
 
+    // Get the CategoryUid from the cenrep file owned by LbsRoot.
+    CRepository* rep = CRepository::NewLC(KLbsCenRepUid);
+    TInt posStatusCategory;
+    TInt err = rep->Get(KMoPositioningStatusAPIKey, posStatusCategory);
+    User::LeaveIfError(err);
+    CleanupStack::PopAndDestroy(rep);
+    iPosStatusCategory = TUid::Uid(posStatusCategory);
+    
     LoadPositionerL();
     }
 
@@ -150,6 +165,9 @@
     delete iPositionBuffer;
     delete iTimeoutTimer;
     delete iPositioner;
+    
+    // Deactivate the positioning status when the object dies.
+    DeActivatePositioningStatusIfNeeded();
     }
 
 /**
@@ -161,11 +179,15 @@
     {
     if (!iModuleInfo.IsAvailable())
         {
+        // Deactivate positioning status if there are PSY's not found.
+        DeActivatePositioningStatusIfNeeded();
         User::Leave(KErrNotFound);
         }
 
     __ASSERT_DEBUG(iPositioner, DebugPanic(EPosServerPanicPositionerNotInitialized));
     
+    
+
     iMessage = aMessage; // Store parameter here in case of leave.
 
     // Clear previous position data
@@ -188,11 +210,15 @@
         User::Leave(KErrArgument);
         }
 
+ 
+
     // Set ModuleId to KNullId to be able to verify that Id is set by PSY.
     infoBase.SetModuleId(KNullUid);
 
     CleanupStack::PushL(TCleanupItem(CancelTimerCleanup, iTimeoutTimer));
 
+		ActivatePositioningStatusIfNeeded();
+
     // Start timer if necessary
     if (iTimeOut.Int64() > 0)
         {
@@ -324,7 +350,7 @@
         {
         return;
         }
-
+	
     switch (aEvent.iType)
         {
         case EPosModulesEventAvailabilityChanged:
@@ -339,9 +365,11 @@
         default:
             return;
         }
-
-    if (!iModuleInfo.IsAvailable())
+		if (!iModuleInfo.IsAvailable())
         {
+        // Deactivate positioning status if there are PSY's not found.
+        DeActivatePositioningStatusIfNeeded();	
+        
         if (IsActive())
             {
             CompleteClient(KErrNotFound);
@@ -467,6 +495,9 @@
         	DEBUG_TRACE("CPositionRequest::DoCancel() panicing", __LINE__)
             DebugPanic(EPosServerPanicRequestInconsistency);
         }
+    
+    // Deactive positioning status after cancellation.
+    DeActivatePositioningStatusIfNeeded();
 
     TInt err;
     if (iRequestTimedOut)
@@ -487,6 +518,7 @@
         }
 
     iRequestPhase = EPosReqInactive;
+    
     OstTraceFunctionExit1( CPOSITIONREQUEST_DOCANCEL_EXIT, this );
     }
 
@@ -526,6 +558,17 @@
         {
         CompleteClient(aReason);
         }
+    
+    // If the request is not tracking mode, deactivate the indicator
+    // Tracking mode check and the last check for the error scenarios other than
+    // KErrNone and KPositionPartialUpdate.
+    if( ( ( iTrackingState == EPosFirstTrackingRequest || iTrackingState == EPosTracking ) &&
+    	     iTrackingUpdateInterval >  KIndFlickerTresholdTracking ) ||
+          iTrackingUpdateInterval == TTimeIntervalMicroSeconds ( 0 ) ||
+          !( aReason == KErrNone || aReason == KPositionPartialUpdate ) )
+        {
+        DeActivatePositioningStatusIfNeeded();
+        }
     }
 
 void CPositionRequest::StartPositionDataRequestPhase()
@@ -733,4 +776,61 @@
 	iTimeoutTimer->ExtendTimeout(aAdditionalTime);
 	}
 
+void CPositionRequest::ActivatePositioningStatusIfNeeded()
+    {
+    // Check for the positioning status, If it has been activated from this object,
+    // there is no need to increment the count again.
+    if( !iPositioningActive )
+        {
+        TInt count, err;     
+        err = RProperty::Get(iPosStatusCategory, KLbsMoPositioningStatusKey, count);
+
+        if(err == KErrNone)
+            {
+            err = RProperty::Set(iPosStatusCategory, KLbsMoPositioningStatusKey, count+1);
+            if(err == KErrNone)
+                {
+                iPositioningActive = ETrue; 
+                }
+            else
+                {
+                DEBUG_TRACE("CPositionRequest::ActivatePositioningStatusIfNeeded() - Error in  setting Positioning Status", __LINE__)
+                }
+            }
+        else 
+            {
+            DEBUG_TRACE("CPositionRequest::ActivatePositioningStatusIfNeeded() - Error in  getting Positioning Status", __LINE__)
+			
+            }
+        }
+    }
+
+void CPositionRequest::DeActivatePositioningStatusIfNeeded()
+    {
+    // If the positioning status is activated by this object, deactivate it
+    if( iPositioningActive )
+        {
+        TInt  count, err;     
+        err = RProperty::Get(iPosStatusCategory, KLbsMoPositioningStatusKey, count);
+        
+        if(err == KErrNone)
+        	{
+            __ASSERT_DEBUG(count > 0, DebugPanic(EPosServerPanicIndDeactivationFailed));
+        	
+            err = RProperty::Set(iPosStatusCategory, KLbsMoPositioningStatusKey, count-1);
+            if(err == KErrNone)
+                {
+                iPositioningActive = EFalse;
+                }
+            else
+                {
+                DEBUG_TRACE("CPositionRequest::DeActivatePositioningStatusIfNeeded() - error in setting Positioning Status", __LINE__)	
+                }		
+        	}
+        else
+        	{
+        	DEBUG_TRACE("CPositionRequest::DeActivatePositioningStatusIfNeeded() - error in getting Positioning Status", __LINE__)            	
+        	}	
+        }
+    }
 //  End of File