wlanutilities/wlansniffer/engine/server/inc/wsfserver.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:32 +0100
branchRCL_3
changeset 25 f28ada11abbf
parent 0 56b72877c1cb
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201029 Kit: 201035

/*
* Copyright (c) 2007-2008 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:  Class header for CWsfServer
*
*/



#ifndef C_WSFSERVER_H
#define C_WSFSERVER_H

//  EXTERNAL INCLUDES
#include <e32base.h>

//  INTERNAL INCLUDES
#include "wsfservercloseradapter.h"


//  FORWARD DECLARATIONS
class CWsfEngine;
class CWsfSession;


//  CLASS DEFINITION
/**
* CWsfServer is the server class that realises the necessary server functions 
*
* @since S60 5.0
* @lib wsfserver.exe
*/
NONSHARABLE_CLASS( CWsfServer ): public CPolicyServer
    {
    private:
        
        /**
        * CWsfServerCloser is an auxiliary class that is responsible for 
        * closing the server when there is no need for it any more
        *
        * @since S60 5.0
        * @lib wsfserver.exe
        */
        NONSHARABLE_CLASS( CWsfServerCloser ): public CTimer, 
                                               public MWsfServerCloserAdapter
            {
            public:
                /**
                * Factory function.
                * @since S60 5.0
                * @return Server closer instance
                */
                static CWsfServerCloser* NewL();
                
                /**
                * Destructor.
                */
                ~CWsfServerCloser();
            
            public:     // from MWsfServerCloserAdapter
            
                /**
                * Sets whether the server closer should wait for the 
                * termination of the owned connection
                * @since S60 5.0
                * @param aWait If ETrue, the server closer will wait.
                */
                void WaitForOwnedConnection( TBool aWait );

                /**
                * Sets whether the server closer should wait for the 
                * termination of the browser
                * @since S60 5.0
                * @param aWait If ETrue, the server closer will wait.
                */
                void WaitForBrowserExit( TBool aWait );

                /**
                * Sets whether the server closer should wait for the 
                * clients of the owned connection to detach
                * @since S60 5.0
                * @param aWait If ETrue, the server closer will wait.
                */
                void WaitForClients( TBool aWait );
                
            private:
                
                /**
                * Constructor.
                * @since S60 5.0
                */
                CWsfServerCloser();
                
                /**
                * Second-phase constructor.
                * @since S60 5.0
                */
                void ConstructL();
                
                           
            private:    // from CActive

                /**
                * Handles an active object's request completion event.
                * @since S60 5.0
                */
                void RunL();
                

            private:    // new methods
                /** 
                * Start the closing timer
                */    
                void StartClosureWait();
                
            private:
                /**
                * Indicates whether the server should wait for the owned
                * connection to terminate.
                */
                TBool iWaitForOwnedConnection;
                
                /**
                * Indicates whether the server should wait for the browser
                * to exit.
                */
                TBool iWaitForBrowserExit;

                /**
                * Indicates whether the server should wait for the clients
                * of the owned connection to detach.
                */
                TBool iWaitForClients;
            };

    public:     // Constructors and destructor
        /**
        * Factory function.
        * @since S60 5.0
        * @return Server instance
        */        
        static CWsfServer* NewLC();
        
        /**
        * Destructor.
        * @since S60 5.0
        */
        ~CWsfServer();

    private:    // Constructors
        /**
        * Constructor
        * @since S60 5.0
        * @param aPriority Active object priority value
        */
        CWsfServer( TInt aPriority );
        
        /**
        * Second-phase constructor.
        * @since S60 5.0
        */
        void ConstructL();


    private:    // from CActive
        /**
        * Handles a leave occurring in RunL().
        * @since S60 5.0
        * @param aError Leave code
        * @return aError
        */    
        TInt RunError( TInt aError );


    private:  // from CPolicyServer
    
        /**
        * Performs a custom security check for IPCs marked with 
        * TSpecialCase::ECustomCheck.
        * @since S60 5.0
        * @param aMsg The message to check. 
        * @param aAction A reference to the action to take if the security 
        *                check fails.
        * @param aMissing A reference to the list of security attributes 
        *                 missing from the checked process
        * @return The result of the security check 
        *         (TCustomResult::EPass/TCustomResult::EFail).
        */
        TCustomResult CustomSecurityCheckL( const RMessage2& aMsg, 
                                            TInt& aAction, 
                                            TSecurityInfo& aMissing );
    
    public:  // from CServer2
    
        /**
        * Creates a server-side session object.
        * @since S60 5.0
        * @param aVersion The version information supplied by the client. 
        * @param aMessage Represents the details of the client request that is
        *                 requesting the creation of the session.
        * @return A pointer to the newly created server-side session object. 
        */
        CSession2 *NewSessionL( const TVersion& aVersion, 
                                const RMessage2& /*aMessage*/) const;

    public:                                        
        /** 
        * The entry point for server startup. 
        * Creates the cleanupstack and continues to RunServerL
        * @since S60 5.0
        * @return KErrNone if success, otherwise error code
        */
        static TInt RunServer();

        /**
        * Reduce client count and start server shutdown sequence if no client 
        * sessions are available
        * @since S60 5.0
        */
        void ClientRelease();
     
        /**
        * Increment the client count counter by one
        * @since S60 5.0
        */
        void ClientAttach();

        /**
        * Returns pointer to the engine
        * @since S60 5.0
        * @return Pointer to the engine object
        */
        CWsfEngine* Engine();
        
    private:        
        /**
        * Creates active schduler and thread for server and start waiting for 
        * client requests
        * @since S60 5.0
        */
        static void RunServerL();
        
   
    private:    // Data       
        /**
        * Sniffer engine instance (owned)
        */
        CWsfEngine *iEngine;
        
        /**
        * Server closer object (owned)
        */
        CWsfServerCloser* iCloser;

        /**
        * Number of currently attached clients
        */
        TInt iClientCount;

    };


#endif // C_WSFSERVER_H