Annotation of mstools/ole20/samples/ole2ui/enumfetc.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.