locationmanager/geoconverter/src/cgeoconverter.cpp
branchRCL_3
changeset 19 b73252188534
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationmanager/geoconverter/src/cgeoconverter.cpp	Thu Aug 19 10:20:41 2010 +0300
@@ -0,0 +1,213 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  A class for creating country and city tags for media files
+*
+*/
+
+//#include "locationmanagerdebug.h"
+#include "cgeoconverter.h"
+#include "locationmanagerdebug.h"
+
+
+
+// --------------------------------------------------------------------------
+// CGeoConverter::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CGeoConverter* CGeoConverter::NewL( MGeoConverterObserver& aObserver )
+    {
+    LOG("CGeoConverter::NewL");
+    CGeoConverter* self = new( ELeave ) CGeoConverter( aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CGeoConverter::CGeoConverter()
+// --------------------------------------------------------------------------
+//    
+CGeoConverter::CGeoConverter( MGeoConverterObserver& aObserver )
+    :iObserver( aObserver ) 
+#ifdef LOC_GEOTAGGING_CELLID    
+    ,iLocConverter(NULL),
+    iLocInfo(NULL),
+    iGsmCellInfo(NULL),
+    iWcdmaCellInfo(NULL)
+#endif
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CGeoConverter::~CGeoConverter
+// --------------------------------------------------------------------------
+//  
+EXPORT_C CGeoConverter::~CGeoConverter()
+    {
+    LOG("CGeoConverter::~CGeoConverter, begin");
+#ifdef LOC_GEOTAGGING_CELLID    
+    delete iGsmCellInfo;
+    iGsmCellInfo = NULL;    
+    delete iWcdmaCellInfo;
+    iWcdmaCellInfo = NULL;
+    delete iLocInfo;
+    iLocInfo = NULL;
+    delete iLocConverter;
+    iLocConverter = NULL;
+#endif    
+    LOG("CGeoConverter::~CGeoConverter, end");
+    }
+
+// --------------------------------------------------------------------------
+// CGeoConverter::OnConversionComplete()
+// --------------------------------------------------------------------------
+//  
+void CGeoConverter::OnConversionComplete( TInt aStatusCode )
+    {
+    LOG("CGeoConverter::OnConversionComplete, begin");
+#ifdef LOC_GEOTAGGING_CELLID    
+    //16. Retrieve position estimate that is updated by Location Monitor server
+    //after a conversion operation is completed successfully.
+    RLbsAreaInfoBaseArray posInfoList;
+    TLocality position;
+    
+    
+    LOG1("Status Code - %d",aStatusCode);
+    
+    if( KErrNone == aStatusCode )
+        {
+        TRAP_IGNORE(iLocInfo->GetAreaInfoL( posInfoList, CLbsLocationInfo::ELbsPosInfo );)
+        
+        //Get geo-coordinates. 
+        
+        LOG1("PposInfoList Count - %d",posInfoList.Count());
+        if ( posInfoList.Count() )
+            {
+            static_cast<CLbsPositionInfo*>(posInfoList[0])->GetLocality(position);
+            }
+        else
+            {
+            aStatusCode = KErrNotFound;
+            }     
+        }
+    TRAPD(err,iObserver.ConversionCompletedL( aStatusCode, position);)
+    if(err != KErrNone)
+    	{
+		iObserver.HandleConversionError(err);
+    	}
+    posInfoList.Close();
+#endif    
+    LOG("CGeoConverter::OnConversionComplete, end");
+    }
+
+// --------------------------------------------------------------------------
+// CGeoConverter::ConstructL()
+// --------------------------------------------------------------------------
+//  
+void CGeoConverter::ConstructL()
+    {
+    LOG("CGeoConverter::ConstructL, begin");
+#ifdef LOC_GEOTAGGING_CELLID    
+    iLocInfo = CLbsLocationInfo::NewL();
+    TUid pluginUid = TUid::Uid( 0x20027011 );   
+    LOG("CGeoConverter::ConstructL");
+    iLocConverter = CLbsLocationInfoConverter::NewL( *this, pluginUid );
+#endif    
+    LOG("CGeoConverter::ConstructL, end");
+    }
+
+// --------------------------------------------------------------------------
+// CGeoConverter::ConvertL()
+// --------------------------------------------------------------------------
+//  
+EXPORT_C void CGeoConverter::ConvertL( const CTelephony::TNetworkInfoV1& aNetworkInfo )
+    {
+    LOG("CGeoConverter::ConvertL, begin");
+#ifdef LOC_GEOTAGGING_CELLID    
+    
+    //Set mobile country code
+    TLex lexer( aNetworkInfo.iCountryCode );
+    TUint countryCode = 0;
+    
+    User::LeaveIfError( lexer.Val( countryCode, EDecimal) );
+    //Set mobile network code
+    lexer = aNetworkInfo.iNetworkId;
+    TUint networkCode = 0;
+    User::LeaveIfError( lexer.Val( networkCode, EDecimal) );
+    LOG1("Network mode - %d", aNetworkInfo.iMode);
+    CLbsAreaInfoBase* areaInfoBase = NULL;
+    switch(aNetworkInfo.iAccess)
+        {
+        case CTelephony::ENetworkAccessGsm:
+        case CTelephony::ENetworkAccessGsmCompact:
+            {
+            LOG("2G network.");
+            if(iGsmCellInfo == NULL)
+                {
+                iGsmCellInfo = CLbsGsmCellInfo::NewL();
+                }
+            iGsmCellInfo->SetMobileCountryCode( countryCode );
+            
+            iGsmCellInfo->SetMobileNetworkCode( networkCode );
+            //Set cell id 
+            iGsmCellInfo->SetCellId( aNetworkInfo.iCellId ); 
+
+            if(aNetworkInfo.iAreaKnown)
+                {
+                //Set location area code
+                iGsmCellInfo->SetLocationAreaCode( aNetworkInfo.iLocationAreaCode );
+                }            
+        
+            areaInfoBase = iGsmCellInfo;
+            }        
+            break;
+        case CTelephony::ENetworkAccessUtran:
+            {
+            LOG("3G network.");
+            if(iWcdmaCellInfo == NULL)
+                {
+                iWcdmaCellInfo = CLbsWcdmaCellInfo::NewL();
+                }
+            iWcdmaCellInfo->SetMobileCountryCode(countryCode);
+            iWcdmaCellInfo->SetMobileNetworkCode(networkCode);
+            iWcdmaCellInfo->SetUniqueCellId(aNetworkInfo.iCellId);
+            areaInfoBase = iWcdmaCellInfo;
+            }
+            break;
+        default:
+            LOG("Unknown network mode");
+            User::Leave(KErrNotSupported);
+        }
+    //Add the cell information to the location info class. This class
+    //would be sent to the Location Monitor server that would perform the
+    //requested conversion and update the position estimate
+    if(areaInfoBase != NULL) // self check
+        {
+        // reset previous one.. to clear the local info.
+        iLocInfo->ResetAreaInfo(CLbsLocationInfo::ELbsAreaInfoAll);
+        iLocInfo->AddAreaInfoL( areaInfoBase ); 
+        //ownership is transferred.
+        iWcdmaCellInfo = NULL;
+        iGsmCellInfo = NULL;
+        //Request conversion of GSM cell information to corresponding coordinate information
+        iLocConverter->ConvertLocationInfoL( *iLocInfo, ELbsConversionSilent, 
+                                                ELbsConversionOutputPosition  );
+        }
+#endif    
+    LOG("CGeoConverter::ConvertL, end");
+    }
+
+// End of file
+