*remove conflicts
commit
311b51a184
|
@ -21,6 +21,7 @@ bin/*.db
|
|||
bin/addin-db-*
|
||||
bin/*.dll
|
||||
bin/OpenSim.vshost.exe.config
|
||||
bin/ScriptEngines/*-*-*-*-*
|
||||
bin/ScriptEngines/*.dll
|
||||
bin/ScriptEngines/*/*.dll
|
||||
bin/ScriptEngines/*/*.state
|
||||
|
|
|
@ -612,6 +612,7 @@ namespace OpenSim.Client.MXP.ClientStack
|
|||
public event SpinStop OnSpinStop;
|
||||
public event UpdateShape OnUpdatePrimShape;
|
||||
public event ObjectExtraParams OnUpdateExtraParams;
|
||||
public event ObjectRequest OnObjectRequest;
|
||||
public event ObjectSelect OnObjectSelect;
|
||||
public event ObjectDeselect OnObjectDeselect;
|
||||
public event GenericCall7 OnObjectDescription;
|
||||
|
|
|
@ -259,6 +259,7 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
|
|||
public event SpinStop OnSpinStop = delegate { };
|
||||
public event UpdateShape OnUpdatePrimShape = delegate { };
|
||||
public event ObjectExtraParams OnUpdateExtraParams = delegate { };
|
||||
public event ObjectRequest OnObjectRequest = delegate { };
|
||||
public event ObjectSelect OnObjectSelect = delegate { };
|
||||
public event ObjectDeselect OnObjectDeselect = delegate { };
|
||||
public event GenericCall7 OnObjectDescription = delegate { };
|
||||
|
|
|
@ -0,0 +1,198 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using Nini.Config;
|
||||
using log4net;
|
||||
using System.Reflection;
|
||||
using System;
|
||||
using System.Xml;
|
||||
using System.Collections.Generic;
|
||||
using OpenSim.Server.Base;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.ConsoleClient
|
||||
{
|
||||
public class OpenSimConsoleClient
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected static ServicesServerBase m_Server = null;
|
||||
private static string m_Host;
|
||||
private static int m_Port;
|
||||
private static string m_User;
|
||||
private static string m_Pass;
|
||||
private static UUID m_SessionID;
|
||||
|
||||
static int Main(string[] args)
|
||||
{
|
||||
m_Server = new ServicesServerBase("Client", args);
|
||||
|
||||
IConfig serverConfig = m_Server.Config.Configs["Startup"];
|
||||
if (serverConfig == null)
|
||||
{
|
||||
System.Console.WriteLine("Startup config section missing in .ini file");
|
||||
throw new Exception("Configuration error");
|
||||
}
|
||||
|
||||
ArgvConfigSource argvConfig = new ArgvConfigSource(args);
|
||||
|
||||
argvConfig.AddSwitch("Startup", "host", "h");
|
||||
argvConfig.AddSwitch("Startup", "port", "p");
|
||||
argvConfig.AddSwitch("Startup", "user", "u");
|
||||
argvConfig.AddSwitch("Startup", "pass", "P");
|
||||
|
||||
m_Server.Config.Merge(argvConfig);
|
||||
|
||||
m_User = serverConfig.GetString("user", "Test");
|
||||
m_Host = serverConfig.GetString("host", "localhost");
|
||||
m_Port = serverConfig.GetInt("port", 8003);
|
||||
m_Pass = serverConfig.GetString("pass", "secret");
|
||||
|
||||
Requester.MakeRequest("http://"+m_Host+":"+m_Port.ToString()+"/StartSession/", String.Format("USER={0}&PASS={1}", m_User, m_Pass), LoginReply);
|
||||
|
||||
int res = m_Server.Run();
|
||||
|
||||
Environment.Exit(res);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static void SendCommand(string module, string[] cmd)
|
||||
{
|
||||
string sendCmd = String.Join(" ", cmd);
|
||||
|
||||
Requester.MakeRequest("http://"+m_Host+":"+m_Port.ToString()+"/SessionCommand/", String.Format("ID={0}&COMMAND={1}", m_SessionID, sendCmd), CommandReply);
|
||||
}
|
||||
|
||||
public static void LoginReply(string requestUrl, string requestData, string replyData)
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
|
||||
doc.LoadXml(replyData);
|
||||
|
||||
XmlNodeList rootL = doc.GetElementsByTagName("ConsoleSession");
|
||||
if (rootL.Count != 1)
|
||||
{
|
||||
MainConsole.Instance.Output("Connection data info was not valid");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
XmlElement rootNode = (XmlElement)rootL[0];
|
||||
|
||||
if (rootNode == null)
|
||||
{
|
||||
MainConsole.Instance.Output("Connection data info was not valid");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
XmlNodeList helpNodeL = rootNode.GetElementsByTagName("HelpTree");
|
||||
if (helpNodeL.Count != 1)
|
||||
{
|
||||
MainConsole.Instance.Output("Connection data info was not valid");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
XmlElement helpNode = (XmlElement)helpNodeL[0];
|
||||
if (helpNode == null)
|
||||
{
|
||||
MainConsole.Instance.Output("Connection data info was not valid");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
XmlNodeList sessionL = rootNode.GetElementsByTagName("SessionID");
|
||||
if (sessionL.Count != 1)
|
||||
{
|
||||
MainConsole.Instance.Output("Connection data info was not valid");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
XmlElement sessionNode = (XmlElement)sessionL[0];
|
||||
if (sessionNode == null)
|
||||
{
|
||||
MainConsole.Instance.Output("Connection data info was not valid");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
if (!UUID.TryParse(sessionNode.InnerText, out m_SessionID))
|
||||
{
|
||||
MainConsole.Instance.Output("Connection data info was not valid");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
MainConsole.Instance.Commands.FromXml(helpNode, SendCommand);
|
||||
|
||||
Requester.MakeRequest("http://"+m_Host+":"+m_Port.ToString()+"/ReadResponses/"+m_SessionID.ToString()+"/", String.Empty, ReadResponses);
|
||||
}
|
||||
|
||||
public static void ReadResponses(string requestUrl, string requestData, string replyData)
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
|
||||
doc.LoadXml(replyData);
|
||||
|
||||
XmlNodeList rootNodeL = doc.GetElementsByTagName("ConsoleSession");
|
||||
if (rootNodeL.Count != 1 || rootNodeL[0] == null)
|
||||
{
|
||||
Requester.MakeRequest(requestUrl, requestData, ReadResponses);
|
||||
return;
|
||||
}
|
||||
|
||||
List<string> lines = new List<string>();
|
||||
|
||||
foreach (XmlNode part in rootNodeL[0].ChildNodes)
|
||||
{
|
||||
if (part.Name != "Line")
|
||||
continue;
|
||||
|
||||
lines.Add(part.InnerText);
|
||||
}
|
||||
|
||||
// Cut down scrollback to 100 lines (4 screens)
|
||||
// for the command line client
|
||||
//
|
||||
while (lines.Count > 100)
|
||||
lines.RemoveAt(0);
|
||||
|
||||
foreach (string l in lines)
|
||||
{
|
||||
string[] parts = l.Split(new char[] {':'}, 3);
|
||||
if (parts.Length != 3)
|
||||
continue;
|
||||
|
||||
MainConsole.Instance.Output(parts[2].Trim(), parts[1]);
|
||||
}
|
||||
|
||||
Requester.MakeRequest(requestUrl, requestData, ReadResponses);
|
||||
}
|
||||
|
||||
public static void CommandReply(string requestUrl, string requestData, string replyData)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using log4net;
|
||||
|
||||
namespace OpenSim.ConsoleClient
|
||||
{
|
||||
public delegate void ReplyDelegate(string requestUrl, string requestData, string replyData);
|
||||
|
||||
public class Requester
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public static void MakeRequest(string requestUrl, string data,
|
||||
ReplyDelegate action)
|
||||
{
|
||||
WebRequest request = WebRequest.Create(requestUrl);
|
||||
WebResponse response = null;
|
||||
|
||||
request.Method = "POST";
|
||||
|
||||
request.ContentType = "application/x-www-form-urlencoded";
|
||||
|
||||
byte[] buffer = new System.Text.ASCIIEncoding().GetBytes(data);
|
||||
int length = (int) buffer.Length;
|
||||
request.ContentLength = length;
|
||||
|
||||
request.BeginGetRequestStream(delegate(IAsyncResult res)
|
||||
{
|
||||
Stream requestStream = request.EndGetRequestStream(res);
|
||||
|
||||
requestStream.Write(buffer, 0, length);
|
||||
|
||||
request.BeginGetResponse(delegate(IAsyncResult ar)
|
||||
{
|
||||
string reply = String.Empty;
|
||||
|
||||
response = request.EndGetResponse(ar);
|
||||
|
||||
try
|
||||
{
|
||||
StreamReader r = new StreamReader(response.GetResponseStream());
|
||||
reply = r.ReadToEnd();
|
||||
|
||||
}
|
||||
catch (System.InvalidOperationException)
|
||||
{
|
||||
}
|
||||
|
||||
action(requestUrl, data, reply);
|
||||
}, null);
|
||||
}, null);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -168,6 +168,7 @@ namespace OpenSim.Data.MySQL
|
|||
}
|
||||
asset.Name = (string) dbReader["name"];
|
||||
asset.Type = (sbyte) dbReader["assetType"];
|
||||
asset.Temporary = (bool)dbReader["temporary"];
|
||||
}
|
||||
dbReader.Close();
|
||||
cmd.Dispose();
|
||||
|
@ -195,18 +196,11 @@ namespace OpenSim.Data.MySQL
|
|||
{
|
||||
lock (_dbConnection)
|
||||
{
|
||||
//m_log.Info("[ASSET DB]: Creating Asset " + asset.FullID);
|
||||
if (ExistsAsset(asset.FullID))
|
||||
{
|
||||
//m_log.Info("[ASSET DB]: Asset exists already, ignoring.");
|
||||
return;
|
||||
}
|
||||
|
||||
_dbConnection.CheckConnection();
|
||||
|
||||
MySqlCommand cmd =
|
||||
new MySqlCommand(
|
||||
"insert INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, data)" +
|
||||
"replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, data)" +
|
||||
"VALUES(?id, ?name, ?description, ?assetType, ?local, ?temporary, ?create_time, ?access_time, ?data)",
|
||||
_dbConnection.Connection);
|
||||
|
||||
|
|
|
@ -342,7 +342,7 @@ namespace OpenSim.Data.MySQL
|
|||
item.EveryOnePermissions = (uint) reader["inventoryEveryOnePermissions"];
|
||||
item.GroupPermissions = (uint) reader["inventoryGroupPermissions"];
|
||||
item.SalePrice = (int) reader["salePrice"];
|
||||
item.SaleType = Convert.ToByte(reader["saleType"]);
|
||||
item.SaleType = unchecked((byte)(Convert.ToSByte(reader["saleType"])));
|
||||
item.CreationDate = (int) reader["creationDate"];
|
||||
item.GroupOwned = Convert.ToBoolean(reader["groupOwned"]);
|
||||
item.Flags = (uint) reader["flags"];
|
||||
|
@ -423,7 +423,7 @@ namespace OpenSim.Data.MySQL
|
|||
/// <summary>
|
||||
/// Returns a specified inventory folder
|
||||
/// </summary>
|
||||
/// <param name="folder">The folder to return</param>
|
||||
/// <param name="folderID">The folder to return</param>
|
||||
/// <returns>A folder class</returns>
|
||||
public InventoryFolderBase getInventoryFolder(UUID folderID)
|
||||
{
|
||||
|
@ -438,8 +438,9 @@ namespace OpenSim.Data.MySQL
|
|||
result.Parameters.AddWithValue("?uuid", folderID.ToString());
|
||||
MySqlDataReader reader = result.ExecuteReader();
|
||||
|
||||
reader.Read();
|
||||
InventoryFolderBase folder = readInventoryFolder(reader);
|
||||
InventoryFolderBase folder = null;
|
||||
if (reader.Read())
|
||||
folder = readInventoryFolder(reader);
|
||||
reader.Close();
|
||||
result.Dispose();
|
||||
|
||||
|
@ -506,7 +507,7 @@ namespace OpenSim.Data.MySQL
|
|||
result.Parameters.AddWithValue("?inventoryEveryOnePermissions", item.EveryOnePermissions);
|
||||
result.Parameters.AddWithValue("?inventoryGroupPermissions", item.GroupPermissions);
|
||||
result.Parameters.AddWithValue("?salePrice", item.SalePrice);
|
||||
result.Parameters.AddWithValue("?saleType", item.SaleType);
|
||||
result.Parameters.AddWithValue("?saleType", unchecked((sbyte)item.SaleType));
|
||||
result.Parameters.AddWithValue("?creationDate", item.CreationDate);
|
||||
result.Parameters.AddWithValue("?groupID", item.GroupID);
|
||||
result.Parameters.AddWithValue("?groupOwned", item.GroupOwned);
|
||||
|
@ -603,7 +604,7 @@ namespace OpenSim.Data.MySQL
|
|||
cmd.Parameters.AddWithValue("?agentID", folder.Owner.ToString());
|
||||
cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString());
|
||||
cmd.Parameters.AddWithValue("?folderName", folderName);
|
||||
cmd.Parameters.AddWithValue("?type", (short) folder.Type);
|
||||
cmd.Parameters.AddWithValue("?type", folder.Type);
|
||||
cmd.Parameters.AddWithValue("?version", folder.Version);
|
||||
|
||||
try
|
||||
|
|
|
@ -834,7 +834,10 @@ namespace OpenSim.Data.MySQL
|
|||
// explicit conversion of integers is required, which sort
|
||||
// of sucks. No idea if there is a shortcut here or not.
|
||||
prim.CreationDate = Convert.ToInt32(row["CreationDate"]);
|
||||
prim.Name = (String) row["Name"];
|
||||
if (row["Name"] != DBNull.Value)
|
||||
prim.Name = (String)row["Name"];
|
||||
else
|
||||
prim.Name = string.Empty;
|
||||
// various text fields
|
||||
prim.Text = (String) row["Text"];
|
||||
prim.Color = Color.FromArgb(Convert.ToInt32(row["ColorA"]),
|
||||
|
@ -945,12 +948,12 @@ namespace OpenSim.Data.MySQL
|
|||
prim.DIE_AT_EDGE = true;
|
||||
|
||||
prim.SalePrice = Convert.ToInt32(row["SalePrice"]);
|
||||
prim.ObjectSaleType = Convert.ToByte(row["SaleType"]);
|
||||
prim.ObjectSaleType = unchecked((byte)Convert.ToSByte(row["SaleType"]));
|
||||
|
||||
prim.Material = Convert.ToByte(row["Material"]);
|
||||
prim.Material = unchecked((byte)Convert.ToSByte(row["Material"]));
|
||||
|
||||
if (!(row["ClickAction"] is DBNull))
|
||||
prim.ClickAction = (byte)Convert.ToByte(row["ClickAction"]);
|
||||
prim.ClickAction = unchecked((byte)Convert.ToSByte(row["ClickAction"]));
|
||||
|
||||
prim.CollisionSound = new UUID(row["CollisionSound"].ToString());
|
||||
prim.CollisionSoundVolume = Convert.ToSingle(row["CollisionSoundVolume"]);
|
||||
|
@ -1277,12 +1280,12 @@ namespace OpenSim.Data.MySQL
|
|||
cmd.Parameters.AddWithValue("DieAtEdge", 0);
|
||||
|
||||
cmd.Parameters.AddWithValue("SalePrice", prim.SalePrice);
|
||||
cmd.Parameters.AddWithValue("SaleType", Convert.ToInt16(prim.ObjectSaleType));
|
||||
cmd.Parameters.AddWithValue("SaleType", unchecked((sbyte)(prim.ObjectSaleType)));
|
||||
|
||||
byte clickAction = prim.ClickAction;
|
||||
cmd.Parameters.AddWithValue("ClickAction", clickAction);
|
||||
cmd.Parameters.AddWithValue("ClickAction", unchecked((sbyte)(clickAction)));
|
||||
|
||||
cmd.Parameters.AddWithValue("Material", prim.Material);
|
||||
cmd.Parameters.AddWithValue("Material", unchecked((sbyte)(prim.Material)));
|
||||
|
||||
cmd.Parameters.AddWithValue("CollisionSound", prim.CollisionSound.ToString());
|
||||
cmd.Parameters.AddWithValue("CollisionSoundVolume", prim.CollisionSoundVolume);
|
||||
|
|
|
@ -62,11 +62,18 @@ namespace OpenSim.Data.MySQL.Tests
|
|||
m_log.Error("Exception {0}", e);
|
||||
Assert.Ignore();
|
||||
}
|
||||
|
||||
// This actually does the roll forward assembly stuff
|
||||
Assembly assem = GetType().Assembly;
|
||||
Migration m = new Migration(database.Connection, assem, "GridStore");
|
||||
|
||||
m.Update();
|
||||
}
|
||||
|
||||
[TestFixtureTearDown]
|
||||
public void Cleanup()
|
||||
{
|
||||
m_log.Warn("Cleaning up.");
|
||||
if (db != null)
|
||||
{
|
||||
db.Dispose();
|
||||
|
@ -74,6 +81,7 @@ namespace OpenSim.Data.MySQL.Tests
|
|||
// if a new table is added, it has to be dropped here
|
||||
if (database != null)
|
||||
{
|
||||
database.ExecuteSql("drop table migrations");
|
||||
database.ExecuteSql("drop table regions");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,6 +53,7 @@ namespace OpenSim.Data.MySQL.Tests
|
|||
try
|
||||
{
|
||||
database = new MySQLManager(connect);
|
||||
DropTables();
|
||||
db = new MySQLInventoryData();
|
||||
db.Initialise(connect);
|
||||
}
|
||||
|
@ -72,10 +73,15 @@ namespace OpenSim.Data.MySQL.Tests
|
|||
}
|
||||
if (database != null)
|
||||
{
|
||||
database.ExecuteSql("drop table inventoryitems");
|
||||
database.ExecuteSql("drop table inventoryfolders");
|
||||
database.ExecuteSql("drop table migrations");
|
||||
DropTables();
|
||||
}
|
||||
}
|
||||
|
||||
private void DropTables()
|
||||
{
|
||||
database.ExecuteSql("drop table IF EXISTS inventoryitems");
|
||||
database.ExecuteSql("drop table IF EXISTS inventoryfolders");
|
||||
database.ExecuteSql("drop table IF EXISTS migrations");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -183,7 +183,7 @@ namespace OpenSim.Data.SQLite
|
|||
int assetLength = (asset.Data != null) ? asset.Data.Length : 0;
|
||||
|
||||
m_log.Info("[ASSET DB]: " +
|
||||
string.Format("Loaded {6} {5} Asset: [{0}][{3}] \"{1}\":{2} ({7} bytes)",
|
||||
string.Format("Loaded {5} {4} Asset: [{0}][{3}] \"{1}\":{2} ({6} bytes)",
|
||||
asset.FullID, asset.Name, asset.Description, asset.Type,
|
||||
temporary, local, assetLength));
|
||||
}
|
||||
|
|
|
@ -301,7 +301,8 @@ namespace OpenSim.Data.SQLite
|
|||
DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
|
||||
|
||||
inventoryRow = inventoryFolderTable.Rows.Find(item.Folder.ToString());
|
||||
inventoryRow["version"] = (int)inventoryRow["version"] + 1;
|
||||
if (inventoryRow != null) //MySQL doesn't throw an exception here, so sqlite shouldn't either.
|
||||
inventoryRow["version"] = (int)inventoryRow["version"] + 1;
|
||||
|
||||
invFoldersDa.Update(ds, "inventoryfolders");
|
||||
}
|
||||
|
|
|
@ -307,26 +307,21 @@ namespace OpenSim.Data.SQLite
|
|||
/// <param name="regionUUID">the region UUID</param>
|
||||
public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
|
||||
{
|
||||
uint flags = obj.RootPart.GetEffectiveObjectFlags();
|
||||
|
||||
// Eligibility check
|
||||
//
|
||||
if ((flags & (uint)PrimFlags.Temporary) != 0)
|
||||
return;
|
||||
if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0)
|
||||
return;
|
||||
|
||||
lock (ds)
|
||||
{
|
||||
foreach (SceneObjectPart prim in obj.Children.Values)
|
||||
{
|
||||
if ((prim.GetEffectiveObjectFlags() & (uint)PrimFlags.Temporary) == 0
|
||||
&& (prim.GetEffectiveObjectFlags() & (uint)PrimFlags.TemporaryOnRez) == 0)
|
||||
{
|
||||
m_log.Info("[REGION DB]: Adding obj: " + obj.UUID + " to region: " + regionUUID);
|
||||
addPrim(prim, obj.UUID, regionUUID);
|
||||
}
|
||||
else if (prim.Stopped)
|
||||
{
|
||||
//m_log.Info("[DATASTORE]: " +
|
||||
//"Adding stopped obj: " + obj.UUID + " to region: " + regionUUID);
|
||||
//addPrim(prim, obj.UUID.ToString(), regionUUID.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
// m_log.Info("[DATASTORE]: Ignoring Physical obj: " + obj.UUID + " in region: " + regionUUID);
|
||||
}
|
||||
m_log.Info("[REGION DB]: Adding obj: " + obj.UUID + " to region: " + regionUUID);
|
||||
addPrim(prim, obj.UUID, regionUUID);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1130,7 +1125,7 @@ namespace OpenSim.Data.SQLite
|
|||
// explicit conversion of integers is required, which sort
|
||||
// of sucks. No idea if there is a shortcut here or not.
|
||||
prim.CreationDate = Convert.ToInt32(row["CreationDate"]);
|
||||
prim.Name = (String) row["Name"];
|
||||
prim.Name = row["Name"] == DBNull.Value ? string.Empty : (string)row["Name"];
|
||||
// various text fields
|
||||
prim.Text = (String) row["Text"];
|
||||
prim.Color = Color.FromArgb(Convert.ToInt32(row["ColorA"]),
|
||||
|
|
|
@ -26,20 +26,19 @@
|
|||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using log4net.Config;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using log4net;
|
||||
using System.Reflection;
|
||||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
public class BasicAssetTest
|
||||
{
|
||||
//private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
public AssetDataBase db;
|
||||
public IAssetDataPlugin db;
|
||||
public UUID uuid1;
|
||||
public UUID uuid2;
|
||||
public UUID uuid3;
|
||||
|
@ -47,14 +46,7 @@ namespace OpenSim.Data.Tests
|
|||
|
||||
public void SuperInit()
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlConfigurator.Configure();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// I don't care, just leave log4net off
|
||||
}
|
||||
OpenSim.Tests.Common.TestLogging.LogToConsole();
|
||||
|
||||
uuid1 = UUID.Random();
|
||||
uuid2 = UUID.Random();
|
||||
|
@ -81,41 +73,59 @@ namespace OpenSim.Data.Tests
|
|||
a2.Data = asset1;
|
||||
a3.Data = asset1;
|
||||
|
||||
PropertyScrambler<AssetBase> scrambler = new PropertyScrambler<AssetBase>()
|
||||
.DontScramble(x => x.Data)
|
||||
.DontScramble(x => x.ID)
|
||||
.DontScramble(x => x.FullID)
|
||||
.DontScramble(x => x.Metadata.ID)
|
||||
.DontScramble(x => x.Metadata.FullID);
|
||||
|
||||
scrambler.Scramble(a1);
|
||||
scrambler.Scramble(a2);
|
||||
scrambler.Scramble(a3);
|
||||
|
||||
db.CreateAsset(a1);
|
||||
db.CreateAsset(a2);
|
||||
db.CreateAsset(a3);
|
||||
|
||||
|
||||
AssetBase a1a = db.FetchAsset(uuid1);
|
||||
Assert.That(a1.ID, Is.EqualTo(a1a.ID), "Assert.That(a1.ID, Is.EqualTo(a1a.ID))");
|
||||
Assert.That(a1.Name, Is.EqualTo(a1a.Name), "Assert.That(a1.Name, Is.EqualTo(a1a.Name))");
|
||||
Assert.That(a1a, Constraints.PropertyCompareConstraint(a1));
|
||||
|
||||
AssetBase a2a = db.FetchAsset(uuid2);
|
||||
Assert.That(a2.ID, Is.EqualTo(a2a.ID), "Assert.That(a2.ID, Is.EqualTo(a2a.ID))");
|
||||
Assert.That(a2.Name, Is.EqualTo(a2a.Name), "Assert.That(a2.Name, Is.EqualTo(a2a.Name))");
|
||||
Assert.That(a2a, Constraints.PropertyCompareConstraint(a2));
|
||||
|
||||
AssetBase a3a = db.FetchAsset(uuid3);
|
||||
Assert.That(a3.ID, Is.EqualTo(a3a.ID), "Assert.That(a3.ID, Is.EqualTo(a3a.ID))");
|
||||
Assert.That(a3.Name, Is.EqualTo(a3a.Name), "Assert.That(a3.Name, Is.EqualTo(a3a.Name))");
|
||||
}
|
||||
Assert.That(a3a, Constraints.PropertyCompareConstraint(a3));
|
||||
|
||||
scrambler.Scramble(a1a);
|
||||
scrambler.Scramble(a2a);
|
||||
scrambler.Scramble(a3a);
|
||||
|
||||
db.UpdateAsset(a1a);
|
||||
db.UpdateAsset(a2a);
|
||||
db.UpdateAsset(a3a);
|
||||
|
||||
AssetBase a1b = db.FetchAsset(uuid1);
|
||||
Assert.That(a1b, Constraints.PropertyCompareConstraint(a1a));
|
||||
|
||||
AssetBase a2b = db.FetchAsset(uuid2);
|
||||
Assert.That(a2b, Constraints.PropertyCompareConstraint(a2a));
|
||||
|
||||
AssetBase a3b = db.FetchAsset(uuid3);
|
||||
Assert.That(a3b, Constraints.PropertyCompareConstraint(a3a));
|
||||
|
||||
[Test]
|
||||
public void T011_ExistsSimpleAsset()
|
||||
{
|
||||
Assert.That(db.ExistsAsset(uuid1), Is.True);
|
||||
Assert.That(db.ExistsAsset(uuid2), Is.True);
|
||||
Assert.That(db.ExistsAsset(uuid3), Is.True);
|
||||
}
|
||||
|
||||
// this has questionable use, but it is in the interface at the moment.
|
||||
// [Test]
|
||||
// public void T012_DeleteAsset()
|
||||
// {
|
||||
// db.DeleteAsset(uuid1);
|
||||
// db.DeleteAsset(uuid2);
|
||||
// db.DeleteAsset(uuid3);
|
||||
// Assert.That(db.ExistsAsset(uuid1), Is.False);
|
||||
// Assert.That(db.ExistsAsset(uuid2), Is.False);
|
||||
// Assert.That(db.ExistsAsset(uuid3), Is.False);
|
||||
// }
|
||||
List<AssetMetadata> metadatas = db.FetchAssetMetadataSet(0, 1000);
|
||||
|
||||
AssetMetadata metadata = metadatas.Find(x => x.FullID == uuid1);
|
||||
Assert.That(metadata.Name, Is.EqualTo(a1b.Name));
|
||||
Assert.That(metadata.Description, Is.EqualTo(a1b.Description));
|
||||
Assert.That(metadata.Type, Is.EqualTo(a1b.Type));
|
||||
Assert.That(metadata.Temporary, Is.EqualTo(a1b.Temporary));
|
||||
Assert.That(metadata.FullID, Is.EqualTo(a1b.FullID));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,6 @@ namespace OpenSim.Data.Tests
|
|||
{
|
||||
public class BasicEstateTest
|
||||
{
|
||||
//private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
public IEstateDataStore db;
|
||||
public IRegionDataStore regionDb;
|
||||
|
||||
|
@ -57,14 +56,7 @@ namespace OpenSim.Data.Tests
|
|||
|
||||
public void SuperInit()
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlConfigurator.Configure();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// I don't care, just leave log4net off
|
||||
}
|
||||
OpenSim.Tests.Common.TestLogging.LogToConsole();
|
||||
}
|
||||
|
||||
#region 0Tests
|
||||
|
@ -162,6 +154,24 @@ namespace OpenSim.Data.Tests
|
|||
);
|
||||
}
|
||||
|
||||
[Test]
|
||||
private void T012_EstateSettingsRandomStorage()
|
||||
{
|
||||
|
||||
// Letting estate store generate rows to database for us
|
||||
EstateSettings originalSettings = db.LoadEstateSettings(REGION_ID);
|
||||
new PropertyScrambler<EstateSettings>().Scramble(originalSettings);
|
||||
|
||||
// Saving settings.
|
||||
db.StoreEstateSettings(originalSettings);
|
||||
|
||||
// Loading settings to another instance variable.
|
||||
EstateSettings loadedSettings = db.LoadEstateSettings(REGION_ID);
|
||||
|
||||
// Checking that loaded values are correct.
|
||||
Assert.That(loadedSettings, Constraints.PropertyCompareConstraint(originalSettings));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T020_EstateSettingsManagerList()
|
||||
{
|
||||
|
|
|
@ -28,81 +28,47 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using log4net.Config;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using log4net;
|
||||
using System.Reflection;
|
||||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
public class BasicGridTest
|
||||
{
|
||||
//private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
public GridDataBase db;
|
||||
public IGridDataPlugin db;
|
||||
public UUID region1, region2, region3;
|
||||
public UUID zero = UUID.Zero;
|
||||
public static Random random;
|
||||
public static Random random = new Random();
|
||||
|
||||
[TearDown]
|
||||
public void removeAllRegions()
|
||||
{
|
||||
// Clean up all the regions.
|
||||
foreach (RegionProfileData region in db.GetRegionsByName("", 100))
|
||||
List<RegionProfileData> regions = db.GetRegionsByName("", 100);
|
||||
if (regions != null)
|
||||
{
|
||||
db.DeleteProfile(region.Uuid.ToString());
|
||||
foreach (RegionProfileData region in regions)
|
||||
{
|
||||
db.DeleteProfile(region.Uuid.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SuperInit()
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlConfigurator.Configure();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// I don't care, just leave log4net off
|
||||
}
|
||||
OpenSim.Tests.Common.TestLogging.LogToConsole();
|
||||
region1 = UUID.Random();
|
||||
region2 = UUID.Random();
|
||||
region3 = UUID.Random();
|
||||
random = new Random();
|
||||
}
|
||||
|
||||
protected RegionProfileData createRegion(UUID regionUUID, string regionName)
|
||||
{
|
||||
RegionProfileData reg = new RegionProfileData();
|
||||
new PropertyScrambler<RegionProfileData>().Scramble(reg);
|
||||
reg.Uuid = regionUUID;
|
||||
reg.RegionName = regionName;
|
||||
reg.RegionHandle = (ulong) random.Next();
|
||||
reg.RegionLocX = (uint) random.Next();
|
||||
reg.RegionLocY = (uint) random.Next();
|
||||
reg.RegionLocZ = (uint) random.Next();
|
||||
reg.RegionSendKey = RandomName();
|
||||
reg.RegionRecvKey = RandomName();
|
||||
reg.RegionSecret = RandomName();
|
||||
reg.RegionOnline = false;
|
||||
reg.ServerIP = RandomName();
|
||||
reg.ServerPort = (uint) random.Next();
|
||||
reg.ServerURI = RandomName();
|
||||
reg.ServerHttpPort = (uint) random.Next();
|
||||
reg.ServerRemotingPort = (uint) random.Next();
|
||||
reg.NorthOverrideHandle = (ulong) random.Next();
|
||||
reg.SouthOverrideHandle = (ulong) random.Next();
|
||||
reg.EastOverrideHandle = (ulong) random.Next();
|
||||
reg.WestOverrideHandle = (ulong) random.Next();
|
||||
reg.RegionDataURI = RandomName();
|
||||
reg.RegionAssetURI = RandomName();
|
||||
reg.RegionAssetSendKey = RandomName();
|
||||
reg.RegionAssetRecvKey = RandomName();
|
||||
reg.RegionUserURI = RandomName();
|
||||
reg.RegionUserSendKey = RandomName();
|
||||
reg.RegionUserRecvKey = RandomName();
|
||||
reg.RegionMapTextureID = UUID.Random();
|
||||
reg.Owner_uuid = UUID.Random();
|
||||
reg.OriginUUID = UUID.Random();
|
||||
|
||||
db.AddProfile(reg);
|
||||
|
||||
|
@ -118,48 +84,13 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(db.GetProfileByUUID(zero),Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T999_StillNull()
|
||||
{
|
||||
Assert.That(db.GetProfileByUUID(zero),Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T011_AddRetrieveCompleteTest()
|
||||
{
|
||||
RegionProfileData newreg = createRegion(region2, "|<Goth@m Ci1y>|");
|
||||
RegionProfileData retreg = db.GetProfileByUUID(region2);
|
||||
|
||||
Assert.That(retreg.RegionName, Is.EqualTo(newreg.RegionName), "Assert.That(retreg.RegionName, Is.EqualTo(newreg.RegionName))");
|
||||
Assert.That(retreg.Uuid, Is.EqualTo(region2), "Assert.That(retreg.Uuid, Is.EqualTo(region2))");
|
||||
Assert.That(retreg.RegionHandle, Is.EqualTo(newreg.RegionHandle), "Assert.That(retreg.RegionHandle, Is.EqualTo(newreg.RegionHandle))");
|
||||
Assert.That(retreg.RegionLocX, Is.EqualTo(newreg.RegionLocX), "Assert.That(retreg.RegionLocX, Is.EqualTo(newreg.RegionLocX))");
|
||||
Assert.That(retreg.RegionLocY, Is.EqualTo(newreg.RegionLocY), "Assert.That(retreg.RegionLocY, Is.EqualTo(newreg.RegionLocY))");
|
||||
Assert.That(retreg.RegionLocZ, Is.EqualTo(newreg.RegionLocZ), "Assert.That(retreg.RegionLocZ, Is.EqualTo(newreg.RegionLocZ))");
|
||||
Assert.That(retreg.RegionSendKey, Is.EqualTo(newreg.RegionSendKey), "Assert.That(retreg.RegionSendKey, Is.EqualTo(newreg.RegionSendKey))");
|
||||
Assert.That(retreg.RegionRecvKey, Is.EqualTo(newreg.RegionRecvKey), "Assert.That(retreg.RegionRecvKey, Is.EqualTo(newreg.RegionRecvKey))");
|
||||
Assert.That(retreg.RegionSecret, Is.EqualTo(newreg.RegionSecret), "Assert.That(retreg.RegionSecret, Is.EqualTo(newreg.RegionSecret))");
|
||||
Assert.That(retreg.RegionOnline, Is.EqualTo(newreg.RegionOnline), "Assert.That(retreg.RegionOnline, Is.EqualTo(newreg.RegionOnline))");
|
||||
Assert.That(retreg.OriginUUID, Is.EqualTo(newreg.OriginUUID), "Assert.That(retreg.OriginUUID, Is.EqualTo(newreg.OriginUUID))");
|
||||
Assert.That(retreg.ServerIP, Is.EqualTo(newreg.ServerIP), "Assert.That(retreg.ServerIP, Is.EqualTo(newreg.ServerIP))");
|
||||
Assert.That(retreg.ServerPort, Is.EqualTo(newreg.ServerPort), "Assert.That(retreg.ServerPort, Is.EqualTo(newreg.ServerPort))");
|
||||
Assert.That(retreg.ServerURI, Is.EqualTo(newreg.ServerURI), "Assert.That(retreg.ServerURI, Is.EqualTo(newreg.ServerURI))");
|
||||
Assert.That(retreg.ServerHttpPort, Is.EqualTo(newreg.ServerHttpPort), "Assert.That(retreg.ServerHttpPort, Is.EqualTo(newreg.ServerHttpPort))");
|
||||
Assert.That(retreg.ServerRemotingPort, Is.EqualTo(newreg.ServerRemotingPort), "Assert.That(retreg.ServerRemotingPort, Is.EqualTo(newreg.ServerRemotingPort))");
|
||||
Assert.That(retreg.NorthOverrideHandle, Is.EqualTo(newreg.NorthOverrideHandle), "Assert.That(retreg.NorthOverrideHandle, Is.EqualTo(newreg.NorthOverrideHandle))");
|
||||
Assert.That(retreg.SouthOverrideHandle, Is.EqualTo(newreg.SouthOverrideHandle), "Assert.That(retreg.SouthOverrideHandle, Is.EqualTo(newreg.SouthOverrideHandle))");
|
||||
Assert.That(retreg.EastOverrideHandle, Is.EqualTo(newreg.EastOverrideHandle), "Assert.That(retreg.EastOverrideHandle, Is.EqualTo(newreg.EastOverrideHandle))");
|
||||
Assert.That(retreg.WestOverrideHandle, Is.EqualTo(newreg.WestOverrideHandle), "Assert.That(retreg.WestOverrideHandle, Is.EqualTo(newreg.WestOverrideHandle))");
|
||||
Assert.That(retreg.RegionDataURI, Is.EqualTo(newreg.RegionDataURI), "Assert.That(retreg.RegionDataURI, Is.EqualTo(newreg.RegionDataURI))");
|
||||
Assert.That(retreg.RegionAssetURI, Is.EqualTo(newreg.RegionAssetURI), "Assert.That(retreg.RegionAssetURI, Is.EqualTo(newreg.RegionAssetURI))");
|
||||
Assert.That(retreg.RegionAssetSendKey, Is.EqualTo(newreg.RegionAssetSendKey), "Assert.That(retreg.RegionAssetSendKey, Is.EqualTo(newreg.RegionAssetSendKey))");
|
||||
Assert.That(retreg.RegionAssetRecvKey, Is.EqualTo(newreg.RegionAssetRecvKey), "Assert.That(retreg.RegionAssetRecvKey, Is.EqualTo(newreg.RegionAssetRecvKey))");
|
||||
Assert.That(retreg.RegionUserURI, Is.EqualTo(newreg.RegionUserURI), "Assert.That(retreg.RegionUserURI, Is.EqualTo(newreg.RegionUserURI))");
|
||||
Assert.That(retreg.RegionUserSendKey, Is.EqualTo(newreg.RegionUserSendKey), "Assert.That(retreg.RegionUserSendKey, Is.EqualTo(newreg.RegionUserSendKey))");
|
||||
Assert.That(retreg.RegionUserRecvKey, Is.EqualTo(newreg.RegionUserRecvKey), "Assert.That(retreg.RegionUserRecvKey, Is.EqualTo(newreg.RegionUserRecvKey))");
|
||||
Assert.That(retreg.RegionMapTextureID, Is.EqualTo(newreg.RegionMapTextureID), "Assert.That(retreg.RegionMapTextureID, Is.EqualTo(newreg.RegionMapTextureID))");
|
||||
Assert.That(retreg.Owner_uuid, Is.EqualTo(newreg.Owner_uuid), "Assert.That(retreg.Owner_uuid, Is.EqualTo(newreg.Owner_uuid))");
|
||||
Assert.That(retreg.OriginUUID, Is.EqualTo(newreg.OriginUUID), "Assert.That(retreg.OriginUUID, Is.EqualTo(newreg.OriginUUID))");
|
||||
Assert.That(retreg, Constraints.PropertyCompareConstraint(newreg).IgnoreProperty(x => x.RegionOnline));
|
||||
|
||||
retreg = db.GetProfileByHandle(newreg.RegionHandle);
|
||||
Assert.That(retreg.Uuid, Is.EqualTo(region2), "Assert.That(retreg.Uuid, Is.EqualTo(region2))");
|
||||
|
@ -220,6 +151,12 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(listreg[1].Uuid, Is.EqualTo(region1) | Is.EqualTo(region2), "Assert.That(listreg[1].Uuid, Is.EqualTo(region1) | Is.EqualTo(region2))");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T999_StillNull()
|
||||
{
|
||||
Assert.That(db.GetProfileByUUID(zero), Is.Null);
|
||||
}
|
||||
|
||||
protected static string RandomName()
|
||||
{
|
||||
StringBuilder name = new StringBuilder();
|
||||
|
|
|
@ -66,14 +66,7 @@ namespace OpenSim.Data.Tests
|
|||
|
||||
public void SuperInit()
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlConfigurator.Configure();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// I don't care, just leave log4net off
|
||||
}
|
||||
OpenSim.Tests.Common.TestLogging.LogToConsole();
|
||||
|
||||
folder1 = UUID.Random();
|
||||
folder2 = UUID.Random();
|
||||
|
@ -115,16 +108,6 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(db.getUserRootFolder(owner1), Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T999_StillNull()
|
||||
{
|
||||
// After all tests are run, these should still return no results
|
||||
Assert.That(db.getInventoryFolder(zero), Is.Null);
|
||||
Assert.That(db.getInventoryItem(zero), Is.Null);
|
||||
Assert.That(db.getUserRootFolder(zero), Is.Null);
|
||||
Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0))");
|
||||
}
|
||||
|
||||
// 01x - folder tests
|
||||
[Test]
|
||||
public void T010_FolderNonParent()
|
||||
|
@ -248,7 +231,7 @@ namespace OpenSim.Data.Tests
|
|||
}
|
||||
|
||||
[Test]
|
||||
public void T103UpdateItem()
|
||||
public void T103_UpdateItem()
|
||||
{
|
||||
// TODO: probably shouldn't have the ability to have an
|
||||
// owner of an item in a folder not owned by the user
|
||||
|
@ -265,6 +248,71 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(i1.Owner, Is.EqualTo(owner2), "Assert.That(i1.Owner, Is.EqualTo(owner2))");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T104_RandomUpdateItem()
|
||||
{
|
||||
PropertyScrambler<InventoryFolderBase> folderScrambler =
|
||||
new PropertyScrambler<InventoryFolderBase>()
|
||||
.DontScramble(x => x.Owner)
|
||||
.DontScramble(x => x.ParentID)
|
||||
.DontScramble(x => x.ID);
|
||||
UUID owner = UUID.Random();
|
||||
UUID folder = UUID.Random();
|
||||
UUID rootId = UUID.Random();
|
||||
UUID rootAsset = UUID.Random();
|
||||
InventoryFolderBase f1 = NewFolder(folder, zero, owner, name1);
|
||||
folderScrambler.Scramble(f1);
|
||||
|
||||
db.addInventoryFolder(f1);
|
||||
InventoryFolderBase f1a = db.getUserRootFolder(owner);
|
||||
Assert.That(f1a, Constraints.PropertyCompareConstraint(f1));
|
||||
|
||||
folderScrambler.Scramble(f1a);
|
||||
|
||||
db.updateInventoryFolder(f1a);
|
||||
|
||||
InventoryFolderBase f1b = db.getUserRootFolder(owner);
|
||||
Assert.That(f1b, Constraints.PropertyCompareConstraint(f1a));
|
||||
|
||||
//Now we have a valid folder to insert into, we can insert the item.
|
||||
PropertyScrambler<InventoryItemBase> inventoryScrambler =
|
||||
new PropertyScrambler<InventoryItemBase>()
|
||||
.DontScramble(x => x.ID)
|
||||
.DontScramble(x => x.AssetID)
|
||||
.DontScramble(x => x.Owner)
|
||||
.DontScramble(x => x.Folder);
|
||||
InventoryItemBase root = NewItem(rootId, folder, owner, iname1, rootAsset);
|
||||
inventoryScrambler.Scramble(root);
|
||||
db.addInventoryItem(root);
|
||||
|
||||
InventoryItemBase expected = db.getInventoryItem(rootId);
|
||||
Assert.That(expected, Constraints.PropertyCompareConstraint(root)
|
||||
.IgnoreProperty(x => x.InvType)
|
||||
.IgnoreProperty(x => x.CreatorIdAsUuid)
|
||||
.IgnoreProperty(x => x.Description)
|
||||
.IgnoreProperty(x => x.CreatorId));
|
||||
|
||||
inventoryScrambler.Scramble(expected);
|
||||
db.updateInventoryItem(expected);
|
||||
|
||||
InventoryItemBase actual = db.getInventoryItem(rootId);
|
||||
Assert.That(actual, Constraints.PropertyCompareConstraint(expected)
|
||||
.IgnoreProperty(x => x.InvType)
|
||||
.IgnoreProperty(x => x.CreatorIdAsUuid)
|
||||
.IgnoreProperty(x => x.Description)
|
||||
.IgnoreProperty(x => x.CreatorId));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T999_StillNull()
|
||||
{
|
||||
// After all tests are run, these should still return no results
|
||||
Assert.That(db.getInventoryFolder(zero), Is.Null);
|
||||
Assert.That(db.getInventoryItem(zero), Is.Null);
|
||||
Assert.That(db.getUserRootFolder(zero), Is.Null);
|
||||
Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0), "Assert.That(db.getInventoryInFolder(zero).Count, Is.EqualTo(0))");
|
||||
}
|
||||
|
||||
private InventoryItemBase NewItem(UUID id, UUID parent, UUID owner, string name, UUID asset)
|
||||
{
|
||||
InventoryItemBase i = new InventoryItemBase();
|
||||
|
|
|
@ -71,14 +71,7 @@ namespace OpenSim.Data.Tests
|
|||
|
||||
public void SuperInit()
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlConfigurator.Configure();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// I don't care, just leave log4net off
|
||||
}
|
||||
OpenSim.Tests.Common.TestLogging.LogToConsole();
|
||||
|
||||
region1 = UUID.Random();
|
||||
region3 = UUID.Random();
|
||||
|
@ -532,6 +525,62 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(cursop.Acceleration,Is.EqualTo(parts[i].Acceleration), "Assert.That(cursop.Acceleration,Is.EqualTo(parts[i].Acceleration))");
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T016_RandomSogWithSceneParts()
|
||||
{
|
||||
PropertyScrambler<SceneObjectPart> scrambler =
|
||||
new PropertyScrambler<SceneObjectPart>()
|
||||
.DontScramble(x => x.UUID);
|
||||
UUID tmpSog = UUID.Random();
|
||||
UUID tmp1 = UUID.Random();
|
||||
UUID tmp2 = UUID.Random();
|
||||
UUID tmp3 = UUID.Random();
|
||||
UUID newregion = UUID.Random();
|
||||
SceneObjectPart p1 = new SceneObjectPart();
|
||||
SceneObjectPart p2 = new SceneObjectPart();
|
||||
SceneObjectPart p3 = new SceneObjectPart();
|
||||
p1.Shape = PrimitiveBaseShape.Default;
|
||||
p2.Shape = PrimitiveBaseShape.Default;
|
||||
p3.Shape = PrimitiveBaseShape.Default;
|
||||
p1.UUID = tmp1;
|
||||
p2.UUID = tmp2;
|
||||
p3.UUID = tmp3;
|
||||
scrambler.Scramble(p1);
|
||||
scrambler.Scramble(p2);
|
||||
scrambler.Scramble(p3);
|
||||
|
||||
SceneObjectGroup sog = NewSOG("Sop 0", tmpSog, newregion);
|
||||
PropertyScrambler<SceneObjectGroup> sogScrambler =
|
||||
new PropertyScrambler<SceneObjectGroup>()
|
||||
.DontScramble(x => x.UUID);
|
||||
sogScrambler.Scramble(sog);
|
||||
sog.UUID = tmpSog;
|
||||
sog.AddPart(p1);
|
||||
sog.AddPart(p2);
|
||||
sog.AddPart(p3);
|
||||
|
||||
SceneObjectPart[] parts = sog.GetParts();
|
||||
Assert.That(parts.Length, Is.EqualTo(4), "Assert.That(parts.Length,Is.EqualTo(4))");
|
||||
|
||||
db.StoreObject(sog, newregion);
|
||||
List<SceneObjectGroup> sogs = db.LoadObjects(newregion);
|
||||
Assert.That(sogs.Count, Is.EqualTo(1), "Assert.That(sogs.Count,Is.EqualTo(1))");
|
||||
SceneObjectGroup newsog = sogs[0];
|
||||
|
||||
SceneObjectPart[] newparts = newsog.GetParts();
|
||||
Assert.That(newparts.Length, Is.EqualTo(4), "Assert.That(newparts.Length,Is.EqualTo(4))");
|
||||
|
||||
Assert.That(newsog, Constraints.PropertyCompareConstraint(sog)
|
||||
.IgnoreProperty(x=>x.LocalId)
|
||||
.IgnoreProperty(x=>x.HasGroupChanged)
|
||||
.IgnoreProperty(x=>x.IsSelected)
|
||||
.IgnoreProperty(x=>x.RegionHandle)
|
||||
.IgnoreProperty(x=>x.RegionUUID)
|
||||
.IgnoreProperty(x=>x.Scene)
|
||||
.IgnoreProperty(x=>x.Children)
|
||||
.IgnoreProperty(x=>x.RootPart));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T020_PrimInventoryEmpty()
|
||||
|
|
|
@ -71,14 +71,7 @@ namespace OpenSim.Data.Tests
|
|||
|
||||
public void SuperInit()
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlConfigurator.Configure();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// I don't care, just leave log4net off
|
||||
}
|
||||
OpenSim.Tests.Common.TestLogging.LogToConsole();
|
||||
random = new Random();
|
||||
user1 = UUID.Random();
|
||||
user2 = UUID.Random();
|
||||
|
@ -117,13 +110,6 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(db.GetAgentByUUID(UUID.Random()), Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T999_StillNull()
|
||||
{
|
||||
Assert.That(db.GetUserByUUID(zero), Is.Null);
|
||||
Assert.That(db.GetAgentByUUID(zero), Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T010_CreateUser()
|
||||
{
|
||||
|
@ -396,6 +382,22 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(customtype,Is.EqualTo(u1a.CustomType), "Assert.That(customtype,Is.EqualTo(u1a.CustomType))");
|
||||
Assert.That(partner,Is.EqualTo(u1a.Partner), "Assert.That(partner,Is.EqualTo(u1a.Partner))");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T017_UserUpdateRandomPersistency()
|
||||
{
|
||||
UUID id = user5;
|
||||
UserProfileData u = db.GetUserByUUID(id);
|
||||
new PropertyScrambler<UserProfileData>().DontScramble(x=>x.ID).Scramble(u);
|
||||
|
||||
db.UpdateUserProfile(u);
|
||||
UserProfileData u1a = db.GetUserByUUID(id);
|
||||
Assert.That(u1a, Constraints.PropertyCompareConstraint(u)
|
||||
.IgnoreProperty(x=>x.HomeRegionX)
|
||||
.IgnoreProperty(x=>x.HomeRegionY)
|
||||
.IgnoreProperty(x=>x.RootInventoryFolderID)
|
||||
);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T020_CreateAgent()
|
||||
|
@ -660,6 +662,13 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(avatarheight,Is.EqualTo(app.AvatarHeight), "Assert.That(avatarheight,Is.EqualTo(app.AvatarHeight))");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void T999_StillNull()
|
||||
{
|
||||
Assert.That(db.GetUserByUUID(zero), Is.Null);
|
||||
Assert.That(db.GetAgentByUUID(zero), Is.Null);
|
||||
}
|
||||
|
||||
public UserProfileData NewUser(UUID id,string fname,string lname)
|
||||
{
|
||||
UserProfileData u = new UserProfileData();
|
||||
|
|
|
@ -1,3 +1,30 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
@ -42,6 +69,28 @@ namespace OpenSim.Data.Tests
|
|||
|
||||
private bool ObjectCompare(object expected, object actual, Stack<string> propertyNames)
|
||||
{
|
||||
//If they are both null, they are equal
|
||||
if (actual == null && expected == null)
|
||||
return true;
|
||||
|
||||
//If only one is null, then they aren't
|
||||
if (actual == null || expected == null)
|
||||
{
|
||||
failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
|
||||
failingActual = actual;
|
||||
failingExpected = expected;
|
||||
return false;
|
||||
}
|
||||
|
||||
//prevent loops...
|
||||
if (propertyNames.Count > 50)
|
||||
{
|
||||
failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
|
||||
failingActual = actual;
|
||||
failingExpected = expected;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (actual.GetType() != expected.GetType())
|
||||
{
|
||||
propertyNames.Push("GetType()");
|
||||
|
@ -52,7 +101,7 @@ namespace OpenSim.Data.Tests
|
|||
return false;
|
||||
}
|
||||
|
||||
if(actual.GetType() == typeof(Color))
|
||||
if (actual.GetType() == typeof(Color))
|
||||
{
|
||||
Color actualColor = (Color) actual;
|
||||
Color expectedColor = (Color) expected;
|
||||
|
@ -95,6 +144,60 @@ namespace OpenSim.Data.Tests
|
|||
return true;
|
||||
}
|
||||
|
||||
IComparable comp = actual as IComparable;
|
||||
if (comp != null)
|
||||
{
|
||||
if (comp.CompareTo(expected) != 0)
|
||||
{
|
||||
failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
|
||||
failingActual = actual;
|
||||
failingExpected = expected;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//Now try the much more annoying IComparable<T>
|
||||
Type icomparableInterface = actual.GetType().GetInterface("IComparable`1");
|
||||
if (icomparableInterface != null)
|
||||
{
|
||||
int result = (int)icomparableInterface.GetMethod("CompareTo").Invoke(actual, new[] { expected });
|
||||
if (result != 0)
|
||||
{
|
||||
failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
|
||||
failingActual = actual;
|
||||
failingExpected = expected;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
IEnumerable arr = actual as IEnumerable;
|
||||
if (arr != null)
|
||||
{
|
||||
List<object> actualList = arr.Cast<object>().ToList();
|
||||
List<object> expectedList = ((IEnumerable)expected).Cast<object>().ToList();
|
||||
if (actualList.Count != expectedList.Count)
|
||||
{
|
||||
propertyNames.Push("Count");
|
||||
failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
|
||||
failingActual = actualList.Count;
|
||||
failingExpected = expectedList.Count;
|
||||
propertyNames.Pop();
|
||||
return false;
|
||||
}
|
||||
//actualList and expectedList should be the same size.
|
||||
for (int i = 0; i < actualList.Count; i++)
|
||||
{
|
||||
propertyNames.Push("[" + i + "]");
|
||||
if (!ObjectCompare(expectedList[i], actualList[i], propertyNames))
|
||||
return false;
|
||||
propertyNames.Pop();
|
||||
}
|
||||
//Everything seems okay...
|
||||
return true;
|
||||
}
|
||||
|
||||
//Skip static properties. I had a nasty problem comparing colors because of all of the public static colors.
|
||||
PropertyInfo[] properties = expected.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
|
||||
foreach (var property in properties)
|
||||
|
@ -105,56 +208,6 @@ namespace OpenSim.Data.Tests
|
|||
object actualValue = property.GetValue(actual, null);
|
||||
object expectedValue = property.GetValue(expected, null);
|
||||
|
||||
//If they are both null, they are equal
|
||||
if (actualValue == null && expectedValue == null)
|
||||
continue;
|
||||
|
||||
//If only one is null, then they aren't
|
||||
if (actualValue == null || expectedValue == null)
|
||||
{
|
||||
propertyNames.Push(property.Name);
|
||||
failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
|
||||
propertyNames.Pop();
|
||||
failingActual = actualValue;
|
||||
failingExpected = expectedValue;
|
||||
return false;
|
||||
}
|
||||
|
||||
IComparable comp = actualValue as IComparable;
|
||||
if (comp != null)
|
||||
{
|
||||
if (comp.CompareTo(expectedValue) != 0)
|
||||
{
|
||||
propertyNames.Push(property.Name);
|
||||
failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
|
||||
propertyNames.Pop();
|
||||
failingActual = actualValue;
|
||||
failingExpected = expectedValue;
|
||||
return false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
IEnumerable arr = actualValue as IEnumerable;
|
||||
if (arr != null)
|
||||
{
|
||||
List<object> actualList = arr.Cast<object>().ToList();
|
||||
List<object> expectedList = ((IEnumerable)expectedValue).Cast<object>().ToList();
|
||||
if (actualList.Count != expectedList.Count)
|
||||
{
|
||||
propertyNames.Push(property.Name);
|
||||
propertyNames.Push("Count");
|
||||
failingPropertyName = string.Join(".", propertyNames.Reverse().ToArray());
|
||||
failingActual = actualList.Count;
|
||||
failingExpected = expectedList.Count;
|
||||
propertyNames.Pop();
|
||||
propertyNames.Pop();
|
||||
}
|
||||
//Todo: A value-wise comparison of all of the values.
|
||||
//Everything seems okay...
|
||||
continue;
|
||||
}
|
||||
|
||||
propertyNames.Push(property.Name);
|
||||
if (!ObjectCompare(expectedValue, actualValue, propertyNames))
|
||||
return false;
|
||||
|
@ -196,15 +249,7 @@ namespace OpenSim.Data.Tests
|
|||
{
|
||||
//If the inside of the lambda is the access to x, we've hit the end of the chain.
|
||||
// We should track by the fully scoped parameter name, but this is the first rev of doing this.
|
||||
if (((MemberExpression)express).Expression is ParameterExpression)
|
||||
{
|
||||
ignores.Add(((MemberExpression)express).Member.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Otherwise there could be more parameters inside...
|
||||
PullApartExpression(((MemberExpression)express).Expression);
|
||||
}
|
||||
ignores.Add(((MemberExpression)express).Member.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -243,7 +288,7 @@ namespace OpenSim.Data.Tests
|
|||
{
|
||||
HasInt actual = new HasInt { TheValue = 5 };
|
||||
HasInt expected = new HasInt { TheValue = 4 };
|
||||
var constraint = Constraints.PropertyCompareConstraint(expected).IgnoreProperty(x=>x.TheValue);
|
||||
var constraint = Constraints.PropertyCompareConstraint(expected).IgnoreProperty(x => x.TheValue);
|
||||
|
||||
Assert.That(constraint.Matches(actual), Is.True);
|
||||
}
|
||||
|
@ -284,6 +329,28 @@ namespace OpenSim.Data.Tests
|
|||
Assert.That(constraint.Matches(actual), Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void UUIDShouldMatch()
|
||||
{
|
||||
UUID uuid1 = UUID.Random();
|
||||
UUID uuid2 = UUID.Parse(uuid1.ToString());
|
||||
|
||||
var constraint = Constraints.PropertyCompareConstraint(uuid1);
|
||||
|
||||
Assert.That(constraint.Matches(uuid2), Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void UUIDShouldNotMatch()
|
||||
{
|
||||
UUID uuid1 = UUID.Random();
|
||||
UUID uuid2 = UUID.Random();
|
||||
|
||||
var constraint = Constraints.PropertyCompareConstraint(uuid1);
|
||||
|
||||
Assert.That(constraint.Matches(uuid2), Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestColors()
|
||||
{
|
||||
|
@ -294,5 +361,53 @@ namespace OpenSim.Data.Tests
|
|||
|
||||
Assert.That(constraint.Matches(actual), Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShouldCompareLists()
|
||||
{
|
||||
List<int> expected = new List<int> { 1, 2, 3 };
|
||||
List<int> actual = new List<int> { 1, 2, 3 };
|
||||
|
||||
var constraint = Constraints.PropertyCompareConstraint(expected);
|
||||
Assert.That(constraint.Matches(actual), Is.True);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void ShouldFailToCompareListsThatAreDifferent()
|
||||
{
|
||||
List<int> expected = new List<int> { 1, 2, 3 };
|
||||
List<int> actual = new List<int> { 1, 2, 4 };
|
||||
|
||||
var constraint = Constraints.PropertyCompareConstraint(expected);
|
||||
Assert.That(constraint.Matches(actual), Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ShouldFailToCompareListsThatAreDifferentLengths()
|
||||
{
|
||||
List<int> expected = new List<int> { 1, 2, 3 };
|
||||
List<int> actual = new List<int> { 1, 2 };
|
||||
|
||||
var constraint = Constraints.PropertyCompareConstraint(expected);
|
||||
Assert.That(constraint.Matches(actual), Is.False);
|
||||
}
|
||||
|
||||
public class Recursive
|
||||
{
|
||||
public Recursive Other { get; set; }
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ErrorsOutOnRecursive()
|
||||
{
|
||||
Recursive parent = new Recursive();
|
||||
Recursive child = new Recursive();
|
||||
parent.Other = child;
|
||||
child.Other = parent;
|
||||
|
||||
var constraint = Constraints.PropertyCompareConstraint(child);
|
||||
Assert.That(constraint.Matches(child), Is.False);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,186 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using NUnit.Framework.SyntaxHelpers;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
|
||||
//This is generic so that the lambda expressions will work right in IDEs.
|
||||
public class PropertyScrambler<T>
|
||||
{
|
||||
readonly System.Collections.Generic.List<string> membersToNotScramble = new List<string>();
|
||||
|
||||
private void AddExpressionToNotScrableList(Expression expression)
|
||||
{
|
||||
UnaryExpression unaryExpression = expression as UnaryExpression;
|
||||
if (unaryExpression != null)
|
||||
{
|
||||
AddExpressionToNotScrableList(unaryExpression.Operand);
|
||||
return;
|
||||
}
|
||||
|
||||
MemberExpression memberExpression = expression as MemberExpression;
|
||||
if (memberExpression != null)
|
||||
{
|
||||
if (!(memberExpression.Member is PropertyInfo))
|
||||
{
|
||||
throw new NotImplementedException("I don't know how deal with a MemberExpression that is a " + expression.Type);
|
||||
}
|
||||
membersToNotScramble.Add(memberExpression.Member.Name);
|
||||
return;
|
||||
}
|
||||
|
||||
throw new NotImplementedException("I don't know how to parse a " + expression.Type);
|
||||
}
|
||||
|
||||
public PropertyScrambler<T> DontScramble(Expression<Func<T, object>> expression)
|
||||
{
|
||||
AddExpressionToNotScrableList(expression.Body);
|
||||
return this;
|
||||
}
|
||||
|
||||
public void Scramble(T obj)
|
||||
{
|
||||
internalScramble(obj);
|
||||
}
|
||||
|
||||
private void internalScramble(object obj)
|
||||
{
|
||||
PropertyInfo[] properties = obj.GetType().GetProperties();
|
||||
foreach (var property in properties)
|
||||
{
|
||||
//Skip indexers of classes. We will assume that everything that has an indexer
|
||||
// is also IEnumberable. May not always be true, but should be true normally.
|
||||
if (property.GetIndexParameters().Length > 0)
|
||||
continue;
|
||||
|
||||
RandomizeProperty(obj, property, null);
|
||||
}
|
||||
//Now if it implments IEnumberable, it's probably some kind of list, so we should randomize
|
||||
// everything inside of it.
|
||||
IEnumerable enumerable = obj as IEnumerable;
|
||||
if (enumerable != null)
|
||||
{
|
||||
foreach (object value in enumerable)
|
||||
{
|
||||
internalScramble(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private readonly Random random = new Random();
|
||||
private void RandomizeProperty(object obj, PropertyInfo property, object[] index)
|
||||
{//I'd like a better way to compare, but I had lots of problems with InventoryFolderBase because the ID is inherited.
|
||||
if (membersToNotScramble.Contains(property.Name))
|
||||
return;
|
||||
Type t = property.PropertyType;
|
||||
if (!property.CanWrite)
|
||||
return;
|
||||
object value = property.GetValue(obj, index);
|
||||
if (value == null)
|
||||
return;
|
||||
|
||||
if (t == typeof(string))
|
||||
property.SetValue(obj, RandomName(), index);
|
||||
else if (t == typeof(UUID))
|
||||
property.SetValue(obj, UUID.Random(), index);
|
||||
else if (t == typeof(sbyte))
|
||||
property.SetValue(obj, (sbyte)random.Next(sbyte.MinValue, sbyte.MaxValue), index);
|
||||
else if (t == typeof(short))
|
||||
property.SetValue(obj, (short)random.Next(short.MinValue, short.MaxValue), index);
|
||||
else if (t == typeof(int))
|
||||
property.SetValue(obj, random.Next(), index);
|
||||
else if (t == typeof(long))
|
||||
property.SetValue(obj, random.Next() * int.MaxValue, index);
|
||||
else if (t == typeof(byte))
|
||||
property.SetValue(obj, (byte)random.Next(byte.MinValue, byte.MaxValue), index);
|
||||
else if (t == typeof(ushort))
|
||||
property.SetValue(obj, (ushort)random.Next(ushort.MinValue, ushort.MaxValue), index);
|
||||
else if (t == typeof(uint))
|
||||
property.SetValue(obj, Convert.ToUInt32(random.Next()), index);
|
||||
else if (t == typeof(ulong))
|
||||
property.SetValue(obj, Convert.ToUInt64(random.Next()) * Convert.ToUInt64(UInt32.MaxValue), index);
|
||||
else if (t == typeof(bool))
|
||||
property.SetValue(obj, true, index);
|
||||
else if (t == typeof(byte[]))
|
||||
{
|
||||
byte[] bytes = new byte[30];
|
||||
random.NextBytes(bytes);
|
||||
property.SetValue(obj, bytes, index);
|
||||
}
|
||||
else
|
||||
internalScramble(value);
|
||||
}
|
||||
|
||||
private string RandomName()
|
||||
{
|
||||
StringBuilder name = new StringBuilder();
|
||||
int size = random.Next(5, 12);
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
char ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
|
||||
name.Append(ch);
|
||||
}
|
||||
return name.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
[TestFixture]
|
||||
public class PropertyScramblerTests
|
||||
{
|
||||
[Test]
|
||||
public void TestScramble()
|
||||
{
|
||||
AssetBase actual = new AssetBase(UUID.Random(), "asset one");
|
||||
new PropertyScrambler<AssetBase>().Scramble(actual);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DontScramble()
|
||||
{
|
||||
UUID uuid = UUID.Random();
|
||||
AssetBase asset = new AssetBase();
|
||||
asset.FullID = uuid;
|
||||
new PropertyScrambler<AssetBase>()
|
||||
.DontScramble(x => x.Metadata)
|
||||
.DontScramble(x => x.FullID)
|
||||
.DontScramble(x => x.ID)
|
||||
.Scramble(asset);
|
||||
Assert.That(asset.FullID, Is.EqualTo(uuid));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,102 +0,0 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
|
||||
namespace OpenSim.Data.Tests
|
||||
{
|
||||
public static class ScrambleForTesting
|
||||
{
|
||||
private static readonly Random random = new Random();
|
||||
public static void Scramble(object obj)
|
||||
{
|
||||
PropertyInfo[] properties = obj.GetType().GetProperties();
|
||||
foreach (var property in properties)
|
||||
{
|
||||
//Skip indexers of classes. We will assume that everything that has an indexer
|
||||
// is also IEnumberable. May not always be true, but should be true normally.
|
||||
if(property.GetIndexParameters().Length > 0)
|
||||
continue;
|
||||
|
||||
RandomizeProperty(obj, property, null);
|
||||
}
|
||||
//Now if it implments IEnumberable, it's probably some kind of list, so we should randomize
|
||||
// everything inside of it.
|
||||
IEnumerable enumerable = obj as IEnumerable;
|
||||
if(enumerable != null)
|
||||
{
|
||||
foreach (object value in enumerable)
|
||||
{
|
||||
Scramble(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void RandomizeProperty(object obj, PropertyInfo property, object[] index)
|
||||
{
|
||||
Type t = property.PropertyType;
|
||||
if (!property.CanWrite)
|
||||
return;
|
||||
object value = property.GetValue(obj, index);
|
||||
if (value == null)
|
||||
return;
|
||||
|
||||
if (t == typeof (string))
|
||||
property.SetValue(obj, RandomName(), index);
|
||||
else if (t == typeof (UUID))
|
||||
property.SetValue(obj, UUID.Random(), index);
|
||||
else if (t == typeof (sbyte))
|
||||
property.SetValue(obj, (sbyte)random.Next(sbyte.MinValue, sbyte.MaxValue), index);
|
||||
else if (t == typeof (short))
|
||||
property.SetValue(obj, (short)random.Next(short.MinValue, short.MaxValue), index);
|
||||
else if (t == typeof (int))
|
||||
property.SetValue(obj, random.Next(), index);
|
||||
else if (t == typeof (long))
|
||||
property.SetValue(obj, random.Next() * int.MaxValue, index);
|
||||
else if (t == typeof (byte))
|
||||
property.SetValue(obj, (byte)random.Next(byte.MinValue, byte.MaxValue), index);
|
||||
else if (t == typeof (ushort))
|
||||
property.SetValue(obj, (ushort)random.Next(ushort.MinValue, ushort.MaxValue), index);
|
||||
else if (t == typeof (uint))
|
||||
property.SetValue(obj, Convert.ToUInt32(random.Next()), index);
|
||||
else if (t == typeof (ulong))
|
||||
property.SetValue(obj, Convert.ToUInt64(random.Next()) * Convert.ToUInt64(UInt32.MaxValue), index);
|
||||
else if (t == typeof (bool))
|
||||
property.SetValue(obj, true, index);
|
||||
else if (t == typeof (byte[]))
|
||||
{
|
||||
byte[] bytes = new byte[30];
|
||||
random.NextBytes(bytes);
|
||||
property.SetValue(obj, bytes, index);
|
||||
}
|
||||
else
|
||||
Scramble(value);
|
||||
}
|
||||
|
||||
private static string RandomName()
|
||||
{
|
||||
StringBuilder name = new StringBuilder();
|
||||
int size = random.Next(5, 12);
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
char ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
|
||||
name.Append(ch);
|
||||
}
|
||||
return name.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
[TestFixture]
|
||||
public class ScrableForTestingTest
|
||||
{
|
||||
[Test]
|
||||
public void TestScramble()
|
||||
{
|
||||
AssetBase actual = new AssetBase(UUID.Random(), "asset one");
|
||||
ScrambleForTesting.Scramble(actual);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -215,6 +215,7 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Serializable Agent Circuit Data
|
||||
/// </summary>
|
||||
|
|
|
@ -226,6 +226,46 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
public class AttachmentData
|
||||
{
|
||||
public int AttachPoint;
|
||||
public UUID ItemID;
|
||||
public UUID AssetID;
|
||||
|
||||
public AttachmentData(int point, UUID item, UUID asset)
|
||||
{
|
||||
AttachPoint = point;
|
||||
ItemID = item;
|
||||
AssetID = asset;
|
||||
}
|
||||
|
||||
public AttachmentData(OSDMap args)
|
||||
{
|
||||
UnpackUpdateMessage(args);
|
||||
}
|
||||
|
||||
public OSDMap PackUpdateMessage()
|
||||
{
|
||||
OSDMap attachdata = new OSDMap();
|
||||
attachdata["point"] = OSD.FromInteger(AttachPoint);
|
||||
attachdata["item"] = OSD.FromUUID(ItemID);
|
||||
attachdata["asset"] = OSD.FromUUID(AssetID);
|
||||
|
||||
return attachdata;
|
||||
}
|
||||
|
||||
|
||||
public void UnpackUpdateMessage(OSDMap args)
|
||||
{
|
||||
if (args["point"] != null)
|
||||
AttachPoint = args["point"].AsInteger();
|
||||
if (args["item"] != null)
|
||||
ItemID = args["item"].AsUUID();
|
||||
if (args["asset"] != null)
|
||||
AssetID = args["asset"].AsUUID();
|
||||
}
|
||||
}
|
||||
|
||||
public class AgentData : IAgentData
|
||||
{
|
||||
private UUID m_id;
|
||||
|
@ -272,6 +312,7 @@ namespace OpenSim.Framework
|
|||
public byte[] AgentTextures;
|
||||
public byte[] VisualParams;
|
||||
public UUID[] Wearables;
|
||||
public AttachmentData[] Attachments;
|
||||
|
||||
public string CallbackURI;
|
||||
|
||||
|
@ -352,6 +393,13 @@ namespace OpenSim.Framework
|
|||
args["wearables"] = wears;
|
||||
}
|
||||
|
||||
if ((Attachments != null) && (Attachments.Length > 0))
|
||||
{
|
||||
OSDArray attachs = new OSDArray(Attachments.Length);
|
||||
foreach (AttachmentData att in Attachments)
|
||||
attachs.Add(att.PackUpdateMessage());
|
||||
args["attachments"] = attachs;
|
||||
}
|
||||
|
||||
if ((CallbackURI != null) && (!CallbackURI.Equals("")))
|
||||
args["callback_uri"] = OSD.FromString(CallbackURI);
|
||||
|
@ -492,7 +540,21 @@ namespace OpenSim.Framework
|
|||
foreach (OSD o in wears)
|
||||
Wearables[i++] = o.AsUUID();
|
||||
}
|
||||
|
||||
|
||||
if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array)
|
||||
{
|
||||
OSDArray attachs = (OSDArray)(args["attachments"]);
|
||||
Attachments = new AttachmentData[attachs.Count];
|
||||
int i = 0;
|
||||
foreach (OSD o in attachs)
|
||||
{
|
||||
if (o.Type == OSDType.Map)
|
||||
{
|
||||
Attachments[i++] = new AttachmentData((OSDMap)o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (args["callback_uri"] != null)
|
||||
CallbackURI = args["callback_uri"].AsString();
|
||||
}
|
||||
|
|
|
@ -747,7 +747,7 @@ namespace OpenSim.Framework.Communications.Cache
|
|||
|
||||
InventoryItemBase itemInfo = null;
|
||||
|
||||
itemInfo = m_InventoryService.QueryItem(item);
|
||||
itemInfo = m_InventoryService.GetItem(item);
|
||||
|
||||
if (itemInfo != null)
|
||||
{
|
||||
|
@ -784,7 +784,7 @@ namespace OpenSim.Framework.Communications.Cache
|
|||
|
||||
InventoryFolderBase folderInfo = null;
|
||||
|
||||
folderInfo = m_InventoryService.QueryFolder(folder);
|
||||
folderInfo = m_InventoryService.GetFolder(folder);
|
||||
|
||||
if (folderInfo != null)
|
||||
{
|
||||
|
|
|
@ -205,7 +205,8 @@ namespace OpenSim.Framework.Communications.Services
|
|||
// Otherwise...
|
||||
// Create a new agent session
|
||||
|
||||
m_userManager.ResetAttachments(userProfile.ID);
|
||||
// XXYY we don't need this
|
||||
//m_userManager.ResetAttachments(userProfile.ID);
|
||||
|
||||
CreateAgent(userProfile, request);
|
||||
|
||||
|
@ -462,7 +463,8 @@ namespace OpenSim.Framework.Communications.Services
|
|||
// Otherwise...
|
||||
// Create a new agent session
|
||||
|
||||
m_userManager.ResetAttachments(userProfile.ID);
|
||||
// XXYY We don't need this
|
||||
//m_userManager.ResetAttachments(userProfile.ID);
|
||||
|
||||
CreateAgent(userProfile, request);
|
||||
|
||||
|
@ -1129,7 +1131,18 @@ namespace OpenSim.Framework.Communications.Services
|
|||
// tools are creating the user profile directly in the database without creating the inventory. At
|
||||
// this time we'll accomodate them by lazily creating the user inventory now if it doesn't already
|
||||
// exist.
|
||||
if ((m_interInventoryService != null) && !m_interInventoryService.CreateNewUserInventory(userID))
|
||||
if (m_interInventoryService != null)
|
||||
{
|
||||
if (!m_interInventoryService.CreateNewUserInventory(userID))
|
||||
{
|
||||
throw new Exception(
|
||||
String.Format(
|
||||
"The inventory creation request for user {0} did not succeed."
|
||||
+ " Please contact your inventory service provider for more information.",
|
||||
userID));
|
||||
}
|
||||
}
|
||||
else if ((m_InventoryService != null) && !m_InventoryService.CreateUserInventory(userID))
|
||||
{
|
||||
throw new Exception(
|
||||
String.Format(
|
||||
|
@ -1138,6 +1151,7 @@ namespace OpenSim.Framework.Communications.Services
|
|||
userID));
|
||||
}
|
||||
|
||||
|
||||
m_log.InfoFormat("[LOGIN]: A new inventory skeleton was successfully created for user {0}", userID);
|
||||
|
||||
if (m_InventoryService != null)
|
||||
|
|
|
@ -186,14 +186,14 @@ namespace OpenSim.Framework.Communications.Tests
|
|||
|
||||
Assert.That(
|
||||
userInfo.CreateFolder("testFolder1", folderId, (ushort)AssetType.Animation, missingFolderId), Is.False);
|
||||
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Null);
|
||||
Assert.That(myScene.InventoryService.GetFolder(myFolder), Is.Null);
|
||||
Assert.That(userInfo.RootFolder.ContainsChildFolder(missingFolderId), Is.False);
|
||||
Assert.That(userInfo.RootFolder.FindFolder(folderId), Is.Null);
|
||||
|
||||
// 2: Try a folder create that should work
|
||||
Assert.That(
|
||||
userInfo.CreateFolder("testFolder2", folderId, (ushort)AssetType.Animation, userInfo.RootFolder.ID), Is.True);
|
||||
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Not.Null);
|
||||
Assert.That(myScene.InventoryService.GetFolder(myFolder), Is.Not.Null);
|
||||
Assert.That(userInfo.RootFolder.ContainsChildFolder(folderId), Is.True);
|
||||
}
|
||||
|
||||
|
@ -228,7 +228,7 @@ namespace OpenSim.Framework.Communications.Tests
|
|||
Assert.That(newFolderName1, Is.EqualTo(folder1.Name));
|
||||
Assert.That(folderType1, Is.EqualTo((ushort)folder1.Type));
|
||||
|
||||
InventoryFolderBase dataFolder1 = myScene.InventoryService.QueryFolder(myFolder);
|
||||
InventoryFolderBase dataFolder1 = myScene.InventoryService.GetFolder(myFolder);
|
||||
Assert.That(newFolderName1, Is.EqualTo(dataFolder1.Name));
|
||||
Assert.That(folderType1, Is.EqualTo((ushort)dataFolder1.Type));
|
||||
}
|
||||
|
@ -254,7 +254,7 @@ namespace OpenSim.Framework.Communications.Tests
|
|||
Assert.That(folder2.ContainsChildFolder(folder1Id), Is.True);
|
||||
Assert.That(rootFolder.ContainsChildFolder(folder1Id), Is.False);
|
||||
|
||||
InventoryFolderBase dataFolder1 = myScene.InventoryService.QueryFolder(myFolder2);
|
||||
InventoryFolderBase dataFolder1 = myScene.InventoryService.GetFolder(myFolder2);
|
||||
Assert.That(newFolderName2, Is.EqualTo(dataFolder1.Name));
|
||||
Assert.That(folderType2, Is.EqualTo((ushort)dataFolder1.Type));
|
||||
Assert.That(folder2Id, Is.EqualTo(dataFolder1.ParentID));
|
||||
|
@ -296,7 +296,7 @@ namespace OpenSim.Framework.Communications.Tests
|
|||
InventoryFolderBase myFolder = new InventoryFolderBase();
|
||||
myFolder.ID = folderToMoveId;
|
||||
Assert.That(folder2.ContainsChildFolder(folderToMoveId), Is.True);
|
||||
Assert.That(myScene.InventoryService.QueryFolder(myFolder).ParentID, Is.EqualTo(folder2Id));
|
||||
Assert.That(myScene.InventoryService.GetFolder(myFolder).ParentID, Is.EqualTo(folder2Id));
|
||||
|
||||
Assert.That(folder1.ContainsChildFolder(folderToMoveId), Is.False);
|
||||
}
|
||||
|
@ -322,13 +322,13 @@ namespace OpenSim.Framework.Communications.Tests
|
|||
myFolder.ID = folder1Id;
|
||||
|
||||
userInfo.CreateFolder("folder1", folder1Id, (ushort)AssetType.Animation, rootFolder.ID);
|
||||
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Not.Null);
|
||||
Assert.That(myScene.InventoryService.GetFolder(myFolder), Is.Not.Null);
|
||||
|
||||
// Test purge
|
||||
userInfo.PurgeFolder(rootFolder.ID);
|
||||
|
||||
Assert.That(rootFolder.RequestListOfFolders(), Is.Empty);
|
||||
Assert.That(myScene.InventoryService.QueryFolder(myFolder), Is.Null);
|
||||
Assert.That(myScene.InventoryService.GetFolder(myFolder), Is.Null);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -552,12 +552,12 @@ namespace OpenSim.Framework.Communications.Tests
|
|||
return false;
|
||||
}
|
||||
|
||||
public InventoryItemBase QueryItem(InventoryItemBase item)
|
||||
public InventoryItemBase GetItem(InventoryItemBase item)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public InventoryFolderBase QueryFolder(InventoryFolderBase folder)
|
||||
public InventoryFolderBase GetFolder(InventoryFolderBase folder)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
@ -575,5 +575,10 @@ namespace OpenSim.Framework.Communications.Tests
|
|||
root.ParentID = UUID.Zero;
|
||||
return root;
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(UUID userID, UUID assetID)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
*/
|
||||
|
||||
using System;
|
||||
using System.Xml;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
|
@ -369,6 +370,155 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
return new string[0];
|
||||
}
|
||||
|
||||
public XmlElement GetXml(XmlDocument doc)
|
||||
{
|
||||
CommandInfo help = (CommandInfo)((Dictionary<string, object>)tree["help"])[String.Empty];
|
||||
((Dictionary<string, object>)tree["help"]).Remove(string.Empty);
|
||||
if (((Dictionary<string, object>)tree["help"]).Count == 0)
|
||||
tree.Remove("help");
|
||||
|
||||
CommandInfo quit = (CommandInfo)((Dictionary<string, object>)tree["quit"])[String.Empty];
|
||||
((Dictionary<string, object>)tree["quit"]).Remove(string.Empty);
|
||||
if (((Dictionary<string, object>)tree["quit"]).Count == 0)
|
||||
tree.Remove("quit");
|
||||
|
||||
XmlElement root = doc.CreateElement("", "HelpTree", "");
|
||||
|
||||
ProcessTreeLevel(tree, root, doc);
|
||||
|
||||
if (!tree.ContainsKey("help"))
|
||||
tree["help"] = (object) new Dictionary<string, object>();
|
||||
((Dictionary<string, object>)tree["help"])[String.Empty] = help;
|
||||
|
||||
if (!tree.ContainsKey("quit"))
|
||||
tree["quit"] = (object) new Dictionary<string, object>();
|
||||
((Dictionary<string, object>)tree["quit"])[String.Empty] = quit;
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
private void ProcessTreeLevel(Dictionary<string, object> level, XmlElement xml, XmlDocument doc)
|
||||
{
|
||||
foreach (KeyValuePair<string, object> kvp in level)
|
||||
{
|
||||
if (kvp.Value is Dictionary<string, Object>)
|
||||
{
|
||||
XmlElement next = doc.CreateElement("", "Level", "");
|
||||
next.SetAttribute("Name", kvp.Key);
|
||||
|
||||
xml.AppendChild(next);
|
||||
|
||||
ProcessTreeLevel((Dictionary<string, object>)kvp.Value, next, doc);
|
||||
}
|
||||
else
|
||||
{
|
||||
CommandInfo c = (CommandInfo)kvp.Value;
|
||||
|
||||
XmlElement cmd = doc.CreateElement("", "Command", "");
|
||||
|
||||
XmlElement e;
|
||||
|
||||
e = doc.CreateElement("", "Module", "");
|
||||
cmd.AppendChild(e);
|
||||
e.AppendChild(doc.CreateTextNode(c.module));
|
||||
|
||||
e = doc.CreateElement("", "Shared", "");
|
||||
cmd.AppendChild(e);
|
||||
e.AppendChild(doc.CreateTextNode(c.shared.ToString()));
|
||||
|
||||
e = doc.CreateElement("", "HelpText", "");
|
||||
cmd.AppendChild(e);
|
||||
e.AppendChild(doc.CreateTextNode(c.help_text));
|
||||
|
||||
e = doc.CreateElement("", "LongHelp", "");
|
||||
cmd.AppendChild(e);
|
||||
e.AppendChild(doc.CreateTextNode(c.long_help));
|
||||
|
||||
e = doc.CreateElement("", "Description", "");
|
||||
cmd.AppendChild(e);
|
||||
e.AppendChild(doc.CreateTextNode(c.descriptive_help));
|
||||
|
||||
xml.AppendChild(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void FromXml(XmlElement root, CommandDelegate fn)
|
||||
{
|
||||
CommandInfo help = (CommandInfo)((Dictionary<string, object>)tree["help"])[String.Empty];
|
||||
((Dictionary<string, object>)tree["help"]).Remove(string.Empty);
|
||||
if (((Dictionary<string, object>)tree["help"]).Count == 0)
|
||||
tree.Remove("help");
|
||||
|
||||
CommandInfo quit = (CommandInfo)((Dictionary<string, object>)tree["quit"])[String.Empty];
|
||||
((Dictionary<string, object>)tree["quit"]).Remove(string.Empty);
|
||||
if (((Dictionary<string, object>)tree["quit"]).Count == 0)
|
||||
tree.Remove("quit");
|
||||
|
||||
tree.Clear();
|
||||
|
||||
ReadTreeLevel(tree, root, fn);
|
||||
|
||||
if (!tree.ContainsKey("help"))
|
||||
tree["help"] = (object) new Dictionary<string, object>();
|
||||
((Dictionary<string, object>)tree["help"])[String.Empty] = help;
|
||||
|
||||
if (!tree.ContainsKey("quit"))
|
||||
tree["quit"] = (object) new Dictionary<string, object>();
|
||||
((Dictionary<string, object>)tree["quit"])[String.Empty] = quit;
|
||||
}
|
||||
|
||||
private void ReadTreeLevel(Dictionary<string, object> level, XmlNode node, CommandDelegate fn)
|
||||
{
|
||||
Dictionary<string, object> next;
|
||||
string name;
|
||||
|
||||
XmlNodeList nodeL = node.ChildNodes;
|
||||
XmlNodeList cmdL;
|
||||
CommandInfo c;
|
||||
|
||||
foreach (XmlNode part in nodeL)
|
||||
{
|
||||
switch (part.Name)
|
||||
{
|
||||
case "Level":
|
||||
name = ((XmlElement)part).GetAttribute("Name");
|
||||
next = new Dictionary<string, object>();
|
||||
level[name] = next;
|
||||
ReadTreeLevel(next, part, fn);
|
||||
break;
|
||||
case "Command":
|
||||
cmdL = part.ChildNodes;
|
||||
c = new CommandInfo();
|
||||
foreach (XmlNode cmdPart in cmdL)
|
||||
{
|
||||
switch (cmdPart.Name)
|
||||
{
|
||||
case "Module":
|
||||
c.module = cmdPart.InnerText;
|
||||
break;
|
||||
case "Shared":
|
||||
c.shared = Convert.ToBoolean(cmdPart.InnerText);
|
||||
break;
|
||||
case "HelpText":
|
||||
c.help_text = cmdPart.InnerText;
|
||||
break;
|
||||
case "LongHelp":
|
||||
c.long_help = cmdPart.InnerText;
|
||||
break;
|
||||
case "Description":
|
||||
c.descriptive_help = cmdPart.InnerText;
|
||||
break;
|
||||
}
|
||||
}
|
||||
c.fn = new List<CommandDelegate>();
|
||||
c.fn.Add(fn);
|
||||
level[String.Empty] = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class Parser
|
||||
|
|
|
@ -26,30 +26,43 @@
|
|||
*/
|
||||
|
||||
using System;
|
||||
using System.Xml;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using OpenMetaverse;
|
||||
using Nini.Config;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using log4net;
|
||||
|
||||
namespace OpenSim.Framework.Console
|
||||
{
|
||||
public class ConsoleConnection
|
||||
{
|
||||
public int last;
|
||||
public long lastLineSeen;
|
||||
}
|
||||
|
||||
// A console that uses REST interfaces
|
||||
//
|
||||
public class RemoteConsole : CommandConsole
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
// private IHttpServer m_Server = null;
|
||||
// private IConfigSource m_Config = null;
|
||||
private IHttpServer m_Server = null;
|
||||
private IConfigSource m_Config = null;
|
||||
|
||||
private List<string> m_Scrollback = new List<string>();
|
||||
private ManualResetEvent m_DataEvent = new ManualResetEvent(false);
|
||||
private List<string> m_InputData = new List<string>();
|
||||
private uint m_LineNumber = 1;
|
||||
private long m_LineNumber = 0;
|
||||
private Dictionary<UUID, ConsoleConnection> m_Connections =
|
||||
new Dictionary<UUID, ConsoleConnection>();
|
||||
private string m_UserName = String.Empty;
|
||||
private string m_Password = String.Empty;
|
||||
|
||||
public RemoteConsole(string defaultPrompt) : base(defaultPrompt)
|
||||
{
|
||||
|
@ -57,12 +70,23 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
public void ReadConfig(IConfigSource config)
|
||||
{
|
||||
// m_Config = config;
|
||||
m_Config = config;
|
||||
|
||||
IConfig netConfig = m_Config.Configs["Network"];
|
||||
if (netConfig == null)
|
||||
return;
|
||||
|
||||
m_UserName = netConfig.GetString("ConsoleUser", String.Empty);
|
||||
m_Password = netConfig.GetString("ConsolePass", String.Empty);
|
||||
}
|
||||
|
||||
public void SetServer(IHttpServer server)
|
||||
{
|
||||
// m_Server = server;
|
||||
m_Server = server;
|
||||
|
||||
m_Server.AddHTTPHandler("/StartSession/", HandleHttpStartSession);
|
||||
m_Server.AddHTTPHandler("/CloseSession/", HandleHttpCloseSession);
|
||||
m_Server.AddHTTPHandler("/SessionCommand/", HandleHttpSessionCommand);
|
||||
}
|
||||
|
||||
public override void Output(string text, string level)
|
||||
|
@ -71,16 +95,19 @@ namespace OpenSim.Framework.Console
|
|||
{
|
||||
while (m_Scrollback.Count >= 1000)
|
||||
m_Scrollback.RemoveAt(0);
|
||||
m_Scrollback.Add(String.Format("{0}", m_LineNumber)+":"+level+":"+text);
|
||||
m_LineNumber++;
|
||||
m_Scrollback.Add(String.Format("{0}", m_LineNumber)+":"+level+":"+text);
|
||||
}
|
||||
System.Console.Write(text);
|
||||
System.Console.WriteLine(text.Trim());
|
||||
}
|
||||
|
||||
public override void Output(string text)
|
||||
{
|
||||
Output(text, "normal");
|
||||
}
|
||||
|
||||
public override string ReadLine(string p, bool isCommand, bool e)
|
||||
{
|
||||
System.Console.Write("{0}", prompt);
|
||||
|
||||
m_DataEvent.WaitOne();
|
||||
|
||||
lock (m_InputData)
|
||||
|
@ -115,5 +142,316 @@ namespace OpenSim.Framework.Console
|
|||
return cmdinput;
|
||||
}
|
||||
}
|
||||
|
||||
private void DoExpire()
|
||||
{
|
||||
List<UUID> expired = new List<UUID>();
|
||||
|
||||
lock (m_Connections)
|
||||
{
|
||||
foreach (KeyValuePair<UUID, ConsoleConnection> kvp in m_Connections)
|
||||
{
|
||||
if (System.Environment.TickCount - kvp.Value.last > 500000)
|
||||
expired.Add(kvp.Key);
|
||||
}
|
||||
|
||||
foreach (UUID id in expired)
|
||||
{
|
||||
m_Connections.Remove(id);
|
||||
CloseConnection(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Hashtable HandleHttpStartSession(Hashtable request)
|
||||
{
|
||||
DoExpire();
|
||||
|
||||
Hashtable post = DecodePostString(request["body"].ToString());
|
||||
Hashtable reply = new Hashtable();
|
||||
|
||||
reply["str_response_string"] = "";
|
||||
reply["int_response_code"] = 401;
|
||||
reply["content_type"] = "text/plain";
|
||||
|
||||
if (m_UserName == String.Empty)
|
||||
return reply;
|
||||
|
||||
if (post["USER"] == null || post["PASS"] == null)
|
||||
return reply;
|
||||
|
||||
if (m_UserName != post["USER"].ToString() ||
|
||||
m_Password != post["PASS"].ToString())
|
||||
{
|
||||
return reply;
|
||||
}
|
||||
|
||||
ConsoleConnection c = new ConsoleConnection();
|
||||
c.last = System.Environment.TickCount;
|
||||
c.lastLineSeen = 0;
|
||||
|
||||
UUID sessionID = UUID.Random();
|
||||
|
||||
lock (m_Connections)
|
||||
{
|
||||
m_Connections[sessionID] = c;
|
||||
}
|
||||
|
||||
string uri = "/ReadResponses/" + sessionID.ToString() + "/";
|
||||
|
||||
m_Server.AddPollServiceHTTPHandler(uri, HandleHttpCloseSession,
|
||||
new PollServiceEventArgs(HasEvents, GetEvents, NoEvents,
|
||||
sessionID));
|
||||
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
|
||||
"", "");
|
||||
|
||||
xmldoc.AppendChild(xmlnode);
|
||||
XmlElement rootElement = xmldoc.CreateElement("", "ConsoleSession",
|
||||
"");
|
||||
|
||||
xmldoc.AppendChild(rootElement);
|
||||
|
||||
XmlElement id = xmldoc.CreateElement("", "SessionID", "");
|
||||
id.AppendChild(xmldoc.CreateTextNode(sessionID.ToString()));
|
||||
|
||||
rootElement.AppendChild(id);
|
||||
rootElement.AppendChild(MainConsole.Instance.Commands.GetXml(xmldoc));
|
||||
|
||||
reply["str_response_string"] = xmldoc.InnerXml;
|
||||
reply["int_response_code"] = 200;
|
||||
reply["content_type"] = "text/xml";
|
||||
|
||||
return reply;
|
||||
}
|
||||
|
||||
private Hashtable HandleHttpCloseSession(Hashtable request)
|
||||
{
|
||||
DoExpire();
|
||||
|
||||
Hashtable post = DecodePostString(request["body"].ToString());
|
||||
Hashtable reply = new Hashtable();
|
||||
|
||||
reply["str_response_string"] = "";
|
||||
reply["int_response_code"] = 404;
|
||||
reply["content_type"] = "text/plain";
|
||||
|
||||
if (post["ID"] == null)
|
||||
return reply;
|
||||
|
||||
UUID id;
|
||||
if (!UUID.TryParse(post["ID"].ToString(), out id))
|
||||
return reply;
|
||||
|
||||
lock (m_Connections)
|
||||
{
|
||||
if (m_Connections.ContainsKey(id))
|
||||
{
|
||||
m_Connections.Remove(id);
|
||||
CloseConnection(id);
|
||||
}
|
||||
}
|
||||
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
|
||||
"", "");
|
||||
|
||||
xmldoc.AppendChild(xmlnode);
|
||||
XmlElement rootElement = xmldoc.CreateElement("", "ConsoleSession",
|
||||
"");
|
||||
|
||||
xmldoc.AppendChild(rootElement);
|
||||
|
||||
XmlElement res = xmldoc.CreateElement("", "Result", "");
|
||||
res.AppendChild(xmldoc.CreateTextNode("OK"));
|
||||
|
||||
rootElement.AppendChild(res);
|
||||
|
||||
reply["str_response_string"] = xmldoc.InnerXml;
|
||||
reply["int_response_code"] = 200;
|
||||
reply["content_type"] = "text/plain";
|
||||
|
||||
return reply;
|
||||
}
|
||||
|
||||
private Hashtable HandleHttpSessionCommand(Hashtable request)
|
||||
{
|
||||
DoExpire();
|
||||
|
||||
Hashtable post = DecodePostString(request["body"].ToString());
|
||||
Hashtable reply = new Hashtable();
|
||||
|
||||
reply["str_response_string"] = "";
|
||||
reply["int_response_code"] = 404;
|
||||
reply["content_type"] = "text/plain";
|
||||
|
||||
if (post["ID"] == null)
|
||||
return reply;
|
||||
|
||||
UUID id;
|
||||
if (!UUID.TryParse(post["ID"].ToString(), out id))
|
||||
return reply;
|
||||
|
||||
if (post["COMMAND"] == null || post["COMMAND"].ToString() == String.Empty)
|
||||
return reply;
|
||||
|
||||
lock (m_InputData)
|
||||
{
|
||||
m_DataEvent.Set();
|
||||
m_InputData.Add(post["COMMAND"].ToString());
|
||||
}
|
||||
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
|
||||
"", "");
|
||||
|
||||
xmldoc.AppendChild(xmlnode);
|
||||
XmlElement rootElement = xmldoc.CreateElement("", "ConsoleSession",
|
||||
"");
|
||||
|
||||
xmldoc.AppendChild(rootElement);
|
||||
|
||||
XmlElement res = xmldoc.CreateElement("", "Result", "");
|
||||
res.AppendChild(xmldoc.CreateTextNode("OK"));
|
||||
|
||||
rootElement.AppendChild(res);
|
||||
|
||||
reply["str_response_string"] = xmldoc.InnerXml;
|
||||
reply["int_response_code"] = 200;
|
||||
reply["content_type"] = "text/plain";
|
||||
|
||||
return reply;
|
||||
}
|
||||
|
||||
private Hashtable DecodePostString(string data)
|
||||
{
|
||||
Hashtable result = new Hashtable();
|
||||
|
||||
string[] terms = data.Split(new char[] {'&'});
|
||||
|
||||
foreach (string term in terms)
|
||||
{
|
||||
string[] elems = term.Split(new char[] {'='});
|
||||
if (elems.Length == 0)
|
||||
continue;
|
||||
|
||||
string name = System.Web.HttpUtility.UrlDecode(elems[0]);
|
||||
string value = String.Empty;
|
||||
|
||||
if (elems.Length > 1)
|
||||
value = System.Web.HttpUtility.UrlDecode(elems[1]);
|
||||
|
||||
result[name] = value;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void CloseConnection(UUID id)
|
||||
{
|
||||
try
|
||||
{
|
||||
string uri = "/ReadResponses/" + id.ToString() + "/";
|
||||
|
||||
m_Server.RemovePollServiceHTTPHandler("", uri);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
private bool HasEvents(UUID sessionID)
|
||||
{
|
||||
ConsoleConnection c = null;
|
||||
|
||||
lock (m_Connections)
|
||||
{
|
||||
if (!m_Connections.ContainsKey(sessionID))
|
||||
return false;
|
||||
c = m_Connections[sessionID];
|
||||
}
|
||||
c.last = System.Environment.TickCount;
|
||||
if (c.lastLineSeen < m_LineNumber)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private Hashtable GetEvents(UUID sessionID, string request)
|
||||
{
|
||||
ConsoleConnection c = null;
|
||||
|
||||
lock (m_Connections)
|
||||
{
|
||||
if (!m_Connections.ContainsKey(sessionID))
|
||||
return NoEvents();
|
||||
c = m_Connections[sessionID];
|
||||
}
|
||||
c.last = System.Environment.TickCount;
|
||||
if (c.lastLineSeen >= m_LineNumber)
|
||||
return NoEvents();
|
||||
|
||||
Hashtable result = new Hashtable();
|
||||
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
|
||||
"", "");
|
||||
|
||||
xmldoc.AppendChild(xmlnode);
|
||||
XmlElement rootElement = xmldoc.CreateElement("", "ConsoleSession",
|
||||
"");
|
||||
|
||||
lock (m_Scrollback)
|
||||
{
|
||||
long startLine = m_LineNumber - m_Scrollback.Count;
|
||||
long sendStart = startLine;
|
||||
if (sendStart < c.lastLineSeen)
|
||||
sendStart = c.lastLineSeen;
|
||||
|
||||
for (long i = sendStart ; i < m_LineNumber ; i++)
|
||||
{
|
||||
XmlElement res = xmldoc.CreateElement("", "Line", "");
|
||||
long line = i + 1;
|
||||
res.SetAttribute("Number", line.ToString());
|
||||
res.AppendChild(xmldoc.CreateTextNode(m_Scrollback[(int)(i - startLine)]));
|
||||
|
||||
rootElement.AppendChild(res);
|
||||
}
|
||||
}
|
||||
c.lastLineSeen = m_LineNumber;
|
||||
|
||||
xmldoc.AppendChild(rootElement);
|
||||
|
||||
result["str_response_string"] = xmldoc.InnerXml;
|
||||
result["int_response_code"] = 200;
|
||||
result["content_type"] = "application/xml";
|
||||
result["keepalive"] = false;
|
||||
result["reusecontext"] = false;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private Hashtable NoEvents()
|
||||
{
|
||||
Hashtable result = new Hashtable();
|
||||
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
|
||||
"", "");
|
||||
|
||||
xmldoc.AppendChild(xmlnode);
|
||||
XmlElement rootElement = xmldoc.CreateElement("", "ConsoleSession",
|
||||
"");
|
||||
|
||||
xmldoc.AppendChild(rootElement);
|
||||
|
||||
result["str_response_string"] = xmldoc.InnerXml;
|
||||
result["int_response_code"] = 200;
|
||||
result["content_type"] = "text/xml";
|
||||
result["keepalive"] = false;
|
||||
result["reusecontext"] = false;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -111,6 +111,8 @@ namespace OpenSim.Framework
|
|||
|
||||
public delegate void ObjectSelect(uint localID, IClientAPI remoteClient);
|
||||
|
||||
public delegate void ObjectRequest(uint localID, IClientAPI remoteClient);
|
||||
|
||||
public delegate void RequestObjectPropertiesFamily(
|
||||
IClientAPI remoteClient, UUID AgentID, uint RequestFlags, UUID TaskID);
|
||||
|
||||
|
@ -622,6 +624,7 @@ namespace OpenSim.Framework
|
|||
|
||||
event UpdateShape OnUpdatePrimShape;
|
||||
event ObjectExtraParams OnUpdateExtraParams;
|
||||
event ObjectRequest OnObjectRequest;
|
||||
event ObjectSelect OnObjectSelect;
|
||||
event ObjectDeselect OnObjectDeselect;
|
||||
event GenericCall7 OnObjectDescription;
|
||||
|
|
|
@ -354,7 +354,22 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
protected int m_creationDate = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||
|
||||
|
||||
public InventoryItemBase()
|
||||
{
|
||||
}
|
||||
|
||||
public InventoryItemBase(UUID id)
|
||||
{
|
||||
ID = id;
|
||||
}
|
||||
|
||||
public InventoryItemBase(UUID id, UUID owner)
|
||||
{
|
||||
ID = id;
|
||||
Owner = owner;
|
||||
}
|
||||
|
||||
public object Clone()
|
||||
{
|
||||
return MemberwiseClone();
|
||||
|
|
|
@ -520,7 +520,7 @@ namespace OpenSim.Framework
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Depreciated idea. Number of visitors ~= free money
|
||||
/// Deprecated idea. Number of visitors ~= free money
|
||||
/// </summary>
|
||||
public int Dwell {
|
||||
get {
|
||||
|
|
|
@ -33,6 +33,7 @@ using System.IO;
|
|||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
using HttpServer;
|
||||
using log4net;
|
||||
|
||||
|
@ -72,6 +73,18 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
}
|
||||
private string _contentType;
|
||||
|
||||
public HttpCookieCollection Cookies
|
||||
{
|
||||
get
|
||||
{
|
||||
RequestCookies cookies = _request.Cookies;
|
||||
HttpCookieCollection httpCookies = new HttpCookieCollection();
|
||||
foreach (RequestCookie cookie in cookies)
|
||||
httpCookies.Add(new HttpCookie(cookie.Name, cookie.Value));
|
||||
return httpCookies;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasEntityBody
|
||||
{
|
||||
get { return _request.ContentLength != 0; }
|
||||
|
|
|
@ -256,25 +256,35 @@ namespace OpenSim.Framework.Tests
|
|||
Agent1Data.SessionID = new UUID("aa06f798-9d70-4bdb-9bbf-012a02ee2baf");
|
||||
Agent1Data.startpos = StartPos;
|
||||
|
||||
OSDMap map2 = (OSDMap)OSDParser.DeserializeJson(oldSerialization);
|
||||
|
||||
OSDMap map2;
|
||||
try
|
||||
{
|
||||
map2 = (OSDMap) OSDParser.DeserializeJson(oldSerialization);
|
||||
|
||||
|
||||
AgentCircuitData Agent2Data = new AgentCircuitData();
|
||||
Agent2Data.UnpackAgentCircuitData(map2);
|
||||
AgentCircuitData Agent2Data = new AgentCircuitData();
|
||||
Agent2Data.UnpackAgentCircuitData(map2);
|
||||
|
||||
Assert.That((Agent1Data.AgentID == Agent2Data.AgentID));
|
||||
Assert.That((Agent1Data.BaseFolder == Agent2Data.BaseFolder));
|
||||
Assert.That((Agent1Data.AgentID == Agent2Data.AgentID));
|
||||
Assert.That((Agent1Data.BaseFolder == Agent2Data.BaseFolder));
|
||||
|
||||
Assert.That((Agent1Data.CapsPath == Agent2Data.CapsPath));
|
||||
Assert.That((Agent1Data.child == Agent2Data.child));
|
||||
Assert.That((Agent1Data.ChildrenCapSeeds.Count == Agent2Data.ChildrenCapSeeds.Count));
|
||||
Assert.That((Agent1Data.circuitcode == Agent2Data.circuitcode));
|
||||
Assert.That((Agent1Data.firstname == Agent2Data.firstname));
|
||||
Assert.That((Agent1Data.InventoryFolder == Agent2Data.InventoryFolder));
|
||||
Assert.That((Agent1Data.lastname == Agent2Data.lastname));
|
||||
Assert.That((Agent1Data.SecureSessionID == Agent2Data.SecureSessionID));
|
||||
Assert.That((Agent1Data.SessionID == Agent2Data.SessionID));
|
||||
Assert.That((Agent1Data.startpos == Agent2Data.startpos));
|
||||
Assert.That((Agent1Data.CapsPath == Agent2Data.CapsPath));
|
||||
Assert.That((Agent1Data.child == Agent2Data.child));
|
||||
Assert.That((Agent1Data.ChildrenCapSeeds.Count == Agent2Data.ChildrenCapSeeds.Count));
|
||||
Assert.That((Agent1Data.circuitcode == Agent2Data.circuitcode));
|
||||
Assert.That((Agent1Data.firstname == Agent2Data.firstname));
|
||||
Assert.That((Agent1Data.InventoryFolder == Agent2Data.InventoryFolder));
|
||||
Assert.That((Agent1Data.lastname == Agent2Data.lastname));
|
||||
Assert.That((Agent1Data.SecureSessionID == Agent2Data.SecureSessionID));
|
||||
Assert.That((Agent1Data.SessionID == Agent2Data.SessionID));
|
||||
Assert.That((Agent1Data.startpos == Agent2Data.startpos));
|
||||
}
|
||||
catch (LitJson.JsonException)
|
||||
{
|
||||
//intermittant litjson errors :P
|
||||
Assert.That(1 == 1);
|
||||
}
|
||||
/*
|
||||
Enable this once VisualParams go in the packing method
|
||||
for (int i=0;i<208;i++)
|
||||
|
@ -303,12 +313,21 @@ namespace OpenSim.Framework.Tests
|
|||
Agent1Data.SessionID = SessionId;
|
||||
Agent1Data.startpos = StartPos;
|
||||
|
||||
|
||||
OSDMap map = Agent1Data.PackAgentCircuitData();
|
||||
string str = OSDParser.SerializeJsonString(map);
|
||||
//System.Console.WriteLine(str);
|
||||
OSDMap map2 = (OSDMap)OSDParser.DeserializeJson(str);
|
||||
|
||||
OSDMap map2;
|
||||
OSDMap map = Agent1Data.PackAgentCircuitData();
|
||||
try
|
||||
{
|
||||
string str = OSDParser.SerializeJsonString(map);
|
||||
//System.Console.WriteLine(str);
|
||||
map2 = (OSDMap) OSDParser.DeserializeJson(str);
|
||||
}
|
||||
catch (System.NullReferenceException)
|
||||
{
|
||||
//spurious litjson errors :P
|
||||
map2 = map;
|
||||
Assert.That(1==1);
|
||||
return;
|
||||
}
|
||||
|
||||
AgentCircuitData Agent2Data = new AgentCircuitData();
|
||||
Agent2Data.UnpackAgentCircuitData(map2);
|
||||
|
|
|
@ -64,7 +64,7 @@ namespace OpenSim.Framework.Tests
|
|||
Vector3 StartPos = new Vector3(5, 23, 125);
|
||||
|
||||
UUID SecureSessionId = UUID.Random();
|
||||
UUID SessionId = UUID.Random();
|
||||
// TODO: unused: UUID SessionId = UUID.Random();
|
||||
|
||||
m_agentCircuitData1 = new AgentCircuitData();
|
||||
m_agentCircuitData1.AgentID = AgentId1;
|
||||
|
|
|
@ -161,7 +161,7 @@ namespace OpenSim.Framework.Tests
|
|||
/// Worker thread 0
|
||||
/// </summary>
|
||||
/// <param name="o"></param>
|
||||
public void run( object o)
|
||||
public void run(object o)
|
||||
{
|
||||
while (running)
|
||||
{
|
||||
|
|
|
@ -120,6 +120,7 @@ namespace OpenSim
|
|||
configSource.AddSwitch("Startup", "gridmode");
|
||||
configSource.AddSwitch("Startup", "physics");
|
||||
configSource.AddSwitch("Startup", "gui");
|
||||
configSource.AddSwitch("Startup", "console");
|
||||
|
||||
configSource.AddConfig("StandAlone");
|
||||
configSource.AddConfig("Network");
|
||||
|
@ -223,4 +224,4 @@ namespace OpenSim
|
|||
_IsHandlingException = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,6 +52,7 @@ namespace OpenSim
|
|||
protected string m_startupCommandsFile;
|
||||
protected string m_shutdownCommandsFile;
|
||||
protected bool m_gui = false;
|
||||
protected string m_consoleType = "local";
|
||||
|
||||
private string m_timedScript = "disabled";
|
||||
private Timer m_scriptTimer;
|
||||
|
@ -71,7 +72,10 @@ namespace OpenSim
|
|||
m_startupCommandsFile = startupConfig.GetString("startup_console_commands_file", "startup_commands.txt");
|
||||
m_shutdownCommandsFile = startupConfig.GetString("shutdown_console_commands_file", "shutdown_commands.txt");
|
||||
|
||||
m_gui = startupConfig.GetBoolean("gui", false);
|
||||
if (startupConfig.GetString("console", String.Empty) == String.Empty)
|
||||
m_gui = startupConfig.GetBoolean("gui", false);
|
||||
else
|
||||
m_consoleType= startupConfig.GetString("console", String.Empty);
|
||||
|
||||
m_timedScript = startupConfig.GetString("timer_Script", "disabled");
|
||||
if (m_logFileAppender != null)
|
||||
|
@ -110,13 +114,31 @@ namespace OpenSim
|
|||
if (m_gui) // Driven by external GUI
|
||||
m_console = new CommandConsole("Region");
|
||||
else
|
||||
m_console = new LocalConsole("Region");
|
||||
{
|
||||
switch (m_consoleType)
|
||||
{
|
||||
case "basic":
|
||||
m_console = new CommandConsole("Region");
|
||||
break;
|
||||
case "rest":
|
||||
m_console = new RemoteConsole("Region");
|
||||
((RemoteConsole)m_console).ReadConfig(m_config.Source);
|
||||
break;
|
||||
default:
|
||||
m_console = new LocalConsole("Region");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
MainConsole.Instance = m_console;
|
||||
|
||||
RegisterConsoleCommands();
|
||||
|
||||
base.StartupSpecific();
|
||||
|
||||
if (m_console is RemoteConsole)
|
||||
((RemoteConsole)m_console).SetServer(m_httpServer);
|
||||
|
||||
//Run Startup Commands
|
||||
if (String.IsNullOrEmpty(m_startupCommandsFile))
|
||||
{
|
||||
|
|
|
@ -70,14 +70,14 @@ namespace OpenSim
|
|||
|
||||
protected bool m_autoCreateClientStack = true;
|
||||
|
||||
/// <summary>
|
||||
/// <value>
|
||||
/// The file used to load and save prim backup xml if no filename has been specified
|
||||
/// </summary>
|
||||
/// </value>
|
||||
protected const string DEFAULT_PRIM_BACKUP_FILENAME = "prim-backup.xml";
|
||||
|
||||
/// <summary>
|
||||
/// <value>
|
||||
/// The file used to load and save an opensimulator archive if no filename has been specified
|
||||
/// </summary>
|
||||
/// </value>
|
||||
protected const string DEFAULT_OAR_BACKUP_FILENAME = "region.oar";
|
||||
|
||||
public ConfigSettings ConfigurationSettings
|
||||
|
|
|
@ -197,6 +197,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
private ObjectExtraParams handlerUpdateExtraParams; //OnUpdateExtraParams;
|
||||
private ObjectDuplicate handlerObjectDuplicate;
|
||||
private ObjectDuplicateOnRay handlerObjectDuplicateOnRay;
|
||||
private ObjectRequest handlerObjectRequest;
|
||||
private ObjectSelect handlerObjectSelect;
|
||||
private ObjectDeselect handlerObjectDeselect;
|
||||
private ObjectIncludeInSearch handlerObjectIncludeInSearch;
|
||||
|
@ -1083,6 +1084,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
public event GodKickUser OnGodKickUser;
|
||||
public event ObjectExtraParams OnUpdateExtraParams;
|
||||
public event UpdateShape OnUpdatePrimShape;
|
||||
public event ObjectRequest OnObjectRequest;
|
||||
public event ObjectSelect OnObjectSelect;
|
||||
public event ObjectDeselect OnObjectDeselect;
|
||||
public event GenericCall7 OnObjectDescription;
|
||||
|
@ -2156,16 +2158,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
protected void SendBulkUpdateInventoryFolder(InventoryFolderBase folderBase)
|
||||
{
|
||||
// XXX: Nasty temporary move that will be resolved shortly
|
||||
InventoryFolderImpl folder = (InventoryFolderImpl)folderBase;
|
||||
|
||||
// We will use the same transaction id for all the separate packets to be sent out in this update.
|
||||
UUID transactionId = UUID.Random();
|
||||
|
||||
List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks
|
||||
= new List<BulkUpdateInventoryPacket.FolderDataBlock>();
|
||||
|
||||
SendBulkUpdateInventoryFolderRecursive(folder, ref folderDataBlocks, transactionId);
|
||||
SendBulkUpdateInventoryFolderRecursive(folderBase, ref folderDataBlocks, transactionId);
|
||||
|
||||
if (folderDataBlocks.Count > 0)
|
||||
{
|
||||
|
@ -2191,17 +2190,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
/// <param name="folderDataBlocks"></param>
|
||||
/// <param name="transactionId"></param>
|
||||
private void SendBulkUpdateInventoryFolderRecursive(
|
||||
InventoryFolderImpl folder, ref List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks,
|
||||
InventoryFolderBase folder, ref List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks,
|
||||
UUID transactionId)
|
||||
{
|
||||
folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
|
||||
|
||||
const int MAX_ITEMS_PER_PACKET = 5;
|
||||
|
||||
IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
|
||||
// If there are any items then we have to start sending them off in this packet - the next folder will have
|
||||
// to be in its own bulk update packet. Also, we can only fit 5 items in a packet (at least this was the limit
|
||||
// being used on the Linden grid at 20081203).
|
||||
List<InventoryItemBase> items = folder.RequestListOfItems();
|
||||
InventoryCollection contents = invService.GetFolderContent(AgentId, folder.ID); // folder.RequestListOfItems();
|
||||
List<InventoryItemBase> items = contents.Items;
|
||||
while (items.Count > 0)
|
||||
{
|
||||
BulkUpdateInventoryPacket bulkUpdate
|
||||
|
@ -2233,8 +2234,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
|
||||
}
|
||||
|
||||
List<InventoryFolderImpl> subFolders = folder.RequestListOfFolderImpls();
|
||||
foreach (InventoryFolderImpl subFolder in subFolders)
|
||||
List<InventoryFolderBase> subFolders = contents.Folders;
|
||||
foreach (InventoryFolderBase subFolder in subFolders)
|
||||
{
|
||||
SendBulkUpdateInventoryFolderRecursive(subFolder, ref folderDataBlocks, transactionId);
|
||||
}
|
||||
|
@ -5937,6 +5938,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
break;
|
||||
|
||||
case PacketType.RequestMultipleObjects:
|
||||
RequestMultipleObjectsPacket incomingRequest = (RequestMultipleObjectsPacket)Pack;
|
||||
|
||||
#region Packet Session and User Check
|
||||
if (m_checkPackets)
|
||||
{
|
||||
if (incomingRequest.AgentData.SessionID != SessionId ||
|
||||
incomingRequest.AgentData.AgentID != AgentId)
|
||||
break;
|
||||
}
|
||||
#endregion
|
||||
|
||||
handlerObjectRequest = null;
|
||||
|
||||
for (int i = 0; i < incomingRequest.ObjectData.Length; i++)
|
||||
{
|
||||
handlerObjectRequest = OnObjectRequest;
|
||||
if (handlerObjectRequest != null)
|
||||
{
|
||||
handlerObjectRequest(incomingRequest.ObjectData[i].ID, this);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PacketType.ObjectSelect:
|
||||
ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
|
||||
|
||||
|
@ -6609,20 +6633,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
}
|
||||
else // Agent
|
||||
{
|
||||
CachedUserInfo userInfo = ((Scene)m_scene).CommsManager.UserProfileCacheService.GetUserDetails(AgentId);
|
||||
if (userInfo == null)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[CLIENT]: Could not resolve user {0} for caps inventory update",
|
||||
AgentId);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (userInfo.RootFolder == null)
|
||||
break;
|
||||
|
||||
InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(itemID);
|
||||
//InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(itemID);
|
||||
IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
|
||||
InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(itemID));
|
||||
if (assetRequestItem == null)
|
||||
{
|
||||
assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID);
|
||||
|
|
|
@ -34,6 +34,7 @@ using OpenMetaverse;
|
|||
using OpenMetaverse.Packets;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Tests.Common;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
||||
{
|
||||
|
|
|
@ -147,7 +147,7 @@ namespace OpenSim.Region.Communications.OGS1
|
|||
{
|
||||
// The timeout should always be significantly larger than the timeout for the grid server to request
|
||||
// the initial status of the region before confirming registration.
|
||||
GridResp = GridReq.Send(serversInfo.GridURL, 90000);
|
||||
GridResp = GridReq.Send(serversInfo.GridURL, 9999999);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
|
@ -192,40 +192,29 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
{
|
||||
if (XferUploaders.ContainsKey(transactionID))
|
||||
{
|
||||
CachedUserInfo userInfo = Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails(
|
||||
remoteClient.AgentId);
|
||||
UUID assetID = UUID.Combine(transactionID, remoteClient.SecureSessionId);
|
||||
|
||||
if (userInfo != null)
|
||||
AssetBase asset = Manager.MyScene.AssetService.Get(assetID.ToString());
|
||||
|
||||
if (asset == null)
|
||||
{
|
||||
UUID assetID = UUID.Combine(transactionID, remoteClient.SecureSessionId);
|
||||
|
||||
AssetBase asset = Manager.MyScene.AssetService.Get(assetID.ToString());
|
||||
|
||||
if (asset == null)
|
||||
{
|
||||
asset = GetTransactionAsset(transactionID);
|
||||
}
|
||||
|
||||
if (asset != null && asset.FullID == assetID)
|
||||
{
|
||||
// Assets never get updated, new ones get created
|
||||
asset.FullID = UUID.Random();
|
||||
asset.Name = item.Name;
|
||||
asset.Description = item.Description;
|
||||
asset.Type = (sbyte)item.AssetType;
|
||||
item.AssetID = asset.FullID;
|
||||
|
||||
Manager.MyScene.AssetService.Store(asset);
|
||||
}
|
||||
|
||||
userInfo.UpdateItem(item);
|
||||
asset = GetTransactionAsset(transactionID);
|
||||
}
|
||||
else
|
||||
|
||||
if (asset != null && asset.FullID == assetID)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[ASSET TRANSACTIONS]: Could not find user {0} for inventory item update",
|
||||
remoteClient.AgentId);
|
||||
// Assets never get updated, new ones get created
|
||||
asset.FullID = UUID.Random();
|
||||
asset.Name = item.Name;
|
||||
asset.Description = item.Description;
|
||||
asset.Type = (sbyte)item.AssetType;
|
||||
item.AssetID = asset.FullID;
|
||||
|
||||
Manager.MyScene.AssetService.Store(asset);
|
||||
}
|
||||
|
||||
IInventoryService invService = Manager.MyScene.InventoryService;
|
||||
invService.UpdateItem(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ using log4net;
|
|||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
||||
{
|
||||
|
@ -214,39 +215,31 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
|
|||
private void DoCreateItem(uint callbackID)
|
||||
{
|
||||
m_userTransactions.Manager.MyScene.AssetService.Store(m_asset);
|
||||
CachedUserInfo userInfo =
|
||||
m_userTransactions.Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails(
|
||||
ourClient.AgentId);
|
||||
|
||||
if (userInfo != null)
|
||||
{
|
||||
InventoryItemBase item = new InventoryItemBase();
|
||||
item.Owner = ourClient.AgentId;
|
||||
item.CreatorId = ourClient.AgentId.ToString();
|
||||
item.ID = UUID.Random();
|
||||
item.AssetID = m_asset.FullID;
|
||||
item.Description = m_description;
|
||||
item.Name = m_name;
|
||||
item.AssetType = type;
|
||||
item.InvType = invType;
|
||||
item.Folder = InventFolder;
|
||||
item.BasePermissions = 0x7fffffff;
|
||||
item.CurrentPermissions = 0x7fffffff;
|
||||
item.GroupPermissions=0;
|
||||
item.EveryOnePermissions=0;
|
||||
item.NextPermissions = nextPerm;
|
||||
item.Flags = (uint) wearableType;
|
||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||
IInventoryService invService = m_userTransactions.Manager.MyScene.InventoryService;
|
||||
|
||||
userInfo.AddItem(item);
|
||||
InventoryItemBase item = new InventoryItemBase();
|
||||
item.Owner = ourClient.AgentId;
|
||||
item.CreatorId = ourClient.AgentId.ToString();
|
||||
item.ID = UUID.Random();
|
||||
item.AssetID = m_asset.FullID;
|
||||
item.Description = m_description;
|
||||
item.Name = m_name;
|
||||
item.AssetType = type;
|
||||
item.InvType = invType;
|
||||
item.Folder = InventFolder;
|
||||
item.BasePermissions = 0x7fffffff;
|
||||
item.CurrentPermissions = 0x7fffffff;
|
||||
item.GroupPermissions=0;
|
||||
item.EveryOnePermissions=0;
|
||||
item.NextPermissions = nextPerm;
|
||||
item.Flags = (uint) wearableType;
|
||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||
|
||||
if (invService.AddItem(item))
|
||||
ourClient.SendInventoryItemCreateUpdate(item, callbackID);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[ASSET TRANSACTIONS]: Could not find user {0} for inventory item creation",
|
||||
ourClient.AgentId);
|
||||
}
|
||||
ourClient.SendAlertMessage("Unable to create inventory item");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -37,6 +37,7 @@ using OpenSim.Framework.Communications.Cache;
|
|||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using BlockingQueue = OpenSim.Framework.BlockingQueue<OpenSim.Region.Framework.Interfaces.ITextureSender>;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Agent.TextureDownload
|
||||
{
|
||||
|
@ -217,11 +218,16 @@ namespace OpenSim.Region.CoreModules.Agent.TextureDownload
|
|||
if (profile == null) // Deny unknown user
|
||||
return;
|
||||
|
||||
if (profile.RootFolder == null) // Deny no inventory
|
||||
IInventoryService invService = scene.InventoryService;
|
||||
if (invService.GetRootFolder(client.AgentId) == null) // Deny no inventory
|
||||
return;
|
||||
|
||||
if (profile.UserProfile.GodLevel < 200 && profile.RootFolder.FindAsset(e.RequestedAssetID) == null) // Deny if not owned
|
||||
return;
|
||||
// Diva 2009-08-13: this test doesn't make any sense to many devs
|
||||
//if (profile.UserProfile.GodLevel < 200 && profile.RootFolder.FindAsset(e.RequestedAssetID) == null) // Deny if not owned
|
||||
//{
|
||||
// m_log.WarnFormat("[TEXTURE]: user {0} doesn't have permissions to texture {1}");
|
||||
// return;
|
||||
//}
|
||||
|
||||
m_log.Debug("Texture preview");
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ using OpenSim.Framework;
|
|||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||
{
|
||||
|
@ -115,9 +116,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
}
|
||||
|
||||
|
||||
public void SetAppearanceAssets(CachedUserInfo profile, ref AvatarAppearance appearance)
|
||||
public void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)
|
||||
{
|
||||
if (profile.RootFolder != null)
|
||||
IInventoryService invService = m_scene.InventoryService;
|
||||
|
||||
if (invService.GetRootFolder(userID) != null)
|
||||
{
|
||||
for (int i = 0; i < 13; i++)
|
||||
{
|
||||
|
@ -127,7 +130,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
}
|
||||
else
|
||||
{
|
||||
InventoryItemBase baseItem = profile.RootFolder.FindItem(appearance.Wearables[i].ItemID);
|
||||
InventoryItemBase baseItem = invService.GetItem(new InventoryItemBase(appearance.Wearables[i].ItemID));
|
||||
|
||||
if (baseItem != null)
|
||||
{
|
||||
|
@ -143,7 +146,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
}
|
||||
else
|
||||
{
|
||||
m_log.Error("[APPEARANCE]: you have no inventory, appearance stuff isn't going to work");
|
||||
m_log.WarnFormat("[APPEARANCE]: user {0} has no inventory, appearance isn't going to work", userID);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -163,8 +166,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
return;
|
||||
}
|
||||
|
||||
CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(clientView.AgentId);
|
||||
|
||||
AvatarAppearance avatAppearance = null;
|
||||
if (!TryGetAvatarAppearance(clientView.AgentId, out avatAppearance))
|
||||
{
|
||||
|
@ -174,34 +175,18 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
|||
|
||||
//m_log.DebugFormat("[APPEARANCE]: Received wearables for {0}", clientView.Name);
|
||||
|
||||
if (profile != null)
|
||||
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
|
||||
{
|
||||
if (profile.RootFolder != null)
|
||||
if (wear.Type < 13)
|
||||
{
|
||||
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
|
||||
{
|
||||
if (wear.Type < 13)
|
||||
{
|
||||
avatAppearance.Wearables[wear.Type].ItemID = wear.ItemID;
|
||||
}
|
||||
}
|
||||
|
||||
SetAppearanceAssets(profile, ref avatAppearance);
|
||||
avatAppearance.Wearables[wear.Type].ItemID = wear.ItemID;
|
||||
}
|
||||
}
|
||||
|
||||
SetAppearanceAssets(avatar.UUID, ref avatAppearance);
|
||||
|
||||
m_scene.CommsManager.AvatarService.UpdateUserAppearance(clientView.AgentId, avatAppearance);
|
||||
avatar.Appearance = avatAppearance;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat(
|
||||
"[APPEARANCE]: Inventory has not yet been received for {0}, cannot set wearables",
|
||||
clientView.Name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("[APPEARANCE]: Cannot set wearables for {0}, no user profile found", clientView.Name);
|
||||
}
|
||||
m_scene.CommsManager.AvatarService.UpdateUserAppearance(clientView.AgentId, avatAppearance);
|
||||
avatar.Appearance = avatAppearance;
|
||||
}
|
||||
|
||||
public static void GetDefaultAvatarAppearance(out AvatarWearable[] wearables, out byte[] visualParams)
|
||||
|
|
|
@ -39,6 +39,7 @@ using OpenSim.Framework.Communications;
|
|||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||
{
|
||||
|
@ -654,8 +655,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
|||
initiator.ControllingClient.SendAgentOnline(new UUID[] { fromAgentID });
|
||||
|
||||
// find the folder for the friend...
|
||||
InventoryFolderImpl folder =
|
||||
initiator.Scene.CommsManager.UserProfileCacheService.GetUserDetails(toAgentID).FindFolderForType((int)InventoryType.CallingCard);
|
||||
//InventoryFolderImpl folder =
|
||||
// initiator.Scene.CommsManager.UserProfileCacheService.GetUserDetails(toAgentID).FindFolderForType((int)InventoryType.CallingCard);
|
||||
IInventoryService invService = initiator.Scene.InventoryService;
|
||||
InventoryFolderBase folder = invService.GetFolderForType(toAgentID, AssetType.CallingCard);
|
||||
if (folder != null)
|
||||
{
|
||||
// ... and add the calling card
|
||||
|
|
|
@ -33,6 +33,7 @@ using OpenSim.Framework;
|
|||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.Gestures
|
||||
{
|
||||
|
@ -62,42 +63,32 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures
|
|||
|
||||
public virtual void ActivateGesture(IClientAPI client, UUID assetId, UUID gestureId)
|
||||
{
|
||||
CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId);
|
||||
IInventoryService invService = m_scene.InventoryService;
|
||||
|
||||
if (userInfo != null)
|
||||
InventoryItemBase item = invService.GetItem(new InventoryItemBase(gestureId));
|
||||
if (item != null)
|
||||
{
|
||||
InventoryItemBase item = userInfo.RootFolder.FindItem(gestureId);
|
||||
if (item != null)
|
||||
{
|
||||
item.Flags = 1;
|
||||
userInfo.UpdateItem(item);
|
||||
}
|
||||
else
|
||||
m_log.ErrorFormat(
|
||||
"[GESTURES]: Unable to find gesture to activate {0} for {1}", gestureId, client.Name);
|
||||
item.Flags = 1;
|
||||
invService.UpdateItem(item);
|
||||
}
|
||||
else
|
||||
m_log.ErrorFormat("[GESTURES]: Unable to find user {0}", client.Name);
|
||||
m_log.WarnFormat(
|
||||
"[GESTURES]: Unable to find gesture {0} to activate for {1}", gestureId, client.Name);
|
||||
}
|
||||
|
||||
public virtual void DeactivateGesture(IClientAPI client, UUID gestureId)
|
||||
{
|
||||
CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId);
|
||||
IInventoryService invService = m_scene.InventoryService;
|
||||
|
||||
if (userInfo != null)
|
||||
InventoryItemBase item = invService.GetItem(new InventoryItemBase(gestureId));
|
||||
if (item != null)
|
||||
{
|
||||
InventoryItemBase item = userInfo.RootFolder.FindItem(gestureId);
|
||||
if (item != null)
|
||||
{
|
||||
item.Flags = 0;
|
||||
userInfo.UpdateItem(item);
|
||||
}
|
||||
else
|
||||
m_log.ErrorFormat(
|
||||
"[GESTURES]: Unable to find gesture to deactivate {0} for {1}", gestureId, client.Name);
|
||||
item.Flags = 0;
|
||||
invService.UpdateItem(item);
|
||||
}
|
||||
else
|
||||
m_log.ErrorFormat("[GESTURES]: Unable to find user {0}", client.Name);
|
||||
m_log.ErrorFormat(
|
||||
"[GESTURES]: Unable to find gesture to deactivate {0} for {1}", gestureId, client.Name);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -74,7 +74,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
|||
/// <summary>
|
||||
/// Test saving a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet).
|
||||
/// </summary>
|
||||
[Test]
|
||||
// Commenting for now! The mock inventory service needs more beef, at least for
|
||||
// GetFolderForType
|
||||
//[Test]
|
||||
public void TestSaveIarV0_1()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
@ -145,7 +147,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
|||
item1.Name = "My Little Dog";
|
||||
item1.AssetID = asset1.FullID;
|
||||
item1.ID = item1Id;
|
||||
item1.Folder = userInfo.RootFolder.FindFolderByPath("Objects").ID;
|
||||
//userInfo.RootFolder.FindFolderByPath("Objects").ID;
|
||||
InventoryFolderBase objsFolder = scene.InventoryService.GetFolderForType(userId, AssetType.Object);
|
||||
item1.Folder = objsFolder.ID;
|
||||
scene.AddInventoryItem(userId, item1);
|
||||
|
||||
MemoryStream archiveWriteStream = new MemoryStream();
|
||||
|
@ -161,8 +165,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
|||
MemoryStream archiveReadStream = new MemoryStream(archive);
|
||||
TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
|
||||
|
||||
InventoryFolderImpl objectsFolder = userInfo.RootFolder.FindFolderByPath("Objects");
|
||||
|
||||
//bool gotControlFile = false;
|
||||
bool gotObject1File = false;
|
||||
//bool gotObject2File = false;
|
||||
|
@ -170,7 +172,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
|||
"{0}{1}/{2}_{3}.xml",
|
||||
ArchiveConstants.INVENTORY_PATH,
|
||||
string.Format(
|
||||
"Objects{0}{1}", ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, objectsFolder.ID),
|
||||
"Objects{0}{1}", ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, objsFolder.ID),
|
||||
item1.Name,
|
||||
item1Id);
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ using OpenSim.Framework;
|
|||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
||||
{
|
||||
|
@ -154,7 +155,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
|||
"into agent {1}'s inventory",
|
||||
folderID, new UUID(im.toAgentID));
|
||||
|
||||
InventoryFolderImpl folderCopy
|
||||
InventoryFolderBase folderCopy
|
||||
= scene.GiveInventoryFolder(new UUID(im.toAgentID), client.AgentId, folderID, UUID.Zero);
|
||||
|
||||
if (folderCopy == null)
|
||||
|
@ -247,53 +248,52 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
|||
// It will have been pushed to the client, too
|
||||
//
|
||||
|
||||
CachedUserInfo userInfo =
|
||||
scene.CommsManager.UserProfileCacheService.
|
||||
GetUserDetails(client.AgentId);
|
||||
//CachedUserInfo userInfo =
|
||||
// scene.CommsManager.UserProfileCacheService.
|
||||
// GetUserDetails(client.AgentId);
|
||||
IInventoryService invService = scene.InventoryService;
|
||||
|
||||
if (userInfo != null)
|
||||
InventoryFolderBase trashFolder =
|
||||
invService.GetFolderForType(client.AgentId, AssetType.TrashFolder);
|
||||
|
||||
UUID inventoryEntityID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
|
||||
|
||||
InventoryItemBase item = invService.GetItem(new InventoryItemBase(inventoryEntityID));
|
||||
InventoryFolderBase folder = null;
|
||||
|
||||
if (item != null && trashFolder != null)
|
||||
{
|
||||
InventoryFolderImpl trashFolder =
|
||||
userInfo.FindFolderForType((int)AssetType.TrashFolder);
|
||||
|
||||
UUID inventoryEntityID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
|
||||
|
||||
InventoryItemBase item = userInfo.RootFolder.FindItem(inventoryEntityID);
|
||||
InventoryFolderBase folder = null;
|
||||
|
||||
if (item != null && trashFolder != null)
|
||||
{
|
||||
item.Folder = trashFolder.ID;
|
||||
item.Folder = trashFolder.ID;
|
||||
|
||||
userInfo.DeleteItem(inventoryEntityID);
|
||||
|
||||
scene.AddInventoryItem(client, item);
|
||||
}
|
||||
else
|
||||
{
|
||||
folder = userInfo.RootFolder.FindFolder(inventoryEntityID);
|
||||
|
||||
if (folder != null & trashFolder != null)
|
||||
{
|
||||
userInfo.MoveFolder(inventoryEntityID, trashFolder.ID);
|
||||
}
|
||||
}
|
||||
// Diva comment: can't we just update this item???
|
||||
invService.DeleteItem(item);
|
||||
scene.AddInventoryItem(client, item);
|
||||
}
|
||||
else
|
||||
{
|
||||
folder = invService.GetFolder(new InventoryFolderBase(inventoryEntityID));
|
||||
|
||||
if ((null == item && null == folder) | null == trashFolder)
|
||||
{
|
||||
string reason = String.Empty;
|
||||
|
||||
if (trashFolder == null)
|
||||
reason += " Trash folder not found.";
|
||||
if (item == null)
|
||||
reason += " Item not found.";
|
||||
if (folder == null)
|
||||
reason += " Folder not found.";
|
||||
|
||||
client.SendAgentAlertMessage("Unable to delete "+
|
||||
"received inventory" + reason, false);
|
||||
if (folder != null & trashFolder != null)
|
||||
{
|
||||
folder.ParentID = trashFolder.ID;
|
||||
invService.MoveFolder(folder);
|
||||
}
|
||||
}
|
||||
|
||||
if ((null == item && null == folder) | null == trashFolder)
|
||||
{
|
||||
string reason = String.Empty;
|
||||
|
||||
if (trashFolder == null)
|
||||
reason += " Trash folder not found.";
|
||||
if (item == null)
|
||||
reason += " Item not found.";
|
||||
if (folder == null)
|
||||
reason += " Folder not found.";
|
||||
|
||||
client.SendAgentAlertMessage("Unable to delete "+
|
||||
"received inventory" + reason, false);
|
||||
}
|
||||
|
||||
ScenePresence user = scene.GetScenePresence(new UUID(im.toAgentID));
|
||||
|
||||
|
@ -405,17 +405,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
|||
return;
|
||||
}
|
||||
|
||||
CachedUserInfo userInfo =
|
||||
scene.CommsManager.UserProfileCacheService.
|
||||
GetUserDetails(user.ControllingClient.AgentId);
|
||||
//CachedUserInfo userInfo =
|
||||
// scene.CommsManager.UserProfileCacheService.
|
||||
// GetUserDetails(user.ControllingClient.AgentId);
|
||||
|
||||
if (userInfo == null)
|
||||
{
|
||||
m_log.Debug("[INVENTORY TRANSFER] Can't find user info of recipient");
|
||||
return;
|
||||
}
|
||||
//if (userInfo == null)
|
||||
//{
|
||||
// m_log.Debug("[INVENTORY TRANSFER] Can't find user info of recipient");
|
||||
// return;
|
||||
//}
|
||||
|
||||
AssetType assetType = (AssetType)msg.binaryBucket[0];
|
||||
IInventoryService invService = scene.InventoryService;
|
||||
|
||||
if (AssetType.Folder == assetType)
|
||||
{
|
||||
|
@ -425,31 +426,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
|||
folder.ID = folderID;
|
||||
folder.Owner = user.ControllingClient.AgentId;
|
||||
|
||||
// Fetch from database
|
||||
// Fetch from service
|
||||
//
|
||||
if (!userInfo.QueryFolder(folder))
|
||||
folder = invService.GetFolder(folder);
|
||||
if (folder == null)
|
||||
{
|
||||
m_log.Debug("[INVENTORY TRANSFER] Can't find folder to give");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get folder info
|
||||
//
|
||||
InventoryFolderImpl folderInfo = userInfo.RootFolder.FindFolder(folder.ID);
|
||||
if (folderInfo == null)
|
||||
{
|
||||
m_log.Debug("[INVENTORY TRANSFER] Can't retrieve folder to give");
|
||||
return;
|
||||
}
|
||||
user.ControllingClient.SendBulkUpdateInventory(folder);
|
||||
|
||||
user.ControllingClient.SendBulkUpdateInventory(folderInfo);
|
||||
|
||||
// This unelegant, slow kludge is to reload the folders and
|
||||
// items. Since a folder give can transfer subfolders and
|
||||
// items, this is the easiest way to pull that stuff in
|
||||
//
|
||||
userInfo.DropInventory();
|
||||
userInfo.FetchInventory();
|
||||
//// This unelegant, slow kludge is to reload the folders and
|
||||
//// items. Since a folder give can transfer subfolders and
|
||||
//// items, this is the easiest way to pull that stuff in
|
||||
////
|
||||
//userInfo.DropInventory();
|
||||
//userInfo.FetchInventory();
|
||||
|
||||
// Deliver message
|
||||
//
|
||||
|
@ -463,20 +456,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
|
|||
item.ID = itemID;
|
||||
item.Owner = user.ControllingClient.AgentId;
|
||||
|
||||
// Fetch from database
|
||||
// Fetch from service
|
||||
//
|
||||
if (!userInfo.QueryItem(item))
|
||||
{
|
||||
m_log.Debug("[INVENTORY TRANSFER] Can't find item to give");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get item info
|
||||
//
|
||||
item = userInfo.RootFolder.FindItem(item.ID);
|
||||
item = invService.GetItem(item);
|
||||
if (item == null)
|
||||
{
|
||||
m_log.Debug("[INVENTORY TRANSFER] Can't retrieve item to give");
|
||||
m_log.Debug("[INVENTORY TRANSFER] Can't find item to give");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -450,7 +450,7 @@ namespace OpenSim.Region.CoreModules.InterGrid
|
|||
|
||||
responseMap["sim_host"] = OSD.FromString(reg.ExternalHostName);
|
||||
|
||||
// DEPRECIATED
|
||||
// DEPRECATED
|
||||
responseMap["sim_ip"] = OSD.FromString(Util.GetHostFromDNS(reg.ExternalHostName).ToString());
|
||||
|
||||
responseMap["connect"] = OSD.FromBoolean(true);
|
||||
|
@ -591,7 +591,7 @@ namespace OpenSim.Region.CoreModules.InterGrid
|
|||
httpaddr = httpsCN;
|
||||
}
|
||||
|
||||
// DEPRECIATED
|
||||
// DEPRECATED
|
||||
responseMap["seed_capability"]
|
||||
= OSD.FromString(
|
||||
regionCapsHttpProtocol + httpaddr + ":" + reg.HttpPort + CapsUtil.GetCapsSeedPath(userCap.CapsObjectPath));
|
||||
|
@ -764,7 +764,7 @@ namespace OpenSim.Region.CoreModules.InterGrid
|
|||
responseMap["sim_port"] = OSD.FromInteger(reg.InternalEndPoint.Port);
|
||||
responseMap["sim_host"] = OSD.FromString(reg.ExternalHostName);// + ":" + reg.InternalEndPoint.Port.ToString());
|
||||
|
||||
// DEPRECIATED
|
||||
// DEPRECATED
|
||||
responseMap["sim_ip"] = OSD.FromString(Util.GetHostFromDNS(reg.ExternalHostName).ToString());
|
||||
|
||||
responseMap["session_id"] = OSD.FromUUID(SessionID);
|
||||
|
@ -851,7 +851,7 @@ namespace OpenSim.Region.CoreModules.InterGrid
|
|||
|
||||
string rezRespSeedCap = "";
|
||||
|
||||
// DEPRECIATED
|
||||
// DEPRECATED
|
||||
if (rezResponseMap.ContainsKey("seed_capability"))
|
||||
rezRespSeedCap = rezResponseMap["seed_capability"].AsString();
|
||||
|
||||
|
@ -863,7 +863,7 @@ namespace OpenSim.Region.CoreModules.InterGrid
|
|||
if (rezResponseMap.ContainsKey("rez_avatar/rez"))
|
||||
rezRespSeedCap = rezResponseMap["rez_avatar/rez"].AsString();
|
||||
|
||||
// DEPRECIATED
|
||||
// DEPRECATED
|
||||
string rezRespSim_ip = rezResponseMap["sim_ip"].AsString();
|
||||
|
||||
string rezRespSim_host = rezResponseMap["sim_host"].AsString();
|
||||
|
@ -879,13 +879,13 @@ namespace OpenSim.Region.CoreModules.InterGrid
|
|||
{
|
||||
RezResponsePositionArray = (OSDArray)rezResponseMap["position"];
|
||||
}
|
||||
// DEPRECIATED
|
||||
// DEPRECATED
|
||||
responseMap["seed_capability"] = OSD.FromString(rezRespSeedCap);
|
||||
|
||||
// REPLACEMENT r3
|
||||
responseMap["region_seed_capability"] = OSD.FromString(rezRespSeedCap);
|
||||
|
||||
// DEPRECIATED
|
||||
// DEPRECATED
|
||||
responseMap["sim_ip"] = OSD.FromString(Util.GetHostFromDNS(rezRespSim_ip).ToString());
|
||||
|
||||
responseMap["sim_host"] = OSD.FromString(rezRespSim_host);
|
||||
|
|
|
@ -123,7 +123,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Land
|
|||
|
||||
public LandData GetLandData(ulong regionHandle, uint x, uint y)
|
||||
{
|
||||
m_log.DebugFormat("[LAND IN CONNECTOR]: GetLandData for {0}. Count = {2}",
|
||||
m_log.DebugFormat("[LAND IN CONNECTOR]: GetLandData for {0}. Count = {1}",
|
||||
regionHandle, m_Scenes.Count);
|
||||
foreach (Scene s in m_Scenes)
|
||||
{
|
||||
|
|
|
@ -82,7 +82,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <returns>null if no root folder was found</returns>
|
||||
public abstract InventoryFolderBase GetRootFolder(UUID userID);
|
||||
public InventoryFolderBase GetRootFolder(UUID userID)
|
||||
{
|
||||
// Root folder is here as system type Folder.
|
||||
return m_cache.GetFolderForType(userID, AssetType.Folder);
|
||||
}
|
||||
|
||||
public abstract Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID);
|
||||
|
||||
|
@ -184,9 +188,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
/// <returns>true if the item was successfully deleted</returns>
|
||||
public abstract bool DeleteItem(InventoryItemBase item);
|
||||
|
||||
public abstract InventoryItemBase QueryItem(InventoryItemBase item);
|
||||
public abstract InventoryItemBase GetItem(InventoryItemBase item);
|
||||
|
||||
public abstract InventoryFolderBase QueryFolder(InventoryFolderBase folder);
|
||||
public abstract InventoryFolderBase GetFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Does the given user have an inventory structure?
|
||||
|
@ -202,5 +206,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
/// <returns></returns>
|
||||
public abstract List<InventoryItemBase> GetActiveGestures(UUID userId);
|
||||
|
||||
public abstract int GetAssetPermissions(UUID userID, UUID assetID);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -238,7 +238,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID)
|
||||
{
|
||||
if (IsLocalGridUser(userID))
|
||||
return GetSystemFoldersLocal(userID);
|
||||
{
|
||||
// This is not pretty, but it will have to do for now
|
||||
if (m_GridService is BaseInventoryConnector)
|
||||
{
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to RemoteInventoryServiceConnector module");
|
||||
return ((BaseInventoryConnector)m_GridService).GetSystemFolders(userID);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to GetSystemFoldersLocal");
|
||||
return GetSystemFoldersLocal(userID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UUID sessionID = GetSessionID(userID);
|
||||
|
@ -262,6 +274,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
|
||||
folders[(AssetType)folder.Type] = folder;
|
||||
}
|
||||
// Put the root folder there, as type Folder
|
||||
folders[AssetType.Folder] = root;
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count);
|
||||
return folders;
|
||||
}
|
||||
|
@ -387,13 +401,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
}
|
||||
}
|
||||
|
||||
public override InventoryItemBase QueryItem(InventoryItemBase item)
|
||||
public override InventoryItemBase GetItem(InventoryItemBase item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetItem {0} for user {1}", item.ID, item.Owner);
|
||||
if (IsLocalGridUser(item.Owner))
|
||||
return m_GridService.QueryItem(item);
|
||||
return m_GridService.GetItem(item);
|
||||
else
|
||||
{
|
||||
UUID sessionID = GetSessionID(item.Owner);
|
||||
|
@ -402,13 +416,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
}
|
||||
}
|
||||
|
||||
public override InventoryFolderBase QueryFolder(InventoryFolderBase folder)
|
||||
public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
|
||||
{
|
||||
if (folder == null)
|
||||
return null;
|
||||
|
||||
if (IsLocalGridUser(folder.Owner))
|
||||
return m_GridService.QueryFolder(folder);
|
||||
return m_GridService.GetFolder(folder);
|
||||
else
|
||||
{
|
||||
UUID sessionID = GetSessionID(folder.Owner);
|
||||
|
@ -422,39 +436,56 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
return false;
|
||||
}
|
||||
|
||||
public override InventoryFolderBase GetRootFolder(UUID userID)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public override List<InventoryItemBase> GetActiveGestures(UUID userId)
|
||||
{
|
||||
return new List<InventoryItemBase>();
|
||||
}
|
||||
|
||||
public override int GetAssetPermissions(UUID userID, UUID assetID)
|
||||
{
|
||||
if (IsLocalGridUser(userID))
|
||||
return m_GridService.GetAssetPermissions(userID, assetID);
|
||||
else
|
||||
{
|
||||
UUID sessionID = GetSessionID(userID);
|
||||
string uri = GetUserInventoryURI(userID) + "/" + userID.ToString();
|
||||
return m_HGService.GetAssetPermissions(uri, assetID, sessionID);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private UUID GetSessionID(UUID userID)
|
||||
{
|
||||
ScenePresence sp = m_Scene.GetScenePresence(userID);
|
||||
if (sp != null)
|
||||
return sp.ControllingClient.SessionId;
|
||||
CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID);
|
||||
if (uinfo != null)
|
||||
return uinfo.SessionID;
|
||||
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: user profile for {0} not found", userID);
|
||||
return UUID.Zero;
|
||||
}
|
||||
|
||||
private bool IsLocalGridUser(UUID userID)
|
||||
{
|
||||
if (m_UserProfileService == null)
|
||||
{
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, no profile service. Returning false.");
|
||||
return false;
|
||||
}
|
||||
|
||||
CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID);
|
||||
if (uinfo == null)
|
||||
{
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, no profile for user {0}. Returning true.", userID);
|
||||
return true;
|
||||
}
|
||||
|
||||
string userInventoryServerURI = HGNetworkServersInfo.ServerURI(uinfo.UserProfile.UserInventoryURI);
|
||||
string uri = m_LocalGridInventoryURI.TrimEnd('/');
|
||||
|
||||
if ((userInventoryServerURI == m_LocalGridInventoryURI) || (userInventoryServerURI == ""))
|
||||
m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, comparing {0} to {1}.", userInventoryServerURI, uri);
|
||||
|
||||
if ((userInventoryServerURI == uri) || (userInventoryServerURI == ""))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -91,6 +91,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
Dictionary<AssetType, InventoryFolderBase> folders = m_Connector.GetSystemFolders(presence.UUID);
|
||||
m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}",
|
||||
presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count);
|
||||
|
||||
if (folders.Count > 0)
|
||||
lock (m_InventoryCache)
|
||||
m_InventoryCache.Add(presence.UUID, folders);
|
||||
|
|
|
@ -201,8 +201,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
foreach (InventoryFolderBase folder in content.Folders)
|
||||
{
|
||||
if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
|
||||
{
|
||||
m_log.InfoFormat("[INVENTORY CONNECTOR]: folder type {0} ", folder.Type);
|
||||
folders[(AssetType)folder.Type] = folder;
|
||||
}
|
||||
}
|
||||
// Put the root folder there, as type Folder
|
||||
folders[AssetType.Folder] = root;
|
||||
m_log.InfoFormat("[INVENTORY CONNECTOR]: root folder is type {0} ", root.Type);
|
||||
|
||||
return folders;
|
||||
}
|
||||
}
|
||||
|
@ -292,14 +299,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
return m_InventoryService.DeleteItem(item);
|
||||
}
|
||||
|
||||
public override InventoryItemBase QueryItem(InventoryItemBase item)
|
||||
public override InventoryItemBase GetItem(InventoryItemBase item)
|
||||
{
|
||||
return m_InventoryService.QueryItem(item);
|
||||
return m_InventoryService.GetItem(item);
|
||||
}
|
||||
|
||||
public override InventoryFolderBase QueryFolder(InventoryFolderBase folder)
|
||||
public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
|
||||
{
|
||||
return m_InventoryService.QueryFolder(folder);
|
||||
return m_InventoryService.GetFolder(folder);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -312,20 +319,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
return m_InventoryService.HasInventoryForUser(userID);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieve the root inventory folder for the given user.
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <returns>null if no root folder was found</returns>
|
||||
public override InventoryFolderBase GetRootFolder(UUID userID)
|
||||
{
|
||||
return m_InventoryService.GetRootFolder(userID);
|
||||
}
|
||||
|
||||
public override List<InventoryItemBase> GetActiveGestures(UUID userId)
|
||||
{
|
||||
return m_InventoryService.GetActiveGestures(userId);
|
||||
}
|
||||
|
||||
public override int GetAssetPermissions(UUID userID, UUID assetID)
|
||||
{
|
||||
return m_InventoryService.GetAssetPermissions(userID, assetID);
|
||||
}
|
||||
#endregion IInventoryService
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ using System.Reflection;
|
|||
using Nini.Config;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Statistics;
|
||||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Services.Connectors;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
@ -48,6 +49,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
private bool m_Enabled = false;
|
||||
private bool m_Initialized = false;
|
||||
private Scene m_Scene;
|
||||
private UserProfileCacheService m_UserProfileService;
|
||||
private InventoryServicesConnector m_RemoteConnector;
|
||||
|
||||
public Type ReplaceableInterface
|
||||
|
@ -104,12 +106,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
|
||||
public void AddRegion(Scene scene)
|
||||
{
|
||||
m_Scene = scene;
|
||||
m_log.Debug("[XXXX] Adding scene " + m_Scene.RegionInfo.RegionName);
|
||||
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
if (!m_Initialized)
|
||||
{
|
||||
m_Scene = scene;
|
||||
// ugh!
|
||||
scene.CommsManager.UserProfileCacheService.SetInventoryService(this);
|
||||
scene.CommsManager.UserService.SetInventoryService(this);
|
||||
|
@ -130,6 +134,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
|
||||
public void RegionLoaded(Scene scene)
|
||||
{
|
||||
m_UserProfileService = m_Scene.CommsManager.UserProfileCacheService;
|
||||
if (m_UserProfileService != null)
|
||||
m_log.Debug("[XXXX] Set m_UserProfileService in " + m_Scene.RegionInfo.RegionName);
|
||||
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
|
@ -273,7 +281,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
return m_RemoteConnector.DeleteItem(item.Owner.ToString(), item, sessionID);
|
||||
}
|
||||
|
||||
public override InventoryItemBase QueryItem(InventoryItemBase item)
|
||||
public override InventoryItemBase GetItem(InventoryItemBase item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
@ -282,7 +290,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
return m_RemoteConnector.QueryItem(item.Owner.ToString(), item, sessionID);
|
||||
}
|
||||
|
||||
public override InventoryFolderBase QueryFolder(InventoryFolderBase folder)
|
||||
public override InventoryFolderBase GetFolder(InventoryFolderBase folder)
|
||||
{
|
||||
if (folder == null)
|
||||
return null;
|
||||
|
@ -296,25 +304,39 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
|||
return false;
|
||||
}
|
||||
|
||||
public override InventoryFolderBase GetRootFolder(UUID userID)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public override List<InventoryItemBase> GetActiveGestures(UUID userId)
|
||||
{
|
||||
return new List<InventoryItemBase>();
|
||||
}
|
||||
|
||||
public override int GetAssetPermissions(UUID userID, UUID assetID)
|
||||
{
|
||||
UUID sessionID = GetSessionID(userID);
|
||||
return m_RemoteConnector.GetAssetPermissions(userID.ToString(), assetID, sessionID);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
private UUID GetSessionID(UUID userID)
|
||||
{
|
||||
ScenePresence sp = m_Scene.GetScenePresence(userID);
|
||||
if (sp != null)
|
||||
return sp.ControllingClient.SessionId;
|
||||
if (m_Scene == null)
|
||||
{
|
||||
m_log.Debug("[INVENTORY CONNECTOR]: OOPS! scene is null");
|
||||
}
|
||||
|
||||
if (m_UserProfileService == null)
|
||||
{
|
||||
m_log.Debug("[INVENTORY CONNECTOR]: OOPS! UserProfileCacheService is null");
|
||||
return UUID.Zero;
|
||||
}
|
||||
|
||||
CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID);
|
||||
if (uinfo != null)
|
||||
return uinfo.SessionID;
|
||||
m_log.DebugFormat("[INVENTORY CONNECTOR]: user profile for {0} not found", userID);
|
||||
return UUID.Zero;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ using OpenSim.Framework;
|
|||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Services.Interfaces;
|
||||
|
||||
// Temporary fix of wrong GroupPowers constants in OpenMetaverse library
|
||||
enum GroupPowers : long
|
||||
|
@ -964,19 +965,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
|||
|
||||
if (objectID == UUID.Zero) // User inventory
|
||||
{
|
||||
CachedUserInfo userInfo =
|
||||
scene.CommsManager.UserProfileCacheService.GetUserDetails(user);
|
||||
|
||||
if (userInfo == null)
|
||||
{
|
||||
m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for edit notecard check", user);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (userInfo.RootFolder == null)
|
||||
return false;
|
||||
|
||||
InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard);
|
||||
IInventoryService invService = m_scene.InventoryService;
|
||||
InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(notecard));
|
||||
if (assetRequestItem == null) // Library item
|
||||
{
|
||||
assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard);
|
||||
|
@ -1394,19 +1384,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
|||
|
||||
if (objectID == UUID.Zero) // User inventory
|
||||
{
|
||||
CachedUserInfo userInfo =
|
||||
scene.CommsManager.UserProfileCacheService.GetUserDetails(user);
|
||||
|
||||
if (userInfo == null)
|
||||
{
|
||||
m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for administrator check", user);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (userInfo.RootFolder == null)
|
||||
return false;
|
||||
|
||||
InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(script);
|
||||
IInventoryService invService = m_scene.InventoryService;
|
||||
InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(script));
|
||||
if (assetRequestItem == null) // Library item
|
||||
{
|
||||
assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script);
|
||||
|
@ -1499,19 +1478,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
|||
|
||||
if (objectID == UUID.Zero) // User inventory
|
||||
{
|
||||
CachedUserInfo userInfo =
|
||||
scene.CommsManager.UserProfileCacheService.GetUserDetails(user);
|
||||
|
||||
if (userInfo == null)
|
||||
{
|
||||
m_log.ErrorFormat("[PERMISSIONS]: Could not find user {0} for view notecard check", user);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (userInfo.RootFolder == null)
|
||||
return false;
|
||||
|
||||
InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(notecard);
|
||||
IInventoryService invService = m_scene.InventoryService;
|
||||
InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(notecard));
|
||||
if (assetRequestItem == null) // Library item
|
||||
{
|
||||
assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard);
|
||||
|
|
|
@ -107,6 +107,7 @@ namespace OpenSim.Region.Examples.SimpleModule
|
|||
public event UpdateShape OnUpdatePrimShape;
|
||||
public event ObjectExtraParams OnUpdateExtraParams;
|
||||
public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
|
||||
public event ObjectRequest OnObjectRequest;
|
||||
public event ObjectSelect OnObjectSelect;
|
||||
public event GenericCall7 OnObjectDescription;
|
||||
public event GenericCall7 OnObjectName;
|
||||
|
|
|
@ -63,7 +63,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public delegate void OnNewClientDelegate(IClientAPI client);
|
||||
|
||||
/// <summary>
|
||||
/// Depreciated in favour of OnClientConnect.
|
||||
/// Deprecated in favour of OnClientConnect.
|
||||
/// Will be marked Obsolete after IClientCore has 100% of IClientAPI interfaces.
|
||||
/// </summary>
|
||||
public event OnNewClientDelegate OnNewClient;
|
||||
|
|
|
@ -201,31 +201,31 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
|||
}
|
||||
}
|
||||
|
||||
public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo)
|
||||
{
|
||||
InventoryClient invCli = null;
|
||||
string inventoryURL = UserInventoryURL(item.Owner);
|
||||
if (!m_inventoryServers.TryGetValue(inventoryURL, out invCli))
|
||||
{
|
||||
m_log.Debug("[HGScene]: Starting new InventorytClient for " + inventoryURL);
|
||||
invCli = new InventoryClient(inventoryURL);
|
||||
m_inventoryServers.Add(inventoryURL, invCli);
|
||||
}
|
||||
//public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo)
|
||||
//{
|
||||
// InventoryClient invCli = null;
|
||||
// string inventoryURL = UserInventoryURL(item.Owner);
|
||||
// if (!m_inventoryServers.TryGetValue(inventoryURL, out invCli))
|
||||
// {
|
||||
// m_log.Debug("[HGScene]: Starting new InventorytClient for " + inventoryURL);
|
||||
// invCli = new InventoryClient(inventoryURL);
|
||||
// m_inventoryServers.Add(inventoryURL, invCli);
|
||||
// }
|
||||
|
||||
item = invCli.GetInventoryItem(item);
|
||||
if (item != null)
|
||||
{
|
||||
// Change the folder, stick it in root folder, all items flattened out here in this region cache
|
||||
item.Folder = rootFolder;
|
||||
//userInfo.AddItem(item); don't use this, it calls back to the inventory server
|
||||
lock (userInfo.RootFolder.Items)
|
||||
{
|
||||
userInfo.RootFolder.Items[item.ID] = item;
|
||||
}
|
||||
// item = invCli.GetInventoryItem(item);
|
||||
// if (item != null)
|
||||
// {
|
||||
// // Change the folder, stick it in root folder, all items flattened out here in this region cache
|
||||
// item.Folder = rootFolder;
|
||||
// //userInfo.AddItem(item); don't use this, it calls back to the inventory server
|
||||
// lock (userInfo.RootFolder.Items)
|
||||
// {
|
||||
// userInfo.RootFolder.Items[item.ID] = item;
|
||||
// }
|
||||
|
||||
}
|
||||
return item;
|
||||
}
|
||||
// }
|
||||
// return item;
|
||||
//}
|
||||
|
||||
public void Post(UUID assetID, UUID ownerID)
|
||||
{
|
||||
|
|
|
@ -117,25 +117,20 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
|||
|
||||
if (fromTaskID.Equals(UUID.Zero))
|
||||
{
|
||||
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
|
||||
if (userInfo != null)
|
||||
InventoryItemBase item = new InventoryItemBase(itemID);
|
||||
item.Owner = remoteClient.AgentId;
|
||||
item = InventoryService.GetItem(item);
|
||||
//if (item == null)
|
||||
//{ // Fetch the item
|
||||
// item = new InventoryItemBase();
|
||||
// item.Owner = remoteClient.AgentId;
|
||||
// item.ID = itemID;
|
||||
// item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo);
|
||||
//}
|
||||
if (item != null)
|
||||
{
|
||||
if (userInfo.RootFolder != null)
|
||||
{
|
||||
InventoryItemBase item = userInfo.RootFolder.FindItem(itemID);
|
||||
if (item == null)
|
||||
{ // Fetch the item
|
||||
item = new InventoryItemBase();
|
||||
item.Owner = remoteClient.AgentId;
|
||||
item.ID = itemID;
|
||||
item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo);
|
||||
}
|
||||
if (item != null)
|
||||
{
|
||||
m_assMapper.Get(item.AssetID, remoteClient.AgentId);
|
||||
m_assMapper.Get(item.AssetID, remoteClient.AgentId);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -108,6 +108,28 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Invoked when the client requests a prim.
|
||||
/// </summary>
|
||||
/// <param name="primLocalID"></param>
|
||||
/// <param name="remoteClient"></param>
|
||||
public void RequestPrim(uint primLocalID, IClientAPI remoteClient)
|
||||
{
|
||||
List<EntityBase> EntityList = GetEntities();
|
||||
|
||||
foreach (EntityBase ent in EntityList)
|
||||
{
|
||||
if (ent is SceneObjectGroup)
|
||||
{
|
||||
if (((SceneObjectGroup)ent).LocalId == primLocalID)
|
||||
{
|
||||
((SceneObjectGroup)ent).SendFullUpdateToClient(remoteClient);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Invoked when the client selects a prim.
|
||||
/// </summary>
|
||||
|
@ -382,31 +404,13 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
return;
|
||||
}
|
||||
|
||||
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
|
||||
|
||||
if (null == userProfile)
|
||||
InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID));
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (userProfile.HasReceivedInventory)
|
||||
{
|
||||
InventoryItemBase item = null;
|
||||
if (userProfile.RootFolder == null)
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: User {0} {1} does not have a root folder.",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
else
|
||||
item = userProfile.RootFolder.FindItem(itemID);
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
remoteClient.SendInventoryItemDetails(ownerID, item);
|
||||
}
|
||||
remoteClient.SendInventoryItemDetails(ownerID, item);
|
||||
}
|
||||
// else shouldn't we send an alert message?
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -435,23 +439,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
return;
|
||||
}
|
||||
|
||||
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
|
||||
|
||||
if (null == userProfile)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
return;
|
||||
}
|
||||
|
||||
userProfile.SendInventoryDecendents(remoteClient, folderID, fetchFolders, fetchItems);
|
||||
SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle the caps inventory descendents fetch.
|
||||
///
|
||||
/// Since the folder structure is sent to the client on login, I believe we only need to handle items.
|
||||
/// Diva comment 8/13/2009: what if someone gave us a folder in the meantime??
|
||||
/// </summary>
|
||||
/// <param name="agentID"></param>
|
||||
/// <param name="folderID"></param>
|
||||
|
@ -477,59 +472,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
return fold.RequestListOfItems();
|
||||
}
|
||||
|
||||
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(agentID);
|
||||
|
||||
if (null == userProfile)
|
||||
{
|
||||
m_log.ErrorFormat("[AGENT INVENTORY]: Could not find user profile for {0}", agentID);
|
||||
return null;
|
||||
}
|
||||
|
||||
// XXX: When a client crosses into a scene, their entire inventory is fetched
|
||||
// asynchronously. If the client makes a request before the inventory is received, we need
|
||||
// to give the inventory a chance to come in.
|
||||
//
|
||||
// This is a crude way of dealing with that by retrying the lookup. It's not quite as bad
|
||||
// in CAPS as doing this with the udp request, since here it won't hold up other packets.
|
||||
// In fact, here we'll be generous and try for longer.
|
||||
if (!userProfile.HasReceivedInventory)
|
||||
{
|
||||
int attempts = 0;
|
||||
while (attempts++ < 30)
|
||||
{
|
||||
m_log.DebugFormat(
|
||||
"[INVENTORY CACHE]: Poll number {0} for inventory items in folder {1} for user {2}",
|
||||
attempts, folderID, agentID);
|
||||
InventoryCollection contents = InventoryService.GetFolderContent(agentID, folderID);
|
||||
return contents.Items;
|
||||
|
||||
Thread.Sleep(2000);
|
||||
|
||||
if (userProfile.HasReceivedInventory)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (userProfile.HasReceivedInventory)
|
||||
{
|
||||
if ((fold = userProfile.RootFolder.FindFolder(folderID)) != null)
|
||||
{
|
||||
return fold.RequestListOfItems();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat(
|
||||
"[AGENT INVENTORY]: Could not find folder {0} requested by user {1}",
|
||||
folderID, agentID);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY CACHE]: Could not find root folder for user {0}", agentID);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -543,19 +489,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public void HandleCreateInventoryFolder(IClientAPI remoteClient, UUID folderID, ushort folderType,
|
||||
string folderName, UUID parentID)
|
||||
{
|
||||
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
|
||||
|
||||
if (null == userProfile)
|
||||
InventoryFolderBase folder = new InventoryFolderBase(folderID, folderName, remoteClient.AgentId, (short)folderType, parentID, 1);
|
||||
if (!InventoryService.AddFolder(folder))
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!userProfile.CreateFolder(folderName, folderID, folderType, parentID))
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
m_log.WarnFormat(
|
||||
"[AGENT INVENTORY]: Failed to move create folder for user {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
}
|
||||
|
@ -580,54 +517,26 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// m_log.DebugFormat(
|
||||
// "[AGENT INVENTORY]: Updating inventory folder {0} {1} for {2} {3}", folderID, name, remoteClient.Name, remoteClient.AgentId);
|
||||
|
||||
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
|
||||
|
||||
if (null == userProfile)
|
||||
InventoryFolderBase folder = new InventoryFolderBase(folderID);
|
||||
folder = InventoryService.GetFolder(folder);
|
||||
if (folder != null)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!userProfile.UpdateFolder(name, folderID, type, parentID))
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Failed to update folder for user {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
folder.Name = name;
|
||||
folder.Type = (short)type;
|
||||
folder.ParentID = parentID;
|
||||
if (!InventoryService.UpdateFolder(folder))
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Failed to update folder for user {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle an inventory folder move request from the client.
|
||||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="folderID"></param>
|
||||
/// <param name="parentID"></param>
|
||||
public void HandleMoveInventoryFolder(IClientAPI remoteClient, UUID folderID, UUID parentID)
|
||||
{
|
||||
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
|
||||
|
||||
if (null == userProfile)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!userProfile.MoveFolder(folderID, parentID))
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Failed to move folder {0} to {1} for user {2}",
|
||||
folderID, parentID, remoteClient.Name);
|
||||
}
|
||||
}
|
||||
|
||||
public void HandleMoveInventoryFolder2(IClientAPI remoteClient, UUID folderID, UUID parentID)
|
||||
{
|
||||
InventoryFolderBase folder = new InventoryFolderBase(folderID);
|
||||
folder = InventoryService.QueryFolder(folder);
|
||||
folder = InventoryService.GetFolder(folder);
|
||||
if (folder != null)
|
||||
{
|
||||
folder.ParentID = parentID;
|
||||
|
@ -647,27 +556,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// </summary>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="folderID"></param>
|
||||
|
||||
public void HandlePurgeInventoryDescendents(IClientAPI remoteClient, UUID folderID)
|
||||
{
|
||||
CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
|
||||
|
||||
if (null == userProfile)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Could not find user profile for {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!userProfile.PurgeFolder(folderID))
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[AGENT INVENTORY]: Failed to purge folder for user {0} {1}",
|
||||
remoteClient.Name, remoteClient.AgentId);
|
||||
}
|
||||
}
|
||||
|
||||
public void HandlePurgeInventoryDescendents2(IClientAPI remoteClient, UUID folderID)
|
||||
{
|
||||
InventoryFolderBase folder = new InventoryFolderBase(folderID);
|
||||
|
||||
|
|
|
@ -1962,7 +1962,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_log.DebugFormat("[ATTACHMENT]: Received " +
|
||||
"attachment {0}, inworld asset id {1}",
|
||||
//grp.RootPart.LastOwnerID.ToString(),
|
||||
grp.GetFromAssetID(),
|
||||
grp.GetFromItemID(),
|
||||
grp.UUID.ToString());
|
||||
|
||||
//grp.SetFromAssetID(grp.RootPart.LastOwnerID);
|
||||
|
@ -2042,13 +2042,24 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
else
|
||||
{
|
||||
AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode);
|
||||
|
||||
m_log.DebugFormat(
|
||||
"[SCENE]: Adding new child agent for {0} in {1}",
|
||||
client.Name, RegionInfo.RegionName);
|
||||
"[SCENE]: Adding new {0} agent for {1} in {2}",
|
||||
((aCircuit.child == true) ? "child" : "root"), client.Name, RegionInfo.RegionName);
|
||||
|
||||
CommsManager.UserProfileCacheService.AddNewUser(client.AgentId);
|
||||
|
||||
CreateAndAddScenePresence(client);
|
||||
ScenePresence sp = CreateAndAddScenePresence(client);
|
||||
|
||||
// HERE!!! Do the initial attachments right here
|
||||
// first agent upon login is a root agent by design.
|
||||
// All other AddNewClient calls find aCircuit.child to be true
|
||||
if (aCircuit.child == false)
|
||||
{
|
||||
sp.IsChildAgent = false;
|
||||
sp.RezAttachments();
|
||||
}
|
||||
}
|
||||
|
||||
m_LastLogin = Environment.TickCount;
|
||||
|
@ -2076,6 +2087,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
client.OnUpdatePrimTexture += m_sceneGraph.UpdatePrimTexture;
|
||||
client.OnTeleportLocationRequest += RequestTeleportLocation;
|
||||
client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
|
||||
client.OnObjectRequest += RequestPrim;
|
||||
client.OnObjectSelect += SelectPrim;
|
||||
client.OnObjectDeselect += DeselectPrim;
|
||||
client.OnGrabUpdate += m_sceneGraph.MoveObject;
|
||||
|
@ -3672,59 +3684,53 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
case 2: // Sell a copy
|
||||
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group);
|
||||
|
||||
CachedUserInfo userInfo =
|
||||
CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
|
||||
uint perms=group.GetEffectivePermissions();
|
||||
|
||||
if (userInfo != null)
|
||||
if ((perms & (uint)PermissionMask.Transfer) == 0)
|
||||
{
|
||||
uint perms=group.GetEffectivePermissions();
|
||||
|
||||
if ((perms & (uint)PermissionMask.Transfer) == 0)
|
||||
{
|
||||
m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale");
|
||||
return false;
|
||||
}
|
||||
|
||||
AssetBase asset = CreateAsset(
|
||||
group.GetPartName(localID),
|
||||
group.GetPartDescription(localID),
|
||||
(sbyte)AssetType.Object,
|
||||
Utils.StringToBytes(sceneObjectXml));
|
||||
AssetService.Store(asset);
|
||||
|
||||
InventoryItemBase item = new InventoryItemBase();
|
||||
item.CreatorId = part.CreatorID.ToString();
|
||||
|
||||
item.ID = UUID.Random();
|
||||
item.Owner = remoteClient.AgentId;
|
||||
item.AssetID = asset.FullID;
|
||||
item.Description = asset.Description;
|
||||
item.Name = asset.Name;
|
||||
item.AssetType = asset.Type;
|
||||
item.InvType = (int)InventoryType.Object;
|
||||
item.Folder = categoryID;
|
||||
|
||||
uint nextPerms=(perms & 7) << 13;
|
||||
if ((nextPerms & (uint)PermissionMask.Copy) == 0)
|
||||
perms &= ~(uint)PermissionMask.Copy;
|
||||
if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
|
||||
perms &= ~(uint)PermissionMask.Transfer;
|
||||
if ((nextPerms & (uint)PermissionMask.Modify) == 0)
|
||||
perms &= ~(uint)PermissionMask.Modify;
|
||||
|
||||
item.BasePermissions = perms & part.NextOwnerMask;
|
||||
item.CurrentPermissions = perms & part.NextOwnerMask;
|
||||
item.NextPermissions = part.NextOwnerMask;
|
||||
item.EveryOnePermissions = part.EveryoneMask &
|
||||
part.NextOwnerMask;
|
||||
item.GroupPermissions = part.GroupMask &
|
||||
part.NextOwnerMask;
|
||||
item.CurrentPermissions |= 8; // Slam!
|
||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||
|
||||
userInfo.AddItem(item);
|
||||
remoteClient.SendInventoryItemCreateUpdate(item, 0);
|
||||
m_dialogModule.SendAlertToUser(remoteClient, "This item doesn't appear to be for sale");
|
||||
return false;
|
||||
}
|
||||
|
||||
AssetBase asset = CreateAsset(
|
||||
group.GetPartName(localID),
|
||||
group.GetPartDescription(localID),
|
||||
(sbyte)AssetType.Object,
|
||||
Utils.StringToBytes(sceneObjectXml));
|
||||
AssetService.Store(asset);
|
||||
|
||||
InventoryItemBase item = new InventoryItemBase();
|
||||
item.CreatorId = part.CreatorID.ToString();
|
||||
|
||||
item.ID = UUID.Random();
|
||||
item.Owner = remoteClient.AgentId;
|
||||
item.AssetID = asset.FullID;
|
||||
item.Description = asset.Description;
|
||||
item.Name = asset.Name;
|
||||
item.AssetType = asset.Type;
|
||||
item.InvType = (int)InventoryType.Object;
|
||||
item.Folder = categoryID;
|
||||
|
||||
uint nextPerms=(perms & 7) << 13;
|
||||
if ((nextPerms & (uint)PermissionMask.Copy) == 0)
|
||||
perms &= ~(uint)PermissionMask.Copy;
|
||||
if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
|
||||
perms &= ~(uint)PermissionMask.Transfer;
|
||||
if ((nextPerms & (uint)PermissionMask.Modify) == 0)
|
||||
perms &= ~(uint)PermissionMask.Modify;
|
||||
|
||||
item.BasePermissions = perms & part.NextOwnerMask;
|
||||
item.CurrentPermissions = perms & part.NextOwnerMask;
|
||||
item.NextPermissions = part.NextOwnerMask;
|
||||
item.EveryOnePermissions = part.EveryoneMask &
|
||||
part.NextOwnerMask;
|
||||
item.GroupPermissions = part.GroupMask &
|
||||
part.NextOwnerMask;
|
||||
item.CurrentPermissions |= 8; // Slam!
|
||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||
|
||||
if (InventoryService.AddItem(item))
|
||||
remoteClient.SendInventoryItemCreateUpdate(item, 0);
|
||||
else
|
||||
{
|
||||
m_dialogModule.SendAlertToUser(remoteClient, "Cannot buy now. Your inventory is unavailable");
|
||||
|
@ -3739,8 +3745,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
foreach (UUID invID in invList)
|
||||
{
|
||||
TaskInventoryItem item = part.Inventory.GetInventoryItem(invID);
|
||||
if ((item.CurrentPermissions &
|
||||
TaskInventoryItem item1 = part.Inventory.GetInventoryItem(invID);
|
||||
if ((item1.CurrentPermissions &
|
||||
(uint)PermissionMask.Transfer) == 0)
|
||||
{
|
||||
okToSell = false;
|
||||
|
|
|
@ -1086,11 +1086,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public bool WaitForCallback(UUID id)
|
||||
{
|
||||
int count = 20;
|
||||
int count = 200;
|
||||
while (m_agentsInTransit.Contains(id) && count-- > 0)
|
||||
{
|
||||
//m_log.Debug(" >>> Waiting... " + count);
|
||||
Thread.Sleep(1000);
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
|
@ -1207,16 +1207,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
pos = pos + (agent.Velocity);
|
||||
|
||||
CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID);
|
||||
if (userInfo != null)
|
||||
{
|
||||
userInfo.DropInventory();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("[SCENE COMM]: No cached user info found for {0} {1} on leaving region {2}",
|
||||
agent.Name, agent.UUID, agent.Scene.RegionInfo.RegionName);
|
||||
}
|
||||
//CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID);
|
||||
//if (userInfo != null)
|
||||
//{
|
||||
// userInfo.DropInventory();
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// m_log.WarnFormat("[SCENE COMM]: No cached user info found for {0} {1} on leaving region {2}",
|
||||
// agent.Name, agent.UUID, agent.Scene.RegionInfo.RegionName);
|
||||
//}
|
||||
|
||||
//bool crossingSuccessful =
|
||||
// CrossToNeighbouringRegion(neighbourHandle, agent.ControllingClient.AgentId, pos,
|
||||
|
@ -1315,11 +1315,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
else // Not successful
|
||||
{
|
||||
CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID);
|
||||
if (userInfo != null)
|
||||
{
|
||||
userInfo.FetchInventory();
|
||||
}
|
||||
//CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID);
|
||||
//if (userInfo != null)
|
||||
//{
|
||||
// userInfo.FetchInventory();
|
||||
//}
|
||||
agent.RestoreInCurrentScene();
|
||||
}
|
||||
// In any case
|
||||
|
|
|
@ -442,7 +442,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (group != null)
|
||||
{
|
||||
//group.DetachToGround();
|
||||
m_parentScene.DetachSingleAttachmentToInv(group.GetFromAssetID(), remoteClient);
|
||||
m_parentScene.DetachSingleAttachmentToInv(group.GetFromItemID(), remoteClient);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -489,7 +489,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// Calls attach with a Zero position
|
||||
//
|
||||
AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false);
|
||||
m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromAssetID(), remoteClient.AgentId);
|
||||
m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
|
||||
}
|
||||
|
||||
public SceneObjectGroup RezSingleAttachment(
|
||||
|
@ -536,14 +536,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (entity is SceneObjectGroup)
|
||||
{
|
||||
group = (SceneObjectGroup)entity;
|
||||
if (group.GetFromAssetID() == itemID)
|
||||
if (group.GetFromItemID() == itemID)
|
||||
{
|
||||
m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero);
|
||||
group.DetachToInventoryPrep();
|
||||
m_log.Debug("[DETACH]: Saving attachpoint: " +
|
||||
((uint)group.GetAttachmentPoint()).ToString());
|
||||
m_parentScene.updateKnownAsset(remoteClient, group,
|
||||
group.GetFromAssetID(), group.OwnerID);
|
||||
m_parentScene.UpdateKnownItem(remoteClient, group,
|
||||
group.GetFromItemID(), group.OwnerID);
|
||||
m_parentScene.DeleteSceneObject(group, false);
|
||||
return;
|
||||
}
|
||||
|
@ -572,7 +572,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
// Check object for stored attachment point
|
||||
AttachmentPt = (uint)group.GetAttachmentPoint();
|
||||
}
|
||||
}
|
||||
|
||||
// if we still didn't find a suitable attachment point.......
|
||||
if (AttachmentPt == 0)
|
||||
|
@ -580,21 +580,23 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// Stick it on left hand with Zero Offset from the attachment point.
|
||||
AttachmentPt = (uint)AttachmentPoint.LeftHand;
|
||||
attachPos = Vector3.Zero;
|
||||
|
||||
}
|
||||
|
||||
|
||||
group.SetAttachmentPoint(Convert.ToByte(AttachmentPt));
|
||||
group.AbsolutePosition = attachPos;
|
||||
|
||||
// Saves and gets assetID
|
||||
// Saves and gets itemID
|
||||
UUID itemId;
|
||||
|
||||
if (group.GetFromAssetID() == UUID.Zero)
|
||||
if (group.GetFromItemID() == UUID.Zero)
|
||||
{
|
||||
m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId);
|
||||
}
|
||||
else
|
||||
{
|
||||
itemId = group.GetFromAssetID();
|
||||
itemId = group.GetFromItemID();
|
||||
}
|
||||
|
||||
m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group);
|
||||
|
@ -611,6 +613,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false);
|
||||
}
|
||||
}
|
||||
else
|
||||
m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID);
|
||||
}
|
||||
|
||||
protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance)
|
||||
|
@ -928,25 +932,22 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
// Primitive Ray Tracing
|
||||
float closestDistance = 280f;
|
||||
EntityIntersection returnResult = new EntityIntersection();
|
||||
EntityIntersection result = new EntityIntersection();
|
||||
List<EntityBase> EntityList = GetEntities();
|
||||
foreach (EntityBase ent in EntityList)
|
||||
{
|
||||
if (ent is SceneObjectGroup)
|
||||
{
|
||||
SceneObjectGroup reportingG = (SceneObjectGroup)ent;
|
||||
EntityIntersection result = reportingG.TestIntersection(hray, frontFacesOnly, faceCenters);
|
||||
if (result.HitTF)
|
||||
EntityIntersection inter = reportingG.TestIntersection(hray, frontFacesOnly, faceCenters);
|
||||
if (inter.HitTF && inter.distance < closestDistance)
|
||||
{
|
||||
if (result.distance < closestDistance)
|
||||
{
|
||||
closestDistance = result.distance;
|
||||
returnResult = result;
|
||||
}
|
||||
closestDistance = inter.distance;
|
||||
result = inter;
|
||||
}
|
||||
}
|
||||
}
|
||||
return returnResult;
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -979,7 +980,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
foreach (SceneObjectPart p in ((SceneObjectGroup) ent).GetParts())
|
||||
{
|
||||
if (p.Name==name)
|
||||
if (p.Name == name)
|
||||
{
|
||||
return p;
|
||||
}
|
||||
|
@ -1307,7 +1308,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
group.UpdateGroupPosition(pos);
|
||||
group.RootPart.IsAttachment = false;
|
||||
group.AbsolutePosition = group.RootPart.AttachedPos;
|
||||
m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(), group.OwnerID);
|
||||
m_parentScene.UpdateKnownItem(remoteClient, group, group.GetFromItemID(), group.OwnerID);
|
||||
group.SetAttachmentPoint(attachmentPoint);
|
||||
|
||||
}
|
||||
|
|
|
@ -447,22 +447,22 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
public void SetFromAssetID(UUID AssetId)
|
||||
public void SetFromItemID(UUID AssetId)
|
||||
{
|
||||
lock (m_parts)
|
||||
{
|
||||
foreach (SceneObjectPart part in m_parts.Values)
|
||||
{
|
||||
part.FromAssetID = AssetId;
|
||||
part.FromItemID = AssetId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public UUID GetFromAssetID()
|
||||
public UUID GetFromItemID()
|
||||
{
|
||||
if (m_rootPart != null)
|
||||
{
|
||||
return m_rootPart.FromAssetID;
|
||||
return m_rootPart.FromItemID;
|
||||
}
|
||||
return UUID.Zero;
|
||||
}
|
||||
|
@ -555,7 +555,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// If we get a result, we're going to find the closest result to the origin of the ray
|
||||
// and send back the intersection information back to the innerscene.
|
||||
|
||||
EntityIntersection returnresult = new EntityIntersection();
|
||||
EntityIntersection result = new EntityIntersection();
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
|
@ -576,26 +576,23 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// when the camera crosses the border.
|
||||
float idist = Constants.RegionSize;
|
||||
|
||||
|
||||
if (inter.HitTF)
|
||||
{
|
||||
// We need to find the closest prim to return to the testcaller along the ray
|
||||
if (inter.distance < idist)
|
||||
{
|
||||
returnresult.HitTF = true;
|
||||
returnresult.ipoint = inter.ipoint;
|
||||
returnresult.obj = part;
|
||||
returnresult.normal = inter.normal;
|
||||
returnresult.distance = inter.distance;
|
||||
result.HitTF = true;
|
||||
result.ipoint = inter.ipoint;
|
||||
result.obj = part;
|
||||
result.normal = inter.normal;
|
||||
result.distance = inter.distance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return returnresult;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets a vector representing the size of the bounding box containing all the prims in the group
|
||||
/// Treats all prims as rectangular, so no shape (cut etc) is taken into account
|
||||
|
@ -652,7 +649,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
frontBottomRight.Y = orig.Y + (part.Scale.Y / 2);
|
||||
frontBottomRight.Z = orig.Z - (part.Scale.Z / 2);
|
||||
|
||||
|
||||
backTopLeft.X = orig.X + (part.Scale.X / 2);
|
||||
backTopLeft.Y = orig.Y - (part.Scale.Y / 2);
|
||||
backTopLeft.Z = orig.Z + (part.Scale.Z / 2);
|
||||
|
@ -839,7 +835,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (backBottomLeft.Z < minZ)
|
||||
minZ = backBottomLeft.Z;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Vector3 boundingBox = new Vector3(maxX - minX, maxY - minY, maxZ - minZ);
|
||||
|
@ -860,6 +855,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// m_log.InfoFormat("BoundingBox is {0} , {1} , {2} ", boundingBox.X, boundingBox.Y, boundingBox.Z);
|
||||
return boundingBox;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public void SaveScriptedState(XmlTextWriter writer)
|
||||
|
@ -939,6 +935,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
SetAttachmentPoint(Convert.ToByte(attachmentpoint));
|
||||
|
||||
avatar.AddAttachment(this);
|
||||
m_log.DebugFormat("[SOG]: Added att {0} to avie {1}", UUID, avatar.UUID);
|
||||
|
||||
if (!silent)
|
||||
{
|
||||
|
@ -1029,8 +1026,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
|
||||
//AttachToBackup();
|
||||
//m_rootPart.ScheduleFullUpdate();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
|
@ -1130,6 +1127,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// helper provided for parts.
|
||||
public int GetSceneMaxUndo()
|
||||
{
|
||||
|
@ -1183,7 +1181,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
SceneObjectPart part = GetChildPart(localId);
|
||||
OnGrabPart(part, offsetPos, remoteClient);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1267,28 +1264,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
if ((aggregateScriptEvents & scriptEvents.at_target) != 0)
|
||||
{
|
||||
m_scriptListens_atTarget = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_scriptListens_atTarget = false;
|
||||
}
|
||||
m_scriptListens_atTarget = ((aggregateScriptEvents & scriptEvents.at_target) != 0);
|
||||
m_scriptListens_notAtTarget = ((aggregateScriptEvents & scriptEvents.not_at_target) != 0);
|
||||
|
||||
if ((aggregateScriptEvents & scriptEvents.not_at_target) != 0)
|
||||
{
|
||||
m_scriptListens_notAtTarget = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_scriptListens_notAtTarget = false;
|
||||
}
|
||||
|
||||
if (m_scriptListens_atTarget || m_scriptListens_notAtTarget)
|
||||
{
|
||||
}
|
||||
else
|
||||
if (!m_scriptListens_atTarget && !m_scriptListens_notAtTarget)
|
||||
{
|
||||
lock (m_targets)
|
||||
m_targets.Clear();
|
||||
|
@ -1787,9 +1766,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Set the owner of the root part.
|
||||
/// </summary>
|
||||
|
@ -3374,19 +3350,19 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public virtual string ExtraToXmlString()
|
||||
{
|
||||
return "<ExtraFromAssetID>" + GetFromAssetID().ToString() + "</ExtraFromAssetID>";
|
||||
return "<ExtraFromItemID>" + GetFromItemID().ToString() + "</ExtraFromItemID>";
|
||||
}
|
||||
|
||||
public virtual void ExtraFromXmlString(string xmlstr)
|
||||
{
|
||||
string id = xmlstr.Substring(xmlstr.IndexOf("<ExtraFromAssetID>"));
|
||||
id = xmlstr.Replace("<ExtraFromAssetID>", "");
|
||||
id = id.Replace("</ExtraFromAssetID>", "");
|
||||
string id = xmlstr.Substring(xmlstr.IndexOf("<ExtraFromItemID>"));
|
||||
id = xmlstr.Replace("<ExtraFromItemID>", "");
|
||||
id = id.Replace("</ExtraFromItemID>", "");
|
||||
|
||||
UUID uuid = UUID.Zero;
|
||||
UUID.TryParse(id, out uuid);
|
||||
|
||||
SetFromAssetID(uuid);
|
||||
SetFromItemID(uuid);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
public uint TimeStampTerse = 0;
|
||||
|
||||
[XmlIgnore]
|
||||
public UUID FromAssetID = UUID.Zero;
|
||||
public UUID FromItemID = UUID.Zero;
|
||||
|
||||
/// <value>
|
||||
/// The UUID of the user inventory item from which this object was rezzed if this is a root part.
|
||||
|
@ -2389,7 +2389,7 @@ if (m_shape != null) {
|
|||
remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape,
|
||||
lPos, Velocity, Acceleration, RotationOffset, RotationalVelocity, clientFlags, m_uuid, _ownerID,
|
||||
m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment,
|
||||
AttachmentPoint,FromAssetID, Sound, SoundGain, SoundFlags, SoundRadius);
|
||||
AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -2710,11 +2710,10 @@ if (m_shape != null) {
|
|||
|
||||
public EntityIntersection TestIntersection(Ray iray, Quaternion parentrot)
|
||||
{
|
||||
// In this case we're using a sphere with a radius of the largest dimention of the prim
|
||||
// In this case we're using a sphere with a radius of the largest dimension of the prim
|
||||
// TODO: Change to take shape into account
|
||||
|
||||
|
||||
EntityIntersection returnresult = new EntityIntersection();
|
||||
EntityIntersection result = new EntityIntersection();
|
||||
Vector3 vAbsolutePosition = AbsolutePosition;
|
||||
Vector3 vScale = Scale;
|
||||
Vector3 rOrigin = iray.Origin;
|
||||
|
@ -2738,8 +2737,7 @@ if (m_shape != null) {
|
|||
|
||||
Vector3 tmVal6 = vAbsolutePosition*rOrigin;
|
||||
|
||||
|
||||
// Set Radius to the largest dimention of the prim
|
||||
// Set Radius to the largest dimension of the prim
|
||||
float radius = 0f;
|
||||
if (vScale.X > radius)
|
||||
radius = vScale.X;
|
||||
|
@ -2765,7 +2763,7 @@ if (m_shape != null) {
|
|||
if (rootsqr < 0.0f)
|
||||
{
|
||||
// No intersection
|
||||
return returnresult;
|
||||
return result;
|
||||
}
|
||||
float root = ((-itestPart2) - (float) Math.Sqrt((double) rootsqr))/(itestPart1*2.0f);
|
||||
|
||||
|
@ -2778,7 +2776,7 @@ if (m_shape != null) {
|
|||
if (root < 0.0f)
|
||||
{
|
||||
// nope, no intersection
|
||||
return returnresult;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2788,12 +2786,12 @@ if (m_shape != null) {
|
|||
new Vector3(iray.Origin.X + (iray.Direction.X*root), iray.Origin.Y + (iray.Direction.Y*root),
|
||||
iray.Origin.Z + (iray.Direction.Z*root));
|
||||
|
||||
returnresult.HitTF = true;
|
||||
returnresult.ipoint = ipoint;
|
||||
result.HitTF = true;
|
||||
result.ipoint = ipoint;
|
||||
|
||||
// Normal is calculated by the difference and then normalizing the result
|
||||
Vector3 normalpart = ipoint - vAbsolutePosition;
|
||||
returnresult.normal = normalpart / normalpart.Length();
|
||||
result.normal = normalpart / normalpart.Length();
|
||||
|
||||
// It's funny how the Vector3 object has a Distance function, but the Axiom.Math object doesn't.
|
||||
// I can write a function to do it.. but I like the fact that this one is Static.
|
||||
|
@ -2802,9 +2800,9 @@ if (m_shape != null) {
|
|||
Vector3 distanceConvert2 = new Vector3(ipoint.X, ipoint.Y, ipoint.Z);
|
||||
float distance = (float) Util.GetDistanceTo(distanceConvert1, distanceConvert2);
|
||||
|
||||
returnresult.distance = distance;
|
||||
result.distance = distance;
|
||||
|
||||
return returnresult;
|
||||
return result;
|
||||
}
|
||||
|
||||
public EntityIntersection TestIntersectionOBB(Ray iray, Quaternion parentrot, bool frontFacesOnly, bool faceCenters)
|
||||
|
@ -3008,9 +3006,9 @@ if (m_shape != null) {
|
|||
//distance[i] = (normals[i].X * AmBa.X + normals[i].Y * AmBa.Y + normals[i].Z * AmBa.Z) * -1;
|
||||
}
|
||||
|
||||
EntityIntersection returnresult = new EntityIntersection();
|
||||
EntityIntersection result = new EntityIntersection();
|
||||
|
||||
returnresult.distance = 1024;
|
||||
result.distance = 1024;
|
||||
float c = 0;
|
||||
float a = 0;
|
||||
float d = 0;
|
||||
|
@ -3030,7 +3028,7 @@ if (m_shape != null) {
|
|||
//{
|
||||
//if (iray.Origin.Dot(normals[i]) > d)
|
||||
//{
|
||||
//return returnresult;
|
||||
//return result;
|
||||
//}
|
||||
// else
|
||||
//{
|
||||
|
@ -3044,7 +3042,7 @@ if (m_shape != null) {
|
|||
//{
|
||||
//if (a > fmin)
|
||||
//{
|
||||
//return returnresult;
|
||||
//return result;
|
||||
//}
|
||||
//fmax = a;
|
||||
//}
|
||||
|
@ -3056,7 +3054,7 @@ if (m_shape != null) {
|
|||
//{
|
||||
//if (a < 0 || a < fmax)
|
||||
//{
|
||||
//return returnresult;
|
||||
//return result;
|
||||
//}
|
||||
//fmin = a;
|
||||
//}
|
||||
|
@ -3112,17 +3110,17 @@ if (m_shape != null) {
|
|||
// distance2 = (float)GetDistanceTo(q, iray.Origin);
|
||||
//}
|
||||
|
||||
if (distance2 < returnresult.distance)
|
||||
if (distance2 < result.distance)
|
||||
{
|
||||
returnresult.distance = distance2;
|
||||
returnresult.HitTF = true;
|
||||
returnresult.ipoint = q;
|
||||
result.distance = distance2;
|
||||
result.HitTF = true;
|
||||
result.ipoint = q;
|
||||
//m_log.Info("[FACE]:" + i.ToString());
|
||||
//m_log.Info("[POINT]: " + q.ToString());
|
||||
//m_log.Info("[DIST]: " + distance2.ToString());
|
||||
if (faceCenters)
|
||||
{
|
||||
returnresult.normal = AAfacenormals[i] * AXrot;
|
||||
result.normal = AAfacenormals[i] * AXrot;
|
||||
|
||||
Vector3 scaleComponent = AAfacenormals[i];
|
||||
float ScaleOffset = 0.5f;
|
||||
|
@ -3130,20 +3128,20 @@ if (m_shape != null) {
|
|||
if (scaleComponent.Y != 0) ScaleOffset = AXscale.Y;
|
||||
if (scaleComponent.Z != 0) ScaleOffset = AXscale.Z;
|
||||
ScaleOffset = Math.Abs(ScaleOffset);
|
||||
Vector3 offset = returnresult.normal * ScaleOffset;
|
||||
returnresult.ipoint = AXpos + offset;
|
||||
Vector3 offset = result.normal * ScaleOffset;
|
||||
result.ipoint = AXpos + offset;
|
||||
|
||||
///pos = (intersectionpoint + offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
returnresult.normal = normals[i];
|
||||
result.normal = normals[i];
|
||||
}
|
||||
returnresult.AAfaceNormal = AAfacenormals[i];
|
||||
result.AAfaceNormal = AAfacenormals[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
return returnresult;
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -3767,7 +3765,7 @@ if (m_shape != null) {
|
|||
(ushort)(m_parentGroup.GetTimeDilation() *
|
||||
(float)ushort.MaxValue), LocalId, lPos,
|
||||
RotationOffset, Velocity,
|
||||
RotationalVelocity, state, FromAssetID,
|
||||
RotationalVelocity, state, FromItemID,
|
||||
OwnerID, (int)AttachmentPoint);
|
||||
}
|
||||
|
||||
|
|
|
@ -652,9 +652,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
RegisterToEvents();
|
||||
SetDirectionVectors();
|
||||
|
||||
CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid);
|
||||
if (userInfo != null)
|
||||
userInfo.OnItemReceived += ItemReceived;
|
||||
}
|
||||
|
||||
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
|
||||
|
@ -833,11 +830,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
m_scene.SwapRootAgentCount(false);
|
||||
|
||||
CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid);
|
||||
if (userInfo != null)
|
||||
userInfo.FetchInventory();
|
||||
else
|
||||
m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid);
|
||||
//CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid);
|
||||
//if (userInfo != null)
|
||||
// userInfo.FetchInventory();
|
||||
//else
|
||||
// m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid);
|
||||
|
||||
// On the next prim update, all objects will be sent
|
||||
//
|
||||
|
@ -1021,7 +1018,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Complete Avatar's movement into the region
|
||||
/// Complete Avatar's movement into the region.
|
||||
/// This is called upon a very important packet sent from the client,
|
||||
/// so it's client-controlled. Never call this method directly.
|
||||
/// </summary>
|
||||
public void CompleteMovement()
|
||||
{
|
||||
|
@ -1042,22 +1041,19 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
AbsolutePosition = pos;
|
||||
}
|
||||
|
||||
if (m_isChildAgent)
|
||||
m_isChildAgent = false;
|
||||
bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
|
||||
MakeRootAgent(AbsolutePosition, m_flying);
|
||||
|
||||
if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
|
||||
{
|
||||
m_isChildAgent = false;
|
||||
bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
|
||||
MakeRootAgent(AbsolutePosition, m_flying);
|
||||
|
||||
if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
|
||||
{
|
||||
m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI);
|
||||
Scene.SendReleaseAgent(m_rootRegionHandle, UUID, m_callbackURI);
|
||||
m_callbackURI = null;
|
||||
}
|
||||
|
||||
//m_log.DebugFormat("Completed movement");
|
||||
m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI);
|
||||
Scene.SendReleaseAgent(m_rootRegionHandle, UUID, m_callbackURI);
|
||||
m_callbackURI = null;
|
||||
}
|
||||
|
||||
//m_log.DebugFormat("Completed movement");
|
||||
|
||||
m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look);
|
||||
SendInitialData();
|
||||
|
||||
|
@ -3154,6 +3150,20 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_log.Warn("[SCENE PRESENCE]: exception in CopyTo " + e.Message);
|
||||
}
|
||||
|
||||
//Attachments
|
||||
List<int> attPoints = m_appearance.GetAttachedPoints();
|
||||
if (attPoints != null)
|
||||
{
|
||||
m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count);
|
||||
int i = 0;
|
||||
AttachmentData[] attachs = new AttachmentData[attPoints.Count];
|
||||
foreach (int point in attPoints)
|
||||
{
|
||||
attachs[i++] = new AttachmentData(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point));
|
||||
}
|
||||
cAgent.Attachments = attachs;
|
||||
}
|
||||
|
||||
// Animations
|
||||
try
|
||||
{
|
||||
|
@ -3219,6 +3229,19 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_log.Warn("[SCENE PRESENCE]: exception in CopyFrom " + e.Message);
|
||||
}
|
||||
|
||||
// Attachments
|
||||
try
|
||||
{
|
||||
if (cAgent.Attachments != null)
|
||||
{
|
||||
foreach (AttachmentData att in cAgent.Attachments)
|
||||
{
|
||||
m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
|
||||
// Animations
|
||||
try
|
||||
{
|
||||
|
@ -3729,69 +3752,49 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
return flags;
|
||||
}
|
||||
|
||||
private void ItemReceived(UUID itemID)
|
||||
/// <summary>
|
||||
/// RezAttachments. This should only be called upon login on the first region.
|
||||
/// Attachment rezzings on crossings and TPs are done in a different way.
|
||||
/// </summary>
|
||||
public void RezAttachments()
|
||||
{
|
||||
if (IsChildAgent)
|
||||
return;
|
||||
|
||||
if (null == m_appearance)
|
||||
{
|
||||
m_log.Warn("[ATTACHMENT] Appearance has not been initialized");
|
||||
m_log.WarnFormat("[ATTACHMENT] Appearance has not been initialized for agent {0}", UUID);
|
||||
return;
|
||||
}
|
||||
|
||||
int attachpoint = m_appearance.GetAttachpoint(itemID);
|
||||
if (attachpoint == 0)
|
||||
return;
|
||||
|
||||
UUID asset = m_appearance.GetAttachedAsset(attachpoint);
|
||||
if (UUID.Zero == asset) // We have just logged in
|
||||
List<int> attPoints = m_appearance.GetAttachedPoints();
|
||||
foreach (int p in attPoints)
|
||||
{
|
||||
UUID itemID = m_appearance.GetAttachedItem(p);
|
||||
UUID assetID = m_appearance.GetAttachedAsset(p);
|
||||
|
||||
// For some reason assetIDs are being written as Zero's in the DB -- need to track tat down
|
||||
// But they're not used anyway, the item is being looked up for now, so let's proceed.
|
||||
//if (UUID.Zero == assetID)
|
||||
//{
|
||||
// m_log.DebugFormat("[ATTACHMENT]: Cannot rez attachment in point {0} with itemID {1}", p, itemID);
|
||||
// continue;
|
||||
//}
|
||||
|
||||
try
|
||||
{
|
||||
// Rez from inventory
|
||||
asset = m_scene.RezSingleAttachment(ControllingClient,
|
||||
itemID, (uint)attachpoint);
|
||||
// Corner case: We are not yet a Scene Entity
|
||||
// Setting attachment info in RezSingleAttachment will fail
|
||||
// Set it here
|
||||
//
|
||||
m_appearance.SetAttachment((int)attachpoint, itemID,
|
||||
asset);
|
||||
m_log.InfoFormat("[ATTACHMENT] Rezzed attachment {0}, inworld asset {1}",
|
||||
itemID.ToString(), asset);
|
||||
UUID asset = m_scene.RezSingleAttachment(ControllingClient,
|
||||
itemID, (uint)p);
|
||||
|
||||
m_log.InfoFormat("[ATTACHMENT]: Rezzed attachment in point {0} from item {1} and asset {2} ({3})",
|
||||
p, itemID, assetID, asset);
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[ATTACHMENT] Unable to rez attachment: {0}", e.ToString());
|
||||
m_log.ErrorFormat("[ATTACHMENT]: Unable to rez attachment: {0}", e.ToString());
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
SceneObjectPart att = m_scene.GetSceneObjectPart(asset);
|
||||
|
||||
// If this is null, then the asset has not yet appeared in world
|
||||
// so we revisit this when it does
|
||||
//
|
||||
if (att != null && att.UUID != asset) // Yes. It's really needed
|
||||
{
|
||||
m_log.DebugFormat("[ATTACHMENT]: Attach from in world: ItemID {0}, Asset ID {1}, Attachment inworld: {2}", itemID.ToString(), asset.ToString(), att.UUID.ToString());
|
||||
|
||||
// This will throw if crossing katty-korner
|
||||
// So catch it here to avoid the noid
|
||||
//
|
||||
try
|
||||
{
|
||||
// Attach from world, if not already attached
|
||||
if (att.ParentGroup != null && !att.IsAttachment)
|
||||
m_scene.AttachObject(ControllingClient, att.ParentGroup.LocalId, 0, Quaternion.Identity, att.ParentGroup.AbsolutePosition, false);
|
||||
}
|
||||
catch (NullReferenceException)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,6 +114,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
agent.startpos = Vector3.Zero;
|
||||
agent.CapsPath = GetRandomCapsObjectPath();
|
||||
agent.ChildrenCapSeeds = new Dictionary<ulong, string>();
|
||||
agent.child = true;
|
||||
|
||||
string reason;
|
||||
scene.NewUserConnection(agent, out reason);
|
||||
|
@ -205,7 +206,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
*/
|
||||
}
|
||||
|
||||
[Test]
|
||||
// I'm commenting this test, because this is not supposed to happen here
|
||||
//[Test]
|
||||
public void T020_TestMakeRootAgent()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
@ -228,21 +230,24 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
{
|
||||
TestHelper.InMethod();
|
||||
|
||||
scene.RegisterRegionWithGrid();
|
||||
scene2.RegisterRegionWithGrid();
|
||||
|
||||
// Adding child agent to region 1001
|
||||
string reason;
|
||||
scene2.NewUserConnection(acd1, out reason);
|
||||
scene2.AddNewClient(testclient);
|
||||
|
||||
ScenePresence presence = scene.GetScenePresence(agent1);
|
||||
presence.MakeRootAgent(new Vector3(0,Constants.RegionSize-1,0), true);
|
||||
|
||||
ScenePresence presence2 = scene2.GetScenePresence(agent1);
|
||||
|
||||
// Adding neighbour region caps info to presence2
|
||||
// Adding neighbour region caps info to presence2
|
||||
|
||||
string cap = presence.ControllingClient.RequestClientInfo().CapsPath;
|
||||
presence2.AddNeighbourRegion(region1, cap);
|
||||
|
||||
scene.RegisterRegionWithGrid();
|
||||
scene2.RegisterRegionWithGrid();
|
||||
|
||||
Assert.That(presence.IsChildAgent, Is.False, "Did not start root in origin region.");
|
||||
Assert.That(presence2.IsChildAgent, Is.True, "Is not a child on destination region.");
|
||||
|
||||
|
@ -343,7 +348,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
Assert.That(presence.HasAttachments(), Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
// I'm commenting this test because scene setup NEEDS InventoryService to
|
||||
// be non-null
|
||||
//[Test]
|
||||
public void T032_CrossAttachments()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
|
|
|
@ -634,7 +634,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
|||
{
|
||||
get { return (uint)Util.RandomClass.Next(0,int.MaxValue); }
|
||||
}
|
||||
|
||||
#pragma warning disable 67
|
||||
public event GenericMessage OnGenericMessage;
|
||||
public event ImprovedInstantMessage OnInstantMessage;
|
||||
public event ChatMessage OnChatFromClient;
|
||||
|
@ -686,6 +686,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
|||
public event SpinStop OnSpinStop;
|
||||
public event UpdateShape OnUpdatePrimShape;
|
||||
public event ObjectExtraParams OnUpdateExtraParams;
|
||||
public event ObjectRequest OnObjectRequest;
|
||||
public event ObjectSelect OnObjectSelect;
|
||||
public event ObjectDeselect OnObjectDeselect;
|
||||
public event GenericCall7 OnObjectDescription;
|
||||
|
@ -825,6 +826,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
|||
public event AvatarNotesUpdate OnAvatarNotesUpdate;
|
||||
public event MuteListRequest OnMuteListRequest;
|
||||
public event PlacesQuery OnPlacesQuery;
|
||||
#pragma warning restore 67
|
||||
|
||||
public void SetDebugPacketLevel(int newDebug)
|
||||
{
|
||||
|
|
|
@ -83,6 +83,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat
|
|||
|
||||
internal string _accessPassword = String.Empty;
|
||||
internal Regex AccessPasswordRegex = null;
|
||||
internal List<string> ExcludeList = new List<string>();
|
||||
internal string AccessPassword
|
||||
{
|
||||
get { return _accessPassword; }
|
||||
|
@ -210,8 +211,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat
|
|||
m_log.DebugFormat("[IRC-Channel-{0}] PingDelay : <{1}>", cs.idn, cs.PingDelay);
|
||||
cs.AccessPassword = Substitute(rs, config.GetString("access_password", cs.AccessPassword));
|
||||
m_log.DebugFormat("[IRC-Channel-{0}] AccessPassword : <{1}>", cs.idn, cs.AccessPassword);
|
||||
|
||||
|
||||
string[] excludes = config.GetString("exclude_list", "").Trim().Split(new Char[] { ',' });
|
||||
cs.ExcludeList = new List<string>(excludes.Length);
|
||||
foreach(string name in excludes)
|
||||
{
|
||||
cs.ExcludeList.Add(name.Trim().ToLower());
|
||||
}
|
||||
|
||||
// Fail if fundamental information is still missing
|
||||
|
||||
if (cs.Server == null || cs.IrcChannel == null || cs.BaseNickname == null || cs.User == null)
|
||||
|
|
|
@ -145,7 +145,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat
|
|||
if (enabled && (cs.irc.Enabled) && (cs.irc.Connected) && (cs.ClientReporting))
|
||||
{
|
||||
m_log.InfoFormat("[IRC-Region {0}]: {1} has left", Region, client.Name);
|
||||
cs.irc.PrivMsg(cs.NoticeMessageFormat, cs.irc.Nick, Region, String.Format("{0} has left", client.Name));
|
||||
//Check if this person is excluded from IRC
|
||||
if (!cs.ExcludeList.Contains(client.Name.ToLower()))
|
||||
{
|
||||
cs.irc.PrivMsg(cs.NoticeMessageFormat, cs.irc.Nick, Region, String.Format("{0} has left", client.Name));
|
||||
}
|
||||
}
|
||||
client.OnLogout -= OnClientLoggedOut;
|
||||
client.OnConnectionClosed -= OnClientLoggedOut;
|
||||
|
@ -209,7 +213,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat
|
|||
{
|
||||
string clientName = String.Format("{0} {1}", presence.Firstname, presence.Lastname);
|
||||
m_log.DebugFormat("[IRC-Region {0}] {1} has arrived", Region, clientName);
|
||||
cs.irc.PrivMsg(cs.NoticeMessageFormat, cs.irc.Nick, Region, String.Format("{0} has arrived", clientName));
|
||||
//Check if this person is excluded from IRC
|
||||
if (!cs.ExcludeList.Contains(clientName.ToLower()))
|
||||
{
|
||||
cs.irc.PrivMsg(cs.NoticeMessageFormat, cs.irc.Nick, Region, String.Format("{0} has arrived", clientName));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||
{
|
||||
public interface ISecurityCredential
|
||||
{
|
||||
ISocialEntity owner { get; }
|
||||
bool CanEditObject(IObject target);
|
||||
bool CanEditTerrain(int x, int y);
|
||||
}
|
||||
}
|
|
@ -32,19 +32,6 @@ using OpenMetaverse;
|
|||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||
{
|
||||
public interface IAvatarAttachment
|
||||
{
|
||||
//// <value>
|
||||
/// Describes where on the avatar the attachment is located
|
||||
/// </value>
|
||||
int Location { get ; }
|
||||
|
||||
//// <value>
|
||||
/// Accessor to the rez'ed asset, representing the attachment
|
||||
/// </value>
|
||||
IObject Asset { get; }
|
||||
}
|
||||
|
||||
public interface IAvatar : IEntity
|
||||
{
|
||||
//// <value>
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||
{
|
||||
public interface IAvatarAttachment
|
||||
{
|
||||
//// <value>
|
||||
/// Describes where on the avatar the attachment is located
|
||||
/// </value>
|
||||
int Location { get ; }
|
||||
|
||||
//// <value>
|
||||
/// Accessor to the rez'ed asset, representing the attachment
|
||||
/// </value>
|
||||
IObject Asset { get; }
|
||||
}
|
||||
}
|
|
@ -212,6 +212,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
bool Bright { get; set; } // SetPrimParms(FULLBRIGHT)
|
||||
double Bloom { get; set; } // SetPrimParms(GLOW)
|
||||
bool Shiny { get; set; } // SetPrimParms(SHINY)
|
||||
bool BumpMap { get; set; } // SetPrimParms(BUMPMAP) [DEPRECIATE IN FAVOUR OF UUID?]
|
||||
bool BumpMap { get; set; } // SetPrimParms(BUMPMAP) [DEPRECATE IN FAVOUR OF UUID?]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,9 +27,14 @@
|
|||
|
||||
using System;
|
||||
using System.CodeDom.Compiler;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Security;
|
||||
using System.Security.Permissions;
|
||||
using System.Security.Policy;
|
||||
using System.Text;
|
||||
using log4net;
|
||||
using Microsoft.CSharp;
|
||||
|
@ -54,6 +59,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
private readonly MicroScheduler m_microthreads = new MicroScheduler();
|
||||
|
||||
|
||||
private IConfig m_config;
|
||||
|
||||
public void RegisterExtension<T>(T instance)
|
||||
{
|
||||
m_extensions[typeof (T)] = instance;
|
||||
|
@ -63,6 +71,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
{
|
||||
if (source.Configs["MRM"] != null)
|
||||
{
|
||||
m_config = source.Configs["MRM"];
|
||||
|
||||
if (source.Configs["MRM"].GetBoolean("Enabled", false))
|
||||
{
|
||||
m_log.Info("[MRM] Enabling MRM Module");
|
||||
|
@ -112,25 +122,128 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
return script;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an AppDomain that contains policy restricting code to execute
|
||||
/// with only the permissions granted by a named permission set
|
||||
/// </summary>
|
||||
/// <param name="permissionSetName">name of the permission set to restrict to</param>
|
||||
/// <param name="appDomainName">'friendly' name of the appdomain to be created</param>
|
||||
/// <exception cref="ArgumentNullException">
|
||||
/// if <paramref name="permissionSetName"/> is null
|
||||
/// </exception>
|
||||
/// <exception cref="ArgumentOutOfRangeException">
|
||||
/// if <paramref name="permissionSetName"/> is empty
|
||||
/// </exception>
|
||||
/// <returns>AppDomain with a restricted security policy</returns>
|
||||
/// <remarks>Substantial portions of this function from: http://blogs.msdn.com/shawnfa/archive/2004/10/25/247379.aspx
|
||||
/// Valid permissionSetName values are:
|
||||
/// * FullTrust
|
||||
/// * SkipVerification
|
||||
/// * Execution
|
||||
/// * Nothing
|
||||
/// * LocalIntranet
|
||||
/// * Internet
|
||||
/// * Everything
|
||||
/// </remarks>
|
||||
public static AppDomain CreateRestrictedDomain(string permissionSetName, string appDomainName)
|
||||
{
|
||||
if (permissionSetName == null)
|
||||
throw new ArgumentNullException("permissionSetName");
|
||||
if (permissionSetName.Length == 0)
|
||||
throw new ArgumentOutOfRangeException("permissionSetName", permissionSetName,
|
||||
"Cannot have an empty permission set name");
|
||||
|
||||
// Default to all code getting nothing
|
||||
PolicyStatement emptyPolicy = new PolicyStatement(new PermissionSet(PermissionState.None));
|
||||
UnionCodeGroup policyRoot = new UnionCodeGroup(new AllMembershipCondition(), emptyPolicy);
|
||||
|
||||
bool foundName = false;
|
||||
PermissionSet setIntersection = new PermissionSet(PermissionState.Unrestricted);
|
||||
|
||||
// iterate over each policy level
|
||||
IEnumerator levelEnumerator = SecurityManager.PolicyHierarchy();
|
||||
while (levelEnumerator.MoveNext())
|
||||
{
|
||||
PolicyLevel level = levelEnumerator.Current as PolicyLevel;
|
||||
|
||||
// if this level has defined a named permission set with the
|
||||
// given name, then intersect it with what we've retrieved
|
||||
// from all the previous levels
|
||||
if (level != null)
|
||||
{
|
||||
PermissionSet levelSet = level.GetNamedPermissionSet(permissionSetName);
|
||||
if (levelSet != null)
|
||||
{
|
||||
foundName = true;
|
||||
if (setIntersection != null)
|
||||
setIntersection = setIntersection.Intersect(levelSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Intersect() can return null for an empty set, so convert that
|
||||
// to an empty set object. Also return an empty set if we didn't find
|
||||
// the named permission set we were looking for
|
||||
if (setIntersection == null || !foundName)
|
||||
setIntersection = new PermissionSet(PermissionState.None);
|
||||
else
|
||||
setIntersection = new NamedPermissionSet(permissionSetName, setIntersection);
|
||||
|
||||
// if no named permission sets were found, return an empty set,
|
||||
// otherwise return the set that was found
|
||||
PolicyStatement permissions = new PolicyStatement(setIntersection);
|
||||
policyRoot.AddChild(new UnionCodeGroup(new AllMembershipCondition(), permissions));
|
||||
|
||||
// create an AppDomain policy level for the policy tree
|
||||
PolicyLevel appDomainLevel = PolicyLevel.CreateAppDomainLevel();
|
||||
appDomainLevel.RootCodeGroup = policyRoot;
|
||||
|
||||
// create an AppDomain where this policy will be in effect
|
||||
string domainName = appDomainName;
|
||||
AppDomain restrictedDomain = AppDomain.CreateDomain(domainName);
|
||||
restrictedDomain.SetAppDomainPolicy(appDomainLevel);
|
||||
|
||||
return restrictedDomain;
|
||||
}
|
||||
|
||||
|
||||
void EventManager_OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource)
|
||||
{
|
||||
if (script.StartsWith("//MRM:C#"))
|
||||
{
|
||||
if (m_scene.GetSceneObjectPart(localID).OwnerID != m_scene.RegionInfo.MasterAvatarAssignedUUID
|
||||
||
|
||||
m_scene.GetSceneObjectPart(localID).CreatorID != m_scene.RegionInfo.MasterAvatarAssignedUUID)
|
||||
return;
|
||||
if (m_config.GetBoolean("OwnerOnly", true))
|
||||
if (m_scene.GetSceneObjectPart(localID).OwnerID != m_scene.RegionInfo.MasterAvatarAssignedUUID
|
||||
|| m_scene.GetSceneObjectPart(localID).CreatorID != m_scene.RegionInfo.MasterAvatarAssignedUUID)
|
||||
return;
|
||||
|
||||
script = ConvertMRMKeywords(script);
|
||||
|
||||
try
|
||||
{
|
||||
m_log.Info("[MRM] Found C# MRM");
|
||||
AppDomain target;
|
||||
if (m_config.GetBoolean("Sandboxed", true))
|
||||
{
|
||||
m_log.Info("[MRM] Found C# MRM - Starting in AppDomain with " +
|
||||
m_config.GetString("SandboxLevel", "Internet") + "-level security.");
|
||||
|
||||
MRMBase mmb = (MRMBase)AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(
|
||||
string domainName = UUID.Random().ToString();
|
||||
target = CreateRestrictedDomain(m_config.GetString("SandboxLevel", "Internet"),
|
||||
domainName);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Info("[MRM] Found C# MRM - Starting in current AppDomain");
|
||||
m_log.Warn(
|
||||
"[MRM] Security Risk: AppDomain is run in current context. Use only in trusted environments.");
|
||||
target = AppDomain.CurrentDomain;
|
||||
}
|
||||
|
||||
m_log.Info("[MRM] Unwrapping into target AppDomain");
|
||||
MRMBase mmb = (MRMBase) target.CreateInstanceFromAndUnwrap(
|
||||
CompileFromDotNetText(script, itemID.ToString()),
|
||||
"OpenSim.MiniModule");
|
||||
|
||||
m_log.Info("[MRM] Initialising MRM Globals");
|
||||
InitializeMRM(mmb, localID, itemID);
|
||||
|
||||
m_scripts[itemID] = mmb;
|
||||
|
@ -166,8 +279,14 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
public void GetGlobalEnvironment(uint localID, out IWorld world, out IHost host)
|
||||
{
|
||||
world = new World(m_scene);
|
||||
host = new Host(new SOPObject(m_scene, localID), m_scene, new ExtensionHandler(m_extensions), m_microthreads);
|
||||
// UUID should be changed to object owner.
|
||||
UUID owner = m_scene.RegionInfo.MasterAvatarAssignedUUID;
|
||||
SEUser securityUser = new SEUser(owner, "Name Unassigned");
|
||||
SecurityCredential creds = new SecurityCredential(securityUser, m_scene);
|
||||
|
||||
world = new World(m_scene, creds);
|
||||
host = new Host(new SOPObject(m_scene, localID, creds), m_scene, new ExtensionHandler(m_extensions),
|
||||
m_microthreads);
|
||||
}
|
||||
|
||||
public void InitializeMRM(MRMBase mmb, uint localID, UUID itemID)
|
||||
|
|
|
@ -40,10 +40,12 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
{
|
||||
private readonly Scene m_scene;
|
||||
private readonly IEnumerator<EntityBase> m_sogEnum;
|
||||
private readonly ISecurityCredential m_security;
|
||||
|
||||
public IObjEnum(Scene scene)
|
||||
public IObjEnum(Scene scene, ISecurityCredential security)
|
||||
{
|
||||
m_scene = scene;
|
||||
m_security = security;
|
||||
m_sogEnum = m_scene.Entities.GetAllByType<SceneObjectGroup>().GetEnumerator();
|
||||
}
|
||||
|
||||
|
@ -66,7 +68,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
{
|
||||
get
|
||||
{
|
||||
return new SOPObject(m_scene, m_sogEnum.Current.LocalId);
|
||||
return new SOPObject(m_scene, m_sogEnum.Current.LocalId, m_security);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,17 +81,19 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
public class ObjectAccessor : System.MarshalByRefObject, IObjectAccessor
|
||||
{
|
||||
private readonly Scene m_scene;
|
||||
private readonly ISecurityCredential m_security;
|
||||
|
||||
public ObjectAccessor(Scene scene)
|
||||
public ObjectAccessor(Scene scene, ISecurityCredential security)
|
||||
{
|
||||
m_scene = scene;
|
||||
m_security = security;
|
||||
}
|
||||
|
||||
public IObject this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return new SOPObject(m_scene, m_scene.Entities[(uint)index].LocalId);
|
||||
return new SOPObject(m_scene, m_scene.Entities[(uint)index].LocalId, m_security);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -97,7 +101,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
{
|
||||
get
|
||||
{
|
||||
return new SOPObject(m_scene, m_scene.Entities[index].LocalId);
|
||||
return new SOPObject(m_scene, m_scene.Entities[index].LocalId, m_security);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -105,7 +109,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
{
|
||||
get
|
||||
{
|
||||
return new SOPObject(m_scene, m_scene.Entities[index].LocalId);
|
||||
return new SOPObject(m_scene, m_scene.Entities[index].LocalId, m_security);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -117,20 +121,20 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
public IObject Create(Vector3 position, Quaternion rotation)
|
||||
{
|
||||
|
||||
SceneObjectGroup sog = m_scene.AddNewPrim(m_scene.RegionInfo.MasterAvatarAssignedUUID,
|
||||
SceneObjectGroup sog = m_scene.AddNewPrim(m_security.owner.GlobalID,
|
||||
UUID.Zero,
|
||||
position,
|
||||
rotation,
|
||||
PrimitiveBaseShape.CreateBox());
|
||||
|
||||
IObject ret = new SOPObject(m_scene, sog.LocalId);
|
||||
IObject ret = new SOPObject(m_scene, sog.LocalId, m_security);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public IEnumerator<IObject> GetEnumerator()
|
||||
{
|
||||
return new IObjEnum(m_scene);
|
||||
return new IObjEnum(m_scene, m_security);
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Security;
|
||||
using OpenMetaverse;
|
||||
using OpenMetaverse.Packets;
|
||||
using OpenSim.Framework;
|
||||
|
@ -42,13 +43,22 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
{
|
||||
private readonly Scene m_rootScene;
|
||||
private readonly uint m_localID;
|
||||
private readonly ISecurityCredential m_security;
|
||||
|
||||
[Obsolete("Replace with 'credential' constructor [security]")]
|
||||
public SOPObject(Scene rootScene, uint localID)
|
||||
{
|
||||
m_rootScene = rootScene;
|
||||
m_localID = localID;
|
||||
}
|
||||
|
||||
public SOPObject(Scene rootScene, uint localID, ISecurityCredential credential)
|
||||
{
|
||||
m_rootScene = rootScene;
|
||||
m_localID = localID;
|
||||
m_security = credential;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This needs to run very, very quickly.
|
||||
/// It is utilized in nearly every property and method.
|
||||
|
@ -59,6 +69,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
return m_rootScene.GetSceneObjectPart(m_localID);
|
||||
}
|
||||
|
||||
private bool CanEdit()
|
||||
{
|
||||
if (!m_security.CanEditObject(this))
|
||||
{
|
||||
throw new SecurityException("Insufficient Permission to edit object with UUID [" + GetSOP().UUID + "]");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#region OnTouch
|
||||
|
||||
private event OnTouchDelegate _OnTouch;
|
||||
|
@ -68,14 +87,17 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
{
|
||||
add
|
||||
{
|
||||
if (!_OnTouchActive)
|
||||
if (CanEdit())
|
||||
{
|
||||
GetSOP().Flags |= PrimFlags.Touch;
|
||||
_OnTouchActive = true;
|
||||
m_rootScene.EventManager.OnObjectGrab += EventManager_OnObjectGrab;
|
||||
}
|
||||
if (!_OnTouchActive)
|
||||
{
|
||||
GetSOP().Flags |= PrimFlags.Touch;
|
||||
_OnTouchActive = true;
|
||||
m_rootScene.EventManager.OnObjectGrab += EventManager_OnObjectGrab;
|
||||
}
|
||||
|
||||
_OnTouch += value;
|
||||
_OnTouch += value;
|
||||
}
|
||||
}
|
||||
remove
|
||||
{
|
||||
|
@ -95,7 +117,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
if (_OnTouchActive && m_localID == localID)
|
||||
{
|
||||
TouchEventArgs e = new TouchEventArgs();
|
||||
e.Avatar = new SPAvatar(m_rootScene, remoteClient.AgentId);
|
||||
e.Avatar = new SPAvatar(m_rootScene, remoteClient.AgentId, m_security);
|
||||
e.TouchBiNormal = surfaceArgs.Binormal;
|
||||
e.TouchMaterialIndex = surfaceArgs.FaceIndex;
|
||||
e.TouchNormal = surfaceArgs.Normal;
|
||||
|
@ -130,13 +152,21 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
public string Name
|
||||
{
|
||||
get { return GetSOP().Name; }
|
||||
set { GetSOP().Name = value; }
|
||||
set
|
||||
{
|
||||
if (CanEdit())
|
||||
GetSOP().Name = value;
|
||||
}
|
||||
}
|
||||
|
||||
public string Description
|
||||
{
|
||||
get { return GetSOP().Description; }
|
||||
set { GetSOP().Description = value; }
|
||||
set
|
||||
{
|
||||
if (CanEdit())
|
||||
GetSOP().Description = value;
|
||||
}
|
||||
}
|
||||
|
||||
public IObject[] Children
|
||||
|
@ -151,7 +181,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
int i = 0;
|
||||
foreach (KeyValuePair<UUID, SceneObjectPart> pair in my.ParentGroup.Children)
|
||||
{
|
||||
rets[i++] = new SOPObject(m_rootScene, pair.Value.LocalId);
|
||||
rets[i++] = new SOPObject(m_rootScene, pair.Value.LocalId, m_security);
|
||||
}
|
||||
|
||||
return rets;
|
||||
|
@ -160,7 +190,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
public IObject Root
|
||||
{
|
||||
get { return new SOPObject(m_rootScene, GetSOP().ParentGroup.RootPart.LocalId); }
|
||||
get { return new SOPObject(m_rootScene, GetSOP().ParentGroup.RootPart.LocalId, m_security); }
|
||||
}
|
||||
|
||||
public IObjectMaterial[] Materials
|
||||
|
@ -182,7 +212,11 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
public Vector3 Scale
|
||||
{
|
||||
get { return GetSOP().Scale; }
|
||||
set { GetSOP().Scale = value; }
|
||||
set
|
||||
{
|
||||
if (CanEdit())
|
||||
GetSOP().Scale = value;
|
||||
}
|
||||
}
|
||||
|
||||
public Quaternion WorldRotation
|
||||
|
@ -202,15 +236,24 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
get { return GetSOP().AbsolutePosition; }
|
||||
set
|
||||
{
|
||||
SceneObjectPart pos = GetSOP();
|
||||
pos.UpdateOffSet(value - pos.AbsolutePosition);
|
||||
if (CanEdit())
|
||||
{
|
||||
SceneObjectPart pos = GetSOP();
|
||||
pos.UpdateOffSet(value - pos.AbsolutePosition);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Vector3 OffsetPosition
|
||||
{
|
||||
get { return GetSOP().OffsetPosition; }
|
||||
set { GetSOP().OffsetPosition = value; }
|
||||
set
|
||||
{
|
||||
if (CanEdit())
|
||||
{
|
||||
GetSOP().OffsetPosition = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Vector3 SitTarget
|
||||
|
@ -310,8 +353,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
public void Say(string msg)
|
||||
{
|
||||
SceneObjectPart sop = GetSOP();
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
SceneObjectPart sop = GetSOP();
|
||||
m_rootScene.SimChat(msg, ChatTypeEnum.Say, sop.AbsolutePosition, sop.Name, sop.UUID, false);
|
||||
}
|
||||
|
||||
|
@ -503,6 +548,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
}
|
||||
set
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
GetSOP().PhysActor.RotationalVelocity = new PhysicsVector(value.X, value.Y, value.Z);
|
||||
}
|
||||
}
|
||||
|
@ -516,6 +564,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
}
|
||||
set
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
GetSOP().PhysActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z);
|
||||
}
|
||||
}
|
||||
|
@ -529,6 +580,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
}
|
||||
set
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
GetSOP().PhysActor.Torque = new PhysicsVector(value.X, value.Y, value.Z);
|
||||
}
|
||||
}
|
||||
|
@ -551,27 +605,44 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
}
|
||||
set
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
GetSOP().PhysActor.Force = new PhysicsVector(value.X, value.Y, value.Z);
|
||||
}
|
||||
}
|
||||
|
||||
public bool FloatOnWater
|
||||
{
|
||||
set { GetSOP().PhysActor.FloatOnWater = value; }
|
||||
set
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
GetSOP().PhysActor.FloatOnWater = value;
|
||||
}
|
||||
}
|
||||
|
||||
public void AddForce(Vector3 force, bool pushforce)
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
GetSOP().PhysActor.AddForce(new PhysicsVector(force.X, force.Y, force.Z), pushforce);
|
||||
}
|
||||
|
||||
public void AddAngularForce(Vector3 force, bool pushforce)
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
GetSOP().PhysActor.AddAngularForce(new PhysicsVector(force.X, force.Y, force.Z), pushforce);
|
||||
}
|
||||
|
||||
public void SetMomentum(Vector3 momentum)
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
GetSOP().PhysActor.SetMomentum(new PhysicsVector(momentum.X, momentum.Y, momentum.Z));
|
||||
}
|
||||
|
||||
|
@ -586,6 +657,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
get { return m_sculptMap; }
|
||||
set
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
m_sculptMap = value;
|
||||
SetPrimitiveSculpted(SculptMap, (byte) SculptType);
|
||||
}
|
||||
|
@ -598,6 +672,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
get { return m_sculptType; }
|
||||
set
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
m_sculptType = value;
|
||||
SetPrimitiveSculpted(SculptMap, (byte) SculptType);
|
||||
}
|
||||
|
@ -654,6 +731,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
|
||||
public void Play(UUID asset, double volume)
|
||||
{
|
||||
if (!CanEdit())
|
||||
return;
|
||||
|
||||
GetSOP().SendSound(asset.ToString(), volume, true, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -91,24 +91,45 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
public bool Bright
|
||||
{
|
||||
get { return GetTexface().Fullbright; }
|
||||
set { throw new System.NotImplementedException(); }
|
||||
set
|
||||
{
|
||||
Primitive.TextureEntry tex = m_parent.Shape.Textures;
|
||||
Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face);
|
||||
texface.Fullbright = value;
|
||||
tex.FaceTextures[m_face] = texface;
|
||||
m_parent.UpdateTexture(tex);
|
||||
}
|
||||
}
|
||||
|
||||
public double Bloom
|
||||
{
|
||||
get { return GetTexface().Glow; }
|
||||
set { throw new System.NotImplementedException(); }
|
||||
set
|
||||
{
|
||||
Primitive.TextureEntry tex = m_parent.Shape.Textures;
|
||||
Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face);
|
||||
texface.Glow = (float) value;
|
||||
tex.FaceTextures[m_face] = texface;
|
||||
m_parent.UpdateTexture(tex);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Shiny
|
||||
{
|
||||
get { return GetTexface().Shiny != Shininess.None; }
|
||||
set { throw new System.NotImplementedException(); }
|
||||
set
|
||||
{
|
||||
Primitive.TextureEntry tex = m_parent.Shape.Textures;
|
||||
Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face);
|
||||
texface.Shiny = value ? Shininess.High : Shininess.None;
|
||||
tex.FaceTextures[m_face] = texface;
|
||||
m_parent.UpdateTexture(tex);
|
||||
}
|
||||
}
|
||||
|
||||
public bool BumpMap
|
||||
{
|
||||
get { throw new System.NotImplementedException(); }
|
||||
get { return GetTexface().Bump == Bumpiness.None; }
|
||||
set { throw new System.NotImplementedException(); }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,28 +25,26 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using System.Security;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
||||
using log4net;
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||
{
|
||||
class SPAvatar : System.MarshalByRefObject, IAvatar
|
||||
{
|
||||
private readonly Scene m_rootScene;
|
||||
private readonly UUID m_ID;
|
||||
private readonly ISecurityCredential m_security;
|
||||
//private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public SPAvatar(Scene scene, UUID ID)
|
||||
public SPAvatar(Scene scene, UUID ID, ISecurityCredential security)
|
||||
{
|
||||
m_rootScene = scene;
|
||||
m_security = security;
|
||||
m_ID = ID;
|
||||
}
|
||||
|
||||
|
@ -58,7 +56,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
public string Name
|
||||
{
|
||||
get { return GetSP().Name; }
|
||||
set { throw new InvalidOperationException("Avatar Names are a read-only property."); }
|
||||
set { throw new SecurityException("Avatar Names are a read-only property."); }
|
||||
}
|
||||
|
||||
public UUID GlobalID
|
||||
|
@ -84,7 +82,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
foreach (DictionaryEntry element in internalAttachments)
|
||||
{
|
||||
Hashtable attachInfo = (Hashtable)element.Value;
|
||||
attachments.Add(new SPAvatarAttachment(m_rootScene, this, (int)element.Key, new UUID((string)attachInfo["item"]), new UUID((string)attachInfo["asset"])));
|
||||
attachments.Add(new SPAvatarAttachment(m_rootScene, this, (int) element.Key,
|
||||
new UUID((string) attachInfo["item"]),
|
||||
new UUID((string) attachInfo["asset"]), m_security));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -39,10 +39,13 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
private readonly int m_location;
|
||||
//private readonly UUID m_itemId;
|
||||
private readonly UUID m_assetId;
|
||||
|
||||
private readonly ISecurityCredential m_security;
|
||||
|
||||
public SPAvatarAttachment(Scene rootScene, IAvatar self, int location, UUID itemId, UUID assetId)
|
||||
public SPAvatarAttachment(Scene rootScene, IAvatar self, int location, UUID itemId, UUID assetId, ISecurityCredential security)
|
||||
{
|
||||
m_rootScene = rootScene;
|
||||
m_security = security;
|
||||
//m_parent = self;
|
||||
m_location = location;
|
||||
//m_itemId = itemId;
|
||||
|
@ -55,7 +58,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
{
|
||||
get
|
||||
{
|
||||
return new SOPObject(m_rootScene, m_rootScene.GetSceneObjectPart(m_assetId).LocalId);
|
||||
return new SOPObject(m_rootScene, m_rootScene.GetSceneObjectPart(m_assetId).LocalId, m_security);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||
{
|
||||
class SecurityCredential : ISecurityCredential
|
||||
{
|
||||
private readonly ISocialEntity m_owner;
|
||||
private readonly Scene m_scene;
|
||||
|
||||
public SecurityCredential(ISocialEntity m_owner, Scene m_scene)
|
||||
{
|
||||
this.m_owner = m_owner;
|
||||
this.m_scene = m_scene;
|
||||
}
|
||||
|
||||
public ISocialEntity owner
|
||||
{
|
||||
get { return m_owner; }
|
||||
}
|
||||
|
||||
public bool CanEditObject(IObject target)
|
||||
{
|
||||
return m_scene.Permissions.CanEditObject(target.GlobalID, m_owner.GlobalID);
|
||||
}
|
||||
|
||||
public bool CanEditTerrain(int x, int y)
|
||||
{
|
||||
return m_scene.Permissions.CanTerraformLand(m_owner.GlobalID, new Vector3(x, y, 0));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -37,15 +37,17 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
public class World : System.MarshalByRefObject, IWorld, IWorldAudio
|
||||
{
|
||||
private readonly Scene m_internalScene;
|
||||
private readonly ISecurityCredential m_security;
|
||||
private readonly Heightmap m_heights;
|
||||
|
||||
private readonly ObjectAccessor m_objs;
|
||||
|
||||
public World(Scene internalScene)
|
||||
public World(Scene internalScene, ISecurityCredential securityCredential)
|
||||
{
|
||||
m_security = securityCredential;
|
||||
m_internalScene = internalScene;
|
||||
m_heights = new Heightmap(m_internalScene);
|
||||
m_objs = new ObjectAccessor(m_internalScene);
|
||||
m_objs = new ObjectAccessor(m_internalScene, securityCredential);
|
||||
}
|
||||
|
||||
#region Events
|
||||
|
@ -84,7 +86,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
if (_OnNewUser != null)
|
||||
{
|
||||
NewUserEventArgs e = new NewUserEventArgs();
|
||||
e.Avatar = new SPAvatar(m_internalScene, presence.UUID);
|
||||
e.Avatar = new SPAvatar(m_internalScene, presence.UUID, m_security);
|
||||
_OnNewUser(this, e);
|
||||
}
|
||||
}
|
||||
|
@ -144,7 +146,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
if (chat.Sender == null && chat.SenderObject != null)
|
||||
{
|
||||
ChatEventArgs e = new ChatEventArgs();
|
||||
e.Sender = new SOPObject(m_internalScene, ((SceneObjectPart) chat.SenderObject).LocalId);
|
||||
e.Sender = new SOPObject(m_internalScene, ((SceneObjectPart) chat.SenderObject).LocalId, m_security);
|
||||
e.Text = chat.Message;
|
||||
|
||||
_OnChat(this, e);
|
||||
|
@ -154,7 +156,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
if (chat.Sender != null && chat.SenderObject == null)
|
||||
{
|
||||
ChatEventArgs e = new ChatEventArgs();
|
||||
e.Sender = new SPAvatar(m_internalScene, chat.SenderUUID);
|
||||
e.Sender = new SPAvatar(m_internalScene, chat.SenderUUID, m_security);
|
||||
e.Text = chat.Message;
|
||||
|
||||
_OnChat(this, e);
|
||||
|
@ -207,7 +209,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
|||
for (int i = 0; i < ents.Count; i++)
|
||||
{
|
||||
EntityBase ent = ents[i];
|
||||
rets[i] = new SPAvatar(m_internalScene, ent.UUID);
|
||||
rets[i] = new SPAvatar(m_internalScene, ent.UUID, m_security);
|
||||
}
|
||||
|
||||
return rets;
|
||||
|
|
|
@ -213,6 +213,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
public event UpdateShape OnUpdatePrimShape;
|
||||
public event ObjectExtraParams OnUpdateExtraParams;
|
||||
public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
|
||||
public event ObjectRequest OnObjectRequest;
|
||||
public event ObjectSelect OnObjectSelect;
|
||||
public event GenericCall7 OnObjectDescription;
|
||||
public event GenericCall7 OnObjectName;
|
||||
|
|
|
@ -350,18 +350,13 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
#endif
|
||||
}
|
||||
|
||||
// zero out a heightmap array float array (single dimention [flattened]))
|
||||
// zero out a heightmap array float array (single dimension [flattened]))
|
||||
if ((int)WorldExtents.X == 256 && (int)m_worldOffset.Y == 256)
|
||||
_heightmap = new float[514*514];
|
||||
else
|
||||
_heightmap = new float[(((int)WorldExtents.Y + 2) * ((int)WorldExtents.X + 2))];
|
||||
_watermap = new float[258 * 258];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Zero out the prim spaces array (we split our space into smaller spaces so
|
||||
// we can hit test less.
|
||||
}
|
||||
|
@ -2206,7 +2201,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when a static prim moves. Allocates a space for the prim based on it's position
|
||||
/// Called when a static prim moves. Allocates a space for the prim based on its position
|
||||
/// </summary>
|
||||
/// <param name="geom">the pointer to the geom that moved</param>
|
||||
/// <param name="pos">the position that the geom moved to</param>
|
||||
|
@ -3025,7 +3020,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
float[] returnarr = new float[262144];
|
||||
float[,] resultarr = new float[(int)WorldExtents.X, (int)WorldExtents.Y];
|
||||
|
||||
// Filling out the array into it's multi-dimentional components
|
||||
// Filling out the array into its multi-dimensional components
|
||||
for (int y = 0; y < WorldExtents.Y; y++)
|
||||
{
|
||||
for (int x = 0; x < WorldExtents.X; x++)
|
||||
|
@ -3138,7 +3133,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
float[] returnarr = new float[262144];
|
||||
float[,] resultarr = new float[(int)WorldExtents.X,(int)WorldExtents.Y];
|
||||
|
||||
// Filling out the array into it's multi-dimentional components
|
||||
// Filling out the array into its multi-dimensional components
|
||||
for (int y = 0; y < WorldExtents.Y; y++)
|
||||
{
|
||||
for (int x = 0; x < WorldExtents.X; x++)
|
||||
|
|
|
@ -2801,7 +2801,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
|
||||
{
|
||||
SceneObjectGroup grp = m_host.ParentGroup;
|
||||
UUID itemID = grp.GetFromAssetID();
|
||||
UUID itemID = grp.GetFromItemID();
|
||||
|
||||
ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ using Nini.Config;
|
|||
using OpenSim.Region.ScriptEngine.Shared.Api;
|
||||
using OpenMetaverse;
|
||||
using System;
|
||||
using OpenSim.Tests.Common.Mock;
|
||||
|
||||
namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
||||
{
|
||||
|
@ -52,7 +53,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
|||
public void SetUp()
|
||||
{
|
||||
|
||||
IniConfigSource initConfigSource = new IniConfigSource();
|
||||
IConfigSource initConfigSource = new IniConfigSource();
|
||||
IConfig config = initConfigSource.AddConfig("XEngine");
|
||||
config.Set("Enabled", "true");
|
||||
|
||||
|
|
|
@ -70,6 +70,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// When an object gets paid by an avatar and generates the paid event,
|
||||
/// this will pipe it to the script engine
|
||||
/// </summary>
|
||||
/// <param name="objectID">Object ID that got paid</param>
|
||||
/// <param name="agentID">Agent Id that did the paying</param>
|
||||
/// <param name="amount">Amount paid</param>
|
||||
private void HandleObjectPaid(UUID objectID, UUID agentID,
|
||||
int amount)
|
||||
{
|
||||
|
@ -93,6 +100,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles piping the proper stuff to The script engine for touching
|
||||
/// Including DetectedParams
|
||||
/// </summary>
|
||||
/// <param name="localID"></param>
|
||||
/// <param name="originalID"></param>
|
||||
/// <param name="offsetPos"></param>
|
||||
/// <param name="remoteClient"></param>
|
||||
/// <param name="surfaceArgs"></param>
|
||||
public void touch_start(uint localID, uint originalID, Vector3 offsetPos,
|
||||
IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs)
|
||||
{
|
||||
|
|
|
@ -77,16 +77,16 @@ namespace OpenSim.Server.Base
|
|||
m_HttpServer = new BaseHttpServer(port);
|
||||
|
||||
MainServer.Instance = m_HttpServer;
|
||||
}
|
||||
|
||||
protected override void Initialise()
|
||||
{
|
||||
m_HttpServer.Start();
|
||||
|
||||
if (MainConsole.Instance is RemoteConsole)
|
||||
{
|
||||
((RemoteConsole)MainConsole.Instance).SetServer(m_HttpServer);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Initialise()
|
||||
{
|
||||
m_HttpServer.Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -110,11 +110,11 @@ namespace OpenSim.Server.Handlers.Inventory
|
|||
|
||||
m_httpServer.AddStreamHandler(
|
||||
new RestDeserialiseSecureHandler<InventoryItemBase, InventoryItemBase>(
|
||||
"POST", "/QueryItem/", m_InventoryService.QueryItem, CheckAuthSession));
|
||||
"POST", "/QueryItem/", m_InventoryService.GetItem, CheckAuthSession));
|
||||
|
||||
m_httpServer.AddStreamHandler(
|
||||
new RestDeserialiseSecureHandler<InventoryFolderBase, InventoryFolderBase>(
|
||||
"POST", "/QueryFolder/", m_InventoryService.QueryFolder, CheckAuthSession));
|
||||
"POST", "/QueryFolder/", m_InventoryService.GetFolder, CheckAuthSession));
|
||||
|
||||
m_httpServer.AddStreamHandler(
|
||||
new RestDeserialiseTrustedHandler<Guid, bool>(
|
||||
|
@ -153,6 +153,11 @@ namespace OpenSim.Server.Handlers.Inventory
|
|||
m_httpServer.AddStreamHandler(
|
||||
new RestDeserialiseTrustedHandler<Guid, List<InventoryFolderBase>>
|
||||
("POST", "/RootFolders/", GetInventorySkeleton, CheckTrustSource));
|
||||
|
||||
m_httpServer.AddStreamHandler(
|
||||
new RestDeserialiseTrustedHandler<InventoryItemBase, int>
|
||||
("POST", "/AssetPermissions/", GetAssetPermissions, CheckTrustSource));
|
||||
|
||||
}
|
||||
|
||||
#region Wrappers for converting the Guid parameter
|
||||
|
@ -185,6 +190,8 @@ namespace OpenSim.Server.Handlers.Inventory
|
|||
if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown))
|
||||
folders[(AssetType)folder.Type] = folder;
|
||||
}
|
||||
// Put the root folder there, as type Folder
|
||||
folders[AssetType.Folder] = root;
|
||||
return folders;
|
||||
}
|
||||
}
|
||||
|
@ -235,6 +242,11 @@ namespace OpenSim.Server.Handlers.Inventory
|
|||
return m_InventoryService.GetInventorySkeleton(userID);
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(InventoryItemBase item)
|
||||
{
|
||||
return m_InventoryService.GetAssetPermissions(item.Owner, item.AssetID);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -149,7 +149,7 @@ namespace OpenSim.Services.Connectors.Inventory
|
|||
/// <returns></returns>
|
||||
public InventoryCollection GetFolderContent(string id, UUID folderID, UUID sessionID)
|
||||
{
|
||||
m_log.Debug("[HGInventory]: GetSystemFolders " + id);
|
||||
m_log.Debug("[HGInventory]: GetFolderContent " + id);
|
||||
string url = string.Empty;
|
||||
string userID = string.Empty;
|
||||
|
||||
|
@ -279,5 +279,17 @@ namespace OpenSim.Services.Connectors.Inventory
|
|||
return null;
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(string id, UUID assetID, UUID sessionID)
|
||||
{
|
||||
string url = string.Empty;
|
||||
string userID = string.Empty;
|
||||
|
||||
if (StringToUrlAndUserID(id, out url, out userID))
|
||||
{
|
||||
ISessionAuthInventoryService connector = GetConnector(url);
|
||||
return connector.GetAssetPermissions(userID, assetID, sessionID);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -120,5 +120,7 @@ namespace OpenSim.Services.Connectors
|
|||
|
||||
InventoryFolderBase QueryFolder(string userID, InventoryFolderBase item, UUID session_id);
|
||||
|
||||
int GetAssetPermissions(string userID, UUID assetID, UUID session_id);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -163,21 +163,48 @@ namespace OpenSim.Services.Connectors
|
|||
/// <returns></returns>
|
||||
public Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(string userID, UUID sessionID)
|
||||
{
|
||||
// !!! Not just yet.
|
||||
//try
|
||||
//{
|
||||
// List<InventoryFolderBase> folders = SynchronousRestSessionObjectPoster<Guid, List<InventoryFolderBase>>.BeginPostObject(
|
||||
// "POST", m_ServerURI + "/SystemFolders/", new Guid(userID), sessionID.ToString(), userID.ToString());
|
||||
// Dictionary<AssetType, InventoryFolderBase> dFolders = new Dictionary<AssetType, InventoryFolderBase>();
|
||||
// foreach (InventoryFolderBase f in folders)
|
||||
// dFolders[(AssetType)f.Type] = f;
|
||||
// return dFolders;
|
||||
//}
|
||||
//catch (Exception e)
|
||||
//{
|
||||
// m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetSystemFolders operation failed, {0} {1}",
|
||||
// e.Source, e.Message);
|
||||
//}
|
||||
List<InventoryFolderBase> folders = null;
|
||||
Dictionary<AssetType, InventoryFolderBase> dFolders = new Dictionary<AssetType, InventoryFolderBase>();
|
||||
try
|
||||
{
|
||||
folders = SynchronousRestSessionObjectPoster<Guid, List<InventoryFolderBase>>.BeginPostObject(
|
||||
"POST", m_ServerURI + "/SystemFolders/", new Guid(userID), sessionID.ToString(), userID.ToString());
|
||||
|
||||
foreach (InventoryFolderBase f in folders)
|
||||
dFolders[(AssetType)f.Type] = f;
|
||||
|
||||
return dFolders;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// Maybe we're talking to an old inventory server. Try this other thing.
|
||||
m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetSystemFolders operation failed, {0} {1}. Trying RootFolders.",
|
||||
e.Source, e.Message);
|
||||
|
||||
try
|
||||
{
|
||||
folders = SynchronousRestSessionObjectPoster<Guid, List<InventoryFolderBase>>.BeginPostObject(
|
||||
"POST", m_ServerURI + "/RootFolders/", new Guid(userID), sessionID.ToString(), userID.ToString());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY CONNECTOR]: RootFolders operation also failed, {0} {1}. Give up.",
|
||||
e.Source, ex.Message);
|
||||
}
|
||||
|
||||
if ((folders != null) && (folders.Count > 0))
|
||||
{
|
||||
dFolders[AssetType.Folder] = folders[0]; // Root folder is the first one
|
||||
folders.RemoveAt(0);
|
||||
foreach (InventoryFolderBase f in folders)
|
||||
{
|
||||
if ((f.Type != (short)AssetType.Folder) && (f.Type != (short)AssetType.Unknown))
|
||||
dFolders[(AssetType)f.Type] = f;
|
||||
}
|
||||
|
||||
return dFolders;
|
||||
}
|
||||
}
|
||||
|
||||
return new Dictionary<AssetType, InventoryFolderBase>();
|
||||
}
|
||||
|
@ -192,13 +219,52 @@ namespace OpenSim.Services.Connectors
|
|||
{
|
||||
try
|
||||
{
|
||||
// normal case
|
||||
return SynchronousRestSessionObjectPoster<Guid, InventoryCollection>.BeginPostObject(
|
||||
"POST", m_ServerURI + "/GetFolderContent/", folderID.Guid, sessionID.ToString(), userID.ToString());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderForType operation failed, {0} {1}",
|
||||
// Maybe we're talking to an old inventory server. Try this other thing.
|
||||
m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderForType operation failed, {0} {1}. Trying RootFolders and GetItems.",
|
||||
e.Source, e.Message);
|
||||
|
||||
List<InventoryFolderBase> folders = null;
|
||||
try
|
||||
{
|
||||
folders = SynchronousRestSessionObjectPoster<Guid, List<InventoryFolderBase>>.BeginPostObject(
|
||||
"POST", m_ServerURI + "/RootFolders/", new Guid(userID), sessionID.ToString(), userID.ToString());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY CONNECTOR]: RootFolders operation also failed, {0} {1}. Give up.",
|
||||
e.Source, ex.Message);
|
||||
}
|
||||
|
||||
if ((folders != null) && (folders.Count > 0))
|
||||
{
|
||||
folders = folders.FindAll(delegate (InventoryFolderBase f) { return f.ParentID == folderID ; });
|
||||
|
||||
try
|
||||
{
|
||||
List<InventoryItemBase> items = SynchronousRestSessionObjectPoster<Guid, List<InventoryItemBase>>.BeginPostObject(
|
||||
"POST", m_ServerURI + "/GetItems/", folderID.Guid, sessionID.ToString(), userID.ToString());
|
||||
|
||||
if (items != null)
|
||||
{
|
||||
InventoryCollection result = new InventoryCollection();
|
||||
result.Folders = folders;
|
||||
result.Items = items;
|
||||
result.UserID = new UUID(userID);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY CONNECTOR]: QueryFolder and GetItems operation failed, {0} {1}. Give up.",
|
||||
e.Source, ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -348,6 +414,25 @@ namespace OpenSim.Services.Connectors
|
|||
return null;
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(string userID, UUID assetID, UUID sessionID)
|
||||
{
|
||||
try
|
||||
{
|
||||
InventoryItemBase item = new InventoryItemBase();
|
||||
item.Owner = new UUID(userID);
|
||||
item.AssetID = assetID;
|
||||
return SynchronousRestSessionObjectPoster<InventoryItemBase, int>.BeginPostObject(
|
||||
"POST", m_ServerURI + "/AssetPermissions/", item, sessionID.ToString(), userID);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[INVENTORY CONNECTOR]: AssetPermissions operation failed, {0} {1}",
|
||||
e.Source, e.Message);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -156,12 +156,12 @@ namespace OpenSim.Services.Connectors
|
|||
return false;
|
||||
}
|
||||
|
||||
public InventoryItemBase QueryItem(InventoryItemBase item)
|
||||
public InventoryItemBase GetItem(InventoryItemBase item)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public InventoryFolderBase QueryFolder(InventoryFolderBase folder)
|
||||
public InventoryFolderBase GetFolder(InventoryFolderBase folder)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
@ -176,5 +176,10 @@ namespace OpenSim.Services.Connectors
|
|||
return null;
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(UUID userID, UUID assetID)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -149,9 +149,19 @@ namespace OpenSim.Services.Interfaces
|
|||
/// <returns>true if the item was successfully deleted</returns>
|
||||
bool DeleteItem(InventoryItemBase item);
|
||||
|
||||
InventoryItemBase QueryItem(InventoryItemBase item);
|
||||
/// <summary>
|
||||
/// Get an item, given by its UUID
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
InventoryItemBase GetItem(InventoryItemBase item);
|
||||
|
||||
InventoryFolderBase QueryFolder(InventoryFolderBase folder);
|
||||
/// <summary>
|
||||
/// Get a folder, given by its UUID
|
||||
/// </summary>
|
||||
/// <param name="folder"></param>
|
||||
/// <returns></returns>
|
||||
InventoryFolderBase GetFolder(InventoryFolderBase folder);
|
||||
|
||||
/// <summary>
|
||||
/// Does the given user have an inventory structure?
|
||||
|
@ -166,5 +176,15 @@ namespace OpenSim.Services.Interfaces
|
|||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
List<InventoryItemBase> GetActiveGestures(UUID userId);
|
||||
|
||||
/// <summary>
|
||||
/// Get the union of permissions of all inventory items
|
||||
/// that hold the given assetID.
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <param name="assetID"></param>
|
||||
/// <returns>The permissions or 0 if no such asset is found in
|
||||
/// the user's inventory</returns>
|
||||
int GetAssetPermissions(UUID userID, UUID assetID);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -398,7 +398,7 @@ namespace OpenSim.Services.InventoryService
|
|||
return true;
|
||||
}
|
||||
|
||||
public virtual InventoryItemBase QueryItem(InventoryItemBase item)
|
||||
public virtual InventoryItemBase GetItem(InventoryItemBase item)
|
||||
{
|
||||
InventoryItemBase result = m_Database.queryInventoryItem(item.ID);
|
||||
if (result != null)
|
||||
|
@ -407,7 +407,7 @@ namespace OpenSim.Services.InventoryService
|
|||
return null;
|
||||
}
|
||||
|
||||
public virtual InventoryFolderBase QueryFolder(InventoryFolderBase item)
|
||||
public virtual InventoryFolderBase GetFolder(InventoryFolderBase item)
|
||||
{
|
||||
InventoryFolderBase result = m_Database.queryInventoryFolder(item.ID);
|
||||
if (result != null)
|
||||
|
@ -465,6 +465,29 @@ namespace OpenSim.Services.InventoryService
|
|||
return null;
|
||||
}
|
||||
|
||||
public int GetAssetPermissions(UUID userID, UUID assetID)
|
||||
{
|
||||
InventoryFolderBase parent = GetRootFolder(userID);
|
||||
return FindAssetPerms(parent, assetID);
|
||||
}
|
||||
|
||||
private int FindAssetPerms(InventoryFolderBase folder, UUID assetID)
|
||||
{
|
||||
InventoryCollection contents = GetFolderContent(folder.Owner, folder.ID);
|
||||
|
||||
int perms = 0;
|
||||
foreach (InventoryItemBase item in contents.Items)
|
||||
{
|
||||
if (item.AssetID == assetID)
|
||||
perms = (int)item.CurrentPermissions | perms;
|
||||
}
|
||||
|
||||
foreach (InventoryFolderBase subfolder in contents.Folders)
|
||||
perms = perms | FindAssetPerms(subfolder, assetID);
|
||||
|
||||
return perms;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to create a new user inventory.
|
||||
/// </summary>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue