Wrapper.h revision cd262b48e0da0a4b21a5c5dbb7d653626fb4d2b0
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync/* $Id$ */
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync/** @file
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync *
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync * VirtualBox COM: API wrapper helpers
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync */
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync/*
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync * Copyright (C) 2012-2013 Oracle Corporation
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync *
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync * available from http://www.virtualbox.org. This file is free software;
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync * you can redistribute it and/or modify it under the terms of the GNU
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync * General Public License (GPL) as published by the Free Software
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync */
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync#ifndef ____H_WRAPPER
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync#define ____H_WRAPPER
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync#include <vector>
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync#include <VBox/com/ptr.h>
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync#include <VBox/com/array.h>
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync#include "AutoCaller.h"
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync/**
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync * Checks that the given pointer to an output argument is valid and throws
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync * E_POINTER + extended error info otherwise.
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync * @param arg Pointer argument.
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync */
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync#define CheckComArgOutPointerValidThrow(arg) \
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync do { \
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync if (RT_UNLIKELY(!VALID_PTR(arg))) \
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync throw setError(E_POINTER, \
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync tr("Output argument %s points to invalid memory location (%p)"), \
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync #arg, (void *)(arg)); \
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync } while (0)
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsyncclass BSTROutConverter
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync{
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsyncpublic:
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync BSTROutConverter() : mDst(NULL)
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync {
73998d8c011a8daa516284396927355bef407656vboxsync }
73998d8c011a8daa516284396927355bef407656vboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync BSTROutConverter(BSTR *aDst) : mDst(aDst)
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync {
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync }
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync ~BSTROutConverter()
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync {
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync if (mDst)
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync Bstr(mStr).detachTo(mDst);
73998d8c011a8daa516284396927355bef407656vboxsync }
73998d8c011a8daa516284396927355bef407656vboxsync
73998d8c011a8daa516284396927355bef407656vboxsync com::Utf8Str &str()
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync {
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync return mStr;
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync }
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsyncprivate:
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync com::Utf8Str mStr;
73998d8c011a8daa516284396927355bef407656vboxsync BSTR *mDst;
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync};
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsyncclass BSTRInConverter
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync{
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsyncpublic:
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync BSTRInConverter() : mSrc()
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync {
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync }
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync BSTRInConverter(CBSTR aSrc) : mSrc(aSrc)
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync {
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync }
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync
d981a844e64c196b4c96be1a52ddc42e23337138vboxsync ~BSTRInConverter()
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync {
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync }
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync const com::Utf8Str &str()
169154fcc4bae3ca771f32a6c11cc0a06f04d505vboxsync {
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync return mSrc;
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync }
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsyncprivate:
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync const com::Utf8Str mSrc;
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync};
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsyncclass ArrayBSTROutConverter
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync{
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsyncpublic:
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync ArrayBSTROutConverter() :
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync#ifdef VBOX_WITH_XPCOM
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync mDstSize(NULL),
169154fcc4bae3ca771f32a6c11cc0a06f04d505vboxsync mDst(NULL)
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync#else // !VBOX_WITH_XPCOM
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync mDst(NULL)
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync#endif // !VBOX_WITH_XPCOM
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync {
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync }
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync ArrayBSTROutConverter(ComSafeArrayOut(BSTR, aDst)) :
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync#ifdef VBOX_WITH_XPCOM
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync mDstSize(aDstSize),
e94d561018bd5f9e7a92dea86468500774b2d8ffvboxsync mDst(aDst)
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync#else // !VBOX_WITH_XPCOM
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync mDst(aDst)
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync#endif // !VBOX_WITH_XPCOM
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync {
e94d561018bd5f9e7a92dea86468500774b2d8ffvboxsync }
95ff7c92406f8e3cc892ec0ed9be7d06c49e302cvboxsync
95ff7c92406f8e3cc892ec0ed9be7d06c49e302cvboxsync ~ArrayBSTROutConverter()
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync {
eb6509c759a277527b791759757d9d9a5b1c5e32vboxsync if (mDst)
caff8bc1842e1ba69d4115103177264909cbb97bvboxsync {
caff8bc1842e1ba69d4115103177264909cbb97bvboxsync com::SafeArray<BSTR> outArray(mArray.size());
eeea67e86500e2fe13ace42b86653498e3d656aavboxsync for (size_t i = 0; i < mArray.size(); i++)
caff8bc1842e1ba69d4115103177264909cbb97bvboxsync Bstr(mArray[i]).detachTo(&outArray[i]);
caff8bc1842e1ba69d4115103177264909cbb97bvboxsync outArray.detachTo(ComSafeArrayOutArg(mDst));
4003a16c61cdf61979273c73fc02805967e57683vboxsync }
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync }
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync
4adca41ab708846c9a69a97eebf81f7da1c0e602vboxsync std::vector<com::Utf8Str> &array()
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync {
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync return mArray;
aee9566869f4ef64fd4c1bf0b6b0472118c4e3dcvboxsync }
private:
std::vector<com::Utf8Str> mArray;
#ifdef VBOX_WITH_XPCOM
PRUint32 *mDstSize;
BSTR **mDst;
#else // !VBOX_WITH_XPCOM
SAFEARRAY **mDst;
#endif // !VBOX_WITH_XPCOM
};
class ArrayBSTRInConverter
{
public:
ArrayBSTRInConverter()
{
}
ArrayBSTRInConverter(ComSafeArrayIn(IN_BSTR, aSrc))
{
com::SafeArray<IN_BSTR> inArray(ComSafeArrayInArg(aSrc));
mArray.resize(inArray.size());
for (size_t i = 0; i < inArray.size(); i++)
mArray[i] = inArray[i];
}
~ArrayBSTRInConverter()
{
}
const std::vector<com::Utf8Str> &array()
{
return mArray;
}
private:
std::vector<com::Utf8Str> mArray;
};
class UuidOutConverter
{
public:
UuidOutConverter() : mDst(NULL)
{
}
UuidOutConverter(BSTR *aDst) : mDst(aDst)
{
}
~UuidOutConverter()
{
if (mDst)
mUuid.toUtf16().detachTo(mDst);
}
com::Guid &uuid()
{
return mUuid;
}
private:
com::Guid mUuid;
BSTR *mDst;
};
class UuidInConverter
{
public:
UuidInConverter() : mSrc()
{
}
UuidInConverter(CBSTR aSrc) : mSrc(aSrc)
{
}
~UuidInConverter()
{
}
const com::Guid &uuid()
{
return mSrc;
}
private:
const com::Guid mSrc;
};
class ArrayUuidOutConverter
{
public:
ArrayUuidOutConverter() :
#ifdef VBOX_WITH_XPCOM
mDstSize(NULL),
mDst(NULL)
#else // !VBOX_WITH_XPCOM
mDst(NULL)
#endif // !VBOX_WITH_XPCOM
{
}
ArrayUuidOutConverter(ComSafeArrayOut(BSTR, aDst)) :
#ifdef VBOX_WITH_XPCOM
mDstSize(aDstSize),
mDst(aDst)
#else // !VBOX_WITH_XPCOM
mDst(aDst)
#endif // !VBOX_WITH_XPCOM
{
}
~ArrayUuidOutConverter()
{
if (mDst)
{
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(aSrc)
{
}
~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);
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<ComPtr<A> > &array()
{
return mArray;
}
private:
std::vector<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: */