132 lines
2.7 KiB
C++
132 lines
2.7 KiB
C++
|
// Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
|
||
|
#include <windows.h>
|
||
|
#include "guidenum.h"
|
||
|
|
||
|
//
|
||
|
// implementation of the enumerator returned by DMO enumeration API
|
||
|
//
|
||
|
|
||
|
CEnumDMOCLSID::CEnumDMOCLSID() {
|
||
|
m_cRef = 1;
|
||
|
m_ulPos = 0;
|
||
|
}
|
||
|
|
||
|
CEnumDMOCLSID::~CEnumDMOCLSID() {
|
||
|
Entry* pEntry;
|
||
|
DWORD ulPos = 0;
|
||
|
while (pEntry = m_store.GetNth(ulPos)) {
|
||
|
delete [] pEntry->szName;
|
||
|
ulPos++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT CEnumDMOCLSID::QueryInterface(REFIID riid, void **ppv) {
|
||
|
|
||
|
if (NULL == ppv) {
|
||
|
return E_POINTER;
|
||
|
}
|
||
|
|
||
|
if (riid == IID_IUnknown) {
|
||
|
AddRef();
|
||
|
*ppv = (IUnknown*)this;
|
||
|
return NOERROR;
|
||
|
}
|
||
|
else if (riid == IID_IEnumDMO) {
|
||
|
AddRef();
|
||
|
*ppv = (IEnumDMO*)this;
|
||
|
return NOERROR;
|
||
|
}
|
||
|
else
|
||
|
return E_NOINTERFACE;
|
||
|
}
|
||
|
|
||
|
ULONG CEnumDMOCLSID::AddRef() {
|
||
|
return InterlockedIncrement((long*)&m_cRef);
|
||
|
}
|
||
|
|
||
|
ULONG CEnumDMOCLSID::Release() {
|
||
|
long l = InterlockedDecrement((long*)&m_cRef);
|
||
|
if (l == 0) {
|
||
|
delete this;
|
||
|
}
|
||
|
return l;
|
||
|
}
|
||
|
|
||
|
HRESULT CEnumDMOCLSID::Next(ULONG celt, CLSID *pCLSIDs, WCHAR **pszNames, ULONG *pceltFetched) {
|
||
|
|
||
|
if( NULL == pCLSIDs ) {
|
||
|
return E_POINTER;
|
||
|
}
|
||
|
|
||
|
if( (1 != celt) && (NULL == pceltFetched) ) {
|
||
|
return E_INVALIDARG;
|
||
|
}
|
||
|
|
||
|
for (ULONG c = 0; c < celt; c++) {
|
||
|
Entry* p = m_store.GetNth(m_ulPos + c);
|
||
|
if (!p)
|
||
|
break;
|
||
|
pCLSIDs[c] = p->clsid;
|
||
|
WCHAR* szSrc = p->szName;
|
||
|
if (!szSrc)
|
||
|
szSrc = L"";
|
||
|
if (pszNames) {
|
||
|
pszNames[c] = (WCHAR*) CoTaskMemAlloc(sizeof(WCHAR) * (wcslen(szSrc) + 1));
|
||
|
if (pszNames[c]) {
|
||
|
wcscpy(pszNames[c], szSrc);
|
||
|
} else {
|
||
|
for (ULONG c1 = 0; c1 < c; c1++) {
|
||
|
CoTaskMemFree(pszNames[c1]);
|
||
|
pszNames[c1] = NULL;
|
||
|
}
|
||
|
return E_OUTOFMEMORY;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( NULL != pceltFetched ) {
|
||
|
*pceltFetched = c;
|
||
|
}
|
||
|
|
||
|
m_ulPos += c;
|
||
|
return (c == celt) ? S_OK : S_FALSE;
|
||
|
}
|
||
|
|
||
|
HRESULT CEnumDMOCLSID::Skip(ULONG celt) {
|
||
|
m_ulPos += celt;
|
||
|
|
||
|
// The documentation for IEnumXXXX::Skip() states that
|
||
|
// it returns "S_OK if the number of elements skipped
|
||
|
// is celt; otherwise S_FALSE." (MSDN Library April 2000).
|
||
|
if( m_ulPos <= m_store.GetSize() ) {
|
||
|
return S_OK;
|
||
|
} else {
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT CEnumDMOCLSID::Reset(void) {
|
||
|
m_ulPos = 0;
|
||
|
return NOERROR;
|
||
|
}
|
||
|
|
||
|
HRESULT CEnumDMOCLSID::Clone(IEnumDMO ** ppenum) {
|
||
|
return E_NOTIMPL;
|
||
|
}
|
||
|
|
||
|
void CEnumDMOCLSID::Add(REFCLSID clsidDMO, WCHAR* szName) {
|
||
|
WCHAR *szNm = NULL;
|
||
|
if (szName) {
|
||
|
szNm = new WCHAR[wcslen(szName) + 1];
|
||
|
if (szNm) {
|
||
|
wcscpy(szNm, szName);
|
||
|
} else {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
Entry e;
|
||
|
e.clsid = clsidDMO;
|
||
|
e.szName = szNm;
|
||
|
m_store.Add(e);
|
||
|
}
|