From c54f013787490b76911b8277a491b89c3f71ede7 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 14 Sep 2005 15:38:26 +0000 Subject: [PATCH] Added http and ftp protocol stub implementation. --- dlls/urlmon/Makefile.in | 2 + dlls/urlmon/ftp.c | 202 ++++++++++++++++++++++++++++++++++++++ dlls/urlmon/http.c | 202 ++++++++++++++++++++++++++++++++++++++ dlls/urlmon/urlmon_main.c | 2 + dlls/urlmon/urlmon_main.h | 2 + 5 files changed, 410 insertions(+) create mode 100644 dlls/urlmon/ftp.c create mode 100644 dlls/urlmon/http.c diff --git a/dlls/urlmon/Makefile.in b/dlls/urlmon/Makefile.in index 792392c6af5..b6d448b8889 100644 --- a/dlls/urlmon/Makefile.in +++ b/dlls/urlmon/Makefile.in @@ -10,6 +10,8 @@ EXTRALIBS = -luuid C_SRCS = \ file.c \ format.c \ + ftp.c \ + http.c \ internet.c \ regsvr.c \ sec_mgr.c \ diff --git a/dlls/urlmon/ftp.c b/dlls/urlmon/ftp.c new file mode 100644 index 00000000000..ef1cceb1036 --- /dev/null +++ b/dlls/urlmon/ftp.c @@ -0,0 +1,202 @@ +/* + * Copyright 2005 Jacek Caban + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "urlmon.h" +#include "urlmon_main.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(urlmon); + +typedef struct { + const IInternetProtocolVtbl *lpInternetProtocolVtbl; + LONG ref; +} FtpProtocol; + +#define PROTOCOL_THIS(iface) DEFINE_THIS(FtpProtocol, InternetProtocol, iface) + +#define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl) + +static HRESULT WINAPI FtpProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + + *ppv = NULL; + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = PROTOCOL(This); + }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { + TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); + *ppv = PROTOCOL(This); + }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { + TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); + *ppv = PROTOCOL(This); + } + + if(*ppv) { + IInternetProtocol_AddRef(iface); + return S_OK; + } + + WARN("not supported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI FtpProtocol_AddRef(IInternetProtocol *iface) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p) ref=%ld\n", This, ref); + return ref; +} + +static ULONG WINAPI FtpProtocol_Release(IInternetProtocol *iface) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%ld\n", This, ref); + + if(!ref) { + HeapFree(GetProcessHeap(), 0, This); + + URLMON_UnlockModule(); + } + + return ref; +} + +static HRESULT WINAPI FtpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, + IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, + DWORD grfPI, DWORD dwReserved) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%s %p %p %08lx %ld)\n", This, debugstr_w(szUrl), pOIProtSink, + pOIBindInfo, grfPI, dwReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%p)\n", This, pProtocolData); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, + DWORD dwOptions) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08lx)\n", This, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_Suspend(IInternetProtocol *iface) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_Resume(IInternetProtocol *iface) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_Read(IInternetProtocol *iface, void *pv, + ULONG cb, ULONG *pcbRead) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, + DWORD dwOrgin, ULARGE_INTEGER *plibNewPosition) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrgin, plibNewPosition); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08lx)\n", This, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI FtpProtocol_UnlockRequest(IInternetProtocol *iface) +{ + FtpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +#undef PROTOCOL_THIS + +static const IInternetProtocolVtbl FtpProtocolVtbl = { + FtpProtocol_QueryInterface, + FtpProtocol_AddRef, + FtpProtocol_Release, + FtpProtocol_Start, + FtpProtocol_Continue, + FtpProtocol_Abort, + FtpProtocol_Terminate, + FtpProtocol_Suspend, + FtpProtocol_Resume, + FtpProtocol_Read, + FtpProtocol_Seek, + FtpProtocol_LockRequest, + FtpProtocol_UnlockRequest +}; + +HRESULT FtpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) +{ + FtpProtocol *ret; + + TRACE("(%p %p)\n", pUnkOuter, ppobj); + + URLMON_LockModule(); + + ret = HeapAlloc(GetProcessHeap(), 0, sizeof(FtpProtocol)); + + ret->lpInternetProtocolVtbl = &FtpProtocolVtbl; + ret->ref = 1; + + *ppobj = PROTOCOL(ret); + + return S_OK; +} diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c new file mode 100644 index 00000000000..fd69d6bf55c --- /dev/null +++ b/dlls/urlmon/http.c @@ -0,0 +1,202 @@ +/* + * Copyright 2005 Jacek Caban + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "urlmon.h" +#include "urlmon_main.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(urlmon); + +typedef struct { + const IInternetProtocolVtbl *lpInternetProtocolVtbl; + LONG ref; +} HttpProtocol; + +#define PROTOCOL_THIS(iface) DEFINE_THIS(HttpProtocol, InternetProtocol, iface) + +#define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl) + +static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + + *ppv = NULL; + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = PROTOCOL(This); + }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { + TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); + *ppv = PROTOCOL(This); + }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { + TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); + *ppv = PROTOCOL(This); + } + + if(*ppv) { + IInternetProtocol_AddRef(iface); + return S_OK; + } + + WARN("not supported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI HttpProtocol_AddRef(IInternetProtocol *iface) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p) ref=%ld\n", This, ref); + return ref; +} + +static ULONG WINAPI HttpProtocol_Release(IInternetProtocol *iface) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%ld\n", This, ref); + + if(!ref) { + HeapFree(GetProcessHeap(), 0, This); + + URLMON_UnlockModule(); + } + + return ref; +} + +static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, + IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, + DWORD grfPI, DWORD dwReserved) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%s %p %p %08lx %ld)\n", This, debugstr_w(szUrl), pOIProtSink, + pOIBindInfo, grfPI, dwReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%p)\n", This, pProtocolData); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, + DWORD dwOptions) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08lx)\n", This, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_Suspend(IInternetProtocol *iface) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_Resume(IInternetProtocol *iface) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv, + ULONG cb, ULONG *pcbRead) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, + DWORD dwOrgin, ULARGE_INTEGER *plibNewPosition) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrgin, plibNewPosition); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08lx)\n", This, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI HttpProtocol_UnlockRequest(IInternetProtocol *iface) +{ + HttpProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +#undef PROTOCOL_THIS + +static const IInternetProtocolVtbl HttpProtocolVtbl = { + HttpProtocol_QueryInterface, + HttpProtocol_AddRef, + HttpProtocol_Release, + HttpProtocol_Start, + HttpProtocol_Continue, + HttpProtocol_Abort, + HttpProtocol_Terminate, + HttpProtocol_Suspend, + HttpProtocol_Resume, + HttpProtocol_Read, + HttpProtocol_Seek, + HttpProtocol_LockRequest, + HttpProtocol_UnlockRequest +}; + +HRESULT HttpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) +{ + HttpProtocol *ret; + + TRACE("(%p %p)\n", pUnkOuter, ppobj); + + URLMON_LockModule(); + + ret = HeapAlloc(GetProcessHeap(), 0, sizeof(HttpProtocol)); + + ret->lpInternetProtocolVtbl = &HttpProtocolVtbl; + ret->ref = 1; + + *ppobj = PROTOCOL(ret); + + return S_OK; +} diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c index 7ab6509c9d2..fa2e195a8f6 100644 --- a/dlls/urlmon/urlmon_main.c +++ b/dlls/urlmon/urlmon_main.c @@ -103,6 +103,8 @@ struct object_creation_info static const struct object_creation_info object_creation[] = { { &CLSID_FileProtocol, FileProtocol_Construct }, + { &CLSID_FtpProtocol, FtpProtocol_Construct }, + { &CLSID_HttpProtocol, HttpProtocol_Construct }, { &CLSID_InternetSecurityManager, &SecManagerImpl_Construct }, { &CLSID_InternetZoneManager, ZoneMgrImpl_Construct } }; diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 3362891b5fe..9a012d2fec5 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -28,6 +28,8 @@ extern HINSTANCE URLMON_hInstance; extern HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT ZoneMgrImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT FileProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); +extern HRESULT HttpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); +extern HRESULT FtpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); /********************************************************************** * Dll lifetime tracking declaration for urlmon.dll