-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConfig.cs
133 lines (115 loc) · 3.62 KB
/
Config.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace Thorg_Installer.Config
{
public class Component
{
[XmlAttribute]
public string Id { get; set; }
[XmlAttribute]
public string Version { get; set; }
[XmlAttribute]
public string Download { get; set; }
[XmlAttribute]
public string Sha256 { get; set; }
[XmlElement("Component")]
public List<Component> Components { get; set; } = new List<Component>();
internal bool Find(string id, out Component child)
{
foreach (var component in this.Components)
{
if (component.Id == id)
{
child = component;
return true;
}
if (component.Find(id, out child))
{
return true;
}
}
child = null;
return false;
}
}
public class App
{
[XmlAttribute]
public string Name { get; set; }
[XmlAttribute]
public string Version { get; set; }
[XmlElement("Component")]
public List<Component> Components { get; set; } = new List<Component>();
public async static Task<App> Load(string uri = "https://golem-releases.cdn.golem.network/thorg/thorg.xml")
{
var xs = new XmlSerializer(typeof(App));
using (var client = new HttpClient())
{
var response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
return xs.Deserialize(await response.Content.ReadAsStreamAsync()) as App;
}
}
public static App FromFile(string path)
{
var xs = new XmlSerializer(typeof(App));
using (var f = File.OpenRead(path))
{
return xs.Deserialize(f) as App;
}
}
public void ToFile(string path)
{
var xs = new XmlSerializer(typeof(App));
using (var f = File.CreateText(path))
{
xs.Serialize(f, this);
}
}
public Component this[string id]
{
get
{
foreach (var component in this.Components)
{
if (component.Id == id)
{
return component;
}
if (component.Find(id, out var _child))
{
return _child;
}
}
return null;
}
}
private static void _flattenComponents(IList<Component> aggregator, IList<Component> components)
{
foreach (var c in components)
{
aggregator.Add(c);
_flattenComponents(aggregator, c.Components);
}
}
public IList<Component> GetAllComponents()
{
var list = new List<Component>(10);
_flattenComponents(list, Components);
return list;
}
public ICollection<Component> DiffrenceTo(App _other)
{
var me = GetAllComponents();
var diffrent_sha2 = me.Select(t => t.Sha256).Except(_other.GetAllComponents().Select(t => t.Sha256)).ToList();
return me.Where(t => diffrent_sha2.Contains(t.Sha256)).ToList();
}
}
}