aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKevin Cozens2013-07-05 14:05:50 -0400
committerJustin Clark-Casey (justincc)2013-10-15 23:10:52 +0100
commitbfaa24f02d49551b31d4b261b8a2da85d2400726 (patch)
tree8e5983b083aa8819bbeea260d49f21809222a1f0
parentMerge branch '0.7.5-post-fixes' of ssh://opensimulator.org/var/git/opensim in... (diff)
downloadopensim-SC_OLD-bfaa24f02d49551b31d4b261b8a2da85d2400726.zip
opensim-SC_OLD-bfaa24f02d49551b31d4b261b8a2da85d2400726.tar.gz
opensim-SC_OLD-bfaa24f02d49551b31d4b261b8a2da85d2400726.tar.bz2
opensim-SC_OLD-bfaa24f02d49551b31d4b261b8a2da85d2400726.tar.xz
Added support for attachments to group notices when using Flotsam groups.
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs236
1 files changed, 153 insertions, 83 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index 29f9591..a844660 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -39,6 +39,7 @@ using OpenSim.Framework.Communications;
39using OpenSim.Region.Framework.Interfaces; 39using OpenSim.Region.Framework.Interfaces;
40using OpenSim.Region.Framework.Scenes; 40using OpenSim.Region.Framework.Scenes;
41using OpenSim.Services.Interfaces; 41using OpenSim.Services.Interfaces;
42using System.Text;
42using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags; 43using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags;
43 44
44namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups 45namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
@@ -50,19 +51,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
50 /// ; To use this module, you must specify the following in your OpenSim.ini 51 /// ; To use this module, you must specify the following in your OpenSim.ini
51 /// [GROUPS] 52 /// [GROUPS]
52 /// Enabled = true 53 /// Enabled = true
53 /// 54 ///
54 /// Module = GroupsModule 55 /// Module = GroupsModule
55 /// NoticesEnabled = true 56 /// NoticesEnabled = true
56 /// DebugEnabled = true 57 /// DebugEnabled = true
57 /// 58 ///
58 /// GroupsServicesConnectorModule = XmlRpcGroupsServicesConnector 59 /// GroupsServicesConnectorModule = XmlRpcGroupsServicesConnector
59 /// XmlRpcServiceURL = http://osflotsam.org/xmlrpc.php 60 /// XmlRpcServiceURL = http://osflotsam.org/xmlrpc.php
60 /// XmlRpcServiceReadKey = 1234 61 /// XmlRpcServiceReadKey = 1234
61 /// XmlRpcServiceWriteKey = 1234 62 /// XmlRpcServiceWriteKey = 1234
62 /// 63 ///
63 /// MessagingModule = GroupsMessagingModule 64 /// MessagingModule = GroupsMessagingModule
64 /// MessagingEnabled = true 65 /// MessagingEnabled = true
65 /// 66 ///
66 /// ; Disables HTTP Keep-Alive for Groups Module HTTP Requests, work around for 67 /// ; Disables HTTP Keep-Alive for Groups Module HTTP Requests, work around for
67 /// ; a problem discovered on some Windows based region servers. Only disable 68 /// ; a problem discovered on some Windows based region servers. Only disable
68 /// ; if you see a large number (dozens) of the following Exceptions: 69 /// ; if you see a large number (dozens) of the following Exceptions:
@@ -77,7 +78,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
77 private List<Scene> m_sceneList = new List<Scene>(); 78 private List<Scene> m_sceneList = new List<Scene>();
78 79
79 private IMessageTransferModule m_msgTransferModule = null; 80 private IMessageTransferModule m_msgTransferModule = null;
80 81
81 private IGroupsServicesConnector m_groupData = null; 82 private IGroupsServicesConnector m_groupData = null;
82 83
83 // Configuration settings 84 // Configuration settings
@@ -195,10 +196,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
195 196
196 scene.EventManager.OnNewClient += OnNewClient; 197 scene.EventManager.OnNewClient += OnNewClient;
197 scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; 198 scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
198 // The InstantMessageModule itself doesn't do this, 199 // The InstantMessageModule itself doesn't do this,
199 // so lets see if things explode if we don't do it 200 // so lets see if things explode if we don't do it
200 // scene.EventManager.OnClientClosed += OnClientClosed; 201 // scene.EventManager.OnClientClosed += OnClientClosed;
201
202 } 202 }
203 203
204 public void RemoveRegion(Scene scene) 204 public void RemoveRegion(Scene scene)
@@ -222,7 +222,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
222 if (m_debugEnabled) m_log.Debug("[GROUPS]: Shutting down Groups module."); 222 if (m_debugEnabled) m_log.Debug("[GROUPS]: Shutting down Groups module.");
223 } 223 }
224 224
225 public Type ReplaceableInterface 225 public Type ReplaceableInterface
226 { 226 {
227 get { return null; } 227 get { return null; }
228 } 228 }
@@ -274,7 +274,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
274 * reference to IClientAPI's, one for 0 or 1 root connections, and 0 or more child connections. 274 * reference to IClientAPI's, one for 0 or 1 root connections, and 0 or more child connections.
275 * The OnClientClosed event does not provide anything to indicate which one of those should be closed 275 * The OnClientClosed event does not provide anything to indicate which one of those should be closed
276 * nor does it provide what scene it was from so that the specific reference can be looked up. 276 * nor does it provide what scene it was from so that the specific reference can be looked up.
277 * The InstantMessageModule.cs does not currently worry about unregistering the handles, 277 * The InstantMessageModule.cs does not currently worry about unregistering the handles,
278 * and it should be an issue, since it's the client that references us not the other way around 278 * and it should be an issue, since it's the client that references us not the other way around
279 * , so as long as we don't keep a reference to the client laying around, the client can still be GC'ed 279 * , so as long as we don't keep a reference to the client laying around, the client can still be GC'ed
280 private void OnClientClosed(UUID AgentId) 280 private void OnClientClosed(UUID AgentId)
@@ -297,8 +297,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
297 { 297 {
298 if (m_debugEnabled) m_log.WarnFormat("[GROUPS]: Client closed that wasn't registered here."); 298 if (m_debugEnabled) m_log.WarnFormat("[GROUPS]: Client closed that wasn't registered here.");
299 } 299 }
300
301
302 } 300 }
303 } 301 }
304 */ 302 */
@@ -307,15 +305,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
307 { 305 {
308 if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups) 306 if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups)
309 { 307 {
310 if (m_debugEnabled) 308 if (m_debugEnabled)
311 m_log.DebugFormat( 309 m_log.DebugFormat(
312 "[GROUPS]: {0} called with queryText({1}) queryFlags({2}) queryStart({3})", 310 "[GROUPS]: {0} called with queryText({1}) queryFlags({2}) queryStart({3})",
313 System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart); 311 System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart);
314 312
315 // TODO: This currently ignores pretty much all the query flags including Mature and sort order 313 // TODO: This currently ignores pretty much all the query flags including Mature and sort order
316 remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(GetRequestingAgentID(remoteClient), queryText).ToArray()); 314 remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(GetRequestingAgentID(remoteClient), queryText).ToArray());
317 } 315 }
318 316
319 } 317 }
320 318
321 private void OnAgentDataUpdateRequest(IClientAPI remoteClient, UUID dataForAgentID, UUID sessionID) 319 private void OnAgentDataUpdateRequest(IClientAPI remoteClient, UUID dataForAgentID, UUID sessionID)
@@ -345,7 +343,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
345 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 343 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
346 344
347 string GroupName; 345 string GroupName;
348 346
349 GroupRecord group = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), GroupID, null); 347 GroupRecord group = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), GroupID, null);
350 if (group != null) 348 if (group != null)
351 { 349 {
@@ -407,7 +405,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
407 405
408 UpdateAllClientsWithGroupInfo(inviteInfo.AgentID); 406 UpdateAllClientsWithGroupInfo(inviteInfo.AgentID);
409 407
410 // TODO: If the inviter is still online, they need an agent dataupdate 408 // TODO: If the inviter is still online, they need an agent dataupdate
411 // and maybe group membership updates for the invitee 409 // and maybe group membership updates for the invitee
412 410
413 m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID); 411 m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
@@ -437,44 +435,75 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
437 string Subject = im.message.Substring(0, im.message.IndexOf('|')); 435 string Subject = im.message.Substring(0, im.message.IndexOf('|'));
438 string Message = im.message.Substring(Subject.Length + 1); 436 string Message = im.message.Substring(Subject.Length + 1);
439 437
438 InventoryItemBase item = null;
439 bool hasAttachment = false;
440 UUID itemID = UUID.Zero; //Assignment to quiet compiler
441 UUID ownerID = UUID.Zero; //Assignment to quiet compiler
440 byte[] bucket; 442 byte[] bucket;
441 443
442 if ((im.binaryBucket.Length == 1) && (im.binaryBucket[0] == 0)) 444 if (im.binaryBucket.Length >= 1 && im.binaryBucket[0] > 0)
443 {
444 bucket = new byte[19];
445 bucket[0] = 0; //dunno
446 bucket[1] = 0; //dunno
447 GroupID.ToBytes(bucket, 2);
448 bucket[18] = 0; //dunno
449 }
450 else
451 { 445 {
452 string binBucket = OpenMetaverse.Utils.BytesToString(im.binaryBucket); 446 string binBucket = OpenMetaverse.Utils.BytesToString(im.binaryBucket);
453 binBucket = binBucket.Remove(0, 14).Trim(); 447 binBucket = binBucket.Remove(0, 14).Trim();
454 if (m_debugEnabled) 448
449 OSDMap binBucketOSD = (OSDMap)OSDParser.DeserializeLLSDXml(binBucket);
450 if (binBucketOSD is OSD)
455 { 451 {
456 m_log.WarnFormat("I don't understand a group notice binary bucket of: {0}", binBucket); 452 OSDMap binBucketMap = (OSDMap)binBucketOSD;
453
454 itemID = binBucketMap["item_id"].AsUUID();
455 ownerID = binBucketMap["owner_id"].AsUUID();
457 456
458 OSDMap binBucketOSD = (OSDMap)OSDParser.DeserializeLLSDXml(binBucket); 457 //Attempt to get the details of the attached item.
459 458 //If sender doesn't own the attachment, the item
460 foreach (string key in binBucketOSD.Keys) 459 //variable will be set to null and attachment will
460 //not be included with the group notice.
461 Scene scene = (Scene)remoteClient.Scene;
462 item = new InventoryItemBase(itemID, ownerID);
463 item = scene.InventoryService.GetItem(item);
464
465 if (item != null)
461 { 466 {
462 if (binBucketOSD.ContainsKey(key)) 467 //Got item details so include the attachment.
463 { 468 hasAttachment = true;
464 m_log.WarnFormat("{0}: {1}", key, binBucketOSD[key].ToString());
465 }
466 } 469 }
467 } 470 }
468 471 else
469 // treat as if no attachment 472 {
473 m_log.DebugFormat("[Groups]: Received OSD with unexpected type: {0}", binBucketOSD.GetType());
474 }
475 }
476
477 if (hasAttachment)
478 {
479 //Bucket contains information about attachment.
480 //
481 //Byte offset and description of bucket data:
482 //0: 1 byte indicating if attachment is present
483 //1: 1 byte indicating the type of attachment
484 //2: 16 bytes - Group UUID
485 //18: 16 bytes - UUID of the attachment owner
486 //34: 16 bytes - UUID of the attachment
487 //50: variable - Name of the attachment
488 //??: NUL byte to terminate the attachment name
489 byte[] name = Encoding.UTF8.GetBytes(item.Name);
490 bucket = new byte[51 + name.Length];//3 bytes, 3 UUIDs, and name
491 bucket[0] = 1; //Has attachment flag
492 bucket[1] = (byte)item.InvType; //Type of Attachment
493 GroupID.ToBytes(bucket, 2);
494 ownerID.ToBytes(bucket, 18);
495 itemID.ToBytes(bucket, 34);
496 name.CopyTo(bucket, 50);
497 }
498 else
499 {
470 bucket = new byte[19]; 500 bucket = new byte[19];
471 bucket[0] = 0; //dunno 501 bucket[0] = 0; //Has attachment flag
472 bucket[1] = 0; //dunno 502 bucket[1] = 0; //Type of attachment
473 GroupID.ToBytes(bucket, 2); 503 GroupID.ToBytes(bucket, 2);
474 bucket[18] = 0; //dunno 504 bucket[18] = 0; //NUL terminate name of attachment
475 } 505 }
476 506
477
478 m_groupData.AddGroupNotice(GetRequestingAgentID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket); 507 m_groupData.AddGroupNotice(GetRequestingAgentID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket);
479 if (OnNewGroupNotice != null) 508 if (OnNewGroupNotice != null)
480 { 509 {
@@ -484,22 +513,24 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
484 // Send notice out to everyone that wants notices 513 // Send notice out to everyone that wants notices
485 foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), GroupID)) 514 foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), GroupID))
486 { 515 {
487 if (m_debugEnabled) 516 if (m_debugEnabled)
488 { 517 {
489 UserAccount targetUser = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, member.AgentID); 518 UserAccount targetUser = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, member.AgentID);
490 if (targetUser != null) 519 if (targetUser != null)
491 { 520 {
492 m_log.DebugFormat("[GROUPS]: Prepping group notice {0} for agent: {1} who Accepts Notices ({2})", NoticeID, targetUser.FirstName + " " + targetUser.LastName, member.AcceptNotices); 521 m_log.DebugFormat("[GROUPS]: Prepping group notice {0} for agent: {1} who Accepts Notices ({2})",
522 NoticeID, targetUser.FirstName + " " + targetUser.LastName, member.AcceptNotices);
493 } 523 }
494 else 524 else
495 { 525 {
496 m_log.DebugFormat("[GROUPS]: Prepping group notice {0} for agent: {1} who Accepts Notices ({2})", NoticeID, member.AgentID, member.AcceptNotices); 526 m_log.DebugFormat("[GROUPS]: Prepping group notice {0} for agent: {1} who Accepts Notices ({2})",
527 NoticeID, member.AgentID, member.AcceptNotices);
497 } 528 }
498 } 529 }
499 530
500 if (member.AcceptNotices) 531 if (member.AcceptNotices)
501 { 532 {
502 // Build notice IIM 533 // Build notice IM
503 GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice); 534 GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice);
504 535
505 msg.toAgentID = member.AgentID.Guid; 536 msg.toAgentID = member.AgentID.Guid;
@@ -508,10 +539,40 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
508 } 539 }
509 } 540 }
510 } 541 }
511 542
543 if (im.dialog == (byte)InstantMessageDialog.GroupNoticeInventoryAccepted)
544 {
545 //Is bucket large enough to hold UUID of the attachment?
546 if (im.binaryBucket.Length < 16)
547 return;
548
549 UUID noticeID = new UUID(im.imSessionID);
550
551 GroupNoticeInfo notice = m_groupData.GetGroupNotice(GetRequestingAgentID(remoteClient), noticeID);
552 if (notice != null)
553 {
554 UUID giver = new UUID(notice.BinaryBucket, 18);
555 UUID attachmentUUID = new UUID(notice.BinaryBucket, 34);
556
557 if (m_debugEnabled)
558 m_log.DebugFormat("[Groups]: Giving inventory from {0} to {1}", giver, remoteClient.AgentId);
559
560 InventoryItemBase itemCopy = ((Scene)(remoteClient.Scene)).GiveInventoryItem(remoteClient.AgentId,
561 giver, attachmentUUID);
562
563 if (itemCopy == null)
564 {
565 remoteClient.SendAgentAlertMessage("Can't find item to give. Nothing given.", false);
566 return;
567 }
568
569 remoteClient.SendInventoryItemCreateUpdate(itemCopy, 0);
570 }
571 }
572
512 // Interop, received special 210 code for ejecting a group member 573 // Interop, received special 210 code for ejecting a group member
513 // this only works within the comms servers domain, and won't work hypergrid 574 // this only works within the comms servers domain, and won't work hypergrid
514 // TODO:FIXME: Use a presense server of some kind to find out where the 575 // TODO:FIXME: Use a presense server of some kind to find out where the
515 // client actually is, and try contacting that region directly to notify them, 576 // client actually is, and try contacting that region directly to notify them,
516 // or provide the notification via xmlrpc update queue 577 // or provide the notification via xmlrpc update queue
517 if ((im.dialog == 210)) 578 if ((im.dialog == 210))
@@ -574,7 +635,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
574 { 635 {
575 return m_groupData.GetGroupRecord(UUID.Zero, UUID.Zero, name); 636 return m_groupData.GetGroupRecord(UUID.Zero, UUID.Zero, name);
576 } 637 }
577 638
578 public void ActivateGroup(IClientAPI remoteClient, UUID groupID) 639 public void ActivateGroup(IClientAPI remoteClient, UUID groupID)
579 { 640 {
580 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 641 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
@@ -582,7 +643,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
582 m_groupData.SetAgentActiveGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID); 643 m_groupData.SetAgentActiveGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
583 644
584 // Changing active group changes title, active powers, all kinds of things 645 // Changing active group changes title, active powers, all kinds of things
585 // anyone who is in any region that can see this client, should probably be 646 // anyone who is in any region that can see this client, should probably be
586 // updated with new group info. At a minimum, they should get ScenePresence 647 // updated with new group info. At a minimum, they should get ScenePresence
587 // updated with new title. 648 // updated with new title.
588 UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient)); 649 UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient));
@@ -618,10 +679,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
618 679
619 public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID) 680 public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID)
620 { 681 {
621 if (m_debugEnabled) 682 if (m_debugEnabled)
622 m_log.DebugFormat( 683 m_log.DebugFormat(
623 "[GROUPS]: GroupMembersRequest called for {0} from client {1}", groupID, remoteClient.Name); 684 "[GROUPS]: GroupMembersRequest called for {0} from client {1}", groupID, remoteClient.Name);
624 685
625 List<GroupMembersData> data = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID); 686 List<GroupMembersData> data = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID);
626 687
627 if (m_debugEnabled) 688 if (m_debugEnabled)
@@ -706,7 +767,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
706 767
707 public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID) 768 public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID)
708 { 769 {
709 if (m_debugEnabled) 770 if (m_debugEnabled)
710 m_log.DebugFormat( 771 m_log.DebugFormat(
711 "[GROUPS]: {0} called with groupID={1}, agentID={2}", 772 "[GROUPS]: {0} called with groupID={1}, agentID={2}",
712 System.Reflection.MethodBase.GetCurrentMethod().Name, groupID, agentID); 773 System.Reflection.MethodBase.GetCurrentMethod().Name, groupID, agentID);
@@ -796,7 +857,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
796 if (membership != null) 857 if (membership != null)
797 { 858 {
798 return membership.GroupTitle; 859 return membership.GroupTitle;
799 } 860 }
800 return string.Empty; 861 return string.Empty;
801 } 862 }
802 863
@@ -812,7 +873,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
812 // TODO: Not sure what all is needed here, but if the active group role change is for the group 873 // TODO: Not sure what all is needed here, but if the active group role change is for the group
813 // the client currently has set active, then we need to do a scene presence update too 874 // the client currently has set active, then we need to do a scene presence update too
814 // if (m_groupData.GetAgentActiveMembership(GetRequestingAgentID(remoteClient)).GroupID == GroupID) 875 // if (m_groupData.GetAgentActiveMembership(GetRequestingAgentID(remoteClient)).GroupID == GroupID)
815 876
816 UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient)); 877 UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient));
817 } 878 }
818 879
@@ -870,7 +931,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
870 case 1: 931 case 1:
871 // Remove 932 // Remove
872 m_groupData.RemoveAgentFromGroupRole(GetRequestingAgentID(remoteClient), memberID, groupID, roleID); 933 m_groupData.RemoveAgentFromGroupRole(GetRequestingAgentID(remoteClient), memberID, groupID, roleID);
873 934
874 break; 935 break;
875 default: 936 default:
876 m_log.ErrorFormat("[GROUPS]: {0} does not understand changes == {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, changes); 937 m_log.ErrorFormat("[GROUPS]: {0} does not understand changes == {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, changes);
@@ -889,26 +950,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
889 950
890 if (data != null) 951 if (data != null)
891 { 952 {
892 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), data.GroupID, null); 953 GridInstantMessage msg = CreateGroupNoticeIM(remoteClient.AgentId, groupNoticeID, (byte)InstantMessageDialog.GroupNoticeRequested);
893
894 GridInstantMessage msg = new GridInstantMessage();
895 msg.imSessionID = UUID.Zero.Guid;
896 msg.fromAgentID = data.GroupID.Guid;
897 msg.toAgentID = GetRequestingAgentID(remoteClient).Guid;
898 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
899 msg.fromAgentName = "Group Notice : " + groupInfo == null ? "Unknown" : groupInfo.GroupName;
900 msg.message = data.noticeData.Subject + "|" + data.Message;
901 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNoticeRequested;
902 msg.fromGroup = true;
903 msg.offline = (byte)0;
904 msg.ParentEstateID = 0;
905 msg.Position = Vector3.Zero;
906 msg.RegionID = UUID.Zero.Guid;
907 msg.binaryBucket = data.BinaryBucket;
908 954
909 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient)); 955 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient));
910 } 956 }
911
912 } 957 }
913 958
914 public GridInstantMessage CreateGroupNoticeIM(UUID agentID, UUID groupNoticeID, byte dialog) 959 public GridInstantMessage CreateGroupNoticeIM(UUID agentID, UUID groupNoticeID, byte dialog)
@@ -916,10 +961,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
916 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 961 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
917 962
918 GridInstantMessage msg = new GridInstantMessage(); 963 GridInstantMessage msg = new GridInstantMessage();
919 msg.imSessionID = UUID.Zero.Guid; 964 byte[] bucket;
965
966 msg.imSessionID = groupNoticeID.Guid;
920 msg.toAgentID = agentID.Guid; 967 msg.toAgentID = agentID.Guid;
921 msg.dialog = dialog; 968 msg.dialog = dialog;
922 // msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNotice;
923 msg.fromGroup = true; 969 msg.fromGroup = true;
924 msg.offline = (byte)0; 970 msg.offline = (byte)0;
925 msg.ParentEstateID = 0; 971 msg.ParentEstateID = 0;
@@ -933,13 +979,38 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
933 msg.timestamp = info.noticeData.Timestamp; 979 msg.timestamp = info.noticeData.Timestamp;
934 msg.fromAgentName = info.noticeData.FromName; 980 msg.fromAgentName = info.noticeData.FromName;
935 msg.message = info.noticeData.Subject + "|" + info.Message; 981 msg.message = info.noticeData.Subject + "|" + info.Message;
936 msg.binaryBucket = info.BinaryBucket; 982
983 if (info.BinaryBucket[0] > 0)
984 {
985 //32 is due to not needing space for two of the UUIDs.
986 //(Don't need UUID of attachment or its owner in IM)
987 //50 offset gets us to start of attachment name.
988 //We are skipping the attachment flag, type, and
989 //the three UUID fields at the start of the bucket.
990 bucket = new byte[info.BinaryBucket.Length-32];
991 bucket[0] = 1; //Has attachment
992 bucket[1] = info.BinaryBucket[1];
993 Array.Copy(info.BinaryBucket, 50,
994 bucket, 18, info.BinaryBucket.Length-50);
995 }
996 else
997 {
998 bucket = new byte[19];
999 bucket[0] = 0; //No attachment
1000 bucket[1] = 0; //Attachment type
1001 bucket[18] = 0; //NUL terminate name
1002 }
1003
1004 info.GroupID.ToBytes(bucket, 2);
1005 msg.binaryBucket = bucket;
937 } 1006 }
938 else 1007 else
939 { 1008 {
940 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Group Notice {0} not found, composing empty message.", groupNoticeID); 1009 if (m_debugEnabled)
1010 m_log.DebugFormat("[GROUPS]: Group Notice {0} not found, composing empty message.", groupNoticeID);
1011
941 msg.fromAgentID = UUID.Zero.Guid; 1012 msg.fromAgentID = UUID.Zero.Guid;
942 msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); ; 1013 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
943 msg.fromAgentName = string.Empty; 1014 msg.fromAgentName = string.Empty;
944 msg.message = string.Empty; 1015 msg.message = string.Empty;
945 msg.binaryBucket = new byte[0]; 1016 msg.binaryBucket = new byte[0];
@@ -1042,7 +1113,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1042 1113
1043 // Send Message to Ejectee 1114 // Send Message to Ejectee
1044 GridInstantMessage msg = new GridInstantMessage(); 1115 GridInstantMessage msg = new GridInstantMessage();
1045 1116
1046 msg.imSessionID = UUID.Zero.Guid; 1117 msg.imSessionID = UUID.Zero.Guid;
1047 msg.fromAgentID = agentID.Guid; 1118 msg.fromAgentID = agentID.Guid;
1048 // msg.fromAgentID = info.GroupID; 1119 // msg.fromAgentID = info.GroupID;
@@ -1063,7 +1134,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1063 // Message to ejector 1134 // Message to ejector
1064 // Interop, received special 210 code for ejecting a group member 1135 // Interop, received special 210 code for ejecting a group member
1065 // this only works within the comms servers domain, and won't work hypergrid 1136 // this only works within the comms servers domain, and won't work hypergrid
1066 // TODO:FIXME: Use a presense server of some kind to find out where the 1137 // TODO:FIXME: Use a presense server of some kind to find out where the
1067 // client actually is, and try contacting that region directly to notify them, 1138 // client actually is, and try contacting that region directly to notify them,
1068 // or provide the notification via xmlrpc update queue 1139 // or provide the notification via xmlrpc update queue
1069 1140
@@ -1232,7 +1303,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1232 { 1303 {
1233 if (!membership.ListInProfile) 1304 if (!membership.ListInProfile)
1234 { 1305 {
1235 // If we're sending group info to remoteclient about another agent, 1306 // If we're sending group info to remoteclient about another agent,
1236 // filter out groups the other agent doesn't want to share. 1307 // filter out groups the other agent doesn't want to share.
1237 continue; 1308 continue;
1238 } 1309 }
@@ -1269,7 +1340,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1269 { 1340 {
1270 queue.Enqueue(queue.BuildEvent("AgentGroupDataUpdate", llDataStruct), GetRequestingAgentID(remoteClient)); 1341 queue.Enqueue(queue.BuildEvent("AgentGroupDataUpdate", llDataStruct), GetRequestingAgentID(remoteClient));
1271 } 1342 }
1272
1273 } 1343 }
1274 1344
1275 private void SendScenePresenceUpdate(UUID AgentID, string Title) 1345 private void SendScenePresenceUpdate(UUID AgentID, string Title)
@@ -1373,7 +1443,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1373 membershipArray = membershipData.ToArray(); 1443 membershipArray = membershipData.ToArray();
1374 } 1444 }
1375 } 1445 }
1376 1446
1377 if (m_debugEnabled) 1447 if (m_debugEnabled)
1378 { 1448 {
1379 m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId); 1449 m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId);
@@ -1386,7 +1456,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1386 return membershipArray; 1456 return membershipArray;
1387 } 1457 }
1388 1458
1389 1459
1390 private void SendAgentDataUpdate(IClientAPI remoteClient, UUID dataForAgentID, UUID activeGroupID, string activeGroupName, ulong activeGroupPowers, string activeGroupTitle) 1460 private void SendAgentDataUpdate(IClientAPI remoteClient, UUID dataForAgentID, UUID activeGroupID, string activeGroupName, ulong activeGroupPowers, string activeGroupTitle)
1391 { 1461 {
1392 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 1462 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);