Merge branch 'careminster-presence-refactor' of ssh://3dhosting.de/var/git/careminster into careminster-presence-refactor

avinationmerge
sacha 2010-12-04 21:50:48 +00:00
commit 835103af82
19 changed files with 595 additions and 298 deletions

View File

@ -106,8 +106,8 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
m_openSim.ModuleLoader.LoadDefaultSharedModule(new LoadImageURLModule()); m_openSim.ModuleLoader.LoadDefaultSharedModule(new LoadImageURLModule());
m_log.Info("[LOADREGIONSPLUGIN]: XMLRPCModule..."); m_log.Info("[LOADREGIONSPLUGIN]: XMLRPCModule...");
m_openSim.ModuleLoader.LoadDefaultSharedModule(new XMLRPCModule()); m_openSim.ModuleLoader.LoadDefaultSharedModule(new XMLRPCModule());
m_log.Info("[LOADREGIONSPLUGIN]: AssetTransactionModule..."); // m_log.Info("[LOADREGIONSPLUGIN]: AssetTransactionModule...");
m_openSim.ModuleLoader.LoadDefaultSharedModule(new AssetTransactionModule()); // m_openSim.ModuleLoader.LoadDefaultSharedModule(new AssetTransactionModule());
m_log.Info("[LOADREGIONSPLUGIN]: Done."); m_log.Info("[LOADREGIONSPLUGIN]: Done.");
if (!CheckRegionsForSanity(regionsToLoad)) if (!CheckRegionsForSanity(regionsToLoad))

View File

@ -91,66 +91,24 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
{ {
if (node.Type.GetInterface(typeof(ISharedRegionModule).ToString()) != null) if (node.Type.GetInterface(typeof(ISharedRegionModule).ToString()) != null)
{ {
// Get the config string if (CheckModuleEnabled(node, modulesConfig))
string moduleString =
modulesConfig.GetString("Setup_" + node.Id, String.Empty);
// We have a selector
if (moduleString != String.Empty)
{ {
// Allow disabling modules even if they don't have m_log.DebugFormat("[REGIONMODULES]: Found shared region module {0}, class {1}", node.Id, node.Type);
// support for it m_sharedModules.Add(node);
if (moduleString == "disabled")
continue;
// Split off port, if present
string[] moduleParts = moduleString.Split(new char[] { '/' }, 2);
// Format is [port/][class]
string className = moduleParts[0];
if (moduleParts.Length > 1)
className = moduleParts[1];
// Match the class name if given
if (className != String.Empty &&
node.Type.ToString() != className)
continue;
} }
m_log.DebugFormat("[REGIONMODULES]: Found shared region module {0}, class {1}", node.Id, node.Type);
m_sharedModules.Add(node);
} }
else if (node.Type.GetInterface(typeof(INonSharedRegionModule).ToString()) != null) else if (node.Type.GetInterface(typeof(INonSharedRegionModule).ToString()) != null)
{ {
// Get the config string if (CheckModuleEnabled(node, modulesConfig))
string moduleString =
modulesConfig.GetString("Setup_" + node.Id, String.Empty);
// We have a selector
if (moduleString != String.Empty)
{ {
// Allow disabling modules even if they don't have m_log.DebugFormat("[REGIONMODULES]: Found non-shared region module {0}, class {1}", node.Id, node.Type);
// support for it m_nonSharedModules.Add(node);
if (moduleString == "disabled")
continue;
// Split off port, if present
string[] moduleParts = moduleString.Split(new char[] { '/' }, 2);
// Format is [port/][class]
string className = moduleParts[0];
if (moduleParts.Length > 1)
className = moduleParts[1];
// Match the class name if given
if (className != String.Empty &&
node.Type.ToString() != className)
continue;
} }
m_log.DebugFormat("[REGIONMODULES]: Found non-shared region module {0}, class {1}", node.Id, node.Type);
m_nonSharedModules.Add(node);
} }
else else
{
m_log.DebugFormat("[REGIONMODULES]: Found unknown type of module {0}, class {1}", node.Id, node.Type); m_log.DebugFormat("[REGIONMODULES]: Found unknown type of module {0}, class {1}", node.Id, node.Type);
}
} }
// Load and init the module. We try a constructor with a port // Load and init the module. We try a constructor with a port
@ -197,8 +155,6 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
m_sharedInstances.Add(module); m_sharedInstances.Add(module);
module.Initialise(m_openSim.ConfigSource.Source); module.Initialise(m_openSim.ConfigSource.Source);
} }
} }
public void PostInitialise () public void PostInitialise ()
@ -210,7 +166,6 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
{ {
module.PostInitialise(); module.PostInitialise();
} }
} }
#endregion #endregion
@ -244,7 +199,6 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
#endregion #endregion
public string Version public string Version
{ {
get get
@ -263,6 +217,42 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
#region IRegionModulesController implementation #region IRegionModulesController implementation
/// <summary>
/// Check that the given module is no disabled in the [Modules] section of the config files.
/// </summary>
/// <param name="node"></param>
/// <param name="modulesConfig">The config section</param>
/// <returns>true if the module is enabled, false if it is disabled</returns>
protected bool CheckModuleEnabled(TypeExtensionNode node, IConfig modulesConfig)
{
// Get the config string
string moduleString =
modulesConfig.GetString("Setup_" + node.Id, String.Empty);
// We have a selector
if (moduleString != String.Empty)
{
// Allow disabling modules even if they don't have
// support for it
if (moduleString == "disabled")
return false;
// Split off port, if present
string[] moduleParts = moduleString.Split(new char[] { '/' }, 2);
// Format is [port/][class]
string className = moduleParts[0];
if (moduleParts.Length > 1)
className = moduleParts[1];
// Match the class name if given
if (className != String.Empty &&
node.Type.ToString() != className)
return false;
}
return true;
}
// The root of all evil. // The root of all evil.
// This is where we handle adding the modules to scenes when they // This is where we handle adding the modules to scenes when they
// load. This means that here we deal with replaceable interfaces, // load. This means that here we deal with replaceable interfaces,

View File

@ -2636,8 +2636,8 @@ namespace OpenSim.ApplicationPlugins.RemoteController
string text; string text;
int health = scene.GetHealth(out flags, out text); int health = scene.GetHealth(out flags, out text);
responseData["health"] = health; responseData["health"] = health;
responseData["flags"] = health; responseData["flags"] = flags;
responseData["message"] = health; responseData["message"] = text;
response.Value = responseData; response.Value = responseData;
} }

View File

@ -48,7 +48,7 @@ namespace OpenSim.Framework
public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
protected UUID m_owner; protected UUID m_owner;
protected int m_serial = 1; protected int m_serial = 0;
protected byte[] m_visualparams; protected byte[] m_visualparams;
protected Primitive.TextureEntry m_texture; protected Primitive.TextureEntry m_texture;
protected AvatarWearable[] m_wearables; protected AvatarWearable[] m_wearables;
@ -103,7 +103,7 @@ namespace OpenSim.Framework
{ {
// m_log.WarnFormat("[AVATAR APPEARANCE]: create empty appearance for {0}",owner); // m_log.WarnFormat("[AVATAR APPEARANCE]: create empty appearance for {0}",owner);
m_serial = 1; m_serial = 0;
m_owner = owner; m_owner = owner;
SetDefaultWearables(); SetDefaultWearables();
@ -127,7 +127,7 @@ namespace OpenSim.Framework
{ {
// m_log.WarnFormat("[AVATAR APPEARANCE] create initialized appearance for {0}",avatarID); // m_log.WarnFormat("[AVATAR APPEARANCE] create initialized appearance for {0}",avatarID);
m_serial = 1; m_serial = 0;
m_owner = avatarID; m_owner = avatarID;
if (wearables != null) if (wearables != null)
@ -160,7 +160,7 @@ namespace OpenSim.Framework
if (appearance == null) if (appearance == null)
{ {
m_serial = 1; m_serial = 0;
m_owner = UUID.Zero; m_owner = UUID.Zero;
SetDefaultWearables(); SetDefaultWearables();
@ -229,6 +229,24 @@ namespace OpenSim.Framework
m_wearables = AvatarWearable.DefaultWearables; m_wearables = AvatarWearable.DefaultWearables;
} }
/// <summary>
/// Invalidate all of the baked textures in the appearance, useful
/// if you know that none are valid
/// </summary>
public virtual void ResetAppearance()
{
m_serial = 0;
SetDefaultParams();
SetDefaultTexture();
//for (int i = 0; i < BAKE_INDICES.Length; i++)
// {
// int idx = BAKE_INDICES[i];
// m_texture.FaceTextures[idx].TextureID = UUID.Zero;
// }
}
protected virtual void SetDefaultParams() protected virtual void SetDefaultParams()
{ {
m_visualparams = new byte[] { 33,61,85,23,58,127,63,85,63,42,0,85,63,36,85,95,153,63,34,0,63,109,88,132,63,136,81,85,103,136,127,0,150,150,150,127,0,0,0,0,0,127,0,0,255,127,114,127,99,63,127,140,127,127,0,0,0,191,0,104,0,0,0,0,0,0,0,0,0,145,216,133,0,127,0,127,170,0,0,127,127,109,85,127,127,63,85,42,150,150,150,150,150,150,150,25,150,150,150,0,127,0,0,144,85,127,132,127,85,0,127,127,127,127,127,127,59,127,85,127,127,106,47,79,127,127,204,2,141,66,0,0,127,127,0,0,0,0,127,0,159,0,0,178,127,36,85,131,127,127,127,153,95,0,140,75,27,127,127,0,150,150,198,0,0,63,30,127,165,209,198,127,127,153,204,51,51,255,255,255,204,0,255,150,150,150,150,150,150,150,150,150,150,0,150,150,150,150,150,0,127,127,150,150,150,150,150,150,150,150,0,0,150,51,132,150,150,150 }; m_visualparams = new byte[] { 33,61,85,23,58,127,63,85,63,42,0,85,63,36,85,95,153,63,34,0,63,109,88,132,63,136,81,85,103,136,127,0,150,150,150,127,0,0,0,0,0,127,0,0,255,127,114,127,99,63,127,140,127,127,0,0,0,191,0,104,0,0,0,0,0,0,0,0,0,145,216,133,0,127,0,127,170,0,0,127,127,109,85,127,127,63,85,42,150,150,150,150,150,150,150,25,150,150,150,0,127,0,0,144,85,127,132,127,85,0,127,127,127,127,127,127,59,127,85,127,127,106,47,79,127,127,204,2,141,66,0,0,127,127,0,0,0,0,127,0,159,0,0,178,127,36,85,131,127,127,127,153,95,0,140,75,27,127,127,0,150,150,198,0,0,63,30,127,165,209,198,127,127,153,204,51,51,255,255,255,204,0,255,150,150,150,150,150,150,150,150,150,150,0,150,150,150,150,150,0,127,127,150,150,150,150,150,150,150,150,0,0,150,51,132,150,150,150 };
@ -255,7 +273,7 @@ namespace OpenSim.Framework
protected virtual void SetDefaultTexture() protected virtual void SetDefaultTexture()
{ {
m_texture = new Primitive.TextureEntry(new UUID("C228D1CF-4B5D-4BA8-84F4-899A0796AA97")); m_texture = new Primitive.TextureEntry(new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE));
// for (uint i = 0; i < TEXTURE_COUNT; i++) // for (uint i = 0; i < TEXTURE_COUNT; i++)
// m_texture.CreateFace(i).TextureID = new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE); // m_texture.CreateFace(i).TextureID = new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE);

View File

@ -1332,7 +1332,7 @@ namespace OpenSim.Framework.Capabilities
newAssetID = UUID.Random(); newAssetID = UUID.Random();
uploaderPath = path; uploaderPath = path;
httpListener = httpServer; httpListener = httpServer;
// m_log.WarnFormat("[CAPS] baked texture upload starting for {0}",newAssetID); m_log.InfoFormat("[CAPS] baked texture upload starting for {0}",newAssetID);
} }
/// <summary> /// <summary>
@ -1362,6 +1362,8 @@ namespace OpenSim.Framework.Capabilities
handlerUpLoad(newAssetID, data); handlerUpLoad(newAssetID, data);
} }
m_log.InfoFormat("[CAPS] baked texture upload completed for {0}",newAssetID);
return res; return res;
} }
} }

View File

@ -361,13 +361,13 @@ namespace OpenSim
m_moduleLoader.InitialiseSharedModules(scene); m_moduleLoader.InitialiseSharedModules(scene);
// Use this in the future, the line above will be deprecated soon // Use this in the future, the line above will be deprecated soon
m_log.Info("[MODULES]: Loading Region's modules (new style)"); m_log.Info("[REGIONMODULES]: Loading Region's modules (new style)");
IRegionModulesController controller; IRegionModulesController controller;
if (ApplicationRegistry.TryGet(out controller)) if (ApplicationRegistry.TryGet(out controller))
{ {
controller.AddRegionToModules(scene); controller.AddRegionToModules(scene);
} }
else m_log.Error("[MODULES]: The new RegionModulesController is missing..."); else m_log.Error("[REGIONMODULES]: The new RegionModulesController is missing...");
if (m_securePermissionsLoading) if (m_securePermissionsLoading)
{ {

View File

@ -3604,22 +3604,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId)) if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId))
continue; continue;
// Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client
// will never receive an update after a prim kill. Even then, keeping the kill record may be a good
// safety measure.
//
// If a Linden Lab 1.23.5 client (and possibly later and earlier) receives an object update
// after a kill, it will keep displaying the deleted object until relog. OpenSim currently performs
// updates and kills on different threads with different scheduling strategies, hence this protection.
//
// This doesn't appear to apply to child prims - a client will happily ignore these updates
// after the root prim has been deleted.
if (m_killRecord.Contains(part.LocalId)) if (m_killRecord.Contains(part.LocalId))
{
// m_log.WarnFormat(
// "[CLIENT]: Preventing update for prim with local id {0} after client for user {1} told it was deleted",
// part.LocalId, Name);
continue; continue;
if (part.ParentGroup.IsDeleted)
continue;
if (part.ParentGroup.IsAttachment)
{ // Someone else's HUD, why are we getting these?
if (part.ParentGroup.OwnerID != AgentId &&
part.ParentGroup.RootPart.Shape.State >= 30)
continue;
} }
if (part.ParentGroup.IsAttachment && m_disableFacelights) if (part.ParentGroup.IsAttachment && m_disableFacelights)

View File

@ -41,19 +41,22 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
/// </summary> /// </summary>
public class AgentAssetTransactions public class AgentAssetTransactions
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
// Fields // Fields
private bool m_dumpAssetsToFile; private bool m_dumpAssetsToFile;
public AssetTransactionModule Manager; private Scene m_Scene;
public UUID UserID; public UUID UserID;
public Dictionary<UUID, AssetXferUploader> XferUploaders = new Dictionary<UUID, AssetXferUploader>(); public Dictionary<UUID, AssetXferUploader> XferUploaders =
new Dictionary<UUID, AssetXferUploader>();
// Methods // Methods
public AgentAssetTransactions(UUID agentID, AssetTransactionModule manager, bool dumpAssetsToFile) public AgentAssetTransactions(UUID agentID, Scene scene,
bool dumpAssetsToFile)
{ {
m_Scene = scene;
UserID = agentID; UserID = agentID;
Manager = manager;
m_dumpAssetsToFile = dumpAssetsToFile; m_dumpAssetsToFile = dumpAssetsToFile;
} }
@ -61,7 +64,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{ {
if (!XferUploaders.ContainsKey(transactionID)) if (!XferUploaders.ContainsKey(transactionID))
{ {
AssetXferUploader uploader = new AssetXferUploader(this, m_dumpAssetsToFile); AssetXferUploader uploader = new AssetXferUploader(m_Scene,
m_dumpAssetsToFile);
lock (XferUploaders) lock (XferUploaders)
{ {
@ -88,22 +92,25 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
} }
} }
public void RequestCreateInventoryItem(IClientAPI remoteClient, UUID transactionID, UUID folderID, public void RequestCreateInventoryItem(IClientAPI remoteClient,
uint callbackID, string description, string name, sbyte invType, UUID transactionID, UUID folderID, uint callbackID,
sbyte type, byte wearableType, uint nextOwnerMask) string description, string name, sbyte invType,
sbyte type, byte wearableType, uint nextOwnerMask)
{ {
if (XferUploaders.ContainsKey(transactionID)) if (XferUploaders.ContainsKey(transactionID))
{ {
XferUploaders[transactionID].RequestCreateInventoryItem(remoteClient, transactionID, folderID, XferUploaders[transactionID].RequestCreateInventoryItem(
callbackID, description, name, invType, type, remoteClient, transactionID, folderID,
wearableType, nextOwnerMask); callbackID, description, name, invType, type,
wearableType, nextOwnerMask);
} }
} }
/// <summary> /// <summary>
/// Get an uploaded asset. If the data is successfully retrieved, the transaction will be removed. /// Get an uploaded asset. If the data is successfully retrieved,
/// the transaction will be removed.
/// </summary> /// </summary>
/// <param name="transactionID"></param> /// <param name="transactionID"></param>
/// <returns>The asset if the upload has completed, null if it has not.</returns> /// <returns>The asset if the upload has completed, null if it has not.</returns>
@ -125,105 +132,66 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
return null; return null;
} }
//private void CreateItemFromUpload(AssetBase asset, IClientAPI ourClient, UUID inventoryFolderID, uint nextPerms, uint wearableType) public void RequestUpdateTaskInventoryItem(IClientAPI remoteClient,
//{ SceneObjectPart part, UUID transactionID,
// Manager.MyScene.CommsManager.AssetCache.AddAsset(asset); TaskInventoryItem item)
// CachedUserInfo userInfo = Manager.MyScene.CommsManager.UserProfileCacheService.GetUserDetails(
// ourClient.AgentId);
// if (userInfo != null)
// {
// InventoryItemBase item = new InventoryItemBase();
// item.Owner = ourClient.AgentId;
// item.Creator = ourClient.AgentId;
// item.ID = UUID.Random();
// item.AssetID = asset.FullID;
// item.Description = asset.Description;
// item.Name = asset.Name;
// item.AssetType = asset.Type;
// item.InvType = asset.Type;
// item.Folder = inventoryFolderID;
// item.BasePermissions = 0x7fffffff;
// item.CurrentPermissions = 0x7fffffff;
// item.EveryOnePermissions = 0;
// item.NextPermissions = nextPerms;
// item.Flags = wearableType;
// item.CreationDate = Util.UnixTimeSinceEpoch();
// userInfo.AddItem(item);
// ourClient.SendInventoryItemCreateUpdate(item);
// }
// else
// {
// m_log.ErrorFormat(
// "[ASSET TRANSACTIONS]: Could not find user {0} for inventory item creation",
// ourClient.AgentId);
// }
//}
public void RequestUpdateTaskInventoryItem(
IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item)
{ {
if (XferUploaders.ContainsKey(transactionID)) if (XferUploaders.ContainsKey(transactionID))
{ {
AssetBase asset = XferUploaders[transactionID].GetAssetData(); AssetBase asset = GetTransactionAsset(transactionID);
// Only legacy viewers use this, and they prefer CAPS, which
// we have, so this really never runs.
// Allow it, but only for "safe" types.
if ((InventoryType)item.InvType != InventoryType.Notecard &&
(InventoryType)item.InvType != InventoryType.LSL)
return;
if (asset != null) if (asset != null)
{ {
m_log.DebugFormat( asset.FullID = UUID.Random();
"[ASSET TRANSACTIONS]: Updating task item {0} in {1} with asset in transaction {2}",
item.Name, part.Name, transactionID);
asset.Name = item.Name; asset.Name = item.Name;
asset.Description = item.Description; asset.Description = item.Description;
asset.Type = (sbyte)item.Type; asset.Type = (sbyte)item.Type;
item.AssetID = asset.FullID; item.AssetID = asset.FullID;
Manager.MyScene.AssetService.Store(asset); m_Scene.AssetService.Store(asset);
if (part.Inventory.UpdateInventoryItem(item)) part.Inventory.UpdateInventoryItem(item);
{
if ((InventoryType)item.InvType == InventoryType.Notecard)
remoteClient.SendAgentAlertMessage("Notecard saved", false);
else if ((InventoryType)item.InvType == InventoryType.LSL)
remoteClient.SendAgentAlertMessage("Script saved", false);
else
remoteClient.SendAgentAlertMessage("Item saved", false);
part.GetProperties(remoteClient);
}
} }
} }
} }
public void RequestUpdateInventoryItem(IClientAPI remoteClient,
public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID, UUID transactionID, InventoryItemBase item)
InventoryItemBase item)
{ {
if (XferUploaders.ContainsKey(transactionID)) if (XferUploaders.ContainsKey(transactionID))
{ {
UUID assetID = UUID.Combine(transactionID, remoteClient.SecureSessionId); // Here we need to get the old asset to extract the
// texture UUIDs if it's a wearable.
AssetBase asset = Manager.MyScene.AssetService.Get(assetID.ToString()); if (item.AssetType == (int)AssetType.Bodypart ||
item.AssetType == (int)AssetType.Clothing)
if (asset == null)
{ {
asset = GetTransactionAsset(transactionID); AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString());
if (oldAsset != null)
XferUploaders[transactionID].SetOldData(oldAsset.Data);
} }
if (asset != null && asset.FullID == assetID) AssetBase asset = GetTransactionAsset(transactionID);
if (asset != null)
{ {
// Assets never get updated, new ones get created
asset.FullID = UUID.Random(); asset.FullID = UUID.Random();
asset.Name = item.Name; asset.Name = item.Name;
asset.Description = item.Description; asset.Description = item.Description;
asset.Type = (sbyte)item.AssetType; asset.Type = (sbyte)item.AssetType;
item.AssetID = asset.FullID; item.AssetID = asset.FullID;
Manager.MyScene.AssetService.Store(asset); m_Scene.AssetService.Store(asset);
}
IInventoryService invService = Manager.MyScene.InventoryService; IInventoryService invService = m_Scene.InventoryService;
invService.UpdateItem(item); invService.UpdateItem(item);
}
} }
} }
} }

View File

@ -34,22 +34,19 @@ using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using Mono.Addins;
namespace OpenSim.Region.CoreModules.Agent.AssetTransaction namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{ {
public class AssetTransactionModule : IRegionModule, IAgentAssetTransactions [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AssetTransactionModule")]
public class AssetTransactionModule : INonSharedRegionModule,
IAgentAssetTransactions
{ {
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // private static readonly ILog m_log = LogManager.GetLogger(
// MethodBase.GetCurrentMethod().DeclaringType);
private readonly Dictionary<UUID, Scene> RegisteredScenes = new Dictionary<UUID, Scene>(); protected Scene m_Scene;
private bool m_dumpAssetsToFile = false; private bool m_dumpAssetsToFile = false;
private Scene m_scene = null;
[Obsolete]
public Scene MyScene
{
get{ return m_scene;}
}
/// <summary> /// <summary>
/// Each agent has its own singleton collection of transactions /// Each agent has its own singleton collection of transactions
@ -57,33 +54,24 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
private Dictionary<UUID, AgentAssetTransactions> AgentTransactions = private Dictionary<UUID, AgentAssetTransactions> AgentTransactions =
new Dictionary<UUID, AgentAssetTransactions>(); new Dictionary<UUID, AgentAssetTransactions>();
public AssetTransactionModule()
{
//m_log.Debug("creating AgentAssetTransactionModule");
}
#region IRegionModule Members #region IRegionModule Members
public void Initialise(Scene scene, IConfigSource config) public void Initialise(IConfigSource config)
{ {
if (!RegisteredScenes.ContainsKey(scene.RegionInfo.RegionID))
{
// m_log.Debug("initialising AgentAssetTransactionModule");
RegisteredScenes.Add(scene.RegionInfo.RegionID, scene);
scene.RegisterModuleInterface<IAgentAssetTransactions>(this);
scene.EventManager.OnNewClient += NewClient;
}
// EVIL HACK!
// This needs killing!
//
if (m_scene == null)
m_scene = scene;
} }
public void PostInitialise() public void AddRegion(Scene scene)
{
m_Scene = scene;
scene.RegisterModuleInterface<IAgentAssetTransactions>(this);
scene.EventManager.OnNewClient += NewClient;
}
public void RegionLoaded(Scene scene)
{
}
public void RemoveRegion(Scene scene)
{ {
} }
@ -96,9 +84,9 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
get { return "AgentTransactionModule"; } get { return "AgentTransactionModule"; }
} }
public bool IsSharedModule public Type ReplaceableInterface
{ {
get { return true; } get { return typeof(IAgentAssetTransactions); }
} }
#endregion #endregion
@ -111,8 +99,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
#region AgentAssetTransactions #region AgentAssetTransactions
/// <summary> /// <summary>
/// Get the collection of asset transactions for the given user. If one does not already exist, it /// Get the collection of asset transactions for the given user.
/// is created. /// If one does not already exist, it is created.
/// </summary> /// </summary>
/// <param name="userID"></param> /// <param name="userID"></param>
/// <returns></returns> /// <returns></returns>
@ -122,7 +110,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{ {
if (!AgentTransactions.ContainsKey(userID)) if (!AgentTransactions.ContainsKey(userID))
{ {
AgentAssetTransactions transactions = new AgentAssetTransactions(userID, this, m_dumpAssetsToFile); AgentAssetTransactions transactions =
new AgentAssetTransactions(userID, m_Scene,
m_dumpAssetsToFile);
AgentTransactions.Add(userID, transactions); AgentTransactions.Add(userID, transactions);
} }
@ -131,8 +122,9 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
} }
/// <summary> /// <summary>
/// Remove the given agent asset transactions. This should be called when a client is departing /// Remove the given agent asset transactions. This should be called
/// from a scene (and hence won't be making any more transactions here). /// when a client is departing from a scene (and hence won't be making
/// any more transactions here).
/// </summary> /// </summary>
/// <param name="userID"></param> /// <param name="userID"></param>
public void RemoveAgentAssetTransactions(UUID userID) public void RemoveAgentAssetTransactions(UUID userID)
@ -146,10 +138,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
} }
/// <summary> /// <summary>
/// Create an inventory item from data that has been received through a transaction. /// Create an inventory item from data that has been received through
/// /// a transaction.
/// This is called when new clothing or body parts are created. It may also be called in other /// This is called when new clothing or body parts are created.
/// situations. /// It may also be called in other situations.
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="transactionID"></param> /// <param name="transactionID"></param>
@ -161,61 +153,72 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="wearableType"></param> /// <param name="wearableType"></param>
/// <param name="nextOwnerMask"></param> /// <param name="nextOwnerMask"></param>
public void HandleItemCreationFromTransaction(IClientAPI remoteClient, UUID transactionID, UUID folderID, public void HandleItemCreationFromTransaction(IClientAPI remoteClient,
uint callbackID, string description, string name, sbyte invType, UUID transactionID, UUID folderID, uint callbackID,
sbyte type, byte wearableType, uint nextOwnerMask) string description, string name, sbyte invType,
sbyte type, byte wearableType, uint nextOwnerMask)
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[TRANSACTIONS MANAGER] Called HandleItemCreationFromTransaction with item {0}", name); // "[TRANSACTIONS MANAGER] Called HandleItemCreationFromTransaction with item {0}", name);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); AgentAssetTransactions transactions =
GetUserTransactions(remoteClient.AgentId);
transactions.RequestCreateInventoryItem( transactions.RequestCreateInventoryItem(remoteClient, transactionID,
remoteClient, transactionID, folderID, callbackID, description, folderID, callbackID, description, name, invType, type,
name, invType, type, wearableType, nextOwnerMask); wearableType, nextOwnerMask);
} }
/// <summary> /// <summary>
/// Update an inventory item with data that has been received through a transaction. /// Update an inventory item with data that has been received through a
/// transaction.
/// ///
/// This is called when clothing or body parts are updated (for instance, with new textures or /// This is called when clothing or body parts are updated (for
/// colours). It may also be called in other situations. /// instance, with new textures or colours). It may also be called in
/// other situations.
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="transactionID"></param> /// <param name="transactionID"></param>
/// <param name="item"></param> /// <param name="item"></param>
public void HandleItemUpdateFromTransaction(IClientAPI remoteClient, UUID transactionID, public void HandleItemUpdateFromTransaction(IClientAPI remoteClient,
InventoryItemBase item) UUID transactionID, InventoryItemBase item)
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}", // "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}",
// item.Name); // item.Name);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); AgentAssetTransactions transactions =
GetUserTransactions(remoteClient.AgentId);
transactions.RequestUpdateInventoryItem(remoteClient, transactionID, item); transactions.RequestUpdateInventoryItem(remoteClient,
transactionID, item);
} }
/// <summary> /// <summary>
/// Update a task inventory item with data that has been received through a transaction. /// Update a task inventory item with data that has been received
/// through a transaction.
/// ///
/// This is currently called when, for instance, a notecard in a prim is saved. The data is sent /// This is currently called when, for instance, a notecard in a prim
/// up through a single AssetUploadRequest. A subsequent UpdateTaskInventory then references the transaction /// is saved. The data is sent up through a single AssetUploadRequest.
/// A subsequent UpdateTaskInventory then references the transaction
/// and comes through this method. /// and comes through this method.
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="transactionID"></param> /// <param name="transactionID"></param>
/// <param name="item"></param> /// <param name="item"></param>
public void HandleTaskItemUpdateFromTransaction( public void HandleTaskItemUpdateFromTransaction(IClientAPI remoteClient,
IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item) SceneObjectPart part, UUID transactionID,
TaskInventoryItem item)
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0}", // "[TRANSACTIONS MANAGER] Called HandleTaskItemUpdateFromTransaction with item {0}",
// item.Name); // item.Name);
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); AgentAssetTransactions transactions =
GetUserTransactions(remoteClient.AgentId);
transactions.RequestUpdateTaskInventoryItem(remoteClient, part, transactionID, item); transactions.RequestUpdateTaskInventoryItem(remoteClient, part,
transactionID, item);
} }
/// <summary> /// <summary>
@ -227,8 +230,9 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="data"></param></param> /// <param name="data"></param></param>
/// <param name="tempFile"></param> /// <param name="tempFile"></param>
public void HandleUDPUploadRequest(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type, public void HandleUDPUploadRequest(IClientAPI remoteClient,
byte[] data, bool storeLocal, bool tempFile) UUID assetID, UUID transaction, sbyte type, byte[] data,
bool storeLocal, bool tempFile)
{ {
// m_log.Debug("HandleUDPUploadRequest - assetID: " + assetID.ToString() + " transaction: " + transaction.ToString() + " type: " + type.ToString() + " storelocal: " + storeLocal + " tempFile: " + tempFile); // m_log.Debug("HandleUDPUploadRequest - assetID: " + assetID.ToString() + " transaction: " + transaction.ToString() + " type: " + type.ToString() + " storelocal: " + storeLocal + " tempFile: " + tempFile);
@ -251,27 +255,33 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
} }
} }
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); AgentAssetTransactions transactions =
GetUserTransactions(remoteClient.AgentId);
AssetXferUploader uploader =
transactions.RequestXferUploader(transaction);
AssetXferUploader uploader = transactions.RequestXferUploader(transaction);
if (uploader != null) if (uploader != null)
{ {
uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile); uploader.Initialise(remoteClient, assetID, transaction, type,
data, storeLocal, tempFile);
} }
} }
/// <summary> /// <summary>
/// Handle asset transfer data packets received in response to the asset upload request in /// Handle asset transfer data packets received in response to the
/// HandleUDPUploadRequest() /// asset upload request in HandleUDPUploadRequest()
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="xferID"></param> /// <param name="xferID"></param>
/// <param name="packetID"></param> /// <param name="packetID"></param>
/// <param name="data"></param> /// <param name="data"></param>
public void HandleXfer(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data) public void HandleXfer(IClientAPI remoteClient, ulong xferID,
uint packetID, byte[] data)
{ {
//m_log.Debug("xferID: " + xferID + " packetID: " + packetID + " data!"); //m_log.Debug("xferID: " + xferID + " packetID: " + packetID + " data!");
AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); AgentAssetTransactions transactions =
GetUserTransactions(remoteClient.AgentId);
transactions.HandleXfer(xferID, packetID, data); transactions.HandleXfer(xferID, packetID, data);
} }

View File

@ -28,16 +28,19 @@
using System; using System;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Collections.Generic;
using log4net; using log4net;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces; using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.Agent.AssetTransaction namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{ {
public class AssetXferUploader public class AssetXferUploader
{ {
// Viewer's notion of the default texture
private UUID defaultID = new UUID("5748decc-f629-461c-9a36-a35a221fe21f");
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private AssetBase m_asset; private AssetBase m_asset;
@ -50,17 +53,18 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
private bool m_finished = false; private bool m_finished = false;
private string m_name = String.Empty; private string m_name = String.Empty;
private bool m_storeLocal; private bool m_storeLocal;
private AgentAssetTransactions m_userTransactions;
private uint nextPerm = 0; private uint nextPerm = 0;
private IClientAPI ourClient; private IClientAPI ourClient;
private UUID TransactionID = UUID.Zero; private UUID TransactionID = UUID.Zero;
private sbyte type = 0; private sbyte type = 0;
private byte wearableType = 0; private byte wearableType = 0;
private byte[] m_oldData = null;
public ulong XferID; public ulong XferID;
private Scene m_Scene;
public AssetXferUploader(AgentAssetTransactions transactions, bool dumpAssetToFile) public AssetXferUploader(Scene scene, bool dumpAssetToFile)
{ {
m_userTransactions = transactions; m_Scene = scene;
m_dumpAssetToFile = dumpAssetToFile; m_dumpAssetToFile = dumpAssetToFile;
} }
@ -108,11 +112,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
/// <param name="packetID"></param> /// <param name="packetID"></param>
/// <param name="data"></param> /// <param name="data"></param>
/// <returns>True if the transfer is complete, false otherwise</returns> /// <returns>True if the transfer is complete, false otherwise</returns>
public bool Initialise(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type, byte[] data, public bool Initialise(IClientAPI remoteClient, UUID assetID,
bool storeLocal, bool tempFile) UUID transaction, sbyte type, byte[] data, bool storeLocal,
bool tempFile)
{ {
ourClient = remoteClient; ourClient = remoteClient;
m_asset = new AssetBase(assetID, "blank", type, remoteClient.AgentId.ToString()); m_asset = new AssetBase(assetID, "blank", type,
remoteClient.AgentId.ToString());
m_asset.Data = data; m_asset.Data = data;
m_asset.Description = "empty"; m_asset.Description = "empty";
m_asset.Local = storeLocal; m_asset.Local = storeLocal;
@ -137,12 +143,14 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
protected void RequestStartXfer() protected void RequestStartXfer()
{ {
XferID = Util.GetNextXferID(); XferID = Util.GetNextXferID();
ourClient.SendXferRequest(XferID, m_asset.Type, m_asset.FullID, 0, new byte[0]); ourClient.SendXferRequest(XferID, m_asset.Type, m_asset.FullID,
0, new byte[0]);
} }
protected void SendCompleteMessage() protected void SendCompleteMessage()
{ {
ourClient.SendAssetUploadCompleteMessage(m_asset.Type, true, m_asset.FullID); ourClient.SendAssetUploadCompleteMessage(m_asset.Type, true,
m_asset.FullID);
m_finished = true; m_finished = true;
if (m_createItem) if (m_createItem)
@ -151,18 +159,20 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
} }
else if (m_storeLocal) else if (m_storeLocal)
{ {
m_userTransactions.Manager.MyScene.AssetService.Store(m_asset); m_Scene.AssetService.Store(m_asset);
} }
m_log.DebugFormat( m_log.DebugFormat(
"[ASSET TRANSACTIONS]: Uploaded asset {0} for transaction {1}", m_asset.FullID, TransactionID); "[ASSET TRANSACTIONS]: Uploaded asset {0} for transaction {1}",
m_asset.FullID, TransactionID);
if (m_dumpAssetToFile) if (m_dumpAssetToFile)
{ {
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
string filename = string filename =
String.Format("{6}_{7}_{0:d2}{1:d2}{2:d2}_{3:d2}{4:d2}{5:d2}.dat", now.Year, now.Month, now.Day, String.Format("{6}_{7}_{0:d2}{1:d2}{2:d2}_{3:d2}{4:d2}{5:d2}.dat",
now.Hour, now.Minute, now.Second, m_asset.Name, m_asset.Type); now.Year, now.Month, now.Day, now.Hour, now.Minute,
now.Second, m_asset.Name, m_asset.Type);
SaveAssetToFile(filename, m_asset.Data); SaveAssetToFile(filename, m_asset.Data);
} }
} }
@ -181,9 +191,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
fs.Close(); fs.Close();
} }
public void RequestCreateInventoryItem(IClientAPI remoteClient, UUID transactionID, UUID folderID, public void RequestCreateInventoryItem(IClientAPI remoteClient,
uint callbackID, string description, string name, sbyte invType, UUID transactionID, UUID folderID, uint callbackID,
sbyte type, byte wearableType, uint nextOwnerMask) string description, string name, sbyte invType,
sbyte type, byte wearableType, uint nextOwnerMask)
{ {
if (TransactionID == transactionID) if (TransactionID == transactionID)
{ {
@ -212,7 +223,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
private void DoCreateItem(uint callbackID) private void DoCreateItem(uint callbackID)
{ {
m_userTransactions.Manager.MyScene.AssetService.Store(m_asset); ValidateAssets();
m_Scene.AssetService.Store(m_asset);
InventoryItemBase item = new InventoryItemBase(); InventoryItemBase item = new InventoryItemBase();
item.Owner = ourClient.AgentId; item.Owner = ourClient.AgentId;
@ -232,12 +244,77 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
item.Flags = (uint) wearableType; item.Flags = (uint) wearableType;
item.CreationDate = Util.UnixTimeSinceEpoch(); item.CreationDate = Util.UnixTimeSinceEpoch();
if (m_userTransactions.Manager.MyScene.AddInventoryItem(item)) if (m_Scene.AddInventoryItem(item))
ourClient.SendInventoryItemCreateUpdate(item, callbackID); ourClient.SendInventoryItemCreateUpdate(item, callbackID);
else else
ourClient.SendAlertMessage("Unable to create inventory item"); ourClient.SendAlertMessage("Unable to create inventory item");
} }
private void ValidateAssets()
{
if (m_asset.Type == (sbyte)AssetType.Clothing ||
m_asset.Type == (sbyte)AssetType.Bodypart)
{
string content = System.Text.Encoding.ASCII.GetString(m_asset.Data);
string[] lines = content.Split(new char[] {'\n'});
List<string> validated = new List<string>();
Dictionary<int, UUID> allowed = ExtractTexturesFromOldData();
int textures = 0;
foreach (string line in lines)
{
try
{
if (line.StartsWith("textures "))
{
textures = Convert.ToInt32(line.Substring(9));
validated.Add(line);
}
else if (textures > 0)
{
string[] parts = line.Split(new char[] {' '});
UUID tx = new UUID(parts[1]);
int id = Convert.ToInt32(parts[0]);
if (tx == defaultID || tx == UUID.Zero ||
(allowed.ContainsKey(id) && allowed[id] == tx))
{
validated.Add(parts[0] + " " + tx.ToString());
}
else
{
int perms = m_Scene.InventoryService.GetAssetPermissions(ourClient.AgentId, tx);
int full = (int)(PermissionMask.Modify | PermissionMask.Transfer | PermissionMask.Copy);
if ((perms & full) != full)
{
m_log.ErrorFormat("[ASSET UPLOADER]: REJECTED update with texture {0} from {1} because they do not own the texture", tx, ourClient.AgentId);
validated.Add(parts[0] + " " + defaultID.ToString());
}
}
textures--;
}
else
{
validated.Add(line);
}
}
catch
{
// If it's malformed, skip it
}
}
string final = String.Join("\n", validated.ToArray());
m_asset.Data = System.Text.Encoding.ASCII.GetBytes(final);
}
}
/// <summary> /// <summary>
/// Get the asset data uploaded in this transfer. /// Get the asset data uploaded in this transfer.
/// </summary> /// </summary>
@ -246,10 +323,55 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
{ {
if (m_finished) if (m_finished)
{ {
ValidateAssets();
return m_asset; return m_asset;
} }
return null; return null;
} }
public void SetOldData(byte[] d)
{
m_oldData = d;
}
private Dictionary<int,UUID> ExtractTexturesFromOldData()
{
Dictionary<int,UUID> result = new Dictionary<int,UUID>();
if (m_oldData == null)
return result;
string content = System.Text.Encoding.ASCII.GetString(m_oldData);
string[] lines = content.Split(new char[] {'\n'});
int textures = 0;
foreach (string line in lines)
{
try
{
if (line.StartsWith("textures "))
{
textures = Convert.ToInt32(line.Substring(9));
}
else if (textures > 0)
{
string[] parts = line.Split(new char[] {' '});
UUID tx = new UUID(parts[1]);
int id = Convert.ToInt32(parts[0]);
result[id] = tx;
textures--;
}
}
catch
{
// If it's malformed, skip it
}
}
return result;
}
} }
} }

View File

@ -115,7 +115,12 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
#endregion #endregion
/// <summary>
/// Check for the existence of the baked texture assets. Request a rebake
/// unless checkonly is true.
/// </summary>
/// <param name="client"></param>
/// <param name="checkonly"></param>
public bool ValidateBakedTextureCache(IClientAPI client) public bool ValidateBakedTextureCache(IClientAPI client)
{ {
return ValidateBakedTextureCache(client, true); return ValidateBakedTextureCache(client, true);
@ -157,12 +162,12 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
// one and we're done otherwise, ask for a rebake // one and we're done otherwise, ask for a rebake
if (checkonly) return false; if (checkonly) return false;
m_log.WarnFormat("[AVFACTORY] missing baked texture {0}, request rebake",face.TextureID); m_log.InfoFormat("[AVFACTORY] missing baked texture {0}, request rebake",face.TextureID);
client.SendRebakeAvatarTextures(face.TextureID); client.SendRebakeAvatarTextures(face.TextureID);
} }
} }
m_log.WarnFormat("[AVFACTORY]: complete texture check for {0}",client.AgentId); m_log.InfoFormat("[AVFACTORY]: complete texture check for {0}",client.AgentId);
// If we only found default textures, then the appearance is not cached // If we only found default textures, then the appearance is not cached
return (defonly ? false : true); return (defonly ? false : true);
@ -182,8 +187,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
return; return;
} }
m_log.WarnFormat("[AVFACTORY]: start SetAppearance for {0}",client.AgentId); m_log.InfoFormat("[AVFACTORY]: start SetAppearance for {0}",client.AgentId);
// TODO: This is probably not necessary any longer, just assume the
// textureEntry set implies that the appearance transaction is complete
bool changed = false; bool changed = false;
// Process the texture entry transactionally, this doesn't guarantee that Appearance is // Process the texture entry transactionally, this doesn't guarantee that Appearance is
@ -203,7 +210,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
{ {
changed = sp.Appearance.SetTextureEntries(textureEntry) || changed; changed = sp.Appearance.SetTextureEntries(textureEntry) || changed;
m_log.WarnFormat("[AVFACTORY]: received texture update for {0}",client.AgentId); m_log.InfoFormat("[AVFACTORY]: received texture update for {0}",client.AgentId);
Util.FireAndForget(delegate(object o) { ValidateBakedTextureCache(client,false); }); Util.FireAndForget(delegate(object o) { ValidateBakedTextureCache(client,false); });
// This appears to be set only in the final stage of the appearance // This appears to be set only in the final stage of the appearance
@ -216,13 +223,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
} }
// // If something changed in the appearance then queue an appearance save
// if (changed)
// QueueAppearanceSave(client.AgentId);
// // And always queue up an appearance update to send out
// QueueAppearanceSend(client.AgentId);
// m_log.WarnFormat("[AVFACTORY]: complete SetAppearance for {0}:\n{1}",client.AgentId,sp.Appearance.ToString()); // m_log.WarnFormat("[AVFACTORY]: complete SetAppearance for {0}:\n{1}",client.AgentId,sp.Appearance.ToString());
} }
@ -377,9 +377,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
// m_log.WarnFormat("[AVFACTORY]: AvatarIsWearing called for {0}", client.AgentId); // m_log.WarnFormat("[AVFACTORY]: AvatarIsWearing called for {0}", client.AgentId);
// we need to clean out the existing textures
sp.Appearance.ResetAppearance();
// operate on a copy of the appearance so we don't have to lock anything // operate on a copy of the appearance so we don't have to lock anything
AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false); AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false);
sp.Appearance.ResetBakedTextures(); // this makes sure we don't reuse old textures if the baking takes time
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
{ {

View File

@ -34,6 +34,17 @@ using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.Examples.SimpleModule namespace OpenSim.Region.Examples.SimpleModule
{ {
/// <summary>
/// Example region module.
/// </summary>
/// <remarks>
/// This is an old and unmaintained region module which uses the old style module interface. It is not loaded into
/// OpenSim by default. If you want to try enabling it, look in the bin folder of this project.
/// Please see the README.txt in this project on the filesystem for some more information.
/// Nonetheless, it may contain some useful example code so has been left here for now.
///
/// You can see bare bones examples of the more modern region module system in OpenSim/Region/OptionalModules/Example
/// </remarks>
public class RegionModule : IRegionModule public class RegionModule : IRegionModule
{ {
#region IRegionModule Members #region IRegionModule Members

View File

@ -2392,15 +2392,13 @@ namespace OpenSim.Region.Framework.Scenes
return false; return false;
} }
newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 2); newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
newObject.ResumeScripts(); newObject.ResumeScripts();
// Do this as late as possible so that listeners have full access to the incoming object // Do this as late as possible so that listeners have full access to the incoming object
EventManager.TriggerOnIncomingSceneObject(newObject); EventManager.TriggerOnIncomingSceneObject(newObject);
TriggerChangedTeleport(newObject);
return true; return true;
} }
@ -2527,7 +2525,7 @@ namespace OpenSim.Region.Framework.Scenes
return true; return true;
} }
private void TriggerChangedTeleport(SceneObjectGroup sog) private int GetStateSource(SceneObjectGroup sog)
{ {
ScenePresence sp = GetScenePresence(sog.OwnerID); ScenePresence sp = GetScenePresence(sog.OwnerID);
@ -2538,13 +2536,12 @@ namespace OpenSim.Region.Framework.Scenes
if (aCircuit != null && (aCircuit.teleportFlags != (uint)TeleportFlags.Default)) if (aCircuit != null && (aCircuit.teleportFlags != (uint)TeleportFlags.Default))
{ {
// This will get your attention // This will get your attention
//m_log.Error("[XXX] Triggering "); //m_log.Error("[XXX] Triggering CHANGED_TELEPORT");
// Trigger CHANGED_TELEPORT return 5; // StateSource.Teleporting
sp.Scene.EventManager.TriggerOnScriptChangedEvent(sog.LocalId, (uint)Changed.TELEPORT);
} }
} }
return 2; // StateSource.PrimCrossing
} }
#endregion #endregion

View File

@ -1639,6 +1639,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
parentGroup.areUpdatesSuspended = false; parentGroup.areUpdatesSuspended = false;
parentGroup.HasGroupChanged = true; parentGroup.HasGroupChanged = true;
parentGroup.ProcessBackup(m_parentScene.SimulationDataService, true);
parentGroup.ScheduleGroupForFullUpdate(); parentGroup.ScheduleGroupForFullUpdate();
Monitor.Exit(m_updateLock); Monitor.Exit(m_updateLock);
} }

View File

@ -2789,7 +2789,7 @@ namespace OpenSim.Region.Framework.Scenes
// If we aren't using a cached appearance, then clear out the baked textures // If we aren't using a cached appearance, then clear out the baked textures
if (! cachedappearance) if (! cachedappearance)
{ {
m_appearance.ResetBakedTextures(); m_appearance.ResetAppearance();
if (m_scene.AvatarFactory != null) if (m_scene.AvatarFactory != null)
m_scene.AvatarFactory.QueueAppearanceSave(UUID); m_scene.AvatarFactory.QueueAppearanceSave(UUID);
} }
@ -2799,12 +2799,12 @@ namespace OpenSim.Region.Framework.Scenes
// again here... this comes after the cached appearance check because the avatars // again here... this comes after the cached appearance check because the avatars
// appearance goes into the avatar update packet // appearance goes into the avatar update packet
SendAvatarDataToAllAgents(); SendAvatarDataToAllAgents();
SendAppearanceToAgent(this);
// If we are using the the cached appearance then send it out to everyone // If we are using the the cached appearance then send it out to everyone
if (cachedappearance) if (cachedappearance)
{ {
m_log.WarnFormat("[SCENEPRESENCE]: baked textures are in the cache for {0}", Name); m_log.InfoFormat("[SCENEPRESENCE]: baked textures are in the cache for {0}", Name);
SendAppearanceToAgent(this);
// If the avatars baked textures are all in the cache, then we have a // If the avatars baked textures are all in the cache, then we have a
// complete appearance... send it out, if not, then we'll send it when // complete appearance... send it out, if not, then we'll send it when

View File

@ -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.Reflection;
using log4net;
using Mono.Addins;
using Nini.Config;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.OptionalModules.Example.BareBonesNonShared
{
/// <summary>
/// Simplest possible example of a non-shared region module.
/// </summary>
/// <remarks>
/// This module is the simplest possible example of a non-shared region module (a module where each scene/region
/// in the simulator has its own copy). If anybody wants to create a more complex example in the future then
/// please create a separate class.
///
/// This module is not active by default. If you want to see it in action,
/// then just uncomment the line below starting with [Extension(Path...
///
/// When the module is enabled it will print messages when it receives certain events to the screen and the log
/// file.
/// </remarks>
//[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BareBonesNonSharedModule")]
public class BareBonesNonSharedModule : INonSharedRegionModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public string Name { get { return "Bare Bones Non Shared Module"; } }
public Type ReplaceableInterface { get { return null; } }
public void Initialise(IConfigSource source)
{
m_log.DebugFormat("[BARE BONES NON SHARED]: INITIALIZED MODULE");
}
public void Close()
{
m_log.DebugFormat("[BARE BONES NON SHARED]: CLOSED MODULE");
}
public void AddRegion(Scene scene)
{
m_log.DebugFormat("[BARE BONES NON SHARED]: REGION {0} ADDED", scene.RegionInfo.RegionName);
}
public void RemoveRegion(Scene scene)
{
m_log.DebugFormat("[BARE BONES NON SHARED]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
}
public void RegionLoaded(Scene scene)
{
m_log.DebugFormat("[BARE BONES NON SHARED]: REGION {0} LOADED", scene.RegionInfo.RegionName);
}
}
}

View File

@ -0,0 +1,91 @@
/*
* 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.Reflection;
using log4net;
using Mono.Addins;
using Nini.Config;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.OptionalModules.Example.BareBonesShared
{
/// <summary>
/// Simplest possible example of a shared region module.
/// </summary>
/// <remarks>
/// This module is the simplest possible example of a shared region module (a module which is shared by every
/// scene/region running on the simulator). If anybody wants to create a more complex example in the future then
/// please create a separate class.
///
/// This module is not active by default. If you want to see it in action,
/// then just uncomment the line below starting with [Extension(Path...
///
/// When the module is enabled it will print messages when it receives certain events to the screen and the log
/// file.
/// </remarks>
//[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "BareBonesSharedModule")]
public class BareBonesSharedModule : ISharedRegionModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public string Name { get { return "Bare Bones Shared Module"; } }
public Type ReplaceableInterface { get { return null; } }
public void Initialise(IConfigSource source)
{
m_log.DebugFormat("[BARE BONES SHARED]: INITIALIZED MODULE");
}
public void PostInitialise()
{
m_log.DebugFormat("[BARE BONES SHARED]: POST INITIALIZED MODULE");
}
public void Close()
{
m_log.DebugFormat("[BARE BONES SHARED]: CLOSED MODULE");
}
public void AddRegion(Scene scene)
{
m_log.DebugFormat("[BARE BONES SHARED]: REGION {0} ADDED", scene.RegionInfo.RegionName);
}
public void RemoveRegion(Scene scene)
{
m_log.DebugFormat("[BARE BONES SHARED]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
}
public void RegionLoaded(Scene scene)
{
m_log.DebugFormat("[BARE BONES SHARED]: REGION {0} LOADED", scene.RegionInfo.RegionName);
}
}
}

View File

@ -42,7 +42,8 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
NewRez = 1, NewRez = 1,
PrimCrossing = 2, PrimCrossing = 2,
ScriptedRez = 3, ScriptedRez = 3,
AttachedRez = 4 AttachedRez = 4,
Teleporting = 5
} }
public interface IScriptWorkItem public interface IScriptWorkItem

View File

@ -391,17 +391,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
} }
else if (m_stateSource == StateSource.RegionStart) else if (m_stateSource == StateSource.RegionStart)
{ {
// m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script"); //m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script");
PostEvent(new EventParams("changed", PostEvent(new EventParams("changed",
new Object[] { new LSL_Types.LSLInteger((int)Changed.REGION_RESTART) }, new Object[] { new LSL_Types.LSLInteger((int)Changed.REGION_RESTART) }, new DetectParams[0]));
new DetectParams[0]));
} }
else if (m_stateSource == StateSource.PrimCrossing) else if (m_stateSource == StateSource.PrimCrossing || m_stateSource == StateSource.Teleporting)
{ {
// CHANGED_REGION // CHANGED_REGION
PostEvent(new EventParams("changed", PostEvent(new EventParams("changed",
new Object[] { new LSL_Types.LSLInteger((int)Changed.REGION) }, new Object[] { new LSL_Types.LSLInteger((int)Changed.REGION) }, new DetectParams[0]));
new DetectParams[0]));
// CHANGED_TELEPORT
if (m_stateSource == StateSource.Teleporting)
PostEvent(new EventParams("changed",
new Object[] { new LSL_Types.LSLInteger((int)Changed.TELEPORT) }, new DetectParams[0]));
} }
} }
else else