Commit 25ba5c8b authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

fusion: Implement IAssemblyCache::UninstallAssembly.

parent 89e95aa9
...@@ -183,10 +183,77 @@ static HRESULT WINAPI IAssemblyCacheImpl_UninstallAssembly(IAssemblyCache *iface ...@@ -183,10 +183,77 @@ static HRESULT WINAPI IAssemblyCacheImpl_UninstallAssembly(IAssemblyCache *iface
LPCFUSION_INSTALL_REFERENCE pRefData, LPCFUSION_INSTALL_REFERENCE pRefData,
ULONG *pulDisposition) 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); 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, static HRESULT WINAPI IAssemblyCacheImpl_QueryAssemblyInfo(IAssemblyCache *iface,
......
...@@ -888,7 +888,6 @@ static void test_InstallAssembly(void) ...@@ -888,7 +888,6 @@ static void test_InstallAssembly(void)
ULONG disp; ULONG disp;
DWORD attr; DWORD attr;
char dllpath[MAX_PATH]; char dllpath[MAX_PATH];
UINT size;
static const WCHAR empty[] = {0}; static const WCHAR empty[] = {0};
static const WCHAR noext[] = {'f','i','l','e',0}; static const WCHAR noext[] = {'f','i','l','e',0};
...@@ -942,7 +941,7 @@ static void test_InstallAssembly(void) ...@@ -942,7 +941,7 @@ static void test_InstallAssembly(void)
hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL); hr = IAssemblyCache_InstallAssembly(cache, 0, winedll, NULL);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); 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"); strcat(dllpath, "\\assembly\\GAC_MSIL\\wine\\\\1.0.0.0__2d03617b1c31e2f5\\wine.dll");
attr = GetFileAttributes(dllpath); attr = GetFileAttributes(dllpath);
...@@ -951,19 +950,18 @@ static void test_InstallAssembly(void) ...@@ -951,19 +950,18 @@ static void test_InstallAssembly(void)
/* uninstall the assembly from the GAC */ /* uninstall the assembly from the GAC */
disp = 0xf00dbad; disp = 0xf00dbad;
hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp); 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,
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
ok(disp == IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED,
"Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
}
/* FIXME: remove once UninstallAssembly is implemented */ attr = GetFileAttributes(dllpath);
DeleteFileA(dllpath); ok(attr == INVALID_FILE_ATTRIBUTES, "Expected assembly not to exist\n");
dllpath[size + sizeof("\\assembly\\GAC_MSIL\\wine\\1.0.0.0__2d03617b1c31e2f5")] = '\0';
RemoveDirectoryA(dllpath); disp = 0xf00dbad;
dllpath[size + sizeof("\\assembly\\GAC_MSIL\\wine")] = '\0'; hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp);
RemoveDirectoryA(dllpath); 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("test.dll");
DeleteFileA("wine.dll"); DeleteFileA("wine.dll");
...@@ -987,8 +985,6 @@ static void test_QueryAssemblyInfo(void) ...@@ -987,8 +985,6 @@ static void test_QueryAssemblyInfo(void)
HRESULT hr; HRESULT hr;
DWORD size; DWORD size;
ULONG disp; ULONG disp;
char dllpath[MAX_PATH];
UINT len;
static const WCHAR empty[] = {0}; static const WCHAR empty[] = {0};
static const WCHAR commasep[] = {',',' ',0}; static const WCHAR commasep[] = {',',' ',0};
...@@ -1503,21 +1499,9 @@ static void test_QueryAssemblyInfo(void) ...@@ -1503,21 +1499,9 @@ static void test_QueryAssemblyInfo(void)
/* uninstall the assembly from the GAC */ /* uninstall the assembly from the GAC */
disp = 0xf00dbad; disp = 0xf00dbad;
hr = IAssemblyCache_UninstallAssembly(cache, 0, wine, NULL, &disp); 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,
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); "Expected IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED, got %d\n", disp);
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);
DeleteFileA("test.dll"); DeleteFileA("test.dll");
DeleteFileA("wine.dll"); DeleteFileA("wine.dll");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment