Wrapper.h revision 521114694b1ff46f514becb37c72dbf1f2dd7714
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync/* $Id$ */
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync/** @file
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync *
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * VirtualBox COM: API wrapper helpers
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync */
c58f1213e628a545081c70e26c6b67a841cff880vboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync/*
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * Copyright (C) 2012-2013 Oracle Corporation
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync *
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * available from http://www.virtualbox.org. This file is free software;
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * you can redistribute it and/or modify it under the terms of the GNU
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * General Public License (GPL) as published by the Free Software
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync */
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync#ifndef ____H_WRAPPER
4651430e55b9df9726347e3e3968618e540fe729vboxsync#define ____H_WRAPPER
4651430e55b9df9726347e3e3968618e540fe729vboxsync
d5bf937d132098565e18a0d1fc408fb777c5e5b6vboxsync#include <vector>
37e4655312fa6433c756cfa05a4db6b72e0c4344vboxsync#include <VBox/com/ptr.h>
d5bf937d132098565e18a0d1fc408fb777c5e5b6vboxsync#include <VBox/com/array.h>
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync/**
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * Checks that the given pointer to an output argument is valid and throws
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * E_POINTER + extended error info otherwise.
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync * @param arg Pointer argument.
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync */
382dd16193dd5770e53a99d3e3f3bc4e96f1ddd8vboxsync#define CheckComArgOutPointerValidThrow(arg) \
382dd16193dd5770e53a99d3e3f3bc4e96f1ddd8vboxsync do { \
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync if (RT_UNLIKELY(!VALID_PTR(arg))) \
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync throw setError(E_POINTER, \
76f5d3db08b007661ae4af93200838d24683af52vboxsync tr("Output argument %s points to invalid memory location (%p)"), \
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync #arg, (void *)(arg)); \
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync } while (0)
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsyncclass BSTROutConverter
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync{
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsyncpublic:
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync BSTROutConverter() : mDst(NULL)
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync BSTROutConverter(BSTR *aDst) : mDst(aDst)
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
a536b4958564d95ba9fb795645a7b876e6b409edvboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync ~BSTROutConverter()
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
231051c77670a4142b7545d51bd2251ae603189dvboxsync if (mDst)
231051c77670a4142b7545d51bd2251ae603189dvboxsync Bstr(mStr).detachTo(mDst);
454ac5c6ef4960887035ceea6b5247789d3272davboxsync }
231051c77670a4142b7545d51bd2251ae603189dvboxsync
76f5d3db08b007661ae4af93200838d24683af52vboxsync com::Utf8Str &str()
76f5d3db08b007661ae4af93200838d24683af52vboxsync {
76f5d3db08b007661ae4af93200838d24683af52vboxsync return mStr;
76f5d3db08b007661ae4af93200838d24683af52vboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsyncprivate:
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync com::Utf8Str mStr;
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync BSTR *mDst;
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync};
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsyncclass BSTRInConverter
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync{
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsyncpublic:
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync BSTRInConverter() : mSrc()
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync BSTRInConverter(CBSTR aSrc) : mSrc(aSrc)
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsync {
231051c77670a4142b7545d51bd2251ae603189dvboxsync }
454ac5c6ef4960887035ceea6b5247789d3272davboxsync
a536b4958564d95ba9fb795645a7b876e6b409edvboxsync ~BSTRInConverter()
a536b4958564d95ba9fb795645a7b876e6b409edvboxsync {
8ae161fca703d669e1306fafee128914f831f72bvboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsync const com::Utf8Str &str()
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync return mSrc;
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsync }
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsync
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsyncprivate:
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync const com::Utf8Str mSrc;
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsync};
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsync
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsyncclass ArrayBSTROutConverter
b2a9ade0eaa3c7b26c02cc05f83c352cafb9e03avboxsync{
22ea904a6fe5c95f54c4374502747cc844ce8204vboxsyncpublic:
22ea904a6fe5c95f54c4374502747cc844ce8204vboxsync ArrayBSTROutConverter() :
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync#ifdef VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync mDstSize(NULL),
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync mDst(NULL)
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync#else // !VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync mDst(NULL)
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync#endif // !VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync ArrayBSTROutConverter(ComSafeArrayOut(BSTR, aDst)) :
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync#ifdef VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync mDstSize(aDstSize),
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync mDst(aDst)
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync#else // !VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync mDst(aDst)
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync#endif // !VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync }
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync ~ArrayBSTROutConverter()
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync {
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync if (mDst)
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync {
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync com::SafeArray<BSTR> outArray(mArray.size());
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync for (size_t i = 0; i < mArray.size(); i++)
62c8fef246519d59ee7ad41dd71de75b96b3552bvboxsync Bstr(mArray[i]).detachTo(&outArray[i]);
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync outArray.detachTo(ComSafeArrayOutArg(mDst));
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync std::vector<com::Utf8Str> &array()
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync return mArray;
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsyncprivate:
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync std::vector<com::Utf8Str> mArray;
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync#ifdef VBOX_WITH_XPCOM
62c8fef246519d59ee7ad41dd71de75b96b3552bvboxsync PRUint32 *mDstSize;
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync BSTR **mDst;
6b9316bfe743cc7d2ee00d925f4ab455bc224e86vboxsync#else // !VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync SAFEARRAY **mDst;
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync#endif // !VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync};
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsyncclass ArrayBSTRInConverter
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync{
15760030457c4d8548d42a9d543646b27eae7040vboxsyncpublic:
15760030457c4d8548d42a9d543646b27eae7040vboxsync ArrayBSTRInConverter()
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsync ArrayBSTRInConverter(ComSafeArrayIn(IN_BSTR, aSrc))
fbf482cad760a830bc8789ad639162019954ba80vboxsync {
fbf482cad760a830bc8789ad639162019954ba80vboxsync com::SafeArray<BSTR> inArray(ComSafeArrayInArg(aSrc));
fbf482cad760a830bc8789ad639162019954ba80vboxsync mArray.resize(inArray.size());
fbf482cad760a830bc8789ad639162019954ba80vboxsync for (size_t i = 0; i < inArray.size(); i++)
fbf482cad760a830bc8789ad639162019954ba80vboxsync mArray[i] = inArray[i];
fbf482cad760a830bc8789ad639162019954ba80vboxsync }
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsync ~ArrayBSTRInConverter()
fbf482cad760a830bc8789ad639162019954ba80vboxsync {
fbf482cad760a830bc8789ad639162019954ba80vboxsync }
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsync const std::vector<const com::Utf8Str> &array()
9ff5b937cfc7a0832f0d8f52ab642193c2a0670avboxsync {
fbf482cad760a830bc8789ad639162019954ba80vboxsync return mArray;
96eb45983d3cdab98da24ba9a31ef0c6e6021a77vboxsync }
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsyncprivate:
fbf482cad760a830bc8789ad639162019954ba80vboxsync std::vector<const com::Utf8Str> mArray;
382dd16193dd5770e53a99d3e3f3bc4e96f1ddd8vboxsync};
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsyncclass UuidOutConverter
fbf482cad760a830bc8789ad639162019954ba80vboxsync{
fbf482cad760a830bc8789ad639162019954ba80vboxsyncpublic:
fbf482cad760a830bc8789ad639162019954ba80vboxsync UuidOutConverter() : mDst(NULL)
fbf482cad760a830bc8789ad639162019954ba80vboxsync {
fbf482cad760a830bc8789ad639162019954ba80vboxsync }
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsync UuidOutConverter(BSTR *aDst) : mDst(aDst)
fbf482cad760a830bc8789ad639162019954ba80vboxsync {
fbf482cad760a830bc8789ad639162019954ba80vboxsync }
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsync ~UuidOutConverter()
382dd16193dd5770e53a99d3e3f3bc4e96f1ddd8vboxsync {
fbf482cad760a830bc8789ad639162019954ba80vboxsync if (mDst)
fbf482cad760a830bc8789ad639162019954ba80vboxsync mUuid.toUtf16().detachTo(mDst);
fbf482cad760a830bc8789ad639162019954ba80vboxsync }
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsync com::Guid &uuid()
fbf482cad760a830bc8789ad639162019954ba80vboxsync {
fbf482cad760a830bc8789ad639162019954ba80vboxsync return mUuid;
fbf482cad760a830bc8789ad639162019954ba80vboxsync }
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsyncprivate:
fbf482cad760a830bc8789ad639162019954ba80vboxsync com::Guid mUuid;
fbf482cad760a830bc8789ad639162019954ba80vboxsync BSTR *mDst;
fbf482cad760a830bc8789ad639162019954ba80vboxsync};
fbf482cad760a830bc8789ad639162019954ba80vboxsync
fbf482cad760a830bc8789ad639162019954ba80vboxsyncclass UuidInConverter
fbf482cad760a830bc8789ad639162019954ba80vboxsync{
fbf482cad760a830bc8789ad639162019954ba80vboxsyncpublic:
fbf482cad760a830bc8789ad639162019954ba80vboxsync UuidInConverter() : mSrc()
fbf482cad760a830bc8789ad639162019954ba80vboxsync {
fbf482cad760a830bc8789ad639162019954ba80vboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync UuidInConverter(CBSTR aSrc) : mSrc(aSrc)
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync ~UuidInConverter()
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync }
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync const com::Guid &uuid()
f7c0f913c4c22ee18059ff97055442566d0f14a1vboxsync {
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync return mSrc;
f7c0f913c4c22ee18059ff97055442566d0f14a1vboxsync }
f7c0f913c4c22ee18059ff97055442566d0f14a1vboxsync
f7c0f913c4c22ee18059ff97055442566d0f14a1vboxsyncprivate:
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync const com::Guid mSrc;
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync};
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsyncclass ArrayUuidOutConverter
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync{
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsyncpublic:
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync ArrayUuidOutConverter() :
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync#ifdef VBOX_WITH_XPCOM
d5bf937d132098565e18a0d1fc408fb777c5e5b6vboxsync mDstSize(NULL),
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync mDst(NULL)
3455d9b135d41903504b9be3f4eeaa038f6ee03avboxsync#else // !VBOX_WITH_XPCOM
0c9573129c50b7f9f4ea54e61417c2ed06bb8ebavboxsync mDst(NULL)
7fa9b0ac0a9faf4aedbd3b53aa0cb2b81be99ee6vboxsync#endif // !VBOX_WITH_XPCOM
7fa9b0ac0a9faf4aedbd3b53aa0cb2b81be99ee6vboxsync {
37e4655312fa6433c756cfa05a4db6b72e0c4344vboxsync }
454ac5c6ef4960887035ceea6b5247789d3272davboxsync
8a99522dee886d4ed00c8cd18788e9e722febd71vboxsync ArrayUuidOutConverter(ComSafeArrayOut(BSTR, aDst)) :
8a99522dee886d4ed00c8cd18788e9e722febd71vboxsync#ifdef VBOX_WITH_XPCOM
8a99522dee886d4ed00c8cd18788e9e722febd71vboxsync mDstSize(aDstSize),
454ac5c6ef4960887035ceea6b5247789d3272davboxsync mDst(aDst)
8a99522dee886d4ed00c8cd18788e9e722febd71vboxsync#else // !VBOX_WITH_XPCOM
454ac5c6ef4960887035ceea6b5247789d3272davboxsync mDst(aDst)
badc6d0a88e64de11285f73127a7e1651b69a00bvboxsync#endif // !VBOX_WITH_XPCOM
454ac5c6ef4960887035ceea6b5247789d3272davboxsync {
badc6d0a88e64de11285f73127a7e1651b69a00bvboxsync }
badc6d0a88e64de11285f73127a7e1651b69a00bvboxsync
454ac5c6ef4960887035ceea6b5247789d3272davboxsync ~ArrayUuidOutConverter()
454ac5c6ef4960887035ceea6b5247789d3272davboxsync {
ceec11f70ccba5b30ce0a34c66116a09155aeb6evboxsync if (mDst)
a232d881522e92876b3870985382aee4d2d4f211vboxsync {
8a99522dee886d4ed00c8cd18788e9e722febd71vboxsync com::SafeArray<BSTR> outArray(mArray.size());
for (size_t i = 0; i < mArray.size(); i++)
mArray[i].toUtf16().detachTo(&outArray[i]);
outArray.detachTo(ComSafeArrayOutArg(mDst));
}
}
std::vector<com::Guid> &array()
{
return mArray;
}
private:
std::vector<com::Guid> mArray;
#ifdef VBOX_WITH_XPCOM
PRUint32 *mDstSize;
BSTR **mDst;
#else // !VBOX_WITH_XPCOM
SAFEARRAY **mDst;
#endif // !VBOX_WITH_XPCOM
};
template <class A>
class ComTypeOutConverter
{
public:
ComTypeOutConverter() : mDst(NULL)
{
}
ComTypeOutConverter(A **aDst) : mDst(aDst)
{
}
~ComTypeOutConverter()
{
if (mDst)
mPtr.queryInterfaceTo(mDst);
}
ComPtr<A> &ptr()
{
return mPtr;
}
private:
ComPtr<A> mPtr;
A **mDst;
};
template <class A>
class ComTypeInConverter
{
public:
ComTypeInConverter() : mSrc(NULL)
{
}
ComTypeInConverter(A *aSrc) : mSrc(mSrc)
{
}
~ComTypeInConverter()
{
}
const ComPtr<A> &ptr()
{
return mSrc;
}
private:
const ComPtr<A> mSrc;
};
template <class A>
class ArrayComTypeOutConverter
{
public:
ArrayComTypeOutConverter() :
#ifdef VBOX_WITH_XPCOM
mDstSize(NULL),
mDst(NULL)
#else // !VBOX_WITH_XPCOM
mDst(NULL)
#endif // !VBOX_WITH_XPCOM
{
}
ArrayComTypeOutConverter(ComSafeArrayOut(A, aDst)) :
#ifdef VBOX_WITH_XPCOM
mDstSize(aDstSize),
mDst(aDst)
#else // !VBOX_WITH_XPCOM
mDst(aDst)
#endif // !VBOX_WITH_XPCOM
{
}
~ArrayComTypeOutConverter()
{
if (mDst)
{
com::SafeIfaceArray<A> outArray(mArray.size());
for (size_t i = 0; i < mArray.size(); i++)
outArray[i] = mArray[i];
outArray.detachTo(ComSafeArrayOutArg(mDst));
}
}
std::vector<ComPtr<A> > &array()
{
return mArray;
}
private:
std::vector<ComPtr<A> > mArray;
#ifdef VBOX_WITH_XPCOM
PRUint32 *mDstSize;
A **mDst;
#else // !VBOX_WITH_XPCOM
SAFEARRAY **mDst;
#endif // !VBOX_WITH_XPCOM
};
template <class A>
class ArrayComTypeInConverter
{
public:
ArrayComTypeInConverter()
{
}
ArrayComTypeInConverter(ComSafeArrayIn(A, aSrc))
{
com::SafeIfaceArray<A> inArray(ComSafeArrayInArg(aSrc));
mArray.resize(inArray.size());
for (size_t i = 0; i < inArray.size(); i++)
mArray[i] = inArray[i];
}
~ArrayComTypeInConverter()
{
}
const std::vector<const ComPtr<A> > &array()
{
return mArray;
}
private:
std::vector<const ComPtr<A> > mArray;
};
template <typename A>
class ArrayOutConverter
{
public:
ArrayOutConverter() :
#ifdef VBOX_WITH_XPCOM
mDstSize(NULL),
mDst(NULL)
#else // !VBOX_WITH_XPCOM
mDst(NULL)
#endif // !VBOX_WITH_XPCOM
{
}
ArrayOutConverter(ComSafeArrayOut(A, aDst)) :
#ifdef VBOX_WITH_XPCOM
mDstSize(aDstSize),
mDst(aDst)
#else // !VBOX_WITH_XPCOM
mDst(aDst)
#endif // !VBOX_WITH_XPCOM
{
}
~ArrayOutConverter()
{
if (mDst)
{
com::SafeArray<A> outArray(mArray.size());
for (size_t i = 0; i < mArray.size(); i++)
outArray[i] = mArray[i];
outArray.detachTo(ComSafeArrayOutArg(mDst));
}
}
std::vector<A> &array()
{
return mArray;
}
private:
std::vector<A> mArray;
#ifdef VBOX_WITH_XPCOM
PRUint32 *mDstSize;
A **mDst;
#else // !VBOX_WITH_XPCOM
SAFEARRAY **mDst;
#endif // !VBOX_WITH_XPCOM
};
template <typename A>
class ArrayInConverter
{
public:
ArrayInConverter()
{
}
ArrayInConverter(ComSafeArrayIn(A, aSrc))
{
com::SafeArray<A> inArray(ComSafeArrayInArg(aSrc));
mArray.resize(inArray.size());
for (size_t i = 0; i < inArray.size(); i++)
mArray[i] = inArray[i];
}
~ArrayInConverter()
{
}
const std::vector<A> &array()
{
return mArray;
}
private:
std::vector<A> mArray;
};
#endif // ____H_WRAPPER
/* vi: set tabstop=4 shiftwidth=4 expandtab: */