Jacek Caban : scrobj: Add script element parser partial implementation.

Alexandre Julliard julliard at winehq.org
Fri Sep 20 15:54:43 CDT 2019


Module: wine
Branch: master
Commit: 2f965ed663e5fbe3fe1384a6648c62324a2efa0b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2f965ed663e5fbe3fe1384a6648c62324a2efa0b

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Sep 20 16:22:49 2019 +0200

scrobj: Add script element parser partial implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/scrobj/scrobj.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 68 insertions(+), 4 deletions(-)

diff --git a/dlls/scrobj/scrobj.c b/dlls/scrobj/scrobj.c
index 6997a76982..6de0e8ce01 100644
--- a/dlls/scrobj/scrobj.c
+++ b/dlls/scrobj/scrobj.c
@@ -50,6 +50,13 @@ struct method_parameter
     WCHAR *name;
 };
 
+struct scriptlet_script
+{
+    struct list entry;
+    WCHAR *language;
+    WCHAR *body;
+};
+
 struct scriptlet_factory
 {
     IClassFactory IClassFactory_iface;
@@ -69,6 +76,7 @@ struct scriptlet_factory
     CLSID classid;
 
     struct list members;
+    struct list scripts;
 };
 
 typedef enum tid_t
@@ -406,10 +414,51 @@ static HRESULT parse_scriptlet_public(struct scriptlet_factory *factory)
     return S_OK;
 }
 
-static HRESULT parse_scriptlet_script(struct scriptlet_factory *factory)
+static HRESULT parse_scriptlet_script(struct scriptlet_factory *factory, struct scriptlet_script *script)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    XmlNodeType node_type;
+    HRESULT hres;
+
+    for (;;)
+    {
+        hres = IXmlReader_MoveToNextAttribute(factory->xml_reader);
+        if (hres != S_OK) break;
+
+        if (is_xml_name(factory, L"language"))
+        {
+            if (script->language)
+            {
+                FIXME("Duplicated language\n");
+                return E_FAIL;
+            }
+            hres = read_xml_value(factory, &script->language);
+            if (FAILED(hres)) return hres;
+        }
+        else
+        {
+            FIXME("Unexpected attribute\n");
+            return E_NOTIMPL;
+        }
+    }
+
+    if (!script->language)
+    {
+        FIXME("Language not specified\n");
+        return E_FAIL;
+    }
+
+    if (FAILED(hres = next_xml_node(factory, &node_type))) return hres;
+
+    if (node_type != XmlNodeType_Text && node_type != XmlNodeType_CDATA)
+    {
+        FIXME("Unexpected node type %u\n", node_type);
+        return E_FAIL;
+    }
+
+    hres = read_xml_value(factory, &script->body);
+    if (FAILED(hres)) return hres;
+
+    return expect_end_element(factory);
 }
 
 static HRESULT parse_scriptlet_file(struct scriptlet_factory *factory, const WCHAR *url)
@@ -471,7 +520,13 @@ static HRESULT parse_scriptlet_file(struct scriptlet_factory *factory, const WCH
         else if (is_xml_name(factory, L"public"))
             hres = parse_scriptlet_public(factory);
         else if (is_xml_name(factory, L"script"))
-            hres = parse_scriptlet_script(factory);
+        {
+            struct scriptlet_script *script;
+            if (!(script = heap_alloc_zero(sizeof(*script)))) return E_OUTOFMEMORY;
+            list_add_tail(&factory->scripts, &script->entry);
+            hres = parse_scriptlet_script(factory, script);
+            if (FAILED(hres)) return hres;
+        }
         else
         {
             FIXME("Unexpected element %s\n", debugstr_xml_name(factory));
@@ -554,6 +609,14 @@ static ULONG WINAPI scriptlet_factory_Release(IClassFactory *iface)
             }
             heap_free(member);
         }
+        while (!list_empty(&This->scripts))
+        {
+            struct scriptlet_script *script = LIST_ENTRY(list_head(&This->scripts), struct scriptlet_script, entry);
+            list_remove(&script->entry);
+            heap_free(script->language);
+            heap_free(script->body);
+            heap_free(script);
+        }
         heap_free(This->classid_str);
         heap_free(This->description);
         heap_free(This->versioned_progid);
@@ -603,6 +666,7 @@ static HRESULT create_scriptlet_factory(const WCHAR *url, struct scriptlet_facto
     factory->IClassFactory_iface.lpVtbl = &scriptlet_factory_vtbl;
     factory->ref = 1;
     list_init(&factory->members);
+    list_init(&factory->scripts);
 
     hres = parse_scriptlet_file(factory, url);
     if (FAILED(hres))




More information about the wine-cvs mailing list