Sync to Wine-20050830:
[reactos.git] / reactos / lib / riched20 / richole.c
1 /*
2 * RichEdit GUIDs and OLE interface
3 *
4 * Copyright 2004 by Krzysztof Foltman
5 * Copyright 2004 Aric Stewart
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22 #include <stdarg.h>
23
24 #define NONAMELESSUNION
25 #define NONAMELESSSTRUCT
26 #define COBJMACROS
27
28 #include "windef.h"
29 #include "winbase.h"
30 #include "wingdi.h"
31 #include "winuser.h"
32 #include "ole2.h"
33 #include "richole.h"
34 #include "wine/debug.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(richedit);
37
38 typedef struct IRichEditOleImpl {
39 const IRichEditOleVtbl *lpVtbl;
40 LONG ref;
41 } IRichEditOleImpl;
42
43 /* there is no way to be consistent across different sets of headers - mingw, Wine, Win32 SDK*/
44
45 /* FIXME: the next 6 lines should be in textserv.h */
46 #define TEXTSERV_GUID(name, l, w1, w2, b1, b2) \
47 GUID name = { l, w1, w2, {b1, b2, 0x00, 0xaa, 0x00, 0x6c, 0xad, 0xc5}}
48
49 TEXTSERV_GUID(IID_ITextServices, 0x8d33f740, 0xcf58, 0x11ce, 0xa8, 0x9d);
50 TEXTSERV_GUID(IID_ITextHost, 0xc5bdd8d0, 0xd26e, 0x11ce, 0xa8, 0x9e);
51 TEXTSERV_GUID(IID_ITextHost2, 0xc5bdd8d0, 0xd26e, 0x11ce, 0xa8, 0x9e);
52
53 static HRESULT WINAPI
54 IRichEditOle_fnQueryInterface(IRichEditOle *me, REFIID riid, LPVOID *ppvObj)
55 {
56 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
57
58 TRACE("%p %s\n", This, debugstr_guid(riid) );
59
60 if (IsEqualGUID(riid, &IID_IUnknown) ||
61 IsEqualGUID(riid, &IID_IRichEditOle))
62 {
63 IRichEditOle_AddRef(me);
64 *ppvObj = (LPVOID) This;
65 return S_OK;
66 }
67 FIXME("%p: unhandled interface %s\n", This, debugstr_guid(riid) );
68
69 return E_NOINTERFACE;
70 }
71
72 static ULONG WINAPI
73 IRichEditOle_fnAddRef(IRichEditOle *me)
74 {
75 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
76 ULONG ref = InterlockedIncrement( &This->ref );
77
78 TRACE("%p ref = %lu\n", This, ref);
79
80 return ref;
81 }
82
83 static ULONG WINAPI
84 IRichEditOle_fnRelease(IRichEditOle *me)
85 {
86 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
87 ULONG ref = InterlockedDecrement(&This->ref);
88
89 TRACE ("%p ref=%lu\n", This, ref);
90
91 if (!ref)
92 {
93 TRACE ("Destroying %p\n", This);
94 HeapFree(GetProcessHeap(),0,This);
95 }
96 return ref;
97 }
98
99 static HRESULT WINAPI
100 IRichEditOle_fnActivateAs(IRichEditOle *me, REFCLSID rclsid, REFCLSID rclsidAs)
101 {
102 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
103 FIXME("stub %p\n",This);
104 return E_NOTIMPL;
105 }
106
107 static HRESULT WINAPI
108 IRichEditOle_fnContextSensitiveHelp(IRichEditOle *me, BOOL fEnterMode)
109 {
110 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
111 FIXME("stub %p\n",This);
112 return E_NOTIMPL;
113 }
114
115 static HRESULT WINAPI
116 IRichEditOle_fnConvertObject(IRichEditOle *me, LONG iob,
117 REFCLSID rclsidNew, LPCSTR lpstrUserTypeNew)
118 {
119 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
120 FIXME("stub %p\n",This);
121 return E_NOTIMPL;
122 }
123
124 static HRESULT WINAPI
125 IRichEditOle_fnGetClientSite(IRichEditOle *me,
126 LPOLECLIENTSITE *lplpolesite)
127 {
128 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
129 FIXME("stub %p\n",This);
130 return E_NOTIMPL;
131 }
132
133 static HRESULT WINAPI
134 IRichEditOle_fnGetClipboardData(IRichEditOle *me, CHARRANGE *lpchrg,
135 DWORD reco, LPDATAOBJECT *lplpdataobj)
136 {
137 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
138 FIXME("stub %p\n",This);
139 return E_NOTIMPL;
140 }
141
142 static LONG WINAPI IRichEditOle_fnGetLinkCount(IRichEditOle *me)
143 {
144 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
145 FIXME("stub %p\n",This);
146 return E_NOTIMPL;
147 }
148
149 static HRESULT WINAPI
150 IRichEditOle_fnGetObject(IRichEditOle *me, LONG iob,
151 REOBJECT *lpreobject, DWORD dwFlags)
152 {
153 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
154 FIXME("stub %p\n",This);
155 return E_NOTIMPL;
156 }
157
158 static LONG WINAPI
159 IRichEditOle_fnGetObjectCount(IRichEditOle *me)
160 {
161 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
162 FIXME("stub %p\n",This);
163 return E_NOTIMPL;
164 }
165
166 static HRESULT WINAPI
167 IRichEditOle_fnHandsOffStorage(IRichEditOle *me, LONG iob)
168 {
169 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
170 FIXME("stub %p\n",This);
171 return E_NOTIMPL;
172 }
173
174 static HRESULT WINAPI
175 IRichEditOle_fnImportDataObject(IRichEditOle *me, LPDATAOBJECT lpdataobj,
176 CLIPFORMAT cf, HGLOBAL hMetaPict)
177 {
178 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
179 FIXME("stub %p\n",This);
180 return E_NOTIMPL;
181 }
182
183 static HRESULT WINAPI
184 IRichEditOle_fnInPlaceDeactivate(IRichEditOle *me)
185 {
186 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
187 FIXME("stub %p\n",This);
188 return E_NOTIMPL;
189 }
190
191 static HRESULT WINAPI
192 IRichEditOle_fnInsertObject(IRichEditOle *me, REOBJECT *lpreobject)
193 {
194 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
195 FIXME("stub %p\n",This);
196 return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI IRichEditOle_fnSaveCompleted(IRichEditOle *me, LONG iob,
200 LPSTORAGE lpstg)
201 {
202 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
203 FIXME("stub %p\n",This);
204 return E_NOTIMPL;
205 }
206
207 static HRESULT WINAPI
208 IRichEditOle_fnSetDvaspect(IRichEditOle *me, LONG iob, DWORD dvaspect)
209 {
210 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
211 FIXME("stub %p\n",This);
212 return E_NOTIMPL;
213 }
214
215 static HRESULT WINAPI IRichEditOle_fnSetHostNames(IRichEditOle *me,
216 LPCSTR lpstrContainerApp, LPCSTR lpstrContainerObj)
217 {
218 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
219 FIXME("stub %p %s %s\n",This, lpstrContainerApp, lpstrContainerObj);
220 return E_NOTIMPL;
221 }
222
223 static HRESULT WINAPI
224 IRichEditOle_fnSetLinkAvailable(IRichEditOle *me, LONG iob, BOOL fAvailable)
225 {
226 IRichEditOleImpl *This = (IRichEditOleImpl *)me;
227 FIXME("stub %p\n",This);
228 return E_NOTIMPL;
229 }
230
231 static const IRichEditOleVtbl revt = {
232 IRichEditOle_fnQueryInterface,
233 IRichEditOle_fnAddRef,
234 IRichEditOle_fnRelease,
235 IRichEditOle_fnGetClientSite,
236 IRichEditOle_fnGetObjectCount,
237 IRichEditOle_fnGetLinkCount,
238 IRichEditOle_fnGetObject,
239 IRichEditOle_fnInsertObject,
240 IRichEditOle_fnConvertObject,
241 IRichEditOle_fnActivateAs,
242 IRichEditOle_fnSetHostNames,
243 IRichEditOle_fnSetLinkAvailable,
244 IRichEditOle_fnSetDvaspect,
245 IRichEditOle_fnHandsOffStorage,
246 IRichEditOle_fnSaveCompleted,
247 IRichEditOle_fnInPlaceDeactivate,
248 IRichEditOle_fnContextSensitiveHelp,
249 IRichEditOle_fnGetClipboardData,
250 IRichEditOle_fnImportDataObject
251 };
252
253 LRESULT CreateIRichEditOle(LPVOID *ppObj)
254 {
255 IRichEditOleImpl *reo;
256
257 reo = HeapAlloc(GetProcessHeap(), 0, sizeof(IRichEditOleImpl));
258 if (!reo)
259 return 0;
260
261 reo->lpVtbl = &revt;
262 reo->ref = 1;
263 TRACE("Created %p\n",reo);
264 *ppObj = (LPVOID) reo;
265
266 return 1;
267 }