From d95d3b949bc5c8a9425ea096fb721a9cc0111e67 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 18 Aug 2009 07:05:22 -0700 Subject: [PATCH 01/51] Fixes mantis #4020 (http://opensimulator.org/mantis/view.php?id=4020) --- .../Framework/Scenes/Scene.PacketHandlers.cs | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 2bf4ea80de..fde922f04d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -517,21 +517,19 @@ namespace OpenSim.Region.Framework.Scenes // m_log.DebugFormat( // "[AGENT INVENTORY]: Updating inventory folder {0} {1} for {2} {3}", folderID, name, remoteClient.Name, remoteClient.AgentId); - CachedUserInfo userProfile = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); - - if (null == userProfile) + InventoryFolderBase folder = new InventoryFolderBase(folderID); + folder = InventoryService.GetFolder(folder); + if (folder != null) { - m_log.ErrorFormat( - "[AGENT INVENTORY]: Could not find user profile for {0} {1}", - remoteClient.Name, remoteClient.AgentId); - return; - } - - if (!userProfile.UpdateFolder(name, folderID, type, parentID)) - { - m_log.ErrorFormat( - "[AGENT INVENTORY]: Failed to update folder for user {0} {1}", - remoteClient.Name, remoteClient.AgentId); + folder.Name = name; + folder.Type = (short)type; + folder.ParentID = parentID; + if (!InventoryService.UpdateFolder(folder)) + { + m_log.ErrorFormat( + "[AGENT INVENTORY]: Failed to update folder for user {0} {1}", + remoteClient.Name, remoteClient.AgentId); + } } } From 465d1095dd0dd5c4c5231a81bb69e46a21f290fb Mon Sep 17 00:00:00 2001 From: dahlia Date: Tue, 18 Aug 2009 17:06:14 -0700 Subject: [PATCH 02/51] Added new OpenSim.ini setting: "client_throttle_max_bps" which overrides user's viewer network throttle settings --- .../ClientStack/LindenUDP/LLPacketQueue.cs | 36 +++++++++++-------- .../ClientStack/LindenUDP/LLUDPServer.cs | 11 ++++-- bin/OpenSim.ini.example | 3 ++ 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs index bf0b06d87d..798c1e7041 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketQueue.cs @@ -128,28 +128,36 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Store the throttle multiplier for posterity. throttleMultiplier = userSettings.ClientThrottleMultipler; + + int throttleMaxBPS = 1500000; + if (userSettings.TotalThrottleSettings != null) + throttleMaxBPS = userSettings.TotalThrottleSettings.Max; + // Set up the throttle classes (min, max, current) in bits per second - ResendThrottle = new LLPacketThrottle(5000, 100000, 16000, userSettings.ClientThrottleMultipler); - LandThrottle = new LLPacketThrottle(1000, 100000, 2000, userSettings.ClientThrottleMultipler); - WindThrottle = new LLPacketThrottle(0, 100000, 0, userSettings.ClientThrottleMultipler); - CloudThrottle = new LLPacketThrottle(0, 100000, 0, userSettings.ClientThrottleMultipler); - TaskThrottle = new LLPacketThrottle(1000, 800000, 3000, userSettings.ClientThrottleMultipler); - AssetThrottle = new LLPacketThrottle(1000, 800000, 1000, userSettings.ClientThrottleMultipler); - TextureThrottle = new LLPacketThrottle(1000, 800000, 4000, userSettings.ClientThrottleMultipler); - - // Total Throttle trumps all - it is the number of bits in total that are allowed to go out per second. + ResendThrottle = new LLPacketThrottle(5000, throttleMaxBPS / 15, 16000, userSettings.ClientThrottleMultipler); + LandThrottle = new LLPacketThrottle(1000, throttleMaxBPS / 15, 2000, userSettings.ClientThrottleMultipler); + WindThrottle = new LLPacketThrottle(0, throttleMaxBPS / 15, 0, userSettings.ClientThrottleMultipler); + CloudThrottle = new LLPacketThrottle(0, throttleMaxBPS / 15, 0, userSettings.ClientThrottleMultipler); + TaskThrottle = new LLPacketThrottle(1000, throttleMaxBPS / 2, 3000, userSettings.ClientThrottleMultipler); + AssetThrottle = new LLPacketThrottle(1000, throttleMaxBPS / 2, 1000, userSettings.ClientThrottleMultipler); + TextureThrottle = new LLPacketThrottle(1000, throttleMaxBPS / 2, 4000, userSettings.ClientThrottleMultipler); + + + // Total Throttle trumps all - it is the number of bits in total that are allowed to go out per second. + + ThrottleSettings totalThrottleSettings = userSettings.TotalThrottleSettings; if (null == totalThrottleSettings) - { - totalThrottleSettings = new ThrottleSettings(0, 1500000, 28000); + { + totalThrottleSettings = new ThrottleSettings(0, throttleMaxBPS, 28000); } - - TotalThrottle + + TotalThrottle = new LLPacketThrottle( totalThrottleSettings.Min, totalThrottleSettings.Max, totalThrottleSettings.Current, userSettings.ClientThrottleMultipler); - throttleTimer = new Timer((int) (throttletimems/throttleTimeDivisor)); + throttleTimer = new Timer((int)(throttletimems / throttleTimeDivisor)); throttleTimer.Elapsed += ThrottleTimerElapsed; throttleTimer.Start(); diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 5184e35186..9ee8df5bb9 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -152,11 +152,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP ClientStackUserSettings userSettings = new ClientStackUserSettings(); IConfig config = configSource.Configs["ClientStack.LindenUDP"]; - + if (config != null) { + if (config.Contains("client_throttle_max_bps")) + { + int maxBPS = config.GetInt("client_throttle_max_bps", 1500000); + userSettings.TotalThrottleSettings = new ThrottleSettings(0, maxBPS, + maxBPS > 28000 ? maxBPS : 28000); + } + if (config.Contains("client_throttle_multiplier")) - userSettings.ClientThrottleMultipler = config.GetFloat("client_throttle_multiplier"); + userSettings.ClientThrottleMultipler = config.GetFloat("client_throttle_multiplier"); if (config.Contains("client_socket_rcvbuf_size")) m_clientSocketReceiveBuffer = config.GetInt("client_socket_rcvbuf_size"); } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 9a17c58c3e..cff5d19097 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -374,6 +374,9 @@ ; ; client_socket_rcvbuf_size = 8388608 + ; Maximum bits per second to send to any single client. This will override the user's viewer preference settings. + + ; client_throttle_max_bps = 1500000 [Chat] ; Controls whether the chat module is enabled. Default is true. From 32cc00ec7b26290e4b65e326164510ad6fc831d3 Mon Sep 17 00:00:00 2001 From: Jeff Lee Date: Tue, 18 Aug 2009 00:41:38 -0400 Subject: [PATCH 03/51] osGetLinkPrimitiveParams fix --- .../Shared/Api/Implementation/LSL_Api.cs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 2dbbf70388..4e665e9893 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1978,6 +1978,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return new LSL_Rotation(q.X, q.Y, q.Z, q.W); } + private LSL_Rotation GetPartRot( SceneObjectPart part ) + { + Quaternion q; + if (part.LinkNum == 0 || part.LinkNum == 1) // unlinked or root prim + { + if (part.ParentGroup.RootPart.AttachmentPoint != 0) + { + ScenePresence avatar = World.GetScenePresence(part.AttachedAvatar); + if (avatar != null) + if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) + q = avatar.CameraRotation; // Mouselook + else + q = avatar.Rotation; // Currently infrequently updated so may be inaccurate + else + q = part.ParentGroup.GroupRotation; // Likely never get here but just in case + } + else + q = part.ParentGroup.GroupRotation; // just the group rotation + return new LSL_Rotation(q.X, q.Y, q.Z, q.W); + } + q = part.GetWorldRotation(); + return new LSL_Rotation(q.X, q.Y, q.Z, q.W); + } + public LSL_Rotation llGetLocalRot() { m_host.AddScriptLPS(1); @@ -7299,7 +7323,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api break; case (int)ScriptBaseClass.PRIM_ROTATION: - res.Add(llGetRot()); + res.Add(GetPartRot(part)); break; case (int)ScriptBaseClass.PRIM_TYPE: From 99c7a43ffdb9c3b4dee984f7cd788742c6ee3e53 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 Aug 2009 04:39:02 +0100 Subject: [PATCH 04/51] Add rest console support to the user server. Will ask new questions at startup. To use, run it normally once, answering the questions, then run again with -console=rest. Also now supports -console=basic for a console that reads stdin --- OpenSim/Framework/UserConfig.cs | 14 ++++++++ OpenSim/Grid/UserServer/Main.cs | 39 ++++++++++++++++++++++- OpenSim/Server/Base/ServicesServerBase.cs | 28 ++++++++++++++++ prebuild.xml | 1 + 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/OpenSim/Framework/UserConfig.cs b/OpenSim/Framework/UserConfig.cs index 31838ad155..b9e366553c 100644 --- a/OpenSim/Framework/UserConfig.cs +++ b/OpenSim/Framework/UserConfig.cs @@ -46,6 +46,8 @@ namespace OpenSim.Framework public bool HttpSSL = ConfigSettings.DefaultUserServerHttpSSL; public uint DefaultUserLevel = 0; public string LibraryXmlfile = ""; + public string ConsoleUser = String.Empty; + public string ConsolePass = String.Empty; private Uri m_inventoryUrl; @@ -155,6 +157,12 @@ namespace OpenSim.Framework m_configMember.addConfigurationOption("default_loginLevel", ConfigurationOption.ConfigurationTypes.TYPE_UINT32, "Minimum Level a user should have to login [0 default]", "0", false); + m_configMember.addConfigurationOption("console_user", ConfigurationOption.ConfigurationTypes.TYPE_STRING, + "Remote console access user name [Default: disabled]", "0", false); + + m_configMember.addConfigurationOption("console_pass", ConfigurationOption.ConfigurationTypes.TYPE_STRING, + "Remote console access password [Default: disabled]", "0", false); + } public bool handleIncomingConfiguration(string configuration_key, object configuration_result) @@ -209,6 +217,12 @@ namespace OpenSim.Framework case "library_location": LibraryXmlfile = (string)configuration_result; break; + case "console_user": + ConsoleUser = (string)configuration_result; + break; + case "console_pass": + ConsolePass = (string)configuration_result; + break; } return true; diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs index 86c2abb8d7..f47a96ef03 100644 --- a/OpenSim/Grid/UserServer/Main.cs +++ b/OpenSim/Grid/UserServer/Main.cs @@ -43,6 +43,7 @@ using OpenSim.Framework.Statistics; using OpenSim.Grid.Communications.OGS1; using OpenSim.Grid.Framework; using OpenSim.Grid.UserServer.Modules; +using Nini.Config; namespace OpenSim.Grid.UserServer { @@ -73,8 +74,22 @@ namespace OpenSim.Grid.UserServer protected AvatarCreationModule m_appearanceModule; + protected static string m_consoleType = "local"; + protected static IConfigSource m_config = null; + public static void Main(string[] args) { + ArgvConfigSource argvSource = new ArgvConfigSource(args); + argvSource.AddSwitch("Startup", "console", "c"); + + IConfig startupConfig = argvSource.Configs["Startup"]; + if (startupConfig != null) + { + m_consoleType = startupConfig.GetString("console", "local"); + } + + m_config = argvSource; + XmlConfigurator.Configure(); m_log.Info("Launching UserServer..."); @@ -87,7 +102,18 @@ namespace OpenSim.Grid.UserServer public OpenUser_Main() { - m_console = new LocalConsole("User"); + switch (m_consoleType) + { + case "rest": + m_console = new RemoteConsole("User"); + break; + case "basic": + m_console = new CommandConsole("User"); + break; + default: + m_console = new LocalConsole("User"); + break; + } MainConsole.Instance = m_console; } @@ -129,6 +155,17 @@ namespace OpenSim.Grid.UserServer m_httpServer = new BaseHttpServer(Cfg.HttpPort); + if (m_console is RemoteConsole) + { + System.Console.WriteLine("Initialized REST console"); + RemoteConsole c = (RemoteConsole)m_console; + c.SetServer(m_httpServer); + IConfig netConfig = m_config.AddConfig("Network"); + netConfig.Set("ConsoleUser", Cfg.ConsoleUser); + netConfig.Set("ConsolePass", Cfg.ConsolePass); + c.ReadConfig(m_config); + } + RegisterInterface(m_console); RegisterInterface(Cfg); diff --git a/OpenSim/Server/Base/ServicesServerBase.cs b/OpenSim/Server/Base/ServicesServerBase.cs index 619c2d1c96..1d9eb0d241 100644 --- a/OpenSim/Server/Base/ServicesServerBase.cs +++ b/OpenSim/Server/Base/ServicesServerBase.cs @@ -65,6 +65,10 @@ namespace OpenSim.Server.Base // private bool m_Running = true; + // PID file + // + private string m_pidFile = String.Empty; + // Handle all the automagical stuff // public ServicesServerBase(string prompt, string[] args) @@ -211,6 +215,11 @@ namespace OpenSim.Server.Base } } + if (startupConfig.GetString("PIDFile", String.Empty) != String.Empty) + { + CreatePIDFile(startupConfig.GetString("PIDFile")); + } + // Register the quit command // MainConsole.Instance.Commands.AddCommand("base", false, "quit", @@ -230,6 +239,8 @@ namespace OpenSim.Server.Base MainConsole.Instance.Prompt(); } + if (m_pidFile != String.Empty) + File.Delete(m_pidFile); return 0; } @@ -246,5 +257,22 @@ namespace OpenSim.Server.Base protected virtual void Initialise() { } + + protected void CreatePIDFile(string path) + { + try + { + string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); + FileStream fs = File.Create(path); + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + Byte[] buf = enc.GetBytes(pidstring); + fs.Write(buf, 0, buf.Length); + fs.Close(); + m_pidFile = path; + } + catch (Exception) + { + } + } } } diff --git a/prebuild.xml b/prebuild.xml index 5e4416984b..4f110c4487 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1178,6 +1178,7 @@ + From dd0234f5005127c03760c2b9862ed1672f4a2e91 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 Aug 2009 05:15:25 +0100 Subject: [PATCH 05/51] Graft the REST console onto the grid server. Same procedure as with the user server. --- OpenSim/Framework/GridConfig.cs | 16 +++++++++++++- OpenSim/Grid/GridServer/GridServerBase.cs | 27 +++++++++++++++++++++-- OpenSim/Grid/GridServer/Program.cs | 12 ++++++++++ OpenSim/Grid/UserServer/Main.cs | 1 - prebuild.xml | 1 + 5 files changed, 53 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/GridConfig.cs b/OpenSim/Framework/GridConfig.cs index a3c103280e..87fd3f0275 100644 --- a/OpenSim/Framework/GridConfig.cs +++ b/OpenSim/Framework/GridConfig.cs @@ -45,6 +45,8 @@ namespace OpenSim.Framework public string SimSendKey = String.Empty; public string UserRecvKey = String.Empty; public string UserSendKey = String.Empty; + public string ConsoleUser = String.Empty; + public string ConsolePass = String.Empty; public GridConfig(string description, string filename) { @@ -95,6 +97,12 @@ namespace OpenSim.Framework "Allow regions to register immediately upon grid server startup? true/false", "True", false); + m_configMember.addConfigurationOption("console_user", ConfigurationOption.ConfigurationTypes.TYPE_STRING, + "Remote console access user name [Default: disabled]", "0", false); + + m_configMember.addConfigurationOption("console_pass", ConfigurationOption.ConfigurationTypes.TYPE_STRING, + "Remote console access password [Default: disabled]", "0", false); + } public bool handleIncomingConfiguration(string configuration_key, object configuration_result) @@ -140,9 +148,15 @@ namespace OpenSim.Framework case "allow_region_registration": AllowRegionRegistration = (bool)configuration_result; break; + case "console_user": + ConsoleUser = (string)configuration_result; + break; + case "console_pass": + ConsolePass = (string)configuration_result; + break; } return true; } } -} \ No newline at end of file +} diff --git a/OpenSim/Grid/GridServer/GridServerBase.cs b/OpenSim/Grid/GridServer/GridServerBase.cs index c41a728e05..e3ad52abb1 100644 --- a/OpenSim/Grid/GridServer/GridServerBase.cs +++ b/OpenSim/Grid/GridServer/GridServerBase.cs @@ -31,6 +31,7 @@ using System.IO; using System.Reflection; using System.Timers; using log4net; +using Nini.Config; using OpenSim.Framework; using OpenSim.Framework.Console; using OpenSim.Framework.Servers; @@ -46,6 +47,8 @@ namespace OpenSim.Grid.GridServer private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected GridConfig m_config; + public string m_consoleType = "local"; + public IConfigSource m_configSource = null; public GridConfig Config { @@ -71,16 +74,36 @@ namespace OpenSim.Grid.GridServer public GridServerBase() { - m_console = new LocalConsole("Grid"); - MainConsole.Instance = m_console; } protected override void StartupSpecific() { + switch (m_consoleType) + { + case "rest": + m_console = new RemoteConsole("Grid"); + break; + case "basic": + m_console = new CommandConsole("Grid"); + break; + default: + m_console = new LocalConsole("Grid"); + break; + } + MainConsole.Instance = m_console; m_config = new GridConfig("GRID SERVER", (Path.Combine(Util.configDir(), "GridServer_Config.xml"))); m_log.Info("[GRID]: Starting HTTP process"); m_httpServer = new BaseHttpServer(m_config.HttpPort); + if (m_console is RemoteConsole) + { + RemoteConsole c = (RemoteConsole)m_console; + c.SetServer(m_httpServer); + IConfig netConfig = m_configSource.AddConfig("Network"); + netConfig.Set("ConsoleUser", m_config.ConsoleUser); + netConfig.Set("ConsolePass", m_config.ConsolePass); + c.ReadConfig(m_configSource); + } LoadPlugins(); diff --git a/OpenSim/Grid/GridServer/Program.cs b/OpenSim/Grid/GridServer/Program.cs index 9618b855d2..c7ba897b9a 100644 --- a/OpenSim/Grid/GridServer/Program.cs +++ b/OpenSim/Grid/GridServer/Program.cs @@ -26,6 +26,7 @@ */ using log4net.Config; +using Nini.Config; namespace OpenSim.Grid.GridServer { @@ -33,10 +34,21 @@ namespace OpenSim.Grid.GridServer { public static void Main(string[] args) { + ArgvConfigSource argvSource = new ArgvConfigSource(args); + argvSource.AddSwitch("Startup", "console", "c"); + XmlConfigurator.Configure(); GridServerBase app = new GridServerBase(); + IConfig startupConfig = argvSource.Configs["Startup"]; + if (startupConfig != null) + { + app.m_consoleType = startupConfig.GetString("console", "local"); + } + + app.m_configSource = argvSource; + // if (args.Length > 0 && args[0] == "-setuponly") // { // app.Config(); diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs index f47a96ef03..1ee53ef6ec 100644 --- a/OpenSim/Grid/UserServer/Main.cs +++ b/OpenSim/Grid/UserServer/Main.cs @@ -157,7 +157,6 @@ namespace OpenSim.Grid.UserServer if (m_console is RemoteConsole) { - System.Console.WriteLine("Initialized REST console"); RemoteConsole c = (RemoteConsole)m_console; c.SetServer(m_httpServer); IConfig netConfig = m_config.AddConfig("Network"); diff --git a/prebuild.xml b/prebuild.xml index 4f110c4487..216a02e5a3 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -911,6 +911,7 @@ + From 2111c66f89033b3426ceedba6a3ec6ed8fb3363f Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 19 Aug 2009 05:40:23 +0100 Subject: [PATCH 06/51] Graft the REST console onto the message server as well. What a dirty hack! Works the same as the others. --- OpenSim/Framework/MessageServerConfig.cs | 16 +++++- OpenSim/Grid/MessagingServer/Main.cs | 73 ++++++++++++++++++------ prebuild.xml | 1 + 3 files changed, 72 insertions(+), 18 deletions(-) diff --git a/OpenSim/Framework/MessageServerConfig.cs b/OpenSim/Framework/MessageServerConfig.cs index d0ceebc82f..61e5ea7550 100644 --- a/OpenSim/Framework/MessageServerConfig.cs +++ b/OpenSim/Framework/MessageServerConfig.cs @@ -46,6 +46,8 @@ namespace OpenSim.Framework public string UserRecvKey = String.Empty; public string UserSendKey = String.Empty; public string UserServerURL = String.Empty; + public string ConsoleUser = String.Empty; + public string ConsolePass = String.Empty; public MessageServerConfig(string description, string filename) { @@ -88,6 +90,12 @@ namespace OpenSim.Framework "Use SSL? true/false", ConfigSettings.DefaultMessageServerHttpSSL.ToString(), false); m_configMember.addConfigurationOption("published_ip", ConfigurationOption.ConfigurationTypes.TYPE_STRING, "My Published IP Address", "127.0.0.1", false); + m_configMember.addConfigurationOption("console_user", ConfigurationOption.ConfigurationTypes.TYPE_STRING, + "Remote console access user name [Default: disabled]", "0", false); + + m_configMember.addConfigurationOption("console_pass", ConfigurationOption.ConfigurationTypes.TYPE_STRING, + "Remote console access password [Default: disabled]", "0", false); + } public bool handleIncomingConfiguration(string configuration_key, object configuration_result) @@ -130,9 +138,15 @@ namespace OpenSim.Framework case "published_ip": MessageServerIP = (string) configuration_result; break; + case "console_user": + ConsoleUser = (string)configuration_result; + break; + case "console_pass": + ConsolePass = (string)configuration_result; + break; } return true; } } -} \ No newline at end of file +} diff --git a/OpenSim/Grid/MessagingServer/Main.cs b/OpenSim/Grid/MessagingServer/Main.cs index dcefeea8e3..654e770dfd 100644 --- a/OpenSim/Grid/MessagingServer/Main.cs +++ b/OpenSim/Grid/MessagingServer/Main.cs @@ -30,6 +30,7 @@ using System.Collections.Generic; using System.IO; using System.Reflection; using log4net; +using Nini.Config; using log4net.Config; using OpenSim.Framework; using OpenSim.Framework.Console; @@ -56,8 +57,22 @@ namespace OpenSim.Grid.MessagingServer // private UUID m_lastCreatedUser = UUID.Random(); + protected static string m_consoleType = "local"; + protected static IConfigSource m_config = null; + public static void Main(string[] args) { + ArgvConfigSource argvSource = new ArgvConfigSource(args); + argvSource.AddSwitch("Startup", "console", "c"); + + IConfig startupConfig = argvSource.Configs["Startup"]; + if (startupConfig != null) + { + m_consoleType = startupConfig.GetString("console", "local"); + } + + m_config = argvSource; + XmlConfigurator.Configure(); m_log.Info("[SERVER]: Launching MessagingServer..."); @@ -70,7 +85,18 @@ namespace OpenSim.Grid.MessagingServer public OpenMessage_Main() { - m_console = new LocalConsole("Messaging"); + switch (m_consoleType) + { + case "rest": + m_console = new RemoteConsole("Messaging"); + break; + case "basic": + m_console = new CommandConsole("Messaging"); + break; + default: + m_console = new LocalConsole("Messaging"); + break; + } MainConsole.Instance = m_console; } @@ -88,20 +114,33 @@ namespace OpenSim.Grid.MessagingServer { if (m_userServerModule.registerWithUserServer()) { - m_log.Info("[SERVER]: Starting HTTP process"); - m_httpServer = new BaseHttpServer(Cfg.HttpPort); + if (m_httpServer == null) + { + m_log.Info("[SERVER]: Starting HTTP process"); + m_httpServer = new BaseHttpServer(Cfg.HttpPort); - m_httpServer.AddXmlRPCHandler("login_to_simulator", msgsvc.UserLoggedOn); - m_httpServer.AddXmlRPCHandler("logout_of_simulator", msgsvc.UserLoggedOff); - m_httpServer.AddXmlRPCHandler("get_presence_info_bulk", msgsvc.GetPresenceInfoBulk); - m_httpServer.AddXmlRPCHandler("process_region_shutdown", msgsvc.ProcessRegionShutdown); - m_httpServer.AddXmlRPCHandler("agent_location", msgsvc.AgentLocation); - m_httpServer.AddXmlRPCHandler("agent_leaving", msgsvc.AgentLeaving); + if (m_console is RemoteConsole) + { + RemoteConsole c = (RemoteConsole)m_console; + c.SetServer(m_httpServer); + IConfig netConfig = m_config.AddConfig("Network"); + netConfig.Set("ConsoleUser", Cfg.ConsoleUser); + netConfig.Set("ConsolePass", Cfg.ConsolePass); + c.ReadConfig(m_config); + } - m_httpServer.AddXmlRPCHandler("region_startup", m_regionModule.RegionStartup); - m_httpServer.AddXmlRPCHandler("region_shutdown", m_regionModule.RegionShutdown); + m_httpServer.AddXmlRPCHandler("login_to_simulator", msgsvc.UserLoggedOn); + m_httpServer.AddXmlRPCHandler("logout_of_simulator", msgsvc.UserLoggedOff); + m_httpServer.AddXmlRPCHandler("get_presence_info_bulk", msgsvc.GetPresenceInfoBulk); + m_httpServer.AddXmlRPCHandler("process_region_shutdown", msgsvc.ProcessRegionShutdown); + m_httpServer.AddXmlRPCHandler("agent_location", msgsvc.AgentLocation); + m_httpServer.AddXmlRPCHandler("agent_leaving", msgsvc.AgentLeaving); - m_httpServer.Start(); + m_httpServer.AddXmlRPCHandler("region_startup", m_regionModule.RegionStartup); + m_httpServer.AddXmlRPCHandler("region_shutdown", m_regionModule.RegionShutdown); + + m_httpServer.Start(); + } m_log.Info("[SERVER]: Userserver registration was successful"); } else @@ -114,12 +153,12 @@ namespace OpenSim.Grid.MessagingServer private void deregisterFromUserServer() { m_userServerModule.deregisterWithUserServer(); - if (m_httpServer != null) - { +// if (m_httpServer != null) +// { // try a completely fresh registration, with fresh handlers, too - m_httpServer.Stop(); - m_httpServer = null; - } +// m_httpServer.Stop(); +// m_httpServer = null; +// } m_console.Output("[SERVER]: Deregistered from userserver."); } diff --git a/prebuild.xml b/prebuild.xml index 216a02e5a3..ebe5c62c00 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1281,6 +1281,7 @@ + From 124f66bfc25984a01491b8447fa97bea2633281c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 18 Aug 2009 22:17:47 -0700 Subject: [PATCH 07/51] jhurliman's patch in http://opensimulator.org/mantis/view.php?id=4024 --- OpenSim/Framework/InventoryFolderBase.cs | 6 ++++ .../ClientStack/LindenUDP/LLClientView.cs | 4 +-- .../AvatarFactory/AvatarFactoryModule.cs | 3 +- .../Avatar/Gestures/GesturesModule.cs | 6 ++-- .../Transfer/InventoryTransferModule.cs | 13 ++++--- .../Inventory/HGInventoryBroker.cs | 3 +- .../World/Permissions/PermissionsModule.cs | 9 +++-- .../Framework/Scenes/Scene.Inventory.cs | 35 ++++++++++++------- .../Framework/Scenes/Scene.PacketHandlers.cs | 3 +- 9 files changed, 52 insertions(+), 30 deletions(-) diff --git a/OpenSim/Framework/InventoryFolderBase.cs b/OpenSim/Framework/InventoryFolderBase.cs index 05f11a491c..1869d48f90 100644 --- a/OpenSim/Framework/InventoryFolderBase.cs +++ b/OpenSim/Framework/InventoryFolderBase.cs @@ -78,6 +78,12 @@ namespace OpenSim.Framework ID = id; } + public InventoryFolderBase(UUID id, UUID owner) + { + ID = id; + Owner = owner; + } + public InventoryFolderBase(UUID id, string name, UUID owner, short type, UUID parent, ushort version) { ID = id; diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 06bea3dc38..16ce9e0d5c 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -6633,9 +6633,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP } else // Agent { - //InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(itemID); IInventoryService invService = m_scene.RequestModuleInterface(); - InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase assetRequestItem = new InventoryItemBase(itemID, AgentId); + assetRequestItem = invService.GetItem(assetRequestItem); if (assetRequestItem == null) { assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 582beeead8..35c59aa6d7 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -130,7 +130,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory } else { - InventoryItemBase baseItem = invService.GetItem(new InventoryItemBase(appearance.Wearables[i].ItemID)); + InventoryItemBase baseItem = new InventoryItemBase(appearance.Wearables[i].ItemID, userID); + baseItem = invService.GetItem(baseItem); if (baseItem != null) { diff --git a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs index a68db1b7c5..ff1236104a 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs @@ -65,7 +65,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures { IInventoryService invService = m_scene.InventoryService; - InventoryItemBase item = invService.GetItem(new InventoryItemBase(gestureId)); + InventoryItemBase item = new InventoryItemBase(gestureId, client.AgentId); + item = invService.GetItem(item); if (item != null) { item.Flags = 1; @@ -80,7 +81,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures { IInventoryService invService = m_scene.InventoryService; - InventoryItemBase item = invService.GetItem(new InventoryItemBase(gestureId)); + InventoryItemBase item = new InventoryItemBase(gestureId, client.AgentId); + item = invService.GetItem(item); if (item != null) { item.Flags = 0; diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 5315c119a4..3a6533686e 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs @@ -257,8 +257,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer invService.GetFolderForType(client.AgentId, AssetType.TrashFolder); UUID inventoryEntityID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip - - InventoryItemBase item = invService.GetItem(new InventoryItemBase(inventoryEntityID)); + + InventoryItemBase item = new InventoryItemBase(inventoryEntityID, client.AgentId); + item = invService.GetItem(item); InventoryFolderBase folder = null; if (item != null && trashFolder != null) @@ -271,7 +272,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer } else { - folder = invService.GetFolder(new InventoryFolderBase(inventoryEntityID)); + folder = new InventoryFolderBase(inventoryEntityID, client.AgentId); + folder = invService.GetFolder(folder); if (folder != null & trashFolder != null) { @@ -451,10 +453,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer else { UUID itemID = new UUID(msg.binaryBucket, 1); - InventoryItemBase item = new InventoryItemBase(); - - item.ID = itemID; - item.Owner = user.ControllingClient.AgentId; + InventoryItemBase item = new InventoryItemBase(itemID, user.ControllingClient.AgentId); // Fetch from service // diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index dd451ef94f..492598ea70 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -483,12 +483,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory string userInventoryServerURI = HGNetworkServersInfo.ServerURI(uinfo.UserProfile.UserInventoryURI); string uri = m_LocalGridInventoryURI.TrimEnd('/'); - m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, comparing {0} to {1}.", userInventoryServerURI, uri); - if ((userInventoryServerURI == uri) || (userInventoryServerURI == "")) { return true; } + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: user is foreign({0} - {1})", userInventoryServerURI, uri); return false; } diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 9c71b41d79..f3605779f9 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -966,7 +966,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions if (objectID == UUID.Zero) // User inventory { IInventoryService invService = m_scene.InventoryService; - InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(notecard)); + InventoryItemBase assetRequestItem = new InventoryItemBase(notecard, user); + assetRequestItem = invService.GetItem(assetRequestItem); if (assetRequestItem == null) // Library item { assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); @@ -1385,7 +1386,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions if (objectID == UUID.Zero) // User inventory { IInventoryService invService = m_scene.InventoryService; - InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(script)); + InventoryItemBase assetRequestItem = new InventoryItemBase(script, user); + assetRequestItem = invService.GetItem(assetRequestItem); if (assetRequestItem == null) // Library item { assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script); @@ -1479,7 +1481,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions if (objectID == UUID.Zero) // User inventory { IInventoryService invService = m_scene.InventoryService; - InventoryItemBase assetRequestItem = invService.GetItem(new InventoryItemBase(notecard)); + InventoryItemBase assetRequestItem = new InventoryItemBase(notecard, user); + assetRequestItem = invService.GetItem(assetRequestItem); if (assetRequestItem == null) // Library item { assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 46777e120e..48c7f4efa8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -140,7 +140,8 @@ namespace OpenSim.Region.Framework.Scenes /// public virtual UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data) { - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); if (item != null) { @@ -315,7 +316,8 @@ namespace OpenSim.Region.Framework.Scenes public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, UUID itemID, InventoryItemBase itemUpd) { - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); if (item != null) { @@ -408,7 +410,8 @@ namespace OpenSim.Region.Framework.Scenes { Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemId)); + InventoryItemBase item = new InventoryItemBase(itemId, senderId); + item = InventoryService.GetItem(item); if ((item != null) && (item.Owner == senderId)) { @@ -558,7 +561,8 @@ namespace OpenSim.Region.Framework.Scenes if (item == null) { - item = InventoryService.GetItem(new InventoryItemBase(oldItemID)); + item = new InventoryItemBase(oldItemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); if (item == null) { @@ -636,7 +640,8 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat( "[AGENT INVENTORY]: Moving item {0} to {1} for {2}", itemID, folderID, remoteClient.AgentId); - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); if (item != null) { @@ -1224,7 +1229,8 @@ namespace OpenSim.Region.Framework.Scenes UUID copyID = UUID.Random(); if (itemID != UUID.Zero) { - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); // Try library if (null == item) @@ -1287,7 +1293,8 @@ namespace OpenSim.Region.Framework.Scenes if (itemID != UUID.Zero) // transferred from an avatar inventory to the prim's inventory { - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); // Try library // XXX clumsy, possibly should be one call @@ -1672,7 +1679,7 @@ namespace OpenSim.Region.Framework.Scenes if (DeRezAction.SaveToExistingUserInventoryItem == action) { - item = new InventoryItemBase(objectGroup.RootPart.FromUserInventoryItemID); + item = new InventoryItemBase(objectGroup.RootPart.FromUserInventoryItemID, userID); item = InventoryService.GetItem(item); //item = userInfo.RootFolder.FindItem( @@ -1834,7 +1841,8 @@ namespace OpenSim.Region.Framework.Scenes string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); if (item != null) { @@ -1984,7 +1992,8 @@ namespace OpenSim.Region.Framework.Scenes BypassRayCast, bRayEndIsIntersection,true,scale, false); // Rez object - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); if (item != null) { @@ -2309,7 +2318,8 @@ namespace OpenSim.Region.Framework.Scenes ScenePresence presence; if (TryGetAvatar(remoteClient.AgentId, out presence)) { - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID, remoteClient.AgentId)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); IAvatarFactory ava = RequestModuleInterface(); @@ -2360,7 +2370,8 @@ namespace OpenSim.Region.Framework.Scenes if (TryGetAvatar(remoteClient.AgentId, out presence)) { // XXYY!! - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); IAvatarFactory ava = RequestModuleInterface(); if (ava != null) diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index fde922f04d..1bbca4987e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -404,7 +404,8 @@ namespace OpenSim.Region.Framework.Scenes return; } - InventoryItemBase item = InventoryService.GetItem(new InventoryItemBase(itemID)); + InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); + item = InventoryService.GetItem(item); if (item != null) { From e5f33e75055a8f83cf4e11a6120774cb90dbc3be Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 18 Aug 2009 22:36:03 -0700 Subject: [PATCH 08/51] GetFolderItems implemented. It's not being called, but it might. --- .../Inventory/HGInventoryBroker.cs | 11 +++++++++-- .../RemoteInventoryServiceConnector.cs | 3 ++- .../Inventory/HGInventoryServiceConnector.cs | 13 +++++++++++++ .../Inventory/ISessionAuthInventoryService.cs | 7 +++++++ .../Inventory/InventoryServiceConnector.cs | 17 +++++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index 492598ea70..3649097d9c 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -290,7 +290,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public override List GetFolderItems(UUID userID, UUID folderID) { - return new List(); + if (IsLocalGridUser(userID)) + return m_GridService.GetFolderItems(userID, folderID); + else + { + UUID sessionID = GetSessionID(userID); + string uri = GetUserInventoryURI(userID) + "/" + userID; + return m_HGService.GetFolderItems(uri, folderID, sessionID); + } } public override bool AddFolder(InventoryFolderBase folder) @@ -487,7 +494,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { return true; } - m_log.DebugFormat("[HG INVENTORY CONNECTOR]: user is foreign({0} - {1})", userInventoryServerURI, uri); + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: user {0} is foreign({1} - {2})", userID, userInventoryServerURI, uri); return false; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index bef716b5c6..522f68054a 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs @@ -212,7 +212,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public override List GetFolderItems(UUID userID, UUID folderID) { - return new List(); + UUID sessionID = GetSessionID(userID); + return m_RemoteConnector.GetFolderItems(userID.ToString(), folderID, sessionID); } public override bool AddFolder(InventoryFolderBase folder) diff --git a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs index 94b4ad92d1..75fa516094 100644 --- a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs @@ -214,6 +214,19 @@ namespace OpenSim.Services.Connectors.Inventory return false; } + public List GetFolderItems(string id, UUID folderID, UUID sessionID) + { + string url = string.Empty; + string userID = string.Empty; + + if (StringToUrlAndUserID(id, out url, out userID)) + { + ISessionAuthInventoryService connector = GetConnector(url); + return connector.GetFolderItems(userID, folderID, sessionID); + } + return new List(); + } + public bool AddItem(string id, InventoryItemBase item, UUID sessionID) { string url = string.Empty; diff --git a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs index f50bcf5d72..7f051f34b5 100644 --- a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs +++ b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs @@ -95,6 +95,13 @@ namespace OpenSim.Services.Connectors /// true if the folder was successfully purged bool PurgeFolder(string userID, InventoryFolderBase folder, UUID session_id); + /// + /// Get items from a folder. + /// + /// + /// true if the folder was successfully purged + List GetFolderItems(string userID, UUID folderID, UUID session_id); + /// /// Add a new item to the user's inventory /// diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index 5d94eaca5a..5aa4b300e7 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs @@ -334,6 +334,23 @@ namespace OpenSim.Services.Connectors return false; } + public List GetFolderItems(string userID, UUID folderID, UUID sessionID) + { + try + { + InventoryFolderBase folder = new InventoryFolderBase(folderID, new UUID(userID)); + return SynchronousRestSessionObjectPoster>.BeginPostObject( + "POST", m_ServerURI + "/GetItems/", folder, sessionID.ToString(), userID); + } + catch (Exception e) + { + m_log.ErrorFormat("[INVENTORY CONNECTOR]: Get folder items operation failed, {0} {1}", + e.Source, e.Message); + } + + return null; + } + public bool AddItem(string userID, InventoryItemBase item, UUID sessionID) { try From c5af39239f7f2a1725d9c08bea80522de8835e0f Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 19 Aug 2009 00:13:51 -0700 Subject: [PATCH 09/51] A better purge of trash folder. --- .../Rest/Inventory/RestInventoryServices.cs | 8 +++-- .../Communications/Cache/CachedUserInfo.cs | 4 ++- .../Communications/Tests/LoginServiceTests.cs | 2 +- OpenSim/Framework/IClientAPI.cs | 2 +- .../ClientStack/LindenUDP/LLClientView.cs | 25 +++++++++------ .../Transfer/InventoryTransferModule.cs | 4 ++- .../Inventory/BaseInventoryConnector.cs | 2 +- .../Inventory/HGInventoryBroker.cs | 20 +++++++----- .../LocalInventoryServiceConnector.cs | 4 +-- .../RemoteInventoryServiceConnector.cs | 10 +++--- .../Framework/Scenes/Scene.Inventory.cs | 31 ++++++++++++++----- .../Framework/Scenes/Scene.PacketHandlers.cs | 2 +- .../Inventory/InventoryServerInConnector.cs | 13 ++++++-- .../Inventory/HGInventoryServiceConnector.cs | 4 +-- .../Inventory/ISessionAuthInventoryService.cs | 2 +- .../Inventory/InventoryServiceConnector.cs | 9 ++++-- .../QuickAndDirtyInventoryServiceConnector.cs | 2 +- .../Services/Interfaces/IInventoryService.cs | 3 +- .../InventoryService/InventoryService.cs | 12 ++++--- .../Tests/Common/Mock/TestInventoryService.cs | 2 +- 20 files changed, 107 insertions(+), 54 deletions(-) diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/RestInventoryServices.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/RestInventoryServices.cs index aec06be6bf..59431bbfaa 100644 --- a/OpenSim/ApplicationPlugins/Rest/Inventory/RestInventoryServices.cs +++ b/OpenSim/ApplicationPlugins/Rest/Inventory/RestInventoryServices.cs @@ -851,7 +851,9 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory // Delete the old item - Rest.InventoryServices.DeleteItem(uri); + List uuids = new List(); + uuids.Add(uri.ID); + Rest.InventoryServices.DeleteItems(uri.Owner, uuids); // Add the new item to the inventory @@ -927,7 +929,9 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory InventoryItemBase item = (InventoryItemBase) InventoryNode; Rest.Log.DebugFormat("{0} {1}: Item {2} will be deleted", MsgId, rdata.method, rdata.path); - Rest.InventoryServices.DeleteItem(item); + List uuids = new List(); + uuids.Add(item.ID); + Rest.InventoryServices.DeleteItems(item.Owner, uuids); rdata.appendStatus(String.Format("

Deleted item {0} UUID {1}

", item.Name, item.ID)); } diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index ca641d063b..238810ab00 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs @@ -653,7 +653,9 @@ namespace OpenSim.Framework.Communications.Cache if (RootFolder.DeleteItem(item.ID)) { - return m_InventoryService.DeleteItem(item); + List uuids = new List(); + uuids.Add(itemID); + return m_InventoryService.DeleteItems(this.UserProfile.ID, uuids); } } else diff --git a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs index 22dcef9bc8..d5d4d1e80d 100644 --- a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs +++ b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs @@ -547,7 +547,7 @@ namespace OpenSim.Framework.Communications.Tests return false; } - public bool DeleteItem(InventoryItemBase item) + public bool DeleteItems(UUID owner, List items) { return false; } diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index e451dd8874..ca37a5b8a6 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -257,7 +257,7 @@ namespace OpenSim.Framework IClientAPI remoteClient, UUID folderID, UUID itemID, int length, string newName); public delegate void RemoveInventoryItem( - IClientAPI remoteClient, UUID itemID); + IClientAPI remoteClient, List itemIDs); public delegate void RemoveInventoryFolder( IClientAPI remoteClient, UUID folderID); diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 16ce9e0d5c..e2fb659034 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -7053,14 +7053,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (OnRemoveInventoryItem != null) { handlerRemoveInventoryItem = null; + List uuids = new List(); foreach (RemoveInventoryItemPacket.InventoryDataBlock datablock in removeItem.InventoryData) { - handlerRemoveInventoryItem = OnRemoveInventoryItem; - if (handlerRemoveInventoryItem != null) - { - handlerRemoveInventoryItem(this, datablock.ItemID); - } + uuids.Add(datablock.ItemID); } + handlerRemoveInventoryItem = OnRemoveInventoryItem; + if (handlerRemoveInventoryItem != null) + { + handlerRemoveInventoryItem(this, uuids); + } + } break; case PacketType.RemoveInventoryFolder: @@ -7116,13 +7119,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (OnRemoveInventoryItem != null) { handlerRemoveInventoryItem = null; + List uuids = new List(); foreach (RemoveInventoryObjectsPacket.ItemDataBlock datablock in removeObject.ItemData) { - handlerRemoveInventoryItem = OnRemoveInventoryItem; - if (handlerRemoveInventoryItem != null) - { - handlerRemoveInventoryItem(this, datablock.ItemID); - } + uuids.Add(datablock.ItemID); + } + handlerRemoveInventoryItem = OnRemoveInventoryItem; + if (handlerRemoveInventoryItem != null) + { + handlerRemoveInventoryItem(this, uuids); } } break; diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 3a6533686e..5afbf686e1 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs @@ -267,7 +267,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer item.Folder = trashFolder.ID; // Diva comment: can't we just update this item??? - invService.DeleteItem(item); + List uuids = new List(); + uuids.Add(item.ID); + invService.DeleteItems(item.Owner, uuids); scene.AddInventoryItem(client, item); } else diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs index ef5ffe1ebd..d1ae3e4582 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs @@ -186,7 +186,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory /// /// /// true if the item was successfully deleted - public abstract bool DeleteItem(InventoryItemBase item); + public abstract bool DeleteItems(UUID ownerID, List itemIDs); public abstract InventoryItemBase GetItem(InventoryItemBase item); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index 3649097d9c..6a1f2d5c22 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -393,18 +393,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } } - public override bool DeleteItem(InventoryItemBase item) + public override bool DeleteItems(UUID ownerID, List itemIDs) { - if (item == null) - return false; + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID); - if (IsLocalGridUser(item.Owner)) - return m_GridService.DeleteItem(item); + if (itemIDs == null) + return false; + if (itemIDs.Count == 0) + return true; + + if (IsLocalGridUser(ownerID)) + return m_GridService.DeleteItems(ownerID, itemIDs); else { - UUID sessionID = GetSessionID(item.Owner); - string uri = GetUserInventoryURI(item.Owner) + "/" + item.Owner.ToString(); - return m_HGService.DeleteItem(uri, item, sessionID); + UUID sessionID = GetSessionID(ownerID); + string uri = GetUserInventoryURI(ownerID) + "/" + ownerID.ToString(); + return m_HGService.DeleteItems(uri, itemIDs, sessionID); } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index 2fbc5fe2cc..b2640af09c 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -294,9 +294,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory /// /// /// true if the item was successfully deleted - public override bool DeleteItem(InventoryItemBase item) + public override bool DeleteItems(UUID ownerID, List itemIDs) { - return m_InventoryService.DeleteItem(item); + return m_InventoryService.DeleteItems(ownerID, itemIDs); } public override InventoryItemBase GetItem(InventoryItemBase item) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index 522f68054a..012f0e3fae 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs @@ -273,13 +273,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.UpdateItem(item.Owner.ToString(), item, sessionID); } - public override bool DeleteItem(InventoryItemBase item) + public override bool DeleteItems(UUID ownerID, List itemIDs) { - if (item == null) + if (itemIDs == null) return false; + if (itemIDs.Count == 0) + return true; - UUID sessionID = GetSessionID(item.Owner); - return m_RemoteConnector.DeleteItem(item.Owner.ToString(), item, sessionID); + UUID sessionID = GetSessionID(ownerID); + return m_RemoteConnector.DeleteItems(ownerID.ToString(), itemIDs, sessionID); } public override InventoryItemBase GetItem(InventoryItemBase item) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 48c7f4efa8..5e2eb73bc7 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -477,7 +477,11 @@ namespace OpenSim.Region.Framework.Scenes if (!Permissions.BypassPermissions()) { if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) - InventoryService.DeleteItem(new InventoryItemBase(itemId)); + { + List items = new List(); + items.Add(itemId); + InventoryService.DeleteItems(senderId, items); + } } return itemCopy; @@ -652,7 +656,9 @@ namespace OpenSim.Region.Framework.Scenes item.Folder = folderID; // Diva comment: can't we just update? - InventoryService.DeleteItem(item); + List uuids = new List(); + uuids.Add(item.ID); + InventoryService.DeleteItems(item.Owner, uuids); AddInventoryItem(remoteClient, item); } @@ -799,9 +805,10 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - private void RemoveInventoryItem(IClientAPI remoteClient, UUID itemID) + private void RemoveInventoryItem(IClientAPI remoteClient, List itemIDs) { - InventoryService.DeleteItem(new InventoryItemBase(itemID)); + //m_log.Debug("[SCENE INVENTORY]: user " + remoteClient.AgentId); + InventoryService.DeleteItems(remoteClient.AgentId, itemIDs); } ///

@@ -1248,7 +1255,11 @@ namespace OpenSim.Region.Framework.Scenes if (!Permissions.BypassPermissions()) { if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) - RemoveInventoryItem(remoteClient, itemID); + { + List uuids = new List(); + uuids.Add(itemID); + RemoveInventoryItem(remoteClient, uuids); + } } } else @@ -2144,7 +2155,11 @@ namespace OpenSim.Region.Framework.Scenes // copy ones will be lost, so avoid it // if (!attachment) - InventoryService.DeleteItem(item); + { + List uuids = new List(); + uuids.Add(item.ID); + InventoryService.DeleteItems(item.Owner, uuids); + } } } @@ -2404,7 +2419,9 @@ namespace OpenSim.Region.Framework.Scenes } part.ParentGroup.DetachToGround(); - InventoryService.DeleteItem(new InventoryItemBase(inventoryID)); + List uuids = new List(); + uuids.Add(inventoryID); + InventoryService.DeleteItems(remoteClient.AgentId, uuids); remoteClient.SendRemoveInventoryItem(inventoryID); } SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 1bbca4987e..a2414e5e94 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -560,7 +560,7 @@ namespace OpenSim.Region.Framework.Scenes public void HandlePurgeInventoryDescendents(IClientAPI remoteClient, UUID folderID) { - InventoryFolderBase folder = new InventoryFolderBase(folderID); + InventoryFolderBase folder = new InventoryFolderBase(folderID, remoteClient.AgentId); if (InventoryService.PurgeFolder(folder)) m_log.DebugFormat("[AGENT INVENTORY]: folder {0} purged successfully", folderID); diff --git a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs index 30b3caec21..6cfc7dfb6b 100644 --- a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs +++ b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs @@ -105,8 +105,8 @@ namespace OpenSim.Server.Handlers.Inventory "POST", "/PurgeFolder/", m_InventoryService.PurgeFolder, CheckAuthSession)); m_httpServer.AddStreamHandler( - new RestDeserialiseSecureHandler( - "POST", "/DeleteItem/", m_InventoryService.DeleteItem, CheckAuthSession)); + new RestDeserialiseSecureHandler, bool>( + "POST", "/DeleteItem/", DeleteItems, CheckAuthSession)); m_httpServer.AddStreamHandler( new RestDeserialiseSecureHandler( @@ -247,6 +247,15 @@ namespace OpenSim.Server.Handlers.Inventory return m_InventoryService.GetAssetPermissions(item.Owner, item.AssetID); } + public bool DeleteItems(List items) + { + List uuids = new List(); + foreach (Guid g in items) + uuids.Add(new UUID(g)); + // oops we lost the user info here. Bad bad handlers + return m_InventoryService.DeleteItems(UUID.Zero, uuids); + } + #endregion /// diff --git a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs index 75fa516094..00b74b5e9a 100644 --- a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs @@ -253,7 +253,7 @@ namespace OpenSim.Services.Connectors.Inventory return false; } - public bool DeleteItem(string id, InventoryItemBase item, UUID sessionID) + public bool DeleteItems(string id, List itemIDs, UUID sessionID) { string url = string.Empty; string userID = string.Empty; @@ -261,7 +261,7 @@ namespace OpenSim.Services.Connectors.Inventory if (StringToUrlAndUserID(id, out url, out userID)) { ISessionAuthInventoryService connector = GetConnector(url); - return connector.UpdateItem(userID, item, sessionID); + return connector.DeleteItems(userID, itemIDs, sessionID); } return false; } diff --git a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs index 7f051f34b5..e4e713c52e 100644 --- a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs +++ b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs @@ -121,7 +121,7 @@ namespace OpenSim.Services.Connectors /// /// /// true if the item was successfully deleted - bool DeleteItem(string userID, InventoryItemBase item, UUID session_id); + bool DeleteItems(string userID, List itemIDs, UUID session_id); InventoryItemBase QueryItem(string userID, InventoryItemBase item, UUID session_id); diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index 5aa4b300e7..9b2e331c0c 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs @@ -383,12 +383,15 @@ namespace OpenSim.Services.Connectors return false; } - public bool DeleteItem(string userID, InventoryItemBase item, UUID sessionID) + public bool DeleteItems(string userID, List items, UUID sessionID) { try { - return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/DeleteItem/", item, sessionID.ToString(), item.Owner.ToString()); + List guids = new List(); + foreach (UUID u in items) + guids.Add(u.Guid); + return SynchronousRestSessionObjectPoster, bool>.BeginPostObject( + "POST", m_ServerURI + "/DeleteItem/", guids, sessionID.ToString(), userID); } catch (Exception e) { diff --git a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs index 5cbd307f7a..3bbf1291d9 100644 --- a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs @@ -151,7 +151,7 @@ namespace OpenSim.Services.Connectors return false; } - public bool DeleteItem(InventoryItemBase item) + public bool DeleteItems(UUID owner, List itemIDs) { return false; } diff --git a/OpenSim/Services/Interfaces/IInventoryService.cs b/OpenSim/Services/Interfaces/IInventoryService.cs index a89a238311..6409b576c6 100644 --- a/OpenSim/Services/Interfaces/IInventoryService.cs +++ b/OpenSim/Services/Interfaces/IInventoryService.cs @@ -147,7 +147,8 @@ namespace OpenSim.Services.Interfaces /// /// /// true if the item was successfully deleted - bool DeleteItem(InventoryItemBase item); + //bool DeleteItem(InventoryItemBase item); + bool DeleteItems(UUID userID, List itemIDs); /// /// Get an item, given by its UUID diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs index 65c2d96031..69b1b287c3 100644 --- a/OpenSim/Services/InventoryService/InventoryService.cs +++ b/OpenSim/Services/InventoryService/InventoryService.cs @@ -387,12 +387,14 @@ namespace OpenSim.Services.InventoryService } // See IInventoryServices - public virtual bool DeleteItem(InventoryItemBase item) + public virtual bool DeleteItems(UUID owner, List itemIDs) { m_log.InfoFormat( - "[INVENTORY SERVICE]: Deleting item {0} {1} from folder {2}", item.Name, item.ID, item.Folder); + "[INVENTORY SERVICE]: Deleting {0} items from user {1}", itemIDs.Count, owner); - m_Database.deleteInventoryItem(item.ID); + // uhh..... + foreach (UUID uuid in itemIDs) + m_Database.deleteInventoryItem(uuid); // FIXME: Should return false on failure return true; @@ -439,10 +441,12 @@ namespace OpenSim.Services.InventoryService List items = GetFolderItems(folder.Owner, folder.ID); + List uuids = new List(); foreach (InventoryItemBase item in items) { - DeleteItem(item); + uuids.Add(item.ID); } + DeleteItems(folder.Owner, uuids); // FIXME: Should return false on failure return true; diff --git a/OpenSim/Tests/Common/Mock/TestInventoryService.cs b/OpenSim/Tests/Common/Mock/TestInventoryService.cs index ba9cbe9f93..f770f7505a 100644 --- a/OpenSim/Tests/Common/Mock/TestInventoryService.cs +++ b/OpenSim/Tests/Common/Mock/TestInventoryService.cs @@ -143,7 +143,7 @@ namespace OpenSim.Tests.Common.Mock return false; } - public bool DeleteItem(InventoryItemBase item) + public bool DeleteItems(UUID ownerID, List itemIDs) { return false; } From 4382f28efc6ffe70e3c6f6e8cd7e7c729d1f12af Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 19 Aug 2009 00:33:02 -0700 Subject: [PATCH 10/51] Async purge so that the client thread doesn't wait. --- .../RemoteInventoryServiceConnector.cs | 10 ++++---- .../Framework/Scenes/Scene.PacketHandlers.cs | 24 +++++++++++++++++-- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index 012f0e3fae..081d0f78ef 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs @@ -323,14 +323,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory private UUID GetSessionID(UUID userID) { - if (m_Scene == null) - { - m_log.Debug("[INVENTORY CONNECTOR]: OOPS! scene is null"); - } + //if (m_Scene == null) + //{ + // m_log.Debug("[INVENTORY CONNECTOR]: OOPS! scene is null"); + //} if (m_UserProfileService == null) { - m_log.Debug("[INVENTORY CONNECTOR]: OOPS! UserProfileCacheService is null"); + //m_log.Debug("[INVENTORY CONNECTOR]: OOPS! UserProfileCacheService is null"); return UUID.Zero; } diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index a2414e5e94..77b980c1e0 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; using System.Collections.Generic; using System.Threading; using OpenMetaverse; @@ -558,15 +559,34 @@ namespace OpenSim.Region.Framework.Scenes /// /// + delegate void PurgeFolderDelegate(UUID userID, UUID folder); + public void HandlePurgeInventoryDescendents(IClientAPI remoteClient, UUID folderID) { - InventoryFolderBase folder = new InventoryFolderBase(folderID, remoteClient.AgentId); + PurgeFolderDelegate d = PurgeFolderAsync; + try + { + d.BeginInvoke(remoteClient.AgentId, folderID, PurgeFolderCompleted, d); + } + catch (Exception e) + { + m_log.WarnFormat("[AGENT INVENTORY]: Exception on purge folder for user {0}: {1}", remoteClient.AgentId, e.Message); + } + } + + + private void PurgeFolderAsync(UUID userID, UUID folderID) + { + InventoryFolderBase folder = new InventoryFolderBase(folderID, userID); if (InventoryService.PurgeFolder(folder)) m_log.DebugFormat("[AGENT INVENTORY]: folder {0} purged successfully", folderID); else m_log.WarnFormat("[AGENT INVENTORY]: could not purge folder {0}", folderID); - } + } + private void PurgeFolderCompleted(IAsyncResult iar) + { + } } } From d519f1885f587409592cf92bc0f4ba8533a1866f Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 19 Aug 2009 10:56:08 -0700 Subject: [PATCH 11/51] Added MoveItems, which is most useful upon viewer-delete inventory operation. Moving a batch of items is a 1-time operation. Made it async anyway, so that the viewer doesn't wait in case the DB layer is dumb (which is the case currently). --- .../Communications/Tests/LoginServiceTests.cs | 5 +++ OpenSim/Framework/IClientAPI.cs | 2 +- .../ClientStack/LindenUDP/LLClientView.cs | 19 ++++++--- .../Inventory/BaseInventoryConnector.cs | 2 + .../Inventory/HGInventoryBroker.cs | 17 ++++++++ .../LocalInventoryServiceConnector.cs | 6 +++ .../RemoteInventoryServiceConnector.cs | 10 +++++ .../Framework/Scenes/Scene.Inventory.cs | 31 ++------------ .../Inventory/InventoryServerInConnector.cs | 21 ++++++++-- .../Inventory/HGInventoryServiceConnector.cs | 13 ++++++ .../Inventory/ISessionAuthInventoryService.cs | 2 + .../Inventory/InventoryServiceConnector.cs | 42 +++++++++++++++++++ .../QuickAndDirtyInventoryServiceConnector.cs | 5 +++ .../Services/Interfaces/IInventoryService.cs | 2 + .../InventoryService/InventoryService.cs | 18 ++++++++ .../Tests/Common/Mock/TestInventoryService.cs | 5 +++ 16 files changed, 162 insertions(+), 38 deletions(-) diff --git a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs index d5d4d1e80d..6f86704cdc 100644 --- a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs +++ b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs @@ -547,6 +547,11 @@ namespace OpenSim.Framework.Communications.Tests return false; } + public bool MoveItems(UUID owner, List items) + { + return false; + } + public bool DeleteItems(UUID owner, List items) { return false; diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index ca37a5b8a6..c6cdcaa8d8 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -254,7 +254,7 @@ namespace OpenSim.Framework string newName); public delegate void MoveInventoryItem( - IClientAPI remoteClient, UUID folderID, UUID itemID, int length, string newName); + IClientAPI remoteClient, List items); public delegate void RemoveInventoryItem( IClientAPI remoteClient, List itemIDs); diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index e2fb659034..6969a3db1d 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -7027,14 +7027,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (OnMoveInventoryItem != null) { handlerMoveInventoryItem = null; + InventoryItemBase itm = null; + List items = new List(); foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData) { - handlerMoveInventoryItem = OnMoveInventoryItem; - if (handlerMoveInventoryItem != null) - { - handlerMoveInventoryItem(this, datablock.FolderID, datablock.ItemID, datablock.Length, - Util.FieldToString(datablock.NewName)); - } + itm = new InventoryItemBase(datablock.ItemID, AgentId); + itm.Folder = datablock.FolderID; + itm.Name = Util.FieldToString(datablock.NewName); + // weird, comes out as empty string + //m_log.DebugFormat("[XXX] new name: {0}", itm.Name); + items.Add(itm); + } + handlerMoveInventoryItem = OnMoveInventoryItem; + if (handlerMoveInventoryItem != null) + { + handlerMoveInventoryItem(this, items); } } break; diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs index d1ae3e4582..d4cb61663a 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs @@ -181,6 +181,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory /// true if the item was successfully updated public abstract bool UpdateItem(InventoryItemBase item); + public abstract bool MoveItems(UUID ownerID, List items); + /// /// Delete an item from the user's inventory /// diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index 6a1f2d5c22..787c6c8b17 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -393,6 +393,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } } + public override bool MoveItems(UUID ownerID, List items) + { + if (items == null) + return false; + if (items.Count == 0) + return true; + + if (IsLocalGridUser(ownerID)) + return m_GridService.MoveItems(ownerID, items); + else + { + UUID sessionID = GetSessionID(ownerID); + string uri = GetUserInventoryURI(ownerID) + "/" + ownerID.ToString(); + return m_HGService.MoveItems(uri, items, sessionID); + } + } + public override bool DeleteItems(UUID ownerID, List itemIDs) { m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index b2640af09c..562c5dd91f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -289,6 +289,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_InventoryService.UpdateItem(item); } + + public override bool MoveItems(UUID ownerID, List items) + { + return m_InventoryService.MoveItems(ownerID, items); + } + /// /// Delete an item from the user's inventory /// diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index 081d0f78ef..201442c2b4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs @@ -273,6 +273,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.UpdateItem(item.Owner.ToString(), item, sessionID); } + public override bool MoveItems(UUID ownerID, List items) + { + if (items == null) + return false; + + UUID sessionID = GetSessionID(ownerID); + return m_RemoteConnector.MoveItems(ownerID.ToString(), items, sessionID); + } + + public override bool DeleteItems(UUID ownerID, List itemIDs) { if (itemIDs == null) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 5e2eb73bc7..a119efcf55 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -638,36 +638,13 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - public void MoveInventoryItem(IClientAPI remoteClient, UUID folderID, UUID itemID, int length, - string newName) + public void MoveInventoryItem(IClientAPI remoteClient, List items) { m_log.DebugFormat( - "[AGENT INVENTORY]: Moving item {0} to {1} for {2}", itemID, folderID, remoteClient.AgentId); + "[AGENT INVENTORY]: Moving {0} items for user {1}", items.Count, remoteClient.AgentId); - InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); - item = InventoryService.GetItem(item); - - if (item != null) - { - if (newName != String.Empty) - { - item.Name = newName; - } - item.Folder = folderID; - - // Diva comment: can't we just update? - List uuids = new List(); - uuids.Add(item.ID); - InventoryService.DeleteItems(item.Owner, uuids); - - AddInventoryItem(remoteClient, item); - } - else - { - m_log.Warn("[AGENT INVENTORY]: Failed to find item " + itemID.ToString()); - - return; - } + if (!InventoryService.MoveItems(remoteClient.AgentId, items)) + m_log.Warn("[AGENT INVENTORY]: Failed to move items for user " + remoteClient.AgentId); } /// diff --git a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs index 6cfc7dfb6b..6ef1d9d32f 100644 --- a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs +++ b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs @@ -125,8 +125,8 @@ namespace OpenSim.Server.Handlers.Inventory "POST", "/NewFolder/", m_InventoryService.AddFolder, CheckAuthSession)); m_httpServer.AddStreamHandler( - new RestDeserialiseTrustedHandler( - "POST", "/CreateFolder/", m_InventoryService.AddFolder, CheckTrustSource)); + new RestDeserialiseSecureHandler( + "POST", "/CreateFolder/", m_InventoryService.AddFolder, CheckAuthSession)); m_httpServer.AddStreamHandler( new RestDeserialiseSecureHandler( @@ -137,9 +137,13 @@ namespace OpenSim.Server.Handlers.Inventory "POST", "/AddNewItem/", m_InventoryService.AddItem, CheckTrustSource)); m_httpServer.AddStreamHandler( - new RestDeserialiseTrustedHandler>( - "POST", "/GetItems/", GetFolderItems, CheckTrustSource)); + new RestDeserialiseSecureHandler>( + "POST", "/GetItems/", GetFolderItems, CheckAuthSession)); + m_httpServer.AddStreamHandler( + new RestDeserialiseSecureHandler, bool>( + "POST", "/MoveItems/", MoveItems, CheckAuthSession)); + // for persistent active gestures m_httpServer.AddStreamHandler( new RestDeserialiseTrustedHandler> @@ -256,6 +260,15 @@ namespace OpenSim.Server.Handlers.Inventory return m_InventoryService.DeleteItems(UUID.Zero, uuids); } + public bool MoveItems(List items) + { + // oops we lost the user info here. Bad bad handlers + // let's peek at one item + UUID ownerID = UUID.Zero; + if (items.Count > 0) + ownerID = items[0].Owner; + return m_InventoryService.MoveItems(ownerID, items); + } #endregion /// diff --git a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs index 00b74b5e9a..45e921a670 100644 --- a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs @@ -253,6 +253,19 @@ namespace OpenSim.Services.Connectors.Inventory return false; } + public bool MoveItems(string id, List items, UUID sessionID) + { + string url = string.Empty; + string userID = string.Empty; + + if (StringToUrlAndUserID(id, out url, out userID)) + { + ISessionAuthInventoryService connector = GetConnector(url); + return connector.MoveItems(userID, items, sessionID); + } + return false; + } + public bool DeleteItems(string id, List itemIDs, UUID sessionID) { string url = string.Empty; diff --git a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs index e4e713c52e..c89c9b7ce0 100644 --- a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs +++ b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs @@ -116,6 +116,8 @@ namespace OpenSim.Services.Connectors /// true if the item was successfully updated bool UpdateItem(string userID, InventoryItemBase item, UUID session_id); + bool MoveItems(string userID, List items, UUID session_id); + /// /// Delete an item from the user's inventory /// diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index 9b2e331c0c..bcf9d87423 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs @@ -383,6 +383,48 @@ namespace OpenSim.Services.Connectors return false; } + /** + * MoveItems Async group + */ + + delegate void MoveItemsDelegate(string userID, List items, UUID sessionID); + + private void MoveItemsAsync(string userID, List items, UUID sessionID) + { + try + { + SynchronousRestSessionObjectPoster, bool>.BeginPostObject( + "POST", m_ServerURI + "/MoveItems/", items, sessionID.ToString(), userID.ToString()); + + // Success + return; + } + catch (Exception e) + { + m_log.ErrorFormat("[INVENTORY CONNECTOR]: Move inventory items operation failed, {0} {1} (old server?). Trying slow way.", + e.Source, e.Message); + } + + foreach (InventoryItemBase item in items) + { + InventoryItemBase itm = this.QueryItem(userID, item, sessionID); + itm.Name = item.Name; + itm.Folder = item.Folder; + this.UpdateItem(userID, itm, sessionID); + } + } + + private void MoveItemsCompleted(IAsyncResult iar) + { + } + + public bool MoveItems(string userID, List items, UUID sessionID) + { + MoveItemsDelegate d = MoveItemsAsync; + d.BeginInvoke(userID, items, sessionID, MoveItemsCompleted, d); + return true; + } + public bool DeleteItems(string userID, List items, UUID sessionID) { try diff --git a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs index 3bbf1291d9..cd283ff17e 100644 --- a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs @@ -151,6 +151,11 @@ namespace OpenSim.Services.Connectors return false; } + public bool MoveItems(UUID ownerID, List items) + { + return false; + } + public bool DeleteItems(UUID owner, List itemIDs) { return false; diff --git a/OpenSim/Services/Interfaces/IInventoryService.cs b/OpenSim/Services/Interfaces/IInventoryService.cs index 6409b576c6..ebdb09a969 100644 --- a/OpenSim/Services/Interfaces/IInventoryService.cs +++ b/OpenSim/Services/Interfaces/IInventoryService.cs @@ -142,6 +142,8 @@ namespace OpenSim.Services.Interfaces /// true if the item was successfully updated bool UpdateItem(InventoryItemBase item); + bool MoveItems(UUID ownerID, List items); + /// /// Delete an item from the user's inventory /// diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs index 69b1b287c3..e0217f6ede 100644 --- a/OpenSim/Services/InventoryService/InventoryService.cs +++ b/OpenSim/Services/InventoryService/InventoryService.cs @@ -386,6 +386,24 @@ namespace OpenSim.Services.InventoryService return true; } + public virtual bool MoveItems(UUID ownerID, List items) + { + m_log.InfoFormat( + "[INVENTORY SERVICE]: Moving {0} items from user {1}", items.Count, ownerID); + + InventoryItemBase itm = null; + foreach (InventoryItemBase item in items) + { + itm = GetInventoryItem(item.ID); + itm.Folder = item.Folder; + if ((item.Name != null) && !item.Name.Equals(string.Empty)) + itm.Name = item.Name; + m_Database.updateInventoryItem(itm); + } + + return true; + } + // See IInventoryServices public virtual bool DeleteItems(UUID owner, List itemIDs) { diff --git a/OpenSim/Tests/Common/Mock/TestInventoryService.cs b/OpenSim/Tests/Common/Mock/TestInventoryService.cs index f770f7505a..ee22e5e14e 100644 --- a/OpenSim/Tests/Common/Mock/TestInventoryService.cs +++ b/OpenSim/Tests/Common/Mock/TestInventoryService.cs @@ -143,6 +143,11 @@ namespace OpenSim.Tests.Common.Mock return false; } + public bool MoveItems(UUID ownerID, List items) + { + return false; + } + public bool DeleteItems(UUID ownerID, List itemIDs) { return false; From 51e487a172d97d17e3a02f8f3479af24a1d1ae41 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 19 Aug 2009 12:02:57 -0700 Subject: [PATCH 12/51] Makes the inventory connectors fully compatible with the old Grid.InventoryServer. WARNING: interacting with the old server is _much_ slower than interacting with the new one. Grids with the old server will not see any improvements on crossings and TPs, because inventory needs to be fetched from it in its entirety. --- .../Inventory/InventoryServiceConnector.cs | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index bcf9d87423..b573a06cb1 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs @@ -178,30 +178,36 @@ namespace OpenSim.Services.Connectors catch (Exception e) { // Maybe we're talking to an old inventory server. Try this other thing. - m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetSystemFolders operation failed, {0} {1}. Trying RootFolders.", + m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetSystemFolders operation failed, {0} {1} (old sever?). Trying GetInventory.", e.Source, e.Message); try { - folders = SynchronousRestSessionObjectPoster>.BeginPostObject( - "POST", m_ServerURI + "/RootFolders/", new Guid(userID), sessionID.ToString(), userID.ToString()); + InventoryCollection inventory = SynchronousRestSessionObjectPoster.BeginPostObject( + "POST", m_ServerURI + "/GetInventory/", new Guid(userID), sessionID.ToString(), userID.ToString()); + folders = inventory.Folders; } catch (Exception ex) { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: RootFolders operation also failed, {0} {1}. Give up.", + m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetInventory operation also failed, {0} {1}. Giving up.", e.Source, ex.Message); } if ((folders != null) && (folders.Count > 0)) { - dFolders[AssetType.Folder] = folders[0]; // Root folder is the first one - folders.RemoveAt(0); + m_log.DebugFormat("[INVENTORY CONNECTOR]: Received entire inventory ({0} folders) for user {1}", + folders.Count, userID); foreach (InventoryFolderBase f in folders) { if ((f.Type != (short)AssetType.Folder) && (f.Type != (short)AssetType.Unknown)) dFolders[(AssetType)f.Type] = f; } + UUID rootFolderID = dFolders[AssetType.Animation].ParentID; + InventoryFolderBase rootFolder = new InventoryFolderBase(rootFolderID, new UUID(userID)); + rootFolder = QueryFolder(userID, rootFolder, sessionID); + dFolders[AssetType.Folder] = rootFolder; + m_log.DebugFormat("[INVENTORY CONNECTOR]: {0} system folders for user {1}", dFolders.Count, userID); return dFolders; } } @@ -226,48 +232,48 @@ namespace OpenSim.Services.Connectors catch (Exception e) { // Maybe we're talking to an old inventory server. Try this other thing. - m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderForType operation failed, {0} {1}. Trying RootFolders and GetItems.", + m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1} (old server?). Trying GetInventory.", e.Source, e.Message); + InventoryCollection inventory; List folders = null; try { - folders = SynchronousRestSessionObjectPoster>.BeginPostObject( - "POST", m_ServerURI + "/RootFolders/", new Guid(userID), sessionID.ToString(), userID.ToString()); + inventory = SynchronousRestSessionObjectPoster.BeginPostObject( + "POST", m_ServerURI + "/GetInventory/", new Guid(userID), sessionID.ToString(), userID.ToString()); + if (inventory != null) + folders = inventory.Folders; } catch (Exception ex) { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: RootFolders operation also failed, {0} {1}. Give up.", + m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetInventory operation also failed, {0} {1}. Giving up.", e.Source, ex.Message); + return new InventoryCollection(); } if ((folders != null) && (folders.Count > 0)) { - folders = folders.FindAll(delegate (InventoryFolderBase f) { return f.ParentID == folderID ; }); + m_log.DebugFormat("[INVENTORY CONNECTOR]: Received entire inventory ({0} folders) for user {1}", + folders.Count, userID); - try + folders = folders.FindAll(delegate(InventoryFolderBase f) { return f.ParentID == folderID; }); + List items = inventory.Items; + if (items != null) { - List items = SynchronousRestSessionObjectPoster>.BeginPostObject( - "POST", m_ServerURI + "/GetItems/", folderID.Guid, sessionID.ToString(), userID.ToString()); + items = items.FindAll(delegate(InventoryItemBase i) { return i.Folder == folderID; }); + } - if (items != null) - { - InventoryCollection result = new InventoryCollection(); - result.Folders = folders; - result.Items = items; - result.UserID = new UUID(userID); - return result; - } - } - catch (Exception ex) - { - m_log.ErrorFormat("[INVENTORY CONNECTOR]: QueryFolder and GetItems operation failed, {0} {1}. Give up.", - e.Source, ex.Message); - } + inventory.Items = items; + inventory.Folders = folders; + return inventory; } } - return null; + InventoryCollection nullCollection = new InventoryCollection(); + nullCollection.Folders = new List(); + nullCollection.Items = new List(); + nullCollection.UserID = new UUID(userID); + return nullCollection; } public bool AddFolder(string userID, InventoryFolderBase folder, UUID sessionID) From c295354ea035c7e62f8a2c58868d2303a3ede883 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 19 Aug 2009 16:15:04 -0700 Subject: [PATCH 13/51] Fixes GetRootFolder for normal standalone, which was being incorrectly redirected to the wrong object. Probably fixes most grief in http://opensimulator.org/mantis/view.php?id=4035 http://opensimulator.org/mantis/view.php?id=4027 --- .../Inventory/LocalInventoryServiceConnector.cs | 6 +++--- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index 562c5dd91f..e6edcf2cef 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -191,7 +191,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public override Dictionary GetSystemFolders(UUID userID) { - InventoryFolderBase root = GetRootFolder(userID); + InventoryFolderBase root = m_InventoryService.GetRootFolder(userID); if (root != null) { InventoryCollection content = GetFolderContent(userID, root.ID); @@ -202,13 +202,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown)) { - m_log.InfoFormat("[INVENTORY CONNECTOR]: folder type {0} ", folder.Type); + //m_log.InfoFormat("[INVENTORY CONNECTOR]: folder type {0} ", folder.Type); folders[(AssetType)folder.Type] = folder; } } // Put the root folder there, as type Folder folders[AssetType.Folder] = root; - m_log.InfoFormat("[INVENTORY CONNECTOR]: root folder is type {0} ", root.Type); + //m_log.InfoFormat("[INVENTORY CONNECTOR]: root folder is type {0} ", root.Type); return folders; } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index a119efcf55..a9d361b072 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -179,8 +179,8 @@ namespace OpenSim.Region.Framework.Scenes else { m_log.ErrorFormat( - "[AGENT INVENTORY]: Could not resolve user {0} for caps inventory update", - remoteClient.AgentId); + "[AGENT INVENTORY]: Could not find item {0} for caps inventory update", + itemID); } return UUID.Zero; From f1287cc7af7da26910c5cba456a8c35b6454d815 Mon Sep 17 00:00:00 2001 From: Kunnis Date: Sun, 16 Aug 2009 18:54:20 -0500 Subject: [PATCH 14/51] * Switching IAssetData to follow the new naming schema, removing the separate insert and update methods. --- OpenSim/Data/AssetDataBase.cs | 10 +--- OpenSim/Data/IAssetData.cs | 5 +- OpenSim/Data/MSSQL/MSSQLAssetData.cs | 19 ++++++-- OpenSim/Data/MySQL/MySQLAssetData.cs | 13 +---- .../Data/NHibernate/NHibernateAssetData.cs | 24 ++++------ OpenSim/Data/SQLite/SQLiteAssetData.cs | 47 ++++++++----------- OpenSim/Data/Tests/BasicAssetTest.cs | 24 +++++----- .../Servers/GetAssetStreamHandler.cs | 2 +- .../Servers/PostAssetStreamHandler.cs | 2 +- .../Tests/GetAssetStreamHandlerTests.cs | 2 +- .../OpenSim/OpenSimAssetStoragePlugin.cs | 8 ++-- OpenSim/Grid/AssetServer/Main.cs | 2 +- OpenSim/Services/AssetService/AssetService.cs | 10 ++-- 13 files changed, 73 insertions(+), 95 deletions(-) diff --git a/OpenSim/Data/AssetDataBase.cs b/OpenSim/Data/AssetDataBase.cs index f723ebf9a7..5deb44e61e 100644 --- a/OpenSim/Data/AssetDataBase.cs +++ b/OpenSim/Data/AssetDataBase.cs @@ -36,15 +36,9 @@ namespace OpenSim.Data { public abstract class AssetDataBase : IAssetDataPlugin { - public virtual AssetBase FetchAsset(UUID uuid) - { - return FetchStoredAsset(uuid); - } - - protected abstract AssetBase FetchStoredAsset(UUID uuid); + public abstract AssetBase GetAsset(UUID uuid); - public abstract void CreateAsset(AssetBase asset); - public abstract void UpdateAsset(AssetBase asset); + public abstract void StoreAsset(AssetBase asset); public abstract bool ExistsAsset(UUID uuid); public abstract List FetchAssetMetadataSet(int start, int count); diff --git a/OpenSim/Data/IAssetData.cs b/OpenSim/Data/IAssetData.cs index d13732b0b1..2149bcac0a 100644 --- a/OpenSim/Data/IAssetData.cs +++ b/OpenSim/Data/IAssetData.cs @@ -33,9 +33,8 @@ namespace OpenSim.Data { public interface IAssetDataPlugin : IPlugin { - AssetBase FetchAsset(UUID uuid); - void CreateAsset(AssetBase asset); - void UpdateAsset(AssetBase asset); + AssetBase GetAsset(UUID uuid); + void StoreAsset(AssetBase asset); bool ExistsAsset(UUID uuid); List FetchAssetMetadataSet(int start, int count); void Initialise(string connect); diff --git a/OpenSim/Data/MSSQL/MSSQLAssetData.cs b/OpenSim/Data/MSSQL/MSSQLAssetData.cs index a54258486d..d193cf5e69 100644 --- a/OpenSim/Data/MSSQL/MSSQLAssetData.cs +++ b/OpenSim/Data/MSSQL/MSSQLAssetData.cs @@ -122,7 +122,7 @@ namespace OpenSim.Data.MSSQL /// /// the asset UUID /// - override protected AssetBase FetchStoredAsset(UUID assetID) + override public AssetBase GetAsset(UUID assetID) { string sql = "SELECT * FROM assets WHERE id = @id"; using (AutoClosingSqlCommand command = m_database.Query(sql)) @@ -152,7 +152,16 @@ namespace OpenSim.Data.MSSQL /// Create asset in m_database /// /// the asset - override public void CreateAsset(AssetBase asset) + override public void StoreAsset(AssetBase asset) + { + if (ExistsAsset(asset.FullID)) + UpdateAsset(asset); + else + InsertAsset(asset); + } + + + private void InsertAsset(AssetBase asset) { if (ExistsAsset(asset.FullID)) { @@ -208,7 +217,7 @@ namespace OpenSim.Data.MSSQL /// Update asset in m_database /// /// the asset - override public void UpdateAsset(AssetBase asset) + private void UpdateAsset(AssetBase asset) { string sql = @"UPDATE assets set id = @id, name = @name, description = @description, assetType = @assetType, local = @local, temporary = @temporary, data = @data @@ -250,7 +259,7 @@ namespace OpenSim.Data.MSSQL } } -// Commented out since currently unused - this probably should be called in FetchAsset() +// Commented out since currently unused - this probably should be called in GetAsset() // private void UpdateAccessTime(AssetBase asset) // { // using (AutoClosingSqlCommand cmd = m_database.Query("UPDATE assets SET access_time = @access_time WHERE id=@id")) @@ -276,7 +285,7 @@ namespace OpenSim.Data.MSSQL /// true if exist. override public bool ExistsAsset(UUID uuid) { - if (FetchAsset(uuid) != null) + if (GetAsset(uuid) != null) { return true; } diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs index 0865083efe..1b4377acaf 100644 --- a/OpenSim/Data/MySQL/MySQLAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLAssetData.cs @@ -135,7 +135,7 @@ namespace OpenSim.Data.MySQL /// Asset UUID to fetch /// Return the asset /// On failure : throw an exception and attempt to reconnect to database - override protected AssetBase FetchStoredAsset(UUID assetID) + override public AssetBase GetAsset(UUID assetID) { AssetBase asset = null; lock (_dbConnection) @@ -192,7 +192,7 @@ namespace OpenSim.Data.MySQL /// /// Asset UUID to create /// On failure : Throw an exception and attempt to reconnect to database - override public void CreateAsset(AssetBase asset) + override public void StoreAsset(AssetBase asset) { lock (_dbConnection) { @@ -284,15 +284,6 @@ namespace OpenSim.Data.MySQL } - /// - /// Update a asset in database, see - /// - /// Asset UUID to update - override public void UpdateAsset(AssetBase asset) - { - CreateAsset(asset); - } - /// /// check if the asset UUID exist in database /// diff --git a/OpenSim/Data/NHibernate/NHibernateAssetData.cs b/OpenSim/Data/NHibernate/NHibernateAssetData.cs index 9d8cec5b72..aaba15c713 100644 --- a/OpenSim/Data/NHibernate/NHibernateAssetData.cs +++ b/OpenSim/Data/NHibernate/NHibernateAssetData.cs @@ -65,30 +65,24 @@ namespace OpenSim.Data.NHibernate } - override protected AssetBase FetchStoredAsset(UUID uuid) + override public AssetBase GetAsset(UUID uuid) { return (AssetBase)manager.Get(typeof(AssetBase), uuid); } - private void Save(AssetBase asset) + override public void StoreAsset(AssetBase asset) { AssetBase temp = (AssetBase)manager.Get(typeof(AssetBase), asset.FullID); if (temp == null) { + m_log.InfoFormat("[NHIBERNATE] inserting asset {0}", asset.FullID); manager.Insert(asset); } - } - - override public void CreateAsset(AssetBase asset) - { - m_log.InfoFormat("[NHIBERNATE] inserting asset {0}", asset.FullID); - Save(asset); - } - - override public void UpdateAsset(AssetBase asset) - { - m_log.InfoFormat("[NHIBERNATE] updating asset {0}", asset.FullID); - manager.Update(asset); + else + { + m_log.InfoFormat("[NHIBERNATE] updating asset {0}", asset.FullID); + manager.Update(asset); + } } // private void LogAssetLoad(AssetBase asset) @@ -107,7 +101,7 @@ namespace OpenSim.Data.NHibernate override public bool ExistsAsset(UUID uuid) { m_log.InfoFormat("[NHIBERNATE] ExistsAsset: {0}", uuid); - return (FetchAsset(uuid) != null); + return (GetAsset(uuid) != null); } /// diff --git a/OpenSim/Data/SQLite/SQLiteAssetData.cs b/OpenSim/Data/SQLite/SQLiteAssetData.cs index 72af7a03d0..383146776a 100644 --- a/OpenSim/Data/SQLite/SQLiteAssetData.cs +++ b/OpenSim/Data/SQLite/SQLiteAssetData.cs @@ -90,7 +90,7 @@ namespace OpenSim.Data.SQLite /// /// UUID of ... ? /// Asset base - override protected AssetBase FetchStoredAsset(UUID uuid) + override public AssetBase GetAsset(UUID uuid) { lock (this) { @@ -119,12 +119,28 @@ namespace OpenSim.Data.SQLite /// Create an asset /// /// Asset Base - override public void CreateAsset(AssetBase asset) + override public void StoreAsset(AssetBase asset) { //m_log.Info("[ASSET DB]: Creating Asset " + asset.FullID.ToString()); if (ExistsAsset(asset.FullID)) { - //m_log.Info("[ASSET DB]: Asset exists already, ignoring."); + LogAssetLoad(asset); + + lock (this) + { + using (SqliteCommand cmd = new SqliteCommand(UpdateAssetSQL, m_conn)) + { + cmd.Parameters.Add(new SqliteParameter(":UUID", asset.FullID.ToString())); + cmd.Parameters.Add(new SqliteParameter(":Name", asset.Name)); + cmd.Parameters.Add(new SqliteParameter(":Description", asset.Description)); + cmd.Parameters.Add(new SqliteParameter(":Type", asset.Type)); + cmd.Parameters.Add(new SqliteParameter(":Local", asset.Local)); + cmd.Parameters.Add(new SqliteParameter(":Temporary", asset.Temporary)); + cmd.Parameters.Add(new SqliteParameter(":Data", asset.Data)); + + cmd.ExecuteNonQuery(); + } + } } else { @@ -146,31 +162,6 @@ namespace OpenSim.Data.SQLite } } - /// - /// Update an asset - /// - /// - override public void UpdateAsset(AssetBase asset) - { - LogAssetLoad(asset); - - lock (this) - { - using (SqliteCommand cmd = new SqliteCommand(UpdateAssetSQL, m_conn)) - { - cmd.Parameters.Add(new SqliteParameter(":UUID", asset.FullID.ToString())); - cmd.Parameters.Add(new SqliteParameter(":Name", asset.Name)); - cmd.Parameters.Add(new SqliteParameter(":Description", asset.Description)); - cmd.Parameters.Add(new SqliteParameter(":Type", asset.Type)); - cmd.Parameters.Add(new SqliteParameter(":Local", asset.Local)); - cmd.Parameters.Add(new SqliteParameter(":Temporary", asset.Temporary)); - cmd.Parameters.Add(new SqliteParameter(":Data", asset.Data)); - - cmd.ExecuteNonQuery(); - } - } - } - /// /// Some... logging functionnality /// diff --git a/OpenSim/Data/Tests/BasicAssetTest.cs b/OpenSim/Data/Tests/BasicAssetTest.cs index 09131c1422..1969d76a44 100644 --- a/OpenSim/Data/Tests/BasicAssetTest.cs +++ b/OpenSim/Data/Tests/BasicAssetTest.cs @@ -84,34 +84,34 @@ namespace OpenSim.Data.Tests scrambler.Scramble(a2); scrambler.Scramble(a3); - db.CreateAsset(a1); - db.CreateAsset(a2); - db.CreateAsset(a3); + db.StoreAsset(a1); + db.StoreAsset(a2); + db.StoreAsset(a3); - AssetBase a1a = db.FetchAsset(uuid1); + AssetBase a1a = db.GetAsset(uuid1); Assert.That(a1a, Constraints.PropertyCompareConstraint(a1)); - AssetBase a2a = db.FetchAsset(uuid2); + AssetBase a2a = db.GetAsset(uuid2); Assert.That(a2a, Constraints.PropertyCompareConstraint(a2)); - AssetBase a3a = db.FetchAsset(uuid3); + AssetBase a3a = db.GetAsset(uuid3); Assert.That(a3a, Constraints.PropertyCompareConstraint(a3)); scrambler.Scramble(a1a); scrambler.Scramble(a2a); scrambler.Scramble(a3a); - db.UpdateAsset(a1a); - db.UpdateAsset(a2a); - db.UpdateAsset(a3a); + db.StoreAsset(a1a); + db.StoreAsset(a2a); + db.StoreAsset(a3a); - AssetBase a1b = db.FetchAsset(uuid1); + AssetBase a1b = db.GetAsset(uuid1); Assert.That(a1b, Constraints.PropertyCompareConstraint(a1a)); - AssetBase a2b = db.FetchAsset(uuid2); + AssetBase a2b = db.GetAsset(uuid2); Assert.That(a2b, Constraints.PropertyCompareConstraint(a2a)); - AssetBase a3b = db.FetchAsset(uuid3); + AssetBase a3b = db.GetAsset(uuid3); Assert.That(a3b, Constraints.PropertyCompareConstraint(a3a)); Assert.That(db.ExistsAsset(uuid1), Is.True); diff --git a/OpenSim/Framework/Servers/GetAssetStreamHandler.cs b/OpenSim/Framework/Servers/GetAssetStreamHandler.cs index bc046cf98f..c6958deb71 100644 --- a/OpenSim/Framework/Servers/GetAssetStreamHandler.cs +++ b/OpenSim/Framework/Servers/GetAssetStreamHandler.cs @@ -57,7 +57,7 @@ namespace OpenSim.Framework.Servers protected override AssetBase GetAsset(UUID assetID) { - return m_assetProvider.FetchAsset(assetID); + return m_assetProvider.GetAsset(assetID); } } } diff --git a/OpenSim/Framework/Servers/PostAssetStreamHandler.cs b/OpenSim/Framework/Servers/PostAssetStreamHandler.cs index 419b4082bb..8bf406cc5a 100644 --- a/OpenSim/Framework/Servers/PostAssetStreamHandler.cs +++ b/OpenSim/Framework/Servers/PostAssetStreamHandler.cs @@ -57,7 +57,7 @@ namespace OpenSim.Framework.Servers AssetBase asset = (AssetBase) xs.Deserialize(request); m_log.InfoFormat("[REST]: Creating asset {0}", asset.FullID); - m_assetProvider.CreateAsset(asset); + m_assetProvider.StoreAsset(asset); return new byte[] {}; } diff --git a/OpenSim/Framework/Servers/Tests/GetAssetStreamHandlerTests.cs b/OpenSim/Framework/Servers/Tests/GetAssetStreamHandlerTests.cs index 35da73f2d9..be3f5187cf 100644 --- a/OpenSim/Framework/Servers/Tests/GetAssetStreamHandlerTests.cs +++ b/OpenSim/Framework/Servers/Tests/GetAssetStreamHandlerTests.cs @@ -128,7 +128,7 @@ namespace OpenSim.Framework.Servers.Tests IAssetDataPlugin assetDataPlugin = new TestAssetDataPlugin(); handler = new GetAssetStreamHandler(assetDataPlugin); - assetDataPlugin.CreateAsset(asset); + assetDataPlugin.StoreAsset(asset); return asset; } } diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs index 0631ee79a3..92ac84f85f 100644 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs +++ b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs @@ -57,7 +57,7 @@ namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim metadata = null; BackendResponse ret; - AssetBase asset = m_assetProvider.FetchAsset(assetID); + AssetBase asset = m_assetProvider.GetAsset(assetID); if (asset == null) ret = BackendResponse.NotFound; else @@ -75,7 +75,7 @@ namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim assetData = null; BackendResponse ret; - AssetBase asset = m_assetProvider.FetchAsset(assetID); + AssetBase asset = m_assetProvider.GetAsset(assetID); if (asset == null) ret = BackendResponse.NotFound; else @@ -90,7 +90,7 @@ namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim public BackendResponse TryFetchDataMetadata(UUID assetID, out AssetBase asset) { - asset = m_assetProvider.FetchAsset(assetID); + asset = m_assetProvider.GetAsset(assetID); if (asset == null) return BackendResponse.NotFound; @@ -107,7 +107,7 @@ namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim { BackendResponse ret; - m_assetProvider.CreateAsset(asset); + m_assetProvider.StoreAsset(asset); ret = BackendResponse.Success; m_server.MetricsProvider.LogAssetCreate(EXTENSION_NAME, ret, asset.FullID, asset.Data.Length, DateTime.Now); diff --git a/OpenSim/Grid/AssetServer/Main.cs b/OpenSim/Grid/AssetServer/Main.cs index f25e8477f1..ac8f8880c4 100644 --- a/OpenSim/Grid/AssetServer/Main.cs +++ b/OpenSim/Grid/AssetServer/Main.cs @@ -140,7 +140,7 @@ namespace OpenSim.Grid.AssetServer protected void StoreAsset(AssetBase asset) { - m_assetProvider.CreateAsset(asset); + m_assetProvider.StoreAsset(asset); } } } diff --git a/OpenSim/Services/AssetService/AssetService.cs b/OpenSim/Services/AssetService/AssetService.cs index fe663eb999..88a905c633 100644 --- a/OpenSim/Services/AssetService/AssetService.cs +++ b/OpenSim/Services/AssetService/AssetService.cs @@ -83,7 +83,7 @@ namespace OpenSim.Services.AssetService if (!UUID.TryParse(id, out assetID)) return null; - return m_Database.FetchAsset(assetID); + return m_Database.GetAsset(assetID); } public AssetMetadata GetMetadata(string id) @@ -93,7 +93,7 @@ namespace OpenSim.Services.AssetService if (!UUID.TryParse(id, out assetID)) return null; - AssetBase asset = m_Database.FetchAsset(assetID); + AssetBase asset = m_Database.GetAsset(assetID); return asset.Metadata; } @@ -104,7 +104,7 @@ namespace OpenSim.Services.AssetService if (!UUID.TryParse(id, out assetID)) return null; - AssetBase asset = m_Database.FetchAsset(assetID); + AssetBase asset = m_Database.GetAsset(assetID); return asset.Data; } @@ -117,7 +117,7 @@ namespace OpenSim.Services.AssetService if (!UUID.TryParse(id, out assetID)) return false; - AssetBase asset = m_Database.FetchAsset(assetID); + AssetBase asset = m_Database.GetAsset(assetID); //m_log.DebugFormat("[AssetService]: Got asset {0}", asset); @@ -129,7 +129,7 @@ namespace OpenSim.Services.AssetService public string Store(AssetBase asset) { //m_log.DebugFormat("[ASSET SERVICE]: Store asset {0} {1}", asset.Name, asset.ID); - m_Database.CreateAsset(asset); + m_Database.StoreAsset(asset); return asset.ID; } From b1853d9f265fb32cf51d65fdcf2d5b4741911f00 Mon Sep 17 00:00:00 2001 From: Kunnis Date: Sun, 16 Aug 2009 23:25:12 -0500 Subject: [PATCH 15/51] Fixing a spot I missed in assets. Switching Grid to the new naming schema with Store/Get --- OpenSim/Data/GridDataBase.cs | 3 +- OpenSim/Data/IGridData.cs | 11 ++----- OpenSim/Data/MSSQL/MSSQLGridData.cs | 29 +++++++++---------- OpenSim/Data/MySQL/MySQLGridData.cs | 13 +-------- OpenSim/Data/NHibernate/NHibernateGridData.cs | 14 +-------- OpenSim/Data/SQLite/SQLiteGridData.cs | 10 ++----- OpenSim/Data/Tests/BasicGridTest.cs | 8 ++--- .../Cache/UserProfileCacheService.cs | 2 +- .../Cache/UserProfileCacheServiceTests.cs | 4 +-- .../Grid/GridServer.Modules/GridDBService.cs | 6 ++-- .../Tests/Common/Mock/TestAssetDataPlugin.cs | 13 +++++++++ 11 files changed, 43 insertions(+), 70 deletions(-) diff --git a/OpenSim/Data/GridDataBase.cs b/OpenSim/Data/GridDataBase.cs index 5a304553c2..a03488bee3 100644 --- a/OpenSim/Data/GridDataBase.cs +++ b/OpenSim/Data/GridDataBase.cs @@ -38,9 +38,8 @@ namespace OpenSim.Data public abstract RegionProfileData[] GetProfilesInRange(uint Xmin, uint Ymin, uint Xmax, uint Ymax); public abstract List GetRegionsByName(string namePrefix, uint maxNum); public abstract bool AuthenticateSim(UUID UUID, ulong regionHandle, string simrecvkey); - public abstract DataResponse AddProfile(RegionProfileData profile); + public abstract DataResponse StoreProfile(RegionProfileData profile); public abstract ReservationData GetReservationAtPoint(uint x, uint y); - public abstract DataResponse UpdateProfile(RegionProfileData profile); public abstract DataResponse DeleteProfile(string uuid); public abstract void Initialise(); diff --git a/OpenSim/Data/IGridData.cs b/OpenSim/Data/IGridData.cs index 4bf8646aec..8bd3811175 100644 --- a/OpenSim/Data/IGridData.cs +++ b/OpenSim/Data/IGridData.cs @@ -99,18 +99,11 @@ namespace OpenSim.Data bool AuthenticateSim(UUID UUID, ulong regionHandle, string simrecvkey); /// - /// Adds a new profile to the database + /// Adds or updates a profile in the database /// /// The profile to add /// RESPONSE_OK if successful, error if not. - DataResponse AddProfile(RegionProfileData profile); - - /// - /// Updates a profile in the database - /// - /// - /// - DataResponse UpdateProfile(RegionProfileData profile); + DataResponse StoreProfile(RegionProfileData profile); /// /// Remove a profile from the database diff --git a/OpenSim/Data/MSSQL/MSSQLGridData.cs b/OpenSim/Data/MSSQL/MSSQLGridData.cs index 0ebbf4ebcf..8a3d332598 100644 --- a/OpenSim/Data/MSSQL/MSSQLGridData.cs +++ b/OpenSim/Data/MSSQL/MSSQLGridData.cs @@ -272,26 +272,23 @@ namespace OpenSim.Data.MSSQL /// /// The profile to add /// A dataresponse enum indicating success - override public DataResponse AddProfile(RegionProfileData profile) + override public DataResponse StoreProfile(RegionProfileData profile) { - if (InsertRegionRow(profile)) + if (GetProfileByUUID(profile.UUID) == null) { - return DataResponse.RESPONSE_OK; + if (InsertRegionRow(profile)) + { + return DataResponse.RESPONSE_OK; + } + } + else + { + if (UpdateRegionRow(profile)) + { + return DataResponse.RESPONSE_OK; + } } - return DataResponse.RESPONSE_ERROR; - } - /// - /// Update the specified region in the database - /// - /// The profile to update - /// A dataresponse enum indicating success - override public DataResponse UpdateProfile(RegionProfileData profile) - { - if (UpdateRegionRow(profile)) - { - return DataResponse.RESPONSE_OK; - } return DataResponse.RESPONSE_ERROR; } diff --git a/OpenSim/Data/MySQL/MySQLGridData.cs b/OpenSim/Data/MySQL/MySQLGridData.cs index 0a5800ba05..1ec26090b1 100644 --- a/OpenSim/Data/MySQL/MySQLGridData.cs +++ b/OpenSim/Data/MySQL/MySQLGridData.cs @@ -391,7 +391,7 @@ namespace OpenSim.Data.MySQL /// /// The profile to add /// Successful? - override public DataResponse AddProfile(RegionProfileData profile) + override public DataResponse StoreProfile(RegionProfileData profile) { MySQLSuperManager dbm = GetLockedConnection(); try { @@ -407,17 +407,6 @@ namespace OpenSim.Data.MySQL } } - /// - /// Update a sim profile - /// - /// The profile to update - /// Sucessful? - /// Same as AddProfile - override public DataResponse UpdateProfile(RegionProfileData profile) - { - return AddProfile(profile); - } - /// /// Deletes a sim profile from the database /// diff --git a/OpenSim/Data/NHibernate/NHibernateGridData.cs b/OpenSim/Data/NHibernate/NHibernateGridData.cs index fe8da59f43..018af62c8e 100644 --- a/OpenSim/Data/NHibernate/NHibernateGridData.cs +++ b/OpenSim/Data/NHibernate/NHibernateGridData.cs @@ -117,7 +117,7 @@ namespace OpenSim.Data.NHibernate throw new NotImplementedException(); } - public override DataResponse AddProfile(RegionProfileData profile) + public override DataResponse StoreProfile(RegionProfileData profile) { if (manager.Get(typeof(RegionProfileData), profile.Uuid) == null) { @@ -125,22 +125,10 @@ namespace OpenSim.Data.NHibernate return DataResponse.RESPONSE_OK; } else - { - return DataResponse.RESPONSE_ERROR; - } - } - - public override DataResponse UpdateProfile(RegionProfileData profile) - { - if (manager.Get(typeof(RegionProfileData), profile.Uuid) != null) { manager.Update(profile); return DataResponse.RESPONSE_OK; } - else - { - return DataResponse.RESPONSE_ERROR; - } } public override DataResponse DeleteProfile(string uuid) diff --git a/OpenSim/Data/SQLite/SQLiteGridData.cs b/OpenSim/Data/SQLite/SQLiteGridData.cs index 4107594293..18abb8830d 100644 --- a/OpenSim/Data/SQLite/SQLiteGridData.cs +++ b/OpenSim/Data/SQLite/SQLiteGridData.cs @@ -203,7 +203,7 @@ namespace OpenSim.Data.SQLite /// /// The profile to add /// A dataresponse enum indicating success - override public DataResponse AddProfile(RegionProfileData profile) + override public DataResponse StoreProfile(RegionProfileData profile) { if (database.insertRow(profile)) { @@ -215,17 +215,11 @@ namespace OpenSim.Data.SQLite } } - override public DataResponse UpdateProfile(RegionProfileData profile) - { - return AddProfile(profile); - } - - /// + /// /// Deletes a sim profile from the database /// /// the sim UUID /// Successful? - //public DataResponse DeleteProfile(RegionProfileData profile) override public DataResponse DeleteProfile(string uuid) { Dictionary param = new Dictionary(); diff --git a/OpenSim/Data/Tests/BasicGridTest.cs b/OpenSim/Data/Tests/BasicGridTest.cs index de8fb48c5e..df6c669b0f 100644 --- a/OpenSim/Data/Tests/BasicGridTest.cs +++ b/OpenSim/Data/Tests/BasicGridTest.cs @@ -70,7 +70,7 @@ namespace OpenSim.Data.Tests reg.Uuid = regionUUID; reg.RegionName = regionName; - db.AddProfile(reg); + db.StoreProfile(reg); return reg; } @@ -120,7 +120,7 @@ namespace OpenSim.Data.Tests RegionProfileData retreg = db.GetProfileByUUID(region2); retreg.regionName = "Gotham City"; - db.UpdateProfile(retreg); + db.StoreProfile(retreg); retreg = db.GetProfileByUUID(region2); Assert.That(retreg.RegionName, Is.EqualTo("Gotham City"), "Assert.That(retreg.RegionName, Is.EqualTo(\"Gotham City\"))"); @@ -135,13 +135,13 @@ namespace OpenSim.Data.Tests retreg.RegionName = "Gotham Town"; retreg.Uuid = region1; - db.AddProfile(retreg); + db.StoreProfile(retreg); retreg = db.GetProfileByUUID(region2); retreg.RegionName = "Gothan Town"; retreg.Uuid = region3; - db.AddProfile(retreg); + db.StoreProfile(retreg); List listreg = db.GetRegionsByName("Gotham",10); diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs index c9f5236f88..7f1c7e975b 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs @@ -184,7 +184,7 @@ namespace OpenSim.Framework.Communications.Cache // Commented out for now. The implementation needs to be improved by protecting against race conditions, // probably by making sure that the update doesn't use the UserCacheInfo.UserProfile directly (possibly via // returning a read only class from the cache). -// public bool UpdateProfile(UserProfileData userProfile) +// public bool StoreProfile(UserProfileData userProfile) // { // lock (m_userProfilesById) // { diff --git a/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs b/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs index 670c9ff368..933fa12bc2 100644 --- a/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs +++ b/OpenSim/Framework/Communications/Tests/Cache/UserProfileCacheServiceTests.cs @@ -110,14 +110,14 @@ namespace OpenSim.Framework.Communications.Tests IUserDataPlugin userDataPlugin = commsManager.UserDataPlugin; // Check that we can't update info before it exists - Assert.That(userCacheService.UpdateProfile(newProfile), Is.False); + Assert.That(userCacheService.StoreProfile(newProfile), Is.False); Assert.That(userDataPlugin.GetUserByUUID(userId), Is.Null); // Check that we can update a profile once it exists LocalUserServices lus = (LocalUserServices)commsManager.UserService; lus.AddUser(firstName, originalLastName, "pingu", "ted@excellentadventure.com", 1000, 1000, userId); - Assert.That(userCacheService.UpdateProfile(newProfile), Is.True); + Assert.That(userCacheService.StoreProfile(newProfile), Is.True); UserProfileData retrievedProfile = userCacheService.GetUserDetails(userId).UserProfile; Assert.That(retrievedProfile.SurName, Is.EqualTo(newLastName)); Assert.That(userDataPlugin.GetUserByUUID(userId).SurName, Is.EqualTo(newLastName)); diff --git a/OpenSim/Grid/GridServer.Modules/GridDBService.cs b/OpenSim/Grid/GridServer.Modules/GridDBService.cs index caa2c10c62..fd5a09abaa 100644 --- a/OpenSim/Grid/GridServer.Modules/GridDBService.cs +++ b/OpenSim/Grid/GridServer.Modules/GridDBService.cs @@ -206,11 +206,11 @@ namespace OpenSim.Grid.GridServer.Modules { if (existingSim == null) { - insertResponse = plugin.AddProfile(sim); + insertResponse = plugin.StoreProfile(sim); } else { - insertResponse = plugin.UpdateProfile(sim); + insertResponse = plugin.StoreProfile(sim); } } catch (Exception e) @@ -259,7 +259,7 @@ namespace OpenSim.Grid.GridServer.Modules if ((reserveData != null && reserveData.gridRecvKey == theSim.regionRecvKey) || (reserveData == null && authkeynode.InnerText != theSim.regionRecvKey)) { - plugin.AddProfile(theSim); + plugin.StoreProfile(theSim); m_log.Info("[grid]: New sim added to grid (" + theSim.regionName + ")"); logToDB(theSim.ToString(), "RestSetSimMethod", String.Empty, 5, "Region successfully updated and connected to grid."); diff --git a/OpenSim/Tests/Common/Mock/TestAssetDataPlugin.cs b/OpenSim/Tests/Common/Mock/TestAssetDataPlugin.cs index 8ab72dc55c..3981fe9bf1 100644 --- a/OpenSim/Tests/Common/Mock/TestAssetDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/TestAssetDataPlugin.cs @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; using System.Collections.Generic; using OpenMetaverse; using OpenSim.Framework; @@ -46,6 +47,18 @@ namespace OpenSim.Tests.Common.Mock public void Initialise(string connect) {} public void Dispose() {} + private readonly List assets = new List(); + + public AssetBase GetAsset(UUID uuid) + { + return assets.Find(x=>x.FullID == uuid); + } + + public void StoreAsset(AssetBase asset) + { + assets.Add(asset); + } + public List FetchAssetMetadataSet(int start, int count) { return new List(count); } } } \ No newline at end of file From 6e35ddb0e9642e6719d5043da99d45f8885d13f0 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 19 Aug 2009 16:15:04 -0700 Subject: [PATCH 16/51] Fixes GetItem and GetFolder for SQLite. Turns out some methods were no-op in SQlite. Fixes most grief in http://opensimulator.org/mantis/view.php?id=4035 http://opensimulator.org/mantis/view.php?id=4027 --- OpenSim/Data/SQLite/SQLiteInventoryStore.cs | 4 ++-- .../Inventory/LocalInventoryServiceConnector.cs | 6 +++--- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 4 ++-- OpenSim/Services/InventoryService/InventoryService.cs | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/OpenSim/Data/SQLite/SQLiteInventoryStore.cs b/OpenSim/Data/SQLite/SQLiteInventoryStore.cs index e5f7a500ee..64591fd6f6 100644 --- a/OpenSim/Data/SQLite/SQLiteInventoryStore.cs +++ b/OpenSim/Data/SQLite/SQLiteInventoryStore.cs @@ -628,12 +628,12 @@ namespace OpenSim.Data.SQLite public InventoryItemBase queryInventoryItem(UUID itemID) { - return null; + return getInventoryItem(itemID); } public InventoryFolderBase queryInventoryFolder(UUID folderID) { - return null; + return getInventoryFolder(folderID); } /// diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index 562c5dd91f..e6edcf2cef 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -191,7 +191,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public override Dictionary GetSystemFolders(UUID userID) { - InventoryFolderBase root = GetRootFolder(userID); + InventoryFolderBase root = m_InventoryService.GetRootFolder(userID); if (root != null) { InventoryCollection content = GetFolderContent(userID, root.ID); @@ -202,13 +202,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown)) { - m_log.InfoFormat("[INVENTORY CONNECTOR]: folder type {0} ", folder.Type); + //m_log.InfoFormat("[INVENTORY CONNECTOR]: folder type {0} ", folder.Type); folders[(AssetType)folder.Type] = folder; } } // Put the root folder there, as type Folder folders[AssetType.Folder] = root; - m_log.InfoFormat("[INVENTORY CONNECTOR]: root folder is type {0} ", root.Type); + //m_log.InfoFormat("[INVENTORY CONNECTOR]: root folder is type {0} ", root.Type); return folders; } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index a119efcf55..a9d361b072 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -179,8 +179,8 @@ namespace OpenSim.Region.Framework.Scenes else { m_log.ErrorFormat( - "[AGENT INVENTORY]: Could not resolve user {0} for caps inventory update", - remoteClient.AgentId); + "[AGENT INVENTORY]: Could not find item {0} for caps inventory update", + itemID); } return UUID.Zero; diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs index e0217f6ede..63102547f5 100644 --- a/OpenSim/Services/InventoryService/InventoryService.cs +++ b/OpenSim/Services/InventoryService/InventoryService.cs @@ -420,16 +420,16 @@ namespace OpenSim.Services.InventoryService public virtual InventoryItemBase GetItem(InventoryItemBase item) { - InventoryItemBase result = m_Database.queryInventoryItem(item.ID); + InventoryItemBase result = m_Database.getInventoryItem(item.ID); if (result != null) return result; - + m_log.DebugFormat("[INVENTORY SERVICE]: GetItem failed to find item {0}", item.ID); return null; } public virtual InventoryFolderBase GetFolder(InventoryFolderBase item) { - InventoryFolderBase result = m_Database.queryInventoryFolder(item.ID); + InventoryFolderBase result = m_Database.getInventoryFolder(item.ID); if (result != null) return result; From 948c7ea20b1e33ee3f3aceb87fff731ddbb3bf0e Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 19 Aug 2009 18:08:20 -0700 Subject: [PATCH 17/51] Commented T021_TestCrossToNewRegion because (1) it can fail on panda, and (2) it is not a meaningful representation of region crossing. --- .../Region/Framework/Scenes/Tests/ScenePresenceTests.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs index ce6f3d6b5b..3ee60072a3 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs @@ -225,7 +225,14 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered"); } - [Test] + // I'm commenting this test because it does not represent + // crossings. The Thread.Sleep's in here are not meaningful mocks, + // and they sometimes fail in panda. + // We need to talk in order to develop a test + // that really tests region crossings. There are 3 async components, + // but things are synchronous among them. So there should be + // 3 threads in here. + //[Test] public void T021_TestCrossToNewRegion() { TestHelper.InMethod(); From 1604c9d19e12602608dbb402382cde8302185efd Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 20 Aug 2009 10:14:53 -0700 Subject: [PATCH 18/51] One more place fixed for setting the inventory folder owner. Thanks jhurliman. --- OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 77b980c1e0..d722e2368b 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -519,7 +519,7 @@ namespace OpenSim.Region.Framework.Scenes // m_log.DebugFormat( // "[AGENT INVENTORY]: Updating inventory folder {0} {1} for {2} {3}", folderID, name, remoteClient.Name, remoteClient.AgentId); - InventoryFolderBase folder = new InventoryFolderBase(folderID); + InventoryFolderBase folder = new InventoryFolderBase(folderID, remoteClient.AgentId); folder = InventoryService.GetFolder(folder); if (folder != null) { From ae2ceda479a2b223189b5eecedc46798e1152fcd Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Wed, 19 Aug 2009 12:41:57 -0700 Subject: [PATCH 19/51] * Only update TextureEntry in AvatarAppearance if the incoming XML-RPC has a valid TextureEntry. About half the time update_avatar_appearance calls are made, the TextureEntry is empty --- OpenSim/Framework/AvatarAppearance.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 7270f32646..1fb01ba1c5 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -503,7 +503,14 @@ namespace OpenSim.Framework Owner = new UUID((string)h["owner"]); Serial = Convert.ToInt32((string)h["serial"]); VisualParams = (byte[])h["visual_params"]; - Texture = new Primitive.TextureEntry((byte[])h["texture"], 0, ((byte[])h["texture"]).Length); + + if (h.Contains("texture")) + { + byte[] te = h["texture"] as byte[]; + if (te != null && te.Length > 0) + Texture = new Primitive.TextureEntry(te, 0, te.Length); + } + AvatarHeight = (float)Convert.ToDouble((string)h["avatar_height"]); m_wearables = new AvatarWearable[MAX_WEARABLES]; From 4c8bcd2ff63cfbc38f6c1df4f22c0c019da5af1d Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 20 Aug 2009 20:19:08 +0100 Subject: [PATCH 20/51] Add some output (at DEBUG level) to the message transfer module to aid in tracking down an initialization failure. --- .../Avatar/InstantMessage/MessageTransferModule.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs index 5e7cf4b1c9..4495303038 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs @@ -56,7 +56,10 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage if (cnf != null && cnf.GetString( "MessageTransferModule", "MessageTransferModule") != "MessageTransferModule") + { + m_log.Debug("[MESSAGE TRANSFER]: Disabled by configuration"); return; + } cnf = config.Configs["Startup"]; if (cnf != null) @@ -72,6 +75,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage "grid_instant_message", processXMLRPCGridInstantMessage); } + m_log.Debug("[MESSAGE TRANSFER]: Message transfer module active"); scene.RegisterModuleInterface(this); m_Scenes.Add(scene); } From 297393f349d6529549f78142f426d95f2fdf0b90 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 20 Aug 2009 21:05:00 +0100 Subject: [PATCH 21/51] Remove a load-order dependency in inventory transfer that was biting Windows users --- .../Inventory/Transfer/InventoryTransferModule.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 5afbf686e1..75976e2fb4 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs @@ -67,13 +67,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer if (!m_Scenelist.Contains(scene)) { - if (m_Scenelist.Count == 0) - { - m_TransferModule = scene.RequestModuleInterface(); - if (m_TransferModule == null) - m_log.Error("[INVENTORY TRANSFER] No Message transfer module found, transfers will be local only"); - } - m_Scenelist.Add(scene); scene.RegisterModuleInterface(this); @@ -86,6 +79,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer public void PostInitialise() { + if (m_Scenelist.Count > 0) + { + m_TransferModule = m_Scenelist[0].RequestModuleInterface(); + if (m_TransferModule == null) + m_log.Error("[INVENTORY TRANSFER] No Message transfer module found, transfers will be local only"); + } } public void Close() From b23160a871fe6a28105d39c9602c35cda75efe4a Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 20 Aug 2009 21:45:49 +0100 Subject: [PATCH 22/51] Remove the AssetInventory server from core. It has fallen behind both upstream and the reference implementation to the point where it is no longer usable. It has no known users, and sinnce it doesn't work anymore, it is safe to assume that no one has used it in a long time. --- .../AssetInventoryConfig.cs | 98 -- .../AssetInventoryServer.cs | 216 ---- .../Grid/AssetInventoryServer/Interfaces.cs | 143 --- .../AssetInventoryServer/InventoryObjects.cs | 139 --- OpenSim/Grid/AssetInventoryServer/Main.cs | 62 - .../Plugins/AuthorizeAllPlugin.cs | 105 -- .../Plugins/BrowseFrontendPlugin.cs | 173 --- .../Plugins/InventoryArchivePlugin.cs | 211 ---- .../Plugins/NullAuthenticationPlugin.cs | 95 -- .../Plugins/NullMetricsPlugin.cs | 151 --- .../OpenSim/OpenSimAssetFrontendPlugin.cs | 198 ---- .../OpenSim/OpenSimAssetStoragePlugin.cs | 189 --- .../OpenSim/OpenSimInventoryFrontendPlugin.cs | 867 -------------- .../OpenSim/OpenSimInventoryService.cs | 56 - .../OpenSim/OpenSimInventoryStoragePlugin.cs | 547 --------- ...setInventoryServerOpenSimPlugins.addin.xml | 27 - .../Plugins/ReferenceFrontendPlugin.cs | 369 ------ .../AssetInventoryServerPlugins.addin.xml | 28 - ...ssetInventoryServerSimplePlugins.addin.xml | 16 - .../Simple/SimpleAssetStoragePlugin.cs | 290 ----- .../Simple/SimpleInventoryStoragePlugin.cs | 625 ---------- .../Plugins/Simple/SimpleUtils.cs | 71 -- OpenSim/Grid/AssetInventoryServer/Utils.cs | 1031 ----------------- prebuild.xml | 122 -- 24 files changed, 5829 deletions(-) delete mode 100644 OpenSim/Grid/AssetInventoryServer/AssetInventoryConfig.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/AssetInventoryServer.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Interfaces.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/InventoryObjects.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Main.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/AuthorizeAllPlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/InventoryArchivePlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/NullAuthenticationPlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/NullMetricsPlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryFrontendPlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryService.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryStoragePlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/Resources/AssetInventoryServerOpenSimPlugins.addin.xml delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/Simple/Resources/AssetInventoryServerSimplePlugins.addin.xml delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleAssetStoragePlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleInventoryStoragePlugin.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleUtils.cs delete mode 100644 OpenSim/Grid/AssetInventoryServer/Utils.cs diff --git a/OpenSim/Grid/AssetInventoryServer/AssetInventoryConfig.cs b/OpenSim/Grid/AssetInventoryServer/AssetInventoryConfig.cs deleted file mode 100644 index 79b6c73505..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/AssetInventoryConfig.cs +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.IO; -using System.Reflection; -using OpenSim.Framework; -using log4net; -using Nini.Config; - -namespace OpenSim.Grid.AssetInventoryServer -{ - public static class AssetInventoryConfig - { - public const string CONFIG_FILE = "AssetInventoryServer.ini"; - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - public static IConfigSource LoadConfig() - { - IConfigSource configSource = new IniConfigSource(); - configSource.AddConfig("Startup"); - return LoadConfig(configSource); - } - - public static IConfigSource LoadConfig(IConfigSource source) - { - string iniFileName = source.Configs["Startup"].GetString("inifile", CONFIG_FILE); - string iniFilePath = Path.Combine(Util.configDir(), iniFileName); - - source.Merge(DefaultConfig()); - - if (!File.Exists(iniFilePath)) - { - m_log.FatalFormat("[CONFIG]: File {0} not found, could not load any configuration.", iniFilePath); - m_log.FatalFormat("[CONFIG]: Did you copy the AssetInventoryServer.ini.example file to AssetInventoryServer.ini?"); - Environment.Exit(1); - } - - source.Merge(new IniConfigSource(iniFilePath)); - return source; - } - - private static IConfigSource DefaultConfig() - { - IConfigSource result = new IniConfigSource(); - - { - IConfig config = result.AddConfig("Config"); - config.Set("listen_port", 8003); - config.Set("assetset_location", String.Format(".{0}assets{0}AssetSets.xml", Path.DirectorySeparatorChar)); - } - - { - IConfig config = result.AddConfig("Plugins"); - config.Set("asset_storage_provider", "OpenSimAssetStorage"); - config.Set("inventory_storage_provider", "OpenSimInventoryStorage"); - config.Set("authentication_provider", "NullAuthentication"); - config.Set("authorization_provider", "AuthorizeAll"); - config.Set("metrics_provider", "NullMetrics"); - config.Set("frontends", "ReferenceFrontend,OpenSimAssetFrontend,OpenSimInventoryFrontend,BrowseFrontend"); - } - - { - IConfig config = result.AddConfig("OpenSim"); - config.Set("asset_database_provider", "OpenSim.Data.MySQL.dll"); - config.Set("inventory_database_provider", "OpenSim.Data.MySQL.dll"); - config.Set("asset_database_connect", String.Empty); - config.Set("inventory_database_connect", String.Empty); - } - - return result; - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/AssetInventoryServer.cs b/OpenSim/Grid/AssetInventoryServer/AssetInventoryServer.cs deleted file mode 100644 index 16b9d9e012..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/AssetInventoryServer.cs +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Reflection; -using OpenSim.Framework; -using OpenSim.Framework.Servers; -using OpenSim.Framework.Servers.HttpServer; -using OpenSim.Framework.Console; -using OpenSim.Framework.AssetLoader.Filesystem; -using Nini.Config; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer -{ - public class AssetInventoryServer : BaseOpenSimServer - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - public IConfigSource ConfigFile; - - public IAssetStorageProvider StorageProvider; - public IInventoryStorageProvider InventoryProvider; - public IAuthenticationProvider AuthenticationProvider; - public IAuthorizationProvider AuthorizationProvider; - public IMetricsProvider MetricsProvider; - - private List m_frontends = new List(); - private List m_backends = new List(); - - public AssetInventoryServer(IConfigSource config) - { - ConfigFile = config; - - m_console = new LocalConsole("AssetInventory"); - MainConsole.Instance = m_console; - } - - public bool Start() - { - Startup(); - m_log.Info("[ASSETINVENTORY]: Starting AssetInventory Server"); - - try - { - ConfigFile = AssetInventoryConfig.LoadConfig(ConfigFile); - } - catch (Exception) - { - m_log.Error("[ASSETINVENTORY]: Failed to load the config."); - return false; - } - - StorageProvider = LoadAssetInventoryServerPlugin("/OpenSim/AssetInventoryServer/AssetStorageProvider", - "asset_storage_provider", false) as IAssetStorageProvider; - m_backends.Add(StorageProvider); - - InventoryProvider = LoadAssetInventoryServerPlugin("/OpenSim/AssetInventoryServer/InventoryStorageProvider", - "inventory_storage_provider", false) as IInventoryStorageProvider; - m_backends.Add(InventoryProvider); - - MetricsProvider = LoadAssetInventoryServerPlugin("/OpenSim/AssetInventoryServer/MetricsProvider", - "metrics_provider", false) as IMetricsProvider; - m_backends.Add(MetricsProvider); - - try - { - InitHttpServer((uint) ConfigFile.Configs["Config"].GetInt("listen_port")); - } - catch (Exception ex) - { - m_log.Error("[ASSETINVENTORY]: Initializing the HTTP server failed, shutting down: " + ex.Message); - Shutdown(); - return false; - } - - LoadDefaultAssets(); - - AuthenticationProvider = LoadAssetInventoryServerPlugin("/OpenSim/AssetInventoryServer/AuthenticationProvider", - "authentication_provider", false) as IAuthenticationProvider; - m_backends.Add(AuthenticationProvider); - - AuthorizationProvider = LoadAssetInventoryServerPlugin("/OpenSim/AssetInventoryServer/AuthorizationProvider", - "authorization_provider", false) as IAuthorizationProvider; - m_backends.Add(AuthorizationProvider); - - m_frontends.AddRange(LoadAssetInventoryServerPlugins("/OpenSim/AssetInventoryServer/Frontend", "frontends")); - - // Inform the user if we don't have any frontends at this point. - if (m_frontends.Count == 0) - m_log.Info("[ASSETINVENTORY]: Starting with no frontends loaded, which isn't extremely useful. Did you set the 'frontends' configuration parameter?"); - - return true; - } - - public void Work() - { - m_console.Output("Enter help for a list of commands"); - - while (true) - { - m_console.Prompt(); - } - } - - public override void ShutdownSpecific() - { - foreach (IAssetInventoryServerPlugin plugin in m_frontends) - { - m_log.Debug("[ASSETINVENTORY]: Disposing plugin " + plugin.Name); - try { plugin.Dispose(); } - catch (Exception ex) - { m_log.ErrorFormat("[ASSETINVENTORY]: Failure shutting down plugin {0}: {1}", plugin.Name, ex.Message); } - } - - foreach (IAssetInventoryServerPlugin plugin in m_backends) - { - m_log.Debug("[ASSETINVENTORY]: Disposing plugin " + plugin.Name); - try { plugin.Dispose(); } - catch (Exception ex) - { m_log.ErrorFormat("[ASSETINVENTORY]: Failure shutting down plugin {0}: {1}", plugin.Name, ex.Message); } - } - - if (HttpServer != null) - HttpServer.Stop(); - } - - void InitHttpServer(uint port) - { - m_httpServer = new BaseHttpServer(port); - m_httpServer.Start(); - - m_log.Info("[ASSETINVENTORY]: AssetInventory server is listening on port " + port); - } - - private IAssetInventoryServerPlugin LoadAssetInventoryServerPlugin(string addinPath, string configParam, bool optional) - { - IAssetInventoryServerPlugin result = null; - List plugins = LoadAssetInventoryServerPlugins(addinPath, configParam); - - if (plugins.Count == 1) - { - result = plugins[0]; - } - else if (plugins.Count > 1) - { - m_log.ErrorFormat("[ASSETINVENTORY]: Only 1 plugin expected for extension point '{0}', {1} plugins loaded. Check the '{2}' parameter in the config file.", - addinPath, plugins.Count, configParam); - Shutdown(); - Environment.Exit(0); - } - else if (!optional) - { - m_log.ErrorFormat("[ASSETINVENTORY]: The extension point '{0}' is not optional. Check the '{1}' parameter in the config file.", addinPath, configParam); - Shutdown(); - Environment.Exit(0); - } - - return result; - } - - private List LoadAssetInventoryServerPlugins(string addinPath, string configParam) - { - PluginLoader loader = new PluginLoader(new AssetInventoryServerPluginInitialiser(this)); - loader.Add(addinPath, new PluginIdFilter(ConfigFile.Configs["Plugins"].GetString(configParam))); - - try - { - loader.Load(); - } - catch (PluginNotInitialisedException e) - { - m_log.ErrorFormat("[ASSETINVENTORY]: Error initialising plugin '{0}' for extension point '{1}'.", e.Message, addinPath); - Shutdown(); - Environment.Exit(0); - } - - return loader.Plugins; - } - - private void LoadDefaultAssets() - { - AssetLoaderFileSystem assetLoader = new AssetLoaderFileSystem(); - assetLoader.ForEachDefaultXmlAsset(ConfigFile.Configs["Config"].GetString("assetset_location"), StoreAsset); - } - - private void StoreAsset(AssetBase asset) - { - StorageProvider.TryCreateAsset(asset); - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Interfaces.cs b/OpenSim/Grid/AssetInventoryServer/Interfaces.cs deleted file mode 100644 index e808dd3d68..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Interfaces.cs +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using OpenMetaverse; -using OpenSim.Framework; - -namespace OpenSim.Grid.AssetInventoryServer -{ - /// - /// Response from a call to a backend provider - /// - public enum BackendResponse - { - /// The call succeeded - Success, - /// The resource requested was not found - NotFound, - /// A server failure prevented the call from - /// completing - Failure - } - - public class AssetInventoryServerPluginInitialiser : PluginInitialiserBase - { - private AssetInventoryServer server; - - public AssetInventoryServerPluginInitialiser(AssetInventoryServer server) - { - this.server = server; - } - - public override void Initialise(IPlugin plugin) - { - IAssetInventoryServerPlugin p = plugin as IAssetInventoryServerPlugin; - p.Initialise (server); - } - } - - #region Interfaces - - public interface IAssetInventoryServerPlugin : IPlugin - { - void Initialise(AssetInventoryServer server); - } - - public interface IAssetStorageProvider : IAssetInventoryServerPlugin - { - BackendResponse TryFetchMetadata(UUID assetID, out AssetMetadata metadata); - BackendResponse TryFetchData(UUID assetID, out byte[] assetData); - BackendResponse TryFetchDataMetadata(UUID assetID, out AssetBase asset); - BackendResponse TryCreateAsset(AssetBase asset); - BackendResponse TryCreateAsset(AssetBase asset, out UUID assetID); - int ForEach(Action action, int start, int count); - } - - public interface IInventoryStorageProvider : IAssetInventoryServerPlugin - { - BackendResponse TryFetchItem(Uri owner, UUID itemID, out InventoryItemBase item); - BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder); - BackendResponse TryFetchFolderContents(Uri owner, UUID folderID, out InventoryCollection contents); - BackendResponse TryFetchFolderList(Uri owner, out List folders); - BackendResponse TryFetchInventory(Uri owner, out InventoryCollection inventory); - - BackendResponse TryFetchActiveGestures(Uri owner, out List gestures); - - BackendResponse TryCreateItem(Uri owner, InventoryItemBase item); - BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder); - BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder); - - BackendResponse TryDeleteItem(Uri owner, UUID itemID); - BackendResponse TryDeleteFolder(Uri owner, UUID folderID); - BackendResponse TryPurgeFolder(Uri owner, UUID folderID); - } - - public interface IAuthenticationProvider : IAssetInventoryServerPlugin - { - void AddIdentifier(UUID authToken, Uri identifier); - bool RemoveIdentifier(UUID authToken); - bool TryGetIdentifier(UUID authToken, out Uri identifier); - } - - public interface IAuthorizationProvider : IAssetInventoryServerPlugin - { - bool IsMetadataAuthorized(UUID authToken, UUID assetID); - /// - /// Authorizes access to the data for an asset. Access to asset data - /// also implies access to the metadata for that asset - /// - /// Authentication token to check for access - /// ID of the requested asset - /// True if access is granted, otherwise false - bool IsDataAuthorized(UUID authToken, UUID assetID); - bool IsCreateAuthorized(UUID authToken); - - bool IsInventoryReadAuthorized(UUID authToken, Uri owner); - bool IsInventoryWriteAuthorized(UUID authToken, Uri owner); - } - - public interface IMetricsProvider : IAssetInventoryServerPlugin - { - void LogAssetMetadataFetch(string extension, BackendResponse response, UUID assetID, DateTime time); - void LogAssetDataFetch(string extension, BackendResponse response, UUID assetID, int dataSize, DateTime time); - void LogAssetCreate(string extension, BackendResponse response, UUID assetID, int dataSize, DateTime time); - - void LogInventoryFetch(string extension, BackendResponse response, Uri owner, UUID objID, bool folder, DateTime time); - void LogInventoryFetchFolderContents(string extension, BackendResponse response, Uri owner, UUID folderID, DateTime time); - void LogInventoryFetchFolderList(string extension, BackendResponse response, Uri owner, DateTime time); - void LogInventoryFetchInventory(string extension, BackendResponse response, Uri owner, DateTime time); - void LogInventoryFetchActiveGestures(string extension, BackendResponse response, Uri owner, DateTime time); - void LogInventoryCreate(string extension, BackendResponse response, Uri owner, bool folder, DateTime time); - void LogInventoryCreateInventory(string extension, BackendResponse response, DateTime time); - void LogInventoryDelete(string extension, BackendResponse response, Uri owner, UUID objID, bool folder, DateTime time); - void LogInventoryPurgeFolder(string extension, BackendResponse response, Uri owner, UUID folderID, DateTime time); - } - - #endregion Interfaces -} diff --git a/OpenSim/Grid/AssetInventoryServer/InventoryObjects.cs b/OpenSim/Grid/AssetInventoryServer/InventoryObjects.cs deleted file mode 100644 index 4f42a20e3c..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/InventoryObjects.cs +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using OpenMetaverse; -using OpenSim.Framework; - -namespace OpenSim.Grid.AssetInventoryServer -{ - //public class InventoryBase - //{ - //} - - //public class InventoryFolder : InventoryBase - //{ - // public string Name; - // public UUID Owner; - // public UUID ParentID; - // public UUID ID; - // public short Type; - // public ushort Version; - - // [NonSerialized] - // public Dictionary Children = new Dictionary(); - - // public InventoryFolder() - // { - // } - - // public InventoryFolder(string name, UUID ownerID, UUID parentID, short assetType) - // { - // ID = UUID.Random(); - // Name = name; - // Owner = ownerID; - // ParentID = parentID; - // Type = assetType; - // Version = 1; - // } - - // public override string ToString() - // { - // return String.Format("{0} ({1})", Name, ID); - // } - //} - - //public class InventoryItem : InventoryBase - //{ - // public UUID ID; - // public int InvType; - // public UUID Folder; - // public UUID Owner; - // public UUID Creator; - // public string Name; - // public string Description; - // public uint NextPermissions; - // public uint CurrentPermissions; - // public uint BasePermissions; - // public uint EveryOnePermissions; - // public uint GroupPermissions; - // public int AssetType; - // public UUID AssetID; - // public UUID GroupID; - // public bool GroupOwned; - // public int SalePrice; - // public byte SaleType; - // public uint Flags; - // public int CreationDate; - - // public override string ToString() - // { - // return String.Format("{0} ({1})", Name, ID); - // } - //} - - public class InventoryFolderWithChildren : InventoryFolderBase - { - public InventoryFolderWithChildren() - { - } - - public InventoryFolderWithChildren(InventoryFolderBase folder) - { - // from InventoryNodeBase - Name = folder.Name; - ID = folder.ID; - Owner = folder.Owner; - - // from InventoryFolderBase - ParentID = folder.ParentID; - Type = folder.Type; - Version = folder.Version; - } - - public InventoryFolderWithChildren(string name, UUID ownerID, UUID parentID, short assetType) - { - ID = UUID.Random(); - Name = name; - Owner = ownerID; - ParentID = parentID; - Type = assetType; - Version = 1; - } - - [NonSerialized] - public Dictionary Children = new Dictionary(); - } - - public class InventoryCollection - { - public Dictionary Folders; - public Dictionary Items; - public UUID UserID; - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Main.cs b/OpenSim/Grid/AssetInventoryServer/Main.cs deleted file mode 100644 index 598b754b33..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Main.cs +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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 Nini.Config; -using log4net.Config; -using log4net; -using System.Reflection; - -namespace OpenSim.Grid.AssetInventoryServer -{ - class MainEntry - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - static void Main(string[] args) - { - XmlConfigurator.Configure(); - - ArgvConfigSource configSource = new ArgvConfigSource(args); - configSource.AddSwitch("Startup", "inifile"); - - AssetInventoryServer server = new AssetInventoryServer(configSource); - if (server.Start()) - { - Console.CancelKeyPress += - delegate(object sender, ConsoleCancelEventArgs e) - { - m_log.Info("AssetInventory server is shutting down..."); - server.Shutdown(); - Environment.Exit(0); - }; - - server.Work(); - } - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/AuthorizeAllPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/AuthorizeAllPlugin.cs deleted file mode 100644 index 3d0a283624..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/AuthorizeAllPlugin.cs +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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 OpenMetaverse; -using OpenSim.Framework; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins -{ - public class AuthorizeAllPlugin : IAuthorizationProvider - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - //private AssetInventoryServer m_server; - - public AuthorizeAllPlugin() - { - } - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - //m_server = server; - - m_log.Info("[AUTHORIZEALL]: Authorize All loaded."); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[AUTHORIZEALL]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "AuthorizeAll"; } - } - - #endregion IPlugin implementation - - public bool IsMetadataAuthorized(UUID authToken, UUID assetID) - { - return true; - } - - public bool IsDataAuthorized(UUID authToken, UUID assetID) - { - return true; - } - - public bool IsCreateAuthorized(UUID authToken) - { - return true; - } - - public bool IsInventoryReadAuthorized(UUID authToken, Uri owner) - { - return true; - } - - public bool IsInventoryWriteAuthorized(UUID authToken, Uri owner) - { - return true; - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs deleted file mode 100644 index 90ea2e01ff..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/BrowseFrontendPlugin.cs +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.IO; -using System.Reflection; -using System.Collections.Specialized; -using System.Net; -using System.Text; -using System.Web; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Framework.Servers; -using OpenSim.Framework.Servers.HttpServer; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins -{ - public class BrowseFrontendPlugin : IAssetInventoryServerPlugin - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private AssetInventoryServer m_server; - - public BrowseFrontendPlugin() - { - } - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - m_server = server; - - // Request for / or /?... - m_server.HttpServer.AddStreamHandler(new BrowseRequestHandler(server)); - - m_log.Info("[BROWSEFRONTEND]: Browser Frontend loaded."); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[BROWSEFRONTEND]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "BrowseFrontend"; } - } - - #endregion IPlugin implementation - - public class BrowseRequestHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public BrowseRequestHandler(AssetInventoryServer server) : base("GET", "(^/$|(^/\?.*)") - public BrowseRequestHandler(AssetInventoryServer server) : base("GET", "/") - { - m_server = server; - } - - public override string ContentType - { - get { return "text/html"; } - } - - #region IStreamedRequestHandler implementation - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - const int ASSETS_PER_PAGE = 25; - const string HEADER = "Asset Server"; - const string TABLE_HEADER = - ""; - const string TABLE_FOOTER = "
NameDescriptionTypeIDTemporarySHA-1
"; - const string FOOTER = ""; - - UUID authToken = Utils.GetAuthToken(httpRequest); - - StringBuilder html = new StringBuilder(); - int start = 0; - uint page = 0; - - if (!String.IsNullOrEmpty(httpRequest.Url.Query)) - { - NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query); - if (!String.IsNullOrEmpty(query["page"]) && UInt32.TryParse(query["page"], out page)) - start = (int)page * ASSETS_PER_PAGE; - } - - html.AppendLine(HEADER); - - html.AppendLine("

"); - if (page > 0) - html.AppendFormat("< Previous Page | ", httpRequest.RawUrl, page - 1); - html.AppendFormat("Next Page >", httpRequest.RawUrl, page + 1); - html.AppendLine("

"); - - html.AppendLine(TABLE_HEADER); - - m_server.StorageProvider.ForEach( - delegate(AssetMetadata data) - { - if (m_server.AuthorizationProvider.IsMetadataAuthorized(authToken, data.FullID)) - { - html.AppendLine(String.Format( - "{0}{1}{2}{3}{4}{5}", - data.Name, data.Description, data.ContentType, data.ID, data.Temporary, - BitConverter.ToString(data.SHA1).Replace("-", String.Empty))); - } - else - { - html.AppendLine(String.Format( - "[Protected Asset]  {0}{1} ", - data.ID, data.Temporary)); - } - }, start, ASSETS_PER_PAGE - ); - - html.AppendLine(TABLE_FOOTER); - - html.AppendLine(FOOTER); - - byte[] responseData = System.Text.Encoding.UTF8.GetBytes(html.ToString()); - - httpResponse.StatusCode = (int) HttpStatusCode.OK; - //httpResponse.Body.Write(responseData, 0, responseData.Length); - //httpResponse.Body.Flush(); - return responseData; - } - - #endregion IStreamedRequestHandler implementation - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/InventoryArchivePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/InventoryArchivePlugin.cs deleted file mode 100644 index 83234501e1..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/InventoryArchivePlugin.cs +++ /dev/null @@ -1,211 +0,0 @@ -/* - * 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.Net; -using System.IO; -using System.IO.Compression; -using System.Xml; -using System.Reflection; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Framework.Serialization; -using OpenSim.Framework.Serialization.External; -using OpenSim.Framework.Servers; -using OpenSim.Framework.Servers.HttpServer; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins -{ - public class InventoryArchivePlugin : IAssetInventoryServerPlugin - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private AssetInventoryServer m_server; - - public InventoryArchivePlugin() - { - } - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - m_server = server; - - m_server.HttpServer.AddStreamHandler(new GetInventoryArchive(server)); - - m_log.Info("[INVENTORYARCHIVE]: Inventory Archive loaded."); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[INVENTORYARCHIVE]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "InventoryArchive"; } - } - - #endregion IPlugin implementation - - public class GetInventoryArchive : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public GetInventoryArchive(AssetInventoryServer server) : base("GET", @"^/inventoryarchive/") - public GetInventoryArchive(AssetInventoryServer server) : base("GET", "/inventoryarchive") - { - m_server = server; - } - - public override string ContentType - { - get { return "application/x-compressed"; } - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - byte[] buffer = new byte[] {}; - UUID ownerID; - // Split the URL up to get the asset ID out - string[] rawUrl = httpRequest.Url.PathAndQuery.Split('/'); - - if (rawUrl.Length >= 3 && rawUrl[2].Length >= 36 && UUID.TryParse(rawUrl[2].Substring(0, 36), out ownerID)) - { - Uri owner = Utils.GetOpenSimUri(ownerID); - InventoryCollection inventory; - BackendResponse storageResponse = m_server.InventoryProvider.TryFetchInventory(owner, out inventory); - - if (storageResponse == BackendResponse.Success) - { - m_log.DebugFormat("[INVENTORYARCHIVE]: Archiving inventory for user UUID {0}", ownerID); - buffer = ArchiveInventoryCollection(inventory); - httpResponse.StatusCode = (int) HttpStatusCode.OK; - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - } - } - else - { - m_log.Warn("[INVENTORYARCHIVE]: Unrecognized inventory archive request: " + httpRequest.Url.PathAndQuery); - } - - return buffer; - } - } - - private static byte[] ArchiveInventoryCollection(InventoryCollection inventory) - { - byte[] buffer = new byte[] {}; - - // Fill in each folder's Children dictionary. - InventoryFolderWithChildren rootFolder = BuildInventoryHierarchy(ref inventory); - - // TODO: It's probably a bad idea to tar to memory for large - // inventories. - MemoryStream ms = new MemoryStream(); - GZipStream gzs = new GZipStream(ms, CompressionMode.Compress, true); - TarArchiveWriter archive = new TarArchiveWriter(gzs); - WriteInventoryFolderToArchive(archive, rootFolder, ArchiveConstants.INVENTORY_PATH); - - archive.Close(); - - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int) ms.Length); - ms.Close(); - return buffer; - } - - private static InventoryFolderWithChildren BuildInventoryHierarchy(ref InventoryCollection inventory) - { - m_log.DebugFormat("[INVENTORYARCHIVE]: Building inventory hierarchy"); - InventoryFolderWithChildren rootFolder = null; - - foreach (InventoryFolderWithChildren parentFolder in inventory.Folders.Values) - { - // Grab the root folder, it has no parents. - if (UUID.Zero == parentFolder.ParentID) rootFolder = parentFolder; - - foreach (InventoryFolderWithChildren folder in inventory.Folders.Values) - if (parentFolder.ID == folder.ParentID) - parentFolder.Children.Add(folder.ID, folder); - - foreach (InventoryItemBase item in inventory.Items.Values) - if (parentFolder.ID == item.Folder) - parentFolder.Children.Add(item.ID, item); - } - - return rootFolder; - } - - private static void WriteInventoryFolderToArchive( - TarArchiveWriter archive, InventoryFolderWithChildren folder, string path) - { - path += string.Format("{0}{1}{2}/", folder.Name, ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, folder.ID); - archive.WriteDir(path); - - foreach (InventoryNodeBase inventoryNode in folder.Children.Values) - { - if (inventoryNode is InventoryFolderWithChildren) - { - WriteInventoryFolderToArchive(archive, (InventoryFolderWithChildren) inventoryNode, path); - } - else if (inventoryNode is InventoryItemBase) - { - WriteInventoryItemToArchive(archive, (InventoryItemBase) inventoryNode, path); - } - } - } - - private static void WriteInventoryItemToArchive(TarArchiveWriter archive, InventoryItemBase item, string path) - { - string filename = string.Format("{0}{1}_{2}.xml", path, item.Name, item.ID); - string serialization = UserInventoryItemSerializer.Serialize(item); - archive.WriteFile(filename, serialization); - - //m_assetGatherer.GatherAssetUuids(item.AssetID, (AssetType) item.AssetType, assetUuids); - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/NullAuthenticationPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/NullAuthenticationPlugin.cs deleted file mode 100644 index 026b3c8f6a..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/NullAuthenticationPlugin.cs +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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 OpenMetaverse; -using OpenSim.Framework; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins -{ - public class NullAuthenticationPlugin : IAuthenticationProvider - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - //private AssetInventoryServer m_server; - - public NullAuthenticationPlugin() - { - } - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - //m_server = server; - - m_log.Info("[NULLAUTHENTICATION]: Null Authentication loaded."); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[NULLAUTHENTICATION]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "NullAuthentication"; } - } - - #endregion IPlugin implementation - - public void AddIdentifier(UUID authToken, Uri identifier) - { - } - - public bool RemoveIdentifier(UUID authToken) - { - return true; - } - - public bool TryGetIdentifier(UUID authToken, out Uri identifier) - { - identifier = null; - return true; - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/NullMetricsPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/NullMetricsPlugin.cs deleted file mode 100644 index 8cde8f4971..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/NullMetricsPlugin.cs +++ /dev/null @@ -1,151 +0,0 @@ -/* - * 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 OpenMetaverse; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins -{ - public class NullMetricsPlugin : IMetricsProvider - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - //private AssetInventoryServer m_server; - - public NullMetricsPlugin() - { - } - - #region IMetricsProvider implementation - - public void LogAssetMetadataFetch(string extension, BackendResponse response, UUID assetID, DateTime time) - { - m_log.DebugFormat("[{0}]: AssetMetadataFetch(): AssetID: {1}, Response: {2}", extension, assetID, response); - } - - public void LogAssetDataFetch(string extension, BackendResponse response, UUID assetID, int dataSize, DateTime time) - { - m_log.DebugFormat("[{0}]: AssetDataFetch(): AssetID: {1}, DataSize: {2}, Response: {3}", extension, assetID, - dataSize, response); - } - - public void LogAssetCreate(string extension, BackendResponse response, UUID assetID, int dataSize, DateTime time) - { - m_log.DebugFormat("[{0}]: AssetCreate(): AssetID: {1}, DataSize: {2}, Response: {3}", extension, assetID, - dataSize, response); - } - - public void LogInventoryFetch(string extension, BackendResponse response, Uri owner, UUID objID, bool folder, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryFetch(): ObjID: {1}, Folder: {2}, OwnerID: {3}, Response: {4}", extension, - objID, folder, owner, response); - } - - public void LogInventoryFetchFolderContents(string extension, BackendResponse response, Uri owner, UUID folderID, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryFetchFolderContents(): FolderID: {1}, OwnerID: {2}, Response: {3}", extension, - folderID, owner, response); - } - - public void LogInventoryFetchFolderList(string extension, BackendResponse response, Uri owner, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryFetchFolderList(): OwnerID: {1}, Response: {2}", extension, - owner, response); - } - - public void LogInventoryFetchInventory(string extension, BackendResponse response, Uri owner, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryFetchInventory(): OwnerID: {1}, Response: {2}", extension, - owner, response); - } - - public void LogInventoryFetchActiveGestures(string extension, BackendResponse response, Uri owner, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryFetchActiveGestures(): OwnerID: {1}, Response: {2}", extension, - owner, response); - } - - public void LogInventoryCreate(string extension, BackendResponse response, Uri owner, bool folder, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryCreate(): OwnerID: {1}, Response: {2}", extension, - owner, response); - } - - public void LogInventoryCreateInventory(string extension, BackendResponse response, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryCreateInventory(): Response: {1}", extension, - response); - } - - public void LogInventoryDelete(string extension, BackendResponse response, Uri owner, UUID objID, bool folder, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryDelete(): OwnerID: {1}, Folder: {2}, Response: {3}", extension, - owner, folder, response); - } - - public void LogInventoryPurgeFolder(string extension, BackendResponse response, Uri owner, UUID folderID, DateTime time) - { - m_log.DebugFormat("[{0}]: InventoryPurgeFolder(): OwnerID: {1}, FolderID: {2}, Response: {3}", extension, - owner, folderID, response); - } - - #endregion IMetricsProvider implementation - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - //m_server = server; - } - - /// - /// Initialises metrics interface - /// - public void Initialise() - { - m_log.Info("[NULLMETRICS]: Null metrics loaded."); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "NullMetrics"; } - } - - #endregion IPlugin implementation - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs deleted file mode 100644 index e4be55ed89..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetFrontendPlugin.cs +++ /dev/null @@ -1,198 +0,0 @@ -/* - * 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 System.Net; -using System.IO; -using System.Text; -using System.Xml; -using System.Xml.Serialization; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Framework.Servers; -using OpenSim.Framework.Servers.HttpServer; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim -{ - public class OpenSimAssetFrontendPlugin : IAssetInventoryServerPlugin - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private AssetInventoryServer m_server; - - public OpenSimAssetFrontendPlugin() - { - } - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - m_server = server; - - // Asset request - m_server.HttpServer.AddStreamHandler(new AssetRequestHandler(server)); - - // Asset creation - m_server.HttpServer.AddStreamHandler(new AssetPostHandler(server)); - - m_log.Info("[OPENSIMASSETFRONTEND]: OpenSim Asset Frontend loaded."); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[OPENSIMASSETFRONTEND]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "OpenSimAssetFrontend"; } - } - - #endregion IPlugin implementation - - public class AssetRequestHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public AssetRequestHandler(AssetInventoryServer server) : base("GET", "^/assets") - public AssetRequestHandler(AssetInventoryServer server) : base("GET", "/assets") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - byte[] buffer = new byte[] {}; - UUID assetID; - // Split the URL up to get the asset ID out - string[] rawUrl = httpRequest.Url.PathAndQuery.Split('/'); - - if (rawUrl.Length >= 3 && rawUrl[2].Length >= 36 && UUID.TryParse(rawUrl[2].Substring(0, 36), out assetID)) - { - BackendResponse dataResponse; - - AssetBase asset = new AssetBase(); - if ((dataResponse = m_server.StorageProvider.TryFetchDataMetadata(assetID, out asset)) == BackendResponse.Success) - { - if (rawUrl.Length >= 4 && rawUrl[3] == "data") - { - httpResponse.StatusCode = (int)HttpStatusCode.OK; - httpResponse.ContentType = Utils.SLAssetTypeToContentType(asset.Type); - buffer=asset.Data; - } - else - { - XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); - MemoryStream ms = new MemoryStream(); - XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8); - xs.Serialize(xw, asset); - xw.Flush(); - - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int)ms.Length); - ms.Close(); - httpResponse.StatusCode = (int)HttpStatusCode.OK; - } - } - else - { - m_log.WarnFormat("[OPENSIMASSETFRONTEND]: Failed to fetch asset data or metadata for {0}: {1}", assetID, dataResponse); - httpResponse.StatusCode = (int) HttpStatusCode.NotFound; - } - } - else - { - m_log.Warn("[OPENSIMASSETFRONTEND]: Unrecognized OpenSim asset request: " + httpRequest.Url.PathAndQuery); - } - - return buffer; - } - } - - public class AssetPostHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public AssetPostHandler(AssetInventoryServer server) : base("POST", "/^assets") - public AssetPostHandler(AssetInventoryServer server) : base("POST", "/assets") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - AssetBase asset = null; - - try - { - asset = (AssetBase) new XmlSerializer(typeof (AssetBase)).Deserialize(httpRequest.InputStream); - } - catch (Exception ex) - { - m_log.Warn("[OPENSIMASSETFRONTEND]: Failed to parse POST data (expecting AssetBase): " + ex.Message); - httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; - } - - if (asset != null && asset.Data != null && asset.Data.Length > 0) - { - BackendResponse storageResponse = m_server.StorageProvider.TryCreateAsset(asset); - - if (storageResponse == BackendResponse.Success) - httpResponse.StatusCode = (int) HttpStatusCode.Created; - else if (storageResponse == BackendResponse.NotFound) - httpResponse.StatusCode = (int) HttpStatusCode.NotFound; - else - httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - } - else - { - m_log.Warn("[OPENSIMASSETFRONTEND]: AssetPostHandler called with no asset data"); - httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; - } - - return new byte[] {}; - } - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs deleted file mode 100644 index 92ac84f85f..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimAssetStoragePlugin.cs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * 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 System.Data; -using System.Collections.Generic; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Data; -using Nini.Config; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim -{ - public class OpenSimAssetStoragePlugin : IAssetStorageProvider - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - const string EXTENSION_NAME = "OpenSimAssetStorage"; // Used in metrics reporting - - private AssetInventoryServer m_server; - private IAssetDataPlugin m_assetProvider; - private IConfig m_openSimConfig; - - public OpenSimAssetStoragePlugin() - { - } - - #region IAssetStorageProvider implementation - - public BackendResponse TryFetchMetadata(UUID assetID, out AssetMetadata metadata) - { - metadata = null; - BackendResponse ret; - - AssetBase asset = m_assetProvider.GetAsset(assetID); - - if (asset == null) ret = BackendResponse.NotFound; - else - { - metadata = asset.Metadata; - ret = BackendResponse.Success; - } - - m_server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchData(UUID assetID, out byte[] assetData) - { - assetData = null; - BackendResponse ret; - - AssetBase asset = m_assetProvider.GetAsset(assetID); - - if (asset == null) ret = BackendResponse.NotFound; - else - { - assetData = asset.Data; - ret = BackendResponse.Success; - } - - m_server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (assetData != null ? assetData.Length : 0), DateTime.Now); - return ret; - } - - public BackendResponse TryFetchDataMetadata(UUID assetID, out AssetBase asset) - { - asset = m_assetProvider.GetAsset(assetID); - - if (asset == null) return BackendResponse.NotFound; - - return BackendResponse.Success; - } - - public BackendResponse TryCreateAsset(AssetBase asset, out UUID assetID) - { - assetID = asset.FullID = UUID.Random(); - return TryCreateAsset(asset); - } - - public BackendResponse TryCreateAsset(AssetBase asset) - { - BackendResponse ret; - - m_assetProvider.StoreAsset(asset); - ret = BackendResponse.Success; - - m_server.MetricsProvider.LogAssetCreate(EXTENSION_NAME, ret, asset.FullID, asset.Data.Length, DateTime.Now); - return ret; - } - - public int ForEach(Action action, int start, int count) - { - int rowCount = 0; - - foreach (AssetMetadata metadata in m_assetProvider.FetchAssetMetadataSet(start, count)) - { - // We set the ContentType here because Utils is only in - // AssetInventoryServer. This should be moved to the DB - // backends when the equivalent of SLAssetTypeToContentType is - // in OpenSim.Framework or similar. - metadata.ContentType = Utils.SLAssetTypeToContentType(metadata.Type); - - action(metadata); - ++rowCount; - } - - return rowCount; - } - - #endregion IAssetStorageProvider implementation - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - m_server = server; - m_openSimConfig = server.ConfigFile.Configs["OpenSim"]; - - try - { - m_assetProvider = DataPluginFactory.LoadDataPlugin(m_openSimConfig.GetString("asset_database_provider"), - m_openSimConfig.GetString("asset_database_connect")); - if (m_assetProvider == null) - { - m_log.Error("[OPENSIMASSETSTORAGE]: Failed to load a database plugin, server halting."); - Environment.Exit(-1); - } - else - m_log.InfoFormat("[OPENSIMASSETSTORAGE]: Loaded storage backend: {0}", Version); - } - catch (Exception e) - { - m_log.WarnFormat("[OPENSIMASSETSTORAGE]: Failure loading data plugin: {0}", e.ToString()); - throw new PluginNotInitialisedException(Name); - } - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[OPENSIMASSETSTORAGE]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - get { return m_assetProvider.Version; } - } - - public string Name - { - get { return "OpenSimAssetStorage"; } - } - - #endregion IPlugin implementation - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryFrontendPlugin.cs deleted file mode 100644 index c83e911ddb..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryFrontendPlugin.cs +++ /dev/null @@ -1,867 +0,0 @@ -/* - * 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.Net; -using System.Reflection; -using System.Collections.Generic; -using System.IO; -using System.Xml; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Framework.Servers; -using OpenSim.Framework.Servers.HttpServer; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim -{ - public class OpenSimInventoryFrontendPlugin : IAssetInventoryServerPlugin - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private AssetInventoryServer m_server; - private Utils.InventoryCollectionSerializer collectionSerializer = new Utils.InventoryCollectionSerializer(); - - public OpenSimInventoryFrontendPlugin() - { - } - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - m_server = server; - - m_server.HttpServer.AddStreamHandler(new GetInventoryHandler(server, collectionSerializer)); - m_server.HttpServer.AddStreamHandler(new CreateInventoryHandler(server)); - m_server.HttpServer.AddStreamHandler(new NewFolderHandler(server)); - m_server.HttpServer.AddStreamHandler(new UpdateFolderHandler(server)); - m_server.HttpServer.AddStreamHandler(new MoveFolderHandler(server)); - m_server.HttpServer.AddStreamHandler(new PurgeFolderHandler(server)); - m_server.HttpServer.AddStreamHandler(new NewItemHandler(server)); - m_server.HttpServer.AddStreamHandler(new DeleteItemHandler(server)); - m_server.HttpServer.AddStreamHandler(new RootFoldersHandler(server)); - m_server.HttpServer.AddStreamHandler(new ActiveGesturesHandler(server)); - - m_log.Info("[OPENSIMINVENTORYFRONTEND]: OpenSim Inventory Frontend loaded."); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[OPENSIMINVENTORYFRONTEND]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "OpenSimInventoryFrontend"; } - } - - #endregion IPlugin implementation - - public class GetInventoryHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - Utils.InventoryCollectionSerializer m_collectionSerializer; - - //public GetInventoryHandler(AssetInventoryServer server, Utils.InventoryCollectionSerializer collectionSerializer) : base("POST", @"^/GetInventory/") - public GetInventoryHandler(AssetInventoryServer server, Utils.InventoryCollectionSerializer collectionSerializer) : base("POST", "/GetInventory") - { - m_server = server; - m_collectionSerializer = collectionSerializer; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - byte[] buffer = new byte[] {}; - UUID sessionID, agentID; - UUID ownerID = DeserializeUUID(httpRequest.InputStream, out agentID, out sessionID); - - if (ownerID != UUID.Zero) - { - m_log.Warn("[OPENSIMINVENTORYFRONTEND]: GetInventory is not scalable on some inventory backends, avoid calling it wherever possible"); - - Uri owner = Utils.GetOpenSimUri(ownerID); - InventoryCollection inventory; - BackendResponse storageResponse = m_server.InventoryProvider.TryFetchInventory(owner, out inventory); - - if (storageResponse == BackendResponse.Success) - { - //collectionSerializer.Serialize(httpResponse.Body, inventory); - //httpResponse.Body.Flush(); - MemoryStream ms = new MemoryStream(); - m_collectionSerializer.Serialize(ms, inventory); - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int) ms.Length); - ms.Close(); - httpResponse.StatusCode = (int) HttpStatusCode.OK; - } - else if (storageResponse == BackendResponse.NotFound) - { - // Return an empty inventory set to mimic OpenSim.Grid.InventoryServer.exe - inventory = new InventoryCollection(); - inventory.UserID = ownerID; - inventory.Folders = new Dictionary(); - inventory.Items = new Dictionary(); - //collectionSerializer.Serialize(httpResponse.Body, inventory); - //httpResponse.Body.Flush(); - MemoryStream ms = new MemoryStream(); - m_collectionSerializer.Serialize(ms, inventory); - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int) ms.Length); - ms.Close(); - httpResponse.StatusCode = (int) HttpStatusCode.OK; - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - } - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; - } - - return buffer; - } - } - - public class CreateInventoryHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public CreateInventoryHandler(AssetInventoryServer server) : base("POST", @"^/CreateInventory/") - public CreateInventoryHandler(AssetInventoryServer server) : base("POST", "/CreateInventory") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - UUID ownerID = DeserializeUUID(httpRequest.InputStream); - - if (ownerID != UUID.Zero) - { - Uri owner = Utils.GetOpenSimUri(ownerID); - m_log.DebugFormat("[OPENSIMINVENTORYFRONTEND]: Created URI {0} for inventory creation", owner); - - InventoryFolderWithChildren rootFolder = new InventoryFolderWithChildren("My Inventory", ownerID, UUID.Zero, (short)AssetType.Folder); - BackendResponse storageResponse = m_server.InventoryProvider.TryCreateInventory(owner, rootFolder); - if (storageResponse == BackendResponse.Success) - { - // TODO: The CreateFolder calls need to be executed in SimpleStorage. - //CreateFolder("Animations", ownerID, rootFolder.ID, AssetType.Animation); - //CreateFolder("Body Parts", ownerID, rootFolder.ID, AssetType.Bodypart); - //CreateFolder("Calling Cards", ownerID, rootFolder.ID, AssetType.CallingCard); - //CreateFolder("Clothing", ownerID, rootFolder.ID, AssetType.Clothing); - //CreateFolder("Gestures", ownerID, rootFolder.ID, AssetType.Gesture); - //CreateFolder("Landmarks", ownerID, rootFolder.ID, AssetType.Landmark); - //CreateFolder("Lost and Found", ownerID, rootFolder.ID, AssetType.LostAndFoundFolder); - //CreateFolder("Notecards", ownerID, rootFolder.ID, AssetType.Notecard); - //CreateFolder("Objects", ownerID, rootFolder.ID, AssetType.Object); - //CreateFolder("Photo Album", ownerID, rootFolder.ID, AssetType.SnapshotFolder); - //CreateFolder("Scripts", ownerID, rootFolder.ID, AssetType.LSLText); - //CreateFolder("Sounds", ownerID, rootFolder.ID, AssetType.Sound); - //CreateFolder("Textures", ownerID, rootFolder.ID, AssetType.Texture); - //CreateFolder("Trash", ownerID, rootFolder.ID, AssetType.TrashFolder); - - return SerializeBool(true); - } - } - - return SerializeBool(false); - } - } - - public class NewFolderHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public NewFolderHandler(AssetInventoryServer server) : base("POST", @"^/NewFolder/") - public NewFolderHandler(AssetInventoryServer server) : base("POST", "/NewFolder") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - UUID agentID, sessionID; - InventoryFolderWithChildren folder = DeserializeFolder(httpRequest.InputStream, out agentID, out sessionID); - - if (folder != null) - { - Uri owner = Utils.GetOpenSimUri(folder.Owner); - - // Some calls that are moving or updating a folder instead - // of creating a new one will pass in an InventoryFolder - // without the name set and type set to 0. If this is the - // case we need to look up the name first and preserver - // it's type. - if (String.IsNullOrEmpty(folder.Name)) - { - InventoryFolderWithChildren oldFolder; - if (m_server.InventoryProvider.TryFetchFolder(owner, folder.ID, out oldFolder) == BackendResponse.Success) - { - folder.Name = oldFolder.Name; - folder.Type = oldFolder.Type; - } - } - - BackendResponse storageResponse = m_server.InventoryProvider.TryCreateFolder(owner, folder); - - if (storageResponse == BackendResponse.Success) - { - return SerializeBool(true); - } - } - - return SerializeBool(false); - } - } - - public class UpdateFolderHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public UpdateFolderHandler(AssetInventoryServer server) : base("POST", @"^/UpdateFolder/") - public UpdateFolderHandler(AssetInventoryServer server) : base("POST", "/UpdateFolder") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - return new NewFolderHandler(m_server).Handle(path, request, httpRequest, httpResponse); - } - } - - public class MoveFolderHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public MoveFolderHandler(AssetInventoryServer server) : base("POST", @"^/MoveFolder/") - public MoveFolderHandler(AssetInventoryServer server) : base("POST", "/MoveFolder") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - return new NewFolderHandler(m_server).Handle(path, request, httpRequest, httpResponse); - } - } - - public class PurgeFolderHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public PurgeFolderHandler(AssetInventoryServer server) : base("POST", @"^/PurgeFolder/") - public PurgeFolderHandler(AssetInventoryServer server) : base("POST", "/PurgeFolder") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - UUID agentID, sessionID; - InventoryFolderWithChildren folder = DeserializeFolder(httpRequest.InputStream, out agentID, out sessionID); - - if (folder != null) - { - Uri owner = Utils.GetOpenSimUri(folder.Owner); - BackendResponse storageResponse = m_server.InventoryProvider.TryPurgeFolder(owner, folder.ID); - - if (storageResponse == BackendResponse.Success) - { - return SerializeBool(true); - } - } - - return SerializeBool(false); - } - } - - public class NewItemHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public NewItemHandler(AssetInventoryServer server) : base("POST", @"^/NewItem/") - public NewItemHandler(AssetInventoryServer server) : base("POST", "/NewItem") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - UUID agentID, sessionID; - InventoryItemBase item = DeserializeItem(httpRequest.InputStream, out agentID, out sessionID); - - if (item != null) - { - Uri owner = Utils.GetOpenSimUri(agentID); - BackendResponse storageResponse = m_server.InventoryProvider.TryCreateItem(owner, item); - - if (storageResponse == BackendResponse.Success) - { - return SerializeBool(true); - } - } - - return SerializeBool(false); - } - } - - public class DeleteItemHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public DeleteItemHandler(AssetInventoryServer server) : base("POST", @"^/DeleteItem/") - public DeleteItemHandler(AssetInventoryServer server) : base("POST", "/DeleteItem") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - UUID agentID, sessionID; - InventoryItemBase item = DeserializeItem(httpRequest.InputStream, out agentID, out sessionID); - - if (item != null) - { - Uri owner = Utils.GetOpenSimUri(item.Owner); - BackendResponse storageResponse = m_server.InventoryProvider.TryDeleteItem(owner, item.ID); - - if (storageResponse == BackendResponse.Success) - { - return SerializeBool(true); - } - } - - return SerializeBool(false); - } - } - - public class RootFoldersHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public RootFoldersHandler(AssetInventoryServer server) : base("POST", @"^/RootFolders/") - public RootFoldersHandler(AssetInventoryServer server) : base("POST", "/RootFolders") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - byte[] buffer = new byte[] {}; - UUID ownerID = DeserializeUUID(httpRequest.InputStream); - - if (ownerID != UUID.Zero) - { - Uri owner = Utils.GetOpenSimUri(ownerID); - List skeleton; - BackendResponse storageResponse = m_server.InventoryProvider.TryFetchFolderList(owner, out skeleton); - - if (storageResponse == BackendResponse.Success) - { - MemoryStream ms = new MemoryStream(); - SerializeFolderList(ms, skeleton); - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int) ms.Length); - ms.Close(); - httpResponse.StatusCode = (int) HttpStatusCode.OK; - } - else if (storageResponse == BackendResponse.NotFound) - { - // Return an empty set of inventory so the requester knows that - // an inventory needs to be created for this agent - MemoryStream ms = new MemoryStream(); - SerializeFolderList(ms, new List(0)); - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int) ms.Length); - ms.Close(); - httpResponse.StatusCode = (int) HttpStatusCode.OK; - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - } - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; - } - - return buffer; - } - } - - public class ActiveGesturesHandler : BaseStreamHandler - { - AssetInventoryServer m_server; - - //public ActiveGesturesHandler(AssetInventoryServer server) : base("POST", @"^/ActiveGestures/") - public ActiveGesturesHandler(AssetInventoryServer server) : base("POST", "/ActiveGestures") - { - m_server = server; - } - - public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - byte[] buffer = new byte[] {}; - UUID ownerID = DeserializeUUID(httpRequest.InputStream); - - if (ownerID != UUID.Zero) - { - Uri owner = Utils.GetOpenSimUri(ownerID); - List gestures; - BackendResponse storageResponse = m_server.InventoryProvider.TryFetchActiveGestures(owner, out gestures); - - if (storageResponse == BackendResponse.Success) - { - MemoryStream ms = new MemoryStream(); - SerializeItemList(ms, gestures); - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int) ms.Length); - ms.Close(); - httpResponse.StatusCode = (int) HttpStatusCode.OK; - } - else if (storageResponse == BackendResponse.NotFound) - { - // Return an empty set of gestures to match OpenSim.Grid.InventoryServer.exe behavior - MemoryStream ms = new MemoryStream(); - SerializeItemList(ms, new List(0)); - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int) ms.Length); - ms.Close(); - httpResponse.StatusCode = (int) HttpStatusCode.OK; - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - } - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; - } - - return buffer; - } - } - - //BackendResponse CreateFolder(string name, UUID ownerID, UUID parentID, AssetType assetType) - //{ - // InventoryFolder folder = new InventoryFolder(name, ownerID, parentID, (short)assetType); - // Uri owner = Utils.GetOpenSimUri(ownerID); - // return m_server.InventoryProvider.TryCreateFolder(owner, folder); - //} - - private static UUID DeserializeUUID(Stream stream) - { - UUID id = UUID.Zero; - - try - { - using (XmlReader reader = XmlReader.Create(stream)) - { - reader.MoveToContent(); - UUID.TryParse(reader.ReadElementContentAsString("guid", String.Empty), out id); - } - } - catch (Exception ex) - { - m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse POST data (expecting guid): " + ex.Message); - } - - return id; - } - - private static UUID DeserializeUUID(Stream stream, out UUID agentID, out UUID sessionID) - { - UUID id; - - try - { - using (XmlReader reader = XmlReader.Create(stream)) - { - reader.MoveToContent(); - reader.ReadStartElement("RestSessionObjectOfGuid"); - UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); - UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); - UUID.TryParse(reader.ReadElementContentAsString("Body", String.Empty), out id); - reader.ReadEndElement(); - } - } - catch (Exception ex) - { - m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse GetInventory POST data: " + ex.Message); - agentID = UUID.Zero; - sessionID = UUID.Zero; - return UUID.Zero; - } - - return id; - } - - private static InventoryFolderWithChildren DeserializeFolder(Stream stream, out UUID agentID, out UUID sessionID) - { - InventoryFolderWithChildren folder = new InventoryFolderWithChildren(); - - try - { - using (XmlReader reader = XmlReader.Create(stream)) - { - reader.MoveToContent(); - reader.ReadStartElement("RestSessionObjectOfInventoryFolderBase"); - UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); - UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); - reader.ReadStartElement("Body"); - if (reader.Name == "Name") - folder.Name = reader.ReadElementContentAsString("Name", String.Empty); - else - folder.Name = String.Empty; - - UUID dummyUUID; - ReadUUID(reader, "ID", out dummyUUID); - folder.ID = dummyUUID; - ReadUUID(reader, "Owner", out dummyUUID); - folder.Owner = dummyUUID; - ReadUUID(reader, "ParentID", out dummyUUID); - folder.ParentID = dummyUUID; - - short dummyType; - Int16.TryParse(reader.ReadElementContentAsString("Type", String.Empty), out dummyType); - folder.Type = dummyType; - - ushort dummyVersion; - UInt16.TryParse(reader.ReadElementContentAsString("Version", String.Empty), out dummyVersion); - folder.Version = dummyVersion; - - reader.ReadEndElement(); - reader.ReadEndElement(); - } - } - catch (Exception ex) - { - m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse POST data (expecting InventoryFolderBase): " + ex.Message); - agentID = UUID.Zero; - sessionID = UUID.Zero; - return null; - } - - return folder; - } - - private static InventoryItemBase DeserializeItem(Stream stream, out UUID agentID, out UUID sessionID) - { - InventoryItemBase item = new InventoryItemBase(); - - try - { - using (XmlReader reader = XmlReader.Create(stream)) - { - reader.MoveToContent(); - reader.ReadStartElement("RestSessionObjectOfInventoryItemBase"); - UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); - UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); - reader.ReadStartElement("Body"); - - item.Name = reader.ReadElementContentAsString("Name", String.Empty); - - UUID dummyUUID; - ReadUUID(reader, "ID", out dummyUUID); - item.ID = dummyUUID; - - ReadUUID(reader, "Owner", out dummyUUID); - item.Owner = dummyUUID; - - int dummyInt; - Int32.TryParse(reader.ReadElementContentAsString("InvType", String.Empty), out dummyInt); - item.InvType = dummyInt; - - ReadUUID(reader, "Folder", out dummyUUID); - item.Folder = dummyUUID; - - item.CreatorId = reader.ReadElementContentAsString("CreatorId", String.Empty); - item.Description = reader.ReadElementContentAsString("Description", String.Empty); - - uint dummyUInt; - UInt32.TryParse(reader.ReadElementContentAsString("NextPermissions", String.Empty), out dummyUInt); - item.NextPermissions = dummyUInt; - UInt32.TryParse(reader.ReadElementContentAsString("CurrentPermissions", String.Empty), out dummyUInt); - item.CurrentPermissions = dummyUInt; - UInt32.TryParse(reader.ReadElementContentAsString("BasePermissions", String.Empty), out dummyUInt); - item.BasePermissions = dummyUInt; - UInt32.TryParse(reader.ReadElementContentAsString("EveryOnePermissions", String.Empty), out dummyUInt); - item.EveryOnePermissions = dummyUInt; - UInt32.TryParse(reader.ReadElementContentAsString("GroupPermissions", String.Empty), out dummyUInt); - item.GroupPermissions = dummyUInt; - - Int32.TryParse(reader.ReadElementContentAsString("AssetType", String.Empty), out dummyInt); - item.AssetType = dummyInt; - - ReadUUID(reader, "AssetID", out dummyUUID); - item.AssetID = dummyUUID; - ReadUUID(reader, "GroupID", out dummyUUID); - item.GroupID = dummyUUID; - - bool dummyBool; - Boolean.TryParse(reader.ReadElementContentAsString("GroupOwned", String.Empty), out dummyBool); - item.GroupOwned = dummyBool; - - Int32.TryParse(reader.ReadElementContentAsString("SalePrice", String.Empty), out dummyInt); - item.SalePrice = dummyInt; - - byte dummyByte; - Byte.TryParse(reader.ReadElementContentAsString("SaleType", String.Empty), out dummyByte); - item.SaleType = dummyByte; - - UInt32.TryParse(reader.ReadElementContentAsString("Flags", String.Empty), out dummyUInt); - item.Flags = dummyUInt; - - Int32.TryParse(reader.ReadElementContentAsString("CreationDate", String.Empty), out dummyInt); - item.CreationDate = dummyInt; - - reader.ReadEndElement(); - reader.ReadEndElement(); - } - } - catch (Exception ex) - { - m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse POST data (expecting InventoryItemBase): " + ex.Message); - agentID = UUID.Zero; - sessionID = UUID.Zero; - return null; - } - - return item; - } - - private static byte[] SerializeBool(bool value) - { - byte[] buffer; - MemoryStream ms = new MemoryStream(); - - using (XmlWriter writer = XmlWriter.Create(ms)) - { - writer.WriteStartDocument(); - writer.WriteStartElement("boolean"); - writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); - writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); - writer.WriteString(value.ToString().ToLower()); - writer.WriteEndElement(); - writer.WriteEndDocument(); - writer.Flush(); - } - - ms.Seek(0, SeekOrigin.Begin); - buffer = ms.GetBuffer(); - Array.Resize(ref buffer, (int) ms.Length); - ms.Close(); - - return buffer; - } - - private static void SerializeFolderList(Stream stream, List folders) - { - using (XmlWriter writer = XmlWriter.Create(stream)) - { - writer.WriteStartDocument(); - writer.WriteStartElement("ArrayOfInventoryFolderBase"); - writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); - writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); - - if (folders != null) - { - foreach (InventoryFolderWithChildren folder in folders) - { - writer.WriteStartElement("InventoryFolderBase"); - writer.WriteElementString("Name", folder.Name); - WriteUUID(writer, "Owner", folder.Owner); - WriteUUID(writer, "ParentID", folder.ParentID); - WriteUUID(writer, "ID", folder.ID); - writer.WriteElementString("Type", XmlConvert.ToString(folder.Type)); - writer.WriteElementString("Version", XmlConvert.ToString(folder.Version)); - writer.WriteEndElement(); - } - } - - writer.WriteEndElement(); - writer.WriteEndDocument(); - - writer.Flush(); - } - - stream.Flush(); - } - - private static void SerializeItemList(Stream stream, List items) - { - using (XmlWriter writer = XmlWriter.Create(stream)) - { - writer.WriteStartDocument(); - writer.WriteStartElement("ArrayOfInventoryItemBase"); - writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); - writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); - - if (items != null) - { - foreach (InventoryItemBase item in items) - { - writer.WriteStartElement("InventoryItemBase"); - WriteUUID(writer, "ID", item.ID); - writer.WriteElementString("InvType", XmlConvert.ToString(item.InvType)); - WriteUUID(writer, "Folder", item.Folder); - WriteUUID(writer, "Owner", item.Owner); - writer.WriteElementString("Creator", item.CreatorId); - writer.WriteElementString("Name", item.Name); - writer.WriteElementString("Description", item.Description); - writer.WriteElementString("NextPermissions", XmlConvert.ToString(item.NextPermissions)); - writer.WriteElementString("CurrentPermissions", XmlConvert.ToString(item.CurrentPermissions)); - writer.WriteElementString("BasePermissions", XmlConvert.ToString(item.BasePermissions)); - writer.WriteElementString("EveryOnePermissions", XmlConvert.ToString(item.EveryOnePermissions)); - writer.WriteElementString("GroupPermissions", XmlConvert.ToString(item.GroupPermissions)); - writer.WriteElementString("AssetType", XmlConvert.ToString(item.AssetType)); - WriteUUID(writer, "AssetID", item.AssetID); - WriteUUID(writer, "GroupID", item.GroupID); - writer.WriteElementString("GroupOwned", XmlConvert.ToString(item.GroupOwned)); - writer.WriteElementString("SalePrice", XmlConvert.ToString(item.SalePrice)); - writer.WriteElementString("SaleType", XmlConvert.ToString(item.SaleType)); - writer.WriteElementString("Flags", XmlConvert.ToString(item.Flags)); - writer.WriteElementString("CreationDate", XmlConvert.ToString(item.CreationDate)); - writer.WriteEndElement(); - } - } - - writer.WriteEndElement(); - writer.WriteEndDocument(); - - writer.Flush(); - } - - stream.Flush(); - } - - private static void WriteUUID(XmlWriter writer, string name, UUID id) - { - writer.WriteStartElement(name); - writer.WriteElementString("Guid", XmlConvert.ToString(id.Guid)); - writer.WriteEndElement(); - } - - private static void ReadUUID(XmlReader reader, string name, out UUID id) - { - reader.ReadStartElement(name); - UUID.TryParse(reader.ReadElementContentAsString("Guid", String.Empty), out id); - reader.ReadEndElement(); - } - } - - #region OpenSim AssetType - - /// - /// The different types of grid assets - /// - public enum AssetType : sbyte - { - /// Unknown asset type - Unknown = -1, - /// Texture asset, stores in JPEG2000 J2C stream format - Texture = 0, - /// Sound asset - Sound = 1, - /// Calling card for another avatar - CallingCard = 2, - /// Link to a location in world - Landmark = 3, - // Legacy script asset, you should never see one of these - //[Obsolete] - //Script = 4, - /// Collection of textures and parameters that can be - /// worn by an avatar - Clothing = 5, - /// Primitive that can contain textures, sounds, - /// scripts and more - Object = 6, - /// Notecard asset - Notecard = 7, - /// Holds a collection of inventory items - Folder = 8, - /// Root inventory folder - RootFolder = 9, - /// Linden scripting language script - LSLText = 10, - /// LSO bytecode for a script - LSLBytecode = 11, - /// Uncompressed TGA texture - TextureTGA = 12, - /// Collection of textures and shape parameters that can - /// be worn - Bodypart = 13, - /// Trash folder - TrashFolder = 14, - /// Snapshot folder - SnapshotFolder = 15, - /// Lost and found folder - LostAndFoundFolder = 16, - /// Uncompressed sound - SoundWAV = 17, - /// Uncompressed TGA non-square image, not to be used as a - /// texture - ImageTGA = 18, - /// Compressed JPEG non-square image, not to be used as a - /// texture - ImageJPEG = 19, - /// Animation - Animation = 20, - /// Sequence of animations, sounds, chat, and pauses - Gesture = 21, - /// Simstate file - Simstate = 22, - } - - #endregion OpenSim AssetType -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryService.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryService.cs deleted file mode 100644 index 0effa9ff77..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryService.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Framework.Communications; -using OpenSim.Data; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim -{ - public class OpenSimInventoryService : InventoryServiceBase - { - public InventoryFolderWithChildren GetInventoryFolder(UUID folderID) - { - InventoryFolderBase baseFolder = null; - InventoryFolderWithChildren folder = null; - - foreach (IInventoryDataPlugin plugin in m_plugins) - { - baseFolder = plugin.getInventoryFolder(folderID); - } - - if (null != baseFolder) - { - folder = new InventoryFolderWithChildren(baseFolder); - folder.Children = null; // This call only returns data for the folder itself, no children data - } - - return folder; - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryStoragePlugin.cs deleted file mode 100644 index 2239b87dd7..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/OpenSimInventoryStoragePlugin.cs +++ /dev/null @@ -1,547 +0,0 @@ -/* - * 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 System.Collections.Generic; -using System.Data; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Data; -using Nini.Config; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins.OpenSim -{ - public class OpenSimInventoryStoragePlugin : IInventoryStorageProvider - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - const string EXTENSION_NAME = "OpenSimInventoryStorage"; // Used in metrics reporting - - private AssetInventoryServer m_server; - private IConfig m_openSimConfig; - private OpenSimInventoryService m_inventoryService; - - public OpenSimInventoryStoragePlugin() - { - } - - #region IInventoryStorageProvider implementation - - public BackendResponse TryFetchItem(Uri owner, UUID itemID, out InventoryItemBase item) - { - item = null; - //BackendResponse ret; - - //using (MySqlConnection dbConnection = new MySqlConnection(m_openSimConfig.GetString("inventory_database_connect"))) - //{ - // IDataReader reader; - - // try - // { - // dbConnection.Open(); - - // IDbCommand command = dbConnection.CreateCommand(); - // command.CommandText = String.Format("SELECT assetID,assetType,inventoryName,inventoryDescription,inventoryNextPermissions," + - // "inventoryCurrentPermissions,invType,creatorID,inventoryBasePermissions,inventoryEveryOnePermissions,salePrice,saleType," + - // "creationDate,groupID,groupOwned,flags,avatarID,parentFolderID,inventoryGroupPermissions FROM inventoryitems WHERE inventoryID='{0}'", - // itemID.ToString()); - // reader = command.ExecuteReader(); - - // if (reader.Read()) - // { - // item = new InventoryItemBase(); - // item.ID = itemID; - // item.AssetID = UUID.Parse(reader.GetString(0)); - // item.AssetType = reader.GetInt32(1); - // item.Name = reader.GetString(2); - // item.Description = reader.GetString(3); - // item.NextPermissions = (uint)reader.GetInt32(4); - // item.CurrentPermissions = (uint)reader.GetInt32(5); - // item.InvType = reader.GetInt32(6); - // item.Creator = UUID.Parse(reader.GetString(7)); - // item.BasePermissions = (uint)reader.GetInt32(8); - // item.EveryOnePermissions = (uint)reader.GetInt32(9); - // item.SalePrice = reader.GetInt32(10); - // item.SaleType = reader.GetByte(11); - // item.CreationDate = reader.GetInt32(12); - // item.GroupID = UUID.Parse(reader.GetString(13)); - // item.GroupOwned = reader.GetBoolean(14); - // item.Flags = (uint)reader.GetInt32(15); - // item.Owner = UUID.Parse(reader.GetString(16)); - // item.Folder = UUID.Parse(reader.GetString(17)); - // item.GroupPermissions = (uint)reader.GetInt32(18); - - // ret = BackendResponse.Success; - // } - // else - // { - // ret = BackendResponse.NotFound; - // } - // } - // catch (MySqlException ex) - // { - // m_log.Error("[OPENSIMINVENTORYSTORAGE]: Connection to MySQL backend failed: " + ex.Message); - // ret = BackendResponse.Failure; - // } - //} - - //m_server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, itemID, false, DateTime.Now); - //return ret; - m_log.Warn("[OPENSIMINVENTORYSTORAGE]: Called TryFetchItem which is not implemented."); - return BackendResponse.Success; - } - - public BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder) - { - BackendResponse ret; - - // TODO: implement some logic for "folder not found" - folder = m_inventoryService.GetInventoryFolder(folderID); - ret = BackendResponse.Success; - - m_server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchFolderContents(Uri owner, UUID folderID, out InventoryCollection contents) - { - contents = null; - //BackendResponse ret; - - //using (MySqlConnection dbConnection = new MySqlConnection(m_openSimConfig.GetString("inventory_database_connect"))) - //{ - // IDataReader reader; - - // try - // { - // dbConnection.Open(); - - // contents = new InventoryCollection(); - - // #region Folder retrieval - - // IDbCommand command = dbConnection.CreateCommand(); - // command.CommandText = String.Format("SELECT folderName,type,version,agentID,folderID FROM inventoryfolders WHERE parentFolderID='{0}'", - // folderID.ToString()); - // reader = command.ExecuteReader(); - - // contents.Folders = new Dictionary(); - - // while (reader.Read()) - // { - // InventoryFolderWithChildren folder = new InventoryFolderWithChildren(); - // folder.ParentID = folderID; - // folder.Children = null; // This call doesn't do recursion - // folder.Name = reader.GetString(0); - // folder.Type = reader.GetInt16(1); - // folder.Version = (ushort)reader.GetInt16(2); - // folder.Owner = UUID.Parse(reader.GetString(3)); - // folder.ID = UUID.Parse(reader.GetString(4)); - - // contents.Folders.Add(folder.ID, folder); - // contents.UserID = folder.Owner; - // } - - // reader.Close(); - - // #endregion Folder retrieval - - // #region Item retrieval - - // command = dbConnection.CreateCommand(); - // command.CommandText = String.Format("SELECT assetID,assetType,inventoryName,inventoryDescription,inventoryNextPermissions," + - // "inventoryCurrentPermissions,invType,creatorID,inventoryBasePermissions,inventoryEveryOnePermissions,salePrice,saleType," + - // "creationDate,groupID,groupOwned,flags,avatarID,inventoryID,inventoryGroupPermissions FROM inventoryitems WHERE parentFolderID='{0}'", - // folderID.ToString()); - // reader = command.ExecuteReader(); - - // contents.Items = new Dictionary(); - - // while (reader.Read()) - // { - // InventoryItemBase item = new InventoryItemBase(); - // item.Folder = folderID; - // item.AssetID = UUID.Parse(reader.GetString(0)); - // item.AssetType = reader.GetInt32(1); - // item.Name = reader.GetString(2); - // item.Description = reader.GetString(3); - // item.NextPermissions = (uint)reader.GetInt32(4); - // item.CurrentPermissions = (uint)reader.GetInt32(5); - // item.InvType = reader.GetInt32(6); - // item.Creator = UUID.Parse(reader.GetString(7)); - // item.BasePermissions = (uint)reader.GetInt32(8); - // item.EveryOnePermissions = (uint)reader.GetInt32(9); - // item.SalePrice = reader.GetInt32(10); - // item.SaleType = reader.GetByte(11); - // item.CreationDate = reader.GetInt32(12); - // item.GroupID = UUID.Parse(reader.GetString(13)); - // item.GroupOwned = reader.GetBoolean(14); - // item.Flags = (uint)reader.GetInt32(15); - // item.Owner = UUID.Parse(reader.GetString(16)); - // item.ID = UUID.Parse(reader.GetString(17)); - // item.GroupPermissions = (uint)reader.GetInt32(18); - - // contents.Items.Add(item.ID, item); - // contents.UserID = item.Owner; - // } - - // #endregion Item retrieval - - // ret = BackendResponse.Success; - // } - // catch (MySqlException ex) - // { - // m_log.Error("[OPENSIMINVENTORYSTORAGE]: Connection to MySQL backend failed: " + ex.Message); - // ret = BackendResponse.Failure; - // } - //} - - //m_server.MetricsProvider.LogInventoryFetchFolderContents(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); - //return ret; - m_log.Warn("[OPENSIMINVENTORYSTORAGE]: Called TryFetchFolderContents which is not implemented."); - return BackendResponse.Success; - } - - public BackendResponse TryFetchFolderList(Uri owner, out List folders) - { - folders = new List(); - BackendResponse ret; - UUID ownerID; - - if (Utils.TryGetOpenSimUUID(owner, out ownerID)) - { - List baseFolders = m_inventoryService.GetInventorySkeleton(ownerID); - foreach (InventoryFolderBase baseFolder in baseFolders) - { - InventoryFolderWithChildren folder = new InventoryFolderWithChildren(baseFolder); - //folder.Children = null; // This call does not create a folder hierarchy - folders.Add(folder); - } - - ret = BackendResponse.Success; - } - else - { - folders = null; - ret = BackendResponse.NotFound; - } - - m_server.MetricsProvider.LogInventoryFetchFolderList(EXTENSION_NAME, ret, owner, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchInventory(Uri owner, out InventoryCollection inventory) - { - inventory = null; - BackendResponse ret; - List folders; - - ret = TryFetchFolderList(owner, out folders); - - if (ret == BackendResponse.Success) - { - // Add the retrieved folders to the inventory collection - inventory = new InventoryCollection(); - inventory.Folders = new Dictionary(folders.Count); - foreach (InventoryFolderWithChildren folder in folders) - inventory.Folders[folder.ID] = folder; - - // Fetch inventory items - UUID ownerID; - if (Utils.TryGetOpenSimUUID(owner, out ownerID)) - { - inventory.UserID = ownerID; - inventory.Items = new Dictionary(); - - foreach (InventoryFolderWithChildren folder in folders) - { - foreach (InventoryItemBase item in m_inventoryService.RequestFolderItems(folder.ID)) - { - inventory.Items.Add(item.ID, item); - } - } - - ret = BackendResponse.Success; - - } - else - { - ret = BackendResponse.NotFound; - } - } - - m_server.MetricsProvider.LogInventoryFetchInventory(EXTENSION_NAME, ret, owner, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchActiveGestures(Uri owner, out List gestures) - { - gestures = null; - BackendResponse ret; - UUID ownerID; - - if (Utils.TryGetOpenSimUUID(owner, out ownerID)) - { - gestures = m_inventoryService.GetActiveGestures(ownerID); - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.NotFound; - } - - m_server.MetricsProvider.LogInventoryFetchActiveGestures(EXTENSION_NAME, ret, owner, DateTime.Now); - return ret; - } - - public BackendResponse TryCreateItem(Uri owner, InventoryItemBase item) - { - BackendResponse ret; - - if (m_inventoryService.AddItem(item)) - { - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.Failure; - } - - m_server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, false, DateTime.Now); - return ret; - } - - public BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder) - { - BackendResponse ret; - - if (m_inventoryService.AddFolder(folder)) - { - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.Failure; - } - - m_server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, true, DateTime.Now); - return ret; - } - - public BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder) - { - BackendResponse ret; - UUID ownerID; - - if (Utils.TryGetOpenSimUUID(owner, out ownerID)) - { - if (m_inventoryService.CreateNewUserInventory(ownerID)) - { - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.Failure; - } - } - else - { - ret = BackendResponse.Failure; - } - - return ret; - } - - public BackendResponse TryDeleteItem(Uri owner, UUID itemID) - { - BackendResponse ret; - - if (m_inventoryService.DeleteItem(m_inventoryService.GetInventoryItem(itemID))) - { - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.Failure; - } - - m_server.MetricsProvider.LogInventoryDelete(EXTENSION_NAME, ret, owner, itemID, false, DateTime.Now); - return ret; - } - - public BackendResponse TryDeleteFolder(Uri owner, UUID folderID) - { - //BackendResponse ret; - //UUID ownerID; - - //if (Utils.TryGetOpenSimUUID(owner, out ownerID)) - //{ - // using (MySqlConnection dbConnection = new MySqlConnection(m_openSimConfig.GetString("inventory_database_connect"))) - // { - // try - // { - // dbConnection.Open(); - - // MySqlCommand command = new MySqlCommand( - // "DELETE FROM inventoryfolders WHERE folderID=?folderID AND agentID=?agentID", dbConnection); - - // command.Parameters.AddWithValue("?folderID", folderID.ToString()); - // command.Parameters.AddWithValue("?agentID", ownerID.ToString()); - - // int rowsAffected = command.ExecuteNonQuery(); - // if (rowsAffected == 1) - // { - // ret = BackendResponse.Success; - // } - // else - // { - // m_log.ErrorFormat("[OPENSIMINVENTORYSTORAGE]: MySQL DELETE query affected {0} rows", rowsAffected); - // ret = BackendResponse.NotFound; - // } - // } - // catch (MySqlException ex) - // { - // m_log.Error("[OPENSIMINVENTORYSTORAGE]: Connection to MySQL backend failed: " + ex.Message); - // ret = BackendResponse.Failure; - // } - // } - //} - //else - //{ - // ret = BackendResponse.NotFound; - //} - - //m_server.MetricsProvider.LogInventoryDelete(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); - //return ret; - m_log.Warn("[OPENSIMINVENTORYSTORAGE]: Called TryDeleteFolder which is not implemented."); - return BackendResponse.Success; - } - - public BackendResponse TryPurgeFolder(Uri owner, UUID folderID) - { - BackendResponse ret; - - if (m_inventoryService.PurgeFolder(m_inventoryService.GetInventoryFolder(folderID))) - { - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.Failure; - } - - m_server.MetricsProvider.LogInventoryPurgeFolder(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); - return ret; - } - - public int ForEach(Action action, int start, int count) - { - int rowCount = 0; - - //using (MySqlConnection dbConnection = new MySqlConnection(m_openSimConfig.GetString("inventory_database_connect"))) - //{ - // MySqlDataReader reader; - - // try - // { - // dbConnection.Open(); - - // MySqlCommand command = dbConnection.CreateCommand(); - // command.CommandText = String.Format("SELECT name,description,assetType,temporary,data,id FROM assets LIMIT {0}, {1}", - // start, count); - // reader = command.ExecuteReader(); - // } - // catch (MySqlException ex) - // { - // m_log.Error("[OPENSIMINVENTORYSTORAGE]: Connection to MySQL backend failed: " + ex.Message); - // return 0; - // } - - // while (reader.Read()) - // { - // Metadata metadata = new Metadata(); - // metadata.CreationDate = OpenMetaverse.Utils.Epoch; - // metadata.Description = reader.GetString(1); - // metadata.ID = UUID.Parse(reader.GetString(5)); - // metadata.Name = reader.GetString(0); - // metadata.SHA1 = OpenMetaverse.Utils.SHA1((byte[])reader.GetValue(4)); - // metadata.Temporary = reader.GetBoolean(3); - // metadata.ContentType = Utils.SLAssetTypeToContentType(reader.GetInt32(2)); - - // action(metadata); - // ++rowCount; - // } - - // reader.Close(); - //} - - return rowCount; - } - - #endregion IInventoryStorageProvider implementation - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - m_server = server; - m_openSimConfig = server.ConfigFile.Configs["OpenSim"]; - - m_inventoryService = new OpenSimInventoryService(); - m_inventoryService.AddPlugin(m_openSimConfig.GetString("inventory_database_provider"), - m_openSimConfig.GetString("inventory_database_connect")); - } - - public void Stop() - { - } - - public void Initialise() - { - m_log.InfoFormat("[OPENSIMINVENTORYSTORAGE]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "OpenSimInventoryStorage"; } - } - - #endregion IPlugin implementation - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/Resources/AssetInventoryServerOpenSimPlugins.addin.xml b/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/Resources/AssetInventoryServerOpenSimPlugins.addin.xml deleted file mode 100644 index 8cd7585a68..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/OpenSim/Resources/AssetInventoryServerOpenSimPlugins.addin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs deleted file mode 100644 index b5ad1a1501..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/ReferenceFrontendPlugin.cs +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.IO; -using System.Reflection; -using System.Net; -using OpenMetaverse; -using OpenMetaverse.StructuredData; -using OpenSim.Framework; -using OpenSim.Framework.Servers; -using OpenSim.Framework.Servers.HttpServer; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins -{ - public class ReferenceFrontendPlugin : IAssetInventoryServerPlugin - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - AssetInventoryServer m_server; - - public ReferenceFrontendPlugin() - { - } - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - m_server = server; - - // Asset metadata request - //m_server.HttpServer.AddStreamHandler(new MetadataRequestHandler(server)); - - // Asset data request - m_server.HttpServer.AddStreamHandler(new DataRequestHandler(server)); - - // Asset creation - //m_server.HttpServer.AddStreamHandler(new CreateRequestHandler(server)); - - m_log.Info("[REFERENCEFRONTEND]: Reference Frontend loaded."); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[REFERENCEFRONTEND]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "ReferenceFrontend"; } - } - - #endregion IPlugin implementation - - //public class MetadataRequestHandler : IStreamedRequestHandler - //{ - // AssetInventoryServer m_server; - // string m_contentType; - // string m_httpMethod; - // string m_path; - - // public MetadataRequestHandler(AssetInventoryServer server) - // { - // m_server = server; - // m_contentType = null; - // m_httpMethod = "GET"; - // m_path = @"^/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/metadata"; - // } - - // #region IStreamedRequestHandler implementation - - // public string ContentType - // { - // get { return m_contentType; } - // } - - // public string HttpMethod - // { - // get { return m_httpMethod; } - // } - - // public string Path - // { - // get { return m_path; } - // } - - // public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - // { - // byte[] serializedData = null; - // UUID assetID; - // // Split the URL up into an AssetID and a method - // string[] rawUrl = httpRequest.Url.PathAndQuery.Split('/'); - - // if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID)) - // { - // UUID authToken = Utils.GetAuthToken(httpRequest); - - // if (m_server.AuthorizationProvider.IsMetadataAuthorized(authToken, assetID)) - // { - // AssetMetadata metadata; - // BackendResponse storageResponse = m_server.StorageProvider.TryFetchMetadata(assetID, out metadata); - - // if (storageResponse == BackendResponse.Success) - // { - // // If the asset data location wasn't specified in the metadata, specify it - // // manually here by pointing back to this asset server - // if (!metadata.Methods.ContainsKey("data")) - // { - // metadata.Methods["data"] = new Uri(String.Format("{0}://{1}/{2}/data", - // httpRequest.Url.Scheme, httpRequest.Url.Authority, assetID)); - // } - - // serializedData = metadata.SerializeToBytes(); - - // httpResponse.StatusCode = (int) HttpStatusCode.OK; - // httpResponse.ContentType = "application/json"; - // httpResponse.ContentLength = serializedData.Length; - // httpResponse.Body.Write(serializedData, 0, serializedData.Length); - // } - // else if (storageResponse == BackendResponse.NotFound) - // { - // m_log.Warn("[REFERENCEFRONTEND]: Could not find metadata for asset " + assetID.ToString()); - // httpResponse.StatusCode = (int) HttpStatusCode.NotFound; - // } - // else - // { - // httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - // } - // } - // else - // { - // httpResponse.StatusCode = (int) HttpStatusCode.Forbidden; - // } - - // return serializedData; - // } - - // httpResponse.StatusCode = (int) HttpStatusCode.NotFound; - // return serializedData; - // } - - // #endregion IStreamedRequestHandler implementation - //} - - public class DataRequestHandler : IStreamedRequestHandler - { - AssetInventoryServer m_server; - string m_contentType; - string m_httpMethod; - string m_path; - - public DataRequestHandler(AssetInventoryServer server) - { - m_server = server; - m_contentType = null; - m_httpMethod = "GET"; - m_path = @"^/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/data"; - } - - #region IStreamedRequestHandler implementation - - public string ContentType - { - get { return m_contentType; } - } - - public string HttpMethod - { - get { return m_httpMethod; } - } - - public string Path - { - get { return m_path; } - } - - public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - { - byte[] assetData = null; - UUID assetID; - // Split the URL up into an AssetID and a method - string[] rawUrl = httpRequest.Url.PathAndQuery.Split('/'); - - if (rawUrl.Length >= 3 && UUID.TryParse(rawUrl[1], out assetID)) - { - UUID authToken = Utils.GetAuthToken(httpRequest); - - if (m_server.AuthorizationProvider.IsDataAuthorized(authToken, assetID)) - { - BackendResponse storageResponse = m_server.StorageProvider.TryFetchData(assetID, out assetData); - - if (storageResponse == BackendResponse.Success) - { - httpResponse.StatusCode = (int) HttpStatusCode.OK; - httpResponse.ContentType = "application/octet-stream"; - httpResponse.AddHeader("Content-Disposition", "attachment; filename=" + assetID.ToString()); - httpResponse.ContentLength = assetData.Length; - httpResponse.Body.Write(assetData, 0, assetData.Length); - } - else if (storageResponse == BackendResponse.NotFound) - { - httpResponse.StatusCode = (int) HttpStatusCode.NotFound; - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - } - } - else - { - httpResponse.StatusCode = (int) HttpStatusCode.Forbidden; - } - - return assetData; - } - - httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; - return assetData; - } - - #endregion IStreamedRequestHandler implementation - } - - //public class CreateRequestHandler : IStreamedRequestHandler - //{ - // AssetInventoryServer m_server; - // string m_contentType; - // string m_httpMethod; - // string m_path; - - // public CreateRequestHandler(AssetInventoryServer server) - // { - // m_server = server; - // m_contentType = null; - // m_httpMethod = "POST"; - // m_path = "^/createasset"; - // } - - // #region IStreamedRequestHandler implementation - - // public string ContentType - // { - // get { return m_contentType; } - // } - - // public string HttpMethod - // { - // get { return m_httpMethod; } - // } - - // public string Path - // { - // get { return m_path; } - // } - - // public byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) - // { - // byte[] responseData = null; - // UUID authToken = Utils.GetAuthToken(httpRequest); - - // if (m_server.AuthorizationProvider.IsCreateAuthorized(authToken)) - // { - // try - // { - // OSD osdata = OSDParser.DeserializeJson(new StreamReader(httpRequest.InputStream).ReadToEnd()); - - // if (osdata.Type == OSDType.Map) - // { - // OSDMap map = (OSDMap)osdata; - // Metadata metadata = new Metadata(); - // metadata.Deserialize(map); - - // byte[] assetData = map["data"].AsBinary(); - - // if (assetData != null && assetData.Length > 0) - // { - // BackendResponse storageResponse; - - // if (metadata.ID != UUID.Zero) - // storageResponse = m_server.StorageProvider.TryCreateAsset(metadata, assetData); - // else - // storageResponse = m_server.StorageProvider.TryCreateAsset(metadata, assetData, out metadata.ID); - - // if (storageResponse == BackendResponse.Success) - // { - // httpResponse.StatusCode = (int) HttpStatusCode.Created; - // OSDMap responseMap = new OSDMap(1); - // responseMap["id"] = OSD.FromUUID(metadata.ID); - // LitJson.JsonData jsonData = OSDParser.SerializeJson(responseMap); - // responseData = System.Text.Encoding.UTF8.GetBytes(jsonData.ToJson()); - // httpResponse.Body.Write(responseData, 0, responseData.Length); - // httpResponse.Body.Flush(); - // } - // else if (storageResponse == BackendResponse.NotFound) - // { - // httpResponse.StatusCode = (int) HttpStatusCode.NotFound; - // } - // else - // { - // httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - // } - // } - // else - // { - // httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; - // } - // } - // else - // { - // httpResponse.StatusCode = (int) HttpStatusCode.BadRequest; - // } - // } - // catch (Exception ex) - // { - // httpResponse.StatusCode = (int) HttpStatusCode.InternalServerError; - // httpResponse.StatusDescription = ex.Message; - // } - // } - // else - // { - // httpResponse.StatusCode = (int) HttpStatusCode.Forbidden; - // } - - // return responseData; - // } - - // #endregion IStreamedRequestHandler implementation - //} - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml b/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml deleted file mode 100644 index 42a279d924..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Resources/AssetInventoryServerPlugins.addin.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/Resources/AssetInventoryServerSimplePlugins.addin.xml b/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/Resources/AssetInventoryServerSimplePlugins.addin.xml deleted file mode 100644 index cb6959e8c7..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/Resources/AssetInventoryServerSimplePlugins.addin.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleAssetStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleAssetStoragePlugin.cs deleted file mode 100644 index 4ec2d96c85..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleAssetStoragePlugin.cs +++ /dev/null @@ -1,290 +0,0 @@ -/* - * 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 System.Collections.Generic; -using System.IO; -using OpenMetaverse; -using OpenSim.Framework; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins.Simple -{ - public class SimpleAssetStoragePlugin : IAssetStorageProvider - { - const string EXTENSION_NAME = "SimpleAssetStorage"; // Used in metrics reporting - const string DEFAULT_DATA_DIR = "SimpleAssets"; - const string TEMP_DATA_DIR = "SimpleAssetsTemp"; - - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - AssetInventoryServer server; - Dictionary metadataStorage; - Dictionary filenames; - - public SimpleAssetStoragePlugin() - { - } - - #region Required Interfaces - - public BackendResponse TryFetchMetadata(UUID assetID, out AssetMetadata metadata) - { - metadata = null; - BackendResponse ret; - - if (metadataStorage.TryGetValue(assetID, out metadata)) - ret = BackendResponse.Success; - else - ret = BackendResponse.NotFound; - - server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchData(UUID assetID, out byte[] assetData) - { - assetData = null; - string filename; - BackendResponse ret; - - if (filenames.TryGetValue(assetID, out filename)) - { - try - { - assetData = File.ReadAllBytes(filename); - ret = BackendResponse.Success; - } - catch (Exception ex) - { - m_log.ErrorFormat("[SIMPLEASSETSTORAGE]: Failed reading data for asset {0} from {1}: {2}", assetID, filename, ex.Message); - ret = BackendResponse.Failure; - } - } - else - { - ret = BackendResponse.NotFound; - } - - server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (assetData != null ? assetData.Length : 0), DateTime.Now); - return ret; - } - - public BackendResponse TryFetchDataMetadata(UUID assetID, out AssetBase asset) - { - asset = new AssetBase(); - AssetMetadata metadata = asset.Metadata; - - string filename; - BackendResponse ret; - - if (metadataStorage.TryGetValue(assetID, out metadata) && - filenames.TryGetValue(assetID, out filename)) - { - try - { - asset.Data = File.ReadAllBytes(filename); - ret = BackendResponse.Success; - } - catch (Exception ex) - { - m_log.ErrorFormat("[SIMPLEASSETSTORAGE]: Failed reading data for asset {0} from {1}: {2}", assetID, filename, ex.Message); - ret = BackendResponse.Failure; - } - - asset.Type = (sbyte) Utils.ContentTypeToSLAssetType(metadata.ContentType); - asset.Local = false; - } - else - { - asset = null; - ret = BackendResponse.NotFound; - } - - server.MetricsProvider.LogAssetMetadataFetch(EXTENSION_NAME, ret, assetID, DateTime.Now); - server.MetricsProvider.LogAssetDataFetch(EXTENSION_NAME, ret, assetID, (asset != null && asset.Data != null ? asset.Data.Length : 0), DateTime.Now); - return ret; - } - - public BackendResponse TryCreateAsset(AssetBase asset, out UUID assetID) - { - assetID = asset.FullID = UUID.Random(); - return TryCreateAsset(asset); - } - - public BackendResponse TryCreateAsset(AssetBase asset) - { - BackendResponse ret; - AssetMetadata metadata = asset.Metadata; - - string path; - string filename = String.Format("{0}.{1}", asset.FullID, Utils.ContentTypeToExtension(metadata.ContentType)); - - if (asset.Temporary) - path = Path.Combine(TEMP_DATA_DIR, filename); - else - path = Path.Combine(DEFAULT_DATA_DIR, filename); - - try - { - File.WriteAllBytes(path, asset.Data); - lock (filenames) filenames[asset.FullID] = path; - - // Set the creation date to right now - metadata.CreationDate = DateTime.Now; - - lock (metadataStorage) - metadataStorage[asset.FullID] = metadata; - - ret = BackendResponse.Success; - } - catch (Exception ex) - { - m_log.ErrorFormat("[SIMPLEASSETSTORAGE]: Failed writing data for asset {0} to {1}: {2}", asset.FullID, filename, ex.Message); - ret = BackendResponse.Failure; - } - - server.MetricsProvider.LogAssetCreate(EXTENSION_NAME, ret, asset.FullID, asset.Data.Length, DateTime.Now); - return ret; - } - - public int ForEach(Action action, int start, int count) - { - int rowCount = 0; - - //lock (metadataStorage) - //{ - // foreach (Metadata metadata in metadataStorage.Values) - // { - // action(metadata); - // ++rowCount; - // } - //} - - return rowCount; - } - - #endregion Required Interfaces - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - this.server = server; - - metadataStorage = new Dictionary(); - filenames = new Dictionary(); - - LoadFiles(DEFAULT_DATA_DIR, false); - LoadFiles(TEMP_DATA_DIR, true); - - m_log.InfoFormat("[SIMPLEASSETSTORAGE]: Initialized the store index with metadata for {0} assets", - metadataStorage.Count); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[SIMPLEASSETSTORAGE]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - WipeTemporary(); - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "SimpleAssetStorage"; } - } - - #endregion IPlugin implementation - - public void WipeTemporary() - { - if (Directory.Exists(TEMP_DATA_DIR)) - { - try { Directory.Delete(TEMP_DATA_DIR); } - catch (Exception ex) { m_log.Error("[SIMPLEASSETSTORAGE]: " + ex.Message); } - } - } - - void LoadFiles(string folder, bool temporary) - { - // Try to create the directory if it doesn't already exist - if (!Directory.Exists(folder)) - { - try { Directory.CreateDirectory(folder); } - catch (Exception ex) - { - m_log.Warn("[SIMPLEASSETSTORAGE]: " + ex.Message); - return; - } - } - - lock (metadataStorage) - { - try - { - string[] assets = Directory.GetFiles(folder); - - for (int i = 0; i < assets.Length; i++) - { - string filename = assets[i]; - byte[] data = File.ReadAllBytes(filename); - - AssetMetadata metadata = new AssetMetadata(); - metadata.CreationDate = File.GetCreationTime(filename); - metadata.Description = String.Empty; - metadata.FullID = SimpleUtils.ParseUUIDFromFilename(filename); - metadata.Name = SimpleUtils.ParseNameFromFilename(filename); - metadata.SHA1 = OpenMetaverse.Utils.SHA1(data); - metadata.Temporary = false; - metadata.ContentType = Utils.ExtensionToContentType(Path.GetExtension(filename).TrimStart('.')); - - // Store the loaded data - metadataStorage[metadata.FullID] = metadata; - filenames[metadata.FullID] = filename; - } - } - catch (Exception ex) - { - m_log.Warn("[SIMPLEASSETSTORAGE]: " + ex.Message); - } - } - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleInventoryStoragePlugin.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleInventoryStoragePlugin.cs deleted file mode 100644 index 4010818d00..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleInventoryStoragePlugin.cs +++ /dev/null @@ -1,625 +0,0 @@ -/* - * 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 System.Collections.Generic; -using System.IO; -using System.Text; -using OpenMetaverse; -using OpenSim.Framework; -using log4net; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins.Simple -{ - public class SimpleInventoryStoragePlugin : IInventoryStorageProvider - { - const string EXTENSION_NAME = "SimpleInventoryStorage"; // Used for metrics reporting - const string DEFAULT_INVENTORY_DIR = "SimpleInventory"; - - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - AssetInventoryServer server; - Dictionary inventories = new Dictionary(); - Dictionary> activeGestures = new Dictionary>(); - Utils.InventoryItemSerializer itemSerializer = new Utils.InventoryItemSerializer(); - Utils.InventoryFolderSerializer folderSerializer = new Utils.InventoryFolderSerializer(); - - public SimpleInventoryStoragePlugin() - { - } - - #region Required Interfaces - - public BackendResponse TryFetchItem(Uri owner, UUID itemID, out InventoryItemBase item) - { - item = null; - BackendResponse ret; - - InventoryCollection collection; - if (inventories.TryGetValue(owner, out collection) && collection.Items.TryGetValue(itemID, out item)) - ret = BackendResponse.Success; - else - ret = BackendResponse.NotFound; - - server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, itemID, false, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder) - { - folder = null; - BackendResponse ret; - - InventoryCollection collection; - if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) - ret = BackendResponse.Success; - else - ret = BackendResponse.NotFound; - - server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchFolderContents(Uri owner, UUID folderID, out InventoryCollection contents) - { - contents = null; - BackendResponse ret; - - InventoryCollection collection; - InventoryFolderWithChildren folder; - - if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) - { - contents = new InventoryCollection(); - contents.UserID = collection.UserID; - contents.Folders = new Dictionary(); - contents.Items = new Dictionary(); - - foreach (InventoryNodeBase invBase in folder.Children.Values) - { - if (invBase is InventoryItemBase) - { - InventoryItemBase invItem = invBase as InventoryItemBase; - contents.Items.Add(invItem.ID, invItem); - } - else - { - InventoryFolderWithChildren invFolder = invBase as InventoryFolderWithChildren; - contents.Folders.Add(invFolder.ID, invFolder); - } - } - - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.NotFound; - } - - server.MetricsProvider.LogInventoryFetchFolderContents(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchFolderList(Uri owner, out List folders) - { - folders = null; - BackendResponse ret; - - InventoryCollection collection; - if (inventories.TryGetValue(owner, out collection)) - { - folders = new List(collection.Folders.Values); - return BackendResponse.Success; - } - else - { - ret = BackendResponse.NotFound; - } - - server.MetricsProvider.LogInventoryFetchFolderList(EXTENSION_NAME, ret, owner, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchInventory(Uri owner, out InventoryCollection inventory) - { - inventory = null; - BackendResponse ret; - - if (inventories.TryGetValue(owner, out inventory)) - ret = BackendResponse.Success; - else - ret = BackendResponse.NotFound; - - server.MetricsProvider.LogInventoryFetchInventory(EXTENSION_NAME, ret, owner, DateTime.Now); - return ret; - } - - public BackendResponse TryFetchActiveGestures(Uri owner, out List gestures) - { - gestures = null; - BackendResponse ret; - - if (activeGestures.TryGetValue(owner, out gestures)) - ret = BackendResponse.Success; - else - ret = BackendResponse.NotFound; - - server.MetricsProvider.LogInventoryFetchActiveGestures(EXTENSION_NAME, ret, owner, DateTime.Now); - return ret; - } - - public BackendResponse TryCreateItem(Uri owner, InventoryItemBase item) - { - BackendResponse ret; - - InventoryCollection collection; - if (inventories.TryGetValue(owner, out collection)) - { - // Delete this item first if it already exists - InventoryItemBase oldItem; - if (collection.Items.TryGetValue(item.ID, out oldItem)) - TryDeleteItem(owner, item.ID); - - try - { - // Create the file - SaveItem(item); - - // Add the item to the collection - lock (collection) collection.Items[item.ID] = item; - - // Add the item to its parent folder - InventoryFolderWithChildren parent; - if (collection.Folders.TryGetValue(item.Folder, out parent)) - lock (parent.Children) parent.Children.Add(item.ID, item); - - // Add active gestures to our list - if (item.InvType == (int)InventoryType.Gesture && item.Flags == 1) - { - lock (activeGestures) - activeGestures[owner].Add(item); - } - - ret = BackendResponse.Success; - } - catch (Exception ex) - { - m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); - ret = BackendResponse.Failure; - } - } - else - { - return BackendResponse.NotFound; - } - - server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, false, DateTime.Now); - return ret; - } - - public BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder) - { - BackendResponse ret; - - InventoryCollection collection; - if (inventories.TryGetValue(owner, out collection)) - { - // Delete this folder first if it already exists - InventoryFolderWithChildren oldFolder; - if (collection.Folders.TryGetValue(folder.ID, out oldFolder)) - TryDeleteFolder(owner, folder.ID); - - try - { - // Create the file - SaveFolder(folder); - - // Add the folder to the collection - lock (collection) collection.Folders[folder.ID] = folder; - - // Add the folder to its parent folder - InventoryFolderWithChildren parent; - if (collection.Folders.TryGetValue(folder.ParentID, out parent)) - lock (parent.Children) parent.Children.Add(folder.ID, folder); - - ret = BackendResponse.Success; - } - catch (Exception ex) - { - m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); - ret = BackendResponse.Failure; - } - } - else - { - ret = BackendResponse.NotFound; - } - - server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, true, DateTime.Now); - return ret; - } - - public BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder) - { - BackendResponse ret; - - lock (inventories) - { - if (!inventories.ContainsKey(owner)) - { - InventoryCollection collection = new InventoryCollection(); - collection.UserID = rootFolder.Owner; - collection.Folders = new Dictionary(); - collection.Folders.Add(rootFolder.ID, rootFolder); - collection.Items = new Dictionary(); - - inventories.Add(owner, collection); - - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.Failure; - } - } - - if (ret == BackendResponse.Success) - { - string path = Path.Combine(DEFAULT_INVENTORY_DIR, rootFolder.Owner.ToString()); - try - { - // Create the directory for this agent - Directory.CreateDirectory(path); - - // Create an index.txt containing the UUID and URI for this agent - string[] index = new string[] { rootFolder.Owner.ToString(), owner.ToString() }; - File.WriteAllLines(Path.Combine(path, "index.txt"), index); - - // Create the root folder file - SaveFolder(rootFolder); - } - catch (Exception ex) - { - m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); - ret = BackendResponse.Failure; - } - } - - server.MetricsProvider.LogInventoryCreateInventory(EXTENSION_NAME, ret, DateTime.Now); - return ret; - } - - public BackendResponse TryDeleteItem(Uri owner, UUID itemID) - { - BackendResponse ret; - - InventoryCollection collection; - InventoryItemBase item; - if (inventories.TryGetValue(owner, out collection) && collection.Items.TryGetValue(itemID, out item)) - { - // Remove the item from its parent folder - InventoryFolderWithChildren parent; - if (collection.Folders.TryGetValue(item.Folder, out parent)) - lock (parent.Children) parent.Children.Remove(itemID); - - // Remove the item from the collection - lock (collection) collection.Items.Remove(itemID); - - // Remove from the active gestures list if applicable - if (item.InvType == (int)InventoryType.Gesture) - { - lock (activeGestures) - { - for (int i = 0; i < activeGestures[owner].Count; i++) - { - if (activeGestures[owner][i].ID == itemID) - { - activeGestures[owner].RemoveAt(i); - break; - } - } - } - } - - // Delete the file. We don't know exactly what the file name is, - // so search for it - string path = PathFromURI(owner); - string[] matches = Directory.GetFiles(path, String.Format("*{0}.item", itemID), SearchOption.TopDirectoryOnly); - foreach (string match in matches) - { - try { File.Delete(match); } - catch (Exception ex) { m_log.ErrorFormat("[SIMPLEINVENTORYSTORAGE]: Failed to delete file {0}: {1}", match, ex.Message); } - } - - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.NotFound; - } - - server.MetricsProvider.LogInventoryDelete(EXTENSION_NAME, ret, owner, itemID, false, DateTime.Now); - return ret; - } - - public BackendResponse TryDeleteFolder(Uri owner, UUID folderID) - { - BackendResponse ret; - - InventoryCollection collection; - InventoryFolderWithChildren folder; - if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) - { - // Remove the folder from its parent folder - InventoryFolderWithChildren parent; - if (collection.Folders.TryGetValue(folder.ParentID, out parent)) - lock (parent.Children) parent.Children.Remove(folderID); - - // Remove the folder from the collection - lock (collection) collection.Items.Remove(folderID); - - // Delete the folder file. We don't know exactly what the file name is, - // so search for it - string path = PathFromURI(owner); - string[] matches = Directory.GetFiles(path, String.Format("*{0}.folder", folderID), SearchOption.TopDirectoryOnly); - foreach (string match in matches) - { - try { File.Delete(match); } - catch (Exception ex) { m_log.ErrorFormat("[SIMPLEINVENTORYSTORAGE]: Failed to delete folder file {0}: {1}", match, ex.Message); } - } - - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.NotFound; - } - - server.MetricsProvider.LogInventoryDelete(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); - return ret; - } - - public BackendResponse TryPurgeFolder(Uri owner, UUID folderID) - { - BackendResponse ret; - - InventoryCollection collection; - InventoryFolderWithChildren folder; - if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) - { - // Delete all of the folder children - foreach (InventoryNodeBase obj in new List(folder.Children.Values)) - { - if (obj is InventoryItemBase) - { - TryDeleteItem(owner, (obj as InventoryItemBase).ID); - } - else - { - InventoryFolderWithChildren childFolder = obj as InventoryFolderWithChildren; - TryPurgeFolder(owner, childFolder.ID); - TryDeleteFolder(owner, childFolder.ID); - } - } - - ret = BackendResponse.Success; - } - else - { - ret = BackendResponse.NotFound; - } - - server.MetricsProvider.LogInventoryPurgeFolder(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); - return ret; - } - - #endregion Required Interfaces - - void SaveItem(InventoryItemBase item) - { - string filename = String.Format("{0}-{1}.item", SanitizeFilename(item.Name), item.ID); - - string path = Path.Combine(DEFAULT_INVENTORY_DIR, item.Owner.ToString()); - path = Path.Combine(path, filename); - - using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write)) - { - itemSerializer.Serialize(stream, item); - stream.Flush(); - } - } - - void SaveFolder(InventoryFolderWithChildren folder) - { - string filename = String.Format("{0}-{1}.folder", SanitizeFilename(folder.Name), folder.ID); - - string path = Path.Combine(DEFAULT_INVENTORY_DIR, folder.Owner.ToString()); - path = Path.Combine(path, filename); - - using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write)) - { - folderSerializer.Serialize(stream, folder); - stream.Flush(); - } - } - - string SanitizeFilename(string filename) - { - string output = filename; - - if (output.Length > 64) - output = output.Substring(0, 64); - - foreach (char i in Path.GetInvalidFileNameChars()) - output = output.Replace(i, '_'); - - return output; - } - - static string PathFromURI(Uri uri) - { - byte[] hash = OpenMetaverse.Utils.SHA1(Encoding.UTF8.GetBytes(uri.ToString())); - StringBuilder digest = new StringBuilder(40); - - // Convert the hash to a hex string - foreach (byte b in hash) - digest.AppendFormat(OpenMetaverse.Utils.EnUsCulture, "{0:x2}", b); - - return Path.Combine(DEFAULT_INVENTORY_DIR, digest.ToString()); - } - - void LoadFiles(string folder) - { - // Try to create the directory if it doesn't already exist - if (!Directory.Exists(folder)) - { - try { Directory.CreateDirectory(folder); } - catch (Exception ex) - { - m_log.Warn("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); - return; - } - } - - try - { - string[] agentFolders = Directory.GetDirectories(DEFAULT_INVENTORY_DIR); - - for (int i = 0; i < agentFolders.Length; i++) - { - string foldername = agentFolders[i]; - string indexPath = Path.Combine(foldername, "index.txt"); - UUID ownerID = UUID.Zero; - Uri owner = null; - - try - { - string[] index = File.ReadAllLines(indexPath); - ownerID = UUID.Parse(index[0]); - owner = new Uri(index[1]); - } - catch (Exception ex) - { - m_log.WarnFormat("[SIMPLEINVENTORYSTORAGE]: Failed loading the index file {0}: {1}", indexPath, ex.Message); - } - - if (ownerID != UUID.Zero && owner != null) - { - // Initialize the active gestures list for this agent - activeGestures.Add(owner, new List()); - - InventoryCollection collection = new InventoryCollection(); - collection.UserID = ownerID; - - // Load all of the folders for this agent - string[] folders = Directory.GetFiles(foldername, "*.folder", SearchOption.TopDirectoryOnly); - collection.Folders = new Dictionary(folders.Length); - - for (int j = 0; j < folders.Length; j++) - { - InventoryFolderWithChildren invFolder = (InventoryFolderWithChildren)folderSerializer.Deserialize( - new FileStream(folders[j], FileMode.Open, FileAccess.Read)); - collection.Folders[invFolder.ID] = invFolder; - } - - // Iterate over the folders collection, adding children to their parents - foreach (InventoryFolderWithChildren invFolder in collection.Folders.Values) - { - InventoryFolderWithChildren parent; - if (collection.Folders.TryGetValue(invFolder.ParentID, out parent)) - parent.Children[invFolder.ID] = invFolder; - } - - // Load all of the items for this agent - string[] files = Directory.GetFiles(foldername, "*.item", SearchOption.TopDirectoryOnly); - collection.Items = new Dictionary(files.Length); - - for (int j = 0; j < files.Length; j++) - { - InventoryItemBase invItem = (InventoryItemBase)itemSerializer.Deserialize( - new FileStream(files[j], FileMode.Open, FileAccess.Read)); - collection.Items[invItem.ID] = invItem; - - // Add items to their parent folders - InventoryFolderWithChildren parent; - if (collection.Folders.TryGetValue(invItem.Folder, out parent)) - parent.Children[invItem.ID] = invItem; - - // Add active gestures to our list - if (invItem.InvType == (int)InventoryType.Gesture && invItem.Flags != 0) - activeGestures[owner].Add(invItem); - } - - inventories.Add(owner, collection); - } - } - } - catch (Exception ex) - { - m_log.ErrorFormat("[SIMPLEINVENTORYSTORAGE]: Failed loading inventory from {0}: {1}", folder, ex.Message); - } - } - - #region IPlugin implementation - - public void Initialise(AssetInventoryServer server) - { - this.server = server; - - LoadFiles(DEFAULT_INVENTORY_DIR); - - m_log.InfoFormat("[SIMPLEINVENTORYSTORAGE]: Initialized the inventory index with data for {0} avatars", - inventories.Count); - } - - /// - /// Initialises asset interface - /// - public void Initialise() - { - m_log.InfoFormat("[SIMPLEINVENTORYSTORAGE]: {0} cannot be default-initialized!", Name); - throw new PluginNotInitialisedException(Name); - } - - public void Dispose() - { - } - - public string Version - { - // TODO: this should be something meaningful and not hardcoded? - get { return "0.1"; } - } - - public string Name - { - get { return "SimpleInventoryStorage"; } - } - - #endregion IPlugin implementation - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleUtils.cs b/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleUtils.cs deleted file mode 100644 index 0d5c53aefe..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Plugins/Simple/SimpleUtils.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.IO; -using OpenMetaverse; - -namespace OpenSim.Grid.AssetInventoryServer.Plugins.Simple -{ - public static class SimpleUtils - { - public static string ParseNameFromFilename(string filename) - { - filename = Path.GetFileName(filename); - - int dot = filename.LastIndexOf('.'); - int firstDash = filename.IndexOf('-'); - - if (dot - 37 > 0 && firstDash > 0) - return filename.Substring(0, firstDash); - else - return String.Empty; - } - - public static UUID ParseUUIDFromFilename(string filename) - { - int dot = filename.LastIndexOf('.'); - - if (dot > 35) - { - // Grab the last 36 characters of the filename - string uuidString = filename.Substring(dot - 36, 36); - UUID uuid; - UUID.TryParse(uuidString, out uuid); - return uuid; - } - else - { - UUID uuid; - if (UUID.TryParse(Path.GetFileName(filename), out uuid)) - return uuid; - else - return UUID.Zero; - } - } - } -} diff --git a/OpenSim/Grid/AssetInventoryServer/Utils.cs b/OpenSim/Grid/AssetInventoryServer/Utils.cs deleted file mode 100644 index 9bbc0bcbc1..0000000000 --- a/OpenSim/Grid/AssetInventoryServer/Utils.cs +++ /dev/null @@ -1,1031 +0,0 @@ -/* - * 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.Globalization; -using System.Xml; -using System.Xml.Serialization; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Framework.Servers; -using OpenSim.Framework.Servers.HttpServer; - -namespace OpenSim.Grid.AssetInventoryServer -{ - public static class Utils - { - public static UUID GetAuthToken(OSHttpRequest request) - { - UUID authToken = UUID.Zero; - - string[] authHeader = request.Headers.GetValues("Authorization"); - if (authHeader != null && authHeader.Length == 1) - { - // Example header: - // Authorization: OpenGrid 65fda0b5-4446-42f5-b828-aaf644293646 - string[] authHeaderParts = authHeader[0].Split(' '); - if (authHeaderParts.Length == 2 && authHeaderParts[0] == "OpenGrid") - UUID.TryParse(authHeaderParts[1], out authToken); - } - - //if (authToken == UUID.Zero && request.Cookies != null) - //{ - // // Check for an authToken cookie to make logins browser-compatible - // RequestCookie authCookie = request.Cookies["authToken"]; - // if (authCookie != null) - // UUID.TryParse(authCookie.Value, out authToken); - //} - - return authToken; - } - - public static Uri GetOpenSimUri(UUID avatarID) - { - return new Uri("http://opensim/" + avatarID.ToString()); - } - - public static bool TryGetOpenSimUUID(Uri avatarUri, out UUID avatarID) - { - string[] parts = avatarUri.Segments; - return UUID.TryParse(parts[parts.Length - 1], out avatarID); - } - - #region SL / file extension / content-type conversions - - public static string SLAssetTypeToContentType(int assetType) - { - switch (assetType) - { - case 0: - return "image/jp2"; - case 1: - return "application/ogg"; - case 2: - return "application/x-metaverse-callingcard"; - case 3: - return "application/x-metaverse-landmark"; - case 5: - return "application/x-metaverse-clothing"; - case 6: - return "application/x-metaverse-primitive"; - case 7: - return "application/x-metaverse-notecard"; - case 8: - return "application/x-metaverse-folder"; - case 10: - return "application/x-metaverse-lsl"; - case 11: - return "application/x-metaverse-lso"; - case 12: - return "image/tga"; - case 13: - return "application/x-metaverse-bodypart"; - case 17: - return "audio/x-wav"; - case 19: - return "image/jpeg"; - case 20: - return "application/x-metaverse-animation"; - case 21: - return "application/x-metaverse-gesture"; - case 22: - return "application/x-metaverse-simstate"; - default: - return "application/octet-stream"; - } - } - - public static int ContentTypeToSLAssetType(string contentType) - { - switch (contentType) - { - case "image/jp2": - return 0; - case "application/ogg": - return 1; - case "application/x-metaverse-callingcard": - return 2; - case "application/x-metaverse-landmark": - return 3; - case "application/x-metaverse-clothing": - return 5; - case "application/x-metaverse-primitive": - return 6; - case "application/x-metaverse-notecard": - return 7; - case "application/x-metaverse-lsl": - return 10; - case "application/x-metaverse-lso": - return 11; - case "image/tga": - return 12; - case "application/x-metaverse-bodypart": - return 13; - case "audio/x-wav": - return 17; - case "image/jpeg": - return 19; - case "application/x-metaverse-animation": - return 20; - case "application/x-metaverse-gesture": - return 21; - case "application/x-metaverse-simstate": - return 22; - default: - return -1; - } - } - - public static string ContentTypeToExtension(string contentType) - { - switch (contentType) - { - case "image/jp2": - return "texture"; - case "application/ogg": - return "ogg"; - case "application/x-metaverse-callingcard": - return "callingcard"; - case "application/x-metaverse-landmark": - return "landmark"; - case "application/x-metaverse-clothing": - return "clothing"; - case "application/x-metaverse-primitive": - return "primitive"; - case "application/x-metaverse-notecard": - return "notecard"; - case "application/x-metaverse-lsl": - return "lsl"; - case "application/x-metaverse-lso": - return "lso"; - case "image/tga": - return "tga"; - case "application/x-metaverse-bodypart": - return "bodypart"; - case "audio/x-wav": - return "wav"; - case "image/jpeg": - return "jpg"; - case "application/x-metaverse-animation": - return "animation"; - case "application/x-metaverse-gesture": - return "gesture"; - case "application/x-metaverse-simstate": - return "simstate"; - default: - return "bin"; - } - } - - public static string ExtensionToContentType(string extension) - { - switch (extension) - { - case "texture": - case "jp2": - case "j2c": - return "image/jp2"; - case "sound": - case "ogg": - return "application/ogg"; - case "callingcard": - return "application/x-metaverse-callingcard"; - case "landmark": - return "application/x-metaverse-landmark"; - case "clothing": - return "application/x-metaverse-clothing"; - case "primitive": - return "application/x-metaverse-primitive"; - case "notecard": - return "application/x-metaverse-notecard"; - case "lsl": - return "application/x-metaverse-lsl"; - case "lso": - return "application/x-metaverse-lso"; - case "tga": - return "image/tga"; - case "bodypart": - return "application/x-metaverse-bodypart"; - case "wav": - return "audio/x-wav"; - case "jpg": - case "jpeg": - return "image/jpeg"; - case "animation": - return "application/x-metaverse-animation"; - case "gesture": - return "application/x-metaverse-gesture"; - case "simstate": - return "application/x-metaverse-simstate"; - case "txt": - return "text/plain"; - case "xml": - return "application/xml"; - default: - return "application/octet-stream"; - } - } - - #endregion SL / file extension / content-type conversions - - #region XML Serialization - - public class GeneratedReader : XmlSerializationReader - { - public object ReadRoot_InventoryFolderBase() - { - Reader.MoveToContent(); - if (Reader.LocalName != "InventoryFolderBase" || Reader.NamespaceURI != "") - throw CreateUnknownNodeException(); - return ReadObject_InventoryFolder(true, true); - } - - public object ReadRoot_InventoryItemBase() - { - Reader.MoveToContent(); - if (Reader.LocalName != "InventoryItemBase" || Reader.NamespaceURI != "") - throw CreateUnknownNodeException(); - return ReadObject_InventoryItem(true, true); - } - - public object ReadRoot_InventoryCollection() - { - Reader.MoveToContent(); - if (Reader.LocalName != "InventoryCollection" || Reader.NamespaceURI != "") - throw CreateUnknownNodeException(); - return ReadObject_InventoryCollection(true, true); - } - - public InventoryFolderWithChildren ReadObject_InventoryFolder(bool isNullable, bool checkType) - { - InventoryFolderWithChildren ob = null; - if (isNullable && ReadNull()) return null; - - if (checkType) - { - System.Xml.XmlQualifiedName t = GetXsiType(); - if (t == null) - { } - else if (t.Name != "InventoryFolderBase" || t.Namespace != "") - throw CreateUnknownTypeException(t); - } - - ob = (InventoryFolderWithChildren)Activator.CreateInstance(typeof(InventoryFolderWithChildren), true); - - Reader.MoveToElement(); - - while (Reader.MoveToNextAttribute()) - { - if (IsXmlnsAttribute(Reader.Name)) - { - } - else - { - UnknownNode(ob); - } - } - - Reader.MoveToElement(); - Reader.MoveToElement(); - if (Reader.IsEmptyElement) - { - Reader.Skip(); - return ob; - } - - Reader.ReadStartElement(); - Reader.MoveToContent(); - - bool b0 = false, b1 = false, b2 = false, b3 = false, b4 = false, b5 = false; - - while (Reader.NodeType != System.Xml.XmlNodeType.EndElement) - { - if (Reader.NodeType == System.Xml.XmlNodeType.Element) - { - if (Reader.LocalName == "Owner" && Reader.NamespaceURI == "" && !b1) - { - b1 = true; - ob.@Owner = ReadObject_UUID(false, true); - } - else if (Reader.LocalName == "Version" && Reader.NamespaceURI == "" && !b5) - { - b5 = true; - string s6 = Reader.ReadElementString(); - ob.@Version = UInt16.Parse(s6, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "ID" && Reader.NamespaceURI == "" && !b3) - { - b3 = true; - ob.@ID = ReadObject_UUID(false, true); - } - else if (Reader.LocalName == "Type" && Reader.NamespaceURI == "" && !b4) - { - b4 = true; - string s7 = Reader.ReadElementString(); - ob.@Type = Int16.Parse(s7, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "Name" && Reader.NamespaceURI == "" && !b0) - { - b0 = true; - string s8 = Reader.ReadElementString(); - ob.@Name = s8; - } - else if (Reader.LocalName == "ParentID" && Reader.NamespaceURI == "" && !b2) - { - b2 = true; - ob.@ParentID = ReadObject_UUID(false, true); - } - else - { - UnknownNode(ob); - } - } - else - UnknownNode(ob); - - Reader.MoveToContent(); - } - - ReadEndElement(); - - return ob; - } - - public InventoryItemBase ReadObject_InventoryItem(bool isNullable, bool checkType) - { - InventoryItemBase ob = null; - if (isNullable && ReadNull()) return null; - - if (checkType) - { - System.Xml.XmlQualifiedName t = GetXsiType(); - if (t == null) - { } - else if (t.Name != "InventoryItemBase" || t.Namespace != "") - throw CreateUnknownTypeException(t); - } - - ob = (InventoryItemBase)Activator.CreateInstance(typeof(InventoryItemBase), true); - - Reader.MoveToElement(); - - while (Reader.MoveToNextAttribute()) - { - if (IsXmlnsAttribute(Reader.Name)) - { - } - else - { - UnknownNode(ob); - } - } - - Reader.MoveToElement(); - Reader.MoveToElement(); - if (Reader.IsEmptyElement) - { - Reader.Skip(); - return ob; - } - - Reader.ReadStartElement(); - Reader.MoveToContent(); - - bool b9 = false, b10 = false, b11 = false, b12 = false, b13 = false, b14 = false, b15 = false, b16 = false, b17 = false, b18 = false, b19 = false, b20 = false, b21 = false, b22 = false, b23 = false, b24 = false, b25 = false, b26 = false, b27 = false, b28 = false; - - while (Reader.NodeType != System.Xml.XmlNodeType.EndElement) - { - if (Reader.NodeType == System.Xml.XmlNodeType.Element) - { - if (Reader.LocalName == "GroupPermissions" && Reader.NamespaceURI == "" && !b20) - { - b20 = true; - string s29 = Reader.ReadElementString(); - ob.@GroupPermissions = UInt32.Parse(s29, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "AssetType" && Reader.NamespaceURI == "" && !b21) - { - b21 = true; - string s30 = Reader.ReadElementString(); - ob.@AssetType = Int32.Parse(s30, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "SalePrice" && Reader.NamespaceURI == "" && !b25) - { - b25 = true; - string s31 = Reader.ReadElementString(); - ob.@SalePrice = Int32.Parse(s31, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "AssetID" && Reader.NamespaceURI == "" && !b22) - { - b22 = true; - ob.@AssetID = ReadObject_UUID(false, true); - } - else if (Reader.LocalName == "Folder" && Reader.NamespaceURI == "" && !b11) - { - b11 = true; - ob.@Folder = ReadObject_UUID(false, true); - } - else if (Reader.LocalName == "Name" && Reader.NamespaceURI == "" && !b14) - { - b14 = true; - string s32 = Reader.ReadElementString(); - ob.@Name = s32; - } - else if (Reader.LocalName == "NextPermissions" && Reader.NamespaceURI == "" && !b16) - { - b16 = true; - string s33 = Reader.ReadElementString(); - ob.@NextPermissions = UInt32.Parse(s33, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "BasePermissions" && Reader.NamespaceURI == "" && !b18) - { - b18 = true; - string s34 = Reader.ReadElementString(); - ob.@BasePermissions = UInt32.Parse(s34, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "ID" && Reader.NamespaceURI == "" && !b9) - { - b9 = true; - ob.@ID = ReadObject_UUID(false, true); - } - else if (Reader.LocalName == "Flags" && Reader.NamespaceURI == "" && !b27) - { - b27 = true; - string s35 = Reader.ReadElementString(); - ob.@Flags = UInt32.Parse(s35, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "GroupOwned" && Reader.NamespaceURI == "" && !b24) - { - b24 = true; - string s36 = Reader.ReadElementString(); - ob.@GroupOwned = XmlConvert.ToBoolean(s36); - } - else if (Reader.LocalName == "InvType" && Reader.NamespaceURI == "" && !b10) - { - b10 = true; - string s37 = Reader.ReadElementString(); - ob.@InvType = Int32.Parse(s37, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "GroupID" && Reader.NamespaceURI == "" && !b23) - { - b23 = true; - ob.@GroupID = ReadObject_UUID(false, true); - } - else if (Reader.LocalName == "Description" && Reader.NamespaceURI == "" && !b15) - { - b15 = true; - string s38 = Reader.ReadElementString(); - ob.@Description = s38; - } - else if (Reader.LocalName == "CreationDate" && Reader.NamespaceURI == "" && !b28) - { - b28 = true; - string s39 = Reader.ReadElementString(); - ob.@CreationDate = Int32.Parse(s39, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "EveryOnePermissions" && Reader.NamespaceURI == "" && !b19) - { - b19 = true; - string s40 = Reader.ReadElementString(); - ob.@EveryOnePermissions = UInt32.Parse(s40, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "Creator" && Reader.NamespaceURI == "" && !b13) - { - b13 = true; - ob.@CreatorId = Reader.ReadElementString(); - } - else if (Reader.LocalName == "Owner" && Reader.NamespaceURI == "" && !b12) - { - b12 = true; - ob.@Owner = ReadObject_UUID(false, true); - } - else if (Reader.LocalName == "SaleType" && Reader.NamespaceURI == "" && !b26) - { - b26 = true; - string s41 = Reader.ReadElementString(); - ob.@SaleType = byte.Parse(s41, CultureInfo.InvariantCulture); - } - else if (Reader.LocalName == "CurrentPermissions" && Reader.NamespaceURI == "" && !b17) - { - b17 = true; - string s42 = Reader.ReadElementString(); - ob.@CurrentPermissions = UInt32.Parse(s42, CultureInfo.InvariantCulture); - } - else - { - UnknownNode(ob); - } - } - else - UnknownNode(ob); - - Reader.MoveToContent(); - } - - ReadEndElement(); - - return ob; - } - - public InventoryCollection ReadObject_InventoryCollection(bool isNullable, bool checkType) - { - InventoryCollection ob = null; - if (isNullable && ReadNull()) return null; - - if (checkType) - { - System.Xml.XmlQualifiedName t = GetXsiType(); - if (t == null) - { } - else if (t.Name != "InventoryCollection" || t.Namespace != "") - throw CreateUnknownTypeException(t); - } - - ob = (InventoryCollection)Activator.CreateInstance(typeof(InventoryCollection), true); - - Reader.MoveToElement(); - - while (Reader.MoveToNextAttribute()) - { - if (IsXmlnsAttribute(Reader.Name)) - { - } - else - { - UnknownNode(ob); - } - } - - Reader.MoveToElement(); - Reader.MoveToElement(); - if (Reader.IsEmptyElement) - { - Reader.Skip(); - if (ob.@Folders == null) - { - ob.@Folders = new System.Collections.Generic.Dictionary(); - } - if (ob.@Items == null) - { - ob.@Items = new System.Collections.Generic.Dictionary(); - } - return ob; - } - - Reader.ReadStartElement(); - Reader.MoveToContent(); - - bool b43 = false, b44 = false, b45 = false; - - while (Reader.NodeType != System.Xml.XmlNodeType.EndElement) - { - if (Reader.NodeType == System.Xml.XmlNodeType.Element) - { - if (Reader.LocalName == "UserID" && Reader.NamespaceURI == "" && !b45) - { - b45 = true; - ob.@UserID = ReadObject_UUID(false, true); - } - else if (Reader.LocalName == "Items" && Reader.NamespaceURI == "" && !b44) - { - System.Collections.Generic.Dictionary o46 = ob.@Items; - if (((object)o46) == null) - { - o46 = new System.Collections.Generic.Dictionary(); - ob.@Items = o46; - } - if (Reader.IsEmptyElement) - { - Reader.Skip(); - } - else - { - int n47 = 0; - Reader.ReadStartElement(); - Reader.MoveToContent(); - - while (Reader.NodeType != System.Xml.XmlNodeType.EndElement) - { - if (Reader.NodeType == System.Xml.XmlNodeType.Element) - { - if (Reader.LocalName == "InventoryItemBase" && Reader.NamespaceURI == "") - { - if (((object)o46) == null) - throw CreateReadOnlyCollectionException("System.Collections.Generic.List"); - InventoryItemBase item = ReadObject_InventoryItem(true, true); - o46.Add(item.ID, item); - n47++; - } - else UnknownNode(null); - } - else UnknownNode(null); - - Reader.MoveToContent(); - } - ReadEndElement(); - } - b44 = true; - } - else if (Reader.LocalName == "Folders" && Reader.NamespaceURI == "" && !b43) - { - System.Collections.Generic.Dictionary o48 = ob.@Folders; - if (((object)o48) == null) - { - o48 = new System.Collections.Generic.Dictionary(); - ob.@Folders = o48; - } - if (Reader.IsEmptyElement) - { - Reader.Skip(); - } - else - { - int n49 = 0; - Reader.ReadStartElement(); - Reader.MoveToContent(); - - while (Reader.NodeType != System.Xml.XmlNodeType.EndElement) - { - if (Reader.NodeType == System.Xml.XmlNodeType.Element) - { - if (Reader.LocalName == "InventoryFolderBase" && Reader.NamespaceURI == "") - { - if (((object)o48) == null) - throw CreateReadOnlyCollectionException("System.Collections.Generic.List"); - InventoryFolderWithChildren folder = ReadObject_InventoryFolder(true, true); - o48.Add(folder.ID, folder); - n49++; - } - else UnknownNode(null); - } - else UnknownNode(null); - - Reader.MoveToContent(); - } - ReadEndElement(); - } - b43 = true; - } - else - { - UnknownNode(ob); - } - } - else - UnknownNode(ob); - - Reader.MoveToContent(); - } - if (ob.@Folders == null) - { - ob.@Folders = new System.Collections.Generic.Dictionary(); - } - if (ob.@Items == null) - { - ob.@Items = new System.Collections.Generic.Dictionary(); - } - - ReadEndElement(); - - return ob; - } - - public OpenMetaverse.UUID ReadObject_UUID(bool isNullable, bool checkType) - { - OpenMetaverse.UUID ob = (OpenMetaverse.UUID)Activator.CreateInstance(typeof(OpenMetaverse.UUID), true); - System.Xml.XmlQualifiedName t = GetXsiType(); - if (t == null) - { } - else if (t.Name != "UUID" || t.Namespace != "") - throw CreateUnknownTypeException(t); - - Reader.MoveToElement(); - - while (Reader.MoveToNextAttribute()) - { - if (IsXmlnsAttribute(Reader.Name)) - { - } - else - { - UnknownNode(ob); - } - } - - Reader.MoveToElement(); - Reader.MoveToElement(); - if (Reader.IsEmptyElement) - { - Reader.Skip(); - return ob; - } - - Reader.ReadStartElement(); - Reader.MoveToContent(); - - bool b52 = false; - - while (Reader.NodeType != System.Xml.XmlNodeType.EndElement) - { - if (Reader.NodeType == System.Xml.XmlNodeType.Element) - { - if (Reader.LocalName == "Guid" && Reader.NamespaceURI == "" && !b52) - { - b52 = true; - string s53 = Reader.ReadElementString(); - ob.@Guid = XmlConvert.ToGuid(s53); - } - else - { - UnknownNode(ob); - } - } - else - UnknownNode(ob); - - Reader.MoveToContent(); - } - - ReadEndElement(); - - return ob; - } - - protected override void InitCallbacks() - { - } - - protected override void InitIDs() - { - } - } - - public class GeneratedWriter : XmlSerializationWriter - { - const string xmlNamespace = "http://www.w3.org/2000/xmlns/"; - //static readonly System.Reflection.MethodInfo toBinHexStringMethod = typeof(XmlConvert).GetMethod("ToBinHexString", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic, null, new Type[] { typeof(byte[]) }, null); - //static string ToBinHexString(byte[] input) - //{ - // return input == null ? null : (string)toBinHexStringMethod.Invoke(null, new object[] { input }); - //} - public void WriteRoot_InventoryFolder(object o) - { - WriteStartDocument(); - InventoryFolderWithChildren ob = (InventoryFolderWithChildren)o; - TopLevelElement(); - WriteObject_InventoryFolder(ob, "InventoryFolderBase", "", true, false, true); - } - - public void WriteRoot_InventoryItem(object o) - { - WriteStartDocument(); - InventoryItemBase ob = (InventoryItemBase)o; - TopLevelElement(); - WriteObject_InventoryItem(ob, "InventoryItemBase", "", true, false, true); - } - - public void WriteRoot_InventoryCollection(object o) - { - WriteStartDocument(); - InventoryCollection ob = (InventoryCollection)o; - TopLevelElement(); - WriteObject_InventoryCollection(ob, "InventoryCollection", "", true, false, true); - } - - void WriteObject_InventoryFolder(InventoryFolderWithChildren ob, string element, string namesp, bool isNullable, bool needType, bool writeWrappingElem) - { - if (((object)ob) == null) - { - if (isNullable) - WriteNullTagLiteral(element, namesp); - return; - } - - System.Type type = ob.GetType(); - if (type == typeof(InventoryFolderWithChildren)) - { } - else - { - throw CreateUnknownTypeException(ob); - } - - if (writeWrappingElem) - { - WriteStartElement(element, namesp, ob); - } - - if (needType) WriteXsiType("InventoryFolderBase", ""); - - WriteElementString("Name", "", ob.@Name); - WriteObject_UUID(ob.@Owner, "Owner", "", false, false, true); - WriteObject_UUID(ob.@ParentID, "ParentID", "", false, false, true); - WriteObject_UUID(ob.@ID, "ID", "", false, false, true); - WriteElementString("Type", "", ob.@Type.ToString(CultureInfo.InvariantCulture)); - WriteElementString("Version", "", ob.@Version.ToString(CultureInfo.InvariantCulture)); - if (writeWrappingElem) WriteEndElement(ob); - } - - void WriteObject_InventoryItem(InventoryItemBase ob, string element, string namesp, bool isNullable, bool needType, bool writeWrappingElem) - { - if (((object)ob) == null) - { - if (isNullable) - WriteNullTagLiteral(element, namesp); - return; - } - - System.Type type = ob.GetType(); - if (type == typeof(InventoryItemBase)) - { } - else - { - throw CreateUnknownTypeException(ob); - } - - if (writeWrappingElem) - { - WriteStartElement(element, namesp, ob); - } - - if (needType) WriteXsiType("InventoryItemBase", ""); - - WriteObject_UUID(ob.@ID, "ID", "", false, false, true); - WriteElementString("InvType", "", ob.@InvType.ToString(CultureInfo.InvariantCulture)); - WriteObject_UUID(ob.@Folder, "Folder", "", false, false, true); - WriteObject_UUID(ob.@Owner, "Owner", "", false, false, true); - WriteElementString("Creator", "", ob.@CreatorId); - WriteElementString("Name", "", ob.@Name); - WriteElementString("Description", "", ob.@Description); - WriteElementString("NextPermissions", "", ob.@NextPermissions.ToString(CultureInfo.InvariantCulture)); - WriteElementString("CurrentPermissions", "", ob.@CurrentPermissions.ToString(CultureInfo.InvariantCulture)); - WriteElementString("BasePermissions", "", ob.@BasePermissions.ToString(CultureInfo.InvariantCulture)); - WriteElementString("EveryOnePermissions", "", ob.@EveryOnePermissions.ToString(CultureInfo.InvariantCulture)); - WriteElementString("GroupPermissions", "", ob.@GroupPermissions.ToString(CultureInfo.InvariantCulture)); - WriteElementString("AssetType", "", ob.@AssetType.ToString(CultureInfo.InvariantCulture)); - WriteObject_UUID(ob.@AssetID, "AssetID", "", false, false, true); - WriteObject_UUID(ob.@GroupID, "GroupID", "", false, false, true); - WriteElementString("GroupOwned", "", (ob.@GroupOwned ? "true" : "false")); - WriteElementString("SalePrice", "", ob.@SalePrice.ToString(CultureInfo.InvariantCulture)); - WriteElementString("SaleType", "", ob.@SaleType.ToString(CultureInfo.InvariantCulture)); - WriteElementString("Flags", "", ob.@Flags.ToString(CultureInfo.InvariantCulture)); - WriteElementString("CreationDate", "", ob.@CreationDate.ToString(CultureInfo.InvariantCulture)); - if (writeWrappingElem) WriteEndElement(ob); - } - - void WriteObject_InventoryCollection(InventoryCollection ob, string element, string namesp, bool isNullable, bool needType, bool writeWrappingElem) - { - if (((object)ob) == null) - { - if (isNullable) - WriteNullTagLiteral(element, namesp); - return; - } - - System.Type type = ob.GetType(); - if (type == typeof(InventoryCollection)) - { } - else - { - throw CreateUnknownTypeException(ob); - } - - if (writeWrappingElem) - { - WriteStartElement(element, namesp, ob); - } - - if (needType) WriteXsiType("InventoryCollection", ""); - - if (ob.@Folders != null) - { - WriteStartElement("Folders", "", ob.@Folders); - foreach (InventoryFolderWithChildren folder in ob.Folders.Values) - { - WriteObject_InventoryFolder(folder, "InventoryFolderBase", "", true, false, true); - } - WriteEndElement(ob.@Folders); - } - if (ob.@Items != null) - { - WriteStartElement("Items", "", ob.@Items); - foreach (InventoryItemBase item in ob.Items.Values) - { - WriteObject_InventoryItem(item, "InventoryItemBase", "", true, false, true); - } - WriteEndElement(ob.@Items); - } - WriteObject_UUID(ob.@UserID, "UserID", "", false, false, true); - if (writeWrappingElem) WriteEndElement(ob); - } - - void WriteObject_UUID(OpenMetaverse.UUID ob, string element, string namesp, bool isNullable, bool needType, bool writeWrappingElem) - { - System.Type type = ob.GetType(); - if (type == typeof(OpenMetaverse.UUID)) - { } - else - { - throw CreateUnknownTypeException(ob); - } - - if (writeWrappingElem) - { - WriteStartElement(element, namesp, ob); - } - - if (needType) WriteXsiType("UUID", ""); - - WriteElementString("Guid", "", XmlConvert.ToString(ob.@Guid)); - if (writeWrappingElem) WriteEndElement(ob); - } - - protected override void InitCallbacks() - { - } - - } - - public class BaseXmlSerializer : System.Xml.Serialization.XmlSerializer - { - protected override System.Xml.Serialization.XmlSerializationReader CreateReader() - { - return new GeneratedReader(); - } - - protected override System.Xml.Serialization.XmlSerializationWriter CreateWriter() - { - return new GeneratedWriter(); - } - - public override bool CanDeserialize(System.Xml.XmlReader xmlReader) - { - return true; - } - } - - public sealed class InventoryFolderSerializer : BaseXmlSerializer - { - protected override void Serialize(object obj, System.Xml.Serialization.XmlSerializationWriter writer) - { - ((GeneratedWriter)writer).WriteRoot_InventoryFolder(obj); - } - - protected override object Deserialize(System.Xml.Serialization.XmlSerializationReader reader) - { - return ((GeneratedReader)reader).ReadRoot_InventoryFolderBase(); - } - } - - public sealed class InventoryItemSerializer : BaseXmlSerializer - { - protected override void Serialize(object obj, System.Xml.Serialization.XmlSerializationWriter writer) - { - ((GeneratedWriter)writer).WriteRoot_InventoryItem(obj); - } - - protected override object Deserialize(System.Xml.Serialization.XmlSerializationReader reader) - { - return ((GeneratedReader)reader).ReadRoot_InventoryItemBase(); - } - } - - public sealed class InventoryCollectionSerializer : BaseXmlSerializer - { - protected override void Serialize(object obj, System.Xml.Serialization.XmlSerializationWriter writer) - { - ((GeneratedWriter)writer).WriteRoot_InventoryCollection(obj); - } - - protected override object Deserialize(System.Xml.Serialization.XmlSerializationReader reader) - { - return ((GeneratedReader)reader).ReadRoot_InventoryCollection(); - } - } - - #endregion XML Serialization - } -} diff --git a/prebuild.xml b/prebuild.xml index ebe5c62c00..0cf88c3aa8 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -987,128 +987,6 @@ - - - - ../../../bin/ - - - - - ../../../bin/ - - - - ../../../bin/ - - - - - - - - - - - - - - - - - - - - - ../../../../bin/ - - - - - ../../../../bin/ - - - - ../../../../bin/ - - - - - - - - - - - - - - - - - - - - - - ../../../../../bin/ - - - - - ../../../../../bin/ - - - - ../../../../../bin/ - - - - - - - - - - - - - - - - - - - - ../../../../../bin/ - - - - - ../../../../../bin/ - - - - ../../../../../bin/ - - - - - - - - - - - - - - - - - - - From e83b00a3dfc5410f5ca6bd2eed3d8565ebbffecf Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 08:51:43 +1000 Subject: [PATCH 23/51] * Implements a bunch of stuff in NPCModule --- .../OptionalModules/World/NPC/NPCModule.cs | 64 ++++++++++++++++--- .../Shared/Api/Implementation/LSL_Api.cs | 48 +++++++------- 2 files changed, 80 insertions(+), 32 deletions(-) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 8c9717caa2..a3cefc95bc 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -25,26 +25,74 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System.Collections.Generic; using OpenMetaverse; using Nini.Config; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; +using OpenSim.Framework; namespace OpenSim.Region.OptionalModules.World.NPC { - public class NPCModule : IRegionModule + public interface INPCModule + { + UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom); + void Autopilot(UUID agentID, Scene scene, Vector3 pos); + void Say(UUID agentID, Scene scene, string text); + void DeleteNPC(UUID agentID, Scene scene); + } + + public class NPCModule : IRegionModule, INPCModule { // private const bool m_enabled = false; + private Dictionary m_avatars = new Dictionary(); + + public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom) + { + NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, scene); + scene.AddNewClient(npcAvatar); + + ScenePresence sp; + if(scene.TryGetAvatar(npcAvatar.AgentId, out sp)) + { + AvatarAppearance x = scene.CommsManager.AvatarService.GetUserAppearance(cloneAppearanceFrom); + + List wearbyte = new List(); + for (int i = 0; i < x.VisualParams.Length; i++) + { + wearbyte.Add(x.VisualParams[i]); + } + + sp.SetAppearance(x.Texture.GetBytes(), wearbyte); + } + + m_avatars.Add(npcAvatar.AgentId, npcAvatar); + + return npcAvatar.AgentId; + } + + public void Autopilot(UUID agentID, Scene scene, Vector3 pos) + { + ScenePresence sp; + scene.TryGetAvatar(agentID, out sp); + sp.DoAutoPilot(0,pos,m_avatars[agentID]); + } + + public void Say(UUID agentID, Scene scene, string text) + { + m_avatars[agentID].Say(text); + } + + public void DeleteNPC(UUID agentID, Scene scene) + { + scene.RemoveClient(agentID); + } + + public void Initialise(Scene scene, IConfigSource source) { - // if (m_enabled) - // { - // NPCAvatar testAvatar = new NPCAvatar("Jack", "NPC", new Vector3(128, 128, 40), scene); - // NPCAvatar testAvatar2 = new NPCAvatar("Jill", "NPC", new Vector3(136, 128, 40), scene); - // scene.AddNewClient(testAvatar); - // scene.AddNewClient(testAvatar2); - // } + scene.RegisterModuleInterface(this); } public void PostInitialise() diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 4e665e9893..972e71cb28 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1978,30 +1978,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return new LSL_Rotation(q.X, q.Y, q.Z, q.W); } - private LSL_Rotation GetPartRot( SceneObjectPart part ) - { - Quaternion q; - if (part.LinkNum == 0 || part.LinkNum == 1) // unlinked or root prim - { - if (part.ParentGroup.RootPart.AttachmentPoint != 0) - { - ScenePresence avatar = World.GetScenePresence(part.AttachedAvatar); - if (avatar != null) - if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) - q = avatar.CameraRotation; // Mouselook - else - q = avatar.Rotation; // Currently infrequently updated so may be inaccurate - else - q = part.ParentGroup.GroupRotation; // Likely never get here but just in case - } - else - q = part.ParentGroup.GroupRotation; // just the group rotation - return new LSL_Rotation(q.X, q.Y, q.Z, q.W); - } - q = part.GetWorldRotation(); - return new LSL_Rotation(q.X, q.Y, q.Z, q.W); - } - + private LSL_Rotation GetPartRot( SceneObjectPart part ) + { + Quaternion q; + if (part.LinkNum == 0 || part.LinkNum == 1) // unlinked or root prim + { + if (part.ParentGroup.RootPart.AttachmentPoint != 0) + { + ScenePresence avatar = World.GetScenePresence(part.AttachedAvatar); + if (avatar != null) + if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) + q = avatar.CameraRotation; // Mouselook + else + q = avatar.Rotation; // Currently infrequently updated so may be inaccurate + else + q = part.ParentGroup.GroupRotation; // Likely never get here but just in case + } + else + q = part.ParentGroup.GroupRotation; // just the group rotation + return new LSL_Rotation(q.X, q.Y, q.Z, q.W); + } + q = part.GetWorldRotation(); + return new LSL_Rotation(q.X, q.Y, q.Z, q.W); + } + public LSL_Rotation llGetLocalRot() { m_host.AddScriptLPS(1); From 118f710a79c68da04861941a3304b1dba2c847bb Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 20 Aug 2009 16:18:32 -0700 Subject: [PATCH 24/51] Fixed a missing field in SendBulkInventoryFolderUpdate. --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 6969a3db1d..a7a5aa3788 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -2177,7 +2177,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP bulkUpdate.AgentData.AgentID = AgentId; bulkUpdate.AgentData.TransactionID = transactionId; bulkUpdate.FolderData = folderDataBlocks.ToArray(); - + List foo = new List(); + bulkUpdate.ItemData = foo.ToArray(); + //m_log.Debug("SendBulkUpdateInventory :" + bulkUpdate); OutPacket(bulkUpdate, ThrottleOutPacketType.Asset); } From 70c870972a4b534f38eaa3ae1c9b076b472f7d75 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 21 Aug 2009 00:25:50 +0100 Subject: [PATCH 25/51] Fix the user and password defaults int he remote console setup --- OpenSim/Framework/GridConfig.cs | 4 ++-- OpenSim/Framework/MessageServerConfig.cs | 4 ++-- OpenSim/Framework/UserConfig.cs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Framework/GridConfig.cs b/OpenSim/Framework/GridConfig.cs index 87fd3f0275..9aa5d03b8c 100644 --- a/OpenSim/Framework/GridConfig.cs +++ b/OpenSim/Framework/GridConfig.cs @@ -98,10 +98,10 @@ namespace OpenSim.Framework "True", false); m_configMember.addConfigurationOption("console_user", ConfigurationOption.ConfigurationTypes.TYPE_STRING, - "Remote console access user name [Default: disabled]", "0", false); + "Remote console access user name [Default: disabled]", "", false); m_configMember.addConfigurationOption("console_pass", ConfigurationOption.ConfigurationTypes.TYPE_STRING, - "Remote console access password [Default: disabled]", "0", false); + "Remote console access password [Default: disabled]", "", false); } diff --git a/OpenSim/Framework/MessageServerConfig.cs b/OpenSim/Framework/MessageServerConfig.cs index 61e5ea7550..884c0eab23 100644 --- a/OpenSim/Framework/MessageServerConfig.cs +++ b/OpenSim/Framework/MessageServerConfig.cs @@ -91,10 +91,10 @@ namespace OpenSim.Framework m_configMember.addConfigurationOption("published_ip", ConfigurationOption.ConfigurationTypes.TYPE_STRING, "My Published IP Address", "127.0.0.1", false); m_configMember.addConfigurationOption("console_user", ConfigurationOption.ConfigurationTypes.TYPE_STRING, - "Remote console access user name [Default: disabled]", "0", false); + "Remote console access user name [Default: disabled]", "", false); m_configMember.addConfigurationOption("console_pass", ConfigurationOption.ConfigurationTypes.TYPE_STRING, - "Remote console access password [Default: disabled]", "0", false); + "Remote console access password [Default: disabled]", "", false); } diff --git a/OpenSim/Framework/UserConfig.cs b/OpenSim/Framework/UserConfig.cs index b9e366553c..16f265cf70 100644 --- a/OpenSim/Framework/UserConfig.cs +++ b/OpenSim/Framework/UserConfig.cs @@ -158,10 +158,10 @@ namespace OpenSim.Framework "Minimum Level a user should have to login [0 default]", "0", false); m_configMember.addConfigurationOption("console_user", ConfigurationOption.ConfigurationTypes.TYPE_STRING, - "Remote console access user name [Default: disabled]", "0", false); + "Remote console access user name [Default: disabled]", "", false); m_configMember.addConfigurationOption("console_pass", ConfigurationOption.ConfigurationTypes.TYPE_STRING, - "Remote console access password [Default: disabled]", "0", false); + "Remote console access password [Default: disabled]", "", false); } From 01f394d2037be62a3d74e2d28ab9e5644f86a9a2 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 11:14:55 +1000 Subject: [PATCH 26/51] * Fleshes more of NPCModule out. * Implements some OSSL commands: key osNpcCreate(string user, string name, vector position, key cloneFrom); void osNpcMoveTo(key npc, vector position); void osNpcSay(key npc, string message); void osNpcRemove(key npc); * Untested. Requires ThreatLevel.High. --- .../CoreModules/Avatar/NPC/INPCModule.cs | 13 +++++ .../OptionalModules/World/NPC/NPCModule.cs | 32 +++++++----- .../Shared/Api/Implementation/OSSL_Api.cs | 52 +++++++++++++++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 6 +++ 4 files changed, 90 insertions(+), 13 deletions(-) create mode 100644 OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs diff --git a/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs b/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs new file mode 100644 index 0000000000..7d5c310c55 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs @@ -0,0 +1,13 @@ +using OpenMetaverse; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.CoreModules.Avatar.NPC +{ + public interface INPCModule + { + UUID CreateNPC(string firstname, string lastname, Vector3 position, Scene scene, UUID cloneAppearanceFrom); + void Autopilot(UUID agentID, Scene scene, Vector3 pos); + void Say(UUID agentID, Scene scene, string text); + void DeleteNPC(UUID agentID, Scene scene); + } +} \ No newline at end of file diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index a3cefc95bc..94349f6043 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -30,18 +30,11 @@ using OpenMetaverse; using Nini.Config; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.CoreModules.Avatar.NPC; using OpenSim.Framework; namespace OpenSim.Region.OptionalModules.World.NPC { - public interface INPCModule - { - UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom); - void Autopilot(UUID agentID, Scene scene, Vector3 pos); - void Say(UUID agentID, Scene scene, string text); - void DeleteNPC(UUID agentID, Scene scene); - } - public class NPCModule : IRegionModule, INPCModule { // private const bool m_enabled = false; @@ -74,19 +67,32 @@ namespace OpenSim.Region.OptionalModules.World.NPC public void Autopilot(UUID agentID, Scene scene, Vector3 pos) { - ScenePresence sp; - scene.TryGetAvatar(agentID, out sp); - sp.DoAutoPilot(0,pos,m_avatars[agentID]); + lock (m_avatars) + if (m_avatars.ContainsKey(agentID)) + { + ScenePresence sp; + scene.TryGetAvatar(agentID, out sp); + sp.DoAutoPilot(0, pos, m_avatars[agentID]); + } } public void Say(UUID agentID, Scene scene, string text) { - m_avatars[agentID].Say(text); + lock (m_avatars) + if (m_avatars.ContainsKey(agentID)) + { + m_avatars[agentID].Say(text); + } } public void DeleteNPC(UUID agentID, Scene scene) { - scene.RemoveClient(agentID); + lock(m_avatars) + if (m_avatars.ContainsKey(agentID)) + { + scene.RemoveClient(agentID); + m_avatars.Remove(agentID); + } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 6e3a3abb61..fcfa9fc482 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -37,6 +37,7 @@ using OpenSim; using OpenSim.Framework; using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Console; +using OpenSim.Region.CoreModules.Avatar.NPC; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes.Hypergrid; @@ -1762,5 +1763,56 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return retVal; } + public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, LSL_Key cloneFrom) + { + CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); + + INPCModule module = World.RequestModuleInterface(); + if (module != null) + { + UUID x = module.CreateNPC(firstname, + lastname, + new Vector3((float) position.x, (float) position.y, (float) position.z), + World, + new UUID(cloneFrom)); + + return new LSL_Key(x.ToString()); + } + return new LSL_Key(UUID.Zero.ToString()); + } + + public void osNpcMoveTo(LSL_Key npc, LSL_Vector position) + { + CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo"); + + INPCModule module = World.RequestModuleInterface(); + if (module != null) + { + Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); + module.Autopilot(new UUID(npc.m_string), World, pos); + } + } + + public void osNpcSay(LSL_Key npc, string message) + { + CheckThreatLevel(ThreatLevel.High, "osNpcSay"); + + INPCModule module = World.RequestModuleInterface(); + if (module != null) + { + module.Say(new UUID(npc.m_string), World, message); + } + } + + public void osNpcRemove(LSL_Key npc) + { + CheckThreatLevel(ThreatLevel.High, "osNpcRemove"); + + INPCModule module = World.RequestModuleInterface(); + if (module != null) + { + module.DeleteNPC(new UUID(npc.m_string), World); + } + } } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 0be29f2e07..c24dae850b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -149,5 +149,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_List osGetLinkPrimitiveParams(int linknumber, LSL_List rules); + + key osNpcCreate(string user, string name, vector position, key cloneFrom); + void osNpcMoveTo(key npc, vector position); + void osNpcSay(key npc, string message); + void osNpcRemove(key npc); + } } From c7e140171e107f373d43d45f2b5969410d4b2d7f Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 11:35:19 +1000 Subject: [PATCH 27/51] * Addendum to previous --- .../Shared/Api/Runtime/OSSL_Stub.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index abdba05f7c..1227ec40b6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -393,6 +393,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_OSSL_Functions.osGetLinkPrimitiveParams(linknumber, rules); } + key osNpcCreate(string user, string name, vector position, key cloneFrom) + { + return m_OSSL_Functions.osNpcCreate(user, name, position, cloneFrom); + } + void osNpcMoveTo(key npc, vector position) + { + m_OSSL_Functions.osNpcMoveTo(npc, position); + } + + void osNpcSay(key npc, string message) + { + m_OSSL_Functions.osNpcSay(npc, message); + } + void osNpcRemove(key npc) + { + m_OSSL_Functions.osNpcRemove(npc); + } public OSSLPrim Prim; From 7ef3e5f41cf226a5c5ba13fe5ee2f1d1d6ccc7ea Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 11:43:45 +1000 Subject: [PATCH 28/51] * Protip: Declare publically accessible functions, as public functions. --- .../ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 1227ec40b6..605f67be34 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -393,20 +393,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_OSSL_Functions.osGetLinkPrimitiveParams(linknumber, rules); } - key osNpcCreate(string user, string name, vector position, key cloneFrom) + public key osNpcCreate(string user, string name, vector position, key cloneFrom) { return m_OSSL_Functions.osNpcCreate(user, name, position, cloneFrom); } - void osNpcMoveTo(key npc, vector position) + + public void osNpcMoveTo(key npc, vector position) { m_OSSL_Functions.osNpcMoveTo(npc, position); } - void osNpcSay(key npc, string message) + public void osNpcSay(key npc, string message) { m_OSSL_Functions.osNpcSay(npc, message); } - void osNpcRemove(key npc) + + public void osNpcRemove(key npc) { m_OSSL_Functions.osNpcRemove(npc); } From bce98f9670ae027bbf727a4ba20f52cd17765793 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 13:12:51 +1000 Subject: [PATCH 29/51] * Fixing an issue with NPC's and Circuit Codes. --- OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 94349f6043..775dc91048 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -44,6 +44,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom) { NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, scene); + npcAvatar.CircuitCode = (uint) Util.RandomClass.Next(0, int.MaxValue); + + scene.ClientManager.Add(npcAvatar.CircuitCode, npcAvatar); scene.AddNewClient(npcAvatar); ScenePresence sp; From d4600eec4d4555eec8c2815503a2aa7a75d6d928 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 13:35:13 +1000 Subject: [PATCH 30/51] * Attempting to diagnose a connection bug. --- OpenSim/Region/Framework/Scenes/Scene.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d1f7a4b8a1..b50d0cb1df 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2044,9 +2044,11 @@ namespace OpenSim.Region.Framework.Scenes { AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); - m_log.DebugFormat( - "[SCENE]: Adding new {0} agent for {1} in {2}", - ((aCircuit.child == true) ? "child" : "root"), client.Name, RegionInfo.RegionName); + string logMsg = string.Format("[SCENE]: Adding new {0} agent for {1} in {2}", + ((aCircuit.child == true) ? "child" : "root"), client.Name, + RegionInfo.RegionName); + + m_log.Debug(logMsg); CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); From 25dbf16cfb1d4c74792eae170bc766d3eb522a24 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 13:44:20 +1000 Subject: [PATCH 31/51] * Once more into the breach! --- OpenSim/Region/Framework/Scenes/Scene.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index b50d0cb1df..6118a70538 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2044,11 +2044,14 @@ namespace OpenSim.Region.Framework.Scenes { AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); + m_log.Debug("[Scene] Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); + /* string logMsg = string.Format("[SCENE]: Adding new {0} agent for {1} in {2}", ((aCircuit.child == true) ? "child" : "root"), client.Name, RegionInfo.RegionName); m_log.Debug(logMsg); + */ CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); @@ -2057,7 +2060,7 @@ namespace OpenSim.Region.Framework.Scenes // HERE!!! Do the initial attachments right here // first agent upon login is a root agent by design. // All other AddNewClient calls find aCircuit.child to be true - if (aCircuit.child == false) + if (aCircuit == null || aCircuit.child == false) { sp.IsChildAgent = false; sp.RezAttachments(); From 29e2067ec354435c2cde8f4cd7c9fd869fd931b3 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 14:10:21 +1000 Subject: [PATCH 32/51] * Implements a cache in NPCModule for Appearance. --- .../Region/OptionalModules/World/NPC/NPCModule.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 775dc91048..d6b90e1097 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -41,6 +41,16 @@ namespace OpenSim.Region.OptionalModules.World.NPC private Dictionary m_avatars = new Dictionary(); + private Dictionary m_appearanceCache = new Dictionary(); + + private AvatarAppearance GetAppearance(UUID target, Scene scene) + { + if (m_appearanceCache.ContainsKey(target)) + return m_appearanceCache[target]; + + return scene.CommsManager.AvatarService.GetUserAppearance(target); + } + public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom) { NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, scene); @@ -52,7 +62,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC ScenePresence sp; if(scene.TryGetAvatar(npcAvatar.AgentId, out sp)) { - AvatarAppearance x = scene.CommsManager.AvatarService.GetUserAppearance(cloneAppearanceFrom); + AvatarAppearance x = GetAppearance(cloneAppearanceFrom, scene); List wearbyte = new List(); for (int i = 0; i < x.VisualParams.Length; i++) From 98da8e9b16de75aba2a5af175e7ca8c528fa418c Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 14:20:05 +1000 Subject: [PATCH 33/51] * Make cache, actually cache. --- OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index d6b90e1097..eeb74d9320 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -48,7 +48,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC if (m_appearanceCache.ContainsKey(target)) return m_appearanceCache[target]; - return scene.CommsManager.AvatarService.GetUserAppearance(target); + AvatarAppearance x = scene.CommsManager.AvatarService.GetUserAppearance(target); + + m_appearanceCache.Add(target, x); + + return x; } public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom) From 922007443e7344f6696fbfc66ceec8f18bec65b9 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 20 Aug 2009 21:36:57 -0700 Subject: [PATCH 34/51] Changed most of inventory packets to LowPriority, to see if that helps with freezing on searching large inventories. --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index a7a5aa3788..ce4b03bd31 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -1961,7 +1961,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { descend.Header.Zerocoded = true; AddNullFolderBlockToDecendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.Asset); + OutPacket(descend, ThrottleOutPacketType.LowPriority); if ((items.Count - count) > 0) { @@ -1983,7 +1983,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (0 < i && i < MAX_ITEMS_PER_PACKET) { AddNullFolderBlockToDecendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.Asset); + OutPacket(descend, ThrottleOutPacketType.LowPriority); } } @@ -2021,7 +2021,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (i == MAX_ITEMS_PER_PACKET) { AddNullItemBlockToDescendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.Asset); + OutPacket(descend, ThrottleOutPacketType.LowPriority); if ((folders.Count - count) > 0) { @@ -2045,7 +2045,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (0 < i && i < MAX_ITEMS_PER_PACKET) { AddNullItemBlockToDescendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.Asset); + OutPacket(descend, ThrottleOutPacketType.LowPriority); } } @@ -2056,7 +2056,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP descend.AgentData.Descendents = 0; AddNullItemBlockToDescendentsPacket(ref descend); AddNullFolderBlockToDecendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.Asset); + OutPacket(descend, ThrottleOutPacketType.LowPriority); } } @@ -2153,7 +2153,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS); inventoryReply.Header.Zerocoded = true; - OutPacket(inventoryReply, ThrottleOutPacketType.Asset); + OutPacket(inventoryReply, ThrottleOutPacketType.LowPriority); } protected void SendBulkUpdateInventoryFolder(InventoryFolderBase folderBase) From 9e64427262e05ac03032f686ceaff8828d02e5df Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 20 Aug 2009 21:56:06 -0700 Subject: [PATCH 35/51] Putting the inventory packets back to ThrottleOutPacketType.Asset, because that didn't work. --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index ce4b03bd31..a7a5aa3788 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -1961,7 +1961,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { descend.Header.Zerocoded = true; AddNullFolderBlockToDecendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.LowPriority); + OutPacket(descend, ThrottleOutPacketType.Asset); if ((items.Count - count) > 0) { @@ -1983,7 +1983,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (0 < i && i < MAX_ITEMS_PER_PACKET) { AddNullFolderBlockToDecendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.LowPriority); + OutPacket(descend, ThrottleOutPacketType.Asset); } } @@ -2021,7 +2021,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (i == MAX_ITEMS_PER_PACKET) { AddNullItemBlockToDescendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.LowPriority); + OutPacket(descend, ThrottleOutPacketType.Asset); if ((folders.Count - count) > 0) { @@ -2045,7 +2045,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (0 < i && i < MAX_ITEMS_PER_PACKET) { AddNullItemBlockToDescendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.LowPriority); + OutPacket(descend, ThrottleOutPacketType.Asset); } } @@ -2056,7 +2056,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP descend.AgentData.Descendents = 0; AddNullItemBlockToDescendentsPacket(ref descend); AddNullFolderBlockToDecendentsPacket(ref descend); - OutPacket(descend, ThrottleOutPacketType.LowPriority); + OutPacket(descend, ThrottleOutPacketType.Asset); } } @@ -2153,7 +2153,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS); inventoryReply.Header.Zerocoded = true; - OutPacket(inventoryReply, ThrottleOutPacketType.LowPriority); + OutPacket(inventoryReply, ThrottleOutPacketType.Asset); } protected void SendBulkUpdateInventoryFolder(InventoryFolderBase folderBase) From f7c5eca978717c0adc16ad28b30b02678ba75892 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 15:12:50 +1000 Subject: [PATCH 36/51] * Moves NPC Creation across AppDomains to prevent a major perfomance issue. --- .../OptionalModules/World/NPC/NPCModule.cs | 86 +++++++++++++++---- .../Shared/Api/Implementation/OSSL_Api.cs | 2 + 2 files changed, 70 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index eeb74d9320..c710723812 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -26,12 +26,14 @@ */ using System.Collections.Generic; +using System.Threading; using OpenMetaverse; using Nini.Config; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.CoreModules.Avatar.NPC; using OpenSim.Framework; +using Timer=System.Timers.Timer; namespace OpenSim.Region.OptionalModules.World.NPC { @@ -39,10 +41,25 @@ namespace OpenSim.Region.OptionalModules.World.NPC { // private const bool m_enabled = false; + private Mutex m_createMutex = new Mutex(false); + + private Timer m_timer = new Timer(500); + private Dictionary m_avatars = new Dictionary(); private Dictionary m_appearanceCache = new Dictionary(); + // Timer vars. + private bool p_inUse = false; + private readonly object p_lock = new object(); + // Private Temporary Variables. + private string p_firstname; + private string p_lastname; + private Vector3 p_position; + private Scene p_scene; + private UUID p_cloneAppearanceFrom; + private UUID p_returnUuid; + private AvatarAppearance GetAppearance(UUID target, Scene scene) { if (m_appearanceCache.ContainsKey(target)) @@ -57,29 +74,23 @@ namespace OpenSim.Region.OptionalModules.World.NPC public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom) { - NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, scene); - npcAvatar.CircuitCode = (uint) Util.RandomClass.Next(0, int.MaxValue); + // Block. + m_createMutex.WaitOne(); - scene.ClientManager.Add(npcAvatar.CircuitCode, npcAvatar); - scene.AddNewClient(npcAvatar); - - ScenePresence sp; - if(scene.TryGetAvatar(npcAvatar.AgentId, out sp)) + // Copy Temp Variables for Timer to pick up. + lock (p_lock) { - AvatarAppearance x = GetAppearance(cloneAppearanceFrom, scene); - - List wearbyte = new List(); - for (int i = 0; i < x.VisualParams.Length; i++) - { - wearbyte.Add(x.VisualParams[i]); - } - - sp.SetAppearance(x.Texture.GetBytes(), wearbyte); + p_firstname = firstname; + p_lastname = lastname; + p_position = position; + p_scene = scene; + p_cloneAppearanceFrom = cloneAppearanceFrom; + p_inUse = true; } - m_avatars.Add(npcAvatar.AgentId, npcAvatar); + m_createMutex.ReleaseMutex(); - return npcAvatar.AgentId; + return p_returnUuid; } public void Autopilot(UUID agentID, Scene scene, Vector3 pos) @@ -116,6 +127,45 @@ namespace OpenSim.Region.OptionalModules.World.NPC public void Initialise(Scene scene, IConfigSource source) { scene.RegisterModuleInterface(this); + + m_timer.Elapsed += m_timer_Elapsed; + m_timer.Start(); + } + + void m_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + lock (p_lock) + { + if (p_inUse) + { + p_inUse = false; + + + NPCAvatar npcAvatar = new NPCAvatar(p_firstname, p_lastname, p_position, p_scene); + npcAvatar.CircuitCode = (uint) Util.RandomClass.Next(0, int.MaxValue); + + p_scene.ClientManager.Add(npcAvatar.CircuitCode, npcAvatar); + p_scene.AddNewClient(npcAvatar); + + ScenePresence sp; + if (p_scene.TryGetAvatar(npcAvatar.AgentId, out sp)) + { + AvatarAppearance x = GetAppearance(p_cloneAppearanceFrom, p_scene); + + List wearbyte = new List(); + for (int i = 0; i < x.VisualParams.Length; i++) + { + wearbyte.Add(x.VisualParams[i]); + } + + sp.SetAppearance(x.Texture.GetBytes(), wearbyte); + } + + m_avatars.Add(npcAvatar.AgentId, npcAvatar); + + p_returnUuid = npcAvatar.AgentId; + } + } } public void PostInitialise() diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index fcfa9fc482..61903498cc 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -31,6 +31,7 @@ using System.Collections.Generic; using System.Runtime.Remoting.Lifetime; using System.Text; using System.Net; +using System.Threading; using OpenMetaverse; using Nini.Config; using OpenSim; @@ -1766,6 +1767,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, LSL_Key cloneFrom) { CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); + //QueueUserWorkItem INPCModule module = World.RequestModuleInterface(); if (module != null) From bd7757de22ee07b344b470eadbf55264dfb8ec1b Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 21 Aug 2009 15:15:15 +1000 Subject: [PATCH 37/51] * oops. Mistake with value return. --- OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index c710723812..a43a5f59f6 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -86,6 +86,12 @@ namespace OpenSim.Region.OptionalModules.World.NPC p_scene = scene; p_cloneAppearanceFrom = cloneAppearanceFrom; p_inUse = true; + p_returnUuid = UUID.Zero; + } + + while(p_returnUuid == UUID.Zero) + { + Thread.Sleep(250); } m_createMutex.ReleaseMutex(); From e4f64dd7147001e1e0ac9bd4a51efec086727b29 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 20 Aug 2009 22:36:47 -0700 Subject: [PATCH 38/51] Made HandleFetchInventoryDescendents async, so that the client thread doesn't wait for the download of the entire inventory. --- .../Framework/Scenes/Scene.PacketHandlers.cs | 19 +++++++++++++++++-- .../InventoryService/InventoryService.cs | 4 +--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index d722e2368b..2b815a2764 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -441,9 +441,24 @@ namespace OpenSim.Region.Framework.Scenes return; } + // We're going to send the reply async, because there may be + // an enormous quantity of packets -- basically the entire inventory! + // We don't want to block the client thread while all that is happening. + SendInventoryDelegate d = SendInventoryAsync; + d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); + } + + delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); + + void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) + { SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); - } - + } + + void SendInventoryComplete(IAsyncResult iar) + { + } + /// /// Handle the caps inventory descendents fetch. /// diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs index 63102547f5..45bbd3716e 100644 --- a/OpenSim/Services/InventoryService/InventoryService.cs +++ b/OpenSim/Services/InventoryService/InventoryService.cs @@ -235,8 +235,6 @@ namespace OpenSim.Services.InventoryService public InventoryCollection GetFolderContent(UUID userID, UUID folderID) { - m_log.Info("[INVENTORY SERVICE]: Processing request for folder " + folderID); - // Uncomment me to simulate a slow responding inventory server //Thread.Sleep(16000); @@ -249,7 +247,7 @@ namespace OpenSim.Services.InventoryService invCollection.Folders = folders; invCollection.Items = items; - m_log.DebugFormat("[INVENTORY SERVICE]: Found {0} items and {1} folders", items.Count, folders.Count); + m_log.DebugFormat("[INVENTORY SERVICE]: Found {0} items and {1} folders in folder {2}", items.Count, folders.Count, folderID); return invCollection; } From 158ad39df0de1c569d24d4ea28dc3952402df101 Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Fri, 21 Aug 2009 15:42:36 +0900 Subject: [PATCH 39/51] Add copyright header. Formatting cleanup. --- .../CoreModules/Avatar/NPC/INPCModule.cs | 29 ++++++++++++++++- .../Avatar/Chat/ChannelState.cs | 2 +- .../OptionalModules/World/NPC/NPCModule.cs | 11 +++++-- .../Shared/Api/Implementation/LSL_Api.cs | 32 ++++++++++--------- 4 files changed, 54 insertions(+), 20 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs b/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs index 7d5c310c55..cd2fe4fc85 100644 --- a/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/NPC/INPCModule.cs @@ -1,4 +1,31 @@ -using OpenMetaverse; +/* + * 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 OpenMetaverse; using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.CoreModules.Avatar.NPC diff --git a/OpenSim/Region/OptionalModules/Avatar/Chat/ChannelState.cs b/OpenSim/Region/OptionalModules/Avatar/Chat/ChannelState.cs index b61959f04b..3c5e8c9e65 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Chat/ChannelState.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Chat/ChannelState.cs @@ -213,7 +213,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat m_log.DebugFormat("[IRC-Channel-{0}] AccessPassword : <{1}>", cs.idn, cs.AccessPassword); string[] excludes = config.GetString("exclude_list", "").Trim().Split(new Char[] { ',' }); cs.ExcludeList = new List(excludes.Length); - foreach(string name in excludes) + foreach (string name in excludes) { cs.ExcludeList.Add(name.Trim().ToLower()); } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index a43a5f59f6..b3bfe07cc1 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -89,7 +89,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC p_returnUuid = UUID.Zero; } - while(p_returnUuid == UUID.Zero) + while (p_returnUuid == UUID.Zero) { Thread.Sleep(250); } @@ -102,31 +102,37 @@ namespace OpenSim.Region.OptionalModules.World.NPC public void Autopilot(UUID agentID, Scene scene, Vector3 pos) { lock (m_avatars) + { if (m_avatars.ContainsKey(agentID)) { ScenePresence sp; scene.TryGetAvatar(agentID, out sp); sp.DoAutoPilot(0, pos, m_avatars[agentID]); } + } } public void Say(UUID agentID, Scene scene, string text) { lock (m_avatars) + { if (m_avatars.ContainsKey(agentID)) { m_avatars[agentID].Say(text); } + } } public void DeleteNPC(UUID agentID, Scene scene) { - lock(m_avatars) + lock (m_avatars) + { if (m_avatars.ContainsKey(agentID)) { scene.RemoveClient(agentID); m_avatars.Remove(agentID); } + } } @@ -146,7 +152,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC { p_inUse = false; - NPCAvatar npcAvatar = new NPCAvatar(p_firstname, p_lastname, p_position, p_scene); npcAvatar.CircuitCode = (uint) Util.RandomClass.Next(0, int.MaxValue); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 972e71cb28..16dd8341c5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1978,25 +1978,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return new LSL_Rotation(q.X, q.Y, q.Z, q.W); } - private LSL_Rotation GetPartRot( SceneObjectPart part ) + private LSL_Rotation GetPartRot(SceneObjectPart part) { Quaternion q; if (part.LinkNum == 0 || part.LinkNum == 1) // unlinked or root prim { - if (part.ParentGroup.RootPart.AttachmentPoint != 0) - { - ScenePresence avatar = World.GetScenePresence(part.AttachedAvatar); - if (avatar != null) - if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) - q = avatar.CameraRotation; // Mouselook - else - q = avatar.Rotation; // Currently infrequently updated so may be inaccurate - else - q = part.ParentGroup.GroupRotation; // Likely never get here but just in case - } - else - q = part.ParentGroup.GroupRotation; // just the group rotation - return new LSL_Rotation(q.X, q.Y, q.Z, q.W); + if (part.ParentGroup.RootPart.AttachmentPoint != 0) + { + ScenePresence avatar = World.GetScenePresence(part.AttachedAvatar); + if (avatar != null) + { + if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) + q = avatar.CameraRotation; // Mouselook + else + q = avatar.Rotation; // Currently infrequently updated so may be inaccurate + } + else + q = part.ParentGroup.GroupRotation; // Likely never get here but just in case + } + else + q = part.ParentGroup.GroupRotation; // just the group rotation + return new LSL_Rotation(q.X, q.Y, q.Z, q.W); } q = part.GetWorldRotation(); return new LSL_Rotation(q.X, q.Y, q.Z, q.W); From 7daf6dbbd3ae70f43793c360bc3ab08efd89e850 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 21 Aug 2009 11:35:40 +0100 Subject: [PATCH 40/51] Add -xmlfile= option to UGM, to let the files be outside bin if desired --- OpenSim/Grid/GridServer/GridServerBase.cs | 3 ++- OpenSim/Grid/GridServer/Program.cs | 2 ++ OpenSim/Grid/MessagingServer/Main.cs | 4 +++- OpenSim/Grid/UserServer/Main.cs | 5 ++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/OpenSim/Grid/GridServer/GridServerBase.cs b/OpenSim/Grid/GridServer/GridServerBase.cs index e3ad52abb1..d63ac2eb30 100644 --- a/OpenSim/Grid/GridServer/GridServerBase.cs +++ b/OpenSim/Grid/GridServer/GridServerBase.cs @@ -49,6 +49,7 @@ namespace OpenSim.Grid.GridServer protected GridConfig m_config; public string m_consoleType = "local"; public IConfigSource m_configSource = null; + public string m_configFile = "GridServer_Config.xml"; public GridConfig Config { @@ -91,7 +92,7 @@ namespace OpenSim.Grid.GridServer break; } MainConsole.Instance = m_console; - m_config = new GridConfig("GRID SERVER", (Path.Combine(Util.configDir(), "GridServer_Config.xml"))); + m_config = new GridConfig("GRID SERVER", (Path.Combine(Util.configDir(), m_configFile))); m_log.Info("[GRID]: Starting HTTP process"); m_httpServer = new BaseHttpServer(m_config.HttpPort); diff --git a/OpenSim/Grid/GridServer/Program.cs b/OpenSim/Grid/GridServer/Program.cs index c7ba897b9a..741a01b94a 100644 --- a/OpenSim/Grid/GridServer/Program.cs +++ b/OpenSim/Grid/GridServer/Program.cs @@ -36,6 +36,7 @@ namespace OpenSim.Grid.GridServer { ArgvConfigSource argvSource = new ArgvConfigSource(args); argvSource.AddSwitch("Startup", "console", "c"); + argvSource.AddSwitch("Startup", "xmlfile", "x"); XmlConfigurator.Configure(); @@ -45,6 +46,7 @@ namespace OpenSim.Grid.GridServer if (startupConfig != null) { app.m_consoleType = startupConfig.GetString("console", "local"); + app.m_configFile = startupConfig.GetString("xmlfile", "GridServer_Config.xml"); } app.m_configSource = argvSource; diff --git a/OpenSim/Grid/MessagingServer/Main.cs b/OpenSim/Grid/MessagingServer/Main.cs index 654e770dfd..c8035a4381 100644 --- a/OpenSim/Grid/MessagingServer/Main.cs +++ b/OpenSim/Grid/MessagingServer/Main.cs @@ -59,6 +59,7 @@ namespace OpenSim.Grid.MessagingServer protected static string m_consoleType = "local"; protected static IConfigSource m_config = null; + protected static string m_configFile = "MessagingServer_Config.xml"; public static void Main(string[] args) { @@ -69,6 +70,7 @@ namespace OpenSim.Grid.MessagingServer if (startupConfig != null) { m_consoleType = startupConfig.GetString("console", "local"); + m_configFile = startupConfig.GetString("xmlfile", "MessagingServer_Config.xml"); } m_config = argvSource; @@ -164,7 +166,7 @@ namespace OpenSim.Grid.MessagingServer protected override void StartupSpecific() { - Cfg = new MessageServerConfig("MESSAGING SERVER", (Path.Combine(Util.configDir(), "MessagingServer_Config.xml"))); + Cfg = new MessageServerConfig("MESSAGING SERVER", (Path.Combine(Util.configDir(), m_configFile))); m_userDataBaseService = new UserDataBaseService(); m_userDataBaseService.AddPlugin(Cfg.DatabaseProvider, Cfg.DatabaseConnect); diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs index 1ee53ef6ec..baf0fd3145 100644 --- a/OpenSim/Grid/UserServer/Main.cs +++ b/OpenSim/Grid/UserServer/Main.cs @@ -76,16 +76,19 @@ namespace OpenSim.Grid.UserServer protected static string m_consoleType = "local"; protected static IConfigSource m_config = null; + protected static string m_configFile = "UserServer_Config.xml"; public static void Main(string[] args) { ArgvConfigSource argvSource = new ArgvConfigSource(args); argvSource.AddSwitch("Startup", "console", "c"); + argvSource.AddSwitch("Startup", "xmlfile", "x"); IConfig startupConfig = argvSource.Configs["Startup"]; if (startupConfig != null) { m_consoleType = startupConfig.GetString("console", "local"); + m_configFile = startupConfig.GetString("xmlfile", "UserServer_Config.xml"); } m_config = argvSource; @@ -151,7 +154,7 @@ namespace OpenSim.Grid.UserServer protected virtual IInterServiceInventoryServices StartupCoreComponents() { - Cfg = new UserConfig("USER SERVER", (Path.Combine(Util.configDir(), "UserServer_Config.xml"))); + Cfg = new UserConfig("USER SERVER", (Path.Combine(Util.configDir(), m_configFile))); m_httpServer = new BaseHttpServer(Cfg.HttpPort); From de3cca6061d73e8b2be30e980c220a8b3a543bf6 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 21 Aug 2009 17:00:18 +0100 Subject: [PATCH 41/51] Fix Messaging server so -xmlfile actually works --- OpenSim/Grid/MessagingServer/Main.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenSim/Grid/MessagingServer/Main.cs b/OpenSim/Grid/MessagingServer/Main.cs index c8035a4381..f2631a7b8b 100644 --- a/OpenSim/Grid/MessagingServer/Main.cs +++ b/OpenSim/Grid/MessagingServer/Main.cs @@ -65,6 +65,7 @@ namespace OpenSim.Grid.MessagingServer { ArgvConfigSource argvSource = new ArgvConfigSource(args); argvSource.AddSwitch("Startup", "console", "c"); + argvSource.AddSwitch("Startup", "xmlfile", "x"); IConfig startupConfig = argvSource.Configs["Startup"]; if (startupConfig != null) From 33186527235091f95a7251ea66a713fdaee1c689 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 21 Aug 2009 11:00:45 -0700 Subject: [PATCH 42/51] Added a more sane InventoryServerMoveItemsHandler. Changed SynchronousRestObjectRequester so that it also understands PUTs. --- .../SynchronousRestObjectRequester.cs | 2 +- .../Inventory/InventoryServerInConnector.cs | 3 + .../InventoryServerMoveItemsHandler.cs | 81 +++++++++++++++++++ .../Inventory/InventoryServiceConnector.cs | 21 ++++- 4 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs diff --git a/OpenSim/Framework/Servers/HttpServer/SynchronousRestObjectRequester.cs b/OpenSim/Framework/Servers/HttpServer/SynchronousRestObjectRequester.cs index 09ef95b4c4..ec9bd4fce1 100644 --- a/OpenSim/Framework/Servers/HttpServer/SynchronousRestObjectRequester.cs +++ b/OpenSim/Framework/Servers/HttpServer/SynchronousRestObjectRequester.cs @@ -62,7 +62,7 @@ namespace OpenSim.Framework.Servers.HttpServer WebRequest request = WebRequest.Create(requestUrl); request.Method = verb; - if (verb == "POST") + if ((verb == "POST") || (verb == "PUT")) { request.ContentType = "text/xml"; diff --git a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs index 6ef1d9d32f..10336b00fd 100644 --- a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs +++ b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs @@ -143,6 +143,9 @@ namespace OpenSim.Server.Handlers.Inventory m_httpServer.AddStreamHandler( new RestDeserialiseSecureHandler, bool>( "POST", "/MoveItems/", MoveItems, CheckAuthSession)); + + m_httpServer.AddStreamHandler(new InventoryServerMoveItemsHandler(m_InventoryService)); + // for persistent active gestures m_httpServer.AddStreamHandler( diff --git a/OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs b/OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs new file mode 100644 index 0000000000..850bf14b39 --- /dev/null +++ b/OpenSim/Server/Handlers/Inventory/InventoryServerMoveItemsHandler.cs @@ -0,0 +1,81 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using Nini.Config; +using log4net; +using System; +using System.Collections.Generic; +using System.Reflection; +using System.IO; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using OpenSim.Server.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Framework; +using OpenSim.Framework.Servers.HttpServer; +using OpenMetaverse; + +namespace OpenSim.Server.Handlers.Inventory +{ + public class InventoryServerMoveItemsHandler : BaseStreamHandler + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private IInventoryService m_InventoryService; + + public InventoryServerMoveItemsHandler(IInventoryService service) : + base("PUT", "/inventory") + { + m_InventoryService = service; + } + + public override byte[] Handle(string path, Stream request, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + XmlSerializer xs = new XmlSerializer(typeof (List)); + List items = (List)xs.Deserialize(request); + + bool result = false; + string[] p = SplitParams(path); + + if (p.Length > 0) + { + UUID ownerID = UUID.Zero; + UUID.TryParse(p[0], out ownerID); + result = m_InventoryService.MoveItems(ownerID, items); + } + else + m_log.WarnFormat("[MOVEITEMS HANDLER]: ownerID not provided in request. Unable to serve."); + + xs = new XmlSerializer(typeof(bool)); + return ServerUtils.SerializeResult(xs, result); + } + } +} diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index b573a06cb1..7c35bde932 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs @@ -397,13 +397,28 @@ namespace OpenSim.Services.Connectors private void MoveItemsAsync(string userID, List items, UUID sessionID) { + if (items == null) + { + m_log.WarnFormat("[INVENTORY CONNECTOR]: request to move items got a null list."); + return; + } + try { - SynchronousRestSessionObjectPoster, bool>.BeginPostObject( - "POST", m_ServerURI + "/MoveItems/", items, sessionID.ToString(), userID.ToString()); + //SynchronousRestSessionObjectPoster, bool>.BeginPostObject( + // "POST", m_ServerURI + "/MoveItems/", items, sessionID.ToString(), userID.ToString()); + + //// Success + //return; + string uri = m_ServerURI + "/inventory/" + userID; + if (SynchronousRestObjectRequester. + MakeRequest, bool>("PUT", uri, items)) + m_log.DebugFormat("[INVENTORY CONNECTOR]: move {0} items poster succeeded {1}", items.Count, uri); + else + m_log.DebugFormat("[INVENTORY CONNECTOR]: move {0} items poster failed {1}", items.Count, uri); ; - // Success return; + } catch (Exception e) { From 604ef5ba799c4ac6af4a965ede726faf42916ad6 Mon Sep 17 00:00:00 2001 From: Arthur Valadares Date: Fri, 21 Aug 2009 17:48:45 -0300 Subject: [PATCH 43/51] Fix issue where conversion of temporary boolean variable fails on MySQL --- OpenSim/Data/MySQL/MySQLAssetData.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs index 1b4377acaf..66c34fef4f 100644 --- a/OpenSim/Data/MySQL/MySQLAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLAssetData.cs @@ -168,7 +168,7 @@ namespace OpenSim.Data.MySQL } asset.Name = (string) dbReader["name"]; asset.Type = (sbyte) dbReader["assetType"]; - asset.Temporary = (bool)dbReader["temporary"]; + asset.Temporary = Convert.ToBoolean(dbReader["temporary"]); } dbReader.Close(); cmd.Dispose(); @@ -359,7 +359,7 @@ namespace OpenSim.Data.MySQL metadata.Name = (string) dbReader["name"]; metadata.Description = (string) dbReader["description"]; metadata.Type = (sbyte) dbReader["assetType"]; - metadata.Temporary = (bool) dbReader["temporary"]; // Not sure if this is correct. + metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]); // Not sure if this is correct. metadata.FullID = new UUID((string) dbReader["id"]); // Current SHA1s are not stored/computed. From 7923fd29a019eae168b6793ed6e388bc27bc288e Mon Sep 17 00:00:00 2001 From: Arthur Valadares Date: Fri, 21 Aug 2009 21:12:22 -0300 Subject: [PATCH 44/51] Adds osDrawPolygon to OSSL. Works a little different then other OS Drawing functions, this one has no start and end point, but a number of points that will form the desired polygon. Only FilledPolygon implemented so far. * Also added some LSL transparent type conversion, as it's done in LSL scripting (string to integer, float to string, etc) --- .../VectorRender/VectorRenderModule.cs | 48 ++++++++++++++----- .../Shared/Api/Implementation/OSSL_Api.cs | 19 ++++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 1 + .../Shared/Api/Runtime/OSSL_Stub.cs | 5 ++ .../Region/ScriptEngine/Shared/LSL_Types.cs | 43 ++++++++++++++--- 5 files changed, 98 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs index 2640f08c83..d7f39b0582 100644 --- a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs @@ -469,13 +469,19 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender startPoint.X += endPoint.X; startPoint.Y += endPoint.Y; } + else if (nextLine.StartsWith("FillPolygon")) + { + PointF[] points = null; + GetParams(partsDelimiter, ref nextLine, 11, ref points); + graph.FillPolygon(myBrush, points); + } else if (nextLine.StartsWith("Ellipse")) { float x = 0; float y = 0; GetParams(partsDelimiter, ref nextLine, 7, ref x, ref y); - endPoint.X = (int) x; - endPoint.Y = (int) y; + endPoint.X = (int)x; + endPoint.Y = (int)y; graph.DrawEllipse(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); startPoint.X += endPoint.X; startPoint.Y += endPoint.Y; @@ -492,30 +498,31 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender nextLine = nextLine.Remove(0, 8); nextLine = nextLine.Trim(); - string [] fprops = nextLine.Split(partsDelimiter); - foreach (string prop in fprops) { - + string[] fprops = nextLine.Split(partsDelimiter); + foreach (string prop in fprops) + { + switch (prop) { case "B": if (!(myFont.Bold)) myFont = new Font(myFont, myFont.Style | FontStyle.Bold); - break; + break; case "I": if (!(myFont.Italic)) myFont = new Font(myFont, myFont.Style | FontStyle.Italic); - break; + break; case "U": if (!(myFont.Underline)) myFont = new Font(myFont, myFont.Style | FontStyle.Underline); - break; + break; case "S": if (!(myFont.Strikeout)) myFont = new Font(myFont, myFont.Style | FontStyle.Strikeout); - break; + break; case "R": myFont = new Font(myFont, FontStyle.Regular); - break; + break; } } } @@ -542,7 +549,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender if (Int32.TryParse(nextLine, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out hex)) { newColour = Color.FromArgb(hex); - } + } else { // this doesn't fail, it just returns black if nothing is found @@ -582,6 +589,25 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender } } + private static void GetParams(char[] partsDelimiter, ref string line, int startLength, ref PointF[] points) + { + line = line.Remove(0, startLength); + string[] parts = line.Split(partsDelimiter); + if (parts.Length > 1 && parts.Length % 2 == 0) + { + points = new PointF[parts.Length / 2]; + for (int i = 0; i < parts.Length; i = i + 2) + { + string xVal = parts[i].Trim(); + string yVal = parts[i+1].Trim(); + float x = Convert.ToSingle(xVal, CultureInfo.InvariantCulture); + float y = Convert.ToSingle(yVal, CultureInfo.InvariantCulture); + PointF point = new PointF(x, y); + points[i / 2] = point; + } + } + } + private Bitmap ImageHttpRequest(string url) { WebRequest request = HttpWebRequest.Create(url); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 61903498cc..b40e441315 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -833,6 +833,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return drawList; } + public string osDrawFilledPolygon(string drawList, LSL_List x, LSL_List y) + { + CheckThreatLevel(ThreatLevel.None, "osDrawFilledPolygon"); + + m_host.AddScriptLPS(1); + + if (x.Length != y.Length || x.Length < 3) + { + return ""; + } + drawList += "FillPolygon " + x.GetLSLStringItem(0) + "," + y.GetLSLStringItem(0); + for (int i = 1; i < x.Length; i++) + { + drawList += "," + x.GetLSLStringItem(i) + "," + y.GetLSLStringItem(i); + } + drawList += "; "; + return drawList; + } + public string osSetFontSize(string drawList, int fontSize) { CheckThreatLevel(ThreatLevel.None, "osSetFontSize"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index c24dae850b..202bf4172f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -97,6 +97,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces string osDrawEllipse(string drawList, int width, int height); string osDrawRectangle(string drawList, int width, int height); string osDrawFilledRectangle(string drawList, int width, int height); + string osDrawFilledPolygon(string drawList, LSL_List x, LSL_List y); string osSetFontSize(string drawList, int fontSize); string osSetPenSize(string drawList, int penSize); string osSetPenColour(string drawList, string colour); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 605f67be34..b6bfb43cb0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -267,6 +267,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_OSSL_Functions.osDrawFilledRectangle(drawList, width, height); } + public string osDrawFilledPolygon(string drawList, LSL_List x, LSL_List y) + { + return m_OSSL_Functions.osDrawFilledPolygon(drawList, x, y); + } + public string osSetFontSize(string drawList, int fontSize) { return m_OSSL_Functions.osSetFontSize(drawList, fontSize); diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index bdacf8bef7..2842f6bed6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs @@ -439,6 +439,13 @@ namespace OpenSim.Region.ScriptEngine.Shared set {m_data = value; } } + // Function to obtain LSL type from an index. This is needed + // because LSL lists allow for multiple types, and safely + // iterating in them requires a type check. + public Type GetLSLListItemType(int itemIndex) + { + return m_data[itemIndex].GetType(); + } // Member functions to obtain item as specific types. // For cases where implicit conversions would apply if items @@ -465,6 +472,10 @@ namespace OpenSim.Region.ScriptEngine.Shared { return new LSL_Types.LSLFloat((Double)m_data[itemIndex]); } + else if (m_data[itemIndex] is LSL_Types.LSLString) + { + return new LSL_Types.LSLFloat(m_data[itemIndex].ToString()); + } else { return (LSL_Types.LSLFloat)m_data[itemIndex]; @@ -481,20 +492,32 @@ namespace OpenSim.Region.ScriptEngine.Shared { return new LSL_Types.LSLString((string)m_data[itemIndex]); } + else if (m_data[itemIndex] is LSL_Types.LSLFloat) + { + return new LSL_Types.LSLString((LSLFloat)m_data[itemIndex]); + } + else if (m_data[itemIndex] is LSL_Types.LSLInteger) + { + return new LSL_Types.LSLString((LSLInteger)m_data[itemIndex]); + } else { - return (LSL_Types.LSLString)m_data[itemIndex]; + return (LSL_Types.LSLString)m_data[itemIndex]; } } public LSL_Types.LSLInteger GetLSLIntegerItem(int itemIndex) { - if (m_data[itemIndex] is LSL_Types.LSLInteger) - return (LSL_Types.LSLInteger)m_data[itemIndex]; - else if (m_data[itemIndex] is Int32) - return new LSLInteger((int)m_data[itemIndex]); - else - throw new InvalidCastException(); + if (m_data[itemIndex] is LSL_Types.LSLInteger) + return (LSL_Types.LSLInteger)m_data[itemIndex]; + if (m_data[itemIndex] is LSL_Types.LSLFloat) + return new LSLInteger((int)m_data[itemIndex]); + else if (m_data[itemIndex] is Int32) + return new LSLInteger((int)m_data[itemIndex]); + else if (m_data[itemIndex] is LSL_Types.LSLString) + return new LSLInteger((string)m_data[itemIndex]); + else + throw new InvalidCastException(); } public LSL_Types.Vector3 GetVector3Item(int itemIndex) @@ -1331,6 +1354,12 @@ namespace OpenSim.Region.ScriptEngine.Shared m_string=s; } + public LSLString(LSLInteger i) + { + string s = String.Format("{0}", i); + m_string = s; + } + #endregion #region Operators From 75021b5309c5e74c08feea5d508b69ce05491375 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 21 Aug 2009 21:31:18 -0700 Subject: [PATCH 45/51] Moved AuthedSessionCache to where it is used -- Grid/InventoryServer. --- .../Cache => Grid/InventoryServer}/AuthedSessionCache.cs | 0 .../InventoryServer}/InventoryServiceBase.cs | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename OpenSim/{Framework/Communications/Cache => Grid/InventoryServer}/AuthedSessionCache.cs (100%) rename OpenSim/{Framework/Communications => Grid/InventoryServer}/InventoryServiceBase.cs (100%) diff --git a/OpenSim/Framework/Communications/Cache/AuthedSessionCache.cs b/OpenSim/Grid/InventoryServer/AuthedSessionCache.cs similarity index 100% rename from OpenSim/Framework/Communications/Cache/AuthedSessionCache.cs rename to OpenSim/Grid/InventoryServer/AuthedSessionCache.cs diff --git a/OpenSim/Framework/Communications/InventoryServiceBase.cs b/OpenSim/Grid/InventoryServer/InventoryServiceBase.cs similarity index 100% rename from OpenSim/Framework/Communications/InventoryServiceBase.cs rename to OpenSim/Grid/InventoryServer/InventoryServiceBase.cs From b03eeeb9f6331ed36c61f55aef847ce3b2db7ba4 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 22 Aug 2009 10:24:26 -0700 Subject: [PATCH 46/51] * Fixes mantis http://opensimulator.org/mantis/view.php?id=4044. Turns out folders were never being removed from trash when they were singled out for purging in trash. They were being removed when Trash was purged as a whole. That behavior is now fixed for the new InventoryService set. * Removed left-overs from AssetInventoryServer. --- .../Communications/Tests/LoginServiceTests.cs | 5 +++ OpenSim/Framework/IClientAPI.cs | 2 +- .../ClientStack/LindenUDP/LLClientView.cs | 26 +++++++------- .../Inventory/BaseInventoryConnector.cs | 5 +++ .../Inventory/HGInventoryBroker.cs | 17 ++++++++++ .../LocalInventoryServiceConnector.cs | 5 +++ .../RemoteInventoryServiceConnector.cs | 12 +++++++ .../Framework/Scenes/Scene.Inventory.cs | 18 +++------- .../Framework/Scenes/Scene.PacketHandlers.cs | 2 +- .../Inventory/InventoryServerInConnector.cs | 13 +++++++ .../Inventory/HGInventoryServiceConnector.cs | 13 +++++++ .../Inventory/ISessionAuthInventoryService.cs | 5 +++ .../Inventory/InventoryServiceConnector.cs | 23 +++++++++++-- .../QuickAndDirtyInventoryServiceConnector.cs | 6 ++++ .../Services/Interfaces/IInventoryService.cs | 8 +++++ .../InventoryService/InventoryService.cs | 16 +++++++-- .../Tests/Common/Mock/TestInventoryService.cs | 5 +++ ...penSim.Grid.AssetInventoryServer.addin.xml | 24 ------------- ...enSim.Grid.AssetInventoryServer.exe.config | 34 ------------------- 19 files changed, 150 insertions(+), 89 deletions(-) delete mode 100644 bin/OpenSim.Grid.AssetInventoryServer.addin.xml delete mode 100644 bin/OpenSim.Grid.AssetInventoryServer.exe.config diff --git a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs index 6f86704cdc..57a908e128 100644 --- a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs +++ b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs @@ -532,6 +532,11 @@ namespace OpenSim.Framework.Communications.Tests return false; } + public bool DeleteFolders(UUID ownerID, List ids) + { + return false; + } + public bool PurgeFolder(InventoryFolderBase folder) { return false; diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index c6cdcaa8d8..444adf9e8b 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -260,7 +260,7 @@ namespace OpenSim.Framework IClientAPI remoteClient, List itemIDs); public delegate void RemoveInventoryFolder( - IClientAPI remoteClient, UUID folderID); + IClientAPI remoteClient, List folderIDs); public delegate void RequestAsset(IClientAPI remoteClient, RequestAssetArgs transferRequest); diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index a7a5aa3788..dd0178023a 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -7090,14 +7090,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (OnRemoveInventoryFolder != null) { handlerRemoveInventoryFolder = null; + List uuids = new List(); foreach (RemoveInventoryFolderPacket.FolderDataBlock datablock in removeFolder.FolderData) { - handlerRemoveInventoryFolder = OnRemoveInventoryFolder; - - if (handlerRemoveInventoryFolder != null) - { - handlerRemoveInventoryFolder(this, datablock.FolderID); - } + uuids.Add(datablock.FolderID); + } + handlerRemoveInventoryFolder = OnRemoveInventoryFolder; + if (handlerRemoveInventoryFolder != null) + { + handlerRemoveInventoryFolder(this, uuids); } } break; @@ -7114,14 +7115,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (OnRemoveInventoryFolder != null) { handlerRemoveInventoryFolder = null; + List uuids = new List(); foreach (RemoveInventoryObjectsPacket.FolderDataBlock datablock in removeObject.FolderData) { - handlerRemoveInventoryFolder = OnRemoveInventoryFolder; - - if (handlerRemoveInventoryFolder != null) - { - handlerRemoveInventoryFolder(this, datablock.FolderID); - } + uuids.Add(datablock.FolderID); + } + handlerRemoveInventoryFolder = OnRemoveInventoryFolder; + if (handlerRemoveInventoryFolder != null) + { + handlerRemoveInventoryFolder(this, uuids); } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs index d4cb61663a..bd32f3b003 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs @@ -138,6 +138,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory /// true if the folder was successfully moved public abstract bool MoveFolder(InventoryFolderBase folder); + /// + /// Delete a list of inventory folders (from trash) + /// + public abstract bool DeleteFolders(UUID ownerID, List folderIDs); + /// /// Purge an inventory folder of all its items and subfolders. /// diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index 787c6c8b17..1c66254aca 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -330,6 +330,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } } + public override bool DeleteFolders(UUID ownerID, List folderIDs) + { + if (folderIDs == null) + return false; + if (folderIDs.Count == 0) + return false; + + if (IsLocalGridUser(ownerID)) + return m_GridService.DeleteFolders(ownerID, folderIDs); + else + { + UUID sessionID = GetSessionID(ownerID); + string uri = GetUserInventoryURI(ownerID) + "/" + ownerID.ToString(); + return m_HGService.DeleteFolders(uri, folderIDs, sessionID); + } + } + public override bool MoveFolder(InventoryFolderBase folder) { if (folder == null) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index e6edcf2cef..66d11dd819 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -258,6 +258,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_InventoryService.MoveFolder(folder); } + public override bool DeleteFolders(UUID ownerID, List folderIDs) + { + return m_InventoryService.DeleteFolders(ownerID, folderIDs); + } + /// /// Purge an inventory folder of all its items and subfolders. /// diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index 201442c2b4..0d32c77859 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs @@ -243,6 +243,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.MoveFolder(folder.Owner.ToString(), folder, sessionID); } + public override bool DeleteFolders(UUID ownerID, List folderIDs) + { + if (folderIDs == null) + return false; + if (folderIDs.Count == 0) + return false; + + UUID sessionID = GetSessionID(ownerID); + return m_RemoteConnector.DeleteFolders(ownerID.ToString(), folderIDs, sessionID); + } + + public override bool PurgeFolder(InventoryFolderBase folder) { if (folder == null) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index a9d361b072..33015365cf 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -789,23 +789,15 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Removes an inventory folder. Although there is a packet in the Linden protocol for this, it may be - /// legacy and not currently used (purge folder is used to remove folders from trash instead). + /// Removes an inventory folder. This packet is sent when the user + /// right-clicks a folder that's already in trash and chooses "purge" /// /// /// - private void RemoveInventoryFolder(IClientAPI remoteClient, UUID folderID) + private void RemoveInventoryFolder(IClientAPI remoteClient, List folderIDs) { - // Unclear is this handler is ever called by the Linden client, but it might - - InventoryFolderBase folder = new InventoryFolderBase(folderID); - folder.Owner = remoteClient.AgentId; - InventoryFolderBase trash = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.TrashFolder); - if (trash != null) - { - folder.ParentID = trash.ID; - InventoryService.MoveFolder(folder); - } + m_log.DebugFormat("[SCENE INVENTORY]: RemoveInventoryFolders count {0}", folderIDs.Count); + InventoryService.DeleteFolders(remoteClient.AgentId, folderIDs); } private SceneObjectGroup GetGroupByPrim(uint localID) diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 2b815a2764..d3e414faa9 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -552,7 +552,7 @@ namespace OpenSim.Region.Framework.Scenes public void HandleMoveInventoryFolder(IClientAPI remoteClient, UUID folderID, UUID parentID) { - InventoryFolderBase folder = new InventoryFolderBase(folderID); + InventoryFolderBase folder = new InventoryFolderBase(folderID, remoteClient.AgentId); folder = InventoryService.GetFolder(folder); if (folder != null) { diff --git a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs index 10336b00fd..998b3228ed 100644 --- a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs +++ b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs @@ -104,6 +104,10 @@ namespace OpenSim.Server.Handlers.Inventory new RestDeserialiseSecureHandler( "POST", "/PurgeFolder/", m_InventoryService.PurgeFolder, CheckAuthSession)); + m_httpServer.AddStreamHandler( + new RestDeserialiseSecureHandler, bool>( + "POST", "/DeleteFolders/", DeleteFolders, CheckAuthSession)); + m_httpServer.AddStreamHandler( new RestDeserialiseSecureHandler, bool>( "POST", "/DeleteItem/", DeleteItems, CheckAuthSession)); @@ -254,6 +258,15 @@ namespace OpenSim.Server.Handlers.Inventory return m_InventoryService.GetAssetPermissions(item.Owner, item.AssetID); } + public bool DeleteFolders(List items) + { + List uuids = new List(); + foreach (Guid g in items) + uuids.Add(new UUID(g)); + // oops we lost the user info here. Bad bad handlers + return m_InventoryService.DeleteFolders(UUID.Zero, uuids); + } + public bool DeleteItems(List items) { List uuids = new List(); diff --git a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs index 45e921a670..1004fb9450 100644 --- a/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/HGInventoryServiceConnector.cs @@ -201,6 +201,19 @@ namespace OpenSim.Services.Connectors.Inventory return false; } + public bool DeleteFolders(string id, List folders, UUID sessionID) + { + string url = string.Empty; + string userID = string.Empty; + + if (StringToUrlAndUserID(id, out url, out userID)) + { + ISessionAuthInventoryService connector = GetConnector(url); + return connector.DeleteFolders(userID, folders, sessionID); + } + return false; + } + public bool PurgeFolder(string id, InventoryFolderBase folder, UUID sessionID) { string url = string.Empty; diff --git a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs index c89c9b7ce0..da8c7e2e61 100644 --- a/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs +++ b/OpenSim/Services/Connectors/Inventory/ISessionAuthInventoryService.cs @@ -88,6 +88,11 @@ namespace OpenSim.Services.Connectors /// true if the folder was successfully moved bool MoveFolder(string userID, InventoryFolderBase folder, UUID session_id); + /// + /// Delete a list of inventory folders (from trash) + /// + bool DeleteFolders(string userID, List folders, UUID session_id); + /// /// Purge an inventory folder of all its items and subfolders. /// diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index 7c35bde932..423ca75557 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs @@ -308,6 +308,25 @@ namespace OpenSim.Services.Connectors return false; } + public bool DeleteFolders(string userID, List folderIDs, UUID sessionID) + { + try + { + List guids = new List(); + foreach (UUID u in folderIDs) + guids.Add(u.Guid); + return SynchronousRestSessionObjectPoster, bool>.BeginPostObject( + "POST", m_ServerURI + "/DeleteFolders/", guids, sessionID.ToString(), userID); + } + catch (Exception e) + { + m_log.ErrorFormat("[INVENTORY CONNECTOR]: Delete inventory folders operation failed, {0} {1}", + e.Source, e.Message); + } + + return false; + } + public bool MoveFolder(string userID, InventoryFolderBase folder, UUID sessionID) { try @@ -481,12 +500,12 @@ namespace OpenSim.Services.Connectors return null; } - public InventoryFolderBase QueryFolder(string userID, InventoryFolderBase item, UUID sessionID) + public InventoryFolderBase QueryFolder(string userID, InventoryFolderBase folder, UUID sessionID) { try { return SynchronousRestSessionObjectPoster.BeginPostObject( - "POST", m_ServerURI + "/QueryFolder/", item, sessionID.ToString(), item.Owner.ToString()); + "POST", m_ServerURI + "/QueryFolder/", folder, sessionID.ToString(), userID); } catch (Exception e) { diff --git a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs index cd283ff17e..a7aa1382c4 100644 --- a/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/QuickAndDirtyInventoryServiceConnector.cs @@ -136,6 +136,12 @@ namespace OpenSim.Services.Connectors return false; } + public bool DeleteFolders(UUID ownerID, List folderIDs) + { + return false; + } + + public bool PurgeFolder(InventoryFolderBase folder) { return false; diff --git a/OpenSim/Services/Interfaces/IInventoryService.cs b/OpenSim/Services/Interfaces/IInventoryService.cs index ebdb09a969..c77509014a 100644 --- a/OpenSim/Services/Interfaces/IInventoryService.cs +++ b/OpenSim/Services/Interfaces/IInventoryService.cs @@ -121,6 +121,14 @@ namespace OpenSim.Services.Interfaces /// true if the folder was successfully moved bool MoveFolder(InventoryFolderBase folder); + /// + /// Delete an item from the user's inventory + /// + /// + /// true if the item was successfully deleted + //bool DeleteItem(InventoryItemBase item); + bool DeleteFolders(UUID userID, List folderIDs); + /// /// Purge an inventory folder of all its items and subfolders. /// diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs index 45bbd3716e..0cf4af1d70 100644 --- a/OpenSim/Services/InventoryService/InventoryService.cs +++ b/OpenSim/Services/InventoryService/InventoryService.cs @@ -425,15 +425,27 @@ namespace OpenSim.Services.InventoryService return null; } - public virtual InventoryFolderBase GetFolder(InventoryFolderBase item) + public virtual InventoryFolderBase GetFolder(InventoryFolderBase folder) { - InventoryFolderBase result = m_Database.getInventoryFolder(item.ID); + m_log.DebugFormat("[INVENTORY SERVICE]: GetFolder {0}", folder.ID); + InventoryFolderBase result = m_Database.getInventoryFolder(folder.ID); if (result != null) return result; return null; } + public virtual bool DeleteFolders(UUID ownerID, List folderIDs) + { + foreach (UUID id in folderIDs) + { + InventoryFolderBase folder = new InventoryFolderBase(id, ownerID); + PurgeFolder(folder); + m_Database.deleteInventoryFolder(id); + } + return true; + } + /// /// Purge a folder of all items items and subfolders. /// diff --git a/OpenSim/Tests/Common/Mock/TestInventoryService.cs b/OpenSim/Tests/Common/Mock/TestInventoryService.cs index ee22e5e14e..5a0ee7ca65 100644 --- a/OpenSim/Tests/Common/Mock/TestInventoryService.cs +++ b/OpenSim/Tests/Common/Mock/TestInventoryService.cs @@ -128,6 +128,11 @@ namespace OpenSim.Tests.Common.Mock return false; } + public bool DeleteFolders(UUID ownerID, List ids) + { + return false; + } + public bool PurgeFolder(InventoryFolderBase folder) { return false; diff --git a/bin/OpenSim.Grid.AssetInventoryServer.addin.xml b/bin/OpenSim.Grid.AssetInventoryServer.addin.xml deleted file mode 100644 index 1f1bdbd442..0000000000 --- a/bin/OpenSim.Grid.AssetInventoryServer.addin.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/OpenSim.Grid.AssetInventoryServer.exe.config b/bin/OpenSim.Grid.AssetInventoryServer.exe.config deleted file mode 100644 index e542cf23bf..0000000000 --- a/bin/OpenSim.Grid.AssetInventoryServer.exe.config +++ /dev/null @@ -1,34 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 751c2000cc815d5dfe13be0145941589e4dedfa8 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 22 Aug 2009 10:30:04 -0700 Subject: [PATCH 47/51] Changed the namespace of old InventoryServiceBase amd AuthedSessionCache. --- OpenSim/Grid/InventoryServer/AuthedSessionCache.cs | 2 +- OpenSim/Grid/InventoryServer/InventoryServiceBase.cs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenSim/Grid/InventoryServer/AuthedSessionCache.cs b/OpenSim/Grid/InventoryServer/AuthedSessionCache.cs index d56e48ac22..dadf34a4ed 100644 --- a/OpenSim/Grid/InventoryServer/AuthedSessionCache.cs +++ b/OpenSim/Grid/InventoryServer/AuthedSessionCache.cs @@ -28,7 +28,7 @@ using System; using System.Collections.Generic; -namespace OpenSim.Framework.Communications.Cache +namespace OpenSim.Grid.InventoryServer { public class AuthedSessionCache { diff --git a/OpenSim/Grid/InventoryServer/InventoryServiceBase.cs b/OpenSim/Grid/InventoryServer/InventoryServiceBase.cs index 309c415e90..f8b494994e 100644 --- a/OpenSim/Grid/InventoryServer/InventoryServiceBase.cs +++ b/OpenSim/Grid/InventoryServer/InventoryServiceBase.cs @@ -30,8 +30,10 @@ using System.Reflection; using log4net; using OpenMetaverse; using OpenSim.Data; +using OpenSim.Framework; +using OpenSim.Framework.Communications; -namespace OpenSim.Framework.Communications +namespace OpenSim.Grid.InventoryServer { /// /// Abstract base class used by local and grid implementations of an inventory service. From 71f2d8391b154fe98718f8ddec96cbd1de573945 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 22 Aug 2009 10:30:27 -0700 Subject: [PATCH 48/51] Moved a debug message. --- OpenSim/Services/InventoryService/InventoryService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Services/InventoryService/InventoryService.cs b/OpenSim/Services/InventoryService/InventoryService.cs index 0cf4af1d70..19b1fd87fa 100644 --- a/OpenSim/Services/InventoryService/InventoryService.cs +++ b/OpenSim/Services/InventoryService/InventoryService.cs @@ -427,11 +427,11 @@ namespace OpenSim.Services.InventoryService public virtual InventoryFolderBase GetFolder(InventoryFolderBase folder) { - m_log.DebugFormat("[INVENTORY SERVICE]: GetFolder {0}", folder.ID); InventoryFolderBase result = m_Database.getInventoryFolder(folder.ID); if (result != null) return result; + m_log.DebugFormat("[INVENTORY SERVICE]: GetFolder failed to find folder {0}", folder.ID); return null; } From a22b12ecd4c8e65ae08053f0441e345750c60773 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 22 Aug 2009 20:18:24 +0100 Subject: [PATCH 49/51] Change prompt handling in console. No user changes --- OpenSim/Framework/Console/CommandConsole.cs | 4 ++-- OpenSim/Framework/Console/ConsoleBase.cs | 4 ++-- OpenSim/Framework/Console/RemoteConsole.cs | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs index 3387013f5e..06136ffb7b 100644 --- a/OpenSim/Framework/Console/CommandConsole.cs +++ b/OpenSim/Framework/Console/CommandConsole.cs @@ -576,7 +576,7 @@ namespace OpenSim.Framework.Console public void Prompt() { - string line = ReadLine(m_defaultPrompt, true, true); + string line = ReadLine(m_defaultPrompt + "# ", true, true); if (line != String.Empty) { @@ -592,7 +592,7 @@ namespace OpenSim.Framework.Console public override string ReadLine(string p, bool isCommand, bool e) { - System.Console.Write("{0}", prompt); + System.Console.Write("{0}", p); string cmdinput = System.Console.ReadLine(); if (isCommand) diff --git a/OpenSim/Framework/Console/ConsoleBase.cs b/OpenSim/Framework/Console/ConsoleBase.cs index 5e258ae44b..0a51266064 100644 --- a/OpenSim/Framework/Console/ConsoleBase.cs +++ b/OpenSim/Framework/Console/ConsoleBase.cs @@ -48,7 +48,7 @@ namespace OpenSim.Framework.Console /// public string DefaultPrompt { - set { m_defaultPrompt = value + "# "; } + set { m_defaultPrompt = value; } get { return m_defaultPrompt; } } protected string m_defaultPrompt; @@ -123,7 +123,7 @@ namespace OpenSim.Framework.Console public virtual string ReadLine(string p, bool isCommand, bool e) { - System.Console.Write("{0}", prompt); + System.Console.Write("{0}", p); string cmdinput = System.Console.ReadLine(); return cmdinput; diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs index da8556a2d1..1810614409 100644 --- a/OpenSim/Framework/Console/RemoteConsole.cs +++ b/OpenSim/Framework/Console/RemoteConsole.cs @@ -217,6 +217,12 @@ namespace OpenSim.Framework.Console id.AppendChild(xmldoc.CreateTextNode(sessionID.ToString())); rootElement.AppendChild(id); + + XmlElement prompt = xmldoc.CreateElement("", "Prompt", ""); + prompt.AppendChild(xmldoc.CreateTextNode(DefaultPrompt)); + + rootElement.AppendChild(prompt); + rootElement.AppendChild(MainConsole.Instance.Commands.GetXml(xmldoc)); reply["str_response_string"] = xmldoc.InnerXml; From cfd9cf7b18331a9d2117294f6ba23dd03a9423a1 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 25 Aug 2009 06:17:36 -0700 Subject: [PATCH 50/51] Closed the web request and stream in SynchronousRestSessionObjectPoster -- maybe this is the cause of some timeouts seen in some monos? --- OpenSim/Framework/Servers/HttpServer/RestSessionService.cs | 3 +++ .../Connectors/Inventory/InventoryServiceConnector.cs | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs index ec2f9ec1fa..2ef4a36855 100644 --- a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs +++ b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs @@ -75,6 +75,7 @@ namespace OpenSim.Framework.Servers.HttpServer WebRequest request = WebRequest.Create(requestUrl); request.Method = verb; request.ContentType = "text/xml"; + request.Timeout = 20000; MemoryStream buffer = new MemoryStream(); @@ -98,7 +99,9 @@ namespace OpenSim.Framework.Servers.HttpServer { XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); deserial = (TResponse)deserializer.Deserialize(resp.GetResponseStream()); + resp.Close(); } + requestStream.Close(); return deserial; } } diff --git a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs index 423ca75557..a2261ba0f4 100644 --- a/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/InventoryServiceConnector.cs @@ -229,6 +229,11 @@ namespace OpenSim.Services.Connectors return SynchronousRestSessionObjectPoster.BeginPostObject( "POST", m_ServerURI + "/GetFolderContent/", folderID.Guid, sessionID.ToString(), userID.ToString()); } + catch (TimeoutException e) + { + m_log.ErrorFormat("[INVENTORY CONNECTOR]: GetFolderContent operation to {0} timed out {0} {1}.", m_ServerURI, + e.Source, e.Message); + } catch (Exception e) { // Maybe we're talking to an old inventory server. Try this other thing. From efb287f28f89eee06c6b90ad13297a2d33058409 Mon Sep 17 00:00:00 2001 From: Arthur Valadares Date: Tue, 25 Aug 2009 10:32:45 -0300 Subject: [PATCH 51/51] Implemented osPenCap, that sets EndCap and StartCap to Pen. This allows using arrow, diamond, round and flat caps. * Made image request safer, if it can't find an image for any reason, draws a square where the image should be and a message alerting the user. --- .../VectorRender/VectorRenderModule.cs | 77 +++++++++++++++++-- .../Shared/Api/Implementation/OSSL_Api.cs | 9 +++ .../Shared/Api/Interface/IOSSL_Api.cs | 1 + .../Shared/Api/Runtime/OSSL_Stub.cs | 5 ++ 4 files changed, 85 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs index d7f39b0582..e577fbe951 100644 --- a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs @@ -443,7 +443,16 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender endPoint.X = (int) x; endPoint.Y = (int) y; Image image = ImageHttpRequest(nextLine); - graph.DrawImage(image, (float) startPoint.X, (float) startPoint.Y, x, y); + if (image != null) + { + graph.DrawImage(image, (float)startPoint.X, (float)startPoint.Y, x, y); + } + else + { + graph.DrawString("URL couldn't be resolved or is", new Font("Arial",6), myBrush, startPoint); + graph.DrawString("not an image. Please check URL.", new Font("Arial", 6), myBrush, new Point(startPoint.X, 12 + startPoint.Y)); + graph.DrawRectangle(drawPen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y); + } startPoint.X += endPoint.X; startPoint.Y += endPoint.Y; } @@ -539,6 +548,57 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender float size = Convert.ToSingle(nextLine, CultureInfo.InvariantCulture); drawPen.Width = size; } + else if (nextLine.StartsWith("PenCap")) + { + bool start = true, end = true; + nextLine = nextLine.Remove(0, 6); + nextLine = nextLine.Trim(); + string[] cap = nextLine.Split(partsDelimiter); + if (cap[0].ToLower() == "start") + end = false; + else if (cap[0].ToLower() == "end") + start = false; + else if (cap[0].ToLower() != "both") + return; + string type = cap[1].ToLower(); + + if (end) + { + switch (type) + { + case "arrow": + drawPen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; + break; + case "round": + drawPen.EndCap = System.Drawing.Drawing2D.LineCap.RoundAnchor; + break; + case "diamond": + drawPen.EndCap = System.Drawing.Drawing2D.LineCap.DiamondAnchor; + break; + case "flat": + drawPen.EndCap = System.Drawing.Drawing2D.LineCap.Flat; + break; + } + } + if (start) + { + switch (type) + { + case "arrow": + drawPen.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; + break; + case "round": + drawPen.StartCap = System.Drawing.Drawing2D.LineCap.RoundAnchor; + break; + case "diamond": + drawPen.StartCap = System.Drawing.Drawing2D.LineCap.DiamondAnchor; + break; + case "flat": + drawPen.StartCap = System.Drawing.Drawing2D.LineCap.Flat; + break; + } + } + } else if (nextLine.StartsWith("PenColour")) { nextLine = nextLine.Remove(0, 9); @@ -610,16 +670,19 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender private Bitmap ImageHttpRequest(string url) { + try + { WebRequest request = HttpWebRequest.Create(url); //Ckrinke: Comment out for now as 'str' is unused. Bring it back into play later when it is used. //Ckrinke Stream str = null; - HttpWebResponse response = (HttpWebResponse) (request).GetResponse(); - if (response.StatusCode == HttpStatusCode.OK) - { - Bitmap image = new Bitmap(response.GetResponseStream()); - return image; + HttpWebResponse response = (HttpWebResponse)(request).GetResponse(); + if (response.StatusCode == HttpStatusCode.OK) + { + Bitmap image = new Bitmap(response.GetResponseStream()); + return image; + } } - + catch { } return null; } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index b40e441315..b1c357c002 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -879,6 +879,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return drawList; } + public string osSetPenCap(string drawList, string direction, string type) + { + CheckThreatLevel(ThreatLevel.None, "osSetPenColour"); + + m_host.AddScriptLPS(1); + drawList += "PenCap " + direction + "," + type + "; "; + return drawList; + } + public string osDrawImage(string drawList, int width, int height, string imageUrl) { CheckThreatLevel(ThreatLevel.None, "osDrawImage"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 202bf4172f..2365beeb71 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -101,6 +101,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces string osSetFontSize(string drawList, int fontSize); string osSetPenSize(string drawList, int penSize); string osSetPenColour(string drawList, string colour); + string osSetPenCap(string drawList, string direction, string type); string osDrawImage(string drawList, int width, int height, string imageUrl); vector osGetDrawStringSize(string contentType, string text, string fontName, int fontSize); void osSetStateEvents(int events); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index b6bfb43cb0..f877acb7e9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -282,6 +282,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_OSSL_Functions.osSetPenSize(drawList, penSize); } + public string osSetPenCap(string drawList, string direction, string type) + { + return m_OSSL_Functions.osSetPenCap(drawList, direction, type); + } + public string osSetPenColour(string drawList, string colour) { return m_OSSL_Functions.osSetPenColour(drawList, colour);