fusion: Implement IAssemblyCache::UninstallAssembly.
Hans Leidekker
hans at codeweavers.com
Thu Apr 26 04:18:57 CDT 2012
---
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");
--
1.7.10
More information about the wine-patches
mailing list