|
| 1 | +#include "propset.h" |
| 2 | + |
| 3 | +#include <vfwmsgs.h> |
| 4 | + |
| 5 | +#include "guidprinter.h" |
| 6 | +#include "logging.h" |
| 7 | + |
| 8 | + |
| 9 | +namespace { |
| 10 | + |
| 11 | +using voidp = void*; |
| 12 | + |
| 13 | +} // namespace |
| 14 | + |
| 15 | + |
| 16 | +#define CLASS_PREFIX "DSPrivatePropertySet::" |
| 17 | +DSPrivatePropertySet::DSPrivatePropertySet() = default; |
| 18 | +DSPrivatePropertySet::~DSPrivatePropertySet() = default; |
| 19 | + |
| 20 | +ComPtr<DSPrivatePropertySet> DSPrivatePropertySet::Create() |
| 21 | +{ |
| 22 | + return ComPtr<DSPrivatePropertySet>{new DSPrivatePropertySet{}}; |
| 23 | +} |
| 24 | + |
| 25 | + |
| 26 | +#define PREFIX CLASS_PREFIX "QueryInterface " |
| 27 | +HRESULT STDMETHODCALLTYPE DSPrivatePropertySet::QueryInterface(REFIID riid, void **ppvObject) noexcept |
| 28 | +{ |
| 29 | + DEBUG(PREFIX "(%p)->(%s, %p)\n", voidp{this}, IidPrinter{riid}.c_str(), voidp{ppvObject}); |
| 30 | + |
| 31 | + *ppvObject = nullptr; |
| 32 | + if(riid == IID_IUnknown) |
| 33 | + { |
| 34 | + AddRef(); |
| 35 | + *ppvObject = as<IUnknown*>(); |
| 36 | + return S_OK; |
| 37 | + } |
| 38 | + if(riid == IID_IKsPropertySet) |
| 39 | + { |
| 40 | + AddRef(); |
| 41 | + *ppvObject = as<IKsPropertySet*>(); |
| 42 | + return S_OK; |
| 43 | + } |
| 44 | + |
| 45 | + FIXME(PREFIX "Unhandled GUID: %s\n", IidPrinter{riid}.c_str()); |
| 46 | + return E_NOINTERFACE; |
| 47 | +} |
| 48 | +#undef PREFIX |
| 49 | + |
| 50 | +ULONG STDMETHODCALLTYPE DSPrivatePropertySet::AddRef() noexcept |
| 51 | +{ |
| 52 | + const auto ret = mRef.fetch_add(1u, std::memory_order_relaxed) + 1; |
| 53 | + DEBUG(CLASS_PREFIX "AddRef (%p) ref %lu\n", voidp{this}, ret); |
| 54 | + return ret; |
| 55 | +} |
| 56 | + |
| 57 | +ULONG STDMETHODCALLTYPE DSPrivatePropertySet::Release() noexcept |
| 58 | +{ |
| 59 | + const auto ret = mRef.fetch_sub(1u, std::memory_order_relaxed) - 1; |
| 60 | + DEBUG(CLASS_PREFIX "Release (%p) ref %lu\n", voidp{this}, ret); |
| 61 | + if(ret == 0) UNLIKELY delete this; |
| 62 | + return ret; |
| 63 | +} |
| 64 | + |
| 65 | + |
| 66 | +#define PREFIX CLASS_PREFIX "Get " |
| 67 | +HRESULT STDMETHODCALLTYPE DSPrivatePropertySet::Get(REFGUID guidPropSet, ULONG dwPropID, |
| 68 | + void *pInstanceData, ULONG cbInstanceData, void *pPropData, ULONG cbPropData, |
| 69 | + ULONG *pcbReturned) noexcept |
| 70 | +{ |
| 71 | + DEBUG(PREFIX "(%p)->(%s, 0x%lx, %p, %lu, %p, %lu, %p)\n", voidp{this}, |
| 72 | + PropidPrinter{guidPropSet}.c_str(), dwPropID, pInstanceData, cbInstanceData, pPropData, |
| 73 | + cbPropData, voidp{pcbReturned}); |
| 74 | + |
| 75 | + if(!pcbReturned) |
| 76 | + return E_POINTER; |
| 77 | + *pcbReturned = 0; |
| 78 | + |
| 79 | + if(cbPropData > 0 && !pPropData) |
| 80 | + { |
| 81 | + WARN(PREFIX "pPropData is null with cbPropData > 0\n"); |
| 82 | + return E_POINTER; |
| 83 | + } |
| 84 | + |
| 85 | + FIXME(PREFIX "Unhandled propset: %s (propid: %lu)\n", PropidPrinter{guidPropSet}.c_str(), |
| 86 | + dwPropID); |
| 87 | + return E_PROP_ID_UNSUPPORTED; |
| 88 | +} |
| 89 | +#undef PREFIX |
| 90 | + |
| 91 | +#define PREFIX CLASS_PREFIX "Set " |
| 92 | +HRESULT STDMETHODCALLTYPE DSPrivatePropertySet::Set(REFGUID guidPropSet, ULONG dwPropID, |
| 93 | + void *pInstanceData, ULONG cbInstanceData, void *pPropData, ULONG cbPropData) noexcept |
| 94 | +{ |
| 95 | + DEBUG(PREFIX "(%p)->(%s, 0x%lx, %p, %lu, %p, %lu)\n", voidp{this}, |
| 96 | + PropidPrinter{guidPropSet}.c_str(), dwPropID, pInstanceData, cbInstanceData, pPropData, |
| 97 | + cbPropData); |
| 98 | + return E_PROP_ID_UNSUPPORTED; |
| 99 | +} |
| 100 | +#undef PREFIX |
| 101 | + |
| 102 | +#define PREFIX CLASS_PREFIX "QuerySupport " |
| 103 | +HRESULT STDMETHODCALLTYPE DSPrivatePropertySet::QuerySupport(REFGUID guidPropSet, ULONG dwPropID, |
| 104 | + ULONG *pTypeSupport) noexcept |
| 105 | +{ |
| 106 | + FIXME(PREFIX "(%p)->(%s, 0x%lx, %p)\n", voidp{this}, PropidPrinter{guidPropSet}.c_str(), |
| 107 | + dwPropID, voidp{pTypeSupport}); |
| 108 | + |
| 109 | + if(!pTypeSupport) |
| 110 | + return E_POINTER; |
| 111 | + *pTypeSupport = 0; |
| 112 | + |
| 113 | + return E_PROP_ID_UNSUPPORTED; |
| 114 | +} |
| 115 | +#undef PREFIX |
| 116 | +#undef CLASS_PREFIX |
0 commit comments