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