137 lines
4.0 KiB
C++
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;
|
|
}
|
|
|