[PATCH 10/27] [Kernel32]: ActCtx: implemented the file elements from
the manifest parsing
Eric Pouech
eric.pouech at wanadoo.fr
Mon May 7 14:50:44 CDT 2007
From: Jacek Caban <jacek at codeweavers.com>
---
dlls/kernel32/actctx.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 84 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index 6de7c76..8100962 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -98,6 +98,11 @@ struct assembly_identity
enum assembly_id_arch arch;
};
+struct dll_redirect
+{
+ LPCWSTR name;
+};
+
enum assembly_type
{
APPLICATION_MANIFEST,
@@ -109,6 +114,8 @@ struct assembly
enum assembly_type type;
struct assembly_identity id;
struct file_info manifest;
+ struct dll_redirect*dlls;
+ unsigned num_dlls;
};
struct actctx
@@ -182,10 +189,30 @@ static struct assembly* add_assembly(struct actctx* actctx, enum assembly_type a
assembly = &actctx->assemblies[actctx->num_assemblies++];
assembly->type = at;
+ memset(&assembly->id, 0, sizeof(assembly->id));
+ assembly->num_dlls = 0;
+ assembly->dlls = 0;
return assembly;
}
+static struct dll_redirect* add_dll_redirect(struct assembly* assembly)
+{
+ struct dll_redirect* dll;
+
+ if (!assembly->num_dlls)
+ assembly->dlls = HeapAlloc(GetProcessHeap(), 0, sizeof(*dll));
+ else
+ assembly->dlls = HeapReAlloc(GetProcessHeap(), 0,
+ assembly->dlls,
+ (assembly->num_dlls + 1) * sizeof(*dll));
+ if (!assembly->dlls) return NULL;
+ dll = &assembly->dlls[assembly->num_dlls++];
+ dll->name = NULL;
+
+ return dll;
+}
+
static BOOL add_dependent_assembly_id(struct actctx_loader* acl,
struct assembly_identity* ai)
{
@@ -289,6 +316,7 @@ done:
#define ASSEMBLYIDENTITY_ELEM "assemblyIdentity"
#define DEPENDENCY_ELEM "dependency"
#define DEPENDENTASSEMBLY_ELEM "dependentAssembly"
+#define FILE_ELEM "file"
#define ELEM_END(elem) "/" elem
@@ -496,6 +524,49 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, struct actctx* actctx
return parse_expect_elem(xmlbuf, ELEM_END(ASSEMBLYIDENTITY_ELEM)) && parse_end_element(xmlbuf);
}
+static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
+{
+ xmlstr_t attr_name, attr_value, elem;
+ BOOL end = FALSE, error, ret = TRUE;
+ struct dll_redirect* dll;
+
+ if (!(dll = add_dll_redirect(assembly))) return FALSE;
+
+ while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
+ {
+ if (xmlstr_cmp(&attr_name, NAME_ATTR))
+ {
+ dll->name = xstrdupXW(&attr_value);
+ TRACE("name=%s\n", debugstr_xmlstr(&attr_value));
+ }
+ else
+ {
+ WARN("wrong attr %s=%s\n", debugstr_xmlstr(&attr_name),
+ debugstr_xmlstr(&attr_value));
+ return FALSE;
+ }
+ }
+
+ if (error || !dll->name) return FALSE;
+ if (end) return TRUE;
+
+ while (ret && (ret = next_xml_elem(xmlbuf, &elem)))
+ {
+ if (xmlstr_cmp(&elem, ELEM_END(FILE_ELEM)))
+ {
+ ret = parse_end_element(xmlbuf);
+ break;
+ }
+ else
+ {
+ WARN("wrong elem %s\n", debugstr_xmlstr(&elem));
+ ret = FALSE;
+ }
+ }
+
+ return ret;
+}
+
static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf,
struct actctx_loader* acl)
{
@@ -637,6 +708,10 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
{
ret = parse_dependency_elem(xmlbuf, acl);
}
+ else if (xmlstr_cmp(&elem, FILE_ELEM))
+ {
+ ret = parse_file_elem(xmlbuf, assembly);
+ }
else
{
WARN("wrong element %s\n", debugstr_xmlstr(&elem));
@@ -1059,12 +1134,18 @@ void WINAPI ReleaseActCtx(HANDLE hActCtx)
{
if (--actctx->ref_count == 0)
{
- unsigned i;
+ unsigned i, j;
+ struct assembly* assembly;
for (i = 0; i < actctx->num_assemblies; i++)
{
- HeapFree(GetProcessHeap(), 0, (void*)actctx->assemblies[i].manifest.info);
- free_assembly_identity(&actctx->assemblies[i].id);
+ assembly = &actctx->assemblies[i];
+ for (j = 0; j < assembly->num_dlls; j++)
+ {
+ HeapFree(GetProcessHeap(), 0, (void*)assembly->dlls[j].name);
+ }
+ HeapFree(GetProcessHeap(), 0, (void*)assembly->manifest.info);
+ free_assembly_identity(&assembly->id);
}
HeapFree(GetProcessHeap(), 0, actctx->assemblies);
HeapFree(GetProcessHeap(), 0, (void*)actctx->config.info);
More information about the wine-patches
mailing list