|
|
1.1 ! root 1: /************************************************************************* ! 2: ** ! 3: ** OLE 2 Utility Code ! 4: ** ! 5: ** enumfetc.c ! 6: ** ! 7: ** This file contains a standard implementation of IEnumFormatEtc ! 8: ** interface. ! 9: ** This file is part of the OLE 2.0 User Interface support library. ! 10: ** ! 11: ** (c) Copyright Microsoft Corp. 1990 - 1992 All Rights Reserved ! 12: ** ! 13: *************************************************************************/ ! 14: ! 15: #define STRICT 1 ! 16: #include "ole2ui.h" ! 17: #include "enumfetc.h" ! 18: ! 19: ! 20: typedef struct tagOleStdEnumFmtEtc { ! 21: IEnumFORMATETCVtbl FAR* lpVtbl; ! 22: ULONG m_dwRefs; /* referance count */ ! 23: ULONG m_nIndex; /* current index in list */ ! 24: ULONG m_nCount; /* how many items in list */ ! 25: LPFORMATETC m_lpEtc; /* list of formatetc */ ! 26: } OLESTDENUMFMTETC, FAR* LPOLESTDENUMFMTETC; ! 27: ! 28: VOID OleStdEnumFmtEtc_Destroy(LPOLESTDENUMFMTETC pEtc); ! 29: ! 30: STDMETHODIMP OleStdEnumFmtEtc_QueryInterface( ! 31: LPENUMFORMATETC lpThis, REFIID riid, LPVOID FAR* ppobj); ! 32: STDMETHODIMP_(ULONG) OleStdEnumFmtEtc_AddRef(LPENUMFORMATETC lpThis); ! 33: STDMETHODIMP_(ULONG) OleStdEnumFmtEtc_Release(LPENUMFORMATETC lpThis); ! 34: STDMETHODIMP OleStdEnumFmtEtc_Next(LPENUMFORMATETC lpThis, ULONG celt, ! 35: LPFORMATETC rgelt, ULONG FAR* pceltFetched); ! 36: STDMETHODIMP OleStdEnumFmtEtc_Skip(LPENUMFORMATETC lpThis, ULONG celt); ! 37: STDMETHODIMP OleStdEnumFmtEtc_Reset(LPENUMFORMATETC lpThis); ! 38: STDMETHODIMP OleStdEnumFmtEtc_Clone(LPENUMFORMATETC lpThis, ! 39: LPENUMFORMATETC FAR* ppenum); ! 40: ! 41: static IEnumFORMATETCVtbl g_EnumFORMATETCVtbl = { ! 42: OleStdEnumFmtEtc_QueryInterface, ! 43: OleStdEnumFmtEtc_AddRef, ! 44: OleStdEnumFmtEtc_Release, ! 45: OleStdEnumFmtEtc_Next, ! 46: OleStdEnumFmtEtc_Skip, ! 47: OleStdEnumFmtEtc_Reset, ! 48: OleStdEnumFmtEtc_Clone, ! 49: }; ! 50: ! 51: ///////////////////////////////////////////////////////////////////////////// ! 52: ! 53: ! 54: STDAPI_(LPENUMFORMATETC) ! 55: OleStdEnumFmtEtc_Create(ULONG nCount, LPFORMATETC lpEtc) ! 56: //---------------------------------------------------------------------------- ! 57: // ! 58: //---------------------------------------------------------------------------- ! 59: { ! 60: LPMALLOC lpMalloc=NULL; ! 61: LPOLESTDENUMFMTETC lpEF=NULL; ! 62: DWORD dwSize; ! 63: WORD i; ! 64: HRESULT hRes; ! 65: ! 66: hRes = CoGetMalloc(MEMCTX_TASK, &lpMalloc); ! 67: if (hRes != NOERROR) { ! 68: return NULL; ! 69: } ! 70: ! 71: lpEF = (LPOLESTDENUMFMTETC)lpMalloc->lpVtbl->Alloc(lpMalloc, ! 72: sizeof(OLESTDENUMFMTETC)); ! 73: if (lpEF == NULL) { ! 74: goto errReturn; ! 75: } ! 76: ! 77: lpEF->lpVtbl = &g_EnumFORMATETCVtbl; ! 78: lpEF->m_dwRefs = 1; ! 79: lpEF->m_nCount = nCount; ! 80: lpEF->m_nIndex = 0; ! 81: ! 82: dwSize = sizeof(FORMATETC) * lpEF->m_nCount; ! 83: ! 84: lpEF->m_lpEtc = (LPFORMATETC)lpMalloc->lpVtbl->Alloc(lpMalloc, dwSize); ! 85: if (lpEF->m_lpEtc == NULL) { ! 86: goto errReturn; ! 87: } ! 88: ! 89: for (i=0; i<nCount; i++) { ! 90: OleStdCopyFormatEtc( ! 91: (LPFORMATETC)&(lpEF->m_lpEtc[i]), (LPFORMATETC)&(lpEtc[i])); ! 92: } ! 93: ! 94: return (LPENUMFORMATETC)lpEF; ! 95: ! 96: errReturn: ! 97: if (lpEF != NULL) { ! 98: lpMalloc->lpVtbl->Free(lpMalloc, lpEF); ! 99: } ! 100: ! 101: if (lpMalloc != NULL) { ! 102: lpMalloc->lpVtbl->Release(lpMalloc); ! 103: } ! 104: ! 105: return NULL; ! 106: ! 107: } /* OleStdEnumFmtEtc_Create() ! 108: */ ! 109: ! 110: ! 111: VOID ! 112: OleStdEnumFmtEtc_Destroy(LPOLESTDENUMFMTETC lpEF) ! 113: //---------------------------------------------------------------------------- ! 114: // ! 115: //---------------------------------------------------------------------------- ! 116: { ! 117: LPMALLOC lpMalloc=NULL; ! 118: WORD i; ! 119: ! 120: if (lpEF != NULL) { ! 121: ! 122: if (CoGetMalloc(MEMCTX_TASK, &lpMalloc) == NOERROR) { ! 123: ! 124: /* OLE2NOTE: we MUST free any memory that was allocated for ! 125: ** TARGETDEVICES contained within the FORMATETC elements. ! 126: */ ! 127: for (i=0; i<lpEF->m_nCount; i++) { ! 128: OleStdFree(lpEF->m_lpEtc[i].ptd); ! 129: } ! 130: ! 131: if (lpEF->m_lpEtc != NULL) { ! 132: lpMalloc->lpVtbl->Free(lpMalloc, lpEF->m_lpEtc); ! 133: } ! 134: ! 135: lpMalloc->lpVtbl->Free(lpMalloc, lpEF); ! 136: lpMalloc->lpVtbl->Release(lpMalloc); ! 137: } ! 138: } ! 139: } /* OleStdEnumFmtEtc_Destroy() ! 140: */ ! 141: ! 142: ! 143: STDMETHODIMP ! 144: OleStdEnumFmtEtc_QueryInterface( ! 145: LPENUMFORMATETC lpThis, REFIID riid, LPVOID FAR* ppobj) ! 146: //---------------------------------------------------------------------------- ! 147: // ! 148: //---------------------------------------------------------------------------- ! 149: { ! 150: LPOLESTDENUMFMTETC lpEF = (LPOLESTDENUMFMTETC)lpThis; ! 151: *ppobj = NULL; ! 152: ! 153: if (IsEqualIID(riid,&IID_IUnknown) || IsEqualIID(riid,&IID_IEnumFORMATETC)){ ! 154: *ppobj = (LPVOID)lpEF; ! 155: } ! 156: ! 157: if (*ppobj == NULL) return ResultFromScode(S_FALSE); ! 158: else{ ! 159: OleStdEnumFmtEtc_AddRef(lpThis); ! 160: return NOERROR; ! 161: } ! 162: ! 163: } /* OleStdEnumFmtEtc_QueryInterface() ! 164: */ ! 165: ! 166: ! 167: STDMETHODIMP_(ULONG) ! 168: OleStdEnumFmtEtc_AddRef(LPENUMFORMATETC lpThis) ! 169: //---------------------------------------------------------------------------- ! 170: // ! 171: //---------------------------------------------------------------------------- ! 172: { ! 173: LPOLESTDENUMFMTETC lpEF = (LPOLESTDENUMFMTETC)lpThis; ! 174: return lpEF->m_dwRefs++; ! 175: ! 176: } /* OleStdEnumFmtEtc_AddRef() ! 177: */ ! 178: ! 179: ! 180: STDMETHODIMP_(ULONG) ! 181: OleStdEnumFmtEtc_Release(LPENUMFORMATETC lpThis) ! 182: //---------------------------------------------------------------------------- ! 183: // ! 184: //---------------------------------------------------------------------------- ! 185: { ! 186: LPOLESTDENUMFMTETC lpEF = (LPOLESTDENUMFMTETC)lpThis; ! 187: DWORD dwRefs = --lpEF->m_dwRefs; ! 188: ! 189: if (dwRefs == 0) ! 190: OleStdEnumFmtEtc_Destroy(lpEF); ! 191: ! 192: return dwRefs; ! 193: ! 194: } /* OleStdEnumFmtEtc_Release() ! 195: */ ! 196: ! 197: ! 198: STDMETHODIMP ! 199: OleStdEnumFmtEtc_Next(LPENUMFORMATETC lpThis, ULONG celt, LPFORMATETC rgelt, ! 200: ULONG FAR* pceltFetched) ! 201: //---------------------------------------------------------------------------- ! 202: // ! 203: //---------------------------------------------------------------------------- ! 204: { ! 205: LPOLESTDENUMFMTETC lpEF = (LPOLESTDENUMFMTETC)lpThis; ! 206: ULONG i=0; ! 207: ULONG nOffset; ! 208: ! 209: if (rgelt == NULL) { ! 210: return ResultFromScode(E_INVALIDARG); ! 211: } ! 212: ! 213: while (i < celt) { ! 214: nOffset = lpEF->m_nIndex + i; ! 215: ! 216: if (nOffset < lpEF->m_nCount) { ! 217: OleStdCopyFormatEtc( ! 218: (LPFORMATETC)&(rgelt[i]), (LPFORMATETC)&(lpEF->m_lpEtc[nOffset])); ! 219: i++; ! 220: }else{ ! 221: break; ! 222: } ! 223: } ! 224: ! 225: lpEF->m_nIndex += (WORD)i; ! 226: ! 227: if (pceltFetched != NULL) { ! 228: *pceltFetched = i; ! 229: } ! 230: ! 231: if (i != celt) { ! 232: return ResultFromScode(S_FALSE); ! 233: } ! 234: ! 235: return NOERROR; ! 236: } /* OleStdEnumFmtEtc_Next() ! 237: */ ! 238: ! 239: ! 240: STDMETHODIMP ! 241: OleStdEnumFmtEtc_Skip(LPENUMFORMATETC lpThis, ULONG celt) ! 242: //---------------------------------------------------------------------------- ! 243: // ! 244: //---------------------------------------------------------------------------- ! 245: { ! 246: LPOLESTDENUMFMTETC lpEF = (LPOLESTDENUMFMTETC)lpThis; ! 247: ULONG i=0; ! 248: ULONG nOffset; ! 249: ! 250: while (i < celt) { ! 251: nOffset = lpEF->m_nIndex + i; ! 252: ! 253: if (nOffset < lpEF->m_nCount) { ! 254: i++; ! 255: }else{ ! 256: break; ! 257: } ! 258: } ! 259: ! 260: lpEF->m_nIndex += (WORD)i; ! 261: ! 262: if (i != celt) { ! 263: return ResultFromScode(S_FALSE); ! 264: } ! 265: ! 266: return NOERROR; ! 267: } /* OleStdEnumFmtEtc_Skip() ! 268: */ ! 269: ! 270: ! 271: STDMETHODIMP ! 272: OleStdEnumFmtEtc_Reset(LPENUMFORMATETC lpThis) ! 273: //---------------------------------------------------------------------------- ! 274: // ! 275: //---------------------------------------------------------------------------- ! 276: { ! 277: LPOLESTDENUMFMTETC lpEF = (LPOLESTDENUMFMTETC)lpThis; ! 278: lpEF->m_nIndex = 0; ! 279: ! 280: return NOERROR; ! 281: } /* OleStdEnumFmtEtc_Reset() ! 282: */ ! 283: ! 284: ! 285: STDMETHODIMP ! 286: OleStdEnumFmtEtc_Clone(LPENUMFORMATETC lpThis, LPENUMFORMATETC FAR* ppenum) ! 287: //---------------------------------------------------------------------------- ! 288: // ! 289: //---------------------------------------------------------------------------- ! 290: { ! 291: LPOLESTDENUMFMTETC lpEF = (LPOLESTDENUMFMTETC)lpThis; ! 292: ! 293: if (ppenum == NULL) { ! 294: return ResultFromScode(E_INVALIDARG); ! 295: } ! 296: ! 297: *ppenum = OleStdEnumFmtEtc_Create(lpEF->m_nCount, lpEF->m_lpEtc); ! 298: ! 299: return (*ppenum != NULL ? NOERROR : ResultFromScode(E_OUTOFMEMORY)); ! 300: ! 301: } /* OleStdEnumFmtEtc_Clone() ! 302: */ ! 303:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.