Jacek Caban : mshtml: Added nsIUploadStream implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Feb 10 08:54:47 CST 2006


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb 10 14:49:41 2006 +0100

mshtml: Added nsIUploadStream implementation.

---

 dlls/mshtml/nsiface.idl |   28 +++++++++++++
 dlls/mshtml/nsio.c      |   99 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 126 insertions(+), 1 deletions(-)

diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index 603e7d7..382e7b9 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -68,7 +68,6 @@ interface nsISupports
 /* Currently we don't need a full declaration of these interfaces */
 typedef nsISupports nsIWeakReference;
 typedef nsISupports nsIDOMWindow;
-typedef nsISupports nsIInputStream;
 typedef nsISupports nsIDOMDocument;
 typedef nsISupports nsISHistory;
 typedef nsISupports nsISimpleEnumerator;
@@ -130,6 +129,22 @@ interface nsIComponentManager : nsISuppo
 
 [
     object,
+    uuid(fa9c7f6c-61b3-11d4-9877-00c04fa0cf4a)
+]
+interface nsIInputStream : nsISupports
+{
+    nsresult Close();
+    nsresult Available(PRUint32 *_retval);
+    nsresult Read(char *aBuf, PRUint32 aCount, PRUint32 *_retval);
+    nsresult ReadSegments(nsresult (*aWriter)(nsIInputStream *aInStream, 
+            void *aClosure, const char *aFromSegment, PRUint32 aToOffset,
+            PRUint32 aCount, PRUint32 *aWriteCount),
+            void *aClosure, PRUint32 aCount, PRUint32 *_retval);
+    nsresult IsNonBlocking(PRBool *_retval);
+}
+
+[
+    object,
     uuid(07a22cc0-0ce5-11d3-9331-00104ba0fd40)
 ]
 interface nsIURI : nsISupports
@@ -233,6 +248,17 @@ interface nsIHttpChannel : nsIChannel
 
 [
     object,
+    uuid(ddf633d8-e9a4-439d-ad88-de636fd9bb75)
+]
+interface nsIUploadChannel : nsISupports
+{
+    nsresult SetUploadStream(nsIInputStream *aStream, const nsACString *aContentType,
+                             PRInt32 aContentLength);
+    nsresult GetUploadStream(nsIInputStream **aUploadStream);
+}
+
+[
+    object,
     uuid(94928ab3-8b63-11d3-989d-001083010e9b)
 ]
 interface nsIURIContentListener : nsISupports
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index a13def7..70b6247 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -47,12 +47,14 @@ static nsIIOService *nsio = NULL;
 
 typedef struct {
     const nsIHttpChannelVtbl *lpHttpChannelVtbl;
+    const nsIUploadChannelVtbl *lpUploadChannelVtbl;
 
     LONG ref;
 
     nsIChannel *channel;
     nsIHttpChannel *http_channel;
     nsIWineURI *uri;
+    nsIInputStream *post_data_stream;
 } nsChannel;
 
 typedef struct {
@@ -66,6 +68,7 @@ typedef struct {
 
 #define NSCHANNEL(x)     ((nsIChannel*)        &(x)->lpHttpChannelVtbl)
 #define NSHTTPCHANNEL(x) ((nsIHttpChannel*)    &(x)->lpHttpChannelVtbl)
+#define NSUPCHANNEL(x)   ((nsIUploadChannel*)  &(x)->lpUploadChannelVtbl)
 #define NSURI(x)         ((nsIURI*)            &(x)->lpWineURIVtbl)
 
 static BOOL exec_shldocvw_67(NSContainer *container, LPCWSTR url)
@@ -158,6 +161,9 @@ static nsresult NSAPI nsChannel_QueryInt
     }else if(This->http_channel && IsEqualGUID(&IID_nsIHttpChannel, riid)) {
         TRACE("(%p)->(IID_nsIHttpChannel %p)\n", This, result);
         *result = NSHTTPCHANNEL(This);
+    }else if(IsEqualGUID(&IID_nsIUploadChannel, riid)) {
+        TRACE("(%p)->(IID_nsIUploadChannel %p)\n", This, result);
+        *result = NSUPCHANNEL(This);
     }
 
     if(*result) {
@@ -189,6 +195,8 @@ static nsrefcnt NSAPI nsChannel_Release(
         nsIWineURI_Release(This->uri);
         if(This->http_channel)
             nsIHttpChannel_Release(This->http_channel);
+        if(This->post_data_stream)
+            nsIInputStream_Release(This->post_data_stream);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
@@ -384,6 +392,7 @@ static nsresult NSAPI nsChannel_AsyncOpe
                                           nsISupports *aContext)
 {
     nsChannel *This = NSCHANNEL_THIS(iface);
+    nsresult nsres;
 
     TRACE("(%p)->(%p %p)\n", This, aListener, aContext);
 
@@ -392,6 +401,22 @@ static nsresult NSAPI nsChannel_AsyncOpe
         return NS_ERROR_UNEXPECTED;
     }
 
+    if(This->post_data_stream) {
+        nsIUploadChannel *upload_channel;
+
+        nsres = nsIChannel_QueryInterface(This->channel, &IID_nsIUploadChannel,
+                                          (void**)&upload_channel);
+        if(NS_SUCCEEDED(nsres)) {
+            nsACString *empty_string = nsACString_Create();
+            nsACString_SetData(empty_string, "");
+
+            nsres = nsIUploadChannel_SetUploadStream(upload_channel, This->post_data_stream,
+                                                     empty_string, -1);
+            if(NS_FAILED(nsres))
+                WARN("SetUploadStream failed: %08lx\n", nsres);
+        }
+    }
+
     return nsIChannel_AsyncOpen(This->channel, aListener, aContext);
 }
 
@@ -687,6 +712,78 @@ static const nsIHttpChannelVtbl nsChanne
 
 #define NSURI_THIS(iface) DEFINE_THIS(nsURI, WineURI, iface)
 
+#define NSUPCHANNEL_THIS(iface) DEFINE_THIS(nsChannel, UploadChannel, iface)
+
+static nsresult NSAPI nsUploadChannel_QueryInterface(nsIUploadChannel *iface, nsIIDRef riid,
+                                                     nsQIResult result)
+{
+    nsChannel *This = NSUPCHANNEL_THIS(iface);
+    return nsIChannel_QueryInterface(NSCHANNEL(This), riid, result);
+}
+
+static nsrefcnt NSAPI nsUploadChannel_AddRef(nsIUploadChannel *iface)
+{
+    nsChannel *This = NSUPCHANNEL_THIS(iface);
+    return nsIChannel_AddRef(NSCHANNEL(This));
+}
+
+static nsrefcnt NSAPI nsUploadChannel_Release(nsIUploadChannel *iface)
+{
+    nsChannel *This = NSUPCHANNEL_THIS(iface);
+    return nsIChannel_Release(NSCHANNEL(This));
+}
+
+static nsresult NSAPI nsUploadChannel_SetUploadStream(nsIUploadChannel *iface,
+        nsIInputStream *aStream, const nsACString *aContentType, PRInt32 aContentLength)
+{
+    nsChannel *This = NSUPCHANNEL_THIS(iface);
+    const char *content_type;
+
+    TRACE("(%p)->(%p %p %ld)\n", This, aStream, aContentType, aContentLength);
+
+    if(This->post_data_stream)
+        nsIInputStream_Release(This->post_data_stream);
+
+    if(aContentType) {
+        nsACString_GetData(aContentType, &content_type, NULL);
+        if(*content_type)
+            FIXME("Unsupported aContentType argument: %s\n", debugstr_a(content_type));
+    }
+
+    if(aContentLength != -1)
+        FIXME("Unsupported acontentLength = %ld\n", aContentLength);
+
+    if(aStream)
+        nsIInputStream_AddRef(aStream);
+    This->post_data_stream = aStream;
+
+    return NS_OK;
+}
+
+static nsresult NSAPI nsUploadChannel_GetUploadStream(nsIUploadChannel *iface,
+        nsIInputStream **aUploadStream)
+{
+    nsChannel *This = NSUPCHANNEL_THIS(iface);
+
+    TRACE("(%p)->(%p)\n", This, aUploadStream);
+
+    if(This->post_data_stream)
+        nsIInputStream_AddRef(This->post_data_stream);
+
+    *aUploadStream = This->post_data_stream;
+    return NS_OK;
+}
+
+#undef NSUPCHANNEL_THIS
+
+static const nsIUploadChannelVtbl nsUploadChannelVtbl = {
+    nsUploadChannel_QueryInterface,
+    nsUploadChannel_AddRef,
+    nsUploadChannel_Release,
+    nsUploadChannel_SetUploadStream,
+    nsUploadChannel_GetUploadStream
+};
+
 static nsresult NSAPI nsURI_QueryInterface(nsIWineURI *iface, nsIIDRef riid, nsQIResult result)
 {
     nsURI *This = NSURI_THIS(iface);
@@ -1122,10 +1219,12 @@ static nsresult NSAPI nsIOService_NewCha
     ret = HeapAlloc(GetProcessHeap(), 0, sizeof(nsChannel));
 
     ret->lpHttpChannelVtbl = &nsChannelVtbl;
+    ret->lpUploadChannelVtbl = &nsUploadChannelVtbl;
     ret->ref = 1;
     ret->channel = channel;
     ret->http_channel = NULL;
     ret->uri = wine_uri;
+    ret->post_data_stream = NULL;
 
     nsIChannel_QueryInterface(ret->channel, &IID_nsIHttpChannel, (void**)&ret->http_channel);
 




More information about the wine-cvs mailing list