1 #-----------------------------
3 # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
5 #-----------------------------
10 def initialize(typelib)
16 def ole_classes(typelib)
18 @ole = WIN32OLE.new(typelib)
21 WIN32OLE_TYPE.ole_classes(typelib)
25 def generate_args(method)
27 if method.size_opt_params >= 0
28 size_required_params = method.size_params - method.size_opt_params
30 size_required_params = method.size_params - 1
32 size_required_params.times do |i|
33 if method.params[i] && method.params[i].optional?
34 args.push "arg#{i}=nil"
39 if method.size_opt_params >= 0
40 method.size_opt_params.times do |i|
41 args.push "arg#{i + size_required_params}=nil"
49 def generate_argtype(typedetails)
51 typedetails.each do |t|
53 when 'CARRAY', 'VOID', 'UINT', 'RESULT', 'DECIMAL', 'I8', 'UI8'
54 # raise "Sorry type\"" + t + "\" not supported"
55 ts << "\"??? NOT SUPPORTED TYPE:`#{t}'\""
56 when 'USERDEFINED', 'Unknown Type 9'
79 def generate_argtypes(method, proptypes)
80 types = method.params.collect{|param|
81 generate_argtype(param.ole_type_detail)
84 types += ", " if types.size > 0
85 types += generate_argtype(proptypes)
90 def generate_method_body(method, disptype, types=nil)
91 " ret = #{@reciever}#{disptype}(#{method.dispid}, [" +
92 generate_args(method).gsub("=nil", "") +
94 generate_argtypes(method, types) +
96 " @lastargs = WIN32OLE::ARGV\n" +
100 def generate_method_help(method, type = nil)
105 str += method.return_type
107 str += " #{method.name}"
110 str += " in #{method.event_interface}"
112 if method.helpstring && method.helpstring != ""
114 str += method.helpstring
116 args_help = generate_method_args_help(method)
124 def generate_method_args_help(method)
126 method.params.each_with_index {|param, i|
127 h = " # #{param.ole_type} arg#{i} --- #{param.name}"
129 inout.push "IN" if param.input?
130 inout.push "OUT" if param.output?
131 h += " [#{inout.join('/')}]"
132 h += " ( = #{param.default})" if param.default
142 def generate_method(method, disptype, io = STDOUT, types = nil)
144 io.puts generate_method_help(method)
145 if method.invoke_kind == 'PROPERTYPUT'
146 io.print " def #{method.name}=("
148 io.print " def #{method.name}("
150 io.print generate_args(method)
152 io.puts generate_method_body(method, disptype, types)
156 def generate_propputref_methods(klass, io = STDOUT)
157 klass.ole_methods.select {|method|
158 method.invoke_kind == 'PROPERTYPUTREF' && method.visible?
160 generate_method(method, io)
164 def generate_properties_with_args(klass, io = STDOUT)
165 klass.ole_methods.select {|method|
166 method.invoke_kind == 'PROPERTYGET' &&
168 method.size_params > 0
170 types = method.return_type_detail
172 io.puts generate_method_help(method, types[0])
173 io.puts " def #{method.name}"
174 if klass.ole_type == "Class"
175 io.print " OLEProperty.new(@dispatch, #{method.dispid}, ["
177 io.print " OLEProperty.new(self, #{method.dispid}, ["
179 io.print generate_argtypes(method, nil)
181 io.print generate_argtypes(method, types)
187 def generate_propput_methods(klass, io = STDOUT)
188 klass.ole_methods.select {|method|
189 method.invoke_kind == 'PROPERTYPUT' && method.visible? &&
190 method.size_params == 1
192 ms = klass.ole_methods.select {|m|
193 m.invoke_kind == 'PROPERTYGET' &&
194 m.dispid == method.dispid
198 types = ms[0].return_type_detail
200 generate_method(method, '_setproperty', io, types)
204 def generate_propget_methods(klass, io = STDOUT)
205 klass.ole_methods.select {|method|
206 method.invoke_kind == 'PROPERTYGET' && method.visible? &&
207 method.size_params == 0
209 generate_method(method, '_getproperty', io)
213 def generate_func_methods(klass, io = STDOUT)
214 klass.ole_methods.select {|method|
215 method.invoke_kind == "FUNC" && method.visible?
217 generate_method(method, '_invoke', io)
221 def generate_methods(klass, io = STDOUT)
222 generate_propget_methods(klass, io)
223 generate_propput_methods(klass, io)
224 generate_properties_with_args(klass, io)
225 generate_func_methods(klass, io)
226 # generate_propputref_methods(klass, io)
229 def generate_constants(klass, io = STDOUT)
230 klass.variables.select {|v|
231 v.visible? && v.variable_kind == 'CONSTANT'
234 io.print v.name.sub(/^./){|c| c.upcase}
240 def class_name(klass)
241 klass_name = klass.name
242 if klass.ole_type == "Class" &&
245 klass_name = klass.progid.gsub(/\./, '_')
247 if /^[A-Z]/ !~ klass_name || Module.constants.include?(klass_name)
248 klass_name = 'OLE' + klass_name
253 def define_initialize(klass)
256 def initialize(obj = nil)
257 @clsid = "#{klass.guid}"
258 @progid = "#{klass.progid}"
260 @dispatch = WIN32OLE.new @progid
269 " include WIN32OLE::VARIANT"
272 def define_instance_variables
273 " attr_reader :lastargs"
276 def define_method_missing
279 def method_missing(cmd, *arg)
280 @dispatch.method_missing(cmd, *arg)
285 def define_class(klass, io = STDOUT)
286 io.puts "class #{class_name(klass)} # #{klass.name}"
287 io.puts define_include
288 io.puts define_instance_variables
289 io.puts " attr_reader :dispatch"
290 io.puts " attr_reader :clsid"
291 io.puts " attr_reader :progid"
292 io.puts define_initialize(klass)
293 io.puts define_method_missing
296 def define_module(klass, io = STDOUT)
297 io.puts "module #{class_name(klass)}"
298 io.puts define_include
299 io.puts define_instance_variables
302 def generate_class(klass, io = STDOUT)
303 io.puts "\n# #{klass.helpstring}"
304 if klass.ole_type == "Class" &&
307 @reciever = "@dispatch."
308 define_class(klass, io)
311 define_module(klass, io)
313 generate_constants(klass, io)
314 generate_methods(klass, io)
318 def generate(io = STDOUT)
319 io.puts "require 'win32ole'"
320 io.puts "require 'win32ole/property'"
322 ole_classes(typelib).select{|klass|
324 (klass.ole_type == "Class" ||
325 klass.ole_type == "Interface" ||
326 klass.ole_type == "Dispatch" ||
327 klass.ole_type == "Enum")
329 generate_class(klass, io)
341 $stderr.puts "usage: #{$0} Type Library [...]"
344 ARGV.each do |typelib|
345 comgen = WIN32COMGen.new(typelib)