Sync to Wine-20050111:
authorGé van Geldorp <ge@gse.nl>
Wed, 12 Jan 2005 23:10:02 +0000 (23:10 +0000)
committerGé van Geldorp <ge@gse.nl>
Wed, 12 Jan 2005 23:10:02 +0000 (23:10 +0000)
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.

svn path=/trunk/; revision=13003

reactos/lib/urlmon/umon.c

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