Skip to content

Commit

Permalink
Update Task
Browse files Browse the repository at this point in the history
  • Loading branch information
dellis1972 committed Nov 4, 2022
1 parent 1190937 commit 25c0027
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 24 deletions.
3 changes: 2 additions & 1 deletion Documentation/guides/messages/xa1031.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ ms.date: 10/10/2022
## Example messages

```
The 'AndroidHttpClientHandlerType' has an invalid value of 'xxx' please check your project settings.
The 'AndroidHttpClientHandlerType' property value 'Foo.Bar.HttpHander, MyApp' must derive from 'System.Net.Http.HttpMessageHandler'.
Please change the value to an assembly-qualifed type name which inherits from '{1}' or remove the property completely.
```

## Solution
Expand Down
55 changes: 32 additions & 23 deletions src/Xamarin.Android.Build.Tasks/Tasks/CheckClientHandlerType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,57 +14,66 @@ public class CheckClientHandlerType : AndroidTask
{
public override string TaskPrefix => "CCHT";

[Required]
public string ClientHandlerType { get; set; }

[Required]
public string ValidHandlerType { get; set; }
[Required]
public ITaskItem[] ResolvedAssemblies { get; set; }

public override bool RunTask ()
{
string[] types = ClientHandlerType.Split (',');
string type = types[0].Trim ();
string assembly = "Mono.Android.dll";
string assembly = "Mono.Android";

if (types.Length > 1) {
assembly = $"{types[1].Trim ()}.dll";
assembly = types[1].Trim ();
}
// load the assembly.
ITaskItem foundAssembly = null;
foreach (var asm in ResolvedAssemblies) {
string filename = Path.GetFileName (asm.ItemSpec);
string filename = Path.GetFileNameWithoutExtension (asm.ItemSpec);
if (string.CompareOrdinal (assembly, filename) == 0) {
foundAssembly = asm;
break;
}
}
if (foundAssembly == null) {
Log.LogCodedError ("XA1234", "No Assembly Found");
Log.LogError ($"Could not resolve '{assembly}'. Please check your `AndroidHttpClientHandlerType` setting.");
return !Log.HasLoggedErrors;
}
// find the type.
var readerParameters = new ReaderParameters {
ReadSymbols = false,
};
var resolver = new DirectoryAssemblyResolver (this.CreateTaskLogger (), loadDebugSymbols: false, loadReaderParameters: readerParameters);
foreach (var asm in ResolvedAssemblies) {
var path = Path.GetFullPath (Path.GetDirectoryName (asm.ItemSpec));
if (!resolver.SearchDirectories.Contains (path)) {
resolver.SearchDirectories.Add (path);
using (var resolver = new DirectoryAssemblyResolver (this.CreateTaskLogger (), loadDebugSymbols: false, loadReaderParameters: readerParameters)) {
foreach (var asm in ResolvedAssemblies) {
var path = Path.GetFullPath (Path.GetDirectoryName (asm.ItemSpec));
if (!resolver.SearchDirectories.Contains (path)) {
resolver.SearchDirectories.Add (path);
}
}
}

var def = resolver.GetAssembly (Path.GetFullPath (foundAssembly.ItemSpec));
var t = def.MainModule.GetType (type);
if (t == null) {
Log.LogError ("What!");
return false;
}
string[] valueHandlerTypes = ValidHandlerType.Split (',');
if (!Extends (t, valueHandlerTypes [0].Trim ())) {
Log.LogCodedError ("XA1031", Xamarin.Android.Tasks.Properties.Resources.XA1031, type, valueHandlerTypes [0]);
}
var assemblyDefinition = resolver.GetAssembly (Path.GetFullPath (foundAssembly.ItemSpec));
TypeDefinition handlerType = null;
foreach (var model in assemblyDefinition.Modules) {
handlerType = assemblyDefinition.MainModule.GetType (type);
if (handlerType != null)
break;
}
if (handlerType == null) {
Log.LogError ($"Failed to resolve '{type}' from '{assembly}'. Please check your `AndroidHttpClientHandlerType` setting.");
return false;
}

string[] valueHandlerTypes = ValidHandlerType.Split (',');
if (!Extends (handlerType, valueHandlerTypes [0].Trim ())) {
Log.LogCodedError ("XA1031", Xamarin.Android.Tasks.Properties.Resources.XA1031, type, valueHandlerTypes [0]);
}

// check its inheritance
return !Log.HasLoggedErrors;
return !Log.HasLoggedErrors;
}
}

static bool Extends (TypeDefinition type, string validBase) {
Expand Down

0 comments on commit 25c0027

Please sign in to comment.