Rename interpretor to interpreter.
[Faustine.git] / interpreter / preprocessor / faust-0.9.47mr3 / architecture / osclib / faust / src / nodes / MessageDriven.h
diff --git a/interpreter/preprocessor/faust-0.9.47mr3/architecture/osclib/faust/src/nodes/MessageDriven.h b/interpreter/preprocessor/faust-0.9.47mr3/architecture/osclib/faust/src/nodes/MessageDriven.h
new file mode 100644 (file)
index 0000000..cb96019
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+
+  Copyright (C) 2011 Grame
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library 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
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+  Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France
+  research@grame.fr
+
+*/
+
+
+#ifndef __MessageDriven__
+#define __MessageDriven__
+
+#include <string>
+#include <vector>
+
+#include "MessageProcessor.h"
+#include "smartpointer.h"
+
+namespace oscfaust
+{
+
+class Message;
+class OSCRegexp;
+class MessageDriven;
+typedef class SMARTP<MessageDriven>    SMessageDriven;
+
+//--------------------------------------------------------------------------
+/*!
+       \brief a base class for objects accepting OSC messages
+       
+       Message driven objects are hierarchically organized in a tree.
+       They provides the necessary to dispatch an OSC message to its destination
+       node, according to the message OSC address. 
+       
+       The principle of the dispatch is the following:
+       - first the processMessage() method should be called on the top level node
+       - next processMessage call propose 
+       
+       
+*/
+class MessageDriven : public MessageProcessor, public smartable
+{
+       std::string                                             fName;                  ///< the node name
+       std::string                                             fOSCPrefix;             ///< the node OSC address prefix (OSCAddress = fOSCPrefix + '/' + fName)
+       std::vector<SMessageDriven>             fSubNodes;              ///< the subnodes of the current node
+
+       protected:
+                                MessageDriven(const char *name, const char *oscprefix) : fName (name), fOSCPrefix(oscprefix) {}
+               virtual ~MessageDriven() {}
+
+       public:
+               static SMessageDriven create (const char* name, const char *oscprefix)  { return new MessageDriven(name, oscprefix); }
+
+               /*!
+                       \brief OSC message processing method.
+                       \param msg the osc message to be processed
+                       The method should be called on the top level node.
+               */
+               virtual void    processMessage( const Message* msg );
+
+               /*!
+                       \brief propose an OSc message at a given hierarchy level.
+                       \param msg the osc message currently processed
+                       \param regexp a regular expression based on the osc address head
+                       \param addrTail the osc address tail
+                       
+                       The method first tries to match the regular expression with the object name. 
+                       When it matches:
+                       - it calls \c accept when \c addrTail is empty 
+                       - or it \c propose the message to its subnodes when \c addrTail is not empty. 
+                         In this case a new \c regexp is computed with the head of \c addrTail and a new \c addrTail as well.
+               */
+               virtual void    propose( const Message* msg, const OSCRegexp* regexp, const std::string addrTail);
+
+               /*!
+                       \brief accept an OSC message. 
+                       \param msg the osc message currently processed
+                       \return true when the message is processed by the node
+                       
+                       The method is called only for the destination nodes. The real message acceptance is the node 
+                       responsability and may depend on the message content.
+               */
+               virtual bool    accept( const Message* msg );
+
+               /*!
+                       \brief handler for the \c 'get' message
+                       \param ipdest the output message destination IP
+                       
+                       The \c 'get' message is supported by every node:
+                       - it is propagated to the subnodes until it reaches terminal nodes
+                       - a terminal node send its state on \c 'get' request to the IP address given as parameter.
+                       The \c get method is basically called by the accept method.
+               */
+               virtual void    get (unsigned long ipdest) const;               ///< handler for the 'get' message
+
+               void                    add ( SMessageDriven node )     { fSubNodes.push_back (node); }
+               const char*             getName() const                         { return fName.c_str(); }
+               std::string             getOSCAddress() const;
+               int                             size () const                           { return fSubNodes.size (); }
+               
+               const std::string&      name() const                    { return fName; }
+               SMessageDriven  subnode (int i)                         { return fSubNodes[i]; }
+};
+
+} // end namespoace
+
+#endif