\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
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
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
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
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
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
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
*\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