dispatcher.h 3.66 KB
/**
 * \file dispatcher.h
 *
 * \brief Deklaration eines abstrakten Event-Dispatchers und des 
 *        Dispatcher-Managers.
 *
 * <p>In einem Dispatcher werden callbacks eingetragen, die bei bestimmten
 * Events aufgerufen werden sollen, Der Dispatcher k&uuml;mmert sich dann
 * darum das diese zum richtigen Zeitpunk und f&uuml;r das richtige Event
 * aufgerufen werden. Der Dispatcher wird mit der Event-Quelle initialisiert,
 * die die Events erzeugt. Die hier definierte Dispatcher Klasse ist abstrakt
 * und mu&szlig; noch in einer abgeleiteten Klasse konkretisiert werden. So
 * kann ich diverse Dispatcher erzeugen, die intern unterschiedlich arbeiten,
 * im Moment existiert die X11 implementation eines Dispatches.</p>
 * <p>Im Dispatcher Manager werden die einzelnen Dispatcher registriert. Er
 * sorgt dann dann standartm&auml;&szlig;ig daf&uuml;r, das die einzelnen
 * Dispatcher immer wieder nacheinenader in der Reihenfolge in der sie dem
 * Manager hinzugef&uuml;gt wurden ausgeführt werden und so alle Events immer
 * wieder gecheckt werden. Dieses verhalten kann man aber &auml;ndern indem
 * man einen neuen Manager von diesem ableitet und die virtuellen Methoden
 * entsprechend &uuml;berschreibt.</p>
 * 
 * \author Georg Steffers <georg@steffers.org>
 *
 * \date 04.12.2003
 *
 * \version ..2002 (Georg Steffers): erste funktionierende Implementation
 * \version 04.12.2003 (Georg Steffers): beginn der Dokumentation via doxygen
 */

/* 
 * Copyright (C)2003 Georg Steffers
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __dispatcher_h__
#define __dispatcher_h__

#include "callback.h"
#include "event_source.h"

class disp_manager;
class dispatcher {
    friend class disp_manager;

    protected:
        callback<event_source*,void*> cb[MaxEvent];
        event_source* e_src;
        int halt_f;

    public:
        dispatcher(event_source* es=NULL) {
            e_src=es;
            halt_f=false;
        }
        virtual ~dispatcher() {}

        void register_callback(event e, callback<event_source*, void*> _cb) {
            if(e_src)
                cb[e]=_cb;
        }

        virtual void go(void)=0;
        virtual void trigger_event(event)=0;
        void halt(void) { halt_f=true; }
        void cont(void) { halt_f=false; }
};

// Da ich u.U. mehrere Eventquellen in einem Programm habe brauche
// ich eine Klasse die die verschiedenen Dispatcher-Klassen kontrolliert
// nacheinander aufruft.
class disp_manager {
    private:
        dispatcher** disp;
        unsigned disp_count;
        unsigned run;

    public:
        disp_manager(dispatcher* = NULL);
        ~disp_manager() {
            delete [] disp;
        }

        dispatcher*& operator[](unsigned index);

        unsigned count(void) { return disp_count; }
        virtual void start(void);
        virtual void stop(event_source*, void*) { 
            run=false; 
        }
        virtual void do_once(void);
};

class dispatcher_factory {
    public:
        virtual dispatcher* create(event_source* es) const=0;
};

#endif // __dispatcher_h__