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