ReactOS  0.4.13-dev-235-g7373cb3
clipboard.c
Go to the documentation of this file.
1 /*
2  * Richedit clipboard handling
3  *
4  * Copyright (C) 2006 Kevin Koltzau
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #define NONAMELESSUNION
22 
23 #include "editor.h"
24 
26 
27 static UINT cfRTF = 0;
28 
29 typedef struct DataObjectImpl {
32 
33  FORMATETC *fmtetc;
35 
39 
40 typedef struct EnumFormatImpl {
43 
44  FORMATETC *fmtetc;
46 
49 
50 static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT size, LPENUMFORMATETC *lplpformatetc);
51 
53 {
54  return CONTAINING_RECORD(iface, DataObjectImpl, IDataObject_iface);
55 }
56 
58 {
59  return CONTAINING_RECORD(iface, EnumFormatImpl, IEnumFORMATETC_iface);
60 }
61 
63 {
65  TRACE("%p %s\n", This, debugstr_guid(riid));
66 
68  IEnumFORMATETC_AddRef(iface);
69  *ppvObj = &This->IEnumFORMATETC_iface;
70  return S_OK;
71  }
72  *ppvObj = NULL;
73  return E_NOINTERFACE;
74 }
75 
77 {
80  TRACE("(%p) ref=%d\n", This, ref);
81  return ref;
82 }
83 
85 {
88  TRACE("(%p) ref=%d\n", This, ref);
89 
90  if(!ref) {
91  GlobalFree(This->fmtetc);
92  heap_free(This);
93  }
94 
95  return ref;
96 }
97 
99  FORMATETC *rgelt, ULONG *pceltFetched)
100 {
102  ULONG count = 0;
103  TRACE("(%p)->(%d %p %p)\n", This, celt, rgelt, pceltFetched);
104 
105  if(!rgelt)
106  return E_INVALIDARG;
107 
108  count = min(celt, This->fmtetc_cnt-This->cur);
109  if(count > 0) {
110  memcpy(rgelt, This->fmtetc+This->cur, count*sizeof(FORMATETC));
111  This->cur += count;
112  }
113  if(pceltFetched)
114  *pceltFetched = count;
115  return count == celt ? S_OK : S_FALSE;
116 }
117 
119 {
121  ULONG count = 0;
122  TRACE("(%p)->(%d)\n", This, celt);
123 
124  count = min(celt, This->fmtetc_cnt-This->cur);
125  This->cur += count;
126  return count == celt ? S_OK : S_FALSE;
127 }
128 
130 {
132  TRACE("(%p)\n", This);
133 
134  This->cur = 0;
135  return S_OK;
136 }
137 
139 {
141  HRESULT hr;
142  TRACE("(%p)->(%p)\n", This, ppenum);
143 
144  if(!ppenum)
145  return E_INVALIDARG;
146  hr = EnumFormatImpl_Create(This->fmtetc, This->fmtetc_cnt, ppenum);
147  if(SUCCEEDED(hr))
148  hr = IEnumFORMATETC_Skip(*ppenum, This->cur);
149  return hr;
150 }
151 
152 static const IEnumFORMATETCVtbl VT_EnumFormatImpl = {
160 };
161 
162 static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT fmtetc_cnt,
163  IEnumFORMATETC **formatetc)
164 {
166  TRACE("\n");
167 
168  ret = heap_alloc(sizeof(EnumFormatImpl));
169  ret->IEnumFORMATETC_iface.lpVtbl = &VT_EnumFormatImpl;
170  ret->ref = 1;
171  ret->cur = 0;
172  ret->fmtetc_cnt = fmtetc_cnt;
173  ret->fmtetc = GlobalAlloc(GMEM_ZEROINIT, fmtetc_cnt*sizeof(FORMATETC));
174  memcpy(ret->fmtetc, fmtetc, fmtetc_cnt*sizeof(FORMATETC));
175  *formatetc = &ret->IEnumFORMATETC_iface;
176  return S_OK;
177 }
178 
180 {
182  TRACE("(%p)->(%s)\n", This, debugstr_guid(riid));
183 
185  IDataObject_AddRef(iface);
186  *ppvObj = &This->IDataObject_iface;
187  return S_OK;
188  }
189  *ppvObj = NULL;
190  return E_NOINTERFACE;
191 }
192 
194 {
197  TRACE("(%p) ref=%d\n", This, ref);
198  return ref;
199 }
200 
202 {
205  TRACE("(%p) ref=%d\n",This, ref);
206 
207  if(!ref) {
208  if(This->unicode) GlobalFree(This->unicode);
209  if(This->rtf) GlobalFree(This->rtf);
210  if(This->fmtetc) GlobalFree(This->fmtetc);
211  heap_free(This);
212  }
213 
214  return ref;
215 }
216 
217 static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
218 {
220  TRACE("(%p)->(fmt=0x%08x tym=0x%08x)\n", This, pformatetc->cfFormat, pformatetc->tymed);
221 
222  if(pformatetc->lindex != -1)
223  return DV_E_LINDEX;
224 
225  if(!(pformatetc->tymed & TYMED_HGLOBAL))
226  return DV_E_TYMED;
227 
228  if(This->unicode && pformatetc->cfFormat == CF_UNICODETEXT)
229  pmedium->u.hGlobal = This->unicode;
230  else if(This->rtf && pformatetc->cfFormat == cfRTF)
231  pmedium->u.hGlobal = This->rtf;
232  else
233  return DV_E_FORMATETC;
234 
235  pmedium->tymed = TYMED_HGLOBAL;
236  pmedium->pUnkForRelease = (LPUNKNOWN)iface;
237  IUnknown_AddRef(pmedium->pUnkForRelease);
238  return S_OK;
239 }
240 
241 static HRESULT WINAPI DataObjectImpl_GetDataHere(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
242 {
244  FIXME("(%p): stub\n", This);
245  return E_NOTIMPL;
246 }
247 
248 static HRESULT WINAPI DataObjectImpl_QueryGetData(IDataObject* iface, FORMATETC *pformatetc)
249 {
251  UINT i;
252  BOOL foundFormat = FALSE;
253  TRACE("(%p)->(fmt=0x%08x tym=0x%08x)\n", This, pformatetc->cfFormat, pformatetc->tymed);
254 
255  if(pformatetc->lindex != -1)
256  return DV_E_LINDEX;
257 
258  for(i=0; i<This->fmtetc_cnt; i++) {
259  if(This->fmtetc[i].cfFormat == pformatetc->cfFormat) {
260  foundFormat = TRUE;
261  if(This->fmtetc[i].tymed == pformatetc->tymed)
262  return S_OK;
263  }
264  }
265  return foundFormat?DV_E_FORMATETC:DV_E_TYMED;
266 }
267 
268 static HRESULT WINAPI DataObjectImpl_GetCanonicalFormatEtc(IDataObject* iface, FORMATETC *pformatetcIn,
269  FORMATETC *pformatetcOut)
270 {
272  TRACE("(%p)->(%p,%p)\n", This, pformatetcIn, pformatetcOut);
273 
274  if(pformatetcOut) {
275  *pformatetcOut = *pformatetcIn;
276  pformatetcOut->ptd = NULL;
277  }
278  return DATA_S_SAMEFORMATETC;
279 }
280 
281 static HRESULT WINAPI DataObjectImpl_SetData(IDataObject* iface, FORMATETC *pformatetc,
282  STGMEDIUM *pmedium, BOOL fRelease)
283 {
285  FIXME("(%p): stub\n", This);
286  return E_NOTIMPL;
287 }
288 
290  IEnumFORMATETC **ppenumFormatEtc)
291 {
293  TRACE("(%p)->(%d)\n", This, dwDirection);
294 
295  if(dwDirection != DATADIR_GET) {
296  FIXME("Unsupported direction: %d\n", dwDirection);
297  /* WinXP riched20 also returns E_NOTIMPL in this case */
298  *ppenumFormatEtc = NULL;
299  return E_NOTIMPL;
300  }
301  return EnumFormatImpl_Create(This->fmtetc, This->fmtetc_cnt, ppenumFormatEtc);
302 }
303 
304 static HRESULT WINAPI DataObjectImpl_DAdvise(IDataObject* iface, FORMATETC *pformatetc, DWORD advf,
305  IAdviseSink *pAdvSink, DWORD *pdwConnection)
306 {
308  FIXME("(%p): stub\n", This);
309  return E_NOTIMPL;
310 }
311 
313 {
315  FIXME("(%p): stub\n", This);
316  return E_NOTIMPL;
317 }
318 
320 {
322  FIXME("(%p): stub\n", This);
323  return E_NOTIMPL;
324 }
325 
326 static const IDataObjectVtbl VT_DataObjectImpl =
327 {
340 };
341 
342 static HGLOBAL get_unicode_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
343 {
344  int pars = 0;
345  WCHAR *data;
346  HANDLE ret;
347  ME_DisplayItem *para;
348  int nEnd = ME_GetCursorOfs(start) + nChars;
349 
350  /* count paragraphs in range */
351  para = start->pPara;
352  while((para = para->member.para.next_para) &&
353  para->member.para.nCharOfs <= nEnd)
354  pars++;
355 
356  ret = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * (nChars + pars + 1));
357  data = GlobalLock(ret);
358  ME_GetTextW(editor, data, nChars + pars, start, nChars, TRUE, FALSE);
359  GlobalUnlock(ret);
360  return ret;
361 }
362 
364 {
366  int nLength;
368 
369 static DWORD CALLBACK ME_AppendToHGLOBAL(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb, LONG *pcb)
370 {
372  int nMaxSize;
373  BYTE *pDest;
374 
375  nMaxSize = GlobalSize(pData->hData);
376  if (pData->nLength+cb+1 >= cb) {
377  /* round up to 2^17 */
378  int nNewSize = (((nMaxSize+cb+1)|0x1FFFF)+1) & 0xFFFE0000;
379  pData->hData = GlobalReAlloc(pData->hData, nNewSize, 0);
380  }
381  pDest = GlobalLock(pData->hData);
382  memcpy(pDest + pData->nLength, lpBuff, cb);
383  pData->nLength += cb;
384  pDest[pData->nLength] = '\0';
385  GlobalUnlock(pData->hData);
386  *pcb = cb;
387 
388  return 0;
389 }
390 
391 static HGLOBAL get_rtf_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
392 {
393  EDITSTREAM es;
395 
396  gds.hData = GlobalAlloc(GMEM_MOVEABLE, 0);
397  gds.nLength = 0;
398  es.dwCookie = (DWORD_PTR)&gds;
399  es.pfnCallback = ME_AppendToHGLOBAL;
400  ME_StreamOutRange(editor, SF_RTF, start, nChars, &es);
401  GlobalReAlloc(gds.hData, gds.nLength+1, 0);
402  return gds.hData;
403 }
404 
406  IDataObject **dataobj)
407 {
409  TRACE("(%p,%d,%d)\n", editor, ME_GetCursorOfs(start), nChars);
410 
411  obj = heap_alloc(sizeof(DataObjectImpl));
412  if(cfRTF == 0)
413  cfRTF = RegisterClipboardFormatA("Rich Text Format");
414 
416  obj->ref = 1;
417  obj->unicode = get_unicode_text(editor, start, nChars);
418  obj->rtf = NULL;
419 
420  obj->fmtetc_cnt = 1;
421  if(editor->mode & TM_RICHTEXT)
422  obj->fmtetc_cnt++;
423  obj->fmtetc = GlobalAlloc(GMEM_ZEROINIT, obj->fmtetc_cnt*sizeof(FORMATETC));
424  InitFormatEtc(obj->fmtetc[0], CF_UNICODETEXT, TYMED_HGLOBAL);
425  if(editor->mode & TM_RICHTEXT) {
426  obj->rtf = get_rtf_text(editor, start, nChars);
427  InitFormatEtc(obj->fmtetc[1], cfRTF, TYMED_HGLOBAL);
428  }
429 
430  *dataobj = &obj->IDataObject_iface;
431  return S_OK;
432 }
static EnumFormatImpl * impl_from_IEnumFORMATETC(IEnumFORMATETC *iface)
Definition: clipboard.c:57
ME_Paragraph para
Definition: editstr.h:266
#define REFIID
Definition: guiddef.h:113
#define TRUE
Definition: types.h:120
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
IDataObject IDataObject_iface
Definition: clipboard.c:30
#define E_NOINTERFACE
Definition: winerror.h:2364
UINT fmtetc_cnt
Definition: clipboard.c:34
static const IEnumFORMATETCVtbl VT_EnumFormatImpl
Definition: clipboard.c:152
#define DWORD_PTR
Definition: treelist.c:76
HRESULT hr
Definition: shlfolder.c:183
#define DATA_S_SAMEFORMATETC
Definition: winerror.h:2674
HGLOBAL NTAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags)
Definition: heapmem.c:825
static HRESULT WINAPI DataObjectImpl_EnumFormatEtc(IDataObject *iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
Definition: clipboard.c:289
#define SF_RTF
Definition: richedit.h:721
REFIID riid
Definition: precomp.h:44
union tagME_DisplayItem::@503 member
GLuint GLuint GLsizei count
Definition: gl.h:1545
static HRESULT WINAPI DataObjectImpl_GetDataHere(IDataObject *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
Definition: clipboard.c:241
HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, int nChars, IDataObject **dataobj)
Definition: clipboard.c:405
#define CALLBACK
Definition: compat.h:27
struct DataObjectImpl DataObjectImpl
const GUID IID_IDataObject
static HRESULT WINAPI DataObjectImpl_GetCanonicalFormatEtc(IDataObject *iface, FORMATETC *pformatetcIn, FORMATETC *pformatetcOut)
Definition: clipboard.c:268
Definition: send.c:47
UINT fmtetc_cnt
Definition: clipboard.c:45
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
static HGLOBAL get_unicode_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
Definition: clipboard.c:342
GLsizei GLsizei GLuint * obj
Definition: glext.h:6042
static DataObjectImpl * impl_from_IDataObject(IDataObject *iface)
Definition: clipboard.c:52
#define InitFormatEtc(fe, cf, med)
Definition: clipboard.c:36
static HRESULT WINAPI DataObjectImpl_DAdvise(IDataObject *iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
Definition: clipboard.c:304
int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen, const ME_Cursor *start, int srcChars, BOOL bCRLF, BOOL bEOP)
Definition: editor.c:5117
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned char * LPBYTE
Definition: typedefs.h:52
unsigned int BOOL
Definition: ntddk_ex.h:94
static HRESULT WINAPI EnumFormatImpl_Skip(IEnumFORMATETC *iface, ULONG celt)
Definition: clipboard.c:118
long LONG
Definition: pedump.c:60
static LPUNKNOWN
Definition: ndr_ole.c:49
static HRESULT WINAPI DataObjectImpl_QueryGetData(IDataObject *iface, FORMATETC *pformatetc)
Definition: clipboard.c:248
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
#define S_FALSE
Definition: winerror.h:2357
#define E_INVALIDARG
Definition: ddrawi.h:101
#define CF_UNICODETEXT
Definition: constants.h:408
smooth NULL
Definition: ftsmooth.c:416
FORMATETC * fmtetc
Definition: clipboard.c:44
FORMATETC * fmtetc
Definition: clipboard.c:33
WINE_DEFAULT_DEBUG_CHANNEL(ole)
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static HRESULT WINAPI EnumFormatImpl_Reset(IEnumFORMATETC *iface)
Definition: clipboard.c:129
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
#define DV_E_FORMATETC
Definition: winerror.h:2633
static HRESULT WINAPI EnumFormatImpl_Clone(IEnumFORMATETC *iface, IEnumFORMATETC **ppenum)
Definition: clipboard.c:138
__wchar_t WCHAR
Definition: xmlstorage.h:180
static UINT count
Definition: clipboard.c:35
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
HANDLE rtf
Definition: clipboard.c:37
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
const GUID IID_IEnumFORMATETC
static UINT cfRTF
Definition: clipboard.c:27
static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT size, LPENUMFORMATETC *lplpformatetc)
static DWORD cb
Definition: integrity.c:41
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
static DWORD CALLBACK ME_AppendToHGLOBAL(DWORD_PTR dwCookie, LPBYTE lpBuff, LONG cb, LONG *pcb)
Definition: clipboard.c:369
#define DV_E_TYMED
Definition: winerror.h:2638
interface IEnumFORMATETC * LPENUMFORMATETC
Definition: objfwd.h:24
int ret
static ULONG WINAPI DataObjectImpl_Release(IDataObject *iface)
Definition: clipboard.c:201
static HRESULT WINAPI DataObjectImpl_DUnadvise(IDataObject *iface, DWORD dwConnection)
Definition: clipboard.c:312
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
#define InterlockedDecrement
Definition: armddk.h:52
static HRESULT WINAPI DataObjectImpl_EnumDAdvise(IDataObject *iface, IEnumSTATDATA **ppenumAdvise)
Definition: clipboard.c:319
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char BYTE
Definition: mem.h:68
static HGLOBAL get_rtf_text(ME_TextEditor *editor, const ME_Cursor *start, int nChars)
Definition: clipboard.c:391
#define DV_E_LINDEX
Definition: winerror.h:2637
IEnumFORMATETC IEnumFORMATETC_iface
Definition: clipboard.c:41
uint32_t DWORD_PTR
Definition: typedefs.h:63
UINT WINAPI RegisterClipboardFormatA(LPCSTR lpszFormat)
Definition: clipboard.c:92
IDataObject IDataObject_iface
Definition: usrmarshal.c:1273
int ME_GetCursorOfs(const ME_Cursor *cursor)
Definition: caret.c:898
#define TM_RICHTEXT
Definition: richedit.h:1029
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
static const IDataObjectVtbl VT_DataObjectImpl
Definition: clipboard.c:326
static ULONG WINAPI EnumFormatImpl_AddRef(IEnumFORMATETC *iface)
Definition: clipboard.c:76
GLuint start
Definition: gl.h:1545
static HRESULT WINAPI EnumFormatImpl_Next(IEnumFORMATETC *iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched)
Definition: clipboard.c:98
#define E_NOTIMPL
Definition: ddrawi.h:99
static HRESULT WINAPI DataObjectImpl_GetData(IDataObject *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
Definition: clipboard.c:217
#define min(a, b)
Definition: monoChain.cc:55
struct tagME_DisplayItem * next_para
Definition: editstr.h:221
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, const ME_Cursor *start, int nChars, EDITSTREAM *stream) DECLSPEC_HIDDEN
Definition: writer.c:1166
HANDLE unicode
Definition: clipboard.c:36
static ULONG WINAPI EnumFormatImpl_Release(IEnumFORMATETC *iface)
Definition: clipboard.c:84
unsigned int ULONG
Definition: retypes.h:1
static HRESULT WINAPI EnumFormatImpl_QueryInterface(IEnumFORMATETC *iface, REFIID riid, LPVOID *ppvObj)
Definition: clipboard.c:62
static HRESULT WINAPI DataObjectImpl_QueryInterface(IDataObject *iface, REFIID riid, LPVOID *ppvObj)
Definition: clipboard.c:179
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
#define es
Definition: i386-dis.c:431
#define GMEM_MOVEABLE
Definition: winbase.h:291
#define GMEM_ZEROINIT
Definition: winbase.h:303
static ULONG WINAPI DataObjectImpl_AddRef(IDataObject *iface)
Definition: clipboard.c:193
static HRESULT WINAPI DataObjectImpl_SetData(IDataObject *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
Definition: clipboard.c:281
#define SUCCEEDED(hr)
Definition: intsafe.h:57
struct tagME_GlobalDestStruct ME_GlobalDestStruct
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
struct EnumFormatImpl EnumFormatImpl