/*
* Copyright (c) 2005-2007 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:  This file contains classes of Peninput server client side.
*
*/


#ifndef R_RPENINPUTSERVER_OBSERVER_H
#define R_RPENINPUTSERVER_OBSERVER_H

#include <peninputsrveventhandler.h>

class RPeninputServerImpl;
/**
 * Peninput server observer
 *
 *
 * @lib peninputclient.lib
 * @since S60 v4.0 
 */
NONSHARABLE_CLASS(CPeninputServerObserver) : public CActive,
                                             public MPeninputServerEventHandler
    {
public:
    static CPeninputServerObserver* NewL(RPeninputServerImpl* aPeninputServer,
    						                    TThreadId aSrvThreadId);
    /**
     * Constructor 
     *
     * @since S60 v4.0
     * @param aPeninputServer The server to be observered
     * @param aHandler A server event handler
     */
    CPeninputServerObserver(RPeninputServerImpl* aPeninputServer,
    						                        TThreadId aSrvThreadId);

    /**
     * Destructor 
     *
     * @since S60 v4.0
     */
    ~CPeninputServerObserver();

    /**
     * Set UI activation handler
     *
     * @since S60 v4.0
     * @param aHandler A server event handler
     */
	void AddUiActivationHandler(MPeninputServerEventHandler* aHandler);
	
    /**
     * Add server event handler
     *
     * @since S60 v4.0
     * @param aHandler A server event handler
     */	
	void AddEventHandler(MPeninputServerEventHandler* aHandler);
	void SetActive()
	    {
	    CActive::SetActive();
	    }
	TRequestStatus& RequestStatus() 
	    {
	    return iStatus;
	    }
    void ReConstructL(TThreadId aId);	    
protected: 
     void ConstructL();
    //From base class CActive

    /** 
     * From CActive
     * Cancels all notification requests 
     *
     * @since S60 v4.0
     */
    void DoCancel();

    /** 
     * From CActive
     * Receives messages and carries out requested operations
     *
     * @since S60 v4.0
     */
    void RunL();

    /** 
     * From CActive
     * Handles error if RunL() leaves
     *
     * @since S60 v4.0
     */
    TInt RunError(TInt aError);
private:
    virtual TBool HandleServerEventL(TInt aEventId);
    
    /**
     * Stop the server
     *
     * @since Symbian^3
     *
     * @param none
     * @return void
     */
    void HandleServerTerminatedL();

public:
    /**
     * server event handler
     * Not own
     */
    MPeninputServerEventHandler* iHandler;
    
    /**
     * UI activation event handler
     * Not own
     */
    MPeninputServerEventHandler* iUiActivationHandler;

private:
    /**
     * Reference to connected RPeninputServerImpl session
     * Not own
     */
    RPeninputServerImpl* iPeninputServer;

    /**
     * Server thread id
     */        
    TThreadId iSrvThreadId;
    
    /**
     * Server status flag
     */        
    TBool iServerExit;
};


//class CPenUiNotificationHandler
NONSHARABLE_CLASS(CPenUiNotificationHandler): public CBase,public MPeninputServerEventHandler
    {
    public:
        static CPenUiNotificationHandler* NewL(MPenUiActivationHandler* aHandler,
                                                RPeninputServerImpl* aClient,
                                                TInt aType);
        TBool HandleServerEventL(TInt aEventId);
        MPenUiActivationHandler* Handler() 
            {
            return iHandler;
            }
        TInt RegisteredType() 
            {
             return iType;
            }
    private:
        CPenUiNotificationHandler(MPenUiActivationHandler* aHandler,
                                    RPeninputServerImpl* aClient,TInt aType);
        void ConstructL();
    private:
        MPenUiActivationHandler* iHandler;        
        RPeninputServerImpl* iClient; //not owned
        TInt iType;
    };

#endif //R_RPENINPUTSERVER_OBSERVER_H
