Jacek Caban : mshtml: Added beginning OnDataAvailable implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Sat Jun 3 05:24:43 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 93fe34ee6868dd88244aea00c4c01ac42941b51b
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=93fe34ee6868dd88244aea00c4c01ac42941b51b

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Jun  3 01:26:00 2006 +0200

mshtml: Added beginning OnDataAvailable implementation.

---

 dlls/mshtml/mshtml_private.h |   11 +++
 dlls/mshtml/navigate.c       |  170 +++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 178 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index cd8abe1..725d041 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -131,6 +131,15 @@ typedef struct {
     nsIURI *original_uri;
 } nsChannel;
 
+typedef struct {
+    const nsIInputStreamVtbl *lpInputStreamVtbl;
+
+    LONG ref;
+
+    char buf[1024];
+    DWORD buf_size;
+} nsProtocolStream;
+
 struct BSCallback {
     const IBindStatusCallbackVtbl *lpBindStatusCallbackVtbl;
     const IServiceProviderVtbl    *lpServiceProviderVtbl;
@@ -146,6 +155,8 @@ struct BSCallback {
     nsChannel *nschannel;
     nsIStreamListener *nslistener;
     nsISupports *nscontext;
+
+    nsProtocolStream *nsstream;
 };
 
 struct HTMLDOMNode {
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 514f2bd..01e5a56 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -19,7 +19,6 @@
 #include "config.h"
 
 #include <stdarg.h>
-#include <stdio.h>
 
 #define COBJMACROS
 #define NONAMELESSUNION
@@ -39,6 +38,138 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
 #define CONTENT_LENGTH "Content-Length"
 
+#define NSINSTREAM(x) ((nsIInputStream*) &(x)->lpInputStreamVtbl)
+
+#define NSINSTREAM_THIS(iface) DEFINE_THIS(nsProtocolStream, InputStream, iface)
+
+static nsresult NSAPI nsInputStream_QueryInterface(nsIInputStream *iface, nsIIDRef riid,
+                                                   nsQIResult result)
+{
+    nsProtocolStream *This = NSINSTREAM_THIS(iface);
+
+    *result = NULL;
+
+    if(IsEqualGUID(&IID_nsISupports, riid)) {
+        TRACE("(%p)->(IID_nsISupports %p)\n", This, result);
+        *result  = NSINSTREAM(This);
+    }else if(IsEqualGUID(&IID_nsIInputStream, riid)) {
+        TRACE("(%p)->(IID_nsIInputStream %p)\n", This, result);
+        *result  = NSINSTREAM(This);
+    }
+
+    if(*result) {
+        nsIInputStream_AddRef(NSINSTREAM(This));
+        return NS_OK;
+    }
+
+    WARN("unsupported interface %s\n", debugstr_guid(riid));
+    return NS_NOINTERFACE;
+}
+
+static nsrefcnt NSAPI nsInputStream_AddRef(nsIInputStream *iface)
+{
+    nsProtocolStream *This = NSINSTREAM_THIS(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%ld\n", This, ref);
+
+    return ref;
+}
+
+
+static nsrefcnt NSAPI nsInputStream_Release(nsIInputStream *iface)
+{
+    nsProtocolStream *This = NSINSTREAM_THIS(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%ld\n", This, ref);
+
+    if(!ref)
+        HeapFree(GetProcessHeap(), 0, This);
+
+    return ref;
+}
+
+static nsresult NSAPI nsInputStream_Close(nsIInputStream *iface)
+{
+    nsProtocolStream *This = NSINSTREAM_THIS(iface);
+    FIXME("(%p)\n", This);
+    return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsInputStream_Available(nsIInputStream *iface, PRUint32 *_retval)
+{
+    nsProtocolStream *This = NSINSTREAM_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, _retval);
+    return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsInputStream_Read(nsIInputStream *iface, char *aBuf, PRUint32 aCount,
+                                         PRUint32 *_retval)
+{
+    nsProtocolStream *This = NSINSTREAM_THIS(iface);
+    FIXME("(%p)->(%p %ld %p)\n", This, aBuf, aCount, _retval);
+    return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+static nsresult NSAPI nsInputStream_ReadSegments(nsIInputStream *iface,
+        nsresult (NSAPI*aWriter)(nsIInputStream*,void*,const char*,PRUint32,PRUint32,PRUint32*),
+        void *aClousure, PRUint32 aCount, PRUint32 *_retval)
+{
+    nsProtocolStream *This = NSINSTREAM_THIS(iface);
+    PRUint32 written = 0;
+    nsresult nsres;
+
+    FIXME("(%p)->(%p %p %ld %p)\n", This, aWriter, aClousure, aCount, _retval);
+
+    if(!This->buf_size)
+        return S_OK;
+
+    if(This->buf_size > aCount)
+        FIXME("buf_size > aCount\n");
+
+    nsres = aWriter(NSINSTREAM(This), aClousure, This->buf, 0, This->buf_size, &written);
+    if(NS_FAILED(nsres))
+        FIXME("aWritter failed: %08lx\n", nsres);
+    if(written != This->buf_size)
+        FIXME("written != buf_size\n");
+
+    This->buf_size -= written; 
+
+    return nsres;
+}
+
+static nsresult NSAPI nsInputStream_IsNonBlocking(nsIInputStream *iface, PRBool *_retval)
+{
+    nsProtocolStream *This = NSINSTREAM_THIS(iface);
+    FIXME("(%p)->(%p)\n", This, _retval);
+    return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+#undef NSINSTREAM_THIS
+
+static const nsIInputStreamVtbl nsInputStreamVtbl = {
+    nsInputStream_QueryInterface,
+    nsInputStream_AddRef,
+    nsInputStream_Release,
+    nsInputStream_Close,
+    nsInputStream_Available,
+    nsInputStream_Read,
+    nsInputStream_ReadSegments,
+    nsInputStream_IsNonBlocking
+};
+
+static nsProtocolStream *create_nsprotocol_stream(IStream *stream)
+{
+    nsProtocolStream *ret = HeapAlloc(GetProcessHeap(), 0, sizeof(nsProtocolStream));
+
+    ret->lpInputStreamVtbl = &nsInputStreamVtbl;
+    ret->ref = 1;
+    ret->buf_size = 0;
+
+    return ret;
+}
+
 #define STATUSCLB_THIS(iface) DEFINE_THIS(BSCallback, BindStatusCallback, iface)
 
 static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallback *iface,
@@ -102,6 +233,8 @@ static ULONG WINAPI BindStatusCallback_R
             nsIStreamListener_Release(This->nslistener);
         if(This->nscontext)
             nsISupports_Release(This->nscontext);
+        if(This->nsstream)
+            nsIInputStream_Release(NSINSTREAM(This->nsstream));
         HeapFree(GetProcessHeap(), 0, This->headers);
         HeapFree(GetProcessHeap(), 0, This);
     }
@@ -182,8 +315,38 @@ static HRESULT WINAPI BindStatusCallback
         DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
 {
     BSCallback *This = STATUSCLB_THIS(iface);
-    FIXME("(%p)->(%08lx %ld %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
-    return E_NOTIMPL;
+    nsresult nsres;
+    HRESULT hres;
+
+    TRACE("(%p)->(%08lx %ld %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
+
+    if(This->nslistener) {
+        if(!This->nsstream) {
+            This->nsstream = create_nsprotocol_stream(pstgmed->u.pstm);
+
+            nsres = nsIStreamListener_OnStartRequest(This->nslistener,
+                    (nsIRequest*)NSCHANNEL(This->nschannel), This->nscontext);
+            if(NS_FAILED(nsres))
+                FIXME("OnStartRequest failed: %08lx\n", nsres);
+        }
+
+        do {
+            hres = IStream_Read(pstgmed->u.pstm, This->nsstream->buf, sizeof(This->nsstream->buf),
+                                &This->nsstream->buf_size);
+            if(This->nsstream->buf_size) {
+                nsres = nsIStreamListener_OnDataAvailable(This->nslistener,
+                        (nsIRequest*)NSCHANNEL(This->nschannel), This->nscontext,
+                        NSINSTREAM(This->nsstream), 0 /* FIXME */, dwSize);
+                if(NS_FAILED(nsres))
+                    FIXME("OnDataAvailable failed: %08lx\n", nsres);
+
+                if(This->nsstream->buf_size)
+                    FIXME("buffer is not empty!\n");
+            }
+        }while(hres == S_OK);
+    }
+
+    return S_OK;
 }
 
 static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface,
@@ -380,6 +543,7 @@ BSCallback *create_bscallback(HTMLDocume
     ret->nschannel = NULL;
     ret->nslistener = NULL;
     ret->nscontext = NULL;
+    ret->nsstream = NULL;
 
     return ret;
 }




More information about the wine-cvs mailing list