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