ReactOS 0.4.15-dev-7953-g1f49173
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
28typedef struct {
30
35
39
41{
42 return CONTAINING_RECORD(iface, FtpProtocol, IUnknown_inner);
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
65static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags,
67{
69 DWORD path_size = 0;
70 BSTR url;
72
73 hres = IUri_GetAbsoluteUri(uri, &url);
74 if(FAILED(hres))
75 return hres;
76
78 if(SUCCEEDED(hres)) {
79 This->base.request = InternetOpenUrlW(internet_session, url, NULL, 0,
81 (DWORD_PTR)&This->base);
82 if (!This->base.request && GetLastError() != ERROR_IO_PENDING) {
83 WARN("InternetOpenUrl failed: %d\n", GetLastError());
84 hres = INET_E_RESOURCE_NOT_FOUND;
85 }
86 }
88 return hres;
89}
90
92{
93 return E_NOTIMPL;
94}
95
97{
99 DWORD size;
100 BOOL res;
101
102 res = FtpGetFileSize(This->base.request, &size);
103 if(res)
104 This->base.content_length = size;
105 else
106 WARN("FtpGetFileSize failed: %d\n", GetLastError());
107
108 return S_OK;
109}
110
112{
113}
114
116{
117 FIXME("(%p) %d - stub\n", prot, error);
118}
119
126};
127
129{
131
133 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
134 *ppv = &This->IUnknown_inner;
135 }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
136 TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
137 *ppv = &This->IInternetProtocolEx_iface;
138 }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
139 TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
140 *ppv = &This->IInternetProtocolEx_iface;
141 }else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
142 TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv);
143 *ppv = &This->IInternetProtocolEx_iface;
144 }else if(IsEqualGUID(&IID_IInternetPriority, riid)) {
145 TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv);
146 *ppv = &This->IInternetPriority_iface;
147 }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) {
148 TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv);
149 *ppv = &This->IWinInetHttpInfo_iface;
150 }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
151 TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv);
152 *ppv = &This->IWinInetHttpInfo_iface;
153 }else {
154 *ppv = NULL;
155 WARN("not supported interface %s\n", debugstr_guid(riid));
156 return E_NOINTERFACE;
157 }
158
159 IUnknown_AddRef((IUnknown*)*ppv);
160 return S_OK;
161}
162
164{
167 TRACE("(%p) ref=%d\n", This, ref);
168 return ref;
169}
170
172{
175
176 TRACE("(%p) ref=%d\n", This, ref);
177
178 if(!ref) {
181
183 }
184
185 return ref;
186}
187
188static const IUnknownVtbl FtpProtocolUnkVtbl = {
192};
193
195{
197 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
198 return IUnknown_QueryInterface(This->outer, riid, ppv);
199}
200
202{
204 TRACE("(%p)\n", This);
205 return IUnknown_AddRef(This->outer);
206}
207
209{
211 TRACE("(%p)\n", This);
212 return IUnknown_Release(This->outer);
213}
214
216 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
218{
220 IUri *uri;
222
223 TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink,
224 pOIBindInfo, grfPI, dwReserved);
225
226 hres = CreateUri(szUrl, 0, 0, &uri);
227 if(FAILED(hres))
228 return hres;
229
230 hres = IInternetProtocolEx_StartEx(&This->IInternetProtocolEx_iface, uri, pOIProtSink,
231 pOIBindInfo, grfPI, (HANDLE*)dwReserved);
232
233 IUri_Release(uri);
234 return hres;
235}
236
237static HRESULT WINAPI FtpProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
238{
240
241 TRACE("(%p)->(%p)\n", This, pProtocolData);
242
243 return protocol_continue(&This->base, pProtocolData);
244}
245
248{
250
251 TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
252
253 return protocol_abort(&This->base, hrReason);
254}
255
257{
259
260 TRACE("(%p)->(%08x)\n", This, dwOptions);
261
263 return S_OK;
264}
265
267{
269 FIXME("(%p)\n", This);
270 return E_NOTIMPL;
271}
272
274{
276 FIXME("(%p)\n", This);
277 return E_NOTIMPL;
278}
279
281 ULONG cb, ULONG *pcbRead)
282{
284
285 TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
286
287 return protocol_read(&This->base, pv, cb, pcbRead);
288}
289
291 DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
292{
294 FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
295 return E_NOTIMPL;
296}
297
299{
301
302 TRACE("(%p)->(%08x)\n", This, dwOptions);
303
304 return protocol_lock_request(&This->base);
305}
306
308{
310
311 TRACE("(%p)\n", This);
312
313 return protocol_unlock_request(&This->base);
314}
315
317 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
318 DWORD grfPI, HANDLE *dwReserved)
319{
321 DWORD scheme = 0;
323
324 TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink,
325 pOIBindInfo, grfPI, dwReserved);
326
327 hres = IUri_GetScheme(pUri, &scheme);
328 if(FAILED(hres))
329 return hres;
331 return MK_E_SYNTAX;
332
333 return protocol_start(&This->base, (IInternetProtocol*)&This->IInternetProtocolEx_iface, pUri,
334 pOIProtSink, pOIBindInfo);
335}
336
337static const IInternetProtocolExVtbl FtpProtocolVtbl = {
352};
353
355{
357 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
358}
359
361{
363 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
364}
365
367{
369 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
370}
371
373{
375
376 TRACE("(%p)->(%d)\n", This, nPriority);
377
378 This->base.priority = nPriority;
379 return S_OK;
380}
381
383{
385
386 TRACE("(%p)->(%p)\n", This, pnPriority);
387
388 *pnPriority = This->base.priority;
389 return S_OK;
390}
391
392static const IInternetPriorityVtbl FtpPriorityVtbl = {
398};
399
401{
403 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
404}
405
407{
409 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
410}
411
413{
415 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
416}
417
419 void *pBuffer, DWORD *pcbBuffer)
420{
422 TRACE("(%p)->(%x %p %p)\n", This, dwOption, pBuffer, pcbBuffer);
423
424 if(!This->base.request)
425 return E_FAIL;
426
427 if(!InternetQueryOptionW(This->base.request, dwOption, pBuffer, pcbBuffer))
428 return S_FALSE;
429 return S_OK;
430}
431
433 void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
434{
436 TRACE("(%p)->(%x %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
437
438 if(!This->base.request)
439 return E_FAIL;
440
441 if(!HttpQueryInfoW(This->base.request, dwOption, pBuffer, pcbBuffer, pdwFlags))
442 return S_FALSE;
443 return S_OK;
444}
445
446static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl = {
452};
453
455{
457
458 TRACE("(%p %p)\n", outer, ppv);
459
461
462 ret = heap_alloc_zero(sizeof(FtpProtocol));
463
464 ret->base.vtbl = &AsyncProtocolVtbl;
465 ret->IUnknown_inner.lpVtbl = &FtpProtocolUnkVtbl;
466 ret->IInternetProtocolEx_iface.lpVtbl = &FtpProtocolVtbl;
467 ret->IInternetPriority_iface.lpVtbl = &FtpPriorityVtbl;
468 ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl;
469 ret->ref = 1;
470 ret->outer = outer ? outer : &ret->IUnknown_inner;
471
472 *ppv = &ret->IUnknown_inner;
473 return S_OK;
474}
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 E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
OLECHAR * BSTR
Definition: compat.h:2293
HRESULT WINAPI UrlUnescapeW(LPWSTR pszUrl, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags)
Definition: url.c:1367
static ULONG WINAPI FtpPriority_Release(IInternetPriority *iface)
Definition: ftp.c:366
static HRESULT WINAPI FtpProtocolUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: ftp.c:128
static HRESULT WINAPI FtpProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: ftp.c:215
static const IInternetPriorityVtbl FtpPriorityVtbl
Definition: ftp.c:392
static HRESULT WINAPI FtpProtocol_Read(IInternetProtocolEx *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: ftp.c:280
static FtpProtocol * impl_from_Protocol(Protocol *prot)
Definition: ftp.c:60
static ULONG WINAPI FtpPriority_AddRef(IInternetPriority *iface)
Definition: ftp.c:360
static HRESULT WINAPI FtpProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason, DWORD dwOptions)
Definition: ftp.c:246
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
Definition: ftp.c:446
static ULONG WINAPI FtpProtocolUnk_AddRef(IUnknown *iface)
Definition: ftp.c:163
static FtpProtocol * impl_from_IWinInetHttpInfo(IWinInetHttpInfo *iface)
Definition: ftp.c:54
static HRESULT WINAPI FtpPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
Definition: ftp.c:372
static FtpProtocol * impl_from_IInternetPriority(IInternetPriority *iface)
Definition: ftp.c:50
static HRESULT WINAPI HttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer)
Definition: ftp.c:418
static HRESULT WINAPI FtpProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: ftp.c:256
static HRESULT WINAPI FtpProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: ftp.c:290
static ULONG WINAPI FtpProtocol_Release(IInternetProtocolEx *iface)
Definition: ftp.c:208
static ULONG WINAPI FtpProtocol_AddRef(IInternetProtocolEx *iface)
Definition: ftp.c:201
HRESULT FtpProtocol_Construct(IUnknown *outer, void **ppv)
Definition: ftp.c:454
static FtpProtocol * impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
Definition: ftp.c:45
static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info)
Definition: ftp.c:65
static ULONG WINAPI HttpInfo_Release(IWinInetHttpInfo *iface)
Definition: ftp.c:412
static HRESULT WINAPI FtpProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
Definition: ftp.c:237
static HRESULT WINAPI HttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
Definition: ftp.c:400
static void FtpProtocol_close_connection(Protocol *prot)
Definition: ftp.c:111
static HRESULT FtpProtocol_start_downloading(Protocol *prot)
Definition: ftp.c:96
static HRESULT WINAPI FtpPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
Definition: ftp.c:382
static ULONG WINAPI HttpInfo_AddRef(IWinInetHttpInfo *iface)
Definition: ftp.c:406
static HRESULT WINAPI FtpProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE *dwReserved)
Definition: ftp.c:316
static HRESULT WINAPI FtpProtocol_Resume(IInternetProtocolEx *iface)
Definition: ftp.c:273
static HRESULT WINAPI FtpProtocol_UnlockRequest(IInternetProtocolEx *iface)
Definition: ftp.c:307
static void FtpProtocol_on_error(Protocol *prot, DWORD error)
Definition: ftp.c:115
static const ProtocolVtbl AsyncProtocolVtbl
Definition: ftp.c:120
static HRESULT WINAPI FtpPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv)
Definition: ftp.c:354
static HRESULT WINAPI FtpProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: ftp.c:298
static HRESULT WINAPI HttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
Definition: ftp.c:432
static HRESULT WINAPI FtpProtocol_Suspend(IInternetProtocolEx *iface)
Definition: ftp.c:266
static const IUnknownVtbl FtpProtocolUnkVtbl
Definition: ftp.c:188
static ULONG WINAPI FtpProtocolUnk_Release(IUnknown *iface)
Definition: ftp.c:171
static FtpProtocol * impl_from_IUnknown(IUnknown *iface)
Definition: ftp.c:40
static HRESULT FtpProtocol_end_request(Protocol *prot)
Definition: ftp.c:91
static HRESULT WINAPI FtpProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
Definition: ftp.c:194
static const IInternetProtocolExVtbl FtpProtocolVtbl
Definition: ftp.c:337
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
DWORD WINAPI FtpGetFileSize(HINTERNET hFile, LPDWORD lpdwFileSizeHigh)
Definition: ftp.c:1757
BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:3870
BOOL WINAPI InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength)
Definition: internet.c:2697
HINTERNET WINAPI InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl, LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:3722
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
GLuint res
Definition: glext.h:9613
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#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
PVOID pBuffer
DWORD scheme
@ URL_SCHEME_FTP
Definition: shlwapi.h:1147
#define URL_UNESCAPE_INPLACE
Definition: shlwapi.h:1224
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwOptions
Definition: solitaire.cpp:25
IInternetProtocolEx IInternetProtocolEx_iface
Definition: ftp.c:32
IWinInetHttpInfo IWinInetHttpInfo_iface
Definition: ftp.c:34
LONG ref
Definition: ftp.c:36
IUnknown * outer
Definition: ftp.c:37
IUnknown IUnknown_inner
Definition: ftp.c:31
Protocol base
Definition: ftp.c:29
IInternetPriority IInternetPriority_iface
Definition: ftp.c:33
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 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
_Reserved_ DWORD * pdwReserved
Definition: wincrypt.h:4254
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define MK_E_SYNTAX
Definition: winerror.h:2785
#define INTERNET_FLAG_PASSIVE
Definition: wininet.h:65
#define INTERNET_FLAG_EXISTING_CONNECT
Definition: wininet.h:63
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185