sfml3-rb 0.2.2 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +9 -0
- data/CHANGELOG.md +67 -16
- data/README.md +123 -32
- data/TODO.md +18 -11
- data/ext/audio/audio_enums.c +58 -20
- data/ext/audio/listener.c +89 -6
- data/ext/audio/music.c +212 -5
- data/ext/audio/sound.c +218 -9
- data/ext/audio/sound_buffer.c +197 -47
- data/ext/audio/sound_buffer_recorder.c +90 -18
- data/ext/audio/sound_recorder.c +188 -58
- data/ext/audio/sound_source_cone.c +127 -33
- data/ext/audio/sound_stream.c +204 -21
- data/ext/core/exceptions.c +10 -8
- data/ext/core/unicode.c +12 -2
- data/ext/ext.c +8 -0
- data/ext/graphics/blend_mode.c +218 -60
- data/ext/graphics/circle.c +300 -16
- data/ext/graphics/color.c +253 -94
- data/ext/graphics/drawable.c +16 -4
- data/ext/graphics/font.c +144 -25
- data/ext/graphics/glyph.c +38 -8
- data/ext/graphics/image.c +205 -41
- data/ext/graphics/polygon.c +317 -30
- data/ext/graphics/rect.c +225 -60
- data/ext/graphics/rectangle.c +307 -35
- data/ext/graphics/render_state.c +124 -12
- data/ext/graphics/render_texture.c +191 -14
- data/ext/graphics/render_window.c +55 -0
- data/ext/graphics/render_window.h +10 -0
- data/ext/graphics/shader.c +289 -17
- data/ext/graphics/shape.c +265 -32
- data/ext/graphics/sprite.c +245 -30
- data/ext/graphics/stencil_mode.c +163 -46
- data/ext/graphics/target.c +121 -43
- data/ext/graphics/target.h +31 -17
- data/ext/graphics/text.c +339 -19
- data/ext/graphics/texture.c +291 -6
- data/ext/graphics/transform.c +178 -5
- data/ext/graphics/transformable.c +127 -12
- data/ext/graphics/vertex.c +98 -6
- data/ext/graphics/vertex_array.c +142 -21
- data/ext/graphics/vertex_buffer.c +154 -12
- data/ext/graphics/view.c +140 -6
- data/ext/network/ftp.c +278 -12
- data/ext/network/http.c +179 -44
- data/ext/network/ip_address.c +127 -35
- data/ext/network/network_enums.c +248 -141
- data/ext/network/packet.c +280 -41
- data/ext/network/socket_selector.c +98 -21
- data/ext/network/tcp_listener.c +82 -18
- data/ext/network/tcp_socket.c +135 -27
- data/ext/network/udp_socket.c +129 -28
- data/ext/ports.rb +7 -0
- data/ext/system/buffer.c +47 -16
- data/ext/system/clock.c +77 -12
- data/ext/system/input_stream.c +113 -51
- data/ext/system/sleep.c +10 -2
- data/ext/system/time.c +182 -40
- data/ext/system/vec2.c +166 -39
- data/ext/system/vec3.c +177 -39
- data/ext/window/clipboard.c +47 -17
- data/ext/window/context.c +66 -13
- data/ext/window/context_settings.c +132 -42
- data/ext/window/cursor.c +45 -9
- data/ext/window/event.c +164 -53
- data/ext/window/joystick.c +69 -3
- data/ext/window/keyboard.c +168 -116
- data/ext/window/mouse.c +64 -13
- data/ext/window/sensor.c +28 -2
- data/ext/window/touch.c +32 -12
- data/ext/window/video_mode.c +93 -31
- data/ext/window/vulkan.c +34 -6
- data/ext/window/window.c +228 -229
- data/ext/window/window.h +4 -4
- data/ext/window/window_base.c +251 -0
- data/ext/window/window_base.h +43 -0
- data/ext/window/window_base.inc +236 -0
- data/lib/sfml/version.rb +1 -1
- data/sig/audio/audio_enums.rbs +30 -0
- data/sig/audio/listener.rbs +16 -0
- data/sig/audio/music.rbs +56 -0
- data/sig/audio/sound.rbs +51 -0
- data/sig/audio/sound_buffer.rbs +17 -0
- data/sig/audio/sound_buffer_recorder.rbs +14 -0
- data/sig/audio/sound_recorder.rbs +17 -0
- data/sig/audio/sound_source_cone.rbs +14 -0
- data/sig/audio/sound_stream.rbs +51 -0
- data/sig/graphics/blend_mode.rbs +29 -0
- data/sig/graphics/circle.rbs +44 -0
- data/sig/graphics/color.rbs +39 -0
- data/sig/graphics/drawable.rbs +5 -0
- data/sig/graphics/font.rbs +20 -0
- data/sig/graphics/glyph.rbs +7 -0
- data/sig/graphics/image.rbs +22 -0
- data/sig/graphics/polygon.rbs +42 -0
- data/sig/graphics/rect.rbs +33 -0
- data/sig/graphics/rectangle.rbs +42 -0
- data/sig/graphics/render_state.rbs +21 -0
- data/sig/graphics/render_target.rbs +18 -0
- data/sig/graphics/render_texture.rbs +39 -0
- data/sig/graphics/render_window.rbs +7 -0
- data/sig/graphics/shader.rbs +39 -0
- data/sig/graphics/shape.rbs +38 -0
- data/sig/graphics/sprite.rbs +34 -0
- data/sig/graphics/stencil_mode.rbs +18 -0
- data/sig/graphics/target.rbs +8 -0
- data/sig/graphics/text.rbs +48 -0
- data/sig/graphics/texture.rbs +34 -0
- data/sig/graphics/transform.rbs +37 -0
- data/sig/graphics/transformable.rbs +25 -0
- data/sig/graphics/vertex.rbs +17 -0
- data/sig/graphics/vertex_array.rbs +17 -0
- data/sig/graphics/vertex_buffer.rbs +22 -0
- data/sig/graphics/view.rbs +23 -0
- data/sig/network/ftp.rbs +46 -0
- data/sig/network/http.rbs +27 -0
- data/sig/network/ip_address.rbs +22 -0
- data/sig/network/network_enums.rbs +95 -0
- data/sig/network/packet.rbs +40 -0
- data/sig/network/socket_selector.rbs +14 -0
- data/sig/network/tcp_listener.rbs +13 -0
- data/sig/network/tcp_socket.rbs +18 -0
- data/sig/network/udp_socket.rbs +17 -0
- data/sig/sfml/version.rbs +3 -0
- data/sig/system/buffer.rbs +11 -0
- data/sig/system/clock.rbs +13 -0
- data/sig/system/input_stream.rbs +7 -0
- data/sig/system/sleep.rbs +3 -0
- data/sig/system/time.rbs +28 -0
- data/sig/system/vec2.rbs +26 -0
- data/sig/system/vec3.rbs +27 -0
- data/sig/window/clipboard.rbs +8 -0
- data/sig/window/context.rbs +11 -0
- data/sig/window/context_settings.rbs +20 -0
- data/sig/window/cursor.rbs +6 -0
- data/sig/window/event.rbs +20 -0
- data/sig/window/joystick.rbs +15 -0
- data/sig/window/keyboard.rbs +10 -0
- data/sig/window/mouse.rbs +9 -0
- data/sig/window/sensor.rbs +8 -0
- data/sig/window/touch.rbs +6 -0
- data/sig/window/video_mode.rbs +16 -0
- data/sig/window/vulkan.rbs +7 -0
- data/sig/window/window.rbs +34 -0
- data/sig/window/window_base.rbs +33 -0
- metadata +76 -3
data/ext/network/packet.c
CHANGED
|
@@ -7,19 +7,14 @@
|
|
|
7
7
|
#include "core/exceptions.h"
|
|
8
8
|
#include "core/macros.h"
|
|
9
9
|
|
|
10
|
-
/* Strings are NUL-terminated on the wire and carry no length, so readString
|
|
11
|
-
has to be handed a buffer. This bounds a single read; longer strings are
|
|
12
|
-
still read correctly by CSFML, they just cannot be returned safely. */
|
|
13
|
-
#define PACKET_STRING_BUFFER 4096
|
|
14
|
-
|
|
15
10
|
typedef struct {
|
|
16
|
-
sfPacket
|
|
11
|
+
sfPacket* packet;
|
|
17
12
|
} Packet;
|
|
18
13
|
|
|
19
14
|
static VALUE rb_cPacket;
|
|
20
15
|
|
|
21
|
-
static void Packet_free(void
|
|
22
|
-
Packet
|
|
16
|
+
static void Packet_free(void* ptr) {
|
|
17
|
+
Packet* packet = ptr;
|
|
23
18
|
|
|
24
19
|
sfPacket_destroy(packet->packet);
|
|
25
20
|
free(packet);
|
|
@@ -28,11 +23,10 @@ static void Packet_free(void *ptr) {
|
|
|
28
23
|
static const rb_data_type_t Packet_data_type = {
|
|
29
24
|
.wrap_struct_name = "SFML::Packet",
|
|
30
25
|
.function = {.dmark = NULL, .dfree = Packet_free, .dsize = NULL},
|
|
31
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
32
|
-
};
|
|
26
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY};
|
|
33
27
|
|
|
34
|
-
static VALUE Packet_wrap(VALUE klass, sfPacket
|
|
35
|
-
Packet
|
|
28
|
+
static VALUE Packet_wrap(VALUE klass, sfPacket* packet) {
|
|
29
|
+
Packet* ptr;
|
|
36
30
|
|
|
37
31
|
if (packet == NULL) {
|
|
38
32
|
rb_raise(rb_eRuntimeError, "failed to create packet");
|
|
@@ -44,58 +38,121 @@ static VALUE Packet_wrap(VALUE klass, sfPacket *packet) {
|
|
|
44
38
|
return TypedData_Wrap_Struct(klass, &Packet_data_type, ptr);
|
|
45
39
|
}
|
|
46
40
|
|
|
47
|
-
static VALUE
|
|
41
|
+
static VALUE Packet_alloc(VALUE klass) {
|
|
48
42
|
return Packet_wrap(klass, sfPacket_create());
|
|
49
43
|
}
|
|
50
44
|
|
|
45
|
+
/* call-seq:
|
|
46
|
+
* Packet.new -> Packet
|
|
47
|
+
*
|
|
48
|
+
* Creates a new, empty packet.
|
|
49
|
+
*
|
|
50
|
+
* @return [Packet] a new, empty packet
|
|
51
|
+
*/
|
|
52
|
+
static VALUE Packet_initialize(VALUE self) {
|
|
53
|
+
return self;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* call-seq: copy -> Packet
|
|
57
|
+
*
|
|
58
|
+
* Returns an independent copy of the packet.
|
|
59
|
+
*
|
|
60
|
+
* @return [Packet] an independent copy with the same data and read position
|
|
61
|
+
*/
|
|
51
62
|
static VALUE Packet_copy(VALUE self) {
|
|
52
63
|
return Packet_wrap(Get_Klass_Packet(), sfPacket_copy(Get_Packet_Struct(self)));
|
|
53
64
|
}
|
|
54
65
|
|
|
66
|
+
/* call-seq:
|
|
67
|
+
* append(data) -> self
|
|
68
|
+
*
|
|
69
|
+
* Appends raw bytes to the end of the packet, growing it as needed.
|
|
70
|
+
* +data+ is any String-convertible value.
|
|
71
|
+
*
|
|
72
|
+
* @return [self]
|
|
73
|
+
*/
|
|
55
74
|
static VALUE Packet_append(VALUE self, VALUE rb_data) {
|
|
56
75
|
StringValue(rb_data);
|
|
57
76
|
|
|
58
|
-
sfPacket_append(Get_Packet_Struct(self), RSTRING_PTR(rb_data), (size_t)
|
|
77
|
+
sfPacket_append(Get_Packet_Struct(self), RSTRING_PTR(rb_data), (size_t)RSTRING_LEN(rb_data));
|
|
59
78
|
|
|
60
79
|
return self;
|
|
61
80
|
}
|
|
62
81
|
|
|
82
|
+
/* call-seq: clear -> self
|
|
83
|
+
*
|
|
84
|
+
* Empties the packet and resets its read position to zero.
|
|
85
|
+
*
|
|
86
|
+
* @return [self]
|
|
87
|
+
*/
|
|
63
88
|
static VALUE Packet_clear(VALUE self) {
|
|
64
89
|
sfPacket_clear(Get_Packet_Struct(self));
|
|
65
90
|
return self;
|
|
66
91
|
}
|
|
67
92
|
|
|
93
|
+
/* call-seq: data -> String
|
|
94
|
+
*
|
|
95
|
+
* Returns the packet's raw byte content.
|
|
96
|
+
*
|
|
97
|
+
* @return [String] the packet's raw byte content
|
|
98
|
+
*/
|
|
68
99
|
static VALUE Packet_data(VALUE self) {
|
|
69
|
-
const void
|
|
100
|
+
const void* data = sfPacket_getData(Get_Packet_Struct(self));
|
|
70
101
|
|
|
71
|
-
return rb_str_new((const char
|
|
102
|
+
return rb_str_new((const char*)data, (long)sfPacket_getDataSize(Get_Packet_Struct(self)));
|
|
72
103
|
}
|
|
73
104
|
|
|
105
|
+
/* call-seq: data_size -> Integer
|
|
106
|
+
*
|
|
107
|
+
* Returns the number of bytes held by the packet.
|
|
108
|
+
*
|
|
109
|
+
* @return [Integer] the number of bytes in the packet's data
|
|
110
|
+
*/
|
|
74
111
|
static VALUE Packet_data_size(VALUE self) {
|
|
75
112
|
return SIZET2NUM(sfPacket_getDataSize(Get_Packet_Struct(self)));
|
|
76
113
|
}
|
|
77
114
|
|
|
115
|
+
/* call-seq: read_position -> Integer
|
|
116
|
+
*
|
|
117
|
+
* Returns the current read position, in bytes.
|
|
118
|
+
*
|
|
119
|
+
* @return [Integer] the current read position, in bytes
|
|
120
|
+
*/
|
|
78
121
|
static VALUE Packet_read_position(VALUE self) {
|
|
79
122
|
return SIZET2NUM(sfPacket_getReadPosition(Get_Packet_Struct(self)));
|
|
80
123
|
}
|
|
81
124
|
|
|
125
|
+
/* call-seq: end_of_packet? -> true or false
|
|
126
|
+
*
|
|
127
|
+
* Returns +true+ once all of the packet's data has been read.
|
|
128
|
+
*
|
|
129
|
+
* @return [Boolean] whether the end of the packet has been reached, i.e.
|
|
130
|
+
* whether all the data has been read
|
|
131
|
+
*/
|
|
82
132
|
static VALUE Packet_end_of_packet(VALUE self) {
|
|
83
133
|
return BOOL2RB(sfPacket_endOfPacket(Get_Packet_Struct(self)));
|
|
84
134
|
}
|
|
85
135
|
|
|
136
|
+
/* call-seq: can_read? -> true or false
|
|
137
|
+
*
|
|
138
|
+
* Returns +true+ if the packet is still in a valid reading state.
|
|
139
|
+
*
|
|
140
|
+
* @return [Boolean] whether the packet is in a valid reading state, i.e.
|
|
141
|
+
* whether the last read operation succeeded
|
|
142
|
+
*/
|
|
86
143
|
static VALUE Packet_can_read(VALUE self) {
|
|
87
144
|
return BOOL2RB(sfPacket_canRead(Get_Packet_Struct(self)));
|
|
88
145
|
}
|
|
89
146
|
|
|
90
|
-
#define PACKET_READER(name, c_type, conv)
|
|
91
|
-
static VALUE Packet_read_##name(VALUE self) {
|
|
92
|
-
return conv(sfPacket_read##c_type(Get_Packet_Struct(self)));
|
|
147
|
+
#define PACKET_READER(name, c_type, conv) \
|
|
148
|
+
static VALUE Packet_read_##name(VALUE self) { \
|
|
149
|
+
return conv(sfPacket_read##c_type(Get_Packet_Struct(self))); \
|
|
93
150
|
}
|
|
94
151
|
|
|
95
|
-
#define PACKET_WRITER(name, c_type, num2)
|
|
96
|
-
static VALUE Packet_write_##name(VALUE self, VALUE rb_value) {
|
|
97
|
-
sfPacket_write##c_type(Get_Packet_Struct(self), num2(rb_value));
|
|
98
|
-
return rb_value;
|
|
152
|
+
#define PACKET_WRITER(name, c_type, num2) \
|
|
153
|
+
static VALUE Packet_write_##name(VALUE self, VALUE rb_value) { \
|
|
154
|
+
sfPacket_write##c_type(Get_Packet_Struct(self), num2(rb_value)); \
|
|
155
|
+
return rb_value; \
|
|
99
156
|
}
|
|
100
157
|
|
|
101
158
|
PACKET_READER(bool, Bool, BOOL2RB)
|
|
@@ -111,36 +168,75 @@ PACKET_READER(float, Float, DBL2NUM)
|
|
|
111
168
|
PACKET_READER(double, Double, DBL2NUM)
|
|
112
169
|
|
|
113
170
|
PACKET_WRITER(bool, Bool, RTEST)
|
|
114
|
-
PACKET_WRITER(int8, Int8, (int8_t)
|
|
115
|
-
PACKET_WRITER(uint8, Uint8, (uint8_t)
|
|
116
|
-
PACKET_WRITER(int16, Int16, (int16_t)
|
|
117
|
-
PACKET_WRITER(uint16, Uint16, (uint16_t)
|
|
118
|
-
PACKET_WRITER(int32, Int32, (int32_t)
|
|
119
|
-
PACKET_WRITER(uint32, Uint32, (uint32_t)
|
|
120
|
-
PACKET_WRITER(int64, Int64, (int64_t)
|
|
121
|
-
PACKET_WRITER(uint64, Uint64, (uint64_t)
|
|
122
|
-
PACKET_WRITER(float, Float, (float)
|
|
171
|
+
PACKET_WRITER(int8, Int8, (int8_t)NUM2INT)
|
|
172
|
+
PACKET_WRITER(uint8, Uint8, (uint8_t)NUM2INT)
|
|
173
|
+
PACKET_WRITER(int16, Int16, (int16_t)NUM2INT)
|
|
174
|
+
PACKET_WRITER(uint16, Uint16, (uint16_t)NUM2INT)
|
|
175
|
+
PACKET_WRITER(int32, Int32, (int32_t)NUM2INT)
|
|
176
|
+
PACKET_WRITER(uint32, Uint32, (uint32_t)NUM2UINT)
|
|
177
|
+
PACKET_WRITER(int64, Int64, (int64_t)NUM2LL)
|
|
178
|
+
PACKET_WRITER(uint64, Uint64, (uint64_t)NUM2ULL)
|
|
179
|
+
PACKET_WRITER(float, Float, (float)NUM2DBL)
|
|
123
180
|
PACKET_WRITER(double, Double, NUM2DBL)
|
|
124
181
|
|
|
182
|
+
/* Document-method: SFML::Packet#read_string
|
|
183
|
+
* call-seq: read_string -> String
|
|
184
|
+
*
|
|
185
|
+
* Reads a NUL-terminated string previously written with #write_string.
|
|
186
|
+
*
|
|
187
|
+
* @return [String]
|
|
188
|
+
*/
|
|
125
189
|
static VALUE Packet_read_string(VALUE self) {
|
|
126
|
-
|
|
190
|
+
void* packet = Get_Packet_Struct(self);
|
|
191
|
+
/* sfPacket_readString has no destination-length parameter: CSFML's C++
|
|
192
|
+
side bounds the string it extracts by the packet's own remaining
|
|
193
|
+
unread data, but then copies that (unbounded, from the caller's point
|
|
194
|
+
of view) string into whatever buffer it's given -- a fixed-size stack
|
|
195
|
+
buffer here would be a stack overflow for a packet holding a longer
|
|
196
|
+
string (e.g. one received from the network). The extracted string can
|
|
197
|
+
never exceed the packet's remaining data size, so sizing the buffer to
|
|
198
|
+
that is always sufficient. */
|
|
199
|
+
size_t remaining = sfPacket_getDataSize(packet) - sfPacket_getReadPosition(packet);
|
|
200
|
+
char* buffer = malloc(remaining + 1);
|
|
201
|
+
VALUE result;
|
|
202
|
+
|
|
203
|
+
if (buffer == NULL) {
|
|
204
|
+
rb_raise(rb_eNoMemError, "failed to allocate read buffer");
|
|
205
|
+
}
|
|
127
206
|
|
|
128
207
|
buffer[0] = '\0';
|
|
129
|
-
sfPacket_readString(
|
|
130
|
-
buffer[
|
|
208
|
+
sfPacket_readString(packet, buffer);
|
|
209
|
+
buffer[remaining] = '\0';
|
|
210
|
+
|
|
211
|
+
result = rb_str_new_cstr(buffer);
|
|
212
|
+
free(buffer);
|
|
131
213
|
|
|
132
|
-
return
|
|
214
|
+
return result;
|
|
133
215
|
}
|
|
134
216
|
|
|
217
|
+
/* call-seq:
|
|
218
|
+
* write_string(value) -> value
|
|
219
|
+
*
|
|
220
|
+
* Writes a NUL-terminated string, readable back with #read_string.
|
|
221
|
+
*
|
|
222
|
+
* @return [String] +value+
|
|
223
|
+
*/
|
|
135
224
|
static VALUE Packet_write_string(VALUE self, VALUE rb_value) {
|
|
136
225
|
sfPacket_writeString(Get_Packet_Struct(self), StringValueCStr(rb_value));
|
|
137
226
|
return rb_value;
|
|
138
227
|
}
|
|
139
228
|
|
|
140
|
-
|
|
141
|
-
|
|
229
|
+
/* Document-class: SFML::Packet
|
|
230
|
+
* A structured byte buffer for use with TcpSocket/UdpSocket, with typed
|
|
231
|
+
* sequential read/write access. Reads and writes must happen in the same
|
|
232
|
+
* order the data was written, since the packet keeps no type tags on the
|
|
233
|
+
* wire.
|
|
234
|
+
*/
|
|
235
|
+
void Init_Packet(VALUE rb_mSFML) {
|
|
236
|
+
rb_cPacket = rb_define_class_under(rb_mSFML, "Packet", rb_cObject);
|
|
237
|
+
rb_define_alloc_func(rb_cPacket, Packet_alloc);
|
|
142
238
|
|
|
143
|
-
|
|
239
|
+
rb_define_method(rb_cPacket, "initialize", Packet_initialize, 0);
|
|
144
240
|
|
|
145
241
|
rb_define_method(rb_cPacket, "copy", Packet_copy, 0);
|
|
146
242
|
rb_define_method(rb_cPacket, "append", Packet_append, 1);
|
|
@@ -151,29 +247,172 @@ void Init_Packet(VALUE rb_module) {
|
|
|
151
247
|
rb_define_method(rb_cPacket, "end_of_packet?", Packet_end_of_packet, 0);
|
|
152
248
|
rb_define_method(rb_cPacket, "can_read?", Packet_can_read, 0);
|
|
153
249
|
|
|
250
|
+
/* call-seq: read_bool -> true or false
|
|
251
|
+
*
|
|
252
|
+
* Reads a boolean from the packet.
|
|
253
|
+
*
|
|
254
|
+
* @return [Boolean]
|
|
255
|
+
*/
|
|
154
256
|
rb_define_method(rb_cPacket, "read_bool", Packet_read_bool, 0);
|
|
257
|
+
/* call-seq: read_int8 -> Integer
|
|
258
|
+
*
|
|
259
|
+
* Reads a signed 8-bit integer from the packet.
|
|
260
|
+
*
|
|
261
|
+
* @return [Integer] a signed 8-bit integer
|
|
262
|
+
*/
|
|
155
263
|
rb_define_method(rb_cPacket, "read_int8", Packet_read_int8, 0);
|
|
264
|
+
/* call-seq: read_uint8 -> Integer
|
|
265
|
+
*
|
|
266
|
+
* Reads an unsigned 8-bit integer from the packet.
|
|
267
|
+
*
|
|
268
|
+
* @return [Integer] an unsigned 8-bit integer
|
|
269
|
+
*/
|
|
156
270
|
rb_define_method(rb_cPacket, "read_uint8", Packet_read_uint8, 0);
|
|
271
|
+
/* call-seq: read_int16 -> Integer
|
|
272
|
+
*
|
|
273
|
+
* Reads a signed 16-bit integer from the packet.
|
|
274
|
+
*
|
|
275
|
+
* @return [Integer] a signed 16-bit integer
|
|
276
|
+
*/
|
|
157
277
|
rb_define_method(rb_cPacket, "read_int16", Packet_read_int16, 0);
|
|
278
|
+
/* call-seq: read_uint16 -> Integer
|
|
279
|
+
*
|
|
280
|
+
* Reads an unsigned 16-bit integer from the packet.
|
|
281
|
+
*
|
|
282
|
+
* @return [Integer] an unsigned 16-bit integer
|
|
283
|
+
*/
|
|
158
284
|
rb_define_method(rb_cPacket, "read_uint16", Packet_read_uint16, 0);
|
|
285
|
+
/* call-seq: read_int32 -> Integer
|
|
286
|
+
*
|
|
287
|
+
* Reads a signed 32-bit integer from the packet.
|
|
288
|
+
*
|
|
289
|
+
* @return [Integer] a signed 32-bit integer
|
|
290
|
+
*/
|
|
159
291
|
rb_define_method(rb_cPacket, "read_int32", Packet_read_int32, 0);
|
|
292
|
+
/* call-seq: read_uint32 -> Integer
|
|
293
|
+
*
|
|
294
|
+
* Reads an unsigned 32-bit integer from the packet.
|
|
295
|
+
*
|
|
296
|
+
* @return [Integer] an unsigned 32-bit integer
|
|
297
|
+
*/
|
|
160
298
|
rb_define_method(rb_cPacket, "read_uint32", Packet_read_uint32, 0);
|
|
299
|
+
/* call-seq: read_int64 -> Integer
|
|
300
|
+
*
|
|
301
|
+
* Reads a signed 64-bit integer from the packet.
|
|
302
|
+
*
|
|
303
|
+
* @return [Integer] a signed 64-bit integer
|
|
304
|
+
*/
|
|
161
305
|
rb_define_method(rb_cPacket, "read_int64", Packet_read_int64, 0);
|
|
306
|
+
/* call-seq: read_uint64 -> Integer
|
|
307
|
+
*
|
|
308
|
+
* Reads an unsigned 64-bit integer from the packet.
|
|
309
|
+
*
|
|
310
|
+
* @return [Integer] an unsigned 64-bit integer
|
|
311
|
+
*/
|
|
162
312
|
rb_define_method(rb_cPacket, "read_uint64", Packet_read_uint64, 0);
|
|
313
|
+
/* call-seq: read_float -> Float
|
|
314
|
+
*
|
|
315
|
+
* Reads a single-precision float from the packet.
|
|
316
|
+
*
|
|
317
|
+
* @return [Float] a single-precision float
|
|
318
|
+
*/
|
|
163
319
|
rb_define_method(rb_cPacket, "read_float", Packet_read_float, 0);
|
|
320
|
+
/* call-seq: read_double -> Float
|
|
321
|
+
*
|
|
322
|
+
* Reads a double-precision float from the packet.
|
|
323
|
+
*
|
|
324
|
+
* @return [Float] a double-precision float
|
|
325
|
+
*/
|
|
164
326
|
rb_define_method(rb_cPacket, "read_double", Packet_read_double, 0);
|
|
165
327
|
rb_define_method(rb_cPacket, "read_string", Packet_read_string, 0);
|
|
166
328
|
|
|
329
|
+
/* call-seq:
|
|
330
|
+
* write_bool(value) -> value
|
|
331
|
+
*
|
|
332
|
+
* Writes +value+ as a boolean.
|
|
333
|
+
*
|
|
334
|
+
* @return [Boolean] +value+
|
|
335
|
+
*/
|
|
167
336
|
rb_define_method(rb_cPacket, "write_bool", Packet_write_bool, 1);
|
|
337
|
+
/* call-seq:
|
|
338
|
+
* write_int8(value) -> value
|
|
339
|
+
*
|
|
340
|
+
* Writes +value+ as a signed 8-bit integer.
|
|
341
|
+
*
|
|
342
|
+
* @return [Integer] +value+
|
|
343
|
+
*/
|
|
168
344
|
rb_define_method(rb_cPacket, "write_int8", Packet_write_int8, 1);
|
|
345
|
+
/* call-seq:
|
|
346
|
+
* write_uint8(value) -> value
|
|
347
|
+
*
|
|
348
|
+
* Writes +value+ as an unsigned 8-bit integer.
|
|
349
|
+
*
|
|
350
|
+
* @return [Integer] +value+
|
|
351
|
+
*/
|
|
169
352
|
rb_define_method(rb_cPacket, "write_uint8", Packet_write_uint8, 1);
|
|
353
|
+
/* call-seq:
|
|
354
|
+
* write_int16(value) -> value
|
|
355
|
+
*
|
|
356
|
+
* Writes +value+ as a signed 16-bit integer.
|
|
357
|
+
*
|
|
358
|
+
* @return [Integer] +value+
|
|
359
|
+
*/
|
|
170
360
|
rb_define_method(rb_cPacket, "write_int16", Packet_write_int16, 1);
|
|
361
|
+
/* call-seq:
|
|
362
|
+
* write_uint16(value) -> value
|
|
363
|
+
*
|
|
364
|
+
* Writes +value+ as an unsigned 16-bit integer.
|
|
365
|
+
*
|
|
366
|
+
* @return [Integer] +value+
|
|
367
|
+
*/
|
|
171
368
|
rb_define_method(rb_cPacket, "write_uint16", Packet_write_uint16, 1);
|
|
369
|
+
/* call-seq:
|
|
370
|
+
* write_int32(value) -> value
|
|
371
|
+
*
|
|
372
|
+
* Writes +value+ as a signed 32-bit integer.
|
|
373
|
+
*
|
|
374
|
+
* @return [Integer] +value+
|
|
375
|
+
*/
|
|
172
376
|
rb_define_method(rb_cPacket, "write_int32", Packet_write_int32, 1);
|
|
377
|
+
/* call-seq:
|
|
378
|
+
* write_uint32(value) -> value
|
|
379
|
+
*
|
|
380
|
+
* Writes +value+ as an unsigned 32-bit integer.
|
|
381
|
+
*
|
|
382
|
+
* @return [Integer] +value+
|
|
383
|
+
*/
|
|
173
384
|
rb_define_method(rb_cPacket, "write_uint32", Packet_write_uint32, 1);
|
|
385
|
+
/* call-seq:
|
|
386
|
+
* write_int64(value) -> value
|
|
387
|
+
*
|
|
388
|
+
* Writes +value+ as a signed 64-bit integer.
|
|
389
|
+
*
|
|
390
|
+
* @return [Integer] +value+
|
|
391
|
+
*/
|
|
174
392
|
rb_define_method(rb_cPacket, "write_int64", Packet_write_int64, 1);
|
|
393
|
+
/* call-seq:
|
|
394
|
+
* write_uint64(value) -> value
|
|
395
|
+
*
|
|
396
|
+
* Writes +value+ as an unsigned 64-bit integer.
|
|
397
|
+
*
|
|
398
|
+
* @return [Integer] +value+
|
|
399
|
+
*/
|
|
175
400
|
rb_define_method(rb_cPacket, "write_uint64", Packet_write_uint64, 1);
|
|
401
|
+
/* call-seq:
|
|
402
|
+
* write_float(value) -> value
|
|
403
|
+
*
|
|
404
|
+
* Writes +value+ as a single-precision float.
|
|
405
|
+
*
|
|
406
|
+
* @return [Float] +value+
|
|
407
|
+
*/
|
|
176
408
|
rb_define_method(rb_cPacket, "write_float", Packet_write_float, 1);
|
|
409
|
+
/* call-seq:
|
|
410
|
+
* write_double(value) -> value
|
|
411
|
+
*
|
|
412
|
+
* Writes +value+ as a double-precision float.
|
|
413
|
+
*
|
|
414
|
+
* @return [Float] +value+
|
|
415
|
+
*/
|
|
177
416
|
rb_define_method(rb_cPacket, "write_double", Packet_write_double, 1);
|
|
178
417
|
rb_define_method(rb_cPacket, "write_string", Packet_write_string, 1);
|
|
179
418
|
}
|
|
@@ -182,8 +421,8 @@ VALUE Get_Klass_Packet(void) {
|
|
|
182
421
|
return rb_cPacket;
|
|
183
422
|
}
|
|
184
423
|
|
|
185
|
-
void
|
|
186
|
-
Packet
|
|
424
|
+
void* Get_Packet_Struct(VALUE self) {
|
|
425
|
+
Packet* ptr;
|
|
187
426
|
TypedData_Get_Struct(self, Packet, &Packet_data_type, ptr);
|
|
188
427
|
return ptr->packet;
|
|
189
428
|
}
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
#include "system/time.h"
|
|
12
12
|
|
|
13
13
|
typedef struct {
|
|
14
|
-
sfSocketSelector
|
|
14
|
+
sfSocketSelector* handle;
|
|
15
15
|
} SocketSelector;
|
|
16
16
|
|
|
17
17
|
static VALUE rb_cSocketSelector;
|
|
18
18
|
|
|
19
|
-
static void SocketSelector_free(void
|
|
20
|
-
SocketSelector
|
|
19
|
+
static void SocketSelector_free(void* ptr) {
|
|
20
|
+
SocketSelector* selector = ptr;
|
|
21
21
|
|
|
22
22
|
sfSocketSelector_destroy(selector->handle);
|
|
23
23
|
free(selector);
|
|
@@ -26,11 +26,10 @@ static void SocketSelector_free(void *ptr) {
|
|
|
26
26
|
static const rb_data_type_t SocketSelector_data_type = {
|
|
27
27
|
.wrap_struct_name = "SFML::SocketSelector",
|
|
28
28
|
.function = {.dmark = NULL, .dfree = SocketSelector_free, .dsize = NULL},
|
|
29
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
30
|
-
};
|
|
29
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY};
|
|
31
30
|
|
|
32
|
-
static VALUE SocketSelector_wrap(VALUE klass, sfSocketSelector
|
|
33
|
-
SocketSelector
|
|
31
|
+
static VALUE SocketSelector_wrap(VALUE klass, sfSocketSelector* handle) {
|
|
32
|
+
SocketSelector* ptr;
|
|
34
33
|
|
|
35
34
|
if (handle == NULL) {
|
|
36
35
|
rb_raise(rb_eRuntimeError, "failed to create socket selector");
|
|
@@ -42,17 +41,42 @@ static VALUE SocketSelector_wrap(VALUE klass, sfSocketSelector *handle) {
|
|
|
42
41
|
return TypedData_Wrap_Struct(klass, &SocketSelector_data_type, ptr);
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
static VALUE
|
|
44
|
+
static VALUE SocketSelector_alloc(VALUE klass) {
|
|
46
45
|
return SocketSelector_wrap(klass, sfSocketSelector_create());
|
|
47
46
|
}
|
|
48
47
|
|
|
48
|
+
/* call-seq:
|
|
49
|
+
* SocketSelector.new -> SocketSelector
|
|
50
|
+
*
|
|
51
|
+
* Creates a new, empty socket selector.
|
|
52
|
+
*
|
|
53
|
+
* @return [SocketSelector]
|
|
54
|
+
*/
|
|
55
|
+
static VALUE SocketSelector_initialize(VALUE self) {
|
|
56
|
+
return self;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* call-seq: copy -> SocketSelector
|
|
60
|
+
*
|
|
61
|
+
* Returns an independent copy of the selector.
|
|
62
|
+
*
|
|
63
|
+
* @return [SocketSelector] an independent copy with the same watched sockets
|
|
64
|
+
*/
|
|
49
65
|
static VALUE SocketSelector_copy(VALUE self) {
|
|
50
66
|
return SocketSelector_wrap(Get_Klass_SocketSelector(),
|
|
51
67
|
sfSocketSelector_copy(Get_SocketSelector_Struct(self)));
|
|
52
68
|
}
|
|
53
69
|
|
|
70
|
+
/* call-seq:
|
|
71
|
+
* add(socket) -> self
|
|
72
|
+
*
|
|
73
|
+
* Adds a TcpListener, TcpSocket or UdpSocket to watch for activity.
|
|
74
|
+
*
|
|
75
|
+
* @return [self]
|
|
76
|
+
* @raise [TypeError] if +socket+ is none of the above
|
|
77
|
+
*/
|
|
54
78
|
static VALUE SocketSelector_add(VALUE self, VALUE rb_socket) {
|
|
55
|
-
sfSocketSelector
|
|
79
|
+
sfSocketSelector* selector = Get_SocketSelector_Struct(self);
|
|
56
80
|
|
|
57
81
|
if (rb_obj_is_kind_of(rb_socket, Get_Klass_TcpListener())) {
|
|
58
82
|
sfSocketSelector_addTcpListener(selector, Get_TcpListener_Struct(rb_socket));
|
|
@@ -67,8 +91,16 @@ static VALUE SocketSelector_add(VALUE self, VALUE rb_socket) {
|
|
|
67
91
|
return self;
|
|
68
92
|
}
|
|
69
93
|
|
|
94
|
+
/* call-seq:
|
|
95
|
+
* remove(socket) -> self
|
|
96
|
+
*
|
|
97
|
+
* Removes a socket previously added with #add.
|
|
98
|
+
*
|
|
99
|
+
* @return [self]
|
|
100
|
+
* @raise [TypeError] if +socket+ is not a TcpListener, TcpSocket or UdpSocket
|
|
101
|
+
*/
|
|
70
102
|
static VALUE SocketSelector_remove(VALUE self, VALUE rb_socket) {
|
|
71
|
-
sfSocketSelector
|
|
103
|
+
sfSocketSelector* selector = Get_SocketSelector_Struct(self);
|
|
72
104
|
|
|
73
105
|
if (rb_obj_is_kind_of(rb_socket, Get_Klass_TcpListener())) {
|
|
74
106
|
sfSocketSelector_removeTcpListener(selector, Get_TcpListener_Struct(rb_socket));
|
|
@@ -83,12 +115,26 @@ static VALUE SocketSelector_remove(VALUE self, VALUE rb_socket) {
|
|
|
83
115
|
return self;
|
|
84
116
|
}
|
|
85
117
|
|
|
118
|
+
/* call-seq: clear -> self
|
|
119
|
+
*
|
|
120
|
+
* Removes all watched sockets.
|
|
121
|
+
*
|
|
122
|
+
* @return [self]
|
|
123
|
+
*/
|
|
86
124
|
static VALUE SocketSelector_clear(VALUE self) {
|
|
87
125
|
sfSocketSelector_clear(Get_SocketSelector_Struct(self));
|
|
88
126
|
return self;
|
|
89
127
|
}
|
|
90
128
|
|
|
91
|
-
|
|
129
|
+
/* call-seq:
|
|
130
|
+
* wait(timeout = Time.zero) -> true or false
|
|
131
|
+
*
|
|
132
|
+
* Blocks until one of the watched sockets is ready to read, or +timeout+
|
|
133
|
+
* elapses. A zero +timeout+ means wait forever.
|
|
134
|
+
*
|
|
135
|
+
* @return [Boolean] whether a socket became ready (+false+ on timeout)
|
|
136
|
+
*/
|
|
137
|
+
static VALUE SocketSelector_wait(int argc, VALUE* argv, VALUE self) {
|
|
92
138
|
VALUE rb_timeout;
|
|
93
139
|
sfTime timeout = sfTime_Zero;
|
|
94
140
|
|
|
@@ -101,32 +147,63 @@ static VALUE SocketSelector_wait(int argc, VALUE *argv, VALUE self) {
|
|
|
101
147
|
return BOOL2RB(sfSocketSelector_wait(Get_SocketSelector_Struct(self), timeout));
|
|
102
148
|
}
|
|
103
149
|
|
|
150
|
+
/* call-seq:
|
|
151
|
+
* tcp_listener_ready?(listener) -> true or false
|
|
152
|
+
*
|
|
153
|
+
* Call after #wait returns +true+ to check whether a given watched
|
|
154
|
+
* TcpListener is one of the sockets that became ready.
|
|
155
|
+
*
|
|
156
|
+
* @return [Boolean]
|
|
157
|
+
*/
|
|
104
158
|
static VALUE SocketSelector_tcp_listener_ready(VALUE self, VALUE rb_socket) {
|
|
105
159
|
return BOOL2RB(sfSocketSelector_isTcpListenerReady(Get_SocketSelector_Struct(self),
|
|
106
160
|
Get_TcpListener_Struct(rb_socket)));
|
|
107
161
|
}
|
|
108
162
|
|
|
163
|
+
/* call-seq:
|
|
164
|
+
* tcp_socket_ready?(socket) -> true or false
|
|
165
|
+
*
|
|
166
|
+
* Call after #wait returns +true+ to check whether a given watched
|
|
167
|
+
* TcpSocket is one of the sockets that became ready.
|
|
168
|
+
*
|
|
169
|
+
* @return [Boolean]
|
|
170
|
+
*/
|
|
109
171
|
static VALUE SocketSelector_tcp_socket_ready(VALUE self, VALUE rb_socket) {
|
|
110
|
-
return BOOL2RB(
|
|
111
|
-
|
|
172
|
+
return BOOL2RB(sfSocketSelector_isTcpSocketReady(Get_SocketSelector_Struct(self),
|
|
173
|
+
Get_TcpSocket_Struct(rb_socket)));
|
|
112
174
|
}
|
|
113
175
|
|
|
176
|
+
/* call-seq:
|
|
177
|
+
* udp_socket_ready?(socket) -> true or false
|
|
178
|
+
*
|
|
179
|
+
* Call after #wait returns +true+ to check whether a given watched
|
|
180
|
+
* UdpSocket is one of the sockets that became ready.
|
|
181
|
+
*
|
|
182
|
+
* @return [Boolean]
|
|
183
|
+
*/
|
|
114
184
|
static VALUE SocketSelector_udp_socket_ready(VALUE self, VALUE rb_socket) {
|
|
115
|
-
return BOOL2RB(
|
|
116
|
-
|
|
185
|
+
return BOOL2RB(sfSocketSelector_isUdpSocketReady(Get_SocketSelector_Struct(self),
|
|
186
|
+
Get_UdpSocket_Struct(rb_socket)));
|
|
117
187
|
}
|
|
118
188
|
|
|
119
|
-
|
|
120
|
-
|
|
189
|
+
/* Document-class: SFML::SocketSelector
|
|
190
|
+
* Watches a set of TcpListener, TcpSocket and UdpSocket instances and blocks
|
|
191
|
+
* until at least one of them is ready to read, so a single thread can
|
|
192
|
+
* multiplex several sockets without polling.
|
|
193
|
+
*/
|
|
194
|
+
void Init_SocketSelector(VALUE rb_mSFML) {
|
|
195
|
+
rb_cSocketSelector = rb_define_class_under(rb_mSFML, "SocketSelector", rb_cObject);
|
|
196
|
+
rb_define_alloc_func(rb_cSocketSelector, SocketSelector_alloc);
|
|
121
197
|
|
|
122
|
-
|
|
198
|
+
rb_define_method(rb_cSocketSelector, "initialize", SocketSelector_initialize, 0);
|
|
123
199
|
|
|
124
200
|
rb_define_method(rb_cSocketSelector, "copy", SocketSelector_copy, 0);
|
|
125
201
|
rb_define_method(rb_cSocketSelector, "add", SocketSelector_add, 1);
|
|
126
202
|
rb_define_method(rb_cSocketSelector, "remove", SocketSelector_remove, 1);
|
|
127
203
|
rb_define_method(rb_cSocketSelector, "clear", SocketSelector_clear, 0);
|
|
128
204
|
rb_define_method(rb_cSocketSelector, "wait", SocketSelector_wait, -1);
|
|
129
|
-
rb_define_method(rb_cSocketSelector, "tcp_listener_ready?", SocketSelector_tcp_listener_ready,
|
|
205
|
+
rb_define_method(rb_cSocketSelector, "tcp_listener_ready?", SocketSelector_tcp_listener_ready,
|
|
206
|
+
1);
|
|
130
207
|
rb_define_method(rb_cSocketSelector, "tcp_socket_ready?", SocketSelector_tcp_socket_ready, 1);
|
|
131
208
|
rb_define_method(rb_cSocketSelector, "udp_socket_ready?", SocketSelector_udp_socket_ready, 1);
|
|
132
209
|
}
|
|
@@ -135,8 +212,8 @@ VALUE Get_Klass_SocketSelector(void) {
|
|
|
135
212
|
return rb_cSocketSelector;
|
|
136
213
|
}
|
|
137
214
|
|
|
138
|
-
void
|
|
139
|
-
SocketSelector
|
|
215
|
+
void* Get_SocketSelector_Struct(VALUE self) {
|
|
216
|
+
SocketSelector* ptr;
|
|
140
217
|
TypedData_Get_Struct(self, SocketSelector, &SocketSelector_data_type, ptr);
|
|
141
218
|
return ptr->handle;
|
|
142
219
|
}
|