corrade-vassal – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 1 using System;
2 using Gtk;
3 using GridProxyGUI;
4 using OpenMetaverse.StructuredData;
5 using OpenMetaverse.Packets;
6 using System.IO;
7 using System.IO.Compression;
8 using System.Text;
9 using System.Net;
10 using System.Collections.Generic;
11 using System.Collections.Concurrent;
12  
13 namespace GridProxyGUI
14 {
15 public enum ItemType : int
16 {
17 Unknown = 0,
18 Login,
19 UDP,
20 Cap,
21 EQ
22 }
23  
24 public class FilterItem
25 {
26 public delegate void FilterItemChangedDelegate(object sender, EventArgs e);
27 public event FilterItemChangedDelegate FilterItemChanged;
28 bool enabled;
29 public bool Enabled
30 {
31 get { return enabled; }
32 set
33 {
34 enabled = value;
35 if (FilterItemChanged != null)
36 {
37 FilterItemChanged(this, EventArgs.Empty);
38 }
39 }
40 }
41 public string Name;
42 public ItemType Type;
43  
44 public OSDMap ToOSD()
45 {
46 OSDMap ret = new OSDMap();
47  
48 ret["name"] = Name;
49 ret["type"] = (int)Type;
50 ret["enabled"] = enabled;
51  
52 return ret;
53 }
54  
55 public static FilterItem FromOSD(OSDMap map)
56 {
57 var ret = new FilterItem();
58  
59 ret.Name = map["name"];
60 ret.enabled = map["enabled"];
61 ret.Type = (ItemType)map["type"].AsInteger();
62  
63 return ret;
64 }
65 }
66  
67 }
68  
69 public partial class MainWindow
70 {
71 string SessionFileName;
72 List<string> LoginServers = new List<string>();
73  
74 ConcurrentDictionary<string, FilterItem> UDPFilterItems = new ConcurrentDictionary<string, FilterItem>();
75 ConcurrentDictionary<string, FilterItem> CapFilterItems = new ConcurrentDictionary<string, FilterItem>();
76 ListStore udpStore = new ListStore(typeof(FilterItem));
77 ListStore capStore = new ListStore(typeof(FilterItem));
78 FilterScroller udpScroller, capScroller;
79  
80 void LoadFromOSD(ConcurrentDictionary<string, FilterItem> items, OSDArray filters)
81 {
82 try
83 {
84 foreach (var filter in filters)
85 {
86 if (filter is OSDMap)
87 {
88 var item = FilterItem.FromOSD((OSDMap)filter);
89 items[item.Name] = item;
90 }
91 }
92 }
93 catch { }
94 }
95  
96 void InitUDPFilters(OSDArray filters)
97 {
98 UDPFilterItems.Clear();
99 udpStore.Clear();
100  
101 if (filters != null)
102 {
103 LoadFromOSD(UDPFilterItems, filters);
104 }
105  
106 if (!UDPFilterItems.ContainsKey("Login Request"))
107 {
108 UDPFilterItems["Login Request"] = new FilterItem() { Enabled = true, Name = "Login Request", Type = ItemType.Login };
109 }
110  
111 if (!UDPFilterItems.ContainsKey("Login Response"))
112 {
113 UDPFilterItems["Login Response"] = new FilterItem() { Enabled = true, Name = "Login Response", Type = ItemType.Login };
114 }
115  
116 foreach (string name in Enum.GetNames(typeof(PacketType)))
117 {
118 if (!string.IsNullOrEmpty(name) && !UDPFilterItems.ContainsKey(name))
119 {
120 var item = new FilterItem() { Enabled = false, Name = name, Type = ItemType.UDP };
121 UDPFilterItems[name] = item;
122 }
123 }
124  
125 List<string> keys = new List<string>(UDPFilterItems.Keys);
126 keys.Sort((a, b) => { return string.Compare(a.ToLower(), b.ToLower()); });
127  
128 udpStore.AppendValues(UDPFilterItems["Login Request"]);
129 udpStore.AppendValues(UDPFilterItems["Login Response"]);
130  
131 foreach (var key in keys)
132 {
133 UDPFilterItems[key].FilterItemChanged += item_FilterItemChanged;
134 if (UDPFilterItems[key].Type == ItemType.Login) continue;
135 udpStore.AppendValues(UDPFilterItems[key]);
136 }
137 }
138  
139 void InitCapFilters(OSDArray filters)
140 {
141 CapFilterItems.Clear();
142 capStore.Clear();
143  
144 if (filters != null)
145 {
146 LoadFromOSD(CapFilterItems, filters);
147 }
148  
149 List<string> keys = new List<string>(CapFilterItems.Keys);
150 keys.Sort((a, b) =>
151 {
152 if (CapFilterItems[a].Type == ItemType.Cap && CapFilterItems[b].Type == ItemType.EQ)
153 return -1;
154  
155 if (CapFilterItems[a].Type == ItemType.EQ && CapFilterItems[b].Type == ItemType.Cap)
156 return 1;
157  
158 return string.Compare(a.ToLower(), b.ToLower());
159 });
160  
161 foreach (var key in keys)
162 {
163 CapFilterItems[key].FilterItemChanged += item_FilterItemChanged;
164 capStore.AppendValues(CapFilterItems[key]);
165 }
166 }
167  
168 void InitProxyFilters()
169 {
170 capScroller = new FilterScroller(containerFilterCap, capStore);
171 udpScroller = new FilterScroller(containerFilterUDP, udpStore);
172  
173 OSDArray filters = null;
174  
175 if (Options.Instance.ContainsKey("udp_filters") && Options.Instance["udp_filters"] is OSDArray)
176 {
177 filters = (OSDArray)Options.Instance["udp_filters"];
178 }
179 InitUDPFilters(filters);
180  
181 filters = null;
182 if (Options.Instance.ContainsKey("cap_filters") && Options.Instance["cap_filters"] is OSDArray)
183 {
184 filters = (OSDArray)Options.Instance["cap_filters"];
185 }
186 InitCapFilters(filters);
187 }
188  
189 void item_FilterItemChanged(object sender, EventArgs e)
190 {
191 if (proxy == null) return;
192  
193 FilterItem item = (FilterItem)sender;
194 if (item.Type == ItemType.Cap)
195 {
196 proxy.AddCapsDelegate(item.Name, item.Enabled);
197 }
198 else if (item.Type == ItemType.UDP)
199 {
200 proxy.AddUDPDelegate(item.Name, item.Enabled);
201 }
202 }
203  
204 void ApplyProxyFilters()
205 {
206 foreach (var item in UDPFilterItems.Values)
207 {
208 item_FilterItemChanged(item, EventArgs.Empty);
209 }
210  
211 foreach (var item in CapFilterItems.Values)
212 {
213 item_FilterItemChanged(item, EventArgs.Empty);
214 }
215 }
216  
217 void LoadSavedSettings()
218 {
219 if (Options.Instance.ContainsKey("main_split_pos"))
220 {
221 mainSplit.Position = Options.Instance["main_split_pos"];
222 mainSplit.PositionSet = true;
223 }
224 if (Options.Instance.ContainsKey("main_width"))
225 {
226 Resize(Options.Instance["main_width"], Options.Instance["main_height"]);
227 Move(Options.Instance["main_x"], Options.Instance["main_y"]);
228 }
229  
230  
231 // populate the listen box with the known IP Addresses of this host
232 cbListen.AppendText("127.0.0.1");
233 int selected = 0;
234 try
235 {
236 int current = 0;
237 foreach (var address in Dns.GetHostAddresses(Dns.GetHostName()))
238 {
239 if (address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork || address.ToString() == "127.0.0.1") continue;
240 current++;
241 if (Options.Instance["listen_address"] == address.ToString())
242 {
243 selected = current;
244 }
245 cbListen.AppendText(address.ToString());
246 }
247 }
248 catch { }
249 cbListen.Active = selected;
250  
251 if (Options.Instance["login_servers"] is OSDArray)
252 {
253 var servers = (OSDArray)Options.Instance["login_servers"];
254 for (int i = 0; i < servers.Count; i++)
255 {
256 LoginServers.Add(servers[i]);
257 }
258 }
259  
260 if (LoginServers.Count < 3)
261 {
262 LoginServers.Add("https://login.agni.lindenlab.com/cgi-bin/login.cgi");
263 LoginServers.Add("https://login.aditi.lindenlab.com/cgi-bin/login.cgi");
264 LoginServers.Add("http://login.osgrid.org/");
265 }
266  
267 foreach (var server in LoginServers)
268 {
269 cbLoginURL.AppendText(server);
270 }
271  
272 selected = Options.Instance["selected_login_server"];
273  
274 if (selected >= 0 && selected < LoginServers.Count)
275 {
276 cbLoginURL.Active = selected;
277 }
278  
279 int port = 8080;
280 if (Options.Instance.ContainsKey("listen_port"))
281 {
282 port = Options.Instance["listen_port"];
283 }
284 txtPort.Text = port.ToString();
285  
286 }
287  
288 internal FilterItem GetFilter(Session session)
289 {
290 if (session is SessionCaps || session is SessionEvent)
291 {
292 foreach (var filter in CapFilterItems.Values)
293 {
294 if (filter.Name == session.Name)
295 {
296 return filter;
297 }
298 }
299 }
300 else
301 {
302 foreach (var filter in UDPFilterItems.Values)
303 {
304 if (filter.Name == session.Name)
305 {
306 return filter;
307 }
308 }
309 }
310  
311 return null;
312 }
313  
314 OSDArray ListStoreToOSD(ListStore list)
315 {
316 OSDArray ret = new OSDArray();
317 list.Foreach((model, path, iter) =>
318 {
319 var item = model.GetValue(iter, 0) as FilterItem;
320 if (null != item)
321 {
322 ret.Add(item.ToOSD());
323 }
324  
325 return false;
326 });
327 return ret;
328 }
329  
330 void SaveSettings()
331 {
332 Options.Instance["udp_filters"] = ListStoreToOSD(udpStore);
333 Options.Instance["cap_filters"] = ListStoreToOSD(capStore);
334  
335 int port = 8080;
336 int.TryParse(txtPort.Text, out port);
337 Options.Instance["listen_port"] = port;
338  
339 var currentServer = cbLoginURL.ActiveText.Trim();
340 Uri uriResult;
341 if (Uri.TryCreate(currentServer, UriKind.Absolute, out uriResult)
342 && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)
343 && !LoginServers.Contains(currentServer))
344 {
345 LoginServers.Add(currentServer);
346 Options.Instance["selected_login_server"] = LoginServers.Count - 1;
347 }
348 else
349 {
350 Options.Instance["selected_login_server"] = cbLoginURL.Active;
351 }
352  
353 if (LoginServers.Count > 0)
354 {
355 OSDArray loginServers = new OSDArray();
356 foreach (var s in LoginServers)
357 {
358 loginServers.Add(s);
359 }
360 Options.Instance["login_servers"] = loginServers;
361 }
362  
363 Options.Instance["listen_address"] = cbListen.ActiveText;
364 Options.Instance["main_split_pos"] = mainSplit.Position;
365 int x, y;
366  
367 GetSize(out x, out y); ;
368 Options.Instance["main_width"] = x;
369 Options.Instance["main_height"] = y;
370  
371 GetPosition(out x, out y);
372 Options.Instance["main_x"] = x;
373 Options.Instance["main_y"] = y;
374  
375 Options.Instance.Save();
376 Application.Quit();
377 }
378  
379 void SaveSession()
380 {
381 OSDMap s = new OSDMap();
382 OSDArray array = new OSDArray();
383  
384 foreach (object[] row in messages.Messages)
385 {
386 array.Add(((Session)row[0]).Serialize());
387 }
388  
389 s["Version"] = "1.0";
390 s["Description"] = "Grid Proxy Session Archive";
391 s["Messages"] = array;
392  
393 System.Threading.ThreadPool.QueueUserWorkItem((sync) =>
394 {
395 try
396 {
397 using (var file = File.Open(SessionFileName, FileMode.Create))
398 {
399 using (var compressed = new GZipStream(file, CompressionMode.Compress))
400 {
401 using (var writer = new System.Xml.XmlTextWriter(compressed, new UTF8Encoding(false)))
402 {
403 writer.Formatting = System.Xml.Formatting.Indented;
404 writer.WriteStartDocument();
405 writer.WriteStartElement(String.Empty, "llsd", String.Empty);
406 OSDParser.SerializeLLSDXmlElement(writer, s);
407 writer.WriteEndElement();
408 }
409 }
410 }
411 }
412 catch { }
413 });
414 }
415  
416 void OpenSession(string fileName)
417 {
418 System.Threading.ThreadPool.QueueUserWorkItem((sync) =>
419 {
420 OSD data;
421 try
422 {
423 using (var file = File.OpenRead(fileName))
424 {
425 using (var compressed = new GZipStream(file, CompressionMode.Decompress))
426 {
427 data = OSDParser.DeserializeLLSDXml(compressed);
428 }
429 }
430 }
431 catch
432 {
433 return;
434 }
435  
436 Application.Invoke((sender, e) =>
437 {
438 try
439 {
440 if (data != null && data is OSDMap)
441 {
442 messages.Messages.Clear();
443  
444 OSDMap map = (OSDMap)data;
445 OSDArray msgs = (OSDArray)map["Messages"];
446 foreach (var msgOSD in msgs)
447 {
448 var msg = (OSDMap)msgOSD;
449 var session = Session.FromOSD(msg);
450 if (session != null)
451 {
452 messages.Messages.AppendValues(session);
453 }
454 }
455  
456 SessionFileName = fileName;
457 }
458 }
459 catch { }
460 });
461 });
462 }
463  
464 }