Hans Leidekker : fusion: Implement IAssemblyCache::UninstallAssembly.

Alexandre Julliard julliard at winehq.org
Thu Apr 26 13:58:35 CDT 2012


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Apr 26 11:18:57 2012 +0200

fusion: Implement IAssemblyCache::UninstallAssembly.

---

 dlls/fusion/asmcache.c       |   71 ++++++++++++++++++++++++++++++++++++++++-
 dlls/fusion/tests/asmcache.c |   46 +++++++++------------------
 2 files changed, 84 insertions(+), 33 deletions(-)

diff --git a/dlls/fusion/asmcache.c b/dlls/fusion/asmcache.c
index fe4e12a..d0b45c7 100644
--- a/dlls/fusion/asmcache.c
+++ b/dlls/fusion/asmcache.c
@@ -183,10 +183,77 @@ static HRESULT WINAPI IAssemblyCacheImpl_UninstallAssembly(IAssemblyCache *iface
                                                            LPCFUSION_INSTALL_REFERENCE pRefData,
                                                            ULONG *pulDisposition)
 {
-    FIXME("(%p, %d, %s, %p, %p) stub!\n", iface, dwFlags,
+    HRESULT hr;
+    IAssemblyName *asmname, *next = NULL;
+    IAssemblyEnum *asmenum = NULL;
+    WCHAR *p, *path = NULL;
+    ULONG disp;
+    DWORD len;
+
+    TRACE("(%p, 0%08x, %s, %p, %p)\n", iface, dwFlags,
           debugstr_w(pszAssemblyName), pRefData, pulDisposition);
 
-    return E_NOTIMPL;
+    if (pRefData)
+    {
+        FIXME("application reference not supported\n");
+        return E_NOTIMPL;
+    }
+    hr = CreateAssemblyNameObject( &asmname, pszAssemblyName, CANOF_PARSE_DISPLAY_NAME, NULL );
+    if (FAILED( hr ))
+        return hr;
+
+    hr = CreateAssemblyEnum( &asmenum, NULL, asmname, ASM_CACHE_GAC, NULL );
+    if (FAILED( hr ))
+        goto done;
+
+    hr = IAssemblyEnum_GetNextAssembly( asmenum, NULL, &next, 0 );
+    if (hr == S_FALSE)
+    {
+        if (pulDisposition)
+            *pulDisposition = IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED;
+        goto done;
+    }
+    hr = IAssemblyName_GetPath( next, NULL, &len );
+    if (hr != HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER ))
+        goto done;
+
+    if (!(path = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
+    {
+        hr = E_OUTOFMEMORY;
+        goto done;
+    }
+    hr = IAssemblyName_GetPath( next, path, &len );
+    if (FAILED( hr ))
+        goto done;
+
+    if (DeleteFileW( path ))
+    {
+        if ((p = strrchrW( path, '\\' )))
+        {
+            *p = 0;
+            RemoveDirectoryW( path );
+            if ((p = strrchrW( path, '\\' )))
+            {
+                *p = 0;
+                RemoveDirectoryW( path );
+            }
+        }
+        disp = IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED;
+        hr = S_OK;
+    }
+    else
+    {
+        disp = IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED;
+        hr = S_FALSE;
+    }
+    if (pulDisposition) *pulDisposition = disp;
+
+done:
+    IAssemblyName_Release( asmname );
+    if (next) IAssemblyName_Release( next );
+    if (asmenum) IAssemblyEnum_Release( asmenum );
+    HeapFree( GetProcessHeap(), 0, path );
+    return hr;
 }
 
 static HRESULT WINAPI IAssemblyCacheImpl_QueryAssemblyInfo(IAssemblyCache *iface,
diff --git a/dlls/fusion/tests/asmcache.c b/dlls/fusion/tests/asmcache.c
index 3910488..141e442 100644
--- a/dlls/fusion/tests/asmcache.c
+++ b/dlls/fusion/tests/asmcache.c
@@ -888,7 +888,6 @@ static void test_InstallAssembly(void)
     ULONG disp;
     DWORD attr;
     char dllpath[MAX_PATH];
-    UINT size;
 
     static const WCHAR empty[] = {0};
     static const WCHAR noext[] = {'f','i','l','e',0};
@@ -942,7 +941,7 @@ static void test_InstallAssembly(void)
     hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
 
-    size = GetWindowsDirectoryA(dllpath, MAX_PATH);
+    GetWindowsDirectoryA(dllpath, MAX_PATH);
     strcat(dllpath, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll");
 
     attr = GetFileAttributes(dllpath);
@@ -951,19 +950,18 @@ static void test_InstallAssembly(void)
     /* uninstall the assembly from the GAC */
     disp = 0xf00dbad;
     hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
-    todo_wine
-    {
-        ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
-        ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
-           "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
-    }
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
+       "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
 
-    /* FIXME: remove once UninstallAssembly is implemented */
-    DeleteFileA(dllpath);
-    dllpath[size + sizeof("\\assembly\\GAC_MSIL\\wine\\1.0.0.0__2d03617b1c31e2f5")] = '\0';
-    RemoveDirectoryA(dllpath);
-    dllpath[size + sizeof("\\assembly\\GAC_MSIL\\wine")] = '\0';
-    RemoveDirectoryA(dllpath);
+    attr = GetFileAttributes(dllpath);
+    ok(attr == INVALID_FILE_ATTRIBUTES, "Expected assembly not to exist\n");
+
+    disp = 0xf00dbad;
+    hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
+    ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr);
+    ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED,
+       "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED, got %d\n", disp);
 
     DeleteFileA("test.dll");
     DeleteFileA("wine.dll");
@@ -987,8 +985,6 @@ static void test_QueryAssemblyInfo(void)
     HRESULT hr;
     DWORD size;
     ULONG disp;
-    char dllpath[MAX_PATH];
-    UINT len;
 
     static const WCHAR empty[] = {0};
     static const WCHAR commasep[] = {',',' ',0};
@@ -1503,21 +1499,9 @@ static void test_QueryAssemblyInfo(void)
     /* uninstall the assembly from the GAC */
     disp = 0xf00dbad;
     hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
-    todo_wine
-    {
-        ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
-        ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
-           "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
-    }
-
-    /* FIXME: remove once UninstallAssembly is implemented */
-    len = GetWindowsDirectoryA(dllpath, MAX_PATH);
-    strcat(dllpath, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll");
-    DeleteFileA(dllpath);
-    dllpath[len + sizeof("\\assembly\\GAC_MSIL\\wine\\1.0.0.0__2d03617b1c31e2f5")] = '\0';
-    RemoveDirectoryA(dllpath);
-    dllpath[len + sizeof("\\assembly\\GAC_MSIL\\wine")] = '\0';
-    RemoveDirectoryA(dllpath);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+    ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
+       "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
 
     DeleteFileA("test.dll");
     DeleteFileA("wine.dll");




More information about the wine-cvs mailing list