diff options
Diffstat (limited to 'OpenSim/Region/ClientStack')
6 files changed, 348 insertions, 107 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs index b53a2fb..9869a99 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs | |||
@@ -31,7 +31,6 @@ using OpenMetaverse; | |||
31 | using OpenMetaverse.Imaging; | 31 | using OpenMetaverse.Imaging; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Region.Framework.Interfaces; | 33 | using OpenSim.Region.Framework.Interfaces; |
34 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
35 | using OpenSim.Services.Interfaces; | 34 | using OpenSim.Services.Interfaces; |
36 | using log4net; | 35 | using log4net; |
37 | using System.Reflection; | 36 | using System.Reflection; |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 5c774b5..d5fda9d 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -40,11 +40,9 @@ using OpenMetaverse.Packets; | |||
40 | using OpenMetaverse.StructuredData; | 40 | using OpenMetaverse.StructuredData; |
41 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
42 | using OpenSim.Framework.Client; | 42 | using OpenSim.Framework.Client; |
43 | using OpenSim.Framework.Communications.Cache; | ||
44 | using OpenSim.Framework.Statistics; | 43 | using OpenSim.Framework.Statistics; |
45 | using OpenSim.Region.Framework.Interfaces; | 44 | using OpenSim.Region.Framework.Interfaces; |
46 | using OpenSim.Region.Framework.Scenes; | 45 | using OpenSim.Region.Framework.Scenes; |
47 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
48 | using OpenSim.Services.Interfaces; | 46 | using OpenSim.Services.Interfaces; |
49 | using Timer = System.Timers.Timer; | 47 | using Timer = System.Timers.Timer; |
50 | using AssetLandmark = OpenSim.Framework.AssetLandmark; | 48 | using AssetLandmark = OpenSim.Framework.AssetLandmark; |
@@ -98,6 +96,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
98 | /// </summary> | 96 | /// </summary> |
99 | public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientIPEndpoint, IStatsCollector | 97 | public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientIPEndpoint, IStatsCollector |
100 | { | 98 | { |
99 | /// <value> | ||
100 | /// Debug packet level. At the moment, only 255 does anything (prints out all in and out packets). | ||
101 | /// </value> | ||
102 | protected int m_debugPacketLevel = 0; | ||
103 | |||
101 | #region Events | 104 | #region Events |
102 | 105 | ||
103 | public event GenericMessage OnGenericMessage; | 106 | public event GenericMessage OnGenericMessage; |
@@ -122,7 +125,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
122 | public event ObjectAttach OnObjectAttach; | 125 | public event ObjectAttach OnObjectAttach; |
123 | public event ObjectDeselect OnObjectDetach; | 126 | public event ObjectDeselect OnObjectDetach; |
124 | public event ObjectDrop OnObjectDrop; | 127 | public event ObjectDrop OnObjectDrop; |
125 | public event GenericCall2 OnCompleteMovementToRegion; | 128 | public event GenericCall1 OnCompleteMovementToRegion; |
129 | public event UpdateAgent OnPreAgentUpdate; | ||
126 | public event UpdateAgent OnAgentUpdate; | 130 | public event UpdateAgent OnAgentUpdate; |
127 | public event AgentRequestSit OnAgentRequestSit; | 131 | public event AgentRequestSit OnAgentRequestSit; |
128 | public event AgentSit OnAgentSit; | 132 | public event AgentSit OnAgentSit; |
@@ -178,6 +182,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
178 | public event TeleportLocationRequest OnSetStartLocationRequest; | 182 | public event TeleportLocationRequest OnSetStartLocationRequest; |
179 | public event UpdateAvatarProperties OnUpdateAvatarProperties; | 183 | public event UpdateAvatarProperties OnUpdateAvatarProperties; |
180 | public event CreateNewInventoryItem OnCreateNewInventoryItem; | 184 | public event CreateNewInventoryItem OnCreateNewInventoryItem; |
185 | public event LinkInventoryItem OnLinkInventoryItem; | ||
181 | public event CreateInventoryFolder OnCreateNewInventoryFolder; | 186 | public event CreateInventoryFolder OnCreateNewInventoryFolder; |
182 | public event UpdateInventoryFolder OnUpdateInventoryFolder; | 187 | public event UpdateInventoryFolder OnUpdateInventoryFolder; |
183 | public event MoveInventoryFolder OnMoveInventoryFolder; | 188 | public event MoveInventoryFolder OnMoveInventoryFolder; |
@@ -348,11 +353,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
348 | protected PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates; | 353 | protected PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates; |
349 | private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates; | 354 | private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates; |
350 | private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates; | 355 | private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates; |
356 | |||
357 | /// <value> | ||
358 | /// List used in construction of data blocks for an object update packet. This is to stop us having to | ||
359 | /// continually recreate it. | ||
360 | /// </value> | ||
361 | protected List<ObjectUpdatePacket.ObjectDataBlock> m_fullUpdateDataBlocksBuilder; | ||
362 | |||
363 | /// <value> | ||
364 | /// Maintain a record of all the objects killed. This allows us to stop an update being sent from the | ||
365 | /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an | ||
366 | /// ownerless phantom. | ||
367 | /// | ||
368 | /// All manipulation of this set has to occur under a m_primFullUpdate.SyncRoot lock | ||
369 | /// | ||
370 | /// </value> | ||
371 | protected HashSet<uint> m_killRecord; | ||
372 | |||
351 | private int m_moneyBalance; | 373 | private int m_moneyBalance; |
352 | private int m_animationSequenceNumber = 1; | 374 | private int m_animationSequenceNumber = 1; |
353 | private bool m_SendLogoutPacketWhenClosing = true; | 375 | private bool m_SendLogoutPacketWhenClosing = true; |
354 | private AgentUpdateArgs lastarg; | 376 | private AgentUpdateArgs lastarg; |
355 | private bool m_IsActive = true; | 377 | private bool m_IsActive = true; |
378 | private bool m_IsLoggingOut = false; | ||
356 | 379 | ||
357 | protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); | 380 | protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); |
358 | protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers | 381 | protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers |
@@ -416,6 +439,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
416 | get { return m_IsActive; } | 439 | get { return m_IsActive; } |
417 | set { m_IsActive = value; } | 440 | set { m_IsActive = value; } |
418 | } | 441 | } |
442 | public bool IsLoggingOut | ||
443 | { | ||
444 | get { return m_IsLoggingOut; } | ||
445 | set { m_IsLoggingOut = value; } | ||
446 | } | ||
447 | |||
419 | public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } } | 448 | public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } } |
420 | 449 | ||
421 | #endregion Properties | 450 | #endregion Properties |
@@ -437,6 +466,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
437 | m_avatarTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); | 466 | m_avatarTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); |
438 | m_primTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); | 467 | m_primTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); |
439 | m_primFullUpdates = new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>(m_scene.Entities.Count); | 468 | m_primFullUpdates = new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>(m_scene.Entities.Count); |
469 | m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); | ||
470 | m_killRecord = new HashSet<uint>(); | ||
440 | 471 | ||
441 | m_assetService = m_scene.RequestModuleInterface<IAssetService>(); | 472 | m_assetService = m_scene.RequestModuleInterface<IAssetService>(); |
442 | m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>(); | 473 | m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>(); |
@@ -466,6 +497,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
466 | 497 | ||
467 | public void SetDebugPacketLevel(int newDebug) | 498 | public void SetDebugPacketLevel(int newDebug) |
468 | { | 499 | { |
500 | m_debugPacketLevel = newDebug; | ||
469 | } | 501 | } |
470 | 502 | ||
471 | #region Client Methods | 503 | #region Client Methods |
@@ -610,7 +642,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
610 | if (pprocessor.Async) | 642 | if (pprocessor.Async) |
611 | { | 643 | { |
612 | object obj = new AsyncPacketProcess(this, pprocessor.method, packet); | 644 | object obj = new AsyncPacketProcess(this, pprocessor.method, packet); |
613 | Util.FireAndForget(ProcessSpecificPacketAsync,obj); | 645 | Util.FireAndForget(ProcessSpecificPacketAsync, obj); |
614 | result = true; | 646 | result = true; |
615 | } | 647 | } |
616 | else | 648 | else |
@@ -638,8 +670,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
638 | public void ProcessSpecificPacketAsync(object state) | 670 | public void ProcessSpecificPacketAsync(object state) |
639 | { | 671 | { |
640 | AsyncPacketProcess packetObject = (AsyncPacketProcess)state; | 672 | AsyncPacketProcess packetObject = (AsyncPacketProcess)state; |
641 | packetObject.result = packetObject.Method(packetObject.ClientView, packetObject.Pack); | 673 | |
642 | 674 | try | |
675 | { | ||
676 | packetObject.result = packetObject.Method(packetObject.ClientView, packetObject.Pack); | ||
677 | } | ||
678 | catch (Exception e) | ||
679 | { | ||
680 | // Make sure that we see any exception caused by the asynchronous operation. | ||
681 | m_log.Error( | ||
682 | string.Format("[LLCLIENTVIEW]: Caught exception while processing {0}", packetObject.Pack), e); | ||
683 | } | ||
643 | } | 684 | } |
644 | 685 | ||
645 | #endregion Packet Handling | 686 | #endregion Packet Handling |
@@ -825,6 +866,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
825 | gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock(); | 866 | gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock(); |
826 | gmp.ParamList[i++].Parameter = val; | 867 | gmp.ParamList[i++].Parameter = val; |
827 | } | 868 | } |
869 | |||
828 | OutPacket(gmp, ThrottleOutPacketType.Task); | 870 | OutPacket(gmp, ThrottleOutPacketType.Task); |
829 | } | 871 | } |
830 | 872 | ||
@@ -1461,7 +1503,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1461 | kill.ObjectData[0].ID = localID; | 1503 | kill.ObjectData[0].ID = localID; |
1462 | kill.Header.Reliable = true; | 1504 | kill.Header.Reliable = true; |
1463 | kill.Header.Zerocoded = true; | 1505 | kill.Header.Zerocoded = true; |
1464 | OutPacket(kill, ThrottleOutPacketType.State); | 1506 | |
1507 | lock (m_primFullUpdates.SyncRoot) | ||
1508 | { | ||
1509 | m_killRecord.Add(localID); | ||
1510 | OutPacket(kill, ThrottleOutPacketType.State); | ||
1511 | } | ||
1465 | } | 1512 | } |
1466 | 1513 | ||
1467 | /// <summary> | 1514 | /// <summary> |
@@ -2512,6 +2559,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2512 | 2559 | ||
2513 | public void SendAsset(AssetRequestToClient req) | 2560 | public void SendAsset(AssetRequestToClient req) |
2514 | { | 2561 | { |
2562 | if (req.AssetInf.Data == null) | ||
2563 | { | ||
2564 | m_log.ErrorFormat("Cannot send asset {0} ({1}), asset data is null", | ||
2565 | req.AssetInf.ID, req.AssetInf.Metadata.ContentType); | ||
2566 | return; | ||
2567 | } | ||
2568 | |||
2515 | //m_log.Debug("sending asset " + req.RequestAssetID); | 2569 | //m_log.Debug("sending asset " + req.RequestAssetID); |
2516 | TransferInfoPacket Transfer = new TransferInfoPacket(); | 2570 | TransferInfoPacket Transfer = new TransferInfoPacket(); |
2517 | Transfer.TransferInfo.ChannelType = 2; | 2571 | Transfer.TransferInfo.ChannelType = 2; |
@@ -3501,21 +3555,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3501 | if (count == 0) | 3555 | if (count == 0) |
3502 | return; | 3556 | return; |
3503 | 3557 | ||
3504 | outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[count]; | 3558 | m_fullUpdateDataBlocksBuilder.Clear(); |
3559 | |||
3505 | for (int i = 0; i < count; i++) | 3560 | for (int i = 0; i < count; i++) |
3506 | { | 3561 | { |
3507 | outPacket.ObjectData[i] = m_primFullUpdates.Dequeue(); | 3562 | ObjectUpdatePacket.ObjectDataBlock block = m_primFullUpdates.Dequeue(); |
3508 | 3563 | ||
3564 | if (!m_killRecord.Contains(block.ID)) | ||
3565 | { | ||
3566 | m_fullUpdateDataBlocksBuilder.Add(block); | ||
3567 | |||
3509 | // string text = Util.FieldToString(outPacket.ObjectData[i].Text); | 3568 | // string text = Util.FieldToString(outPacket.ObjectData[i].Text); |
3510 | // if (text.IndexOf("\n") >= 0) | 3569 | // if (text.IndexOf("\n") >= 0) |
3511 | // text = text.Remove(text.IndexOf("\n")); | 3570 | // text = text.Remove(text.IndexOf("\n")); |
3512 | // m_log.DebugFormat( | 3571 | // m_log.DebugFormat( |
3513 | // "[CLIENT]: Sending full info about prim {0} text {1} to client {2}", | 3572 | // "[CLIENT]: Sending full info about prim {0} text {1} to client {2}", |
3514 | // outPacket.ObjectData[i].ID, text, Name); | 3573 | // outPacket.ObjectData[i].ID, text, Name); |
3574 | } | ||
3575 | // else | ||
3576 | // { | ||
3577 | // m_log.WarnFormat( | ||
3578 | // "[CLIENT]: Preventing full update for {0} after kill to {1}", block.ID, Name); | ||
3579 | // } | ||
3515 | } | 3580 | } |
3516 | } | ||
3517 | 3581 | ||
3518 | OutPacket(outPacket, ThrottleOutPacketType.State); | 3582 | outPacket.ObjectData = m_fullUpdateDataBlocksBuilder.ToArray(); |
3583 | |||
3584 | OutPacket(outPacket, ThrottleOutPacketType.State); | ||
3585 | } | ||
3519 | } | 3586 | } |
3520 | 3587 | ||
3521 | public void SendPrimTerseUpdate(SendPrimitiveTerseData data) | 3588 | public void SendPrimTerseUpdate(SendPrimitiveTerseData data) |
@@ -4051,10 +4118,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4051 | EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock(); | 4118 | EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock(); |
4052 | edata.CovenantID = covenant; | 4119 | edata.CovenantID = covenant; |
4053 | edata.CovenantTimestamp = 0; | 4120 | edata.CovenantTimestamp = 0; |
4054 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 4121 | edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
4055 | edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
4056 | else | ||
4057 | edata.EstateOwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
4058 | edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName); | 4122 | edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName); |
4059 | einfopack.Data = edata; | 4123 | einfopack.Data = edata; |
4060 | OutPacket(einfopack, ThrottleOutPacketType.Task); | 4124 | OutPacket(einfopack, ThrottleOutPacketType.Task); |
@@ -4075,8 +4139,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4075 | 4139 | ||
4076 | //Sending Estate Settings | 4140 | //Sending Estate Settings |
4077 | returnblock[0].Parameter = Utils.StringToBytes(estateName); | 4141 | returnblock[0].Parameter = Utils.StringToBytes(estateName); |
4078 | // TODO: remove this cruft once MasterAvatar is fully deprecated | ||
4079 | // | ||
4080 | returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString()); | 4142 | returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString()); |
4081 | returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString()); | 4143 | returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString()); |
4082 | 4144 | ||
@@ -4674,6 +4736,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4674 | AddLocalPacketHandler(PacketType.UpdateInventoryFolder, HandleUpdateInventoryFolder); | 4736 | AddLocalPacketHandler(PacketType.UpdateInventoryFolder, HandleUpdateInventoryFolder); |
4675 | AddLocalPacketHandler(PacketType.MoveInventoryFolder, HandleMoveInventoryFolder); | 4737 | AddLocalPacketHandler(PacketType.MoveInventoryFolder, HandleMoveInventoryFolder); |
4676 | AddLocalPacketHandler(PacketType.CreateInventoryItem, HandleCreateInventoryItem); | 4738 | AddLocalPacketHandler(PacketType.CreateInventoryItem, HandleCreateInventoryItem); |
4739 | AddLocalPacketHandler(PacketType.LinkInventoryItem, HandleLinkInventoryItem); | ||
4677 | AddLocalPacketHandler(PacketType.FetchInventory, HandleFetchInventory); | 4740 | AddLocalPacketHandler(PacketType.FetchInventory, HandleFetchInventory); |
4678 | AddLocalPacketHandler(PacketType.FetchInventoryDescendents, HandleFetchInventoryDescendents); | 4741 | AddLocalPacketHandler(PacketType.FetchInventoryDescendents, HandleFetchInventoryDescendents); |
4679 | AddLocalPacketHandler(PacketType.PurgeInventoryDescendents, HandlePurgeInventoryDescendents); | 4742 | AddLocalPacketHandler(PacketType.PurgeInventoryDescendents, HandlePurgeInventoryDescendents); |
@@ -4866,7 +4929,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4866 | UpdateAgent handlerAgentUpdate = OnAgentUpdate; | 4929 | UpdateAgent handlerAgentUpdate = OnAgentUpdate; |
4867 | lastarg = arg; // save this set of arguments for nexttime | 4930 | lastarg = arg; // save this set of arguments for nexttime |
4868 | if (handlerAgentUpdate != null) | 4931 | if (handlerAgentUpdate != null) |
4932 | { | ||
4933 | OnPreAgentUpdate(this, arg); | ||
4869 | OnAgentUpdate(this, arg); | 4934 | OnAgentUpdate(this, arg); |
4935 | } | ||
4870 | 4936 | ||
4871 | handlerAgentUpdate = null; | 4937 | handlerAgentUpdate = null; |
4872 | } | 4938 | } |
@@ -5505,6 +5571,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5505 | // for the client session anyway, in order to protect ourselves against bad code in plugins | 5571 | // for the client session anyway, in order to protect ourselves against bad code in plugins |
5506 | try | 5572 | try |
5507 | { | 5573 | { |
5574 | |||
5508 | byte[] visualparams = new byte[appear.VisualParam.Length]; | 5575 | byte[] visualparams = new byte[appear.VisualParam.Length]; |
5509 | for (int i = 0; i < appear.VisualParam.Length; i++) | 5576 | for (int i = 0; i < appear.VisualParam.Length; i++) |
5510 | visualparams[i] = appear.VisualParam[i].ParamValue; | 5577 | visualparams[i] = appear.VisualParam[i].ParamValue; |
@@ -5715,10 +5782,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5715 | 5782 | ||
5716 | private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack) | 5783 | private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack) |
5717 | { | 5784 | { |
5718 | GenericCall2 handlerCompleteMovementToRegion = OnCompleteMovementToRegion; | 5785 | GenericCall1 handlerCompleteMovementToRegion = OnCompleteMovementToRegion; |
5719 | if (handlerCompleteMovementToRegion != null) | 5786 | if (handlerCompleteMovementToRegion != null) |
5720 | { | 5787 | { |
5721 | handlerCompleteMovementToRegion(); | 5788 | handlerCompleteMovementToRegion(sender); |
5722 | } | 5789 | } |
5723 | handlerCompleteMovementToRegion = null; | 5790 | handlerCompleteMovementToRegion = null; |
5724 | 5791 | ||
@@ -5946,7 +6013,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5946 | || avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y == 255.5f) | 6013 | || avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y == 255.5f) |
5947 | { | 6014 | { |
5948 | ScenePresence avatar = null; | 6015 | ScenePresence avatar = null; |
5949 | if (((Scene)m_scene).TryGetAvatar(AgentId, out avatar)) | 6016 | if (((Scene)m_scene).TryGetScenePresence(AgentId, out avatar)) |
5950 | { | 6017 | { |
5951 | if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.X == 255.5f) | 6018 | if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.X == 255.5f) |
5952 | { | 6019 | { |
@@ -6989,6 +7056,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6989 | return true; | 7056 | return true; |
6990 | } | 7057 | } |
6991 | 7058 | ||
7059 | /// <summary> | ||
7060 | /// This is the entry point for the UDP route by which the client can retrieve asset data. If the request | ||
7061 | /// is successful then a TransferInfo packet will be sent back, followed by one or more TransferPackets | ||
7062 | /// </summary> | ||
7063 | /// <param name="sender"></param> | ||
7064 | /// <param name="Pack"></param> | ||
7065 | /// <returns>This parameter may be ignored since we appear to return true whatever happens</returns> | ||
6992 | private bool HandleTransferRequest(IClientAPI sender, Packet Pack) | 7066 | private bool HandleTransferRequest(IClientAPI sender, Packet Pack) |
6993 | { | 7067 | { |
6994 | //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request"); | 7068 | //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request"); |
@@ -6999,37 +7073,95 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6999 | // Has to be done here, because AssetCache can't do it | 7073 | // Has to be done here, because AssetCache can't do it |
7000 | // | 7074 | // |
7001 | UUID taskID = UUID.Zero; | 7075 | UUID taskID = UUID.Zero; |
7002 | if (transfer.TransferInfo.SourceType == 3) | 7076 | if (transfer.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) |
7003 | { | 7077 | { |
7004 | taskID = new UUID(transfer.TransferInfo.Params, 48); | 7078 | taskID = new UUID(transfer.TransferInfo.Params, 48); |
7005 | UUID itemID = new UUID(transfer.TransferInfo.Params, 64); | 7079 | UUID itemID = new UUID(transfer.TransferInfo.Params, 64); |
7006 | UUID requestID = new UUID(transfer.TransferInfo.Params, 80); | 7080 | UUID requestID = new UUID(transfer.TransferInfo.Params, 80); |
7081 | |||
7082 | // m_log.DebugFormat( | ||
7083 | // "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}", | ||
7084 | // requestID, itemID, taskID, Name); | ||
7085 | |||
7007 | if (!(((Scene)m_scene).Permissions.BypassPermissions())) | 7086 | if (!(((Scene)m_scene).Permissions.BypassPermissions())) |
7008 | { | 7087 | { |
7009 | if (taskID != UUID.Zero) // Prim | 7088 | if (taskID != UUID.Zero) // Prim |
7010 | { | 7089 | { |
7011 | SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID); | 7090 | SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID); |
7091 | |||
7012 | if (part == null) | 7092 | if (part == null) |
7093 | { | ||
7094 | m_log.WarnFormat( | ||
7095 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist", | ||
7096 | Name, requestID, itemID, taskID); | ||
7013 | return true; | 7097 | return true; |
7098 | } | ||
7014 | 7099 | ||
7015 | if (part.OwnerID != AgentId) | 7100 | TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID); |
7016 | return true; | 7101 | if (tii == null) |
7017 | 7102 | { | |
7018 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | 7103 | m_log.WarnFormat( |
7019 | return true; | 7104 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist", |
7020 | 7105 | Name, requestID, itemID, taskID); | |
7021 | TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID); | ||
7022 | if (ti == null) | ||
7023 | return true; | ||
7024 | |||
7025 | if (ti.OwnerID != AgentId) | ||
7026 | return true; | ||
7027 | |||
7028 | if ((ti.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) | ||
7029 | return true; | ||
7030 | |||
7031 | if (ti.AssetID != requestID) | ||
7032 | return true; | 7106 | return true; |
7107 | } | ||
7108 | |||
7109 | if (tii.Type == (int)AssetType.LSLText) | ||
7110 | { | ||
7111 | if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId)) | ||
7112 | return true; | ||
7113 | } | ||
7114 | else if (tii.Type == (int)AssetType.Notecard) | ||
7115 | { | ||
7116 | if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId)) | ||
7117 | return true; | ||
7118 | } | ||
7119 | else | ||
7120 | { | ||
7121 | // TODO: Change this code to allow items other than notecards and scripts to be successfully | ||
7122 | // shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule | ||
7123 | if (part.OwnerID != AgentId) | ||
7124 | { | ||
7125 | m_log.WarnFormat( | ||
7126 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}", | ||
7127 | Name, requestID, itemID, taskID, part.OwnerID); | ||
7128 | return true; | ||
7129 | } | ||
7130 | |||
7131 | if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) | ||
7132 | { | ||
7133 | m_log.WarnFormat( | ||
7134 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set", | ||
7135 | Name, requestID, itemID, taskID); | ||
7136 | return true; | ||
7137 | } | ||
7138 | |||
7139 | if (tii.OwnerID != AgentId) | ||
7140 | { | ||
7141 | m_log.WarnFormat( | ||
7142 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}", | ||
7143 | Name, requestID, itemID, taskID, tii.OwnerID); | ||
7144 | return true; | ||
7145 | } | ||
7146 | |||
7147 | if (( | ||
7148 | tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) | ||
7149 | != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) | ||
7150 | { | ||
7151 | m_log.WarnFormat( | ||
7152 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer", | ||
7153 | Name, requestID, itemID, taskID); | ||
7154 | return true; | ||
7155 | } | ||
7156 | |||
7157 | if (tii.AssetID != requestID) | ||
7158 | { | ||
7159 | m_log.WarnFormat( | ||
7160 | "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}", | ||
7161 | Name, requestID, itemID, taskID, tii.AssetID); | ||
7162 | return true; | ||
7163 | } | ||
7164 | } | ||
7033 | } | 7165 | } |
7034 | else // Agent | 7166 | else // Agent |
7035 | { | 7167 | { |
@@ -7038,7 +7170,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7038 | assetRequestItem = invService.GetItem(assetRequestItem); | 7170 | assetRequestItem = invService.GetItem(assetRequestItem); |
7039 | if (assetRequestItem == null) | 7171 | if (assetRequestItem == null) |
7040 | { | 7172 | { |
7041 | assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); | 7173 | ILibraryService lib = m_scene.RequestModuleInterface<ILibraryService>(); |
7174 | if (lib != null) | ||
7175 | assetRequestItem = lib.LibraryRootFolder.FindItem(itemID); | ||
7042 | if (assetRequestItem == null) | 7176 | if (assetRequestItem == null) |
7043 | return true; | 7177 | return true; |
7044 | } | 7178 | } |
@@ -7047,7 +7181,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7047 | // only to notecards and scripts. All | 7181 | // only to notecards and scripts. All |
7048 | // other asset types are always available | 7182 | // other asset types are always available |
7049 | // | 7183 | // |
7050 | if (assetRequestItem.AssetType == 10) | 7184 | if (assetRequestItem.AssetType == (int)AssetType.LSLText) |
7051 | { | 7185 | { |
7052 | if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId)) | 7186 | if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId)) |
7053 | { | 7187 | { |
@@ -7055,7 +7189,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7055 | return true; | 7189 | return true; |
7056 | } | 7190 | } |
7057 | } | 7191 | } |
7058 | else if (assetRequestItem.AssetType == 7) | 7192 | else if (assetRequestItem.AssetType == (int)AssetType.Notecard) |
7059 | { | 7193 | { |
7060 | if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId)) | 7194 | if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId)) |
7061 | { | 7195 | { |
@@ -7065,7 +7199,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7065 | } | 7199 | } |
7066 | 7200 | ||
7067 | if (assetRequestItem.AssetID != requestID) | 7201 | if (assetRequestItem.AssetID != requestID) |
7202 | { | ||
7203 | m_log.WarnFormat( | ||
7204 | "[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}", | ||
7205 | Name, requestID, itemID, assetRequestItem.AssetID); | ||
7068 | return true; | 7206 | return true; |
7207 | } | ||
7069 | } | 7208 | } |
7070 | } | 7209 | } |
7071 | } | 7210 | } |
@@ -7268,6 +7407,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7268 | return true; | 7407 | return true; |
7269 | } | 7408 | } |
7270 | 7409 | ||
7410 | private bool HandleLinkInventoryItem(IClientAPI sender, Packet Pack) | ||
7411 | { | ||
7412 | LinkInventoryItemPacket createLink = (LinkInventoryItemPacket)Pack; | ||
7413 | |||
7414 | #region Packet Session and User Check | ||
7415 | if (m_checkPackets) | ||
7416 | { | ||
7417 | if (createLink.AgentData.SessionID != SessionId || | ||
7418 | createLink.AgentData.AgentID != AgentId) | ||
7419 | return true; | ||
7420 | } | ||
7421 | #endregion | ||
7422 | |||
7423 | LinkInventoryItem linkInventoryItem = OnLinkInventoryItem; | ||
7424 | |||
7425 | if (linkInventoryItem != null) | ||
7426 | { | ||
7427 | linkInventoryItem( | ||
7428 | this, | ||
7429 | createLink.InventoryBlock.TransactionID, | ||
7430 | createLink.InventoryBlock.FolderID, | ||
7431 | createLink.InventoryBlock.CallbackID, | ||
7432 | Util.FieldToString(createLink.InventoryBlock.Description), | ||
7433 | Util.FieldToString(createLink.InventoryBlock.Name), | ||
7434 | createLink.InventoryBlock.InvType, | ||
7435 | createLink.InventoryBlock.Type, | ||
7436 | createLink.InventoryBlock.OldItemID); | ||
7437 | } | ||
7438 | |||
7439 | return true; | ||
7440 | } | ||
7441 | |||
7271 | private bool HandleFetchInventory(IClientAPI sender, Packet Pack) | 7442 | private bool HandleFetchInventory(IClientAPI sender, Packet Pack) |
7272 | { | 7443 | { |
7273 | if (OnFetchInventory != null) | 7444 | if (OnFetchInventory != null) |
@@ -7612,12 +7783,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7612 | newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask; | 7783 | newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask; |
7613 | newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask; | 7784 | newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask; |
7614 | newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask; | 7785 | newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask; |
7786 | |||
7787 | // Unused? Clicking share with group sets GroupPermissions instead, so perhaps this is something | ||
7788 | // different | ||
7615 | //newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned; | 7789 | //newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned; |
7616 | newTaskItem.Type = updatetask.InventoryData.Type; | 7790 | newTaskItem.Type = updatetask.InventoryData.Type; |
7617 | newTaskItem.InvType = updatetask.InventoryData.InvType; | 7791 | newTaskItem.InvType = updatetask.InventoryData.InvType; |
7618 | newTaskItem.Flags = updatetask.InventoryData.Flags; | 7792 | newTaskItem.Flags = updatetask.InventoryData.Flags; |
7619 | //newTaskItem.SaleType=updatetask.InventoryData.SaleType; | 7793 | //newTaskItem.SaleType=updatetask.InventoryData.SaleType; |
7620 | //newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;; | 7794 | //newTaskItem.SalePrice=updatetask.InventoryData.SalePrice; |
7621 | newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name); | 7795 | newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name); |
7622 | newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description); | 7796 | newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description); |
7623 | newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate; | 7797 | newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate; |
@@ -7625,7 +7799,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7625 | newTaskItem, updatetask.UpdateData.LocalID); | 7799 | newTaskItem, updatetask.UpdateData.LocalID); |
7626 | } | 7800 | } |
7627 | } | 7801 | } |
7628 | } | 7802 | } |
7629 | 7803 | ||
7630 | return true; | 7804 | return true; |
7631 | } | 7805 | } |
@@ -10928,7 +11102,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10928 | LLUDPServer.LogPacketHeader(false, m_circuitCode, 0, packet.Type, (ushort)packet.Length); | 11102 | LLUDPServer.LogPacketHeader(false, m_circuitCode, 0, packet.Type, (ushort)packet.Length); |
10929 | #endregion BinaryStats | 11103 | #endregion BinaryStats |
10930 | 11104 | ||
10931 | m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, true); | 11105 | OutPacket(packet, throttlePacketType, true); |
10932 | } | 11106 | } |
10933 | 11107 | ||
10934 | /// <summary> | 11108 | /// <summary> |
@@ -10941,6 +11115,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
10941 | /// handles splitting manually</param> | 11115 | /// handles splitting manually</param> |
10942 | protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType, bool doAutomaticSplitting) | 11116 | protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType, bool doAutomaticSplitting) |
10943 | { | 11117 | { |
11118 | if (m_debugPacketLevel >= 255) | ||
11119 | m_log.DebugFormat("[CLIENT]: Packet OUT {0}", packet.Type); | ||
11120 | |||
10944 | m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting); | 11121 | m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting); |
10945 | } | 11122 | } |
10946 | 11123 | ||
@@ -11012,10 +11189,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11012 | /// <param name="Pack">OpenMetaverse.packet</param> | 11189 | /// <param name="Pack">OpenMetaverse.packet</param> |
11013 | public void ProcessInPacket(Packet Pack) | 11190 | public void ProcessInPacket(Packet Pack) |
11014 | { | 11191 | { |
11015 | // m_log.DebugFormat("[CLIENT]: Packet IN {0}", Pack); | 11192 | if (m_debugPacketLevel >= 255) |
11016 | 11193 | m_log.DebugFormat("[CLIENT]: Packet IN {0}", Pack.Type); | |
11194 | |||
11017 | if (!ProcessPacketMethod(Pack)) | 11195 | if (!ProcessPacketMethod(Pack)) |
11018 | m_log.Warn("[CLIENT]: unhandled packet " + Pack); | 11196 | m_log.Warn("[CLIENT]: unhandled packet " + Pack.Type); |
11019 | 11197 | ||
11020 | PacketPool.Instance.ReturnPacket(Pack); | 11198 | PacketPool.Instance.ReturnPacket(Pack); |
11021 | } | 11199 | } |
@@ -11235,17 +11413,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11235 | return String.Empty; | 11413 | return String.Empty; |
11236 | } | 11414 | } |
11237 | 11415 | ||
11238 | public void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID) | 11416 | /// <summary> |
11417 | /// Make an asset request to the asset service in response to a client request. | ||
11418 | /// </summary> | ||
11419 | /// <param name="transferRequest"></param> | ||
11420 | /// <param name="taskID"></param> | ||
11421 | protected void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID) | ||
11239 | { | 11422 | { |
11240 | UUID requestID = UUID.Zero; | 11423 | UUID requestID = UUID.Zero; |
11241 | if (transferRequest.TransferInfo.SourceType == 2) | 11424 | if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) |
11242 | { | 11425 | { |
11243 | //direct asset request | ||
11244 | requestID = new UUID(transferRequest.TransferInfo.Params, 0); | 11426 | requestID = new UUID(transferRequest.TransferInfo.Params, 0); |
11245 | } | 11427 | } |
11246 | else if (transferRequest.TransferInfo.SourceType == 3) | 11428 | else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) |
11247 | { | 11429 | { |
11248 | //inventory asset request | ||
11249 | requestID = new UUID(transferRequest.TransferInfo.Params, 80); | 11430 | requestID = new UUID(transferRequest.TransferInfo.Params, 80); |
11250 | //m_log.Debug("[XXX] inventory asset request " + requestID); | 11431 | //m_log.Debug("[XXX] inventory asset request " + requestID); |
11251 | //if (taskID == UUID.Zero) // Agent | 11432 | //if (taskID == UUID.Zero) // Agent |
@@ -11258,29 +11439,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11258 | // } | 11439 | // } |
11259 | } | 11440 | } |
11260 | 11441 | ||
11261 | //check to see if asset is in local cache, if not we need to request it from asset server. | 11442 | // m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID); |
11262 | //m_log.Debug("asset request " + requestID); | ||
11263 | 11443 | ||
11264 | m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); | 11444 | m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); |
11265 | |||
11266 | } | 11445 | } |
11267 | 11446 | ||
11447 | /// <summary> | ||
11448 | /// When we get a reply back from the asset service in response to a client request, send back the data. | ||
11449 | /// </summary> | ||
11450 | /// <param name="id"></param> | ||
11451 | /// <param name="sender"></param> | ||
11452 | /// <param name="asset"></param> | ||
11268 | protected void AssetReceived(string id, Object sender, AssetBase asset) | 11453 | protected void AssetReceived(string id, Object sender, AssetBase asset) |
11269 | { | 11454 | { |
11270 | TransferRequestPacket transferRequest = (TransferRequestPacket)sender; | 11455 | TransferRequestPacket transferRequest = (TransferRequestPacket)sender; |
11271 | 11456 | ||
11272 | UUID requestID = UUID.Zero; | 11457 | UUID requestID = UUID.Zero; |
11273 | byte source = 2; | 11458 | byte source = (byte)SourceType.Asset; |
11274 | if ((transferRequest.TransferInfo.SourceType == 2) || (transferRequest.TransferInfo.SourceType == 2222)) | 11459 | |
11460 | if ((transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) | ||
11461 | || (transferRequest.TransferInfo.SourceType == 2222)) | ||
11275 | { | 11462 | { |
11276 | //direct asset request | ||
11277 | requestID = new UUID(transferRequest.TransferInfo.Params, 0); | 11463 | requestID = new UUID(transferRequest.TransferInfo.Params, 0); |
11278 | } | 11464 | } |
11279 | else if ((transferRequest.TransferInfo.SourceType == 3) || (transferRequest.TransferInfo.SourceType == 3333)) | 11465 | else if ((transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) |
11466 | || (transferRequest.TransferInfo.SourceType == 3333)) | ||
11280 | { | 11467 | { |
11281 | //inventory asset request | ||
11282 | requestID = new UUID(transferRequest.TransferInfo.Params, 80); | 11468 | requestID = new UUID(transferRequest.TransferInfo.Params, 80); |
11283 | source = 3; | 11469 | source = (byte)SourceType.SimInventoryItem; |
11284 | //m_log.Debug("asset request " + requestID); | 11470 | //m_log.Debug("asset request " + requestID); |
11285 | } | 11471 | } |
11286 | 11472 | ||
@@ -11293,9 +11479,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11293 | if ((userAssets != string.Empty) && (userAssets != m_hyperAssets.GetSimAssetServer())) | 11479 | if ((userAssets != string.Empty) && (userAssets != m_hyperAssets.GetSimAssetServer())) |
11294 | { | 11480 | { |
11295 | m_log.DebugFormat("[CLIENT]: asset {0} not found in local asset storage. Trying user's storage.", id); | 11481 | m_log.DebugFormat("[CLIENT]: asset {0} not found in local asset storage. Trying user's storage.", id); |
11296 | if (transferRequest.TransferInfo.SourceType == 2) | 11482 | if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset) |
11297 | transferRequest.TransferInfo.SourceType = 2222; // marker | 11483 | transferRequest.TransferInfo.SourceType = 2222; // marker |
11298 | else if (transferRequest.TransferInfo.SourceType == 3) | 11484 | else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem) |
11299 | transferRequest.TransferInfo.SourceType = 3333; // marker | 11485 | transferRequest.TransferInfo.SourceType = 3333; // marker |
11300 | 11486 | ||
11301 | m_assetService.Get(userAssets + "/" + id, transferRequest, AssetReceived); | 11487 | m_assetService.Get(userAssets + "/" + id, transferRequest, AssetReceived); |
@@ -11310,7 +11496,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11310 | } | 11496 | } |
11311 | 11497 | ||
11312 | // Scripts cannot be retrieved by direct request | 11498 | // Scripts cannot be retrieved by direct request |
11313 | if (transferRequest.TransferInfo.SourceType == 2 && asset.Type == 10) | 11499 | if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset && asset.Type == 10) |
11314 | return; | 11500 | return; |
11315 | 11501 | ||
11316 | // The asset is known to exist and is in our cache, so add it to the AssetRequests list | 11502 | // The asset is known to exist and is in our cache, so add it to the AssetRequests list |
@@ -11336,6 +11522,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11336 | const uint m_maxPacketSize = 600; | 11522 | const uint m_maxPacketSize = 600; |
11337 | int numPackets = 1; | 11523 | int numPackets = 1; |
11338 | 11524 | ||
11525 | if (data == null) | ||
11526 | return 0; | ||
11527 | |||
11339 | if (data.LongLength > m_maxPacketSize) | 11528 | if (data.LongLength > m_maxPacketSize) |
11340 | { | 11529 | { |
11341 | // over max number of bytes so split up file | 11530 | // over max number of bytes so split up file |
@@ -11540,6 +11729,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11540 | public PacketMethod method; | 11729 | public PacketMethod method; |
11541 | public bool Async; | 11730 | public bool Async; |
11542 | } | 11731 | } |
11732 | |||
11543 | public class AsyncPacketProcess | 11733 | public class AsyncPacketProcess |
11544 | { | 11734 | { |
11545 | public bool result = false; | 11735 | public bool result = false; |
@@ -11581,5 +11771,40 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11581 | packet.PropertiesData.LanguagesText = Utils.StringToBytes(languages); | 11771 | packet.PropertiesData.LanguagesText = Utils.StringToBytes(languages); |
11582 | OutPacket(packet, ThrottleOutPacketType.Task); | 11772 | OutPacket(packet, ThrottleOutPacketType.Task); |
11583 | } | 11773 | } |
11774 | |||
11775 | public void SendChangeUserRights(UUID agentID, UUID friendID, int rights) | ||
11776 | { | ||
11777 | ChangeUserRightsPacket packet = (ChangeUserRightsPacket)PacketPool.Instance.GetPacket(PacketType.ChangeUserRights); | ||
11778 | |||
11779 | packet.AgentData = new ChangeUserRightsPacket.AgentDataBlock(); | ||
11780 | packet.AgentData.AgentID = agentID; | ||
11781 | |||
11782 | packet.Rights = new ChangeUserRightsPacket.RightsBlock[1]; | ||
11783 | packet.Rights[0] = new ChangeUserRightsPacket.RightsBlock(); | ||
11784 | packet.Rights[0].AgentRelated = friendID; | ||
11785 | packet.Rights[0].RelatedRights = rights; | ||
11786 | |||
11787 | OutPacket(packet, ThrottleOutPacketType.Task); | ||
11788 | } | ||
11789 | |||
11790 | public void SendTextBoxRequest(string message, int chatChannel, string objectname, string ownerFirstName, string ownerLastName, UUID objectId) | ||
11791 | { | ||
11792 | ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog); | ||
11793 | dialog.Data.ObjectID = objectId; | ||
11794 | dialog.Data.ChatChannel = chatChannel; | ||
11795 | dialog.Data.ImageID = UUID.Zero; | ||
11796 | dialog.Data.ObjectName = Util.StringToBytes256(objectname); | ||
11797 | // this is the username of the *owner* | ||
11798 | dialog.Data.FirstName = Util.StringToBytes256(ownerFirstName); | ||
11799 | dialog.Data.LastName = Util.StringToBytes256(ownerLastName); | ||
11800 | dialog.Data.Message = Util.StringToBytes256(message); | ||
11801 | |||
11802 | |||
11803 | ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[1]; | ||
11804 | buttons[0] = new ScriptDialogPacket.ButtonsBlock(); | ||
11805 | buttons[0].ButtonLabel = Util.StringToBytes256("!!llTextBox!!"); | ||
11806 | dialog.Buttons = buttons; | ||
11807 | OutPacket(dialog, ThrottleOutPacketType.Task); | ||
11808 | } | ||
11584 | } | 11809 | } |
11585 | } | 11810 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLFileTransfer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLFileTransfer.cs index adf171e..10e5a95 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLFileTransfer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLFileTransfer.cs | |||
@@ -197,7 +197,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
197 | 197 | ||
198 | private void Initialise(UUID fileID, string fileName) | 198 | private void Initialise(UUID fileID, string fileName) |
199 | { | 199 | { |
200 | m_asset = new AssetBase(fileID, fileName, type); | 200 | m_asset = new AssetBase(fileID, fileName, type, UUID.Zero.ToString()); |
201 | m_asset.Data = new byte[0]; | 201 | m_asset.Data = new byte[0]; |
202 | m_asset.Description = "empty"; | 202 | m_asset.Description = "empty"; |
203 | m_asset.Local = true; | 203 | m_asset.Local = true; |
@@ -212,6 +212,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
212 | 212 | ||
213 | public void RequestStartXfer(IClientAPI pRemoteClient) | 213 | public void RequestStartXfer(IClientAPI pRemoteClient) |
214 | { | 214 | { |
215 | m_asset.Metadata.CreatorID = pRemoteClient.AgentId.ToString(); | ||
216 | |||
215 | if (!String.IsNullOrEmpty(m_asset.Name)) | 217 | if (!String.IsNullOrEmpty(m_asset.Name)) |
216 | { | 218 | { |
217 | pRemoteClient.SendXferRequest(mXferID, m_asset.Type, m_asset.FullID, 0, Utils.StringToBytes(m_asset.Name)); | 219 | pRemoteClient.SendXferRequest(mXferID, m_asset.Type, m_asset.FullID, 0, Utils.StringToBytes(m_asset.Name)); |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs index 55d9c9c..6232c48 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | |||
@@ -144,6 +144,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
144 | /// <summary>A reference to the LLUDPServer that is managing this client</summary> | 144 | /// <summary>A reference to the LLUDPServer that is managing this client</summary> |
145 | private readonly LLUDPServer m_udpServer; | 145 | private readonly LLUDPServer m_udpServer; |
146 | 146 | ||
147 | /// <summary>Caches packed throttle information</summary> | ||
148 | private byte[] m_packedThrottles; | ||
149 | |||
147 | private int m_defaultRTO = 3000; | 150 | private int m_defaultRTO = 3000; |
148 | private int m_maxRTO = 60000; | 151 | private int m_maxRTO = 60000; |
149 | 152 | ||
@@ -350,21 +353,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
350 | bucket = m_throttleCategories[(int)ThrottleOutPacketType.Texture]; | 353 | bucket = m_throttleCategories[(int)ThrottleOutPacketType.Texture]; |
351 | bucket.DripRate = texture; | 354 | bucket.DripRate = texture; |
352 | bucket.MaxBurst = texture; | 355 | bucket.MaxBurst = texture; |
356 | |||
357 | // Reset the packed throttles cached data | ||
358 | m_packedThrottles = null; | ||
353 | } | 359 | } |
354 | 360 | ||
355 | public byte[] GetThrottlesPacked() | 361 | public byte[] GetThrottlesPacked() |
356 | { | 362 | { |
357 | byte[] data = new byte[7 * 4]; | 363 | byte[] data = m_packedThrottles; |
358 | int i = 0; | 364 | |
359 | 365 | if (data == null) | |
360 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Resend].DripRate), 0, data, i, 4); i += 4; | 366 | { |
361 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Land].DripRate), 0, data, i, 4); i += 4; | 367 | data = new byte[7 * 4]; |
362 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Wind].DripRate), 0, data, i, 4); i += 4; | 368 | int i = 0; |
363 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].DripRate), 0, data, i, 4); i += 4; | 369 | |
364 | Buffer.BlockCopy(Utils.FloatToBytes((float)(m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate) + | 370 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Resend].DripRate), 0, data, i, 4); i += 4; |
365 | m_throttleCategories[(int)ThrottleOutPacketType.State].DripRate), 0, data, i, 4); i += 4; | 371 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Land].DripRate), 0, data, i, 4); i += 4; |
366 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Texture].DripRate), 0, data, i, 4); i += 4; | 372 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Wind].DripRate), 0, data, i, 4); i += 4; |
367 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Asset].DripRate), 0, data, i, 4); i += 4; | 373 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].DripRate), 0, data, i, 4); i += 4; |
374 | Buffer.BlockCopy(Utils.FloatToBytes((float)(m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate) + | ||
375 | m_throttleCategories[(int)ThrottleOutPacketType.State].DripRate), 0, data, i, 4); i += 4; | ||
376 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Texture].DripRate), 0, data, i, 4); i += 4; | ||
377 | Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Asset].DripRate), 0, data, i, 4); i += 4; | ||
378 | |||
379 | m_packedThrottles = data; | ||
380 | } | ||
368 | 381 | ||
369 | return data; | 382 | return data; |
370 | } | 383 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 3c4fa72..41e41e4 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -513,6 +513,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
513 | byte flags = buffer.Data[0]; | 513 | byte flags = buffer.Data[0]; |
514 | bool isResend = (flags & Helpers.MSG_RESENT) != 0; | 514 | bool isResend = (flags & Helpers.MSG_RESENT) != 0; |
515 | bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0; | 515 | bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0; |
516 | bool isZerocoded = (flags & Helpers.MSG_ZEROCODED) != 0; | ||
516 | LLUDPClient udpClient = outgoingPacket.Client; | 517 | LLUDPClient udpClient = outgoingPacket.Client; |
517 | 518 | ||
518 | if (!udpClient.IsConnected) | 519 | if (!udpClient.IsConnected) |
@@ -522,23 +523,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
522 | 523 | ||
523 | int dataLength = buffer.DataLength; | 524 | int dataLength = buffer.DataLength; |
524 | 525 | ||
525 | // Keep appending ACKs until there is no room left in the buffer or there are | 526 | // NOTE: I'm seeing problems with some viewers when ACKs are appended to zerocoded packets so I've disabled that here |
526 | // no more ACKs to append | 527 | if (!isZerocoded) |
527 | uint ackCount = 0; | ||
528 | uint ack; | ||
529 | while (dataLength + 5 < buffer.Data.Length && udpClient.PendingAcks.Dequeue(out ack)) | ||
530 | { | 528 | { |
531 | Utils.UIntToBytesBig(ack, buffer.Data, dataLength); | 529 | // Keep appending ACKs until there is no room left in the buffer or there are |
532 | dataLength += 4; | 530 | // no more ACKs to append |
533 | ++ackCount; | 531 | uint ackCount = 0; |
534 | } | 532 | uint ack; |
533 | while (dataLength + 5 < buffer.Data.Length && udpClient.PendingAcks.Dequeue(out ack)) | ||
534 | { | ||
535 | Utils.UIntToBytesBig(ack, buffer.Data, dataLength); | ||
536 | dataLength += 4; | ||
537 | ++ackCount; | ||
538 | } | ||
535 | 539 | ||
536 | if (ackCount > 0) | 540 | if (ackCount > 0) |
537 | { | 541 | { |
538 | // Set the last byte of the packet equal to the number of appended ACKs | 542 | // Set the last byte of the packet equal to the number of appended ACKs |
539 | buffer.Data[dataLength++] = (byte)ackCount; | 543 | buffer.Data[dataLength++] = (byte)ackCount; |
540 | // Set the appended ACKs flag on this packet | 544 | // Set the appended ACKs flag on this packet |
541 | buffer.Data[0] = (byte)(buffer.Data[0] | Helpers.MSG_APPENDED_ACKS); | 545 | buffer.Data[0] = (byte)(buffer.Data[0] | Helpers.MSG_APPENDED_ACKS); |
546 | } | ||
542 | } | 547 | } |
543 | 548 | ||
544 | buffer.DataLength = dataLength; | 549 | buffer.DataLength = dataLength; |
@@ -596,15 +601,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
596 | } | 601 | } |
597 | catch (MalformedDataException) | 602 | catch (MalformedDataException) |
598 | { | 603 | { |
599 | m_log.ErrorFormat("[LLUDPSERVER]: Malformed data, cannot parse packet from {0}:\n{1}", | ||
600 | buffer.RemoteEndPoint, Utils.BytesToHexString(buffer.Data, buffer.DataLength, null)); | ||
601 | } | 604 | } |
602 | 605 | ||
603 | // Fail-safe check | 606 | // Fail-safe check |
604 | if (packet == null) | 607 | if (packet == null) |
605 | { | 608 | { |
606 | m_log.Warn("[LLUDPSERVER]: Couldn't build a message from incoming data " + buffer.DataLength + | 609 | m_log.ErrorFormat("[LLUDPSERVER]: Malformed data, cannot parse {0} byte packet from {1}:", |
607 | " bytes long from " + buffer.RemoteEndPoint); | 610 | buffer.DataLength, buffer.RemoteEndPoint); |
611 | m_log.Error(Utils.BytesToHexString(buffer.Data, buffer.DataLength, null)); | ||
608 | return; | 612 | return; |
609 | } | 613 | } |
610 | 614 | ||
@@ -919,7 +923,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
919 | // Remove this client from the scene | 923 | // Remove this client from the scene |
920 | IClientAPI client; | 924 | IClientAPI client; |
921 | if (m_scene.TryGetClient(udpClient.AgentID, out client)) | 925 | if (m_scene.TryGetClient(udpClient.AgentID, out client)) |
926 | { | ||
927 | client.IsLoggingOut = true; | ||
922 | client.Close(); | 928 | client.Close(); |
929 | } | ||
923 | } | 930 | } |
924 | 931 | ||
925 | private void IncomingPacketHandler() | 932 | private void IncomingPacketHandler() |
@@ -1018,7 +1025,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1018 | 1025 | ||
1019 | // Handle outgoing packets, resends, acknowledgements, and pings for each | 1026 | // Handle outgoing packets, resends, acknowledgements, and pings for each |
1020 | // client. m_packetSent will be set to true if a packet is sent | 1027 | // client. m_packetSent will be set to true if a packet is sent |
1021 | m_scene.ForEachClient(clientPacketHandler, false); | 1028 | m_scene.ForEachClient(clientPacketHandler); |
1022 | 1029 | ||
1023 | // If nothing was sent, sleep for the minimum amount of time before a | 1030 | // If nothing was sent, sleep for the minimum amount of time before a |
1024 | // token bucket could get more tokens | 1031 | // token bucket could get more tokens |
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index c7aeca14..e683821 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs | |||
@@ -56,13 +56,6 @@ namespace OpenSim.Region.ClientStack | |||
56 | 56 | ||
57 | protected uint m_httpServerPort; | 57 | protected uint m_httpServerPort; |
58 | 58 | ||
59 | public CommunicationsManager CommunicationsManager | ||
60 | { | ||
61 | get { return m_commsManager; } | ||
62 | set { m_commsManager = value; } | ||
63 | } | ||
64 | protected CommunicationsManager m_commsManager; | ||
65 | |||
66 | protected StorageManager m_storageManager; | 59 | protected StorageManager m_storageManager; |
67 | 60 | ||
68 | protected ClientStackManager m_clientStackManager; | 61 | protected ClientStackManager m_clientStackManager; |
@@ -105,12 +98,14 @@ namespace OpenSim.Region.ClientStack | |||
105 | 98 | ||
106 | if (m_networkServersInfo.HttpUsesSSL && (m_networkServersInfo.HttpListenerPort == m_networkServersInfo.httpSSLPort)) | 99 | if (m_networkServersInfo.HttpUsesSSL && (m_networkServersInfo.HttpListenerPort == m_networkServersInfo.httpSSLPort)) |
107 | { | 100 | { |
108 | m_log.Error("[HTTP]: HTTP Server config failed. HTTP Server and HTTPS server must be on different ports"); | 101 | m_log.Error("[REGION SERVER]: HTTP Server config failed. HTTP Server and HTTPS server must be on different ports"); |
109 | } | 102 | } |
110 | 103 | ||
111 | m_log.Info("[REGION]: Starting HTTP server"); | 104 | m_log.InfoFormat("[REGION SERVER]: Starting HTTP server on port {0}", m_httpServerPort); |
112 | m_httpServer.Start(); | 105 | m_httpServer.Start(); |
113 | 106 | ||
107 | MainServer.Instance = m_httpServer; | ||
108 | |||
114 | base.StartupSpecific(); | 109 | base.StartupSpecific(); |
115 | } | 110 | } |
116 | 111 | ||
@@ -134,4 +129,4 @@ namespace OpenSim.Region.ClientStack | |||
134 | return physicsPluginManager.GetPhysicsScene(engine, meshEngine, config, osSceneIdentifier); | 129 | return physicsPluginManager.GetPhysicsScene(engine, meshEngine, config, osSceneIdentifier); |
135 | } | 130 | } |
136 | } | 131 | } |
137 | } | 132 | } \ No newline at end of file |