camerauis/cameraxui/cxengine/src/cxegeotaggingtrail_symbian_p.cpp
changeset 55 0da2a5b56583
parent 46 c826656d6714
--- a/camerauis/cameraxui/cxengine/src/cxegeotaggingtrail_symbian_p.cpp	Mon Aug 23 13:50:05 2010 +0300
+++ b/camerauis/cameraxui/cxengine/src/cxegeotaggingtrail_symbian_p.cpp	Fri Sep 03 11:00:58 2010 +0300
@@ -29,6 +29,7 @@
 {
     // in milliseconds
     const int STOP_TRAIL_INTERVAL = 10*1000;
+    const int START_TRAIL_ATTEMPTS = 5;
 }
 
 /*!
@@ -89,32 +90,39 @@
     CX_DEBUG_ENTER_FUNCTION();
 
     int err = KErrNone;
+    int retryTrail = START_TRAIL_ATTEMPTS; // In case RLocationTrail::StartLocationTrail() fail, we will retry
     int settingValue = Cxe::GeoTaggingOff;
     settingValue = mSettings.get(CxeSettingIds::GEOTAGGING, settingValue);
     
     if (settingValue == Cxe::GeoTaggingOn) {
-        // geotagging setting is ON, trying to start location trail
-        if (state() == CxeGeoTaggingTrail::NotConnected) {
-            err = mLocationTrail.Connect();
-            if (!err) {
-                CX_DEBUG(("CxeGeoTaggingTrail <> location trail connected"));
-                setState(CxeGeoTaggingTrail::Connected);
+        while(retryTrail) {
+            // geotagging setting is ON, trying to start location trail
+            if (state() == CxeGeoTaggingTrail::NotConnected) {
+                err = mLocationTrail.Connect();
+                if (!err) {
+                    CX_DEBUG(("CxeGeoTaggingTrail <> location trail connected"));
+                    setState(CxeGeoTaggingTrail::Connected);
+                }
+            }
+            // KErrAlreadyExists error means no harm to us
+            if (state() == CxeGeoTaggingTrail::Connected &&
+                (!err || err == KErrAlreadyExists)) {
+                err = mLocationTrail.StartLocationTrail(RLocationTrail::ECaptureAll);
+                if (!err || err == KErrAlreadyExists) {
+                    CX_DEBUG(("CxeGeoTaggingTrail <> starting location trail"));
+                    mStopLocationTrailTimer.stop(); // stop location timer.
+                    setState(CxeGeoTaggingTrail::TrailStarted);
+                }
+            }
+            if (err && err != KErrAlreadyExists) {
+                CX_DEBUG(("CxeGeoTaggingTrailPrivate::start <> FAILED: error = %d . Retries left = %d", err, retryTrail));
+                mLocationTrail.Close();
+                retryTrail--;
+            }
+            else {
+                retryTrail = 0;
             }
         }
-    
-        if (state() == CxeGeoTaggingTrail::Connected && !err) {
-            err = mLocationTrail.StartLocationTrail(RLocationTrail::ECaptureAll);
-            if (!err) {
-                CX_DEBUG(("CxeGeoTaggingTrail <> starting location trail"));
-                mStopLocationTrailTimer.stop(); // stop location timer.
-                setState(CxeGeoTaggingTrail::TrailStarted);
-            }
-        }
-
-        if (err) {
-            CX_DEBUG(("CxeGeoTaggingTrailPrivate::start <> FAILED: error = %d ", err));
-            mLocationTrail.Close();
-        }        
     } else {
         // geotagging setting off, do nothing.
         CX_DEBUG(("CxeGeoTaggingTrail <> start -- Geotagging setting OFF, do nothing.."));