Piotr Caban : urlmon: Added ProtocolStream_Stat implementation.
Alexandre Julliard
julliard at winehq.org
Mon Oct 11 13:15:09 CDT 2010
Module: wine
Branch: master
Commit: 8e48cd1ad7ae94d0db30373ff9a0812fa743815d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8e48cd1ad7ae94d0db30373ff9a0812fa743815d
Author: Piotr Caban <piotr at codeweavers.com>
Date: Sun Oct 10 22:22:13 2010 +0200
urlmon: Added ProtocolStream_Stat implementation.
---
dlls/urlmon/binding.c | 26 ++++++++++++++++++++++++--
dlls/urlmon/tests/url.c | 26 ++++++++++++++++++++++++++
2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index b7f742d..ca2b91d 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -632,8 +632,30 @@ static HRESULT WINAPI ProtocolStream_Stat(IStream *iface, STATSTG *pstatstg,
DWORD dwStatFlag)
{
ProtocolStream *This = STREAM_THIS(iface);
- FIXME("(%p)->(%p %08x)\n", This, pstatstg, dwStatFlag);
- return E_NOTIMPL;
+ TRACE("(%p)->(%p %08x)\n", This, pstatstg, dwStatFlag);
+
+ if(!pstatstg)
+ return E_FAIL;
+
+ memset(pstatstg, 0, sizeof(STATSTG));
+
+ if(!(dwStatFlag&STATFLAG_NONAME) && This->buf->cache_file) {
+ pstatstg->pwcsName = CoTaskMemAlloc((lstrlenW(This->buf->cache_file)+1)*sizeof(WCHAR));
+ if(!pstatstg->pwcsName)
+ return STG_E_INSUFFICIENTMEMORY;
+
+ lstrcpyW(pstatstg->pwcsName, This->buf->cache_file);
+ }
+
+ pstatstg->type = STGTY_STREAM;
+ if(This->buf->file != INVALID_HANDLE_VALUE) {
+ GetFileSizeEx(This->buf->file, (PLARGE_INTEGER)&pstatstg->cbSize);
+ GetFileTime(This->buf->file, &pstatstg->ctime, &pstatstg->atime, &pstatstg->mtime);
+ if(pstatstg->cbSize.QuadPart)
+ pstatstg->grfMode = GENERIC_READ;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI ProtocolStream_Clone(IStream *iface, IStream **ppstm)
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index 9bd25a7..03a95fd 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -1625,6 +1625,8 @@ static HRESULT WINAPI statusclb_OnDataAvailable(IBindStatusCallbackEx *iface, DW
switch(pstgmed->tymed) {
case TYMED_ISTREAM:
if(grfBSCF & BSCF_FIRSTDATANOTIFICATION) {
+ STATSTG stat;
+
hres = IStream_Write(U(*pstgmed).pstm, buf, 10, NULL);
ok(hres == STG_E_ACCESSDENIED,
"Write failed: %08x, expected STG_E_ACCESSDENIED\n", hres);
@@ -1634,6 +1636,30 @@ static HRESULT WINAPI statusclb_OnDataAvailable(IBindStatusCallbackEx *iface, DW
hres = IStream_Revert(U(*pstgmed).pstm);
ok(hres == E_NOTIMPL, "Revert failed: %08x, expected E_NOTIMPL\n", hres);
+
+ hres = IStream_Stat(U(*pstgmed).pstm, NULL, STATFLAG_NONAME);
+ ok(hres == E_FAIL, "hres = %x\n", hres);
+ if(use_cache_file && emulate_protocol) {
+ hres = IStream_Stat(U(*pstgmed).pstm, &stat, STATFLAG_DEFAULT);
+ ok(hres == S_OK, "hres = %x\n", hres);
+ ok(!lstrcmpW(stat.pwcsName, cache_file_name),
+ "stat.pwcsName = %s, cache_file_name = %s\n",
+ wine_dbgstr_w(stat.pwcsName), wine_dbgstr_w(cache_file_name));
+ CoTaskMemFree(stat.pwcsName);
+ ok(U(stat.cbSize).LowPart == (bindf&BINDF_ASYNCHRONOUS?0:6500),
+ "stat.cbSize.LowPart = %u\n", U(stat.cbSize).LowPart);
+ } else {
+ hres = IStream_Stat(U(*pstgmed).pstm, &stat, STATFLAG_NONAME);
+ ok(hres == S_OK, "hres = %x\n", hres);
+ ok(!stat.pwcsName || broken(stat.pwcsName!=NULL),
+ "stat.pwcsName = %s\n", wine_dbgstr_w(stat.pwcsName));
+ }
+ ok(stat.type == STGTY_STREAM, "stat.type = %x\n", stat.type);
+ ok(U(stat.cbSize).HighPart == 0, "stat.cbSize.HighPart != 0\n");
+ ok(stat.grfMode == (U(stat.cbSize).LowPart?GENERIC_READ:0), "stat.grfMode = %x\n", stat.grfMode);
+ ok(stat.grfLocksSupported == 0, "stat.grfLocksSupported = %x\n", stat.grfLocksSupported);
+ ok(stat.grfStateBits == 0, "stat.grfStateBits = %x\n", stat.grfStateBits);
+ ok(stat.reserved == 0, "stat.reserved = %x\n", stat.reserved);
}
ok(U(*pstgmed).pstm != NULL, "U(*pstgmed).pstm == NULL\n");
More information about the wine-cvs
mailing list