diff options
author | SignpostMarv | 2012-10-23 15:42:16 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-10-26 02:08:00 +0100 |
commit | e977761071a2d614a9a621437fbf86479b414759 (patch) | |
tree | 3d9e6a65c9462ca8f6439184887a632dc041eb27 | |
parent | Formatting and casing correction in WorldCommModule, trailing new line in OSS... (diff) | |
download | opensim-SC-e977761071a2d614a9a621437fbf86479b414759.zip opensim-SC-e977761071a2d614a9a621437fbf86479b414759.tar.gz opensim-SC-e977761071a2d614a9a621437fbf86479b414759.tar.bz2 opensim-SC-e977761071a2d614a9a621437fbf86479b414759.tar.xz |
adding ability for listeners to be filtered by regular expressions and a general-purpose function to see if a given string matches a given regex
6 files changed, 242 insertions, 19 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs index c68ed6b..cf0eb2a 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; |
@@ -170,12 +171,42 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
170 | /// <param name="hostID">UUID of the SceneObjectPart</param> | 171 | /// <param name="hostID">UUID of the SceneObjectPart</param> |
171 | /// <param name="channel">channel to listen on</param> | 172 | /// <param name="channel">channel to listen on</param> |
172 | /// <param name="name">name to filter on</param> | 173 | /// <param name="name">name to filter on</param> |
173 | /// <param name="id">key to filter on (user given, could be totally faked)</param> | 174 | /// <param name="id"> |
175 | /// key to filter on (user given, could be totally faked) | ||
176 | /// </param> | ||
174 | /// <param name="msg">msg to filter on</param> | 177 | /// <param name="msg">msg to filter on</param> |
175 | /// <returns>number of the scripts handle</returns> | 178 | /// <returns>number of the scripts handle</returns> |
176 | public int Listen(uint localID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg) | 179 | public int Listen(uint localID, UUID itemID, UUID hostID, int channel, |
180 | string name, UUID id, string msg) | ||
177 | { | 181 | { |
178 | return m_listenerManager.AddListener(localID, itemID, hostID, channel, name, id, msg); | 182 | return m_listenerManager.AddListener(localID, itemID, hostID, |
183 | channel, name, id, msg); | ||
184 | } | ||
185 | |||
186 | /// <summary> | ||
187 | /// Create a listen event callback with the specified filters. | ||
188 | /// The parameters localID,itemID are needed to uniquely identify | ||
189 | /// the script during 'peek' time. Parameter hostID is needed to | ||
190 | /// determine the position of the script. | ||
191 | /// </summary> | ||
192 | /// <param name="localID">localID of the script engine</param> | ||
193 | /// <param name="itemID">UUID of the script engine</param> | ||
194 | /// <param name="hostID">UUID of the SceneObjectPart</param> | ||
195 | /// <param name="channel">channel to listen on</param> | ||
196 | /// <param name="name">name to filter on</param> | ||
197 | /// <param name="id"> | ||
198 | /// key to filter on (user given, could be totally faked) | ||
199 | /// </param> | ||
200 | /// <param name="msg">msg to filter on</param> | ||
201 | /// <param name="regexBitfield"> | ||
202 | /// Bitfield indicating which strings should be processed as regex. | ||
203 | /// </param> | ||
204 | /// <returns>number of the scripts handle</returns> | ||
205 | public int Listen(uint localID, UUID itemID, UUID hostID, int channel, | ||
206 | string name, UUID id, string msg, int regexBitfield) | ||
207 | { | ||
208 | return m_listenerManager.AddListener(localID, itemID, hostID, | ||
209 | channel, name, id, msg, regexBitfield); | ||
179 | } | 210 | } |
180 | 211 | ||
181 | /// <summary> | 212 | /// <summary> |
@@ -465,10 +496,20 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
465 | m_curlisteners = 0; | 496 | m_curlisteners = 0; |
466 | } | 497 | } |
467 | 498 | ||
468 | public int AddListener(uint localID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg) | 499 | public int AddListener(uint localID, UUID itemID, UUID hostID, |
500 | int channel, string name, UUID id, string msg) | ||
501 | { | ||
502 | return AddListener(localID, itemID, hostID, channel, name, id, | ||
503 | msg, 0); | ||
504 | } | ||
505 | |||
506 | public int AddListener(uint localID, UUID itemID, UUID hostID, | ||
507 | int channel, string name, UUID id, string msg, | ||
508 | int regexBitfield) | ||
469 | { | 509 | { |
470 | // do we already have a match on this particular filter event? | 510 | // do we already have a match on this particular filter event? |
471 | List<ListenerInfo> coll = GetListeners(itemID, channel, name, id, msg); | 511 | List<ListenerInfo> coll = GetListeners(itemID, channel, name, id, |
512 | msg); | ||
472 | 513 | ||
473 | if (coll.Count > 0) | 514 | if (coll.Count > 0) |
474 | { | 515 | { |
@@ -485,7 +526,9 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
485 | 526 | ||
486 | if (newHandle > 0) | 527 | if (newHandle > 0) |
487 | { | 528 | { |
488 | ListenerInfo li = new ListenerInfo(newHandle, localID, itemID, hostID, channel, name, id, msg); | 529 | ListenerInfo li = new ListenerInfo(newHandle, localID, |
530 | itemID, hostID, channel, name, id, msg, | ||
531 | regexBitfield); | ||
489 | 532 | ||
490 | List<ListenerInfo> listeners; | 533 | List<ListenerInfo> listeners; |
491 | if (!m_listeners.TryGetValue(channel,out listeners)) | 534 | if (!m_listeners.TryGetValue(channel,out listeners)) |
@@ -626,6 +669,22 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
626 | return -1; | 669 | return -1; |
627 | } | 670 | } |
628 | 671 | ||
672 | /// These are duplicated from ScriptBaseClass | ||
673 | /// http://opensimulator.org/mantis/view.php?id=6106#c21945 | ||
674 | #region Constants for the bitfield parameter of osListenRegex | ||
675 | |||
676 | /// <summary> | ||
677 | /// process name parameter as regex | ||
678 | /// </summary> | ||
679 | public const int OS_LISTEN_REGEX_NAME = 0x1; | ||
680 | |||
681 | /// <summary> | ||
682 | /// process message parameter as regex | ||
683 | /// </summary> | ||
684 | public const int OS_LISTEN_REGEX_MESSAGE = 0x2; | ||
685 | |||
686 | #endregion | ||
687 | |||
629 | // Theres probably a more clever and efficient way to | 688 | // Theres probably a more clever and efficient way to |
630 | // do this, maybe with regex. | 689 | // do this, maybe with regex. |
631 | // PM2008: Ha, one could even be smart and define a specialized Enumerator. | 690 | // PM2008: Ha, one could even be smart and define a specialized Enumerator. |
@@ -651,7 +710,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
651 | { | 710 | { |
652 | continue; | 711 | continue; |
653 | } | 712 | } |
654 | if (li.GetName().Length > 0 && !li.GetName().Equals(name)) | 713 | if (li.GetName().Length > 0 && ( |
714 | ((li.GetRegexBitfield() & OS_LISTEN_REGEX_NAME) != OS_LISTEN_REGEX_NAME && !li.GetName().Equals(name)) || | ||
715 | ((li.GetRegexBitfield() & OS_LISTEN_REGEX_NAME) == OS_LISTEN_REGEX_NAME && !Regex.IsMatch(name, li.GetName())) | ||
716 | )) | ||
655 | { | 717 | { |
656 | continue; | 718 | continue; |
657 | } | 719 | } |
@@ -659,7 +721,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
659 | { | 721 | { |
660 | continue; | 722 | continue; |
661 | } | 723 | } |
662 | if (li.GetMessage().Length > 0 && !li.GetMessage().Equals(msg)) | 724 | if (li.GetMessage().Length > 0 && ( |
725 | ((li.GetRegexBitfield() & OS_LISTEN_REGEX_MESSAGE) != OS_LISTEN_REGEX_MESSAGE && !li.GetMessage().Equals(msg)) || | ||
726 | ((li.GetRegexBitfield() & OS_LISTEN_REGEX_MESSAGE) == OS_LISTEN_REGEX_MESSAGE && !Regex.IsMatch(msg, li.GetMessage())) | ||
727 | )) | ||
663 | { | 728 | { |
664 | continue; | 729 | continue; |
665 | } | 730 | } |
@@ -692,10 +757,13 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
692 | { | 757 | { |
693 | int idx = 0; | 758 | int idx = 0; |
694 | Object[] item = new Object[6]; | 759 | Object[] item = new Object[6]; |
760 | int dataItemLength = 6; | ||
695 | 761 | ||
696 | while (idx < data.Length) | 762 | while (idx < data.Length) |
697 | { | 763 | { |
698 | Array.Copy(data, idx, item, 0, 6); | 764 | dataItemLength = (idx + 7 == data.Length || (idx + 7 < data.Length && data[idx + 7] is bool)) ? 7 : 6; |
765 | item = new Object[dataItemLength]; | ||
766 | Array.Copy(data, idx, item, 0, dataItemLength); | ||
699 | 767 | ||
700 | ListenerInfo info = | 768 | ListenerInfo info = |
701 | ListenerInfo.FromData(localID, itemID, hostID, item); | 769 | ListenerInfo.FromData(localID, itemID, hostID, item); |
@@ -707,7 +775,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
707 | m_listeners[(int)item[2]].Add(info); | 775 | m_listeners[(int)item[2]].Add(info); |
708 | } | 776 | } |
709 | 777 | ||
710 | idx+=6; | 778 | idx+=dataItemLength; |
711 | } | 779 | } |
712 | } | 780 | } |
713 | } | 781 | } |
@@ -723,19 +791,33 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
723 | private UUID m_id; // ID to filter messages from | 791 | private UUID m_id; // ID to filter messages from |
724 | private string m_name; // Object name to filter messages from | 792 | private string m_name; // Object name to filter messages from |
725 | private string m_message; // The message | 793 | private string m_message; // The message |
794 | private int m_regexBitfield; // The regex bitfield | ||
726 | 795 | ||
727 | public ListenerInfo(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, UUID id, string message) | 796 | public ListenerInfo(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, UUID id, string message) |
728 | { | 797 | { |
729 | Initialise(handle, localID, ItemID, hostID, channel, name, id, message); | 798 | Initialise(handle, localID, ItemID, hostID, channel, name, id, |
799 | message, 0); | ||
800 | } | ||
801 | |||
802 | public ListenerInfo(int handle, uint localID, UUID ItemID, | ||
803 | UUID hostID, int channel, string name, UUID id, | ||
804 | string message, int regexBitfield) | ||
805 | { | ||
806 | Initialise(handle, localID, ItemID, hostID, channel, name, id, | ||
807 | message, regexBitfield); | ||
730 | } | 808 | } |
731 | 809 | ||
732 | public ListenerInfo(ListenerInfo li, string name, UUID id, string message) | 810 | public ListenerInfo(ListenerInfo li, string name, UUID id, string message) |
733 | { | 811 | { |
734 | Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message); | 812 | Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message, 0); |
813 | } | ||
814 | |||
815 | public ListenerInfo(ListenerInfo li, string name, UUID id, string message, int regexBitfield) | ||
816 | { | ||
817 | Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID, li.m_channel, name, id, message, regexBitfield); | ||
735 | } | 818 | } |
736 | 819 | ||
737 | private void Initialise(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, | 820 | private void Initialise(int handle, uint localID, UUID ItemID, UUID hostID, int channel, string name, UUID id, string message, int regexBitfield) |
738 | UUID id, string message) | ||
739 | { | 821 | { |
740 | m_active = true; | 822 | m_active = true; |
741 | m_handle = handle; | 823 | m_handle = handle; |
@@ -746,11 +828,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
746 | m_name = name; | 828 | m_name = name; |
747 | m_id = id; | 829 | m_id = id; |
748 | m_message = message; | 830 | m_message = message; |
831 | m_regexBitfield = regexBitfield; | ||
749 | } | 832 | } |
750 | 833 | ||
751 | public Object[] GetSerializationData() | 834 | public Object[] GetSerializationData() |
752 | { | 835 | { |
753 | Object[] data = new Object[6]; | 836 | Object[] data = new Object[7]; |
754 | 837 | ||
755 | data[0] = m_active; | 838 | data[0] = m_active; |
756 | data[1] = m_handle; | 839 | data[1] = m_handle; |
@@ -758,16 +841,19 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
758 | data[3] = m_name; | 841 | data[3] = m_name; |
759 | data[4] = m_id; | 842 | data[4] = m_id; |
760 | data[5] = m_message; | 843 | data[5] = m_message; |
844 | data[6] = m_regexBitfield; | ||
761 | 845 | ||
762 | return data; | 846 | return data; |
763 | } | 847 | } |
764 | 848 | ||
765 | public static ListenerInfo FromData(uint localID, UUID ItemID, UUID hostID, Object[] data) | 849 | public static ListenerInfo FromData(uint localID, UUID ItemID, UUID hostID, Object[] data) |
766 | { | 850 | { |
767 | ListenerInfo linfo = new ListenerInfo((int)data[1], localID, | 851 | ListenerInfo linfo = new ListenerInfo((int)data[1], localID, ItemID, hostID, (int)data[2], (string)data[3], (UUID)data[4], (string)data[5]); |
768 | ItemID, hostID, (int)data[2], (string)data[3], | 852 | linfo.m_active = (bool)data[0]; |
769 | (UUID)data[4], (string)data[5]); | 853 | if (data.Length >= 7) |
770 | linfo.m_active=(bool)data[0]; | 854 | { |
855 | linfo.m_regexBitfield = (int)data[6]; | ||
856 | } | ||
771 | 857 | ||
772 | return linfo; | 858 | return linfo; |
773 | } | 859 | } |
@@ -826,5 +912,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
826 | { | 912 | { |
827 | return m_id; | 913 | return m_id; |
828 | } | 914 | } |
915 | |||
916 | public int GetRegexBitfield() | ||
917 | { | ||
918 | return m_regexBitfield; | ||
919 | } | ||
829 | } | 920 | } |
830 | } | 921 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs index 8d88065..66b3f3a 100644 --- a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs +++ b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs | |||
@@ -45,6 +45,14 @@ namespace OpenSim.Region.Framework.Interfaces | |||
45 | void Deactivate(); | 45 | void Deactivate(); |
46 | void Activate(); | 46 | void Activate(); |
47 | UUID GetID(); | 47 | UUID GetID(); |
48 | |||
49 | /// <summary> | ||
50 | /// Bitfield indicating which strings should be processed as regex. | ||
51 | /// 1 corresponds to IWorldCommListenerInfo::GetName() | ||
52 | /// 2 corresponds to IWorldCommListenerInfo::GetMessage() | ||
53 | /// </summary> | ||
54 | /// <returns></returns> | ||
55 | int GetRegexBitfield(); | ||
48 | } | 56 | } |
49 | 57 | ||
50 | public interface IWorldComm | 58 | public interface IWorldComm |
@@ -70,6 +78,23 @@ namespace OpenSim.Region.Framework.Interfaces | |||
70 | /// <returns>number of the scripts handle</returns> | 78 | /// <returns>number of the scripts handle</returns> |
71 | int Listen(uint LocalID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg); | 79 | int Listen(uint LocalID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg); |
72 | 80 | ||
81 | /// <summary> | ||
82 | /// Create a listen event callback with the specified filters. | ||
83 | /// The parameters localID,itemID are needed to uniquely identify | ||
84 | /// the script during 'peek' time. Parameter hostID is needed to | ||
85 | /// determine the position of the script. | ||
86 | /// </summary> | ||
87 | /// <param name="LocalID">localID of the script engine</param> | ||
88 | /// <param name="itemID">UUID of the script engine</param> | ||
89 | /// <param name="hostID">UUID of the SceneObjectPart</param> | ||
90 | /// <param name="channel">channel to listen on</param> | ||
91 | /// <param name="name">name to filter on</param> | ||
92 | /// <param name="id">key to filter on (user given, could be totally faked)</param> | ||
93 | /// <param name="msg">msg to filter on</param> | ||
94 | /// <param name="regexBitfield">Bitfield indicating which strings should be processed as regex.</param> | ||
95 | /// <returns>number of the scripts handle</returns> | ||
96 | int Listen(uint LocalID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg, int regexBitfield); | ||
97 | |||
73 | /// <summary> | 98 | /// <summary> |
74 | /// This method scans over the objects which registered an interest in listen callbacks. | 99 | /// This method scans over the objects which registered an interest in listen callbacks. |
75 | /// For everyone it finds, it checks if it fits the given filter. If it does, then | 100 | /// For everyone it finds, it checks if it fits the given filter. If it does, then |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 0650b90..828288d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -3647,5 +3647,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3647 | 3647 | ||
3648 | DropAttachmentAt(false, pos, rot); | 3648 | DropAttachmentAt(false, pos, rot); |
3649 | } | 3649 | } |
3650 | |||
3651 | public LSL_Integer osListenRegex(int channelID, string name, string ID, string msg, int regexBitfield) | ||
3652 | { | ||
3653 | CheckThreatLevel(ThreatLevel.Low, "osListenRegex"); | ||
3654 | m_host.AddScriptLPS(1); | ||
3655 | UUID keyID; | ||
3656 | UUID.TryParse(ID, out keyID); | ||
3657 | |||
3658 | // if we want the name to be used as a regular expression, ensure it is valid first. | ||
3659 | if ((regexBitfield & ScriptBaseClass.OS_LISTEN_REGEX_NAME) == ScriptBaseClass.OS_LISTEN_REGEX_NAME) | ||
3660 | { | ||
3661 | try | ||
3662 | { | ||
3663 | Regex.IsMatch("", name); | ||
3664 | } | ||
3665 | catch (Exception) | ||
3666 | { | ||
3667 | OSSLShoutError("Name regex is invalid."); | ||
3668 | return -1; | ||
3669 | } | ||
3670 | } | ||
3671 | |||
3672 | // if we want the msg to be used as a regular expression, ensure it is valid first. | ||
3673 | if ((regexBitfield & ScriptBaseClass.OS_LISTEN_REGEX_MESSAGE) == ScriptBaseClass.OS_LISTEN_REGEX_MESSAGE) | ||
3674 | { | ||
3675 | try | ||
3676 | { | ||
3677 | Regex.IsMatch("", msg); | ||
3678 | } | ||
3679 | catch (Exception) | ||
3680 | { | ||
3681 | OSSLShoutError("Message regex is invalid."); | ||
3682 | return -1; | ||
3683 | } | ||
3684 | } | ||
3685 | |||
3686 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
3687 | return (wComm == null) ? -1 : wComm.Listen( | ||
3688 | m_host.LocalId, | ||
3689 | m_item.ItemID, | ||
3690 | m_host.UUID, | ||
3691 | channelID, | ||
3692 | name, | ||
3693 | keyID, | ||
3694 | msg, | ||
3695 | regexBitfield | ||
3696 | ); | ||
3697 | } | ||
3698 | |||
3699 | public LSL_Integer osRegexIsMatch(string input, string pattern) | ||
3700 | { | ||
3701 | CheckThreatLevel(ThreatLevel.Low, "osRegexIsMatch"); | ||
3702 | m_host.AddScriptLPS(1); | ||
3703 | try | ||
3704 | { | ||
3705 | return Regex.IsMatch(input, pattern) ? 1 : 0; | ||
3706 | } | ||
3707 | catch (Exception) | ||
3708 | { | ||
3709 | OSSLShoutError("Possible invalid regular expression detected."); | ||
3710 | return 0; | ||
3711 | } | ||
3712 | } | ||
3650 | } | 3713 | } |
3651 | } | 3714 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 93188c9..cdd9ea8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -418,5 +418,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
418 | /// <param name="pos"></param> | 418 | /// <param name="pos"></param> |
419 | /// <param name="rot"></param> | 419 | /// <param name="rot"></param> |
420 | void osForceDropAttachmentAt(vector pos, rotation rot); | 420 | void osForceDropAttachmentAt(vector pos, rotation rot); |
421 | |||
422 | /// <summary> | ||
423 | /// Identical to llListen except for a bitfield which indicates which | ||
424 | /// string parameters should be parsed as regex patterns. | ||
425 | /// </summary> | ||
426 | /// <param name="channelID"></param> | ||
427 | /// <param name="name"></param> | ||
428 | /// <param name="ID"></param> | ||
429 | /// <param name="msg"></param> | ||
430 | /// <param name="regexBitfield"> | ||
431 | /// OS_LISTEN_REGEX_NAME | ||
432 | /// OS_LISTEN_REGEX_MESSAGE | ||
433 | /// </param> | ||
434 | /// <returns></returns> | ||
435 | LSL_Integer osListenRegex(int channelID, string name, string ID, | ||
436 | string msg, int regexBitfield); | ||
437 | |||
438 | /// <summary> | ||
439 | /// Wraps to bool Regex.IsMatch(string input, string pattern) | ||
440 | /// </summary> | ||
441 | /// <param name="input">string to test for match</param> | ||
442 | /// <param name="regex">string to use as pattern</param> | ||
443 | /// <returns>boolean</returns> | ||
444 | LSL_Integer osRegexIsMatch(string input, string pattern); | ||
421 | } | 445 | } |
422 | } | 446 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 62bd6b8..880841b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -716,5 +716,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
716 | public static readonly LSLInteger RCERR_UNKNOWN = -1; | 716 | public static readonly LSLInteger RCERR_UNKNOWN = -1; |
717 | public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2; | 717 | public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2; |
718 | public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 3; | 718 | public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 3; |
719 | |||
720 | /// <summary> | ||
721 | /// process name parameter as regex | ||
722 | /// </summary> | ||
723 | public const int OS_LISTEN_REGEX_NAME = 0x1; | ||
724 | |||
725 | /// <summary> | ||
726 | /// process message parameter as regex | ||
727 | /// </summary> | ||
728 | public const int OS_LISTEN_REGEX_MESSAGE = 0x2; | ||
719 | } | 729 | } |
720 | } | 730 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index dee1b28..afa9ae0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -992,5 +992,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
992 | { | 992 | { |
993 | m_OSSL_Functions.osForceDropAttachmentAt(pos, rot); | 993 | m_OSSL_Functions.osForceDropAttachmentAt(pos, rot); |
994 | } | 994 | } |
995 | |||
996 | public LSL_Integer osListenRegex(int channelID, string name, string ID, string msg, int regexBitfield) | ||
997 | { | ||
998 | return m_OSSL_Functions.osListenRegex(channelID, name, ID, msg, regexBitfield); | ||
999 | } | ||
1000 | |||
1001 | public LSL_Integer osRegexIsMatch(string input, string pattern) | ||
1002 | { | ||
1003 | return m_OSSL_Functions.osRegexIsMatch(input, pattern); | ||
1004 | } | ||
995 | } | 1005 | } |
996 | } | 1006 | } |