-/*
-
- 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
-
-*/
-
-#include <iostream>
-#include <sstream>
-
-#include "Message.h"
-#include "MessageDriven.h"
-#include "OSCAddress.h"
-#include "OSCFError.h"
-#include "OSCRegexp.h"
-
-using namespace std;
-namespace oscfaust
-{
-
-static const char * kGetMsg = "get";
-
-//--------------------------------------------------------------------------
-void MessageDriven::processMessage( const Message* msg )
-{
- const string addr = msg->address();
-
- // create a regular expression
- OSCRegexp r (OSCAddress::addressFirst(addr).c_str());
- // and call propose with this regexp and with the dest osc address tail
- propose (msg, &r, OSCAddress::addressTail (addr));
-
- if (addr != "/*") {
- // search for alias root (fixme : could be stored in a field)
- MessageDriven * aliasroot = 0;
- for (int i=0; i<size(); i++) {
- if (subnode(i)->name() == "alias") {
- aliasroot = subnode(i);
- }
- }
-
- // if we have aliases in the tree
- // we need to check if the message if for an alias address
- if (aliasroot != 0) {
- OSCRegexp r2 ("alias");
-
- if (msg->size() == 1) {
- aliasroot->propose (msg, &r2, addr);
- } else if (msg->size() > 1) {
- // we simulated several messages
- for (int i=0; i< msg->size(); i++) {
- ostringstream as; as << addr << '/' << i;
- string a(as.str());
- Message m(a);
- float v;
-
- msg->param(i, v);
- m.add(v);
- aliasroot->propose (&m, &r2, a);
- }
- }
- }
- }
-}
-
-//--------------------------------------------------------------------------
-// the full OSC address is simply the prefix + '/' + name
-string MessageDriven::getOSCAddress() const
-{
- string address(fOSCPrefix);
- address += "/";
- address += fName;
- return address;
-}
-
-//--------------------------------------------------------------------------
-// terminal nodes should override the get method
-void MessageDriven::get (unsigned long ipdest) const
-{
- // basic get handler propagates the get call to subnodes
- for (vector<SMessageDriven>::const_iterator i = fSubNodes.begin(); i != fSubNodes.end(); i++)
- (*i)->get (ipdest);
-}
-
-//--------------------------------------------------------------------------
-bool MessageDriven::accept( const Message* msg )
-{
- string val;
- // the basic accept method only checks for the 'get' message
- if ((msg->size() == 1) && (msg->param(0, val)) && (val == kGetMsg)) {
- get (msg->src());
- return true;
- }
- return false;
-}
-
-//--------------------------------------------------------------------------
-void MessageDriven::propose( const Message* msg, const OSCRegexp* r, const std::string addrTail)
-{
- if (r->match(getName())) { // try to match the regular expression with the object name.
- if (addrTail.empty()) { // it matches and the tail is empty
- accept(msg); // then call accept()
- }
- else { // it matches but the tail is not empty
- OSCRegexp rtail (OSCAddress::addressFirst(addrTail).c_str());
- for (vector<SMessageDriven>::iterator i = fSubNodes.begin(); i != fSubNodes.end(); i++) {
- // then propagate propose() to subnodes with a new regexp and a new tail
- (*i)->propose (msg, &rtail, OSCAddress::addressTail(addrTail));
- }
- }
- }
-}
-
-} // end namespoace