Ignore:
Timestamp:
Mar 24, 2000, 6:17:30 PM (25 years ago)
Author:
cbratschi
Message:

bug fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/dataobject.cpp

    r1214 r3217  
    1 /* $Id: dataobject.cpp,v 1.1 1999-10-09 11:13:18 sandervl Exp $ */
     1/* $Id: dataobject.cpp,v 1.2 2000-03-24 17:17:26 cbratschi Exp $ */
    22
    33/*
     
    1010
    1111/*
    12  *      IEnumFORMATETC, IDataObject
     12 *      IEnumFORMATETC, IDataObject
    1313 *
    1414 * selecting and droping objects within the shell and/or common dialogs
    1515 *
    16  *      Copyright 1998, 1999    <juergen.schmied@metronet.de>
     16 *      Copyright 1998, 1999    <juergen.schmied@metronet.de>
    1717 */
    1818
     
    8585LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[])
    8686{
    87         IEnumFORMATETCImpl* ef;
    88         DWORD size=cfmt * sizeof(FORMATETC);
     87        IEnumFORMATETCImpl* ef;
     88        DWORD size=cfmt * sizeof(FORMATETC);
    8989
    9090  dprintf(("SHELL32:dataobject:IEnumFORMATETC_Constructor(%08xh,%08xh)\n",
     
    9292           afmt));
    9393
    94         ef=(IEnumFORMATETCImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumFORMATETCImpl));
    95 
    96         if(ef)
    97         {
    98           ef->ref=1;
    99           ef->lpvtbl=&efvt;
    100 
    101           ef->countFmt = cfmt;
    102           ef->pFmt = (FORMATETC*)SHAlloc (size);
    103 
    104           if (ef->pFmt)
    105           {
    106             memcpy(ef->pFmt, afmt, size);
    107           }
    108 
    109           shell32_ObjCount++;
    110         }
    111 
    112         TRACE("(%p)->()\n",ef);
    113         return (LPENUMFORMATETC)ef;
     94        ef=(IEnumFORMATETCImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumFORMATETCImpl));
     95
     96        if(ef)
     97        {
     98          ef->ref=1;
     99          ef->lpvtbl=&efvt;
     100
     101          ef->countFmt = cfmt;
     102          ef->pFmt = (FORMATETC*)SHAlloc (size);
     103
     104          if (ef->pFmt)
     105          {
     106            memcpy(ef->pFmt, afmt, size);
     107          }
     108
     109          shell32_ObjCount++;
     110        }
     111
     112        TRACE("(%p)->()\n",ef);
     113        return (LPENUMFORMATETC)ef;
    114114}
    115115
     
    117117static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPENUMFORMATETC iface, REFIID riid, LPVOID* ppvObj)
    118118{
    119         ICOM_THIS(IEnumFORMATETCImpl,iface);
    120         char    xriid[50];
    121         WINE_StringFromCLSID((LPCLSID)riid,xriid);
     119        ICOM_THIS(IEnumFORMATETCImpl,iface);
     120        char    xriid[50];
     121        WINE_StringFromCLSID((LPCLSID)riid,xriid);
    122122
    123123  dprintf(("SHELL32:dataobject:IEnumFORMATETC_fnQueryInterface(%08xh,%08xh,%08xh)\n",
     
    126126           xriid));
    127127
    128                         *ppvObj = NULL;
    129 
    130         if(IsEqualIID(riid, &IID_IUnknown))
    131         { *ppvObj = This;
    132         }
    133         else if(IsEqualIID(riid, &IID_IEnumFORMATETC))
    134         { *ppvObj = (IDataObject*)This;
    135         }
    136 
    137         if(*ppvObj)
    138         { IEnumFORMATETC_AddRef((IEnumFORMATETC*)*ppvObj);
    139           TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
    140           return S_OK;
    141         }
    142         TRACE("-- Interface: E_NOINTERFACE\n");
    143         return E_NOINTERFACE;
     128                        *ppvObj = NULL;
     129
     130        if(IsEqualIID(riid, &IID_IUnknown))
     131        { *ppvObj = This;
     132        }
     133        else if(IsEqualIID(riid, &IID_IEnumFORMATETC))
     134        { *ppvObj = (IDataObject*)This;
     135        }
     136
     137        if(*ppvObj)
     138        { IEnumFORMATETC_AddRef((IEnumFORMATETC*)*ppvObj);
     139          TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     140          return S_OK;
     141        }
     142        TRACE("-- Interface: E_NOINTERFACE\n");
     143        return E_NOINTERFACE;
    144144
    145145}
     
    148148static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface)
    149149{
    150         ICOM_THIS(IEnumFORMATETCImpl,iface);
     150        ICOM_THIS(IEnumFORMATETCImpl,iface);
    151151
    152152  dprintf(("SHELL32:dataobject:IEnumFORMATETC_fnAddRef(%08xh,%08xh)\n",
     
    154154           This->ref));
    155155
    156         shell32_ObjCount++;
    157         return ++(This->ref);
     156        shell32_ObjCount++;
     157        return ++(This->ref);
    158158}
    159159
     
    161161static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface)
    162162{
    163         ICOM_THIS(IEnumFORMATETCImpl,iface);
     163        ICOM_THIS(IEnumFORMATETCImpl,iface);
    164164
    165165  dprintf(("SHELL32:dataobject:IEnumFORMATETC_fnRelease(%08xh)\n",
    166166           This));
    167167
    168         shell32_ObjCount--;
    169 
    170         if (!--(This->ref))
    171         { TRACE(" destroying IEnumFORMATETC(%p)\n",This);
    172           if (This->pFmt)
    173           { SHFree (This->pFmt);
    174           }
    175           HeapFree(GetProcessHeap(),0,This);
    176           return 0;
    177         }
    178         return This->ref;
     168        shell32_ObjCount--;
     169
     170        if (!--(This->ref))
     171        { TRACE(" destroying IEnumFORMATETC(%p)\n",This);
     172          if (This->pFmt)
     173          { SHFree (This->pFmt);
     174          }
     175          HeapFree(GetProcessHeap(),0,This);
     176          return 0;
     177        }
     178        return This->ref;
    179179}
    180180
     
    182182static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFethed)
    183183{
    184         ICOM_THIS(IEnumFORMATETCImpl,iface);
    185         UINT cfetch;
    186         HRESULT hres = S_FALSE;
     184        ICOM_THIS(IEnumFORMATETCImpl,iface);
     185        UINT cfetch;
     186        HRESULT hres = S_FALSE;
    187187
    188188  dprintf(("SHELL32:dataobject:IEnumFORMATETC_fnNext(%08xh,%08xh,%08xh,%08xh)\n",
     
    192192           pceltFethed));
    193193
    194         if (This->posFmt < This->countFmt)
    195         {
    196           cfetch = This->countFmt - This->posFmt;
    197           if (cfetch >= celt)
    198           {
    199             cfetch = celt;
    200             hres = S_OK;
    201           }
    202           memcpy(rgelt, &This->pFmt[This->posFmt], cfetch * sizeof(FORMATETC));
    203           This->posFmt += cfetch;
    204         }
    205         else
    206         {
    207           cfetch = 0;
    208         }
    209 
    210         if (pceltFethed)
    211         {
    212           *pceltFethed = cfetch;
    213         }
     194        if (This->posFmt < This->countFmt)
     195        {
     196          cfetch = This->countFmt - This->posFmt;
     197          if (cfetch >= celt)
     198          {
     199            cfetch = celt;
     200            hres = S_OK;
     201          }
     202          memcpy(rgelt, &This->pFmt[This->posFmt], cfetch * sizeof(FORMATETC));
     203          This->posFmt += cfetch;
     204        }
     205        else
     206        {
     207          cfetch = 0;
     208        }
     209
     210        if (pceltFethed)
     211        {
     212          *pceltFethed = cfetch;
     213        }
    214214
    215215        return hres;
     
    219219static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt)
    220220{
    221         ICOM_THIS(IEnumFORMATETCImpl,iface);
     221        ICOM_THIS(IEnumFORMATETCImpl,iface);
    222222
    223223  dprintf(("SHELL32:dataobject:IEnumFORMATETC_fnSkip(%08xh,%08xh) to be fixed\n",
     
    225225           celt));
    226226
    227         This->posFmt += celt;
    228         if (This->posFmt > This->countFmt)
    229         {
    230           This->posFmt = This->countFmt;
    231           return S_FALSE;
    232         }
    233         return S_OK;
     227        This->posFmt += celt;
     228        if (This->posFmt > This->countFmt)
     229        {
     230          This->posFmt = This->countFmt;
     231          return S_FALSE;
     232        }
     233        return S_OK;
    234234}
    235235static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface)
    236236{
    237         ICOM_THIS(IEnumFORMATETCImpl,iface);
     237        ICOM_THIS(IEnumFORMATETCImpl,iface);
    238238
    239239  dprintf(("SHELL32:dataobject:IEnumFORMATETC_fnReset(%08xh) to be fixed\n",
     
    247247static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum)
    248248{
    249         ICOM_THIS(IEnumFORMATETCImpl,iface);
     249        ICOM_THIS(IEnumFORMATETCImpl,iface);
    250250
    251251  dprintf(("SHELL32:dataobject:IEnumFORMATETC_fnClone(%08xh) not implemented\n",
     
    253253           ppenum));
    254254
    255         return E_NOTIMPL;
     255        return E_NOTIMPL;
    256256}
    257257
     
    310310
    311311static IDLList_VTable idllvt =
    312 {       IDLList_GetState,
    313         IDLList_GetElement,
    314         IDLList_GetCount,
    315         IDLList_StoreItem,
    316         IDLList_AddItems,
    317         IDLList_InitList,
    318         IDLList_CleanList
     312{       IDLList_GetState,
     313        IDLList_GetElement,
     314        IDLList_GetCount,
     315        IDLList_StoreItem,
     316        IDLList_AddItems,
     317        IDLList_InitList,
     318        IDLList_CleanList
    319319};
    320320
    321321LPIDLLIST IDLList_Constructor (UINT uStep)
    322322{
    323         LPIDLLIST lpidll;
    324         lpidll = (LPIDLLIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDLList));
     323        LPIDLLIST lpidll;
     324        lpidll = (LPIDLLIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDLList));
    325325
    326326  dprintf(("SHELL32:dataobject:IDLList_Constructor(%08xh, %08xh) not implemented\n",
     
    328328           uStep));
    329329
    330         if (lpidll)
    331         {
    332           lpidll->lpvtbl=&idllvt;
    333           lpidll->uStep=uStep;
    334         }
    335 
    336         return lpidll;
     330        if (lpidll)
     331        {
     332          lpidll->lpvtbl=&idllvt;
     333          lpidll->uStep=uStep;
     334        }
     335
     336        return lpidll;
    337337}
    338338
     
    343343           THIS));
    344344
    345         IDLList_CleanList(THIS);
     345        IDLList_CleanList(THIS);
    346346}
    347347
     
    353353           THIS->dpa));
    354354
    355         if (THIS->uStep == 0)
    356         {
    357           if (THIS->dpa)
    358             return(State_Init);
    359 
    360           return(State_OutOfMem);
    361         }
    362         return(State_UnInit);
     355        if (THIS->uStep == 0)
     356        {
     357          if (THIS->dpa)
     358            return(State_Init);
     359
     360          return(State_OutOfMem);
     361        }
     362        return(State_UnInit);
    363363}
    364364
     
    370370           nIndex));
    371371
    372         return((LPITEMIDLIST)pDPA_GetPtr(THIS->dpa, nIndex));
     372        return((LPITEMIDLIST)pDPA_GetPtr(THIS->dpa, nIndex));
    373373}
    374374
     
    379379           THIS));
    380380
    381         return(IDLList_GetState(THIS)==State_Init ? DPA_GetPtrCount(THIS->dpa) : 0);
     381        return(IDLList_GetState(THIS)==State_Init ? DPA_GetPtrCount(THIS->dpa) : 0);
    382382}
    383383
     
    389389           pidl));
    390390
    391         if (pidl)
     391        if (pidl)
    392392        { if (IDLList_InitList(THIS) && pDPA_InsertPtr(THIS->dpa, 0x7fff, (LPSTR)pidl)>=0)
    393             return(TRUE);
    394           ILFree(pidl);
     393            return(TRUE);
     394          ILFree(pidl);
    395395        }
    396396        IDLList_CleanList(THIS);
     
    401401static BOOL WINAPI IDLList_AddItems(LPIDLLIST THIS, LPITEMIDLIST *apidl, UINT cidl)
    402402{
    403         INT i;
     403        INT i;
    404404
    405405  dprintf(("SHELL32:dataobject:IDLList_AddItems((%p)->(apidl=%p cidl=%u)\n",
     
    408408           cidl));
    409409
    410         for (i=0; i<cidl; ++i)
     410        for (i=0; i<cidl; ++i)
    411411        { if (!IDLList_StoreItem(THIS, ILClone((LPCITEMIDLIST)apidl[i])))
    412             return(FALSE);
     412            return(FALSE);
    413413        }
    414414        return(TRUE);
     
    421421           THIS));
    422422
    423         switch (IDLList_GetState(THIS))
     423        switch (IDLList_GetState(THIS))
    424424        { case State_Init:
    425             return(TRUE);
    426 
    427           case State_OutOfMem:
    428             return(FALSE);
    429 
    430           case State_UnInit:
    431           default:
    432             THIS->dpa = pDPA_Create(THIS->uStep);
    433             THIS->uStep = 0;
    434             return(IDLList_InitList(THIS));
     425            return(TRUE);
     426
     427          case State_OutOfMem:
     428            return(FALSE);
     429
     430          case State_UnInit:
     431          default:
     432            THIS->dpa = pDPA_Create(THIS->uStep);
     433            THIS->uStep = 0;
     434            return(IDLList_InitList(THIS));
    435435        }
    436436}
     
    439439static void WINAPI IDLList_CleanList(LPIDLLIST THIS)
    440440{
    441         INT i;
     441        INT i;
    442442
    443443  dprintf(("SHELL32:dataobject:IDLList_CleanList(%p)\n",
    444444           THIS));
    445445
    446         if (THIS->uStep != 0)
     446        if (THIS->uStep != 0)
    447447        { THIS->dpa = NULL;
    448           THIS->uStep = 0;
    449           return;
     448          THIS->uStep = 0;
     449          return;
    450450        }
    451451
     
    471471typedef struct
    472472{
    473         /* IUnknown fields */
    474         ICOM_VTABLE(IDataObject)* lpvtbl;
    475         DWORD           ref;
    476 
    477         /* IDataObject fields */
    478         LPIDLLIST       lpill;       /* the data of the dataobject */
    479         LPITEMIDLIST    pidl;
    480 
    481         FORMATETC       pFormatEtc[MAX_FORMATS];
    482         UINT            cfShellIDList;
    483         UINT            cfFileGroupDesc;
    484         UINT            cfFileContents;
     473        /* IUnknown fields */
     474        ICOM_VTABLE(IDataObject)* lpvtbl;
     475        DWORD           ref;
     476
     477        /* IDataObject fields */
     478        LPIDLLIST       lpill;       /* the data of the dataobject */
     479        LPITEMIDLIST    pidl;
     480
     481        FORMATETC       pFormatEtc[MAX_FORMATS];
     482        UINT            cfShellIDList;
     483        UINT            cfFileGroupDesc;
     484        UINT            cfFileContents;
    485485
    486486} IDataObjectImpl;
     
    493493static HRESULT WINAPI IDataObject_fnQueryInterface(LPDATAOBJECT iface, REFIID riid, LPVOID * ppvObj)
    494494{
    495         ICOM_THIS(IDataObjectImpl,iface);
    496         char    xriid[50];
    497         WINE_StringFromCLSID((LPCLSID)riid,xriid);
     495        ICOM_THIS(IDataObjectImpl,iface);
     496        char    xriid[50];
     497        WINE_StringFromCLSID((LPCLSID)riid,xriid);
    498498
    499499  dprintf(("SHELL32:dataobject:IDataObject_fnQueryInterface((%p)->(\n\tIID:\t%s,%p)\n",
     
    502502           ppvObj));
    503503
    504         *ppvObj = NULL;
    505 
    506         if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
    507         { *ppvObj = This;
    508         }
    509         else if(IsEqualIID(riid, &IID_IDataObject))  /*IDataObject*/
    510         { *ppvObj = (IDataObject*)This;
    511         }
    512 
    513         if(*ppvObj)
    514         { IDataObject_AddRef((IDataObject*)*ppvObj);
    515           TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
    516           return S_OK;
    517         }
    518         TRACE("-- Interface: E_NOINTERFACE\n");
    519         return E_NOINTERFACE;
     504        *ppvObj = NULL;
     505
     506        if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
     507        { *ppvObj = This;
     508        }
     509        else if(IsEqualIID(riid, &IID_IDataObject))  /*IDataObject*/
     510        { *ppvObj = (IDataObject*)This;
     511        }
     512
     513        if(*ppvObj)
     514        { IDataObject_AddRef((IDataObject*)*ppvObj);
     515          TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     516          return S_OK;
     517        }
     518        TRACE("-- Interface: E_NOINTERFACE\n");
     519        return E_NOINTERFACE;
    520520}
    521521/**************************************************************************
     
    524524static ULONG WINAPI IDataObject_fnAddRef(LPDATAOBJECT iface)
    525525{
    526         ICOM_THIS(IDataObjectImpl,iface);
     526        ICOM_THIS(IDataObjectImpl,iface);
    527527
    528528  dprintf(("SHELL32:dataobject:IDataObject_fnAddRef((%p)->(count=%lu)\n",
     
    530530           This->ref));
    531531
    532         shell32_ObjCount++;
    533         return ++(This->ref);
     532        shell32_ObjCount++;
     533        return ++(This->ref);
    534534}
    535535/**************************************************************************
     
    538538static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface)
    539539{
    540         ICOM_THIS(IDataObjectImpl,iface);
     540        ICOM_THIS(IDataObjectImpl,iface);
    541541  dprintf(("SHELL32:dataobject:IDataObject_fnRelease(%p)\n",
    542542           This));
    543         shell32_ObjCount--;
    544 
    545         if (!--(This->ref))
    546         { TRACE(" destroying IDataObject(%p)\n",This);
    547           IDLList_Destructor(This->lpill);
    548           HeapFree(GetProcessHeap(),0,This);
    549           return 0;
    550         }
    551         return This->ref;
     543        shell32_ObjCount--;
     544
     545        if (!--(This->ref))
     546        { TRACE(" destroying IDataObject(%p)\n",This);
     547          IDLList_Destructor(This->lpill);
     548          HeapFree(GetProcessHeap(),0,This);
     549          return 0;
     550        }
     551        return This->ref;
    552552}
    553553
     
    557557static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium)
    558558{
    559         ICOM_THIS(IDataObjectImpl,iface);
    560 
    561         char    szTemp[256];
    562         UINT    cItems;
    563         DWORD   sizeCIDA, sizePidl, nOffset, nSize;
    564         LPCIDA  pcida;
    565         HGLOBAL hmem;
    566         int     i;
    567         LPITEMIDLIST    pidl;
    568        
    569         GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256);
     559        ICOM_THIS(IDataObjectImpl,iface);
     560
     561        char    szTemp[256];
     562        UINT    cItems;
     563        DWORD   sizeCIDA, sizePidl, nOffset, nSize;
     564        LPCIDA  pcida;
     565        HGLOBAL hmem;
     566        int     i;
     567        LPITEMIDLIST    pidl;
     568
     569        GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256);
    570570
    571571  dprintf(("SHELL32:dataobject:IDataObject_fnGetData(%p)->(%p %p format=%s)\n",
     
    575575           szTemp));
    576576
    577         /* test expected format */
    578         if (!(pformatetcIn->cfFormat == This->cfShellIDList))
    579         {
    580           FIXME("-- clipformat not implemented\n");
    581           return (E_INVALIDARG);
    582         }
    583 
    584         if (pformatetcIn->ptd==NULL
    585                 && (pformatetcIn->dwAspect & DVASPECT_CONTENT)
    586                 && pformatetcIn->lindex==-1
    587                 && (pformatetcIn->tymed&TYMED_HGLOBAL))
    588         {
    589           cItems = This->lpill->lpvtbl->fnGetCount(This->lpill);
    590           if (cItems < 1) return(E_UNEXPECTED);
    591        
    592           sizeCIDA = sizeof(CIDA) + sizeof (UINT)*(cItems);     /* without any pidl */
    593           sizePidl = ILGetSize (This->pidl);                    /* add root pidl */
    594 
    595           nSize = sizeCIDA + sizePidl;
    596           hmem = GlobalAlloc(GHND|GMEM_SHARE, nSize);           
    597           if (!hmem) return(E_OUTOFMEMORY);
    598           pcida = (CIDA*)GlobalLock (hmem);
    599 
    600           nOffset = sizeCIDA;                           /* start after the CIDA */
    601           pcida->cidl = cItems;
    602 
    603           pcida->aoffset[0] = nOffset;                  /* first element */
    604           memcpy(((LPBYTE)pcida)+nOffset, This->pidl, sizePidl);
    605           nOffset += sizePidl;
    606           pdump(This->pidl);
    607 
    608           for (i=0; i< cItems; i++)
    609           {
    610             pidl = This->lpill->lpvtbl->fnGetElement(This->lpill, i);
    611             sizePidl = ILGetSize (pidl);
    612             nSize += sizePidl;                          /* size of the structure */
    613             pdump(pidl);
    614 
    615             GlobalUnlock(hmem);                         /* grow memory */
    616             hmem = GlobalReAlloc(hmem, nSize, GHND|GMEM_SHARE);
    617             if (!hmem) return(E_OUTOFMEMORY);
    618             pcida = (CIDA*)GlobalLock (hmem);
    619 
    620             pcida->aoffset[i+1] = nOffset;              /* copy element */
    621             memcpy(((LPBYTE)pcida)+nOffset, pidl, sizePidl);
    622             nOffset += sizePidl;
    623           }
    624 
    625           GlobalUnlock(hmem);
    626 
    627           pmedium->tymed = TYMED_HGLOBAL;
    628           pmedium->u.hGlobal = hmem;
    629           pmedium->pUnkForRelease = NULL;
    630 
    631           TRACE("(%p)->(cida at %p)\n", This, pcida);
    632           return hmem;
    633         }
    634 
    635         FIXME("-- can't serve format\n");
    636         return (E_INVALIDARG);
     577        /* test expected format */
     578        if (!(pformatetcIn->cfFormat == This->cfShellIDList))
     579        {
     580          FIXME("-- clipformat not implemented\n");
     581          return (E_INVALIDARG);
     582        }
     583
     584        if (pformatetcIn->ptd==NULL
     585                && (pformatetcIn->dwAspect & DVASPECT_CONTENT)
     586                && pformatetcIn->lindex==-1
     587                && (pformatetcIn->tymed&TYMED_HGLOBAL))
     588        {
     589          cItems = This->lpill->lpvtbl->fnGetCount(This->lpill);
     590          if (cItems < 1) return(E_UNEXPECTED);
     591
     592          sizeCIDA = sizeof(CIDA) + sizeof (UINT)*(cItems);     /* without any pidl */
     593          sizePidl = ILGetSize (This->pidl);                    /* add root pidl */
     594
     595          nSize = sizeCIDA + sizePidl;
     596          hmem = GlobalAlloc(GHND|GMEM_SHARE, nSize);
     597          if (!hmem) return(E_OUTOFMEMORY);
     598          pcida = (CIDA*)GlobalLock (hmem);
     599
     600          nOffset = sizeCIDA;                           /* start after the CIDA */
     601          pcida->cidl = cItems;
     602
     603          pcida->aoffset[0] = nOffset;                  /* first element */
     604          memcpy(((LPBYTE)pcida)+nOffset, This->pidl, sizePidl);
     605          nOffset += sizePidl;
     606          pdump(This->pidl);
     607
     608          for (i=0; i< cItems; i++)
     609          {
     610            pidl = This->lpill->lpvtbl->fnGetElement(This->lpill, i);
     611            sizePidl = ILGetSize (pidl);
     612            nSize += sizePidl;                          /* size of the structure */
     613            pdump(pidl);
     614
     615            GlobalUnlock(hmem);                         /* grow memory */
     616            hmem = GlobalReAlloc(hmem, nSize, GHND|GMEM_SHARE);
     617            if (!hmem) return(E_OUTOFMEMORY);
     618            pcida = (CIDA*)GlobalLock (hmem);
     619
     620            pcida->aoffset[i+1] = nOffset;              /* copy element */
     621            memcpy(((LPBYTE)pcida)+nOffset, pidl, sizePidl);
     622            nOffset += sizePidl;
     623          }
     624
     625          GlobalUnlock(hmem);
     626
     627          pmedium->tymed = TYMED_HGLOBAL;
     628          pmedium->u.hGlobal = hmem;
     629          pmedium->pUnkForRelease = NULL;
     630
     631          TRACE("(%p)->(cida at %p)\n", This, pcida);
     632          return S_OK;
     633        }
     634
     635        FIXME("-- can't serve format\n");
     636        return (E_INVALIDARG);
    637637}
    638638
     
    640640static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium)
    641641{
    642         ICOM_THIS(IDataObjectImpl,iface);
     642        ICOM_THIS(IDataObjectImpl,iface);
    643643  dprintf(("SHELL32:dataobject:IDataObject_fnGetDataHere(%p)->(%p %p) not implemented\n",
    644644           This,
     
    646646           pmedium));
    647647
    648         return E_NOTIMPL;
     648        return E_NOTIMPL;
    649649}
    650650
     
    652652static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc)
    653653{
    654         ICOM_THIS(IDataObjectImpl,iface);
    655         UINT i;
    656        
     654        ICOM_THIS(IDataObjectImpl,iface);
     655        UINT i;
     656
    657657  dprintf(("SHELL32:dataobject:IDataObject_fnQueryGetData((%p)->(fmt=0x%08x tym=0x%08lx)\n",
    658658           This,
     
    660660           pformatetc->tymed));
    661661
    662         if(!(DVASPECT_CONTENT & pformatetc->dwAspect))
    663           return DV_E_DVASPECT;
    664 
    665         /* check our formats table what we have */
    666         for (i=0; i<MAX_FORMATS; i++)
    667         {
    668           if ((This->pFormatEtc[i].cfFormat == pformatetc->cfFormat)
    669            && (This->pFormatEtc[i].tymed == pformatetc->tymed))
    670           {
    671             return S_OK;
    672           }
    673         }
    674 
    675         return DV_E_TYMED;
     662        if(!(DVASPECT_CONTENT & pformatetc->dwAspect))
     663          return DV_E_DVASPECT;
     664
     665        /* check our formats table what we have */
     666        for (i=0; i<MAX_FORMATS; i++)
     667        {
     668          if ((This->pFormatEtc[i].cfFormat == pformatetc->cfFormat)
     669           && (This->pFormatEtc[i].tymed == pformatetc->tymed))
     670          {
     671            return S_OK;
     672          }
     673        }
     674
     675        return DV_E_TYMED;
    676676}
    677677
     
    679679static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, LPFORMATETC pformatetcOut)
    680680{
    681         ICOM_THIS(IDataObjectImpl,iface);
     681        ICOM_THIS(IDataObjectImpl,iface);
    682682
    683683  dprintf(("SHELL32:dataobject:IDataObject_fnGetCanonicalFormatEtc((%p)->(%p %p) not implemented\n",
     
    686686           pformatetcOut));
    687687
    688         return E_NOTIMPL;
     688        return E_NOTIMPL;
    689689}
    690690
     
    692692static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
    693693{
    694         ICOM_THIS(IDataObjectImpl,iface);
     694        ICOM_THIS(IDataObjectImpl,iface);
    695695  dprintf(("SHELL32:dataobject:IDataObject_fnSetData((%p)->(%p %p %08xh) not implemented\n",
    696696           This,
     
    698698           pmedium,
    699699           fRelease));
    700         return E_NOTIMPL;
     700        return E_NOTIMPL;
    701701}
    702702
     
    704704static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
    705705{
    706         ICOM_THIS(IDataObjectImpl,iface);
     706        ICOM_THIS(IDataObjectImpl,iface);
    707707
    708708  dprintf(("SHELL32:dataobject:IDataObject_fnEnumFormatEtc((%p)->(%08xh %p)\n",
     
    711711           ppenumFormatEtc));
    712712
    713         *ppenumFormatEtc=NULL;
    714 
    715         /* only get data */
    716         if (DATADIR_GET == dwDirection)
    717         {
    718           *ppenumFormatEtc = IEnumFORMATETC_Constructor(MAX_FORMATS, This->pFormatEtc);
    719           return (*ppenumFormatEtc) ? S_OK : E_FAIL;
    720         }
    721        
    722         return E_NOTIMPL;
     713        *ppenumFormatEtc=NULL;
     714
     715        /* only get data */
     716        if (DATADIR_GET == dwDirection)
     717        {
     718          *ppenumFormatEtc = IEnumFORMATETC_Constructor(MAX_FORMATS, This->pFormatEtc);
     719          return (*ppenumFormatEtc) ? S_OK : E_FAIL;
     720        }
     721
     722        return E_NOTIMPL;
    723723}
    724724static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
    725725{
    726         ICOM_THIS(IDataObjectImpl,iface);
     726        ICOM_THIS(IDataObjectImpl,iface);
    727727  dprintf(("SHELL32:dataobject:IDataObject_fnDAdvise((%p)->(%p %08xh %p %p) not implemented.\n",
    728728           This,
     
    732732           pdwConnection));
    733733
    734         return E_NOTIMPL;
     734        return E_NOTIMPL;
    735735}
    736736
     
    738738static HRESULT WINAPI IDataObject_fnDUnadvise(LPDATAOBJECT iface, DWORD dwConnection)
    739739{
    740         ICOM_THIS(IDataObjectImpl,iface);
     740        ICOM_THIS(IDataObjectImpl,iface);
    741741  dprintf(("SHELL32:dataobject:IDataObject_fnDUnadvise((%p)->(%08xh) not implemented.\n",
    742742           This,
    743743           dwConnection));
    744         return E_NOTIMPL;
     744        return E_NOTIMPL;
    745745}
    746746static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise)
    747747{
    748         ICOM_THIS(IDataObjectImpl,iface);
     748        ICOM_THIS(IDataObjectImpl,iface);
    749749  dprintf(("SHELL32:dataobject:IDataObject_fnEnumDAdvise((%p)->(%p) not implemented.\n",
    750750           This,
    751751           ppenumAdvise));
    752752
    753         return E_NOTIMPL;
     753        return E_NOTIMPL;
    754754}
    755755
    756756static struct ICOM_VTABLE(IDataObject) dtovt =
    757757{
    758         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    759         IDataObject_fnQueryInterface,
    760         IDataObject_fnAddRef,
    761         IDataObject_fnRelease,
    762         IDataObject_fnGetData,
    763         IDataObject_fnGetDataHere,
    764         IDataObject_fnQueryGetData,
    765         IDataObject_fnGetCanonicalFormatEtc,
    766         IDataObject_fnSetData,
    767         IDataObject_fnEnumFormatEtc,
    768         IDataObject_fnDAdvise,
    769         IDataObject_fnDUnadvise,
    770         IDataObject_fnEnumDAdvise
     758        ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     759        IDataObject_fnQueryInterface,
     760        IDataObject_fnAddRef,
     761        IDataObject_fnRelease,
     762        IDataObject_fnGetData,
     763        IDataObject_fnGetDataHere,
     764        IDataObject_fnQueryGetData,
     765        IDataObject_fnGetCanonicalFormatEtc,
     766        IDataObject_fnSetData,
     767        IDataObject_fnEnumFormatEtc,
     768        IDataObject_fnDAdvise,
     769        IDataObject_fnDUnadvise,
     770        IDataObject_fnEnumDAdvise
    771771};
    772772
     
    776776LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPITEMIDLIST pMyPidl, LPITEMIDLIST * apidl, UINT cidl)
    777777{
    778         IDataObjectImpl* dto;
    779 
    780         dto = (IDataObjectImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDataObjectImpl));
    781 
    782         if (dto)
    783         {
    784           dto->ref=1;
    785           dto->lpvtbl=&dtovt;
    786           dto->pidl=ILClone(pMyPidl);
    787 
    788           /* fill the ItemID List List */
    789           dto->lpill = IDLList_Constructor (8);
    790           if (! dto->lpill )
    791             return NULL;
    792        
    793           dto->lpill->lpvtbl->fnAddItems(dto->lpill, apidl, cidl);
    794 
    795           /* */
    796           dto->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
    797 /*        dto->cfFileGroupDesc = RegisterClipboardFormatA(CFSTR_FILEDESCRIPTORA);
    798           dto->cfFileContents = RegisterClipboardFormatA(CFSTR_FILECONTENTS);
     778        IDataObjectImpl* dto;
     779
     780        dto = (IDataObjectImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDataObjectImpl));
     781
     782        if (dto)
     783        {
     784          dto->ref=1;
     785          dto->lpvtbl=&dtovt;
     786          dto->pidl=ILClone(pMyPidl);
     787
     788          /* fill the ItemID List List */
     789          dto->lpill = IDLList_Constructor (8);
     790          if (! dto->lpill )
     791            return NULL;
     792
     793          dto->lpill->lpvtbl->fnAddItems(dto->lpill, apidl, cidl);
     794
     795          /* */
     796          dto->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
     797/*        dto->cfFileGroupDesc = RegisterClipboardFormatA(CFSTR_FILEDESCRIPTORA);
     798          dto->cfFileContents = RegisterClipboardFormatA(CFSTR_FILECONTENTS);
    799799*/
    800           InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL);
    801 
    802           shell32_ObjCount++;
    803         }
    804        
     800          InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL);
     801
     802          shell32_ObjCount++;
     803        }
     804
    805805  dprintf(("SHELL32:dataobject:IDataObject_Constructor((%p)->(apidl=%p cidl=%u)\n",
    806806           dto,
    807807           apidl,
    808808           cidl));
    809         return (LPDATAOBJECT)dto;
    810 }
    811 
     809        return (LPDATAOBJECT)dto;
     810}
     811
Note: See TracChangeset for help on using the changeset viewer.