Merge branch 'master' of /home/opensim/var/repo/opensim

integration
BlueWall 2012-05-01 14:57:23 -04:00
commit 8dda6e9ea1
33 changed files with 810 additions and 1016 deletions

View File

@ -146,6 +146,7 @@ what it is today.
* Stefan_Boom / stoehr * Stefan_Boom / stoehr
* Strawberry Fride * Strawberry Fride
* Talun * Talun
* TBG Renfold
* tglion * tglion
* tlaukkan/Tommil (Tommi S. E. Laukkanen, Bubble Cloud) * tlaukkan/Tommil (Tommi S. E. Laukkanen, Bubble Cloud)
* tyre * tyre

View File

@ -163,12 +163,12 @@ namespace OpenSim.Data.MySQL
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = using (MySqlCommand cmd =
new MySqlCommand( new MySqlCommand(
"replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, asset_flags, CreatorID, data)" + "replace INTO assets(id, name, description, assetType, local, temporary, create_time, access_time, asset_flags, CreatorID, data)" +
"VALUES(?id, ?name, ?description, ?assetType, ?local, ?temporary, ?create_time, ?access_time, ?asset_flags, ?CreatorID, ?data)", "VALUES(?id, ?name, ?description, ?assetType, ?local, ?temporary, ?create_time, ?access_time, ?asset_flags, ?CreatorID, ?data)",
dbcon); dbcon))
{
string assetName = asset.Name; string assetName = asset.Name;
if (asset.Name.Length > 64) if (asset.Name.Length > 64)
{ {
@ -183,7 +183,6 @@ namespace OpenSim.Data.MySQL
m_log.Warn("[ASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add"); m_log.Warn("[ASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add");
} }
// need to ensure we dispose
try try
{ {
using (cmd) using (cmd)
@ -202,7 +201,6 @@ namespace OpenSim.Data.MySQL
cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags); cmd.Parameters.AddWithValue("?asset_flags", (int)asset.Flags);
cmd.Parameters.AddWithValue("?data", asset.Data); cmd.Parameters.AddWithValue("?data", asset.Data);
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
cmd.Dispose();
} }
} }
catch (Exception e) catch (Exception e)
@ -213,6 +211,7 @@ namespace OpenSim.Data.MySQL
} }
} }
} }
}
private void UpdateAccessTime(AssetBase asset) private void UpdateAccessTime(AssetBase asset)
{ {
@ -221,11 +220,10 @@ namespace OpenSim.Data.MySQL
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd =
new MySqlCommand("update assets set access_time=?access_time where id=?id",
dbcon);
// need to ensure we dispose using (MySqlCommand cmd
= new MySqlCommand("update assets set access_time=?access_time where id=?id", dbcon))
{
try try
{ {
using (cmd) using (cmd)
@ -235,7 +233,6 @@ namespace OpenSim.Data.MySQL
cmd.Parameters.AddWithValue("?id", asset.ID); cmd.Parameters.AddWithValue("?id", asset.ID);
cmd.Parameters.AddWithValue("?access_time", now); cmd.Parameters.AddWithValue("?access_time", now);
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
cmd.Dispose();
} }
} }
catch (Exception e) catch (Exception e)
@ -247,7 +244,7 @@ namespace OpenSim.Data.MySQL
} }
} }
} }
}
} }
/// <summary> /// <summary>
@ -310,7 +307,12 @@ namespace OpenSim.Data.MySQL
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = new MySqlCommand("SELECT name,description,assetType,temporary,id,asset_flags,CreatorID FROM assets LIMIT ?start, ?count", dbcon);
using (MySqlCommand cmd
= new MySqlCommand(
"SELECT name,description,assetType,temporary,id,asset_flags,CreatorID FROM assets LIMIT ?start, ?count",
dbcon))
{
cmd.Parameters.AddWithValue("?start", start); cmd.Parameters.AddWithValue("?start", start);
cmd.Parameters.AddWithValue("?count", count); cmd.Parameters.AddWithValue("?count", count);
@ -342,6 +344,7 @@ namespace OpenSim.Data.MySQL
} }
} }
} }
}
return retList; return retList;
} }
@ -353,11 +356,12 @@ namespace OpenSim.Data.MySQL
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = new MySqlCommand("delete from assets where id=?id", dbcon);
using (MySqlCommand cmd = new MySqlCommand("delete from assets where id=?id", dbcon))
{
cmd.Parameters.AddWithValue("?id", id); cmd.Parameters.AddWithValue("?id", id);
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
}
cmd.Dispose();
} }
} }

View File

@ -70,7 +70,10 @@ namespace OpenSim.Data.MySQL
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID", dbcon);
using (MySqlCommand cmd
= new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID", dbcon))
{
cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); cmd.Parameters.AddWithValue("?principalID", principalID.ToString());
IDataReader result = cmd.ExecuteReader(); IDataReader result = cmd.ExecuteReader();
@ -97,6 +100,7 @@ namespace OpenSim.Data.MySQL
} }
} }
} }
}
private void CheckColumnNames(IDataReader result) private void CheckColumnNames(IDataReader result)
{ {
@ -119,8 +123,8 @@ namespace OpenSim.Data.MySQL
string[] fields = new List<string>(data.Data.Keys).ToArray(); string[] fields = new List<string>(data.Data.Keys).ToArray();
MySqlCommand cmd = new MySqlCommand(); using (MySqlCommand cmd = new MySqlCommand())
{
string update = "update `"+m_Realm+"` set "; string update = "update `"+m_Realm+"` set ";
bool first = true; bool first = true;
foreach (string field in fields) foreach (string field in fields)
@ -148,28 +152,24 @@ namespace OpenSim.Data.MySQL
cmd.CommandText = insert; cmd.CommandText = insert;
if (ExecuteNonQuery(cmd) < 1) if (ExecuteNonQuery(cmd) < 1)
{
cmd.Dispose();
return false; return false;
} }
} }
cmd.Dispose();
return true; return true;
} }
public bool SetDataItem(UUID principalID, string item, string value) public bool SetDataItem(UUID principalID, string item, string value)
{ {
MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + using (MySqlCommand cmd
"` set `" + item + "` = ?" + item + " where UUID = ?UUID"); = new MySqlCommand("update `" + m_Realm + "` set `" + item + "` = ?" + item + " where UUID = ?UUID"))
{
cmd.Parameters.AddWithValue("?"+item, value); cmd.Parameters.AddWithValue("?"+item, value);
cmd.Parameters.AddWithValue("?UUID", principalID.ToString()); cmd.Parameters.AddWithValue("?UUID", principalID.ToString());
if (ExecuteNonQuery(cmd) > 0) if (ExecuteNonQuery(cmd) > 0)
return true; return true;
}
return false; return false;
} }
@ -179,18 +179,18 @@ namespace OpenSim.Data.MySQL
if (System.Environment.TickCount - m_LastExpire > 30000) if (System.Environment.TickCount - m_LastExpire > 30000)
DoExpire(); DoExpire();
MySqlCommand cmd = new MySqlCommand("insert into tokens (UUID, token, validity) values (?principalID, ?token, date_add(now(), interval ?lifetime minute))"); using (MySqlCommand cmd
= new MySqlCommand(
"insert into tokens (UUID, token, validity) values (?principalID, ?token, date_add(now(), interval ?lifetime minute))"))
{
cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); cmd.Parameters.AddWithValue("?principalID", principalID.ToString());
cmd.Parameters.AddWithValue("?token", token); cmd.Parameters.AddWithValue("?token", token);
cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString());
if (ExecuteNonQuery(cmd) > 0) if (ExecuteNonQuery(cmd) > 0)
{
cmd.Dispose();
return true; return true;
} }
cmd.Dispose();
return false; return false;
} }
@ -199,28 +199,27 @@ namespace OpenSim.Data.MySQL
if (System.Environment.TickCount - m_LastExpire > 30000) if (System.Environment.TickCount - m_LastExpire > 30000)
DoExpire(); DoExpire();
MySqlCommand cmd = new MySqlCommand("update tokens set validity = date_add(now(), interval ?lifetime minute) where UUID = ?principalID and token = ?token and validity > now()"); using (MySqlCommand cmd
= new MySqlCommand(
"update tokens set validity = date_add(now(), interval ?lifetime minute) where UUID = ?principalID and token = ?token and validity > now()"))
{
cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); cmd.Parameters.AddWithValue("?principalID", principalID.ToString());
cmd.Parameters.AddWithValue("?token", token); cmd.Parameters.AddWithValue("?token", token);
cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString()); cmd.Parameters.AddWithValue("?lifetime", lifetime.ToString());
if (ExecuteNonQuery(cmd) > 0) if (ExecuteNonQuery(cmd) > 0)
{
cmd.Dispose();
return true; return true;
} }
cmd.Dispose();
return false; return false;
} }
private void DoExpire() private void DoExpire()
{ {
MySqlCommand cmd = new MySqlCommand("delete from tokens where validity < now()"); using (MySqlCommand cmd = new MySqlCommand("delete from tokens where validity < now()"))
{
ExecuteNonQuery(cmd); ExecuteNonQuery(cmd);
}
cmd.Dispose();
m_LastExpire = System.Environment.TickCount; m_LastExpire = System.Environment.TickCount;
} }

View File

@ -52,14 +52,15 @@ namespace OpenSim.Data.MySQL
public bool Delete(UUID principalID, string name) public bool Delete(UUID principalID, string name)
{ {
MySqlCommand cmd = new MySqlCommand(); using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = String.Format("delete from {0} where `PrincipalID` = ?PrincipalID and `Name` = ?Name", m_Realm); cmd.CommandText = String.Format("delete from {0} where `PrincipalID` = ?PrincipalID and `Name` = ?Name", m_Realm);
cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString());
cmd.Parameters.AddWithValue("?Name", name); cmd.Parameters.AddWithValue("?Name", name);
if (ExecuteNonQuery(cmd) > 0) if (ExecuteNonQuery(cmd) > 0)
return true; return true;
}
return false; return false;
} }

View File

@ -49,34 +49,38 @@ namespace OpenSim.Data.MySQL
public bool Delete(string principalID, string friend) public bool Delete(string principalID, string friend)
{ {
MySqlCommand cmd = new MySqlCommand(); using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = String.Format("delete from {0} where PrincipalID = ?PrincipalID and Friend = ?Friend", m_Realm); cmd.CommandText = String.Format("delete from {0} where PrincipalID = ?PrincipalID and Friend = ?Friend", m_Realm);
cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString());
cmd.Parameters.AddWithValue("?Friend", friend); cmd.Parameters.AddWithValue("?Friend", friend);
ExecuteNonQuery(cmd); ExecuteNonQuery(cmd);
}
return true; return true;
} }
public FriendsData[] GetFriends(UUID principalID) public FriendsData[] GetFriends(UUID principalID)
{ {
MySqlCommand cmd = new MySqlCommand(); using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = ?PrincipalID", m_Realm); cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = ?PrincipalID", m_Realm);
cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString()); cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString());
return DoQuery(cmd); return DoQuery(cmd);
} }
}
public FriendsData[] GetFriends(string principalID) public FriendsData[] GetFriends(string principalID)
{ {
MySqlCommand cmd = new MySqlCommand(); using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID LIKE ?PrincipalID", m_Realm); cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID LIKE ?PrincipalID", m_Realm);
cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString() + '%'); cmd.Parameters.AddWithValue("?PrincipalID", principalID.ToString() + '%');
return DoQuery(cmd); return DoQuery(cmd);
} }
} }
}
} }

View File

@ -467,7 +467,8 @@ namespace OpenSim.Data.MySQL
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand result = new MySqlCommand(sql, dbcon); using (MySqlCommand result = new MySqlCommand(sql, dbcon))
{
result.Parameters.AddWithValue("?inventoryID", item.ID.ToString()); result.Parameters.AddWithValue("?inventoryID", item.ID.ToString());
result.Parameters.AddWithValue("?assetID", item.AssetID.ToString()); result.Parameters.AddWithValue("?assetID", item.AssetID.ToString());
result.Parameters.AddWithValue("?assetType", item.AssetType.ToString()); result.Parameters.AddWithValue("?assetType", item.AssetType.ToString());
@ -491,19 +492,18 @@ namespace OpenSim.Data.MySQL
result.Parameters.AddWithValue("?flags", item.Flags); result.Parameters.AddWithValue("?flags", item.Flags);
lock (m_dbLock) lock (m_dbLock)
{
result.ExecuteNonQuery(); result.ExecuteNonQuery();
}
result.Dispose(); result.Dispose();
}
result = new MySqlCommand("update inventoryfolders set version=version+1 where folderID = ?folderID", dbcon); using (MySqlCommand result = new MySqlCommand("update inventoryfolders set version=version+1 where folderID = ?folderID", dbcon))
{
result.Parameters.AddWithValue("?folderID", item.Folder.ToString()); result.Parameters.AddWithValue("?folderID", item.Folder.ToString());
lock (m_dbLock) lock (m_dbLock)
{
result.ExecuteNonQuery(); result.ExecuteNonQuery();
} }
result.Dispose();
} }
} }
catch (MySqlException e) catch (MySqlException e)
@ -533,11 +533,11 @@ namespace OpenSim.Data.MySQL
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE inventoryID=?uuid", dbcon); using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE inventoryID=?uuid", dbcon))
{
cmd.Parameters.AddWithValue("?uuid", itemID.ToString()); cmd.Parameters.AddWithValue("?uuid", itemID.ToString());
lock (m_dbLock) lock (m_dbLock)
{
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
} }
} }
@ -579,7 +579,8 @@ namespace OpenSim.Data.MySQL
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = new MySqlCommand(sql, dbcon); using (MySqlCommand cmd = new MySqlCommand(sql, dbcon))
{
cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString());
cmd.Parameters.AddWithValue("?agentID", folder.Owner.ToString()); cmd.Parameters.AddWithValue("?agentID", folder.Owner.ToString());
cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString());
@ -600,6 +601,7 @@ namespace OpenSim.Data.MySQL
} }
} }
} }
}
/// <summary> /// <summary>
/// Updates an inventory folder /// Updates an inventory folder
@ -624,7 +626,8 @@ namespace OpenSim.Data.MySQL
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = new MySqlCommand(sql, dbcon); using (MySqlCommand cmd = new MySqlCommand(sql, dbcon))
{
cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString()); cmd.Parameters.AddWithValue("?folderID", folder.ID.ToString());
cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString()); cmd.Parameters.AddWithValue("?parentFolderID", folder.ParentID.ToString());
@ -641,6 +644,7 @@ namespace OpenSim.Data.MySQL
} }
} }
} }
}
/// <summary> /// <summary>
/// Append a list of all the child folders of a parent folder /// Append a list of all the child folders of a parent folder

View File

@ -74,14 +74,15 @@ namespace OpenSim.Data.MySQL
public void LogoutRegionAgents(UUID regionID) public void LogoutRegionAgents(UUID regionID)
{ {
MySqlCommand cmd = new MySqlCommand(); using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = String.Format("delete from {0} where `RegionID`=?RegionID", m_Realm); cmd.CommandText = String.Format("delete from {0} where `RegionID`=?RegionID", m_Realm);
cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
ExecuteNonQuery(cmd); ExecuteNonQuery(cmd);
} }
}
public bool ReportAgent(UUID sessionID, UUID regionID) public bool ReportAgent(UUID sessionID, UUID regionID)
{ {
@ -92,8 +93,8 @@ namespace OpenSim.Data.MySQL
if (regionID == UUID.Zero) if (regionID == UUID.Zero)
return false; return false;
MySqlCommand cmd = new MySqlCommand(); using (MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = String.Format("update {0} set RegionID=?RegionID, LastSeen=NOW() where `SessionID`=?SessionID", m_Realm); cmd.CommandText = String.Format("update {0} set RegionID=?RegionID, LastSeen=NOW() where `SessionID`=?SessionID", m_Realm);
cmd.Parameters.AddWithValue("?SessionID", sessionID.ToString()); cmd.Parameters.AddWithValue("?SessionID", sessionID.ToString());
@ -101,6 +102,7 @@ namespace OpenSim.Data.MySQL
if (ExecuteNonQuery(cmd) == 0) if (ExecuteNonQuery(cmd) == 0)
return false; return false;
}
return true; return true;
} }

View File

@ -329,11 +329,12 @@ namespace OpenSim.Data.MySQL
if (scopeID != UUID.Zero) if (scopeID != UUID.Zero)
command += " and ScopeID = ?scopeID"; command += " and ScopeID = ?scopeID";
MySqlCommand cmd = new MySqlCommand(command); using (MySqlCommand cmd = new MySqlCommand(command))
{
cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString()); cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
return RunCommand(cmd); return RunCommand(cmd);
} }
} }
}
} }

View File

@ -129,8 +129,9 @@ namespace OpenSim.Data.MySQL
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = dbcon.CreateCommand();
using (MySqlCommand cmd = dbcon.CreateCommand())
{
foreach (SceneObjectPart prim in obj.Parts) foreach (SceneObjectPart prim in obj.Parts)
{ {
cmd.Parameters.Clear(); cmd.Parameters.Clear();
@ -235,8 +236,7 @@ namespace OpenSim.Data.MySQL
ExecuteNonQuery(cmd); ExecuteNonQuery(cmd);
} }
}
cmd.Dispose();
} }
} }
} }
@ -1800,15 +1800,15 @@ namespace OpenSim.Data.MySQL
{ {
RemoveItems(primID); RemoveItems(primID);
if (items.Count == 0)
return;
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
{ {
dbcon.Open(); dbcon.Open();
MySqlCommand cmd = dbcon.CreateCommand(); using (MySqlCommand cmd = dbcon.CreateCommand())
{
if (items.Count == 0)
return;
cmd.CommandText = "insert into primitems (" + cmd.CommandText = "insert into primitems (" +
"invType, assetType, name, " + "invType, assetType, name, " +
"description, creationDate, nextPermissions, " + "description, creationDate, nextPermissions, " +
@ -1833,8 +1833,7 @@ namespace OpenSim.Data.MySQL
ExecuteNonQuery(cmd); ExecuteNonQuery(cmd);
} }
}
cmd.Dispose();
} }
} }
} }

View File

@ -62,8 +62,8 @@ namespace OpenSim.Data.MySQL
if (words.Length > 2) if (words.Length > 2)
return new UserAccountData[0]; return new UserAccountData[0];
MySqlCommand cmd = new MySqlCommand(); using (MySqlCommand cmd = new MySqlCommand())
{
if (words.Length == 1) if (words.Length == 1)
{ {
cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?search or LastName like ?search)", m_Realm); cmd.CommandText = String.Format("select * from {0} where (ScopeID=?ScopeID or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like ?search or LastName like ?search)", m_Realm);
@ -81,4 +81,5 @@ namespace OpenSim.Data.MySQL
return DoQuery(cmd); return DoQuery(cmd);
} }
} }
}
} }

View File

@ -240,9 +240,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure
{ {
ScenePresence sp = scene.GetScenePresence(client.AgentId); ScenePresence sp = scene.GetScenePresence(client.AgentId);
IEntityTransferModule transferMod = scene.RequestModuleInterface<IEntityTransferModule>(); IEntityTransferModule transferMod = scene.RequestModuleInterface<IEntityTransferModule>();
IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
if (transferMod != null && sp != null && eq != null) if (transferMod != null && sp != null)
transferMod.DoTeleport(sp, gatekeeper, finalDestination, im.Position + new Vector3(0.5f, 0.5f, 0f), Vector3.UnitX, teleportflags, eq); transferMod.DoTeleport(
sp, gatekeeper, finalDestination, im.Position + new Vector3(0.5f, 0.5f, 0f),
Vector3.UnitX, teleportflags);
} }
} }
} }

View File

@ -51,15 +51,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public const int DefaultMaxTransferDistance = 4095;
/// <summary> /// <summary>
/// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer.
/// </summary> /// </summary>
private int m_MaxTransferDistance = 4095; public int MaxTransferDistance { get; set; }
public int MaxTransferDistance
{
get { return m_MaxTransferDistance; }
set { m_MaxTransferDistance = value; }
}
protected bool m_Enabled = false; protected bool m_Enabled = false;
protected Scene m_aScene; protected Scene m_aScene;
@ -102,9 +99,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{ {
IConfig transferConfig = source.Configs["EntityTransfer"]; IConfig transferConfig = source.Configs["EntityTransfer"];
if (transferConfig != null) if (transferConfig != null)
{ MaxTransferDistance = transferConfig.GetInt("max_distance", DefaultMaxTransferDistance);
MaxTransferDistance = transferConfig.GetInt("max_distance", 4095); else
} MaxTransferDistance = DefaultMaxTransferDistance;
m_agentsInTransit = new List<UUID>(); m_agentsInTransit = new List<UUID>();
m_Enabled = true; m_Enabled = true;
@ -170,8 +167,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (!sp.Scene.Permissions.CanTeleport(sp.UUID)) if (!sp.Scene.Permissions.CanTeleport(sp.UUID))
return; return;
IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
// Reset animations; the viewer does that in teleports. // Reset animations; the viewer does that in teleports.
sp.Animator.ResetAnimations(); sp.Animator.ResetAnimations();
@ -183,9 +178,41 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{ {
destinationRegionName = sp.Scene.RegionInfo.RegionName; destinationRegionName = sp.Scene.RegionInfo.RegionName;
TeleportAgentWithinRegion(sp, position, lookAt, teleportFlags);
}
else // Another region possibly in another simulator
{
GridRegion finalDestination;
TeleportAgentToDifferentRegion(
sp, regionHandle, position, lookAt, teleportFlags, out finalDestination);
if (finalDestination != null)
destinationRegionName = finalDestination.RegionName;
}
}
catch (Exception e)
{
m_log.ErrorFormat(
"[ENTITY TRANSFER MODULE]: Exception on teleport of {0} from {1}@{2} to {3}@{4}: {5}{6}",
sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName,
e.Message, e.StackTrace);
sp.ControllingClient.SendTeleportFailed("Internal error");
}
}
/// <summary>
/// Teleports the agent within its current region.
/// </summary>
/// <param name="sp"></param>
/// <param name="position"></param>
/// <param name="lookAt"></param>
/// <param name="teleportFlags"></param
private void TeleportAgentWithinRegion(ScenePresence sp, Vector3 position, Vector3 lookAt, uint teleportFlags)
{
m_log.DebugFormat( m_log.DebugFormat(
"[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}", "[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}",
sp.Name, position, destinationRegionName); sp.Name, position, sp.Scene.RegionInfo.RegionName);
// Teleport within the same region // Teleport within the same region
if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) if (IsOutsideRegion(sp.Scene, position) || position.Z < 0)
@ -226,7 +253,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT);
} }
} }
else // Another region possibly in another simulator
/// <summary>
/// Teleports the agent to a different region.
/// </summary>
/// <param name='sp'></param>
/// <param name='regionHandle'>/param>
/// <param name='position'></param>
/// <param name='lookAt'></param>
/// <param name='teleportFlags'></param>
/// <param name='finalDestination'></param>
private void TeleportAgentToDifferentRegion(
ScenePresence sp, ulong regionHandle, Vector3 position,
Vector3 lookAt, uint teleportFlags, out GridRegion finalDestination)
{ {
uint x = 0, y = 0; uint x = 0, y = 0;
Utils.LongToUInts(regionHandle, out x, out y); Utils.LongToUInts(regionHandle, out x, out y);
@ -234,7 +273,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (reg != null) if (reg != null)
{ {
GridRegion finalDestination = GetFinalDestination(reg); finalDestination = GetFinalDestination(reg);
if (finalDestination == null) if (finalDestination == null)
{ {
m_log.WarnFormat( m_log.WarnFormat(
@ -245,20 +285,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return; return;
} }
destinationRegionName = finalDestination.RegionName;
uint curX = 0, curY = 0;
Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY);
int curCellX = (int)(curX / Constants.RegionSize);
int curCellY = (int)(curY / Constants.RegionSize);
int destCellX = (int)(finalDestination.RegionLocX / Constants.RegionSize);
int destCellY = (int)(finalDestination.RegionLocY / Constants.RegionSize);
// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY);
//
// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}",
// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI);
// Check that these are not the same coordinates // Check that these are not the same coordinates
if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX && if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX &&
finalDestination.RegionLocY == sp.Scene.RegionInfo.RegionLocY) finalDestination.RegionLocY == sp.Scene.RegionInfo.RegionLocY)
@ -268,28 +294,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return; return;
} }
if (Math.Abs(curCellX - destCellX) > MaxTransferDistance || Math.Abs(curCellY - destCellY) > MaxTransferDistance)
{
sp.ControllingClient.SendTeleportFailed(
string.Format(
"Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way",
finalDestination.RegionName, destCellX, destCellY,
sp.Scene.RegionInfo.RegionName, curCellX, curCellY,
MaxTransferDistance));
return;
}
// //
// This is it // This is it
// //
DoTeleport(sp, reg, finalDestination, position, lookAt, teleportFlags, eq); DoTeleport(sp, reg, finalDestination, position, lookAt, teleportFlags);
// //
// //
// //
} }
else else
{ {
finalDestination = null;
// TP to a place that doesn't exist (anymore) // TP to a place that doesn't exist (anymore)
// Inform the viewer about that // Inform the viewer about that
sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore");
@ -308,20 +324,47 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
sp.ControllingClient.SendMapBlock(blocks, 0); sp.ControllingClient.SendMapBlock(blocks, 0);
} }
} }
}
catch (Exception e)
{
m_log.ErrorFormat(
"[ENTITY TRANSFER MODULE]: Exception on teleport of {0} from {1}@{2} to {3}@{4}: {5}{6}",
sp.Name, sp.AbsolutePosition, sp.Scene.RegionInfo.RegionName, position, destinationRegionName,
e.Message, e.StackTrace);
sp.ControllingClient.SendTeleportFailed("Internal error"); /// <summary>
} /// Determines whether this instance is within the max transfer distance.
/// </summary>
/// <param name="sourceRegion"></param>
/// <param name="destRegion"></param>
/// <returns>
/// <c>true</c> if this instance is within max transfer distance; otherwise, <c>false</c>.
/// </returns>
private bool IsWithinMaxTeleportDistance(RegionInfo sourceRegion, GridRegion destRegion)
{
// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY);
//
// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}",
// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI);
// Insanely, RegionLoc on RegionInfo is the 256m map co-ord whilst GridRegion.RegionLoc is the raw meters position.
return Math.Abs(sourceRegion.RegionLocX - destRegion.RegionCoordX) <= MaxTransferDistance
&& Math.Abs(sourceRegion.RegionLocY - destRegion.RegionCoordY) <= MaxTransferDistance;
} }
public void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, Vector3 position, Vector3 lookAt, uint teleportFlags, IEventQueue eq) public void DoTeleport(
ScenePresence sp, GridRegion reg, GridRegion finalDestination,
Vector3 position, Vector3 lookAt, uint teleportFlags)
{ {
RegionInfo sourceRegion = sp.Scene.RegionInfo;
if (!IsWithinMaxTeleportDistance(sourceRegion, finalDestination))
{
sp.ControllingClient.SendTeleportFailed(
string.Format(
"Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way",
finalDestination.RegionName, finalDestination.RegionCoordX, finalDestination.RegionCoordY,
sourceRegion.RegionName, sourceRegion.RegionLocX, sourceRegion.RegionLocY,
MaxTransferDistance));
return;
}
IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
if (reg == null || finalDestination == null) if (reg == null || finalDestination == null)
{ {
sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); sp.ControllingClient.SendTeleportFailed("Unable to locate destination");
@ -629,7 +672,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
protected virtual bool IsOutsideRegion(Scene s, Vector3 pos) protected virtual bool IsOutsideRegion(Scene s, Vector3 pos)
{ {
if (s.TestBorderCross(pos, Cardinals.N)) if (s.TestBorderCross(pos, Cardinals.N))
return true; return true;
if (s.TestBorderCross(pos, Cardinals.S)) if (s.TestBorderCross(pos, Cardinals.S))
@ -770,7 +812,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
neighboury = ba.TriggerRegionY; neighboury = ba.TriggerRegionY;
neighbourx = ba.TriggerRegionX; neighbourx = ba.TriggerRegionX;
Vector3 newposition = pos; Vector3 newposition = pos;
newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
@ -778,7 +819,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
return true; return true;
} }
@ -818,8 +858,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize); neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize);
newpos.Y = enterDistance; newpos.Y = enterDistance;
} }
} }
else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
{ {
@ -846,7 +884,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
} }
else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
{ {
Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
newpos.Y = enterDistance; newpos.Y = enterDistance;

View File

@ -242,13 +242,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return; return;
} }
IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
GridRegion homeGatekeeper = MakeRegion(aCircuit); GridRegion homeGatekeeper = MakeRegion(aCircuit);
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}", m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}",
aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName); aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName);
DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); DoTeleport(
sp, homeGatekeeper, finalDestination,
position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome));
} }
/// <summary> /// <summary>
@ -288,17 +289,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
{ {
ScenePresence sp = scene.GetScenePresence(remoteClient.AgentId); ScenePresence sp = scene.GetScenePresence(remoteClient.AgentId);
IEntityTransferModule transferMod = scene.RequestModuleInterface<IEntityTransferModule>(); IEntityTransferModule transferMod = scene.RequestModuleInterface<IEntityTransferModule>();
IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
if (transferMod != null && sp != null && eq != null) if (transferMod != null && sp != null)
transferMod.DoTeleport(sp, gatekeeper, finalDestination, lm.Position, transferMod.DoTeleport(
Vector3.UnitX, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark), eq); sp, gatekeeper, finalDestination, lm.Position, Vector3.UnitX,
(uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark));
} }
} }
// can't find the region: Tell viewer and abort // can't find the region: Tell viewer and abort
remoteClient.SendTeleportFailed("The teleport destination could not be found."); remoteClient.SendTeleportFailed("The teleport destination could not be found.");
} }
#endregion #endregion

View File

@ -37,12 +37,41 @@ namespace OpenSim.Region.Framework.Interfaces
{ {
public interface IEntityTransferModule public interface IEntityTransferModule
{ {
void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position, /// <summary>
Vector3 lookAt, uint teleportFlags); /// Teleport an agent within the same or to a different region.
/// </summary>
/// <param name='agent'></param>
/// <param name='regionHandle'>
/// The handle of the destination region. If it's the same as the region currently
/// occupied by the agent then the teleport will be within that region.
/// </param>
/// <param name='position'></param>
/// <param name='lookAt'></param>
/// <param name='teleportFlags'></param>
void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position, Vector3 lookAt, uint teleportFlags);
void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, /// <summary>
Vector3 position, Vector3 lookAt, uint teleportFlags, IEventQueue eq); /// Teleport an agent directly to a given region without checking whether the region should be subsituted.
/// </summary>
/// <remarks>
/// Please use Teleport() instead unless you know exactly what you're doing.
/// Do not use for same region teleports.
/// </remarks>
/// <param name='sp'></param>
/// <param name='reg'></param>
/// <param name='finalDestination'>/param>
/// <param name='position'></param>
/// <param name='lookAt'></param>
/// <param name='teleportFlags'></param>
void DoTeleport(
ScenePresence sp, GridRegion reg, GridRegion finalDestination,
Vector3 position, Vector3 lookAt, uint teleportFlags);
/// <summary>
/// Teleports the agent for the given client to their home destination.
/// </summary>
/// <param name='id'></param>
/// <param name='client'></param>
void TeleportHome(UUID id, IClientAPI client); void TeleportHome(UUID id, IClientAPI client);
bool Cross(ScenePresence agent, bool isFlying); bool Cross(ScenePresence agent, bool isFlying);

View File

@ -1336,6 +1336,7 @@ namespace OpenSim.Region.Framework.Scenes
PhysicsActor actor = PhysicsActor; PhysicsActor actor = PhysicsActor;
if (actor == null) if (actor == null)
{ {
SendControlsToScripts(flagsForScripts);
return; return;
} }
@ -1512,15 +1513,7 @@ namespace OpenSim.Region.Framework.Scenes
if (update_movementflag && ParentID == 0) if (update_movementflag && ParentID == 0)
Animator.UpdateMovementAnimations(); Animator.UpdateMovementAnimations();
lock (scriptedcontrols) SendControlsToScripts(flagsForScripts);
{
if (scriptedcontrols.Count > 0)
{
// Notify the scripts only after calling UpdateMovementAnimations(), so that if a script
// (e.g., a walking script) checks which animation is active it will be the correct animation.
SendControlToScripts(flagsForScripts);
}
}
} }
m_scene.EventManager.TriggerOnClientMovement(this); m_scene.EventManager.TriggerOnClientMovement(this);
@ -3681,8 +3674,15 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
internal void SendControlToScripts(uint flags) private void SendControlsToScripts(uint flags)
{ {
// Notify the scripts only after calling UpdateMovementAnimations(), so that if a script
// (e.g., a walking script) checks which animation is active it will be the correct animation.
lock (scriptedcontrols)
{
if (scriptedcontrols.Count <= 0)
return;
ScriptControlled allflags = ScriptControlled.CONTROL_ZERO; ScriptControlled allflags = ScriptControlled.CONTROL_ZERO;
if (MouseDown) if (MouseDown)
@ -3700,6 +3700,7 @@ namespace OpenSim.Region.Framework.Scenes
allflags |= ScriptControlled.CONTROL_ML_LBUTTON; allflags |= ScriptControlled.CONTROL_ML_LBUTTON;
MouseDown = true; MouseDown = true;
} }
if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0) if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0)
{ {
allflags |= ScriptControlled.CONTROL_LBUTTON; allflags |= ScriptControlled.CONTROL_LBUTTON;
@ -3711,38 +3712,44 @@ namespace OpenSim.Region.Framework.Scenes
{ {
allflags |= ScriptControlled.CONTROL_FWD; allflags |= ScriptControlled.CONTROL_FWD;
} }
if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0) if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
{ {
allflags |= ScriptControlled.CONTROL_BACK; allflags |= ScriptControlled.CONTROL_BACK;
} }
if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0) if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
{ {
allflags |= ScriptControlled.CONTROL_UP; allflags |= ScriptControlled.CONTROL_UP;
} }
if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0) if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
{ {
allflags |= ScriptControlled.CONTROL_DOWN; allflags |= ScriptControlled.CONTROL_DOWN;
} }
if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0) if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
{ {
allflags |= ScriptControlled.CONTROL_LEFT; allflags |= ScriptControlled.CONTROL_LEFT;
} }
if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0) if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
{ {
allflags |= ScriptControlled.CONTROL_RIGHT; allflags |= ScriptControlled.CONTROL_RIGHT;
} }
if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
{ {
allflags |= ScriptControlled.CONTROL_ROT_RIGHT; allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
} }
if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
{ {
allflags |= ScriptControlled.CONTROL_ROT_LEFT; allflags |= ScriptControlled.CONTROL_ROT_LEFT;
} }
// optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands) if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
{
lock (scriptedcontrols)
{ {
foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols) foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols)
{ {
@ -3752,6 +3759,7 @@ namespace OpenSim.Region.Framework.Scenes
ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us
ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
ScriptControlled localChange = localHeld ^ localLast; // the changed bits ScriptControlled localChange = localHeld ^ localLast; // the changed bits
if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO) if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO)
{ {
// only send if still pressed or just changed // only send if still pressed or just changed
@ -3759,10 +3767,10 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
} }
}
LastCommands = allflags; LastCommands = allflags;
} }
}
internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored) internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
{ {

View File

@ -27,6 +27,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Text; using System.Text;
using NUnit.Framework; using NUnit.Framework;
using OpenMetaverse; using OpenMetaverse;
@ -68,11 +69,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
Vector3 position = new Vector3(200,200,21); Vector3 position = new Vector3(200,200,21);
foreach (Border b in testborders) foreach (Border b in testborders)
{
Assert.That(!b.TestCross(position)); Assert.That(!b.TestCross(position));
}
position = new Vector3(200,280,21); position = new Vector3(200,280,21);
Assert.That(NorthBorder.TestCross(position)); Assert.That(NorthBorder.TestCross(position));

View File

@ -26,7 +26,9 @@
*/ */
using System; using System;
using System.IO;
using System.Reflection; using System.Reflection;
using System.Text;
using NUnit.Framework; using NUnit.Framework;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
@ -44,6 +46,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
public void TestDuplicateObject() public void TestDuplicateObject()
{ {
TestHelpers.InMethod(); TestHelpers.InMethod();
// TestHelpers.EnableLogging();
Scene scene = new SceneHelpers().SetupScene(); Scene scene = new SceneHelpers().SetupScene();
UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010"); UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010");
@ -82,6 +86,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
Assert.That(dupePart1.PhysActor, Is.Not.Null); Assert.That(dupePart1.PhysActor, Is.Not.Null);
Assert.That(dupePart2.PhysActor, Is.Not.Null); Assert.That(dupePart2.PhysActor, Is.Not.Null);
*/ */
// TestHelpers.DisableLogging();
} }
} }
} }

View File

@ -38,7 +38,8 @@ using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
using OpenSim.Tests.Common; using OpenSim.Tests.Common;
using OpenSim.Tests.Common.Mock; using OpenSim.Tests.Common.Mock;
using System.Threading; using System.IO;
using System.Text;
namespace OpenSim.Region.Framework.Scenes.Tests namespace OpenSim.Region.Framework.Scenes.Tests
{ {

View File

@ -1734,6 +1734,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
rgb.y = texcolor.G; rgb.y = texcolor.G;
rgb.z = texcolor.B; rgb.z = texcolor.B;
return rgb; return rgb;
} }
else else
{ {
@ -3192,6 +3193,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return m_host.UUID.ToString(); return m_host.UUID.ToString();
} }
public LSL_Key llGenerateKey()
{
m_host.AddScriptLPS(1);
return UUID.Random().ToString();
}
public void llSetBuoyancy(double buoyancy) public void llSetBuoyancy(double buoyancy)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);

View File

@ -105,6 +105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_Integer llFloor(double f); LSL_Integer llFloor(double f);
void llForceMouselook(int mouselook); void llForceMouselook(int mouselook);
LSL_Float llFrand(double mag); LSL_Float llFrand(double mag);
LSL_Key llGenerateKey();
LSL_Vector llGetAccel(); LSL_Vector llGetAccel();
LSL_Integer llGetAgentInfo(string id); LSL_Integer llGetAgentInfo(string id);
LSL_String llGetAgentLanguage(string id); LSL_String llGetAgentLanguage(string id);

View File

@ -369,6 +369,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
return m_LSL_Functions.llFrand(mag); return m_LSL_Functions.llFrand(mag);
} }
public LSL_Key llGenerateKey()
{
return m_LSL_Functions.llGenerateKey();
}
public LSL_Vector llGetAccel() public LSL_Vector llGetAccel()
{ {
return m_LSL_Functions.llGetAccel(); return m_LSL_Functions.llGetAccel();

View File

@ -27,6 +27,8 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO;
using System.Text;
using NUnit.Framework; using NUnit.Framework;
using OpenMetaverse; using OpenMetaverse;
@ -34,6 +36,37 @@ namespace OpenSim.Tests.Common
{ {
public class TestHelpers public class TestHelpers
{ {
private static Stream EnableLoggingConfigStream
= new MemoryStream(
Encoding.UTF8.GetBytes(
@"<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name=""A1"" type=""log4net.Appender.ConsoleAppender"">
<!-- A1 uses PatternLayout -->
<layout type=""log4net.Layout.PatternLayout"">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value=""%date [%thread] %-5level %logger %ndc - %message%newline"" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value=""DEBUG"" />
<appender-ref ref=""A1"" />
</root>
</log4net>"));
private static Stream DisableLoggingConfigStream
= new MemoryStream(
Encoding.UTF8.GetBytes(
// "<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/><appender-ref ref=\"A1\"/></root></log4net></configuration>")));
//"<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>")));
//"<configuration><log4net><root><level value=\"OFF\"/></root></log4net></configuration>")));
//"<configuration><log4net><root></root></log4net></configuration>")));
//"<configuration><log4net><root/></log4net></configuration>")));
"<log4net><root/></log4net>"));
public static bool AssertThisDelegateCausesArgumentException(TestDelegate d) public static bool AssertThisDelegateCausesArgumentException(TestDelegate d)
{ {
try try
@ -58,6 +91,19 @@ namespace OpenSim.Tests.Common
Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name); Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name);
} }
public static void EnableLogging()
{
log4net.Config.XmlConfigurator.Configure(EnableLoggingConfigStream);
}
/// <summary>
/// Disable logging whilst running the tests.
/// </summary>
public static void DisableLogging()
{
log4net.Config.XmlConfigurator.Configure(DisableLoggingConfigStream);
}
/// <summary> /// <summary>
/// Parse tail section into full UUID. /// Parse tail section into full UUID.
/// </summary> /// </summary>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="Neutral" />
<bindingRedirect oldVersion="2.0.6.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.1.4.0" newVersion="2.4.6.0" />
<bindingRedirect oldVersion="2.2.8.0" newVersion="2.4.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<!-- Print the date in ISO 8601 format -->
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>