locationmanager/geotagger/inc/cinternalgeotagger.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:20:41 +0300
branchRCL_3
changeset 19 b73252188534
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
* 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 responsible for geotagging of media files in background.
*
*/

#ifndef C_CINTERNALGEOTAGGER_H
#define C_CINTERNALGEOTAGGER_H

#include <e32base.h>
#include <e32property.h>
#include <lbs.h>
#include <locationdatatype.h>
#include <geotagger.h>

#include "mdccommon.h"
#include "mdesession.h"
#include "mdenamespacedef.h"
#include "mdeobjectdef.h"
#include "mdepropertydef.h"
#include "mderelation.h"
#include "mdequery.h"

#ifdef LOC_GEOTAGGING_CELLID
#include "cgeoconverter.h"
#endif

#ifdef LOC_REVERSEGEOCODE
#include "ctagcreator.h"
#include "reversegeocode.h"
class CReverseGeoCoderPlugin;
#endif


/**
 *  GeoTagger converts a given cell ID(CGI Info) to geo-coordinates.
 *  Does reverse geocoding to get country and city name.
 *  Creates country and city tag for image/video files.  
 *  @since S60 9.2
 */
 
class CInternalGeoTagger : public CGeoTagger,
                   public MMdESessionObserver,
                   public MMdEQueryObserver
#ifdef LOC_GEOTAGGING_CELLID	
                   ,public MGeoConverterObserver
#endif				   
#ifdef LOC_REVERSEGEOCODE
                   ,public MReverseGeocodeObserver
#endif
    {
public:  
    
    /**
     * 2-phased constructor.
     * @param aMdeSession An instance of the CMdESession
     * @param aObserver   The observer that is to be notified when geotagging is over
     */
    IMPORT_C static CInternalGeoTagger* NewL( CMdESession* aMdeSession,
        MGeoTaggerObserver* aObserver );

    /**
      * C++ destructor.
      */    
    IMPORT_C virtual ~CInternalGeoTagger();

    
public:    //exported API
    // CGeoTagger
     /**
       * Harvests location tags.
       * @param aObserver, observer for geotagging.
       * @return None.
       */    
    virtual void CreateGeoTagsL( const TConnectionOption = EInteractive  );

     /**
       * Checks if there is any untagged photos with location info and tags them.
       * @param aTagInProgress, boolean value to indicate if geotagging is in progress.
       * @return None.
       */
    virtual void PendingGeoTagsL( TBool aTagInProgress );
    
public:   //observer methods

    // From MMdEQueryObserver

    /**
      * @param aQuery the query type
      * @param aFirstNewItemIndex The new item index
      * @param aNewItemCount   The new item count
      */
      void HandleQueryNewResults(CMdEQuery& aQuery, TInt aFirstNewItemIndex, 
              TInt aNewItemCount);

    /**
      * This method is called on completion of a query
      * @param aQuery the query type
      * @param aError  Error if any
      */    
      void HandleQueryCompleted(CMdEQuery& aQuery, TInt aError);
    

#ifdef LOC_REVERSEGEOCODE
    /**
       * Get location objects, where lat, long not populated.
      * @param  aCountryTagId The country tagId
      * @param aCityTagId  The city tagId
      */        
    void AddressInfoL( const TItemId aCountryTagId, const TItemId aCityTagId );

    
    //MReverseGeocodeObserver
    /**
      * This method is called when reverse geocoding is completed
      *@param  aErrorcode  Error if any
      *@param aAddressInfo   the reverse geocoded address     
      */
    void ReverseGeocodeComplete( TInt& aErrorcode, MAddressInfo& aAddressInfo );

    /*
    * Get registrer network country code
    *
    * @return current register n/w info
    */
    RMobilePhone::TMobilePhoneNetworkInfoV2& GetCurrentRegisterNw();
	
    /*
    * UE is registered to home network?
    *
    * @return ETrue if UE is registered at home network else EFalse
    */
    TBool IsRegisteredAtHomeNetwork();


    /*
    * Get home network country code
    * @param aHomeNwInfoAvailableFlag ETrue if home n/w info available else EFalse
    * @return user home n/w info
    */
    const RMobilePhone::TMobilePhoneNetworkInfoV1& 
        GetHomeNetworkInfo(TBool& aHomeNwInfoAvailableFlag);
    
#endif //LOC_REVERSEGEOCODE
    
    // From MMdESessionObserver

    /** 
      * Handles session opening
      *@param  aSession  A reference of the CMdESession
      *@param aError     error if any
      */    
    void HandleSessionOpened(CMdESession& aSession, TInt aError);

    /**
      * Handles any error in session opening
      *@param  aSession  A reference of the CMdESession
      *@param aError     error if any
      */    
    void HandleSessionError(CMdESession& aSession, TInt aError);

#ifdef LOC_GEOTAGGING_CELLID
public:     // MGeoConverterObserver
        /**
         * This method is used for notifying completion of geotagging
         * @param aError error code
         * @param aPosition position (lat/lon) for the correcponding n/w info
         */
     void ConversionCompletedL( const TInt aError, TLocality& aPosition );


		/**
		* This method is used to handle the conversion error
		* @param aError the error code
		*/
	 void HandleConversionError(TInt aError);
        
private:
       /**
       * Update media object with GPS info.
       */
    void UpdateGPSInfoL(const TLocality& aPosition);
    
#endif //LOC_GEOTAGGING_CELLID

private:    
    
    /**
     * C++ constructor.
     * @param aMdeSession An instance of the CMdESession
     * @param aObserver   The observer that is to be notified when geotagging is over     
     */  
    CInternalGeoTagger( CMdESession* aMdeSession, MGeoTaggerObserver* aObserver );
    
    /**
      * 2nd phase constructor.
     */
    void ConstructL();
 
    /**
      * Get all relation objects associated with this location
     * @param aLocID The locationId whose relation is to be fetched
     */
    void GetRelationObjectsL(TItemId aLocID);

    /**
      * get tags for this image
     * @param aImageID The imageIs whose tag is to be fetched
     */ 
    void GetTagsL( TItemId aImageID );

    /**
       * Get location objects, where lat, long not populated.
      */    
    void GetAllLocationsL( );

    /**
       * checks if the session is ready
      * @return ETrue If the session is ready
      */        
    TBool IsSessionReady();

    /**
       * Fetches the location information
      */        
    void GetLocationInfoL();

    /**
       * starts geotagging of objects
      */        
    void StartGeoTaggingL();

    /**
       * Checks if Location atg exists for an object
      * @return ETrue if location tag is found
      */        
    TBool LocationTagExists();

    /**
       * Moves to the next location for reverse geocoding
      */        
    void IterateNextLocation();
    
    /**
       * @return ETrue if item had valid lat/lon else EFalse
      */        
    TBool GPSInfoExists();
private:
    /**
     * A session to Metadata Engine for creating and manipulating location objects.
     */
    CMdESession* iMdeSession;

    /**
     * This query object is used to find existing locations
     */
    CMdEObjectQuery* iLocationQuery;
    /** @var iRelationQuery. */
    CMdERelationQuery* iRelationQuery;
    CMdERelationQuery* iTagQuery;
    
    TInt iIndex;
        
    TBool iSessionReady;  
    
    MGeoTaggerObserver* iObserver;
    
    TLocationData iLocationData;
    
    TItemId iLocationId;
    
    TConnectionOption iConnectionOption;
    
    
    /**
     * An active scheduler wait loop for waiting a session to MdE to open.
     */
    CActiveSchedulerWait* iASW;
    TBool iMdeSessionOwnFlag;
    TBool iTagPendingHandlerFlag;
#ifdef LOC_GEOTAGGING_CELLID	
    /*
       * Geo converter
       */
	CGeoConverter* iGeoConverter;
#endif
#ifdef LOC_REVERSEGEOCODE
        CTagCreator* iTagCreator;
        CReverseGeoCoderPlugin* iRevGeocoderPlugin;
        TUid iDtorKey;
#endif //LOC_REVERSEGEOCODE
    };

#endif // C_CGEOTAGGER_H 

// End of file.