[PATCH 07/27] [Kernel32]: ActCtx: first shot at parsing manifest (mainly header)

Eric Pouech eric.pouech at wanadoo.fr
Mon May 7 14:50:22 CDT 2007


From: Jacek Caban <jacek at codeweavers.com>


---

 dlls/kernel32/actctx.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 68 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index 89fada1..4fbe5a4 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -55,6 +55,12 @@ static const WCHAR dotManifestW[] = {'.','m','a','n','i','f','e','s','t','\0'};
 typedef struct
 {
     const char*         ptr;
+    int                 len;
+} xmlstr_t;
+
+typedef struct
+{
+    const char*         ptr;
     const char*         end;
 } xmlbuf_t;
 
@@ -118,6 +124,11 @@ static WCHAR* xstrdupW(const WCHAR* str)
     return strcpyW(ptr, str);
 }
 
+static BOOL xmlstr_cmp(xmlstr_t* xmlstr, const char* str)
+{
+    return !strncmp(xmlstr->ptr, str, xmlstr->len);
+}
+
 static struct assembly* add_assembly(struct actctx* actctx, enum assembly_type at)
 {
     struct assembly*    assembly;
@@ -235,9 +246,65 @@ done:
     return ret;
 }
 
+static BOOL next_xml_elem(xmlbuf_t* xmlbuf, xmlstr_t* elem)
+{
+    const char* ptr;
+
+    ptr = memchr(xmlbuf->ptr, '<', xmlbuf->end - xmlbuf->ptr);
+    if (!ptr)
+    {
+        xmlbuf->ptr = xmlbuf->end;
+        return FALSE;
+    }
+
+    xmlbuf->ptr = ++ptr;
+    while (ptr < xmlbuf->end && !isspace(*ptr) && *ptr != '>')
+        ptr++;
+
+    elem->ptr = xmlbuf->ptr;
+    elem->len = ptr - xmlbuf->ptr;
+    xmlbuf->ptr = ptr;
+
+    if (xmlbuf->ptr == xmlbuf->end) return FALSE;
+    return xmlbuf->ptr != xmlbuf->end;
+}
+
+static BOOL parse_xml_header(xmlbuf_t* xmlbuf)
+{
+    /* FIXME: parse attibutes */
+    const char *ptr = memmem(xmlbuf->ptr, xmlbuf->end - xmlbuf->ptr, "?>", 2);
+
+    if (!ptr) return FALSE;
+
+    xmlbuf->ptr = ptr + 2;
+    return TRUE;
+}
+
 static DWORD parse_manifest(struct actctx_loader* acl, struct assembly_identity* ai,
                             struct file_info* fi, xmlbuf_t* xmlbuf)
 {
+    xmlstr_t            elem;
+    struct assembly*    assembly;
+
+    if (!(assembly = add_assembly(acl->actctx, ASSEMBLY_MANIFEST)))
+    {
+        HeapFree(GetProcessHeap(), 0, (void*)fi->info);
+        return ERROR_SXS_CANT_GEN_ACTCTX;
+    }
+
+    assembly->manifest = *fi;
+
+    if (!next_xml_elem(xmlbuf, &elem)) return ERROR_SXS_CANT_GEN_ACTCTX;
+
+    if (xmlstr_cmp(&elem, "?xml") &&
+        (!parse_xml_header(xmlbuf) || !next_xml_elem(xmlbuf, &elem)))
+        return ERROR_SXS_CANT_GEN_ACTCTX;
+
+    if (xmlbuf->ptr != xmlbuf->end)
+    {
+        WARN("parse error\n");
+        return ERROR_SXS_CANT_GEN_ACTCTX;
+    }
     return ERROR_SUCCESS;
 }
 
@@ -399,6 +466,7 @@ static DWORD parse_depend_manifests(struct actctx_loader* acl)
         {
             WARN("Could not find assembly\n");
             ret = ERROR_SXS_CANT_GEN_ACTCTX;
+            break;
         }
     }
     /* FIXME should now iterate through all refs */





More information about the wine-patches mailing list