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