Hans Leidekker : fusion: Add a "v4.0_" prefix to version 4. 0 assembly directories.

Alexandre Julliard julliard at winehq.org
Wed May 23 13:22:54 CDT 2012


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed May 23 09:14:58 2012 +0200

fusion: Add a "v4.0_" prefix to version 4.0 assembly directories.

---

 dlls/fusion/asmcache.c |   10 ++++++++--
 dlls/fusion/asmenum.c  |   29 ++++++++++++++++-------------
 2 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/dlls/fusion/asmcache.c b/dlls/fusion/asmcache.c
index 93047d4..1cba6f6 100644
--- a/dlls/fusion/asmcache.c
+++ b/dlls/fusion/asmcache.c
@@ -375,7 +375,10 @@ static HRESULT WINAPI IAssemblyCacheImpl_InstallAssembly(IAssemblyCache *iface,
                                                          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 format_v40[] =
+        {'%','s','\\','%','s','\\','v','4','.','0','_','%','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);
@@ -430,7 +433,10 @@ static HRESULT WINAPI IAssemblyCacheImpl_InstallAssembly(IAssemblyCache *iface,
     architecture = assembly_get_architecture(assembly);
     get_assembly_directory(asmdir, MAX_PATH, clr_version, architecture);
 
-    sprintfW(path, format, asmdir, name, version, token);
+    if (!strcmp(clr_version, "v4.0.30319"))
+        sprintfW(path, format_v40, asmdir, name, version, token);
+    else
+        sprintfW(path, format, asmdir, name, version, token);
 
     create_full_path(path);
 
diff --git a/dlls/fusion/asmenum.c b/dlls/fusion/asmenum.c
index f4da88a..641ed2f 100644
--- a/dlls/fusion/asmenum.c
+++ b/dlls/fusion/asmenum.c
@@ -291,17 +291,6 @@ static void insert_assembly(struct list *assemblies, ASMNAME *to_insert)
 static HRESULT enum_gac_assemblies(struct list *assemblies, IAssemblyName *name,
                                    int depth, LPWSTR path)
 {
-    WIN32_FIND_DATAW ffd;
-    WCHAR buf[MAX_PATH];
-    WCHAR disp[MAX_PATH];
-    WCHAR asmpath[MAX_PATH];
-    ASMNAME *asmname;
-    HANDLE hfind;
-    LPWSTR ptr;
-    HRESULT hr = S_OK;
-
-    static WCHAR parent[MAX_PATH];
-
     static const WCHAR dot[] = {'.',0};
     static const WCHAR dotdot[] = {'.','.',0};
     static const WCHAR search_fmt[] = {'%','s','\\','*',0};
@@ -311,6 +300,14 @@ static HRESULT enum_gac_assemblies(struct list *assemblies, IAssemblyName *name,
         'C','u','l','t','u','r','e','=','n','e','u','t','r','a','l',',',' ',
         'P','u','b','l','i','c','K','e','y','T','o','k','e','n','=','%','s',0};
     static const WCHAR ss_fmt[] = {'%','s','\\','%','s',0};
+    static const WCHAR v40[] = {'v','4','.','0','_'};
+    WIN32_FIND_DATAW ffd;
+    WCHAR buf[MAX_PATH], disp[MAX_PATH], asmpath[MAX_PATH];
+    static WCHAR parent[MAX_PATH];
+    ASMNAME *asmname;
+    HANDLE hfind;
+    WCHAR *ptr;
+    HRESULT hr = S_OK;
 
     if (name)
         parse_name(name, depth, path, buf);
@@ -337,13 +334,19 @@ static HRESULT enum_gac_assemblies(struct list *assemblies, IAssemblyName *name,
         }
         else if (depth == 1)
         {
+            unsigned int prefix_len = sizeof(v40)/sizeof(WCHAR);
+            const WCHAR *token, *version = ffd.cFileName;
+
             sprintfW(asmpath, path_fmt, path, ffd.cFileName, parent);
 
             ptr = strstrW(ffd.cFileName, dblunder);
             *ptr = '\0';
-            ptr += 2;
+            token = ptr + 2;
+
+            if (strlenW(ffd.cFileName) >= prefix_len &&
+                !memcmp(ffd.cFileName, v40, sizeof(v40))) version += prefix_len;
 
-            sprintfW(disp, fmt, parent, ffd.cFileName, ptr);
+            sprintfW(disp, fmt, parent, version, token);
 
             asmname = HeapAlloc(GetProcessHeap(), 0, sizeof(ASMNAME));
             if (!asmname)




More information about the wine-cvs mailing list