mshtml: Added hack to allow pass post data to IPersistMoniker::Load.
[wine] / dlls / mshtml / hlink.c
1 /*
2  * Copyright 2005-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  * License along with this library; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16  */
17
18 #include "config.h"
19
20 #include <stdarg.h>
21 #include <stdio.h>
22
23 #define COBJMACROS
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "ole2.h"
29
30 #include "wine/debug.h"
31 #include "wine/unicode.h"
32
33 #include "mshtml_private.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
36
37 /**********************************************************
38  * IHlinkTarget implementation
39  */
40
41 #define HLINKTRG_THIS(iface) DEFINE_THIS(HTMLDocument, HlinkTarget, iface)
42
43 static HRESULT WINAPI HlinkTarget_QueryInterface(IHlinkTarget *iface, REFIID riid, void **ppv)
44 {
45     HTMLDocument *This = HLINKTRG_THIS(iface);
46     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
47 }
48
49 static ULONG WINAPI HlinkTarget_AddRef(IHlinkTarget *iface)
50 {
51     HTMLDocument *This = HLINKTRG_THIS(iface);
52     return IHTMLDocument2_AddRef(HTMLDOC(This));
53 }
54
55 static ULONG WINAPI HlinkTarget_Release(IHlinkTarget *iface)
56 {
57     HTMLDocument *This = HLINKTRG_THIS(iface);
58     return IHTMLDocument2_Release(HTMLDOC(This));
59 }
60
61 static HRESULT WINAPI HlinkTarget_SetBrowseContext(IHlinkTarget *iface, IHlinkBrowseContext *pihlbc)
62 {
63     HTMLDocument *This = HLINKTRG_THIS(iface);
64     FIXME("(%p)->(%p)\n", This, pihlbc);
65     return E_NOTIMPL;
66 }
67
68 static HRESULT WINAPI HlinkTarget_GetBrowseContext(IHlinkTarget *iface, IHlinkBrowseContext **ppihlbc)
69 {
70     HTMLDocument *This = HLINKTRG_THIS(iface);
71     FIXME("(%p)->(%p)\n", This, ppihlbc);
72     return E_NOTIMPL;
73 }
74
75 static HRESULT WINAPI HlinkTarget_Navigate(IHlinkTarget *iface, DWORD grfHLNF, LPCWSTR pwzJumpLocation)
76 {
77     HTMLDocument *This = HLINKTRG_THIS(iface);
78
79     TRACE("(%p)->(%08lx %s)\n", This, grfHLNF, debugstr_w(pwzJumpLocation));
80
81     if(grfHLNF)
82         FIXME("Unsupported grfHLNF=%08lx\n", grfHLNF);
83     if(pwzJumpLocation)
84         FIXME("JumpLocation not supported\n");
85
86     return IOleObject_DoVerb(OLEOBJ(This), OLEIVERB_SHOW, NULL, NULL, -1, NULL, NULL);
87 }
88
89 static HRESULT WINAPI HlinkTarget_GetMoniker(IHlinkTarget *iface, LPCWSTR pwzLocation, DWORD dwAssign,
90         IMoniker **ppimkLocation)
91 {
92     HTMLDocument *This = HLINKTRG_THIS(iface);
93     FIXME("(%p)->(%s %08lx %p)\n", This, debugstr_w(pwzLocation), dwAssign, ppimkLocation);
94     return E_NOTIMPL;
95 }
96
97 static HRESULT WINAPI HlinkTarget_GetFriendlyName(IHlinkTarget *iface, LPCWSTR pwzLocation,
98         LPWSTR *ppwzFriendlyName)
99 {
100     HTMLDocument *This = HLINKTRG_THIS(iface);
101     FIXME("(%p)->(%s %p)\n", This, debugstr_w(pwzLocation), ppwzFriendlyName);
102     return E_NOTIMPL;
103 }
104
105 static const IHlinkTargetVtbl HlinkTargetVtbl = {
106     HlinkTarget_QueryInterface,
107     HlinkTarget_AddRef,
108     HlinkTarget_Release,
109     HlinkTarget_SetBrowseContext,
110     HlinkTarget_GetBrowseContext,
111     HlinkTarget_Navigate,
112     HlinkTarget_GetMoniker,
113     HlinkTarget_GetFriendlyName
114 };
115
116 void HTMLDocument_Hlink_Init(HTMLDocument *This)
117 {
118     This->lpHlinkTargetVtbl = &HlinkTargetVtbl;
119 }
120
121 typedef struct {
122     const IHlinkVtbl  *lpHlinkVtbl;
123
124     LONG ref;
125
126     IMoniker *mon;
127     LPWSTR location;
128 } Hlink;
129
130 #define HLINK(x)  ((IHlink*)  &(x)->lpHlinkVtbl)
131
132 #define HLINK_THIS(iface) DEFINE_THIS(Hlink, Hlink, iface)
133
134 static HRESULT WINAPI Hlink_QueryInterface(IHlink *iface, REFIID riid, void **ppv)
135 {
136     Hlink *This = HLINK_THIS(iface);
137
138     *ppv = NULL;
139
140     if(IsEqualGUID(&IID_IUnknown, riid)) {
141         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
142         *ppv = HLINK(This);
143     }else if(IsEqualGUID(&IID_IHlink, riid)) {
144         TRACE("(%p)->(IID_IHlink %p)\n", This, ppv);
145         *ppv = HLINK(This);
146     }
147
148     if(*ppv) {
149         IHlink_AddRef(HLINK(This));
150         return S_OK;
151     }
152
153     WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
154     return E_NOINTERFACE;
155 }
156
157 static ULONG WINAPI Hlink_AddRef(IHlink *iface)
158 {
159     Hlink *This = HLINK_THIS(iface);
160     LONG ref = InterlockedIncrement(&This->ref);
161
162     TRACE("(%p) ref=%ld\n", This, ref);
163
164     return ref;
165 }
166
167 static ULONG WINAPI Hlink_Release(IHlink *iface)
168 {
169     Hlink *This = HLINK_THIS(iface);
170     LONG ref = InterlockedDecrement(&This->ref);
171
172     TRACE("(%p) ref=%ld\n", This, ref);
173
174     if(!ref) {
175         if(This->mon)
176             IMoniker_Release(This->mon);
177         HeapFree(GetProcessHeap(), 0, This->location);
178         HeapFree(GetProcessHeap(), 0, This);
179     }
180
181     return ref;
182 }
183
184 static HRESULT WINAPI Hlink_SetHlinkSite(IHlink *iface, IHlinkSite *pihlSite, DWORD dwSiteData)
185 {
186     Hlink *This = HLINK_THIS(iface);
187     FIXME("(%p)->(%p %ld)\n", This, pihlSite, dwSiteData);
188     return E_NOTIMPL;
189 }
190
191 static HRESULT WINAPI Hlink_GetHlinkSite(IHlink *iface, IHlinkSite **ppihlSite,
192                                          DWORD *pdwSiteData)
193 {
194     Hlink *This = HLINK_THIS(iface);
195
196     TRACE("(%p)->(%p %p)\n", This, ppihlSite, pdwSiteData);
197
198     *ppihlSite = NULL;
199     return S_OK;
200 }
201
202 static HRESULT WINAPI Hlink_SetMonikerReference(IHlink *iface, DWORD grfHLSETF,
203                                                 IMoniker *pimkTarget, LPCWSTR pwzLocation)
204 {
205     Hlink *This = HLINK_THIS(iface);
206
207     TRACE("(%p)->(%08lx %p %s)\n", This, grfHLSETF, pimkTarget, debugstr_w(pwzLocation));
208
209     if(grfHLSETF)
210         FIXME("unsupported grfHLSETF=%08lx\n", grfHLSETF);
211
212     if(This->mon)
213         IMoniker_Release(This->mon);
214     if(This->location)
215         HeapFree(GetProcessHeap(), 0, This->location);
216
217     if(pimkTarget)
218         IMoniker_AddRef(pimkTarget);
219     This->mon = pimkTarget;
220
221     if(pwzLocation) {
222         DWORD len = strlenW(pwzLocation)+1;
223
224         This->location = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
225         memcpy(This->location, pwzLocation, len*sizeof(WCHAR));
226     }else {
227         This->location = NULL;
228     }
229
230     return S_OK;
231 }
232
233 static HRESULT WINAPI Hlink_GetMonikerReference(IHlink *iface, DWORD dwWhichRef,
234                                                 IMoniker **ppimkTarget, LPWSTR *ppwzLocation)
235 {
236     Hlink *This = HLINK_THIS(iface);
237
238     TRACE("(%p)->(%ld %p %p)\n", This, dwWhichRef, ppimkTarget, ppwzLocation);
239
240     if(dwWhichRef != 1)
241         FIXME("upsupported dwWhichRef = %ld\n", dwWhichRef);
242
243     if(This->mon)
244         IMoniker_AddRef(This->mon);
245     *ppimkTarget = This->mon;
246
247     if(This->location) {
248         DWORD len = strlenW(This->location)+1;
249
250         *ppwzLocation = CoTaskMemAlloc(len*sizeof(WCHAR));
251         memcpy(*ppwzLocation, This->location, len*sizeof(WCHAR));
252     }else {
253         *ppwzLocation = NULL;
254     }
255
256     return S_OK;
257 }
258
259 static HRESULT WINAPI Hlink_SetStringReference(IHlink *iface, DWORD grfHLSETF,
260                                                LPCWSTR pwzTarget, LPCWSTR pwzLocation)
261 {
262     Hlink *This = HLINK_THIS(iface);
263     FIXME("(%p)->(%08lx %s %s)\n", This, grfHLSETF, debugstr_w(pwzTarget),
264           debugstr_w(pwzLocation));
265     return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI Hlink_GetStringReference(IHlink *iface, DWORD dwWhichRef,
269                                                LPWSTR *ppwzTarget, LPWSTR *ppwzLocation)
270 {
271     Hlink *This = HLINK_THIS(iface);
272     FIXME("(%p)->(%ld %p %p)\n", This, dwWhichRef, ppwzTarget, ppwzLocation);
273     return E_NOTIMPL;
274 }
275
276 static HRESULT WINAPI Hlink_SetFriendlyName(IHlink *iface, LPCWSTR pwzFriendlyName)
277 {
278     Hlink *This = HLINK_THIS(iface);
279     FIXME("(%p)->(%s)\n", This, debugstr_w(pwzFriendlyName));
280     return E_NOTIMPL;
281 }
282
283 static HRESULT WINAPI Hlink_GetFriendlyName(IHlink *iface, DWORD grfHLNAMEF,
284                                             LPWSTR *ppwzFriendlyName)
285 {
286     Hlink *This = HLINK_THIS(iface);
287
288     TRACE("(%p)->(%08lx %p)\n", This, grfHLNAMEF, ppwzFriendlyName);
289
290     *ppwzFriendlyName = NULL;
291     return S_FALSE;
292 }
293
294 static HRESULT WINAPI Hlink_SetTargetFrameName(IHlink *iface, LPCWSTR pwzTargetFrameName)
295 {
296     Hlink *This = HLINK_THIS(iface);
297     FIXME("(%p)->(%s)\n", This, debugstr_w(pwzTargetFrameName));
298     return E_NOTIMPL;
299 }
300
301 static HRESULT WINAPI Hlink_GetTargetFrameName(IHlink *iface, LPWSTR *ppwzTargetFrameName)
302 {
303     Hlink *This = HLINK_THIS(iface);
304
305     TRACE("(%p)->(%p)\n", This, ppwzTargetFrameName);
306
307     *ppwzTargetFrameName = NULL;
308     return S_FALSE;
309 }
310
311 static HRESULT WINAPI Hlink_GetMiscStatus(IHlink *iface, DWORD *pdwStatus)
312 {
313     Hlink *This = HLINK_THIS(iface);
314     FIXME("(%p)->(%p)\n", This, pdwStatus);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI Hlink_Navigate(IHlink *iface, DWORD grfHLNF, LPBC pibc,
319         IBindStatusCallback *pibsc, IHlinkBrowseContext *pihlbc)
320 {
321     Hlink *This = HLINK_THIS(iface);
322     FIXME("(%p)->(%08lx %p %p %p)\n", This, grfHLNF, pibc, pibsc, pihlbc);
323     return E_NOTIMPL;
324 }
325
326 static HRESULT WINAPI Hlink_SetAdditionalParams(IHlink *iface, LPCWSTR pwzAdditionalParams)
327 {
328     Hlink *This = HLINK_THIS(iface);
329     FIXME("(%p)->(%s)\n", This, debugstr_w(pwzAdditionalParams));
330     return E_NOTIMPL;
331 }
332
333 static HRESULT WINAPI Hlink_GetAdditionalParams(IHlink *iface, LPWSTR *ppwzAdditionalParams)
334 {
335     Hlink *This = HLINK_THIS(iface);
336     FIXME("(%p)->(%p)\n", This, ppwzAdditionalParams);
337     return E_NOTIMPL;
338 }
339
340 #undef HLINK_THIS
341
342 static const IHlinkVtbl HlinkVtbl = {
343     Hlink_QueryInterface,
344     Hlink_AddRef,
345     Hlink_Release,
346     Hlink_SetHlinkSite,
347     Hlink_GetHlinkSite,
348     Hlink_SetMonikerReference,
349     Hlink_GetMonikerReference,
350     Hlink_SetStringReference,
351     Hlink_GetStringReference,
352     Hlink_SetFriendlyName,
353     Hlink_GetFriendlyName,
354     Hlink_SetTargetFrameName,
355     Hlink_GetTargetFrameName,
356     Hlink_GetMiscStatus,
357     Hlink_Navigate,
358     Hlink_SetAdditionalParams,
359     Hlink_GetAdditionalParams
360 };
361
362 IHlink *Hlink_Create(void)
363 {
364     Hlink *ret = HeapAlloc(GetProcessHeap(), 0, sizeof(Hlink));
365
366     ret->lpHlinkVtbl = &HlinkVtbl;
367     ret->ref = 1;
368     ret->mon = NULL;
369     ret->location = NULL;
370
371     return HLINK(ret);
372 }