mshtml: Set binding channel, listener and context in AsyncOpen.

This commit is contained in:
Jacek Caban 2006-06-03 00:40:26 +02:00 committed by Alexandre Julliard
parent e0157ba201
commit f1d2e37655
4 changed files with 68 additions and 24 deletions

View File

@ -115,6 +115,22 @@ struct NSContainer {
BSCallback *bscallback; /* hack */ BSCallback *bscallback; /* hack */
}; };
typedef struct {
const nsIHttpChannelVtbl *lpHttpChannelVtbl;
const nsIUploadChannelVtbl *lpUploadChannelVtbl;
LONG ref;
nsIChannel *channel;
nsIHttpChannel *http_channel;
nsIWineURI *uri;
nsIInputStream *post_data_stream;
nsILoadGroup *load_group;
nsIInterfaceRequestor *notif_callback;
nsLoadFlags load_flags;
nsIURI *original_uri;
} nsChannel;
struct BSCallback { struct BSCallback {
const IBindStatusCallbackVtbl *lpBindStatusCallbackVtbl; const IBindStatusCallbackVtbl *lpBindStatusCallbackVtbl;
const IServiceProviderVtbl *lpServiceProviderVtbl; const IServiceProviderVtbl *lpServiceProviderVtbl;
@ -126,6 +142,10 @@ struct BSCallback {
LPWSTR headers; LPWSTR headers;
HGLOBAL post_data; HGLOBAL post_data;
ULONG post_data_len; ULONG post_data_len;
nsChannel *nschannel;
nsIStreamListener *nslistener;
nsISupports *nscontext;
}; };
struct HTMLDOMNode { struct HTMLDOMNode {
@ -185,7 +205,6 @@ typedef struct {
#define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl) #define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl)
#define CMDTARGET(x) ((IOleCommandTarget*) &(x)->lpOleCommandTargetVtbl) #define CMDTARGET(x) ((IOleCommandTarget*) &(x)->lpOleCommandTargetVtbl)
#define CONTROL(x) ((IOleControl*) &(x)->lpOleControlVtbl) #define CONTROL(x) ((IOleControl*) &(x)->lpOleControlVtbl)
#define STATUSCLB(x) ((IBindStatusCallback*) &(x)->lpBindStatusCallbackVtbl)
#define HLNKTARGET(x) ((IHlinkTarget*) &(x)->lpHlinkTargetVtbl) #define HLNKTARGET(x) ((IHlinkTarget*) &(x)->lpHlinkTargetVtbl)
#define CONPTCONT(x) ((IConnectionPointContainer*) &(x)->lpConnectionPointContainerVtbl) #define CONPTCONT(x) ((IConnectionPointContainer*) &(x)->lpConnectionPointContainerVtbl)
#define PERSTRINIT(x) ((IPersistStreamInit*) &(x)->lpPersistStreamInitVtbl) #define PERSTRINIT(x) ((IPersistStreamInit*) &(x)->lpPersistStreamInitVtbl)
@ -199,9 +218,13 @@ typedef struct {
#define NSWEAKREF(x) ((nsIWeakReference*) &(x)->lpWeakReferenceVtbl) #define NSWEAKREF(x) ((nsIWeakReference*) &(x)->lpWeakReferenceVtbl)
#define NSSUPWEAKREF(x) ((nsISupportsWeakReference*) &(x)->lpSupportsWeakReferenceVtbl) #define NSSUPWEAKREF(x) ((nsISupportsWeakReference*) &(x)->lpSupportsWeakReferenceVtbl)
#define HTTPNEG(x) ((IHttpNegotiate2*) &(x)->lpHttpNegotiate2Vtbl) #define NSCHANNEL(x) ((nsIChannel*) &(x)->lpHttpChannelVtbl)
#define BINDINFO(x) ((IInternetBindInfo*) &(x)->lpInternetBindInfoVtbl); #define NSHTTPCHANNEL(x) ((nsIHttpChannel*) &(x)->lpHttpChannelVtbl)
#define NSUPCHANNEL(x) ((nsIUploadChannel*) &(x)->lpUploadChannelVtbl)
#define HTTPNEG(x) ((IHttpNegotiate2*) &(x)->lpHttpNegotiate2Vtbl)
#define STATUSCLB(x) ((IBindStatusCallback*) &(x)->lpBindStatusCallbackVtbl)
#define BINDINFO(x) ((IInternetBindInfo*) &(x)->lpInternetBindInfoVtbl);
#define HTMLELEM(x) ((IHTMLElement*) &(x)->lpHTMLElementVtbl) #define HTMLELEM(x) ((IHTMLElement*) &(x)->lpHTMLElementVtbl)
#define HTMLELEM2(x) ((IHTMLElement2*) &(x)->lpHTMLElement2Vtbl) #define HTMLELEM2(x) ((IHTMLElement2*) &(x)->lpHTMLElement2Vtbl)
@ -253,7 +276,9 @@ PRUint32 nsAString_GetData(const nsAString*,const PRUnichar**,PRBool*);
void nsAString_Finish(nsAString*); void nsAString_Finish(nsAString*);
nsIInputStream *create_nsstream(const char*,PRInt32); nsIInputStream *create_nsstream(const char*,PRInt32);
BSCallback *create_bscallback(HTMLDocument*,LPCOLESTR); BSCallback *create_bscallback(HTMLDocument*,LPCOLESTR);
HRESULT start_binding(BSCallback*,IMoniker*);
IHlink *Hlink_Create(void); IHlink *Hlink_Create(void);

View File

@ -96,6 +96,12 @@ static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface)
if(!ref) { if(!ref) {
if(This->post_data) if(This->post_data)
GlobalFree(This->post_data); GlobalFree(This->post_data);
if(This->nschannel)
nsIChannel_Release(NSCHANNEL(This->nschannel));
if(This->nslistener)
nsIStreamListener_Release(This->nslistener);
if(This->nscontext)
nsISupports_Release(This->nscontext);
HeapFree(GetProcessHeap(), 0, This->headers); HeapFree(GetProcessHeap(), 0, This->headers);
HeapFree(GetProcessHeap(), 0, This); HeapFree(GetProcessHeap(), 0, This);
} }
@ -371,6 +377,9 @@ BSCallback *create_bscallback(HTMLDocument *doc, LPCOLESTR url)
ret->post_data = NULL; ret->post_data = NULL;
ret->headers = NULL; ret->headers = NULL;
ret->post_data_len = 0; ret->post_data_len = 0;
ret->nschannel = NULL;
ret->nslistener = NULL;
ret->nscontext = NULL;
return ret; return ret;
} }

View File

@ -87,9 +87,7 @@ typedef nsISupports nsIWidget;
typedef nsISupports nsIProtocolHandler; typedef nsISupports nsIProtocolHandler;
typedef nsISupports nsIDOMEventTarget; typedef nsISupports nsIDOMEventTarget;
typedef nsISupports nsIDOMAbstractView; typedef nsISupports nsIDOMAbstractView;
typedef nsISupports nsIStreamListener;
typedef nsISupports nsIHttpHeaderVisitor; typedef nsISupports nsIHttpHeaderVisitor;
typedef nsISupports nsIRequestObserver;
typedef nsISupports nsIDOMBarProp; typedef nsISupports nsIDOMBarProp;
typedef nsISupports nsIDOMWindowCollection; typedef nsISupports nsIDOMWindowCollection;
typedef nsISupports nsISelection; typedef nsISupports nsISelection;
@ -273,6 +271,26 @@ interface nsIRequest : nsISupports
nsresult SetLoadFlags(nsLoadFlags aLoadFlags); nsresult SetLoadFlags(nsLoadFlags aLoadFlags);
} }
[
object,
uuid(fd91e2e0-1481-11d3-9333-00104ba0fd40)
]
interface nsIRequestObserver : nsISupports
{
nsresult OnStartRequest(nsIRequest *aRequest, nsISupports *aContext);
nsresult OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode);
}
[
object,
uuid(1a637020-1482-11d3-9333-00104ba0fd40)
]
interface nsIStreamListener : nsIRequestObserver
{
nsresult OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext,
nsIInputStream *aInputStream, PRUint32 aOffset, PRUint32 aCount);
}
[ [
object, object,
uuid(3de0a31c-feaf-400f-9f1e-4ef71f8b20cc) uuid(3de0a31c-feaf-400f-9f1e-4ef71f8b20cc)

View File

@ -45,22 +45,6 @@ static const IID NS_IOSERVICE_CID =
static nsIIOService *nsio = NULL; 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;
nsILoadGroup *load_group;
nsIInterfaceRequestor *notif_callback;
nsLoadFlags load_flags;
nsIURI *original_uri;
} nsChannel;
typedef struct { typedef struct {
const nsIWineURIVtbl *lpWineURIVtbl; const nsIWineURIVtbl *lpWineURIVtbl;
@ -70,9 +54,6 @@ typedef struct {
NSContainer *container; NSContainer *container;
} nsURI; } nsURI;
#define NSCHANNEL(x) ((nsIChannel*) &(x)->lpHttpChannelVtbl)
#define NSHTTPCHANNEL(x) ((nsIHttpChannel*) &(x)->lpHttpChannelVtbl)
#define NSUPCHANNEL(x) ((nsIUploadChannel*) &(x)->lpUploadChannelVtbl)
#define NSURI(x) ((nsIURI*) &(x)->lpWineURIVtbl) #define NSURI(x) ((nsIURI*) &(x)->lpWineURIVtbl)
static nsresult create_uri(nsIURI*,NSContainer*,nsIURI**); static nsresult create_uri(nsIURI*,NSContainer*,nsIURI**);
@ -590,6 +571,17 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
} }
if(container->bscallback) { if(container->bscallback) {
nsIChannel_AddRef(NSCHANNEL(This));
container->bscallback->nschannel = This;
nsIStreamListener_AddRef(aListener);
container->bscallback->nslistener = aListener;
if(aContext) {
nsISupports_AddRef(aContext);
container->bscallback->nscontext = aContext;
}
nsIWebBrowserChrome_Release(NSWBCHROME(container)); nsIWebBrowserChrome_Release(NSWBCHROME(container));
}else { }else {
BOOL cont = before_async_open(This, container); BOOL cont = before_async_open(This, container);