Enables script access to the per object dynamic attributes through the JsonStore

script functions. Adds JsonAttachObjectStore to associate a store identifier with
an object (scripts can only access the store in their host object, this could be
extended but isn't necessary for now).

Note this opens a method to the DAMap OSDMap. This will be removed later, but
greatly simplifies the code for now.

The JsonStore and these scripts are disabled by default.
user_profiles
Mic Bowman 2013-02-06 17:29:17 -08:00
parent 67d92e4e16
commit e17392acbb
5 changed files with 104 additions and 13 deletions

View File

@ -73,6 +73,14 @@ namespace OpenSim.Framework
m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml);
}
// WARNING: this is temporary for experimentation only, it will be removed!!!!
public OSDMap TopLevelMap
{
get { return m_map; }
set { m_map = value; }
}
public void ReadXml(XmlReader reader)
{
ReadXml(reader.ReadInnerXml());

View File

@ -35,6 +35,7 @@ namespace OpenSim.Region.Framework.Interfaces
public interface IJsonStoreModule
{
bool AttachObjectStore(UUID objectID);
bool CreateStore(string value, ref UUID result);
bool DestroyStore(UUID storeID);
bool TestStore(UUID storeID);

View File

@ -49,7 +49,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private OSD m_ValueStore;
protected virtual OSD ValueStore { get; set; }
protected class TakeValueCallbackClass
{
@ -108,17 +108,18 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
///
/// </summary>
// -----------------------------------------------------------------
public JsonStore() : this("") {}
public JsonStore(string value)
public JsonStore()
{
m_TakeStore = new List<TakeValueCallbackClass>();
m_ReadStore = new List<TakeValueCallbackClass>();
}
public JsonStore(string value)
{
if (String.IsNullOrEmpty(value))
m_ValueStore = new OSDMap();
ValueStore = new OSDMap();
else
m_ValueStore = OSDParser.DeserializeJson(value);
ValueStore = OSDParser.DeserializeJson(value);
}
// -----------------------------------------------------------------
@ -129,7 +130,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
public bool TestPath(string expr, bool useJson)
{
Stack<string> path = ParsePathExpression(expr);
OSD result = ProcessPathExpression(m_ValueStore,path);
OSD result = ProcessPathExpression(ValueStore,path);
if (result == null)
return false;
@ -148,7 +149,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
public bool GetValue(string expr, out string value, bool useJson)
{
Stack<string> path = ParsePathExpression(expr);
OSD result = ProcessPathExpression(m_ValueStore,path);
OSD result = ProcessPathExpression(ValueStore,path);
return ConvertOutputValue(result,out value,useJson);
}
@ -184,7 +185,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
Stack<string> path = ParsePathExpression(expr);
string pexpr = PathExpressionToKey(path);
OSD result = ProcessPathExpression(m_ValueStore,path);
OSD result = ProcessPathExpression(ValueStore,path);
if (result == null)
{
m_TakeStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback));
@ -215,7 +216,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
Stack<string> path = ParsePathExpression(expr);
string pexpr = PathExpressionToKey(path);
OSD result = ProcessPathExpression(m_ValueStore,path);
OSD result = ProcessPathExpression(ValueStore,path);
if (result == null)
{
m_ReadStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback));
@ -245,7 +246,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
Stack<string> path = ParsePathExpression(expr);
if (path.Count == 0)
{
m_ValueStore = ovalue;
ValueStore = ovalue;
return true;
}
@ -254,7 +255,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
if (pexpr != "")
pexpr += ".";
OSD result = ProcessPathExpression(m_ValueStore,path);
OSD result = ProcessPathExpression(ValueStore,path);
if (result == null)
return false;
@ -522,4 +523,41 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
return pkey;
}
}
public class JsonObjectStore : JsonStore
{
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private Scene m_scene;
private UUID m_objectID;
protected override OSD ValueStore
{
get
{
SceneObjectPart sop = m_scene.GetSceneObjectPart(m_objectID);
if (sop == null)
{
// This is bad
return null;
}
return sop.DynAttrs.TopLevelMap;
}
// cannot set the top level
set
{
m_log.InfoFormat("[JsonStore] cannot set top level value in object store");
}
}
public JsonObjectStore(Scene scene, UUID oid) : base()
{
m_scene = scene;
m_objectID = oid;
}
}
}

View File

@ -170,6 +170,34 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
#region ScriptInvocationInteface
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
public bool AttachObjectStore(UUID objectID)
{
if (! m_enabled) return false;
SceneObjectPart sop = m_scene.GetSceneObjectPart(objectID);
if (sop == null)
{
m_log.InfoFormat("[JsonStore] unable to attach to unknown object; {0}",objectID);
return false;
}
lock (m_JsonValueStore)
{
if (m_JsonValueStore.ContainsKey(objectID))
return true;
JsonStore map = new JsonObjectStore(m_scene,objectID);
m_JsonValueStore.Add(objectID,map);
}
return true;
}
// -----------------------------------------------------------------
/// <summary>
///

View File

@ -169,6 +169,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
m_comms.RegisterScriptInvocations(this);
// m_comms.RegisterScriptInvocation(this, "JsonCreateStore");
// m_comms.RegisterScriptInvocation(this, "JsonAttachObjectStore");
// m_comms.RegisterScriptInvocation(this, "JsonDestroyStore");
// m_comms.RegisterScriptInvocation(this, "JsonTestStore");
@ -214,6 +215,21 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
#endregion
#region ScriptInvocationInteface
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
[ScriptInvocation]
public UUID JsonAttachObjectStore(UUID hostID, UUID scriptID)
{
UUID uuid = UUID.Zero;
if (! m_store.AttachObjectStore(hostID))
GenerateRuntimeError("Failed to create Json store");
return hostID;
}
// -----------------------------------------------------------------
/// <summary>
///