Alexandre Julliard : ntdll: Add support for optional flag in
dependencies.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 20 06:02:14 CDT 2007
Module: wine
Branch: master
Commit: 84a318265d71d587c50c8168d2950e92e9516acc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=84a318265d71d587c50c8168d2950e92e9516acc
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jul 19 18:14:23 2007 +0200
ntdll: Add support for optional flag in dependencies.
---
dlls/ntdll/actctx.c | 37 +++++++++++++++++++++++++++----------
1 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index eb4214a..6b5d6b2 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -94,6 +94,7 @@ struct assembly_identity
WCHAR *language;
struct version version;
enum assembly_id_type type;
+ BOOL optional;
};
struct entity
@@ -213,6 +214,7 @@ struct actctx_loader
#define NAME_ATTR "name"
#define NEWVERSION_ATTR "newVersion"
#define OLDVERSION_ATTR "oldVersion"
+#define OPTIONAL_ATTR "optional"
#define PROCESSORARCHITECTURE_ATTR "processorArchitecture"
#define PUBLICKEYTOKEN_ATTR "publicKeyToken"
#define TLBID_ATTR "tlbid"
@@ -690,7 +692,6 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, ACTIVATION_CONTEXT* a
TRACE("\n");
- memset(ai, 0, sizeof(*ai));
while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
{
if (xmlstr_cmp(&attr_name, NAME_ATTR))
@@ -1008,8 +1009,7 @@ static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly
return parse_expect_elem(xmlbuf, ELEM_END(CLRSURROGATE_ELEM)) && parse_end_element(xmlbuf);
}
-static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf,
- struct actctx_loader* acl)
+static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl, BOOL optional)
{
struct assembly_identity ai;
xmlstr_t elem;
@@ -1019,6 +1019,9 @@ static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf,
if (!parse_expect_no_attr(xmlbuf, &end) || end) return end;
+ memset(&ai, 0, sizeof(ai));
+ ai.optional = optional;
+
if (!parse_expect_elem(xmlbuf, ASSEMBLYIDENTITY_ELEM) ||
!parse_assembly_identity_elem(xmlbuf, acl->actctx, &ai))
return FALSE;
@@ -1049,12 +1052,23 @@ static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf,
static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl)
{
- xmlstr_t elem;
- BOOL end = FALSE, ret = TRUE;
+ xmlstr_t attr_name, attr_value, elem;
+ BOOL end = FALSE, ret = TRUE, error, optional = FALSE;
TRACE("\n");
- if (!parse_expect_no_attr(xmlbuf, &end) || end) return end;
+ while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
+ {
+ if (xmlstr_cmp(&attr_name, OPTIONAL_ATTR))
+ {
+ optional = xmlstr_cmp( &attr_value, "yes" );
+ TRACE("optional=%s\n", debugstr_xmlstr(&attr_value));
+ }
+ else
+ {
+ WARN("unknown attr %s=%s\n", debugstr_xmlstr(&attr_name), debugstr_xmlstr(&attr_value));
+ }
+ }
while (ret && (ret = next_xml_elem(xmlbuf, &elem)))
{
@@ -1065,7 +1079,7 @@ static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl)
}
else if (xmlstr_cmp(&elem, DEPENDENTASSEMBLY_ELEM))
{
- ret = parse_dependent_assembly_elem(xmlbuf, acl);
+ ret = parse_dependent_assembly_elem(xmlbuf, acl, optional);
}
else
{
@@ -1760,9 +1774,12 @@ static NTSTATUS parse_depend_manifests(struct actctx_loader* acl)
{
if (lookup_assembly(acl, &acl->dependencies[i]) != STATUS_SUCCESS)
{
- FIXME( "Could not find assembly %s\n", debugstr_w(acl->dependencies[i].name) );
- status = STATUS_SXS_CANT_GEN_ACTCTX;
- break;
+ if (!acl->dependencies[i].optional)
+ {
+ FIXME( "Could not find dependent assembly %s\n", debugstr_w(acl->dependencies[i].name) );
+ status = STATUS_SXS_CANT_GEN_ACTCTX;
+ break;
+ }
}
}
/* FIXME should now iterate through all refs */
More information about the wine-cvs
mailing list