vboxapi.py revision ebb33f3aef3b410579a2865109426b798b9d4a9d
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsync"""
b844a5645b69a09c4d6dacb9cfe96bb138cb21d4vboxsyncCopyright (C) 2009-2013 Oracle Corporation
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsync
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncavailable from http://www.virtualbox.org. This file is free software;
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncyou can redistribute it and/or modify it under the terms of the GNU
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncGeneral Public License (GPL) as published by the Free Software
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsync"""
f52596ee352b88100d0a2abd044c8edd3c542bd7vboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncimport sys, os
08122b11035de1e54ce1e665dff7260fc548db72vboxsyncimport traceback
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
b5b8f3d0d95893edd81062c1b5d0bc455cc79bc1vboxsync# To set Python bitness on OSX use 'export VERSIONER_PYTHON_PREFER_32_BIT=yes'
b5b8f3d0d95893edd81062c1b5d0bc455cc79bc1vboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncVBoxBinDir = os.environ.get("VBOX_PROGRAM_PATH", None)
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncVBoxSdkDir = os.environ.get("VBOX_SDK_PATH", None)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncif VBoxBinDir is None:
2561352ae77d8f2f825526a6cbafa34b45f16972vboxsync # Will be set by the installer
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync VBoxBinDir = "%VBOX_INSTALL_PATH%"
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncif VBoxSdkDir is None:
b5b8f3d0d95893edd81062c1b5d0bc455cc79bc1vboxsync # Will be set by the installer
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync VBoxSdkDir = "%VBOX_SDK_PATH%"
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncos.environ["VBOX_PROGRAM_PATH"] = VBoxBinDir
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncos.environ["VBOX_SDK_PATH"] = VBoxSdkDir
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsyncsys.path.append(VBoxBinDir)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
c65e2fedaf400b449a85ae6db7b84858f2613708vboxsyncfrom VirtualBox_constants import VirtualBoxReflectionInfo
c65e2fedaf400b449a85ae6db7b84858f2613708vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsyncclass PerfCollector:
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ This class provides a wrapper over IPerformanceCollector in order to
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync get more 'pythonic' interface.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync To begin collection of metrics use setup() method.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync To get collected data use query() method.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync It is possible to disable metric collection without changing collection
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync parameters with disable() method. The enable() method resumes metric
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync collection.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
aaa80e9df329609078dea844a11f2611443b677avboxsync def __init__(self, mgr, vbox):
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Initializes the instance.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """
aaa80e9df329609078dea844a11f2611443b677avboxsync self.mgr = mgr
08e715a5fb97536a462b199124a0c6e925cfa76cvboxsync self.isMscom = (mgr.type == 'MSCOM')
aaa80e9df329609078dea844a11f2611443b677avboxsync self.collector = vbox.performanceCollector
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync def setup(self, names, objects, period, nsamples):
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 """
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.collector.setupMetrics(names, objects, period, nsamples)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync def enable(self, names, objects):
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Resumes metric collection for the specified metrics.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.collector.enableMetrics(names, objects)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync def disable(self, names, objects):
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """ Suspends metric collection for the specified metrics.
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.collector.disableMetrics(names, objects)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync def query(self, names, objects):
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
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync """
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync # Get around the problem with input arrays returned in output
aaa80e9df329609078dea844a11f2611443b677avboxsync # parameters (see #3953) for MSCOM.
aaa80e9df329609078dea844a11f2611443b677avboxsync if self.isMscom:
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync (values, names, objects, names_out, objects_out, units, scales, sequence_numbers,
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync indices, lengths) = self.collector.queryMetricsData(names, objects)
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync else:
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync (values, names_out, objects_out, units, scales, sequence_numbers,
a7f701e8c51193f7c21137cc173ea5f86e53cac2vboxsync indices, lengths) = self.collector.queryMetricsData(names, objects)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync out = []
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync for i in xrange(0, len(names_out)):
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync scale = int(scales[i])
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync if scale != 1:
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync fmt = '%.2f%s'
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync else:
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync fmt = '%d %s'
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync out.append({
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'name':str(names_out[i]),
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'object':str(objects_out[i]),
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'unit':str(units[i]),
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'scale':scale,
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'values':[int(values[j]) for j in xrange(int(indices[i]), int(indices[i])+int(lengths[i]))],
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync 'values_as_string':'['+', '.join([fmt % (int(values[j])/scale, units[i]) for j in xrange(int(indices[i]), int(indices[i])+int(lengths[i]))])+']'
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync })
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync return out
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsyncdef ComifyName(name):
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync return name[0].capitalize()+name[1:]
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync_COMForward = { 'getattr' : None,
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync 'setattr' : None}
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsyncdef CustomGetAttr(self, attr):
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync # fastpath
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync if self.__class__.__dict__.get(attr) != None:
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync return self.__class__.__dict__.get(attr)
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync # try case-insensitivity workaround for class attributes (COM methods)
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync for k in self.__class__.__dict__.keys():
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync if k.lower() == attr.lower():
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync self.__class__.__dict__[attr] = self.__class__.__dict__[k]
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync return getattr(self, k)
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync try:
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return _COMForward['getattr'](self, ComifyName(attr))
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync except AttributeError:
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return _COMForward['getattr'](self, attr)
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsyncdef CustomSetAttr(self, attr, value):
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync try:
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync return _COMForward['setattr'](self, ComifyName(attr), value)
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync except AttributeError:
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync return _COMForward['setattr'](self, attr, value)
5cb8545771849c97101a5ee9bb57d0fdac922c44vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsyncclass PlatformMSCOM:
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync # Class to fake access to constants in style of foo.bar.boo
08122b11035de1e54ce1e665dff7260fc548db72vboxsync class ConstantFake:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __init__(self, parent, name):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync self.__dict__['_parent'] = parent
08122b11035de1e54ce1e665dff7260fc548db72vboxsync self.__dict__['_name'] = name
08122b11035de1e54ce1e665dff7260fc548db72vboxsync self.__dict__['_consts'] = {}
08122b11035de1e54ce1e665dff7260fc548db72vboxsync try:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync self.__dict__['_depth']=parent.__dict__['_depth']+1
08122b11035de1e54ce1e665dff7260fc548db72vboxsync except:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync self.__dict__['_depth']=0
08122b11035de1e54ce1e665dff7260fc548db72vboxsync if self.__dict__['_depth'] > 4:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync raise AttributeError
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync def __getattr__(self, attr):
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync import win32com
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync from win32com.client import constants
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync if attr.startswith("__"):
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync raise AttributeError
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync consts = self.__dict__['_consts']
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync fake = consts.get(attr, None)
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync if fake != None:
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync return fake
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync try:
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync name = self.__dict__['_name']
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync parent = self.__dict__['_parent']
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync while parent != None:
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync if parent._name is not None:
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync name = parent._name+'_'+name
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync parent = parent._parent
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync if name is not None:
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync name += "_" + attr
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync else:
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync name = attr
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync return win32com.client.constants.__getattr__(name)
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync except AttributeError, e:
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync fake = PlatformMSCOM.ConstantFake(self, attr)
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync consts[attr] = fake
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync return fake
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync class InterfacesWrapper:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __init__(self):
da570ef57fe454ae2d9d5d88a7bfea214723dbb1vboxsync self.__dict__['_rootFake'] = PlatformMSCOM.ConstantFake(None, None)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __getattr__(self, a):
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync import win32com
7baa1c3bb51b48e79eee63a69e341442e342a18evboxsync from win32com.client import constants
08122b11035de1e54ce1e665dff7260fc548db72vboxsync if a.startswith("__"):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync raise AttributeError
08122b11035de1e54ce1e665dff7260fc548db72vboxsync try:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return win32com.client.constants.__getattr__(a)
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync except AttributeError, e:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return self.__dict__['_rootFake'].__getattr__(a)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync VBOX_TLB_GUID = '{46137EEC-703B-4FE5-AFD4-7C9BBBBA0259}'
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync VBOX_TLB_LCID = 0
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync VBOX_TLB_MAJOR = 1
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync VBOX_TLB_MINOR = 0
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __init__(self, params):
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32com import universal
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32com.client import gencache, DispatchBaseClass
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32com.client import constants, getevents
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync import win32com
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync import pythoncom
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync import win32api
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32con import DUPLICATE_SAME_ACCESS
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync from win32api import GetCurrentThread, GetCurrentThreadId, DuplicateHandle, GetCurrentProcess
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync import threading
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync pid = GetCurrentProcess()
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync self.tid = GetCurrentThreadId()
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync handle = DuplicateHandle(pid, GetCurrentThread(), pid, 0, 0, DUPLICATE_SAME_ACCESS)
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync self.handles = []
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync self.handles.append(handle)
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync _COMForward['getattr'] = DispatchBaseClass.__dict__['__getattr__']
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync DispatchBaseClass.__dict__['__getattr__'] = CustomGetAttr
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync _COMForward['setattr'] = DispatchBaseClass.__dict__['__setattr__']
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync DispatchBaseClass.__dict__['__setattr__'] = CustomSetAttr
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync win32com.client.gencache.EnsureDispatch('VirtualBox.Session')
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync win32com.client.gencache.EnsureDispatch('VirtualBox.VirtualBox')
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync self.oIntCv = threading.Condition()
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync self.fInterrupted = False;
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync def getSessionObject(self, vbox):
da570ef57fe454ae2d9d5d88a7bfea214723dbb1vboxsync import win32com
08122b11035de1e54ce1e665dff7260fc548db72vboxsync from win32com.client import Dispatch
1d96c25e994a2160c1697208bb398d79ca117c4avboxsync return win32com.client.Dispatch("VirtualBox.Session")
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getVirtualBox(self):
1d96c25e994a2160c1697208bb398d79ca117c4avboxsync import win32com
08122b11035de1e54ce1e665dff7260fc548db72vboxsync from win32com.client import Dispatch
2ea0ec406117609d51bd5ac51cbb3d4f0de9a16dvboxsync return win32com.client.Dispatch("VirtualBox.VirtualBox")
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getType(self):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'MSCOM'
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getRemote(self):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return False
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getArray(self, obj, field):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return obj.__getattr__(field)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync def initPerThread(self):
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync import pythoncom
1d27f9d208503988168cd9a8a902a0f48cf52a12vboxsync pythoncom.CoInitializeEx(0)
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync def deinitPerThread(self):
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync import pythoncom
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync pythoncom.CoUninitialize()
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync def createListener(self, impl, arg):
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync d = {}
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync d['BaseClass'] = impl
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync d['arg'] = arg
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync d['tlb_guid'] = PlatformMSCOM.VBOX_TLB_GUID
b844a5645b69a09c4d6dacb9cfe96bb138cb21d4vboxsync d['tlb_major'] = PlatformMSCOM.VBOX_TLB_MAJOR
b844a5645b69a09c4d6dacb9cfe96bb138cb21d4vboxsync d['tlb_minor'] = PlatformMSCOM.VBOX_TLB_MINOR
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str = ""
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += "import win32com.server.util\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += "import pythoncom\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += "class ListenerImpl(BaseClass):\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _com_interfaces_ = ['IEventListener']\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _typelib_guid_ = tlb_guid\n"
b844a5645b69a09c4d6dacb9cfe96bb138cb21d4vboxsync str += " _typelib_version_ = tlb_major, tlb_minor\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync # Maybe we'd better implement Dynamic invoke policy, to be more flexible here
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _reg_policy_spec_ = 'win32com.server.policy.EventHandlerPolicy'\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync
dafcc1aee6fa9a280e6c6d7630132e5a778f3a6fvboxsync # capitalized version of listener method
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " HandleEvent=BaseClass.handleEvent\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " def __init__(self): BaseClass.__init__(self, arg)\n"
4bb0fd45b2679a58b304ba2d7bff3e19b74a447fvboxsync str += "result = win32com.server.util.wrap(ListenerImpl())\n"
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync exec (str, d, d)
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync return d['result']
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync def waitForEvents(self, timeout):
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync from win32api import GetCurrentThreadId
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync from win32event import INFINITE
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync from win32event import MsgWaitForMultipleObjects, \
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync QS_ALLINPUT, WAIT_TIMEOUT, WAIT_OBJECT_0
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync from pythoncom import PumpWaitingMessages
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync import types
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync if not isinstance(timeout, types.IntType):
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync raise TypeError("The timeout argument is not an integer")
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync if (self.tid != GetCurrentThreadId()):
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync raise Exception("wait for events from the same thread you inited!")
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync if timeout < 0:
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync cMsTimeout = INFINITE
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync else:
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync cMsTimeout = timeout
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync rc = MsgWaitForMultipleObjects(self.handles, 0, cMsTimeout, QS_ALLINPUT)
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync if rc >= WAIT_OBJECT_0 and rc < WAIT_OBJECT_0+len(self.handles):
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync # is it possible?
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync rc = 2;
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync elif rc==WAIT_OBJECT_0 + len(self.handles):
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync # Waiting messages
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync PumpWaitingMessages()
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync rc = 0;
a23d9b6011c292ab4d858fc7d83a2216843cd54evboxsync else:
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync # Timeout
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync rc = 1;
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync # check for interruption
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync self.oIntCv.acquire()
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync if self.fInterrupted:
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync self.fInterrupted = False
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync rc = 1;
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync self.oIntCv.release()
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync return rc;
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync def interruptWaitEvents(self):
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync """
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Basically a python implementation of EventQueue::postEvent().
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync The magic value must be in sync with the C++ implementation or this
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync won't work.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync
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.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync """
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync from win32api import PostThreadMessage
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync from win32con import WM_USER
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync self.oIntCv.acquire()
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync self.fInterrupted = True
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync self.oIntCv.release()
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync try:
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync PostThreadMessage(self.tid, WM_USER, None, 0xf241b819)
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync except:
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync return False;
ee231a249824f0a96643fb8b705f5b6cf3617b46vboxsync return True;
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync def deinit(self):
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync import pythoncom
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync from win32file import CloseHandle
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync for h in self.handles:
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync if h is not None:
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync CloseHandle(h)
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync self.handles = None
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync pythoncom.CoUninitialize()
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync pass
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync def queryInterface(self, obj, className):
ced49ddf2480e97120d7bb28cd774ab609047875vboxsync from win32com.client import CastTo
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return CastTo(obj, className)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsyncclass PlatformXPCOM:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __init__(self, params):
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync sys.path.append(VBoxSdkDir+'/bindings/xpcom/python/')
08122b11035de1e54ce1e665dff7260fc548db72vboxsync import xpcom.vboxxpcom
08122b11035de1e54ce1e665dff7260fc548db72vboxsync import xpcom
08122b11035de1e54ce1e665dff7260fc548db72vboxsync import xpcom.components
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync def getSessionObject(self, vbox):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync import xpcom.components
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return xpcom.components.classes["@virtualbox.org/Session;1"].createInstance()
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getVirtualBox(self):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync import xpcom.components
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return xpcom.components.classes["@virtualbox.org/VirtualBox;1"].createInstance()
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getType(self):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'XPCOM'
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getRemote(self):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return False
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getArray(self, obj, field):
bf3b45b409e14f2fde6b2bdde95332c45fd72d46vboxsync return obj.__getattr__('get'+ComifyName(field))()
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync def initPerThread(self):
5c57f3ae389a4fd2d1614c2a02a52bc7d56ee7b5vboxsync import xpcom
5c57f3ae389a4fd2d1614c2a02a52bc7d56ee7b5vboxsync xpcom._xpcom.AttachThread()
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync def deinitPerThread(self):
5c57f3ae389a4fd2d1614c2a02a52bc7d56ee7b5vboxsync import xpcom
5c57f3ae389a4fd2d1614c2a02a52bc7d56ee7b5vboxsync xpcom._xpcom.DetachThread()
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync def createListener(self, impl, arg):
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync d = {}
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync d['BaseClass'] = impl
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync d['arg'] = arg
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str = ""
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += "import xpcom.components\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += "class ListenerImpl(BaseClass):\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " _com_interfaces_ = xpcom.components.interfaces.IEventListener\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += " def __init__(self): BaseClass.__init__(self, arg)\n"
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync str += "result = ListenerImpl()\n"
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync exec (str, d, d)
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync return d['result']
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync def waitForEvents(self, timeout):
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync import xpcom
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync return xpcom._xpcom.WaitForEvents(timeout)
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync def interruptWaitEvents(self):
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync import xpcom
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync return xpcom._xpcom.InterruptWait()
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync def deinit(self):
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync import xpcom
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync xpcom._xpcom.DeinitCOM()
d6bdf8a836b8e7d95eec19c254cd39161731d48fvboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync def queryInterface(self, obj, className):
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync import xpcom.components
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return obj.queryInterface(getattr(xpcom.components.interfaces, className))
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsyncclass PlatformWEBSERVICE:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __init__(self, params):
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync sys.path.append(os.path.join(VBoxSdkDir, 'bindings', 'webservice', 'python', 'lib'))
7225c19c065cadcc51171f0ad664cc4a93303eddvboxsync #import VirtualBox_services
08122b11035de1e54ce1e665dff7260fc548db72vboxsync import VirtualBox_wrappers
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync from VirtualBox_wrappers import IWebsessionManager2
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync if params is not None:
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync self.user = params.get("user", "")
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync self.password = params.get("password", "")
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync self.url = params.get("url", "")
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync else:
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync self.user = ""
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync self.password = ""
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync self.url = None
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync self.vbox = None
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync def getSessionObject(self, vbox):
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync return self.wsmgr.getSessionObject(vbox)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getVirtualBox(self):
355edde34018a687b4a4d17054c378b780e3d8abvboxsync return self.connect(self.url, self.user, self.password)
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync def connect(self, url, user, passwd):
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync if self.vbox is not None:
355edde34018a687b4a4d17054c378b780e3d8abvboxsync self.disconnect()
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync from VirtualBox_wrappers import IWebsessionManager2
355edde34018a687b4a4d17054c378b780e3d8abvboxsync if url is None:
355edde34018a687b4a4d17054c378b780e3d8abvboxsync url = ""
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.url = url
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync if user is None:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync user = ""
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.user = user
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync if passwd is None:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync passwd = ""
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.password = passwd
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.wsmgr = IWebsessionManager2(self.url)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.vbox = self.wsmgr.logon(self.user, self.password)
355edde34018a687b4a4d17054c378b780e3d8abvboxsync if not self.vbox.handle:
355edde34018a687b4a4d17054c378b780e3d8abvboxsync raise Exception("cannot connect to '"+self.url+"' as '"+self.user+"'")
aca09683940c0bff7fc1f91c6e00beefaea2fe21vboxsync return self.vbox
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync def disconnect(self):
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync if self.vbox is not None and self.wsmgr is not None:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.wsmgr.logoff(self.vbox)
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.vbox = None
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.wsmgr = None
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getType(self):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return 'WEBSERVICE'
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getRemote(self):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return True
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getArray(self, obj, field):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync return obj.__getattr__(field)
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync def initPerThread(self):
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync pass
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync def deinitPerThread(self):
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync pass
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync def createListener(self, impl, arg):
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync raise Exception("no active listeners for webservices")
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync def waitForEvents(self, timeout):
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync # Webservices cannot do that yet
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync return 2;
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync def interruptWaitEvents(self, timeout):
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync # Webservices cannot do that yet
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync return False;
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync def deinit(self):
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync try:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync disconnect()
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync except:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync pass
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync def queryInterface(self, obj, className):
ced49ddf2480e97120d7bb28cd774ab609047875vboxsync d = {}
ced49ddf2480e97120d7bb28cd774ab609047875vboxsync d['obj'] = obj
ced49ddf2480e97120d7bb28cd774ab609047875vboxsync str = ""
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync str += "from VirtualBox_wrappers import "+className+"\n"
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync str += "result = "+className+"(obj.mgr, obj.handle)\n"
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync # wrong, need to test if class indeed implements this interface
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync exec (str, d, d)
ced49ddf2480e97120d7bb28cd774ab609047875vboxsync return d['result']
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsyncclass SessionManager:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __init__(self, mgr):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync self.mgr = mgr
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getSessionObject(self, vbox):
5857f4e58ce2ef50d7f0c450fe4897026f9a9c3dvboxsync return self.mgr.platform.getSessionObject(vbox)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsyncclass VirtualBoxManager:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __init__(self, style, platparams):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync if style is None:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync if sys.platform == 'win32':
08122b11035de1e54ce1e665dff7260fc548db72vboxsync style = "MSCOM"
08122b11035de1e54ce1e665dff7260fc548db72vboxsync else:
08122b11035de1e54ce1e665dff7260fc548db72vboxsync style = "XPCOM"
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync
760ec8be64fa28d2bc7f493d707385c757a12e8evboxsync exec "self.platform = Platform"+style+"(platparams)"
760ec8be64fa28d2bc7f493d707385c757a12e8evboxsync # for webservices, enums are symbolic
760ec8be64fa28d2bc7f493d707385c757a12e8evboxsync self.constants = VirtualBoxReflectionInfo(style == "WEBSERVICE")
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync self.type = self.platform.getType()
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync self.remote = self.platform.getRemote()
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync self.style = style
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync self.mgr = SessionManager(self)
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync try:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.vbox = self.platform.getVirtualBox()
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync except NameError, ne:
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync print "Installation problem: check that appropriate libs in place"
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync traceback.print_exc()
0c657f93ac727a3a1644497331d86fbcbc3722aavboxsync raise ne
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync except Exception, e:
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync print "init exception: ", e
08122b11035de1e54ce1e665dff7260fc548db72vboxsync traceback.print_exc()
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync if self.remote:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync self.vbox = None
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync else:
b24a4c8472377f462bad08867b6203fe8bbe9663vboxsync raise e
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getArray(self, obj, field):
36a0cf44771c76b56b4a6489136e3adf0343df0bvboxsync return self.platform.getArray(obj, field)
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def getVirtualBox(self):
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return self.platform.getVirtualBox()
08122b11035de1e54ce1e665dff7260fc548db72vboxsync
08122b11035de1e54ce1e665dff7260fc548db72vboxsync def __del__(self):
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.deinit()
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync def deinit(self):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync if hasattr(self, "vbox"):
08122b11035de1e54ce1e665dff7260fc548db72vboxsync del self.vbox
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync self.vbox = None
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync if hasattr(self, "platform"):
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync self.platform.deinit()
e8061cc98e3d41ea42f0f835db3501d58c26e7fbvboxsync self.platform = None
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync def initPerThread(self):
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync self.platform.initPerThread()
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync
17d3bf6c92cd7b0f24800be4de3058fda764141bvboxsync def openMachineSession(self, mach, permitSharing = True):
1a9a9af4ac32622963b734736acbe9c79411f138vboxsync session = self.mgr.getSessionObject(self.vbox)
4fea7a40e3d4c0e903287c0ee728512f3e63df72vboxsync if permitSharing:
4fea7a40e3d4c0e903287c0ee728512f3e63df72vboxsync type = self.constants.LockType_Shared
4fea7a40e3d4c0e903287c0ee728512f3e63df72vboxsync else:
4fea7a40e3d4c0e903287c0ee728512f3e63df72vboxsync type = self.constants.LockType_Write
4fea7a40e3d4c0e903287c0ee728512f3e63df72vboxsync mach.lockMachine(session, type)
1a9a9af4ac32622963b734736acbe9c79411f138vboxsync return session
1a9a9af4ac32622963b734736acbe9c79411f138vboxsync
1a9a9af4ac32622963b734736acbe9c79411f138vboxsync def closeMachineSession(self, session):
29179bad4ddd202d265455fed7c5eae723859a8evboxsync if session is not None:
ea932ce95b47d827a68054a6cd5dfcc5045ffc15vboxsync session.unlockMachine()
1a9a9af4ac32622963b734736acbe9c79411f138vboxsync
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync def deinitPerThread(self):
2fd917a77df587742609eaa229c7cf4922458ae8vboxsync self.platform.deinitPerThread()
d6bdf8a836b8e7d95eec19c254cd39161731d48fvboxsync
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync def createListener(self, impl, arg = None):
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync return self.platform.createListener(impl, arg)
5c41f17e15c70a02e57fd39155f6394ebd9add66vboxsync
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync def waitForEvents(self, timeout):
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync """
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Wait for events to arrive and process them.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync The timeout is in milliseconds. A negative value means waiting for
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync ever, while 0 does not wait at all.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Returns 0 if events was processed.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Returns 1 if timed out or interrupted in some way.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync Returns 2 on error (like not supported for web services).
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync Raises an exception if the calling thread is not the main thread (the one
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync that initialized VirtualBoxManager) or if the time isn't an integer.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync """
c792fe5d6a56055c4d060db36316c4dac5311c7evboxsync return self.platform.waitForEvents(timeout)
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync def interruptWaitEvents(self):
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync """
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync Interrupt a waitForEvents call.
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync This is normally called from a worker thread.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync
e9802cd9ee289e494f01f2c37e714911d120cd30vboxsync Returns True on success, False on failure.
8952a4a0ea65bcb9926a1da734c1828baff52f54vboxsync """
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync return self.platform.interruptWaitEvents()
619da14dbf1f40ada039a6ebceedec8a6abe7696vboxsync
c2e62d39261f9f69ab4e14b2bbd986bf1b1faaf9vboxsync def getPerfCollector(self, vbox):
8b2f1e9e24bf9cb4340412463a0e75c4e0b035a6vboxsync return PerfCollector(self, vbox)
15eedc898539502083b8ce6db7c3d53d805fb9advboxsync
15eedc898539502083b8ce6db7c3d53d805fb9advboxsync def getBinDir(self):
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync global VBoxBinDir
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return VBoxBinDir
15eedc898539502083b8ce6db7c3d53d805fb9advboxsync
15eedc898539502083b8ce6db7c3d53d805fb9advboxsync def getSdkDir(self):
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync global VBoxSdkDir
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return VBoxSdkDir
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync def queryInterface(self, obj, className):
ebb33f3aef3b410579a2865109426b798b9d4a9dvboxsync return self.platform.queryInterface(obj, className)