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