front_idill/extern/fajran-npTuioClient/TuioClient/oscpack/osc/OscReceivedElements.cpp
author bastiena
Fri, 06 Apr 2012 10:44:54 +0200
changeset 21 e4e5f02787a1
child 28 9ccef81f02ab
permissions -rw-r--r--
Front IDILL : Added Communication extern named fajran-npTuioClient It contains the project generating a dll used as a browser plugin.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     1
/*
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     2
	oscpack -- Open Sound Control packet manipulation library
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     3
	http://www.audiomulch.com/~rossb/oscpack
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     4
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     5
	Copyright (c) 2004-2005 Ross Bencina <rossb@audiomulch.com>
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     6
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     7
	Permission is hereby granted, free of charge, to any person obtaining
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     8
	a copy of this software and associated documentation files
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
     9
	(the "Software"), to deal in the Software without restriction,
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    10
	including without limitation the rights to use, copy, modify, merge,
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    11
	publish, distribute, sublicense, and/or sell copies of the Software,
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    12
	and to permit persons to whom the Software is furnished to do so,
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    13
	subject to the following conditions:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    14
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    15
	The above copyright notice and this permission notice shall be
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    16
	included in all copies or substantial portions of the Software.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    17
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    18
	Any person wishing to distribute modifications to the Software is
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    19
	requested to send the modifications to the original developer so that
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    20
	they can be incorporated into the canonical version.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    21
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    22
	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    23
	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    24
	MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    25
	IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    26
	ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    27
	CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    28
	WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    29
*/
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    30
#include "OscReceivedElements.h"
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    31
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    32
#include <cassert>
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    33
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    34
#include "OscHostEndianness.h"
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    35
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    36
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    37
namespace osc{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    38
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    39
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    40
// return the first 4 byte boundary after the end of a str4
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    41
// be careful about calling this version if you don't know whether
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    42
// the string is terminated correctly.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    43
static inline const char* FindStr4End( const char *p )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    44
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    45
	if( p[0] == '\0' )    // special case for SuperCollider integer address pattern
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    46
		return p + 4;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    47
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    48
    p += 3;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    49
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    50
    while( *p )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    51
        p += 4;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    52
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    53
    return p + 1;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    54
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    55
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    56
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    57
// return the first 4 byte boundary after the end of a str4
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    58
// returns 0 if p == end or if the string is unterminated
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    59
static inline const char* FindStr4End( const char *p, const char *end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    60
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    61
    if( p >= end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    62
        return 0;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    63
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    64
	if( p[0] == '\0' )    // special case for SuperCollider integer address pattern
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    65
		return p + 4;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    66
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    67
    p += 3;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    68
    end -= 1;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    69
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    70
    while( p < end && *p )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    71
        p += 4;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    72
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    73
    if( *p )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    74
        return 0;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    75
    else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    76
        return p + 1;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    77
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    78
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    79
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    80
static inline unsigned long RoundUp4( unsigned long x )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    81
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    82
    unsigned long remainder = x & 0x3UL;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    83
    if( remainder )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    84
        return x + (4 - remainder);
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    85
    else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    86
        return x;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    87
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    88
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    89
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    90
static inline int32 ToInt32( const char *p )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    91
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    92
#ifdef OSC_HOST_LITTLE_ENDIAN
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    93
    union{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    94
        osc::int32 i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    95
        char c[4];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    96
    } u;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    97
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    98
    u.c[0] = p[3];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
    99
    u.c[1] = p[2];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   100
    u.c[2] = p[1];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   101
    u.c[3] = p[0];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   102
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   103
    return u.i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   104
#else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   105
	return *(int32*)p;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   106
#endif
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   107
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   108
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   109
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   110
static inline uint32 ToUInt32( const char *p )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   111
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   112
#ifdef OSC_HOST_LITTLE_ENDIAN
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   113
    union{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   114
        osc::uint32 i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   115
        char c[4];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   116
    } u;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   117
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   118
    u.c[0] = p[3];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   119
    u.c[1] = p[2];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   120
    u.c[2] = p[1];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   121
    u.c[3] = p[0];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   122
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   123
    return u.i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   124
#else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   125
	return *(uint32*)p;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   126
#endif
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   127
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   128
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   129
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   130
int64 ToInt64( const char *p )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   131
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   132
#ifdef OSC_HOST_LITTLE_ENDIAN
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   133
    union{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   134
        osc::int64 i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   135
        char c[8];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   136
    } u;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   137
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   138
    u.c[0] = p[7];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   139
    u.c[1] = p[6];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   140
    u.c[2] = p[5];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   141
    u.c[3] = p[4];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   142
    u.c[4] = p[3];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   143
    u.c[5] = p[2];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   144
    u.c[6] = p[1];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   145
    u.c[7] = p[0];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   146
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   147
    return u.i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   148
#else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   149
	return *(int64*)p;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   150
#endif
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   151
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   152
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   153
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   154
uint64 ToUInt64( const char *p )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   155
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   156
#ifdef OSC_HOST_LITTLE_ENDIAN
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   157
    union{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   158
        osc::uint64 i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   159
        char c[8];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   160
    } u;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   161
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   162
    u.c[0] = p[7];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   163
    u.c[1] = p[6];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   164
    u.c[2] = p[5];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   165
    u.c[3] = p[4];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   166
    u.c[4] = p[3];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   167
    u.c[5] = p[2];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   168
    u.c[6] = p[1];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   169
    u.c[7] = p[0];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   170
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   171
    return u.i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   172
#else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   173
	return *(uint64*)p;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   174
#endif
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   175
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   176
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   177
//------------------------------------------------------------------------------
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   178
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   179
bool ReceivedPacket::IsBundle() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   180
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   181
    return (Size() > 0 && Contents()[0] == '#');
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   182
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   183
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   184
//------------------------------------------------------------------------------
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   185
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   186
bool ReceivedBundleElement::IsBundle() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   187
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   188
    return (Size() > 0 && Contents()[0] == '#');
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   189
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   190
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   191
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   192
int32 ReceivedBundleElement::Size() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   193
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   194
    return ToUInt32( size_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   195
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   196
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   197
//------------------------------------------------------------------------------
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   198
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   199
bool ReceivedMessageArgument::AsBool() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   200
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   201
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   202
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   203
	else if( *typeTag_ == TRUE_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   204
		return true;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   205
	else if( *typeTag_ == FALSE_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   206
		return false;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   207
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   208
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   209
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   210
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   211
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   212
bool ReceivedMessageArgument::AsBoolUnchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   213
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   214
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   215
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   216
	else if( *typeTag_ == TRUE_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   217
		return true;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   218
    else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   219
	    return false;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   220
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   221
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   222
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   223
int32 ReceivedMessageArgument::AsInt32() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   224
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   225
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   226
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   227
	else if( *typeTag_ == INT32_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   228
		return AsInt32Unchecked();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   229
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   230
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   231
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   232
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   233
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   234
int32 ReceivedMessageArgument::AsInt32Unchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   235
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   236
#ifdef OSC_HOST_LITTLE_ENDIAN
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   237
    union{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   238
        osc::int32 i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   239
        char c[4];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   240
    } u;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   241
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   242
    u.c[0] = argument_[3];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   243
    u.c[1] = argument_[2];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   244
    u.c[2] = argument_[1];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   245
    u.c[3] = argument_[0];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   246
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   247
    return u.i;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   248
#else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   249
	return *(int32*)argument_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   250
#endif
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   251
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   252
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   253
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   254
float ReceivedMessageArgument::AsFloat() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   255
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   256
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   257
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   258
	else if( *typeTag_ == FLOAT_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   259
		return AsFloatUnchecked();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   260
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   261
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   262
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   263
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   264
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   265
float ReceivedMessageArgument::AsFloatUnchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   266
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   267
#ifdef OSC_HOST_LITTLE_ENDIAN
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   268
    union{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   269
        float f;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   270
        char c[4];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   271
    } u;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   272
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   273
    u.c[0] = argument_[3];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   274
    u.c[1] = argument_[2];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   275
    u.c[2] = argument_[1];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   276
    u.c[3] = argument_[0];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   277
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   278
    return u.f;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   279
#else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   280
	return *(float*)argument_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   281
#endif
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   282
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   283
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   284
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   285
char ReceivedMessageArgument::AsChar() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   286
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   287
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   288
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   289
	else if( *typeTag_ == CHAR_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   290
		return AsCharUnchecked();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   291
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   292
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   293
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   294
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   295
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   296
char ReceivedMessageArgument::AsCharUnchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   297
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   298
    return (char)ToInt32( argument_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   299
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   300
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   301
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   302
uint32 ReceivedMessageArgument::AsRgbaColor() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   303
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   304
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   305
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   306
	else if( *typeTag_ == RGBA_COLOR_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   307
		return AsRgbaColorUnchecked();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   308
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   309
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   310
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   311
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   312
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   313
uint32 ReceivedMessageArgument::AsRgbaColorUnchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   314
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   315
	return ToUInt32( argument_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   316
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   317
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   318
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   319
uint32 ReceivedMessageArgument::AsMidiMessage() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   320
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   321
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   322
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   323
	else if( *typeTag_ == MIDI_MESSAGE_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   324
		return AsMidiMessageUnchecked();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   325
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   326
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   327
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   328
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   329
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   330
uint32 ReceivedMessageArgument::AsMidiMessageUnchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   331
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   332
	return ToUInt32( argument_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   333
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   334
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   335
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   336
int64 ReceivedMessageArgument::AsInt64() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   337
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   338
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   339
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   340
	else if( *typeTag_ == INT64_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   341
		return AsInt64Unchecked();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   342
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   343
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   344
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   345
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   346
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   347
int64 ReceivedMessageArgument::AsInt64Unchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   348
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   349
    return ToInt64( argument_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   350
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   351
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   352
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   353
uint64 ReceivedMessageArgument::AsTimeTag() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   354
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   355
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   356
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   357
	else if( *typeTag_ == TIME_TAG_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   358
		return AsTimeTagUnchecked();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   359
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   360
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   361
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   362
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   363
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   364
uint64 ReceivedMessageArgument::AsTimeTagUnchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   365
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   366
    return ToUInt64( argument_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   367
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   368
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   369
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   370
double ReceivedMessageArgument::AsDouble() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   371
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   372
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   373
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   374
	else if( *typeTag_ == DOUBLE_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   375
		return AsDoubleUnchecked();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   376
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   377
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   378
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   379
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   380
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   381
double ReceivedMessageArgument::AsDoubleUnchecked() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   382
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   383
#ifdef OSC_HOST_LITTLE_ENDIAN
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   384
    union{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   385
        double d;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   386
        char c[8];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   387
    } u;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   388
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   389
    u.c[0] = argument_[7];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   390
    u.c[1] = argument_[6];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   391
    u.c[2] = argument_[5];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   392
    u.c[3] = argument_[4];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   393
    u.c[4] = argument_[3];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   394
    u.c[5] = argument_[2];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   395
    u.c[6] = argument_[1];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   396
    u.c[7] = argument_[0];
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   397
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   398
    return u.d;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   399
#else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   400
	return *(double*)argument_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   401
#endif
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   402
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   403
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   404
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   405
const char* ReceivedMessageArgument::AsString() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   406
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   407
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   408
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   409
	else if( *typeTag_ == STRING_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   410
		return argument_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   411
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   412
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   413
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   414
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   415
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   416
const char* ReceivedMessageArgument::AsSymbol() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   417
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   418
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   419
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   420
	else if( *typeTag_ == SYMBOL_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   421
		return argument_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   422
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   423
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   424
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   425
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   426
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   427
void ReceivedMessageArgument::AsBlob( const void*& data, unsigned long& size ) const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   428
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   429
    if( !typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   430
        throw MissingArgumentException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   431
	else if( *typeTag_ == BLOB_TYPE_TAG )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   432
		AsBlobUnchecked( data, size );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   433
	else
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   434
		throw WrongArgumentTypeException();
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   435
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   436
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   437
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   438
void ReceivedMessageArgument::AsBlobUnchecked( const void*& data, unsigned long& size ) const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   439
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   440
    size = ToUInt32( argument_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   441
	data = (void*)(argument_+4);
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   442
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   443
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   444
//------------------------------------------------------------------------------
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   445
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   446
void ReceivedMessageArgumentIterator::Advance()
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   447
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   448
    if( !value_.typeTag_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   449
        return;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   450
        
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   451
    switch( *value_.typeTag_++ ){
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   452
        case '\0':
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   453
            // don't advance past end
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   454
            --value_.typeTag_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   455
            break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   456
            
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   457
        case TRUE_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   458
        case FALSE_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   459
        case NIL_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   460
        case INFINITUM_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   461
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   462
            // zero length
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   463
            break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   464
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   465
        case INT32_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   466
        case FLOAT_TYPE_TAG: 					
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   467
        case CHAR_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   468
        case RGBA_COLOR_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   469
        case MIDI_MESSAGE_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   470
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   471
            value_.argument_ += 4;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   472
            break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   473
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   474
        case INT64_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   475
        case TIME_TAG_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   476
        case DOUBLE_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   477
				
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   478
            value_.argument_ += 8;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   479
            break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   480
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   481
        case STRING_TYPE_TAG: 
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   482
        case SYMBOL_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   483
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   484
            // we use the unsafe function FindStr4End(char*) here because all of
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   485
            // the arguments have already been validated in
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   486
            // ReceivedMessage::Init() below.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   487
            
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   488
            value_.argument_ = FindStr4End( value_.argument_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   489
            break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   490
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   491
        case BLOB_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   492
            {
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   493
                uint32 blobSize = ToUInt32( value_.argument_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   494
                value_.argument_ = value_.argument_ + 4 + RoundUp4( blobSize );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   495
            }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   496
            break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   497
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   498
        default:    // unknown type tag
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   499
            // don't advance
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   500
            --value_.typeTag_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   501
            break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   502
            
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   503
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   504
        //    not handled:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   505
        //    [ Indicates the beginning of an array. The tags following are for
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   506
        //        data in the Array until a close brace tag is reached.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   507
        //    ] Indicates the end of an array.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   508
    }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   509
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   510
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   511
//------------------------------------------------------------------------------
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   512
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   513
ReceivedMessage::ReceivedMessage( const ReceivedPacket& packet )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   514
    : addressPattern_( packet.Contents() )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   515
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   516
    Init( packet.Contents(), packet.Size() );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   517
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   518
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   519
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   520
ReceivedMessage::ReceivedMessage( const ReceivedBundleElement& bundleElement )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   521
    : addressPattern_( bundleElement.Contents() )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   522
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   523
    Init( bundleElement.Contents(), bundleElement.Size() );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   524
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   525
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   526
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   527
bool ReceivedMessage::AddressPatternIsUInt32() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   528
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   529
	return (addressPattern_[0] == '\0');
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   530
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   531
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   532
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   533
uint32 ReceivedMessage::AddressPatternAsUInt32() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   534
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   535
    return ToUInt32( addressPattern_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   536
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   537
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   538
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   539
void ReceivedMessage::Init( const char *message, unsigned long size )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   540
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   541
    if( size == 0 )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   542
        throw MalformedMessageException( "zero length messages not permitted" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   543
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   544
    if( (size & 0x03L) != 0 )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   545
        throw MalformedMessageException( "message size must be multiple of four" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   546
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   547
    const char *end = message + size;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   548
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   549
    typeTagsBegin_ = FindStr4End( addressPattern_, end );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   550
    if( typeTagsBegin_ == 0 ){
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   551
        // address pattern was not terminated before end
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   552
        throw MalformedMessageException( "unterminated address pattern" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   553
    }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   554
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   555
    if( typeTagsBegin_ == end ){
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   556
        // message consists of only the address pattern - no arguments or type tags.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   557
        typeTagsBegin_ = 0;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   558
        typeTagsEnd_ = 0;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   559
        arguments_ = 0;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   560
            
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   561
    }else{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   562
        if( *typeTagsBegin_ != ',' )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   563
            throw MalformedMessageException( "type tags not present" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   564
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   565
        if( *(typeTagsBegin_ + 1) == '\0' ){
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   566
            // zero length type tags
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   567
            typeTagsBegin_ = 0;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   568
            typeTagsEnd_ = 0;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   569
            arguments_ = 0;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   570
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   571
        }else{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   572
            // check that all arguments are present and well formed
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   573
                
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   574
            arguments_ = FindStr4End( typeTagsBegin_, end );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   575
            if( arguments_ == 0 ){
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   576
                throw MalformedMessageException( "type tags were not terminated before end of message" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   577
            }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   578
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   579
            ++typeTagsBegin_; // advance past initial ','
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   580
            
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   581
            const char *typeTag = typeTagsBegin_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   582
            const char *argument = arguments_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   583
                        
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   584
            do{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   585
                switch( *typeTag ){
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   586
                    case TRUE_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   587
                    case FALSE_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   588
                    case NIL_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   589
                    case INFINITUM_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   590
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   591
                        // zero length
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   592
                        break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   593
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   594
                    case INT32_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   595
                    case FLOAT_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   596
                    case CHAR_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   597
                    case RGBA_COLOR_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   598
                    case MIDI_MESSAGE_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   599
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   600
                        if( argument == end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   601
                            throw MalformedMessageException( "arguments exceed message size" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   602
                        argument += 4;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   603
                        if( argument > end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   604
                            throw MalformedMessageException( "arguments exceed message size" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   605
                        break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   606
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   607
                    case INT64_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   608
                    case TIME_TAG_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   609
                    case DOUBLE_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   610
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   611
                        if( argument == end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   612
                            throw MalformedMessageException( "arguments exceed message size" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   613
                        argument += 8;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   614
                        if( argument > end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   615
                            throw MalformedMessageException( "arguments exceed message size" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   616
                        break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   617
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   618
                    case STRING_TYPE_TAG: 
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   619
                    case SYMBOL_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   620
                    
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   621
                        if( argument == end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   622
                            throw MalformedMessageException( "arguments exceed message size" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   623
                        argument = FindStr4End( argument, end );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   624
                        if( argument == 0 )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   625
                            throw MalformedMessageException( "unterminated string argument" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   626
                        break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   627
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   628
                    case BLOB_TYPE_TAG:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   629
                        {
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   630
                            if( argument + 4 > end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   631
                                MalformedMessageException( "arguments exceed message size" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   632
                                
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   633
                            uint32 blobSize = ToUInt32( argument );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   634
                            argument = argument + 4 + RoundUp4( blobSize );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   635
                            if( argument > end )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   636
                                MalformedMessageException( "arguments exceed message size" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   637
                        }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   638
                        break;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   639
                        
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   640
                    default:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   641
                        throw MalformedMessageException( "unknown type tag" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   642
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   643
                    //    not handled:
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   644
                    //    [ Indicates the beginning of an array. The tags following are for
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   645
                    //        data in the Array until a close brace tag is reached.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   646
                    //    ] Indicates the end of an array.
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   647
                }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   648
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   649
            }while( *++typeTag != '\0' );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   650
            typeTagsEnd_ = typeTag;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   651
        }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   652
    }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   653
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   654
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   655
//------------------------------------------------------------------------------
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   656
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   657
ReceivedBundle::ReceivedBundle( const ReceivedPacket& packet )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   658
    : elementCount_( 0 )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   659
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   660
    Init( packet.Contents(), packet.Size() );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   661
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   662
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   663
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   664
ReceivedBundle::ReceivedBundle( const ReceivedBundleElement& bundleElement )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   665
    : elementCount_( 0 )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   666
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   667
    Init( bundleElement.Contents(), bundleElement.Size() );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   668
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   669
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   670
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   671
void ReceivedBundle::Init( const char *bundle, unsigned long size )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   672
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   673
    if( size < 16 )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   674
        throw MalformedBundleException( "packet too short for bundle" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   675
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   676
    if( (size & 0x03L) != 0 )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   677
        throw MalformedBundleException( "bundle size must be multiple of four" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   678
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   679
    if( bundle[0] != '#'
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   680
        || bundle[1] != 'b'
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   681
        || bundle[2] != 'u'
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   682
        || bundle[3] != 'n'
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   683
        || bundle[4] != 'd'
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   684
        || bundle[5] != 'l'
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   685
        || bundle[6] != 'e'
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   686
        || bundle[7] != '\0' )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   687
            throw MalformedBundleException( "bad bundle address pattern" );    
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   688
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   689
    end_ = bundle + size;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   690
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   691
    timeTag_ = bundle + 8;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   692
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   693
    const char *p = timeTag_ + 8;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   694
        
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   695
    while( p < end_ ){
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   696
        if( p + 4 > end_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   697
            throw MalformedBundleException( "packet too short for elementSize" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   698
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   699
        uint32 elementSize = ToUInt32( p );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   700
        if( (elementSize & 0x03L) != 0 )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   701
            throw MalformedBundleException( "bundle element size must be multiple of four" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   702
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   703
        p += 4 + elementSize;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   704
        if( p > end_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   705
            throw MalformedBundleException( "packet too short for bundle element" );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   706
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   707
        ++elementCount_;
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   708
    }
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   709
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   710
    if( p != end_ )
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   711
        throw MalformedBundleException( "bundle contents " );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   712
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   713
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   714
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   715
uint64 ReceivedBundle::TimeTag() const
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   716
{
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   717
    return ToUInt64( timeTag_ );
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   718
}
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   719
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   720
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   721
} // namespace osc
e4e5f02787a1 Front IDILL :
bastiena
parents:
diff changeset
   722