1 | sclass MultiPort { |
2 | sclass Resp { |
3 | long virtualPort; |
4 | S botName; |
5 | O responder; |
6 | } |
7 | |
8 | new List<Resp> responders; |
9 | Android3 android; |
10 | long nextVirtualPort = 1; |
11 | |
12 | *() { |
13 | synchronized(getJavaX()) { |
14 | if (!getMultiPorts().isEmpty()) return; |
15 | if (!(Boolean) call(getJavaX(), "addMultiPort", this)) { |
16 | // XXX - hope this still works |
17 | Android3 android = new Android3("Multi-Port at " + getVMID() + "."); |
18 | android.useMultiPort = false; |
19 | android.incomingSilent = true; |
20 | android.console = false; |
21 | android.daemon = true; |
22 | makeAndroid3(android); |
23 | } |
24 | } |
25 | //print("Dynamic Multi-Port registered with VM. Now " + l(getMultiPorts()) + " multi-port(s)."); |
26 | } |
27 | |
28 | S answer(S s) { |
29 | new Matches m; |
30 | |
31 | if (match3("list bots", s, m)) { |
32 | ret structure(listBotsWithPort()); |
33 | } |
34 | |
35 | if (match3("has bot *", s, m)) { |
36 | S name = m.unq(0); |
37 | ret findResponder(name) != null ? "yes" : "no"; |
38 | } |
39 | |
40 | if (match3("silent", s, m)) { |
41 | android.incomingSilent = true; |
42 | ret "OK."; |
43 | } |
44 | |
45 | if (match3("unsilent", s, m)) { |
46 | android.incomingSilent = false; |
47 | ret "OK."; |
48 | } |
49 | |
50 | if (match3("please forward to bot *: *", s, m)) { |
51 | S bot = unquote(m.m[0]); |
52 | S line = unquote(m.m[1]); |
53 | O responder = findResponder(bot); |
54 | if (responder == null) |
55 | ret "Error: bot not found"; |
56 | else |
57 | ret (S) call(responder, "answer", line, litlist(s)); |
58 | } |
59 | |
60 | ret null; |
61 | } |
62 | |
63 | synchronized L<S> listBots() { |
64 | new L<S> list; |
65 | for (Resp r : responders) |
66 | list.add(r.botName); |
67 | ret list; |
68 | } |
69 | |
70 | synchronized Map<Long,S> listBotsWithPort() { |
71 | new Map<Long,S> map; |
72 | for (Resp r : responders) |
73 | map.put(r.virtualPort, r.botName); |
74 | ret map; |
75 | } |
76 | |
77 | synchronized O findResponder(S botName) { |
78 | if (isInteger(botName)) { |
79 | long vport = parseLong(botName); |
80 | for (Resp r : responders) |
81 | if (r.virtualPort == vport) |
82 | ret r.responder; |
83 | } else { |
84 | for (Resp r : responders) |
85 | if (startsWithIgnoreCase(r.botName, botName)) |
86 | ret r.responder; |
87 | } |
88 | ret null; |
89 | } |
90 | |
91 | synchronized long addResponder(S botName, O responder) { |
92 | new Resp r; |
93 | r.virtualPort = nextVirtualPort++; |
94 | r.botName = botName; |
95 | r.responder = responder; |
96 | responders.add(r); |
97 | ret r.virtualPort; |
98 | } |
99 | |
100 | synchronized void removeResponder(O responder) { |
101 | for (int i = 0; i < l(responders); i++) |
102 | if (responders.get(i).responder == responder) { |
103 | //print("Responder removed."); |
104 | responders.remove(i); |
105 | ret; |
106 | } |
107 | } |
108 | |
109 | synchronized void removePort(long virtualPort) { |
110 | for (int i = 0; i < l(responders); i++) |
111 | if (responders.get(i).virtualPort == virtualPort) { |
112 | //print("Virtual port " + virtualPort + " removed."); |
113 | responders.remove(i); |
114 | ret; |
115 | } |
116 | } |
117 | } |
Began life as a copy of #1001672
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1006632 |
Snippet name: | class MultiPort (multi-port as object) |
Eternal ID of this version: | #1006632/2 |
Text MD5: | a61ea907ed3de94d63d00ef0b6ca94e3 |
Author: | stefan |
Category: | javax / core |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2017-07-30 17:05:11 |
Source code size: | 3032 bytes / 117 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 536 / 1330 |
Version history: | 1 change(s) |
Referenced in: | [show references] |