ReactOS 0.4.15-dev-7931-gfd331f1
gopher.c
Go to the documentation of this file.
1/*
2 * Copyright 2009 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 "urlmon_main.h"
20#include "wine/debug.h"
21
23
24typedef struct {
26
29
32
34{
36}
37
40{
42 BSTR url;
44
45 hres = IUri_GetAbsoluteUri(uri, &url);
46 if(FAILED(hres))
47 return hres;
48
49 This->base.request = InternetOpenUrlW(internet_session, url, NULL, 0,
50 request_flags, (DWORD_PTR)&This->base);
52 if (!This->base.request && GetLastError() != ERROR_IO_PENDING) {
53 WARN("InternetOpenUrl failed: %d\n", GetLastError());
54 return INET_E_RESOURCE_NOT_FOUND;
55 }
56
57 return S_OK;
58}
59
61{
62 return E_NOTIMPL;
63}
64
66{
67 return S_OK;
68}
69
71{
72}
73
75{
76 FIXME("(%p) %d - stub\n", prot, error);
77}
78
85};
86
88{
89 return CONTAINING_RECORD(iface, GopherProtocol, IInternetProtocol_iface);
90}
91
93{
95
96 *ppv = NULL;
98 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
99 *ppv = &This->IInternetProtocol_iface;
100 }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
101 TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
102 *ppv = &This->IInternetProtocol_iface;
103 }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
104 TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
105 *ppv = &This->IInternetProtocol_iface;
106 }else if(IsEqualGUID(&IID_IInternetPriority, riid)) {
107 TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv);
108 *ppv = &This->IInternetPriority_iface;
109 }
110
111 if(*ppv) {
112 IInternetProtocol_AddRef(iface);
113 return S_OK;
114 }
115
116 WARN("not supported interface %s\n", debugstr_guid(riid));
117 return E_NOINTERFACE;
118}
119
121{
124 TRACE("(%p) ref=%d\n", This, ref);
125 return ref;
126}
127
129{
132
133 TRACE("(%p) ref=%d\n", This, ref);
134
135 if(!ref) {
137
139 }
140
141 return ref;
142}
143
145 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
147{
149 IUri *uri;
151
152 TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink,
153 pOIBindInfo, grfPI, dwReserved);
154
155 hres = CreateUri(szUrl, 0, 0, &uri);
156 if(FAILED(hres))
157 return hres;
158
159 hres = protocol_start(&This->base, &This->IInternetProtocol_iface, uri, pOIProtSink,
160 pOIBindInfo);
161
162 IUri_Release(uri);
163 return hres;
164}
165
166static HRESULT WINAPI GopherProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
167{
169
170 TRACE("(%p)->(%p)\n", This, pProtocolData);
171
172 return protocol_continue(&This->base, pProtocolData);
173}
174
177{
179
180 TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
181
182 return protocol_abort(&This->base, hrReason);
183}
184
186{
188
189 TRACE("(%p)->(%08x)\n", This, dwOptions);
190
192 return S_OK;
193}
194
196{
198 FIXME("(%p)\n", This);
199 return E_NOTIMPL;
200}
201
203{
205 FIXME("(%p)\n", This);
206 return E_NOTIMPL;
207}
208
210 ULONG cb, ULONG *pcbRead)
211{
213
214 TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
215
216 return protocol_read(&This->base, pv, cb, pcbRead);
217}
218
220 DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
221{
223 FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
224 return E_NOTIMPL;
225}
226
228{
230
231 TRACE("(%p)->(%08x)\n", This, dwOptions);
232
233 return protocol_lock_request(&This->base);
234}
235
237{
239
240 TRACE("(%p)\n", This);
241
242 return protocol_unlock_request(&This->base);
243}
244
245static const IInternetProtocolVtbl GopherProtocolVtbl = {
259};
260
262{
263 return CONTAINING_RECORD(iface, GopherProtocol, IInternetPriority_iface);
264}
265
267{
269 return IInternetProtocol_QueryInterface(&This->IInternetProtocol_iface, riid, ppv);
270}
271
273{
275 return IInternetProtocol_AddRef(&This->IInternetProtocol_iface);
276}
277
279{
281 return IInternetProtocol_Release(&This->IInternetProtocol_iface);
282}
283
285{
287
288 TRACE("(%p)->(%d)\n", This, nPriority);
289
290 This->base.priority = nPriority;
291 return S_OK;
292}
293
295{
297
298 TRACE("(%p)->(%p)\n", This, pnPriority);
299
300 *pnPriority = This->base.priority;
301 return S_OK;
302}
303
304static const IInternetPriorityVtbl GopherPriorityVtbl = {
310};
311
313{
315
316 TRACE("(%p %p)\n", pUnkOuter, ppobj);
317
319
320 ret = heap_alloc_zero(sizeof(GopherProtocol));
321
322 ret->base.vtbl = &AsyncProtocolVtbl;
323 ret->IInternetProtocol_iface.lpVtbl = &GopherProtocolVtbl;
324 ret->IInternetPriority_iface.lpVtbl = &GopherPriorityVtbl;
325 ret->ref = 1;
326
327 *ppobj = &ret->IInternetProtocol_iface;
328
329 return S_OK;
330}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
unsigned long HANDLE_PTR
Definition: basetsd.h:78
const GUID IID_IUnknown
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
OLECHAR * BSTR
Definition: compat.h:2293
HRESULT protocol_lock_request(Protocol *protocol)
Definition: protocol.c:498
HRESULT protocol_abort(Protocol *protocol, HRESULT reason)
Definition: protocol.c:518
void protocol_close_connection(Protocol *protocol)
Definition: protocol.c:531
HRESULT protocol_unlock_request(Protocol *protocol)
Definition: protocol.c:506
static HINTERNET internet_session
Definition: protocol.c:288
HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data)
Definition: protocol.c:355
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5700
HINTERNET WINAPI InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl, LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:3722
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
#define error(str)
Definition: mkdosfs.c:1605
static const WCHAR url[]
Definition: encode.c:1432
static IInternetBindInfo bind_info
Definition: mimeole.c:1273
HRESULT hres
Definition: protocol.c:465
#define protocol_start(p, u, e)
Definition: protocol.c:303
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
static int protocol_read
Definition: htmldoc.c:205
const char * uri
Definition: sec_mgr.c:1588
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwOptions
Definition: solitaire.cpp:25
Protocol base
Definition: gopher.c:25
LONG ref
Definition: gopher.c:30
IInternetPriority IInternetPriority_iface
Definition: gopher.c:28
IInternetProtocol IInternetProtocol_iface
Definition: gopher.c:27
Definition: send.c:48
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
struct _LARGE_INTEGER::@2295 u
static const IInternetProtocolVtbl GopherProtocolVtbl
Definition: gopher.c:245
static HRESULT WINAPI GopherProtocol_Suspend(IInternetProtocol *iface)
Definition: gopher.c:195
static ULONG WINAPI GopherPriority_AddRef(IInternetPriority *iface)
Definition: gopher.c:272
static HRESULT WINAPI GopherPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
Definition: gopher.c:284
static ULONG WINAPI GopherProtocol_AddRef(IInternetProtocol *iface)
Definition: gopher.c:120
static HRESULT WINAPI GopherProtocol_UnlockRequest(IInternetProtocol *iface)
Definition: gopher.c:236
static HRESULT WINAPI GopherPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv)
Definition: gopher.c:266
static HRESULT WINAPI GopherProtocol_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: gopher.c:209
HRESULT GopherProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
Definition: gopher.c:312
static HRESULT GopherProtocol_end_request(Protocol *prot)
Definition: gopher.c:60
static ULONG WINAPI GopherPriority_Release(IInternetPriority *iface)
Definition: gopher.c:278
static HRESULT WINAPI GopherProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: gopher.c:144
static GopherProtocol * impl_from_IInternetPriority(IInternetPriority *iface)
Definition: gopher.c:261
static HRESULT GopherProtocol_start_downloading(Protocol *prot)
Definition: gopher.c:65
static const IInternetPriorityVtbl GopherPriorityVtbl
Definition: gopher.c:304
static HRESULT WINAPI GopherProtocol_Resume(IInternetProtocol *iface)
Definition: gopher.c:202
static GopherProtocol * impl_from_Protocol(Protocol *prot)
Definition: gopher.c:33
static HRESULT WINAPI GopherProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, DWORD dwOptions)
Definition: gopher.c:175
static GopherProtocol * impl_from_IInternetProtocol(IInternetProtocol *iface)
Definition: gopher.c:87
static HRESULT WINAPI GopherProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
Definition: gopher.c:227
static void GopherProtocol_on_error(Protocol *prot, DWORD error)
Definition: gopher.c:74
static HRESULT WINAPI GopherProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: gopher.c:219
static HRESULT WINAPI GopherPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
Definition: gopher.c:294
static HRESULT GopherProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info)
Definition: gopher.c:38
static const ProtocolVtbl AsyncProtocolVtbl
Definition: gopher.c:79
static HRESULT WINAPI GopherProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
Definition: gopher.c:166
static void GopherProtocol_close_connection(Protocol *prot)
Definition: gopher.c:70
static ULONG WINAPI GopherProtocol_Release(IInternetProtocol *iface)
Definition: gopher.c:128
static HRESULT WINAPI GopherProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
Definition: gopher.c:92
static HRESULT WINAPI GopherProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
Definition: gopher.c:185
static void URLMON_LockModule(void)
Definition: urlmon_main.h:68
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:69
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185