Module: wine Branch: master Commit: 5b41620853e2b59aab8c7b70427f5fb1731f07ff URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b41620853e2b59aab8c7b7042...
Author: Hans Leidekker hans@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; }