Merge branch 'master' of ssh://opensimulator.org/var/git/opensim

user_profiles
BlueWall 2013-03-05 15:30:54 -05:00
commit f676408e2a
34 changed files with 708 additions and 259 deletions

View File

@ -85,16 +85,26 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
if (modulesConfig == null)
modulesConfig = m_openSim.ConfigSource.Source.AddConfig("Modules");
Dictionary<RuntimeAddin, IList<int>> loadedModules = new Dictionary<RuntimeAddin, IList<int>>();
// Scan modules and load all that aren't disabled
foreach (TypeExtensionNode node in
AddinManager.GetExtensionNodes("/OpenSim/RegionModules"))
{
IList<int> loadedModuleData;
if (!loadedModules.ContainsKey(node.Addin))
loadedModules.Add(node.Addin, new List<int> { 0, 0, 0 });
loadedModuleData = loadedModules[node.Addin];
if (node.Type.GetInterface(typeof(ISharedRegionModule).ToString()) != null)
{
if (CheckModuleEnabled(node, modulesConfig))
{
m_log.DebugFormat("[REGIONMODULES]: Found shared region module {0}, class {1}", node.Id, node.Type);
m_sharedModules.Add(node);
loadedModuleData[0]++;
}
}
else if (node.Type.GetInterface(typeof(INonSharedRegionModule).ToString()) != null)
@ -103,14 +113,26 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
{
m_log.DebugFormat("[REGIONMODULES]: Found non-shared region module {0}, class {1}", node.Id, node.Type);
m_nonSharedModules.Add(node);
loadedModuleData[1]++;
}
}
else
{
m_log.DebugFormat("[REGIONMODULES]: Found unknown type of module {0}, class {1}", node.Id, node.Type);
m_log.WarnFormat("[REGIONMODULES]: Found unknown type of module {0}, class {1}", node.Id, node.Type);
loadedModuleData[2]++;
}
}
foreach (KeyValuePair<RuntimeAddin, IList<int>> loadedModuleData in loadedModules)
{
m_log.InfoFormat(
"[REGIONMODULES]: From plugin {0}, (version {1}), loaded {2} modules, {3} shared, {4} non-shared {5} unknown",
loadedModuleData.Key.Id,
loadedModuleData.Key.Version,
loadedModuleData.Value[0] + loadedModuleData.Value[1] + loadedModuleData.Value[2],
loadedModuleData.Value[0], loadedModuleData.Value[1], loadedModuleData.Value[2]);
}
// Load and init the module. We try a constructor with a port
// if a port was given, fall back to one without if there is
// no port or the more specific constructor fails.

View File

@ -108,6 +108,7 @@ namespace OpenSim.Framework.Servers.HttpServer
private int _bufferLength;
private bool _closing;
private bool _upgraded;
private int _maxPayloadBytes = 41943040;
private const string HandshakeAcceptText =
"HTTP/1.1 101 Switching Protocols\r\n" +
@ -195,6 +196,15 @@ namespace OpenSim.Framework.Servers.HttpServer
HandshakeAndUpgrade();
}
/// <summary>
/// Max Payload Size in bytes. Defaults to 40MB, but could be set upon connection before calling handshake and upgrade.
/// </summary>
public int MaxPayloadSize
{
get { return _maxPayloadBytes; }
set { _maxPayloadBytes = value; }
}
/// <summary>
/// This triggers the websocket start the upgrade process
/// </summary>
@ -367,7 +377,12 @@ namespace OpenSim.Framework.Servers.HttpServer
if (headerread)
{
_socketState.FrameComplete = false;
if (pheader.PayloadLen > (ulong) _maxPayloadBytes)
{
Close("Invalid Payload size");
return;
}
if (pheader.PayloadLen > 0)
{
if ((int) pheader.PayloadLen > _bufferPosition - offset)

View File

@ -134,6 +134,10 @@ namespace OpenSim
/// <param name="configSource"></param>
public OpenSimBase(IConfigSource configSource) : base()
{
// FIXME: This should be done down in ServerBase but we need to sort out and refactor the log4net
// XmlConfigurator calls first accross servers.
m_log.InfoFormat("[SERVER BASE]: Starting in {0}", m_startupDirectory);
LoadConfigSettings(configSource);
}

View File

@ -57,7 +57,6 @@ namespace OpenSim.Region.ClientStack.Linden
public bool Enabled { get; private set; }
private Scene m_scene;
private UUID m_agentID;
#region ISharedRegionModule Members
@ -118,25 +117,26 @@ namespace OpenSim.Region.ClientStack.Linden
public void RegisterCaps(UUID agentID, Caps caps)
{
IRequestHandler reqHandler
= new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), MeshUploadFlag, "MeshUploadFlag", agentID.ToString());
= new RestHTTPHandler(
"GET", "/CAPS/" + UUID.Random(), ht => MeshUploadFlag(ht, agentID), "MeshUploadFlag", agentID.ToString());
caps.RegisterHandler("MeshUploadFlag", reqHandler);
m_agentID = agentID;
}
private Hashtable MeshUploadFlag(Hashtable mDhttpMethod)
private Hashtable MeshUploadFlag(Hashtable mDhttpMethod, UUID agentID)
{
// m_log.DebugFormat("[MESH UPLOAD FLAG MODULE]: MeshUploadFlag request");
OSDMap data = new OSDMap();
ScenePresence sp = m_scene.GetScenePresence(m_agentID);
ScenePresence sp = m_scene.GetScenePresence(agentID);
data["username"] = sp.Firstname + "." + sp.Lastname;
data["display_name_next_update"] = new OSDDate(DateTime.Now);
data["legacy_first_name"] = sp.Firstname;
data["mesh_upload_status"] = "valid";
data["display_name"] = sp.Firstname + " " + sp.Lastname;
data["legacy_last_name"] = sp.Lastname;
data["id"] = m_agentID;
data["id"] = agentID;
data["is_display_name_default"] = true;
//Send back data

View File

@ -790,7 +790,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
handshake.RegionInfo3.ColoName = Utils.EmptyBytes;
handshake.RegionInfo3.ProductName = Util.StringToBytes256(regionInfo.RegionType);
handshake.RegionInfo3.ProductSKU = Utils.EmptyBytes;
handshake.RegionInfo4 = new RegionHandshakePacket.RegionInfo4Block[0];
OutPacket(handshake, ThrottleOutPacketType.Task);
}
@ -3571,6 +3572,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
avp.Sender.IsTrial = false;
avp.Sender.ID = agentID;
avp.AppearanceData = new AvatarAppearancePacket.AppearanceDataBlock[0];
//m_log.DebugFormat("[CLIENT]: Sending appearance for {0} to {1}", agentID.ToString(), AgentId.ToString());
OutPacket(avp, ThrottleOutPacketType.Task);
}
@ -4192,7 +4194,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
pack.Stat = stats.StatsBlock;
pack.Header.Reliable = false;
pack.RegionInfo = new SimStatsPacket.RegionInfoBlock[0];
OutPacket(pack, ThrottleOutPacketType.Task);
}

View File

@ -156,9 +156,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
public void Initialise(IConfigSource config)
{
IConfig myConfig = config.Configs["Startup"];
string permissionModules = myConfig.GetString("permissionmodules", "DefaultPermissionsModule");
string permissionModules = Util.GetConfigVarFromSections<string>(config, "permissionmodules",
new string[] { "Startup", "Permissions" }, "DefaultPermissionsModule");
List<string> modules = new List<string>(permissionModules.Split(','));
@ -167,26 +166,34 @@ namespace OpenSim.Region.CoreModules.World.Permissions
m_Enabled = true;
m_allowGridGods = myConfig.GetBoolean("allow_grid_gods", false);
m_bypassPermissions = !myConfig.GetBoolean("serverside_object_permissions", true);
m_propagatePermissions = myConfig.GetBoolean("propagate_permissions", true);
m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true);
m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false);
m_ParcelOwnerIsGod = myConfig.GetBoolean("parcel_owner_is_god", true);
m_allowGridGods = Util.GetConfigVarFromSections<bool>(config, "allow_grid_gods",
new string[] { "Startup", "Permissions" }, false);
m_bypassPermissions = !Util.GetConfigVarFromSections<bool>(config, "serverside_object_permissions",
new string[] { "Startup", "Permissions" }, true);
m_propagatePermissions = Util.GetConfigVarFromSections<bool>(config, "propagate_permissions",
new string[] { "Startup", "Permissions" }, true);
m_RegionOwnerIsGod = Util.GetConfigVarFromSections<bool>(config, "region_owner_is_god",
new string[] { "Startup", "Permissions" }, true);
m_RegionManagerIsGod = Util.GetConfigVarFromSections<bool>(config, "region_manager_is_god",
new string[] { "Startup", "Permissions" }, false);
m_ParcelOwnerIsGod = Util.GetConfigVarFromSections<bool>(config, "parcel_owner_is_god",
new string[] { "Startup", "Permissions" }, true);
m_SimpleBuildPermissions = myConfig.GetBoolean("simple_build_permissions", false);
m_SimpleBuildPermissions = Util.GetConfigVarFromSections<bool>(config, "simple_build_permissions",
new string[] { "Startup", "Permissions" }, false);
m_allowedScriptCreators
= ParseUserSetConfigSetting(myConfig, "allowed_script_creators", m_allowedScriptCreators);
= ParseUserSetConfigSetting(config, "allowed_script_creators", m_allowedScriptCreators);
m_allowedScriptEditors
= ParseUserSetConfigSetting(myConfig, "allowed_script_editors", m_allowedScriptEditors);
= ParseUserSetConfigSetting(config, "allowed_script_editors", m_allowedScriptEditors);
if (m_bypassPermissions)
m_log.Info("[PERMISSIONS]: serverside_object_permissions = false in ini file so disabling all region service permission checks");
else
m_log.Debug("[PERMISSIONS]: Enabling all region service permission checks");
string grant = myConfig.GetString("GrantLSL", "");
string grant = Util.GetConfigVarFromSections<string>(config, "GrantLSL",
new string[] { "Startup", "Permissions" }, string.Empty);
if (grant.Length > 0)
{
foreach (string uuidl in grant.Split(','))
@ -196,7 +203,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
}
}
grant = myConfig.GetString("GrantCS", "");
grant = Util.GetConfigVarFromSections<string>(config, "GrantCS",
new string[] { "Startup", "Permissions" }, string.Empty);
if (grant.Length > 0)
{
foreach (string uuidl in grant.Split(','))
@ -206,7 +214,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
}
}
grant = myConfig.GetString("GrantVB", "");
grant = Util.GetConfigVarFromSections<string>(config, "GrantVB",
new string[] { "Startup", "Permissions" }, string.Empty);
if (grant.Length > 0)
{
foreach (string uuidl in grant.Split(','))
@ -216,7 +225,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
}
}
grant = myConfig.GetString("GrantJS", "");
grant = Util.GetConfigVarFromSections<string>(config, "GrantJS",
new string[] { "Startup", "Permissions" }, string.Empty);
if (grant.Length > 0)
{
foreach (string uuidl in grant.Split(','))
@ -226,7 +236,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
}
}
grant = myConfig.GetString("GrantYP", "");
grant = Util.GetConfigVarFromSections<string>(config, "GrantYP",
new string[] { "Startup", "Permissions" }, string.Empty);
if (grant.Length > 0)
{
foreach (string uuidl in grant.Split(','))
@ -464,11 +475,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions
/// <param name="settingName"></param>
/// <param name="defaultValue">The default value for this attribute</param>
/// <returns>The parsed value</returns>
private static UserSet ParseUserSetConfigSetting(IConfig config, string settingName, UserSet defaultValue)
private static UserSet ParseUserSetConfigSetting(IConfigSource config, string settingName, UserSet defaultValue)
{
UserSet userSet = defaultValue;
string rawSetting = config.GetString(settingName, defaultValue.ToString());
string rawSetting = Util.GetConfigVarFromSections<string>(config, settingName,
new string[] {"Startup", "Permissions"}, defaultValue.ToString());
// Temporary measure to allow 'gods' to be specified in config for consistency's sake. In the long term
// this should disappear.

View File

@ -148,8 +148,6 @@ namespace OpenSim.Region.DataSnapshot
return;
}
if (m_enabled)
m_snapStore = new SnapshotStore(m_snapsDir, m_gridinfo, m_listener_port, m_hostname);
}
}
@ -163,8 +161,22 @@ namespace OpenSim.Region.DataSnapshot
m_log.DebugFormat("[DATASNAPSHOT]: Module added to Scene {0}.", scene.RegionInfo.RegionName);
m_snapStore.AddScene(scene);
if (!m_servicesNotified)
{
m_hostname = scene.RegionInfo.ExternalHostName;
m_snapStore = new SnapshotStore(m_snapsDir, m_gridinfo, m_listener_port, m_hostname);
//Hand it the first scene, assuming that all scenes have the same BaseHTTPServer
new DataRequestHandler(scene, this);
if (m_dataServices != "" && m_dataServices != "noservices")
NotifyDataServices(m_dataServices, "online");
m_servicesNotified = true;
}
m_scenes.Add(scene);
m_snapStore.AddScene(scene);
Assembly currentasm = Assembly.GetExecutingAssembly();
@ -189,22 +201,6 @@ namespace OpenSim.Region.DataSnapshot
}
}
// Must be done here because on shared modules, PostInitialise() will run
// BEFORE any scenes are registered. There is no "all scenes have been loaded"
// kind of callback because scenes may be created dynamically, so we cannot
// have that info, ever.
if (!m_servicesNotified)
{
//Hand it the first scene, assuming that all scenes have the same BaseHTTPServer
new DataRequestHandler(m_scenes[0], this);
m_hostname = m_scenes[0].RegionInfo.ExternalHostName;
if (m_dataServices != "" && m_dataServices != "noservices")
NotifyDataServices(m_dataServices, "online");
m_servicesNotified = true;
}
}
public void RemoveRegion(Scene scene)

View File

@ -932,7 +932,12 @@ namespace OpenSim.Region.Framework.Scenes
}
}
string grant = startupConfig.GetString("AllowedClients", String.Empty);
string[] possibleAccessControlConfigSections = new string[] { "AccessControl", "Startup" };
string grant
= Util.GetConfigVarFromSections<string>(
config, "AllowedClients", possibleAccessControlConfigSections, "");
if (grant.Length > 0)
{
foreach (string viewer in grant.Split('|'))
@ -941,7 +946,10 @@ namespace OpenSim.Region.Framework.Scenes
}
}
grant = startupConfig.GetString("BannedClients", String.Empty);
grant
= Util.GetConfigVarFromSections<string>(
config, "BannedClients", possibleAccessControlConfigSections, "");
if (grant.Length > 0)
{
foreach (string viewer in grant.Split('|'))

View File

@ -130,7 +130,7 @@ namespace OpenSim.Region.Framework.Tests
SceneObjectPart sop1 = sog1.RootPart;
TaskInventoryItem sopItem1
= TaskInventoryHelpers.AddNotecard(
scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900));
scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
InventoryFolderBase folder
= InventoryArchiveUtils.FindFoldersByPath(scene.InventoryService, user1.PrincipalID, "Objects")[0];
@ -162,7 +162,7 @@ namespace OpenSim.Region.Framework.Tests
SceneObjectPart sop1 = sog1.RootPart;
TaskInventoryItem sopItem1
= TaskInventoryHelpers.AddNotecard(
scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900));
scene, sop1, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
// Perform test
scene.MoveTaskInventoryItem(user1.PrincipalID, UUID.Zero, sop1, sopItem1.ItemID);

View File

@ -76,7 +76,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
if (m_console != null)
{
m_console.AddCommand("TempATtachModule", false, "set auto_grant_attach_perms", "set auto_grant_attach_perms true|false", "Allow objects owned by the region owner os estate managers to obtain attach permissions without asking the user", SetAutoGrantAttachPerms);
m_console.AddCommand("TempAttachModule", false, "set auto_grant_attach_perms", "set auto_grant_attach_perms true|false", "Allow objects owned by the region owner or estate managers to obtain attach permissions without asking the user", SetAutoGrantAttachPerms);
}
}
else

View File

@ -33,10 +33,11 @@ using Nini.Config;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
// You will need to uncomment this line if you are adding a region module to some other assembly which does not already
// You will need to uncomment these lines if you are adding a region module to some other assembly which does not already
// specify its assembly. Otherwise, the region modules in the assembly will not be picked up when OpenSimulator scans
// the available DLLs
//[assembly: Addin("MyModule", "1.0")]
//[assembly: AddinDependency("OpenSim", "0.5")]
namespace OpenSim.Region.OptionalModules.Example.BareBonesNonShared
{

View File

@ -33,10 +33,11 @@ using Nini.Config;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
// You will need to uncomment this line if you are adding a region module to some other assembly which does not already
// You will need to uncomment these lines if you are adding a region module to some other assembly which does not already
// specify its assembly. Otherwise, the region modules in the assembly will not be picked up when OpenSimulator scans
// the available DLLs
//[assembly: Addin("MyModule", "1.0")]
//[assembly: AddinDependency("OpenSim", "0.5")]
namespace OpenSim.Region.OptionalModules.Example.BareBonesShared
{

View File

@ -45,6 +45,7 @@ namespace OpenSim.Region.OptionalModules.WebSocketEchoModule
public class WebSocketEchoModule : ISharedRegionModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private bool enabled;
public string Name { get { return "WebSocketEchoModule"; } }
@ -55,9 +56,9 @@ namespace OpenSim.Region.OptionalModules.WebSocketEchoModule
public void Initialise(IConfigSource pConfig)
{
enabled =(pConfig.Configs["WebSocketEcho"] != null);
if (enabled)
m_log.DebugFormat("[WebSocketEchoModule]: INITIALIZED MODULE");
enabled = (pConfig.Configs["WebSocketEcho"] != null);
// if (enabled)
// m_log.DebugFormat("[WebSocketEchoModule]: INITIALIZED MODULE");
}
/// <summary>
@ -158,17 +159,17 @@ namespace OpenSim.Region.OptionalModules.WebSocketEchoModule
public void AddRegion(Scene scene)
{
m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} ADDED", scene.RegionInfo.RegionName);
// m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} ADDED", scene.RegionInfo.RegionName);
}
public void RemoveRegion(Scene scene)
{
m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
// m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
}
public void RegionLoaded(Scene scene)
{
m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} LOADED", scene.RegionInfo.RegionName);
// m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} LOADED", scene.RegionInfo.RegionName);
}
}
}

View File

@ -57,9 +57,10 @@ namespace OpenSim.Region.OptionalModules
public void Initialise(IConfigSource config)
{
IConfig myConfig = config.Configs["Startup"];
//IConfig myConfig = config.Configs["Startup"];
string permissionModules = myConfig.GetString("permissionmodules", "DefaultPermissionsModule");
string permissionModules = Util.GetConfigVarFromSections<string>(config, "permissionmodules",
new string[] { "Startup", "Permissions" }, "DefaultPermissionsModule");
List<string> modules=new List<string>(permissionModules.Split(','));

View File

@ -961,13 +961,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// ==================================================================
// Clamp high or low velocities
float newVelocityLengthSq = VehicleVelocity.LengthSquared();
if (newVelocityLengthSq > BSParam.VehicleMaxLinearVelocitySq)
if (newVelocityLengthSq > BSParam.VehicleMaxLinearVelocitySquared)
{
Vector3 origVelW = VehicleVelocity; // DEBUG DEBUG
VehicleVelocity /= VehicleVelocity.Length();
VehicleVelocity *= BSParam.VehicleMaxLinearVelocity;
VDetailLog("{0}, MoveLinear,clampMax,origVelW={1},lenSq={2},maxVelSq={3},,newVelW={4}",
Prim.LocalID, origVelW, newVelocityLengthSq, BSParam.VehicleMaxLinearVelocitySq, VehicleVelocity);
Prim.LocalID, origVelW, newVelocityLengthSq, BSParam.VehicleMaxLinearVelocitySquared, VehicleVelocity);
}
else if (newVelocityLengthSq < 0.001f)
VehicleVelocity = Vector3.Zero;

View File

@ -47,12 +47,16 @@ public static class BSParam
public static float SculptLOD { get; private set; }
public static int CrossingFailuresBeforeOutOfBounds { get; private set; }
public static float UpdateVelocityChangeThreshold { get; private set; }
public static float MinimumObjectMass { get; private set; }
public static float MaximumObjectMass { get; private set; }
public static float MaxLinearVelocity { get; private set; }
public static float MaxLinearVelocitySquared { get; private set; }
public static float MaxAngularVelocity { get; private set; }
public static float MaxAngularVelocitySquared { get; private set; }
public static float MaxAddForceMagnitude { get; private set; }
public static float MaxAddForceMagnitudeSquared { get; private set; }
public static float DensityScaleFactor { get; private set; }
public static float LinearDamping { get; private set; }
@ -109,7 +113,7 @@ public static class BSParam
// Vehicle parameters
public static float VehicleMaxLinearVelocity { get; private set; }
public static float VehicleMaxLinearVelocitySq { get; private set; }
public static float VehicleMaxLinearVelocitySquared { get; private set; }
public static float VehicleMaxAngularVelocity { get; private set; }
public static float VehicleMaxAngularVelocitySq { get; private set; }
public static float VehicleAngularDamping { get; private set; }
@ -265,7 +269,7 @@ public static class BSParam
// The single letter parameters for the delegates are:
// s = BSScene
// o = BSPhysObject
// v = value (float)
// v = value (appropriate type)
private static ParameterDefnBase[] ParameterDefinitions =
{
new ParameterDefn<bool>("MeshSculptedPrim", "Whether to create meshes for sculpties",
@ -289,6 +293,10 @@ public static class BSParam
5,
(s) => { return CrossingFailuresBeforeOutOfBounds; },
(s,v) => { CrossingFailuresBeforeOutOfBounds = v; } ),
new ParameterDefn<float>("UpdateVelocityChangeThreshold", "Change in updated velocity required before reporting change to simulator",
0.1f,
(s) => { return UpdateVelocityChangeThreshold; },
(s,v) => { UpdateVelocityChangeThreshold = v; } ),
new ParameterDefn<float>("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)",
32f,
@ -343,16 +351,16 @@ public static class BSParam
new ParameterDefn<float>("MaxLinearVelocity", "Maximum velocity magnitude that can be assigned to an object",
1000.0f,
(s) => { return MaxLinearVelocity; },
(s,v) => { MaxLinearVelocity = v; } ),
(s,v) => { MaxLinearVelocity = v; MaxLinearVelocitySquared = v * v; } ),
new ParameterDefn<float>("MaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to an object",
1000.0f,
(s) => { return MaxAngularVelocity; },
(s,v) => { MaxAngularVelocity = v; } ),
(s,v) => { MaxAngularVelocity = v; MaxAngularVelocitySquared = v * v; } ),
// LL documentation says thie number should be 20f for llApplyImpulse and 200f for llRezObject
new ParameterDefn<float>("MaxAddForceMagnitude", "Maximum force that can be applied by llApplyImpulse (SL says 20f)",
20000.0f,
(s) => { return MaxAddForceMagnitude; },
(s,v) => { MaxAddForceMagnitude = v; } ),
(s,v) => { MaxAddForceMagnitude = v; MaxAddForceMagnitudeSquared = v * v; } ),
// Density is passed around as 100kg/m3. This scales that to 1kg/m3.
new ParameterDefn<float>("DensityScaleFactor", "Conversion for simulator/viewer density (100kg/m3) to physical density (1kg/m3)",
0.01f,
@ -505,7 +513,7 @@ public static class BSParam
new ParameterDefn<float>("VehicleMaxLinearVelocity", "Maximum velocity magnitude that can be assigned to a vehicle",
1000.0f,
(s) => { return (float)VehicleMaxLinearVelocity; },
(s,v) => { VehicleMaxLinearVelocity = v; VehicleMaxLinearVelocitySq = v * v; } ),
(s,v) => { VehicleMaxLinearVelocity = v; VehicleMaxLinearVelocitySquared = v * v; } ),
new ParameterDefn<float>("VehicleMaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to a vehicle",
12.0f,
(s) => { return (float)VehicleMaxAngularVelocity; },

View File

@ -108,6 +108,9 @@ public class BSPrim : BSPhysObject
// do the actual object creation at taint time
PhysicsScene.TaintedObject("BSPrim.create", delegate()
{
// Make sure the object is being created with some sanity.
ExtremeSanityCheck(true /* inTaintTime */);
CreateGeomAndObject(true);
CurrentCollisionFlags = PhysicsScene.PE.GetCollisionFlags(PhysBody);
@ -450,6 +453,38 @@ public class BSPrim : BSPhysObject
return ret;
}
// Occasionally things will fly off and really get lost.
// Find the wanderers and bring them back.
// Return 'true' if some parameter need some sanity.
private bool ExtremeSanityCheck(bool inTaintTime)
{
bool ret = false;
uint wayOutThere = Constants.RegionSize * Constants.RegionSize;
// There have been instances of objects getting thrown way out of bounds and crashing
// the border crossing code.
if ( _position.X < -Constants.RegionSize || _position.X > wayOutThere
|| _position.Y < -Constants.RegionSize || _position.Y > wayOutThere
|| _position.Z < -Constants.RegionSize || _position.Z > wayOutThere)
{
_position = new OMV.Vector3(10, 10, 50);
ZeroMotion(inTaintTime);
ret = true;
}
if (_velocity.LengthSquared() > BSParam.MaxLinearVelocity)
{
_velocity = Util.ClampV(_velocity, BSParam.MaxLinearVelocity);
ret = true;
}
if (_rotationalVelocity.LengthSquared() > BSParam.MaxAngularVelocitySquared)
{
_rotationalVelocity = Util.ClampV(_rotationalVelocity, BSParam.MaxAngularVelocity);
ret = true;
}
return ret;
}
// Return the effective mass of the object.
// The definition of this call is to return the mass of the prim.
// If the simulator cares about the mass of the linkset, it will sum it itself.
@ -585,12 +620,12 @@ public class BSPrim : BSPhysObject
if (VehicleController.Type == Vehicle.TYPE_NONE)
{
UnRegisterPreStepAction("BSPrim.Vehicle", LocalID);
PhysicsScene.AfterStep -= VehicleController.PostStep;
UnRegisterPostStepAction("BSPrim.Vehicle", LocalID);
}
else
{
RegisterPreStepAction("BSPrim.Vehicle", LocalID, VehicleController.Step);
PhysicsScene.AfterStep += VehicleController.PostStep;
RegisterPostStepAction("BSPrim.Vehicle", LocalID, VehicleController.PostStep);
}
});
}
@ -732,7 +767,7 @@ public class BSPrim : BSPhysObject
set {
PhysicsScene.AssertInTaintTime("BSPrim.ForceVelocity");
_velocity = value;
_velocity = Util.ClampV(value, BSParam.MaxLinearVelocity);
if (PhysBody.HasPhysicalBody)
{
DetailLog("{0},BSPrim.ForceVelocity,taint,vel={1}", LocalID, _velocity);
@ -1098,7 +1133,7 @@ public class BSPrim : BSPhysObject
return _rotationalVelocity;
}
set {
_rotationalVelocity = value;
_rotationalVelocity = Util.ClampV(value, BSParam.MaxAngularVelocity);
if (PhysBody.HasPhysicalBody)
{
DetailLog("{0},BSPrim.ForceRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity);
@ -1230,6 +1265,7 @@ public class BSPrim : BSPhysObject
RegisterPreStepAction("BSPrim.Hover", LocalID, delegate(float timeStep)
{
// Don't do hovering while the object is selected.
if (!IsPhysicallyActive)
return;
@ -1737,10 +1773,9 @@ public class BSPrim : BSPhysObject
// Assign directly to the local variables so the normal set actions do not happen
_position = entprop.Position;
_orientation = entprop.Rotation;
// _velocity = entprop.Velocity;
// DEBUG DEBUG DEBUG -- smooth velocity changes a bit. The simulator seems to be
// very sensitive to velocity changes.
if (entprop.Velocity == OMV.Vector3.Zero || !entprop.Velocity.ApproxEquals(_velocity, 0.1f))
if (entprop.Velocity == OMV.Vector3.Zero || !entprop.Velocity.ApproxEquals(_velocity, BSParam.UpdateVelocityChangeThreshold))
_velocity = entprop.Velocity;
_acceleration = entprop.Acceleration;
_rotationalVelocity = entprop.RotationalVelocity;

View File

@ -9,6 +9,9 @@ Enable vehicle border crossings (at least as poorly as ODE)
Lock axis
Deleting a linkset while standing on the root will leave the physical shape of the root behind.
Not sure if it is because standing on it. Done with large prim linksets.
Linkset child rotations.
Nebadon spiral tube has middle sections which are rotated wrong.
Select linked spiral tube. Delink and note where the middle section ends up.
Vehicle angular vertical attraction
vehicle angular banking
Center-of-gravity
@ -68,6 +71,8 @@ Vehicle attributes are not restored when a vehicle is rezzed on region creation
GENERAL TODO LIST:
=================================================
Explore btGImpactMeshShape as alternative to convex hulls for simplified physical objects.
Regular triangle meshes don't do physical collisions.
Resitution of a prim works on another prim but not on terrain.
The dropped prim doesn't bounce properly on the terrain.
Add a sanity check for PIDTarget location.
@ -338,4 +343,4 @@ Avatar standing on a moving object should start to move with the object. (DONE 2
Angular motion around Z moves the vehicle in world Z and not vehicle Z in ODE.
Verify that angular motion specified around Z moves in the vehicle coordinates.
DONE 20130120: BulletSim properly applies force in vehicle relative coordinates.
Nebadon vehicles turning funny in arena (DONE)
Nebadon vehicles turning funny in arena (DONE)

View File

@ -10806,14 +10806,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return UUID.Zero.ToString();
}
string reqIdentifier = UUID.Random().ToString();
// was: UUID tid = tid = AsyncCommands.
UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, reqIdentifier);
if (NotecardCache.IsCached(assetID))
{
AsyncCommands.
DataserverPlugin.DataserverReply(assetID.ToString(),
NotecardCache.GetLines(assetID).ToString());
AsyncCommands.DataserverPlugin.DataserverReply(reqIdentifier, NotecardCache.GetLines(assetID).ToString());
ScriptSleep(100);
return tid.ToString();
}
@ -10829,9 +10830,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
string data = Encoding.UTF8.GetString(a.Data);
//m_log.Debug(data);
NotecardCache.Cache(id, data);
AsyncCommands.
DataserverPlugin.DataserverReply(id.ToString(),
NotecardCache.GetLines(id).ToString());
AsyncCommands.DataserverPlugin.DataserverReply(reqIdentifier, NotecardCache.GetLines(id).ToString());
});
ScriptSleep(100);
@ -10860,13 +10859,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return UUID.Zero.ToString();
}
string reqIdentifier = UUID.Random().ToString();
// was: UUID tid = tid = AsyncCommands.
UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, reqIdentifier);
if (NotecardCache.IsCached(assetID))
{
AsyncCommands.DataserverPlugin.DataserverReply(assetID.ToString(),
NotecardCache.GetLine(assetID, line, m_notecardLineReadCharsMax));
AsyncCommands.DataserverPlugin.DataserverReply(
reqIdentifier, NotecardCache.GetLine(assetID, line, m_notecardLineReadCharsMax));
ScriptSleep(100);
return tid.ToString();
}
@ -10882,8 +10884,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
string data = Encoding.UTF8.GetString(a.Data);
//m_log.Debug(data);
NotecardCache.Cache(id, data);
AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(),
NotecardCache.GetLine(id, line, m_notecardLineReadCharsMax));
AsyncCommands.DataserverPlugin.DataserverReply(
reqIdentifier, NotecardCache.GetLine(assetID, line, m_notecardLineReadCharsMax));
});
ScriptSleep(100);
@ -11687,7 +11689,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public static void Cache(UUID assetID, string text)
{
CacheCheck();
CheckCache();
lock (m_Notecards)
{
@ -11772,14 +11774,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return line;
}
public static void CacheCheck()
public static void CheckCache()
{
foreach (UUID key in new List<UUID>(m_Notecards.Keys))
lock (m_Notecards)
{
Notecard nc = m_Notecards[key];
if (nc.lastRef.AddSeconds(30) < DateTime.Now)
m_Notecards.Remove(key);
foreach (UUID key in new List<UUID>(m_Notecards.Keys))
{
Notecard nc = m_Notecards[key];
if (nc.lastRef.AddSeconds(30) < DateTime.Now)
m_Notecards.Remove(key);
}
}
}
}
}
}

View File

@ -93,7 +93,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
// FIXME: This should really be a script item (with accompanying script)
TaskInventoryItem grp1Item
= TaskInventoryHelpers.AddNotecard(
m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900));
m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20);
@ -127,7 +127,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
// FIXME: This should really be a script item (with accompanying script)
TaskInventoryItem grp1Item
= TaskInventoryHelpers.AddNotecard(
m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900));
m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;

View File

@ -0,0 +1,270 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
using log4net;
using Nini.Config;
using NUnit.Framework;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Framework.Servers;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Region.CoreModules.Scripting.LSLHttp;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api;
using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
using OpenSim.Services.Interfaces;
using OpenSim.Tests.Common;
using OpenSim.Tests.Common.Mock;
namespace OpenSim.Region.ScriptEngine.Shared.Tests
{
/// <summary>
/// Tests for notecard related functions in LSL
/// </summary>
[TestFixture]
public class LSL_ApiNotecardTests : OpenSimTestCase
{
private Scene m_scene;
private MockScriptEngine m_engine;
private SceneObjectGroup m_so;
private TaskInventoryItem m_scriptItem;
private LSL_Api m_lslApi;
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
// Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
}
[TestFixtureTearDown]
public void TestFixureTearDown()
{
// We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
// threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
// tests really shouldn't).
Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
}
[SetUp]
public override void SetUp()
{
base.SetUp();
m_engine = new MockScriptEngine();
m_scene = new SceneHelpers().SetupScene();
SceneHelpers.SetupSceneModules(m_scene, new IniConfigSource(), m_engine);
m_so = SceneHelpers.AddSceneObject(m_scene);
m_scriptItem = TaskInventoryHelpers.AddScript(m_scene, m_so.RootPart);
// This is disconnected from the actual script - the mock engine does not set up any LSL_Api atm.
// Possibly this could be done and we could obtain it directly from the MockScriptEngine.
m_lslApi = new LSL_Api();
m_lslApi.Initialize(m_engine, m_so.RootPart, m_scriptItem, null);
}
[Test]
public void TestLlGetNotecardLine()
{
TestHelpers.InMethod();
string[] ncLines = { "One", "Two", "Three" };
TaskInventoryItem ncItem
= TaskInventoryHelpers.AddNotecard(m_scene, m_so.RootPart, "nc", "1", "10", string.Join("\n", ncLines));
AssertValidNotecardLine(ncItem.Name, 0, ncLines[0]);
AssertValidNotecardLine(ncItem.Name, 2, ncLines[2]);
AssertValidNotecardLine(ncItem.Name, 3, ScriptBaseClass.EOF);
AssertValidNotecardLine(ncItem.Name, 4, ScriptBaseClass.EOF);
// XXX: Is this correct or do we really expect no dataserver event to fire at all?
AssertValidNotecardLine(ncItem.Name, -1, "");
AssertValidNotecardLine(ncItem.Name, -2, "");
}
[Test]
public void TestLlGetNotecardLine_NoNotecard()
{
TestHelpers.InMethod();
AssertInValidNotecardLine("nc", 0);
}
[Test]
public void TestLlGetNotecardLine_NotANotecard()
{
TestHelpers.InMethod();
TaskInventoryItem ncItem = TaskInventoryHelpers.AddScript(m_scene, m_so.RootPart, "nc1", "Not important");
AssertInValidNotecardLine(ncItem.Name, 0);
}
private void AssertValidNotecardLine(string ncName, int lineNumber, string assertLine)
{
string key = m_lslApi.llGetNotecardLine(ncName, lineNumber);
Assert.That(key, Is.Not.EqualTo(UUID.Zero.ToString()));
Assert.That(m_engine.PostedEvents.Count, Is.EqualTo(1));
Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
Assert.That(events.Count, Is.EqualTo(1));
EventParams eventParams = events[0];
Assert.That(eventParams.EventName, Is.EqualTo("dataserver"));
Assert.That(eventParams.Params[0].ToString(), Is.EqualTo(key));
Assert.That(eventParams.Params[1].ToString(), Is.EqualTo(assertLine));
m_engine.ClearPostedEvents();
}
private void AssertInValidNotecardLine(string ncName, int lineNumber)
{
string key = m_lslApi.llGetNotecardLine(ncName, lineNumber);
Assert.That(key, Is.EqualTo(UUID.Zero.ToString()));
Assert.That(m_engine.PostedEvents.Count, Is.EqualTo(0));
}
// [Test]
// public void TestLlReleaseUrl()
// {
// TestHelpers.InMethod();
//
// m_lslApi.llRequestURL();
// string returnedUri = m_engine.PostedEvents[m_scriptItem.ItemID][0].Params[2].ToString();
//
// {
// // Check that the initial number of URLs is correct
// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
// }
//
// {
// // Check releasing a non-url
// m_lslApi.llReleaseURL("GARBAGE");
// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
// }
//
// {
// // Check releasing a non-existing url
// m_lslApi.llReleaseURL("http://example.com");
// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
// }
//
// {
// // Check URL release
// m_lslApi.llReleaseURL(returnedUri);
// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls));
//
// HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(returnedUri);
//
// bool gotExpectedException = false;
//
// try
// {
// using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
// {}
// }
// catch (WebException e)
// {
// using (HttpWebResponse response = (HttpWebResponse)e.Response)
// gotExpectedException = response.StatusCode == HttpStatusCode.NotFound;
// }
//
// Assert.That(gotExpectedException, Is.True);
// }
//
// {
// // Check releasing the same URL again
// m_lslApi.llReleaseURL(returnedUri);
// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls));
// }
// }
//
// [Test]
// public void TestLlRequestUrl()
// {
// TestHelpers.InMethod();
//
// string requestId = m_lslApi.llRequestURL();
// Assert.That(requestId, Is.Not.EqualTo(UUID.Zero.ToString()));
// string returnedUri;
//
// {
// // Check that URL is correctly set up
// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
//
// Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
//
// List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
// Assert.That(events.Count, Is.EqualTo(1));
// EventParams eventParams = events[0];
// Assert.That(eventParams.EventName, Is.EqualTo("http_request"));
//
// UUID returnKey;
// string rawReturnKey = eventParams.Params[0].ToString();
// string method = eventParams.Params[1].ToString();
// returnedUri = eventParams.Params[2].ToString();
//
// Assert.That(UUID.TryParse(rawReturnKey, out returnKey), Is.True);
// Assert.That(method, Is.EqualTo(ScriptBaseClass.URL_REQUEST_GRANTED));
// Assert.That(Uri.IsWellFormedUriString(returnedUri, UriKind.Absolute), Is.True);
// }
//
// {
// // Check that request to URL works.
// string testResponse = "Hello World";
//
// m_engine.ClearPostedEvents();
// m_engine.PostEventHook
// += (itemId, evp) => m_lslApi.llHTTPResponse(evp.Params[0].ToString(), 200, testResponse);
//
//// Console.WriteLine("Trying {0}", returnedUri);
// HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(returnedUri);
//
// AssertHttpResponse(returnedUri, testResponse);
//
// Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
//
// List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
// Assert.That(events.Count, Is.EqualTo(1));
// EventParams eventParams = events[0];
// Assert.That(eventParams.EventName, Is.EqualTo("http_request"));
//
// UUID returnKey;
// string rawReturnKey = eventParams.Params[0].ToString();
// string method = eventParams.Params[1].ToString();
// string body = eventParams.Params[2].ToString();
//
// Assert.That(UUID.TryParse(rawReturnKey, out returnKey), Is.True);
// Assert.That(method, Is.EqualTo("GET"));
// Assert.That(body, Is.EqualTo(""));
// }
// }
//
// private void AssertHttpResponse(string uri, string expectedResponse)
// {
// HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
//
// using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
// {
// using (Stream stream = webResponse.GetResponseStream())
// {
// using (StreamReader reader = new StreamReader(stream))
// {
// Assert.That(reader.ReadToEnd(), Is.EqualTo(expectedResponse));
// }
// }
// }
// }
}
}

View File

@ -151,7 +151,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
// Create an object embedded inside the first
TaskInventoryHelpers.AddNotecard(
m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, TestHelpers.ParseTail(0x900));
m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, TestHelpers.ParseTail(0x900), "Hello World!");
bool exceptionCaught = false;

View File

@ -186,6 +186,10 @@ namespace OpenSim.Server.Base
XmlConfigurator.Configure();
}
// FIXME: This should be done down in ServerBase but we need to sort out and refactor the log4net
// XmlConfigurator calls first accross servers.
m_log.InfoFormat("[SERVER BASE]: Starting in {0}", m_startupDirectory);
RegisterCommonAppenders(startupConfig);
if (startupConfig.GetString("PIDFile", String.Empty) != String.Empty)

View File

@ -40,6 +40,23 @@ namespace OpenSim.Tests.Common
///
public static class TaskInventoryHelpers
{
/// <summary>
/// Add a notecard item to the given part.
/// </summary>
/// <param name="scene"></param>
/// <param name="part"></param>
/// <param name="itemName"></param>
/// <param name="itemIDFrag">UUID or UUID stem</param>
/// <param name="assetIDFrag">UUID or UUID stem</param>
/// <param name="text">The tex to put in the notecard.</param>
/// <returns>The item that was added</returns>
public static TaskInventoryItem AddNotecard(
Scene scene, SceneObjectPart part, string itemName, string itemIDStem, string assetIDStem, string text)
{
return AddNotecard(
scene, part, itemName, TestHelpers.ParseStem(itemIDStem), TestHelpers.ParseStem(assetIDStem), text);
}
/// <summary>
/// Add a notecard item to the given part.
/// </summary>
@ -48,11 +65,13 @@ namespace OpenSim.Tests.Common
/// <param name="itemName"></param>
/// <param name="itemID"></param>
/// <param name="assetID"></param>
/// <param name="text">The tex to put in the notecard.</param>
/// <returns>The item that was added</returns>
public static TaskInventoryItem AddNotecard(Scene scene, SceneObjectPart part, string itemName, UUID itemID, UUID assetID)
public static TaskInventoryItem AddNotecard(
Scene scene, SceneObjectPart part, string itemName, UUID itemID, UUID assetID, string text)
{
AssetNotecard nc = new AssetNotecard();
nc.BodyText = "Hello World!";
nc.BodyText = text;
nc.Encode();
AssetBase ncAsset
@ -87,8 +106,8 @@ namespace OpenSim.Tests.Common
/// Add a simple script to the given part.
/// </summary>
/// <remarks>
/// TODO: Accept input for item and asset IDs to avoid mysterious script failures that try to use any of these
/// functions more than once in a test.
/// TODO: Accept input for item and asset IDs so that we have completely replicatable regression tests rather
/// than a random component.
/// </remarks>
/// <param name="scene"></param>
/// <param name="part"></param>
@ -102,8 +121,9 @@ namespace OpenSim.Tests.Common
ast.Source = scriptSource;
ast.Encode();
UUID assetUuid = new UUID("00000000-0000-0000-1000-000000000000");
UUID itemUuid = new UUID("00000000-0000-0000-1100-000000000000");
UUID assetUuid = UUID.Random();
UUID itemUuid = UUID.Random();
AssetBase asset
= AssetHelpers.CreateAsset(assetUuid, AssetType.LSLText, ast.AssetData, UUID.Zero);
scene.AssetService.Store(asset);

View File

@ -31,6 +31,7 @@ using System.Collections.Generic;
using System.Reflection;
using Nini.Config;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.ScriptEngine.Interfaces;
@ -110,8 +111,11 @@ namespace OpenSim.Tests.Common
{
// Console.WriteLine("Posting event {0} for {1}", name, itemID);
EventParams evParams = new EventParams(name, args, null);
return PostScriptEvent(itemID, new EventParams(name, args, null));
}
public bool PostScriptEvent(UUID itemID, EventParams evParams)
{
List<EventParams> eventsForItem;
if (!PostedEvents.ContainsKey(itemID))
@ -132,9 +136,22 @@ namespace OpenSim.Tests.Common
return true;
}
public bool PostObjectEvent(uint localID, EventParams evParams)
{
return PostObjectEvent(m_scene.GetSceneObjectPart(localID), evParams);
}
public bool PostObjectEvent(UUID itemID, string name, object[] args)
{
throw new System.NotImplementedException ();
return PostObjectEvent(m_scene.GetSceneObjectPart(itemID), new EventParams(name, args, null));
}
private bool PostObjectEvent(SceneObjectPart part, EventParams evParams)
{
foreach (TaskInventoryItem item in part.Inventory.GetInventoryItems(InventoryType.LSL))
PostScriptEvent(item.ItemID, evParams);
return true;
}
public void SuspendScript(UUID itemID)
@ -187,16 +204,6 @@ namespace OpenSim.Tests.Common
throw new System.NotImplementedException ();
}
public bool PostScriptEvent(UUID itemID,EventParams parms)
{
throw new System.NotImplementedException ();
}
public bool PostObjectEvent (uint localID, EventParams parms)
{
throw new System.NotImplementedException ();
}
public DetectParams GetDetectParams(UUID item, int number)
{
throw new System.NotImplementedException ();

View File

@ -113,6 +113,27 @@ namespace OpenSim.Tests.Common
DisableLoggingConfigStream.Position = 0;
}
/// <summary>
/// Parse a UUID stem into a full UUID.
/// </summary>
/// <remarks>
/// Yes, this is completely inconsistent with ParseTail but this is probably a better way to do it,
/// UUIDs are conceptually not hexadecmial numbers.
/// The fragment will come at the start of the UUID. The rest will be 0s
/// </remarks>
/// <returns></returns>
/// <param name='frag'>
/// A UUID fragment that will be parsed into a full UUID. Therefore, it can only contain
/// cahracters which are valid in a UUID, except for "-" which is currently only allowed if a full UUID is
/// given as the 'fragment'.
/// </param>
public static UUID ParseStem(string stem)
{
string rawUuid = stem.PadRight(32, '0');
return UUID.Parse(rawUuid);
}
/// <summary>
/// Parse tail section into full UUID.
/// </summary>

View File

@ -45,7 +45,7 @@ namespace OpenSim.Tests
/// Set up a test directory.
/// </summary>
[SetUp]
public void SetUp()
public override void SetUp()
{
base.SetUp();

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -220,6 +220,101 @@
; physics = basicphysics
; physics = POS
;# {DefaultScriptEngine} {} {Default script engine} {XEngine} XEngine
;; Default script engine to use. Currently, we only have XEngine
; DefaultScriptEngine = "XEngine"
;# {HttpProxy} {} {Proxy URL for llHTTPRequest and dynamic texture loading} {} http://proxy.com:8080
;; Http proxy setting for llHTTPRequest and dynamic texture loading, if
;; required
; HttpProxy = "http://proxy.com:8080"
;# {HttpProxyExceptions} {HttpProxy} {Set of regular expressions defining URL that should not be proxied} {}
;; If you're using HttpProxy, then you can set HttpProxyExceptions to a
;; list of regular expressions for URLs that you don't want to go through
;; the proxy.
;; For example, servers inside your firewall.
;; Separate patterns with a ';'
; HttpProxyExceptions = ".mydomain.com;localhost"
;# {emailmodule} {} {Provide llEmail and llGetNextEmail functionality? (requires SMTP server)} {true false} false
;; The email module requires some configuration. It needs an SMTP
;; server to send mail through.
; emailmodule = DefaultEmailModule
;# {SpawnPointRouting} {} {Set routing method for Telehub Spawnpoints} {closest random sequence} closest
;; SpawnPointRouting adjusts the landing for incoming avatars.
;; "closest" will place the avatar at the SpawnPoint located in the closest
;; available spot to the destination (typically map click/landmark).
;; "random" will place the avatar on a randomly selected spawnpoint;
;; "sequence" will place the avatar on the next sequential SpawnPoint
; SpawnPointRouting = closest
;# {TelehubAllowLandmark} {} {Allow users with landmarks to override telehub routing} {true false} false
;; TelehubAllowLandmark allows users with landmarks to override telehub
;; routing and land at the landmark coordinates when set to true
;; default is false
; TelehubAllowLandmark = false
[AccessControl]
;# {AllowedClients} {} {Bar (|) separated list of allowed clients} {}
;; Bar (|) separated list of viewers which may gain access to the regions.
;; One can use a substring of the viewer name to enable only certain
;; versions
;; Example: Agent uses the viewer "Imprudence 1.3.2.0"
;; - "Imprudence" has access
;; - "Imprudence 1.3" has access
;; - "Imprudence 1.3.1" has no access
; AllowedClients =
;# {BannedClients} {} {Bar (|) separated list of banned clients} {}
;# Bar (|) separated list of viewers which may not gain access to the regions.
;; One can use a Substring of the viewer name to disable only certain
;; versions
;; Example: Agent uses the viewer "Imprudence 1.3.2.0"
;; - "Imprudence" has no access
;; - "Imprudence 1.3" has no access
;; - "Imprudence 1.3.1" has access
; BannedClients =
[Map]
;# {GenerateMaptiles} {} {Generate map tiles?} {true false} true
;; Map tile options.
;; If true, then maptiles are generated using the MapImageModule below.
;; If false then the texture referenced by MaptileStaticUUID is used instead, which can also be overriden
;; in individual region config file(s). If you do not want to upload map tiles at all, then you will need
;; both to set this to false and comment out the [Modules] MapImageServiceModule setting in config-include/
; GenerateMaptiles = true
;# {MapImageModule} [] {The map image module to use} {MapImageModule Warp3DImageModule} MapImageModule
;; The module to use in order to generate map images.
;; MapImageModule is the default. Warp3DImageModule is an alternative experimental module that can
;; generate better images.
;MapImageModule = "MapImageModule"
;# {MaptileRefresh} {GenerateMaptiles} {Maptile refresh period?} {} 0
;; If desired, a running region can update the map tiles periodically
;; to reflect building activity. This names no sense of you don't have
;; prims on maptiles. Value is in seconds.
; MaptileRefresh = 0
;# {MaptileStaticUUID} {} {Asset ID for static map texture} {} 00000000-0000-0000-0000-000000000000
;; If not generating maptiles, use this static texture asset ID
; MaptileStaticUUID = "00000000-0000-0000-0000-000000000000"
;# {TextureOnMapTile} {} {Use terrain textures for map tiles?} {true false} true
;; Use terrain texture for maptiles if true, use shaded green if false
; TextureOnMapTile = true
;# {DrawPrimOnMapTile} {} {Draw prim shapes on map tiles?} {true false} false
;; Draw objects on maptile. This step might take a long time if you've
;; got a large number of objects, so you can turn it off here if you'd like.
; DrawPrimOnMapTile = true
[Permissions]
;# {permissionmodules} {} {Permission modules to use (may specify multiple modules, separated by comma} {} DefaultPermissionsModule
;; Permission modules to use, separated by comma.
;; Possible modules are DefaultPermissionsModule, PrimLimitsModule
@ -264,97 +359,6 @@
; simple_build_permissions = false
;# {DefaultScriptEngine} {} {Default script engine} {XEngine} XEngine
;; Default script engine to use. Currently, we only have XEngine
; DefaultScriptEngine = "XEngine"
;# {HttpProxy} {} {Proxy URL for llHTTPRequest and dynamic texture loading} {} http://proxy.com:8080
;; Http proxy setting for llHTTPRequest and dynamic texture loading, if
;; required
; HttpProxy = "http://proxy.com:8080"
;# {HttpProxyExceptions} {HttpProxy} {Set of regular expressions defining URL that should not be proxied} {}
;; If you're using HttpProxy, then you can set HttpProxyExceptions to a
;; list of regular expressions for URLs that you don't want to go through
;; the proxy.
;; For example, servers inside your firewall.
;; Separate patterns with a ';'
; HttpProxyExceptions = ".mydomain.com;localhost"
;# {emailmodule} {} {Provide llEmail and llGetNextEmail functionality? (requires SMTP server)} {true false} false
;; The email module requires some configuration. It needs an SMTP
;; server to send mail through.
; emailmodule = DefaultEmailModule
;# {SpawnPointRouting} {} {Set routing method for Telehub Spawnpoints} {closest random sequence} closest
;; SpawnPointRouting adjusts the landing for incoming avatars.
;; "closest" will place the avatar at the SpawnPoint located in the closest
;; available spot to the destination (typically map click/landmark).
;; "random" will place the avatar on a randomly selected spawnpoint;
;; "sequence" will place the avatar on the next sequential SpawnPoint
; SpawnPointRouting = closest
;# {TelehubAllowLandmark} {} {Allow users with landmarks to override telehub routing} {true false} false
;; TelehubAllowLandmark allows users with landmarks to override telehub
;; routing and land at the landmark coordinates when set to true
;; default is false
; TelehubAllowLandmark = false
;# {AllowedClients} {} {Bar (|) separated list of allowed clients} {}
;; Bar (|) separated list of viewers which may gain access to the regions.
;; One can use a substring of the viewer name to enable only certain
;; versions
;; Example: Agent uses the viewer "Imprudence 1.3.2.0"
;; - "Imprudence" has access
;; - "Imprudence 1.3" has access
;; - "Imprudence 1.3.1" has no access
; AllowedViewerList =
;# {BannedClients} {} {Bar (|) separated list of banned clients} {}
;# Bar (|) separated list of viewers which may not gain access to the regions.
;; One can use a Substring of the viewer name to disable only certain
;; versions
;; Example: Agent uses the viewer "Imprudence 1.3.2.0"
;; - "Imprudence" has no access
;; - "Imprudence 1.3" has no access
;; - "Imprudence 1.3.1" has access
; BannedViewerList =
[Map]
;# {GenerateMaptiles} {} {Generate map tiles?} {true false} true
;; Map tile options.
;; If true, then maptiles are generated using the MapImageModule below.
;; If false then the texture referenced by MaptileStaticUUID is used instead, which can also be overriden
;; in individual region config file(s). If you do not want to upload map tiles at all, then you will need
;; both to set this to false and comment out the [Modules] MapImageServiceModule setting in config-include/
; GenerateMaptiles = true
;# {MapImageModule} [] {The map image module to use} {MapImageModule Warp3DImageModule} MapImageModule
;; The module to use in order to generate map images.
;; MapImageModule is the default. Warp3DImageModule is an alternative experimental module that can
;; generate better images.
;MapImageModule = "MapImageModule"
;# {MaptileRefresh} {GenerateMaptiles} {Maptile refresh period?} {} 0
;; If desired, a running region can update the map tiles periodically
;; to reflect building activity. This names no sense of you don't have
;; prims on maptiles. Value is in seconds.
; MaptileRefresh = 0
;# {MaptileStaticUUID} {} {Asset ID for static map texture} {} 00000000-0000-0000-0000-000000000000
;; If not generating maptiles, use this static texture asset ID
; MaptileStaticUUID = "00000000-0000-0000-0000-000000000000"
;# {TextureOnMapTile} {} {Use terrain textures for map tiles?} {true false} true
;; Use terrain texture for maptiles if true, use shaded green if false
; TextureOnMapTile = true
;# {DrawPrimOnMapTile} {} {Draw prim shapes on map tiles?} {true false} false
;; Draw objects on maptile. This step might take a long time if you've
;; got a large number of objects, so you can turn it off here if you'd like.
; DrawPrimOnMapTile = true
[Estates]
; If these values are commented out then the user will be asked for estate details when required (this is the normal case).
; If these values are uncommented then they will be used to create a default estate as necessary.

View File

@ -230,54 +230,6 @@
;physics = modified_BulletX
;physics = BulletSim
; ##
; ## PERMISSIONS
; ##
;permissionmodules = "DefaultPermissionsModule"
; If set to false, then, in theory, the server never carries out permission checks (allowing anybody to copy
; any item, etc. This may not yet be implemented uniformally.
; If set to true, then all permissions checks are carried out
; Default is true
serverside_object_permissions = true
allow_grid_gods = false
; This allows somne control over permissions
; please note that this still doesn't duplicate SL, and is not intended to
;region_owner_is_god = true
;region_manager_is_god = false
;parcel_owner_is_god = true
; Control user types that are allowed to create new scripts
; Only enforced if serviceside_object_permissions is true
;
; Current possible values are
; all - anyone can create scripts (subject to normal permissions)
; gods - only administrators can create scripts (as long as allow_grid_gods is true)
; Default value is all
; allowed_script_creators = all
; Control user types that are allowed to edit (save) scripts
; Only enforced if serviceside_object_permissions is true
;
; Current possible values are
; all - anyone can edit scripts (subject to normal permissions)
; gods - only administrators can edit scripts (as long as allow_grid_gods is true)
; Default value is all
; allowed_script_editors = all
; Provides a simple control for land owners to give build rights to specific avatars
; in publicly accessible parcels that disallow object creation in general.
; Owners specific avatars by adding them to the Access List of the parcel
; without having to use the Groups feature
; Disabled by default
; simple_build_permissions = False
; Minimum user level required to upload assets
;LevelUpload = 0
; ##
; ## SCRIPT ENGINE
; ##
@ -344,6 +296,55 @@
; Use terrain texture for maptiles if true, use shaded green if false
TextureOnMapTile = true
[Permissions]
; ##
; ## PERMISSIONS
; ##
;permissionmodules = "DefaultPermissionsModule"
; If set to false, then, in theory, the server never carries out permission checks (allowing anybody to copy
; any item, etc. This may not yet be implemented uniformally.
; If set to true, then all permissions checks are carried out
; Default is true
serverside_object_permissions = true
allow_grid_gods = false
; This allows somne control over permissions
; please note that this still doesn't duplicate SL, and is not intended to
;region_owner_is_god = true
;region_manager_is_god = false
;parcel_owner_is_god = true
; Control user types that are allowed to create new scripts
; Only enforced if serviceside_object_permissions is true
;
; Current possible values are
; all - anyone can create scripts (subject to normal permissions)
; gods - only administrators can create scripts (as long as allow_grid_gods is true)
; Default value is all
; allowed_script_creators = all
; Control user types that are allowed to edit (save) scripts
; Only enforced if serviceside_object_permissions is true
;
; Current possible values are
; all - anyone can edit scripts (subject to normal permissions)
; gods - only administrators can edit scripts (as long as allow_grid_gods is true)
; Default value is all
; allowed_script_editors = all
; Provides a simple control for land owners to give build rights to specific avatars
; in publicly accessible parcels that disallow object creation in general.
; Owners specific avatars by adding them to the Access List of the parcel
; without having to use the Groups feature
; Disabled by default
; simple_build_permissions = False
; Minimum user level required to upload assets
;LevelUpload = 0
[RegionReady]
; Enable this module to get notified once all items and scripts in the region have been completely loaded and compiled
@ -1399,6 +1400,10 @@
; up the system to malicious scripters
; NotecardLineReadCharsMax = 255
; Minimum settable timer interval. Any timer setting less than this is
; rounded up to this minimum interval.
; MinTimerInterval = 0.5
; Sensor settings
SensorMaxRange = 96.0
SensorMaxResults = 16

View File

@ -431,6 +431,7 @@ HGAssetServiceConnector = "HGAssetService@8002/OpenSim.Server.Handlers.dll:Asset
UserAccountService = "OpenSim.Services.UserAccountService.dll:UserAccountService"
UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService"
PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
GridUserService = "OpenSim.Services.UserAccountService.dll:GridUserService"
GridService = "OpenSim.Services.GridService.dll:GridService"
AuthenticationService = "OpenSim.Services.Connectors.dll:AuthenticationServicesConnector"
SimulationService ="OpenSim.Services.Connectors.dll:SimulationServiceConnector"

View File

@ -3387,6 +3387,7 @@
<ReferencePath>../../../bin/</ReferencePath>
<Reference name="System"/>
<Reference name="System.Core"/>
<Reference name="System.Xml"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Framework.Communications"/>