Class: VirtualBox::COM::Implementer::MSCOM
- Inherits:
-
Base
show all
- Defined in:
- lib/virtualbox/com/implementer/mscom.rb
Instance Attribute Summary (collapse)
#interface, #lib
Instance Method Summary
(collapse)
-
- (Object) call_function(name, args, opts)
Calls a function from the interface with the given name.
-
- (MSCOM) initialize(interface, lib_base, object)
constructor
Initializes the MSCOM implementer.
-
- (Object) read_array_of_interface(value, type)
-
- (Object) read_array_of_unicode_string(value, type)
-
- (Object) read_char(value, type)
-
- (Object) read_enum(value, type)
-
- (Object) read_int(value, type)
-
- (Object) read_interface(value, type)
-
- (Object) read_long(value, type)
-
- (Object) read_property(name, opts)
Reads a property from the interface with the given name.
-
- (Object) read_uint(value, type)
-
- (Object) read_ulong(value, type)
-
- (Object) read_unicode_string(value, type)
-
- (Object) read_ushort(value, type)
-
- (Object) returnable_value(value, type)
Takes a value (returned from a WIN32OLE object) and a type and converts to
a proper ruby return value type.
-
- (Object) single_type_to_arg(args, item, results)
Converts a single type and args list to the proper formal args list.
-
- (Object) spec_to_args(spec, args)
Takes a function spec and an argument list.
-
- (Object) write_property(name, value, opts)
Writes a property from the interface with the given name and value.
Methods inherited from Base
#infer_type, #interface_klass, #ruby_version
Methods included from Logger
included, #logger, #logger_output=
Constructor Details
- (MSCOM) initialize(interface, lib_base, object)
Initializes the MSCOM implementer.
11
12
13
14
15
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 11
def initialize(interface, lib_base, object)
super(interface, lib_base)
@object = object
end
|
Instance Attribute Details
- (Object) object
Returns the value of attribute object
5
6
7
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 5
def object
@object
end
|
Instance Method Details
- (Object) call_function(name, args, opts)
Calls a function from the interface with the given name
47
48
49
50
51
52
53
54
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 47
def call_function(name, args, opts)
args = spec_to_args(opts[:spec], args)
value = @object.send(COM::FFI::Util.camelize(name.to_s), *args)
returnable_value(value, opts[:value_type])
end
|
- (Object) read_array_of_interface(value, type)
178
179
180
181
182
183
184
185
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 178
def read_array_of_interface(value, type)
klass = interface_klass(type.first)
value.collect do |item|
if !item.nil?
klass.new(self.class, lib, item)
end
end
end
|
- (Object) read_array_of_unicode_string(value, type)
173
174
175
176
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 173
def read_array_of_unicode_string(value, type)
value
end
|
- (Object) read_char(value, type)
139
140
141
142
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 139
def read_char(value, type)
!(value.to_s == "0")
end
|
- (Object) read_enum(value, type)
164
165
166
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 164
def read_enum(value, type)
interface_klass(type)[value]
end
|
- (Object) read_int(value, type)
156
157
158
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 156
def read_int(value, type)
value.to_i
end
|
- (Object) read_interface(value, type)
168
169
170
171
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 168
def read_interface(value, type)
return nil if value.nil?
interface_klass(type).new(self.class, lib, value)
end
|
- (Object) read_long(value, type)
160
161
162
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 160
def read_long(value, type)
value.to_i
end
|
- (Object) read_property(name, opts)
Reads a property from the interface with the given name.
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 18
def read_property(name, opts)
method = COM::FFI::Util.camelize(name.to_s)
value = if ruby_version >= 1.9
@object.send(method)
else
@object[method]
end
returnable_value(value, opts[:value_type])
end
|
- (Object) read_uint(value, type)
148
149
150
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 148
def read_uint(value, type)
value.to_i
end
|
- (Object) read_ulong(value, type)
152
153
154
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 152
def read_ulong(value, type)
value.to_i
end
|
- (Object) read_unicode_string(value, type)
134
135
136
137
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 134
def read_unicode_string(value, type)
value
end
|
- (Object) read_ushort(value, type)
144
145
146
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 144
def read_ushort(value, type)
value.to_i
end
|
- (Object) returnable_value(value, type)
Takes a value (returned from a WIN32OLE object) and a type and converts to
a proper ruby return value type.
123
124
125
126
127
128
129
130
131
132
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 123
def returnable_value(value, type)
return nil if type.nil? || type == :void
klass = type.is_a?(Array) ? type.first : type
ignore, inferred_type = infer_type(klass)
array_of = type.is_a?(Array) ? "array_of_" : ""
send("read_#{array_of}#{inferred_type}", value, type)
end
|
- (Object) single_type_to_arg(args, item, results)
Converts a single type and args list to the proper formal args list
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 82
def single_type_to_arg(args, item, results)
if item.is_a?(Array) && item.length == 1
data = args.shift
results << data.inject([]) do |converted_data, single|
single_type_to_arg([single], item[0], converted_data)
end
elsif item.to_s[0,1] == item.to_s[0,1].upcase
interface = interface_klass(item.to_sym)
if interface.superclass == COM::AbstractInterface
instance = args.shift
results << if !instance.nil?
instance.implementer.object
else
nil
end
elsif interface.superclass == COM::AbstractEnum
results << interface.index(args.shift.to_sym)
end
elsif item == T_BOOL
results << (args.shift ? 1 : 0)
else
results << args.shift
end
end
|
- (Object) spec_to_args(spec, args)
Takes a function spec and an argument list. This handles properly
converting enums to ints and AbstractInterfaces to proper MSCOM
interfaces.
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 63
def spec_to_args(spec, args)
args = args.dup
spec = spec.collect do |item|
if item.is_a?(Array) && item[0] == :out
nil
else
item
end
end.compact
spec = spec.inject([]) do |results, item|
single_type_to_arg(args, item, results)
end
end
|
- (Object) write_property(name, value, opts)
Writes a property from the interface with the given name and value.
34
35
36
37
38
39
40
41
42
43
44
|
# File 'lib/virtualbox/com/implementer/mscom.rb', line 34
def write_property(name, value, opts)
method = COM::FFI::Util.camelize(name.to_s)
value = spec_to_args([opts[:value_type]], [value]).first
if ruby_version >= 1.9
@object.send("#{method}=", value)
else
@object[method] = value
end
end
|