diff --git a/src/Avalonia.Native.OSX/common.h b/src/Avalonia.Native.OSX/common.h index 7a60c52e15..902aed895d 100644 --- a/src/Avalonia.Native.OSX/common.h +++ b/src/Avalonia.Native.OSX/common.h @@ -3,7 +3,7 @@ #ifndef common_h #define common_h -#include "com.h" +#include "comimpl.h" #include "avalonia-native.h" #include #import diff --git a/src/Avalonia.Native/Mappings.xml b/src/Avalonia.Native/Mappings.xml index a96da8b682..2949d4bfa2 100644 --- a/src/Avalonia.Native/Mappings.xml +++ b/src/Avalonia.Native/Mappings.xml @@ -3,7 +3,6 @@ Avalonia.Native Avalonia.Native.Interop SharpGen.Runtime.COM - $(THIS_CONFIG_PATH)/../headers typedef struct _GUID { unsigned int Data1; @@ -53,168 +52,6 @@ struct IUnknown #endif #define COMINTERFACE(name,d1,d2,d3, d41, d42, d43, d44, d45, d46, d47, d48) __IID_DEF(name,d1,d2,d3, d41, d42, d43, d44, d45, d46, d47, d48) \ struct __attribute__((annotate("uuid(" #d1 "-" #d2 "-" #d3 "-" #d41 #d42 "-" #d43 #d44 #d45 #d46 #d47 #d48 ")" ))) name -__IID_DEF(IUnknown, 0, 0, 0, C0, 00, 00, 00, 00, 00, 00, 46); - -class ComObject : public virtual IUnknown -{ -private: - unsigned int _refCount; -public: - - virtual ULONG AddRef() - { - _refCount++; - return _refCount; - } - - - virtual ULONG Release() - { - _refCount--; - ULONG rv = _refCount; - if(_refCount == 0) - delete(this); - return rv; - } - - ComObject() - { - _refCount = 1; - - } - virtual ~ComObject() - { - } - - - virtual ::HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject) = 0; - - virtual ::HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, - void **ppvObject) - { - if(0 == memcmp(riid, &IID_IUnknown, sizeof(GUID))) - *ppvObject = (IUnknown*)this; - else - { - auto rv = QueryInterfaceImpl(riid, ppvObject); - if(rv != S_OK) - return rv; - } - _refCount++; - return S_OK; - } - -}; - - -#define FORWARD_IUNKNOWN() \ -virtual ULONG Release(){ \ -return ComObject::Release(); \ -} \ -virtual ULONG AddRef() \ -{ \ - return ComObject::AddRef(); \ -} \ -virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) \ -{ \ - return ComObject::QueryInterface(riid, ppvObject); \ -} - -#define BEGIN_INTERFACE_MAP() public: virtual HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject){ -#define INTERFACE_MAP_ENTRY(TInterface, IID) if(0 == memcmp(riid, &IID, sizeof(GUID))) { TInterface* casted = this; *ppvObject = casted; return S_OK; } -#define END_INTERFACE_MAP() return E_NOINTERFACE; } -#define INHERIT_INTERFACE_MAP(TBase) if(TBase::QueryInterfaceImpl(riid, ppvObject) == S_OK) return S_OK; - - - -class ComUnknownObject : public ComObject -{ -public: - FORWARD_IUNKNOWN() - virtual ::HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject) override - { - return E_NOINTERFACE; - }; -}; - -template class ComSingleObject : public ComObject, public virtual TInterface -{ - BEGIN_INTERFACE_MAP() - INTERFACE_MAP_ENTRY(TInterface, *TIID) - END_INTERFACE_MAP() -}; - -template -class ComPtr -{ -private: - TInterface* _obj; -public: - ComPtr() - { - _obj = 0; - } - - ComPtr(TInterface* pObj) - { - _obj = 0; - - if (pObj) - { - _obj = pObj; - _obj->AddRef(); - } - } - - ComPtr(const ComPtr& ptr) - { - _obj = 0; - - if (ptr._obj) - { - _obj = ptr._obj; - _obj->AddRef(); - } - - } - - ComPtr& operator=(ComPtr other) - { - if(_obj != NULL) - _obj->Release(); - _obj = other._obj; - if(_obj != NULL) - _obj->AddRef(); - return *this; - } - - ~ComPtr() - { - if (_obj) - { - _obj->Release(); - _obj = 0; - } - } - -public: - operator TInterface*() const - { - return _obj; - } - TInterface& operator*() const - { - return *_obj; - } - TInterface** operator&() - { - return &_obj; - } - TInterface* operator->() const - { - return _obj; - } -}; #endif // COM_H_INCLUDED #pragma clang diagnostic pop diff --git a/src/headers/comimpl.h b/src/headers/comimpl.h new file mode 100644 index 0000000000..9d983366e4 --- /dev/null +++ b/src/headers/comimpl.h @@ -0,0 +1,175 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. +#include "com.h" +#pragma clang diagnostic push +#pragma ide diagnostic ignored "OCUnusedGlobalDeclarationInspection" +#ifndef COMIMPL_H_INCLUDED +#define COMIMPL_H_INCLUDED + +#include + +__IID_DEF(IUnknown, 0, 0, 0, C0, 00, 00, 00, 00, 00, 00, 46); + +class ComObject : public virtual IUnknown +{ +private: + unsigned int _refCount; +public: + + virtual ULONG AddRef() + { + _refCount++; + return _refCount; + } + + + virtual ULONG Release() + { + _refCount--; + ULONG rv = _refCount; + if(_refCount == 0) + delete(this); + return rv; + } + + ComObject() + { + _refCount = 1; + + } + virtual ~ComObject() + { + } + + + virtual ::HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject) = 0; + + virtual ::HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, + void **ppvObject) + { + if(0 == memcmp(riid, &IID_IUnknown, sizeof(GUID))) + *ppvObject = (IUnknown*)this; + else + { + auto rv = QueryInterfaceImpl(riid, ppvObject); + if(rv != S_OK) + return rv; + } + _refCount++; + return S_OK; + } + +}; + + +#define FORWARD_IUNKNOWN() \ +virtual ULONG Release(){ \ +return ComObject::Release(); \ +} \ +virtual ULONG AddRef() \ +{ \ + return ComObject::AddRef(); \ +} \ +virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) \ +{ \ + return ComObject::QueryInterface(riid, ppvObject); \ +} + +#define BEGIN_INTERFACE_MAP() public: virtual HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject){ +#define INTERFACE_MAP_ENTRY(TInterface, IID) if(0 == memcmp(riid, &IID, sizeof(GUID))) { TInterface* casted = this; *ppvObject = casted; return S_OK; } +#define END_INTERFACE_MAP() return E_NOINTERFACE; } +#define INHERIT_INTERFACE_MAP(TBase) if(TBase::QueryInterfaceImpl(riid, ppvObject) == S_OK) return S_OK; + + + +class ComUnknownObject : public ComObject +{ +public: + FORWARD_IUNKNOWN() + virtual ::HRESULT STDMETHODCALLTYPE QueryInterfaceImpl(REFIID riid, void **ppvObject) override + { + return E_NOINTERFACE; + }; +}; + +template class ComSingleObject : public ComObject, public virtual TInterface +{ + BEGIN_INTERFACE_MAP() + INTERFACE_MAP_ENTRY(TInterface, *TIID) + END_INTERFACE_MAP() +}; + +template +class ComPtr +{ +private: + TInterface* _obj; +public: + ComPtr() + { + _obj = 0; + } + + ComPtr(TInterface* pObj) + { + _obj = 0; + + if (pObj) + { + _obj = pObj; + _obj->AddRef(); + } + } + + ComPtr(const ComPtr& ptr) + { + _obj = 0; + + if (ptr._obj) + { + _obj = ptr._obj; + _obj->AddRef(); + } + + } + + ComPtr& operator=(ComPtr other) + { + if(_obj != NULL) + _obj->Release(); + _obj = other._obj; + if(_obj != NULL) + _obj->AddRef(); + return *this; + } + + ~ComPtr() + { + if (_obj) + { + _obj->Release(); + _obj = 0; + } + } + +public: + operator TInterface*() const + { + return _obj; + } + TInterface& operator*() const + { + return *_obj; + } + TInterface** operator&() + { + return &_obj; + } + TInterface* operator->() const + { + return _obj; + } +}; + +#endif // COMIMPL_H_INCLUDED +#pragma clang diagnostic pop