Changeset 10185 for trunk/src/ole32
- Timestamp:
- Jul 28, 2003, 1:35:32 PM (22 years ago)
- Location:
- trunk/src/ole32
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ole32/ole2.c
r8973 r10185 166 166 static DWORD OLEDD_GetButtonState(); 167 167 168 #ifdef __WIN32OS2__ 169 static IDropTarget *IDropTarget_Constructor(); 170 171 HWND hwndTracker = 0; 172 #endif 168 173 169 174 /****************************************************************************** … … 561 566 trackerInfo.curDragTarget = 0; 562 567 568 #ifdef __WIN32OS2__ 569 IDataObject_AddRef(trackerInfo.dataObject); 570 #endif 571 563 572 hwndTrackWindow = CreateWindowA(OLEDD_DRAGTRACKERCLASS, 564 573 "TrackerWindow", … … 573 582 if (hwndTrackWindow!=0) 574 583 { 584 #ifdef __WIN32OS2__ 585 hwndTracker = hwndTrackWindow; 586 #endif 575 587 /* 576 588 * Capture the mouse input … … 619 631 DestroyWindow(hwndTrackWindow); 620 632 633 #ifdef __WIN32OS2__ 634 IDataObject_Release(trackerInfo.dataObject); 635 #endif 636 621 637 return trackerInfo.returnValue; 622 638 } 639 640 #ifdef __WIN32OS2__ 641 IDataObject_Release(trackerInfo.dataObject); 642 #endif 623 643 624 644 return E_FAIL; … … 1636 1656 1637 1657 RegisterClassA (&wndClass); 1658 1659 #ifdef __WIN32OS2__ 1660 { 1661 IDropTarget *desktopdnd; 1662 1663 desktopdnd = IDropTarget_Constructor(); 1664 RegisterDragDrop(GetDesktopWindow(), desktopdnd); 1665 } 1666 #endif 1638 1667 } 1639 1668 … … 1934 1963 */ 1935 1964 hwndNewTarget = WindowFromPoint(mousePos); 1965 1966 #ifdef __WIN32OS2__ 1967 dprintf(("OLEDD_TrackMouseMove: hwndNewTarget %x current %x", hwndNewTarget, trackerInfo->curDragTargetHWND)); 1968 #endif 1936 1969 1937 1970 /* … … 2512 2545 dprintf(("IDataObject_fnGetData %x %x", pformatetcIn, pmedium)); 2513 2546 2514 if(pformatetcIn->cfFormat != CF_HDROP )2547 if(pformatetcIn->cfFormat != CF_HDROP && pformatetcIn->cfFormat != CF_TEXT && pformatetcIn->cfFormat != CF_UNICODETEXT) 2515 2548 { 2516 2549 FIXME("-- expected clipformat not implemented\n"); … … 2883 2916 //****************************************************************************** 2884 2917 //****************************************************************************** 2918 2919 #include <oslibdnd.h> 2920 2921 typedef 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 */ 2941 static 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 */ 2971 static 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 */ 2983 static 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 */ 3007 static 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 //****************************************************************************** 3024 static 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 //****************************************************************************** 3159 static 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 //****************************************************************************** 3175 static 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 //****************************************************************************** 3188 static 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 3205 static 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 */ 3221 static 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 2885 3240 #endif 2886 3241 -
trunk/src/ole32/ole32.mak
r9400 r10185 1 # $Id: ole32.mak,v 1.2 1 2002-11-12 17:06:02sandervl Exp $1 # $Id: ole32.mak,v 1.22 2003-07-28 11:32:05 sandervl Exp $ 2 2 3 3 # … … 50 50 $(OBJDIR)\imessagefilter.obj \ 51 51 $(OBJDIR)\memlockbytes.obj \ 52 !if "$(DEBUG)" == "1" 52 53 $(OBJDIR)\oString.obj \ 54 !endif 53 55 $(OBJDIR)\ole2impl.obj \ 54 56 $(OBJDIR)\ole2.obj \
Note:
See TracChangeset
for help on using the changeset viewer.
