/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
#ifndef ARBT_BASE_H_INCLUDED
#define ARBT_BASE_H_INCLUDED

#include "arbt_config.h"
#include "arbt_types.h"
#include "arbt_error.h"

class ArbtBase
{
    public:
        OSCL_IMPORT_REF  static void Init() {};
        OSCL_IMPORT_REF  static void Cleanup() {};
};

class ArbtErrorTrap
{
    public:

        OSCL_IMPORT_REF  static void Init() {};
        OSCL_IMPORT_REF  static void Cleanup() {};
        OSCL_IMPORT_REF  static void leave(int) {};
};

class ArbtMem
{
    public:
        OSCL_IMPORT_REF  static void Init() {};
        OSCL_IMPORT_REF  static void Cleanup() {};
};

class ArbtRequestStatus
{
    public:
        ArbtRequestStatus();
        ArbtRequestStatus(int32 aVal)
        {
            (void)(aVal);
        };
        int32 operator=(int32 aVal);
        int32 operator==(int32 aVal) const;
        int32 operator!=(int32 aVal) const;
        int32 operator>=(int32 aVal) const;
        int32 operator<=(int32 aVal) const;
        int32 operator>(int32 aVal) const;
        int32 operator<(int32 aVal) const;
        int32 Int() const;
    private:
        int32 iStatus;
};

class OsclActiveObject
{
    public:
        /**
         * Scheduling priorities.
         */
        enum TPriority
        {
            /**
            A low priority, useful for active objects representing
            background processing.
            */
            EPriorityIdle = -100,
            /**
            A priority higher than EPriorityIdle but lower than EPriorityStandard.
            */
            EPriorityLow = -20,
            /**
            Most active objects will have this priority.
            */
            EPriorityStandard = 0,
            /**
            A priority higher than EPriorityStandard; useful for active objects
            handling user input.
            */
            EPriorityUserInput = 10,
            /**
            A priority higher than EPriorityUserInput.
            */
            EPriorityHigh = 20
        };

        /**
         * Constructor.
         * @param aPriority (input param): scheduling priority
         * @param name (inpup param): optional name for this AO.
         */
        OSCL_IMPORT_REF OsclActiveObject(int32 aPriority, const char name[]);

        /**
         * Destructor.
         */
        OSCL_IMPORT_REF virtual ~OsclActiveObject();

        /**
         * Set request active for this AO.
         * Will panic if the request is already active,
         * or the active object is not added to any scheduler,
         * or the calling thread context does not match
         * the scheduler thread.
         */
        OSCL_IMPORT_REF void SetBusy();

        /**
         * Return true if this AO is active,
         * false otherwise.
         */
        OSCL_IMPORT_REF bool IsBusy() const;

        /**
         * Set request active for this AO and set the status to pending.
         * PendForExec is identical to SetBusy, but it
         * additionally sets the request status to OSCL_REQUEST_PENDING.
         *
         */
        OSCL_IMPORT_REF void PendForExec();

        /**
         * Complate the active request for the AO.  Can be
         * called from any thread.
         * @param aStatus: request completion status.
         */
        OSCL_IMPORT_REF void PendComplete(int32 aStatus);


        /**
         * Add this AO to the current thread's scheduler.
         */
        OSCL_IMPORT_REF void AddToScheduler();

        /**
         * Return true if this AO is added to the scheduler,
         * false otherwise.
         */
        OSCL_IMPORT_REF bool IsAdded() const;

        /**
         * Remove this AO from its scheduler.
         * Will panic if the calling thread context does
         * not match the scheduling thread.
         * Cancels any active request before removing.
         */
        OSCL_IMPORT_REF void RemoveFromScheduler();

        /**
         * Deque is identical to RemoveFromScheduler
         * It's only needed to prevent accidental usage
         * of Symbian CActive::Deque.
         */
        OSCL_IMPORT_REF void Deque();

        /**
         * Complete this AO's request immediately.
         * If the AO is already active, this will do nothing.
         * Will panic if the AO is not acced to any scheduler,
         * or if the calling thread context does not match the
         * scheduling thread.
         */
        OSCL_IMPORT_REF void RunIfNotReady();

        /**
         * Cancel any active request.
         * If the request is active, this will call the DoCancel
         * routine, wait for the request to cancel, then set the
         * request inactive.  The AO will not run.
         * If the request is not active, it does nothing.
         * Request must be canceled from the same thread
         * in which it is scheduled.
         */
        OSCL_IMPORT_REF void Cancel();

        /**
        * Return scheduling priority of this active object.
        */
        OSCL_IMPORT_REF int32 Priority() const;

        /**
        * Request status access
        */
        OSCL_IMPORT_REF int32 Status()const;
        OSCL_IMPORT_REF void SetStatus(int32);
        OSCL_IMPORT_REF int32 StatusRef();

    protected:
        /**
         * Cancel request handler.
         * This gets called by scheduler when the request
         * is cancelled.  The default routine will complete
         * the request.  If any additional action is needed,
         * the derived class may override this.  If the derived class
         * does override DoCancel, it must complete the request.
         */
        //OSCL_IMPORT_REF virtual void DoCancel();

        /**
        * Run Error handler.
        * This gets called by scheduler when the Run routine leaves.
        * The default implementation simply returns the leave code.
        * If the derived class wants to handle errors from Run,
        * it may override this.  The RunError should return OsclErrNone
        * if it handles the error, otherwise it should return the
        * input error code.
        * @param aError: the leave code generated by the Run.
        */
        //OSCL_IMPORT_REF virtual int32 RunError(int32 aError);
};


class OsclTimerObject
{
    public:
        /**
         * Constructor.
         * @param aPriority (input param): scheduling priority
         * @param name (input param): optional name for this AO.
         */
        OSCL_IMPORT_REF OsclTimerObject(int32 aPriority, const char name[]);

        /**
         * Destructor.
         */

        //OSCL_IMPORT_REF virtual ~OsclTimerObject();

        /**
         * Add this AO to the current thread's scheduler.
         */
        OSCL_IMPORT_REF void AddToScheduler();

        /**
         * Return true if this AO is added to the scheduler,
         * false otherwise.
         */
        OSCL_IMPORT_REF bool IsAdded() const;

        /**
         * Remove this AO from its scheduler.
         * Will panic if the calling thread context does
         * not match the scheduling thread.
         * Cancels any active request before removing.
         */
        OSCL_IMPORT_REF void RemoveFromScheduler();

        /**
         * Deque is identical to RemoveFromScheduler
         * It's only needed to prevent accidental usage
         * of Symbian CActive::Deque.
         */
        OSCL_IMPORT_REF void Deque();

        /**
        * 'After' sets the request active, with request status
        * OSCL_REQUEST_STATUS_PENDING, and starts a timer.
        * When the timer expires, the request will complete with
        * status OSCL_REQUEST_ERR_NONE.
        * Must be called from the same thread in which the
        * active object is scheduled.
        * Will panic if the request is already active, the object
        * is not added to any scheduler, or the calling thread
        * does not match the scheduling thread.
        * @param anInterval: timeout interval in microseconds.
        */
        OSCL_IMPORT_REF void After(int32 aDelayMicrosec);

        /**
         * Complete the request after a time interval.
         * RunIfNotReady is identical to After() except that it
         * first checks the request status, and if it is already
         * active, it does nothing.
         *
         * @param aDelayMicrosec (input param): delay in microseconds.
         */
        OSCL_IMPORT_REF void RunIfNotReady(uint32 aDelayMicrosec = 0);

        /**
         * Set request active for this AO.
         * Will panic if the request is already active,
         * or the active object is not added to any scheduler,
         * or the calling thread context does not match
         * the scheduler thread.
         */
        OSCL_IMPORT_REF void SetBusy();

        /**
         * Return true if this AO is active,
         * false otherwise.
         */
        OSCL_IMPORT_REF bool IsBusy() const;

        /**
         * Cancel any active request.
         * If the request is active, this will call the DoCancel
         * routine, wait for the request to cancel, then set the
         * request inactive.  The AO will not run.
         * If the request is not active, it does nothing.
         * Request must be canceled from the same thread
         * in which it is scheduled.
         */
        OSCL_IMPORT_REF void Cancel();

        /**
        * Return scheduling priority of this active object.
        */
        OSCL_IMPORT_REF int32 Priority() const;
        /**
        * Request status access
        */
        OSCL_IMPORT_REF int32 Status()const;
        OSCL_IMPORT_REF void SetStatus(int32);
        OSCL_IMPORT_REF int32 StatusRef();

    protected:
        /**
         * Cancel request handler.
         * This gets called by scheduler when the request
         * is cancelled.  The default routine will cancel
         * the timer.  If any additional action is needed,
         * the derived class may override this.  If the
         * derived class does override this, it should explicitly
         * call OsclTimerObject::DoCancel in its own DoCancel
         * routine.
         */
        //OSCL_IMPORT_REF virtual void DoCancel();

        /**
        * Run Error handler.
        * This gets called by scheduler when the Run routine leaves.
        * The default implementation simply returns the leave code.
        * If the derived class wants to handle errors from Run,
        * it may override this.  The RunError should return OsclErrNone
        * if it handles the error, otherwise it should return the
        * input error code.
        * @param aError: the leave code generated by the Run.
        */
        //OSCL_IMPORT_REF virtual int32 RunError(int32 aError);
};

#endif // ARBT_BASE_H_INCLUDED

