rubyuno 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.
- data/.gitignore +20 -0
- data/CHANGES +16 -0
- data/Gemfile +4 -0
- data/LICENSE +202 -0
- data/README +46 -0
- data/Rakefile +603 -0
- data/ext/rubyuno/adapter.cxx +271 -0
- data/ext/rubyuno/extconf.rb +125 -0
- data/ext/rubyuno/libruno.def +26 -0
- data/ext/rubyuno/loader.cxx +184 -0
- data/ext/rubyuno/module.cxx +1263 -0
- data/ext/rubyuno/rubyuno.hxx +263 -0
- data/ext/rubyuno/runo.def +2 -0
- data/ext/rubyuno/runtime.cxx +524 -0
- data/ext/rubyuno/string.cxx +252 -0
- data/ext/rubyuno/type.cxx +358 -0
- data/lib/rubyloader.rb +302 -0
- data/lib/rubyscriptprovider.rb +1025 -0
- data/lib/rubyuno.rb +20 -0
- data/lib/rubyuno/uno.rb +105 -0
- data/lib/rubyuno/uno/connector.rb +97 -0
- data/lib/rubyuno/version.rb +3 -0
- data/rubyuno.gemspec +17 -0
- data/sample/calc-chart.rb +66 -0
- data/sample/dialog_listener.rb +70 -0
- data/sample/filter-names.rb +123 -0
- data/sample/inputbox.rb +74 -0
- data/sample/mri.rb +17 -0
- data/sample/open-doc1.rb +20 -0
- metadata +89 -0
@@ -0,0 +1,252 @@
|
|
1
|
+
|
2
|
+
#include "rubyuno.hxx"
|
3
|
+
|
4
|
+
#ifdef HAVE_RUBY_IO_H
|
5
|
+
#include <ruby/io.h>
|
6
|
+
#endif
|
7
|
+
|
8
|
+
#include <rtl/textenc.h>
|
9
|
+
#include <osl/thread.h>
|
10
|
+
|
11
|
+
using rtl::OString;
|
12
|
+
using rtl::OUString;
|
13
|
+
using rtl::OUStringToOString;
|
14
|
+
|
15
|
+
namespace rubyuno
|
16
|
+
{
|
17
|
+
|
18
|
+
OUString
|
19
|
+
asciiVALUE2OUString(VALUE str)
|
20
|
+
{
|
21
|
+
Check_Type(str, T_STRING);
|
22
|
+
return OUString(RSTRING_PTR(str), RSTRING_LEN(str), RTL_TEXTENCODING_ASCII_US);
|
23
|
+
}
|
24
|
+
|
25
|
+
VALUE
|
26
|
+
asciiOUString2VALUE(const OUString &str)
|
27
|
+
{
|
28
|
+
OString o = OUStringToOString(str, RTL_TEXTENCODING_ASCII_US);
|
29
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
30
|
+
return rb_enc_str_new(o.getStr(), o.getLength(), rb_usascii_encoding());
|
31
|
+
#else
|
32
|
+
return rb_str_new(o.getStr(), o.getLength());
|
33
|
+
#endif
|
34
|
+
}
|
35
|
+
|
36
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
37
|
+
rtl_TextEncoding
|
38
|
+
Encoding2TextEncoding(VALUE encoding)
|
39
|
+
{
|
40
|
+
rtl_TextEncoding ret;
|
41
|
+
int index = rb_to_encoding_index(encoding);
|
42
|
+
|
43
|
+
if (index == rb_enc_find_index("US-ASCII"))
|
44
|
+
ret = RTL_TEXTENCODING_ASCII_US;
|
45
|
+
else if (index == rb_enc_find_index("UTF-8"))
|
46
|
+
ret = RTL_TEXTENCODING_UTF8;
|
47
|
+
else if (index == rb_enc_find_index("EUC-JP"))
|
48
|
+
ret = RTL_TEXTENCODING_EUC_JP;
|
49
|
+
else if (index == rb_enc_find_index("Shift_JIS"))
|
50
|
+
ret = RTL_TEXTENCODING_SHIFT_JIS;
|
51
|
+
else if (index == rb_enc_find_index("Big5"))
|
52
|
+
ret = RTL_TEXTENCODING_BIG5;
|
53
|
+
else if (index == rb_enc_find_index("EUC-KR"))
|
54
|
+
ret = RTL_TEXTENCODING_EUC_KR;
|
55
|
+
else if (index == rb_enc_find_index("EUC-TW"))
|
56
|
+
ret = RTL_TEXTENCODING_EUC_TW;
|
57
|
+
else if (index == rb_enc_find_index("GB18030"))
|
58
|
+
ret = RTL_TEXTENCODING_GB_18030;
|
59
|
+
else if (index == rb_enc_find_index("GBK"))
|
60
|
+
ret = RTL_TEXTENCODING_GBK;
|
61
|
+
else if (index == rb_enc_find_index("ISO-8859-1"))
|
62
|
+
ret = RTL_TEXTENCODING_ISO_8859_1;
|
63
|
+
else if (index == rb_enc_find_index("ISO-8859-2"))
|
64
|
+
ret = RTL_TEXTENCODING_ISO_8859_2;
|
65
|
+
else if (index == rb_enc_find_index("ISO-8859-3"))
|
66
|
+
ret = RTL_TEXTENCODING_ISO_8859_3;
|
67
|
+
else if (index == rb_enc_find_index("ISO-8859-4"))
|
68
|
+
ret = RTL_TEXTENCODING_ISO_8859_4;
|
69
|
+
else if (index == rb_enc_find_index("ISO-8859-5"))
|
70
|
+
ret = RTL_TEXTENCODING_ISO_8859_5;
|
71
|
+
else if (index == rb_enc_find_index("ISO-8859-6"))
|
72
|
+
ret = RTL_TEXTENCODING_ISO_8859_6;
|
73
|
+
else if (index == rb_enc_find_index("ISO-8859-7"))
|
74
|
+
ret = RTL_TEXTENCODING_ISO_8859_7;
|
75
|
+
else if (index == rb_enc_find_index("ISO-8859-8"))
|
76
|
+
ret = RTL_TEXTENCODING_ISO_8859_8;
|
77
|
+
else if (index == rb_enc_find_index("ISO-8859-9"))
|
78
|
+
ret = RTL_TEXTENCODING_ISO_8859_9;
|
79
|
+
else if (index == rb_enc_find_index("ISO-8859-10"))
|
80
|
+
ret = RTL_TEXTENCODING_ISO_8859_10;
|
81
|
+
else if (index == rb_enc_find_index("ISO-8859-13"))
|
82
|
+
ret = RTL_TEXTENCODING_ISO_8859_13;
|
83
|
+
else if (index == rb_enc_find_index("ISO-8859-14"))
|
84
|
+
ret = RTL_TEXTENCODING_ISO_8859_14;
|
85
|
+
else if (index == rb_enc_find_index("ISO-8859-15"))
|
86
|
+
ret = RTL_TEXTENCODING_ISO_8859_15;
|
87
|
+
else if (index == rb_enc_find_index("KOI8-R"))
|
88
|
+
ret = RTL_TEXTENCODING_KOI8_R;
|
89
|
+
else if (index == rb_enc_find_index("KOI8-U"))
|
90
|
+
ret = RTL_TEXTENCODING_KOI8_U;
|
91
|
+
else if (index == rb_enc_find_index("Windows-1251"))
|
92
|
+
ret = RTL_TEXTENCODING_MS_1251;
|
93
|
+
else if (index == rb_enc_find_index("IBM437"))
|
94
|
+
ret = RTL_TEXTENCODING_IBM_437 ;
|
95
|
+
else if (index == rb_enc_find_index("IBM737"))
|
96
|
+
ret = RTL_TEXTENCODING_IBM_737;
|
97
|
+
else if (index == rb_enc_find_index("IBM775"))
|
98
|
+
ret = RTL_TEXTENCODING_IBM_775;
|
99
|
+
else if (index == rb_enc_find_index("IBM852"))
|
100
|
+
ret = RTL_TEXTENCODING_IBM_852;
|
101
|
+
else if (index == rb_enc_find_index("IBM852"))
|
102
|
+
ret = RTL_TEXTENCODING_IBM_855;
|
103
|
+
else if (index == rb_enc_find_index("IBM855"))
|
104
|
+
ret = RTL_TEXTENCODING_IBM_857;
|
105
|
+
else if (index == rb_enc_find_index("IBM857"))
|
106
|
+
ret = RTL_TEXTENCODING_IBM_860;
|
107
|
+
else if (index == rb_enc_find_index("IBM860"))
|
108
|
+
ret = RTL_TEXTENCODING_IBM_861;
|
109
|
+
else if (index == rb_enc_find_index("IBM861"))
|
110
|
+
ret = RTL_TEXTENCODING_IBM_862;
|
111
|
+
else if (index == rb_enc_find_index("IBM862"))
|
112
|
+
ret = RTL_TEXTENCODING_IBM_863;
|
113
|
+
else if (index == rb_enc_find_index("IBM863"))
|
114
|
+
ret = RTL_TEXTENCODING_IBM_864;
|
115
|
+
else if (index == rb_enc_find_index("IBM864"))
|
116
|
+
ret = RTL_TEXTENCODING_IBM_865;
|
117
|
+
else if (index == rb_enc_find_index("IBM865"))
|
118
|
+
ret = RTL_TEXTENCODING_IBM_866;
|
119
|
+
else if (index == rb_enc_find_index("IBM866"))
|
120
|
+
ret = RTL_TEXTENCODING_IBM_869 ;
|
121
|
+
else if (index == rb_enc_find_index("Windows-1258"))
|
122
|
+
ret = RTL_TEXTENCODING_MS_1258;
|
123
|
+
else if (index == rb_enc_find_index("macCentEuro"))
|
124
|
+
ret = RTL_TEXTENCODING_APPLE_CENTEURO;
|
125
|
+
else if (index == rb_enc_find_index("macCroatian"))
|
126
|
+
ret = RTL_TEXTENCODING_APPLE_CROATIAN;
|
127
|
+
else if (index == rb_enc_find_index("macCyrillic"))
|
128
|
+
ret = RTL_TEXTENCODING_APPLE_CYRILLIC;
|
129
|
+
else if (index == rb_enc_find_index("macGreek"))
|
130
|
+
ret = RTL_TEXTENCODING_APPLE_GREEK;
|
131
|
+
else if (index == rb_enc_find_index("macIceland"))
|
132
|
+
ret = RTL_TEXTENCODING_APPLE_ICELAND;
|
133
|
+
else if (index == rb_enc_find_index("macRoman"))
|
134
|
+
ret = RTL_TEXTENCODING_APPLE_ROMAN;
|
135
|
+
else if (index == rb_enc_find_index("macRomania"))
|
136
|
+
ret = RTL_TEXTENCODING_APPLE_ROMANIAN;
|
137
|
+
else if (index == rb_enc_find_index("macThai"))
|
138
|
+
ret = RTL_TEXTENCODING_APPLE_THAI;
|
139
|
+
else if (index == rb_enc_find_index("macTurkish"))
|
140
|
+
ret = RTL_TEXTENCODING_APPLE_TURKISH;
|
141
|
+
else if (index == rb_enc_find_index("stateless-ISO-2022-JP"))
|
142
|
+
ret = RTL_TEXTENCODING_ISO_2022_JP;
|
143
|
+
else if (index == rb_enc_find_index("GB2312"))
|
144
|
+
ret = RTL_TEXTENCODING_GB_2312;
|
145
|
+
else if (index == rb_enc_find_index("GB12345"))
|
146
|
+
ret = RTL_TEXTENCODING_GBT_12345;
|
147
|
+
else if (index == rb_enc_find_index("Windows-1252"))
|
148
|
+
ret = RTL_TEXTENCODING_MS_1252;
|
149
|
+
else if (index == rb_enc_find_index("Windows-1250"))
|
150
|
+
ret = RTL_TEXTENCODING_MS_1250;
|
151
|
+
else if (index == rb_enc_find_index("Windows-1253"))
|
152
|
+
ret = RTL_TEXTENCODING_MS_1253;
|
153
|
+
else if (index == rb_enc_find_index("Windows-1254"))
|
154
|
+
ret = RTL_TEXTENCODING_MS_1254;
|
155
|
+
else if (index == rb_enc_find_index("Windows-1255"))
|
156
|
+
ret = RTL_TEXTENCODING_MS_1255;
|
157
|
+
else if (index == rb_enc_find_index("Windows-1256"))
|
158
|
+
ret = RTL_TEXTENCODING_MS_1256;
|
159
|
+
else if (index == rb_enc_find_index("Windows-1257"))
|
160
|
+
ret = RTL_TEXTENCODING_MS_1257;
|
161
|
+
else if (index == rb_enc_find_index("MacJapanese"))
|
162
|
+
ret = RTL_TEXTENCODING_APPLE_JAPANESE;
|
163
|
+
else
|
164
|
+
ret = RTL_TEXTENCODING_UTF8;
|
165
|
+
|
166
|
+
return ret;
|
167
|
+
}
|
168
|
+
#else
|
169
|
+
rtl_TextEncoding
|
170
|
+
Encoding2TextEncoding(const char *enc)
|
171
|
+
{
|
172
|
+
rtl_TextEncoding ret;
|
173
|
+
if (strcmp(enc, "UTF8") == 0)
|
174
|
+
{
|
175
|
+
ret = RTL_TEXTENCODING_UTF8;
|
176
|
+
}
|
177
|
+
else if (strcmp(enc, "SJIS") == 0)
|
178
|
+
{
|
179
|
+
ret = RTL_TEXTENCODING_SHIFT_JIS;
|
180
|
+
}
|
181
|
+
else if (strcmp(enc, "EUC") == 0)
|
182
|
+
{
|
183
|
+
ret = RTL_TEXTENCODING_EUC_JP;
|
184
|
+
}
|
185
|
+
else
|
186
|
+
{
|
187
|
+
ret = RTL_TEXTENCODING_UTF8;
|
188
|
+
}
|
189
|
+
return ret;
|
190
|
+
}
|
191
|
+
#endif
|
192
|
+
|
193
|
+
static rtl_TextEncoding external_encoding;
|
194
|
+
|
195
|
+
VALUE
|
196
|
+
ustring2RString(const ::rtl::OUString &str)
|
197
|
+
{
|
198
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
199
|
+
//OString o = OUStringToOString(str, RTL_TEXTENCODING_UTF8);
|
200
|
+
//return rb_enc_str_new(o.getStr(), o.getLength(), rb_utf8_encoding());
|
201
|
+
OString o = OUStringToOString(str, external_encoding);
|
202
|
+
return rb_enc_str_new(o.getStr(), o.getLength(), rb_default_external_encoding());
|
203
|
+
#else
|
204
|
+
OString o = OUStringToOString(str, external_encoding);
|
205
|
+
return rb_str_new(o.getStr(), o.getLength());
|
206
|
+
#endif
|
207
|
+
}
|
208
|
+
|
209
|
+
OUString
|
210
|
+
rbString2OUString(VALUE rbstr)
|
211
|
+
{
|
212
|
+
Check_Type(rbstr, T_STRING);
|
213
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
214
|
+
//VALUE str = rb_funcall(rbstr, rb_intern("encode"), 1, rb_str_new2("UTF-8"));
|
215
|
+
//return OUString(RSTRING_PTR(str), RSTRING_LEN(str), RTL_TEXTENCODING_UTF8);
|
216
|
+
|
217
|
+
return OUString(RSTRING_PTR(rbstr), RSTRING_LEN(rbstr), Encoding2TextEncoding(rb_obj_encoding(rbstr)));
|
218
|
+
#else
|
219
|
+
return OUString(RSTRING_PTR(rbstr), RSTRING_LEN(rbstr), external_encoding);
|
220
|
+
#endif
|
221
|
+
}
|
222
|
+
|
223
|
+
/*
|
224
|
+
void
|
225
|
+
set_external_encoding(VALUE encoding)
|
226
|
+
{
|
227
|
+
external_encoding = Encoding2TextEncoding(encoding);
|
228
|
+
}
|
229
|
+
*/
|
230
|
+
|
231
|
+
void
|
232
|
+
init_external_encoding()
|
233
|
+
{
|
234
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
235
|
+
external_encoding = Encoding2TextEncoding(rb_enc_default_external());
|
236
|
+
#else
|
237
|
+
external_encoding = Encoding2TextEncoding(rb_get_kcode());
|
238
|
+
#endif
|
239
|
+
}
|
240
|
+
|
241
|
+
VALUE
|
242
|
+
bytes2VALUE(const com::sun::star::uno::Sequence< sal_Int8 > &bytes)
|
243
|
+
{
|
244
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
245
|
+
return rb_enc_str_new((char*)bytes.getConstArray(), bytes.getLength(), rb_ascii8bit_encoding());
|
246
|
+
#else
|
247
|
+
return rb_str_new((char*)bytes.getConstArray(), bytes.getLength());
|
248
|
+
#endif
|
249
|
+
}
|
250
|
+
|
251
|
+
}
|
252
|
+
|
@@ -0,0 +1,358 @@
|
|
1
|
+
|
2
|
+
#include "rubyuno.hxx"
|
3
|
+
|
4
|
+
#include <osl/thread.h>
|
5
|
+
#include <rtl/ustrbuf.hxx>
|
6
|
+
#include <typelib/typedescription.hxx>
|
7
|
+
|
8
|
+
#include <com/sun/star/reflection/XInterfaceTypeDescription2.hpp>
|
9
|
+
|
10
|
+
using com::sun::star::lang::XSingleServiceFactory;
|
11
|
+
using com::sun::star::reflection::XInterfaceTypeDescription2;
|
12
|
+
using com::sun::star::reflection::XTypeDescription;
|
13
|
+
using com::sun::star::script::XInvocation2;
|
14
|
+
using com::sun::star::uno::Any;
|
15
|
+
using com::sun::star::uno::Reference;
|
16
|
+
using com::sun::star::uno::RuntimeException;
|
17
|
+
using com::sun::star::uno::Sequence;
|
18
|
+
using com::sun::star::uno::TypeDescription;
|
19
|
+
using com::sun::star::uno::UNO_QUERY;
|
20
|
+
using com::sun::star::uno::XInterface;
|
21
|
+
|
22
|
+
using rtl::OUString;
|
23
|
+
using rtl::OUStringToOString;
|
24
|
+
using rtl::OUStringBuffer;
|
25
|
+
|
26
|
+
namespace rubyuno
|
27
|
+
{
|
28
|
+
|
29
|
+
VALUE
|
30
|
+
get_module_class()
|
31
|
+
{
|
32
|
+
return rb_const_get(rb_cObject, rb_intern("Rubyuno"));
|
33
|
+
ID id;
|
34
|
+
id = rb_intern("Rubyuno");
|
35
|
+
if (rb_const_defined(rb_cObject, id))
|
36
|
+
return rb_const_get(rb_cObject, id);
|
37
|
+
rb_raise(rb_eRuntimeError, "module undefined (Rubyuno)");
|
38
|
+
}
|
39
|
+
|
40
|
+
VALUE
|
41
|
+
get_class(const char *name)
|
42
|
+
{
|
43
|
+
VALUE module;
|
44
|
+
ID id;
|
45
|
+
id = rb_intern(name);
|
46
|
+
|
47
|
+
module = get_module_class();
|
48
|
+
if (rb_const_defined(module, id))
|
49
|
+
return rb_const_get(module, id);
|
50
|
+
rb_raise(rb_eRuntimeError, "class undefined (%s)", RSTRING_PTR(&name));
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
VALUE
|
55
|
+
get_proxy_class()
|
56
|
+
{
|
57
|
+
return get_class("RubyunoProxy");
|
58
|
+
}
|
59
|
+
|
60
|
+
VALUE
|
61
|
+
get_enum_class()
|
62
|
+
{
|
63
|
+
return get_class("Enum");
|
64
|
+
}
|
65
|
+
|
66
|
+
VALUE
|
67
|
+
get_type_class()
|
68
|
+
{
|
69
|
+
return get_class("Type");
|
70
|
+
}
|
71
|
+
|
72
|
+
VALUE
|
73
|
+
get_char_class()
|
74
|
+
{
|
75
|
+
return get_class("Char");
|
76
|
+
}
|
77
|
+
|
78
|
+
VALUE
|
79
|
+
get_any_class()
|
80
|
+
{
|
81
|
+
return get_class("Any");
|
82
|
+
}
|
83
|
+
|
84
|
+
VALUE
|
85
|
+
get_bytes_class()
|
86
|
+
{
|
87
|
+
return get_class("ByteSequence");
|
88
|
+
}
|
89
|
+
|
90
|
+
VALUE
|
91
|
+
get_interface_class()
|
92
|
+
{
|
93
|
+
ID id;
|
94
|
+
VALUE module = get_module_class();
|
95
|
+
id = rb_intern("Com");
|
96
|
+
if (!rb_const_defined(module, id))
|
97
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com)");
|
98
|
+
VALUE com_module = rb_const_get(module, id);
|
99
|
+
id = rb_intern("Sun");
|
100
|
+
if (!rb_const_defined(com_module, id))
|
101
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com::Sun)");
|
102
|
+
VALUE sun_module = rb_const_get(com_module, id);
|
103
|
+
id = rb_intern("Star");
|
104
|
+
if (!rb_const_defined(sun_module, id))
|
105
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com::Sun::Star)");
|
106
|
+
VALUE star_module = rb_const_get(sun_module, id);
|
107
|
+
id = rb_intern("Uno");
|
108
|
+
if (!rb_const_defined(star_module, id))
|
109
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com::Sun::Star::Uno)");
|
110
|
+
VALUE uno_module = rb_const_get(star_module, id);
|
111
|
+
id = rb_intern("XInterface");
|
112
|
+
if (!rb_const_defined(uno_module, id))
|
113
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com::Sun::Star::Uno::XInterface)");
|
114
|
+
return rb_const_get(uno_module, id);
|
115
|
+
}
|
116
|
+
|
117
|
+
VALUE
|
118
|
+
get_struct_class()
|
119
|
+
{
|
120
|
+
return get_class("RubyunoStruct");
|
121
|
+
}
|
122
|
+
|
123
|
+
VALUE
|
124
|
+
get_exception_class()
|
125
|
+
{
|
126
|
+
ID id;
|
127
|
+
VALUE module = get_module_class();
|
128
|
+
id = rb_intern("Com");
|
129
|
+
if (!rb_const_defined(module, id))
|
130
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com)");
|
131
|
+
VALUE com_module = rb_const_get(module, id);
|
132
|
+
id = rb_intern("Sun");
|
133
|
+
if (!rb_const_defined(com_module, id))
|
134
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com::Sun)");
|
135
|
+
VALUE sun_module = rb_const_get(com_module, id);
|
136
|
+
id = rb_intern("Star");
|
137
|
+
if (!rb_const_defined(sun_module, id))
|
138
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com::Sun::Star)");
|
139
|
+
VALUE star_module = rb_const_get(sun_module, id);
|
140
|
+
id = rb_intern("Uno");
|
141
|
+
if (!rb_const_defined(star_module, id))
|
142
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com::Sun::Star::Uno)");
|
143
|
+
VALUE uno_module = rb_const_get(star_module, id);
|
144
|
+
id = rb_intern("Exception");
|
145
|
+
if (!rb_const_defined(uno_module, id))
|
146
|
+
rb_raise(rb_eRuntimeError, "unknown error (Rubyuno::Com::Sun::Star::Uno::Exception)");
|
147
|
+
return rb_const_get(uno_module, id);
|
148
|
+
}
|
149
|
+
|
150
|
+
VALUE
|
151
|
+
new_Type(VALUE type_name, VALUE type_class)
|
152
|
+
{
|
153
|
+
return rb_funcall(get_enum_class(), rb_intern("new"), type_name, type_class);
|
154
|
+
}
|
155
|
+
|
156
|
+
VALUE
|
157
|
+
new_Char(VALUE character)
|
158
|
+
{
|
159
|
+
VALUE char_class = get_char_class();
|
160
|
+
return rb_funcall(char_class, rb_intern("new"), character);
|
161
|
+
}
|
162
|
+
|
163
|
+
|
164
|
+
VALUE
|
165
|
+
new_rubyuno_object(const Any &a, const Reference< XSingleServiceFactory > &xFactory)
|
166
|
+
{
|
167
|
+
Reference< XInterface > tmp_interface;
|
168
|
+
a >>= tmp_interface;
|
169
|
+
if (!tmp_interface.is())
|
170
|
+
return Qnil;
|
171
|
+
return new_rubyuno_proxy(a, xFactory, get_proxy_class());
|
172
|
+
}
|
173
|
+
|
174
|
+
VALUE
|
175
|
+
new_rubyuno_proxy(const Any &object, const Reference< XSingleServiceFactory > &xFactory, VALUE klass)
|
176
|
+
{
|
177
|
+
Sequence< Any > arguments(1);
|
178
|
+
arguments[0] <<= object;
|
179
|
+
Reference< XInvocation2 > xinvocation(xFactory->createInstanceWithArguments(arguments), UNO_QUERY);
|
180
|
+
|
181
|
+
VALUE obj;
|
182
|
+
RubyunoInternal *rubyuno;
|
183
|
+
rubyuno = new RubyunoInternal();
|
184
|
+
obj = rb_obj_alloc(klass);
|
185
|
+
DATA_PTR(obj) = rubyuno;
|
186
|
+
|
187
|
+
rubyuno->wrapped = object;
|
188
|
+
rubyuno->invocation = xinvocation;
|
189
|
+
return obj;
|
190
|
+
}
|
191
|
+
|
192
|
+
void
|
193
|
+
set_rubyuno_struct(const Any &object, const Reference< XSingleServiceFactory > &xFactory, VALUE &self)
|
194
|
+
{
|
195
|
+
Sequence< Any > arguments(1);
|
196
|
+
arguments[0] <<= object;
|
197
|
+
|
198
|
+
Reference< XInvocation2 > xinvocation(xFactory->createInstanceWithArguments(arguments), UNO_QUERY);
|
199
|
+
|
200
|
+
RubyunoInternal *rubyuno;
|
201
|
+
Data_Get_Struct(self, RubyunoInternal, rubyuno);
|
202
|
+
|
203
|
+
rubyuno->wrapped = object;
|
204
|
+
rubyuno->invocation = xinvocation;
|
205
|
+
}
|
206
|
+
|
207
|
+
|
208
|
+
/*
|
209
|
+
* Create or get modules according to name.
|
210
|
+
*/
|
211
|
+
VALUE
|
212
|
+
create_module(const OUString &name)
|
213
|
+
{
|
214
|
+
VALUE parent;
|
215
|
+
parent = get_module_class();
|
216
|
+
|
217
|
+
ID id;
|
218
|
+
sal_Int32 ends, pos, tmp;
|
219
|
+
char *s;
|
220
|
+
OUStringBuffer buf;
|
221
|
+
ends = name.lastIndexOfAsciiL(".", 1);
|
222
|
+
if (!(ends > 1))
|
223
|
+
rb_raise(rb_eArgError, "invalid name(%s)",
|
224
|
+
OUStringToOString(name, osl_getThreadTextEncoding()).getStr());
|
225
|
+
tmp = 0;
|
226
|
+
pos = name.indexOfAsciiL(".", 1, 0);
|
227
|
+
OUString tmpName = name.copy(ends + 1);
|
228
|
+
if (tmpName.getLength() < 1)
|
229
|
+
rb_raise(rb_eRuntimeError, "invalid name (%s)",
|
230
|
+
OUStringToOString(tmpName, osl_getThreadTextEncoding()).getStr());
|
231
|
+
|
232
|
+
while (pos < ends)
|
233
|
+
{
|
234
|
+
pos = name.indexOfAsciiL(".", 1, tmp);
|
235
|
+
|
236
|
+
buf.append(name.copy(tmp, 1).toAsciiUpperCase()).append(name.copy(tmp +1, pos - tmp -1));
|
237
|
+
s = (char*)(OUStringToOString(buf.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US).getStr());
|
238
|
+
|
239
|
+
id = rb_intern(s);
|
240
|
+
if (rb_const_defined(parent, id))
|
241
|
+
parent = rb_const_get(parent, id);
|
242
|
+
else
|
243
|
+
parent = rb_define_module_under(parent, s);
|
244
|
+
|
245
|
+
tmp = pos + 1;
|
246
|
+
}
|
247
|
+
return parent;
|
248
|
+
}
|
249
|
+
|
250
|
+
|
251
|
+
/*
|
252
|
+
* Find and define class (for structs and exceptions) or module (for interfaces).
|
253
|
+
*/
|
254
|
+
VALUE
|
255
|
+
find_class(const OUString &name, typelib_TypeClass typeClass)
|
256
|
+
{
|
257
|
+
ID id;
|
258
|
+
VALUE module;
|
259
|
+
sal_Int32 ends;
|
260
|
+
char *className;
|
261
|
+
|
262
|
+
module = create_module(name);
|
263
|
+
ends = name.lastIndexOfAsciiL(".", 1);
|
264
|
+
className = (char*) OUStringToOString(
|
265
|
+
name.copy(ends + 1), RTL_TEXTENCODING_ASCII_US).getStr();
|
266
|
+
id = rb_intern(className);
|
267
|
+
if (rb_const_defined(module, id))
|
268
|
+
{
|
269
|
+
return rb_const_get(module, id);
|
270
|
+
}
|
271
|
+
VALUE klass;
|
272
|
+
|
273
|
+
if (typeClass == typelib_TypeClass_STRUCT)
|
274
|
+
{
|
275
|
+
klass = rb_define_class_under(module, className, get_struct_class());
|
276
|
+
}
|
277
|
+
else if (typeClass == typelib_TypeClass_EXCEPTION)
|
278
|
+
{
|
279
|
+
klass = rb_define_class_under(module, className, get_exception_class());
|
280
|
+
}
|
281
|
+
else if (typeClass == typelib_TypeClass_INTERFACE)
|
282
|
+
{
|
283
|
+
klass = rb_define_module_under(module, className);
|
284
|
+
}
|
285
|
+
else
|
286
|
+
{
|
287
|
+
rb_raise(rb_eArgError, "unsupported type (%s)", className);
|
288
|
+
}
|
289
|
+
rb_define_const(klass, "TYPENAME", asciiOUString2VALUE(name));
|
290
|
+
return klass;
|
291
|
+
}
|
292
|
+
|
293
|
+
|
294
|
+
/*
|
295
|
+
* Define interface module.
|
296
|
+
*/
|
297
|
+
VALUE
|
298
|
+
find_interface(Reference< XTypeDescription > &xTd)
|
299
|
+
{
|
300
|
+
OUString name = xTd->getName();
|
301
|
+
|
302
|
+
VALUE module = find_class(name, (typelib_TypeClass)xTd->getTypeClass());
|
303
|
+
|
304
|
+
Reference< XInterfaceTypeDescription2 > xInterfaceTd(xTd, UNO_QUERY);
|
305
|
+
Sequence< Reference< XTypeDescription > > xBaseTypes = xInterfaceTd->getBaseTypes();
|
306
|
+
Sequence< Reference< XTypeDescription> > xOptionalTypes = xInterfaceTd->getOptionalBaseTypes();
|
307
|
+
|
308
|
+
VALUE parent;
|
309
|
+
for (int i = 0; i < xBaseTypes.getLength(); i++)
|
310
|
+
{
|
311
|
+
parent = find_interface(xBaseTypes[i]);
|
312
|
+
if (! NIL_P(parent))
|
313
|
+
rb_include_module(module, parent);
|
314
|
+
}
|
315
|
+
for (int i = 0; i < xOptionalTypes.getLength(); i++)
|
316
|
+
{
|
317
|
+
parent = find_interface(xBaseTypes[i]);
|
318
|
+
if (! NIL_P(parent))
|
319
|
+
rb_include_module(module, parent);
|
320
|
+
}
|
321
|
+
return module;
|
322
|
+
}
|
323
|
+
|
324
|
+
void
|
325
|
+
raise_rb_exception(const Any &a)
|
326
|
+
{
|
327
|
+
try
|
328
|
+
{
|
329
|
+
com::sun::star::uno::Exception e;
|
330
|
+
a >>= e;
|
331
|
+
|
332
|
+
VALUE module, klass;
|
333
|
+
Runtime runtime;
|
334
|
+
|
335
|
+
OUString typeName = a.getValueTypeName();
|
336
|
+
module = create_module(typeName);
|
337
|
+
|
338
|
+
klass = find_class(typeName, (typelib_TypeClass)a.getValueTypeClass());
|
339
|
+
|
340
|
+
rb_raise(klass, OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US).getStr());
|
341
|
+
}
|
342
|
+
catch (com::sun::star::lang::IllegalArgumentException &e)
|
343
|
+
{
|
344
|
+
rb_raise(rb_eRuntimeError, "illegal argument exception at exception conversion.");
|
345
|
+
}
|
346
|
+
catch (com::sun::star::script::CannotConvertException &e)
|
347
|
+
{
|
348
|
+
rb_raise(rb_eRuntimeError, "error at exception conversion.");
|
349
|
+
}
|
350
|
+
catch (RuntimeException &e)
|
351
|
+
{
|
352
|
+
rb_raise(rb_eRuntimeError, "runtime exception at exception conversion.");
|
353
|
+
}
|
354
|
+
}
|
355
|
+
|
356
|
+
|
357
|
+
}
|
358
|
+
|