5 // Jb Evain (jb@nurv.fr)
7 // (C) 2007 Novell Inc.
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System
.Reflection
;
34 using System
.Xml
.XPath
;
38 namespace Mono
.Linker
.Steps
{
40 public class BlacklistStep
: BaseStep
{
42 protected override bool ConditionToProcess()
44 return Context
.CoreAction
== AssemblyAction
.Link
;
47 protected override void Process ()
49 foreach (string name
in Assembly
.GetExecutingAssembly ().GetManifestResourceNames ()) {
50 if (Path
.GetExtension (name
) != ".xml" || !IsReferenced (GetAssemblyName (name
)))
54 if (Context
.LogInternalExceptions
)
55 Console
.WriteLine ("Processing resource linker descriptor: {0}", name
);
56 Context
.Pipeline
.AddStepAfter (typeof (TypeMapStep
), GetResolveStep (name
));
57 } catch (XmlException ex
) {
58 /* This could happen if some broken XML file is included. */
59 if (Context
.LogInternalExceptions
)
60 Console
.WriteLine ("Error processing {0}: {1}", name
, ex
);
64 foreach (var asm
in Context
.GetAssemblies ()) {
65 foreach (var rsc
in asm
.Modules
66 .SelectMany (mod
=> mod
.Resources
)
67 .Where (res
=> res
.ResourceType
== ResourceType
.Embedded
)
68 .Where (res
=> Path
.GetExtension (res
.Name
) == ".xml")
69 .Where (res
=> IsReferenced (GetAssemblyName (res
.Name
)))
70 .Cast
<EmbeddedResource
> ()) {
72 if (Context
.LogInternalExceptions
)
73 Console
.WriteLine ("Processing embedded resource linker descriptor: {0}", rsc
.Name
);
75 Context
.Pipeline
.AddStepAfter (typeof (TypeMapStep
), GetExternalResolveStep (rsc
, asm
));
76 } catch (XmlException ex
) {
77 /* This could happen if some broken XML file is embedded. */
78 if (Context
.LogInternalExceptions
)
79 Console
.WriteLine ("Error processing {0}: {1}", rsc
.Name
, ex
);
85 static string GetAssemblyName (string descriptor
)
87 int pos
= descriptor
.LastIndexOf ('.');
91 return descriptor
.Substring (0, pos
);
94 bool IsReferenced (string name
)
96 foreach (AssemblyDefinition assembly
in Context
.GetAssemblies ())
97 if (assembly
.Name
.Name
== name
)
103 static ResolveFromXmlStep
GetExternalResolveStep (EmbeddedResource resource
, AssemblyDefinition assembly
)
105 return new ResolveFromXmlStep (GetExternalDescriptor (resource
), "resource " + resource
.Name
+ " in " + assembly
.FullName
);
108 static ResolveFromXmlStep
GetResolveStep (string descriptor
)
110 return new ResolveFromXmlStep (GetDescriptor (descriptor
), "descriptor " + descriptor
+ " from " + Assembly
.GetExecutingAssembly ().FullName
);
113 static XPathDocument
GetExternalDescriptor (EmbeddedResource resource
)
115 using (var sr
= new StreamReader (resource
.GetResourceStream ())) {
116 return new XPathDocument (new StringReader (sr
.ReadToEnd ()));
120 static XPathDocument
GetDescriptor (string descriptor
)
122 using (StreamReader sr
= new StreamReader (GetResource (descriptor
))) {
123 return new XPathDocument (new StringReader (sr
.ReadToEnd ()));
127 static Stream
GetResource (string descriptor
)
129 return Assembly
.GetExecutingAssembly ().GetManifestResourceStream (descriptor
);