datasourcemodules/defaultpositioningmodule/inc/epos_cpospsyfixstatemanager.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:50:39 +0200
changeset 0 9cfd9a3ee49c
permissions -rw-r--r--
Revision: 201002 Kit: 201005

/*
* Copyright (c) 2007-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:
*
*/



#ifndef CPOSPSYFIXSTATEMANAGER_H
#define CPOSPSYFIXSTATEMANAGER_H

#include <e32base.h>
#include <lbs.h>

#include "epos_mposfixstatetimerlistener.h"

class MPosPsyFixStateListener;
class CPosFixStateTimer;
class CPosConstManager;
class CPosPsyListHandler;


/**
* The CPosPsyFixStateManager manages fix state of loaded PSYs.
*/
class CPosPsyFixStateManager : public CBase, public MPosFixStateTimerListener
    {
    public: //Definitions
        /*
        * The enumeration defines PSY fix state
        */
        enum TPsyFixState
            {
            EPsyFixStateUnknown = 0,    ///PSY fix state unkown
            EPsyFixStateYes,            ///PSY is able to give a fix
            EPsyFixStateNo              ///PSY is not able to give a fix
            };

    public: // Constructors and destructor
              
        /**
        * Get an instance of CPosPsyFixStateManager. 
        *
        * This function must be called in pair with
        * ReleaseInstance() .
        *
        * @return The new instance of this class.
        */
        static CPosPsyFixStateManager* GetInstanceL();

        /**
        * Release the instance of CPosPsyFixStateManager.
        *
        * This function must be called in pair with
        * GetInstanceL()
        */
        void ReleaseInstance();

        /**
        * Add a listener.
        *
        * @param aListener Pointer to a new listener
        */
        void AddListenerL( MPosPsyFixStateListener* aListener );
        
        /**
        * Remove a listner.
        * 
        * @param aListener Pointer to the listener.
        */
        void RemoveListener( MPosPsyFixStateListener* aListener );
        
        /**
        * Inform PSY fix state manager that a PSY is loaded.
        * The PSY will be added to PSY list and the fix state
        * of the PSY is maintained by the PSY fix state
        * manager.
        *
        * Client does not need to inform the PSY fix state 
        * manager if a PSY is unloaded. 
        *
        * @param aPsyId Id of the loaded PSY.
        */
        void PsyLoadedL(
            TPositionModuleId aPsyId );
        
        /**
        * Get fix state of a specific PSY.
        *
        * If the PSY has not been laoded, then 
        * EPsyFixStateUnknow will be returned.
        *
        * @param aPsyId Id of the PSY
        * @return Fix state of the PSY
        */
        TPsyFixState GetPsyFixState(
            TPositionModuleId aPsyId );
        
        /**
        * Notify PSY fix state manager that a PSY is used. 
        * 
        * When function SetPsyFixState is called, the location 
        * request has been completed. And PSY is not used any more.
        * 
        * @param aPsyId The ID of the PSY
        * @param aPreviousDeviceStatus The device status before the PSY
        * is used.
        */
        void PsyUsed( 
            TPositionModuleId aPsyId,
            TPositionModuleStatus::TDeviceStatus aPreviousDeviceStatus );
        
        /**
        * Set fix state to a specific PSY. 
        *
        * If the PSY has not been loaded before, this 
        * function does nothing.
        *
        * @param aPsyId The Id of the PSY.
        * @param aLRErr Location request complete error code
        */
        void SetPsyFixState( 
            TPositionModuleId aPsyId, 
            TInt aLRErr );
            
        /**
        * Set fix state of external GPS PSY. This function is used by
        * CPosExternalGpsMonitor
        *
        * @param aPsyId The Id of the PSY.
        * @param aLRErr Location request complete error code
        */
        void SetExtGpsPsyFixState(
            TPositionModuleId aPsyId, 
            TInt aLRErr );
            
    public: //From base class
        /**
        * From MPosFixStateTimerListener
        */
        virtual void TimeshiftTimerTimeout( 
            TPositionModuleId aPsyId );
            
        /**
        * From MPosFixStateTimerListener
        */
        virtual void UnknownTimerTimeout(
            TPositionModuleId aPsyId );

    private:
        /**
        * PSY and fix state structure
        */
        struct TPsyAndFixState
            {
            TPositionModuleId iPsyId; //The Id of the PSY
            TPsyFixState iPsyState; //The state of the PSY
            TInt iLocationRequestCount; //The location request count
            CPosFixStateTimer* iTimer;//Fix state timer
            };

    private:

        /**
        * C++ default constructor.
        */
        CPosPsyFixStateManager();

        /**
        * EPOC constructor.
        */
        void ConstructL();
        
        /**
        * Destructor.
        */
        ~CPosPsyFixStateManager();
        
        /**
        * Find index of the PSY in PSY state array. This function
        * returns KErrNotFound if the PSY is not found in the 
        * PSY state array. Otherwise the index is returned.
        */
        TInt PsyIndex(
            TPositionModuleId aPsyId );
            
        /**
        * Start timeshift timer
        */
        void StartTimeshiftTimer(
            TPsyAndFixState& aFixState,
            TPositionModuleStatus::TDeviceStatus aPreviousDeviceStatus );
            
        /**
        * Notify listener that PSY fix state is changed
        *
        * @param aPsyID The ID of the PSY
        * @param aPreviousFixState Previous fix state
        */
        void NotifyListener(
            TPositionModuleId aPsyId,
            TPsyFixState aPreviousFixState );
            
        // By default, prohibit copy constructor
        CPosPsyFixStateManager(const CPosPsyFixStateManager&);
        // Prohibit assigment operator
        CPosPsyFixStateManager& operator= (const CPosPsyFixStateManager&);

    private: // Data
        //Reference count
        TInt iRefCount;
        
        //List handler to get TTFF and TTNF
        CPosPsyListHandler* iListHandler;
        
        //Const manager
        CPosConstManager* iConstManager;

        //Listner array
        RPointerArray< MPosPsyFixStateListener > iListenerArray;

        //Psy fix state array
        RArray< TPsyAndFixState > iPsyStateArray;
        
    };

#endif      // CPOSPSYFIXSTATEMANAGER_H  
            
// End of File