Class: VirtualBox::COM::AbstractInterface
- Inherits:
-
AbstractModel
- Object
- AbstractModel
- VirtualBox::COM::AbstractInterface
- Defined in:
- lib/virtualbox/com/abstract_interface.rb
Overview
# Defining an Interface
Defining an interface is done by subclassing AbstractInterface and using the provided class methods to define the COM methods and properties. A small example class is shown below:
class Time < AbstractInterface
function :now, [[:out, :uint]]
property :hour, :uint
end
# Accessing an Interface
# Assume `time` was retrieved already
puts time.foo.to_s
time.hour = 20
x = time.now
The above example shows how the properties and functions can be used with a given interface.
Direct Known Subclasses
Model::AdditionsFacility, Model::AdditionsStateChangedEvent, Model::Appliance, Model::AudioAdapter, Model::BIOSSettings, Model::BandwidthControl, Model::BandwidthGroup, Model::BandwidthGroupChangedEvent, Model::CPUChangedEvent, Model::CPUExecutionCapChangedEvent, Model::CanShowWindowEvent, Model::ClipboardModeChangedEvent, Model::Console, Model::DHCPServer, Model::Directory, Model::Display, Model::DragAndDropModeChangedEvent, Model::Event, Model::EventListener, Model::EventSource, Model::EventSourceChangedEvent, Model::ExtPack, Model::ExtPackBase, Model::ExtPackFile, Model::ExtPackManager, Model::ExtPackPlugIn, Model::ExtraDataCanChangeEvent, Model::ExtraDataChangedEvent, Model::File, Model::Framebuffer, Model::FramebufferOverlay, Model::FsObjInfo, Model::Guest, Model::GuestDirectory, Model::GuestFile, Model::GuestFsObjInfo, Model::GuestKeyboardEvent, Model::GuestMonitorChangedEvent, Model::GuestMouseEvent, Model::GuestOSType, Model::GuestProcess, Model::GuestPropertyChangedEvent, Model::GuestSession, Model::Host, Model::HostNetworkInterface, Model::HostPCIDevicePlugEvent, Model::HostUSBDevice, Model::HostUSBDeviceFilter, Model::InternalMachineControl, Model::InternalSessionControl, Model::Keyboard, Model::KeyboardLedsChangedEvent, Model::Machine, Model::MachineDataChangedEvent, Model::MachineDebugger, Model::MachineEvent, Model::MachineRegisteredEvent, Model::MachineStateChangedEvent, Model::Medium, Model::MediumAttachment, Model::MediumChangedEvent, Model::MediumFormat, Model::MediumRegisteredEvent, Model::Mouse, Model::MouseCapabilityChangedEvent, Model::MousePointerShapeChangedEvent, Model::NATEngine, Model::NATRedirectEvent, Model::NSISupports, Model::NetworkAdapter, Model::NetworkAdapterChangedEvent, Model::PCIAddress, Model::PCIDeviceAttachment, Model::ParallelPort, Model::ParallelPortChangedEvent, Model::PerformanceCollector, Model::PerformanceMetric, Model::Process, Model::Progress, Model::ReusableEvent, Model::RuntimeErrorEvent, Model::SerialPort, Model::SerialPortChangedEvent, Model::Session, Model::SessionStateChangedEvent, Model::SharedFolder, Model::SharedFolderChangedEvent, Model::ShowWindowEvent, Model::Snapshot, Model::SnapshotChangedEvent, Model::SnapshotDeletedEvent, Model::SnapshotEvent, Model::SnapshotTakenEvent, Model::StateChangedEvent, Model::StorageController, Model::StorageControllerChangedEvent, Model::StorageDeviceChangedEvent, Model::SystemProperties, Model::USBController, Model::USBControllerChangedEvent, Model::USBDevice, Model::USBDeviceFilter, Model::USBDeviceStateChangedEvent, Model::VBoxSVCAvailabilityChangedEvent, Model::VFSExplorer, Model::VRDEServer, Model::VRDEServerChangedEvent, Model::VRDEServerInfo, Model::VRDEServerInfoChangedEvent, Model::VetoEvent, Model::VirtualBox, Model::VirtualBoxClient, Model::VirtualBoxErrorInfo, Model::VirtualSystemDescription
Instance Attribute Summary collapse
-
#implementer ⇒ Object
readonly
Returns the value of attribute implementer.
Class Method Summary collapse
-
.extends(model) ⇒ Object
Extends the current model with another one.
-
.function(name, type, args, opts = {}) ⇒ Object
Adds a function to the interface.
-
.functions ⇒ Object
List of functions (Spec::Function).
-
.member(name) ⇒ Object
Get a member by name.
-
.members ⇒ Object
List of members (Spec::*).
-
.properties ⇒ Object
List if properties (Spec::Property).
-
.property(name, type, opts = {}) ⇒ Object
Adds a property to the interface.
-
.setup ⇒ Object
Perform final setup.
Instance Method Summary collapse
-
#call_function(name, *args) ⇒ Object
Calls a function with the given name.
-
#cast(name) ⇒ Object
Cast to another model.
-
#initialize(*args) ⇒ AbstractInterface
constructor
Initializes the interface with the given implementer.
-
#inspect ⇒ Object
Concise inspect.
-
#read_property(name) ⇒ Object
Reads a property with the given name.
-
#write_property(name, value) ⇒ Object
Writes a property with the given name.
Methods inherited from AbstractModel
Constructor Details
#initialize(*args) ⇒ AbstractInterface
Initializes the interface with the given implementer
103 104 105 106 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 103 def initialize(*args) @args = args @implementer = Implementer.new(self, *args) end |
Instance Attribute Details
#implementer ⇒ Object (readonly)
Returns the value of attribute implementer.
30 31 32 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 30 def implementer @implementer end |
Class Method Details
.extends(model) ⇒ Object
Extends the current model with another one. Note that redefining functions or properties is not supported.
36 37 38 39 40 41 42 43 44 45 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 36 def extends(model) Model.get(model).members.each do |spec| if h.include?(spec.name) raise "redefining of #{spec.name} is not supported" end h[spec.name] = spec end rescue ModelNotFoundException raise "trying to extend an unknown model (#{model})" end |
.function(name, type, args, opts = {}) ⇒ Object
Adds a function to the interface
48 49 50 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 48 def function(name, type, args, opts={}) h[name] = Spec::Function.new(name, type, args, opts) end |
.functions ⇒ Object
List of functions (Spec::Function)
87 88 89 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 87 def functions members.select {|s| s.kind_of?(Spec::Function) } end |
.member(name) ⇒ Object
Get a member by name
77 78 79 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 77 def member(name) h[name] end |
.members ⇒ Object
List of members (Spec::*)
82 83 84 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 82 def members h.values end |
.properties ⇒ Object
List if properties (Spec::Property)
92 93 94 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 92 def properties members.select {|s| s.kind_of?(Spec::Property) } end |
.property(name, type, opts = {}) ⇒ Object
Adds a property to the interface
53 54 55 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 53 def property(name, type, opts={}) h[name] = Spec::Property.new(name, type, opts) end |
.setup ⇒ Object
Perform final setup
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 58 def setup members.each {|spec| name = spec.name case spec when Spec::Function define_method(name) { |*args| @implementer.call_function(spec, *args) } unless spec.hide? when Spec::Property define_method(name) { @implementer.read_property(spec) } unless spec.hide? define_method(:"#{name}=") { |value| @implementer.write_property(spec, value) } unless spec.hide? || spec.readonly? end } end |
Instance Method Details
#call_function(name, *args) ⇒ Object
Calls a function with the given name
130 131 132 133 134 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 130 def call_function(name, *args) spec = self.class.member(name) raise "#{name} is not a function" unless spec.kind_of?(Spec::Function) @implementer.call_function(spec, args) end |
#cast(name) ⇒ Object
Cast to another model
110 111 112 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 110 def cast(name) @implementer.cast(name, *@args) end |
#inspect ⇒ Object
Concise inspect
138 139 140 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 138 def inspect "#<#{self.class.name}>" end |
#read_property(name) ⇒ Object
Reads a property with the given name
115 116 117 118 119 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 115 def read_property(name) spec = self.class.member(name) raise "#{name} is not a property" unless spec.kind_of?(Spec::Property) @implementer.read_property(spec) end |
#write_property(name, value) ⇒ Object
Writes a property with the given name
122 123 124 125 126 127 |
# File 'lib/virtualbox/com/abstract_interface.rb', line 122 def write_property(name, value) spec = self.class.member(name) raise "#{name} is not a property" unless spec.kind_of?(Spec::Property) raise "property #{name} is readonly" if spec.readonly? @implementer.write_property(spec, value) end |