OSDN Git Service

Fixed point at.
[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         public readonly bool MonoRuntime;\r
33 \r
34         public RadegastInstance()\r
35         {\r
36             try\r
37             {\r
38                 userDir = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), Properties.Resources.ProgramName);\r
39                 if (!Directory.Exists(userDir))\r
40                 {\r
41                     Directory.CreateDirectory(userDir);\r
42                 }\r
43             }\r
44             catch (Exception) \r
45             {\r
46                 userDir = System.Environment.CurrentDirectory;\r
47             };\r
48             animCacheDir = Path.Combine(userDir, @"anim_cache");\r
49 \r
50             // Are we running mono?\r
51             if (null == Type.GetType("Mono.Runtime"))\r
52             {\r
53                 MonoRuntime = false;\r
54             }\r
55             else\r
56             {\r
57                 MonoRuntime = true;\r
58             }\r
59 \r
60             Settings.PIPELINE_REFRESH_INTERVAL = 2000.0f;\r
61 \r
62             client = new GridClient();\r
63             client.Settings.ALWAYS_REQUEST_OBJECTS = true;\r
64             client.Settings.ALWAYS_DECODE_OBJECTS = true;\r
65             client.Settings.OBJECT_TRACKING = true;\r
66             client.Settings.ENABLE_SIMSTATS = true;\r
67             client.Settings.FETCH_MISSING_INVENTORY = true;\r
68             client.Settings.MULTIPLE_SIMS = true;\r
69             client.Settings.SEND_AGENT_THROTTLE = true;\r
70             client.Settings.SEND_AGENT_UPDATES = true;\r
71 \r
72             client.Settings.USE_TEXTURE_CACHE = true;\r
73             client.Settings.TEXTURE_CACHE_DIR = Path.Combine(userDir,  "cache");\r
74             client.Assets.Cache.AutoPruneEnabled = false;\r
75     \r
76             client.Throttle.Texture = 2446000.0f;\r
77             client.Throttle.Asset = 2446000.0f;\r
78             client.Settings.THROTTLE_OUTGOING_PACKETS = false;\r
79             \r
80             netcom = new RadegastNetcom(client);\r
81 \r
82             imageCache = new ImageCache();\r
83             state = new StateManager(this);\r
84             InitializeConfig();\r
85 \r
86             mainForm = new frmMain(this);\r
87             mainForm.InitializeControls();\r
88             tabsConsole = mainForm.TabConsole;\r
89 \r
90             Application.ApplicationExit += new EventHandler(Application_ApplicationExit);\r
91             groups = new Dictionary<UUID, Group>();\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 \r
100         public void CleanUp()\r
101         {\r
102             if (client != null)\r
103             {\r
104                 client.Groups.OnCurrentGroups -= new GroupManager.CurrentGroupsCallback(Groups_OnCurrentGroups);\r
105                 client.Groups.OnGroupLeft -= new GroupManager.GroupLeftCallback(Groups_OnGroupLeft);\r
106                 client.Groups.OnGroupJoined -= new GroupManager.GroupJoinedCallback(Groups_OnGroupJoined);\r
107                 client.Groups.OnGroupProfile -= new GroupManager.GroupProfileCallback(Groups_OnGroupProfile);\r
108                 client.Avatars.OnAvatarNames -= new AvatarManager.AvatarNamesCallback(Avatars_OnAvatarNames);\r
109             }\r
110 \r
111             if (MonoRuntime)\r
112             {\r
113                 Environment.Exit(0);\r
114             }\r
115 \r
116         }\r
117 \r
118         void Avatars_OnAvatarNames(Dictionary<UUID, string> names)\r
119         {\r
120             lock (nameCache)\r
121             {\r
122                 foreach (KeyValuePair<UUID, string> av in names)\r
123                 {\r
124                     if (OnAvatarName != null) try { OnAvatarName(av.Key, av.Value); }\r
125                         catch (Exception) { };\r
126 \r
127                     if (!nameCache.ContainsKey(av.Key))\r
128                     {\r
129                         nameCache.Add(av.Key, av.Value);\r
130                     }\r
131                 }\r
132             }\r
133         }\r
134 \r
135         public string getAvatarName(UUID key)\r
136         {\r
137             if (nameCache.ContainsKey(key))\r
138             {\r
139                 return nameCache[key];\r
140             }\r
141             else\r
142             {\r
143                 client.Avatars.RequestAvatarName(key);\r
144                 return "Loading...";\r
145             }\r
146         }\r
147 \r
148         void Groups_OnGroupProfile(Group group)\r
149         {\r
150             if (groups.ContainsKey(group.ID))\r
151             {\r
152                 groups[group.ID] = group;\r
153             }\r
154         }\r
155 \r
156         void Groups_OnGroupJoined(UUID groupID, bool success)\r
157         {\r
158             if (success && !groups.ContainsKey(groupID))\r
159             {\r
160                 groups.Add(groupID, new Group());\r
161                 client.Groups.RequestGroupProfile(groupID);\r
162             }\r
163         }\r
164 \r
165         void Groups_OnGroupLeft(UUID groupID, bool success)\r
166         {\r
167             if (groups.ContainsKey(groupID))\r
168             {\r
169                 groups.Remove(groupID);\r
170             }\r
171         }\r
172 \r
173         void Groups_OnCurrentGroups(Dictionary<UUID, Group> gr)\r
174         {\r
175             this.groups = gr;\r
176         }\r
177 \r
178         private void Application_ApplicationExit(object sender, EventArgs e)\r
179         {\r
180             config.SaveCurrentConfig();\r
181         }\r
182 \r
183         private void InitializeConfig()\r
184         {\r
185             config = new ConfigManager(this);\r
186             config.ApplyDefault();\r
187 \r
188             netcom.LoginOptions.FirstName = config.CurrentConfig.FirstName;\r
189             netcom.LoginOptions.LastName = config.CurrentConfig.LastName;\r
190             netcom.LoginOptions.Password = config.CurrentConfig.PasswordMD5;\r
191             netcom.LoginOptions.IsPasswordMD5 = true;\r
192         }\r
193 \r
194         public GridClient Client\r
195         {\r
196             get { return client; }\r
197         }\r
198 \r
199         public RadegastNetcom Netcom\r
200         {\r
201             get { return netcom; }\r
202         }\r
203 \r
204         public ImageCache ImageCache\r
205         {\r
206             get { return imageCache; }\r
207         }\r
208 \r
209         public StateManager State\r
210         {\r
211             get { return state; }\r
212         }\r
213 \r
214         public ConfigManager Config\r
215         {\r
216             get { return config; }\r
217         }\r
218 \r
219         public frmMain MainForm\r
220         {\r
221             get { return mainForm; }\r
222         }\r
223 \r
224         public TabsConsole TabConsole\r
225         {\r
226             get { return tabsConsole; }\r
227         }\r
228     }\r
229 }\r