Hans Leidekker : fusion: Sort the list of assemblies built during enumeration.

Alexandre Julliard julliard at winehq.org
Thu Feb 19 09:18:55 CST 2009


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Feb 19 14:06:43 2009 +0100

fusion: Sort the list of assemblies built during enumeration.

---

 dlls/fusion/asmenum.c |   62 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 61 insertions(+), 1 deletions(-)

diff --git a/dlls/fusion/asmenum.c b/dlls/fusion/asmenum.c
index 44a0cb2..3706f07 100644
--- a/dlls/fusion/asmenum.c
+++ b/dlls/fusion/asmenum.c
@@ -221,6 +221,66 @@ static void parse_name(IAssemblyName *name, int depth, LPWSTR path, LPWSTR buf)
     }
 }
 
+static int compare_assembly_names(ASMNAME *asmname1, ASMNAME *asmname2)
+{
+    int ret;
+    WORD version1, version2;
+    WCHAR name1[MAX_PATH], name2[MAX_PATH];
+    WCHAR token_str1[TOKEN_LENGTH + 1], token_str2[TOKEN_LENGTH + 1];
+    BYTE token1[BYTES_PER_TOKEN], token2[BYTES_PER_TOKEN];
+    DWORD size, i;
+
+    size = sizeof(name1);
+    IAssemblyName_GetProperty(asmname1->name, ASM_NAME_NAME, &name1, &size);
+    size = sizeof(name2);
+    IAssemblyName_GetProperty(asmname2->name, ASM_NAME_NAME, &name2, &size);
+
+    if ((ret = strcmpiW(name1, name2))) return ret;
+
+    for (i = ASM_NAME_MAJOR_VERSION; i < ASM_NAME_CULTURE; i++)
+    {
+        size = sizeof(version1);
+        IAssemblyName_GetProperty(asmname1->name, i, &version1, &size);
+        size = sizeof(version2);
+        IAssemblyName_GetProperty(asmname2->name, i, &version2, &size);
+
+        if (version1 < version2) return -1;
+        if (version1 > version2) return 1;
+    }
+
+    /* FIXME: compare cultures */
+
+    size = sizeof(token1);
+    IAssemblyName_GetProperty(asmname1->name, ASM_NAME_PUBLIC_KEY_TOKEN, token1, &size);
+    size = sizeof(token2);
+    IAssemblyName_GetProperty(asmname2->name, ASM_NAME_PUBLIC_KEY_TOKEN, token2, &size);
+
+    token_to_str(token1, token_str1);
+    token_to_str(token2, token_str2);
+
+    if ((ret = strcmpiW(token_str1, token_str2))) return ret;
+
+    return 0;
+}
+
+/* insert assembly in list preserving sort order */
+static void insert_assembly(struct list *assemblies, ASMNAME *to_insert)
+{
+    struct list *item;
+
+    LIST_FOR_EACH(item, assemblies)
+    {
+        ASMNAME *name = LIST_ENTRY(item, ASMNAME, entry);
+
+        if (compare_assembly_names(name, to_insert) > 0)
+        {
+            list_add_before(&name->entry, &to_insert->entry);
+            return;
+        }
+    }
+    list_add_tail(assemblies, &to_insert->entry);
+}
+
 static HRESULT enum_gac_assemblies(struct list *assemblies, IAssemblyName *name,
                                    int depth, LPWSTR path)
 {
@@ -292,7 +352,7 @@ static HRESULT enum_gac_assemblies(struct list *assemblies, IAssemblyName *name,
                 break;
             }
 
-            list_add_tail(assemblies, &asmname->entry);
+            insert_assembly(assemblies, asmname);
             continue;
         }
 




More information about the wine-cvs mailing list