[PATCH 19/27] [Kernel32]: ActCtx: now parsing the clrClass and clrSurrogate elements in

Eric Pouech eric.pouech at wanadoo.fr
Sat Apr 28 07:22:50 CDT 2007


assembly

A+
---

 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
         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
         {
             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* e
     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