|
|
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.