// This file may be redistributed and modified only under the terms of // the GNU Lesser General Public License (See COPYING for details). // Copyright (C) 2000 Stefanus Du Toit #ifndef ATLAS_MESSAGE_DECODERBASE_H #define ATLAS_MESSAGE_DECODERBASE_H #include #include #include #include #include namespace Atlas { namespace Message { class Element; typedef std::map MapType; typedef std::vector ListType; /** Base class for decoders that take Atlas::Message::Object. * * This class is passed to a codec as receiver bridge. It decodes a stream * into Message::Object objects, and after completion calls the abstract * messageArrived() method. This is to be overridden by base classes, which * might, for instance, provide an object queue or a callback method for * arrived messages. * * @see Atlas::Bridge * @see Atlas::Codec * @see Object * @author Stefanus Du Toit * */ class DecoderBase : public Bridge { public: DecoderBase(); virtual ~DecoderBase(); // Callback functions from Bridge virtual void streamBegin(); virtual void streamMessage(); virtual void streamEnd(); virtual void mapMapItem(const std::string& name); virtual void mapListItem(const std::string& name); virtual void mapIntItem(const std::string& name, long); virtual void mapFloatItem(const std::string& name, double); virtual void mapStringItem(const std::string& name, const std::string&); virtual void mapEnd(); virtual void listMapItem(); virtual void listListItem(); virtual void listIntItem(long); virtual void listFloatItem(double); virtual void listStringItem(const std::string&); virtual void listEnd(); protected: /// Our current decoding state. enum State { STATE_STREAM, STATE_MAP, STATE_LIST }; /// The state stack. std::stack m_state; /// The map stack. std::stack m_maps; /// The list stack. std::stack m_lists; /// Names for maps and lists. std::stack m_names; /// Override this - called when an object was received. virtual void messageArrived(const MapType& obj) = 0; }; } } // namespace Atlas::Message #endif