Changeset 10185 for trunk/src/ole32


Ignore:
Timestamp:
Jul 28, 2003, 1:35:32 PM (22 years ago)
Author:
sandervl
Message:

Updates

Location:
trunk/src/ole32
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ole32/ole2.c

    r8973 r10185  
    166166static DWORD OLEDD_GetButtonState();
    167167
     168#ifdef __WIN32OS2__
     169static IDropTarget *IDropTarget_Constructor();
     170
     171HWND hwndTracker = 0;
     172#endif
    168173
    169174/******************************************************************************
     
    561566  trackerInfo.curDragTarget     = 0;
    562567
     568#ifdef __WIN32OS2__
     569  IDataObject_AddRef(trackerInfo.dataObject);
     570#endif
     571
    563572  hwndTrackWindow = CreateWindowA(OLEDD_DRAGTRACKERCLASS,
    564573                                    "TrackerWindow",
     
    573582  if (hwndTrackWindow!=0)
    574583  {
     584#ifdef __WIN32OS2__
     585    hwndTracker = hwndTrackWindow;
     586#endif
    575587    /*
    576588     * Capture the mouse input
     
    619631    DestroyWindow(hwndTrackWindow);
    620632
     633#ifdef __WIN32OS2__
     634    IDataObject_Release(trackerInfo.dataObject);
     635#endif
     636
    621637    return trackerInfo.returnValue;
    622638  }
     639
     640#ifdef __WIN32OS2__
     641  IDataObject_Release(trackerInfo.dataObject);
     642#endif
    623643
    624644  return E_FAIL;
     
    16361656 
    16371657    RegisterClassA (&wndClass);
     1658
     1659#ifdef __WIN32OS2__
     1660    {
     1661      IDropTarget *desktopdnd;
     1662
     1663      desktopdnd = IDropTarget_Constructor();
     1664      RegisterDragDrop(GetDesktopWindow(), desktopdnd);
     1665    }
     1666#endif
    16381667}
    16391668
     
    19341963   */
    19351964  hwndNewTarget = WindowFromPoint(mousePos);
     1965
     1966#ifdef __WIN32OS2__
     1967  dprintf(("OLEDD_TrackMouseMove: hwndNewTarget %x current %x", hwndNewTarget, trackerInfo->curDragTargetHWND));
     1968#endif
    19361969
    19371970  /*
     
    25122545    dprintf(("IDataObject_fnGetData %x %x", pformatetcIn, pmedium));
    25132546
    2514         if(pformatetcIn->cfFormat != CF_HDROP)
     2547        if(pformatetcIn->cfFormat != CF_HDROP && pformatetcIn->cfFormat != CF_TEXT && pformatetcIn->cfFormat != CF_UNICODETEXT)
    25152548        {
    25162549        FIXME("-- expected clipformat not implemented\n");
     
    28832916//******************************************************************************
    28842917//******************************************************************************
     2918
     2919#include <oslibdnd.h>
     2920
     2921typedef struct
     2922{
     2923    /* IUnknown fields */
     2924    ICOM_VFIELD(IDropTarget);
     2925    DWORD ref;
     2926
     2927    LPVOID       lpDnDData;
     2928    LPSTR        lpOS2StringData;
     2929    LPVOID       lpDragStruct;
     2930    POINTL       pt;
     2931    HGLOBAL      hDndData;
     2932    FORMATETC    format;
     2933    STGMEDIUM    medium;
     2934    LPDATAOBJECT pDataObject;
     2935} IDropTargetImpl;
     2936
     2937
     2938/***************************************************************************
     2939*  IDropTarget_QueryInterface
     2940*/
     2941static HRESULT WINAPI IDropTarget_fnQueryInterface(IDropTarget *iface, REFIID riid, LPVOID * ppvObj)
     2942{
     2943    ICOM_THIS(IDropTargetImpl,iface);
     2944
     2945    dprintf(("IDropTarget_fnQueryInterface (%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj));
     2946
     2947    *ppvObj = NULL;
     2948
     2949    if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
     2950    {
     2951        *ppvObj = This;
     2952    }
     2953    else if(IsEqualIID(riid, &IID_IDropTarget))  /*IDropTarget*/
     2954    {
     2955        *ppvObj = (IDropTarget*)This;
     2956    }   
     2957
     2958    if(*ppvObj)
     2959    {
     2960        IUnknown_AddRef((IUnknown*)*ppvObj);     
     2961        TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     2962        return S_OK;
     2963    }
     2964    TRACE("-- Interface: E_NOINTERFACE\n");
     2965    return E_NOINTERFACE;
     2966}
     2967
     2968/**************************************************************************
     2969*  IDropTarget_AddRef
     2970*/
     2971static ULONG WINAPI IDropTarget_fnAddRef(IDropTarget *iface)
     2972{
     2973    ICOM_THIS(IDropTargetImpl,iface);
     2974
     2975    dprintf(("IDropTarget_fnAddRef (%p)->(count=%lu)\n",This, This->ref));
     2976
     2977    return ++(This->ref);
     2978}
     2979
     2980/**************************************************************************
     2981*  IDropTarget_fnCleanup
     2982*/
     2983static ULONG WINAPI IDropTarget_fnCleanup(IDropTarget *iface)
     2984{
     2985    ICOM_THIS(IDropTargetImpl,iface);
     2986
     2987    if(This->pDataObject) {
     2988        IDataObject_Release(This->pDataObject);
     2989        This->pDataObject = 0;
     2990        if(This->lpDnDData) {
     2991            HeapFree(GetProcessHeap(), 0, This->lpDnDData);
     2992            This->lpDnDData = NULL;
     2993        }
     2994        if(This->lpOS2StringData) {
     2995            HeapFree(GetProcessHeap(), 0, This->lpOS2StringData);
     2996            This->lpOS2StringData = NULL;
     2997        }
     2998        if(This->lpDragStruct) {
     2999            OSLibFreeDragStruct(This->lpDragStruct);
     3000            This->lpDragStruct = NULL;
     3001        } 
     3002    }
     3003}
     3004/**************************************************************************
     3005*  IDropTarget_Release
     3006*/
     3007static ULONG WINAPI IDropTarget_fnRelease(IDropTarget *iface)
     3008{
     3009    ICOM_THIS(IDropTargetImpl,iface);
     3010
     3011    dprintf(("IDropTarget_fnRelease (%p)->(count=%lu)\n",This, This->ref));
     3012
     3013    IDropTarget_fnCleanup(iface);
     3014    if(This->ref == 1) {
     3015        if(This->hDndData) {
     3016            GlobalFree(This->hDndData);
     3017            This->hDndData = 0;
     3018        }
     3019    }
     3020    return --(This->ref);
     3021}
     3022//******************************************************************************
     3023//******************************************************************************
     3024static HRESULT WINAPI IDropTarget_fnDragEnter(IDropTarget *iface, IDataObject* pDataObject,
     3025                                DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
     3026{
     3027    HRESULT ret;
     3028    DWORD   size, dwEffect;
     3029    LPVOID  lpData;
     3030    DROPFILES *lpDrop;
     3031    LPSTR     *lpStringData;
     3032    ICOM_THIS(IDropTargetImpl,iface);
     3033    DWORD   supportedformats[] = {CF_HDROP, CF_TEXT};
     3034    int     i;
     3035
     3036    dprintf(("IDropTarget_fnDragEnter %x (%d,%d)", grfKeyState, pt.x, pt.y));
     3037    IDropTarget_fnCleanup(iface);
     3038
     3039    IDataObject_AddRef(pDataObject);
     3040    This->pDataObject = pDataObject;
     3041
     3042#ifdef DEBUG
     3043    {
     3044      IEnumFORMATETC *enumfmt = NULL;
     3045
     3046      if(IDataObject_EnumFormatEtc(pDataObject, DATADIR_GET, &enumfmt) == S_OK) {
     3047          for (;;) {
     3048       
     3049             FORMATETC tmp;
     3050             ULONG     actual = 1, res;
     3051
     3052             res = IEnumFORMATETC_Next(enumfmt, 1, &tmp, &actual);
     3053
     3054             if(res != S_OK) break;
     3055
     3056             dprintf(("format %x typed %x", tmp.cfFormat, tmp.tymed));
     3057          }
     3058          IEnumFORMATETC_Release(enumfmt);
     3059      }
     3060    }
     3061#endif
     3062
     3063    for(i=0;i<sizeof(supportedformats)/sizeof(supportedformats[0]);i++)
     3064    {
     3065        This->format.cfFormat = supportedformats[i];
     3066        This->format.ptd      = NULL;
     3067        This->format.dwAspect = DVASPECT_CONTENT; 
     3068        This->format.lindex   = -1;
     3069        This->format.tymed    = TYMED_HGLOBAL;
     3070        ret = IDataObject_GetData(pDataObject, &This->format, &This->medium);
     3071        if(ret != S_OK) {
     3072            dprintf(("IDataObject_GetData failed with %x", ret));
     3073            continue;
     3074        }
     3075        size = GlobalSize(This->medium.u.hGlobal);
     3076        if(size == 0) {
     3077            dprintf(("GlobalSize failed for %x", This->medium.u.hGlobal));
     3078            ReleaseStgMedium(&This->medium);
     3079            return E_OUTOFMEMORY;
     3080        }
     3081        dprintf(("handle %x size %d, format %x tymed %x", This->medium.u.hGlobal, size, This->format.cfFormat, This->format.tymed));
     3082
     3083        if(size == 1) {//empty string; use previous data
     3084             if(This->hDndData == 0) {
     3085                 DebugInt3();
     3086                 ReleaseStgMedium(&This->medium);
     3087                 return E_OUTOFMEMORY;
     3088             }
     3089             This->medium.u.hGlobal = This->hDndData;
     3090
     3091             dprintf(("Reuse old global handle %x", This->hDndData));
     3092             size = GlobalSize(This->medium.u.hGlobal);
     3093             if(size == 0) {
     3094                 dprintf(("GlobalSize failed for %x", This->medium.u.hGlobal));
     3095                 ReleaseStgMedium(&This->medium);
     3096                 return E_OUTOFMEMORY;
     3097             }
     3098             dprintf(("handle %x size %d, format %x tymed %x", This->medium.u.hGlobal, size, This->format.cfFormat, This->format.tymed));
     3099        }
     3100        else This->hDndData = This->medium.u.hGlobal;
     3101
     3102        This->lpDnDData = (LPVOID)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
     3103        if(This->lpDnDData == NULL) {
     3104            dprintf(("HeapAlloc failed for %d bytes", size));
     3105            return E_OUTOFMEMORY;
     3106        }
     3107        This->lpOS2StringData = (LPVOID)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size*2);
     3108        if(This->lpOS2StringData == NULL) {
     3109            dprintf(("HeapAlloc failed for %d bytes", size));
     3110            return E_OUTOFMEMORY;
     3111        }
     3112        lpData = GlobalLock(This->medium.u.hGlobal);
     3113
     3114        if(This->format.cfFormat == CF_HDROP) {
     3115            memcpy(This->lpDnDData, lpData, size);
     3116            lpDrop = (DROPFILES *)This->lpDnDData;
     3117            lpStringData = (LPSTR)(lpDrop) + lpDrop->pFiles;
     3118            if(lpDrop->fWide == FALSE) {
     3119                 OemToCharA((LPSTR)lpStringData, (LPSTR)This->lpOS2StringData);
     3120            }
     3121            else {
     3122                 int len;
     3123                 len = lstrlenW((LPWSTR)lpStringData);
     3124                 WideCharToMultiByte( CP_OEMCP, 0, (LPWSTR)lpStringData, len, (LPSTR)This->lpOS2StringData, len, NULL, NULL );
     3125            }
     3126        }
     3127        else
     3128        if(This->format.cfFormat == CF_TEXT) {
     3129            strcpy(This->lpDnDData, lpData);
     3130            OemToCharA( This->lpDnDData, This->lpOS2StringData );
     3131        }
     3132        dprintf(("Drop string %s", This->lpOS2StringData));
     3133        GlobalUnlock(This->medium.u.hGlobal);
     3134
     3135        This->pt = pt;
     3136
     3137        This->lpDragStruct = OSLibCreateDragStruct(hwndTracker, This->pt.x, This->pt.y, This->lpOS2StringData);
     3138        if(This->lpDragStruct == NULL) {
     3139            dprintf(("OSLibCreateDragStruct"));
     3140            ReleaseStgMedium(&This->medium);
     3141            return E_OUTOFMEMORY;
     3142        }
     3143
     3144        dwEffect = OSLibDragOver(This->lpDragStruct, pt.x, pt.y);
     3145        break;
     3146    }   
     3147    if(ret != S_OK) {
     3148        dprintf(("IDataObject_GetData failed (fatal) with %x", ret));
     3149        return ret;
     3150    }
     3151    if(pdwEffect) {
     3152        *pdwEffect = dwEffect;
     3153    }
     3154 
     3155    return S_OK;
     3156}
     3157//******************************************************************************
     3158//******************************************************************************
     3159static HRESULT WINAPI IDropTarget_fnDragOver(IDropTarget *iface, DWORD grfKeyState, POINTL pt,
     3160                               DWORD* pdwEffect)
     3161{
     3162    DWORD dwEffect;
     3163    ICOM_THIS(IDropTargetImpl,iface);
     3164
     3165    dprintf(("IDropTarget_fnDragOver %x (%d,%d)", grfKeyState, pt.x, pt.y));
     3166
     3167    dwEffect = OSLibDragOver(This->lpDragStruct, pt.x, pt.y);
     3168    if(pdwEffect) {
     3169        *pdwEffect = dwEffect;
     3170    }
     3171    return S_OK;
     3172}
     3173//******************************************************************************
     3174//******************************************************************************
     3175static HRESULT WINAPI IDropTarget_fnDragLeave(IDropTarget *iface)
     3176{
     3177    ICOM_THIS(IDropTargetImpl,iface);
     3178
     3179    dprintf(("IDropTarget_fnDragLeave"));
     3180 
     3181    OSLibDragLeave(This->lpDragStruct);
     3182
     3183    IDropTarget_fnCleanup(iface);
     3184    return S_OK;
     3185}
     3186//******************************************************************************
     3187//******************************************************************************
     3188static HRESULT WINAPI IDropTarget_fnDrop(IDropTarget *iface, IDataObject* pDataObject, DWORD grfKeyState,
     3189                           POINTL pt, DWORD* pdwEffect)
     3190{
     3191    DWORD dwEffect;
     3192    ICOM_THIS(IDropTargetImpl,iface);
     3193
     3194    dprintf(("IDropTarget_fnDrop %x (%d,%d) %s", grfKeyState, pt.x, pt.y, This->lpOS2StringData));
     3195
     3196    dwEffect = OSLibDragDrop(This->lpDragStruct, pt.x, pt.y, This->lpOS2StringData);
     3197    if(pdwEffect) {
     3198        *pdwEffect = dwEffect;
     3199    }
     3200    return S_OK;
     3201}
     3202//******************************************************************************
     3203//******************************************************************************
     3204
     3205static struct ICOM_VTABLE(IDropTarget) droptarget =
     3206{
     3207        ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     3208        IDropTarget_fnQueryInterface,
     3209        IDropTarget_fnAddRef,
     3210        IDropTarget_fnRelease,
     3211        IDropTarget_fnDragEnter,
     3212        IDropTarget_fnDragOver,
     3213        IDropTarget_fnDragLeave,
     3214        IDropTarget_fnDrop,
     3215};
     3216
     3217
     3218/**************************************************************************
     3219*  IDropTarget_Constructor
     3220*/
     3221static IDropTarget *IDropTarget_Constructor()
     3222{
     3223        IDropTargetImpl* dto;
     3224
     3225        dto = (IDropTargetImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDropTargetImpl));
     3226
     3227        if (dto)
     3228        {
     3229          dto->ref = 1;
     3230          dto->pDataObject = NULL;
     3231          dto->lpDnDData   = NULL;
     3232          dto->lpOS2StringData = NULL;
     3233          dto->hDndData = 0;
     3234          ICOM_VTBL(dto) = &droptarget;
     3235        }
     3236       
     3237        return (IDropTarget *)dto;
     3238}
     3239
    28853240#endif
    28863241
  • trunk/src/ole32/ole32.mak

    r9400 r10185  
    1 # $Id: ole32.mak,v 1.21 2002-11-12 17:06:02 sandervl Exp $
     1# $Id: ole32.mak,v 1.22 2003-07-28 11:32:05 sandervl Exp $
    22
    33#
     
    5050$(OBJDIR)\imessagefilter.obj \
    5151$(OBJDIR)\memlockbytes.obj \
     52!if "$(DEBUG)" == "1"
    5253$(OBJDIR)\oString.obj \
     54!endif
    5355$(OBJDIR)\ole2impl.obj \
    5456$(OBJDIR)\ole2.obj \
Note: See TracChangeset for help on using the changeset viewer.