Nikolay Sivov : scrrun: Implement Skip() for drive collection.

Alexandre Julliard julliard at winehq.org
Tue Mar 11 14:45:39 CDT 2014


Module: wine
Branch: master
Commit: a30a2abbc40ce984c28d95b30b53a47c81c440a9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a30a2abbc40ce984c28d95b30b53a47c81c440a9

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Mar 11 00:20:48 2014 +0400

scrrun: Implement Skip() for drive collection.

---

 dlls/scrrun/filesystem.c       |   18 ++++++++++-------
 dlls/scrrun/tests/filesystem.c |   42 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index ccdb9ee..c052906 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -1103,16 +1103,18 @@ static HRESULT WINAPI drivecoll_enumvariant_Next(IEnumVARIANT *iface, ULONG celt
 {
     struct enumvariant *This = impl_from_IEnumVARIANT(iface);
     ULONG count = 0;
-    HRESULT hr;
 
     TRACE("(%p)->(%d %p %p)\n", This, celt, var, fetched);
 
     if (fetched)
         *fetched = 0;
 
+    if (!celt) return S_OK;
+
     while (find_next_drive(This) == S_OK)
     {
         IDrive *drive;
+        HRESULT hr;
 
         hr = create_drive('A' + This->data.u.drivecoll.cur, &drive);
         if (FAILED(hr)) return hr;
@@ -1123,22 +1125,24 @@ static HRESULT WINAPI drivecoll_enumvariant_Next(IEnumVARIANT *iface, ULONG celt
         if (++count >= celt) break;
     }
 
-    if (count < celt)
-        return S_FALSE;
-
     if (fetched)
         *fetched = count;
 
-    return S_OK;
+    return (count < celt) ? S_FALSE : S_OK;
 }
 
 static HRESULT WINAPI drivecoll_enumvariant_Skip(IEnumVARIANT *iface, ULONG celt)
 {
     struct enumvariant *This = impl_from_IEnumVARIANT(iface);
 
-    FIXME("(%p)->(%d): stub\n", This, celt);
+    TRACE("(%p)->(%d)\n", This, celt);
 
-    return E_NOTIMPL;
+    if (!celt) return S_OK;
+
+    while (celt && find_next_drive(This) == S_OK)
+        celt--;
+
+    return celt ? S_FALSE : S_OK;
 }
 
 static HRESULT WINAPI drivecoll_enumvariant_Reset(IEnumVARIANT *iface)
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c
index a09d54b..c14e846 100644
--- a/dlls/scrrun/tests/filesystem.c
+++ b/dlls/scrrun/tests/filesystem.c
@@ -1142,6 +1142,47 @@ todo_wine
     IFileCollection_Release(files);
 }
 
+static void test_DriveCollection(void)
+{
+    IDriveCollection *drives;
+    IEnumVARIANT *enumvar;
+    ULONG fetched;
+    VARIANT var;
+    HRESULT hr;
+    LONG count;
+
+    hr = IFileSystem3_get_Drives(fs3, &drives);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDriveCollection_get__NewEnum(drives, (IUnknown**)&enumvar);
+    ok(hr == S_OK, "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);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(fetched == 0, "got %d\n", fetched);
+
+    hr = IEnumVARIANT_Skip(enumvar, 0);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IEnumVARIANT_Skip(enumvar, count);
+    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);
+    IDriveCollection_Release(drives);
+}
+
 START_TEST(filesystem)
 {
     HRESULT hr;
@@ -1169,6 +1210,7 @@ START_TEST(filesystem)
     test_GetFolder();
     test_FolderCollection();
     test_FileCollection();
+    test_DriveCollection();
 
     IFileSystem3_Release(fs3);
 




More information about the wine-cvs mailing list