URLMON: Added http and ftp protocol stub implementation

Jacek Caban jack at itma.pwr.wroc.pl
Tue Sep 13 11:17:21 CDT 2005


Changelog:
    Added http and ftp protocol stub implementation
-------------- next part --------------
Index: dlls/urlmon/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/Makefile.in,v
retrieving revision 1.29
diff -u -p -r1.29 Makefile.in
--- dlls/urlmon/Makefile.in	12 Sep 2005 11:08:00 -0000	1.29
+++ dlls/urlmon/Makefile.in	13 Sep 2005 16:12:37 -0000
@@ -10,6 +10,8 @@ EXTRALIBS = -luuid
 C_SRCS = \
 	file.c \
 	format.c \
+	ftp.c \
+	http.c \
 	internet.c \
 	regsvr.c \
 	sec_mgr.c \
Index: dlls/urlmon/urlmon_main.c
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/urlmon_main.c,v
retrieving revision 1.34
diff -u -p -r1.34 urlmon_main.c
--- dlls/urlmon/urlmon_main.c	12 Sep 2005 20:12:40 -0000	1.34
+++ dlls/urlmon/urlmon_main.c	13 Sep 2005 16:12:37 -0000
@@ -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 }
 };
Index: dlls/urlmon/urlmon_main.h
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/urlmon_main.h,v
retrieving revision 1.13
diff -u -p -r1.13 urlmon_main.h
--- dlls/urlmon/urlmon_main.h	9 Sep 2005 09:09:22 -0000	1.13
+++ dlls/urlmon/urlmon_main.h	13 Sep 2005 16:12:37 -0000
@@ -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
--- /dev/null	2005-09-13 18:26:03.252515750 +0200
+++ dlls/urlmon/http.c	2005-09-11 20:19:24.000000000 +0200
@@ -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 <stdarg.h>
+
+#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;
+}
--- /dev/null	2005-09-13 18:26:03.252515750 +0200
+++ dlls/urlmon/ftp.c	2005-09-11 20:32:08.000000000 +0200
@@ -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 <stdarg.h>
+
+#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;
+}


More information about the wine-patches mailing list