mshtml: Fix typo in WARN.
[wine] / dlls / mshtml / htmllocation.c
1 /*
2  * Copyright 2008 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 <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "winreg.h"
27 #include "ole2.h"
28 #include "wininet.h"
29 #include "shlwapi.h"
30
31 #include "wine/debug.h"
32
33 #include "mshtml_private.h"
34 #include "resource.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
37
38 static HRESULT get_url(HTMLLocation *This, const WCHAR **ret)
39 {
40     if(!This->window || !This->window->doc_obj || !This->window->doc_obj->url) {
41         FIXME("No current URL\n");
42         return E_NOTIMPL;
43     }
44
45     *ret = This->window->doc_obj->url;
46     return S_OK;
47 }
48
49
50 #define HTMLLOCATION_THIS(iface) DEFINE_THIS(HTMLLocation, HTMLLocation, iface)
51
52 static HRESULT WINAPI HTMLLocation_QueryInterface(IHTMLLocation *iface, REFIID riid, void **ppv)
53 {
54     HTMLLocation *This = HTMLLOCATION_THIS(iface);
55
56     *ppv = NULL;
57
58     if(IsEqualGUID(&IID_IUnknown, riid)) {
59         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
60         *ppv = HTMLLOCATION(This);
61     }else if(IsEqualGUID(&IID_IHTMLLocation, riid)) {
62         TRACE("(%p)->(IID_IHTMLLocation %p)\n", This, ppv);
63         *ppv = HTMLLOCATION(This);
64     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
65         return *ppv ? S_OK : E_NOINTERFACE;
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 HTMLLocation_AddRef(IHTMLLocation *iface)
78 {
79     HTMLLocation *This = HTMLLOCATION_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 HTMLLocation_Release(IHTMLLocation *iface)
88 {
89     HTMLLocation *This = HTMLLOCATION_THIS(iface);
90     LONG ref = InterlockedDecrement(&This->ref);
91
92     TRACE("(%p) ref=%d\n", This, ref);
93
94     if(!ref) {
95         if(This->window)
96             This->window->location = NULL;
97         release_dispex(&This->dispex);
98         heap_free(This);
99     }
100
101     return ref;
102 }
103
104 static HRESULT WINAPI HTMLLocation_GetTypeInfoCount(IHTMLLocation *iface, UINT *pctinfo)
105 {
106     HTMLLocation *This = HTMLLOCATION_THIS(iface);
107     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo);
108 }
109
110 static HRESULT WINAPI HTMLLocation_GetTypeInfo(IHTMLLocation *iface, UINT iTInfo,
111                                               LCID lcid, ITypeInfo **ppTInfo)
112 {
113     HTMLLocation *This = HTMLLOCATION_THIS(iface);
114     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
115 }
116
117 static HRESULT WINAPI HTMLLocation_GetIDsOfNames(IHTMLLocation *iface, REFIID riid,
118                                                 LPOLESTR *rgszNames, UINT cNames,
119                                                 LCID lcid, DISPID *rgDispId)
120 {
121     HTMLLocation *This = HTMLLOCATION_THIS(iface);
122     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
123 }
124
125 static HRESULT WINAPI HTMLLocation_Invoke(IHTMLLocation *iface, DISPID dispIdMember,
126                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
127                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
128 {
129     HTMLLocation *This = HTMLLOCATION_THIS(iface);
130     return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid,
131             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
132 }
133
134 static HRESULT WINAPI HTMLLocation_put_href(IHTMLLocation *iface, BSTR v)
135 {
136     HTMLLocation *This = HTMLLOCATION_THIS(iface);
137     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
138     return E_NOTIMPL;
139 }
140
141 static HRESULT WINAPI HTMLLocation_get_href(IHTMLLocation *iface, BSTR *p)
142 {
143     HTMLLocation *This = HTMLLOCATION_THIS(iface);
144     const WCHAR *url;
145     HRESULT hres;
146
147     TRACE("(%p)->(%p)\n", This, p);
148
149     if(!p)
150         return E_POINTER;
151
152     hres = get_url(This, &url);
153     if(FAILED(hres))
154         return hres;
155
156     *p = SysAllocString(url);
157     return *p ? S_OK : E_OUTOFMEMORY;
158 }
159
160 static HRESULT WINAPI HTMLLocation_put_protocol(IHTMLLocation *iface, BSTR v)
161 {
162     HTMLLocation *This = HTMLLOCATION_THIS(iface);
163     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
164     return E_NOTIMPL;
165 }
166
167 static HRESULT WINAPI HTMLLocation_get_protocol(IHTMLLocation *iface, BSTR *p)
168 {
169     HTMLLocation *This = HTMLLOCATION_THIS(iface);
170     FIXME("(%p)->(%p)\n", This, p);
171
172     if(!p)
173         return E_POINTER;
174
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI HTMLLocation_put_host(IHTMLLocation *iface, BSTR v)
179 {
180     HTMLLocation *This = HTMLLOCATION_THIS(iface);
181     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI HTMLLocation_get_host(IHTMLLocation *iface, BSTR *p)
186 {
187     HTMLLocation *This = HTMLLOCATION_THIS(iface);
188     FIXME("(%p)->(%p)\n", This, p);
189
190     if(!p)
191         return E_POINTER;
192
193     return E_NOTIMPL;
194 }
195
196 static HRESULT WINAPI HTMLLocation_put_hostname(IHTMLLocation *iface, BSTR v)
197 {
198     HTMLLocation *This = HTMLLOCATION_THIS(iface);
199     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
200     return E_NOTIMPL;
201 }
202
203 static HRESULT WINAPI HTMLLocation_get_hostname(IHTMLLocation *iface, BSTR *p)
204 {
205     HTMLLocation *This = HTMLLOCATION_THIS(iface);
206     FIXME("(%p)->(%p)\n", This, p);
207
208     if(!p)
209         return E_POINTER;
210
211     return E_NOTIMPL;
212 }
213
214 static HRESULT WINAPI HTMLLocation_put_port(IHTMLLocation *iface, BSTR v)
215 {
216     HTMLLocation *This = HTMLLOCATION_THIS(iface);
217     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
218     return E_NOTIMPL;
219 }
220
221 static HRESULT WINAPI HTMLLocation_get_port(IHTMLLocation *iface, BSTR *p)
222 {
223     HTMLLocation *This = HTMLLOCATION_THIS(iface);
224     FIXME("(%p)->(%p)\n", This, p);
225
226     if(!p)
227         return E_POINTER;
228
229     return E_NOTIMPL;
230 }
231
232 static HRESULT WINAPI HTMLLocation_put_pathname(IHTMLLocation *iface, BSTR v)
233 {
234     HTMLLocation *This = HTMLLOCATION_THIS(iface);
235     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI HTMLLocation_get_pathname(IHTMLLocation *iface, BSTR *p)
240 {
241     HTMLLocation *This = HTMLLOCATION_THIS(iface);
242     WCHAR buf[INTERNET_MAX_PATH_LENGTH];
243     URL_COMPONENTSW url = {sizeof(url)};
244     const WCHAR *doc_url;
245     DWORD size = 0;
246     HRESULT hres;
247
248     TRACE("(%p)->(%p)\n", This, p);
249
250     if(!p)
251         return E_POINTER;
252
253     hres = get_url(This, &doc_url);
254     if(FAILED(hres))
255         return hres;
256
257     hres = CoInternetParseUrl(doc_url, PARSE_PATH_FROM_URL, 0, buf, sizeof(buf), &size, 0);
258     if(SUCCEEDED(hres)) {
259         *p = SysAllocString(buf);
260         if(!*p)
261             return E_OUTOFMEMORY;
262         return S_OK;
263     }
264
265     url.dwUrlPathLength = 1;
266     if(!InternetCrackUrlW(doc_url, 0, 0, &url)) {
267         FIXME("InternetCrackUrl failed\n");
268         return E_FAIL;
269     }
270
271     if(!url.dwUrlPathLength) {
272         *p = NULL;
273         return S_OK;
274     }
275
276     *p = SysAllocStringLen(url.lpszUrlPath, url.dwUrlPathLength);
277     if(!*p)
278         return E_OUTOFMEMORY;
279     return S_OK;
280 }
281
282 static HRESULT WINAPI HTMLLocation_put_search(IHTMLLocation *iface, BSTR v)
283 {
284     HTMLLocation *This = HTMLLOCATION_THIS(iface);
285     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
286     return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI HTMLLocation_get_search(IHTMLLocation *iface, BSTR *p)
290 {
291     HTMLLocation *This = HTMLLOCATION_THIS(iface);
292     FIXME("(%p)->(%p)\n", This, p);
293
294     if(!p)
295         return E_POINTER;
296
297     return E_NOTIMPL;
298 }
299
300 static HRESULT WINAPI HTMLLocation_put_hash(IHTMLLocation *iface, BSTR v)
301 {
302     HTMLLocation *This = HTMLLOCATION_THIS(iface);
303     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI HTMLLocation_get_hash(IHTMLLocation *iface, BSTR *p)
308 {
309     HTMLLocation *This = HTMLLOCATION_THIS(iface);
310     FIXME("(%p)->(%p)\n", This, p);
311
312     if(!p)
313         return E_POINTER;
314
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI HTMLLocation_reload(IHTMLLocation *iface, VARIANT_BOOL flag)
319 {
320     HTMLLocation *This = HTMLLOCATION_THIS(iface);
321     FIXME("(%p)->(%x)\n", This, flag);
322     return E_NOTIMPL;
323 }
324
325 static HRESULT WINAPI HTMLLocation_replace(IHTMLLocation *iface, BSTR bstr)
326 {
327     HTMLLocation *This = HTMLLOCATION_THIS(iface);
328     FIXME("(%p)->(%s)\n", This, debugstr_w(bstr));
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI HTMLLocation_assign(IHTMLLocation *iface, BSTR bstr)
333 {
334     HTMLLocation *This = HTMLLOCATION_THIS(iface);
335     FIXME("(%p)->(%s)\n", This, debugstr_w(bstr));
336     return E_NOTIMPL;
337 }
338
339 static HRESULT WINAPI HTMLLocation_toString(IHTMLLocation *iface, BSTR *String)
340 {
341     HTMLLocation *This = HTMLLOCATION_THIS(iface);
342     FIXME("(%p)->(%p)\n", This, String);
343     return E_NOTIMPL;
344 }
345
346 #undef HTMLLOCATION_THIS
347
348 static const IHTMLLocationVtbl HTMLLocationVtbl = {
349     HTMLLocation_QueryInterface,
350     HTMLLocation_AddRef,
351     HTMLLocation_Release,
352     HTMLLocation_GetTypeInfoCount,
353     HTMLLocation_GetTypeInfo,
354     HTMLLocation_GetIDsOfNames,
355     HTMLLocation_Invoke,
356     HTMLLocation_put_href,
357     HTMLLocation_get_href,
358     HTMLLocation_put_protocol,
359     HTMLLocation_get_protocol,
360     HTMLLocation_put_host,
361     HTMLLocation_get_host,
362     HTMLLocation_put_hostname,
363     HTMLLocation_get_hostname,
364     HTMLLocation_put_port,
365     HTMLLocation_get_port,
366     HTMLLocation_put_pathname,
367     HTMLLocation_get_pathname,
368     HTMLLocation_put_search,
369     HTMLLocation_get_search,
370     HTMLLocation_put_hash,
371     HTMLLocation_get_hash,
372     HTMLLocation_reload,
373     HTMLLocation_replace,
374     HTMLLocation_assign,
375     HTMLLocation_toString
376 };
377
378 static const tid_t HTMLLocation_iface_tids[] = {
379     IHTMLLocation_tid,
380     0
381 };
382 static dispex_static_data_t HTMLLocation_dispex = {
383     NULL,
384     DispHTMLLocation_tid,
385     NULL,
386     HTMLLocation_iface_tids
387 };
388
389
390 HRESULT HTMLLocation_Create(HTMLWindow *window, HTMLLocation **ret)
391 {
392     HTMLLocation *location;
393
394     location = heap_alloc(sizeof(*location));
395     if(!location)
396         return E_OUTOFMEMORY;
397
398     location->lpHTMLLocationVtbl = &HTMLLocationVtbl;
399     location->ref = 1;
400     location->window = window;
401
402     init_dispex(&location->dispex, (IUnknown*)HTMLLOCATION(location),  &HTMLLocation_dispex);
403
404     *ret = location;
405     return S_OK;
406 }