2025-04-27 07:49:33 -04:00

137 lines
4.0 KiB
C++

#include "dmodshow.h"
#include "moniker.h"
#include "dmoutils.h"
HRESULT InstantiateDMOAsFilter(REFCLSID clsidDMO, REFIID riid, void **ppv);
CDMOMoniker::CDMOMoniker(REFCLSID clsid, WCHAR szName[80]) {
if (szName)
wcscpy(m_szName, szName);
else
wcscpy(m_szName, L"");
m_clsid = clsid;
m_cRef = 1;
}
// IUnknown
HRESULT CDMOMoniker::QueryInterface(REFIID riid, void **ppv) {
if (riid == IID_IUnknown)
*ppv = (IUnknown*)(IMoniker*)this;
else if (riid == IID_IPersist)
*ppv = (IPersist*)this;
else if (riid == IID_IPersistStream)
*ppv = (IPersist*)this;
else if (riid == IID_IMoniker)
*ppv = (IMoniker*)this;
else if (riid == IID_IPropertyBag)
*ppv = (IPropertyBag*)this;
else
return E_NOINTERFACE;
AddRef();
return NOERROR;
}
ULONG CDMOMoniker::AddRef() {
return InterlockedIncrement((long*)&m_cRef);
}
ULONG CDMOMoniker::Release() {
long l = InterlockedDecrement((long*)&m_cRef);
if (l == 0) {
delete this;
}
return l;
}
// IPersist
HRESULT CDMOMoniker::GetClassID(CLSID *pClassID) {
// bugbug: I don't think this what they want
*pClassID = m_clsid;
return NOERROR;
}
// IPersistStream
HRESULT CDMOMoniker::IsDirty() {
return S_FALSE; // bugbug
}
HRESULT CDMOMoniker::Load(IStream *pStm) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::Save(IStream *pStm, BOOL fClearDirty) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::GetSizeMax(ULARGE_INTEGER *pcbSize) {
return E_NOTIMPL;
}
// IMoniker
HRESULT CDMOMoniker::BindToObject(IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppv) {
return InstantiateDMOAsFilter(m_clsid, riid, ppv);
}
HRESULT CDMOMoniker::BindToStorage(IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppv) {
if (riid == IID_IPropertyBag)
return QueryInterface(riid, ppv);
else
return InstantiateDMOAsFilter(m_clsid, riid, ppv);
}
HRESULT CDMOMoniker::Reduce(IBindCtx *pbc, DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::ComposeWith(IMoniker *pmkRight, BOOL bOnlyIfNotGeneric, IMoniker **ppmkComposite) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::Enum(BOOL fForward, IEnumMoniker **ppenumMoniker) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::IsEqual(IMoniker *pmkOtherMoniker) {
return S_FALSE;
}
HRESULT CDMOMoniker::Hash(DWORD *pdwHash) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::IsRunning(IBindCtx *pbc, IMoniker *pmkToLeft, IMoniker *pmkNewlyRunning) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::GetTimeOfLastChange(IBindCtx *pbc, IMoniker *pmkToLeft, FILETIME *pFileTime) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::Inverse(IMoniker **ppmk) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::CommonPrefixWith(IMoniker *pmkOther, IMoniker **ppmkPrefix) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::RelativePathTo(IMoniker *pmkOther, IMoniker **ppmkRelPath) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::GetDisplayName(IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName) {
WCHAR *szName = (WCHAR*)CoTaskMemAlloc((80 + 6) * sizeof(WCHAR));
*ppszDisplayName = szName;
if (!szName)
return E_OUTOFMEMORY;
wcscpy(szName, m_szName);
wcscat(szName, L" (...)");
return NOERROR;
}
HRESULT CDMOMoniker::ParseDisplayName(IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR psxDisplayName, ULONG *pchEaten, IMoniker **ppmkOut) {
return E_NOTIMPL;
}
HRESULT CDMOMoniker::IsSystemMoniker(DWORD *pdwMksys) {
return S_FALSE;
}
// IPropertyBag
HRESULT CDMOMoniker::Read(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog* pErrorLog) {
if (!lstrcmpW(pszPropName, L"FriendlyName")) {
//pVar->bstrVal = SysAllocString(m_szName);
pVar->bstrVal = SysAllocStringLen(NULL, 80 + 6);
wcscpy(pVar->bstrVal, m_szName);
wcscat(pVar->bstrVal, L" (DMO)");
return NOERROR;
}
else
return E_FAIL;
}
HRESULT CDMOMoniker::Write(LPCOLESTR pszPropName, VARIANT *pVar) {
return E_NOTIMPL;
}