ReactOS  0.4.12-dev-934-g9a4676f
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 
24 typedef struct {
26 
29 
32 
34 {
35  return CONTAINING_RECORD(prot, GopherProtocol, base);
36 }
37 
38 static HRESULT GopherProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags,
40 {
42  BSTR url;
43  HRESULT hres;
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) {
136  heap_free(This);
137 
139  }
140 
141  return ref;
142 }
143 
145  IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
146  DWORD grfPI, HANDLE_PTR dwReserved)
147 {
149  IUri *uri;
150  HRESULT hres;
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 
166 static 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 
245 static 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 
304 static 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 void GopherProtocol_close_connection(Protocol *prot)
Definition: gopher.c:70
DWORD dwOptions
Definition: solitaire.cpp:23
static ULONG WINAPI GopherPriority_Release(IInternetPriority *iface)
Definition: gopher.c:278
HRESULT protocol_unlock_request(Protocol *protocol)
Definition: protocol.c:506
#define REFIID
Definition: guiddef.h:113
#define E_NOINTERFACE
Definition: winerror.h:2364
Protocol base
Definition: gopher.c:25
#define error(str)
Definition: mkdosfs.c:1605
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
static const IInternetPriorityVtbl GopherPriorityVtbl
Definition: gopher.c:304
const char * uri
Definition: sec_mgr.c:1594
REFIID riid
Definition: precomp.h:44
static HRESULT WINAPI GopherProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: gopher.c:219
#define WARN(fmt,...)
Definition: debug.h:111
REFIID LPVOID * ppv
Definition: atlbase.h:39
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
static HRESULT WINAPI GopherProtocol_Resume(IInternetProtocol *iface)
Definition: gopher.c:202
static HINTERNET internet_session
Definition: protocol.c:288
LONG ref
Definition: gopher.c:30
static HRESULT GopherProtocol_start_downloading(Protocol *prot)
Definition: gopher.c:65
OLECHAR * BSTR
Definition: compat.h:1927
static GopherProtocol * impl_from_Protocol(Protocol *prot)
Definition: gopher.c:33
#define ERROR_IO_PENDING
Definition: dderror.h:15
Definition: send.c:47
void protocol_close_connection(Protocol *protocol)
Definition: protocol.c:531
HINTERNET WINAPI InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl, LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:3608
static HRESULT WINAPI GopherPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
Definition: gopher.c:284
static HRESULT WINAPI GopherProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
Definition: gopher.c:92
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:90
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
static void GopherProtocol_on_error(Protocol *prot, DWORD error)
Definition: gopher.c:74
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
static HRESULT WINAPI GopherPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv)
Definition: gopher.c:266
#define protocol_start(p, u, e)
Definition: protocol.c:303
smooth NULL
Definition: ftsmooth.c:416
HRESULT protocol_abort(Protocol *protocol, HRESULT reason)
Definition: protocol.c:518
static HRESULT WINAPI GopherProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
Definition: gopher.c:227
static HRESULT WINAPI GopherProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: gopher.c:144
#define debugstr_guid
Definition: kernel32.h:35
static const IInternetProtocolVtbl GopherProtocolVtbl
Definition: gopher.c:245
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static HRESULT WINAPI GopherProtocol_UnlockRequest(IInternetProtocol *iface)
Definition: gopher.c:236
static HRESULT WINAPI GopherProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
Definition: gopher.c:185
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:64
static ULONG WINAPI GopherPriority_AddRef(IInternetPriority *iface)
Definition: gopher.c:272
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT hres
Definition: protocol.c:465
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR url[]
Definition: encode.c:1432
static GopherProtocol * impl_from_IInternetPriority(IInternetPriority *iface)
Definition: gopher.c:261
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
static DWORD cb
Definition: integrity.c:41
static int protocol_read
Definition: htmldoc.c:205
HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data)
Definition: protocol.c:355
static HRESULT WINAPI GopherPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
Definition: gopher.c:294
int ret
static HRESULT WINAPI GopherProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
Definition: gopher.c:166
#define InterlockedDecrement
Definition: armddk.h:52
HRESULT protocol_lock_request(Protocol *protocol)
Definition: protocol.c:498
HRESULT GopherProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
Definition: gopher.c:312
uint32_t DWORD_PTR
Definition: typedefs.h:63
static GopherProtocol * impl_from_IInternetProtocol(IInternetProtocol *iface)
Definition: gopher.c:87
static HRESULT WINAPI GopherProtocol_Suspend(IInternetProtocol *iface)
Definition: gopher.c:195
IInternetProtocol IInternetProtocol_iface
Definition: gopher.c:27
static HRESULT GopherProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info)
Definition: gopher.c:38
static HRESULT WINAPI GopherProtocol_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: gopher.c:209
static const ProtocolVtbl AsyncProtocolVtbl
Definition: gopher.c:79
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
unsigned long HANDLE_PTR
Definition: basetsd.h:78
#define E_NOTIMPL
Definition: ddrawi.h:99
static ULONG WINAPI GopherProtocol_Release(IInternetProtocol *iface)
Definition: gopher.c:128
IInternetPriority IInternetPriority_iface
Definition: gopher.c:28
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:274
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
static HRESULT GopherProtocol_end_request(Protocol *prot)
Definition: gopher.c:60
static IInternetBindInfo bind_info
Definition: mimeole.c:1273
struct _LARGE_INTEGER::@2192 u
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5701
unsigned int ULONG
Definition: retypes.h:1
WINE_DEFAULT_DEBUG_CHANNEL(urlmon)
static HRESULT WINAPI GopherProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, DWORD dwOptions)
Definition: gopher.c:175
static void URLMON_LockModule(void)
Definition: urlmon_main.h:63
static ULONG WINAPI GopherProtocol_AddRef(IInternetProtocol *iface)
Definition: gopher.c:120
static BOOL heap_free(void *mem)
Definition: appwiz.h:75