diff options
author | David Walter Seikel | 2016-11-03 21:44:39 +1000 |
---|---|---|
committer | David Walter Seikel | 2016-11-03 21:44:39 +1000 |
commit | 134f86e8d5c414409631b25b8c6f0ee45fbd8631 (patch) | |
tree | 216b89d3fb89acfb81be1e440c25c41ab09fa96d /OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs | |
parent | More changing to production grid. Double oops. (diff) | |
download | opensim-SC-134f86e8d5c414409631b25b8c6f0ee45fbd8631.zip opensim-SC-134f86e8d5c414409631b25b8c6f0ee45fbd8631.tar.gz opensim-SC-134f86e8d5c414409631b25b8c6f0ee45fbd8631.tar.bz2 opensim-SC-134f86e8d5c414409631b25b8c6f0ee45fbd8631.tar.xz |
Initial update to OpenSim 0.8.2.1 source code.
Diffstat (limited to 'OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs')
-rw-r--r-- | OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs | 482 |
1 files changed, 396 insertions, 86 deletions
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs index 0c175ca..edf51a2 100644 --- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs | |||
@@ -39,8 +39,10 @@ using OpenMetaverse.StructuredData; | |||
39 | using OpenSim.Framework; | 39 | using OpenSim.Framework; |
40 | using OpenSim.Region.Framework.Interfaces; | 40 | using OpenSim.Region.Framework.Interfaces; |
41 | using OpenSim.Region.Framework.Scenes; | 41 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Region.Framework.Scenes.Scripting; | ||
42 | using System.Collections.Generic; | 43 | using System.Collections.Generic; |
43 | using System.Text.RegularExpressions; | 44 | using System.Text.RegularExpressions; |
45 | using PermissionMask = OpenSim.Framework.PermissionMask; | ||
44 | 46 | ||
45 | namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | 47 | namespace OpenSim.Region.OptionalModules.Scripting.JsonStore |
46 | { | 48 | { |
@@ -57,7 +59,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
57 | 59 | ||
58 | private IScriptModuleComms m_comms; | 60 | private IScriptModuleComms m_comms; |
59 | private IJsonStoreModule m_store; | 61 | private IJsonStoreModule m_store; |
60 | 62 | ||
63 | private Dictionary<UUID,HashSet<UUID>> m_scriptStores = new Dictionary<UUID,HashSet<UUID>>(); | ||
64 | |||
61 | #region Region Module interface | 65 | #region Region Module interface |
62 | 66 | ||
63 | // ----------------------------------------------------------------- | 67 | // ----------------------------------------------------------------- |
@@ -92,12 +96,12 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
92 | } | 96 | } |
93 | catch (Exception e) | 97 | catch (Exception e) |
94 | { | 98 | { |
95 | m_log.ErrorFormat("[JsonStoreScripts] initialization error: {0}",e.Message); | 99 | m_log.ErrorFormat("[JsonStoreScripts]: initialization error: {0}", e.Message); |
96 | return; | 100 | return; |
97 | } | 101 | } |
98 | 102 | ||
99 | if (m_enabled) | 103 | if (m_enabled) |
100 | m_log.DebugFormat("[JsonStoreScripts] module is enabled"); | 104 | m_log.DebugFormat("[JsonStoreScripts]: module is enabled"); |
101 | } | 105 | } |
102 | 106 | ||
103 | // ----------------------------------------------------------------- | 107 | // ----------------------------------------------------------------- |
@@ -124,6 +128,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
124 | // ----------------------------------------------------------------- | 128 | // ----------------------------------------------------------------- |
125 | public void AddRegion(Scene scene) | 129 | public void AddRegion(Scene scene) |
126 | { | 130 | { |
131 | scene.EventManager.OnScriptReset += HandleScriptReset; | ||
132 | scene.EventManager.OnRemoveScript += HandleScriptReset; | ||
127 | } | 133 | } |
128 | 134 | ||
129 | // ----------------------------------------------------------------- | 135 | // ----------------------------------------------------------------- |
@@ -132,12 +138,34 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
132 | // ----------------------------------------------------------------- | 138 | // ----------------------------------------------------------------- |
133 | public void RemoveRegion(Scene scene) | 139 | public void RemoveRegion(Scene scene) |
134 | { | 140 | { |
141 | scene.EventManager.OnScriptReset -= HandleScriptReset; | ||
142 | scene.EventManager.OnRemoveScript -= HandleScriptReset; | ||
143 | |||
135 | // need to remove all references to the scene in the subscription | 144 | // need to remove all references to the scene in the subscription |
136 | // list to enable full garbage collection of the scene object | 145 | // list to enable full garbage collection of the scene object |
137 | } | 146 | } |
138 | 147 | ||
139 | // ----------------------------------------------------------------- | 148 | // ----------------------------------------------------------------- |
140 | /// <summary> | 149 | /// <summary> |
150 | /// </summary> | ||
151 | // ----------------------------------------------------------------- | ||
152 | private void HandleScriptReset(uint localID, UUID itemID) | ||
153 | { | ||
154 | HashSet<UUID> stores; | ||
155 | |||
156 | lock (m_scriptStores) | ||
157 | { | ||
158 | if (! m_scriptStores.TryGetValue(itemID, out stores)) | ||
159 | return; | ||
160 | m_scriptStores.Remove(itemID); | ||
161 | } | ||
162 | |||
163 | foreach (UUID id in stores) | ||
164 | m_store.DestroyStore(id); | ||
165 | } | ||
166 | |||
167 | // ----------------------------------------------------------------- | ||
168 | /// <summary> | ||
141 | /// Called when all modules have been added for a region. This is | 169 | /// Called when all modules have been added for a region. This is |
142 | /// where we hook up events | 170 | /// where we hook up events |
143 | /// </summary> | 171 | /// </summary> |
@@ -150,7 +178,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
150 | m_comms = m_scene.RequestModuleInterface<IScriptModuleComms>(); | 178 | m_comms = m_scene.RequestModuleInterface<IScriptModuleComms>(); |
151 | if (m_comms == null) | 179 | if (m_comms == null) |
152 | { | 180 | { |
153 | m_log.ErrorFormat("[JsonStoreScripts] ScriptModuleComms interface not defined"); | 181 | m_log.ErrorFormat("[JsonStoreScripts]: ScriptModuleComms interface not defined"); |
154 | m_enabled = false; | 182 | m_enabled = false; |
155 | return; | 183 | return; |
156 | } | 184 | } |
@@ -158,40 +186,20 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
158 | m_store = m_scene.RequestModuleInterface<IJsonStoreModule>(); | 186 | m_store = m_scene.RequestModuleInterface<IJsonStoreModule>(); |
159 | if (m_store == null) | 187 | if (m_store == null) |
160 | { | 188 | { |
161 | m_log.ErrorFormat("[JsonStoreScripts] JsonModule interface not defined"); | 189 | m_log.ErrorFormat("[JsonStoreScripts]: JsonModule interface not defined"); |
162 | m_enabled = false; | 190 | m_enabled = false; |
163 | return; | 191 | return; |
164 | } | 192 | } |
165 | 193 | ||
166 | try | 194 | try |
167 | { | 195 | { |
168 | m_comms.RegisterScriptInvocation(this,"JsonCreateStore"); | 196 | m_comms.RegisterScriptInvocations(this); |
169 | m_comms.RegisterScriptInvocation(this,"JsonDestroyStore"); | 197 | m_comms.RegisterConstants(this); |
170 | |||
171 | m_comms.RegisterScriptInvocation(this,"JsonReadNotecard"); | ||
172 | m_comms.RegisterScriptInvocation(this,"JsonWriteNotecard"); | ||
173 | |||
174 | m_comms.RegisterScriptInvocation(this,"JsonTestPath"); | ||
175 | m_comms.RegisterScriptInvocation(this,"JsonTestPathJson"); | ||
176 | |||
177 | m_comms.RegisterScriptInvocation(this,"JsonGetValue"); | ||
178 | m_comms.RegisterScriptInvocation(this,"JsonGetValueJson"); | ||
179 | |||
180 | m_comms.RegisterScriptInvocation(this,"JsonTakeValue"); | ||
181 | m_comms.RegisterScriptInvocation(this,"JsonTakeValueJson"); | ||
182 | |||
183 | m_comms.RegisterScriptInvocation(this,"JsonReadValue"); | ||
184 | m_comms.RegisterScriptInvocation(this,"JsonReadValueJson"); | ||
185 | |||
186 | m_comms.RegisterScriptInvocation(this,"JsonSetValue"); | ||
187 | m_comms.RegisterScriptInvocation(this,"JsonSetValueJson"); | ||
188 | |||
189 | m_comms.RegisterScriptInvocation(this,"JsonRemoveValue"); | ||
190 | } | 198 | } |
191 | catch (Exception e) | 199 | catch (Exception e) |
192 | { | 200 | { |
193 | // See http://opensimulator.org/mantis/view.php?id=5971 for more information | 201 | // See http://opensimulator.org/mantis/view.php?id=5971 for more information |
194 | m_log.WarnFormat("[JsonStroreScripts] script method registration failed; {0}",e.Message); | 202 | m_log.WarnFormat("[JsonStoreScripts]: script method registration failed; {0}", e.Message); |
195 | m_enabled = false; | 203 | m_enabled = false; |
196 | } | 204 | } |
197 | } | 205 | } |
@@ -208,28 +216,73 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
208 | 216 | ||
209 | #endregion | 217 | #endregion |
210 | 218 | ||
219 | #region ScriptConstantsInterface | ||
220 | |||
221 | [ScriptConstant] | ||
222 | public static readonly int JSON_NODETYPE_UNDEF = (int)JsonStoreNodeType.Undefined; | ||
223 | |||
224 | [ScriptConstant] | ||
225 | public static readonly int JSON_NODETYPE_OBJECT = (int)JsonStoreNodeType.Object; | ||
226 | |||
227 | [ScriptConstant] | ||
228 | public static readonly int JSON_NODETYPE_ARRAY = (int)JsonStoreNodeType.Array; | ||
229 | |||
230 | [ScriptConstant] | ||
231 | public static readonly int JSON_NODETYPE_VALUE = (int)JsonStoreNodeType.Value; | ||
232 | |||
233 | [ScriptConstant] | ||
234 | public static readonly int JSON_VALUETYPE_UNDEF = (int)JsonStoreValueType.Undefined; | ||
235 | |||
236 | [ScriptConstant] | ||
237 | public static readonly int JSON_VALUETYPE_BOOLEAN = (int)JsonStoreValueType.Boolean; | ||
238 | |||
239 | [ScriptConstant] | ||
240 | public static readonly int JSON_VALUETYPE_INTEGER = (int)JsonStoreValueType.Integer; | ||
241 | |||
242 | [ScriptConstant] | ||
243 | public static readonly int JSON_VALUETYPE_FLOAT = (int)JsonStoreValueType.Float; | ||
244 | |||
245 | [ScriptConstant] | ||
246 | public static readonly int JSON_VALUETYPE_STRING = (int)JsonStoreValueType.String; | ||
247 | |||
248 | |||
249 | #endregion | ||
250 | |||
211 | #region ScriptInvocationInteface | 251 | #region ScriptInvocationInteface |
212 | // ----------------------------------------------------------------- | 252 | // ----------------------------------------------------------------- |
213 | /// <summary> | 253 | /// <summary> |
214 | /// | 254 | /// |
215 | /// </summary> | 255 | /// </summary> |
216 | // ----------------------------------------------------------------- | 256 | // ----------------------------------------------------------------- |
217 | protected void GenerateRuntimeError(string msg) | 257 | [ScriptInvocation] |
258 | public UUID JsonAttachObjectStore(UUID hostID, UUID scriptID) | ||
218 | { | 259 | { |
219 | throw new Exception("JsonStore Runtime Error: " + msg); | 260 | UUID uuid = UUID.Zero; |
261 | if (! m_store.AttachObjectStore(hostID)) | ||
262 | GenerateRuntimeError("Failed to create Json store"); | ||
263 | |||
264 | return hostID; | ||
220 | } | 265 | } |
221 | 266 | ||
222 | // ----------------------------------------------------------------- | 267 | // ----------------------------------------------------------------- |
223 | /// <summary> | 268 | /// <summary> |
224 | /// | 269 | /// |
225 | /// </summary> | 270 | /// </summary> |
226 | // ----------------------------------------------------------------- | 271 | // ----------------------------------------------------------------- |
227 | protected UUID JsonCreateStore(UUID hostID, UUID scriptID, string value) | 272 | [ScriptInvocation] |
273 | public UUID JsonCreateStore(UUID hostID, UUID scriptID, string value) | ||
228 | { | 274 | { |
229 | UUID uuid = UUID.Zero; | 275 | UUID uuid = UUID.Zero; |
230 | if (! m_store.CreateStore(value, ref uuid)) | 276 | if (! m_store.CreateStore(value, ref uuid)) |
231 | GenerateRuntimeError("Failed to create Json store"); | 277 | GenerateRuntimeError("Failed to create Json store"); |
232 | 278 | ||
279 | lock (m_scriptStores) | ||
280 | { | ||
281 | if (! m_scriptStores.ContainsKey(scriptID)) | ||
282 | m_scriptStores[scriptID] = new HashSet<UUID>(); | ||
283 | |||
284 | m_scriptStores[scriptID].Add(uuid); | ||
285 | } | ||
233 | return uuid; | 286 | return uuid; |
234 | } | 287 | } |
235 | 288 | ||
@@ -238,8 +291,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
238 | /// | 291 | /// |
239 | /// </summary> | 292 | /// </summary> |
240 | // ----------------------------------------------------------------- | 293 | // ----------------------------------------------------------------- |
241 | protected int JsonDestroyStore(UUID hostID, UUID scriptID, UUID storeID) | 294 | [ScriptInvocation] |
295 | public int JsonDestroyStore(UUID hostID, UUID scriptID, UUID storeID) | ||
242 | { | 296 | { |
297 | lock(m_scriptStores) | ||
298 | { | ||
299 | if (m_scriptStores.ContainsKey(scriptID)) | ||
300 | m_scriptStores[scriptID].Remove(storeID); | ||
301 | } | ||
302 | |||
243 | return m_store.DestroyStore(storeID) ? 1 : 0; | 303 | return m_store.DestroyStore(storeID) ? 1 : 0; |
244 | } | 304 | } |
245 | 305 | ||
@@ -248,10 +308,37 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
248 | /// | 308 | /// |
249 | /// </summary> | 309 | /// </summary> |
250 | // ----------------------------------------------------------------- | 310 | // ----------------------------------------------------------------- |
251 | protected UUID JsonReadNotecard(UUID hostID, UUID scriptID, UUID storeID, string path, UUID assetID) | 311 | [ScriptInvocation] |
312 | public int JsonTestStore(UUID hostID, UUID scriptID, UUID storeID) | ||
313 | { | ||
314 | return m_store.TestStore(storeID) ? 1 : 0; | ||
315 | } | ||
316 | |||
317 | // ----------------------------------------------------------------- | ||
318 | /// <summary> | ||
319 | /// | ||
320 | /// </summary> | ||
321 | // ----------------------------------------------------------------- | ||
322 | [ScriptInvocation] | ||
323 | public UUID JsonRezAtRoot(UUID hostID, UUID scriptID, string item, Vector3 pos, Vector3 vel, Quaternion rot, string param) | ||
324 | { | ||
325 | UUID reqID = UUID.Random(); | ||
326 | Util.FireAndForget( | ||
327 | o => DoJsonRezObject(hostID, scriptID, reqID, item, pos, vel, rot, param), null, "JsonStoreScriptModule.DoJsonRezObject"); | ||
328 | return reqID; | ||
329 | } | ||
330 | |||
331 | // ----------------------------------------------------------------- | ||
332 | /// <summary> | ||
333 | /// | ||
334 | /// </summary> | ||
335 | // ----------------------------------------------------------------- | ||
336 | [ScriptInvocation] | ||
337 | public UUID JsonReadNotecard(UUID hostID, UUID scriptID, UUID storeID, string path, string notecardIdentifier) | ||
252 | { | 338 | { |
253 | UUID reqID = UUID.Random(); | 339 | UUID reqID = UUID.Random(); |
254 | Util.FireAndForget(delegate(object o) { DoJsonReadNotecard(reqID,hostID,scriptID,storeID,path,assetID); }); | 340 | Util.FireAndForget( |
341 | o => DoJsonReadNotecard(reqID, hostID, scriptID, storeID, path, notecardIdentifier), null, "JsonStoreScriptModule.JsonReadNotecard"); | ||
255 | return reqID; | 342 | return reqID; |
256 | } | 343 | } |
257 | 344 | ||
@@ -260,10 +347,12 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
260 | /// | 347 | /// |
261 | /// </summary> | 348 | /// </summary> |
262 | // ----------------------------------------------------------------- | 349 | // ----------------------------------------------------------------- |
263 | protected UUID JsonWriteNotecard(UUID hostID, UUID scriptID, UUID storeID, string path, string name) | 350 | [ScriptInvocation] |
351 | public UUID JsonWriteNotecard(UUID hostID, UUID scriptID, UUID storeID, string path, string name) | ||
264 | { | 352 | { |
265 | UUID reqID = UUID.Random(); | 353 | UUID reqID = UUID.Random(); |
266 | Util.FireAndForget(delegate(object o) { DoJsonWriteNotecard(reqID,hostID,scriptID,storeID,path,name); }); | 354 | Util.FireAndForget( |
355 | o => DoJsonWriteNotecard(reqID,hostID,scriptID,storeID,path,name), null, "JsonStoreScriptModule.DoJsonWriteNotecard"); | ||
267 | return reqID; | 356 | return reqID; |
268 | } | 357 | } |
269 | 358 | ||
@@ -272,14 +361,41 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
272 | /// | 361 | /// |
273 | /// </summary> | 362 | /// </summary> |
274 | // ----------------------------------------------------------------- | 363 | // ----------------------------------------------------------------- |
275 | protected int JsonTestPath(UUID hostID, UUID scriptID, UUID storeID, string path) | 364 | [ScriptInvocation] |
365 | public string JsonList2Path(UUID hostID, UUID scriptID, object[] pathlist) | ||
366 | { | ||
367 | string ipath = ConvertList2Path(pathlist); | ||
368 | string opath; | ||
369 | |||
370 | if (JsonStore.CanonicalPathExpression(ipath,out opath)) | ||
371 | return opath; | ||
372 | |||
373 | // This won't parse if passed to the other routines as opposed to | ||
374 | // returning an empty string which is a valid path and would overwrite | ||
375 | // the entire store | ||
376 | return "**INVALID**"; | ||
377 | } | ||
378 | |||
379 | // ----------------------------------------------------------------- | ||
380 | /// <summary> | ||
381 | /// | ||
382 | /// </summary> | ||
383 | // ----------------------------------------------------------------- | ||
384 | [ScriptInvocation] | ||
385 | public int JsonGetNodeType(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
276 | { | 386 | { |
277 | return m_store.TestPath(storeID,path,false) ? 1 : 0; | 387 | return (int)m_store.GetNodeType(storeID,path); |
278 | } | 388 | } |
279 | 389 | ||
280 | protected int JsonTestPathJson(UUID hostID, UUID scriptID, UUID storeID, string path) | 390 | // ----------------------------------------------------------------- |
391 | /// <summary> | ||
392 | /// | ||
393 | /// </summary> | ||
394 | // ----------------------------------------------------------------- | ||
395 | [ScriptInvocation] | ||
396 | public int JsonGetValueType(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
281 | { | 397 | { |
282 | return m_store.TestPath(storeID,path,true) ? 1 : 0; | 398 | return (int)m_store.GetValueType(storeID,path); |
283 | } | 399 | } |
284 | 400 | ||
285 | // ----------------------------------------------------------------- | 401 | // ----------------------------------------------------------------- |
@@ -287,12 +403,14 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
287 | /// | 403 | /// |
288 | /// </summary> | 404 | /// </summary> |
289 | // ----------------------------------------------------------------- | 405 | // ----------------------------------------------------------------- |
290 | protected int JsonSetValue(UUID hostID, UUID scriptID, UUID storeID, string path, string value) | 406 | [ScriptInvocation] |
407 | public int JsonSetValue(UUID hostID, UUID scriptID, UUID storeID, string path, string value) | ||
291 | { | 408 | { |
292 | return m_store.SetValue(storeID,path,value,false) ? 1 : 0; | 409 | return m_store.SetValue(storeID,path,value,false) ? 1 : 0; |
293 | } | 410 | } |
294 | 411 | ||
295 | protected int JsonSetValueJson(UUID hostID, UUID scriptID, UUID storeID, string path, string value) | 412 | [ScriptInvocation] |
413 | public int JsonSetJson(UUID hostID, UUID scriptID, UUID storeID, string path, string value) | ||
296 | { | 414 | { |
297 | return m_store.SetValue(storeID,path,value,true) ? 1 : 0; | 415 | return m_store.SetValue(storeID,path,value,true) ? 1 : 0; |
298 | } | 416 | } |
@@ -302,7 +420,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
302 | /// | 420 | /// |
303 | /// </summary> | 421 | /// </summary> |
304 | // ----------------------------------------------------------------- | 422 | // ----------------------------------------------------------------- |
305 | protected int JsonRemoveValue(UUID hostID, UUID scriptID, UUID storeID, string path) | 423 | [ScriptInvocation] |
424 | public int JsonRemoveValue(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
306 | { | 425 | { |
307 | return m_store.RemoveValue(storeID,path) ? 1 : 0; | 426 | return m_store.RemoveValue(storeID,path) ? 1 : 0; |
308 | } | 427 | } |
@@ -312,14 +431,27 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
312 | /// | 431 | /// |
313 | /// </summary> | 432 | /// </summary> |
314 | // ----------------------------------------------------------------- | 433 | // ----------------------------------------------------------------- |
315 | protected string JsonGetValue(UUID hostID, UUID scriptID, UUID storeID, string path) | 434 | [ScriptInvocation] |
435 | public int JsonGetArrayLength(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
436 | { | ||
437 | return m_store.GetArrayLength(storeID,path); | ||
438 | } | ||
439 | |||
440 | // ----------------------------------------------------------------- | ||
441 | /// <summary> | ||
442 | /// | ||
443 | /// </summary> | ||
444 | // ----------------------------------------------------------------- | ||
445 | [ScriptInvocation] | ||
446 | public string JsonGetValue(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
316 | { | 447 | { |
317 | string value = String.Empty; | 448 | string value = String.Empty; |
318 | m_store.GetValue(storeID,path,false,out value); | 449 | m_store.GetValue(storeID,path,false,out value); |
319 | return value; | 450 | return value; |
320 | } | 451 | } |
321 | 452 | ||
322 | protected string JsonGetValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) | 453 | [ScriptInvocation] |
454 | public string JsonGetJson(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
323 | { | 455 | { |
324 | string value = String.Empty; | 456 | string value = String.Empty; |
325 | m_store.GetValue(storeID,path,true, out value); | 457 | m_store.GetValue(storeID,path,true, out value); |
@@ -331,80 +463,109 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
331 | /// | 463 | /// |
332 | /// </summary> | 464 | /// </summary> |
333 | // ----------------------------------------------------------------- | 465 | // ----------------------------------------------------------------- |
334 | protected UUID JsonTakeValue(UUID hostID, UUID scriptID, UUID storeID, string path) | 466 | [ScriptInvocation] |
467 | public UUID JsonTakeValue(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
335 | { | 468 | { |
336 | UUID reqID = UUID.Random(); | 469 | UUID reqID = UUID.Random(); |
337 | Util.FireAndForget(delegate(object o) { DoJsonTakeValue(scriptID,reqID,storeID,path,false); }); | 470 | Util.FireAndForget( |
471 | o => DoJsonTakeValue(scriptID,reqID,storeID,path,false), null, "JsonStoreScriptModule.DoJsonTakeValue"); | ||
338 | return reqID; | 472 | return reqID; |
339 | } | 473 | } |
340 | 474 | ||
341 | protected UUID JsonTakeValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) | 475 | [ScriptInvocation] |
476 | public UUID JsonTakeValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
342 | { | 477 | { |
343 | UUID reqID = UUID.Random(); | 478 | UUID reqID = UUID.Random(); |
344 | Util.FireAndForget(delegate(object o) { DoJsonTakeValue(scriptID,reqID,storeID,path,true); }); | 479 | Util.FireAndForget( |
480 | o => DoJsonTakeValue(scriptID,reqID,storeID,path,true), null, "JsonStoreScriptModule.DoJsonTakeValueJson"); | ||
345 | return reqID; | 481 | return reqID; |
346 | } | 482 | } |
347 | 483 | ||
348 | private void DoJsonTakeValue(UUID scriptID, UUID reqID, UUID storeID, string path, bool useJson) | ||
349 | { | ||
350 | try | ||
351 | { | ||
352 | m_store.TakeValue(storeID,path,useJson,delegate(string value) { DispatchValue(scriptID,reqID,value); }); | ||
353 | return; | ||
354 | } | ||
355 | catch (Exception e) | ||
356 | { | ||
357 | m_log.InfoFormat("[JsonStoreScripts] unable to retrieve value; {0}",e.ToString()); | ||
358 | } | ||
359 | |||
360 | DispatchValue(scriptID,reqID,String.Empty); | ||
361 | } | ||
362 | |||
363 | |||
364 | // ----------------------------------------------------------------- | 484 | // ----------------------------------------------------------------- |
365 | /// <summary> | 485 | /// <summary> |
366 | /// | 486 | /// |
367 | /// </summary> | 487 | /// </summary> |
368 | // ----------------------------------------------------------------- | 488 | // ----------------------------------------------------------------- |
369 | protected UUID JsonReadValue(UUID hostID, UUID scriptID, UUID storeID, string path) | 489 | [ScriptInvocation] |
490 | public UUID JsonReadValue(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
370 | { | 491 | { |
371 | UUID reqID = UUID.Random(); | 492 | UUID reqID = UUID.Random(); |
372 | Util.FireAndForget(delegate(object o) { DoJsonReadValue(scriptID,reqID,storeID,path,false); }); | 493 | Util.FireAndForget( |
494 | o => DoJsonReadValue(scriptID,reqID,storeID,path,false), null, "JsonStoreScriptModule.DoJsonReadValue"); | ||
373 | return reqID; | 495 | return reqID; |
374 | } | 496 | } |
375 | 497 | ||
376 | protected UUID JsonReadValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) | 498 | [ScriptInvocation] |
499 | public UUID JsonReadValueJson(UUID hostID, UUID scriptID, UUID storeID, string path) | ||
377 | { | 500 | { |
378 | UUID reqID = UUID.Random(); | 501 | UUID reqID = UUID.Random(); |
379 | Util.FireAndForget(delegate(object o) { DoJsonReadValue(scriptID,reqID,storeID,path,true); }); | 502 | Util.FireAndForget( |
503 | o => DoJsonReadValue(scriptID,reqID,storeID,path,true), null, "JsonStoreScriptModule.DoJsonReadValueJson"); | ||
380 | return reqID; | 504 | return reqID; |
381 | } | 505 | } |
382 | 506 | ||
383 | private void DoJsonReadValue(UUID scriptID, UUID reqID, UUID storeID, string path, bool useJson) | 507 | #endregion |
508 | |||
509 | // ----------------------------------------------------------------- | ||
510 | /// <summary> | ||
511 | /// | ||
512 | /// </summary> | ||
513 | // ----------------------------------------------------------------- | ||
514 | protected void GenerateRuntimeError(string msg) | ||
515 | { | ||
516 | m_log.InfoFormat("[JsonStore] runtime error: {0}",msg); | ||
517 | throw new Exception("JsonStore Runtime Error: " + msg); | ||
518 | } | ||
519 | |||
520 | // ----------------------------------------------------------------- | ||
521 | /// <summary> | ||
522 | /// | ||
523 | /// </summary> | ||
524 | // ----------------------------------------------------------------- | ||
525 | protected void DispatchValue(UUID scriptID, UUID reqID, string value) | ||
526 | { | ||
527 | m_comms.DispatchReply(scriptID,1,value,reqID.ToString()); | ||
528 | } | ||
529 | |||
530 | // ----------------------------------------------------------------- | ||
531 | /// <summary> | ||
532 | /// | ||
533 | /// </summary> | ||
534 | // ----------------------------------------------------------------- | ||
535 | private void DoJsonTakeValue(UUID scriptID, UUID reqID, UUID storeID, string path, bool useJson) | ||
384 | { | 536 | { |
385 | try | 537 | try |
386 | { | 538 | { |
387 | m_store.ReadValue(storeID,path,useJson,delegate(string value) { DispatchValue(scriptID,reqID,value); }); | 539 | m_store.TakeValue(storeID,path,useJson,delegate(string value) { DispatchValue(scriptID,reqID,value); }); |
388 | return; | 540 | return; |
389 | } | 541 | } |
390 | catch (Exception e) | 542 | catch (Exception e) |
391 | { | 543 | { |
392 | m_log.InfoFormat("[JsonStoreScripts] unable to retrieve value; {0}",e.ToString()); | 544 | m_log.InfoFormat("[JsonStoreScripts]: unable to retrieve value; {0}",e.ToString()); |
393 | } | 545 | } |
394 | 546 | ||
395 | DispatchValue(scriptID,reqID,String.Empty); | 547 | DispatchValue(scriptID,reqID,String.Empty); |
396 | } | 548 | } |
397 | 549 | ||
398 | #endregion | ||
399 | 550 | ||
400 | // ----------------------------------------------------------------- | 551 | // ----------------------------------------------------------------- |
401 | /// <summary> | 552 | /// <summary> |
402 | /// | 553 | /// |
403 | /// </summary> | 554 | /// </summary> |
404 | // ----------------------------------------------------------------- | 555 | // ----------------------------------------------------------------- |
405 | protected void DispatchValue(UUID scriptID, UUID reqID, string value) | 556 | private void DoJsonReadValue(UUID scriptID, UUID reqID, UUID storeID, string path, bool useJson) |
406 | { | 557 | { |
407 | m_comms.DispatchReply(scriptID,1,value,reqID.ToString()); | 558 | try |
559 | { | ||
560 | m_store.ReadValue(storeID,path,useJson,delegate(string value) { DispatchValue(scriptID,reqID,value); }); | ||
561 | return; | ||
562 | } | ||
563 | catch (Exception e) | ||
564 | { | ||
565 | m_log.InfoFormat("[JsonStoreScripts]: unable to retrieve value; {0}",e.ToString()); | ||
566 | } | ||
567 | |||
568 | DispatchValue(scriptID,reqID,String.Empty); | ||
408 | } | 569 | } |
409 | 570 | ||
410 | // ----------------------------------------------------------------- | 571 | // ----------------------------------------------------------------- |
@@ -412,31 +573,44 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
412 | /// | 573 | /// |
413 | /// </summary> | 574 | /// </summary> |
414 | // ----------------------------------------------------------------- | 575 | // ----------------------------------------------------------------- |
415 | private void DoJsonReadNotecard(UUID reqID, UUID hostID, UUID scriptID, UUID storeID, string path, UUID assetID) | 576 | private void DoJsonReadNotecard( |
577 | UUID reqID, UUID hostID, UUID scriptID, UUID storeID, string path, string notecardIdentifier) | ||
416 | { | 578 | { |
579 | UUID assetID; | ||
580 | |||
581 | if (!UUID.TryParse(notecardIdentifier, out assetID)) | ||
582 | { | ||
583 | SceneObjectPart part = m_scene.GetSceneObjectPart(hostID); | ||
584 | assetID = ScriptUtils.GetAssetIdFromItemName(part, notecardIdentifier, (int)AssetType.Notecard); | ||
585 | } | ||
586 | |||
417 | AssetBase a = m_scene.AssetService.Get(assetID.ToString()); | 587 | AssetBase a = m_scene.AssetService.Get(assetID.ToString()); |
418 | if (a == null) | 588 | if (a == null) |
419 | GenerateRuntimeError(String.Format("Unable to find notecard asset {0}",assetID)); | 589 | GenerateRuntimeError(String.Format("Unable to find notecard asset {0}", assetID)); |
420 | 590 | ||
421 | if (a.Type != (sbyte)AssetType.Notecard) | 591 | if (a.Type != (sbyte)AssetType.Notecard) |
422 | GenerateRuntimeError(String.Format("Invalid notecard asset {0}",assetID)); | 592 | GenerateRuntimeError(String.Format("Invalid notecard asset {0}", assetID)); |
423 | 593 | ||
424 | m_log.DebugFormat("[JsonStoreScripts] read notecard in context {0}",storeID); | 594 | m_log.DebugFormat("[JsonStoreScripts]: read notecard in context {0}",storeID); |
425 | 595 | ||
426 | try | 596 | try |
427 | { | 597 | { |
428 | string jsondata = SLUtil.ParseNotecardToString(Encoding.UTF8.GetString(a.Data)); | 598 | string jsondata = SLUtil.ParseNotecardToString(a.Data); |
429 | int result = m_store.SetValue(storeID, path, jsondata,true) ? 1 : 0; | 599 | int result = m_store.SetValue(storeID, path, jsondata,true) ? 1 : 0; |
430 | m_comms.DispatchReply(scriptID,result, "", reqID.ToString()); | 600 | m_comms.DispatchReply(scriptID, result, "", reqID.ToString()); |
431 | return; | 601 | return; |
432 | } | 602 | } |
603 | catch(SLUtil.NotANotecardFormatException e) | ||
604 | { | ||
605 | m_log.WarnFormat("[JsonStoreScripts]: Notecard parsing failed; assetId {0} at line number {1}", assetID.ToString(), e.lineNumber); | ||
606 | } | ||
433 | catch (Exception e) | 607 | catch (Exception e) |
434 | { | 608 | { |
435 | m_log.WarnFormat("[JsonStoreScripts] Json parsing failed; {0}",e.Message); | 609 | m_log.WarnFormat("[JsonStoreScripts]: Json parsing failed; {0}", e.Message); |
436 | } | 610 | } |
437 | 611 | ||
438 | GenerateRuntimeError(String.Format("Json parsing failed for {0}",assetID.ToString())); | 612 | GenerateRuntimeError(String.Format("Json parsing failed for {0}", assetID)); |
439 | m_comms.DispatchReply(scriptID,0,"",reqID.ToString()); | 613 | m_comms.DispatchReply(scriptID, 0, "", reqID.ToString()); |
440 | } | 614 | } |
441 | 615 | ||
442 | // ----------------------------------------------------------------- | 616 | // ----------------------------------------------------------------- |
@@ -494,5 +668,141 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore | |||
494 | 668 | ||
495 | m_comms.DispatchReply(scriptID,1,assetID.ToString(),reqID.ToString()); | 669 | m_comms.DispatchReply(scriptID,1,assetID.ToString(),reqID.ToString()); |
496 | } | 670 | } |
671 | |||
672 | // ----------------------------------------------------------------- | ||
673 | /// <summary> | ||
674 | /// Convert a list of values that are path components to a single string path | ||
675 | /// </summary> | ||
676 | // ----------------------------------------------------------------- | ||
677 | protected static Regex m_ArrayPattern = new Regex("^([0-9]+|\\+)$"); | ||
678 | private string ConvertList2Path(object[] pathlist) | ||
679 | { | ||
680 | string path = ""; | ||
681 | for (int i = 0; i < pathlist.Length; i++) | ||
682 | { | ||
683 | string token = ""; | ||
684 | |||
685 | if (pathlist[i] is string) | ||
686 | { | ||
687 | token = pathlist[i].ToString(); | ||
688 | |||
689 | // Check to see if this is a bare number which would not be a valid | ||
690 | // identifier otherwise | ||
691 | if (m_ArrayPattern.IsMatch(token)) | ||
692 | token = '[' + token + ']'; | ||
693 | } | ||
694 | else if (pathlist[i] is int) | ||
695 | { | ||
696 | token = "[" + pathlist[i].ToString() + "]"; | ||
697 | } | ||
698 | else | ||
699 | { | ||
700 | token = "." + pathlist[i].ToString() + "."; | ||
701 | } | ||
702 | |||
703 | path += token + "."; | ||
704 | } | ||
705 | |||
706 | return path; | ||
707 | } | ||
708 | |||
709 | // ----------------------------------------------------------------- | ||
710 | /// <summary> | ||
711 | /// | ||
712 | /// </summary> | ||
713 | // ----------------------------------------------------------------- | ||
714 | private void DoJsonRezObject(UUID hostID, UUID scriptID, UUID reqID, string name, Vector3 pos, Vector3 vel, Quaternion rot, string param) | ||
715 | { | ||
716 | if (Double.IsNaN(rot.X) || Double.IsNaN(rot.Y) || Double.IsNaN(rot.Z) || Double.IsNaN(rot.W)) | ||
717 | { | ||
718 | GenerateRuntimeError("Invalid rez rotation"); | ||
719 | return; | ||
720 | } | ||
721 | |||
722 | SceneObjectGroup host = m_scene.GetSceneObjectGroup(hostID); | ||
723 | if (host == null) | ||
724 | { | ||
725 | GenerateRuntimeError(String.Format("Unable to find rezzing host '{0}'",hostID)); | ||
726 | return; | ||
727 | } | ||
728 | |||
729 | // hpos = host.RootPart.GetWorldPosition() | ||
730 | // float dist = (float)llVecDist(hpos, pos); | ||
731 | // if (dist > m_ScriptDistanceFactor * 10.0f) | ||
732 | // return; | ||
733 | |||
734 | TaskInventoryItem item = host.RootPart.Inventory.GetInventoryItem(name); | ||
735 | if (item == null) | ||
736 | { | ||
737 | GenerateRuntimeError(String.Format("Unable to find object to rez '{0}'",name)); | ||
738 | return; | ||
739 | } | ||
740 | |||
741 | if (item.InvType != (int)InventoryType.Object) | ||
742 | { | ||
743 | GenerateRuntimeError("Can't create requested object; object is missing from database"); | ||
744 | return; | ||
745 | } | ||
746 | |||
747 | List<SceneObjectGroup> objlist; | ||
748 | List<Vector3> veclist; | ||
749 | |||
750 | bool success = host.RootPart.Inventory.GetRezReadySceneObjects(item, out objlist, out veclist); | ||
751 | if (! success) | ||
752 | { | ||
753 | GenerateRuntimeError("Failed to create object"); | ||
754 | return; | ||
755 | } | ||
756 | |||
757 | int totalPrims = 0; | ||
758 | foreach (SceneObjectGroup group in objlist) | ||
759 | totalPrims += group.PrimCount; | ||
760 | |||
761 | if (! m_scene.Permissions.CanRezObject(totalPrims, item.OwnerID, pos)) | ||
762 | { | ||
763 | GenerateRuntimeError("Not allowed to create the object"); | ||
764 | return; | ||
765 | } | ||
766 | |||
767 | if (! m_scene.Permissions.BypassPermissions()) | ||
768 | { | ||
769 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
770 | host.RootPart.Inventory.RemoveInventoryItem(item.ItemID); | ||
771 | } | ||
772 | |||
773 | for (int i = 0; i < objlist.Count; i++) | ||
774 | { | ||
775 | SceneObjectGroup group = objlist[i]; | ||
776 | Vector3 curpos = pos + veclist[i]; | ||
777 | |||
778 | if (group.IsAttachment == false && group.RootPart.Shape.State != 0) | ||
779 | { | ||
780 | group.RootPart.AttachedPos = group.AbsolutePosition; | ||
781 | group.RootPart.Shape.LastAttachPoint = (byte)group.AttachmentPoint; | ||
782 | } | ||
783 | |||
784 | group.FromPartID = host.RootPart.UUID; | ||
785 | m_scene.AddNewSceneObject(group, true, curpos, rot, vel); | ||
786 | |||
787 | UUID storeID = group.UUID; | ||
788 | if (! m_store.CreateStore(param, ref storeID)) | ||
789 | { | ||
790 | GenerateRuntimeError("Unable to create jsonstore for new object"); | ||
791 | continue; | ||
792 | } | ||
793 | |||
794 | // We can only call this after adding the scene object, since the scene object references the scene | ||
795 | // to find out if scripts should be activated at all. | ||
796 | group.RootPart.SetDieAtEdge(true); | ||
797 | group.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 3); | ||
798 | group.ResumeScripts(); | ||
799 | |||
800 | group.ScheduleGroupForFullUpdate(); | ||
801 | |||
802 | // send the reply back to the host object, use the integer param to indicate the number | ||
803 | // of remaining objects | ||
804 | m_comms.DispatchReply(scriptID, objlist.Count-i-1, group.RootPart.UUID.ToString(), reqID.ToString()); | ||
805 | } | ||
806 | } | ||
497 | } | 807 | } |
498 | } | 808 | } |