OSDN Git Service

Cleanup of event handlers.
[radegast/radegast.git] / Radegast / Core / RadegastInstance.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.IO;\r
4 using System.Text;\r
5 using System.Windows.Forms;\r
6 using RadegastNc;\r
7 using OpenMetaverse;\r
8 \r
9 namespace Radegast\r
10 {\r
11     public class RadegastInstance\r
12     {\r
13         private GridClient client;\r
14         private RadegastNetcom netcom;\r
15 \r
16         private ImageCache imageCache;\r
17         private StateManager state;\r
18         private ConfigManager config;\r
19 \r
20         private frmMain mainForm;\r
21         private TabsConsole tabsConsole;\r
22         public readonly string userDir;\r
23         public readonly string animCacheDir;\r
24 \r
25         public Dictionary<UUID, Group> groups;\r
26         public Dictionary<UUID, string> nameCache = new Dictionary<UUID,string>();\r
27 \r
28         public delegate void OnAvatarNameCallBack(UUID agentID, string agentName);\r
29         public event OnAvatarNameCallBack OnAvatarName;\r
30 \r
31         public readonly bool advancedDebugging = false;\r
32 \r
33         public RadegastInstance()\r
34         {\r
35             try\r
36             {\r
37                 userDir = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), Properties.Resources.ProgramName);\r
38                 if (!Directory.Exists(userDir))\r
39                 {\r
40                     Directory.CreateDirectory(userDir);\r
41                 }\r
42             }\r
43             catch (Exception) \r
44             {\r
45                 userDir = System.Environment.CurrentDirectory;\r
46             };\r
47             animCacheDir = Path.Combine(userDir, @"anim_cache");\r
48 \r
49             Settings.PIPELINE_REFRESH_INTERVAL = 2000.0f;\r
50 \r
51             client = new GridClient();\r
52             client.Settings.ALWAYS_REQUEST_OBJECTS = true;\r
53             client.Settings.ALWAYS_DECODE_OBJECTS = true;\r
54             client.Settings.OBJECT_TRACKING = true;\r
55             client.Settings.ENABLE_SIMSTATS = true;\r
56             client.Settings.FETCH_MISSING_INVENTORY = true;\r
57             client.Settings.MULTIPLE_SIMS = true;\r
58             client.Settings.SEND_AGENT_THROTTLE = true;\r
59             client.Settings.SEND_AGENT_UPDATES = true;\r
60 \r
61             client.Settings.USE_TEXTURE_CACHE = true;\r
62             client.Settings.TEXTURE_CACHE_DIR = Path.Combine(userDir,  "cache");\r
63             client.Assets.Cache.AutoPruneEnabled = false;\r
64     \r
65             client.Throttle.Texture = 2446000.0f;\r
66             client.Throttle.Asset = 2446000.0f;\r
67             client.Settings.THROTTLE_OUTGOING_PACKETS = false;\r
68             \r
69             netcom = new RadegastNetcom(client);\r
70 \r
71             imageCache = new ImageCache();\r
72             state = new StateManager(this);\r
73             InitializeConfig();\r
74 \r
75             mainForm = new frmMain(this);\r
76             mainForm.InitializeControls();\r
77             tabsConsole = mainForm.TabConsole;\r
78 \r
79             Application.ApplicationExit += new EventHandler(Application_ApplicationExit);\r
80             groups = new Dictionary<UUID, Group>();\r
81          \r
82             client.Groups.OnCurrentGroups += new GroupManager.CurrentGroupsCallback(Groups_OnCurrentGroups);\r
83             client.Groups.OnGroupLeft += new GroupManager.GroupLeftCallback(Groups_OnGroupLeft);\r
84             client.Groups.OnGroupJoined += new GroupManager.GroupJoinedCallback(Groups_OnGroupJoined);\r
85             client.Groups.OnGroupProfile += new GroupManager.GroupProfileCallback(Groups_OnGroupProfile);\r
86             client.Avatars.OnAvatarNames += new AvatarManager.AvatarNamesCallback(Avatars_OnAvatarNames);\r
87         }\r
88 \r
89         public void CleanUp()\r
90         {\r
91             if (client != null)\r
92             {\r
93                 client.Groups.OnCurrentGroups -= new GroupManager.CurrentGroupsCallback(Groups_OnCurrentGroups);\r
94                 client.Groups.OnGroupLeft -= new GroupManager.GroupLeftCallback(Groups_OnGroupLeft);\r
95                 client.Groups.OnGroupJoined -= new GroupManager.GroupJoinedCallback(Groups_OnGroupJoined);\r
96                 client.Groups.OnGroupProfile -= new GroupManager.GroupProfileCallback(Groups_OnGroupProfile);\r
97                 client.Avatars.OnAvatarNames -= new AvatarManager.AvatarNamesCallback(Avatars_OnAvatarNames);\r
98 \r
99                 client = null;\r
100             }\r
101 \r
102             if (netcom != null)\r
103             {\r
104                 netcom = null;\r
105             }\r
106         }\r
107 \r
108         void Avatars_OnAvatarNames(Dictionary<UUID, string> names)\r
109         {\r
110             lock (nameCache)\r
111             {\r
112                 foreach (KeyValuePair<UUID, string> av in names)\r
113                 {\r
114                     if (OnAvatarName != null) try { OnAvatarName(av.Key, av.Value); }\r
115                         catch (Exception) { };\r
116 \r
117                     if (!nameCache.ContainsKey(av.Key))\r
118                     {\r
119                         nameCache.Add(av.Key, av.Value);\r
120                     }\r
121                 }\r
122             }\r
123         }\r
124 \r
125         public string getAvatarName(UUID key)\r
126         {\r
127             if (nameCache.ContainsKey(key))\r
128             {\r
129                 return nameCache[key];\r
130             }\r
131             else\r
132             {\r
133                 client.Avatars.RequestAvatarName(key);\r
134                 return "Loading...";\r
135             }\r
136         }\r
137 \r
138         void Groups_OnGroupProfile(Group group)\r
139         {\r
140             if (groups.ContainsKey(group.ID))\r
141             {\r
142                 groups[group.ID] = group;\r
143             }\r
144         }\r
145 \r
146         void Groups_OnGroupJoined(UUID groupID, bool success)\r
147         {\r
148             if (success && !groups.ContainsKey(groupID))\r
149             {\r
150                 groups.Add(groupID, new Group());\r
151                 client.Groups.RequestGroupProfile(groupID);\r
152             }\r
153         }\r
154 \r
155         void Groups_OnGroupLeft(UUID groupID, bool success)\r
156         {\r
157             if (groups.ContainsKey(groupID))\r
158             {\r
159                 groups.Remove(groupID);\r
160             }\r
161         }\r
162 \r
163         void Groups_OnCurrentGroups(Dictionary<UUID, Group> gr)\r
164         {\r
165             this.groups = gr;\r
166         }\r
167 \r
168         private void Application_ApplicationExit(object sender, EventArgs e)\r
169         {\r
170             config.SaveCurrentConfig();\r
171         }\r
172 \r
173         private void InitializeConfig()\r
174         {\r
175             config = new ConfigManager(this);\r
176             config.ApplyDefault();\r
177 \r
178             netcom.LoginOptions.FirstName = config.CurrentConfig.FirstName;\r
179             netcom.LoginOptions.LastName = config.CurrentConfig.LastName;\r
180             netcom.LoginOptions.Password = config.CurrentConfig.PasswordMD5;\r
181             netcom.LoginOptions.IsPasswordMD5 = true;\r
182         }\r
183 \r
184         public GridClient Client\r
185         {\r
186             get { return client; }\r
187         }\r
188 \r
189         public RadegastNetcom Netcom\r
190         {\r
191             get { return netcom; }\r
192         }\r
193 \r
194         public ImageCache ImageCache\r
195         {\r
196             get { return imageCache; }\r
197         }\r
198 \r
199         public StateManager State\r
200         {\r
201             get { return state; }\r
202         }\r
203 \r
204         public ConfigManager Config\r
205         {\r
206             get { return config; }\r
207         }\r
208 \r
209         public frmMain MainForm\r
210         {\r
211             get { return mainForm; }\r
212         }\r
213 \r
214         public TabsConsole TabConsole\r
215         {\r
216             get { return tabsConsole; }\r
217         }\r
218     }\r
219 }\r