//+--------------------------------------------------------------------------- // // Function: CEnumFmtEtc // // Synopsis: Implements the IEnumFormatEtc. // Used by the urlmon by dataobject and CreateEnumFormatEtc // // Arguments: (none) // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- #include PerfDbgTag(tagCEnumFmtEtc, "Urlmon", "Log CEnumFmtEtc", DEB_FORMAT); //+--------------------------------------------------------------------------- // // Method: CEnumFmtEtc::Create // // Synopsis: // // Arguments: [cfmtetc] -- // [rgfmtetc] -- // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- CEnumFmtEtc * CEnumFmtEtc::Create(UINT cfmtetc, FORMATETC* rgfmtetc) { PerfDbgLog(tagCEnumFmtEtc, NULL, "+CEnumFmtEtc::Create"); CEnumFmtEtc * pCEnumFEtc = NULL; if (cfmtetc >= 1) { // only create an enumerator if at least one element pCEnumFEtc = new CEnumFmtEtc(); if (pCEnumFEtc) { if (pCEnumFEtc->Initialize(cfmtetc, rgfmtetc, 0) == FALSE) { delete pCEnumFEtc; pCEnumFEtc = NULL; } } } PerfDbgLog1(tagCEnumFmtEtc, NULL, "-CEnumFmtEtc::Create pEnum->(%lx)", pCEnumFEtc); return pCEnumFEtc; } //+--------------------------------------------------------------------------- // // Method: CEnumFmtEtc::Initialize // // Synopsis: set the size and position // // Arguments: [cfmtetc] -- number of elements // [iPos] -- position of enumerator // // Returns: true on success // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- BOOL CEnumFmtEtc::Initialize(UINT cfmtetc, FORMATETC* rgfmtetc, UINT iPos) { LONG cbSize = sizeof(FORMATETC) * cfmtetc; _iNext = iPos; _cElements = cfmtetc; _pFmtEtc = (FORMATETC *) new FORMATETC [cfmtetc]; if (_pFmtEtc) { memcpy(_pFmtEtc, rgfmtetc, cbSize); _cElements = cfmtetc; } else { _cElements = 0; } return _cElements != 0; } //+--------------------------------------------------------------------------- // // Method: CEnumFmtEtc::QueryInterface // // Synopsis: // // Arguments: [riid] -- // [ppvObj] -- // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CEnumFmtEtc::QueryInterface(REFIID riid, LPVOID FAR* ppvObj) { PerfDbgLog(tagCEnumFmtEtc, this, "+CEnumFmtEtc::QueryInterface"); HRESULT hr = NOERROR; if ( (riid == IID_IUnknown) || (riid == IID_IEnumFORMATETC)) { *ppvObj = this; AddRef(); } else { *ppvObj = NULL; hr = E_NOINTERFACE; } PerfDbgLog(tagCEnumFmtEtc, this, "-CEnumFmtEtc::QueryInterface"); return hr; } //+--------------------------------------------------------------------------- // // Function: CEnumFmtEtc::AddRef // // Synopsis: // // Arguments: [ULONG] -- // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP_(ULONG) CEnumFmtEtc::AddRef(void) { GEN_VDATEPTRIN(this,ULONG,0L); LONG lRet = ++_CRefs; PerfDbgLog1(tagCEnumFmtEtc, this, "CEnumFmtEtc::AddRef(%ld)", lRet); return lRet; } //+--------------------------------------------------------------------------- // // Function: CEnumFmtEtc::Release // // Synopsis: // // Arguments: [ULONG] -- // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP_(ULONG) CEnumFmtEtc::Release(void) { GEN_VDATEPTRIN(this,ULONG,0L); PerfDbgLog(tagCEnumFmtEtc, this, "+CEnumFmtEtc::Release"); LONG lRet = --_CRefs; if (_CRefs == 0) { delete this; } PerfDbgLog1(tagCEnumFmtEtc, this, "-CEnumFmtEtc::Release(%ld)", lRet); return lRet; } //+--------------------------------------------------------------------------- // // Method: CEnumFmtEtc::Next // // Synopsis: // // Arguments: [celt] -- // [rgelt] -- // [pceltFetched] -- // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CEnumFmtEtc::Next(ULONG celt, FORMATETC * rgelt, ULONG * pceltFetched) { PerfDbgLog(tagCEnumFmtEtc, this, "+CEnumFmtEtc::Next"); HRESULT hr; if (!rgelt) { hr = E_INVALIDARG; } else { for (ULONG i = 0; (i < celt) && (_iNext < _cElements); i++) { rgelt[i] = *(_pFmtEtc + _iNext++); } if (pceltFetched) { *pceltFetched = i; } hr = ((i == celt) ? NOERROR : S_FALSE); } PerfDbgLog1(tagCEnumFmtEtc, this, "-CEnumFmtEtc::Next (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CEnumFmtEtc::Skip // // Synopsis: // // Arguments: [celt] -- // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CEnumFmtEtc::Skip(ULONG celt) { PerfDbgLog(tagCEnumFmtEtc, this, "+CEnumFmtEtc::Skip"); HRESULT hr; _iNext += celt; if (_iNext <= _cElements) { hr = NOERROR; } else { _iNext = _cElements; hr = S_FALSE; } PerfDbgLog1(tagCEnumFmtEtc, this, "-CEnumFmtEtc::Skip (hr:%lx)", hr); return hr; } //+--------------------------------------------------------------------------- // // Method: CEnumFmtEtc::Reset // // Synopsis: // // Arguments: [void] -- // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CEnumFmtEtc::Reset(void) { PerfDbgLog(tagCEnumFmtEtc, this, "+CEnumFmtEtc::Reset"); _iNext = 0; PerfDbgLog1(tagCEnumFmtEtc, this, "-CEnumFmtEtc::Reset (hr:%lx)", S_OK); return S_OK; } //+--------------------------------------------------------------------------- // // Method: CEnumFmtEtc::Clone // // Synopsis: // // Arguments: [ppenum] -- // // Returns: // // History: 12-22-95 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- STDMETHODIMP CEnumFmtEtc::Clone(IEnumFORMATETC ** ppenum) { PerfDbgLog(tagCEnumFmtEtc, this, "+CEnumFmtEtc::Clone"); HRESULT hr; if (ppenum) { CEnumFmtEtc * pCEnumFEtc; TransAssert((_cElements > 0)); pCEnumFEtc = new CEnumFmtEtc(); if (pCEnumFEtc) { if (pCEnumFEtc->Initialize(_cElements, _pFmtEtc, _iNext) == FALSE) { delete pCEnumFEtc; pCEnumFEtc = NULL; } else { *ppenum = pCEnumFEtc; } } hr = ((*ppenum != NULL) ? NOERROR : E_OUTOFMEMORY); } else { hr = E_INVALIDARG; } PerfDbgLog1(tagCEnumFmtEtc, this, "-CEnumFmtEtc::Clone (hr:%lx)", hr); return hr; }