Module: wine Branch: master Commit: 863a761426fdf1e0f642c2a0f4256bd2c1aaa44f URL: http://source.winehq.org/git/wine.git/?a=commit;h=863a761426fdf1e0f642c2a0f4...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Mar 11 00:21:03 2014 +0400
scrrun: Implement Count() property for drive collection.
---
dlls/scrrun/filesystem.c | 16 +++++++++++++--- dlls/scrrun/tests/filesystem.c | 7 ++++--- 2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c index c052906..5daa5ce 100644 --- a/dlls/scrrun/filesystem.c +++ b/dlls/scrrun/filesystem.c @@ -54,6 +54,7 @@ struct drivecollection { IDriveCollection IDriveCollection_iface; LONG ref; DWORD drives; + LONG count; };
struct enumdata { @@ -1675,8 +1676,13 @@ static HRESULT WINAPI drivecoll_get__NewEnum(IDriveCollection *iface, IUnknown * static HRESULT WINAPI drivecoll_get_Count(IDriveCollection *iface, LONG *count) { struct drivecollection *This = impl_from_IDriveCollection(iface); - FIXME("(%p)->(%p): stub\n", This, count); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, count); + + if (!count) return E_POINTER; + + *count = This->count; + return S_OK; }
static const IDriveCollectionVtbl drivecollectionvtbl = { @@ -1695,6 +1701,7 @@ static const IDriveCollectionVtbl drivecollectionvtbl = { static HRESULT create_drivecoll(IDriveCollection **drives) { struct drivecollection *This; + DWORD mask;
*drives = NULL;
@@ -1703,7 +1710,10 @@ static HRESULT create_drivecoll(IDriveCollection **drives)
This->IDriveCollection_iface.lpVtbl = &drivecollectionvtbl; This->ref = 1; - This->drives = GetLogicalDrives(); + This->drives = mask = GetLogicalDrives(); + /* count set bits */ + for (This->count = 0; mask; This->count++) + mask &= mask - 1;
*drives = &This->IDriveCollection_iface; return S_OK; diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index c14e846..8502934 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -1157,12 +1157,14 @@ static void test_DriveCollection(void) hr = IDriveCollection_get__NewEnum(drives, (IUnknown**)&enumvar); ok(hr == S_OK, "got 0x%08x\n", hr);
+ hr = IDriveCollection_get_Count(drives, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + count = 0; hr = IDriveCollection_get_Count(drives, &count); -todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(count > 0, "got %d\n", count); -} + V_VT(&var) = VT_EMPTY; fetched = -1; hr = IEnumVARIANT_Next(enumvar, 0, &var, &fetched); @@ -1176,7 +1178,6 @@ todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IEnumVARIANT_Skip(enumvar, 1); -todo_wine ok(hr == S_FALSE, "got 0x%08x\n", hr);
IEnumVARIANT_Release(enumvar);