sfml3-rb 0.0.1 → 0.2.2

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.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +342 -0
  3. data/README.md +51 -14
  4. data/TODO.md +199 -0
  5. data/ext/audio/audio_enums.c +131 -0
  6. data/ext/audio/audio_enums.h +18 -0
  7. data/ext/audio/effect_processor.c +233 -0
  8. data/ext/audio/effect_processor.h +25 -0
  9. data/ext/audio/listener.c +83 -0
  10. data/ext/audio/listener.h +8 -0
  11. data/ext/audio/music.c +174 -0
  12. data/ext/audio/music.h +14 -0
  13. data/ext/audio/sound.c +139 -0
  14. data/ext/audio/sound.h +14 -0
  15. data/ext/audio/sound_buffer.c +274 -0
  16. data/ext/audio/sound_buffer.h +18 -0
  17. data/ext/audio/sound_buffer_recorder.c +109 -0
  18. data/ext/audio/sound_buffer_recorder.h +14 -0
  19. data/ext/audio/sound_recorder.c +268 -0
  20. data/ext/audio/sound_recorder.h +14 -0
  21. data/ext/audio/sound_source.h +13 -0
  22. data/ext/audio/sound_source.inc +271 -0
  23. data/ext/audio/sound_source_cone.c +138 -0
  24. data/ext/audio/sound_source_cone.h +20 -0
  25. data/ext/audio/sound_stream.c +294 -0
  26. data/ext/audio/sound_stream.h +14 -0
  27. data/ext/{exceptions.c → core/exceptions.c} +10 -8
  28. data/ext/{ext → core}/exceptions.h +3 -3
  29. data/ext/core/foreign_thread.c +149 -0
  30. data/ext/core/foreign_thread.h +31 -0
  31. data/ext/core/macros.h +8 -0
  32. data/ext/{ext → core}/sfml.h +5 -3
  33. data/ext/core/unicode.c +46 -0
  34. data/ext/core/unicode.h +25 -0
  35. data/ext/ext.c +125 -14
  36. data/ext/extconf.rb +51 -6
  37. data/ext/graphics/blend_mode.c +261 -0
  38. data/ext/graphics/blend_mode.h +18 -0
  39. data/ext/graphics/circle.c +319 -0
  40. data/ext/{ext/klass/drawable → graphics}/circle.h +3 -3
  41. data/ext/graphics/color.c +318 -0
  42. data/ext/graphics/color.h +37 -0
  43. data/ext/{drawable.c → graphics/drawable.c} +11 -11
  44. data/ext/graphics/drawable.h +10 -0
  45. data/ext/graphics/enums.c +123 -0
  46. data/ext/graphics/enums.h +20 -0
  47. data/ext/graphics/font.c +148 -0
  48. data/ext/graphics/font.h +14 -0
  49. data/ext/graphics/glyph.c +60 -0
  50. data/ext/graphics/glyph.h +14 -0
  51. data/ext/graphics/image.c +205 -0
  52. data/ext/graphics/image.h +16 -0
  53. data/ext/graphics/polygon.c +300 -0
  54. data/ext/graphics/polygon.h +10 -0
  55. data/ext/graphics/rect.c +287 -0
  56. data/ext/graphics/rect.h +30 -0
  57. data/ext/graphics/rectangle.c +302 -0
  58. data/ext/graphics/rectangle.h +10 -0
  59. data/ext/graphics/render_state.c +204 -0
  60. data/ext/graphics/render_state.h +18 -0
  61. data/ext/graphics/render_target.inc +181 -0
  62. data/ext/graphics/render_texture.c +182 -0
  63. data/ext/graphics/render_texture.h +14 -0
  64. data/ext/graphics/shader.c +540 -0
  65. data/ext/graphics/shader.h +14 -0
  66. data/ext/graphics/shape.c +311 -0
  67. data/ext/graphics/shape.h +10 -0
  68. data/ext/graphics/sprite.c +249 -0
  69. data/ext/graphics/sprite.h +10 -0
  70. data/ext/graphics/stencil_mode.c +211 -0
  71. data/ext/graphics/stencil_mode.h +18 -0
  72. data/ext/graphics/target.c +133 -0
  73. data/ext/graphics/target.h +40 -0
  74. data/ext/graphics/text.c +344 -0
  75. data/ext/graphics/text.h +10 -0
  76. data/ext/graphics/texture.c +379 -0
  77. data/ext/graphics/texture.h +16 -0
  78. data/ext/graphics/transform.c +372 -0
  79. data/ext/graphics/transform.h +35 -0
  80. data/ext/{transformable.c → graphics/transformable.c} +168 -144
  81. data/ext/{ext/klass → graphics}/transformable.h +3 -3
  82. data/ext/graphics/vertex.c +179 -0
  83. data/ext/graphics/vertex.h +23 -0
  84. data/ext/graphics/vertex_array.c +127 -0
  85. data/ext/graphics/vertex_array.h +10 -0
  86. data/ext/graphics/vertex_buffer.c +211 -0
  87. data/ext/graphics/vertex_buffer.h +14 -0
  88. data/ext/{view.c → graphics/view.c} +168 -169
  89. data/ext/{ext/klass → graphics}/view.h +3 -3
  90. data/ext/network/ftp.c +405 -0
  91. data/ext/network/ftp.h +20 -0
  92. data/ext/network/http.c +243 -0
  93. data/ext/network/http.h +18 -0
  94. data/ext/network/ip_address.c +164 -0
  95. data/ext/network/ip_address.h +20 -0
  96. data/ext/network/network_enums.c +298 -0
  97. data/ext/network/network_enums.h +26 -0
  98. data/ext/network/packet.c +189 -0
  99. data/ext/network/packet.h +14 -0
  100. data/ext/network/socket_selector.c +142 -0
  101. data/ext/network/socket_selector.h +14 -0
  102. data/ext/network/tcp_listener.c +115 -0
  103. data/ext/network/tcp_listener.h +14 -0
  104. data/ext/network/tcp_socket.c +199 -0
  105. data/ext/network/tcp_socket.h +17 -0
  106. data/ext/network/udp_socket.c +190 -0
  107. data/ext/network/udp_socket.h +14 -0
  108. data/ext/ports.rb +97 -21
  109. data/ext/system/buffer.c +77 -0
  110. data/ext/system/buffer.h +14 -0
  111. data/ext/system/clock.c +100 -0
  112. data/ext/{ext/klass → system}/clock.h +3 -3
  113. data/ext/system/input_stream.c +229 -0
  114. data/ext/system/input_stream.h +23 -0
  115. data/ext/system/sleep.c +16 -0
  116. data/ext/system/sleep.h +8 -0
  117. data/ext/system/time.c +218 -0
  118. data/ext/system/time.h +18 -0
  119. data/ext/system/vec2.c +251 -0
  120. data/ext/system/vec2.h +55 -0
  121. data/ext/system/vec3.c +219 -0
  122. data/ext/system/vec3.h +18 -0
  123. data/ext/window/clipboard.c +89 -0
  124. data/ext/window/clipboard.h +8 -0
  125. data/ext/window/context.c +70 -0
  126. data/ext/window/context.h +8 -0
  127. data/ext/window/context_settings.c +220 -0
  128. data/ext/window/context_settings.h +18 -0
  129. data/ext/window/cursor.c +56 -0
  130. data/ext/window/cursor.h +14 -0
  131. data/ext/window/event.c +216 -0
  132. data/ext/window/event.h +14 -0
  133. data/ext/{event_name.c → window/event_name.c} +2 -2
  134. data/ext/window/event_name.h +8 -0
  135. data/ext/window/input_enums.c +261 -0
  136. data/ext/window/input_enums.h +36 -0
  137. data/ext/window/joystick.c +60 -0
  138. data/ext/window/joystick.h +8 -0
  139. data/ext/{keyboard.c → window/keyboard.c} +74 -2
  140. data/ext/window/keyboard.h +12 -0
  141. data/ext/window/mouse.c +70 -0
  142. data/ext/window/mouse.h +8 -0
  143. data/ext/window/sensor.c +30 -0
  144. data/ext/window/sensor.h +8 -0
  145. data/ext/window/touch.c +49 -0
  146. data/ext/window/touch.h +8 -0
  147. data/ext/window/video_mode.c +133 -0
  148. data/ext/window/video_mode.h +14 -0
  149. data/ext/window/vulkan.c +44 -0
  150. data/ext/window/vulkan.h +8 -0
  151. data/ext/window/window.c +414 -0
  152. data/ext/{ext/klass → window}/window.h +3 -3
  153. data/lib/sfml/version.rb +4 -2
  154. data/lib/sfml.rb +2 -0
  155. metadata +163 -56
  156. data/ext/circle.c +0 -198
  157. data/ext/clock.c +0 -65
  158. data/ext/color.c +0 -43
  159. data/ext/event.c +0 -148
  160. data/ext/ext/klass/color.h +0 -26
  161. data/ext/ext/klass/drawable/image.h +0 -4
  162. data/ext/ext/klass/drawable/polygon.h +0 -4
  163. data/ext/ext/klass/drawable/rectangle.h +0 -4
  164. data/ext/ext/klass/drawable/sprite.h +0 -4
  165. data/ext/ext/klass/drawable/texture.h +0 -4
  166. data/ext/ext/klass/event/event_name.h +0 -8
  167. data/ext/ext/klass/event.h +0 -12
  168. data/ext/ext/klass/keyboard.h +0 -8
  169. data/ext/ext/klass/render_state.h +0 -16
  170. data/ext/ext/klass/target.h +0 -18
  171. data/ext/ext/klass/transform.h +0 -17
  172. data/ext/ext/klass/video_mode.h +0 -12
  173. data/ext/ext/module/drawable/drawable.h +0 -10
  174. data/ext/ext/module/transform.h +0 -18
  175. data/ext/ext/module.h +0 -10
  176. data/ext/ext/rect.h +0 -16
  177. data/ext/ext/style_name.h +0 -11
  178. data/ext/ext/vec2.h +0 -38
  179. data/ext/image.c +0 -5
  180. data/ext/polygon.c +0 -5
  181. data/ext/rect.c +0 -26
  182. data/ext/rectangle.c +0 -5
  183. data/ext/render_state.c +0 -109
  184. data/ext/sprite.c +0 -5
  185. data/ext/style_name.c +0 -15
  186. data/ext/target.c +0 -106
  187. data/ext/texture.c +0 -5
  188. data/ext/transform.c +0 -107
  189. data/ext/vec2.c +0 -42
  190. data/ext/video_mode.c +0 -78
  191. data/ext/window.c +0 -274
@@ -0,0 +1,189 @@
1
+ #include "network/packet.h"
2
+
3
+ #include <ruby.h>
4
+ #include <stdint.h>
5
+ #include <stdlib.h>
6
+
7
+ #include "core/exceptions.h"
8
+ #include "core/macros.h"
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
+ typedef struct {
16
+ sfPacket *packet;
17
+ } Packet;
18
+
19
+ static VALUE rb_cPacket;
20
+
21
+ static void Packet_free(void *ptr) {
22
+ Packet *packet = ptr;
23
+
24
+ sfPacket_destroy(packet->packet);
25
+ free(packet);
26
+ }
27
+
28
+ static const rb_data_type_t Packet_data_type = {
29
+ .wrap_struct_name = "SFML::Packet",
30
+ .function = {.dmark = NULL, .dfree = Packet_free, .dsize = NULL},
31
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
32
+ };
33
+
34
+ static VALUE Packet_wrap(VALUE klass, sfPacket *packet) {
35
+ Packet *ptr;
36
+
37
+ if (packet == NULL) {
38
+ rb_raise(rb_eRuntimeError, "failed to create packet");
39
+ }
40
+
41
+ ptr = malloc(sizeof(Packet));
42
+ ptr->packet = packet;
43
+
44
+ return TypedData_Wrap_Struct(klass, &Packet_data_type, ptr);
45
+ }
46
+
47
+ static VALUE Packet_new(VALUE klass) {
48
+ return Packet_wrap(klass, sfPacket_create());
49
+ }
50
+
51
+ static VALUE Packet_copy(VALUE self) {
52
+ return Packet_wrap(Get_Klass_Packet(), sfPacket_copy(Get_Packet_Struct(self)));
53
+ }
54
+
55
+ static VALUE Packet_append(VALUE self, VALUE rb_data) {
56
+ StringValue(rb_data);
57
+
58
+ sfPacket_append(Get_Packet_Struct(self), RSTRING_PTR(rb_data), (size_t) RSTRING_LEN(rb_data));
59
+
60
+ return self;
61
+ }
62
+
63
+ static VALUE Packet_clear(VALUE self) {
64
+ sfPacket_clear(Get_Packet_Struct(self));
65
+ return self;
66
+ }
67
+
68
+ static VALUE Packet_data(VALUE self) {
69
+ const void *data = sfPacket_getData(Get_Packet_Struct(self));
70
+
71
+ return rb_str_new((const char *) data, (long) sfPacket_getDataSize(Get_Packet_Struct(self)));
72
+ }
73
+
74
+ static VALUE Packet_data_size(VALUE self) {
75
+ return SIZET2NUM(sfPacket_getDataSize(Get_Packet_Struct(self)));
76
+ }
77
+
78
+ static VALUE Packet_read_position(VALUE self) {
79
+ return SIZET2NUM(sfPacket_getReadPosition(Get_Packet_Struct(self)));
80
+ }
81
+
82
+ static VALUE Packet_end_of_packet(VALUE self) {
83
+ return BOOL2RB(sfPacket_endOfPacket(Get_Packet_Struct(self)));
84
+ }
85
+
86
+ static VALUE Packet_can_read(VALUE self) {
87
+ return BOOL2RB(sfPacket_canRead(Get_Packet_Struct(self)));
88
+ }
89
+
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))); \
93
+ }
94
+
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; \
99
+ }
100
+
101
+ PACKET_READER(bool, Bool, BOOL2RB)
102
+ PACKET_READER(int8, Int8, INT2NUM)
103
+ PACKET_READER(uint8, Uint8, UINT2NUM)
104
+ PACKET_READER(int16, Int16, INT2NUM)
105
+ PACKET_READER(uint16, Uint16, UINT2NUM)
106
+ PACKET_READER(int32, Int32, INT2NUM)
107
+ PACKET_READER(uint32, Uint32, UINT2NUM)
108
+ PACKET_READER(int64, Int64, LL2NUM)
109
+ PACKET_READER(uint64, Uint64, ULL2NUM)
110
+ PACKET_READER(float, Float, DBL2NUM)
111
+ PACKET_READER(double, Double, DBL2NUM)
112
+
113
+ PACKET_WRITER(bool, Bool, RTEST)
114
+ PACKET_WRITER(int8, Int8, (int8_t) NUM2INT)
115
+ PACKET_WRITER(uint8, Uint8, (uint8_t) NUM2INT)
116
+ PACKET_WRITER(int16, Int16, (int16_t) NUM2INT)
117
+ PACKET_WRITER(uint16, Uint16, (uint16_t) NUM2INT)
118
+ PACKET_WRITER(int32, Int32, (int32_t) NUM2INT)
119
+ PACKET_WRITER(uint32, Uint32, (uint32_t) NUM2UINT)
120
+ PACKET_WRITER(int64, Int64, (int64_t) NUM2LL)
121
+ PACKET_WRITER(uint64, Uint64, (uint64_t) NUM2ULL)
122
+ PACKET_WRITER(float, Float, (float) NUM2DBL)
123
+ PACKET_WRITER(double, Double, NUM2DBL)
124
+
125
+ static VALUE Packet_read_string(VALUE self) {
126
+ char buffer[PACKET_STRING_BUFFER];
127
+
128
+ buffer[0] = '\0';
129
+ sfPacket_readString(Get_Packet_Struct(self), buffer);
130
+ buffer[PACKET_STRING_BUFFER - 1] = '\0';
131
+
132
+ return rb_str_new_cstr(buffer);
133
+ }
134
+
135
+ static VALUE Packet_write_string(VALUE self, VALUE rb_value) {
136
+ sfPacket_writeString(Get_Packet_Struct(self), StringValueCStr(rb_value));
137
+ return rb_value;
138
+ }
139
+
140
+ void Init_Packet(VALUE rb_module) {
141
+ rb_cPacket = rb_define_class_under(rb_module, "Packet", rb_cObject);
142
+
143
+ rb_define_singleton_method(rb_cPacket, "new", Packet_new, 0);
144
+
145
+ rb_define_method(rb_cPacket, "copy", Packet_copy, 0);
146
+ rb_define_method(rb_cPacket, "append", Packet_append, 1);
147
+ rb_define_method(rb_cPacket, "clear", Packet_clear, 0);
148
+ rb_define_method(rb_cPacket, "data", Packet_data, 0);
149
+ rb_define_method(rb_cPacket, "data_size", Packet_data_size, 0);
150
+ rb_define_method(rb_cPacket, "read_position", Packet_read_position, 0);
151
+ rb_define_method(rb_cPacket, "end_of_packet?", Packet_end_of_packet, 0);
152
+ rb_define_method(rb_cPacket, "can_read?", Packet_can_read, 0);
153
+
154
+ rb_define_method(rb_cPacket, "read_bool", Packet_read_bool, 0);
155
+ rb_define_method(rb_cPacket, "read_int8", Packet_read_int8, 0);
156
+ rb_define_method(rb_cPacket, "read_uint8", Packet_read_uint8, 0);
157
+ rb_define_method(rb_cPacket, "read_int16", Packet_read_int16, 0);
158
+ rb_define_method(rb_cPacket, "read_uint16", Packet_read_uint16, 0);
159
+ rb_define_method(rb_cPacket, "read_int32", Packet_read_int32, 0);
160
+ rb_define_method(rb_cPacket, "read_uint32", Packet_read_uint32, 0);
161
+ rb_define_method(rb_cPacket, "read_int64", Packet_read_int64, 0);
162
+ rb_define_method(rb_cPacket, "read_uint64", Packet_read_uint64, 0);
163
+ rb_define_method(rb_cPacket, "read_float", Packet_read_float, 0);
164
+ rb_define_method(rb_cPacket, "read_double", Packet_read_double, 0);
165
+ rb_define_method(rb_cPacket, "read_string", Packet_read_string, 0);
166
+
167
+ rb_define_method(rb_cPacket, "write_bool", Packet_write_bool, 1);
168
+ rb_define_method(rb_cPacket, "write_int8", Packet_write_int8, 1);
169
+ rb_define_method(rb_cPacket, "write_uint8", Packet_write_uint8, 1);
170
+ rb_define_method(rb_cPacket, "write_int16", Packet_write_int16, 1);
171
+ rb_define_method(rb_cPacket, "write_uint16", Packet_write_uint16, 1);
172
+ rb_define_method(rb_cPacket, "write_int32", Packet_write_int32, 1);
173
+ rb_define_method(rb_cPacket, "write_uint32", Packet_write_uint32, 1);
174
+ rb_define_method(rb_cPacket, "write_int64", Packet_write_int64, 1);
175
+ rb_define_method(rb_cPacket, "write_uint64", Packet_write_uint64, 1);
176
+ rb_define_method(rb_cPacket, "write_float", Packet_write_float, 1);
177
+ rb_define_method(rb_cPacket, "write_double", Packet_write_double, 1);
178
+ rb_define_method(rb_cPacket, "write_string", Packet_write_string, 1);
179
+ }
180
+
181
+ VALUE Get_Klass_Packet(void) {
182
+ return rb_cPacket;
183
+ }
184
+
185
+ void *Get_Packet_Struct(VALUE self) {
186
+ Packet *ptr;
187
+ TypedData_Get_Struct(self, Packet, &Packet_data_type, ptr);
188
+ return ptr->packet;
189
+ }
@@ -0,0 +1,14 @@
1
+ #ifndef SFML_RB_NETWORK_PACKET_H
2
+ #define SFML_RB_NETWORK_PACKET_H
3
+
4
+ #include <ruby.h>
5
+
6
+ #include "core/sfml.h"
7
+
8
+ void Init_Packet(VALUE rb_module);
9
+
10
+ VALUE Get_Klass_Packet(void);
11
+
12
+ void *Get_Packet_Struct(VALUE self);
13
+
14
+ #endif //SFML_RB_NETWORK_PACKET_H
@@ -0,0 +1,142 @@
1
+ #include "network/socket_selector.h"
2
+
3
+ #include <ruby.h>
4
+ #include <stdlib.h>
5
+
6
+ #include "core/exceptions.h"
7
+ #include "core/macros.h"
8
+ #include "network/tcp_listener.h"
9
+ #include "network/tcp_socket.h"
10
+ #include "network/udp_socket.h"
11
+ #include "system/time.h"
12
+
13
+ typedef struct {
14
+ sfSocketSelector *handle;
15
+ } SocketSelector;
16
+
17
+ static VALUE rb_cSocketSelector;
18
+
19
+ static void SocketSelector_free(void *ptr) {
20
+ SocketSelector *selector = ptr;
21
+
22
+ sfSocketSelector_destroy(selector->handle);
23
+ free(selector);
24
+ }
25
+
26
+ static const rb_data_type_t SocketSelector_data_type = {
27
+ .wrap_struct_name = "SFML::SocketSelector",
28
+ .function = {.dmark = NULL, .dfree = SocketSelector_free, .dsize = NULL},
29
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
30
+ };
31
+
32
+ static VALUE SocketSelector_wrap(VALUE klass, sfSocketSelector *handle) {
33
+ SocketSelector *ptr;
34
+
35
+ if (handle == NULL) {
36
+ rb_raise(rb_eRuntimeError, "failed to create socket selector");
37
+ }
38
+
39
+ ptr = malloc(sizeof(SocketSelector));
40
+ ptr->handle = handle;
41
+
42
+ return TypedData_Wrap_Struct(klass, &SocketSelector_data_type, ptr);
43
+ }
44
+
45
+ static VALUE SocketSelector_new(VALUE klass) {
46
+ return SocketSelector_wrap(klass, sfSocketSelector_create());
47
+ }
48
+
49
+ static VALUE SocketSelector_copy(VALUE self) {
50
+ return SocketSelector_wrap(Get_Klass_SocketSelector(),
51
+ sfSocketSelector_copy(Get_SocketSelector_Struct(self)));
52
+ }
53
+
54
+ static VALUE SocketSelector_add(VALUE self, VALUE rb_socket) {
55
+ sfSocketSelector *selector = Get_SocketSelector_Struct(self);
56
+
57
+ if (rb_obj_is_kind_of(rb_socket, Get_Klass_TcpListener())) {
58
+ sfSocketSelector_addTcpListener(selector, Get_TcpListener_Struct(rb_socket));
59
+ } else if (rb_obj_is_kind_of(rb_socket, Get_Klass_TcpSocket())) {
60
+ sfSocketSelector_addTcpSocket(selector, Get_TcpSocket_Struct(rb_socket));
61
+ } else if (rb_obj_is_kind_of(rb_socket, Get_Klass_UdpSocket())) {
62
+ sfSocketSelector_addUdpSocket(selector, Get_UdpSocket_Struct(rb_socket));
63
+ } else {
64
+ rb_raise(rb_eTypeError, "expected an SFML::TcpListener, TcpSocket or UdpSocket");
65
+ }
66
+
67
+ return self;
68
+ }
69
+
70
+ static VALUE SocketSelector_remove(VALUE self, VALUE rb_socket) {
71
+ sfSocketSelector *selector = Get_SocketSelector_Struct(self);
72
+
73
+ if (rb_obj_is_kind_of(rb_socket, Get_Klass_TcpListener())) {
74
+ sfSocketSelector_removeTcpListener(selector, Get_TcpListener_Struct(rb_socket));
75
+ } else if (rb_obj_is_kind_of(rb_socket, Get_Klass_TcpSocket())) {
76
+ sfSocketSelector_removeTcpSocket(selector, Get_TcpSocket_Struct(rb_socket));
77
+ } else if (rb_obj_is_kind_of(rb_socket, Get_Klass_UdpSocket())) {
78
+ sfSocketSelector_removeUdpSocket(selector, Get_UdpSocket_Struct(rb_socket));
79
+ } else {
80
+ rb_raise(rb_eTypeError, "expected an SFML::TcpListener, TcpSocket or UdpSocket");
81
+ }
82
+
83
+ return self;
84
+ }
85
+
86
+ static VALUE SocketSelector_clear(VALUE self) {
87
+ sfSocketSelector_clear(Get_SocketSelector_Struct(self));
88
+ return self;
89
+ }
90
+
91
+ static VALUE SocketSelector_wait(int argc, VALUE *argv, VALUE self) {
92
+ VALUE rb_timeout;
93
+ sfTime timeout = sfTime_Zero;
94
+
95
+ rb_scan_args(argc, argv, "01", &rb_timeout);
96
+
97
+ if (!NIL_P(rb_timeout)) {
98
+ timeout = time_from_rb(rb_timeout);
99
+ }
100
+
101
+ return BOOL2RB(sfSocketSelector_wait(Get_SocketSelector_Struct(self), timeout));
102
+ }
103
+
104
+ static VALUE SocketSelector_tcp_listener_ready(VALUE self, VALUE rb_socket) {
105
+ return BOOL2RB(sfSocketSelector_isTcpListenerReady(Get_SocketSelector_Struct(self),
106
+ Get_TcpListener_Struct(rb_socket)));
107
+ }
108
+
109
+ static VALUE SocketSelector_tcp_socket_ready(VALUE self, VALUE rb_socket) {
110
+ return BOOL2RB(
111
+ sfSocketSelector_isTcpSocketReady(Get_SocketSelector_Struct(self), Get_TcpSocket_Struct(rb_socket)));
112
+ }
113
+
114
+ static VALUE SocketSelector_udp_socket_ready(VALUE self, VALUE rb_socket) {
115
+ return BOOL2RB(
116
+ sfSocketSelector_isUdpSocketReady(Get_SocketSelector_Struct(self), Get_UdpSocket_Struct(rb_socket)));
117
+ }
118
+
119
+ void Init_SocketSelector(VALUE rb_module) {
120
+ rb_cSocketSelector = rb_define_class_under(rb_module, "SocketSelector", rb_cObject);
121
+
122
+ rb_define_singleton_method(rb_cSocketSelector, "new", SocketSelector_new, 0);
123
+
124
+ rb_define_method(rb_cSocketSelector, "copy", SocketSelector_copy, 0);
125
+ rb_define_method(rb_cSocketSelector, "add", SocketSelector_add, 1);
126
+ rb_define_method(rb_cSocketSelector, "remove", SocketSelector_remove, 1);
127
+ rb_define_method(rb_cSocketSelector, "clear", SocketSelector_clear, 0);
128
+ rb_define_method(rb_cSocketSelector, "wait", SocketSelector_wait, -1);
129
+ rb_define_method(rb_cSocketSelector, "tcp_listener_ready?", SocketSelector_tcp_listener_ready, 1);
130
+ rb_define_method(rb_cSocketSelector, "tcp_socket_ready?", SocketSelector_tcp_socket_ready, 1);
131
+ rb_define_method(rb_cSocketSelector, "udp_socket_ready?", SocketSelector_udp_socket_ready, 1);
132
+ }
133
+
134
+ VALUE Get_Klass_SocketSelector(void) {
135
+ return rb_cSocketSelector;
136
+ }
137
+
138
+ void *Get_SocketSelector_Struct(VALUE self) {
139
+ SocketSelector *ptr;
140
+ TypedData_Get_Struct(self, SocketSelector, &SocketSelector_data_type, ptr);
141
+ return ptr->handle;
142
+ }
@@ -0,0 +1,14 @@
1
+ #ifndef SFML_RB_NETWORK_SOCKET_SELECTOR_H
2
+ #define SFML_RB_NETWORK_SOCKET_SELECTOR_H
3
+
4
+ #include <ruby.h>
5
+
6
+ #include "core/sfml.h"
7
+
8
+ void Init_SocketSelector(VALUE rb_module);
9
+
10
+ VALUE Get_Klass_SocketSelector(void);
11
+
12
+ void *Get_SocketSelector_Struct(VALUE self);
13
+
14
+ #endif //SFML_RB_NETWORK_SOCKET_SELECTOR_H
@@ -0,0 +1,115 @@
1
+ #include "network/tcp_listener.h"
2
+
3
+ #include <ruby.h>
4
+ #include <stdlib.h>
5
+
6
+ #include "core/macros.h"
7
+ #include "network/ip_address.h"
8
+ #include "network/network_enums.h"
9
+ #include "network/tcp_socket.h"
10
+
11
+ typedef struct {
12
+ sfTcpListener *handle;
13
+ } TcpListener;
14
+
15
+ static VALUE rb_cTcpListener;
16
+
17
+ static void TcpListener_free(void *ptr) {
18
+ TcpListener *listener = ptr;
19
+
20
+ if (listener->handle != NULL) {
21
+ sfTcpListener_destroy(listener->handle);
22
+ }
23
+
24
+ free(listener);
25
+ }
26
+
27
+ static const rb_data_type_t TcpListener_data_type = {
28
+ .wrap_struct_name = "SFML::TcpListener",
29
+ .function = {.dmark = NULL, .dfree = TcpListener_free, .dsize = NULL},
30
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
31
+ };
32
+
33
+ static VALUE TcpListener_wrap(VALUE klass, sfTcpListener *handle) {
34
+ TcpListener *ptr;
35
+
36
+ if (handle == NULL) {
37
+ rb_raise(rb_eRuntimeError, "failed to create TCP listener");
38
+ }
39
+
40
+ ptr = malloc(sizeof(TcpListener));
41
+ ptr->handle = handle;
42
+
43
+ return TypedData_Wrap_Struct(klass, &TcpListener_data_type, ptr);
44
+ }
45
+
46
+ static VALUE TcpListener_new(VALUE klass) {
47
+ return TcpListener_wrap(klass, sfTcpListener_create());
48
+ }
49
+
50
+ static VALUE TcpListener_any_port(VALUE klass) {
51
+ return UINT2NUM(sfTcpListener_anyPort());
52
+ }
53
+
54
+ static VALUE TcpListener_blocking(VALUE self) {
55
+ return BOOL2RB(sfTcpListener_isBlocking(Get_TcpListener_Struct(self)));
56
+ }
57
+
58
+ static VALUE TcpListener_set_blocking(VALUE self, VALUE rb_value) {
59
+ sfTcpListener_setBlocking(Get_TcpListener_Struct(self), RTEST(rb_value));
60
+ return rb_value;
61
+ }
62
+
63
+ static VALUE TcpListener_local_port(VALUE self) {
64
+ return UINT2NUM(sfTcpListener_getLocalPort(Get_TcpListener_Struct(self)));
65
+ }
66
+
67
+ static VALUE TcpListener_listen(int argc, VALUE *argv, VALUE self) {
68
+ VALUE rb_port, rb_address;
69
+
70
+ rb_scan_args(argc, argv, "11", &rb_port, &rb_address);
71
+
72
+ return ID2SYM(rb_intern(socket_status_name(sfTcpListener_listen(
73
+ Get_TcpListener_Struct(self), (unsigned short) NUM2INT(rb_port),
74
+ ip_address_from_rb(rb_address, sfIpAddress_Any)))));
75
+ }
76
+
77
+ static VALUE TcpListener_close(VALUE self) {
78
+ sfTcpListener_close(Get_TcpListener_Struct(self));
79
+ return self;
80
+ }
81
+
82
+ static VALUE TcpListener_accept(VALUE self) {
83
+ sfTcpSocket *socket = NULL;
84
+ sfSocketStatus status = sfTcpListener_accept(Get_TcpListener_Struct(self), &socket);
85
+ VALUE rb_result = rb_ary_new_capa(2);
86
+
87
+ rb_ary_push(rb_result, status == sfSocketDone ? tcp_socket_from_handle(socket) : Qnil);
88
+ rb_ary_push(rb_result, ID2SYM(rb_intern(socket_status_name(status))));
89
+
90
+ return rb_result;
91
+ }
92
+
93
+ void Init_TcpListener(VALUE rb_module) {
94
+ rb_cTcpListener = rb_define_class_under(rb_module, "TcpListener", rb_cObject);
95
+
96
+ rb_define_singleton_method(rb_cTcpListener, "new", TcpListener_new, 0);
97
+ rb_define_singleton_method(rb_cTcpListener, "any_port", TcpListener_any_port, 0);
98
+
99
+ rb_define_method(rb_cTcpListener, "blocking?", TcpListener_blocking, 0);
100
+ rb_define_method(rb_cTcpListener, "blocking=", TcpListener_set_blocking, 1);
101
+ rb_define_method(rb_cTcpListener, "local_port", TcpListener_local_port, 0);
102
+ rb_define_method(rb_cTcpListener, "listen", TcpListener_listen, -1);
103
+ rb_define_method(rb_cTcpListener, "close", TcpListener_close, 0);
104
+ rb_define_method(rb_cTcpListener, "accept", TcpListener_accept, 0);
105
+ }
106
+
107
+ VALUE Get_Klass_TcpListener(void) {
108
+ return rb_cTcpListener;
109
+ }
110
+
111
+ void *Get_TcpListener_Struct(VALUE self) {
112
+ TcpListener *ptr;
113
+ TypedData_Get_Struct(self, TcpListener, &TcpListener_data_type, ptr);
114
+ return ptr->handle;
115
+ }
@@ -0,0 +1,14 @@
1
+ #ifndef SFML_RB_NETWORK_TCP_LISTENER_H
2
+ #define SFML_RB_NETWORK_TCP_LISTENER_H
3
+
4
+ #include <ruby.h>
5
+
6
+ #include "core/sfml.h"
7
+
8
+ void Init_TcpListener(VALUE rb_module);
9
+
10
+ VALUE Get_Klass_TcpListener(void);
11
+
12
+ void *Get_TcpListener_Struct(VALUE self);
13
+
14
+ #endif //SFML_RB_NETWORK_TCP_LISTENER_H
@@ -0,0 +1,199 @@
1
+ #include "network/tcp_socket.h"
2
+
3
+ #include <ruby.h>
4
+ #include <stdlib.h>
5
+
6
+ #include "core/macros.h"
7
+ #include "network/ip_address.h"
8
+ #include "network/network_enums.h"
9
+ #include "network/packet.h"
10
+ #include "system/time.h"
11
+
12
+ typedef struct {
13
+ sfTcpSocket *handle;
14
+ } TcpSocket;
15
+
16
+ static VALUE rb_cTcpSocket;
17
+
18
+ static void TcpSocket_free(void *ptr) {
19
+ TcpSocket *socket = ptr;
20
+
21
+ if (socket->handle != NULL) {
22
+ sfTcpSocket_destroy(socket->handle);
23
+ }
24
+
25
+ free(socket);
26
+ }
27
+
28
+ static const rb_data_type_t TcpSocket_data_type = {
29
+ .wrap_struct_name = "SFML::TcpSocket",
30
+ .function = {.dmark = NULL, .dfree = TcpSocket_free, .dsize = NULL},
31
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
32
+ };
33
+
34
+ static VALUE TcpSocket_wrap(VALUE klass, sfTcpSocket *handle) {
35
+ TcpSocket *ptr;
36
+
37
+ if (handle == NULL) {
38
+ rb_raise(rb_eRuntimeError, "failed to create TCP socket");
39
+ }
40
+
41
+ ptr = malloc(sizeof(TcpSocket));
42
+ ptr->handle = handle;
43
+
44
+ return TypedData_Wrap_Struct(klass, &TcpSocket_data_type, ptr);
45
+ }
46
+
47
+ VALUE tcp_socket_from_handle(sfTcpSocket *socket) {
48
+ return TcpSocket_wrap(rb_cTcpSocket, socket);
49
+ }
50
+
51
+ static VALUE TcpSocket_new(VALUE klass) {
52
+ return TcpSocket_wrap(klass, sfTcpSocket_create());
53
+ }
54
+
55
+ static VALUE TcpSocket_blocking(VALUE self) {
56
+ return BOOL2RB(sfTcpSocket_isBlocking(Get_TcpSocket_Struct(self)));
57
+ }
58
+
59
+ static VALUE TcpSocket_set_blocking(VALUE self, VALUE rb_value) {
60
+ sfTcpSocket_setBlocking(Get_TcpSocket_Struct(self), RTEST(rb_value));
61
+ return rb_value;
62
+ }
63
+
64
+ static VALUE TcpSocket_local_port(VALUE self) {
65
+ return UINT2NUM(sfTcpSocket_getLocalPort(Get_TcpSocket_Struct(self)));
66
+ }
67
+
68
+ static VALUE TcpSocket_remote_address(VALUE self) {
69
+ return ip_address_to_rb(sfTcpSocket_getRemoteAddress(Get_TcpSocket_Struct(self)));
70
+ }
71
+
72
+ static VALUE TcpSocket_remote_port(VALUE self) {
73
+ return UINT2NUM(sfTcpSocket_getRemotePort(Get_TcpSocket_Struct(self)));
74
+ }
75
+
76
+ static VALUE TcpSocket_connect(int argc, VALUE *argv, VALUE self) {
77
+ VALUE rb_address, rb_port, rb_timeout;
78
+ sfTime timeout = sfTime_Zero;
79
+
80
+ rb_scan_args(argc, argv, "21", &rb_address, &rb_port, &rb_timeout);
81
+
82
+ if (!NIL_P(rb_timeout)) {
83
+ timeout = time_from_rb(rb_timeout);
84
+ }
85
+
86
+ return ID2SYM(rb_intern(socket_status_name(sfTcpSocket_connect(
87
+ Get_TcpSocket_Struct(self), ip_address_from_rb(rb_address, sfIpAddress_None),
88
+ (unsigned short) NUM2INT(rb_port), timeout))));
89
+ }
90
+
91
+ static VALUE TcpSocket_disconnect(VALUE self) {
92
+ sfTcpSocket_disconnect(Get_TcpSocket_Struct(self));
93
+ return self;
94
+ }
95
+
96
+ static VALUE TcpSocket_send(VALUE self, VALUE rb_data) {
97
+ StringValue(rb_data);
98
+
99
+ return ID2SYM(rb_intern(socket_status_name(
100
+ sfTcpSocket_send(Get_TcpSocket_Struct(self), RSTRING_PTR(rb_data),
101
+ (size_t) RSTRING_LEN(rb_data)))));
102
+ }
103
+
104
+ static VALUE TcpSocket_send_partial(VALUE self, VALUE rb_data) {
105
+ size_t sent = 0;
106
+ sfSocketStatus status;
107
+ VALUE rb_result;
108
+
109
+ StringValue(rb_data);
110
+
111
+ status = sfTcpSocket_sendPartial(Get_TcpSocket_Struct(self), RSTRING_PTR(rb_data),
112
+ (size_t) RSTRING_LEN(rb_data), &sent);
113
+
114
+ rb_result = rb_ary_new_capa(2);
115
+ rb_ary_push(rb_result, SIZET2NUM(sent));
116
+ rb_ary_push(rb_result, ID2SYM(rb_intern(socket_status_name(status))));
117
+
118
+ return rb_result;
119
+ }
120
+
121
+ /* Receive needs a maximum size up front because CSFML fills a caller buffer.
122
+ Returns [data, status], where data is empty unless the status is :done. */
123
+ static VALUE TcpSocket_receive(int argc, VALUE *argv, VALUE self) {
124
+ VALUE rb_max_length;
125
+ long max_length = 1024;
126
+ char *buffer;
127
+ size_t received = 0;
128
+ sfSocketStatus status;
129
+ VALUE rb_result;
130
+
131
+ rb_scan_args(argc, argv, "01", &rb_max_length);
132
+
133
+ if (!NIL_P(rb_max_length)) {
134
+ max_length = NUM2LONG(rb_max_length);
135
+ }
136
+
137
+ if (max_length <= 0) {
138
+ rb_raise(rb_eArgError, "maximum length must be positive");
139
+ }
140
+
141
+ buffer = malloc((size_t) max_length);
142
+
143
+ status = sfTcpSocket_receive(Get_TcpSocket_Struct(self), buffer, (size_t) max_length, &received);
144
+
145
+ rb_result = rb_ary_new_capa(2);
146
+ rb_ary_push(rb_result, rb_str_new(buffer, (long) received));
147
+ rb_ary_push(rb_result, ID2SYM(rb_intern(socket_status_name(status))));
148
+
149
+ free(buffer);
150
+
151
+ return rb_result;
152
+ }
153
+
154
+ static VALUE TcpSocket_send_packet(VALUE self, VALUE rb_packet) {
155
+ if (!rb_obj_is_kind_of(rb_packet, Get_Klass_Packet())) {
156
+ rb_raise(rb_eTypeError, "expected an SFML::Packet");
157
+ }
158
+
159
+ return ID2SYM(rb_intern(socket_status_name(
160
+ sfTcpSocket_sendPacket(Get_TcpSocket_Struct(self), Get_Packet_Struct(rb_packet)))));
161
+ }
162
+
163
+ static VALUE TcpSocket_receive_packet(VALUE self, VALUE rb_packet) {
164
+ if (!rb_obj_is_kind_of(rb_packet, Get_Klass_Packet())) {
165
+ rb_raise(rb_eTypeError, "expected an SFML::Packet");
166
+ }
167
+
168
+ return ID2SYM(rb_intern(socket_status_name(
169
+ sfTcpSocket_receivePacket(Get_TcpSocket_Struct(self), Get_Packet_Struct(rb_packet)))));
170
+ }
171
+
172
+ void Init_TcpSocket(VALUE rb_module) {
173
+ rb_cTcpSocket = rb_define_class_under(rb_module, "TcpSocket", rb_cObject);
174
+
175
+ rb_define_singleton_method(rb_cTcpSocket, "new", TcpSocket_new, 0);
176
+
177
+ rb_define_method(rb_cTcpSocket, "blocking?", TcpSocket_blocking, 0);
178
+ rb_define_method(rb_cTcpSocket, "blocking=", TcpSocket_set_blocking, 1);
179
+ rb_define_method(rb_cTcpSocket, "local_port", TcpSocket_local_port, 0);
180
+ rb_define_method(rb_cTcpSocket, "remote_address", TcpSocket_remote_address, 0);
181
+ rb_define_method(rb_cTcpSocket, "remote_port", TcpSocket_remote_port, 0);
182
+ rb_define_method(rb_cTcpSocket, "connect", TcpSocket_connect, -1);
183
+ rb_define_method(rb_cTcpSocket, "disconnect", TcpSocket_disconnect, 0);
184
+ rb_define_method(rb_cTcpSocket, "send", TcpSocket_send, 1);
185
+ rb_define_method(rb_cTcpSocket, "send_partial", TcpSocket_send_partial, 1);
186
+ rb_define_method(rb_cTcpSocket, "receive", TcpSocket_receive, -1);
187
+ rb_define_method(rb_cTcpSocket, "send_packet", TcpSocket_send_packet, 1);
188
+ rb_define_method(rb_cTcpSocket, "receive_packet", TcpSocket_receive_packet, 1);
189
+ }
190
+
191
+ VALUE Get_Klass_TcpSocket(void) {
192
+ return rb_cTcpSocket;
193
+ }
194
+
195
+ void *Get_TcpSocket_Struct(VALUE self) {
196
+ TcpSocket *ptr;
197
+ TypedData_Get_Struct(self, TcpSocket, &TcpSocket_data_type, ptr);
198
+ return ptr->handle;
199
+ }