/*
* Copyright (c) 2006-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:  Emulate key or pointer event.
*
*/


#ifndef C_CBCTESTKEYFEEDER_H
#define C_CBCTESTKEYFEEDER_H

#include    <eikenv.h>

#include    "bctestutil.h"

class CBCTestSuite;
class CEikonEnv;

/**
 *  CBCTestKeyFeeder for autotests
 */
class CBCTestKeyFeeder : public CBase
    {
public:

// Constructors and destructor

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

    /**
     * Destructor.
     */
    virtual ~CBCTestKeyFeeder();

// New functions

    /**
     * Periodic function called every 0.1 seconds
     * The function is a callback used by CPeriodic, so it have
     * to conform to demanded format, it has to return TInt.
     * @param aThis Pointer to this (CBCTestKeyFeeder)
     * @return Always return 0
     */
    static TInt PeriodicKeyFeederL(TAny* aThis);

    /**
     * Handles autotest commands (big switch case)
     */
    void HandleAutoCommandL();

    /**
     * Pauses timer temporarily
     */
    void PauseTimer();

    /**
     * Resumes timer
     */
    void ResumeTimer();

    /*
     * Start auto test
     * @param aAutoTest, a structure containes autotest scripts of every
     * test case.
     */
    void StartAutoTestL(SAutoTest* aAutoTest);

    /**
     * Set test suite pointer, key feeder will pass some event to suite to
     * handle durint automatic test process.
     */
    void SetSuite( CBCTestSuite* aSuite );

private:

// new functions

    /**
     * Simulates key down press using window server
     * @param aScanCode
     */
    void KeyDown(TInt aScanCode);

    /**
     * Simulates key down press using window server
     * @param aScanCode
     */
    void KeyUp(TInt aScanCode);

    /**
     * Simulates key press using window server
     * @param aScanCode
     */
    void KeyPress(TInt aCode, TInt aScanCode);

    /**
     * Simulates pointer event
     * @param aEvent
     */
    void PointerEvent(TRawEvent& aEvent);

private: //data

    /**
     * Not Own.
     */
    CBCTestSuite* iSuite;

    /**
     * Not Own.
     */
    CEikonEnv* iEikEnv;

    /**
     * For changing delays between key feeds
     */
    TInt iTickCount;
    TInt iTickCounter;

    /**
     * active object
     */
    CPeriodic* iPeriodic;

    /**
     * Not Own.
     */
    SAutoTest* iAutoTest;

    /**
     * Not Own.
     */
    const TInt* iScriptCommands;

    TInt iScriptIndex;
    TInt iIndex;

    TInt iWaitCount;
    TInt iRepeat;
    TInt iCommand;
    TInt iRepeatCommand;

    /**
     * for key down presses
     */
    TBool iKeyDown;

    /**
     * for key up presses
     */
    TBool iKeyUp;

    /**
     * State of modifier keys
     */
    TUint iModifiers;
    TUint iOldModifiers;

    TInt iOutlineCount;

    TBool iTimerPaused;

    /**
     * conditional sequence support
     */
    TBool      iDoElse;
    TInt       iIfCount;

    };

#endif // C_CBCTESTKEYFEEDER_H
