[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