mshtml: Fixed AsyncOpen implementation for channels without associated document.
[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     nsIDOMRange *nsrange;
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=%d\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=%d\n", This, ref);
93
94     if(!ref) {
95         if(This->nsrange)
96             nsISelection_Release(This->nsrange);
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 %u %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 %u %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)->(%d %s %d %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
142     TRACE("(%p)->(%p)\n", This, p);
143
144     *p = NULL;
145
146     if(This->nsrange) {
147         nsIDOMDocumentFragment *fragment;
148         nsresult nsres;
149
150         nsres = nsIDOMRange_CloneContents(This->nsrange, &fragment);
151         if(NS_SUCCEEDED(nsres)) {
152             const PRUnichar *nstext;
153             nsAString nsstr;
154
155             nsAString_Init(&nsstr, NULL);
156             nsnode_to_nsstring((nsIDOMNode*)fragment, &nsstr);
157             nsIDOMDocumentFragment_Release(fragment);
158
159             nsAString_GetData(&nsstr, &nstext, NULL);
160             *p = SysAllocString(nstext);
161
162             nsAString_Finish(&nsstr);
163         }
164     }
165
166     if(!*p) {
167         const WCHAR emptyW[] = {0};
168         *p = SysAllocString(emptyW);
169     }
170
171     TRACE("return %s\n", debugstr_w(*p));
172     return S_OK;
173 }
174
175 static HRESULT WINAPI HTMLTxtRange_put_text(IHTMLTxtRange *iface, BSTR v)
176 {
177     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
178     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
179     return E_NOTIMPL;
180 }
181
182 static HRESULT WINAPI HTMLTxtRange_get_text(IHTMLTxtRange *iface, BSTR *p)
183 {
184     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
185
186     TRACE("(%p)->(%p)\n", This, p);
187
188     *p = NULL;
189
190     if(This->nsrange) {
191         nsAString text_str;
192         nsresult nsres;
193
194         nsAString_Init(&text_str, NULL);
195
196         nsres = nsIDOMRange_ToString(This->nsrange, &text_str);
197         if(NS_SUCCEEDED(nsres)) {
198             const PRUnichar *nstext;
199
200             nsAString_GetData(&text_str, &nstext, NULL);
201             *p = SysAllocString(nstext);
202         }else {
203             ERR("ToString failed: %08x\n", nsres);
204         }
205
206         nsAString_Finish(&text_str);
207     }
208
209     if(!*p) {
210         static const WCHAR empty[] = {0};
211         *p = SysAllocString(empty);
212     }
213
214     return S_OK;
215 }
216
217 static HRESULT WINAPI HTMLTxtRange_parentElement(IHTMLTxtRange *iface, IHTMLElement **parent)
218 {
219     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
220     FIXME("(%p)->(%p)\n", This, parent);
221     return E_NOTIMPL;
222 }
223
224 static HRESULT WINAPI HTMLTxtRange_duplicate(IHTMLTxtRange *iface, IHTMLTxtRange **Duplicate)
225 {
226     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
227     FIXME("(%p)->(%p)\n", This, Duplicate);
228     return E_NOTIMPL;
229 }
230
231 static HRESULT WINAPI HTMLTxtRange_inRange(IHTMLTxtRange *iface, IHTMLTxtRange *Range,
232         VARIANT_BOOL *InRange)
233 {
234     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
235     FIXME("(%p)->(%p %p)\n", This, Range, InRange);
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI HTMLTxtRange_isEqual(IHTMLTxtRange *iface, IHTMLTxtRange *Range,
240         VARIANT_BOOL *IsEqual)
241 {
242     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
243     FIXME("(%p)->()\n", This);
244     return E_NOTIMPL;
245 }
246
247 static HRESULT WINAPI HTMLTxtRange_scrollIntoView(IHTMLTxtRange *iface, VARIANT_BOOL fStart)
248 {
249     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
250     FIXME("(%p)->(%x)\n", This, fStart);
251     return E_NOTIMPL;
252 }
253
254 static HRESULT WINAPI HTMLTxtRange_collapse(IHTMLTxtRange *iface, VARIANT_BOOL Start)
255 {
256     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
257     FIXME("(%p)->(%x)\n", This, Start);
258     return E_NOTIMPL;
259 }
260
261 static HRESULT WINAPI HTMLTxtRange_expand(IHTMLTxtRange *iface, BSTR Unit, VARIANT_BOOL *Success)
262 {
263     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
264     FIXME("(%p)->(%s %p)\n", This, debugstr_w(Unit), Success);
265     return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI HTMLTxtRange_move(IHTMLTxtRange *iface, BSTR Unit,
269         long Count, long *ActualCount)
270 {
271     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
272     FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount);
273     return E_NOTIMPL;
274 }
275
276 static HRESULT WINAPI HTMLTxtRange_moveStart(IHTMLTxtRange *iface, BSTR Unit,
277         long Count, long *ActualCount)
278 {
279     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
280     FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount);
281     return E_NOTIMPL;
282 }
283
284 static HRESULT WINAPI HTMLTxtRange_moveEnd(IHTMLTxtRange *iface, BSTR Unit,
285         long Count, long *ActualCount)
286 {
287     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
288     FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(Unit), Count, ActualCount);
289     return E_NOTIMPL;
290 }
291
292 static HRESULT WINAPI HTMLTxtRange_select(IHTMLTxtRange *iface)
293 {
294     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
295     FIXME("(%p)->()\n", This);
296     return E_NOTIMPL;
297 }
298
299 static HRESULT WINAPI HTMLTxtRange_pasteHTML(IHTMLTxtRange *iface, BSTR html)
300 {
301     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
302     FIXME("(%p)->(%s)\n", This, debugstr_w(html));
303     return E_NOTIMPL;
304 }
305
306 static HRESULT WINAPI HTMLTxtRange_moveToElementText(IHTMLTxtRange *iface, IHTMLElement *element)
307 {
308     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
309     FIXME("(%p)->(%p)\n", This, element);
310     return E_NOTIMPL;
311 }
312
313 static HRESULT WINAPI HTMLTxtRange_setEndPoint(IHTMLTxtRange *iface, BSTR how,
314         IHTMLTxtRange *SourceRange)
315 {
316     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
317     FIXME("(%p)->(%s %p)\n", This, debugstr_w(how), SourceRange);
318     return E_NOTIMPL;
319 }
320
321 static HRESULT WINAPI HTMLTxtRange_compareEndPoints(IHTMLTxtRange *iface, BSTR how,
322         IHTMLTxtRange *SourceRange, long *ret)
323 {
324     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
325     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(how), SourceRange, ret);
326     return E_NOTIMPL;
327 }
328
329 static HRESULT WINAPI HTMLTxtRange_findText(IHTMLTxtRange *iface, BSTR String,
330         long count, long Flags, VARIANT_BOOL *Success)
331 {
332     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
333     FIXME("(%p)->(%s %ld %08lx %p)\n", This, debugstr_w(String), count, Flags, Success);
334     return E_NOTIMPL;
335 }
336
337 static HRESULT WINAPI HTMLTxtRange_moveToPoint(IHTMLTxtRange *iface, long x, long y)
338 {
339     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
340     FIXME("(%p)->(%ld %ld)\n", This, x, y);
341     return E_NOTIMPL;
342 }
343
344 static HRESULT WINAPI HTMLTxtRange_getBookmark(IHTMLTxtRange *iface, BSTR *Bookmark)
345 {
346     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
347     FIXME("(%p)->(%p)\n", This, Bookmark);
348     return E_NOTIMPL;
349 }
350
351 static HRESULT WINAPI HTMLTxtRange_moveToBookmark(IHTMLTxtRange *iface, BSTR Bookmark,
352         VARIANT_BOOL *Success)
353 {
354     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
355     FIXME("(%p)->(%s %p)\n", This, debugstr_w(Bookmark), Success);
356     return E_NOTIMPL;
357 }
358
359 static HRESULT WINAPI HTMLTxtRange_queryCommandSupported(IHTMLTxtRange *iface, BSTR cmdID,
360         VARIANT_BOOL *pfRet)
361 {
362     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
363     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI HTMLTxtRange_queryCommandEnabled(IHTMLTxtRange *iface, BSTR cmdID,
368         VARIANT_BOOL *pfRet)
369 {
370     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
371     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
372     return E_NOTIMPL;
373 }
374
375 static HRESULT WINAPI HTMLTxtRange_queryCommandState(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 static HRESULT WINAPI HTMLTxtRange_queryCommandIndeterm(IHTMLTxtRange *iface, BSTR cmdID,
384         VARIANT_BOOL *pfRet)
385 {
386     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
387     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
388     return E_NOTIMPL;
389 }
390
391 static HRESULT WINAPI HTMLTxtRange_queryCommandText(IHTMLTxtRange *iface, BSTR cmdID,
392         BSTR *pcmdText)
393 {
394     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
395     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pcmdText);
396     return E_NOTIMPL;
397 }
398
399 static HRESULT WINAPI HTMLTxtRange_queryCommandValue(IHTMLTxtRange *iface, BSTR cmdID,
400         VARIANT *pcmdValue)
401 {
402     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
403     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pcmdValue);
404     return E_NOTIMPL;
405 }
406
407 static HRESULT WINAPI HTMLTxtRange_execCommand(IHTMLTxtRange *iface, BSTR cmdID,
408         VARIANT_BOOL showUI, VARIANT value, VARIANT_BOOL *pfRet)
409 {
410     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
411     FIXME("(%p)->(%s %x v %p)\n", This, debugstr_w(cmdID), showUI, pfRet);
412     return E_NOTIMPL;
413 }
414
415 static HRESULT WINAPI HTMLTxtRange_execCommandShowHelp(IHTMLTxtRange *iface, BSTR cmdID,
416         VARIANT_BOOL *pfRet)
417 {
418     HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
419     FIXME("(%p)->(%s %p)\n", This, debugstr_w(cmdID), pfRet);
420     return E_NOTIMPL;
421 }
422
423 #undef HTMLTXTRANGE_THIS
424
425 static const IHTMLTxtRangeVtbl HTMLTxtRangeVtbl = {
426     HTMLTxtRange_QueryInterface,
427     HTMLTxtRange_AddRef,
428     HTMLTxtRange_Release,
429     HTMLTxtRange_GetTypeInfoCount,
430     HTMLTxtRange_GetTypeInfo,
431     HTMLTxtRange_GetIDsOfNames,
432     HTMLTxtRange_Invoke,
433     HTMLTxtRange_get_htmlText,
434     HTMLTxtRange_put_text,
435     HTMLTxtRange_get_text,
436     HTMLTxtRange_parentElement,
437     HTMLTxtRange_duplicate,
438     HTMLTxtRange_inRange,
439     HTMLTxtRange_isEqual,
440     HTMLTxtRange_scrollIntoView,
441     HTMLTxtRange_collapse,
442     HTMLTxtRange_expand,
443     HTMLTxtRange_move,
444     HTMLTxtRange_moveStart,
445     HTMLTxtRange_moveEnd,
446     HTMLTxtRange_select,
447     HTMLTxtRange_pasteHTML,
448     HTMLTxtRange_moveToElementText,
449     HTMLTxtRange_setEndPoint,
450     HTMLTxtRange_compareEndPoints,
451     HTMLTxtRange_findText,
452     HTMLTxtRange_moveToPoint,
453     HTMLTxtRange_getBookmark,
454     HTMLTxtRange_moveToBookmark,
455     HTMLTxtRange_queryCommandSupported,
456     HTMLTxtRange_queryCommandEnabled,
457     HTMLTxtRange_queryCommandState,
458     HTMLTxtRange_queryCommandIndeterm,
459     HTMLTxtRange_queryCommandText,
460     HTMLTxtRange_queryCommandValue,
461     HTMLTxtRange_execCommand,
462     HTMLTxtRange_execCommandShowHelp
463 };
464
465 IHTMLTxtRange *HTMLTxtRange_Create(nsIDOMRange *nsrange)
466 {
467     HTMLTxtRange *ret = mshtml_alloc(sizeof(HTMLTxtRange));
468
469     ret->lpHTMLTxtRangeVtbl = &HTMLTxtRangeVtbl;
470     ret->ref = 1;
471
472     if(nsrange)
473         nsIDOMRange_AddRef(nsrange);
474     ret->nsrange = nsrange;
475
476     return HTMLTXTRANGE(ret);
477 }