diff -r 95c570bf4a05 -r 9a7e3d5f461a locationrequestmgmt/locationserver/src/EPos_CPositionRequest.cpp --- a/locationrequestmgmt/locationserver/src/EPos_CPositionRequest.cpp Wed Aug 18 11:11:46 2010 +0300 +++ b/locationrequestmgmt/locationserver/src/EPos_CPositionRequest.cpp Fri Sep 17 08:37:32 2010 +0300 @@ -21,6 +21,7 @@ #include #include #include +#include #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