Module: wine Branch: master Commit: 25ba5c8b593e5763407a036d614d980a82d1ce9b URL: http://source.winehq.org/git/wine.git/?a=commit;h=25ba5c8b593e5763407a036d61...
Author: Hans Leidekker hans@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");