#ifndef _PRAGMA_COPYRIGHT_
#define _PRAGMA_COPYRIGHT_
#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
#endif /* _PRAGMA_COPYRIGHT_ */
/****************************************************************************

* Copyright (c) 2008, 2010 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0s
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html

 Classes: FilterProcessor

 Description: Properties of class 'FilterProcessor':
    input: a. a message queue
    output: a. a message queue
    action: use user-defined filter handlers to process the messages
   
 Author: Nicole Nie

 History:
   Date     Who ID    Description
   -------- --- ---   -----------
   02/10/09 nieyy      Initial code (D153875)

****************************************************************************/

#ifndef _FILTERPROC_HPP
#define _FILTERPROC_HPP

#include "processor.hpp"

class Stream;
class MessageQueue;
class Observer;

class FilterProcessor : public Processor 
{
    private:
        MessageQueue        *inQueue;
        MessageQueue        *outQueue;

        Observer            *observer;

        bool                filtered;
        int                 curFilterID;

    public:
        FilterProcessor(int hndl = -1);

        virtual Message * read();
        virtual void process(Message *msg);
        virtual void write(Message *msg);
        virtual void seize();
        virtual void clean();

        virtual bool isActive();

        void deliever(Message *msg);
        int getCurFilterID();

        void setInQueue(MessageQueue *queue);
        void setOutQueue(MessageQueue *queue);

        void setObserver(Observer *ob);
};

#endif

