andrew@0: /* andrew@0: andrew@0: Copyright (c) 2007-2009, Damian Stewart andrew@0: All rights reserved. andrew@0: andrew@0: Redistribution and use in source and binary forms, with or without andrew@0: modification, are permitted provided that the following conditions are met: andrew@0: * Redistributions of source code must retain the above copyright andrew@0: notice, this list of conditions and the following disclaimer. andrew@0: * Redistributions in binary form must reproduce the above copyright andrew@0: notice, this list of conditions and the following disclaimer in the andrew@0: documentation and/or other materials provided with the distribution. andrew@0: * Neither the name of the developer nor the andrew@0: names of its contributors may be used to endorse or promote products andrew@0: derived from this software without specific prior written permission. andrew@0: andrew@0: THIS SOFTWARE IS PROVIDED BY DAMIAN STEWART ''AS IS'' AND ANY andrew@0: EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED andrew@0: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE andrew@0: DISCLAIMED. IN NO EVENT SHALL DAMIAN STEWART BE LIABLE FOR ANY andrew@0: DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES andrew@0: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; andrew@0: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND andrew@0: ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT andrew@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS andrew@0: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. andrew@0: */ andrew@0: andrew@0: #include "ofxOscMessage.h" andrew@0: #include andrew@0: #include andrew@0: andrew@0: ofxOscMessage::ofxOscMessage() andrew@0: andrew@0: { andrew@0: } andrew@0: andrew@0: ofxOscMessage::~ofxOscMessage() andrew@0: { andrew@0: clear(); andrew@0: } andrew@0: andrew@0: void ofxOscMessage::clear() andrew@0: { andrew@0: for ( unsigned int i=0; i= (int)args.size() ) andrew@0: { andrew@0: fprintf(stderr,"ofxOscMessage::getArgType: index %d out of bounds\n", index ); andrew@0: return OFXOSC_TYPE_INDEXOUTOFBOUNDS; andrew@0: } andrew@0: else andrew@0: return args[index]->getType(); andrew@0: } andrew@0: andrew@0: string ofxOscMessage::getArgTypeName( int index ) const andrew@0: { andrew@0: if ( index >= (int)args.size() ) andrew@0: { andrew@0: fprintf(stderr,"ofxOscMessage::getArgTypeName: index %d out of bounds\n", index ); andrew@0: return "INDEX OUT OF BOUNDS"; andrew@0: } andrew@0: else andrew@0: return args[index]->getTypeName(); andrew@0: } andrew@0: andrew@0: andrew@0: int32_t ofxOscMessage::getArgAsInt32( int index ) const andrew@0: { andrew@0: if ( getArgType(index) != OFXOSC_TYPE_INT32 ) andrew@0: { andrew@0: if ( getArgType( index ) == OFXOSC_TYPE_FLOAT ) andrew@0: { andrew@0: fprintf(stderr, "ofxOscMessage:getArgAsInt32: warning: converting int32 to float for argument %i\n", index ); andrew@0: return ((ofxOscArgFloat*)args[index])->get(); andrew@0: } andrew@0: else andrew@0: { andrew@0: fprintf(stderr, "ofxOscMessage:getArgAsInt32: error: argument %i is not a number\n", index ); andrew@0: return 0; andrew@0: } andrew@0: } andrew@0: else andrew@0: return ((ofxOscArgInt32*)args[index])->get(); andrew@0: } andrew@0: andrew@0: andrew@0: float ofxOscMessage::getArgAsFloat( int index ) const andrew@0: { andrew@0: if ( getArgType(index) != OFXOSC_TYPE_FLOAT ) andrew@0: { andrew@0: if ( getArgType( index ) == OFXOSC_TYPE_INT32 ) andrew@0: { andrew@0: fprintf(stderr, "ofxOscMessage:getArgAsFloat: warning: converting float to int32 for argument %i\n", index ); andrew@0: return ((ofxOscArgInt32*)args[index])->get(); andrew@0: } andrew@0: else andrew@0: { andrew@0: fprintf(stderr, "ofxOscMessage:getArgAsFloat: error: argument %i is not a number\n", index ); andrew@0: return 0; andrew@0: } andrew@0: } andrew@0: else andrew@0: return ((ofxOscArgFloat*)args[index])->get(); andrew@0: } andrew@0: andrew@0: andrew@0: string ofxOscMessage::getArgAsString( int index ) const andrew@0: { andrew@0: if ( getArgType(index) != OFXOSC_TYPE_STRING ) andrew@0: { andrew@0: if ( getArgType( index ) == OFXOSC_TYPE_FLOAT ) andrew@0: { andrew@0: char buf[1024]; andrew@0: sprintf(buf,"%f",((ofxOscArgFloat*)args[index])->get() ); andrew@0: fprintf(stderr, "ofxOscMessage:getArgAsString: warning: converting float to string for argument %i\n", index ); andrew@0: return buf; andrew@0: } andrew@0: else if ( getArgType( index ) == OFXOSC_TYPE_INT32 ) andrew@0: { andrew@0: char buf[1024]; andrew@0: sprintf(buf,"%i",((ofxOscArgInt32*)args[index])->get() ); andrew@0: fprintf(stderr, "ofxOscMessage:getArgAsString: warning: converting int32 to string for argument %i\n", index ); andrew@0: return buf; andrew@0: } andrew@0: else andrew@0: { andrew@0: fprintf(stderr, "ofxOscMessage:getArgAsString: error: argument %i is not a string\n", index ); andrew@0: return ""; andrew@0: } andrew@0: } andrew@0: else andrew@0: return ((ofxOscArgString*)args[index])->get(); andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: /* andrew@0: andrew@0: set methods andrew@0: andrew@0: */ andrew@0: andrew@0: andrew@0: void ofxOscMessage::addIntArg( int32_t argument ) andrew@0: { andrew@0: andrew@0: args.push_back( new ofxOscArgInt32( argument ) ); andrew@0: } andrew@0: andrew@0: void ofxOscMessage::addFloatArg( float argument ) andrew@0: { andrew@0: args.push_back( new ofxOscArgFloat( argument ) ); andrew@0: } andrew@0: andrew@0: void ofxOscMessage::addStringArg( string argument ) andrew@0: { andrew@0: args.push_back( new ofxOscArgString( argument ) ); andrew@0: } andrew@0: andrew@0: andrew@0: /* andrew@0: andrew@0: housekeeping andrew@0: andrew@0: */ andrew@0: andrew@0: ofxOscMessage& ofxOscMessage::copy( const ofxOscMessage& other ) andrew@0: { andrew@0: // copy address andrew@0: address = other.address; andrew@0: andrew@0: remote_host = other.remote_host; andrew@0: remote_port = other.remote_port; andrew@0: andrew@0: // copy arguments andrew@0: for ( int i=0; i<(int)other.args.size(); ++i ) andrew@0: { andrew@0: ofxOscArgType argType = other.getArgType( i ); andrew@0: if ( argType == OFXOSC_TYPE_INT32 ) andrew@0: args.push_back( new ofxOscArgInt32( other.getArgAsInt32( i ) ) ); andrew@0: else if ( argType == OFXOSC_TYPE_FLOAT ) andrew@0: args.push_back( new ofxOscArgFloat( other.getArgAsFloat( i ) ) ); andrew@0: else if ( argType == OFXOSC_TYPE_STRING ) andrew@0: args.push_back( new ofxOscArgString( other.getArgAsString( i ) ) ); andrew@0: else andrew@0: { andrew@0: assert( false && "bad argument type" ); andrew@0: } andrew@0: } andrew@0: andrew@0: return *this; andrew@0: }