-
Notifications
You must be signed in to change notification settings - Fork 8
/
ManagedScript.cs
188 lines (155 loc) · 5.69 KB
/
ManagedScript.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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Squared.Task;
using System.Web.Script.Serialization;
using Squared.Task.Data.Mapper;
using Squared.Util.Event;
using Squared.Task.Data;
using System.Diagnostics;
using System.IO;
namespace ShootBlues {
[Mapper]
class PrefEntry {
[Column("prefName")]
public string Key {
get; set;
}
[Column("value")]
public object Value {
get; set;
}
}
public class DependencyManager {
protected HashSet<ScriptName> _Dependencies = new HashSet<ScriptName>();
protected HashSet<ScriptName> _OptionalDependencies = new HashSet<ScriptName>();
public ScriptName Name {
get;
protected set;
}
public IEnumerable<ScriptName> Dependencies {
get { return _Dependencies; }
}
public IEnumerable<ScriptName> OptionalDependencies {
get { return _OptionalDependencies; }
}
protected void ClearDependencies () {
_Dependencies.Clear();
_OptionalDependencies.Clear();
}
protected void AddDependency (string name, bool optional) {
string searchPath = Name.DefaultSearchPath;
if (Debugger.IsAttached) {
var myAssembly = this.GetType().Assembly;
var myAssemblyPath = Path.GetFullPath(Path.GetDirectoryName(myAssembly.Location)).ToLowerInvariant();
var mySourcePath = Path.GetFullPath(myAssemblyPath.Replace(
@"\shootblues\bin", String.Format(
@"\shootbluesscripts\{0}", Name.NameWithoutExtension.ToLowerInvariant()
.Replace(".script", "")
)
));
if (File.Exists(Path.Combine(mySourcePath, name)))
searchPath = mySourcePath;
}
var sn = new ScriptName(name, searchPath);
if (optional)
_OptionalDependencies.Add(sn);
else
_Dependencies.Add(sn);
}
protected void AddDependency (string name) {
AddDependency(name, false);
}
}
public abstract class ManagedScript : DependencyManager, IManagedScript {
protected EventSubscription _PreferencesChangedEvt;
protected readonly Dictionary<ProcessInfo, OwnedFutureSet> _OwnedFutures = new Dictionary<ProcessInfo, OwnedFutureSet>();
private PreferenceStore _Preferences = null;
protected ConnectionWrapper Database {
get {
return Program.Database;
}
}
protected TaskScheduler Scheduler {
get {
return Program.Scheduler;
}
}
protected EventBus EventBus {
get {
return Program.EventBus;
}
}
protected IProfile Profile {
get {
return Program.Profile;
}
}
public PreferenceStore Preferences {
get {
if (_Preferences == null) {
_Preferences = new PreferenceStore(this, Database, EventBus);
_PreferencesChangedEvt = EventBus.Subscribe<string[]>(_Preferences, "Changed", Scheduler, OnPreferencesChanged);
}
return _Preferences;
}
}
public ManagedScript (ScriptName name) {
Name = name;
}
public IFuture Start (ProcessInfo process, ISchedulable task) {
OwnedFutureSet of = null;
if (!_OwnedFutures.TryGetValue(process, out of)) {
of = new OwnedFutureSet();
_OwnedFutures[process] = of;
}
var f = process.Start(task);
of.Add(f);
return f;
}
public IFuture Start (ProcessInfo process, IEnumerator<object> task) {
return this.Start(process, new SchedulableGeneratorThunk(task));
}
protected void DisposeFuturesForProcess (ProcessInfo process) {
OwnedFutureSet of = null;
if (_OwnedFutures.TryGetValue(process, out of)) {
_OwnedFutures.Remove(process);
of.Dispose();
}
}
protected IEnumerator<object> CallFunction (string moduleName, string functionName, params object[] arguments) {
foreach (var process in Program.GetProcessesRunningScript(this))
yield return Program.CallFunction(process, moduleName, functionName, arguments);
}
public virtual IEnumerator<object> Reload () {
yield break;
}
public virtual IEnumerator<object> LoadInto (ProcessInfo process) {
DisposeFuturesForProcess(process);
yield break;
}
public virtual IEnumerator<object> LoadedInto (ProcessInfo process) {
yield break;
}
public virtual IEnumerator<object> UnloadFrom (ProcessInfo process) {
DisposeFuturesForProcess(process);
yield break;
}
public virtual IEnumerator<object> OnStatusWindowShown (IStatusWindow statusWindow) {
yield break;
}
public virtual IEnumerator<object> OnStatusWindowHidden (IStatusWindow statusWindow) {
yield break;
}
protected virtual IEnumerator<object> OnPreferencesChanged (EventInfo evt, string[] prefNames) {
yield break;
}
public virtual IEnumerator<object> Initialize () {
yield break;
}
public virtual void Dispose () {
_PreferencesChangedEvt.Dispose();
}
}
}