upnp/upnpstack/upnputils/inc/upnptimeoutelement.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:12:20 +0200
changeset 0 f5a58ecadc66
permissions -rw-r--r--
Revision: 201003

/** @file
* Copyright (c) 2005-2006 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:  Declares virtual MUpnpTimeoutElementParent callback class
*                and the implemented active object class CUpnpTimeoutElement
*
*/


#ifndef C_CUPNPTIMEOUTELEMENT_H
#define C_CUPNPTIMEOUTELEMENT_H

// INCLUDES
#include <e32std.h>
#include <e32base.h>

// FORWARD DECLARATIONS
class CUpnpTimeoutElement;

// CLASS DECLARATION

/**
*  @brief A virtual parent class.
*
*  This interface class is used to receive the timeout callbacks from timeout
*  elements.
*
*  @since Series60 2.0
*/

class MUpnpTimeoutElementParent 
    {
    public:

    /**
    * A virtual function to be implemented in derived classes.
    * For example, the implementation might contain deletion of the timeout element.
    * @since Series60 2.0
    * @param anElement This pointer contains the element whose timeout has ran out. 
    * @return None
    */
	virtual void TimeoutExpiredL( CUpnpTimeoutElement* anElement ) = 0;
    };

/**
*  @brief An element with timeout
*
*  This is a virtual base class containing a timeout functionality. This class
*  is used by following steps:
*
*  1. Inherit your class from CUpnpTimeoutElement; 
*
*  2. In the constructor of the derived class, call also the constructor of 
*  CUpnpTimeoutElement. This means you have to have an element library class which
*  is derived from the class MUpnpTimeoutElementParent. This element library has to
*  be passed to the constructor of CUpnpTimeoutElement.
*
*  3. Call the SetTimeout function to set the timeout of the element
*
*  4. If the timeout should be renewed after a timeout, call SetRenew to set the
*  member variable iRenew. That variable can be used later to decide the destiny
*  of an element.
*
*  @since Series60 2.0
*/
class CUpnpTimeoutElement : public CActive
    {
    private:
        static const TUint32 KMicroInSec = 1000000;
        static const TInt KTime = 1800;
    
    protected: // Constructors and destructors

        /**
        * Constructor function; call from the constructor of a derived class.
        * @since Series60 2.0
        * @param aParent A class implementing the parent interface 
        * MUpnpTimeoutElementParent, in practice the library class
        */
    IMPORT_C CUpnpTimeoutElement( MUpnpTimeoutElementParent& aParent );
      
        /**
        * Base class constructor function
        * @since Series60 2.0
        */
    IMPORT_C void BaseConstructL();
   
    public:
 
    	/**
	    * Destructor function; called automatically from the destructor of a 
        * derived class
	    **/
	IMPORT_C virtual ~CUpnpTimeoutElement();

        /**
    	* This function sets the timeout of the element. The TimeoutExpired()
        * function of the parent of this element is called after the timeout
        * @since Series60 2.0
        * @param aSeconds
        */
	IMPORT_C void SetTimeout( TInt aSeconds );

    public: // From CActive

        /**
    	* Standard callback function of CActive-derived functions
        * @since Series60 2.0
        * @return None
        */
	IMPORT_C void RunL();

        /**
    	* Standard callback function of CActive-derived functions
        * @since Series60 2.0
        * @return None
        */
	IMPORT_C void DoCancel();

        /**
    	* Standard callback function of CActive-derived functions
        * @since Series60 2.0
        * @return None
        */
    IMPORT_C TInt RunError( TInt aError );

    public: // New Functions

	    // Enumeration for different timeouts:
	    enum TState {
		    EAlive,
		    EDead,
		    ELongTime
	    };

	    // Enumeration for different timeouts:
	    enum TRenew { 
		    // This value is for timeouts that should be renewed after the timeout
		    ERenew, 
		    // This value is for timeouts that declare the closing of 
			// an external (device) element; 
		    EOnce,
			// This value is for timeouts that declare the closing of an element;
			// timeout not renewed anymore.
			ERemove
	    };

        /**
    	* Returns the current renew setting
        * @since Series60 2.0
        * @return Returns the current renew setting
        */
	IMPORT_C TRenew& Renew();

        /**
    	* ets the renew setting of this element
        * @since Series60 2.0
        * @param aRenew The new renew setting
        */
	IMPORT_C void SetRenew( TRenew aRenew );

    private: 

	    TRenew iRenew;
	    TState iState;
	    RTimer iTimer;
	    MUpnpTimeoutElementParent& iParent;
	    TInt iSeconds;
    };

#endif	// C_CUPNPTIMEOUTELEMENT_H

// End of File