annotate external/oscpack/osc/OscReceivedElements.h @ 644:16dfff1de47a

Fix scons build.
author ronw@google.com
date Tue, 11 Jun 2013 15:04:55 +0000
parents 0284d2152e17
children
rev   line source
tomwalters@509 1 /*
tomwalters@509 2 oscpack -- Open Sound Control packet manipulation library
tomwalters@509 3 http://www.audiomulch.com/~rossb/oscpack
tomwalters@509 4
tomwalters@509 5 Copyright (c) 2004-2005 Ross Bencina <rossb@audiomulch.com>
tomwalters@509 6
tomwalters@509 7 Permission is hereby granted, free of charge, to any person obtaining
tomwalters@509 8 a copy of this software and associated documentation files
tomwalters@509 9 (the "Software"), to deal in the Software without restriction,
tomwalters@509 10 including without limitation the rights to use, copy, modify, merge,
tomwalters@509 11 publish, distribute, sublicense, and/or sell copies of the Software,
tomwalters@509 12 and to permit persons to whom the Software is furnished to do so,
tomwalters@509 13 subject to the following conditions:
tomwalters@509 14
tomwalters@509 15 The above copyright notice and this permission notice shall be
tomwalters@509 16 included in all copies or substantial portions of the Software.
tomwalters@509 17
tomwalters@509 18 Any person wishing to distribute modifications to the Software is
tomwalters@509 19 requested to send the modifications to the original developer so that
tomwalters@509 20 they can be incorporated into the canonical version.
tomwalters@509 21
tomwalters@509 22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
tomwalters@509 23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
tomwalters@509 24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
tomwalters@509 25 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
tomwalters@509 26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
tomwalters@509 27 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
tomwalters@509 28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tomwalters@509 29 */
tomwalters@509 30 #ifndef INCLUDED_OSCRECEIVEDELEMENTS_H
tomwalters@509 31 #define INCLUDED_OSCRECEIVEDELEMENTS_H
tomwalters@509 32
tomwalters@509 33 #include "OscTypes.h"
tomwalters@509 34 #include "OscException.h"
tomwalters@509 35
tomwalters@509 36
tomwalters@509 37 namespace osc{
tomwalters@509 38
tomwalters@509 39
tomwalters@509 40 class MalformedMessageException : public Exception{
tomwalters@509 41 public:
tomwalters@509 42 MalformedMessageException( const char *w="malformed message" )
tomwalters@509 43 : Exception( w ) {}
tomwalters@509 44 };
tomwalters@509 45
tomwalters@509 46 class MalformedBundleException : public Exception{
tomwalters@509 47 public:
tomwalters@509 48 MalformedBundleException( const char *w="malformed bundle" )
tomwalters@509 49 : Exception( w ) {}
tomwalters@509 50 };
tomwalters@509 51
tomwalters@509 52 class WrongArgumentTypeException : public Exception{
tomwalters@509 53 public:
tomwalters@509 54 WrongArgumentTypeException( const char *w="wrong argument type" )
tomwalters@509 55 : Exception( w ) {}
tomwalters@509 56 };
tomwalters@509 57
tomwalters@509 58 class MissingArgumentException : public Exception{
tomwalters@509 59 public:
tomwalters@509 60 MissingArgumentException( const char *w="missing argument" )
tomwalters@509 61 : Exception( w ) {}
tomwalters@509 62 };
tomwalters@509 63
tomwalters@509 64 class ExcessArgumentException : public Exception{
tomwalters@509 65 public:
tomwalters@509 66 ExcessArgumentException( const char *w="too many arguments" )
tomwalters@509 67 : Exception( w ) {}
tomwalters@509 68 };
tomwalters@509 69
tomwalters@509 70
tomwalters@509 71 class ReceivedPacket{
tomwalters@509 72 public:
tomwalters@509 73 ReceivedPacket( const char *contents, int32 size )
tomwalters@509 74 : contents_( contents )
tomwalters@509 75 , size_( size ) {}
tomwalters@509 76
tomwalters@509 77 bool IsMessage() const { return !IsBundle(); }
tomwalters@509 78 bool IsBundle() const;
tomwalters@509 79
tomwalters@509 80 int32 Size() const { return size_; }
tomwalters@509 81 const char *Contents() const { return contents_; }
tomwalters@509 82
tomwalters@509 83 private:
tomwalters@509 84 const char *contents_;
tomwalters@509 85 int32 size_;
tomwalters@509 86 };
tomwalters@509 87
tomwalters@509 88
tomwalters@509 89 class ReceivedBundleElement{
tomwalters@509 90 public:
tomwalters@509 91 ReceivedBundleElement( const char *size )
tomwalters@509 92 : size_( size ) {}
tomwalters@509 93
tomwalters@509 94 friend class ReceivedBundleElementIterator;
tomwalters@509 95
tomwalters@509 96 bool IsMessage() const { return !IsBundle(); }
tomwalters@509 97 bool IsBundle() const;
tomwalters@509 98
tomwalters@509 99 int32 Size() const;
tomwalters@509 100 const char *Contents() const { return size_ + 4; }
tomwalters@509 101
tomwalters@509 102 private:
tomwalters@509 103 const char *size_;
tomwalters@509 104 };
tomwalters@509 105
tomwalters@509 106
tomwalters@509 107 class ReceivedBundleElementIterator{
tomwalters@509 108 public:
tomwalters@509 109 ReceivedBundleElementIterator( const char *sizePtr )
tomwalters@509 110 : value_( sizePtr ) {}
tomwalters@509 111
tomwalters@509 112 ReceivedBundleElementIterator operator++()
tomwalters@509 113 {
tomwalters@509 114 Advance();
tomwalters@509 115 return *this;
tomwalters@509 116 }
tomwalters@509 117
tomwalters@509 118 ReceivedBundleElementIterator operator++(int)
tomwalters@509 119 {
tomwalters@509 120 ReceivedBundleElementIterator old( *this );
tomwalters@509 121 Advance();
tomwalters@509 122 return old;
tomwalters@509 123 }
tomwalters@509 124
tomwalters@509 125 const ReceivedBundleElement& operator*() const { return value_; }
tomwalters@509 126
tomwalters@509 127 const ReceivedBundleElement* operator->() const { return &value_; }
tomwalters@509 128
tomwalters@509 129 friend bool operator==(const ReceivedBundleElementIterator& lhs,
tomwalters@509 130 const ReceivedBundleElementIterator& rhs );
tomwalters@509 131
tomwalters@509 132 private:
tomwalters@509 133 ReceivedBundleElement value_;
tomwalters@509 134
tomwalters@509 135 void Advance() { value_.size_ = value_.Contents() + value_.Size(); }
tomwalters@509 136
tomwalters@509 137 bool IsEqualTo( const ReceivedBundleElementIterator& rhs ) const
tomwalters@509 138 {
tomwalters@509 139 return value_.size_ == rhs.value_.size_;
tomwalters@509 140 }
tomwalters@509 141 };
tomwalters@509 142
tomwalters@509 143 inline bool operator==(const ReceivedBundleElementIterator& lhs,
tomwalters@509 144 const ReceivedBundleElementIterator& rhs )
tomwalters@509 145 {
tomwalters@509 146 return lhs.IsEqualTo( rhs );
tomwalters@509 147 }
tomwalters@509 148
tomwalters@509 149 inline bool operator!=(const ReceivedBundleElementIterator& lhs,
tomwalters@509 150 const ReceivedBundleElementIterator& rhs )
tomwalters@509 151 {
tomwalters@509 152 return !( lhs == rhs );
tomwalters@509 153 }
tomwalters@509 154
tomwalters@509 155
tomwalters@509 156 class ReceivedMessageArgument{
tomwalters@509 157 public:
tomwalters@509 158 ReceivedMessageArgument( const char *typeTag, const char *argument )
tomwalters@509 159 : typeTag_( typeTag )
tomwalters@509 160 , argument_( argument ) {}
tomwalters@509 161
tomwalters@509 162 friend class ReceivedMessageArgumentIterator;
tomwalters@509 163
tomwalters@509 164 const char TypeTag() const { return *typeTag_; }
tomwalters@509 165
tomwalters@509 166 // the unchecked methods below don't check whether the argument actually
tomwalters@509 167 // is of the specified type. they should only be used if you've already
tomwalters@509 168 // checked the type tag or the associated IsType() method.
tomwalters@509 169
tomwalters@509 170 bool IsBool() const
tomwalters@509 171 { return *typeTag_ == TRUE_TYPE_TAG || *typeTag_ == FALSE_TYPE_TAG; }
tomwalters@509 172 bool AsBool() const;
tomwalters@509 173 bool AsBoolUnchecked() const;
tomwalters@509 174
tomwalters@509 175 bool IsNil() const { return *typeTag_ == NIL_TYPE_TAG; }
tomwalters@509 176 bool IsInfinitum() const { return *typeTag_ == INFINITUM_TYPE_TAG; }
tomwalters@509 177
tomwalters@509 178 bool IsInt32() const { return *typeTag_ == INT32_TYPE_TAG; }
tomwalters@509 179 int32 AsInt32() const;
tomwalters@509 180 int32 AsInt32Unchecked() const;
tomwalters@509 181
tomwalters@509 182 bool IsFloat() const { return *typeTag_ == FLOAT_TYPE_TAG; }
tomwalters@509 183 float AsFloat() const;
tomwalters@509 184 float AsFloatUnchecked() const;
tomwalters@509 185
tomwalters@509 186 bool IsChar() const { return *typeTag_ == CHAR_TYPE_TAG; }
tomwalters@509 187 char AsChar() const;
tomwalters@509 188 char AsCharUnchecked() const;
tomwalters@509 189
tomwalters@509 190 bool IsRgbaColor() const { return *typeTag_ == RGBA_COLOR_TYPE_TAG; }
tomwalters@509 191 uint32 AsRgbaColor() const;
tomwalters@509 192 uint32 AsRgbaColorUnchecked() const;
tomwalters@509 193
tomwalters@509 194 bool IsMidiMessage() const { return *typeTag_ == MIDI_MESSAGE_TYPE_TAG; }
tomwalters@509 195 uint32 AsMidiMessage() const;
tomwalters@509 196 uint32 AsMidiMessageUnchecked() const;
tomwalters@509 197
tomwalters@509 198 bool IsInt64() const { return *typeTag_ == INT64_TYPE_TAG; }
tomwalters@509 199 int64 AsInt64() const;
tomwalters@509 200 int64 AsInt64Unchecked() const;
tomwalters@509 201
tomwalters@509 202 bool IsTimeTag() const { return *typeTag_ == TIME_TAG_TYPE_TAG; }
tomwalters@509 203 uint64 AsTimeTag() const;
tomwalters@509 204 uint64 AsTimeTagUnchecked() const;
tomwalters@509 205
tomwalters@509 206 bool IsDouble() const { return *typeTag_ == DOUBLE_TYPE_TAG; }
tomwalters@509 207 double AsDouble() const;
tomwalters@509 208 double AsDoubleUnchecked() const;
tomwalters@509 209
tomwalters@509 210 bool IsString() const { return *typeTag_ == STRING_TYPE_TAG; }
tomwalters@509 211 const char* AsString() const;
tomwalters@509 212 const char* AsStringUnchecked() const { return argument_; }
tomwalters@509 213
tomwalters@509 214 bool IsSymbol() const { return *typeTag_ == SYMBOL_TYPE_TAG; }
tomwalters@509 215 const char* AsSymbol() const;
tomwalters@509 216 const char* AsSymbolUnchecked() const { return argument_; }
tomwalters@509 217
tomwalters@509 218 bool IsBlob() const { return *typeTag_ == BLOB_TYPE_TAG; }
tomwalters@509 219 void AsBlob( const void*& data, unsigned long& size ) const;
tomwalters@509 220 void AsBlobUnchecked( const void*& data, unsigned long& size ) const;
tomwalters@509 221
tomwalters@509 222 private:
tomwalters@509 223 const char *typeTag_;
tomwalters@509 224 const char *argument_;
tomwalters@509 225 };
tomwalters@509 226
tomwalters@509 227
tomwalters@509 228 class ReceivedMessageArgumentIterator{
tomwalters@509 229 public:
tomwalters@509 230 ReceivedMessageArgumentIterator( const char *typeTags, const char *arguments )
tomwalters@509 231 : value_( typeTags, arguments ) {}
tomwalters@509 232
tomwalters@509 233 ReceivedMessageArgumentIterator operator++()
tomwalters@509 234 {
tomwalters@509 235 Advance();
tomwalters@509 236 return *this;
tomwalters@509 237 }
tomwalters@509 238
tomwalters@509 239 ReceivedMessageArgumentIterator operator++(int)
tomwalters@509 240 {
tomwalters@509 241 ReceivedMessageArgumentIterator old( *this );
tomwalters@509 242 Advance();
tomwalters@509 243 return old;
tomwalters@509 244 }
tomwalters@509 245
tomwalters@509 246 const ReceivedMessageArgument& operator*() const { return value_; }
tomwalters@509 247
tomwalters@509 248 const ReceivedMessageArgument* operator->() const { return &value_; }
tomwalters@509 249
tomwalters@509 250 friend bool operator==(const ReceivedMessageArgumentIterator& lhs,
tomwalters@509 251 const ReceivedMessageArgumentIterator& rhs );
tomwalters@509 252
tomwalters@509 253 private:
tomwalters@509 254 ReceivedMessageArgument value_;
tomwalters@509 255
tomwalters@509 256 void Advance();
tomwalters@509 257
tomwalters@509 258 bool IsEqualTo( const ReceivedMessageArgumentIterator& rhs ) const
tomwalters@509 259 {
tomwalters@509 260 return value_.typeTag_ == rhs.value_.typeTag_;
tomwalters@509 261 }
tomwalters@509 262 };
tomwalters@509 263
tomwalters@509 264 inline bool operator==(const ReceivedMessageArgumentIterator& lhs,
tomwalters@509 265 const ReceivedMessageArgumentIterator& rhs )
tomwalters@509 266 {
tomwalters@509 267 return lhs.IsEqualTo( rhs );
tomwalters@509 268 }
tomwalters@509 269
tomwalters@509 270 inline bool operator!=(const ReceivedMessageArgumentIterator& lhs,
tomwalters@509 271 const ReceivedMessageArgumentIterator& rhs )
tomwalters@509 272 {
tomwalters@509 273 return !( lhs == rhs );
tomwalters@509 274 }
tomwalters@509 275
tomwalters@509 276
tomwalters@509 277 class ReceivedMessageArgumentStream{
tomwalters@509 278 friend class ReceivedMessage;
tomwalters@509 279 ReceivedMessageArgumentStream( const ReceivedMessageArgumentIterator& begin,
tomwalters@509 280 const ReceivedMessageArgumentIterator& end )
tomwalters@509 281 : p_( begin )
tomwalters@509 282 , end_( end ) {}
tomwalters@509 283
tomwalters@509 284 ReceivedMessageArgumentIterator p_, end_;
tomwalters@509 285
tomwalters@509 286 public:
tomwalters@509 287
tomwalters@509 288 // end of stream
tomwalters@509 289 bool Eos() const { return p_ == end_; }
tomwalters@509 290
tomwalters@509 291 ReceivedMessageArgumentStream& operator>>( bool& rhs )
tomwalters@509 292 {
tomwalters@509 293 if( Eos() )
tomwalters@509 294 throw MissingArgumentException();
tomwalters@509 295
tomwalters@509 296 rhs = (*p_++).AsBool();
tomwalters@509 297 return *this;
tomwalters@509 298 }
tomwalters@509 299
tomwalters@509 300 // not sure if it would be useful to stream Nil and Infinitum
tomwalters@509 301 // for now it's not possible
tomwalters@509 302
tomwalters@509 303 ReceivedMessageArgumentStream& operator>>( int32& rhs )
tomwalters@509 304 {
tomwalters@509 305 if( Eos() )
tomwalters@509 306 throw MissingArgumentException();
tomwalters@509 307
tomwalters@509 308 rhs = (*p_++).AsInt32();
tomwalters@509 309 return *this;
tomwalters@509 310 }
tomwalters@509 311
tomwalters@509 312 ReceivedMessageArgumentStream& operator>>( float& rhs )
tomwalters@509 313 {
tomwalters@509 314 if( Eos() )
tomwalters@509 315 throw MissingArgumentException();
tomwalters@509 316
tomwalters@509 317 rhs = (*p_++).AsFloat();
tomwalters@509 318 return *this;
tomwalters@509 319 }
tomwalters@509 320
tomwalters@509 321 ReceivedMessageArgumentStream& operator>>( char& rhs )
tomwalters@509 322 {
tomwalters@509 323 if( Eos() )
tomwalters@509 324 throw MissingArgumentException();
tomwalters@509 325
tomwalters@509 326 rhs = (*p_++).AsChar();
tomwalters@509 327 return *this;
tomwalters@509 328 }
tomwalters@509 329
tomwalters@509 330 ReceivedMessageArgumentStream& operator>>( RgbaColor& rhs )
tomwalters@509 331 {
tomwalters@509 332 if( Eos() )
tomwalters@509 333 throw MissingArgumentException();
tomwalters@509 334
tomwalters@509 335 rhs.value = (*p_++).AsRgbaColor();
tomwalters@509 336 return *this;
tomwalters@509 337 }
tomwalters@509 338
tomwalters@509 339 ReceivedMessageArgumentStream& operator>>( MidiMessage& rhs )
tomwalters@509 340 {
tomwalters@509 341 if( Eos() )
tomwalters@509 342 throw MissingArgumentException();
tomwalters@509 343
tomwalters@509 344 rhs.value = (*p_++).AsMidiMessage();
tomwalters@509 345 return *this;
tomwalters@509 346 }
tomwalters@509 347
tomwalters@509 348 ReceivedMessageArgumentStream& operator>>( int64& rhs )
tomwalters@509 349 {
tomwalters@509 350 if( Eos() )
tomwalters@509 351 throw MissingArgumentException();
tomwalters@509 352
tomwalters@509 353 rhs = (*p_++).AsInt64();
tomwalters@509 354 return *this;
tomwalters@509 355 }
tomwalters@509 356
tomwalters@509 357 ReceivedMessageArgumentStream& operator>>( TimeTag& rhs )
tomwalters@509 358 {
tomwalters@509 359 if( Eos() )
tomwalters@509 360 throw MissingArgumentException();
tomwalters@509 361
tomwalters@509 362 rhs.value = (*p_++).AsTimeTag();
tomwalters@509 363 return *this;
tomwalters@509 364 }
tomwalters@509 365
tomwalters@509 366 ReceivedMessageArgumentStream& operator>>( double& rhs )
tomwalters@509 367 {
tomwalters@509 368 if( Eos() )
tomwalters@509 369 throw MissingArgumentException();
tomwalters@509 370
tomwalters@509 371 rhs = (*p_++).AsDouble();
tomwalters@509 372 return *this;
tomwalters@509 373 }
tomwalters@509 374
tomwalters@509 375 ReceivedMessageArgumentStream& operator>>( Blob& rhs )
tomwalters@509 376 {
tomwalters@509 377 if( Eos() )
tomwalters@509 378 throw MissingArgumentException();
tomwalters@509 379
tomwalters@509 380 (*p_++).AsBlob( rhs.data, rhs.size );
tomwalters@509 381 return *this;
tomwalters@509 382 }
tomwalters@509 383
tomwalters@509 384 ReceivedMessageArgumentStream& operator>>( const char*& rhs )
tomwalters@509 385 {
tomwalters@509 386 if( Eos() )
tomwalters@509 387 throw MissingArgumentException();
tomwalters@509 388
tomwalters@509 389 rhs = (*p_++).AsString();
tomwalters@509 390 return *this;
tomwalters@509 391 }
tomwalters@509 392
tomwalters@509 393 ReceivedMessageArgumentStream& operator>>( Symbol& rhs )
tomwalters@509 394 {
tomwalters@509 395 if( Eos() )
tomwalters@509 396 throw MissingArgumentException();
tomwalters@509 397
tomwalters@509 398 rhs.value = (*p_++).AsSymbol();
tomwalters@509 399 return *this;
tomwalters@509 400 }
tomwalters@509 401
tomwalters@509 402 ReceivedMessageArgumentStream& operator>>( MessageTerminator& rhs )
tomwalters@509 403 {
tomwalters@509 404 if( !Eos() )
tomwalters@509 405 throw ExcessArgumentException();
tomwalters@509 406
tomwalters@509 407 return *this;
tomwalters@509 408 }
tomwalters@509 409 };
tomwalters@509 410
tomwalters@509 411
tomwalters@509 412 class ReceivedMessage{
tomwalters@509 413 void Init( const char *bundle, unsigned long size );
tomwalters@509 414 public:
tomwalters@509 415 explicit ReceivedMessage( const ReceivedPacket& packet );
tomwalters@509 416 explicit ReceivedMessage( const ReceivedBundleElement& bundleElement );
tomwalters@509 417
tomwalters@509 418 const char *AddressPattern() const { return addressPattern_; }
tomwalters@509 419
tomwalters@509 420 // Support for non-standad SuperCollider integer address patterns:
tomwalters@509 421 bool AddressPatternIsUInt32() const;
tomwalters@509 422 uint32 AddressPatternAsUInt32() const;
tomwalters@509 423
tomwalters@509 424 unsigned long ArgumentCount() const { return static_cast<unsigned long>(typeTagsEnd_ - typeTagsBegin_); }
tomwalters@509 425
tomwalters@509 426 const char *TypeTags() const { return typeTagsBegin_; }
tomwalters@509 427
tomwalters@509 428
tomwalters@509 429 typedef ReceivedMessageArgumentIterator const_iterator;
tomwalters@509 430
tomwalters@509 431 ReceivedMessageArgumentIterator ArgumentsBegin() const
tomwalters@509 432 {
tomwalters@509 433 return ReceivedMessageArgumentIterator( typeTagsBegin_, arguments_ );
tomwalters@509 434 }
tomwalters@509 435
tomwalters@509 436 ReceivedMessageArgumentIterator ArgumentsEnd() const
tomwalters@509 437 {
tomwalters@509 438 return ReceivedMessageArgumentIterator( typeTagsEnd_, 0 );
tomwalters@509 439 }
tomwalters@509 440
tomwalters@509 441 ReceivedMessageArgumentStream ArgumentStream() const
tomwalters@509 442 {
tomwalters@509 443 return ReceivedMessageArgumentStream( ArgumentsBegin(), ArgumentsEnd() );
tomwalters@509 444 }
tomwalters@509 445
tomwalters@509 446 private:
tomwalters@509 447 const char *addressPattern_;
tomwalters@509 448 const char *typeTagsBegin_;
tomwalters@509 449 const char *typeTagsEnd_;
tomwalters@509 450 const char *arguments_;
tomwalters@509 451 };
tomwalters@509 452
tomwalters@509 453
tomwalters@509 454 class ReceivedBundle{
tomwalters@509 455 void Init( const char *message, unsigned long size );
tomwalters@509 456 public:
tomwalters@509 457 explicit ReceivedBundle( const ReceivedPacket& packet );
tomwalters@509 458 explicit ReceivedBundle( const ReceivedBundleElement& bundleElement );
tomwalters@509 459
tomwalters@509 460 uint64 TimeTag() const;
tomwalters@509 461
tomwalters@509 462 unsigned long ElementCount() const { return elementCount_; }
tomwalters@509 463
tomwalters@509 464 typedef ReceivedBundleElementIterator const_iterator;
tomwalters@509 465
tomwalters@509 466 ReceivedBundleElementIterator ElementsBegin() const
tomwalters@509 467 {
tomwalters@509 468 return ReceivedBundleElementIterator( timeTag_ + 8 );
tomwalters@509 469 }
tomwalters@509 470
tomwalters@509 471 ReceivedBundleElementIterator ElementsEnd() const
tomwalters@509 472 {
tomwalters@509 473 return ReceivedBundleElementIterator( end_ );
tomwalters@509 474 }
tomwalters@509 475
tomwalters@509 476 private:
tomwalters@509 477 const char *timeTag_;
tomwalters@509 478 const char *end_;
tomwalters@509 479 unsigned long elementCount_;
tomwalters@509 480 };
tomwalters@509 481
tomwalters@509 482
tomwalters@509 483 } // namespace osc
tomwalters@509 484
tomwalters@509 485
tomwalters@509 486 #endif /* INCLUDED_OSCRECEIVEDELEMENTS_H */