topical media & game development

talk show tell print

lib-of-vs-addons-ofxOsc-src-ofxOscMessage.cpp / cpp



  /*
  
   Copyright 2007, 2008 Damian Stewart damian@frey.co.nz
   Distributed under the terms of the GNU Lesser General Public License v3
  
   This file is part of the ofxOsc openFrameworks OSC addon.
  
   ofxOsc 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 3 of the License, or
   (at your option) any later version.
  
   ofxOsc 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 Lesser General Public License
   along with ofxOsc.  If not, see <http://www.gnu.org/licenses/>.
   */
  
  include <ofxOscMessage.h>
  include <iostream>
  include <assert.h>
  
  ofxOscMessage::ofxOscMessage()
  
  {
  }
  
  ofxOscMessage::~ofxOscMessage()
  {
          clear();
  }
  
  void ofxOscMessage::clear()
  {
          for ( unsigned int i=0; i<args.size(); ++i )
                  delete args[i];
          args.clear();
          address = "";
  }
  
  /*
  
  get methods
  
  */
  
  int ofxOscMessage::getNumArgs() const
  {
          return (int)args.size();
  }
  
  ofxOscArgType ofxOscMessage::getArgType( int index ) const
  {
      if ( index >= (int)args.size() )
      {
          fprintf(stderr,"ofxOscMessage::getArgType: index \%d out of bounds\n", index );
          return OFXOSC_TYPE_INDEXOUTOFBOUNDS;
      }
      else
          return args[index]->getType();
  }
  
  string ofxOscMessage::getArgTypeName( int index ) const
  {
      if ( index >= (int)args.size() )
      {
          fprintf(stderr,"ofxOscMessage::getArgTypeName: index \%d out of bounds\n", index );
          return "INDEX OUT OF BOUNDS";
      }
      else
          return args[index]->getTypeName();
  }
  
  int32_t ofxOscMessage::getArgAsInt32( int index ) const
  {
          if ( getArgType(index) != OFXOSC_TYPE_INT32 )
          {
              if ( getArgType( index ) == OFXOSC_TYPE_FLOAT )
          {
              fprintf(stderr, "ofxOscMessage:getArgAsInt32: warning: converting int32 to float for argument \%i\n", index );
              return ((ofxOscArgFloat*)args[index])->get();
          }
          else
          {
              fprintf(stderr, "ofxOscMessage:getArgAsInt32: error: argument \%i is not a number\n", index );
              return 0;
          }
          }
          else
          return ((ofxOscArgInt32*)args[index])->get();
  }
  
  float ofxOscMessage::getArgAsFloat( int index ) const
  {
          if ( getArgType(index) != OFXOSC_TYPE_FLOAT )
          {
              if ( getArgType( index ) == OFXOSC_TYPE_INT32 )
          {
              fprintf(stderr, "ofxOscMessage:getArgAsFloat: warning: converting float to int32 for argument \%i\n", index );
              return ((ofxOscArgInt32*)args[index])->get();
          }
          else
          {
              fprintf(stderr, "ofxOscMessage:getArgAsFloat: error: argument \%i is not a number\n", index );
              return 0;
          }
          }
          else
          return ((ofxOscArgFloat*)args[index])->get();
  }
  
  string ofxOscMessage::getArgAsString( int index ) const
  {
      if ( getArgType(index) != OFXOSC_TYPE_STRING )
          {
              if ( getArgType( index ) == OFXOSC_TYPE_FLOAT )
          {
              char buf[1024];
              sprintf(buf,"\%f",((ofxOscArgFloat*)args[index])->get() );
              fprintf(stderr, "ofxOscMessage:getArgAsString: warning: converting float to string for argument \%i\n", index );
              return buf;
          }
              else if ( getArgType( index ) == OFXOSC_TYPE_INT32 )
          {
              char buf[1024];
              sprintf(buf,"\%i",((ofxOscArgInt32*)args[index])->get() );
              fprintf(stderr, "ofxOscMessage:getArgAsString: warning: converting int32 to string for argument \%i\n", index );
              return buf;
          }
          else
          {
              fprintf(stderr, "ofxOscMessage:getArgAsString: error: argument \%i is not a string\n", index );
              return "";
          }
          }
          else
          return ((ofxOscArgString*)args[index])->get();
  }
  
  /*
  
  set methods
  
  */
  
  void ofxOscMessage::addIntArg( int32_t argument )
  {
  
          args.push_back( new ofxOscArgInt32( argument ) );
  }
  
  void ofxOscMessage::addFloatArg( float argument )
  {
          args.push_back( new ofxOscArgFloat( argument ) );
  }
  
  void ofxOscMessage::addStringArg( string argument )
  {
          args.push_back( new ofxOscArgString( argument ) );
  }
  
  /*
  
   housekeeping
  
   */
  
  ofxOscMessage& ofxOscMessage::copy( const ofxOscMessage& other )
  {
          // copy address
          address = other.address;
  
          remote_host = other.remote_host;
          remote_port = other.remote_port;
  
          // copy arguments
          for ( int i=0; i<(int)other.args.size(); ++i )
          {
                  ofxOscArgType argType = other.getArgType( i );
                  if ( argType == OFXOSC_TYPE_INT32 )
                          args.push_back( new ofxOscArgInt32( other.getArgAsInt32( i ) ) );
                  else if ( argType == OFXOSC_TYPE_FLOAT )
                          args.push_back( new ofxOscArgFloat( other.getArgAsFloat( i ) ) );
                  else if ( argType == OFXOSC_TYPE_STRING )
                          args.push_back( new ofxOscArgString( other.getArgAsString( i ) ) );
                  else
                  {
                          assert( false && "bad argument type" );
                  }
          }
  
          return *this;
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.