diff options
Diffstat (limited to 'OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs')
-rw-r--r-- | OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs | 1017 |
1 files changed, 1017 insertions, 0 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs new file mode 100644 index 0000000..343bd6d --- /dev/null +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupData.cs | |||
@@ -0,0 +1,1017 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Reflection; | ||
32 | //using System.Text; | ||
33 | |||
34 | using Nwc.XmlRpc; | ||
35 | |||
36 | using log4net; | ||
37 | // using Nini.Config; | ||
38 | |||
39 | using OpenMetaverse; | ||
40 | using OpenMetaverse.StructuredData; | ||
41 | |||
42 | using OpenSim.Framework; | ||
43 | //using OpenSim.Region.Framework.Interfaces; | ||
44 | |||
45 | namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | ||
46 | { | ||
47 | |||
48 | public class XmlRpcGroupDataProvider : IGroupDataProvider | ||
49 | { | ||
50 | private static readonly ILog m_log = | ||
51 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
52 | |||
53 | private string m_serviceURL = "http://osflotsam.org/xmlrpc.php"; | ||
54 | |||
55 | public const GroupPowers m_DefaultEveryonePowers = GroupPowers.AllowSetHome | GroupPowers.Accountable | GroupPowers.JoinChat | GroupPowers.AllowVoiceChat | GroupPowers.ReceiveNotices | GroupPowers.StartProposal | GroupPowers.VoteOnProposal; | ||
56 | |||
57 | public XmlRpcGroupDataProvider(string serviceURL) | ||
58 | { | ||
59 | m_serviceURL = serviceURL; | ||
60 | } | ||
61 | |||
62 | /// <summary> | ||
63 | /// Create a Group, including Everyone and Owners Role, place FounderID in both groups, select Owner as selected role, and newly created group as agent's active role. | ||
64 | /// </summary> | ||
65 | public UUID CreateGroup(string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish, UUID founderID) | ||
66 | { | ||
67 | UUID GroupID = UUID.Random(); | ||
68 | UUID OwnerRoleID = UUID.Random(); | ||
69 | |||
70 | Hashtable param = new Hashtable(); | ||
71 | param["GroupID"] = GroupID.ToString(); | ||
72 | param["Name"] = name; | ||
73 | param["Charter"] = charter; | ||
74 | param["ShowInList"] = showInList == true ? 1 : 0; | ||
75 | param["InsigniaID"] = insigniaID.ToString(); | ||
76 | param["MembershipFee"] = 0; | ||
77 | param["OpenEnrollment"] = openEnrollment == true ? 1 : 0; | ||
78 | param["AllowPublish"] = allowPublish == true ? 1 : 0; | ||
79 | param["MaturePublish"] = maturePublish == true ? 1 : 0; | ||
80 | param["FounderID"] = founderID.ToString(); | ||
81 | param["EveryonePowers"] = ((ulong)m_DefaultEveryonePowers).ToString(); | ||
82 | param["OwnerRoleID"] = OwnerRoleID.ToString(); | ||
83 | |||
84 | // Would this be cleaner as (GroupPowers)ulong.MaxValue; | ||
85 | GroupPowers OwnerPowers = GroupPowers.Accountable | ||
86 | | GroupPowers.AllowEditLand | ||
87 | | GroupPowers.AllowFly | ||
88 | | GroupPowers.AllowLandmark | ||
89 | | GroupPowers.AllowRez | ||
90 | | GroupPowers.AllowSetHome | ||
91 | | GroupPowers.AllowVoiceChat | ||
92 | | GroupPowers.AssignMember | ||
93 | | GroupPowers.AssignMemberLimited | ||
94 | | GroupPowers.ChangeActions | ||
95 | | GroupPowers.ChangeIdentity | ||
96 | | GroupPowers.ChangeMedia | ||
97 | | GroupPowers.ChangeOptions | ||
98 | | GroupPowers.CreateRole | ||
99 | | GroupPowers.DeedObject | ||
100 | | GroupPowers.DeleteRole | ||
101 | | GroupPowers.Eject | ||
102 | | GroupPowers.FindPlaces | ||
103 | | GroupPowers.Invite | ||
104 | | GroupPowers.JoinChat | ||
105 | | GroupPowers.LandChangeIdentity | ||
106 | | GroupPowers.LandDeed | ||
107 | | GroupPowers.LandDivideJoin | ||
108 | | GroupPowers.LandEdit | ||
109 | | GroupPowers.LandEjectAndFreeze | ||
110 | | GroupPowers.LandGardening | ||
111 | | GroupPowers.LandManageAllowed | ||
112 | | GroupPowers.LandManageBanned | ||
113 | | GroupPowers.LandManagePasses | ||
114 | | GroupPowers.LandOptions | ||
115 | | GroupPowers.LandRelease | ||
116 | | GroupPowers.LandSetSale | ||
117 | | GroupPowers.ModerateChat | ||
118 | | GroupPowers.ObjectManipulate | ||
119 | | GroupPowers.ObjectSetForSale | ||
120 | | GroupPowers.ReceiveNotices | ||
121 | | GroupPowers.RemoveMember | ||
122 | | GroupPowers.ReturnGroupOwned | ||
123 | | GroupPowers.ReturnGroupSet | ||
124 | | GroupPowers.ReturnNonGroup | ||
125 | | GroupPowers.RoleProperties | ||
126 | | GroupPowers.SendNotices | ||
127 | | GroupPowers.SetLandingPoint | ||
128 | | GroupPowers.StartProposal | ||
129 | | GroupPowers.VoteOnProposal; | ||
130 | param["OwnersPowers"] = ((ulong)OwnerPowers).ToString(); | ||
131 | |||
132 | |||
133 | |||
134 | IList parameters = new ArrayList(); | ||
135 | parameters.Add(param); | ||
136 | XmlRpcRequest req = new XmlRpcRequest("groups.createGroup", parameters); | ||
137 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
138 | Hashtable respData = (Hashtable)resp.Value; | ||
139 | |||
140 | if (respData.Contains("error")) | ||
141 | { | ||
142 | LogRespDataToConsoleError(respData); | ||
143 | } | ||
144 | |||
145 | return UUID.Parse((string)respData["GroupID"]); | ||
146 | } | ||
147 | |||
148 | public void UpdateGroup(UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) | ||
149 | { | ||
150 | Hashtable param = new Hashtable(); | ||
151 | param["GroupID"] = groupID.ToString(); | ||
152 | param["Charter"] = charter; | ||
153 | param["ShowInList"] = showInList == true ? 1 : 0; | ||
154 | param["InsigniaID"] = insigniaID.ToString(); | ||
155 | param["MembershipFee"] = membershipFee; | ||
156 | param["OpenEnrollment"] = openEnrollment == true ? 1 : 0; | ||
157 | param["AllowPublish"] = allowPublish == true ? 1 : 0; | ||
158 | param["MaturePublish"] = maturePublish == true ? 1 : 0; | ||
159 | |||
160 | IList parameters = new ArrayList(); | ||
161 | parameters.Add(param); | ||
162 | XmlRpcRequest req = new XmlRpcRequest("groups.updateGroup", parameters); | ||
163 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
164 | Hashtable respData = (Hashtable)resp.Value; | ||
165 | |||
166 | if (respData.Contains("error")) | ||
167 | { | ||
168 | LogRespDataToConsoleError(respData); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | public void AddGroupRole(UUID groupID, UUID roleID, string name, string description, string title, ulong powers) | ||
173 | { | ||
174 | Hashtable param = new Hashtable(); | ||
175 | param["GroupID"] = groupID.ToString(); | ||
176 | param["RoleID"] = roleID.ToString(); | ||
177 | param["Name"] = name; | ||
178 | param["Description"] = description; | ||
179 | param["Title"] = title; | ||
180 | param["Powers"] = powers.ToString(); | ||
181 | |||
182 | IList parameters = new ArrayList(); | ||
183 | parameters.Add(param); | ||
184 | XmlRpcRequest req = new XmlRpcRequest("groups.addRoleToGroup", parameters); | ||
185 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
186 | Hashtable respData = (Hashtable)resp.Value; | ||
187 | |||
188 | if (respData.Contains("error")) | ||
189 | { | ||
190 | LogRespDataToConsoleError(respData); | ||
191 | } | ||
192 | } | ||
193 | |||
194 | public void RemoveGroupRole(UUID groupID, UUID roleID) | ||
195 | { | ||
196 | Hashtable param = new Hashtable(); | ||
197 | param["GroupID"] = groupID.ToString(); | ||
198 | param["RoleID"] = roleID.ToString(); | ||
199 | |||
200 | IList parameters = new ArrayList(); | ||
201 | parameters.Add(param); | ||
202 | XmlRpcRequest req = new XmlRpcRequest("groups.removeRoleFromGroup", parameters); | ||
203 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
204 | Hashtable respData = (Hashtable)resp.Value; | ||
205 | |||
206 | if (respData.Contains("error")) | ||
207 | { | ||
208 | LogRespDataToConsoleError(respData); | ||
209 | } | ||
210 | } | ||
211 | |||
212 | public void UpdateGroupRole(UUID groupID, UUID roleID, string name, string description, string title, ulong powers) | ||
213 | { | ||
214 | Hashtable param = new Hashtable(); | ||
215 | param["GroupID"] = groupID.ToString(); | ||
216 | param["RoleID"] = roleID.ToString(); | ||
217 | if (name != null) | ||
218 | { | ||
219 | param["Name"] = name; | ||
220 | } | ||
221 | if (description != null) | ||
222 | { | ||
223 | param["Description"] = description; | ||
224 | } | ||
225 | if (title != null) | ||
226 | { | ||
227 | param["Title"] = title; | ||
228 | } | ||
229 | param["Powers"] = powers.ToString(); | ||
230 | |||
231 | IList parameters = new ArrayList(); | ||
232 | parameters.Add(param); | ||
233 | XmlRpcRequest req = new XmlRpcRequest("groups.updateGroupRole", parameters); | ||
234 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
235 | Hashtable respData = (Hashtable)resp.Value; | ||
236 | |||
237 | if (respData.Contains("error")) | ||
238 | { | ||
239 | LogRespDataToConsoleError(respData); | ||
240 | } | ||
241 | } | ||
242 | |||
243 | public GroupRecord GetGroupRecord(UUID GroupID, string GroupName) | ||
244 | { | ||
245 | Hashtable param = new Hashtable(); | ||
246 | if ((GroupID != null) && (GroupID != UUID.Zero)) | ||
247 | { | ||
248 | param["GroupID"] = GroupID.ToString(); | ||
249 | } | ||
250 | if ((GroupName != null) && (GroupName != string.Empty)) | ||
251 | { | ||
252 | param["Name"] = GroupName.ToString(); | ||
253 | } | ||
254 | |||
255 | |||
256 | IList parameters = new ArrayList(); | ||
257 | parameters.Add(param); | ||
258 | XmlRpcRequest req = new XmlRpcRequest("groups.getGroup", parameters); | ||
259 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
260 | Hashtable respData = (Hashtable)resp.Value; | ||
261 | |||
262 | if (respData.Contains("error")) | ||
263 | { | ||
264 | if ((string)respData["error"] != "Group Not Found") | ||
265 | { | ||
266 | LogRespDataToConsoleError(respData); | ||
267 | } | ||
268 | return null; | ||
269 | } | ||
270 | |||
271 | return GroupProfileHashtableToGroupRecord(respData); | ||
272 | |||
273 | } | ||
274 | |||
275 | public GroupProfileData GetMemberGroupProfile(UUID GroupID, UUID AgentID) | ||
276 | { | ||
277 | Hashtable param = new Hashtable(); | ||
278 | param["GroupID"] = GroupID.ToString(); | ||
279 | |||
280 | |||
281 | IList parameters = new ArrayList(); | ||
282 | parameters.Add(param); | ||
283 | XmlRpcRequest req = new XmlRpcRequest("groups.getGroup", parameters); | ||
284 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
285 | Hashtable respData = (Hashtable)resp.Value; | ||
286 | |||
287 | if (respData.Contains("error")) | ||
288 | { | ||
289 | if ((string)respData["error"] != "Group Not Found") | ||
290 | { | ||
291 | LogRespDataToConsoleError(respData); | ||
292 | } | ||
293 | return new GroupProfileData(); | ||
294 | } | ||
295 | |||
296 | GroupMembershipData MemberInfo = GetAgentGroupMembership(AgentID, GroupID); | ||
297 | GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData); | ||
298 | |||
299 | MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle; | ||
300 | MemberGroupProfile.PowersMask = MemberInfo.GroupPowers; | ||
301 | |||
302 | return MemberGroupProfile; | ||
303 | |||
304 | } | ||
305 | |||
306 | private GroupProfileData GroupProfileHashtableToGroupProfileData(Hashtable groupProfile) | ||
307 | { | ||
308 | GroupProfileData group = new GroupProfileData(); | ||
309 | group.GroupID = UUID.Parse((string)groupProfile["GroupID"]); | ||
310 | group.Name = (string)groupProfile["Name"]; | ||
311 | |||
312 | if (groupProfile["Charter"] != null) | ||
313 | { | ||
314 | group.Charter = (string)groupProfile["Charter"]; | ||
315 | } | ||
316 | |||
317 | group.ShowInList = ((string)groupProfile["ShowInList"]) == "1"; | ||
318 | group.InsigniaID = UUID.Parse((string)groupProfile["InsigniaID"]); | ||
319 | group.MembershipFee = int.Parse((string)groupProfile["MembershipFee"]); | ||
320 | group.OpenEnrollment = ((string)groupProfile["OpenEnrollment"]) == "1"; | ||
321 | group.AllowPublish = ((string)groupProfile["AllowPublish"]) == "1"; | ||
322 | group.MaturePublish = ((string)groupProfile["MaturePublish"]) == "1"; | ||
323 | group.FounderID = UUID.Parse((string)groupProfile["FounderID"]); | ||
324 | group.OwnerRole = UUID.Parse((string)groupProfile["OwnerRoleID"]); | ||
325 | |||
326 | group.GroupMembershipCount = int.Parse((string)groupProfile["GroupMembershipCount"]); | ||
327 | group.GroupRolesCount = int.Parse((string)groupProfile["GroupRolesCount"]); | ||
328 | |||
329 | return group; | ||
330 | } | ||
331 | |||
332 | private GroupRecord GroupProfileHashtableToGroupRecord(Hashtable groupProfile) | ||
333 | { | ||
334 | |||
335 | GroupRecord group = new GroupRecord(); | ||
336 | m_log.Debug("GroupID"); | ||
337 | group.GroupID = UUID.Parse((string)groupProfile["GroupID"]); | ||
338 | |||
339 | m_log.Debug("Name"); | ||
340 | group.GroupName = groupProfile["Name"].ToString(); | ||
341 | |||
342 | m_log.Debug("Charter"); | ||
343 | if (groupProfile["Charter"] != null) | ||
344 | { | ||
345 | group.Charter = (string)groupProfile["Charter"]; | ||
346 | } | ||
347 | |||
348 | m_log.Debug("ShowInList"); | ||
349 | group.ShowInList = ((string)groupProfile["ShowInList"]) == "1"; | ||
350 | |||
351 | m_log.Debug("InsigniaID"); | ||
352 | group.GroupPicture = UUID.Parse((string)groupProfile["InsigniaID"]); | ||
353 | |||
354 | m_log.Debug("MembershipFee"); | ||
355 | group.MembershipFee = int.Parse((string)groupProfile["MembershipFee"]); | ||
356 | |||
357 | m_log.Debug("OpenEnrollment"); | ||
358 | group.OpenEnrollment = ((string)groupProfile["OpenEnrollment"]) == "1"; | ||
359 | |||
360 | m_log.Debug("AllowPublish"); | ||
361 | group.AllowPublish = ((string)groupProfile["AllowPublish"]) == "1"; | ||
362 | |||
363 | m_log.Debug("MaturePublish"); | ||
364 | group.MaturePublish = ((string)groupProfile["MaturePublish"]) == "1"; | ||
365 | |||
366 | m_log.Debug("FounderID"); | ||
367 | group.FounderID = UUID.Parse((string)groupProfile["FounderID"]); | ||
368 | |||
369 | m_log.Debug("OwnerRoleID"); | ||
370 | group.OwnerRoleID = UUID.Parse((string)groupProfile["OwnerRoleID"]); | ||
371 | |||
372 | return group; | ||
373 | } | ||
374 | |||
375 | |||
376 | public void SetAgentActiveGroup(UUID AgentID, UUID GroupID) | ||
377 | { | ||
378 | Hashtable param = new Hashtable(); | ||
379 | param["AgentID"] = AgentID.ToString(); | ||
380 | param["GroupID"] = GroupID.ToString(); | ||
381 | |||
382 | IList parameters = new ArrayList(); | ||
383 | parameters.Add(param); | ||
384 | XmlRpcRequest req = new XmlRpcRequest("groups.setAgentActiveGroup", parameters); | ||
385 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
386 | Hashtable respData = (Hashtable)resp.Value; | ||
387 | |||
388 | if (respData.Contains("error")) | ||
389 | { | ||
390 | LogRespDataToConsoleError(respData); | ||
391 | } | ||
392 | |||
393 | } | ||
394 | |||
395 | public void SetAgentActiveGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) | ||
396 | { | ||
397 | Hashtable param = new Hashtable(); | ||
398 | param["AgentID"] = AgentID.ToString(); | ||
399 | param["GroupID"] = GroupID.ToString(); | ||
400 | param["SelectedRoleID"] = RoleID.ToString(); | ||
401 | |||
402 | IList parameters = new ArrayList(); | ||
403 | parameters.Add(param); | ||
404 | XmlRpcRequest req = new XmlRpcRequest("groups.setAgentGroupInfo", parameters); | ||
405 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
406 | Hashtable respData = (Hashtable)resp.Value; | ||
407 | |||
408 | if (respData.Contains("error")) | ||
409 | { | ||
410 | LogRespDataToConsoleError(respData); | ||
411 | } | ||
412 | |||
413 | } | ||
414 | |||
415 | public void SetAgentGroupInfo(UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile) | ||
416 | { | ||
417 | Hashtable param = new Hashtable(); | ||
418 | param["AgentID"] = AgentID.ToString(); | ||
419 | param["GroupID"] = GroupID.ToString(); | ||
420 | param["AcceptNotices"] = AcceptNotices ? "1" : "0"; | ||
421 | param["ListInProfile"] = ListInProfile ? "1" : "0"; | ||
422 | |||
423 | IList parameters = new ArrayList(); | ||
424 | parameters.Add(param); | ||
425 | XmlRpcRequest req = new XmlRpcRequest("groups.setAgentGroupInfo", parameters); | ||
426 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
427 | Hashtable respData = (Hashtable)resp.Value; | ||
428 | |||
429 | if (respData.Contains("error")) | ||
430 | { | ||
431 | LogRespDataToConsoleError(respData); | ||
432 | } | ||
433 | } | ||
434 | |||
435 | public void AddAgentToGroupInvite(UUID inviteID, UUID groupID, UUID roleID, UUID agentID) | ||
436 | { | ||
437 | Hashtable param = new Hashtable(); | ||
438 | param["InviteID"] = inviteID.ToString(); | ||
439 | param["AgentID"] = agentID.ToString(); | ||
440 | param["RoleID"] = roleID.ToString(); | ||
441 | param["GroupID"] = groupID.ToString(); | ||
442 | |||
443 | IList parameters = new ArrayList(); | ||
444 | parameters.Add(param); | ||
445 | XmlRpcRequest req = new XmlRpcRequest("groups.addAgentToGroupInvite", parameters); | ||
446 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
447 | Hashtable respData = (Hashtable)resp.Value; | ||
448 | |||
449 | if (respData.Contains("error")) | ||
450 | { | ||
451 | if (respData["error"] != "Duplicate group invite requested") | ||
452 | { | ||
453 | LogRespDataToConsoleError(respData); | ||
454 | } | ||
455 | } | ||
456 | |||
457 | |||
458 | } | ||
459 | |||
460 | public GroupInviteInfo GetAgentToGroupInvite(UUID inviteID) | ||
461 | { | ||
462 | Hashtable param = new Hashtable(); | ||
463 | param["InviteID"] = inviteID.ToString(); | ||
464 | |||
465 | IList parameters = new ArrayList(); | ||
466 | parameters.Add(param); | ||
467 | XmlRpcRequest req = new XmlRpcRequest("groups.getAgentToGroupInvite", parameters); | ||
468 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
469 | Hashtable respData = (Hashtable)resp.Value; | ||
470 | |||
471 | |||
472 | if (respData.Contains("error")) | ||
473 | { | ||
474 | LogRespDataToConsoleError(respData); | ||
475 | |||
476 | return null; | ||
477 | } | ||
478 | |||
479 | GroupInviteInfo inviteInfo = new GroupInviteInfo(); | ||
480 | inviteInfo.InviteID = inviteID; | ||
481 | inviteInfo.GroupID = UUID.Parse((string)respData["GroupID"]); | ||
482 | inviteInfo.RoleID = UUID.Parse((string)respData["RoleID"]); | ||
483 | inviteInfo.AgentID = UUID.Parse((string)respData["AgentID"]); | ||
484 | |||
485 | return inviteInfo; | ||
486 | } | ||
487 | |||
488 | public void RemoveAgentToGroupInvite(UUID inviteID) | ||
489 | { | ||
490 | Hashtable param = new Hashtable(); | ||
491 | param["InviteID"] = inviteID.ToString(); | ||
492 | |||
493 | IList parameters = new ArrayList(); | ||
494 | parameters.Add(param); | ||
495 | XmlRpcRequest req = new XmlRpcRequest("groups.removeAgentToGroupInvite", parameters); | ||
496 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
497 | Hashtable respData = (Hashtable)resp.Value; | ||
498 | |||
499 | if (respData.Contains("error")) | ||
500 | { | ||
501 | LogRespDataToConsoleError(respData); | ||
502 | } | ||
503 | } | ||
504 | |||
505 | public void AddAgentToGroup(UUID AgentID, UUID GroupID, UUID RoleID) | ||
506 | { | ||
507 | Hashtable param = new Hashtable(); | ||
508 | param["AgentID"] = AgentID.ToString(); | ||
509 | param["GroupID"] = GroupID.ToString(); | ||
510 | param["RoleID"] = RoleID.ToString(); | ||
511 | |||
512 | IList parameters = new ArrayList(); | ||
513 | parameters.Add(param); | ||
514 | XmlRpcRequest req = new XmlRpcRequest("groups.addAgentToGroup", parameters); | ||
515 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
516 | Hashtable respData = (Hashtable)resp.Value; | ||
517 | |||
518 | if (respData.Contains("error")) | ||
519 | { | ||
520 | LogRespDataToConsoleError(respData); | ||
521 | } | ||
522 | } | ||
523 | |||
524 | public void RemoveAgentFromGroup(UUID AgentID, UUID GroupID) | ||
525 | { | ||
526 | Hashtable param = new Hashtable(); | ||
527 | param["AgentID"] = AgentID.ToString(); | ||
528 | param["GroupID"] = GroupID.ToString(); | ||
529 | |||
530 | IList parameters = new ArrayList(); | ||
531 | parameters.Add(param); | ||
532 | XmlRpcRequest req = new XmlRpcRequest("groups.removeAgentFromGroup", parameters); | ||
533 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
534 | Hashtable respData = (Hashtable)resp.Value; | ||
535 | |||
536 | if (respData.Contains("error")) | ||
537 | { | ||
538 | LogRespDataToConsoleError(respData); | ||
539 | } | ||
540 | } | ||
541 | |||
542 | public void AddAgentToGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) | ||
543 | { | ||
544 | Hashtable param = new Hashtable(); | ||
545 | param["AgentID"] = AgentID.ToString(); | ||
546 | param["GroupID"] = GroupID.ToString(); | ||
547 | param["RoleID"] = RoleID.ToString(); | ||
548 | |||
549 | IList parameters = new ArrayList(); | ||
550 | parameters.Add(param); | ||
551 | XmlRpcRequest req = new XmlRpcRequest("groups.addAgentToGroupRole", parameters); | ||
552 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
553 | Hashtable respData = (Hashtable)resp.Value; | ||
554 | |||
555 | if (respData.Contains("error")) | ||
556 | { | ||
557 | LogRespDataToConsoleError(respData); | ||
558 | } | ||
559 | } | ||
560 | |||
561 | public void RemoveAgentFromGroupRole(UUID AgentID, UUID GroupID, UUID RoleID) | ||
562 | { | ||
563 | Hashtable param = new Hashtable(); | ||
564 | param["AgentID"] = AgentID.ToString(); | ||
565 | param["GroupID"] = GroupID.ToString(); | ||
566 | param["RoleID"] = RoleID.ToString(); | ||
567 | |||
568 | IList parameters = new ArrayList(); | ||
569 | parameters.Add(param); | ||
570 | XmlRpcRequest req = new XmlRpcRequest("groups.removeAgentFromGroupRole", parameters); | ||
571 | XmlRpcResponse resp = req.Send(m_serviceURL, 3000); | ||
572 | Hashtable respData = (Hashtable)resp.Value; | ||
573 | |||
574 | if (respData.Contains("error")) | ||
575 | { | ||
576 | LogRespDataToConsoleError(respData); | ||
577 | } | ||
578 | } | ||
579 | |||
580 | |||
581 | public List<DirGroupsReplyData> FindGroups(string search) | ||
582 | { | ||
583 | Hashtable param = new Hashtable(); | ||
584 | param["Search"] = search; | ||
585 | |||
586 | IList parameters = new ArrayList(); | ||
587 | parameters.Add(param); | ||
588 | XmlRpcRequest req = new XmlRpcRequest("groups.findGroups", parameters); | ||
589 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
590 | Hashtable respData = (Hashtable)resp.Value; | ||
591 | |||
592 | List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>(); | ||
593 | |||
594 | if (respData.Contains("error")) | ||
595 | { | ||
596 | if (respData["error"].ToString() != "No groups found.") | ||
597 | { | ||
598 | LogRespDataToConsoleError(respData); | ||
599 | } | ||
600 | } | ||
601 | else | ||
602 | { | ||
603 | Hashtable results = (Hashtable)respData["results"]; | ||
604 | foreach (Hashtable groupFind in results.Values) | ||
605 | { | ||
606 | DirGroupsReplyData data = new DirGroupsReplyData(); | ||
607 | data.groupID = new UUID((string)groupFind["GroupID"]); ; | ||
608 | data.groupName = (string)groupFind["Name"]; | ||
609 | data.members = int.Parse((string)groupFind["Members"]); | ||
610 | // data.searchOrder = order; | ||
611 | |||
612 | findings.Add(data); | ||
613 | } | ||
614 | } | ||
615 | |||
616 | return findings; | ||
617 | } | ||
618 | |||
619 | public GroupMembershipData GetAgentGroupMembership(UUID AgentID, UUID GroupID) | ||
620 | { | ||
621 | Hashtable param = new Hashtable(); | ||
622 | param["AgentID"] = AgentID.ToString(); | ||
623 | param["GroupID"] = GroupID.ToString(); | ||
624 | |||
625 | IList parameters = new ArrayList(); | ||
626 | parameters.Add(param); | ||
627 | XmlRpcRequest req = new XmlRpcRequest("groups.getAgentGroupMembership", parameters); | ||
628 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
629 | Hashtable respData = (Hashtable)resp.Value; | ||
630 | |||
631 | if (respData.Contains("error")) | ||
632 | { | ||
633 | if ((string)respData["error"] != "None Found") | ||
634 | { | ||
635 | LogRespDataToConsoleError(respData); | ||
636 | } | ||
637 | return null; | ||
638 | } | ||
639 | |||
640 | GroupMembershipData data = HashTableToGroupMembershipData(respData); | ||
641 | |||
642 | return data; | ||
643 | } | ||
644 | |||
645 | public GroupMembershipData GetAgentActiveMembership(UUID AgentID) | ||
646 | { | ||
647 | Hashtable param = new Hashtable(); | ||
648 | param["AgentID"] = AgentID.ToString(); | ||
649 | |||
650 | IList parameters = new ArrayList(); | ||
651 | parameters.Add(param); | ||
652 | XmlRpcRequest req = new XmlRpcRequest("groups.getAgentActiveMembership", parameters); | ||
653 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
654 | Hashtable respData = (Hashtable)resp.Value; | ||
655 | |||
656 | if (respData.Contains("error")) | ||
657 | { | ||
658 | if (respData["error"].ToString() == "No Active Group Specified") | ||
659 | { | ||
660 | return null; | ||
661 | } | ||
662 | LogRespDataToConsoleError(respData); | ||
663 | return null; | ||
664 | } | ||
665 | |||
666 | try | ||
667 | { | ||
668 | GroupMembershipData data = HashTableToGroupMembershipData(respData); | ||
669 | return data; | ||
670 | } | ||
671 | catch (System.Exception e) | ||
672 | { | ||
673 | LogRespDataToConsoleError(respData); | ||
674 | throw e; | ||
675 | } | ||
676 | } | ||
677 | |||
678 | private void LogRespDataToConsoleError(Hashtable respData) | ||
679 | { | ||
680 | m_log.Error("[GROUPDATA] Error:"); | ||
681 | |||
682 | foreach (string key in respData.Keys) | ||
683 | { | ||
684 | m_log.ErrorFormat("[GROUPDATA] Key: {0}", key); | ||
685 | |||
686 | object o = respData[key]; | ||
687 | |||
688 | string[] lines = respData[key].ToString().Split(new char[] { '\n' }); | ||
689 | foreach (string line in lines) | ||
690 | { | ||
691 | m_log.ErrorFormat("[GROUPDATA] {0}", line); | ||
692 | } | ||
693 | |||
694 | } | ||
695 | } | ||
696 | |||
697 | public List<GroupMembershipData> GetAgentGroupMemberships(UUID AgentID) | ||
698 | { | ||
699 | Hashtable param = new Hashtable(); | ||
700 | param["AgentID"] = AgentID.ToString(); | ||
701 | |||
702 | IList parameters = new ArrayList(); | ||
703 | parameters.Add(param); | ||
704 | XmlRpcRequest req = new XmlRpcRequest("groups.getAgentGroupMemberships", parameters); | ||
705 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
706 | Hashtable respData = (Hashtable)resp.Value; | ||
707 | |||
708 | List<GroupMembershipData> memberships = new List<GroupMembershipData>(); | ||
709 | |||
710 | if (respData.Contains("error")) | ||
711 | { | ||
712 | if (respData["error"].ToString() != "No Memberships") | ||
713 | { | ||
714 | LogRespDataToConsoleError(respData); | ||
715 | } | ||
716 | } | ||
717 | else | ||
718 | { | ||
719 | foreach (object membership in respData.Values) | ||
720 | { | ||
721 | memberships.Add(HashTableToGroupMembershipData((Hashtable)membership)); | ||
722 | } | ||
723 | } | ||
724 | return memberships; | ||
725 | } | ||
726 | |||
727 | public List<GroupRolesData> GetAgentGroupRoles(UUID AgentID, UUID GroupID) | ||
728 | { | ||
729 | Hashtable param = new Hashtable(); | ||
730 | param["AgentID"] = AgentID.ToString(); | ||
731 | param["GroupID"] = GroupID.ToString(); | ||
732 | |||
733 | IList parameters = new ArrayList(); | ||
734 | parameters.Add(param); | ||
735 | XmlRpcRequest req = new XmlRpcRequest("groups.getAgentRoles", parameters); | ||
736 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
737 | Hashtable respData = (Hashtable)resp.Value; | ||
738 | |||
739 | List<GroupRolesData> Roles = new List<GroupRolesData>(); | ||
740 | |||
741 | if (respData.Contains("error")) | ||
742 | { | ||
743 | if ((string)respData["error"] != "None found") | ||
744 | { | ||
745 | LogRespDataToConsoleError(respData); | ||
746 | } | ||
747 | return Roles; | ||
748 | } | ||
749 | |||
750 | foreach (Hashtable role in respData.Values) | ||
751 | { | ||
752 | GroupRolesData data = new GroupRolesData(); | ||
753 | data.RoleID = new UUID((string)role["RoleID"]); | ||
754 | data.Name = (string)role["Name"]; | ||
755 | data.Description = (string)role["Description"]; | ||
756 | data.Powers = ulong.Parse((string)role["Powers"]); | ||
757 | data.Title = (string)role["Title"]; | ||
758 | |||
759 | Roles.Add(data); | ||
760 | } | ||
761 | |||
762 | return Roles; | ||
763 | |||
764 | |||
765 | } | ||
766 | |||
767 | public List<GroupRolesData> GetGroupRoles(UUID GroupID) | ||
768 | { | ||
769 | Hashtable param = new Hashtable(); | ||
770 | param["GroupID"] = GroupID.ToString(); | ||
771 | |||
772 | IList parameters = new ArrayList(); | ||
773 | parameters.Add(param); | ||
774 | XmlRpcRequest req = new XmlRpcRequest("groups.getGroupRoles", parameters); | ||
775 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
776 | Hashtable respData = (Hashtable)resp.Value; | ||
777 | |||
778 | if (respData.Contains("error")) | ||
779 | { | ||
780 | LogRespDataToConsoleError(respData); | ||
781 | return null; | ||
782 | } | ||
783 | |||
784 | List<GroupRolesData> Roles = new List<GroupRolesData>(); | ||
785 | foreach (Hashtable role in respData.Values) | ||
786 | { | ||
787 | GroupRolesData data = new GroupRolesData(); | ||
788 | data.Description = (string)role["Description"]; | ||
789 | data.Members = int.Parse((string)role["Members"]); | ||
790 | data.Name = (string)role["Name"]; | ||
791 | data.Powers = ulong.Parse((string)role["Powers"]); | ||
792 | data.RoleID = new UUID((string)role["RoleID"]); | ||
793 | data.Title = (string)role["Title"]; | ||
794 | |||
795 | Roles.Add(data); | ||
796 | } | ||
797 | |||
798 | return Roles; | ||
799 | |||
800 | } | ||
801 | |||
802 | private static GroupMembershipData HashTableToGroupMembershipData(Hashtable respData) | ||
803 | { | ||
804 | GroupMembershipData data = new GroupMembershipData(); | ||
805 | data.AcceptNotices = ((string)respData["AcceptNotices"] == "1"); | ||
806 | data.Contribution = int.Parse((string)respData["Contribution"]); | ||
807 | data.ListInProfile = ((string)respData["ListInProfile"] == "1"); | ||
808 | |||
809 | data.ActiveRole = new UUID((string)respData["SelectedRoleID"]); | ||
810 | data.GroupTitle = (string)respData["Title"]; | ||
811 | |||
812 | data.GroupPowers = ulong.Parse((string)respData["GroupPowers"]); | ||
813 | |||
814 | // Is this group the agent's active group | ||
815 | |||
816 | data.GroupID = new UUID((string)respData["GroupID"]); | ||
817 | |||
818 | UUID ActiveGroup = new UUID((string)respData["ActiveGroupID"]); | ||
819 | data.Active = data.GroupID.Equals(ActiveGroup); | ||
820 | |||
821 | data.AllowPublish = ((string)respData["AllowPublish"] == "1"); | ||
822 | data.Charter = (string)respData["Charter"]; | ||
823 | data.FounderID = new UUID((string)respData["FounderID"]); | ||
824 | data.GroupID = new UUID((string)respData["GroupID"]); | ||
825 | data.GroupName = (string)respData["GroupName"]; | ||
826 | data.GroupPicture = new UUID((string)respData["InsigniaID"]); | ||
827 | data.MaturePublish = ((string)respData["MaturePublish"] == "1"); | ||
828 | data.MembershipFee = int.Parse((string)respData["MembershipFee"]); | ||
829 | data.OpenEnrollment = ((string)respData["OpenEnrollment"] == "1"); | ||
830 | data.ShowInList = ((string)respData["ShowInList"] == "1"); | ||
831 | return data; | ||
832 | } | ||
833 | |||
834 | public List<GroupMembersData> GetGroupMembers(UUID GroupID) | ||
835 | { | ||
836 | Hashtable param = new Hashtable(); | ||
837 | param["GroupID"] = GroupID.ToString(); | ||
838 | |||
839 | IList parameters = new ArrayList(); | ||
840 | parameters.Add(param); | ||
841 | XmlRpcRequest req = new XmlRpcRequest("groups.getGroupMembers", parameters); | ||
842 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
843 | Hashtable respData = (Hashtable)resp.Value; | ||
844 | |||
845 | if (respData.Contains("error")) | ||
846 | { | ||
847 | LogRespDataToConsoleError(respData); | ||
848 | return null; | ||
849 | } | ||
850 | |||
851 | List<GroupMembersData> members = new List<GroupMembersData>(); | ||
852 | foreach (Hashtable membership in respData.Values) | ||
853 | { | ||
854 | GroupMembersData data = new GroupMembersData(); | ||
855 | |||
856 | data.AcceptNotices = ((string)membership["AcceptNotices"]) == "1"; | ||
857 | data.AgentID = new UUID((string)membership["AgentID"]); | ||
858 | data.Contribution = int.Parse((string)membership["Contribution"]); | ||
859 | data.IsOwner = ((string)membership["IsOwner"]) == "1"; | ||
860 | data.ListInProfile = ((string)membership["ListInProfile"]) == "1"; | ||
861 | data.AgentPowers = ulong.Parse((string)membership["AgentPowers"]); | ||
862 | data.Title = (string)membership["Title"]; | ||
863 | |||
864 | members.Add(data); | ||
865 | } | ||
866 | |||
867 | return members; | ||
868 | |||
869 | } | ||
870 | |||
871 | public List<GroupRoleMembersData> GetGroupRoleMembers(UUID GroupID) | ||
872 | { | ||
873 | Hashtable param = new Hashtable(); | ||
874 | param["GroupID"] = GroupID.ToString(); | ||
875 | |||
876 | IList parameters = new ArrayList(); | ||
877 | parameters.Add(param); | ||
878 | XmlRpcRequest req = new XmlRpcRequest("groups.getGroupRoleMembers", parameters); | ||
879 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
880 | Hashtable respData = (Hashtable)resp.Value; | ||
881 | |||
882 | if (respData.Contains("error")) | ||
883 | { | ||
884 | LogRespDataToConsoleError(respData); | ||
885 | return null; | ||
886 | } | ||
887 | |||
888 | List<GroupRoleMembersData> members = new List<GroupRoleMembersData>(); | ||
889 | foreach (Hashtable membership in respData.Values) | ||
890 | { | ||
891 | GroupRoleMembersData data = new GroupRoleMembersData(); | ||
892 | |||
893 | data.MemberID = new UUID((string)membership["AgentID"]); | ||
894 | data.RoleID = new UUID((string)membership["RoleID"]); | ||
895 | |||
896 | members.Add(data); | ||
897 | } | ||
898 | |||
899 | return members; | ||
900 | } | ||
901 | |||
902 | public List<GroupNoticeData> GetGroupNotices(UUID GroupID) | ||
903 | { | ||
904 | Hashtable param = new Hashtable(); | ||
905 | param["GroupID"] = GroupID.ToString(); | ||
906 | |||
907 | IList parameters = new ArrayList(); | ||
908 | parameters.Add(param); | ||
909 | XmlRpcRequest req = new XmlRpcRequest("groups.getGroupNotices", parameters); | ||
910 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
911 | Hashtable respData = (Hashtable)resp.Value; | ||
912 | |||
913 | List<GroupNoticeData> values = new List<GroupNoticeData>(); | ||
914 | |||
915 | if (respData.Contains("error")) | ||
916 | { | ||
917 | if ((string)respData["error"] != "No Notices") | ||
918 | { | ||
919 | LogRespDataToConsoleError(respData); | ||
920 | } | ||
921 | } | ||
922 | else | ||
923 | { | ||
924 | foreach (Hashtable value in respData.Values) | ||
925 | { | ||
926 | GroupNoticeData data = new GroupNoticeData(); | ||
927 | data.NoticeID = UUID.Parse((string)value["NoticeID"]); | ||
928 | data.Timestamp = uint.Parse((string)value["Timestamp"]); | ||
929 | data.FromName = (string)value["FromName"]; | ||
930 | data.Subject = (string)value["Subject"]; | ||
931 | data.HasAttachment = false; | ||
932 | data.AssetType = 0; | ||
933 | |||
934 | values.Add(data); | ||
935 | } | ||
936 | } | ||
937 | return values; | ||
938 | |||
939 | } | ||
940 | public GroupNoticeInfo GetGroupNotice(UUID noticeID) | ||
941 | { | ||
942 | Hashtable param = new Hashtable(); | ||
943 | param["NoticeID"] = noticeID.ToString(); | ||
944 | |||
945 | IList parameters = new ArrayList(); | ||
946 | parameters.Add(param); | ||
947 | XmlRpcRequest req = new XmlRpcRequest("groups.getGroupNotice", parameters); | ||
948 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
949 | Hashtable respData = (Hashtable)resp.Value; | ||
950 | |||
951 | |||
952 | |||
953 | if (respData.Contains("error")) | ||
954 | { | ||
955 | if ((string)respData["error"] != "Group Notice Not Found") | ||
956 | { | ||
957 | LogRespDataToConsoleError(respData); | ||
958 | return null; | ||
959 | } | ||
960 | } | ||
961 | |||
962 | GroupNoticeInfo data = new GroupNoticeInfo(); | ||
963 | data.GroupID = UUID.Parse((string)respData["GroupID"]); | ||
964 | data.Message = (string)respData["Message"]; | ||
965 | data.BinaryBucket = Utils.HexStringToBytes((string)respData["BinaryBucket"], true); | ||
966 | data.noticeData.NoticeID = UUID.Parse((string)respData["NoticeID"]); | ||
967 | data.noticeData.Timestamp = uint.Parse((string)respData["Timestamp"]); | ||
968 | data.noticeData.FromName = (string)respData["FromName"]; | ||
969 | data.noticeData.Subject = (string)respData["Subject"]; | ||
970 | data.noticeData.HasAttachment = false; | ||
971 | data.noticeData.AssetType = 0; | ||
972 | |||
973 | if (data.Message == null) | ||
974 | { | ||
975 | data.Message = string.Empty; | ||
976 | } | ||
977 | |||
978 | return data; | ||
979 | } | ||
980 | public void AddGroupNotice(UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket) | ||
981 | { | ||
982 | string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, ""); | ||
983 | |||
984 | Hashtable param = new Hashtable(); | ||
985 | param["GroupID"] = groupID.ToString(); | ||
986 | param["NoticeID"] = noticeID.ToString(); | ||
987 | param["FromName"] = fromName; | ||
988 | param["Subject"] = subject; | ||
989 | param["Message"] = message; | ||
990 | param["BinaryBucket"] = binBucket; | ||
991 | param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString(); | ||
992 | |||
993 | IList parameters = new ArrayList(); | ||
994 | parameters.Add(param); | ||
995 | XmlRpcRequest req = new XmlRpcRequest("groups.addGroupNotice", parameters); | ||
996 | XmlRpcResponse resp = req.Send(m_serviceURL, 10000); | ||
997 | Hashtable respData = (Hashtable)resp.Value; | ||
998 | |||
999 | List<GroupNoticeData> values = new List<GroupNoticeData>(); | ||
1000 | |||
1001 | if (respData.Contains("error")) | ||
1002 | { | ||
1003 | LogRespDataToConsoleError(respData); | ||
1004 | } | ||
1005 | } | ||
1006 | |||
1007 | |||
1008 | } | ||
1009 | |||
1010 | public class GroupNoticeInfo | ||
1011 | { | ||
1012 | public GroupNoticeData noticeData = new GroupNoticeData(); | ||
1013 | public UUID GroupID = UUID.Zero; | ||
1014 | public string Message = string.Empty; | ||
1015 | public byte[] BinaryBucket = new byte[0]; | ||
1016 | } | ||
1017 | } | ||