Module: wine Branch: master Commit: 5b0ab20787e36bf6a7e86a20eb730d69b59510e8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b0ab20787e36bf6a7e86a20eb...
Author: Alexandre Julliard julliard@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;