e35e9d6317da2985728e7510bea9337b9893b66evboxsync# -*- coding: utf-8 -*-
e35e9d6317da2985728e7510bea9337b9893b66evboxsyncVirtualBox Python API Glue.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync Copyright (C) 2009-2015 Oracle Corporation
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync This file is part of VirtualBox Open Source Edition (OSE), as
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync available from http://www.virtualbox.org. This file is free software;
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync you can redistribute it and/or modify it under the terms of the GNU
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync General Public License (GPL) as published by the Free Software
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync Foundation, in version 2 as it comes in the "COPYING" file of the
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync# Note! To set Python bitness on OSX use 'export VERSIONER_PYTHON_PREFER_32_BIT=yes'
e35e9d6317da2985728e7510bea9337b9893b66evboxsync# Standard Python imports.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync """The new-style print function for Python 2.4 and 2.5."""
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if fp is None:
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync # If the file has an encoding, encode unicode with it.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if isinstance(fp, file) and isinstance(data, unicode) and fp.encoding is not None:
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if sep is not None:
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if end is not None:
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync raise TypeError("invalid keyword arguments to print()")
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if sep is None:
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if end is None:
e35e9d6317da2985728e7510bea9337b9893b66evboxsync# Globals, environment and sys.path changes.
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncVBoxBinDir = os.environ.get("VBOX_PROGRAM_PATH", None)
f37c0dc2087212002585aeb0a5b778da036b1a21vboxsync VBoxBinDir = '/Applications/VirtualBox.app/Contents/MacOS'
f37c0dc2087212002585aeb0a5b778da036b1a21vboxsync else: # Will be set by the installer
f37c0dc2087212002585aeb0a5b778da036b1a21vboxsync VBoxSdkDir = '/Applications/VirtualBox.app/Contents/MacOS/sdk'
f37c0dc2087212002585aeb0a5b778da036b1a21vboxsync else: # Will be set by the installer
e35e9d6317da2985728e7510bea9337b9893b66evboxsync# Import the generated VirtualBox constants.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsyncfrom .VirtualBox_constants import VirtualBoxReflectionInfo
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ This class provides a wrapper over IPerformanceCollector in order to
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync get more 'pythonic' interface.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync To begin collection of metrics use setup() method.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync To get collected data use query() method.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync It is possible to disable metric collection without changing collection
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync parameters with disable() method. The enable() method resumes metric
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync collection.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Initializes the instance.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Discards all previously collected values for the specified
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync metrics, sets the period of collection and the number of retained
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync samples, enables collection.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.collector.setupMetrics(names, objects, period, nsamples)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Resumes metric collection for the specified metrics.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Suspends metric collection for the specified metrics.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Retrieves collected metric values as well as some auxiliary
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync information. Returns an array of dictionaries, one dictionary per
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync metric. Each dictionary contains the following entries:
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'name': metric name
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'object': managed object this metric associated with
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'unit': unit of measurement
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'scale': divide 'values' by this number to get float numbers
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'values': collected data
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'values_as_string': pre-processed values ready for 'print' statement
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync # Get around the problem with input arrays returned in output
aaa80e9df329609078dea844a11f2611443b677avboxsync # parameters (see #3953) for MSCOM.
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync (values, names, objects, names_out, objects_out, units, scales, sequence_numbers,
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync indices, lengths) = self.collector.queryMetricsData(names, objects)
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync (values, names_out, objects_out, units, scales, sequence_numbers,
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync indices, lengths) = self.collector.queryMetricsData(names, objects)
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync 'values': [int(values[j]) for j in xrange(int(indices[i]), int(indices[i]) + int(lengths[i]))],
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync 'values_as_string': '[' + ', '.join([fmt % (int(values[j]) / scale, units[i]) for j in
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync xrange(int(indices[i]), int(indices[i]) + int(lengths[i]))]) + ']'
e35e9d6317da2985728e7510bea9337b9893b66evboxsync# Attribute hacks.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync## This is for saving the original DispatchBaseClass __getattr__ and __setattr__
e35e9d6317da2985728e7510bea9337b9893b66evboxsync# method references.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync 'getattr': None,
e35e9d6317da2985728e7510bea9337b9893b66evboxsync 'setattr': None,
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync """ Our getattr replacement for DispatchBaseClass. """
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Fastpath.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if oRet is not None:
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Try case-insensitivity workaround for class attributes (COM methods).
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync setattr(self.__class__, sAttr, self.__class__.__dict__[k])
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Slow path.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync return _g_dCOMForward['getattr'](self, ComifyName(sAttr))
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync """ Our setattr replacement for DispatchBaseClass. """
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync return _g_dCOMForward['setattr'](self, ComifyName(sAttr), oValue)
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync return _g_dCOMForward['setattr'](self, sAttr, oValue)
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Base class for the platform specific code.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Gets a the IVirtualBox singleton.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Get a session object that can be used for opening machine sessions.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync The oIVBox parameter is an getVirtualBox() return value, i.e. an
e35e9d6317da2985728e7510bea9337b9893b66evboxsync IVirtualBox reference.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync See also openMachineSession.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ Returns the platform type (class name sans 'Platform'). """
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Returns True if remote (web services) and False if local (COM/XPCOM).
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Retrives the value of the array attribute 'sAttrib' from
e35e9d6317da2985728e7510bea9337b9893b66evboxsync interface 'oInterface'.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync This is for hiding platform specific differences in attributes
e35e9d6317da2985728e7510bea9337b9893b66evboxsync returning arrays.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Does backend specific initialization for the calling thread.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Does backend specific uninitialization for the calling thread.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Instantiates and wraps an active event listener class so it can be
e35e9d6317da2985728e7510bea9337b9893b66evboxsync passed to an event source for registration.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync oImplClass is a class (type, not instance) which implements
e35e9d6317da2985728e7510bea9337b9893b66evboxsync IEventListener.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync dArgs is a dictionary with string indexed variables. This may be
e35e9d6317da2985728e7510bea9337b9893b66evboxsync modified by the method to pass platform specific parameters. Can
e35e9d6317da2985728e7510bea9337b9893b66evboxsync This currently only works on XPCOM. COM support is not possible due to
e35e9d6317da2985728e7510bea9337b9893b66evboxsync shortcuts taken in the COM bridge code, which is not under our control.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Use passive listeners for COM and web services.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync raise Exception("No active listeners for this platform")
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Wait for events to arrive and process them.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync The timeout (cMsTimeout) is in milliseconds for how long to wait for
e35e9d6317da2985728e7510bea9337b9893b66evboxsync events to arrive. A negative value means waiting for ever, while 0
e35e9d6317da2985728e7510bea9337b9893b66evboxsync does not wait at all.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Returns 0 if events was processed.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Returns 1 if timed out or interrupted in some way.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Returns 2 on error (like not supported for web services).
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Raises an exception if the calling thread is not the main thread (the one
e35e9d6317da2985728e7510bea9337b9893b66evboxsync that initialized VirtualBoxManager) or if the time isn't an integer.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Interrupt a waitForEvents call.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync This is normally called from a worker thread to wake up the main thread.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Returns True on success, False on failure.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Unitializes the platform specific backend.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
e35e9d6317da2985728e7510bea9337b9893b66evboxsync IUnknown::QueryInterface wrapper.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync oIUnknown is who to ask.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync sClassName is the name of the interface we're asking for.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Error (exception) access methods.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Returns the COM status code from the VBox API given exception.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Returns True if the exception indicates that the interface is dead, False if not.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Checks if the exception oXcpt is equal to the COM/XPCOM status code
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync The oXcpt parameter can be any kind of object, we'll just return True
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync if it doesn't behave like a our exception class.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Will not raise any exception as long as hrStatus and self are not bad.
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync # Fudge for 32-bit signed int conversion.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if 0x7fffffff < hrStatus <= 0xffffffff and hrXcpt < 0:
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Returns the best error message found in the COM-like exception.
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync Returns None to fall back on xcptToString.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Raises exception if oXcpt isn't our kind of exception object.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Returns the base exception class.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Copy/whatever all error constants onto oDst.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Copy everything that looks like error constants from oDst to oSrc.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync if sAttr[0].isupper() and (sAttr[1].isupper() or sAttr[1] == '_'):
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Platform specific code for MS COM.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync ## @name VirtualBox COM Typelib definitions (should be generate)
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # @remarks Must be updated when the corresponding VirtualBox.xidl bits
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # are changed. Fortunately this isn't very often.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync VBOX_TLB_GUID = '{D7569351-1750-46F0-936E-BD127D5BC264}'
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Since the code runs on all platforms, we have to do a lot of
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # importing here instead of at the top of the file where it's normally located.
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32com.client import gencache, DispatchBaseClass
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32api import GetCurrentThread, GetCurrentThreadId, DuplicateHandle, GetCurrentProcess
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync handle = DuplicateHandle(pid, GetCurrentThread(), pid, 0, 0, DUPLICATE_SAME_ACCESS)
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Hack the COM dispatcher base class so we can modify method and
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # attribute names to match those in xpcom.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync _g_dCOMForward['getattr'] = DispatchBaseClass.__dict__['__getattr__']
e35e9d6317da2985728e7510bea9337b9893b66evboxsync _g_dCOMForward['setattr'] = DispatchBaseClass.__dict__['__setattr__']
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync setattr(DispatchBaseClass, '__getattr__', _CustomGetAttr)
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync setattr(DispatchBaseClass, '__setattr__', _CustomSetAttr)
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Hack the exception base class so the users doesn't need to check for
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # XPCOM or COM and do different things.
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync # Make sure the gencache is correct (we don't quite follow the COM
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync # versioning rules).
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync win32com.client.gencache.EnsureDispatch('VirtualBox.Session')
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync win32com.client.gencache.EnsureDispatch('VirtualBox.VirtualBox')
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync Flushes VBox related files in the win32com gen_py cache.
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync This is necessary since we don't follow the typelib versioning rules
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync that everyeone else seems to subscribe to.
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync # The EnsureModule method have broken validation code, it doesn't take
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync # typelib module directories into account. So we brute force them here.
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync # (It's possible the directory approach is from some older pywin
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync # version or the result of runnig makepy or gencache manually, but we
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync # need to cover it as well.)
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync sName = oGenCache.GetGeneratedFileName(self.VBOX_TLB_GUID, self.VBOX_TLB_LCID,
3eef14636dd78f6e25610b89aec40879e657caf4vboxsync # Ensure that our typelib is valid.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return oGenCache.EnsureModule(self.VBOX_TLB_GUID, self.VBOX_TLB_LCID, self.VBOX_TLB_MAJOR, self.VBOX_TLB_MINOR)
1d96c25e994a2160c1697208bb398d79ca117c4avboxsync return win32com.client.Dispatch("VirtualBox.Session")
2ea0ec406117609d51bd5ac51cbb3d4f0de9a16dvboxsync return win32com.client.Dispatch("VirtualBox.VirtualBox")
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'MSCOM'
989c8375a95357db2bd39e0897fdcb218e749b30vboxsync raise Exception('no active listeners on Windows as PyGatewayBase::QueryInterface() '
989c8375a95357db2bd39e0897fdcb218e749b30vboxsync 'returns new gateway objects all the time, thus breaking EventQueue '
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync 'assumptions about the listener interface pointer being constants between calls ')
989c8375a95357db2bd39e0897fdcb218e749b30vboxsync # Did this code ever really work?
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync str_ += " _typelib_version_ = tlb_major, tlb_minor\n"
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync str_ += " _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync # Maybe we'd better implement Dynamic invoke policy, to be more flexible here
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync str_ += " _reg_policy_spec_ = 'win32com.server.policy.EventHandlerPolicy'\n"
dafcc1aee6fa9a280e6c6d7630132e5a778f3a6fvboxsync # capitalized version of listener method
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync str_ += " def __init__(self): BaseClass.__init__(self, dArgs)\n"
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync str_ += "result = win32com.server.util.wrap(ListenerImpl())\n"
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync exec(str_, d, d)
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync return d['result']
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync from win32event import MsgWaitForMultipleObjects, \
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync raise TypeError("The timeout argument is not an integer")
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync raise Exception("wait for events from the same thread you inited!")
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync rc = MsgWaitForMultipleObjects(self.handles, 0, cMsTimeout, QS_ALLINPUT)
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if WAIT_OBJECT_0 <= rc < WAIT_OBJECT_0 + len(self.handles):
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync # is it possible?
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync # Waiting messages
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync # check for interruption
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Basically a python implementation of NativeEventQueue::postEvent().
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync The magic value must be in sync with the C++ implementation or this
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync won't work.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Note that because of this method we cannot easily make use of a
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync non-visible Window to handle the message like we would like to do.
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync PostThreadMessage(self.tid, WM_USER, None, 0xf241b819)
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if h is not None:
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # The DISP_E_EXCEPTION + excptinfo fun needs checking up, only
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # empirical info on it so far.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync 0x800706ba, -2147023174, # RPC_S_SERVER_UNAVAILABLE.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # XPCOM compatability constants.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Platform specific code for XPCOM.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync sys.path.append(VBoxSdkDir + '/bindings/xpcom/python/')
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return xpcom.components.classes["@virtualbox.org/Session;1"].createInstance()
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return xpcom.components.classes["@virtualbox.org/VirtualBox;1"].createInstance()
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'XPCOM'
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return oInterface.__getattr__('get' + ComifyName(sAttrib))()
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _com_interfaces_ = xpcom.components.interfaces.IEventListener\n"
e35e9d6317da2985728e7510bea9337b9893b66evboxsync str += " def __init__(self): BaseClass.__init__(self, dArgs)\n"
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync exec(str, d, d)
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync return d['result']
e35e9d6317da2985728e7510bea9337b9893b66evboxsync return oIUnknown.queryInterface(getattr(xpcom.components.interfaces, sClassName))
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync 0x800706be, -2147023170, # NS_ERROR_CALL_FAILED (RPC_S_CALL_FAILED)
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync return None
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync oDst = self.xcptCopyErrorConstants(oDst, xpcom.nsError)
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # COM compatability constants.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync oDst.E_ACCESSDENIED = -2147024891 # see VBox/com/defs.h
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync oDst.DISP_E_EXCEPTION = -2147352567 # For COM compatability only.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync VirtualBox Web Services API specific code.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Import web services stuff. Fix the sys.path the first time.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync sWebServLib = os.path.join(VBoxSdkDir, 'bindings', 'webservice', 'python', 'lib')
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync from VirtualBox_wrappers import IWebsessionManager2
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Initialize instance variables from parameters.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync if dParams is not None:
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Base class overrides.
355edde34018a687b4a4d17054c378b780e3d8abvboxsync return self.connect(self.url, self.user, self.password)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'WEBSERVICE'
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ Returns True if remote VBox host, False if local. """
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync # Webservices cannot do that yet
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync # Webservices cannot do that yet
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync str += "from VirtualBox_wrappers import " + sClassName + "\n"
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync str += "result = " + sClassName + "(oIUnknown.mgr, oIUnknown.handle)\n"
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync # wrong, need to test if class indeed implements this interface
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync exec(str, d, d)
ced49ddf2480e97120d7bb28cd774ab609047875vboxsync return d['result']
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Web service specific methods.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync from VirtualBox_wrappers import IWebsessionManager2
e35e9d6317da2985728e7510bea9337b9893b66evboxsync if url is None:
e35e9d6317da2985728e7510bea9337b9893b66evboxsync if user is None:
e35e9d6317da2985728e7510bea9337b9893b66evboxsync self.vbox = self.wsmgr.logon(self.user, self.password)
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync raise Exception("cannot connect to '" + self.url + "' as '" + self.user + "'")
e35e9d6317da2985728e7510bea9337b9893b66evboxsync if self.vbox is not None and self.wsmgr is not None:
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync## The current (last) exception class.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync# This is reinitalized whenever VirtualBoxManager is called, so it will hold
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync# the reference to the error exception class for the last platform/style that
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync# was used. Most clients does talk to multiple VBox instance on different
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync# platforms at the same time, so this should be sufficent for most uses and
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync# be way simpler to use than VirtualBoxManager::oXcptClass.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync VirtualBox API manager class.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync The API users will have to instantiate this. If no parameters are given,
e35e9d6317da2985728e7510bea9337b9893b66evboxsync it will default to interface with the VirtualBox running on the local
e35e9d6317da2985728e7510bea9337b9893b66evboxsync machine. sStyle can be None (default), MSCOM, XPCOM or WEBSERVICES. Most
e35e9d6317da2985728e7510bea9337b9893b66evboxsync users will either be specifying None or WEBSERVICES.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync The dPlatformParams is an optional dictionary for passing parameters to the
e35e9d6317da2985728e7510bea9337b9893b66evboxsync WEBSERVICE backend.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync def __init__(self, sStyle=None, dPlatformParams=None):
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync self.platform = PlatformWEBSERVICE(dPlatformParams)
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync ## VirtualBox API constants (for webservices, enums are symbolic).
e35e9d6317da2985728e7510bea9337b9893b66evboxsync self.constants = VirtualBoxReflectionInfo(sStyle == "WEBSERVICE")
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync ## Status constants.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync self.statuses = self.platform.xcptSetupConstants(VirtualBoxManager.Statuses())
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync ## @todo Add VBOX_E_XXX to statuses? They're already in constants...
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync ## Dictionary for errToString, built on demand.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync ## The exception class for the selected platform.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Get the virtualbox singleton.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync print_("Installation problem: check that appropriate libs in place")
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Returns a Python API revision number.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync This will be incremented when features are added to this file.
b782423ab3ffe9b28d6aa0f4451f693f9a5ece25vboxsync This used to be an attribute referring to a session manager class with
b782423ab3ffe9b28d6aa0f4451f693f9a5ece25vboxsync only one method called getSessionObject. It moved into this class.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Wrappers for self.platform methods.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::getVirtualBox(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::getSessionObject(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::getArray(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::createListener(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync return self.platform.createListener(oImplClass, dArgs)
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::waitForEvents(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::interruptWaitEvents(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::queryInterface(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync return self.platform.queryInterface(oIUnknown, sClassName)
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Init and uninit.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::deinitPerThread(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync """ See PlatformBase::deinitPerThread(). """
e35e9d6317da2985728e7510bea9337b9893b66evboxsync For unitializing the manager.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Do not access it after calling this method.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync # Utility methods.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync def openMachineSession(self, oIMachine, fPermitSharing=True):
b782423ab3ffe9b28d6aa0f4451f693f9a5ece25vboxsync Attempts to open the a session to the machine.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Returns a session object on success.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Raises exception on failure.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Closes a session opened by openMachineSession.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Ignores None parameters.
e35e9d6317da2985728e7510bea9337b9893b66evboxsync if oSession is not None:
e35e9d6317da2985728e7510bea9337b9893b66evboxsync Returns a helper class (PerfCollector) for accessing performance
e35e9d6317da2985728e7510bea9337b9893b66evboxsync collector goodies. See PerfCollector for details.
20606357beeba9ef9025b662f5e3d178dd37d559vboxsync Returns the VirtualBox binary directory.
20606357beeba9ef9025b662f5e3d178dd37d559vboxsync Returns the VirtualBox SDK directory.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Error code utilities.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync ## @todo port to webservices!
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync Gets the status code from an exception. If the exception parameter
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync isn't specified, the current exception is examined.
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync Returns True if the exception indicates that the interface is dead,
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync False if not. If the exception parameter isn't specified, the current
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync exception is examined.
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync Checks if the exception is one that could come from the VBox API. If
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync the exception parameter isn't specified, the current exception is
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if self.oXcptClass is None: # @todo find the exception class for web services!
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync Checks if the exception oXcpt is equal to the COM/XPCOM status code
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync The oXcpt parameter can be any kind of object, we'll just return True
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync if it doesn't behave like a our exception class. If it's None, we'll
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync query the current exception and examine that.
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync Will not raise any exception as long as hrStatus and self are not bad.
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync Negated xcptIsEqual.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync Converts the specified COM status code, or the status code of the
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync specified exception, to a C constant string. If the parameter isn't
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync specified (is None), the current exception is examined.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Deal with exceptions.
15fe3cf8212d4ca73ea0a4fe547892bcddef6e16vboxsync if hrStatusOrXcpt is None or self.xcptIsOurXcptKind(hrStatusOrXcpt):
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Build the dictionary on demand.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync # Do the lookup, falling back on formatting the status number.
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync Returns the best error message found in the COM-like exception. If the
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync exception parameter isn't specified, the current exception is examined.
a253309ecf51232be71a5c0f7b888e03f51906a3vboxsync if sRet is None:
50c3ee6cc6a9f816790595907558b355769f9c44vboxsync # Legacy, remove in a day or two.