ovirt-engine-sdk 4.0.0.alpha11 → 4.0.0.alpha12
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/ext/ovirtsdk4c/ov_xml_reader.c +85 -54
- data/ext/ovirtsdk4c/ov_xml_writer.c +116 -63
- data/lib/ovirtsdk4.rb +1 -1
- data/lib/ovirtsdk4/http.rb +300 -41
- data/lib/ovirtsdk4/readers.rb +338 -4
- data/lib/ovirtsdk4/service.rb +5 -8
- data/lib/ovirtsdk4/services.rb +1386 -3336
- data/lib/ovirtsdk4/types.rb +3228 -1412
- data/lib/ovirtsdk4/version.rb +1 -1
- data/lib/ovirtsdk4/writers.rb +134 -2
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a910fa355950cb5a7ae1e1263fa42de439a4388d
|
4
|
+
data.tar.gz: a5da7ba22f549c6f20e27d11011ecf6da33b7abf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e662f4df3c0254d86f05bceedb55e40e1d08fd8108912b9f46f36f95e1f5e7980a35c2e2e498df8788b544cd39114d0248626e63ed1e0e4f05a7da1bd41230d7
|
7
|
+
data.tar.gz: 282472f9d5e04d8d4c0120f80f9607fef94e7ebcf1f0466a91d0f320e211cfdcdd8090cea098ded44b1f4049d0384f6d52301db6128b1567361c9c74f9b2cf4d
|
@@ -27,11 +27,9 @@ limitations under the License.
|
|
27
27
|
#include "ov_error.h"
|
28
28
|
#include "ov_xml_reader.h"
|
29
29
|
|
30
|
-
// Symbols:
|
31
|
-
static VALUE IO_SYMBOL;
|
32
|
-
|
33
30
|
// Method identifiers:
|
34
31
|
static ID READ_ID;
|
32
|
+
static ID STRING_IO_ID;
|
35
33
|
|
36
34
|
typedef struct {
|
37
35
|
VALUE io;
|
@@ -46,39 +44,46 @@ static void ov_xml_reader_check_closed(ov_xml_reader_object* object) {
|
|
46
44
|
}
|
47
45
|
|
48
46
|
static void ov_xml_reader_mark(ov_xml_reader_object *object) {
|
49
|
-
|
47
|
+
/* Mark the IO object as reachable: */
|
50
48
|
if (!NIL_P(object->io)) {
|
51
49
|
rb_gc_mark(object->io);
|
52
50
|
}
|
53
51
|
}
|
54
52
|
|
55
53
|
static void ov_xml_reader_free(ov_xml_reader_object *object) {
|
56
|
-
|
54
|
+
/* Free the libxml reader: */
|
57
55
|
if (!object->closed) {
|
58
|
-
|
56
|
+
if (object->reader != NULL) {
|
57
|
+
xmlFreeTextReader(object->reader);
|
58
|
+
}
|
59
59
|
object->reader = NULL;
|
60
60
|
object->closed = true;
|
61
61
|
}
|
62
62
|
|
63
|
-
|
63
|
+
/* Free this object: */
|
64
64
|
xfree(object);
|
65
65
|
}
|
66
66
|
|
67
67
|
static VALUE ov_xml_reader_alloc(VALUE klass) {
|
68
|
-
ov_xml_reader_object
|
68
|
+
ov_xml_reader_object* object = NULL;
|
69
|
+
|
70
|
+
object = ALLOC(ov_xml_reader_object);
|
71
|
+
memset(object, 0, sizeof(ov_xml_reader_object));
|
69
72
|
return Data_Wrap_Struct(klass, ov_xml_reader_mark, ov_xml_reader_free, object);
|
70
73
|
}
|
71
74
|
|
72
75
|
static int ov_xml_reader_callback(void *context, char *buffer, int length) {
|
73
|
-
|
76
|
+
VALUE data;
|
77
|
+
ov_xml_reader_object* object = NULL;
|
74
78
|
|
75
|
-
|
79
|
+
/* Do nothing if the reader is already closed: */
|
80
|
+
object = (ov_xml_reader_object*) context;
|
76
81
|
if (object->closed) {
|
77
82
|
return -1;
|
78
83
|
}
|
79
84
|
|
80
|
-
|
81
|
-
|
85
|
+
/* Read from the Ruby IO object, and copy the result to the buffer: */
|
86
|
+
data = rb_funcall(object->io, READ_ID, 1, INT2NUM(length));
|
82
87
|
if (NIL_P(data)) {
|
83
88
|
return 0;
|
84
89
|
}
|
@@ -88,32 +93,51 @@ static int ov_xml_reader_callback(void *context, char *buffer, int length) {
|
|
88
93
|
return length;
|
89
94
|
}
|
90
95
|
|
91
|
-
static VALUE
|
92
|
-
|
93
|
-
|
96
|
+
static VALUE ov_xml_reader_create_string_io(VALUE text) {
|
97
|
+
VALUE sio_class;
|
98
|
+
VALUE sio_obj;
|
99
|
+
|
100
|
+
sio_class = rb_const_get(rb_cObject, STRING_IO_ID);
|
101
|
+
sio_obj = rb_class_new_instance(1, &text, sio_class);
|
102
|
+
return sio_obj;
|
103
|
+
}
|
104
|
+
|
105
|
+
static VALUE ov_xml_reader_initialize(VALUE self, VALUE io) {
|
106
|
+
VALUE io_class;
|
107
|
+
int rc = 0;
|
108
|
+
ov_xml_reader_object* object = NULL;
|
109
|
+
|
110
|
+
/* Get the pointer to the object: */
|
94
111
|
Data_Get_Struct(self, ov_xml_reader_object, object);
|
95
112
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
if (
|
100
|
-
|
113
|
+
/* The parameter of the constructor can be a string or an IO object. If it is a string then we need to create aa
|
114
|
+
IO object to read from it. */
|
115
|
+
io_class = rb_class_of(io);
|
116
|
+
if (io_class == rb_cString) {
|
117
|
+
object->io = ov_xml_reader_create_string_io(io);
|
118
|
+
}
|
119
|
+
else if (io_class == rb_cIO) {
|
120
|
+
object->io = io;
|
121
|
+
}
|
122
|
+
else {
|
123
|
+
rb_raise(
|
124
|
+
ov_error_class,
|
125
|
+
"The type of the 'io' parameter must be 'String' or 'IO', but it is '%"PRIsVALUE"'",
|
126
|
+
io_class
|
127
|
+
);
|
101
128
|
}
|
102
129
|
|
103
|
-
|
104
|
-
object->io = io;
|
105
|
-
|
106
|
-
// Clear the closed flag:
|
130
|
+
/* Clear the closed flag: */
|
107
131
|
object->closed = false;
|
108
132
|
|
109
|
-
|
133
|
+
/* Create the libxml reader: */
|
110
134
|
object->reader = xmlReaderForIO(ov_xml_reader_callback, NULL, object, NULL, NULL, 0);
|
111
135
|
if (object->reader == NULL) {
|
112
136
|
rb_raise(ov_error_class, "Can't create reader");
|
113
137
|
}
|
114
138
|
|
115
|
-
|
116
|
-
|
139
|
+
/* Move the cursor to the first node: */
|
140
|
+
rc = xmlTextReaderRead(object->reader);
|
117
141
|
if (rc == -1) {
|
118
142
|
rb_raise(ov_error_class, "Can't read first node");
|
119
143
|
}
|
@@ -121,17 +145,13 @@ static VALUE ov_xml_reader_initialize(VALUE self, VALUE options) {
|
|
121
145
|
return self;
|
122
146
|
}
|
123
147
|
|
124
|
-
static VALUE ov_xml_reader_io(VALUE self) {
|
125
|
-
ov_xml_reader_object *object;
|
126
|
-
Data_Get_Struct(self, ov_xml_reader_object, object);
|
127
|
-
return object->io;
|
128
|
-
}
|
129
|
-
|
130
148
|
static VALUE ov_xml_reader_read(VALUE self) {
|
131
|
-
|
149
|
+
int rc = 0;
|
150
|
+
ov_xml_reader_object* object = NULL;
|
151
|
+
|
132
152
|
Data_Get_Struct(self, ov_xml_reader_object, object);
|
133
153
|
ov_xml_reader_check_closed(object);
|
134
|
-
|
154
|
+
rc = xmlTextReaderRead(object->reader);
|
135
155
|
if (rc == 0) {
|
136
156
|
return Qfalse;
|
137
157
|
}
|
@@ -171,34 +191,42 @@ static VALUE ov_xml_reader_forward(VALUE self) {
|
|
171
191
|
}
|
172
192
|
|
173
193
|
static VALUE ov_xml_reader_node_name(VALUE self) {
|
174
|
-
|
194
|
+
VALUE name;
|
195
|
+
const xmlChar* c_name = NULL;
|
196
|
+
ov_xml_reader_object* object = NULL;
|
197
|
+
|
175
198
|
Data_Get_Struct(self, ov_xml_reader_object, object);
|
176
199
|
ov_xml_reader_check_closed(object);
|
177
|
-
|
200
|
+
c_name = xmlTextReaderConstName(object->reader);
|
178
201
|
if (c_name == NULL) {
|
179
202
|
return Qnil;
|
180
203
|
}
|
181
|
-
|
204
|
+
name = rb_str_new_cstr((char*) c_name);
|
182
205
|
return name;
|
183
206
|
}
|
184
207
|
|
185
208
|
static VALUE ov_xml_reader_empty_element(VALUE self) {
|
186
|
-
ov_xml_reader_object
|
209
|
+
ov_xml_reader_object* object = NULL;
|
210
|
+
|
187
211
|
Data_Get_Struct(self, ov_xml_reader_object, object);
|
188
212
|
ov_xml_reader_check_closed(object);
|
189
213
|
return xmlTextReaderIsEmptyElement(object->reader)? Qtrue: Qfalse;
|
190
214
|
}
|
191
215
|
|
192
216
|
static VALUE ov_xml_reader_get_attribute(VALUE self, VALUE name) {
|
193
|
-
|
217
|
+
VALUE value;
|
218
|
+
ov_xml_reader_object* object = NULL;
|
219
|
+
xmlChar* c_name = NULL;
|
220
|
+
xmlChar* c_value = NULL;
|
221
|
+
|
194
222
|
Data_Get_Struct(self, ov_xml_reader_object, object);
|
195
223
|
ov_xml_reader_check_closed(object);
|
196
|
-
|
197
|
-
|
224
|
+
c_name = (xmlChar*) StringValueCStr(name);
|
225
|
+
c_value = xmlTextReaderGetAttribute(object->reader, c_name);
|
198
226
|
if (c_value == NULL) {
|
199
227
|
return Qnil;
|
200
228
|
}
|
201
|
-
|
229
|
+
value = rb_str_new_cstr((char*) c_value);
|
202
230
|
xmlFree(c_value);
|
203
231
|
return value;
|
204
232
|
}
|
@@ -295,10 +323,12 @@ static VALUE ov_xml_reader_read_elements(VALUE self) {
|
|
295
323
|
}
|
296
324
|
|
297
325
|
static VALUE ov_xml_reader_next_element(VALUE self) {
|
298
|
-
|
326
|
+
int rc = 0;
|
327
|
+
ov_xml_reader_object* object = NULL;
|
328
|
+
|
299
329
|
Data_Get_Struct(self, ov_xml_reader_object, object);
|
300
330
|
ov_xml_reader_check_closed(object);
|
301
|
-
|
331
|
+
rc = xmlTextReaderNext(object->reader);
|
302
332
|
if (rc == 0) {
|
303
333
|
return Qfalse;
|
304
334
|
}
|
@@ -309,7 +339,8 @@ static VALUE ov_xml_reader_next_element(VALUE self) {
|
|
309
339
|
}
|
310
340
|
|
311
341
|
static VALUE ov_xml_reader_close(VALUE self) {
|
312
|
-
ov_xml_reader_object
|
342
|
+
ov_xml_reader_object* object = NULL;
|
343
|
+
|
313
344
|
Data_Get_Struct(self, ov_xml_reader_object, object);
|
314
345
|
ov_xml_reader_check_closed(object);
|
315
346
|
xmlFreeTextReader(object->reader);
|
@@ -319,16 +350,18 @@ static VALUE ov_xml_reader_close(VALUE self) {
|
|
319
350
|
}
|
320
351
|
|
321
352
|
void ov_xml_reader_define(void) {
|
322
|
-
|
353
|
+
/* Load required modules: */
|
354
|
+
rb_require("stringio");
|
355
|
+
|
356
|
+
/* Define the class: */
|
323
357
|
ov_xml_reader_class = rb_define_class_under(ov_module, "XmlReader", rb_cObject);
|
324
358
|
|
325
|
-
|
359
|
+
/* Define the constructor: */
|
326
360
|
rb_define_alloc_func(ov_xml_reader_class, ov_xml_reader_alloc);
|
327
361
|
rb_define_method(ov_xml_reader_class, "initialize", ov_xml_reader_initialize, 1);
|
328
362
|
|
329
|
-
|
363
|
+
/* Define the methods: */
|
330
364
|
rb_define_method(ov_xml_reader_class, "forward", ov_xml_reader_forward, 0);
|
331
|
-
rb_define_method(ov_xml_reader_class, "io", ov_xml_reader_io, 0);
|
332
365
|
rb_define_method(ov_xml_reader_class, "read", ov_xml_reader_read, 0);
|
333
366
|
rb_define_method(ov_xml_reader_class, "node_name", ov_xml_reader_node_name, 0);
|
334
367
|
rb_define_method(ov_xml_reader_class, "empty_element?", ov_xml_reader_empty_element, 0);
|
@@ -338,9 +371,7 @@ void ov_xml_reader_define(void) {
|
|
338
371
|
rb_define_method(ov_xml_reader_class, "next_element", ov_xml_reader_next_element, 0);
|
339
372
|
rb_define_method(ov_xml_reader_class, "close", ov_xml_reader_close, 0);
|
340
373
|
|
341
|
-
|
342
|
-
IO_SYMBOL = ID2SYM(rb_intern("io"));
|
343
|
-
|
344
|
-
// Create method identifiers:
|
374
|
+
/* Create method identifiers: */
|
345
375
|
READ_ID = rb_intern("read");
|
376
|
+
STRING_IO_ID = rb_intern("StringIO");
|
346
377
|
}
|
@@ -23,11 +23,9 @@ limitations under the License.
|
|
23
23
|
#include "ov_error.h"
|
24
24
|
#include "ov_xml_writer.h"
|
25
25
|
|
26
|
-
|
27
|
-
static
|
28
|
-
static
|
29
|
-
|
30
|
-
// Method identifiers:
|
26
|
+
/* Identifiers: */
|
27
|
+
static ID STRING_ID;
|
28
|
+
static ID STRING_IO_ID;
|
31
29
|
static ID WRITE_ID;
|
32
30
|
|
33
31
|
typedef struct {
|
@@ -42,77 +40,108 @@ static void ov_xml_writer_check_closed(ov_xml_writer_object* object) {
|
|
42
40
|
}
|
43
41
|
|
44
42
|
static void ov_xml_writer_mark(ov_xml_writer_object *object) {
|
45
|
-
|
43
|
+
/* Mark the IO object as reachable: */
|
46
44
|
if (!NIL_P(object->io)) {
|
47
45
|
rb_gc_mark(object->io);
|
48
46
|
}
|
49
47
|
}
|
50
48
|
|
51
49
|
static void ov_xml_writer_free(ov_xml_writer_object *object) {
|
52
|
-
|
50
|
+
/* Free the libxml writer, the buffer is automatically closed: */
|
53
51
|
if (object->writer != NULL) {
|
54
52
|
xmlTextWriterPtr tmp = object->writer;
|
55
53
|
object->writer = NULL;
|
56
54
|
xmlFreeTextWriter(tmp);
|
57
55
|
}
|
58
56
|
|
59
|
-
|
57
|
+
/* Free this object: */
|
60
58
|
xfree(object);
|
61
59
|
}
|
62
60
|
|
63
61
|
static VALUE ov_xml_writer_alloc(VALUE klass) {
|
64
|
-
ov_xml_writer_object
|
62
|
+
ov_xml_writer_object* object = NULL;
|
63
|
+
|
64
|
+
object = ALLOC(ov_xml_writer_object);
|
65
|
+
memset(object, 0, sizeof(ov_xml_writer_object));
|
65
66
|
return Data_Wrap_Struct(klass, ov_xml_writer_mark, ov_xml_writer_free, object);
|
66
67
|
}
|
67
68
|
|
68
69
|
static int ov_xml_writer_callback(void *context, const char *buffer, int length) {
|
70
|
+
VALUE count;
|
71
|
+
VALUE data;
|
69
72
|
ov_xml_writer_object *object = (ov_xml_writer_object*) context;
|
70
73
|
|
71
|
-
|
74
|
+
/* Do nothing if the writer is already closed: */
|
72
75
|
if (object->writer == NULL) {
|
73
76
|
return 0;
|
74
77
|
}
|
75
78
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
+
/* Convert the buffer to a Ruby string and write it to the IO object, using the "write" method: */
|
80
|
+
data = rb_str_new(buffer, length);
|
81
|
+
count = rb_funcall(object->io, WRITE_ID, 1, data);
|
79
82
|
|
80
83
|
return NUM2INT(count);
|
81
84
|
}
|
82
85
|
|
83
|
-
static VALUE
|
84
|
-
|
85
|
-
|
86
|
+
static VALUE ov_xml_writer_create_string_io() {
|
87
|
+
VALUE sio_class;
|
88
|
+
VALUE sio_obj;
|
89
|
+
|
90
|
+
sio_class = rb_const_get(rb_cObject, STRING_IO_ID);
|
91
|
+
sio_obj = rb_class_new_instance(0, NULL, sio_class);
|
92
|
+
return sio_obj;
|
93
|
+
}
|
94
|
+
|
95
|
+
static VALUE ov_xml_writer_initialize(int argc, VALUE* argv, VALUE self) {
|
96
|
+
VALUE indent;
|
97
|
+
VALUE io;
|
98
|
+
VALUE io_class;
|
99
|
+
ov_xml_writer_object* object = NULL;
|
100
|
+
xmlOutputBufferPtr buffer = NULL;
|
101
|
+
|
102
|
+
/* Get the pointer to the object: */
|
86
103
|
Data_Get_Struct(self, ov_xml_writer_object, object);
|
87
104
|
|
88
|
-
|
89
|
-
|
90
|
-
|
105
|
+
/* Get the values of the parameters: */
|
106
|
+
if (argc > 2) {
|
107
|
+
rb_raise(ov_error_class, "Expected at most two arguments, 'io' and 'indent', but received %d", argc);
|
108
|
+
}
|
109
|
+
io = argc > 0? argv[0]: Qnil;
|
110
|
+
indent = argc > 1? argv[1]: Qnil;
|
111
|
+
|
112
|
+
/* The first parameter can be an IO object or nil. If it is nil then we need to create a IO object where we can
|
113
|
+
write the generated XML. */
|
91
114
|
if (NIL_P(io)) {
|
92
|
-
|
115
|
+
object->io = ov_xml_writer_create_string_io();
|
93
116
|
}
|
94
|
-
|
95
|
-
|
96
|
-
|
117
|
+
else {
|
118
|
+
io_class = rb_class_of(io);
|
119
|
+
if (io_class == rb_cIO) {
|
120
|
+
object->io = io;
|
121
|
+
}
|
122
|
+
else {
|
123
|
+
rb_raise(
|
124
|
+
ov_error_class,
|
125
|
+
"The type of the 'io' parameter must be 'IO', but it is '%"PRIsVALUE"'",
|
126
|
+
io_class
|
127
|
+
);
|
128
|
+
}
|
97
129
|
}
|
98
130
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
// Create the libxml buffer that writes to the IO object:
|
103
|
-
xmlOutputBufferPtr buffer = xmlOutputBufferCreateIO(ov_xml_writer_callback, NULL, object, NULL);
|
131
|
+
/* Create the libxml buffer that writes to the IO object: */
|
132
|
+
buffer = xmlOutputBufferCreateIO(ov_xml_writer_callback, NULL, object, NULL);
|
104
133
|
if (buffer == NULL) {
|
105
134
|
rb_raise(ov_error_class, "Can't create XML buffer");
|
106
135
|
}
|
107
136
|
|
108
|
-
|
137
|
+
/* Create the libxml writer: */
|
109
138
|
object->writer = xmlNewTextWriter(buffer);
|
110
139
|
if (object->writer == NULL) {
|
111
140
|
xmlOutputBufferClose(buffer);
|
112
141
|
rb_raise(ov_error_class, "Can't create XML writer");
|
113
142
|
}
|
114
143
|
|
115
|
-
|
144
|
+
/* Enable indentation: */
|
116
145
|
if (RTEST(indent)) {
|
117
146
|
xmlTextWriterSetIndent(object->writer, 1);
|
118
147
|
xmlTextWriterSetIndentString(object->writer, BAD_CAST " ");
|
@@ -121,19 +150,29 @@ static VALUE ov_xml_writer_initialize(VALUE self, VALUE options) {
|
|
121
150
|
return self;
|
122
151
|
}
|
123
152
|
|
124
|
-
static VALUE
|
125
|
-
|
153
|
+
static VALUE ov_xml_writer_string(VALUE self) {
|
154
|
+
int rc = 0;
|
155
|
+
ov_xml_writer_object* object = NULL;
|
156
|
+
|
126
157
|
Data_Get_Struct(self, ov_xml_writer_object, object);
|
127
|
-
|
158
|
+
ov_xml_writer_check_closed(object);
|
159
|
+
rc = xmlTextWriterFlush(object->writer);
|
160
|
+
if (rc < 0) {
|
161
|
+
rb_raise(ov_error_class, "Can't flush XML writer");
|
162
|
+
}
|
163
|
+
return rb_funcall(object->io, STRING_ID, 0, NULL);
|
128
164
|
}
|
129
165
|
|
130
166
|
static VALUE ov_xml_writer_write_start(VALUE self, VALUE name) {
|
131
|
-
|
167
|
+
char* c_name = NULL;
|
168
|
+
int rc = 0;
|
169
|
+
ov_xml_writer_object* object = NULL;
|
170
|
+
|
132
171
|
Data_Get_Struct(self, ov_xml_writer_object, object);
|
133
172
|
ov_xml_writer_check_closed(object);
|
134
173
|
Check_Type(name, T_STRING);
|
135
|
-
|
136
|
-
|
174
|
+
c_name = StringValueCStr(name);
|
175
|
+
rc = xmlTextWriterStartElement(object->writer, BAD_CAST c_name);
|
137
176
|
if (rc < 0) {
|
138
177
|
rb_raise(ov_error_class, "Can't start XML element");
|
139
178
|
}
|
@@ -141,10 +180,12 @@ static VALUE ov_xml_writer_write_start(VALUE self, VALUE name) {
|
|
141
180
|
}
|
142
181
|
|
143
182
|
static VALUE ov_xml_writer_write_end(VALUE self) {
|
144
|
-
|
183
|
+
int rc = 0;
|
184
|
+
ov_xml_writer_object* object = NULL;
|
185
|
+
|
145
186
|
Data_Get_Struct(self, ov_xml_writer_object, object);
|
146
187
|
ov_xml_writer_check_closed(object);
|
147
|
-
|
188
|
+
rc = xmlTextWriterEndElement(object->writer);
|
148
189
|
if (rc < 0) {
|
149
190
|
rb_raise(ov_error_class, "Can't end XML element");
|
150
191
|
}
|
@@ -152,14 +193,18 @@ static VALUE ov_xml_writer_write_end(VALUE self) {
|
|
152
193
|
}
|
153
194
|
|
154
195
|
static VALUE ov_xml_writer_write_attribute(VALUE self, VALUE name, VALUE value) {
|
155
|
-
|
196
|
+
char* c_name = NULL;
|
197
|
+
char* c_value = NULL;
|
198
|
+
int rc = 0;
|
199
|
+
ov_xml_writer_object* object = NULL;
|
200
|
+
|
156
201
|
Data_Get_Struct(self, ov_xml_writer_object, object);
|
157
202
|
ov_xml_writer_check_closed(object);
|
158
203
|
Check_Type(name, T_STRING);
|
159
204
|
Check_Type(value, T_STRING);
|
160
|
-
|
161
|
-
|
162
|
-
|
205
|
+
c_name = StringValueCStr(name);
|
206
|
+
c_value = StringValueCStr(value);
|
207
|
+
rc = xmlTextWriterWriteAttribute(object->writer, BAD_CAST c_name, BAD_CAST c_value);
|
163
208
|
if (rc < 0) {
|
164
209
|
rb_raise(ov_error_class, "Can't write attribute with name \"%s\" and value \"%s\"", c_name, c_value);
|
165
210
|
}
|
@@ -167,14 +212,18 @@ static VALUE ov_xml_writer_write_attribute(VALUE self, VALUE name, VALUE value)
|
|
167
212
|
}
|
168
213
|
|
169
214
|
static VALUE ov_xml_writer_write_element(VALUE self, VALUE name, VALUE value) {
|
170
|
-
|
215
|
+
char* c_name = NULL;
|
216
|
+
char* c_value = NULL;
|
217
|
+
int rc = 0;
|
218
|
+
ov_xml_writer_object* object = NULL;
|
219
|
+
|
171
220
|
Data_Get_Struct(self, ov_xml_writer_object, object);
|
172
221
|
ov_xml_writer_check_closed(object);
|
173
222
|
Check_Type(name, T_STRING);
|
174
223
|
Check_Type(value, T_STRING);
|
175
|
-
|
176
|
-
|
177
|
-
|
224
|
+
c_name = StringValueCStr(name);
|
225
|
+
c_value = StringValueCStr(value);
|
226
|
+
rc = xmlTextWriterWriteElement(object->writer, BAD_CAST c_name, BAD_CAST c_value);
|
178
227
|
if (rc < 0) {
|
179
228
|
rb_raise(ov_error_class, "Can't write element with name \"%s\" and value \"%s\"", c_name, c_value);
|
180
229
|
}
|
@@ -182,10 +231,12 @@ static VALUE ov_xml_writer_write_element(VALUE self, VALUE name, VALUE value) {
|
|
182
231
|
}
|
183
232
|
|
184
233
|
static VALUE ov_xml_writer_flush(VALUE self) {
|
185
|
-
ov_xml_writer_object
|
234
|
+
ov_xml_writer_object* object = NULL;
|
235
|
+
int rc = 0;
|
236
|
+
|
186
237
|
Data_Get_Struct(self, ov_xml_writer_object, object);
|
187
238
|
ov_xml_writer_check_closed(object);
|
188
|
-
|
239
|
+
rc = xmlTextWriterFlush(object->writer);
|
189
240
|
if (rc < 0) {
|
190
241
|
rb_raise(ov_error_class, "Can't flush XML writer");
|
191
242
|
}
|
@@ -193,7 +244,8 @@ static VALUE ov_xml_writer_flush(VALUE self) {
|
|
193
244
|
}
|
194
245
|
|
195
246
|
static VALUE ov_xml_writer_close(VALUE self) {
|
196
|
-
ov_xml_writer_object
|
247
|
+
ov_xml_writer_object* object = NULL;
|
248
|
+
|
197
249
|
Data_Get_Struct(self, ov_xml_writer_object, object);
|
198
250
|
ov_xml_writer_check_closed(object);
|
199
251
|
xmlFreeTextWriter(object->writer);
|
@@ -202,26 +254,27 @@ static VALUE ov_xml_writer_close(VALUE self) {
|
|
202
254
|
}
|
203
255
|
|
204
256
|
void ov_xml_writer_define(void) {
|
205
|
-
|
257
|
+
/* Load required modules: */
|
258
|
+
rb_require("stringio");
|
259
|
+
|
260
|
+
/* Define the class: */
|
206
261
|
ov_xml_writer_class = rb_define_class_under(ov_module, "XmlWriter", rb_cObject);
|
207
262
|
|
208
|
-
|
263
|
+
/* Define the constructor: */
|
209
264
|
rb_define_alloc_func(ov_xml_writer_class, ov_xml_writer_alloc);
|
210
|
-
rb_define_method(ov_xml_writer_class, "initialize", ov_xml_writer_initialize, 1);
|
265
|
+
rb_define_method(ov_xml_writer_class, "initialize", ov_xml_writer_initialize, -1);
|
211
266
|
|
212
|
-
|
213
|
-
rb_define_method(ov_xml_writer_class, "
|
214
|
-
rb_define_method(ov_xml_writer_class, "
|
215
|
-
rb_define_method(ov_xml_writer_class, "
|
267
|
+
/* Define the methods: */
|
268
|
+
rb_define_method(ov_xml_writer_class, "close", ov_xml_writer_close, 0);
|
269
|
+
rb_define_method(ov_xml_writer_class, "flush", ov_xml_writer_flush, 0);
|
270
|
+
rb_define_method(ov_xml_writer_class, "string", ov_xml_writer_string, 0);
|
216
271
|
rb_define_method(ov_xml_writer_class, "write_attribute", ov_xml_writer_write_attribute, 2);
|
217
272
|
rb_define_method(ov_xml_writer_class, "write_element", ov_xml_writer_write_element, 2);
|
218
|
-
rb_define_method(ov_xml_writer_class, "
|
219
|
-
rb_define_method(ov_xml_writer_class, "
|
220
|
-
|
221
|
-
// Create symbols:
|
222
|
-
IO_SYMBOL = ID2SYM(rb_intern("io"));
|
223
|
-
INDENT_SYMBOL = ID2SYM(rb_intern("indent"));
|
273
|
+
rb_define_method(ov_xml_writer_class, "write_end", ov_xml_writer_write_end, 0);
|
274
|
+
rb_define_method(ov_xml_writer_class, "write_start", ov_xml_writer_write_start, 1);
|
224
275
|
|
225
|
-
|
276
|
+
/* Create method identifiers: */
|
277
|
+
STRING_ID = rb_intern("string");
|
278
|
+
STRING_IO_ID = rb_intern("StringIO");
|
226
279
|
WRITE_ID = rb_intern("write");
|
227
280
|
}
|