annotate trunk/external/oscpack/osc/OscPrintReceivedElements.cpp @ 706:f8e90b5d85fd tip

Delete CARFAC code from this repository. It has been moved to https://github.com/google/carfac Please email me with your github username to get access. I've also created a new mailing list to discuss CARFAC development: https://groups.google.com/forum/#!forum/carfac-dev
author ronw@google.com
date Thu, 18 Jul 2013 20:56:51 +0000
parents 4b37b53105a3
children
rev   line source
tomwalters@570 1 /*
tomwalters@570 2 oscpack -- Open Sound Control packet manipulation library
tomwalters@570 3 http://www.audiomulch.com/~rossb/oscpack
tomwalters@570 4
tomwalters@570 5 Copyright (c) 2004-2005 Ross Bencina <rossb@audiomulch.com>
tomwalters@570 6
tomwalters@570 7 Permission is hereby granted, free of charge, to any person obtaining
tomwalters@570 8 a copy of this software and associated documentation files
tomwalters@570 9 (the "Software"), to deal in the Software without restriction,
tomwalters@570 10 including without limitation the rights to use, copy, modify, merge,
tomwalters@570 11 publish, distribute, sublicense, and/or sell copies of the Software,
tomwalters@570 12 and to permit persons to whom the Software is furnished to do so,
tomwalters@570 13 subject to the following conditions:
tomwalters@570 14
tomwalters@570 15 The above copyright notice and this permission notice shall be
tomwalters@570 16 included in all copies or substantial portions of the Software.
tomwalters@570 17
tomwalters@570 18 Any person wishing to distribute modifications to the Software is
tomwalters@570 19 requested to send the modifications to the original developer so that
tomwalters@570 20 they can be incorporated into the canonical version.
tomwalters@570 21
tomwalters@570 22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
tomwalters@570 23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
tomwalters@570 24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
tomwalters@570 25 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
tomwalters@570 26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
tomwalters@570 27 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
tomwalters@570 28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tomwalters@570 29 */
tomwalters@570 30 #include "OscPrintReceivedElements.h"
tomwalters@570 31
tomwalters@570 32 #include <iostream>
tomwalters@570 33 #include <iomanip>
tomwalters@570 34 #include <ctime>
tomwalters@570 35
tomwalters@570 36
tomwalters@570 37 namespace osc{
tomwalters@570 38
tomwalters@570 39
tomwalters@570 40 std::ostream& operator<<( std::ostream & os,
tomwalters@570 41 const ReceivedMessageArgument& arg )
tomwalters@570 42 {
tomwalters@570 43 switch( arg.TypeTag() ){
tomwalters@570 44 case TRUE_TYPE_TAG:
tomwalters@570 45 os << "bool:true";
tomwalters@570 46 break;
tomwalters@570 47
tomwalters@570 48 case FALSE_TYPE_TAG:
tomwalters@570 49 os << "bool:false";
tomwalters@570 50 break;
tomwalters@570 51
tomwalters@570 52 case NIL_TYPE_TAG:
tomwalters@570 53 os << "(Nil)";
tomwalters@570 54 break;
tomwalters@570 55
tomwalters@570 56 case INFINITUM_TYPE_TAG:
tomwalters@570 57 os << "(Infinitum)";
tomwalters@570 58 break;
tomwalters@570 59
tomwalters@570 60 case INT32_TYPE_TAG:
tomwalters@570 61 os << "int32:" << arg.AsInt32Unchecked();
tomwalters@570 62 break;
tomwalters@570 63
tomwalters@570 64 case FLOAT_TYPE_TAG:
tomwalters@570 65 os << "float32:" << arg.AsFloatUnchecked();
tomwalters@570 66 break;
tomwalters@570 67
tomwalters@570 68 case CHAR_TYPE_TAG:
tomwalters@570 69 {
tomwalters@570 70 char s[2] = {0};
tomwalters@570 71 s[0] = arg.AsCharUnchecked();
tomwalters@570 72 os << "char:'" << s << "'";
tomwalters@570 73 }
tomwalters@570 74 break;
tomwalters@570 75
tomwalters@570 76 case RGBA_COLOR_TYPE_TAG:
tomwalters@570 77 {
tomwalters@570 78 uint32 color = arg.AsRgbaColorUnchecked();
tomwalters@570 79
tomwalters@570 80 os << "RGBA:0x"
tomwalters@570 81 << std::hex << std::setfill('0')
tomwalters@570 82 << std::setw(2) << (int)((color>>24) & 0xFF)
tomwalters@570 83 << std::setw(2) << (int)((color>>16) & 0xFF)
tomwalters@570 84 << std::setw(2) << (int)((color>>8) & 0xFF)
tomwalters@570 85 << std::setw(2) << (int)(color & 0xFF)
tomwalters@570 86 << std::setfill(' ');
tomwalters@570 87 os.unsetf(std::ios::basefield);
tomwalters@570 88 }
tomwalters@570 89 break;
tomwalters@570 90
tomwalters@570 91 case MIDI_MESSAGE_TYPE_TAG:
tomwalters@570 92 {
tomwalters@570 93 uint32 m = arg.AsMidiMessageUnchecked();
tomwalters@570 94 os << "midi (port, status, data1, data2):<<"
tomwalters@570 95 << std::hex << std::setfill('0')
tomwalters@570 96 << "0x" << std::setw(2) << (int)((m>>24) & 0xFF)
tomwalters@570 97 << " 0x" << std::setw(2) << (int)((m>>16) & 0xFF)
tomwalters@570 98 << " 0x" << std::setw(2) << (int)((m>>8) & 0xFF)
tomwalters@570 99 << " 0x" << std::setw(2) << (int)(m & 0xFF)
tomwalters@570 100 << std::setfill(' ') << ">>";
tomwalters@570 101 os.unsetf(std::ios::basefield);
tomwalters@570 102 }
tomwalters@570 103 break;
tomwalters@570 104
tomwalters@570 105 case INT64_TYPE_TAG:
tomwalters@570 106 os << "int64:" << arg.AsInt64Unchecked();
tomwalters@570 107 break;
tomwalters@570 108
tomwalters@570 109 case TIME_TAG_TYPE_TAG:
tomwalters@570 110 {
tomwalters@570 111 os << "OSC-timetag:" << arg.AsTimeTagUnchecked();
tomwalters@570 112
tomwalters@570 113 std::time_t t =
tomwalters@570 114 (unsigned long)( arg.AsTimeTagUnchecked() >> 32 );
tomwalters@570 115
tomwalters@570 116 // strip trailing newline from string returned by ctime
tomwalters@570 117 const char *timeString = std::ctime( &t );
tomwalters@570 118 size_t len = strlen( timeString );
tomwalters@570 119 char *s = new char[ len + 1 ];
tomwalters@570 120 strcpy( s, timeString );
tomwalters@570 121 if( len )
tomwalters@570 122 s[ len - 1 ] = '\0';
tomwalters@570 123
tomwalters@570 124 os << " " << s;
tomwalters@570 125 }
tomwalters@570 126 break;
tomwalters@570 127
tomwalters@570 128 case DOUBLE_TYPE_TAG:
tomwalters@570 129 os << "double:" << arg.AsDoubleUnchecked();
tomwalters@570 130 break;
tomwalters@570 131
tomwalters@570 132 case STRING_TYPE_TAG:
tomwalters@570 133 os << "OSC-string:`" << arg.AsStringUnchecked() << "'";
tomwalters@570 134 break;
tomwalters@570 135
tomwalters@570 136 case SYMBOL_TYPE_TAG:
tomwalters@570 137 os << "OSC-string (symbol):`" << arg.AsSymbolUnchecked() << "'";
tomwalters@570 138 break;
tomwalters@570 139
tomwalters@570 140 case BLOB_TYPE_TAG:
tomwalters@570 141 {
tomwalters@570 142 unsigned long size;
tomwalters@570 143 const void *data;
tomwalters@570 144 arg.AsBlobUnchecked( data, size );
tomwalters@570 145 os << "OSC-blob:<<" << std::hex << std::setfill('0');
tomwalters@570 146 unsigned char *p = (unsigned char*)data;
tomwalters@570 147 for( unsigned long i = 0; i < size; ++i ){
tomwalters@570 148 os << "0x" << std::setw(2) << int(p[i]);
tomwalters@570 149 if( i != size-1 )
tomwalters@570 150 os << ' ';
tomwalters@570 151 }
tomwalters@570 152 os.unsetf(std::ios::basefield);
tomwalters@570 153 os << ">>" << std::setfill(' ');
tomwalters@570 154 }
tomwalters@570 155 break;
tomwalters@570 156
tomwalters@570 157 default:
tomwalters@570 158 os << "unknown";
tomwalters@570 159 }
tomwalters@570 160
tomwalters@570 161 return os;
tomwalters@570 162 }
tomwalters@570 163
tomwalters@570 164
tomwalters@570 165 std::ostream& operator<<( std::ostream & os, const ReceivedMessage& m )
tomwalters@570 166 {
tomwalters@570 167
tomwalters@570 168 os << "[" << m.AddressPattern();
tomwalters@570 169 bool first = true;
tomwalters@570 170
tomwalters@570 171 for( ReceivedMessage::const_iterator i = m.ArgumentsBegin();
tomwalters@570 172 i != m.ArgumentsEnd(); ++i ){
tomwalters@570 173 if( first ){
tomwalters@570 174 os << " ";
tomwalters@570 175 first = false;
tomwalters@570 176 }else{
tomwalters@570 177 os << ", ";
tomwalters@570 178 }
tomwalters@570 179
tomwalters@570 180 os << *i;
tomwalters@570 181 }
tomwalters@570 182
tomwalters@570 183 os << "]";
tomwalters@570 184
tomwalters@570 185 return os;
tomwalters@570 186 }
tomwalters@570 187
tomwalters@570 188
tomwalters@570 189 std::ostream& operator<<( std::ostream & os, const ReceivedBundle& b )
tomwalters@570 190 {
tomwalters@570 191 static int indent = 0;
tomwalters@570 192
tomwalters@570 193 for( int j=0; j < indent; ++j )
tomwalters@570 194 os << " ";
tomwalters@570 195 os << "{ ( ";
tomwalters@570 196 if( b.TimeTag() == 1 )
tomwalters@570 197 os << "immediate";
tomwalters@570 198 else
tomwalters@570 199 os << b.TimeTag();
tomwalters@570 200 os << " )\n";
tomwalters@570 201
tomwalters@570 202 ++indent;
tomwalters@570 203
tomwalters@570 204 for( ReceivedBundle::const_iterator i = b.ElementsBegin();
tomwalters@570 205 i != b.ElementsEnd(); ++i ){
tomwalters@570 206 if( i->IsBundle() ){
tomwalters@570 207 ReceivedBundle b(*i);
tomwalters@570 208 os << b << "\n";
tomwalters@570 209 }else{
tomwalters@570 210 ReceivedMessage m(*i);
tomwalters@570 211 for( int j=0; j < indent; ++j )
tomwalters@570 212 os << " ";
tomwalters@570 213 os << m << "\n";
tomwalters@570 214 }
tomwalters@570 215 }
tomwalters@570 216
tomwalters@570 217 --indent;
tomwalters@570 218
tomwalters@570 219 for( int j=0; j < indent; ++j )
tomwalters@570 220 os << " ";
tomwalters@570 221 os << "}";
tomwalters@570 222
tomwalters@570 223 return os;
tomwalters@570 224 }
tomwalters@570 225
tomwalters@570 226
tomwalters@570 227 std::ostream& operator<<( std::ostream & os, const ReceivedPacket& p )
tomwalters@570 228 {
tomwalters@570 229 if( p.IsBundle() ){
tomwalters@570 230 ReceivedBundle b(p);
tomwalters@570 231 os << b << "\n";
tomwalters@570 232 }else{
tomwalters@570 233 ReceivedMessage m(p);
tomwalters@570 234 os << m << "\n";
tomwalters@570 235 }
tomwalters@570 236
tomwalters@570 237 return os;
tomwalters@570 238 }
tomwalters@570 239
tomwalters@570 240 } // namespace osc