diff options
author | Dr Scofield | 2008-09-18 16:53:26 +0000 |
---|---|---|
committer | Dr Scofield | 2008-09-18 16:53:26 +0000 |
commit | 0dff3f2383593dedee9c5b2e8d8668a8ad0ce6d0 (patch) | |
tree | 446e13c296397ea90bf3ba2ffabd8dcdfa6e2932 /OpenSim | |
parent | Update svn properties, minor formatting cleanup. (diff) | |
download | opensim-SC-0dff3f2383593dedee9c5b2e8d8668a8ad0ce6d0.zip opensim-SC-0dff3f2383593dedee9c5b2e8d8668a8ad0ce6d0.tar.gz opensim-SC-0dff3f2383593dedee9c5b2e8d8668a8ad0ce6d0.tar.bz2 opensim-SC-0dff3f2383593dedee9c5b2e8d8668a8ad0ce6d0.tar.xz |
From: Robert Smart (SMARTROB@uk.ibm.com)
Patch for new scripting method osParseJSON.
also, a couple of warning bugs killed.
Diffstat (limited to 'OpenSim')
5 files changed, 202 insertions, 8 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index b77676c..1c108b7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -139,7 +139,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
139 | if (m_host.ParentGroup != null) | 139 | if (m_host.ParentGroup != null) |
140 | return new List<SceneObjectPart>(m_host.ParentGroup.Children.Values); | 140 | return new List<SceneObjectPart>(m_host.ParentGroup.Children.Values); |
141 | return ret; | 141 | return ret; |
142 | break; | 142 | |
143 | case ScriptBaseClass.LINK_ROOT: | 143 | case ScriptBaseClass.LINK_ROOT: |
144 | if (m_host.ParentGroup != null) | 144 | if (m_host.ParentGroup != null) |
145 | { | 145 | { |
@@ -148,7 +148,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
148 | return ret; | 148 | return ret; |
149 | } | 149 | } |
150 | return ret; | 150 | return ret; |
151 | break; | 151 | |
152 | case ScriptBaseClass.LINK_ALL_OTHERS: | 152 | case ScriptBaseClass.LINK_ALL_OTHERS: |
153 | if (m_host.ParentGroup == null) | 153 | if (m_host.ParentGroup == null) |
154 | return new List<SceneObjectPart>(); | 154 | return new List<SceneObjectPart>(); |
@@ -156,7 +156,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
156 | if (ret.Contains(m_host)) | 156 | if (ret.Contains(m_host)) |
157 | ret.Remove(m_host); | 157 | ret.Remove(m_host); |
158 | return ret; | 158 | return ret; |
159 | break; | 159 | |
160 | case ScriptBaseClass.LINK_ALL_CHILDREN: | 160 | case ScriptBaseClass.LINK_ALL_CHILDREN: |
161 | if (m_host.ParentGroup == null) | 161 | if (m_host.ParentGroup == null) |
162 | return new List<SceneObjectPart>(); | 162 | return new List<SceneObjectPart>(); |
@@ -164,10 +164,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
164 | if (ret.Contains(m_host.ParentGroup.RootPart)) | 164 | if (ret.Contains(m_host.ParentGroup.RootPart)) |
165 | ret.Remove(m_host.ParentGroup.RootPart); | 165 | ret.Remove(m_host.ParentGroup.RootPart); |
166 | return ret; | 166 | return ret; |
167 | break; | 167 | |
168 | case ScriptBaseClass.LINK_THIS: | 168 | case ScriptBaseClass.LINK_THIS: |
169 | return ret; | 169 | return ret; |
170 | break; | 170 | |
171 | default: | 171 | default: |
172 | if (linkType < 0 || m_host.ParentGroup == null) | 172 | if (linkType < 0 || m_host.ParentGroup == null) |
173 | return new List<SceneObjectPart>(); | 173 | return new List<SceneObjectPart>(); |
@@ -177,7 +177,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
177 | ret = new List<SceneObjectPart>(); | 177 | ret = new List<SceneObjectPart>(); |
178 | ret.Add(target); | 178 | ret.Add(target); |
179 | return ret; | 179 | return ret; |
180 | break; | 180 | |
181 | } | 181 | } |
182 | } | 182 | } |
183 | 183 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 5cc58e7..7404640 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -25,6 +25,7 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | using System; | 27 | using System; |
28 | using System.Collections; | ||
28 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
29 | using System.Runtime.Remoting.Lifetime; | 30 | using System.Runtime.Remoting.Lifetime; |
30 | using OpenMetaverse; | 31 | using OpenMetaverse; |
@@ -730,5 +731,191 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
730 | 731 | ||
731 | World.ParcelMediaSetTime((float)time); | 732 | World.ParcelMediaSetTime((float)time); |
732 | } | 733 | } |
734 | |||
735 | |||
736 | |||
737 | public Hashtable osParseJSON(string JSON) | ||
738 | { | ||
739 | if (!m_OSFunctionsEnabled) | ||
740 | { | ||
741 | OSSLError("osParseJSON: permission denied"); | ||
742 | return null; | ||
743 | } | ||
744 | |||
745 | CheckThreatLevel(ThreatLevel.None, "osParseJSON"); | ||
746 | |||
747 | m_host.AddScriptLPS(1); | ||
748 | |||
749 | // see http://www.json.org/ for more details on JSON | ||
750 | |||
751 | string currentKey=null; | ||
752 | Stack objectStack = new Stack(); // objects in JSON can be nested so we need to keep a track of this | ||
753 | Hashtable jsondata = new Hashtable(); // the hashtable to be returned | ||
754 | |||
755 | try | ||
756 | { | ||
757 | |||
758 | // iterate through the serialised stream of tokens and store at the right depth in the hashtable | ||
759 | // the top level hashtable may contain more nested hashtables within it each containing an objects representation | ||
760 | for (int i=0;i<JSON.Length; i++) | ||
761 | { | ||
762 | |||
763 | // Console.WriteLine(""+JSON[i]); | ||
764 | switch(JSON[i]) | ||
765 | { | ||
766 | case '{': | ||
767 | // create hashtable and add it to the stack or array if we are populating one, we can have a lot of nested objects in JSON | ||
768 | |||
769 | Hashtable currentObject = new Hashtable(); | ||
770 | if(objectStack.Count==0) // the stack should only be empty for the first outer object | ||
771 | { | ||
772 | |||
773 | objectStack.Push(jsondata); | ||
774 | } | ||
775 | else if(objectStack.Peek().ToString()=="System.Collections.ArrayList") | ||
776 | { | ||
777 | // add it to the parent array | ||
778 | ((ArrayList)objectStack.Peek()).Add(currentObject); | ||
779 | objectStack.Push(currentObject); | ||
780 | } | ||
781 | else | ||
782 | { | ||
783 | // add it to the parent hashtable | ||
784 | ((Hashtable)objectStack.Peek()).Add(currentKey,currentObject); | ||
785 | objectStack.Push(currentObject); | ||
786 | } | ||
787 | |||
788 | // clear the key | ||
789 | currentKey=null; | ||
790 | break; | ||
791 | case '}': | ||
792 | // pop the hashtable off the stack | ||
793 | objectStack.Pop(); | ||
794 | break; | ||
795 | case '"':// string boundary | ||
796 | |||
797 | string tokenValue=""; | ||
798 | i++; // move to next char | ||
799 | |||
800 | // just loop through until the next quote mark storing the string | ||
801 | while(JSON[i]!='"') | ||
802 | { | ||
803 | tokenValue+=JSON[i++]; | ||
804 | } | ||
805 | |||
806 | // ok we've got a string, if we've got an array on the top of the stack then we store it | ||
807 | if(objectStack.Peek().ToString()=="System.Collections.ArrayList") | ||
808 | { | ||
809 | ((ArrayList)objectStack.Peek()).Add(tokenValue); | ||
810 | } | ||
811 | else if(currentKey==null) // no key stored and its not an array this must be a key so store it | ||
812 | { | ||
813 | currentKey = tokenValue; | ||
814 | } | ||
815 | else | ||
816 | { | ||
817 | // we have a key so lets store this value | ||
818 | ((Hashtable)objectStack.Peek()).Add(currentKey,tokenValue); | ||
819 | // now lets clear the key, we're done with it and moving on | ||
820 | currentKey=null; | ||
821 | } | ||
822 | |||
823 | break; | ||
824 | case ':':// key : value separator | ||
825 | // just ignore | ||
826 | break; | ||
827 | case ' ':// spaces | ||
828 | // just ignore | ||
829 | break; | ||
830 | case '[': // array start | ||
831 | ArrayList currentArray = new ArrayList(); | ||
832 | |||
833 | if(objectStack.Peek().ToString()=="System.Collections.ArrayList") | ||
834 | { | ||
835 | ((ArrayList)objectStack.Peek()).Add(currentArray); | ||
836 | } | ||
837 | else | ||
838 | { | ||
839 | ((Hashtable)objectStack.Peek()).Add(currentKey,currentArray); | ||
840 | // clear the key | ||
841 | currentKey=null; | ||
842 | } | ||
843 | objectStack.Push(currentArray); | ||
844 | |||
845 | break; | ||
846 | case ',':// seperator | ||
847 | // just ignore | ||
848 | break; | ||
849 | case ']'://Array end | ||
850 | // pop the array off the stack | ||
851 | objectStack.Pop(); | ||
852 | break; | ||
853 | case 't': // we've found a character start not in quotes, it must be a boolean true | ||
854 | |||
855 | if(objectStack.Peek().ToString()=="System.Collections.ArrayList") | ||
856 | { | ||
857 | ((ArrayList)objectStack.Peek()).Add(true); | ||
858 | } | ||
859 | else | ||
860 | { | ||
861 | ((Hashtable)objectStack.Peek()).Add(currentKey,true); | ||
862 | } | ||
863 | |||
864 | //advance the counter to the letter 'e' | ||
865 | i = i+3; | ||
866 | break; | ||
867 | case 'f': // we've found a character start not in quotes, it must be a boolean false | ||
868 | |||
869 | if(objectStack.Peek().ToString()=="System.Collections.ArrayList") | ||
870 | { | ||
871 | ((ArrayList)objectStack.Peek()).Add(false); | ||
872 | } | ||
873 | else | ||
874 | { | ||
875 | ((Hashtable)objectStack.Peek()).Add(currentKey,false); | ||
876 | } | ||
877 | //advance the counter to the letter 'e' | ||
878 | i = i+4; | ||
879 | break; | ||
880 | |||
881 | default: | ||
882 | // ok here we're catching all numeric types int,double,long we might want to spit these up mr accurately | ||
883 | // but for now we'll just do them as strings | ||
884 | |||
885 | string numberValue=""; | ||
886 | |||
887 | // just loop through until the next known marker quote mark storing the string | ||
888 | while(JSON[i] != '"' && JSON[i] != ',' && JSON[i] != ']' && JSON[i] != '}' && JSON[i] != ' ') | ||
889 | { | ||
890 | numberValue+=""+JSON[i++]; | ||
891 | } | ||
892 | |||
893 | i--; // we want to process this caracter that marked the end of this string in the main loop | ||
894 | |||
895 | // ok we've got a string, if we've got an array on the top of the stack then we store it | ||
896 | if(objectStack.Peek().ToString()=="System.Collections.ArrayList") | ||
897 | { | ||
898 | ((ArrayList)objectStack.Peek()).Add(numberValue); | ||
899 | } | ||
900 | else | ||
901 | { | ||
902 | // we have a key so lets store this value | ||
903 | ((Hashtable)objectStack.Peek()).Add(currentKey,numberValue); | ||
904 | // now lets clear the key, we're done with it and moving on | ||
905 | currentKey=null; | ||
906 | } | ||
907 | |||
908 | break; | ||
909 | } | ||
910 | } | ||
911 | } | ||
912 | catch(Exception) | ||
913 | { | ||
914 | OSSLError("osParseJSON: The JSON string is not valid " + JSON); | ||
915 | } | ||
916 | |||
917 | return jsondata; | ||
918 | } | ||
919 | |||
733 | } | 920 | } |
734 | } | 921 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index d4bb8c3..9dd4a45 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -24,7 +24,7 @@ | |||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | using System.Collections; | |
28 | namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | 28 | namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces |
29 | { | 29 | { |
30 | public interface IOSSL_Api | 30 | public interface IOSSL_Api |
@@ -71,5 +71,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
71 | 71 | ||
72 | string osGetScriptEngineName(); | 72 | string osGetScriptEngineName(); |
73 | void osSetParcelMediaTime(double time); | 73 | void osSetParcelMediaTime(double time); |
74 | Hashtable osParseJSON(string JSON); | ||
75 | |||
74 | } | 76 | } |
75 | } | 77 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 3a7c14e..de11d06 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -219,5 +219,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
219 | { | 219 | { |
220 | m_OSSL_Functions.osSetParcelMediaTime(time); | 220 | m_OSSL_Functions.osSetParcelMediaTime(time); |
221 | } | 221 | } |
222 | |||
223 | public Hashtable osParseJSON(string JSON) | ||
224 | { | ||
225 | return m_OSSL_Functions.osParseJSON(JSON); | ||
226 | } | ||
222 | } | 227 | } |
223 | } | 228 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index dd1bfaa..71bdd6e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -474,7 +474,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
474 | if (data.EventName == "control") | 474 | if (data.EventName == "control") |
475 | { | 475 | { |
476 | int held = ((LSL_Types.LSLInteger)data.Params[1]).value; | 476 | int held = ((LSL_Types.LSLInteger)data.Params[1]).value; |
477 | int changed= ((LSL_Types.LSLInteger)data.Params[2]).value; | 477 | // int changed = ((LSL_Types.LSLInteger)data.Params[2]).value; |
478 | 478 | ||
479 | // If the last message was a 0 (nothing held) | 479 | // If the last message was a 0 (nothing held) |
480 | // and this one is also nothing held, drop it | 480 | // and this one is also nothing held, drop it |