[ros-diffs] [akhaldi] 56611: [FUSION] * Sync to Wine 1.5.4.

akhaldi at svn.reactos.org akhaldi at svn.reactos.org
Sat May 19 09:41:07 UTC 2012


Author: akhaldi
Date: Sat May 19 09:41:07 2012
New Revision: 56611

URL: http://svn.reactos.org/svn/reactos?rev=56611&view=rev
Log:
[FUSION]
* Sync to Wine 1.5.4.

Modified:
    trunk/reactos/dll/win32/fusion/CMakeLists.txt
    trunk/reactos/dll/win32/fusion/asmcache.c
    trunk/reactos/dll/win32/fusion/asmname.c
    trunk/reactos/media/doc/README.WINE

Modified: trunk/reactos/dll/win32/fusion/CMakeLists.txt
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/fusion/CMakeLists.txt?rev=56611&r1=56610&r2=56611&view=diff
==============================================================================
--- trunk/reactos/dll/win32/fusion/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/fusion/CMakeLists.txt [iso-8859-1] Sat May 19 09:41:07 2012
@@ -1,9 +1,6 @@
 
 add_definitions(-D__WINESRC__)
-
 include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine)
-
-set_rc_compiler()
 
 spec2def(fusion.dll fusion.spec)
 
@@ -19,11 +16,10 @@
     ${CMAKE_CURRENT_BINARY_DIR}/fusion.def)
 
 add_library(fusion SHARED ${SOURCE})
-
 set_module_type(fusion win32dll)
 target_link_libraries(fusion wine uuid)
 add_importlibs(fusion shlwapi advapi32 dbghelp user32 msvcrt kernel32 ntdll)
 add_cd_file(TARGET fusion DESTINATION reactos/Microsoft.NET/Framework/v1.0.3705 FOR all)
 add_cd_file(TARGET fusion DESTINATION reactos/Microsoft.NET/Framework/v1.1.4322 FOR all)
 add_cd_file(TARGET fusion DESTINATION reactos/Microsoft.NET/Framework/v2.0.50727 FOR all)
-add_cd_file(TARGET fusion DESTINATION reactos/system32 FOR all)
+add_cd_file(TARGET fusion DESTINATION reactos/system32 FOR all)

Modified: trunk/reactos/dll/win32/fusion/asmcache.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/fusion/asmcache.c?rev=56611&r1=56610&r2=56611&view=diff
==============================================================================
--- trunk/reactos/dll/win32/fusion/asmcache.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/fusion/asmcache.c [iso-8859-1] Sat May 19 09:41:07 2012
@@ -41,6 +41,9 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(fusion);
 
+static const WCHAR cache_mutex_nameW[] =
+    {'_','_','W','I','N','E','_','F','U','S','I','O','N','_','C','A','C','H','E','_','M','U','T','E','X','_','_',0};
+
 static BOOL create_full_path(LPCWSTR path)
 {
     LPWSTR new_path;
@@ -126,6 +129,7 @@
     IAssemblyCache IAssemblyCache_iface;
 
     LONG ref;
+    HANDLE lock;
 } IAssemblyCacheImpl;
 
 static inline IAssemblyCacheImpl *impl_from_IAssemblyCache(IAssemblyCache *iface)
@@ -166,15 +170,27 @@
 
 static ULONG WINAPI IAssemblyCacheImpl_Release(IAssemblyCache *iface)
 {
-    IAssemblyCacheImpl *This = impl_from_IAssemblyCache(iface);
-    ULONG refCount = InterlockedDecrement(&This->ref);
-
-    TRACE("(%p)->(ref before = %u)\n", This, refCount + 1);
+    IAssemblyCacheImpl *cache = impl_from_IAssemblyCache(iface);
+    ULONG refCount = InterlockedDecrement( &cache->ref );
+
+    TRACE("(%p)->(ref before = %u)\n", cache, refCount + 1);
 
     if (!refCount)
-        HeapFree(GetProcessHeap(), 0, This);
-
+    {
+        CloseHandle( cache->lock );
+        HeapFree( GetProcessHeap(), 0, cache );
+    }
     return refCount;
+}
+
+static void cache_lock( IAssemblyCacheImpl *cache )
+{
+    WaitForSingleObject( cache->lock, INFINITE );
+}
+
+static void cache_unlock( IAssemblyCacheImpl *cache )
+{
+    ReleaseMutex( cache->lock );
 }
 
 static HRESULT WINAPI IAssemblyCacheImpl_UninstallAssembly(IAssemblyCache *iface,
@@ -183,10 +199,81 @@
                                                            LPCFUSION_INSTALL_REFERENCE pRefData,
                                                            ULONG *pulDisposition)
 {
-    FIXME("(%p, %d, %s, %p, %p) stub!\n", iface, dwFlags,
+    HRESULT hr;
+    IAssemblyCacheImpl *cache = impl_from_IAssemblyCache(iface);
+    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;
+
+    cache_lock( cache );
+
+    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 );
+    cache_unlock( cache );
+    return hr;
 }
 
 static HRESULT WINAPI IAssemblyCacheImpl_QueryAssemblyInfo(IAssemblyCache *iface,
@@ -194,6 +281,7 @@
                                                            LPCWSTR pszAssemblyName,
                                                            ASSEMBLY_INFO *pAsmInfo)
 {
+    IAssemblyCacheImpl *cache = impl_from_IAssemblyCache(iface);
     IAssemblyName *asmname, *next = NULL;
     IAssemblyEnum *asmenum = NULL;
     HRESULT hr;
@@ -214,6 +302,8 @@
     if (FAILED(hr))
         return hr;
 
+    cache_lock( cache );
+
     hr = CreateAssemblyEnum(&asmenum, NULL, asmname, ASM_CACHE_GAC, NULL);
     if (FAILED(hr))
         goto done;
@@ -236,7 +326,7 @@
     IAssemblyName_Release(asmname);
     if (next) IAssemblyName_Release(next);
     if (asmenum) IAssemblyEnum_Release(asmenum);
-
+    cache_unlock( cache );
     return hr;
 }
 
@@ -264,9 +354,10 @@
                                                          LPCWSTR pszManifestFilePath,
                                                          LPCFUSION_INSTALL_REFERENCE pRefData)
 {
-    static const WCHAR format[] =
-        {'%','s','\\','%','s','\\','%','s','_','_','%','s','\\',0};
-
+    static const WCHAR format[] = {'%','s','\\','%','s','\\','%','s','_','_','%','s','\\',0};
+    static const WCHAR ext_exe[] = {'.','e','x','e',0};
+    static const WCHAR ext_dll[] = {'.','d','l','l',0};
+    IAssemblyCacheImpl *cache = impl_from_IAssemblyCache(iface);
     ASSEMBLY *assembly;
     LPWSTR filename;
     LPWSTR name = NULL;
@@ -278,9 +369,6 @@
     LPWSTR ext;
     HRESULT hr;
 
-    static const WCHAR ext_exe[] = {'.','e','x','e',0};
-    static const WCHAR ext_dll[] = {'.','d','l','l',0};
-
     TRACE("(%p, %d, %s, %p)\n", iface, dwFlags,
           debugstr_w(pszManifestFilePath), pRefData);
 
@@ -314,6 +402,8 @@
     hr = assembly_get_version(assembly, &version);
     if (FAILED(hr))
         goto done;
+
+    cache_lock( cache );
 
     get_assembly_directory(asmdir, MAX_PATH, assembly_get_architecture(assembly));
 
@@ -337,6 +427,7 @@
     HeapFree(GetProcessHeap(), 0, version);
     HeapFree(GetProcessHeap(), 0, asmpath);
     assembly_release(assembly);
+    cache_unlock( cache );
     return hr;
 }
 
@@ -371,9 +462,13 @@
 
     cache->IAssemblyCache_iface.lpVtbl = &AssemblyCacheVtbl;
     cache->ref = 1;
-
+    cache->lock = CreateMutexW( NULL, FALSE, cache_mutex_nameW );
+    if (!cache->lock)
+    {
+        HeapFree( GetProcessHeap(), 0, cache );
+        return HRESULT_FROM_WIN32( GetLastError() );
+    }
     *ppAsmCache = &cache->IAssemblyCache_iface;
-
     return S_OK;
 }
 

Modified: trunk/reactos/dll/win32/fusion/asmname.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/fusion/asmname.c?rev=56611&r1=56610&r2=56611&view=diff
==============================================================================
--- trunk/reactos/dll/win32/fusion/asmname.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/fusion/asmname.c [iso-8859-1] Sat May 19 09:41:07 2012
@@ -666,7 +666,7 @@
     IAssemblyNameImpl *name;
     HRESULT hr;
 
-    TRACE("(%p, %s, %08x, %p) stub!\n", ppAssemblyNameObj,
+    TRACE("(%p, %s, %08x, %p)\n", ppAssemblyNameObj,
           debugstr_w(szAssemblyName), dwFlags, pvReserved);
 
     if (!ppAssemblyNameObj)

Modified: trunk/reactos/media/doc/README.WINE
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=56611&r1=56610&r2=56611&view=diff
==============================================================================
--- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original)
+++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Sat May 19 09:41:07 2012
@@ -60,7 +60,7 @@
 reactos/dll/win32/dbghelp         # Synced to Wine-1.3.37
 reactos/dll/win32/dciman32        # Synced to Wine-1.3.37
 reactos/dll/win32/dwmapi          # Synced to Wine-1.3.37
-reactos/dll/win32/fusion          # Synced to Wine-1.3.37
+reactos/dll/win32/fusion          # Synced to Wine-1.5.4
 reactos/dll/win32/gdiplus         # Synced to Wine-1.3.37
 reactos/dll/win32/hhctrl.ocx      # Autosync
 reactos/dll/win32/hlink           # Synced to Wine-1.3.37




More information about the Ros-diffs mailing list