Alexandre Julliard : ntdll: Add parsing of the version in manifests (
based on a patch by Jacek Caban).
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 20 06:02:06 CDT 2007
Module: wine
Branch: master
Commit: 5b0ab20787e36bf6a7e86a20eb730d69b59510e8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b0ab20787e36bf6a7e86a20eb730d69b59510e8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jul 19 17:47:33 2007 +0200
ntdll: Add parsing of the version in manifests (based on a patch by Jacek Caban).
---
dlls/ntdll/actctx.c | 37 +++++++++++++++++++++++++++++++++++++
1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index 1723ed5..1d06356 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -134,6 +134,7 @@ struct actctx_loader
#define MANIFESTVERSION_ATTR "manifestVersion"
#define NAME_ATTR "name"
#define TYPE_ATTR "type"
+#define VERSION_ATTR "version"
#define PROCESSORARCHITECTURE_ATTR "processorArchitecture"
#define XMLNS_ATTR "xmlns"
@@ -353,6 +354,38 @@ static BOOL parse_xml_header(xmlbuf_t* xmlbuf)
return FALSE;
}
+static BOOL parse_version(const xmlstr_t *str, struct version *version)
+{
+ unsigned int ver[4];
+ unsigned int pos;
+ const char *curr;
+
+ /* major.minor.build.revision */
+ ver[0] = ver[1] = ver[2] = ver[3] = pos = 0;
+ for (curr = str->ptr; curr < str->ptr + str->len; curr++)
+ {
+ if (*curr >= '0' && *curr <= '9')
+ {
+ ver[pos] = ver[pos] * 10 + *curr - '0';
+ if (ver[pos] >= 0x10000) goto error;
+ }
+ else if (*curr == '.')
+ {
+ if (++pos >= 4) goto error;
+ }
+ else goto error;
+ }
+ version->major = ver[0];
+ version->minor = ver[1];
+ version->build = ver[2];
+ version->revision = ver[3];
+ return TRUE;
+
+error:
+ FIXME( "Wrong version definition in manifest file (%s)\n", debugstr_xmlstr(str) );
+ return FALSE;
+}
+
static BOOL parse_expect_elem(xmlbuf_t* xmlbuf, const char* name)
{
xmlstr_t elem;
@@ -404,6 +437,10 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, ACTIVATION_CONTEXT* a
}
ai->type = TYPE_WIN32;
}
+ else if (xmlstr_cmp(&attr_name, VERSION_ATTR))
+ {
+ if (!parse_version(&attr_value, &ai->version)) return FALSE;
+ }
else if (xmlstr_cmp(&attr_name, PROCESSORARCHITECTURE_ATTR))
{
if (!(ai->arch = xmlstrdupW(&attr_value))) return FALSE;
More information about the wine-cvs
mailing list