locationmanager/geotagger/src/cinternalgeotagger.cpp
changeset 45 a93990e5815e
parent 36 aa5a574040a4
child 52 40db28bb26b8
--- a/locationmanager/geotagger/src/cinternalgeotagger.cpp	Tue Jul 06 14:44:37 2010 +0300
+++ b/locationmanager/geotagger/src/cinternalgeotagger.cpp	Wed Aug 18 10:12:07 2010 +0300
@@ -24,12 +24,16 @@
 #include "mdeconstants.h"
 #include "mdesession.h"
 #include "cinternalgeotagger.h"
+#ifdef LOC_REVERSEGEOCODE
 #include "reversegeocoderplugin.h"
+const TUid KReverseGeoCodeUid = {0x2002DD12};
+#endif
 
 using namespace MdeConstants;
 
 _LIT ( KCountry, "country:");   // country:india 
-const TUid KReverseGeoCodeUid = {0x2002DD12};
+
+const TReal64 KZeroLatLon (0.000000 );
 
 // --------------------------------------------------------------------------
 // CInternalGeoTagger::NewL
@@ -59,13 +63,15 @@
                         iIndex(0),
                         iSessionReady( EFalse ),
                         iObserver( aObserver ),
-                        iTagCreator(NULL),
                         iASW(NULL),
-                        iTagPendingHandlerFlag(EFalse),
-                        iRevGeocoderPlugin(NULL)
-#ifdef LOC_GEOTAGGING_CELLID	
+                        iTagPendingHandlerFlag(EFalse)
+#ifdef LOC_GEOTAGGING_CELLID
 						,iGeoConverter(NULL)
 #endif						
+#ifdef LOC_REVERSEGEOCODE
+                        ,iTagCreator(NULL)
+                        ,iRevGeocoderPlugin(NULL)
+#endif						
     {
     iMdeSessionOwnFlag = (iMdeSession == NULL);
     }
@@ -82,10 +88,12 @@
 		LOG("Not owning mds session");
         iMdeSessionOwnFlag = EFalse;
         //object is not owning iMdeSession
+        iSessionReady = ETrue;
+#ifdef LOC_REVERSEGEOCODE
         iTagCreator = CTagCreator::NewL();
-        iSessionReady = ETrue;
         
         iTagCreator->SetSession( iMdeSession );
+#endif //LOC_REVERSEGEOCODE
         }
     else
         {
@@ -93,7 +101,9 @@
         iASW = new (ELeave) CActiveSchedulerWait();
         iMdeSession = CMdESession::NewL( *this );
         //for creating tags
+#ifdef LOC_REVERSEGEOCODE
         iTagCreator = CTagCreator::NewL();
+#endif
         
         iASW->Start();
         delete iASW;
@@ -102,20 +112,16 @@
     
     //for reverse geocoding (geo-tagging)
     
-    if (!iRevGeocoderPlugin)
-            {
-           
-		   TRAP_IGNORE(
-            iRevGeocoderPlugin = reinterpret_cast<CReverseGeoCoderPlugin*>(
-               REComSession::CreateImplementationL(KReverseGeoCodeUid, iDtorKey));)
- 
-            if(iRevGeocoderPlugin)
-            	{
-               	iRevGeocoderPlugin->AddObserverL(*this); 
- 
-              }
- 
-            }
+#ifdef LOC_REVERSEGEOCODE
+      
+	   TRAP_IGNORE(
+        iRevGeocoderPlugin = reinterpret_cast<CReverseGeoCoderPlugin*>(
+           REComSession::CreateImplementationL(KReverseGeoCodeUid, iDtorKey));)
+
+        iRevGeocoderPlugin->AddObserverL(*this); 
+
+
+#endif //LOC_REVERSEGEOCODE
 
     LOG("CInternalGeoTagger::ConstructL ,end");
     }
@@ -152,9 +158,13 @@
 		iTagQuery->Cancel();
 		delete iTagQuery;
 		}	
+#ifdef LOC_REVERSEGEOCODE
+    delete iTagCreator;
+    iTagCreator = NULL;
     delete iRevGeocoderPlugin;
     iRevGeocoderPlugin = NULL;
     REComSession::DestroyedImplementation(iDtorKey);	
+#endif //LOC_REVERSEGEOCODE
     if(iMdeSessionOwnFlag)
         {
     	delete iMdeSession;
@@ -189,7 +199,7 @@
 void CInternalGeoTagger::HandleSessionOpened(CMdESession& /*aSession*/, TInt aError)
     {
     LOG("CInternalGeoTagger::HandleSessionOpened ,begin");
-    if ( iMdeSessionOwnFlag && iASW && iASW->IsStarted() )
+    if ( iASW && iASW->IsStarted() )
         {
         iASW->AsyncStop();
         }
@@ -198,9 +208,11 @@
         {
         iSessionReady = ETrue;
         
+#ifdef LOC_REVERSEGEOCODE
         iTagCreator->SetSession( iMdeSession );
+#endif
         }
-    else if(iMdeSessionOwnFlag)
+    else 
         {
         delete iMdeSession;
         iMdeSession = NULL;
@@ -215,16 +227,15 @@
 void CInternalGeoTagger::HandleSessionError(CMdESession& /*aSession*/, TInt /*aError*/)
     {
     LOG("CInternalGeoTagger::HandleSessionError ,begin");
-    if ( iMdeSessionOwnFlag && iASW && iASW->IsStarted() )
+    if (iASW && iASW->IsStarted() )
         {
         iASW->AsyncStop();
         }
     iSessionReady = EFalse;
-    if(iMdeSessionOwnFlag)
-    	{
-	    delete iMdeSession;
-	    iMdeSession = NULL;
-    	}
+
+	delete iMdeSession;
+	iMdeSession = NULL;
+
     LOG("CInternalGeoTagger::HandleSessionError ,end");
     }
 
@@ -355,6 +366,7 @@
             if(GPSInfoExists())
                 {
                 // GPS info exist go for reverse geo coding.
+#ifdef LOC_REVERSEGEOCODE
                 if(iRevGeocoderPlugin)
     			    {
                     TRAP_IGNORE( 
@@ -362,6 +374,7 @@
     				   ( iLocationData.iPosition, iConnectionOption ) );
     				}
     			else
+#endif //LOC_REVERSEGEOCODE
     			    {
                     IterateNextLocation();  //Go through next location
     			    }
@@ -369,7 +382,6 @@
     		else
     		    {
         		if ( iLocationData.iNetworkInfo.iCellId > 0 && 
-        				iLocationData.iNetworkInfo.iLocationAreaCode > 0 &&
         				iLocationData.iNetworkInfo.iCountryCode.Length() > 0 &&
         				iLocationData.iNetworkInfo.iNetworkId.Length() > 0 )
         			{
@@ -383,8 +395,21 @@
                    
                     if(err == KErrNone && iGeoConverter != NULL)
                        {
+                       // there is no field to store type of network. 
+                       // but it's safe to take decission based on area code.
+                       if(iLocationData.iNetworkInfo.iLocationAreaCode > 0)
+                           {
+                           LOG("Valid areacode. Treat as GSM n/w");
+                           iLocationData.iNetworkInfo.iAccess = CTelephony::ENetworkAccessGsm;
+                           }
+                       else
+                           {
+                           LOG("Areacode is 0. Treat as 3G n/w");
+                           iLocationData.iNetworkInfo.iAccess = CTelephony::ENetworkAccessUtran;
+                           }
                        TRAP(err, iGeoConverter->ConvertL(iLocationData.iNetworkInfo);)
                        }
+                    LOG1("Error - %d", err);
                    if(err != KErrNone)
                        {
                        HandleConversionError(err);	
@@ -415,7 +440,9 @@
     LOG("CInternalGeoTagger::GPSInfoExists");
     TBool gpsInfoExists = EFalse;
     if ( !Math::IsNaN( iLocationData.iPosition.Latitude() ) && 
-                !Math::IsNaN( iLocationData.iPosition.Longitude() ))  //lat, long is there
+                !Math::IsNaN( iLocationData.iPosition.Longitude() ) &&
+                KZeroLatLon != iLocationData.iPosition.Latitude() && 
+                KZeroLatLon != iLocationData.iPosition.Longitude() )  //lat, long is there
         {
         
 		LOG("Valid lat/lon\n");
@@ -424,6 +451,7 @@
     return gpsInfoExists;
     }
 
+
 // --------------------------------------------------------------------------
 // CInternalGeoTagger::StartGeoTagging()
 // --------------------------------------------------------------------------
@@ -481,20 +509,43 @@
         iLocationData.iPosition.SetCoordinate( latProp->Real64ValueL(), 
                                                lonProp->Real64ValueL() );
         }
+    else
+        {
+        iLocationData.iPosition.SetCoordinate( KZeroLatLon, 
+                                               KZeroLatLon );
+        }
     
     locationObject->Property( cellIdDef, cellProp, 0 );
     locationObject->Property( lacCodeDef, lacProp, 0 );
     locationObject->Property( countryCodeDef, countryProp, 0 );
     locationObject->Property( networkCodeDef, networkProp, 0 );
-    if ( cellProp && lacProp && countryProp && networkProp)
+    if ( cellProp && countryProp && networkProp)
         {
         iLocationData.iNetworkInfo.iCellId = cellProp->Uint32ValueL();
-        iLocationData.iNetworkInfo.iLocationAreaCode = lacProp->Uint32ValueL();
         iLocationData.iNetworkInfo.iCountryCode = countryProp->TextValueL();
         iLocationData.iNetworkInfo.iNetworkId = networkProp->TextValueL();
-        
+        }
+    else
+        {
+        // set to invalid values.
+        iLocationData.iNetworkInfo.iCellId = 0;
+        iLocationData.iNetworkInfo.iAccess = CTelephony::ENetworkAccessUnknown;
+        iLocationData.iNetworkInfo.iLocationAreaCode = 0;
+        iLocationData.iNetworkInfo.iAreaKnown = EFalse;
+        iLocationData.iNetworkInfo.iCountryCode.Zero();
+        iLocationData.iNetworkInfo.iNetworkId.Zero();
         }
 
+    iLocationData.iNetworkInfo.iAreaKnown = EFalse;
+    if(lacProp)
+        {
+        iLocationData.iNetworkInfo.iLocationAreaCode = lacProp->Uint32ValueL();
+        if(iLocationData.iNetworkInfo.iLocationAreaCode > 0)
+            {
+            iLocationData.iNetworkInfo.iAreaKnown = ETrue;
+            }
+        }
+    delete locationObject;
 	LOG("CInternalGeoTagger::GetLocationInfoL ,end");
     }
 
@@ -517,12 +568,16 @@
         TItemId tagId = relation.RightObjectId(); 
         CMdEObject* object = NULL;
         TRAP_IGNORE( object = iMdeSession->GetObjectL( tagId ) );
-        
-        error = object->Uri().Find( KCountry );
-        if ( error == KErrNone )
+        if(object)
             {
-            i = count;
-            tagFound = ETrue;
+            error = object->Uri().Find( KCountry );
+            delete object;
+            if ( error == KErrNone )
+                {
+                i = count;
+                tagFound = ETrue;
+                break;
+                }
             }
         }
                 
@@ -532,36 +587,6 @@
 
     }
 
-// --------------------------------------------------------------------------
-// CInternalGeoTagger::AddressInfo()
-// --------------------------------------------------------------------------
-//
-void CInternalGeoTagger::AddressInfoL( const TItemId aCountryTagId, const TItemId aCityTagId )
-    {
-    LOG("CInternalGeoTagger::AddressInfoL ,begin");
-                               
-    const TInt count = iRelationQuery->Count();
-    
-    for ( TInt i = 0; i < count; i++ )
-        {
-        CMdERelation& relation = iRelationQuery->Result( i );
-        TItemId imageId = relation.LeftObjectId(); 
-        
-        if ( !GPSInfoExists() )   //to update EXIF
-            {
-            // update relation timestamp, composer will then update exif data   
-            TTime timestamp( 0 );
-            timestamp.UniversalTime();
-            relation.SetLastModifiedDate( timestamp );     
-            iMdeSession->UpdateRelationL( relation );
-            }
-        
-        iTagCreator->AttachTagsL( imageId, aCountryTagId, aCityTagId  );
-        }
-
-   LOG("CInternalGeoTagger::AddressInfoL ,end");
-    }
-
 
 // --------------------------------------------------------------------------
 // CInternalGeoTagger::IterateNextLocation()
@@ -626,42 +651,6 @@
   LOG("CInternalGeoTagger::GetAllLocationsL ,end");
     }
 
-// --------------------------------------------------------------------------
-// CInternalGeoTagger::ReverseGeocodeComplete()
-//  Get address details like street, city, state, etc.
-// --------------------------------------------------------------------------
-//
-void CInternalGeoTagger::ReverseGeocodeComplete( TInt& aErrorcode, MAddressInfo& aAddressInfo )
-    {
-    LOG("CInternalGeoTagger::ReverseGeocodeComplete ,begin");
-    TItemId countryTagId(0);
-    TItemId cityTagId(0);
-    
-    // create country and city tags
-    if( aErrorcode == KErrNone )
-        {
-        TPtrC countryPtr( aAddressInfo.GetCountryName() ); 
-        TPtrC cityPtr( aAddressInfo.GetCity() );
-        
-        TRAP_IGNORE( iTagCreator->CreateLocationTagsL( countryPtr, countryTagId, cityPtr, cityTagId ) );
-		
-        TRAP_IGNORE(AddressInfoL( countryTagId, cityTagId ));
-        
-        IterateNextLocation();
-        }
-    else
-        {
-        //handle error
-        if ( iObserver )
-            {
-            iIndex = 0;
-            iObserver->GeoTaggingCompleted( aErrorcode );
-            }
-        }
-   
-    
-    LOG("CInternalGeoTagger::ReverseGeocodeComplete ,end");
-    }
 
 // --------------------------------------------------------------------------
 // CInternalGeoTagger::GetTagsL()
@@ -702,6 +691,82 @@
     }
 
 #ifdef LOC_GEOTAGGING_CELLID	
+
+// --------------------------------------------------------------------------
+// CInternalGeoTagger::UpdateGPSInfoL()
+// --------------------------------------------------------------------------
+//
+void CInternalGeoTagger::UpdateGPSInfoL(const TLocality& aPosition)
+	{
+	
+    LOG("CInternalGeoTagger::UpdateGPSInfoL ,start");
+    if(Math::IsNaN( aPosition.Latitude()) ||
+        Math::IsNaN( aPosition.Longitude()) )
+        {
+        LOG("Not a valid location info.");
+        LOG("CInternalGeoTagger::UpdateGPSInfoL ,end");
+        return;
+        }
+    
+	CMdENamespaceDef& namespaceDef = iMdeSession->GetDefaultNamespaceDefL();
+	CMdEObjectDef& locObjDef = namespaceDef.GetObjectDefL( Location::KLocationObject );
+	CMdEObject* location = iMdeSession->OpenObjectL(iLocationId, locObjDef);
+	CleanupStack::PushL( location );
+	
+	CMdEPropertyDef& propLatDef = locObjDef.GetPropertyDefL( Location::KLatitudeProperty );
+	CMdEPropertyDef& propLongDef = locObjDef.GetPropertyDefL( Location::KLongitudeProperty );
+	CMdEPropertyDef& propAltDef = locObjDef.GetPropertyDefL( Location::KAltitudeProperty );
+	CMdEPropertyDef& qualityDef = locObjDef.GetPropertyDefL( Location::KQualityProperty );
+
+	if (location->PropertyCount(propLatDef) == 0)
+		{
+		location->AddReal64PropertyL(propLatDef, aPosition.Latitude() ); //iLatitude
+		}
+	if (location->PropertyCount(propLongDef) == 0)
+		{
+		location->AddReal64PropertyL(propLongDef, aPosition.Longitude() ); //iLongitude
+		}
+	if (location->PropertyCount(propAltDef) == 0 &&
+        !Math::IsNaN( aPosition.Altitude()) )
+		{
+		location->AddReal64PropertyL(propAltDef, aPosition.Altitude());
+		}
+    LOG1( "Updating quality - %d", aPosition.HorizontalAccuracy());
+	if (location->PropertyCount(qualityDef) == 0 )
+		{
+		location->AddReal32PropertyL(qualityDef, aPosition.HorizontalAccuracy());
+		}
+	
+	CMdEProperty* modProp = NULL;
+	CMdEObjectDef& objImageDef = namespaceDef.GetObjectDefL( Image::KImageObject );
+	CMdEPropertyDef& propModifiedDef = objImageDef.GetPropertyDefL( Object::KLastModifiedDateProperty );
+	location->Property( propModifiedDef, modProp, 0 );
+	if ( modProp )
+		{
+		TTime timestamp( 0 );
+		timestamp.UniversalTime();
+		modProp->SetTimeValueL( timestamp );
+		}
+	// commit to DB
+	iMdeSession->CommitObjectL(*location);
+	CleanupStack::PopAndDestroy( location );
+
+    // update the relation
+    const TInt count = iRelationQuery->Count();
+    LOG1("Relation count - %d", count);
+    for ( TInt i = 0; i < count; i++ )
+        {
+        CMdERelation& relation = iRelationQuery->Result( i );
+        // update relation timestamp, composer will then update exif data   
+        
+        TTime timestamp( 0 );
+        timestamp.UniversalTime();
+        relation.SetLastModifiedDate( timestamp );     
+        iMdeSession->UpdateRelationL( relation );
+        }
+    LOG("CInternalGeoTagger::UpdateGPSInfoL ,end");
+	}
+
 // --------------------------------------------------------------------------
 // CInternalGeoTagger::ConversionCompletedL()
 // --------------------------------------------------------------------------
@@ -714,13 +779,17 @@
     if(aError == KErrNone)
         {
         iLocationData.iPosition.SetCoordinate
-                ( aPosition.Latitude(), aPosition.Longitude());
+                ( aPosition.Latitude(), aPosition.Longitude(), aPosition.Altitude());
+        iLocationData.iQuality = aPosition.HorizontalAccuracy();
+        UpdateGPSInfoL(aPosition);
+#ifdef LOC_REVERSEGEOCODE
         if(iRevGeocoderPlugin)
 		    {
            	iRevGeocoderPlugin->GetAddressByCoordinateL
 			   ( iLocationData.iPosition, iConnectionOption ) ;
 			}
 		else
+#endif //LOC_REVERSEGEOCODE
 		    {
             IterateNextLocation();  //Go through next location
 		    }
@@ -745,7 +814,7 @@
     LOG("CInternalGeoTagger::HandleConversionError, end");
 	}
 
-#endif
+#endif //LOC_GEOTAGGING_CELLID
 
 // --------------------------------------------------------------------------
 // CInternalGeoTagger::PendingGeoTagsL()
@@ -764,7 +833,7 @@
         }
     else
         {
-        if(!iTagPendingHandlerFlag)
+        if(!iTagPendingHandlerFlag && iIndex <= 0)
             {
             LOG("Processing the request.\n");
             // tag pending request is not going on
@@ -781,6 +850,73 @@
     LOG("CInternalGeoTagger::PendingGeoTagsL ,end");
     }
 
+
+#ifdef LOC_REVERSEGEOCODE
+// --------------------------------------------------------------------------
+// CInternalGeoTagger::AddressInfo()
+// --------------------------------------------------------------------------
+//
+void CInternalGeoTagger::AddressInfoL( const TItemId aCountryTagId, const TItemId aCityTagId )
+    {
+    LOG("CInternalGeoTagger::AddressInfoL ,begin");
+                               
+    const TInt count = iRelationQuery->Count();
+    
+    for ( TInt i = 0; i < count; i++ )
+        {
+        CMdERelation& relation = iRelationQuery->Result( i );
+        TItemId imageId = relation.LeftObjectId(); 
+        
+        if ( !GPSInfoExists() )   //to update EXIF
+            {
+            // update relation timestamp, composer will then update exif data   
+            TTime timestamp( 0 );
+            timestamp.UniversalTime();
+            relation.SetLastModifiedDate( timestamp );     
+            iMdeSession->UpdateRelationL( relation );
+            }
+        
+        iTagCreator->AttachTagsL( imageId, aCountryTagId, aCityTagId  );
+        }
+
+   LOG("CInternalGeoTagger::AddressInfoL ,end");
+    }
+
+
+// --------------------------------------------------------------------------
+// CInternalGeoTagger::ReverseGeocodeComplete()
+//  Get address details like street, city, state, etc.
+// --------------------------------------------------------------------------
+//
+void CInternalGeoTagger::ReverseGeocodeComplete( TInt& aErrorcode, MAddressInfo& aAddressInfo )
+    {
+    LOG("CInternalGeoTagger::ReverseGeocodeComplete ,begin");
+    TItemId countryTagId(0);
+    TItemId cityTagId(0);
+    
+    // create country and city tags
+    if( aErrorcode == KErrNone )
+        {
+        TPtrC countryPtr( aAddressInfo.GetCountryName() ); 
+        TPtrC cityPtr( aAddressInfo.GetCity() );
+        
+        TRAP_IGNORE( iTagCreator->CreateLocationTagsL( countryPtr, countryTagId, cityPtr, cityTagId ) );
+		
+        TRAP_IGNORE(AddressInfoL( countryTagId, cityTagId ));
+        
+        IterateNextLocation();
+        }
+    else
+        {
+        LOG1("Reverse geocode err - %d", aErrorcode);
+
+        IterateNextLocation();
+        }
+   
+    
+    LOG("CInternalGeoTagger::ReverseGeocodeComplete ,end");
+    }
+
 // ----------------------------------------------------------------------------
 // CInternalGeoTagger::GetCurrentRegisterNw()
 // ---------------------------------------------------------------------------- 
@@ -809,5 +945,7 @@
     return iObserver->GetHomeNetworkInfo(aHomeNwInfoAvailableFlag);
     }
 
+#endif //LOC_REVERSEGEOCODE
+
 // End of file