ntdll: Set initial module refcount to 1 to avoid unloading during imports fixup.
[wine] / dlls / mshtml / txtrange.c
1 /*
2  * Copyright 2006 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22 #include <stdio.h>
23
24 #define COBJMACROS
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "winnls.h"
30 #include "ole2.h"
31
32 #include "wine/debug.h"
33 #include "wine/unicode.h"
34
35 #include "mshtml_private.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
38
39 typedef struct {
40     const IHTMLTxtRangeVtbl *lpHTMLTxtRangeVtbl;
41
42     LONG ref;
43
44     nsISelection *nsselection;
45 } HTMLTxtRange;
46
47 #define HTMLTXTRANGE(x)  ((IHTMLTxtRange*)  &(x)->lpHTMLTxtRangeVtbl)
48
49 #define HTMLTXTRANGE_THIS(iface) DEFINE_THIS(HTMLTxtRange, HTMLTxtRange, iface)
50
51 static HRESULT WINAPI HTMLTxtRange_QueryInterface(IHTMLTxtRange *iface, REFIID riid, void **ppv)
52 {
53     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
54
55     *ppv = NULL;
56
57     if(IsEqualGUID(&IID_IUnknown, riid)) {
58         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
59         *ppv = HTMLTXTRANGE(This);
60     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
61         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
62         *ppv = HTMLTXTRANGE(This);
63     }else if(IsEqualGUID(&IID_IHTMLTxtRange, riid)) {
64         TRACE("(%p)->(IID_IHTMLTxtRange %p)\n", This, ppv);
65         *ppv = HTMLTXTRANGE(This);
66     }
67
68     if(*ppv) {
69         IUnknown_AddRef((IUnknown*)*ppv);
70         return S_OK;
71     }
72
73     WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
74     return E_NOINTERFACE;
75 }
76
77 static ULONG WINAPI HTMLTxtRange_AddRef(IHTMLTxtRange *iface)
78 {
79     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
80     LONG ref = InterlockedIncrement(&This->ref);
81
82     TRACE("(%p) ref=%ld\n", This, ref);
83
84     return ref;
85 }
86
87 static ULONG WINAPI HTMLTxtRange_Release(IHTMLTxtRange *iface)
88 {
89     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
90     LONG ref = InterlockedDecrement(&This->ref);
91
92     TRACE("(%p) ref=%ld\n", This, ref);
93
94     if(!ref) {
95         if(This->nsselection)
96             nsISelection_Release(This->nsselection);
97         mshtml_free(This);
98     }
99
100     return ref;
101 }
102
103 static HRESULT WINAPI HTMLTxtRange_GetTypeInfoCount(IHTMLTxtRange *iface, UINT *pctinfo)
104 {
105     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
106     FIXME("(%p)->(%p)\n", This, pctinfo);
107     return E_NOTIMPL;
108 }
109
110 static HRESULT WINAPI HTMLTxtRange_GetTypeInfo(IHTMLTxtRange *iface, UINT iTInfo,
111                                                LCID lcid, ITypeInfo **ppTInfo)
112 {
113     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
114     FIXME("(%p)->(%u %lu %p)\n", This, iTInfo, lcid, ppTInfo);
115     return E_NOTIMPL;
116 }
117
118 static HRESULT WINAPI HTMLTxtRange_GetIDsOfNames(IHTMLTxtRange *iface, REFIID riid,
119                                                  LPOLESTR *rgszNames, UINT cNames,
120                                                  LCID lcid, DISPID *rgDispId)
121 {
122     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
123     FIXME("(%p)->(%s %p %u %lu %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
124           lcid, rgDispId);
125     return E_NOTIMPL;
126 }
127
128 static HRESULT WINAPI HTMLTxtRange_Invoke(IHTMLTxtRange *iface, DISPID dispIdMember,
129                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
130                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
131 {
132     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
133     FIXME("(%p)->(%ld %s %ld %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
134           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
135     return E_NOTIMPL;
136 }
137
138 static HRESULT WINAPI HTMLTxtRange_get_htmlText(IHTMLTxtRange *iface, BSTR *p)
139 {
140     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
141     FIXME("(%p)->(%p)\n", This, p);
142     return E_NOTIMPL;
143 }
144
145 static HRESULT WINAPI HTMLTxtRange_put_text(IHTMLTxtRange *iface, BSTR v)
146 {
147     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
148     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
149     return E_NOTIMPL;
150 }
151
152 static HRESULT WINAPI HTMLTxtRange_get_text(IHTMLTxtRange *iface, BSTR *p)
153 {
154     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
155     PRUnichar *nstext = NULL;
156     nsresult nsres;
157
158     TRACE("(%p)->(%p)\n", This, p);
159
160     if(!This->nsselection) {
161         static const WCHAR empty[] = {0};
162         *p = SysAllocString(empty);
163         return S_OK;
164     }
165
166     nsres = nsISelection_ToString(This->nsselection, &nstext);
167     if(NS_FAILED(nsres) || !nstext) {
168         ERR("toString failed: %08lx\n", nsres);
169         return E_FAIL;
170     }
171
172     *p = SysAllocString(nstext);
173     nsfree(nstext);
174     return S_OK;
175 }
176
177 static HRESULT WINAPI HTMLTxtRange_parentElement(IHTMLTxtRange *iface, IHTMLElement **parent)
178 {
179     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
180     FIXME("(%p)->(%p)\n", This, parent);
181     return E_NOTIMPL;
182 }
183
184 static HRESULT WINAPI HTMLTxtRange_duplicate(IHTMLTxtRange *iface, IHTMLTxtRange **Duplicate)
185 {
186     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
187     FIXME("(%p)->(%p)\n", This, Duplicate);
188     return E_NOTIMPL;
189 }
190
191 static HRESULT WINAPI HTMLTxtRange_inRange(IHTMLTxtRange *iface, IHTMLTxtRange *Range,
192         VARIANT_BOOL *InRange)
193 {
194     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
195     FIXME("(%p)->(%p %p)\n", This, Range, InRange);
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI HTMLTxtRange_isEqual(IHTMLTxtRange *iface, IHTMLTxtRange *Range,
200         VARIANT_BOOL *IsEqual)
201 {
202     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
203     FIXME("(%p)->()\n", This);
204     return E_NOTIMPL;
205 }
206
207 static HRESULT WINAPI HTMLTxtRange_scrollIntoView(IHTMLTxtRange *iface, VARIANT_BOOL fStart)
208 {
209     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
210     FIXME("(%p)->(%x)\n", This, fStart);
211     return E_NOTIMPL;
212 }
213
214 static HRESULT WINAPI HTMLTxtRange_collapse(IHTMLTxtRange *iface, VARIANT_BOOL Start)
215 {
216     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
217     FIXME("(%p)->(%x)\n", This, Start);
218     return E_NOTIMPL;
219 }
220
221 static HRESULT WINAPI HTMLTxtRange_expand(IHTMLTxtRange *iface, BSTR Unit, VARIANT_BOOL *Success)
222 {
223     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
224     FIXME("(%p)->(%s %p)\n", This, debugstr_w(Unit), Success);
225     return E_NOTIMPL;
226 }
227
228 static HRESULT WINAPI HTMLTxtRange_move(IHTMLTxtRange *iface, BSTR Unit,
229         long Count, long *ActualCount)
230 {
231     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
232     FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount);
233     return E_NOTIMPL;
234 }
235
236 static HRESULT WINAPI HTMLTxtRange_moveStart(IHTMLTxtRange *iface, BSTR Unit,
237         long Count, long *ActualCount)
238 {
239     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
240     FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount);
241     return E_NOTIMPL;
242 }
243
244 static HRESULT WINAPI HTMLTxtRange_moveEnd(IHTMLTxtRange *iface, BSTR Unit,
245         long Count, long *ActualCount)
246 {
247     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
248     FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount);
249     return E_NOTIMPL;
250 }
251
252 static HRESULT WINAPI HTMLTxtRange_select(IHTMLTxtRange *iface)
253 {
254     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
255     FIXME("(%p)->()\n", This);
256     return E_NOTIMPL;
257 }
258
259 static HRESULT WINAPI HTMLTxtRange_pasteHTML(IHTMLTxtRange *iface, BSTR html)
260 {
261     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
262     FIXME("(%p)->(%s)\n", This, debugstr_w(html));
263     return E_NOTIMPL;
264 }
265
266 static HRESULT WINAPI HTMLTxtRange_moveToElementText(IHTMLTxtRange *iface, IHTMLElement *element)
267 {
268     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
269     FIXME("(%p)->(%p)\n", This, element);
270     return E_NOTIMPL;
271 }
272
273 static HRESULT WINAPI HTMLTxtRange_setEndPoint(IHTMLTxtRange *iface, BSTR how,
274         IHTMLTxtRange *SourceRange)
275 {
276     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
277     FIXME("(%p)->(%s %p)\n", This, debugstr_w(how), SourceRange);
278     return E_NOTIMPL;
279 }
280
281 static HRESULT WINAPI HTMLTxtRange_compareEndPoints(IHTMLTxtRange *iface, BSTR how,
282         IHTMLTxtRange *SourceRange, long *ret)
283 {
284     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
285     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(how), SourceRange, ret);
286     return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI HTMLTxtRange_findText(IHTMLTxtRange *iface, BSTR String,
290         long count, long Flags, VARIANT_BOOL *Success)
291 {
292     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
293     FIXME("(%p)->(%s %ld %08lx %p)\n", This, debugstr_w(String), count, Flags, Success);
294     return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI HTMLTxtRange_moveToPoint(IHTMLTxtRange *iface, long x, long y)
298 {
299     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
300     FIXME("(%p)->(%ld %ld)\n", This, x, y);
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI HTMLTxtRange_getBookmark(IHTMLTxtRange *iface, BSTR *Bookmark)
305 {
306     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
307     FIXME("(%p)->(%p)\n", This, Bookmark);
308     return E_NOTIMPL;
309 }
310
311 static HRESULT WINAPI HTMLTxtRange_moveToBookmark(IHTMLTxtRange *iface, BSTR Bookmark,
312         VARIANT_BOOL *Success)
313 {
314     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
315     FIXME("(%p)->(%s %p)\n", This, debugstr_w(Bookmark), Success);
316     return E_NOTIMPL;
317 }
318
319 static HRESULT WINAPI HTMLTxtRange_queryCommandSupported(IHTMLTxtRange *iface, BSTR cmdID,
320         VARIANT_BOOL *pfRet)
321 {
322     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
323     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
324     return E_NOTIMPL;
325 }
326
327 static HRESULT WINAPI HTMLTxtRange_queryCommandEnabled(IHTMLTxtRange *iface, BSTR cmdID,
328         VARIANT_BOOL *pfRet)
329 {
330     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
331     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
332     return E_NOTIMPL;
333 }
334
335 static HRESULT WINAPI HTMLTxtRange_queryCommandState(IHTMLTxtRange *iface, BSTR cmdID,
336         VARIANT_BOOL *pfRet)
337 {
338     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
339     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
340     return E_NOTIMPL;
341 }
342
343 static HRESULT WINAPI HTMLTxtRange_queryCommandIndeterm(IHTMLTxtRange *iface, BSTR cmdID,
344         VARIANT_BOOL *pfRet)
345 {
346     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
347     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
348     return E_NOTIMPL;
349 }
350
351 static HRESULT WINAPI HTMLTxtRange_queryCommandText(IHTMLTxtRange *iface, BSTR cmdID,
352         BSTR *pcmdText)
353 {
354     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
355     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pcmdText);
356     return E_NOTIMPL;
357 }
358
359 static HRESULT WINAPI HTMLTxtRange_queryCommandValue(IHTMLTxtRange *iface, BSTR cmdID,
360         VARIANT *pcmdValue)
361 {
362     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
363     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pcmdValue);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI HTMLTxtRange_execCommand(IHTMLTxtRange *iface, BSTR cmdID,
368         VARIANT_BOOL showUI, VARIANT value, VARIANT_BOOL *pfRet)
369 {
370     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
371     FIXME("(%p)->(%s %x v %p)\n", This, debugstr_w(cmdID), showUI, pfRet);
372     return E_NOTIMPL;
373 }
374
375 static HRESULT WINAPI HTMLTxtRange_execCommandShowHelp(IHTMLTxtRange *iface, BSTR cmdID,
376         VARIANT_BOOL *pfRet)
377 {
378     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
379     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
380     return E_NOTIMPL;
381 }
382
383 #undef HTMLTXTRANGE_THIS
384
385 static const IHTMLTxtRangeVtbl HTMLTxtRangeVtbl = {
386     HTMLTxtRange_QueryInterface,
387     HTMLTxtRange_AddRef,
388     HTMLTxtRange_Release,
389     HTMLTxtRange_GetTypeInfoCount,
390     HTMLTxtRange_GetTypeInfo,
391     HTMLTxtRange_GetIDsOfNames,
392     HTMLTxtRange_Invoke,
393     HTMLTxtRange_get_htmlText,
394     HTMLTxtRange_put_text,
395     HTMLTxtRange_get_text,
396     HTMLTxtRange_parentElement,
397     HTMLTxtRange_duplicate,
398     HTMLTxtRange_inRange,
399     HTMLTxtRange_isEqual,
400     HTMLTxtRange_scrollIntoView,
401     HTMLTxtRange_collapse,
402     HTMLTxtRange_expand,
403     HTMLTxtRange_move,
404     HTMLTxtRange_moveStart,
405     HTMLTxtRange_moveEnd,
406     HTMLTxtRange_select,
407     HTMLTxtRange_pasteHTML,
408     HTMLTxtRange_moveToElementText,
409     HTMLTxtRange_setEndPoint,
410     HTMLTxtRange_compareEndPoints,
411     HTMLTxtRange_findText,
412     HTMLTxtRange_moveToPoint,
413     HTMLTxtRange_getBookmark,
414     HTMLTxtRange_moveToBookmark,
415     HTMLTxtRange_queryCommandSupported,
416     HTMLTxtRange_queryCommandEnabled,
417     HTMLTxtRange_queryCommandState,
418     HTMLTxtRange_queryCommandIndeterm,
419     HTMLTxtRange_queryCommandText,
420     HTMLTxtRange_queryCommandValue,
421     HTMLTxtRange_execCommand,
422     HTMLTxtRange_execCommandShowHelp
423 };
424
425 IHTMLTxtRange *HTMLTxtRange_Create(nsISelection *nsselection)
426 {
427     HTMLTxtRange *ret = mshtml_alloc(sizeof(HTMLTxtRange));
428
429     ret->lpHTMLTxtRangeVtbl = &HTMLTxtRangeVtbl;
430     ret->ref = 1;
431
432     if(nsselection)
433         nsISelection_AddRef(nsselection);
434     ret->nsselection = nsselection;
435
436     return HTMLTXTRANGE(ret);
437 }