scrobj: Add registration element parser.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
f2fdbc3d86
commit
e8d99613fc
|
@ -44,6 +44,14 @@ struct scriptlet_factory
|
||||||
|
|
||||||
IXmlReader *xml_reader;
|
IXmlReader *xml_reader;
|
||||||
IMoniker *moniker;
|
IMoniker *moniker;
|
||||||
|
|
||||||
|
BOOL have_registration;
|
||||||
|
WCHAR *description;
|
||||||
|
WCHAR *progid;
|
||||||
|
WCHAR *versioned_progid;
|
||||||
|
WCHAR *version;
|
||||||
|
WCHAR *classid_str;
|
||||||
|
CLSID classid;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum tid_t
|
typedef enum tid_t
|
||||||
|
@ -148,6 +156,19 @@ static BOOL is_xml_name(struct scriptlet_factory *factory, const WCHAR *name)
|
||||||
return hres == S_OK && len == wcslen(name) && !memcmp(qname, name, len * sizeof(WCHAR));
|
return hres == S_OK && len == wcslen(name) && !memcmp(qname, name, len * sizeof(WCHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT expect_end_element(struct scriptlet_factory *factory)
|
||||||
|
{
|
||||||
|
XmlNodeType node_type;
|
||||||
|
HRESULT hres;
|
||||||
|
hres = next_xml_node(factory, &node_type);
|
||||||
|
if (hres != S_OK || node_type != XmlNodeType_EndElement)
|
||||||
|
{
|
||||||
|
FIXME("Unexpected node %u %s\n", node_type, debugstr_xml_name(factory));
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT expect_no_attributes(struct scriptlet_factory *factory)
|
static HRESULT expect_no_attributes(struct scriptlet_factory *factory)
|
||||||
{
|
{
|
||||||
UINT count;
|
UINT count;
|
||||||
|
@ -159,11 +180,123 @@ static HRESULT expect_no_attributes(struct scriptlet_factory *factory)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL is_case_xml_name(struct scriptlet_factory *factory, const WCHAR *name)
|
||||||
|
{
|
||||||
|
const WCHAR *qname;
|
||||||
|
UINT len;
|
||||||
|
HRESULT hres;
|
||||||
|
hres = IXmlReader_GetQualifiedName(factory->xml_reader, &qname, &len);
|
||||||
|
return hres == S_OK && len == wcslen(name) && !memicmp(qname, name, len * sizeof(WCHAR));
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT read_xml_value(struct scriptlet_factory *factory, WCHAR **ret)
|
||||||
|
{
|
||||||
|
const WCHAR *str;
|
||||||
|
UINT len;
|
||||||
|
HRESULT hres;
|
||||||
|
hres = IXmlReader_GetValue(factory->xml_reader, &str, &len);
|
||||||
|
if (FAILED(hres)) return hres;
|
||||||
|
if (!(*ret = heap_alloc((len + 1) * sizeof(WCHAR)))) return E_OUTOFMEMORY;
|
||||||
|
memcpy(*ret, str, len * sizeof(WCHAR));
|
||||||
|
(*ret)[len] = 0;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT parse_scriptlet_registration(struct scriptlet_factory *factory)
|
static HRESULT parse_scriptlet_registration(struct scriptlet_factory *factory)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
HRESULT hres;
|
||||||
|
|
||||||
|
if (factory->have_registration)
|
||||||
|
{
|
||||||
|
FIXME("duplicated registration element\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
factory->have_registration = TRUE;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
hres = IXmlReader_MoveToNextAttribute(factory->xml_reader);
|
||||||
|
if (hres != S_OK) break;
|
||||||
|
|
||||||
|
if (is_xml_name(factory, L"description"))
|
||||||
|
{
|
||||||
|
if (factory->description)
|
||||||
|
{
|
||||||
|
FIXME("Duplicated description\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
hres = read_xml_value(factory, &factory->description);
|
||||||
|
if (FAILED(hres)) return hres;
|
||||||
|
}
|
||||||
|
else if (is_case_xml_name(factory, L"progid"))
|
||||||
|
{
|
||||||
|
if (factory->progid)
|
||||||
|
{
|
||||||
|
FIXME("Duplicated progid\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
hres = read_xml_value(factory, &factory->progid);
|
||||||
|
if (FAILED(hres)) return hres;
|
||||||
|
}
|
||||||
|
else if (is_xml_name(factory, L"version"))
|
||||||
|
{
|
||||||
|
if (factory->version)
|
||||||
|
{
|
||||||
|
FIXME("Duplicated version\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
hres = read_xml_value(factory, &factory->version);
|
||||||
|
if (FAILED(hres)) return hres;
|
||||||
|
}
|
||||||
|
else if (is_xml_name(factory, L"classid"))
|
||||||
|
{
|
||||||
|
if (factory->classid_str)
|
||||||
|
{
|
||||||
|
FIXME("Duplicated classid attribute\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
hres = read_xml_value(factory, &factory->classid_str);
|
||||||
|
if (FAILED(hres)) return hres;
|
||||||
|
hres = IIDFromString(factory->classid_str, &factory->classid);
|
||||||
|
if (FAILED(hres))
|
||||||
|
{
|
||||||
|
FIXME("Invalid classid %s\n", debugstr_w(factory->classid_str));
|
||||||
|
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FIXME("Unexpected attribute\n");
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!factory->progid && !factory->classid_str)
|
||||||
|
{
|
||||||
|
FIXME("Incomplet registration element\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (factory->progid)
|
||||||
|
{
|
||||||
|
size_t progid_len = wcslen(factory->progid);
|
||||||
|
size_t version_len = wcslen(factory->version);
|
||||||
|
|
||||||
|
if (!(factory->versioned_progid = heap_alloc((progid_len + version_len + 2) * sizeof(WCHAR))))
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
memcpy(factory->versioned_progid, factory->progid, (progid_len + 1) * sizeof(WCHAR));
|
||||||
|
if (version_len)
|
||||||
|
{
|
||||||
|
factory->versioned_progid[progid_len++] = '.';
|
||||||
|
wcscpy(factory->versioned_progid + progid_len, factory->version);
|
||||||
|
}
|
||||||
|
else factory->versioned_progid[progid_len] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return expect_end_element(factory);
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT parse_scriptlet_public(struct scriptlet_factory *factory)
|
static HRESULT parse_scriptlet_public(struct scriptlet_factory *factory)
|
||||||
{
|
{
|
||||||
|
@ -305,6 +438,11 @@ static ULONG WINAPI scriptlet_factory_Release(IClassFactory *iface)
|
||||||
{
|
{
|
||||||
if (This->moniker) IMoniker_Release(This->moniker);
|
if (This->moniker) IMoniker_Release(This->moniker);
|
||||||
if (This->xml_reader) IXmlReader_Release(This->xml_reader);
|
if (This->xml_reader) IXmlReader_Release(This->xml_reader);
|
||||||
|
heap_free(This->classid_str);
|
||||||
|
heap_free(This->description);
|
||||||
|
heap_free(This->versioned_progid);
|
||||||
|
heap_free(This->progid);
|
||||||
|
heap_free(This->version);
|
||||||
heap_free(This);
|
heap_free(This);
|
||||||
}
|
}
|
||||||
return ref;
|
return ref;
|
||||||
|
|
Loading…
Reference in New Issue