diff options
author | Melanie | 2012-10-26 21:13:01 +0100 |
---|---|---|
committer | Melanie | 2012-10-26 21:13:01 +0100 |
commit | 26cc57b6cafda5168baab49cabe34d96f01dbd6d (patch) | |
tree | 94e078a75ab68825e64b15498f67d82988858dc9 /OpenSim/Region/CoreModules/Scripting/WorldComm | |
parent | Merge branch 'master' into careminster (diff) | |
parent | minor: Make the error thrown logged when a simulator in grid mode is trying t... (diff) | |
download | opensim-SC-26cc57b6cafda5168baab49cabe34d96f01dbd6d.zip opensim-SC-26cc57b6cafda5168baab49cabe34d96f01dbd6d.tar.gz opensim-SC-26cc57b6cafda5168baab49cabe34d96f01dbd6d.tar.bz2 opensim-SC-26cc57b6cafda5168baab49cabe34d96f01dbd6d.tar.xz |
Merge branch 'master' into careminster
Conflicts:
OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
Diffstat (limited to 'OpenSim/Region/CoreModules/Scripting/WorldComm')
-rw-r--r-- | OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs | 133 |
1 files changed, 110 insertions, 23 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs index 07bb291..e167e31 100644 --- a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Text.RegularExpressions; | ||
31 | using Nini.Config; | 32 | using Nini.Config; |
32 | using OpenMetaverse; | 33 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
@@ -172,12 +173,42 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
172 | /// <param name="hostID">UUID of the SceneObjectPart</param> | 173 | /// <param name="hostID">UUID of the SceneObjectPart</param> |
173 | /// <param name="channel">channel to listen on</param> | 174 | /// <param name="channel">channel to listen on</param> |
174 | /// <param name="name">name to filter on</param> | 175 | /// <param name="name">name to filter on</param> |
175 | /// <param name="id">key to filter on (user given, could be totally faked)</param> | 176 | /// <param name="id"> |
177 | /// key to filter on (user given, could be totally faked) | ||
178 | /// </param> | ||
179 | /// <param name="msg">msg to filter on</param> | ||
180 | /// <returns>number of the scripts handle</returns> | ||
181 | public int Listen(uint localID, UUID itemID, UUID hostID, int channel, | ||
182 | string name, UUID id, string msg) | ||
183 | { | ||
184 | return m_listenerManager.AddListener(localID, itemID, hostID, | ||
185 | channel, name, id, msg); | ||
186 | } | ||
187 | |||
188 | /// <summary> | ||
189 | /// Create a listen event callback with the specified filters. | ||
190 | /// The parameters localID,itemID are needed to uniquely identify | ||
191 | /// the script during 'peek' time. Parameter hostID is needed to | ||
192 | /// determine the position of the script. | ||
193 | /// </summary> | ||
194 | /// <param name="localID">localID of the script engine</param> | ||
195 | /// <param name="itemID">UUID of the script engine</param> | ||
196 | /// <param name="hostID">UUID of the SceneObjectPart</param> | ||
197 | /// <param name="channel">channel to listen on</param> | ||
198 | /// <param name="name">name to filter on</param> | ||
199 | /// <param name="id"> | ||
200 | /// key to filter on (user given, could be totally faked) | ||
201 | /// </param> | ||
176 | /// <param name="msg">msg to filter on</param> | 202 | /// <param name="msg">msg to filter on</param> |
203 | /// <param name="regexBitfield"> | ||
204 | /// Bitfield indicating which strings should be processed as regex. | ||
205 | /// </param> | ||
177 | /// <returns>number of the scripts handle</returns> | 206 | /// <returns>number of the scripts handle</returns> |
178 | public int Listen(uint localID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg) | 207 | public int Listen(uint localID, UUID itemID, UUID hostID, int channel, |
208 | string name, UUID id, string msg, int regexBitfield) | ||
179 | { | 209 | { |
180 | return m_listenerManager.AddListener(localID, itemID, hostID, channel, name, id, msg); | 210 | return m_listenerManager.AddListener(localID, itemID, hostID, |
211 | channel, name, id, msg, regexBitfield); | ||
181 | } | 212 | } |
182 | 213 | ||
183 | /// <summary> | 214 | /// <summary> |
@@ -326,7 +357,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
326 | if (channel == 0) | 357 | if (channel == 0) |
327 | { | 358 | { |
328 | // Channel 0 goes to viewer ONLY | 359 | // Channel 0 goes to viewer ONLY |
329 | m_scene.SimChat(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, false, false, target); | 360 | m_scene.SimChat(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, target, false, false); |
330 | return true; | 361 | return true; |
331 | } | 362 | } |
332 | 363 | ||
@@ -470,15 +501,25 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
470 | m_curlisteners = 0; | 501 | m_curlisteners = 0; |
471 | } | 502 | } |
472 | 503 | ||
473 | public int AddListener(uint localID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg) | 504 | public int AddListener(uint localID, UUID itemID, UUID hostID, |
505 | int channel, string name, UUID id, string msg) | ||
506 | { | ||
507 | return AddListener(localID, itemID, hostID, channel, name, id, | ||
508 | msg, 0); | ||
509 | } | ||
510 | |||
511 | public int AddListener(uint localID, UUID itemID, UUID hostID, | ||
512 | int channel, string name, UUID id, string msg, | ||
513 | int regexBitfield) | ||
474 | { | 514 | { |
475 | // do we already have a match on this particular filter event? | 515 | // do we already have a match on this particular filter event? |
476 | List<ListenerInfo> coll = GetListeners(itemID, channel, name, id, msg); | 516 | List<ListenerInfo> coll = GetListeners(itemID, channel, name, id, |
517 | msg); | ||
477 | 518 | ||
478 | if (coll.Count > 0) | 519 | if (coll.Count > 0) |
479 | { | 520 | { |
480 | // special case, called with same filter settings, return same handle | 521 | // special case, called with same filter settings, return same |
481 | // (2008-05-02, tested on 1.21.1 server, still holds) | 522 | // handle (2008-05-02, tested on 1.21.1 server, still holds) |
482 | return coll[0].GetHandle(); | 523 | return coll[0].GetHandle(); |
483 | } | 524 | } |
484 | 525 | ||
@@ -490,7 +531,9 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
490 | 531 | ||
491 | if (newHandle > 0) | 532 | if (newHandle > 0) |
492 | { | 533 | { |
493 | ListenerInfo li = new ListenerInfo(newHandle, localID, itemID, hostID, channel, name, id, msg); | 534 | ListenerInfo li = new ListenerInfo(newHandle, localID, |
535 | itemID, hostID, channel, name, id, msg, | ||
536 | regexBitfield); | ||
494 | 537 | ||
495 | List<ListenerInfo> listeners; | 538 | List<ListenerInfo> listeners; |
496 | if (!m_listeners.TryGetValue(channel,out listeners)) | 539 | if (!m_listeners.TryGetValue(channel,out listeners)) |
@@ -631,6 +674,22 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
631 | return -1; | 674 | return -1; |
632 | } | 675 | } |
633 | 676 | ||
677 | /// These are duplicated from ScriptBaseClass | ||
678 | /// http://opensimulator.org/mantis/view.php?id=6106#c21945 | ||
679 | #region Constants for the bitfield parameter of osListenRegex | ||
680 | |||
681 | /// <summary> | ||
682 | /// process name parameter as regex | ||
683 | /// </summary> | ||
684 | public const int OS_LISTEN_REGEX_NAME = 0x1; | ||
685 | |||
686 | /// <summary> | ||
687 | /// process message parameter as regex | ||
688 | /// </summary> | ||
689 | public const int OS_LISTEN_REGEX_MESSAGE = 0x2; | ||
690 | |||
691 | #endregion | ||
692 | |||
634 | // Theres probably a more clever and efficient way to | 693 | // Theres probably a more clever and efficient way to |
635 | // do this, maybe with regex. | 694 | // do this, maybe with regex. |
636 | // PM2008: Ha, one could even be smart and define a specialized Enumerator. | 695 | // PM2008: Ha, one could even be smart and define a specialized Enumerator. |
@@ -656,7 +715,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
656 | { | 715 | { |
657 | continue; | 716 | continue; |
658 | } | 717 | } |
659 | if (li.GetName().Length > 0 && !li.GetName().Equals(name)) | 718 | if (li.GetName().Length > 0 && ( |
719 | ((li.RegexBitfield & OS_LISTEN_REGEX_NAME) != OS_LISTEN_REGEX_NAME && !li.GetName().Equals(name)) || | ||
720 | ((li.RegexBitfield & OS_LISTEN_REGEX_NAME) == OS_LISTEN_REGEX_NAME && !Regex.IsMatch(name, li.GetName())) | ||
721 | )) | ||
660 | { | 722 | { |
661 | continue; | 723 | continue; |
662 | } | 724 | } |
@@ -664,7 +726,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
664 | { | 726 | { |
665 | continue; | 727 | continue; |
666 | } | 728 | } |
667 | if (li.GetMessage().Length > 0 && !li.GetMessage().Equals(msg)) | 729 | if (li.GetMessage().Length > 0 && ( |
730 | ((li.RegexBitfield & OS_LISTEN_REGEX_MESSAGE) != OS_LISTEN_REGEX_MESSAGE && !li.GetMessage().Equals(msg)) || | ||
731 | ((li.RegexBitfield & OS_LISTEN_REGEX_MESSAGE) == OS_LISTEN_REGEX_MESSAGE && !Regex.IsMatch(msg, li.GetMessage())) | ||
732 | )) | ||
668 | { | 733 | { |
669 | continue; | 734 | continue; |
670 | } | 735 | } |
@@ -697,10 +762,13 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
697 | { | 762 | { |
698 | int idx = 0; | 763 | int idx = 0; |
699 | Object[] item = new Object[6]; | 764 | Object[] item = new Object[6]; |
765 | int dataItemLength = 6; | ||
700 | 766 | ||
701 | while (idx < data.Length) | 767 | while (idx < data.Length) |
702 | { | 768 | { |
703 | Array.Copy(data, idx, item, 0, 6); | 769 | dataItemLength = (idx + 7 == data.Length || (idx + 7 < data.Length && data[idx + 7] is bool)) ? 7 : 6; |
770 | item = new Object[dataItemLength]; | ||
771 | Array.Copy(data, idx, item, 0, dataItemLength); | ||
704 | 772 | ||
705 | ListenerInfo info = | 773 | ListenerInfo info = |
706 | ListenerInfo.FromData(localID, itemID, hostID, item); | 774 | ListenerInfo.FromData(localID, itemID, hostID, item); |
@@ -712,12 +780,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
712 | m_listeners[(int)item[2]].Add(info); | 780 | m_listeners[(int)item[2]].Add(info); |
713 | } | 781 | } |
714 | 782 | ||
715 | idx+=6; | 783 | idx+=dataItemLength; |
716 | } | 784 | } |
717 | } | 785 | } |
718 | } | 786 | } |
719 | 787 | ||
720 | public class ListenerInfo: IWorldCommListenerInfo | 788 | public class ListenerInfo : IWorldCommListenerInfo |
721 | { | 789 | { |
722 | private bool m_active; // Listener is active or not | 790 | private bool m_active; // Listener is active or not |
723 | private int m_handle; // Assigned handle of this listener | 791 | private int m_handle; // Assigned handle of this listener |
@@ -731,16 +799,29 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
731 | 799 | ||
732 | public ListenerInfo(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, UUID id, string message) | 800 | public ListenerInfo(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, UUID id, string message) |
733 | { | 801 | { |
734 | Initialise(handle, localID, ItemID, hostID, channel, name, id, message); | 802 | Initialise(handle, localID, ItemID, hostID, channel, name, id, |
803 | message, 0); | ||
804 | } | ||
805 | |||
806 | public ListenerInfo(int handle, uint localID, UUID ItemID, | ||
807 | UUID hostID, int channel, string name, UUID id, | ||
808 | string message, int regexBitfield) | ||
809 | { | ||
810 | Initialise(handle, localID, ItemID, hostID, channel, name, id, | ||
811 | message, regexBitfield); | ||
735 | } | 812 | } |
736 | 813 | ||
737 | public ListenerInfo(ListenerInfo li, string name, UUID id, string message) | 814 | public ListenerInfo(ListenerInfo li, string name, UUID id, string message) |
738 | { | 815 | { |
739 | Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message); | 816 | Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message, 0); |
817 | } | ||
818 | |||
819 | public ListenerInfo(ListenerInfo li, string name, UUID id, string message, int regexBitfield) | ||
820 | { | ||
821 | Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message, regexBitfield); | ||
740 | } | 822 | } |
741 | 823 | ||
742 | private void Initialise(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, | 824 | private void Initialise(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, UUID id, string message, int regexBitfield) |
743 | UUID id, string message) | ||
744 | { | 825 | { |
745 | m_active = true; | 826 | m_active = true; |
746 | m_handle = handle; | 827 | m_handle = handle; |
@@ -751,11 +832,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
751 | m_name = name; | 832 | m_name = name; |
752 | m_id = id; | 833 | m_id = id; |
753 | m_message = message; | 834 | m_message = message; |
835 | RegexBitfield = regexBitfield; | ||
754 | } | 836 | } |
755 | 837 | ||
756 | public Object[] GetSerializationData() | 838 | public Object[] GetSerializationData() |
757 | { | 839 | { |
758 | Object[] data = new Object[6]; | 840 | Object[] data = new Object[7]; |
759 | 841 | ||
760 | data[0] = m_active; | 842 | data[0] = m_active; |
761 | data[1] = m_handle; | 843 | data[1] = m_handle; |
@@ -763,16 +845,19 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
763 | data[3] = m_name; | 845 | data[3] = m_name; |
764 | data[4] = m_id; | 846 | data[4] = m_id; |
765 | data[5] = m_message; | 847 | data[5] = m_message; |
848 | data[6] = RegexBitfield; | ||
766 | 849 | ||
767 | return data; | 850 | return data; |
768 | } | 851 | } |
769 | 852 | ||
770 | public static ListenerInfo FromData(uint localID, UUID ItemID, UUID hostID, Object[] data) | 853 | public static ListenerInfo FromData(uint localID, UUID ItemID, UUID hostID, Object[] data) |
771 | { | 854 | { |
772 | ListenerInfo linfo = new ListenerInfo((int)data[1], localID, | 855 | ListenerInfo linfo = new ListenerInfo((int)data[1], localID, ItemID, hostID, (int)data[2], (string)data[3], (UUID)data[4], (string)data[5]); |
773 | ItemID, hostID, (int)data[2], (string)data[3], | 856 | linfo.m_active = (bool)data[0]; |
774 | (UUID)data[4], (string)data[5]); | 857 | if (data.Length >= 7) |
775 | linfo.m_active=(bool)data[0]; | 858 | { |
859 | linfo.RegexBitfield = (int)data[6]; | ||
860 | } | ||
776 | 861 | ||
777 | return linfo; | 862 | return linfo; |
778 | } | 863 | } |
@@ -831,5 +916,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
831 | { | 916 | { |
832 | return m_id; | 917 | return m_id; |
833 | } | 918 | } |
919 | |||
920 | public int RegexBitfield { get; private set; } | ||
834 | } | 921 | } |
835 | } | 922 | } |