ReactOS  0.4.13-dev-257-gfabbd7c
ftp.c
Go to the documentation of this file.
1 /*
2  * Copyright 2005-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 
21 #define NO_SHLWAPI_REG
22 #include "shlwapi.h"
23 
24 #include "wine/debug.h"
25 
27 
28 typedef struct {
30 
35 
38 } FtpProtocol;
39 
40 static inline FtpProtocol *impl_from_IUnknown(IUnknown *iface)
41 {
42  return CONTAINING_RECORD(iface, FtpProtocol, IUnknown_outer);
43 }
44 
46 {
47  return CONTAINING_RECORD(iface, FtpProtocol, IInternetProtocolEx_iface);
48 }
49 
51 {
52  return CONTAINING_RECORD(iface, FtpProtocol, IInternetPriority_iface);
53 }
55 
56 {
57  return CONTAINING_RECORD(iface, FtpProtocol, IWinInetHttpInfo_iface);
58 }
59 
61 {
62  return CONTAINING_RECORD(prot, FtpProtocol, base);
63 }
64 
65 static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags,
67 {
69  BSTR url;
70  HRESULT hres;
71 
72  hres = IUri_GetAbsoluteUri(uri, &url);
73  if(FAILED(hres))
74  return hres;
75 
76  This->base.request = InternetOpenUrlW(internet_session, url, NULL, 0,
78  (DWORD_PTR)&This->base);
80  if (!This->base.request && GetLastError() != ERROR_IO_PENDING) {
81  WARN("InternetOpenUrl failed: %d\n", GetLastError());
82  return INET_E_RESOURCE_NOT_FOUND;
83  }
84 
85  return S_OK;
86 }
87 
89 {
90  return E_NOTIMPL;
91 }
92 
94 {
96  DWORD size;
97  BOOL res;
98 
99  res = FtpGetFileSize(This->base.request, &size);
100  if(res)
101  This->base.content_length = size;
102  else
103  WARN("FtpGetFileSize failed: %d\n", GetLastError());
104 
105  return S_OK;
106 }
107 
109 {
110 }
111 
113 {
114  FIXME("(%p) %d - stub\n", prot, error);
115 }
116 
123 };
124 
126 {
128 
129  if(IsEqualGUID(&IID_IUnknown, riid)) {
130  TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
131  *ppv = &This->IUnknown_outer;
132  }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
133  TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
134  *ppv = &This->IInternetProtocolEx_iface;
135  }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
136  TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
137  *ppv = &This->IInternetProtocolEx_iface;
138  }else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
139  TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv);
140  *ppv = &This->IInternetProtocolEx_iface;
141  }else if(IsEqualGUID(&IID_IInternetPriority, riid)) {
142  TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv);
143  *ppv = &This->IInternetPriority_iface;
144  }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) {
145  TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv);
146  *ppv = &This->IWinInetHttpInfo_iface;
147  }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
148  TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv);
149  *ppv = &This->IWinInetHttpInfo_iface;
150  }else {
151  *ppv = NULL;
152  WARN("not supported interface %s\n", debugstr_guid(riid));
153  return E_NOINTERFACE;
154  }
155 
156  IUnknown_AddRef((IUnknown*)*ppv);
157  return S_OK;
158 }
159 
161 {
164  TRACE("(%p) ref=%d\n", This, ref);
165  return ref;
166 }
167 
169 {
172 
173  TRACE("(%p) ref=%d\n", This, ref);
174 
175  if(!ref) {
177  heap_free(This);
178 
180  }
181 
182  return ref;
183 }
184 
185 static const IUnknownVtbl FtpProtocolUnkVtbl = {
189 };
190 
192 {
194  TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
195  return IUnknown_QueryInterface(This->outer, riid, ppv);
196 }
197 
199 {
201  TRACE("(%p)\n", This);
202  return IUnknown_AddRef(This->outer);
203 }
204 
206 {
208  TRACE("(%p)\n", This);
209  return IUnknown_Release(This->outer);
210 }
211 
213  IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
214  DWORD grfPI, HANDLE_PTR dwReserved)
215 {
217  IUri *uri;
218  HRESULT hres;
219 
220  TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink,
221  pOIBindInfo, grfPI, dwReserved);
222 
223  hres = CreateUri(szUrl, 0, 0, &uri);
224  if(FAILED(hres))
225  return hres;
226 
227  hres = IInternetProtocolEx_StartEx(&This->IInternetProtocolEx_iface, uri, pOIProtSink,
228  pOIBindInfo, grfPI, (HANDLE*)dwReserved);
229 
230  IUri_Release(uri);
231  return hres;
232 }
233 
234 static HRESULT WINAPI FtpProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
235 {
237 
238  TRACE("(%p)->(%p)\n", This, pProtocolData);
239 
240  return protocol_continue(&This->base, pProtocolData);
241 }
242 
245 {
247 
248  TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
249 
250  return protocol_abort(&This->base, hrReason);
251 }
252 
254 {
256 
257  TRACE("(%p)->(%08x)\n", This, dwOptions);
258 
260  return S_OK;
261 }
262 
264 {
266  FIXME("(%p)\n", This);
267  return E_NOTIMPL;
268 }
269 
271 {
273  FIXME("(%p)\n", This);
274  return E_NOTIMPL;
275 }
276 
278  ULONG cb, ULONG *pcbRead)
279 {
281 
282  TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
283 
284  return protocol_read(&This->base, pv, cb, pcbRead);
285 }
286 
288  DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
289 {
291  FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
292  return E_NOTIMPL;
293 }
294 
296 {
298 
299  TRACE("(%p)->(%08x)\n", This, dwOptions);
300 
301  return protocol_lock_request(&This->base);
302 }
303 
305 {
307 
308  TRACE("(%p)\n", This);
309 
310  return protocol_unlock_request(&This->base);
311 }
312 
314  IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
315  DWORD grfPI, HANDLE *dwReserved)
316 {
318  DWORD scheme = 0;
319  HRESULT hres;
320 
321  TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink,
322  pOIBindInfo, grfPI, dwReserved);
323 
324  hres = IUri_GetScheme(pUri, &scheme);
325  if(FAILED(hres))
326  return hres;
327  if(scheme != URL_SCHEME_FTP)
328  return MK_E_SYNTAX;
329 
330  return protocol_start(&This->base, (IInternetProtocol*)&This->IInternetProtocolEx_iface, pUri,
331  pOIProtSink, pOIBindInfo);
332 }
333 
334 static const IInternetProtocolExVtbl FtpProtocolVtbl = {
349 };
350 
352 {
354  return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
355 }
356 
358 {
360  return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
361 }
362 
364 {
366  return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
367 }
368 
370 {
372 
373  TRACE("(%p)->(%d)\n", This, nPriority);
374 
375  This->base.priority = nPriority;
376  return S_OK;
377 }
378 
380 {
382 
383  TRACE("(%p)->(%p)\n", This, pnPriority);
384 
385  *pnPriority = This->base.priority;
386  return S_OK;
387 }
388 
389 static const IInternetPriorityVtbl FtpPriorityVtbl = {
395 };
396 
398 {
400  return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
401 }
402 
404 {
406  return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
407 }
408 
410 {
412  return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
413 }
414 
416  void *pBuffer, DWORD *pcbBuffer)
417 {
419  TRACE("(%p)->(%x %p %p)\n", This, dwOption, pBuffer, pcbBuffer);
420 
421  if(!This->base.request)
422  return E_FAIL;
423 
424  if(!InternetQueryOptionW(This->base.request, dwOption, pBuffer, pcbBuffer))
425  return S_FALSE;
426  return S_OK;
427 }
428 
430  void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
431 {
433  TRACE("(%p)->(%x %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
434 
435  if(!This->base.request)
436  return E_FAIL;
437 
438  if(!HttpQueryInfoW(This->base.request, dwOption, pBuffer, pcbBuffer, pdwFlags))
439  return S_FALSE;
440  return S_OK;
441 }
442 
443 static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl = {
449 };
450 
452 {
453  FtpProtocol *ret;
454 
455  TRACE("(%p %p)\n", outer, ppv);
456 
458 
459  ret = heap_alloc_zero(sizeof(FtpProtocol));
460 
461  ret->base.vtbl = &AsyncProtocolVtbl;
462  ret->IUnknown_outer.lpVtbl = &FtpProtocolUnkVtbl;
463  ret->IInternetProtocolEx_iface.lpVtbl = &FtpProtocolVtbl;
464  ret->IInternetPriority_iface.lpVtbl = &FtpPriorityVtbl;
465  ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl;
466  ret->ref = 1;
467  ret->outer = outer ? outer : &ret->IUnknown_outer;
468 
469  *ppv = &ret->IUnknown_outer;
470  return S_OK;
471 }
DWORD dwOptions
Definition: solitaire.cpp:23
HRESULT protocol_unlock_request(Protocol *protocol)
Definition: protocol.c:506
LONG ref
Definition: ftp.c:36
static HRESULT WINAPI FtpPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
Definition: ftp.c:369
static ULONG WINAPI FtpPriority_Release(IInternetPriority *iface)
Definition: ftp.c:363
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
Definition: ftp.c:443
static ULONG WINAPI FtpProtocol_AddRef(IInternetProtocolEx *iface)
Definition: ftp.c:198
#define REFIID
Definition: guiddef.h:113
#define E_NOINTERFACE
Definition: winerror.h:2364
#define error(str)
Definition: mkdosfs.c:1605
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
const char * uri
Definition: sec_mgr.c:1594
REFIID riid
Definition: precomp.h:44
IUnknown IUnknown_outer
Definition: ftp.c:31
IInternetPriority IInternetPriority_iface
Definition: ftp.c:33
#define WARN(fmt,...)
Definition: debug.h:111
IUnknown * outer
Definition: ftp.c:37
static HRESULT WINAPI FtpProtocol_Read(IInternetProtocolEx *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: ftp.c:277
static HRESULT FtpProtocol_end_request(Protocol *prot)
Definition: ftp.c:88
REFIID LPVOID * ppv
Definition: atlbase.h:39
IWinInetHttpInfo IWinInetHttpInfo_iface
Definition: ftp.c:34
static HRESULT WINAPI FtpProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
Definition: ftp.c:234
DWORD scheme
HRESULT FtpProtocol_Construct(IUnknown *outer, void **ppv)
Definition: ftp.c:451
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
static HINTERNET internet_session
Definition: protocol.c:288
OLECHAR * BSTR
Definition: compat.h:1934
IInternetProtocolEx IInternetProtocolEx_iface
Definition: ftp.c:32
static HRESULT WINAPI FtpProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason, DWORD dwOptions)
Definition: ftp.c:243
static ULONG WINAPI FtpProtocol_Release(IInternetProtocolEx *iface)
Definition: ftp.c:205
Protocol base
Definition: ftp.c:29
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define E_FAIL
Definition: ddrawi.h:102
static ULONG WINAPI HttpInfo_Release(IWinInetHttpInfo *iface)
Definition: ftp.c:409
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 FtpProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
Definition: ftp.c:191
static const IInternetPriorityVtbl FtpPriorityVtbl
Definition: ftp.c:389
DWORD WINAPI FtpGetFileSize(HINTERNET hFile, LPDWORD lpdwFileSizeHigh)
Definition: ftp.c:1754
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:90
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
static ULONG WINAPI FtpPriority_AddRef(IInternetPriority *iface)
Definition: ftp.c:357
static ULONG WINAPI FtpProtocolUnk_Release(IUnknown *iface)
Definition: ftp.c:168
#define S_FALSE
Definition: winerror.h:2357
#define protocol_start(p, u, e)
Definition: protocol.c:303
smooth NULL
Definition: ftsmooth.c:416
PVOID pBuffer
#define INTERNET_FLAG_EXISTING_CONNECT
Definition: wininet.h:63
static HRESULT WINAPI FtpProtocol_Suspend(IInternetProtocolEx *iface)
Definition: ftp.c:263
HRESULT protocol_abort(Protocol *protocol, HRESULT reason)
Definition: protocol.c:518
static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info)
Definition: ftp.c:65
#define debugstr_guid
Definition: kernel32.h:35
static void FtpProtocol_on_error(Protocol *prot, DWORD error)
Definition: ftp.c:112
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 void URLMON_UnlockModule(void)
Definition: urlmon_main.h:68
static const IInternetProtocolExVtbl FtpProtocolVtbl
Definition: ftp.c:334
static HRESULT WINAPI FtpProtocol_Resume(IInternetProtocolEx *iface)
Definition: ftp.c:270
static HRESULT WINAPI FtpProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: ftp.c:295
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
HRESULT hres
Definition: protocol.c:465
static HRESULT WINAPI FtpProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: ftp.c:253
static HRESULT WINAPI FtpProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: ftp.c:287
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR url[]
Definition: encode.c:1432
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:8
static const ProtocolVtbl AsyncProtocolVtbl
Definition: ftp.c:117
static FtpProtocol * impl_from_IUnknown(IUnknown *iface)
Definition: ftp.c:40
static HRESULT WINAPI FtpPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv)
Definition: ftp.c:351
unsigned long DWORD
Definition: ntddk_ex.h:95
static FtpProtocol * impl_from_IInternetPriority(IInternetPriority *iface)
Definition: ftp.c:50
static DWORD cb
Definition: integrity.c:41
static int protocol_read
Definition: htmldoc.c:205
static HRESULT WINAPI FtpProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: ftp.c:212
HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data)
Definition: protocol.c:355
static ULONG WINAPI FtpProtocolUnk_AddRef(IUnknown *iface)
Definition: ftp.c:160
int ret
BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:3807
static ULONG WINAPI HttpInfo_AddRef(IWinInetHttpInfo *iface)
Definition: ftp.c:403
static HRESULT WINAPI HttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer)
Definition: ftp.c:415
#define InterlockedDecrement
Definition: armddk.h:52
HRESULT protocol_lock_request(Protocol *protocol)
Definition: protocol.c:498
static HRESULT FtpProtocol_start_downloading(Protocol *prot)
Definition: ftp.c:93
uint32_t DWORD_PTR
Definition: typedefs.h:63
_Reserved_ DWORD * pdwReserved
Definition: wincrypt.h:4254
static HRESULT WINAPI FtpProtocolUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: ftp.c:125
#define INTERNET_FLAG_PASSIVE
Definition: wininet.h:65
static HRESULT WINAPI FtpPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
Definition: ftp.c:379
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
unsigned long HANDLE_PTR
Definition: basetsd.h:78
static void FtpProtocol_close_connection(Protocol *prot)
Definition: ftp.c:108
static HRESULT WINAPI HttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
Definition: ftp.c:397
#define E_NOTIMPL
Definition: ddrawi.h:99
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:274
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
static FtpProtocol * impl_from_IWinInetHttpInfo(IWinInetHttpInfo *iface)
Definition: ftp.c:54
static IInternetBindInfo bind_info
Definition: mimeole.c:1273
BOOL WINAPI InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength)
Definition: internet.c:2576
struct _LARGE_INTEGER::@2192 u
GLuint res
Definition: glext.h:9613
static HRESULT WINAPI FtpProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE *dwReserved)
Definition: ftp.c:313
static FtpProtocol * impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
Definition: ftp.c:45
static HRESULT WINAPI FtpProtocol_UnlockRequest(IInternetProtocolEx *iface)
Definition: ftp.c:304
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5701
WINE_DEFAULT_DEBUG_CHANNEL(urlmon)
unsigned int ULONG
Definition: retypes.h:1
static HRESULT WINAPI HttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
Definition: ftp.c:429
#define MK_E_SYNTAX
Definition: winerror.h:2785
static void URLMON_LockModule(void)
Definition: urlmon_main.h:67
static FtpProtocol * impl_from_Protocol(Protocol *prot)
Definition: ftp.c:60
static const IUnknownVtbl FtpProtocolUnkVtbl
Definition: ftp.c:185
static BOOL heap_free(void *mem)
Definition: appwiz.h:75