Merge branch 'master' into careminster

avinationmerge
Melanie 2013-02-14 07:45:23 +00:00
commit 9d55a2298d
5 changed files with 175 additions and 15 deletions

View File

@ -31,6 +31,16 @@ using OpenMetaverse;
namespace OpenSim.Region.Framework.Interfaces namespace OpenSim.Region.Framework.Interfaces
{ {
// these could be expanded at some point to provide more type information
// for now value accounts for all base types
public enum JsonStoreNodeType
{
Undefined = 0,
Object = 1,
Array = 2,
Value = 3
}
public delegate void TakeValueCallback(string s); public delegate void TakeValueCallback(string s);
public interface IJsonStoreModule public interface IJsonStoreModule
@ -38,13 +48,18 @@ namespace OpenSim.Region.Framework.Interfaces
bool AttachObjectStore(UUID objectID); bool AttachObjectStore(UUID objectID);
bool CreateStore(string value, ref UUID result); bool CreateStore(string value, ref UUID result);
bool DestroyStore(UUID storeID); bool DestroyStore(UUID storeID);
JsonStoreNodeType PathType(UUID storeID, string path);
bool TestStore(UUID storeID); bool TestStore(UUID storeID);
bool TestPath(UUID storeID, string path, bool useJson); bool TestPath(UUID storeID, string path, bool useJson);
bool SetValue(UUID storeID, string path, string value, bool useJson); bool SetValue(UUID storeID, string path, string value, bool useJson);
bool RemoveValue(UUID storeID, string path); bool RemoveValue(UUID storeID, string path);
bool GetValue(UUID storeID, string path, bool useJson, out string value); bool GetValue(UUID storeID, string path, bool useJson, out string value);
void TakeValue(UUID storeID, string path, bool useJson, TakeValueCallback cback); void TakeValue(UUID storeID, string path, bool useJson, TakeValueCallback cback);
void ReadValue(UUID storeID, string path, bool useJson, TakeValueCallback cback); void ReadValue(UUID storeID, string path, bool useJson, TakeValueCallback cback);
int ArrayLength(UUID storeID, string path);
} }
} }

View File

@ -68,14 +68,11 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
protected List<TakeValueCallbackClass> m_TakeStore; protected List<TakeValueCallbackClass> m_TakeStore;
protected List<TakeValueCallbackClass> m_ReadStore; protected List<TakeValueCallbackClass> m_ReadStore;
// add separators for quoted paths // add separators for quoted paths and array references
protected static Regex m_ParsePassOne = new Regex("{[^}]+}"); protected static Regex m_ParsePassOne = new Regex("({[^}]+}|\\[[0-9]+\\]|\\[\\+\\])");
// add separators for array references
protected static Regex m_ParsePassTwo = new Regex("(\\[[0-9]+\\]|\\[\\+\\])");
// add quotes to bare identifiers which are limited to alphabetic characters // add quotes to bare identifiers which are limited to alphabetic characters
protected static Regex m_ParsePassThree = new Regex("\\.([a-zA-Z]+)"); protected static Regex m_ParsePassThree = new Regex("(?<!{[^}]*)\\.([a-zA-Z]+)(?=\\.)");
// remove extra separator characters // remove extra separator characters
protected static Regex m_ParsePassFour = new Regex("\\.+"); protected static Regex m_ParsePassFour = new Regex("\\.+");
@ -84,7 +81,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
protected static Regex m_ValidatePath = new Regex("^\\.(({[^}]+}|\\[[0-9]+\\]|\\[\\+\\])\\.)*$"); protected static Regex m_ValidatePath = new Regex("^\\.(({[^}]+}|\\[[0-9]+\\]|\\[\\+\\])\\.)*$");
// expression used to match path components // expression used to match path components
protected static Regex m_PathComponent = new Regex("\\.({[^}]+}|\\[[0-9]+\\]|\\[\\+\\]+)"); protected static Regex m_PathComponent = new Regex("\\.({[^}]+}|\\[[0-9]+\\]|\\[\\+\\])");
// extract the internals of an array reference // extract the internals of an array reference
protected static Regex m_SimpleArrayPattern = new Regex("\\[([0-9]+)\\]"); protected static Regex m_SimpleArrayPattern = new Regex("\\[([0-9]+)\\]");
@ -143,6 +140,34 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
ValueStore = OSDParser.DeserializeJson(value); ValueStore = OSDParser.DeserializeJson(value);
} }
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
public JsonStoreNodeType PathType(string expr)
{
Stack<string> path;
if (! ParsePathExpression(expr,out path))
return JsonStoreNodeType.Undefined;
OSD result = ProcessPathExpression(ValueStore,path);
if (result == null)
return JsonStoreNodeType.Undefined;
if (result is OSDMap)
return JsonStoreNodeType.Object;
if (result is OSDArray)
return JsonStoreNodeType.Array;
if (OSDBaseType(result.Type))
return JsonStoreNodeType.Value;
return JsonStoreNodeType.Undefined;
}
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/// <summary> /// <summary>
/// ///
@ -165,6 +190,27 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
return false; return false;
} }
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
public int ArrayLength(string expr)
{
Stack<string> path;
if (! ParsePathExpression(expr,out path))
return -1;
OSD result = ProcessPathExpression(ValueStore,path);
if (result != null && result.Type == OSDType.Array)
{
OSDArray arr = result as OSDArray;
return arr.Count;
}
return -1;
}
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/// <summary> /// <summary>
/// ///
@ -465,11 +511,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
// add front and rear separators // add front and rear separators
expr = "." + expr + "."; expr = "." + expr + ".";
// add separators for quoted exprs // add separators for quoted exprs and array references
expr = m_ParsePassOne.Replace(expr,".$0.",-1,0); expr = m_ParsePassOne.Replace(expr,".$1.",-1,0);
// add separators for array references
expr = m_ParsePassTwo.Replace(expr,".$0.",-1,0);
// add quotes to bare identifier // add quotes to bare identifier
expr = m_ParsePassThree.Replace(expr,".{$1}",-1,0); expr = m_ParsePassThree.Replace(expr,".{$1}",-1,0);

View File

@ -265,6 +265,38 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
return m_JsonValueStore.ContainsKey(storeID); return m_JsonValueStore.ContainsKey(storeID);
} }
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
public JsonStoreNodeType PathType(UUID storeID, string path)
{
if (! m_enabled) return JsonStoreNodeType.Undefined;
JsonStore map = null;
lock (m_JsonValueStore)
{
if (! m_JsonValueStore.TryGetValue(storeID,out map))
{
m_log.InfoFormat("[JsonStore] Missing store {0}",storeID);
return JsonStoreNodeType.Undefined;
}
}
try
{
lock (map)
return map.PathType(path);
}
catch (Exception e)
{
m_log.Error(string.Format("[JsonStore]: Path test failed for {0} in {1}", path, storeID), e);
}
return JsonStoreNodeType.Undefined;
}
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/// <summary> /// <summary>
/// ///
@ -370,6 +402,37 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
return false; return false;
} }
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
public int ArrayLength(UUID storeID, string path)
{
if (! m_enabled) return -1;
JsonStore map = null;
lock (m_JsonValueStore)
{
if (! m_JsonValueStore.TryGetValue(storeID,out map))
return -1;
}
try
{
lock (map)
{
return map.ArrayLength(path);
}
}
catch (Exception e)
{
m_log.Error("[JsonStore]: unable to retrieve value", e);
}
return -1;
}
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/// <summary> /// <summary>
/// ///

View File

@ -167,6 +167,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
try try
{ {
m_comms.RegisterScriptInvocations(this); m_comms.RegisterScriptInvocations(this);
m_comms.RegisterConstants(this);
// m_comms.RegisterScriptInvocation(this, "JsonCreateStore"); // m_comms.RegisterScriptInvocation(this, "JsonCreateStore");
// m_comms.RegisterScriptInvocation(this, "JsonAttachObjectStore"); // m_comms.RegisterScriptInvocation(this, "JsonAttachObjectStore");
@ -214,6 +215,22 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
#endregion #endregion
#region ScriptConstantInteface
[ScriptConstant]
public static readonly int JSONTYPEUNDEF = (int)JsonStoreNodeType.Undefined;
[ScriptConstant]
public static readonly int JSONTYPEOBJECT = (int)JsonStoreNodeType.Object;
[ScriptConstant]
public static readonly int JSONTYPEARRAY = (int)JsonStoreNodeType.Array;
[ScriptConstant]
public static readonly int JSONTYPEVALUE = (int)JsonStoreNodeType.Value;
#endregion
#region ScriptInvocationInteface #region ScriptInvocationInteface
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/// <summary> /// <summary>
@ -318,6 +335,12 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
/// ///
/// </summary> /// </summary>
// ----------------------------------------------------------------- // -----------------------------------------------------------------
[ScriptInvocation]
public int JsonPathType(UUID hostID, UUID scriptID, UUID storeID, string path)
{
return (int)m_store.PathType(storeID,path);
}
[ScriptInvocation] [ScriptInvocation]
public int JsonTestPath(UUID hostID, UUID scriptID, UUID storeID, string path) public int JsonTestPath(UUID hostID, UUID scriptID, UUID storeID, string path)
{ {
@ -358,6 +381,17 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
return m_store.RemoveValue(storeID,path) ? 1 : 0; return m_store.RemoveValue(storeID,path) ? 1 : 0;
} }
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
[ScriptInvocation]
public int JsonArrayLength(UUID hostID, UUID scriptID, UUID storeID, string path)
{
return m_store.ArrayLength(storeID,path);
}
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/// <summary> /// <summary>
/// ///

View File

@ -4888,6 +4888,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
} }
} }
if (pushAllowed) if (pushAllowed)
{ {
float distance = (PusheePos - m_host.AbsolutePosition).Length(); float distance = (PusheePos - m_host.AbsolutePosition).Length();
@ -4917,17 +4918,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
applied_linear_impulse *= scaling_factor; applied_linear_impulse *= scaling_factor;
} }
if (pusheeIsAvatar) if (pusheeIsAvatar)
{ {
if (pusheeav != null) if (pusheeav != null)
{ {
if (pusheeav.PhysicsActor != null) PhysicsActor pa = pusheeav.PhysicsActor;
if (pa != null)
{ {
if (local != 0) if (local != 0)
{ {
applied_linear_impulse *= m_host.GetWorldRotation(); applied_linear_impulse *= m_host.GetWorldRotation();
} }
pusheeav.PhysicsActor.AddForce(applied_linear_impulse, true);
pa.AddForce(applied_linear_impulse, true);
} }
} }
} }