Added support for attachments to group notices when using Flotsam groups.
parent
f106ba87ca
commit
5ca7395e17
|
@ -39,6 +39,7 @@ using OpenSim.Framework.Communications;
|
|||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using System.Text;
|
||||
using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags;
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||
|
@ -421,44 +422,75 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
string Subject = im.message.Substring(0, im.message.IndexOf('|'));
|
||||
string Message = im.message.Substring(Subject.Length + 1);
|
||||
|
||||
InventoryItemBase item = null;
|
||||
bool hasAttachment = false;
|
||||
UUID itemID = UUID.Zero; //Assignment to quiet compiler
|
||||
UUID ownerID = UUID.Zero; //Assignment to quiet compiler
|
||||
byte[] bucket;
|
||||
|
||||
if ((im.binaryBucket.Length == 1) && (im.binaryBucket[0] == 0))
|
||||
{
|
||||
bucket = new byte[19];
|
||||
bucket[0] = 0; //dunno
|
||||
bucket[1] = 0; //dunno
|
||||
GroupID.ToBytes(bucket, 2);
|
||||
bucket[18] = 0; //dunno
|
||||
}
|
||||
else
|
||||
if (im.binaryBucket.Length >= 1 && im.binaryBucket[0] > 0)
|
||||
{
|
||||
string binBucket = OpenMetaverse.Utils.BytesToString(im.binaryBucket);
|
||||
binBucket = binBucket.Remove(0, 14).Trim();
|
||||
if (m_debugEnabled)
|
||||
{
|
||||
m_log.WarnFormat("I don't understand a group notice binary bucket of: {0}", binBucket);
|
||||
|
||||
OSDMap binBucketOSD = (OSDMap)OSDParser.DeserializeLLSDXml(binBucket);
|
||||
|
||||
foreach (string key in binBucketOSD.Keys)
|
||||
OSDMap binBucketOSD = (OSDMap)OSDParser.DeserializeLLSDXml(binBucket);
|
||||
if (binBucketOSD is OSD)
|
||||
{
|
||||
OSDMap binBucketMap = (OSDMap)binBucketOSD;
|
||||
|
||||
itemID = binBucketMap["item_id"].AsUUID();
|
||||
ownerID = binBucketMap["owner_id"].AsUUID();
|
||||
|
||||
//Attempt to get the details of the attached item.
|
||||
//If sender doesn't own the attachment, the item
|
||||
//variable will be set to null and attachment will
|
||||
//not be included with the group notice.
|
||||
Scene scene = (Scene)remoteClient.Scene;
|
||||
item = new InventoryItemBase(itemID, ownerID);
|
||||
item = scene.InventoryService.GetItem(item);
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
if (binBucketOSD.ContainsKey(key))
|
||||
{
|
||||
m_log.WarnFormat("{0}: {1}", key, binBucketOSD[key].ToString());
|
||||
}
|
||||
//Got item details so include the attachment.
|
||||
hasAttachment = true;
|
||||
}
|
||||
}
|
||||
|
||||
// treat as if no attachment
|
||||
bucket = new byte[19];
|
||||
bucket[0] = 0; //dunno
|
||||
bucket[1] = 0; //dunno
|
||||
GroupID.ToBytes(bucket, 2);
|
||||
bucket[18] = 0; //dunno
|
||||
else
|
||||
{
|
||||
m_log.DebugFormat("[Groups]: Received OSD with unexpected type: {0}", binBucketOSD.GetType());
|
||||
}
|
||||
}
|
||||
|
||||
if (hasAttachment)
|
||||
{
|
||||
//Bucket contains information about attachment.
|
||||
//
|
||||
//Byte offset and description of bucket data:
|
||||
//0: 1 byte indicating if attachment is present
|
||||
//1: 1 byte indicating the type of attachment
|
||||
//2: 16 bytes - Group UUID
|
||||
//18: 16 bytes - UUID of the attachment owner
|
||||
//34: 16 bytes - UUID of the attachment
|
||||
//50: variable - Name of the attachment
|
||||
//??: NUL byte to terminate the attachment name
|
||||
byte[] name = Encoding.UTF8.GetBytes(item.Name);
|
||||
bucket = new byte[51 + name.Length];//3 bytes, 3 UUIDs, and name
|
||||
bucket[0] = 1; //Has attachment flag
|
||||
bucket[1] = (byte)item.InvType; //Type of Attachment
|
||||
GroupID.ToBytes(bucket, 2);
|
||||
ownerID.ToBytes(bucket, 18);
|
||||
itemID.ToBytes(bucket, 34);
|
||||
name.CopyTo(bucket, 50);
|
||||
}
|
||||
else
|
||||
{
|
||||
bucket = new byte[19];
|
||||
bucket[0] = 0; //Has attachment flag
|
||||
bucket[1] = 0; //Type of attachment
|
||||
GroupID.ToBytes(bucket, 2);
|
||||
bucket[18] = 0; //NUL terminate name of attachment
|
||||
}
|
||||
|
||||
|
||||
m_groupData.AddGroupNotice(GetRequestingAgentID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket);
|
||||
if (OnNewGroupNotice != null)
|
||||
{
|
||||
|
@ -483,7 +515,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
|
||||
if (member.AcceptNotices)
|
||||
{
|
||||
// Build notice IIM
|
||||
// Build notice IM
|
||||
GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice);
|
||||
|
||||
msg.toAgentID = member.AgentID.Guid;
|
||||
|
@ -492,10 +524,40 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (im.dialog == (byte)InstantMessageDialog.GroupNoticeInventoryAccepted)
|
||||
{
|
||||
//Is bucket large enough to hold UUID of the attachment?
|
||||
if (im.binaryBucket.Length < 16)
|
||||
return;
|
||||
|
||||
UUID noticeID = new UUID(im.imSessionID);
|
||||
|
||||
GroupNoticeInfo notice = m_groupData.GetGroupNotice(GetRequestingAgentID(remoteClient), noticeID);
|
||||
if (notice != null)
|
||||
{
|
||||
UUID giver = new UUID(notice.BinaryBucket, 18);
|
||||
UUID attachmentUUID = new UUID(notice.BinaryBucket, 34);
|
||||
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat("[Groups]: Giving inventory from {0} to {1}", giver, remoteClient.AgentId);
|
||||
|
||||
InventoryItemBase itemCopy = ((Scene)(remoteClient.Scene)).GiveInventoryItem(remoteClient.AgentId,
|
||||
giver, attachmentUUID);
|
||||
|
||||
if (itemCopy == null)
|
||||
{
|
||||
remoteClient.SendAgentAlertMessage("Can't find item to give. Nothing given.", false);
|
||||
return;
|
||||
}
|
||||
|
||||
remoteClient.SendInventoryItemCreateUpdate(itemCopy, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// Interop, received special 210 code for ejecting a group member
|
||||
// this only works within the comms servers domain, and won't work hypergrid
|
||||
// TODO:FIXME: Use a presense server of some kind to find out where the
|
||||
// TODO:FIXME: Use a presence server of some kind to find out where the
|
||||
// client actually is, and try contacting that region directly to notify them,
|
||||
// or provide the notification via xmlrpc update queue
|
||||
if ((im.dialog == 210))
|
||||
|
@ -873,26 +935,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
|
||||
if (data != null)
|
||||
{
|
||||
GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), data.GroupID, null);
|
||||
|
||||
GridInstantMessage msg = new GridInstantMessage();
|
||||
msg.imSessionID = UUID.Zero.Guid;
|
||||
msg.fromAgentID = data.GroupID.Guid;
|
||||
msg.toAgentID = GetRequestingAgentID(remoteClient).Guid;
|
||||
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
||||
msg.fromAgentName = "Group Notice : " + groupInfo == null ? "Unknown" : groupInfo.GroupName;
|
||||
msg.message = data.noticeData.Subject + "|" + data.Message;
|
||||
msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNoticeRequested;
|
||||
msg.fromGroup = true;
|
||||
msg.offline = (byte)0;
|
||||
msg.ParentEstateID = 0;
|
||||
msg.Position = Vector3.Zero;
|
||||
msg.RegionID = UUID.Zero.Guid;
|
||||
msg.binaryBucket = data.BinaryBucket;
|
||||
GridInstantMessage msg = CreateGroupNoticeIM(remoteClient.AgentId, groupNoticeID, (byte)InstantMessageDialog.GroupNoticeRequested);
|
||||
|
||||
OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public GridInstantMessage CreateGroupNoticeIM(UUID agentID, UUID groupNoticeID, byte dialog)
|
||||
|
@ -900,10 +946,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||
|
||||
GridInstantMessage msg = new GridInstantMessage();
|
||||
msg.imSessionID = UUID.Zero.Guid;
|
||||
byte[] bucket;
|
||||
|
||||
msg.imSessionID = groupNoticeID.Guid;
|
||||
msg.toAgentID = agentID.Guid;
|
||||
msg.dialog = dialog;
|
||||
// msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNotice;
|
||||
msg.fromGroup = true;
|
||||
msg.offline = (byte)0;
|
||||
msg.ParentEstateID = 0;
|
||||
|
@ -917,13 +964,38 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
msg.timestamp = info.noticeData.Timestamp;
|
||||
msg.fromAgentName = info.noticeData.FromName;
|
||||
msg.message = info.noticeData.Subject + "|" + info.Message;
|
||||
msg.binaryBucket = info.BinaryBucket;
|
||||
|
||||
if (info.BinaryBucket[0] > 0)
|
||||
{
|
||||
//32 is due to not needing space for two of the UUIDs.
|
||||
//(Don't need UUID of attachment or its owner in IM)
|
||||
//50 offset gets us to start of attachment name.
|
||||
//We are skipping the attachment flag, type, and
|
||||
//the three UUID fields at the start of the bucket.
|
||||
bucket = new byte[info.BinaryBucket.Length-32];
|
||||
bucket[0] = 1; //Has attachment
|
||||
bucket[1] = info.BinaryBucket[1];
|
||||
Array.Copy(info.BinaryBucket, 50,
|
||||
bucket, 18, info.BinaryBucket.Length-50);
|
||||
}
|
||||
else
|
||||
{
|
||||
bucket = new byte[19];
|
||||
bucket[0] = 0; //No attachment
|
||||
bucket[1] = 0; //Attachment type
|
||||
bucket[18] = 0; //NUL terminate name
|
||||
}
|
||||
|
||||
info.GroupID.ToBytes(bucket, 2);
|
||||
msg.binaryBucket = bucket;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Group Notice {0} not found, composing empty message.", groupNoticeID);
|
||||
if (m_debugEnabled)
|
||||
m_log.DebugFormat("[GROUPS]: Group Notice {0} not found, composing empty message.", groupNoticeID);
|
||||
|
||||
msg.fromAgentID = UUID.Zero.Guid;
|
||||
msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); ;
|
||||
msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
|
||||
msg.fromAgentName = string.Empty;
|
||||
msg.message = string.Empty;
|
||||
msg.binaryBucket = new byte[0];
|
||||
|
@ -1047,7 +1119,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
|||
// Message to ejector
|
||||
// Interop, received special 210 code for ejecting a group member
|
||||
// this only works within the comms servers domain, and won't work hypergrid
|
||||
// TODO:FIXME: Use a presense server of some kind to find out where the
|
||||
// TODO:FIXME: Use a presence server of some kind to find out where the
|
||||
// client actually is, and try contacting that region directly to notify them,
|
||||
// or provide the notification via xmlrpc update queue
|
||||
|
||||
|
|
Loading…
Reference in New Issue