jruby-win32ole 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.gitignore +7 -0
  2. data/Gemfile +4 -0
  3. data/README +0 -0
  4. data/Rakefile +8 -0
  5. data/VERSION +1 -0
  6. data/bin/make_data.rb +12 -0
  7. data/bin/sample +11 -0
  8. data/build.xml +74 -0
  9. data/jruby-win32ole.gemspec +21 -0
  10. data/lib/jruby-win32ole.rb +39 -0
  11. data/lib/jruby-win32ole/version.rb +5 -0
  12. data/lib/racob-x64.dll +0 -0
  13. data/lib/racob-x86.dll +0 -0
  14. data/lib/racob.jar +0 -0
  15. data/lib/win32ole/utils.rb +230 -0
  16. data/lib/win32ole/win32ole.jar +0 -0
  17. data/lib/win32ole/win32ole_error.rb +13 -0
  18. data/lib/win32ole/win32ole_event.rb +38 -0
  19. data/lib/win32ole/win32ole_method.rb +135 -0
  20. data/lib/win32ole/win32ole_param.rb +45 -0
  21. data/lib/win32ole/win32ole_ruby.rb +115 -0
  22. data/lib/win32ole/win32ole_type.rb +148 -0
  23. data/lib/win32ole/win32ole_typelib.rb +76 -0
  24. data/lib/win32ole/win32ole_variable.rb +41 -0
  25. data/lib/win32ole/win32ole_variant.rb +52 -0
  26. data/nbproject/build-impl.xml +800 -0
  27. data/nbproject/genfiles.properties +8 -0
  28. data/nbproject/private/config.properties +0 -0
  29. data/nbproject/private/private.properties +8 -0
  30. data/nbproject/private/private.xml +4 -0
  31. data/nbproject/project.properties +71 -0
  32. data/nbproject/project.xml +14 -0
  33. data/samples/browser_connect.rb +10 -0
  34. data/samples/const_load.rb +10 -0
  35. data/samples/dir_enum_bench.rb +24 -0
  36. data/samples/dispatch_bench.rb +44 -0
  37. data/samples/file_system_object.rb +7 -0
  38. data/samples/fs.rb +50 -0
  39. data/samples/ie_plus_events.rb +45 -0
  40. data/samples/ie_simple.rb +20 -0
  41. data/samples/ie_simple_clsid.rb +13 -0
  42. data/samples/sbem.rb +11 -0
  43. data/samples/small_enum_bench.rb +126 -0
  44. data/src/org/jruby/ext/win32ole/RubyInvocationProxy.java +34 -0
  45. data/src/org/jruby/ext/win32ole/RubyWIN32OLE.java +278 -0
  46. data/src/win32ole/Win32oleService.java +29 -0
  47. metadata +113 -0
@@ -0,0 +1,34 @@
1
+ package org.jruby.ext.win32ole;
2
+
3
+ import org.racob.com.InvocationProxy;
4
+ import org.racob.com.Variant;
5
+ import org.jruby.Ruby;
6
+ import org.jruby.runtime.ThreadContext;
7
+ import org.jruby.runtime.builtin.IRubyObject;
8
+
9
+ /**
10
+ */
11
+ public class RubyInvocationProxy extends InvocationProxy {
12
+ private final Ruby runtime;
13
+ private final IRubyObject target;
14
+
15
+ public RubyInvocationProxy(IRubyObject target) {
16
+ this.target = target;
17
+ this.runtime = target.getRuntime();
18
+ }
19
+
20
+ @Override
21
+ public Variant invoke(String methodName, Variant[] variantArgs) {
22
+ ThreadContext context = runtime.getCurrentContext();
23
+
24
+ int length = variantArgs.length;
25
+ IRubyObject[] args = new IRubyObject[length];
26
+ for (int i = 0; i < length; i++) {
27
+ args[i] = RubyWIN32OLE.fromVariant(runtime, variantArgs[i]);
28
+ }
29
+
30
+ target.callMethod(context, methodName, args);
31
+ return null;
32
+ }
33
+
34
+ }
@@ -0,0 +1,278 @@
1
+ package org.jruby.ext.win32ole;
2
+
3
+ import org.racob.com.Dispatch;
4
+ import org.racob.com.EnumVariant;
5
+ import org.racob.com.Variant;
6
+ import java.util.Calendar;
7
+ import java.util.Date;
8
+ import org.jruby.Ruby;
9
+ import org.jruby.RubyArray;
10
+ import org.jruby.RubyClass;
11
+ import org.jruby.RubyInteger;
12
+ import org.jruby.RubyObject;
13
+ import org.jruby.anno.JRubyMethod;
14
+ import org.jruby.javasupport.JavaUtil;
15
+ import org.jruby.runtime.Block;
16
+ import org.jruby.runtime.ObjectAllocator;
17
+ import org.jruby.runtime.ThreadContext;
18
+ import org.jruby.runtime.builtin.IRubyObject;
19
+ import win32ole.Win32oleService;
20
+
21
+ /**
22
+ */
23
+ public class RubyWIN32OLE extends RubyObject {
24
+ private static final Object[] EMPTY_OBJECT_ARGS = new Object[0];
25
+ private static final int[] EMPTY_ERROR_ARGS = new int[0];
26
+
27
+ public static ObjectAllocator WIN32OLE_ALLOCATOR = new ObjectAllocator() {
28
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
29
+ return new RubyWIN32OLE(runtime, klass);
30
+ }
31
+ };
32
+
33
+ public Dispatch dispatch = null;
34
+
35
+ public RubyWIN32OLE(Ruby runtime, RubyClass metaClass) {
36
+ super(runtime, metaClass);
37
+ }
38
+
39
+ private RubyWIN32OLE(Ruby runtime, RubyClass metaClass, Dispatch dispatch) {
40
+ this(runtime, metaClass);
41
+
42
+ this.dispatch = dispatch;
43
+ }
44
+
45
+ public Dispatch getDispatch() {
46
+ return dispatch;
47
+ }
48
+
49
+ // Accessor for Ruby side of win32ole to get ahold of this object
50
+ @JRubyMethod()
51
+ public IRubyObject dispatch(ThreadContext context) {
52
+ return JavaUtil.convertJavaToUsableRubyObject(context.getRuntime(), dispatch);
53
+ }
54
+
55
+ @JRubyMethod()
56
+ public IRubyObject each(ThreadContext context, Block block) {
57
+ Ruby runtime = context.getRuntime();
58
+ EnumVariant enumVariant = dispatch.toEnumVariant();
59
+
60
+ // FIXME: when no block is passed handling
61
+
62
+ while (enumVariant.hasMoreElements()) {
63
+ Variant value = enumVariant.nextElement();
64
+ block.yield(context, fromVariant(runtime, value));
65
+ }
66
+
67
+ return runtime.getNil();
68
+ }
69
+
70
+ @JRubyMethod(required = 3)
71
+ public IRubyObject _getproperty(ThreadContext context, IRubyObject dispid,
72
+ IRubyObject args, IRubyObject argTypes) {
73
+ RubyArray argsArray = args.convertToArray();
74
+ Object[] objectArgs = makeObjectArgs(argsArray);
75
+ int dispatchId = (int) RubyInteger.num2long(dispid);
76
+
77
+ if (objectArgs.length == 0) {
78
+ return fromObject(context.getRuntime(), Dispatch.callO(dispatch, dispatchId));
79
+ }
80
+
81
+ return fromVariant(context.getRuntime(),
82
+ Dispatch.call(dispatch, dispatchId, objectArgs));
83
+ }
84
+
85
+ @JRubyMethod(required = 1, rest = true)
86
+ public IRubyObject initialize(ThreadContext context, IRubyObject[] args) {
87
+ String id = args[0].convertToString().asJavaString();
88
+
89
+ dispatch = new Dispatch(toProgID(id));
90
+
91
+ return this;
92
+ }
93
+
94
+ @JRubyMethod(required = 1, rest = true)
95
+ public IRubyObject invoke(ThreadContext context, IRubyObject[] args) {
96
+ return method_missing(context, args);
97
+ }
98
+
99
+ @JRubyMethod()
100
+ public IRubyObject _invoke(ThreadContext context, IRubyObject dispid,
101
+ IRubyObject args, IRubyObject typesArray) {
102
+ return invokeInternal(context, dispid, args, args, Dispatch.Method);
103
+ }
104
+
105
+ @JRubyMethod(required = 1, rest = true)
106
+ public IRubyObject method_missing(ThreadContext context, IRubyObject[] args) {
107
+ String methodName = args[0].asJavaString();
108
+
109
+ if (methodName.endsWith("=")) return invokeSet(context,
110
+ methodName.substring(0, methodName.length() - 1), args);
111
+
112
+ return invokeMethodOrGet(context, methodName, args);
113
+ }
114
+
115
+ @JRubyMethod()
116
+ public IRubyObject ole_free(ThreadContext context) {
117
+ dispatch.safeRelease();
118
+
119
+ return context.getRuntime().getNil();
120
+ }
121
+
122
+ @JRubyMethod(name = "[]", required = 1)
123
+ public IRubyObject op_aref(ThreadContext context, IRubyObject property) {
124
+ String propertyName = property.asJavaString();
125
+
126
+ return fromVariant(context.getRuntime(), Dispatch.get(dispatch, propertyName));
127
+ }
128
+
129
+ @JRubyMethod(name = "[]=", required = 2)
130
+ public IRubyObject op_aset(ThreadContext context, IRubyObject property, IRubyObject value) {
131
+ String propertyName = property.asJavaString();
132
+
133
+ Dispatch.put(dispatch, propertyName, toObject(value));
134
+ return context.getRuntime().getNil();
135
+ }
136
+
137
+ @JRubyMethod()
138
+ public IRubyObject _setproperty(ThreadContext context, IRubyObject dispid,
139
+ IRubyObject args, IRubyObject argTypes) {
140
+ return invokeInternal(context, dispid, args, argTypes, Dispatch.Put);
141
+ }
142
+
143
+ @JRubyMethod(required = 1, rest = true)
144
+ public IRubyObject setproperty(ThreadContext context, IRubyObject[] args) {
145
+ String methodName = args[0].asJavaString();
146
+
147
+ return invokeSet(context, methodName, args);
148
+ }
149
+
150
+ private IRubyObject invokeSet(ThreadContext context, String methodName, IRubyObject[] args) {
151
+ Object[] objectArgs = makeObjectArgs(args, 1);
152
+ int[] errorArgs = new int[objectArgs.length];
153
+
154
+ Dispatch.invoke(dispatch, methodName, Dispatch.Put, objectArgs, errorArgs);
155
+ return context.getRuntime().getNil();
156
+ }
157
+
158
+ private IRubyObject invokeInternal(ThreadContext context, IRubyObject dispid,
159
+ IRubyObject args, IRubyObject argTypes, int dispatchType) {
160
+ RubyArray argsArray = args.convertToArray();
161
+ int dispatchId = (int) RubyInteger.num2long(dispid);
162
+ Object[] objectArgs = makeObjectArgs(argsArray);
163
+ int[] errorArgs = makeErrorArgs(objectArgs.length);
164
+ Variant returnValue = Dispatch.invoke(dispatch, dispatchId, dispatchType,
165
+ objectArgs, errorArgs);
166
+
167
+ return fromVariant(context.getRuntime(), returnValue);
168
+ }
169
+ private int[] makeErrorArgs(int size) {
170
+ return size <= 0 ? EMPTY_ERROR_ARGS : new int[size];
171
+ }
172
+
173
+ private Object[] makeObjectArgs(IRubyObject[] rubyArgs, int startIndex) {
174
+ int length = rubyArgs.length;
175
+ if (length - startIndex <= 0) return EMPTY_OBJECT_ARGS;
176
+
177
+ Object[] objectArgs = new Object[length - startIndex];
178
+ for (int i = startIndex; i < length; i++) {
179
+ objectArgs[i - startIndex] = RubyWIN32OLE.toObject(rubyArgs[i]);
180
+ }
181
+
182
+ return objectArgs;
183
+ }
184
+
185
+ private Object[] makeObjectArgs(RubyArray argsArray) {
186
+ int length = argsArray.size();
187
+ if (length <= 0) return EMPTY_OBJECT_ARGS;
188
+
189
+ Object[] objectArgs = new Object[length];
190
+ for (int i = 0; i < length; i++) {
191
+ Object object = toObject(argsArray.eltInternal(i));
192
+ objectArgs[i] = object;
193
+ }
194
+
195
+ return objectArgs;
196
+ }
197
+
198
+ private IRubyObject invokeMethodOrGet(ThreadContext context, String methodName, IRubyObject[] args) {
199
+ if (args.length == 1) { // No-arg call
200
+ return fromObject(context.getRuntime(), Dispatch.callO(dispatch, methodName));
201
+ }
202
+ return fromVariant(context.getRuntime(),
203
+ Dispatch.callN(dispatch, methodName, makeObjectArgs(args, 1)));
204
+ }
205
+
206
+ @Override
207
+ public Object toJava(Class klass) {
208
+ return dispatch;
209
+ }
210
+
211
+ public static Object toObject(IRubyObject rubyObject) {
212
+ return rubyObject.toJava(Object.class);
213
+ }
214
+
215
+ public static IRubyObject fromObject(Ruby runtime, Object object) {
216
+ if (object == null) return runtime.getNil();
217
+
218
+ if (object instanceof Boolean) {
219
+ return runtime.newBoolean(((Boolean) object).booleanValue());
220
+ } else if (object instanceof Dispatch) {
221
+ return new RubyWIN32OLE(runtime, Win32oleService.getMetaClass(), (Dispatch) object);
222
+ } else if (object instanceof Date) {
223
+ return date2ruby(runtime, (Date) object);
224
+ } else if (object instanceof Number) {
225
+ if (object instanceof Double) {
226
+ return runtime.newFloat(((Double) object).doubleValue());
227
+ } else if (object instanceof Float) {
228
+ return runtime.newFloat(((Float) object).doubleValue());
229
+ }
230
+
231
+ return runtime.newFixnum(((Number) object).intValue());
232
+ } else if (object instanceof String) {
233
+ return runtime.newString((String) object);
234
+ }
235
+
236
+ return JavaUtil.convertJavaToUsableRubyObject(runtime, object);
237
+ }
238
+
239
+ public static IRubyObject fromVariant(Ruby runtime, Variant variant) {
240
+ if (variant == null) return runtime.getNil();
241
+
242
+ switch (variant.getType()) {
243
+ case Variant.VariantBoolean:
244
+ return runtime.newBoolean(variant.getBoolean());
245
+ case Variant.VariantDispatch:
246
+ return new RubyWIN32OLE(runtime, Win32oleService.getMetaClass(), variant.getDispatch());
247
+ case Variant.VariantDate:
248
+ return date2ruby(runtime, variant.getDate());
249
+ case Variant.VariantInt:
250
+ case Variant.VariantShort:
251
+ return runtime.newFixnum(variant.getInt());
252
+ case Variant.VariantDouble:
253
+ return runtime.newFloat(variant.getDouble());
254
+ case Variant.VariantFloat:
255
+ return runtime.newFloat(variant.getFloat());
256
+ case Variant.VariantString:
257
+ return runtime.newString(variant.getString());
258
+ }
259
+
260
+ return JavaUtil.convertJavaToUsableRubyObject(runtime, variant.toJavaObject());
261
+ }
262
+
263
+ public static IRubyObject date2ruby(Ruby runtime, Date date) {
264
+ Calendar cal = Calendar.getInstance();
265
+
266
+ cal.setTime(date);
267
+
268
+ return runtime.newTime(cal.getTimeInMillis());
269
+ }
270
+
271
+ public static String toProgID(String id) {
272
+ if (id != null && id.startsWith("{{") && id.endsWith("}}")) {
273
+ return id.substring(2, id.length() - 2);
274
+ }
275
+
276
+ return id;
277
+ }
278
+ }
@@ -0,0 +1,29 @@
1
+ package win32ole;
2
+
3
+ import org.racob.com.LibraryLoader;
4
+ import java.io.IOException;import java.lang.ref.WeakReference;
5
+ import org.jruby.Ruby;
6
+ import org.jruby.RubyClass;
7
+ import org.jruby.ext.win32ole.RubyWIN32OLE;
8
+ import org.jruby.runtime.load.BasicLibraryService;
9
+
10
+ public class Win32oleService implements BasicLibraryService {
11
+ static WeakReference<RubyClass> win32oleClass;
12
+
13
+ public boolean basicLoad(Ruby runtime) throws IOException {
14
+ LibraryLoader.loadLibrary();
15
+ RubyClass object = runtime.getObject();
16
+ RubyClass win32ole = runtime.defineClass("WIN32OLE", object,
17
+ RubyWIN32OLE.WIN32OLE_ALLOCATOR);
18
+
19
+ win32ole.defineAnnotatedMethods(RubyWIN32OLE.class);
20
+
21
+ win32oleClass = new WeakReference<RubyClass>(win32ole);
22
+
23
+ return true;
24
+ }
25
+
26
+ public static RubyClass getMetaClass() {
27
+ return win32oleClass.get();
28
+ }
29
+ }
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jruby-win32ole
3
+ version: !ruby/object:Gem::Version
4
+ hash: 63
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 8
9
+ - 0
10
+ version: 0.8.0
11
+ platform: ruby
12
+ authors:
13
+ - Thomas E. Enebo
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-21 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: A Gem for win32ole support on JRuby
23
+ email: tom.enebo@gmail.com
24
+ executables:
25
+ - make_data.rb
26
+ - sample
27
+ extensions: []
28
+
29
+ extra_rdoc_files: []
30
+
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - README
35
+ - Rakefile
36
+ - VERSION
37
+ - bin/make_data.rb
38
+ - bin/sample
39
+ - build.xml
40
+ - jruby-win32ole.gemspec
41
+ - lib/jruby-win32ole.rb
42
+ - lib/jruby-win32ole/version.rb
43
+ - lib/racob-x64.dll
44
+ - lib/racob-x86.dll
45
+ - lib/racob.jar
46
+ - lib/win32ole/utils.rb
47
+ - lib/win32ole/win32ole.jar
48
+ - lib/win32ole/win32ole_error.rb
49
+ - lib/win32ole/win32ole_event.rb
50
+ - lib/win32ole/win32ole_method.rb
51
+ - lib/win32ole/win32ole_param.rb
52
+ - lib/win32ole/win32ole_ruby.rb
53
+ - lib/win32ole/win32ole_type.rb
54
+ - lib/win32ole/win32ole_typelib.rb
55
+ - lib/win32ole/win32ole_variable.rb
56
+ - lib/win32ole/win32ole_variant.rb
57
+ - nbproject/build-impl.xml
58
+ - nbproject/genfiles.properties
59
+ - nbproject/private/config.properties
60
+ - nbproject/private/private.properties
61
+ - nbproject/private/private.xml
62
+ - nbproject/project.properties
63
+ - nbproject/project.xml
64
+ - samples/browser_connect.rb
65
+ - samples/const_load.rb
66
+ - samples/dir_enum_bench.rb
67
+ - samples/dispatch_bench.rb
68
+ - samples/file_system_object.rb
69
+ - samples/fs.rb
70
+ - samples/ie_plus_events.rb
71
+ - samples/ie_simple.rb
72
+ - samples/ie_simple_clsid.rb
73
+ - samples/sbem.rb
74
+ - samples/small_enum_bench.rb
75
+ - src/org/jruby/ext/win32ole/RubyInvocationProxy.java
76
+ - src/org/jruby/ext/win32ole/RubyWIN32OLE.java
77
+ - src/win32ole/Win32oleService.java
78
+ has_rdoc: true
79
+ homepage: http://github.com/enebo/jruby-win32ole
80
+ licenses: []
81
+
82
+ post_install_message:
83
+ rdoc_options: []
84
+
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ requirements: []
106
+
107
+ rubyforge_project: jruby-win32ole
108
+ rubygems_version: 1.3.7
109
+ signing_key:
110
+ specification_version: 3
111
+ summary: A Gem for win32ole support on JRuby
112
+ test_files: []
113
+