Sync to Wine-20050111:
Michael Stefaniuc <mstefani@redhat.de>
- Do not check for non NULL pointer before HeapFree'ing it. It's
  redundant.
Jacek Caban <jack@itma.pwr.wroc.pl>
- Added test of BindToStorage.
- Added some declarations to urlmon.idl.
- Implemented CreateAsyncBindCtx.
- Added test.
Modified: trunk/reactos/lib/urlmon/umon.c

Modified: trunk/reactos/lib/urlmon/umon.c
--- trunk/reactos/lib/urlmon/umon.c	2005-01-12 23:07:36 UTC (rev 13002)
+++ trunk/reactos/lib/urlmon/umon.c	2005-01-12 23:10:02 UTC (rev 13003)
@@ -123,9 +123,7 @@
 
     /* destroy the object if there's no more reference on it */
     if (ref == 0) {
-        if (This->URLName!=NULL)
-            HeapFree(GetProcessHeap(),0,This->URLName);
-
+        HeapFree(GetProcessHeap(),0,This->URLName);
         HeapFree(GetProcessHeap(),0,This);
     }
 
@@ -186,8 +184,7 @@
     res = IStream_Read(pStm, &len, sizeof(ULONG), &got);
     if(SUCCEEDED(res)) {
         if(got == sizeof(ULONG)) {
-            if(This->URLName)
-                HeapFree(GetProcessHeap(), 0, This->URLName);
+            HeapFree(GetProcessHeap(), 0, This->URLName);
             This->URLName=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(len+1));
             if(!This->URLName)
                 res = E_OUTOFMEMORY;
@@ -324,6 +321,7 @@
     IBindStatusCallback *pbscb;
     BINDINFO bi;
     DWORD bindf;
+    IStream *pstr;
 
     FIXME("(%p)->(%p,%p,%s,%p): stub\n",This,pbc,pmkToLeft,debugstr_guid(riid),ppvObject);
     if(pmkToLeft) {
@@ -339,32 +337,31 @@
        We also need to implement IStream ourselves so that IStream_Read can return
        E_PENDING */
 
-    hres = CreateStreamOnHGlobal(0, TRUE, (IStream**)ppvObject);
+    hres = CreateStreamOnHGlobal(0, TRUE, &pstr);
 
-
     if(SUCCEEDED(hres)) {
-	TRACE("Created dummy stream...\n");
+        TRACE("Created dummy stream...\n");
 
-	hres = IBindCtx_GetObjectParam(pbc, (LPOLESTR)BSCBHolder, (IUnknown**)&pbscb);
-	if(SUCCEEDED(hres)) {
-	    TRACE("Got IBindStatusCallback...\n");
+        hres = IBindCtx_GetObjectParam(pbc, (LPOLESTR)BSCBHolder, (IUnknown**)&pbscb);
+        if(SUCCEEDED(hres)) {
+            TRACE("Got IBindStatusCallback...\n");
 
-	    memset(&bi, 0, sizeof(bi));
-	    bi.cbSize = sizeof(bi);
-	    bindf = 0;
-	    hres = IBindStatusCallback_GetBindInfo(pbscb, &bindf, &bi);
-	    if(SUCCEEDED(hres)) {
-		URL_COMPONENTSW url;
-		WCHAR *host, *path;
-		DWORD len, lensz = sizeof(len), total_read = 0;
-		LARGE_INTEGER last_read_pos;
-		FORMATETC fmt;
-		STGMEDIUM stg;
+            memset(&bi, 0, sizeof(bi));
+            bi.cbSize = sizeof(bi);
+            bindf = 0;
+            hres = IBindStatusCallback_GetBindInfo(pbscb, &bindf, &bi);
+            if(SUCCEEDED(hres)) {
+                URL_COMPONENTSW url;
+                WCHAR *host, *path;
+                DWORD len, lensz = sizeof(len), total_read = 0;
+                LARGE_INTEGER last_read_pos;
+                FORMATETC fmt;
+                STGMEDIUM stg;
 
-		TRACE("got bindinfo. bindf = %08lx extrainfo = %s bindinfof = %08lx bindverb = %08lx iid %s\n",
-		      bindf, debugstr_w(bi.szExtraInfo), bi.grfBindInfoF, bi.dwBindVerb, debugstr_guid(&bi.iid));
-		hres = IBindStatusCallback_OnStartBinding(pbscb, 0, (IBinding*)&This->lpvtbl2);
-		TRACE("OnStartBinding rets %08lx\n", hres);
+                TRACE("got bindinfo. bindf = %08lx extrainfo = %s bindinfof = %08lx bindverb = %08lx iid %s\n",
+                      bindf, debugstr_w(bi.szExtraInfo), bi.grfBindInfoF, bi.dwBindVerb, debugstr_guid(&bi.iid));
+                hres = IBindStatusCallback_OnStartBinding(pbscb, 0, (IBinding*)&This->lpvtbl2);
+                TRACE("OnStartBinding rets %08lx\n", hres);
 
 #if 0
 		if(!registered_wndclass) {
@@ -377,80 +374,81 @@
 						   URLMON_hInstance, NULL);
 
 #endif
-		memset(&url, 0, sizeof(url));
-		url.dwStructSize = sizeof(url);
-		url.dwSchemeLength = url.dwHostNameLength = url.dwUrlPathLength = 1;
-		InternetCrackUrlW(This->URLName, 0, 0, &url);
-		host = HeapAlloc(GetProcessHeap(), 0, (url.dwHostNameLength + 1) * sizeof(WCHAR));
-		memcpy(host, url.lpszHostName, url.dwHostNameLength * sizeof(WCHAR));
-		host[url.dwHostNameLength] = '\0';
-		path = HeapAlloc(GetProcessHeap(), 0, (url.dwUrlPathLength + 1) * sizeof(WCHAR));
-		memcpy(path, url.lpszUrlPath, url.dwUrlPathLength * sizeof(WCHAR));
-		path[url.dwUrlPathLength] = '\0';
+                memset(&url, 0, sizeof(url));
+                url.dwStructSize = sizeof(url);
+                url.dwSchemeLength = url.dwHostNameLength = url.dwUrlPathLength = 1;
+                InternetCrackUrlW(This->URLName, 0, 0, &url);
+                host = HeapAlloc(GetProcessHeap(), 0, (url.dwHostNameLength + 1) * sizeof(WCHAR));
+                memcpy(host, url.lpszHostName, url.dwHostNameLength * sizeof(WCHAR));
+                host[url.dwHostNameLength] = '\0';
+                path = HeapAlloc(GetProcessHeap(), 0, (url.dwUrlPathLength + 1) * sizeof(WCHAR));
+                memcpy(path, url.lpszUrlPath, url.dwUrlPathLength * sizeof(WCHAR));
+                path[url.dwUrlPathLength] = '\0';
 
-		This->hinternet = InternetOpenA("User Agent", 0, NULL, NULL, 0 /*INTERNET_FLAG_ASYNC*/);
-/*		InternetSetStatusCallback(This->hinternet, URLMON_InternetCallback);*/
+                This->hinternet = InternetOpenA("User Agent", 0, NULL, NULL, 0 /*INTERNET_FLAG_ASYNC*/);
+/*              InternetSetStatusCallback(This->hinternet, URLMON_InternetCallback);*/
 
-		This->hconnect = InternetConnectW(This->hinternet, host, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL,
-					    INTERNET_SERVICE_HTTP, 0, (DWORD)This);
-		This->hrequest = HttpOpenRequestW(This->hconnect, NULL, path, NULL, NULL, NULL, 0, (DWORD)This);
+                This->hconnect = InternetConnectW(This->hinternet, host, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL,
+                                                  INTERNET_SERVICE_HTTP, 0, (DWORD)This);
+                This->hrequest = HttpOpenRequestW(This->hconnect, NULL, path, NULL, NULL, NULL, 0, (DWORD)This);
 
-		hres = IBindStatusCallback_OnProgress(pbscb, 0, 0, 0x22, NULL);
-		hres = IBindStatusCallback_OnProgress(pbscb, 0, 0, BINDSTATUS_FINDINGRESOURCE, NULL);
-		hres = IBindStatusCallback_OnProgress(pbscb, 0, 0, BINDSTATUS_CONNECTING, NULL);
-		hres = IBindStatusCallback_OnProgress(pbscb, 0, 0, BINDSTATUS_SENDINGREQUEST, NULL);
-		hres = E_OUTOFMEMORY; /* FIXME */
-		if(HttpSendRequestW(This->hrequest, NULL, 0, NULL, 0)) {
+                hres = IBindStatusCallback_OnProgress(pbscb, 0, 0, 0x22, NULL);
+                hres = IBindStatusCallback_OnProgress(pbscb, 0, 0, BINDSTATUS_FINDINGRESOURCE, NULL);
+                hres = IBindStatusCallback_OnProgress(pbscb, 0, 0, BINDSTATUS_CONNECTING, NULL);
+                hres = IBindStatusCallback_OnProgress(pbscb, 0, 0, BINDSTATUS_SENDINGREQUEST, NULL);
+                hres = E_OUTOFMEMORY; /* FIXME */
+                if(HttpSendRequestW(This->hrequest, NULL, 0, NULL, 0)) {
+                    len = 0;
+                    HttpQueryInfoW(This->hrequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &len, &lensz, NULL);
 
-		    len = 0;
-		    HttpQueryInfoW(This->hrequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &len, &lensz, NULL);
+                    TRACE("res = %ld gle = %08lx url len = %ld\n", hres, GetLastError(), len);
 
-		    TRACE("res = %ld gle = %08lx url len = %ld\n", hres, GetLastError(), len);
+                    last_read_pos.u.LowPart = last_read_pos.u.HighPart = 0;
+                    fmt.cfFormat = 0;
+                    fmt.ptd = NULL;
+                    fmt.dwAspect = 0;
+                    fmt.lindex = -1;
+                    fmt.tymed = TYMED_ISTREAM;
+                    stg.tymed = TYMED_ISTREAM;
+                    stg.u.pstm = pstr;
+                    stg.pUnkForRelease = NULL;
 
-		    last_read_pos.u.LowPart = last_read_pos.u.HighPart = 0;
-		    fmt.cfFormat = 0;
-		    fmt.ptd = NULL;
-		    fmt.dwAspect = 0;
-		    fmt.lindex = -1;
-		    fmt.tymed = TYMED_ISTREAM;
-		    stg.tymed = TYMED_ISTREAM;
-		    stg.u.pstm = *(IStream**)ppvObject;
-		    stg.pUnkForRelease = NULL;
-
-		    while(1) {
-			char buf[4096];
-			DWORD bufread;
-			DWORD written;
-			if(InternetReadFile(This->hrequest, buf, sizeof(buf), &bufread)) {
-			    TRACE("read %ld bytes %s...\n", bufread, debugstr_an(buf, 10));
-			    if(bufread == 0) break;
-			    IStream_Write(*(IStream**)ppvObject, buf, bufread, &written);
-			    total_read += bufread;
-			    IStream_Seek(*(IStream**)ppvObject, last_read_pos, STREAM_SEEK_SET, NULL);
-			    hres = IBindStatusCallback_OnProgress(pbscb, total_read, len, (total_read == bufread) ?
-								  BINDSTATUS_BEGINDOWNLOADDATA :
-								  BINDSTATUS_DOWNLOADINGDATA, NULL);
-			    hres = IBindStatusCallback_OnDataAvailable(pbscb,
-								       (total_read == bufread) ? BSCF_FIRSTDATANOTIFICATION :
-								       BSCF_INTERMEDIATEDATANOTIFICATION,
-								       total_read, &fmt, &stg);
-			    last_read_pos.u.LowPart += bufread; /* FIXME */
-			} else
-			    break;
+                    while(1) {
+                        char buf[4096];
+                        DWORD bufread;
+                        DWORD written;
+                        if(InternetReadFile(This->hrequest, buf, sizeof(buf), &bufread)) {
+                            TRACE("read %ld bytes %s...\n", bufread, debugstr_an(buf, 10));
+                            if(bufread == 0) break;
+                            IStream_Write(pstr, buf, bufread, &written);
+                            total_read += bufread;
+                            IStream_Seek(pstr, last_read_pos, STREAM_SEEK_SET, NULL);
+                            hres = IBindStatusCallback_OnProgress(pbscb, total_read, len, (total_read == bufread) ?
+                                                                  BINDSTATUS_BEGINDOWNLOADDATA :
+                                                                  BINDSTATUS_DOWNLOADINGDATA, NULL);
+                            hres = IBindStatusCallback_OnDataAvailable(pbscb,
+                                                                       (total_read == bufread) ? BSCF_FIRSTDATANOTIFICATION :
+                                                                       BSCF_INTERMEDIATEDATANOTIFICATION,
+                                                                       total_read, &fmt, &stg);
+                            last_read_pos.u.LowPart += bufread; /* FIXME */
+                        } else
+                            break;
 		    }
-		    hres = IBindStatusCallback_OnProgress(pbscb, total_read, len, BINDSTATUS_ENDDOWNLOADDATA, NULL);
-		    hres = IBindStatusCallback_OnDataAvailable(pbscb, BSCF_LASTDATANOTIFICATION, total_read, &fmt, &stg);
-		    TRACE("OnDataAvail rets %08lx\n", hres);
-		    hres = IBindStatusCallback_OnStopBinding(pbscb, S_OK, NULL);
-		    TRACE("OnStop rets %08lx\n", hres);
-		    hres = S_OK;
-		}
-		InternetCloseHandle(This->hrequest);
-		InternetCloseHandle(This->hconnect);
-		InternetCloseHandle(This->hinternet);
-	    }
-	}
+                    hres = IBindStatusCallback_OnProgress(pbscb, total_read, len, BINDSTATUS_ENDDOWNLOADDATA, NULL);
+                    hres = IBindStatusCallback_OnDataAvailable(pbscb, BSCF_LASTDATANOTIFICATION, total_read, &fmt, &stg);
+                    TRACE("OnDataAvail rets %08lx\n", hres);
+                    hres = IBindStatusCallback_OnStopBinding(pbscb, S_OK, NULL);
+                    TRACE("OnStop rets %08lx\n", hres);
+                    hres = S_OK;
+                }
+                InternetCloseHandle(This->hrequest);
+                InternetCloseHandle(This->hconnect);
+                InternetCloseHandle(This->hinternet);
+                IBindStatusCallback_Release(pbscb);
+            }
+        }
     }
+    *ppvObject = (VOID*)pstr;
     return hres;
 }
 
@@ -752,7 +750,7 @@
 static HRESULT WINAPI URLMonikerImpl_IBinding_GetBindResult(IBinding* iface, CLSID* pclsidProtocol, DWORD* pdwResult, LPOLESTR* pszResult, DWORD* pdwReserved)
 {
     ICOM_THIS_MULTI(URLMonikerImpl, lpvtbl2, iface);
-    FIXME("(%p)->(%s, %p, %p, %p): stub\n", This, debugstr_guid(pclsidProtocol), pdwResult, pszResult, pdwReserved);
+    FIXME("(%p)->(%p, %p, %p, %p): stub\n", This, pclsidProtocol, pdwResult, pszResult, pdwReserved);
 
     return E_NOTIMPL;
 }
@@ -882,8 +880,36 @@
 HRESULT WINAPI CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *callback,
     IEnumFORMATETC *format, IBindCtx **pbind)
 {
-    FIXME("stub.\n");
-    return E_INVALIDARG;
+    HRESULT hres;
+    BIND_OPTS bindopts;
+    IBindCtx *bctx;
+
+    TRACE("(%08lx %p %p %p)\n", reserved, callback, format, pbind);
+
+    if(!callback)
+        return E_INVALIDARG;
+    if(format)
+        FIXME("format is not supported yet\n");
+
+    hres = CreateBindCtx(0, &bctx);
+    if(FAILED(hres))
+        return hres;
+
+    bindopts.cbStruct = sizeof(BIND_OPTS);
+    bindopts.grfFlags = BIND_MAYBOTHERUSER;
+    bindopts.grfMode = STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
+    bindopts.dwTickCountDeadline = 0;
+    IBindCtx_SetBindOptions(bctx, &bindopts);
+
+    hres = IBindCtx_RegisterObjectParam(bctx, (LPOLESTR)BSCBHolder, (IUnknown*)callback);
+    if(FAILED(hres)) {
+        IBindCtx_Release(bctx);
+        return hres;
+    }
+
+    *pbind = bctx;
+
+    return S_OK;
 }
 /***********************************************************************
  *           CreateAsyncBindCtxEx (URLMON.@)
@@ -892,7 +918,7 @@
  *
  * FIXME
  *   Not implemented.
- */
+ */ 
 HRESULT WINAPI CreateAsyncBindCtxEx(IBindCtx *ibind, DWORD options,
     IBindStatusCallback *callback, IEnumFORMATETC *format, IBindCtx** pbind,
     DWORD reserved)