COMDefs.h revision dc09cb937d0a66e030b4d7bef88dec429f41e060
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VBox frontends: Qt GUI ("VirtualBox"):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Various COM definitions and COM wrapper class declarations
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This header is used in conjunction with the header generated from
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * XIDL expressed interface definitions to provide cross-platform Qt-based
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * interface wrapper classes.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Copyright (C) 2006-2008 Oracle Corporation
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * available from http://www.virtualbox.org. This file is free software;
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * you can redistribute it and/or modify it under the terms of the GNU
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * General Public License (GPL) as published by the Free Software
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef __COMDefs_h__
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define __COMDefs_h__
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @defgroup grp_QT_COM Qt-COM Support Layer
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The Qt-COM support layer provides a set of definitions and smart classes for
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * writing simple, clean and platform-independent code to access COM/XPCOM
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync * components through exposed COM interfaces. This layer is based on the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * COM/XPCOM Abstraction Layer library (the VBoxCOM glue library defined in
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * include/VBox/com and implemented in src/VBox/Main/glue).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * ...
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync * @defgroup grp_QT_COM_arrays Arrays
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * COM/XPCOM arrays are mapped to QVector objects. QVector templates declared
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * with a type that corresponds to the COM type of elements in the array using
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * normal Qt-COM type mapping rules. Here is a code example that demonstrates
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * how to call interface methods that take and return arrays (this example is
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * based on examples given in @ref grp_COM_arrays):
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @code
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CSomething component;
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync // ...
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync QVector <LONG> in (3);
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync in [0] = -1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync in [1] = -2;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync in [2] = -3;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync QVector <LONG> out;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QVector <LONG> ret;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ret = component.TestArrays (in, out);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (size_t i = 0; i < ret.size(); ++ i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow (("*** ret[%u]=%d\n", i, ret [i]));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync * @endcode
2daaccf68be3773aee600c5c3e48bcf5401418a6vboxsync * @}
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync */
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync/* Both VBox/com/assert.h and qglobal.h contain a definition of ASSERT.
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync * Either of them can be already included here, so try to shut them up. */
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync#undef ASSERT
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync#include <VBox/com/com.h>
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync#include <VBox/com/array.h>
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync#include <VBox/com/assert.h>
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#undef ASSERT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* Qt includes */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <QString>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <QRect>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <QUuid>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <QVector>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <QList>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <QMetaType>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/memory> // for auto_copy_ptr
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Additional COM / XPCOM defines and includes
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if !defined (VBOX_WITH_XPCOM)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else /* !defined (VBOX_WITH_XPCOM) */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <nsXPCOM.h>
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#include <nsMemory.h>
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#include <nsIComponentManager.h>
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncclass XPCOMEventQSocketListener;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#endif /* !defined (VBOX_WITH_XPCOM) */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/* VirtualBox interfaces declarations */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#if !defined (VBOX_WITH_XPCOM)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync #include <VirtualBox.h>
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#else /* !defined (VBOX_WITH_XPCOM) */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync #include <VirtualBox_XPCOM.h>
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#endif /* !defined (VBOX_WITH_XPCOM) */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#include "VBoxDefs.h"
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/////////////////////////////////////////////////////////////////////////////
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncclass CVirtualBoxErrorInfo;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** Represents extended error information */
7b80828e5760a8814fe6cd494d2715a4544fbddcvboxsyncclass COMErrorInfo
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncpublic:
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync COMErrorInfo()
22e281e75ed636601178296c6daebda8f1d17c59vboxsync : mIsNull (true)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync , mIsBasicAvailable (false), mIsFullAvailable (false)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync , mResultCode (S_OK) {}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync COMErrorInfo (const CVirtualBoxErrorInfo &info) { init (info); }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* the default copy ctor and assignment op are ok */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync bool isNull() const { return mIsNull; }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync bool isBasicAvailable() const { return mIsBasicAvailable; }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync bool isFullAvailable() const { return mIsFullAvailable; }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
d1cbbd799d8912978f5146960b6780f387bb414bvboxsync HRESULT resultCode() const { return mResultCode; }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync QUuid interfaceID() const { return mInterfaceID; }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync QString component() const { return mComponent; }
c17f5c90f2cb60b38ecabebce128724c6ff2d036vboxsync QString text() const { return mText; }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const COMErrorInfo *next() const { return mNext.get(); }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QString interfaceName() const { return mInterfaceName; }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QUuid calleeIID() const { return mCalleeIID; }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QString calleeName() const { return mCalleeName; }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncprivate:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void init (const CVirtualBoxErrorInfo &info);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void fetchFromCurrentThread (IUnknown *callee, const GUID *calleeIID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static QString getInterfaceNameFromIID (const QUuid &id);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bool mIsNull : 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bool mIsBasicAvailable : 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bool mIsFullAvailable : 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT mResultCode;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QUuid mInterfaceID;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QString mComponent;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QString mText;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cppx::auto_copy_ptr <COMErrorInfo> mNext;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QString mInterfaceName;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QUuid mCalleeIID;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QString mCalleeName;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync friend class COMBaseWithEI;
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/////////////////////////////////////////////////////////////////////////////
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Base COM class the CInterface template and all wrapper classes are derived
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * from. Provides common functionality for all COM wrappers.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncclass COMBase
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncpublic:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static HRESULT InitializeCOM();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static HRESULT CleanupCOM();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /**
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsync * Returns the result code of the last interface method called by the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * wrapper instance or the result of CInterface::createInstance()
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * operation.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT lastRC() const { return mRC; }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if !defined (VBOX_WITH_XPCOM)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Converts a GUID value to QUuid */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static QUuid ToQUuid (const GUID &id)
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return QUuid (id.Data1, id.Data2, id.Data3,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync id.Data4[0], id.Data4[1], id.Data4[2], id.Data4[3],
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync id.Data4[4], id.Data4[5], id.Data4[6], id.Data4[7]);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else /* !defined (VBOX_WITH_XPCOM) */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Converts a GUID value to QUuid */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static QUuid ToQUuid (const nsID &id)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return QUuid (id.m0, id.m1, id.m2,
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync id.m3[0], id.m3[1], id.m3[2], id.m3[3],
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync id.m3[4], id.m3[5], id.m3[6], id.m3[7]);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync#endif /* !defined (VBOX_WITH_XPCOM) */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync /* Arrays of arbitrary types */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync template <typename QT, typename CT>
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync static void ToSafeArray (const QVector <QT> &aVec, com::SafeArray <CT> &aArr)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync aArr.reset (aVec.size());
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync for (int i = 0; i < aVec.size(); ++i)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync aArr [i] = static_cast<CT> (aVec.at (i));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
72ef2b9fc5ffc01d0dabd5052d6e8baa3a952773vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync template <typename CT, typename QT>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void FromSafeArray (const com::SafeArray <CT> &aArr, QVector <QT> &aVec)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aVec.resize (static_cast<int> (aArr.size()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (int i = 0; i < aVec.size(); ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aVec [i] = static_cast<QT> (aArr [i]);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync template <typename QT, typename CT>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void ToSafeArray (const QVector <QT *> &aVec, com::SafeArray <CT *> &aArr)
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Q_UNUSED (aVec);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Q_UNUSED (aArr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailedReturnVoid (("No conversion!\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync template <typename CT, typename QT>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void FromSafeArray (const com::SafeArray <CT *> &aArr, QVector <QT *> &aVec)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync Q_UNUSED (aArr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Q_UNUSED (aVec);
909f4391cc20b4a3a9a2d3f8718084b669663ab2vboxsync AssertMsgFailedReturnVoid (("No conversion!\n"));
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync }
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* Arrays of equal types */
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync
3ecd8008b81f02a04220705ae0033142af363280vboxsync template <typename T>
3ecd8008b81f02a04220705ae0033142af363280vboxsync static void ToSafeArray (const QVector <T> &aVec, com::SafeArray <T> &aArr)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aArr.reset (aVec.size());
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync for (int i = 0; i < aVec.size(); ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aArr [i] = aVec.at (i);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync template <typename T>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void FromSafeArray (const com::SafeArray <T> &aArr, QVector <T> &aVec)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync aVec.resize (static_cast<int> (aArr.size()));
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync for (int i = 0; i < aVec.size(); ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aVec [i] = aArr [i];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
3ecd8008b81f02a04220705ae0033142af363280vboxsync
3ecd8008b81f02a04220705ae0033142af363280vboxsync /* Arrays of strings */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void ToSafeArray (const QVector <QString> &aVec,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeArray <BSTR> &aArr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void FromSafeArray (const com::SafeArray <BSTR> &aArr,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QVector <QString> &aVec);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Arrays of GUID */
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void ToSafeArray (const QVector <QUuid> &aVec,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeGUIDArray &aArr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void FromSafeArray (const com::SafeGUIDArray &aArr,
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync QVector <QUuid> &aVec);
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* Arrays of enums. Does a cast similar to what ENUMOut does. */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync template <typename QE, typename CE>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void ToSafeArray (const QVector <QE> &aVec,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeIfaceArray <CE> &aArr)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aArr.reset (static_cast <int> (aVec.size()));
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync for (int i = 0; i < aVec.size(); ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aArr [i] = static_cast <CE> (aVec.at (i));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync template <typename CE, typename QE>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void FromSafeArray (const com::SafeIfaceArray <CE> &aArr,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QVector <QE> &aVec)
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync {
22e281e75ed636601178296c6daebda8f1d17c59vboxsync aVec.resize (static_cast <int> (aArr.size()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (int i = 0; i < aVec.size(); ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aVec [i] = static_cast <QE> (aArr [i]);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Arrays of interface pointers. Note: we need a separate pair of names
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * only because the MSVC8 template matching algorithm is poor and tries to
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * instantiate a com::SafeIfaceArray <BSTR> (!!!) template otherwise for
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * *no* reason and fails. Note that it's also not possible to choose the
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * correct function by specifying template arguments explicitly because then
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * it starts to try to instantiate the com::SafeArray <I> template for
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * *no* reason again and fails too. Definitely, broken. Works in GCC like a
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * charm. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync template <class CI, class I>
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync static void ToSafeIfaceArray (const QVector <CI> &aVec,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync com::SafeIfaceArray <I> &aArr)
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync aArr.reset (static_cast<int> (aVec.size()));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (int i = 0; i < aVec.size(); ++i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync aArr [i] = aVec.at (i).raw();
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync if (aArr [i])
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync aArr [i]->AddRef();
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync }
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync }
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync template <class I, class CI>
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync static void FromSafeIfaceArray (const com::SafeIfaceArray <I> &aArr,
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync QVector <CI> &aVec)
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync {
22e281e75ed636601178296c6daebda8f1d17c59vboxsync aVec.resize (static_cast<int> (aArr.size()));
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync for (int i = 0; i < aVec.size(); ++i)
e50404712a2b5234c42bdf9740bddab5729ba188vboxsync aVec [i].attach (aArr [i]);
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync }
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsyncprotected:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync /* no arbitrary instance creations */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync COMBase() : mRC (S_OK) {};
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#if defined (VBOX_WITH_XPCOM)
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync static XPCOMEventQSocketListener *sSocketListener;
1843553dbdf4e46417158b4c6348c503adf10740vboxsync#endif
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /** Adapter to pass QString as input BSTR params */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync class BSTRIn
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync {
1843553dbdf4e46417158b4c6348c503adf10740vboxsync public:
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync BSTRIn (const QString &s) : bstr (SysAllocString ((const OLECHAR *)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync (s.isNull() ? 0 : s.utf16()))) {}
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync ~BSTRIn()
1843553dbdf4e46417158b4c6348c503adf10740vboxsync {
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync if (bstr)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync SysFreeString (bstr);
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync }
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync operator BSTR() const { return bstr; }
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync private:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync BSTR bstr;
1843553dbdf4e46417158b4c6348c503adf10740vboxsync };
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync /** Adapter to pass QString as output BSTR params */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync class BSTROut
1843553dbdf4e46417158b4c6348c503adf10740vboxsync {
22e281e75ed636601178296c6daebda8f1d17c59vboxsync public:
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync BSTROut (QString &s) : str (s), bstr (0) {}
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync ~BSTROut()
1843553dbdf4e46417158b4c6348c503adf10740vboxsync {
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (bstr) {
1843553dbdf4e46417158b4c6348c503adf10740vboxsync str = QString::fromUtf16 (bstr);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync SysFreeString (bstr);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync operator BSTR *() { return &bstr; }
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync private:
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync QString &str;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync BSTR bstr;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync };
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /**
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync * Adapter to pass K* enums as output COM enum params (*_T).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param QE K* enum.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param CE COM enum.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
e52f819639386db020b2a635b47a415248c7fbf9vboxsync template <typename QE, typename CE>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync class ENUMOut
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync public:
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync ENUMOut (QE &e) : qe (e), ce ((CE) 0) {}
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync ~ENUMOut() { qe = (QE) ce; }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync operator CE *() { return &ce; }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync private:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync QE &qe;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CE ce;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync };
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
0e77737b0ba913683e614db11463b31ca67aacbevboxsync#if !defined (VBOX_WITH_XPCOM)
0e77737b0ba913683e614db11463b31ca67aacbevboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync /** Adapter to pass QUuid as input GUID params */
0e77737b0ba913683e614db11463b31ca67aacbevboxsync static GUID GUIDIn (const QUuid &uuid) { return uuid; }
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
0e77737b0ba913683e614db11463b31ca67aacbevboxsync /** Adapter to pass QUuid as output GUID params */
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync class GUIDOut
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync public:
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync GUIDOut (QUuid &id) : uuid (id)
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync {
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync ::memset (&guid, 0, sizeof (GUID));
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync ~GUIDOut()
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync uuid = QUuid (
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync guid.Data1, guid.Data2, guid.Data3,
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync operator GUID *() { return &guid; }
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync private:
0e77737b0ba913683e614db11463b31ca67aacbevboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync QUuid &uuid;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GUID guid;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync };
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else /* !defined (VBOX_WITH_XPCOM) */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Adapter to pass QUuid as input GUID params */
8e972b677df5ee27b99211fc7e456a5aa50f3e68vboxsync static const nsID &GUIDIn (const QUuid &uuid)
8e972b677df5ee27b99211fc7e456a5aa50f3e68vboxsync {
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync return *(const nsID *) &uuid;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /** Adapter to pass QUuid as output GUID params */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync class GUIDOut
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync public:
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync GUIDOut (QUuid &id) : uuid (id), nsid (0) {}
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync ~GUIDOut()
806d0b554daa555364af5f87bc96eccbe760db7avboxsync {
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (nsid)
806d0b554daa555364af5f87bc96eccbe760db7avboxsync {
806d0b554daa555364af5f87bc96eccbe760db7avboxsync uuid = QUuid (
806d0b554daa555364af5f87bc96eccbe760db7avboxsync nsid->m0, nsid->m1, nsid->m2,
806d0b554daa555364af5f87bc96eccbe760db7avboxsync nsid->m3[0], nsid->m3[1], nsid->m3[2], nsid->m3[3],
22e281e75ed636601178296c6daebda8f1d17c59vboxsync nsid->m3[4], nsid->m3[5], nsid->m3[6], nsid->m3[7]);
806d0b554daa555364af5f87bc96eccbe760db7avboxsync nsMemory::Free (nsid);
806d0b554daa555364af5f87bc96eccbe760db7avboxsync }
806d0b554daa555364af5f87bc96eccbe760db7avboxsync }
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync operator nsID **() { return &nsid; }
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync private:
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync QUuid &uuid;
806d0b554daa555364af5f87bc96eccbe760db7avboxsync nsID *nsid;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync };
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* !defined (VBOX_WITH_XPCOM) */
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static void addref (IUnknown *aIface) { if (aIface) aIface->AddRef(); }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync static void release (IUnknown *aIface) { if (aIface) aIface->Release(); }
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsyncprotected:
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mutable HRESULT mRC;
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync friend class COMErrorInfo;
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync};
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync/////////////////////////////////////////////////////////////////////////////
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync/**
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync * Alternative base class for the CInterface template that adds the errorInfo()
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * method for providing extended error info about unsuccessful invocation of the
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * last called interface method.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync */
806d0b554daa555364af5f87bc96eccbe760db7avboxsyncclass COMBaseWithEI : public COMBase
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
806d0b554daa555364af5f87bc96eccbe760db7avboxsyncpublic:
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync /**
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync * Returns error info set by the last unsuccessfully invoked interface
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * method. Returned error info is useful only if CInterface::lastRC()
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * represents a failure or a warning (i.e. CInterface::isReallyOk() is
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * false).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const COMErrorInfo &errorInfo() const { return mErrInfo; }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncprotected:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* no arbitrary instance creation */
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync COMBaseWithEI() : COMBase () {};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync void setErrorInfo (const COMErrorInfo &aErrInfo) { mErrInfo = aErrInfo; }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync void fetchErrorInfo (IUnknown *aCallee, const GUID *aCalleeIID) const
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mErrInfo.fetchFromCurrentThread (aCallee, aCalleeIID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mutable COMErrorInfo mErrInfo;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync};
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/////////////////////////////////////////////////////////////////////////////
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync/**
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync * Simple class that encapsulates the result code and COMErrorInfo.
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncclass COMResult
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync{
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncpublic:
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync COMResult() : mRC (S_OK) {}
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync /**
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync * Queries the current result code from the given component.
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync explicit COMResult (const COMBase &aComponent)
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync : mRC (aComponent.lastRC()) {}
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync
1157941288c9533575a655c660af55d13da31eefvboxsync /**
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync * Queries the current result code and error info from the given component.
1157941288c9533575a655c660af55d13da31eefvboxsync */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync COMResult (const COMBaseWithEI &aComponent)
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync : mRC (aComponent.lastRC())
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync , mErrInfo (aComponent.errorInfo()) {}
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /**
8e8844a522f5d335f177a0313b03067d79cce201vboxsync * Queries the current result code from the given component.
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync */
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync COMResult &operator= (const COMBase &aComponent)
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync {
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync mRC = aComponent.lastRC();
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync return *this;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync }
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync /**
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync * Queries the current result code and error info from the given component.
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync */
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync COMResult &operator= (const COMBaseWithEI &aComponent)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync mRC = aComponent.lastRC();
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync mErrInfo = aComponent.errorInfo();
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync return *this;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync }
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync bool isNull() const { return mErrInfo.isNull(); }
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync /**
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync * Returns @c true if the result code represents success (with or without
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync * warnings).
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync */
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync bool isOk() const { return SUCCEEDED (mRC); }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync /**
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync * Returns @c true if the result code represents success with one or more
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync * warnings.
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync bool isWarning() const { return SUCCEEDED_WARNING (mRC); }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
8e8844a522f5d335f177a0313b03067d79cce201vboxsync /**
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync * Returns @c true if the result code represents success with no warnings.
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync */
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync bool isReallyOk() const { return mRC == S_OK; }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync COMErrorInfo errorInfo() const { return mErrInfo; }
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync HRESULT rc() const { return mRC; }
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsyncprivate:
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync HRESULT mRC;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync COMErrorInfo mErrInfo;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync};
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync/////////////////////////////////////////////////////////////////////////////
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync/**
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * Wrapper template class for all interfaces.
46b1ac1c3302722f93e787d0f0693965e88f5ceevboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * All interface methods named as they are in the original, i.e. starting
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * with the capital letter. All utility non-interface methods are named
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync * starting with the small letter. Utility methods should be not normally
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * called by the end-user client application.
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync *
f827fea1108b8f8a1a5f63318f6ec3cf4a9e7010vboxsync * @param I Interface class (i.e. IUnknown/nsISupports derivant).
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * @param B Base class, either COMBase (by default) or COMBaseWithEI.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsynctemplate <class I, class B = COMBase>
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsyncclass CInterface : public B
5cf54b3ffeb7ee90685dcaec329ef71a729f5947vboxsync{
806d0b554daa555364af5f87bc96eccbe760db7avboxsyncpublic:
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync typedef B Base;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync typedef I Iface;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync // constructors & destructor
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync CInterface() : mIface (NULL) {}
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync CInterface (const CInterface &that) : B (that), mIface (that.mIface)
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync {
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync addref (mIface);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync }
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync CInterface (I *aIface) : mIface (aIface) { addref (mIface); }
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync virtual ~CInterface() { release (mIface); }
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync // utility methods
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync void createInstance (const CLSID &aClsId)
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync {
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync AssertMsg (!mIface, ("Instance is already non-NULL\n"));
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync if (!mIface)
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync {
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync#if !defined (VBOX_WITH_XPCOM)
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync B::mRC = CoCreateInstance (aClsId, NULL, CLSCTX_ALL,
22e281e75ed636601178296c6daebda8f1d17c59vboxsync _ATL_IIDOF (I), (void **) &mIface);
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync#else /* !defined (VBOX_WITH_XPCOM) */
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync nsCOMPtr <nsIComponentManager> manager;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync B::mRC = NS_GetComponentManager (getter_AddRefs (manager));
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (SUCCEEDED (B::mRC))
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync B::mRC = manager->CreateInstance (aClsId, nsnull, NS_GET_IID (I),
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync (void **) &mIface);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync#endif /* !defined (VBOX_WITH_XPCOM) */
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync /* fetch error info, but don't assert if it's missing -- many other
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * reasons can lead to an error (w/o providing error info), not only
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * the instance initialization code (that should always provide it) */
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync B::fetchErrorInfo (NULL, NULL);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync }
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync }
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync /**
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * Attaches to the given foreign interface pointer by querying the own
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * interface on it. The operation may fail.
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync template <class OI>
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync void attach (OI *aIface)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /* be aware of self assignment */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync addref (aIface);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync release (mIface);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync if (aIface)
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync {
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync mIface = NULL;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync#if !defined (VBOX_WITH_XPCOM)
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync B::mRC = aIface->QueryInterface (_ATL_IIDOF (I), (void **) &mIface);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#else /* !defined (VBOX_WITH_XPCOM) */
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync B::mRC = aIface->QueryInterface (NS_GET_IID (I), (void **) &mIface);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync#endif /* !defined (VBOX_WITH_XPCOM) */
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync }
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync else
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync mIface = NULL;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync B::mRC = S_OK;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync }
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync };
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync /** Specialization of attach() for our own interface I. Never fails. */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync void attach (I *aIface)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync /* be aware of self assignment */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync addref (aIface);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync release (mIface);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync mIface = aIface;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync B::mRC = S_OK;
8e8844a522f5d335f177a0313b03067d79cce201vboxsync };
8e8844a522f5d335f177a0313b03067d79cce201vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /** Detaches from the underlying interface pointer. */
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync void detach() { release (mIface); mIface = NULL; }
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /** Returns @c true if not attached to any interface pointer. */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync bool isNull() const { return mIface == NULL; }
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /**
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync * Returns @c true if the result code represents success (with or without
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync * warnings).
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync bool isOk() const { return !isNull() && SUCCEEDED (B::mRC); }
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync /**
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync * Returns @c true if the result code represents success with one or more
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync * warnings.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync bool isWarning() const { return !isNull() && SUCCEEDED_WARNING (B::mRC); }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync /**
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync * Returns @c true if the result code represents success with no warnings.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync bool isReallyOk() const { return !isNull() && B::mRC == S_OK; }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync // utility operators
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync CInterface &operator= (const CInterface &that)
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync {
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync attach (that.mIface);
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync B::operator= (that);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync return *this;
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync CInterface &operator= (I *aIface)
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync {
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync attach (aIface);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync return *this;
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync }
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync /**
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync * Returns the raw interface pointer. Not intended to be used for anything
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync * else but in generated wrappers and for debugging. You've been warned.
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync I *raw() const { return mIface; }
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync bool operator== (const CInterface &that) const { return mIface == that.mIface; }
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync bool operator!= (const CInterface &that) const { return mIface != that.mIface; }
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @todo: rethink if we'll ever need 'protected' back, removed to allow mIface access in rather
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync * nontrivial inheritance situations, see 'friend wrappers' code in COMWrappers.xsl
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync//protected:
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync mutable I *mIface;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync};
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync/////////////////////////////////////////////////////////////////////////////
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsyncclass CUnknown : public CInterface <IUnknown, COMBaseWithEI>
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync{
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsyncpublic:
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync typedef CInterface <IUnknown, COMBaseWithEI> Base;
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync CUnknown() {}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync /** Creates an instance given another CInterface-based instance. */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync template <class OI, class OB>
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync explicit CUnknown (const CInterface <OI, OB> &that)
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync {
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync attach (that.mIface);
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync if (SUCCEEDED (mRC))
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync /* preserve old error info if any */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mRC = that.lastRC();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync setErrorInfo (that.errorInfo());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Constructor specialization for IUnknown. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CUnknown (const CUnknown &that) : Base (that) {}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Creates an instance given a foreign interface pointer. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync template <class OI>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync explicit CUnknown (OI *aIface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync attach (aIface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Constructor specialization for IUnknown. */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync explicit CUnknown (IUnknown *aIface) : Base (aIface) {}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Assigns from another CInterface-based instance. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync template <class OI, class OB>
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync CUnknown &operator= (const CInterface <OI, OB> &that)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync attach (that.mIface);
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync if (SUCCEEDED (mRC))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* preserve old error info if any */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync mRC = that.lastRC();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync setErrorInfo (that.errorInfo());
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return *this;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Assignment specialization for CUnknown. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CUnknown &operator= (const CUnknown &that)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Base::operator= (that);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return *this;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Assigns from a foreign interface pointer. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync template <class OI>
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync CUnknown &operator= (OI *aIface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync attach (aIface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return *this;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** Assignment specialization for IUnknown. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CUnknown &operator= (IUnknown *aIface)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Base::operator= (aIface);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return *this;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync /* @internal Used in generated wrappers. Never use directly. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync IUnknown *&rawRef() { return mIface; };
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync/////////////////////////////////////////////////////////////////////////////
5ace91141404400247438502a84a418fba00c8cfvboxsync
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync/* include the generated header containing concrete wrapper definitions */
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync#include "COMWrappers.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @} */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif // __COMDefs_h__
5ace91141404400247438502a84a418fba00c8cfvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync