[PATCH 19/27] [Kernel32]: ActCtx: now parsing the clrClass and
clrSurrogate elements in
Eric Pouech
eric.pouech at wanadoo.fr
Mon May 7 14:51:45 CDT 2007
assembly
---
dlls/kernel32/actctx.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 90 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index a7da6e4..7ca5425 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -123,6 +123,16 @@ struct entity
{
LPCWSTR name;
} class;
+ struct
+ {
+ LPCWSTR name;
+ LPCWSTR clsid;
+ } clrclass;
+ struct
+ {
+ LPCWSTR name;
+ LPCWSTR clsid;
+ } clrsurrogate;
} u;
};
@@ -393,6 +403,8 @@ done:
#define ASSEMBLY_ELEM "assembly"
#define ASSEMBLYIDENTITY_ELEM "assemblyIdentity"
+#define CLRCLASS_ELEM "clrClass"
+#define CLRSURROGATE_ELEM "clrSurrogate"
#define COMCLASS_ELEM "comClass"
#define COMINTERFACEPROXYSTUB_ELEM "comInterfaceProxyStub"
#define DEPENDENCY_ELEM "dependency"
@@ -835,6 +847,68 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf,
parse_end_element(xmlbuf);
}
+static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
+{
+ xmlstr_t attr_name, attr_value;
+ BOOL end = FALSE, error;
+ struct entity* entity;
+
+ entity = add_entity_to_assembly(assembly,
+ ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION);
+
+ while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
+ {
+ if (xmlstr_cmp(&attr_name, NAME_ATTR))
+ {
+ entity->u.clrclass.name = xstrdupXW(&attr_value);
+ }
+ else if (xmlstr_cmp(&attr_name, CLSID_ATTR))
+ {
+ entity->u.clrclass.clsid = xstrdupXW(&attr_value);
+ }
+ else
+ {
+ WARN("wrong attr %s=%s\n", debugstr_xmlstr(&attr_name),
+ debugstr_xmlstr(&attr_value));
+ return FALSE;
+ }
+ }
+
+ if (error || end) return end;
+ return parse_expect_elem(xmlbuf, ELEM_END(CLRCLASS_ELEM)) && parse_end_element(xmlbuf);
+}
+
+static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
+{
+ xmlstr_t attr_name, attr_value;
+ BOOL end = FALSE, error;
+ struct entity* entity;
+
+ entity = add_entity_to_assembly(assembly,
+ ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES);
+
+ while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
+ {
+ if (xmlstr_cmp(&attr_name, NAME_ATTR))
+ {
+ entity->u.clrsurrogate.name = xstrdupXW(&attr_value);
+ }
+ else if (xmlstr_cmp(&attr_name, CLSID_ATTR))
+ {
+ entity->u.clrsurrogate.clsid = xstrdupXW(&attr_value);
+ }
+ else
+ {
+ WARN("wrong attr %s=%s\n", debugstr_xmlstr(&attr_name),
+ debugstr_xmlstr(&attr_value));
+ return FALSE;
+ }
+ }
+
+ if (error || end) return end;
+ return parse_expect_elem(xmlbuf, ELEM_END(CLRSURROGATE_ELEM)) && parse_end_element(xmlbuf);
+}
+
static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
{
xmlstr_t attr_name, attr_value, elem;
@@ -1099,6 +1173,14 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
{
ret = parse_file_elem(xmlbuf, assembly);
}
+ else if (xmlstr_cmp(&elem, CLRCLASS_ELEM))
+ {
+ ret = parse_clr_class_elem(xmlbuf, assembly);
+ }
+ else if (xmlstr_cmp(&elem, CLRSURROGATE_ELEM))
+ {
+ ret = parse_clr_surrogate_elem(xmlbuf, assembly);
+ }
else
{
WARN("wrong element %s\n", debugstr_xmlstr(&elem));
@@ -1595,6 +1677,14 @@ static void free_entity(struct entity* entity)
case ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION:
HeapFree(GetProcessHeap(), 0, (void*)entity->u.class.name);
break;
+ case ACTIVATION_CONTEXT_SECTION_COM_PROGID_REDIRECTION:
+ HeapFree(GetProcessHeap(), 0, (void*)entity->u.clrclass.name);
+ HeapFree(GetProcessHeap(), 0, (void*)entity->u.clrclass.clsid);
+ break;
+ case ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES:
+ HeapFree(GetProcessHeap(), 0, (void*)entity->u.clrsurrogate.name);
+ HeapFree(GetProcessHeap(), 0, (void*)entity->u.clrsurrogate.clsid);
+ break;
default:
FIXME("Unknown entity kind %d\n", entity->kind);
}
More information about the wine-patches
mailing list