/*
* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:  UpdateManager it controls the auto updation of feed.
*
*/


#ifndef _UPDATEMANAGER_H_
#define _UPDATEMANAGER_H_

//  INCLUDES
#include <e32property.h>  
#include <e32base.h>
#include "UpdateAllFeedsTask.h"
#include "etel3rdparty.h"
// CONSTANTS

// MACROS

// DATA TYPES

// FUNCTION PROTOTYPES

// FORWARD DECLARATIONS
class CFeedsServer;
class CUpdateQueue;
class CUpdateAllFeedsTask;
class CFeedsDatabase;
class CServerHttpConnection;
class CUpdateTimer;
class CRoamingInfo;
// CLASS DECLARATION

/**
*  The feed UpdateManager.
*
*  \b Library: FeedsEngine.lib
*
*  @since 7.1
*/
class CUpdateManager: public CTimer, public MUpdateAllFeedsTaskObserver
    {

public:  // From CActive
    /**
      * Handles an active object's request completion event.
      *
      * @since 7.1
      * @return void.
      */
    void RunL();

public:  // From MUpdateAllFeedsTaskObserver
    /**
     * Called to notify the obsever how many feeds remain to be updated.
     *
     * @since 7.1
     * @param aStatusCode The completion status of the request.
     * @return Void
     */
    virtual void UpdateAllFeedsProgress(TInt aMaxCount, TInt aRemaining);

    /**
     * Called upon completion of the task.
     *
     * @since 7.1
     * @param aStatusCode The completion status of the request.
     * @return Void
     */
    virtual void UpdateAllFeedsCompleted(TInt aStatusCode);

    /**
     * Returns the http-connection instance;
     *
     * @since 7.1
     * @return The http-connection instance.
     */
    virtual CHttpConnection& HttpConnection();

public:

    /**
     * Two-phased constructor.
     * @since 7.1
     * @param aFolderListId The folder list associate with this background update.
     * @param aAutoUpdateFreq The frequency of this background update.
     * @param aAutoUpdateAP The access point to use for this background update.
     * @param aAutoUpdateWhileRoaming The flag.
     */
     static CUpdateManager* NewL( TInt aFolderListId, TUint32 aAutoUpdateAP, TInt aAutoUpdateFreq, 
             TBool aAutoUpdateWhileRoaming, CFeedsServer& aFeedsServer);

    /**
     *
     * @since 7.1
     * Destructor
     */
    ~CUpdateManager();

    /**
     * This Method calls update Feed
     *
     * @since 7.1
     * @ return Integer
     */
    TInt UpdateL();
   
    /**
     * This method handles the updation of feeds 
     *     
     * @since 7.1
     * @return Integer.
     */
    TInt StartL(); 

    /**
     * This method Stop the updation;
     *
     * @since 7.1
     * Stop the Update timer
     */
    void Stop();

    /**
     * This method Returns the FolderListId;
     *
     * @since 7.1
     * @return The folder list ID.
     */
    TInt FolderListId();

    /**
     * This method Updates the update queue;
     *
     * @since 7.1
     * @return The folder list ID.
     */
    void UpdateFeedL(TInt aFeedId, TBool aDeleteFeed);

    /**
     * This method is a call back;
     *
     * @since 7.1
     * @return The folder list ID.
     */
    static TBool LazyCallBack(TAny* aPtr);

    /**
     * This method Sets the next timer event;
     *
     * @since 7.1
     * @return The folder list ID.
     */
    void StartTimer();

    /**
     * This method Adds feeds in queue;
     *
     * @since 7.1
     * @return The folder list ID.
     */
    void AddFeedL(TInt aFeedId);

private:        
    /**
     *
     * @since 7.1
     * By default Symbian 2nd phase constructor is private.
     */ 
    void ConstructL( TUint32 aAutoUpdateAP);

    /**
     *
     * @since 7.1
     * C++ default constructor.
     */
    CUpdateManager( TInt aFolderListId, TInt aAutoUpdateFreq, TBool aAutoUpdateWhileRoaming, CFeedsServer& aFeedsServer);

private:
    TInt                        iAutoUpdateFreq;
    TBool                       iAutoUpdateWhileRoaming;
    TInt                        iFolderListId;
    TUint32                     iAutoUpdateAp;
    RPointerArray<CUpdateQueue> iQueueArray;
    CFeedsServer&               iFeedsServer;
    CUpdateAllFeedsTask*        iUpdateAllFeedTask;
    CServerHttpConnection*      iHttpConnection;

    CIdle*                      iLazyCaller;
    TInt                        iCurrentFeedCount;
    RArray<TInt>                iFeedIds;
    TInt                        iMins;

    CRoamingInfo*               iRoamingInfo;
    TTime                       iLastAutoUpdate;

    //friend class
    friend class CRoamingInfo;
    friend class CFeedsServer;
    };

/**
*  The feed RoamingInfo.
*
*  \b Library: FeedsEngine.lib
*
*  @since 7.1
*/
class CRoamingInfo: public CActive
    {
public:  // Constructors and destructor
   /**
    * Two-phased constructor.
    *
    * @since 7.1
    * @param aFolderListId The folder list associate with this background update.
    * @param aAutoUpdateFreq The frequency of this background update.
    * @param aAutoUpdateAP The access point to use for this background update.
    * @param aAutoUpdateWhileRoaming The flag.
    */
	static CRoamingInfo* NewL(CUpdateManager *aUpdateManager);

   /**
    * @since 7.1
    * Destructor.
    */
    virtual ~CRoamingInfo();

public:  // From CActive
   /**
    * Handles an active object's request completion event.
    *
    * @since 7.1
    * @return void.
    */
    void RunL();
    void DoCancel();

public:

   /**
    * Issue request for notification.    *
    * @since 7.2
    * @return void.
    */
    void IssueRequestL();
    /**
    * Check if currently in roaming
    *
    * @since 7.2
    * @return boolean.
    */
    TBool Roaming();


private:
   /**
    * @since 7.1
    * C++ default constructor.
    *
    */
    CRoamingInfo(CUpdateManager *aUpdateManager);

   /**
    * @since 7.1
    * By default Symbian 2nd phase constructor is private.
    *
    */
    void ConstructL();

private:

    CTelephony  *iTelephony;
    CTelephony::TNetworkRegistrationV1 iNetworkRegistrationV1;	
    CTelephony::TNetworkRegistrationV1Pckg iNetworkRegistrationV1Pckg;
    CUpdateManager  *iUpdateManager;
    
    };


#endif //_UPDATEMANAGER_H_
