diff options
Diffstat (limited to 'OpenSim/Region')
144 files changed, 7583 insertions, 10223 deletions
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs index 555baa4..7721cdf 100644 --- a/OpenSim/Region/Application/Application.cs +++ b/OpenSim/Region/Application/Application.cs | |||
@@ -129,7 +129,6 @@ namespace OpenSim | |||
129 | configSource.AddSwitch("Startup", "inifile"); | 129 | configSource.AddSwitch("Startup", "inifile"); |
130 | configSource.AddSwitch("Startup", "inimaster"); | 130 | configSource.AddSwitch("Startup", "inimaster"); |
131 | configSource.AddSwitch("Startup", "inidirectory"); | 131 | configSource.AddSwitch("Startup", "inidirectory"); |
132 | configSource.AddSwitch("Startup", "gridmode"); | ||
133 | configSource.AddSwitch("Startup", "physics"); | 132 | configSource.AddSwitch("Startup", "physics"); |
134 | configSource.AddSwitch("Startup", "gui"); | 133 | configSource.AddSwitch("Startup", "gui"); |
135 | configSource.AddSwitch("Startup", "console"); | 134 | configSource.AddSwitch("Startup", "console"); |
diff --git a/OpenSim/Region/Application/ConfigurationLoader.cs b/OpenSim/Region/Application/ConfigurationLoader.cs index 21edcc5..655c5ca 100644 --- a/OpenSim/Region/Application/ConfigurationLoader.cs +++ b/OpenSim/Region/Application/ConfigurationLoader.cs | |||
@@ -304,7 +304,6 @@ namespace OpenSim | |||
304 | 304 | ||
305 | config.Set("region_info_source", "filesystem"); | 305 | config.Set("region_info_source", "filesystem"); |
306 | 306 | ||
307 | config.Set("gridmode", false); | ||
308 | config.Set("physics", "OpenDynamicsEngine"); | 307 | config.Set("physics", "OpenDynamicsEngine"); |
309 | config.Set("meshing", "Meshmerizer"); | 308 | config.Set("meshing", "Meshmerizer"); |
310 | config.Set("physical_prim", true); | 309 | config.Set("physical_prim", true); |
@@ -342,19 +341,7 @@ namespace OpenSim | |||
342 | if (null == config) | 341 | if (null == config) |
343 | config = defaultConfig.AddConfig("Network"); | 342 | config = defaultConfig.AddConfig("Network"); |
344 | 343 | ||
345 | config.Set("default_location_x", 1000); | ||
346 | config.Set("default_location_y", 1000); | ||
347 | config.Set("http_listener_port", ConfigSettings.DefaultRegionHttpPort); | 344 | config.Set("http_listener_port", ConfigSettings.DefaultRegionHttpPort); |
348 | config.Set("remoting_listener_port", ConfigSettings.DefaultRegionRemotingPort); | ||
349 | config.Set("grid_server_url", "http://127.0.0.1:" + ConfigSettings.DefaultGridServerHttpPort.ToString()); | ||
350 | config.Set("grid_send_key", "null"); | ||
351 | config.Set("grid_recv_key", "null"); | ||
352 | config.Set("user_server_url", "http://127.0.0.1:" + ConfigSettings.DefaultUserServerHttpPort.ToString()); | ||
353 | config.Set("user_send_key", "null"); | ||
354 | config.Set("user_recv_key", "null"); | ||
355 | config.Set("asset_server_url", "http://127.0.0.1:" + ConfigSettings.DefaultAssetServerHttpPort.ToString()); | ||
356 | config.Set("inventory_server_url", "http://127.0.0.1:" + ConfigSettings.DefaultInventoryServerHttpPort.ToString()); | ||
357 | config.Set("secure_inventory_server", "true"); | ||
358 | } | 345 | } |
359 | 346 | ||
360 | return defaultConfig; | 347 | return defaultConfig; |
@@ -368,7 +355,6 @@ namespace OpenSim | |||
368 | IConfig startupConfig = m_config.Source.Configs["Startup"]; | 355 | IConfig startupConfig = m_config.Source.Configs["Startup"]; |
369 | if (startupConfig != null) | 356 | if (startupConfig != null) |
370 | { | 357 | { |
371 | m_configSettings.Standalone = !startupConfig.GetBoolean("gridmode", false); | ||
372 | m_configSettings.PhysicsEngine = startupConfig.GetString("physics"); | 358 | m_configSettings.PhysicsEngine = startupConfig.GetString("physics"); |
373 | m_configSettings.MeshEngineName = startupConfig.GetString("meshing"); | 359 | m_configSettings.MeshEngineName = startupConfig.GetString("meshing"); |
374 | m_configSettings.PhysicalPrim = startupConfig.GetBoolean("physical_prim", true); | 360 | m_configSettings.PhysicalPrim = startupConfig.GetBoolean("physical_prim", true); |
diff --git a/OpenSim/Region/Application/HGCommands.cs b/OpenSim/Region/Application/HGCommands.cs deleted file mode 100644 index 7ae161d..0000000 --- a/OpenSim/Region/Application/HGCommands.cs +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using System.Xml; | ||
32 | using log4net; | ||
33 | using Nini.Config; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Communications; | ||
36 | using OpenSim.Framework.Console; | ||
37 | using OpenSim.Region.Framework; | ||
38 | using OpenSim.Region.Framework.Scenes; | ||
39 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
40 | |||
41 | namespace OpenSim | ||
42 | { | ||
43 | public class HGCommands | ||
44 | { | ||
45 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | |||
47 | public static Scene CreateScene(RegionInfo regionInfo, AgentCircuitManager circuitManager, CommunicationsManager m_commsManager, | ||
48 | StorageManager storageManager, ModuleLoader m_moduleLoader, ConfigSettings m_configSettings, OpenSimConfigSource m_config, string m_version) | ||
49 | { | ||
50 | HGSceneCommunicationService sceneGridService = new HGSceneCommunicationService(m_commsManager); | ||
51 | |||
52 | return | ||
53 | new HGScene( | ||
54 | regionInfo, circuitManager, m_commsManager, sceneGridService, storageManager, | ||
55 | m_moduleLoader, false, m_configSettings.PhysicalPrim, | ||
56 | m_configSettings.See_into_region_from_neighbor, m_config.Source, m_version); | ||
57 | } | ||
58 | |||
59 | } | ||
60 | } | ||
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 05e283e..7e81650 100755 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs | |||
@@ -122,8 +122,7 @@ namespace OpenSim | |||
122 | m_log.Info("===================================================================="); | 122 | m_log.Info("===================================================================="); |
123 | m_log.Info("========================= STARTING OPENSIM ========================="); | 123 | m_log.Info("========================= STARTING OPENSIM ========================="); |
124 | m_log.Info("===================================================================="); | 124 | m_log.Info("===================================================================="); |
125 | m_log.InfoFormat("[OPENSIM MAIN]: Running in {0} mode", | 125 | m_log.InfoFormat("[OPENSIM MAIN]: Running "); |
126 | (ConfigurationSettings.Standalone ? "sandbox" : "grid")); | ||
127 | //m_log.InfoFormat("[OPENSIM MAIN]: GC Is Server GC: {0}", GCSettings.IsServerGC.ToString()); | 126 | //m_log.InfoFormat("[OPENSIM MAIN]: GC Is Server GC: {0}", GCSettings.IsServerGC.ToString()); |
128 | // http://msdn.microsoft.com/en-us/library/bb384202.aspx | 127 | // http://msdn.microsoft.com/en-us/library/bb384202.aspx |
129 | //GCSettings.LatencyMode = GCLatencyMode.Batch; | 128 | //GCSettings.LatencyMode = GCLatencyMode.Batch; |
@@ -153,6 +152,11 @@ namespace OpenSim | |||
153 | RegisterConsoleCommands(); | 152 | RegisterConsoleCommands(); |
154 | 153 | ||
155 | base.StartupSpecific(); | 154 | base.StartupSpecific(); |
155 | |||
156 | MainServer.Instance.AddStreamHandler(new OpenSim.SimStatusHandler()); | ||
157 | MainServer.Instance.AddStreamHandler(new OpenSim.XSimStatusHandler(this)); | ||
158 | if (userStatsURI != String.Empty) | ||
159 | MainServer.Instance.AddStreamHandler(new OpenSim.UXSimStatusHandler(this)); | ||
156 | 160 | ||
157 | if (m_console is RemoteConsole) | 161 | if (m_console is RemoteConsole) |
158 | { | 162 | { |
@@ -350,25 +354,6 @@ namespace OpenSim | |||
350 | "kill uuid <UUID>", | 354 | "kill uuid <UUID>", |
351 | "Kill an object by UUID", KillUUID); | 355 | "Kill an object by UUID", KillUUID); |
352 | 356 | ||
353 | if (ConfigurationSettings.Standalone) | ||
354 | { | ||
355 | m_console.Commands.AddCommand("region", false, "create user", | ||
356 | "create user [<first> [<last> [<pass> [<x> <y> [<email>]]]]]", | ||
357 | "Create a new user", HandleCreateUser); | ||
358 | |||
359 | m_console.Commands.AddCommand("region", false, "reset user password", | ||
360 | "reset user password [<first> [<last> [<password>]]]", | ||
361 | "Reset a user password", HandleResetUserPassword); | ||
362 | } | ||
363 | |||
364 | m_console.Commands.AddCommand("hypergrid", false, "link-mapping", "link-mapping [<x> <y>] <cr>", | ||
365 | "Set local coordinate to map HG regions to", RunCommand); | ||
366 | m_console.Commands.AddCommand("hypergrid", false, "link-region", | ||
367 | "link-region <Xloc> <Yloc> <HostName>:<HttpPort>[:<RemoteRegionName>] <cr>", | ||
368 | "Link a hypergrid region", RunCommand); | ||
369 | m_console.Commands.AddCommand("hypergrid", false, "unlink-region", | ||
370 | "unlink-region <local name> or <HostName>:<HttpPort> <cr>", | ||
371 | "Unlink a hypergrid region", RunCommand); | ||
372 | } | 357 | } |
373 | 358 | ||
374 | public override void ShutdownSpecific() | 359 | public override void ShutdownSpecific() |
@@ -421,7 +406,7 @@ namespace OpenSim | |||
421 | 406 | ||
422 | foreach (ScenePresence presence in agents) | 407 | foreach (ScenePresence presence in agents) |
423 | { | 408 | { |
424 | RegionInfo regionInfo = m_sceneManager.GetRegionInfo(presence.RegionHandle); | 409 | RegionInfo regionInfo = presence.Scene.RegionInfo; |
425 | 410 | ||
426 | if (presence.Firstname.ToLower().Contains(cmdparams[2].ToLower()) && | 411 | if (presence.Firstname.ToLower().Contains(cmdparams[2].ToLower()) && |
427 | presence.Lastname.ToLower().Contains(cmdparams[3].ToLower())) | 412 | presence.Lastname.ToLower().Contains(cmdparams[3].ToLower())) |
@@ -777,38 +762,6 @@ namespace OpenSim | |||
777 | } | 762 | } |
778 | 763 | ||
779 | /// <summary> | 764 | /// <summary> |
780 | /// Execute switch for some of the create commands | ||
781 | /// </summary> | ||
782 | /// <param name="args"></param> | ||
783 | private void HandleCreateUser(string module, string[] cmd) | ||
784 | { | ||
785 | if (ConfigurationSettings.Standalone) | ||
786 | { | ||
787 | CreateUser(cmd); | ||
788 | } | ||
789 | else | ||
790 | { | ||
791 | MainConsole.Instance.Output("Create user is not available in grid mode, use the user server."); | ||
792 | } | ||
793 | } | ||
794 | |||
795 | /// <summary> | ||
796 | /// Execute switch for some of the reset commands | ||
797 | /// </summary> | ||
798 | /// <param name="args"></param> | ||
799 | protected void HandleResetUserPassword(string module, string[] cmd) | ||
800 | { | ||
801 | if (ConfigurationSettings.Standalone) | ||
802 | { | ||
803 | ResetUserPassword(cmd); | ||
804 | } | ||
805 | else | ||
806 | { | ||
807 | MainConsole.Instance.Output("Reset user password is not available in grid mode, use the user-server."); | ||
808 | } | ||
809 | } | ||
810 | |||
811 | /// <summary> | ||
812 | /// Turn on some debugging values for OpenSim. | 765 | /// Turn on some debugging values for OpenSim. |
813 | /// </summary> | 766 | /// </summary> |
814 | /// <param name="args"></param> | 767 | /// <param name="args"></param> |
@@ -908,7 +861,7 @@ namespace OpenSim | |||
908 | 861 | ||
909 | foreach (ScenePresence presence in agents) | 862 | foreach (ScenePresence presence in agents) |
910 | { | 863 | { |
911 | RegionInfo regionInfo = m_sceneManager.GetRegionInfo(presence.RegionHandle); | 864 | RegionInfo regionInfo = presence.Scene.RegionInfo; |
912 | string regionName; | 865 | string regionName; |
913 | 866 | ||
914 | if (regionInfo == null) | 867 | if (regionInfo == null) |
@@ -1046,86 +999,6 @@ namespace OpenSim | |||
1046 | } | 999 | } |
1047 | 1000 | ||
1048 | /// <summary> | 1001 | /// <summary> |
1049 | /// Create a new user | ||
1050 | /// </summary> | ||
1051 | /// <param name="cmdparams">string array with parameters: firstname, lastname, password, locationX, locationY, email</param> | ||
1052 | protected void CreateUser(string[] cmdparams) | ||
1053 | { | ||
1054 | string firstName; | ||
1055 | string lastName; | ||
1056 | string password; | ||
1057 | string email; | ||
1058 | uint regX = 1000; | ||
1059 | uint regY = 1000; | ||
1060 | |||
1061 | IConfig standalone; | ||
1062 | if ((standalone = m_config.Source.Configs["StandAlone"]) != null) | ||
1063 | { | ||
1064 | regX = (uint)standalone.GetInt("default_location_x", (int)regX); | ||
1065 | regY = (uint)standalone.GetInt("default_location_y", (int)regY); | ||
1066 | } | ||
1067 | |||
1068 | |||
1069 | if (cmdparams.Length < 3) | ||
1070 | firstName = MainConsole.Instance.CmdPrompt("First name", "Default"); | ||
1071 | else firstName = cmdparams[2]; | ||
1072 | |||
1073 | if (cmdparams.Length < 4) | ||
1074 | lastName = MainConsole.Instance.CmdPrompt("Last name", "User"); | ||
1075 | else lastName = cmdparams[3]; | ||
1076 | |||
1077 | if (cmdparams.Length < 5) | ||
1078 | password = MainConsole.Instance.PasswdPrompt("Password"); | ||
1079 | else password = cmdparams[4]; | ||
1080 | |||
1081 | if (cmdparams.Length < 6) | ||
1082 | regX = Convert.ToUInt32(MainConsole.Instance.CmdPrompt("Start Region X", regX.ToString())); | ||
1083 | else regX = Convert.ToUInt32(cmdparams[5]); | ||
1084 | |||
1085 | if (cmdparams.Length < 7) | ||
1086 | regY = Convert.ToUInt32(MainConsole.Instance.CmdPrompt("Start Region Y", regY.ToString())); | ||
1087 | else regY = Convert.ToUInt32(cmdparams[6]); | ||
1088 | |||
1089 | if (cmdparams.Length < 8) | ||
1090 | email = MainConsole.Instance.CmdPrompt("Email", ""); | ||
1091 | else email = cmdparams[7]; | ||
1092 | |||
1093 | if (null == m_commsManager.UserProfileCacheService.GetUserDetails(firstName, lastName)) | ||
1094 | { | ||
1095 | m_commsManager.UserAdminService.AddUser(firstName, lastName, password, email, regX, regY); | ||
1096 | } | ||
1097 | else | ||
1098 | { | ||
1099 | MainConsole.Instance.Output(string.Format("A user with the name {0} {1} already exists!", firstName, lastName)); | ||
1100 | } | ||
1101 | } | ||
1102 | |||
1103 | /// <summary> | ||
1104 | /// Reset a user password. | ||
1105 | /// </summary> | ||
1106 | /// <param name="cmdparams"></param> | ||
1107 | private void ResetUserPassword(string[] cmdparams) | ||
1108 | { | ||
1109 | string firstName; | ||
1110 | string lastName; | ||
1111 | string newPassword; | ||
1112 | |||
1113 | if (cmdparams.Length < 4) | ||
1114 | firstName = MainConsole.Instance.CmdPrompt("First name"); | ||
1115 | else firstName = cmdparams[3]; | ||
1116 | |||
1117 | if (cmdparams.Length < 5) | ||
1118 | lastName = MainConsole.Instance.CmdPrompt("Last name"); | ||
1119 | else lastName = cmdparams[4]; | ||
1120 | |||
1121 | if (cmdparams.Length < 6) | ||
1122 | newPassword = MainConsole.Instance.PasswdPrompt("New password"); | ||
1123 | else newPassword = cmdparams[5]; | ||
1124 | |||
1125 | m_commsManager.UserAdminService.ResetUserPassword(firstName, lastName, newPassword); | ||
1126 | } | ||
1127 | |||
1128 | /// <summary> | ||
1129 | /// Use XML2 format to serialize data to a file | 1002 | /// Use XML2 format to serialize data to a file |
1130 | /// </summary> | 1003 | /// </summary> |
1131 | /// <param name="module"></param> | 1004 | /// <param name="module"></param> |
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index cf2ab65..06ffa91 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs | |||
@@ -36,8 +36,7 @@ using Nini.Config; | |||
36 | using OpenMetaverse; | 36 | using OpenMetaverse; |
37 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | using OpenSim.Framework.Communications; | 38 | using OpenSim.Framework.Communications; |
39 | using OpenSim.Framework.Communications.Services; | 39 | |
40 | using OpenSim.Framework.Communications.Cache; | ||
41 | using OpenSim.Framework.Console; | 40 | using OpenSim.Framework.Console; |
42 | using OpenSim.Framework.Servers; | 41 | using OpenSim.Framework.Servers; |
43 | using OpenSim.Framework.Servers.HttpServer; | 42 | using OpenSim.Framework.Servers.HttpServer; |
@@ -85,8 +84,6 @@ namespace OpenSim | |||
85 | 84 | ||
86 | protected ConfigurationLoader m_configLoader; | 85 | protected ConfigurationLoader m_configLoader; |
87 | 86 | ||
88 | protected GridInfoService m_gridInfoService; | ||
89 | |||
90 | public ConsoleCommand CreateAccount = null; | 87 | public ConsoleCommand CreateAccount = null; |
91 | 88 | ||
92 | protected List<IApplicationPlugin> m_plugins = new List<IApplicationPlugin>(); | 89 | protected List<IApplicationPlugin> m_plugins = new List<IApplicationPlugin>(); |
@@ -555,35 +552,6 @@ namespace OpenSim | |||
555 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); | 552 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); |
556 | scene.PhysicsScene.SetWaterLevel((float) regionInfo.RegionSettings.WaterHeight); | 553 | scene.PhysicsScene.SetWaterLevel((float) regionInfo.RegionSettings.WaterHeight); |
557 | 554 | ||
558 | // TODO: Remove this cruft once MasterAvatar is fully deprecated | ||
559 | //Master Avatar Setup | ||
560 | UserProfileData masterAvatar; | ||
561 | if (scene.RegionInfo.MasterAvatarAssignedUUID == UUID.Zero) | ||
562 | { | ||
563 | masterAvatar = | ||
564 | m_commsManager.UserService.SetupMasterUser(scene.RegionInfo.MasterAvatarFirstName, | ||
565 | scene.RegionInfo.MasterAvatarLastName, | ||
566 | scene.RegionInfo.MasterAvatarSandboxPassword); | ||
567 | } | ||
568 | else | ||
569 | { | ||
570 | masterAvatar = m_commsManager.UserService.SetupMasterUser(scene.RegionInfo.MasterAvatarAssignedUUID); | ||
571 | scene.RegionInfo.MasterAvatarFirstName = masterAvatar.FirstName; | ||
572 | scene.RegionInfo.MasterAvatarLastName = masterAvatar.SurName; | ||
573 | } | ||
574 | |||
575 | if (masterAvatar == null) | ||
576 | { | ||
577 | m_log.Info("[PARCEL]: No master avatar found, using null."); | ||
578 | scene.RegionInfo.MasterAvatarAssignedUUID = UUID.Zero; | ||
579 | } | ||
580 | else | ||
581 | { | ||
582 | m_log.InfoFormat("[PARCEL]: Found master avatar {0} {1} [" + masterAvatar.ID.ToString() + "]", | ||
583 | scene.RegionInfo.MasterAvatarFirstName, scene.RegionInfo.MasterAvatarLastName); | ||
584 | scene.RegionInfo.MasterAvatarAssignedUUID = masterAvatar.ID; | ||
585 | } | ||
586 | |||
587 | return scene; | 555 | return scene; |
588 | } | 556 | } |
589 | 557 | ||
@@ -606,15 +574,10 @@ namespace OpenSim | |||
606 | protected override Scene CreateScene(RegionInfo regionInfo, StorageManager storageManager, | 574 | protected override Scene CreateScene(RegionInfo regionInfo, StorageManager storageManager, |
607 | AgentCircuitManager circuitManager) | 575 | AgentCircuitManager circuitManager) |
608 | { | 576 | { |
609 | bool hgrid = ConfigSource.Source.Configs["Startup"].GetBoolean("hypergrid", false); | 577 | SceneCommunicationService sceneGridService = new SceneCommunicationService(); |
610 | if (hgrid) | ||
611 | return HGCommands.CreateScene(regionInfo, circuitManager, m_commsManager, | ||
612 | storageManager, m_moduleLoader, m_configSettings, m_config, m_version); | ||
613 | |||
614 | SceneCommunicationService sceneGridService = new SceneCommunicationService(m_commsManager); | ||
615 | 578 | ||
616 | return new Scene( | 579 | return new Scene( |
617 | regionInfo, circuitManager, m_commsManager, sceneGridService, | 580 | regionInfo, circuitManager, sceneGridService, |
618 | storageManager, m_moduleLoader, false, m_configSettings.PhysicalPrim, | 581 | storageManager, m_moduleLoader, false, m_configSettings.PhysicalPrim, |
619 | m_configSettings.See_into_region_from_neighbor, m_config.Source, m_version); | 582 | m_configSettings.See_into_region_from_neighbor, m_config.Source, m_version); |
620 | } | 583 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs index b53a2fb..9869a99 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs | |||
@@ -31,7 +31,6 @@ using OpenMetaverse; | |||
31 | using OpenMetaverse.Imaging; | 31 | using OpenMetaverse.Imaging; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Region.Framework.Interfaces; | 33 | using OpenSim.Region.Framework.Interfaces; |
34 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
35 | using OpenSim.Services.Interfaces; | 34 | using OpenSim.Services.Interfaces; |
36 | using log4net; | 35 | using log4net; |
37 | using System.Reflection; | 36 | using System.Reflection; |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 2ca2657..ef49205 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -40,11 +40,10 @@ using OpenMetaverse.Packets; | |||
40 | using OpenMetaverse.StructuredData; | 40 | using OpenMetaverse.StructuredData; |
41 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
42 | using OpenSim.Framework.Client; | 42 | using OpenSim.Framework.Client; |
43 | using OpenSim.Framework.Communications.Cache; | 43 | |
44 | using OpenSim.Framework.Statistics; | 44 | using OpenSim.Framework.Statistics; |
45 | using OpenSim.Region.Framework.Interfaces; | 45 | using OpenSim.Region.Framework.Interfaces; |
46 | using OpenSim.Region.Framework.Scenes; | 46 | using OpenSim.Region.Framework.Scenes; |
47 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
48 | using OpenSim.Services.Interfaces; | 47 | using OpenSim.Services.Interfaces; |
49 | using Timer = System.Timers.Timer; | 48 | using Timer = System.Timers.Timer; |
50 | using AssetLandmark = OpenSim.Framework.AssetLandmark; | 49 | using AssetLandmark = OpenSim.Framework.AssetLandmark; |
@@ -122,7 +121,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
122 | public event ObjectAttach OnObjectAttach; | 121 | public event ObjectAttach OnObjectAttach; |
123 | public event ObjectDeselect OnObjectDetach; | 122 | public event ObjectDeselect OnObjectDetach; |
124 | public event ObjectDrop OnObjectDrop; | 123 | public event ObjectDrop OnObjectDrop; |
125 | public event GenericCall2 OnCompleteMovementToRegion; | 124 | public event GenericCall1 OnCompleteMovementToRegion; |
126 | public event UpdateAgent OnAgentUpdate; | 125 | public event UpdateAgent OnAgentUpdate; |
127 | public event AgentRequestSit OnAgentRequestSit; | 126 | public event AgentRequestSit OnAgentRequestSit; |
128 | public event AgentSit OnAgentSit; | 127 | public event AgentSit OnAgentSit; |
@@ -353,6 +352,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
353 | private bool m_SendLogoutPacketWhenClosing = true; | 352 | private bool m_SendLogoutPacketWhenClosing = true; |
354 | private AgentUpdateArgs lastarg; | 353 | private AgentUpdateArgs lastarg; |
355 | private bool m_IsActive = true; | 354 | private bool m_IsActive = true; |
355 | private bool m_IsLoggingOut = false; | ||
356 | 356 | ||
357 | protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); | 357 | protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); |
358 | protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers | 358 | protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers |
@@ -416,6 +416,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
416 | get { return m_IsActive; } | 416 | get { return m_IsActive; } |
417 | set { m_IsActive = value; } | 417 | set { m_IsActive = value; } |
418 | } | 418 | } |
419 | public bool IsLoggingOut | ||
420 | { | ||
421 | get { return m_IsLoggingOut; } | ||
422 | set { m_IsLoggingOut = value; } | ||
423 | } | ||
424 | |||
419 | public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } } | 425 | public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } } |
420 | 426 | ||
421 | #endregion Properties | 427 | #endregion Properties |
@@ -2527,6 +2533,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2527 | 2533 | ||
2528 | public void SendAsset(AssetRequestToClient req) | 2534 | public void SendAsset(AssetRequestToClient req) |
2529 | { | 2535 | { |
2536 | if (req.AssetInf.Data == null) | ||
2537 | { | ||
2538 | m_log.ErrorFormat("Cannot send asset {0} ({1}), asset data is null", | ||
2539 | req.AssetInf.ID, req.AssetInf.Metadata.ContentType); | ||
2540 | return; | ||
2541 | } | ||
2542 | |||
2530 | //m_log.Debug("sending asset " + req.RequestAssetID); | 2543 | //m_log.Debug("sending asset " + req.RequestAssetID); |
2531 | TransferInfoPacket Transfer = new TransferInfoPacket(); | 2544 | TransferInfoPacket Transfer = new TransferInfoPacket(); |
2532 | Transfer.TransferInfo.ChannelType = 2; | 2545 | Transfer.TransferInfo.ChannelType = 2; |
@@ -4065,10 +4078,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4065 | EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock(); | 4078 | EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock(); |
4066 | edata.CovenantID = covenant; | 4079 | edata.CovenantID = covenant; |
4067 | edata.CovenantTimestamp = 0; | 4080 | edata.CovenantTimestamp = 0; |
4068 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 4081 | edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
4069 | edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
4070 | else | ||
4071 | edata.EstateOwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
4072 | edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName); | 4082 | edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName); |
4073 | einfopack.Data = edata; | 4083 | einfopack.Data = edata; |
4074 | OutPacket(einfopack, ThrottleOutPacketType.Task); | 4084 | OutPacket(einfopack, ThrottleOutPacketType.Task); |
@@ -4089,8 +4099,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4089 | 4099 | ||
4090 | //Sending Estate Settings | 4100 | //Sending Estate Settings |
4091 | returnblock[0].Parameter = Utils.StringToBytes(estateName); | 4101 | returnblock[0].Parameter = Utils.StringToBytes(estateName); |
4092 | // TODO: remove this cruft once MasterAvatar is fully deprecated | ||
4093 | // | ||
4094 | returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString()); | 4102 | returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString()); |
4095 | returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString()); | 4103 | returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString()); |
4096 | 4104 | ||
@@ -5518,6 +5526,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5518 | // for the client session anyway, in order to protect ourselves against bad code in plugins | 5526 | // for the client session anyway, in order to protect ourselves against bad code in plugins |
5519 | try | 5527 | try |
5520 | { | 5528 | { |
5529 | |||
5521 | byte[] visualparams = new byte[appear.VisualParam.Length]; | 5530 | byte[] visualparams = new byte[appear.VisualParam.Length]; |
5522 | for (int i = 0; i < appear.VisualParam.Length; i++) | 5531 | for (int i = 0; i < appear.VisualParam.Length; i++) |
5523 | visualparams[i] = appear.VisualParam[i].ParamValue; | 5532 | visualparams[i] = appear.VisualParam[i].ParamValue; |
@@ -5728,10 +5737,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5728 | 5737 | ||
5729 | private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack) | 5738 | private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack) |
5730 | { | 5739 | { |
5731 | GenericCall2 handlerCompleteMovementToRegion = OnCompleteMovementToRegion; | 5740 | GenericCall1 handlerCompleteMovementToRegion = OnCompleteMovementToRegion; |
5732 | if (handlerCompleteMovementToRegion != null) | 5741 | if (handlerCompleteMovementToRegion != null) |
5733 | { | 5742 | { |
5734 | handlerCompleteMovementToRegion(); | 5743 | handlerCompleteMovementToRegion(sender); |
5735 | } | 5744 | } |
5736 | handlerCompleteMovementToRegion = null; | 5745 | handlerCompleteMovementToRegion = null; |
5737 | 5746 | ||
@@ -7051,7 +7060,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7051 | assetRequestItem = invService.GetItem(assetRequestItem); | 7060 | assetRequestItem = invService.GetItem(assetRequestItem); |
7052 | if (assetRequestItem == null) | 7061 | if (assetRequestItem == null) |
7053 | { | 7062 | { |
7054 | assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); | 7063 | ILibraryService lib = m_scene.RequestModuleInterface<ILibraryService>(); |
7064 | if (lib != null) | ||
7065 | assetRequestItem = lib.LibraryRootFolder.FindItem(itemID); | ||
7055 | if (assetRequestItem == null) | 7066 | if (assetRequestItem == null) |
7056 | return true; | 7067 | return true; |
7057 | } | 7068 | } |
@@ -11346,6 +11357,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11346 | const uint m_maxPacketSize = 600; | 11357 | const uint m_maxPacketSize = 600; |
11347 | int numPackets = 1; | 11358 | int numPackets = 1; |
11348 | 11359 | ||
11360 | if (data == null) | ||
11361 | return 0; | ||
11362 | |||
11349 | if (data.LongLength > m_maxPacketSize) | 11363 | if (data.LongLength > m_maxPacketSize) |
11350 | { | 11364 | { |
11351 | // over max number of bytes so split up file | 11365 | // over max number of bytes so split up file |
@@ -11591,5 +11605,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11591 | packet.PropertiesData.LanguagesText = Utils.StringToBytes(languages); | 11605 | packet.PropertiesData.LanguagesText = Utils.StringToBytes(languages); |
11592 | OutPacket(packet, ThrottleOutPacketType.Task); | 11606 | OutPacket(packet, ThrottleOutPacketType.Task); |
11593 | } | 11607 | } |
11608 | |||
11609 | public void SendChangeUserRights(UUID agentID, UUID friendID, int rights) | ||
11610 | { | ||
11611 | ChangeUserRightsPacket packet = (ChangeUserRightsPacket)PacketPool.Instance.GetPacket(PacketType.ChangeUserRights); | ||
11612 | |||
11613 | packet.AgentData = new ChangeUserRightsPacket.AgentDataBlock(); | ||
11614 | packet.AgentData.AgentID = agentID; | ||
11615 | |||
11616 | packet.Rights = new ChangeUserRightsPacket.RightsBlock[1]; | ||
11617 | packet.Rights[0] = new ChangeUserRightsPacket.RightsBlock(); | ||
11618 | packet.Rights[0].AgentRelated = friendID; | ||
11619 | packet.Rights[0].RelatedRights = rights; | ||
11620 | |||
11621 | OutPacket(packet, ThrottleOutPacketType.Task); | ||
11622 | } | ||
11594 | } | 11623 | } |
11595 | } | 11624 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLFileTransfer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLFileTransfer.cs index adf171e..10e5a95 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLFileTransfer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLFileTransfer.cs | |||
@@ -197,7 +197,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
197 | 197 | ||
198 | private void Initialise(UUID fileID, string fileName) | 198 | private void Initialise(UUID fileID, string fileName) |
199 | { | 199 | { |
200 | m_asset = new AssetBase(fileID, fileName, type); | 200 | m_asset = new AssetBase(fileID, fileName, type, UUID.Zero.ToString()); |
201 | m_asset.Data = new byte[0]; | 201 | m_asset.Data = new byte[0]; |
202 | m_asset.Description = "empty"; | 202 | m_asset.Description = "empty"; |
203 | m_asset.Local = true; | 203 | m_asset.Local = true; |
@@ -212,6 +212,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
212 | 212 | ||
213 | public void RequestStartXfer(IClientAPI pRemoteClient) | 213 | public void RequestStartXfer(IClientAPI pRemoteClient) |
214 | { | 214 | { |
215 | m_asset.Metadata.CreatorID = pRemoteClient.AgentId.ToString(); | ||
216 | |||
215 | if (!String.IsNullOrEmpty(m_asset.Name)) | 217 | if (!String.IsNullOrEmpty(m_asset.Name)) |
216 | { | 218 | { |
217 | pRemoteClient.SendXferRequest(mXferID, m_asset.Type, m_asset.FullID, 0, Utils.StringToBytes(m_asset.Name)); | 219 | pRemoteClient.SendXferRequest(mXferID, m_asset.Type, m_asset.FullID, 0, Utils.StringToBytes(m_asset.Name)); |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 3c4fa72..36d24e8 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -596,15 +596,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
596 | } | 596 | } |
597 | catch (MalformedDataException) | 597 | catch (MalformedDataException) |
598 | { | 598 | { |
599 | m_log.ErrorFormat("[LLUDPSERVER]: Malformed data, cannot parse packet from {0}:\n{1}", | ||
600 | buffer.RemoteEndPoint, Utils.BytesToHexString(buffer.Data, buffer.DataLength, null)); | ||
601 | } | 599 | } |
602 | 600 | ||
603 | // Fail-safe check | 601 | // Fail-safe check |
604 | if (packet == null) | 602 | if (packet == null) |
605 | { | 603 | { |
606 | m_log.Warn("[LLUDPSERVER]: Couldn't build a message from incoming data " + buffer.DataLength + | 604 | m_log.ErrorFormat("[LLUDPSERVER]: Malformed data, cannot parse {0} byte packet from {1}:", |
607 | " bytes long from " + buffer.RemoteEndPoint); | 605 | buffer.DataLength, buffer.RemoteEndPoint); |
606 | m_log.Error(Utils.BytesToHexString(buffer.Data, buffer.DataLength, null)); | ||
608 | return; | 607 | return; |
609 | } | 608 | } |
610 | 609 | ||
@@ -919,7 +918,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
919 | // Remove this client from the scene | 918 | // Remove this client from the scene |
920 | IClientAPI client; | 919 | IClientAPI client; |
921 | if (m_scene.TryGetClient(udpClient.AgentID, out client)) | 920 | if (m_scene.TryGetClient(udpClient.AgentID, out client)) |
921 | { | ||
922 | client.IsLoggingOut = true; | ||
922 | client.Close(); | 923 | client.Close(); |
924 | } | ||
923 | } | 925 | } |
924 | 926 | ||
925 | private void IncomingPacketHandler() | 927 | private void IncomingPacketHandler() |
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs index c7aeca14..0ec87e5 100644 --- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs | |||
@@ -56,13 +56,6 @@ namespace OpenSim.Region.ClientStack | |||
56 | 56 | ||
57 | protected uint m_httpServerPort; | 57 | protected uint m_httpServerPort; |
58 | 58 | ||
59 | public CommunicationsManager CommunicationsManager | ||
60 | { | ||
61 | get { return m_commsManager; } | ||
62 | set { m_commsManager = value; } | ||
63 | } | ||
64 | protected CommunicationsManager m_commsManager; | ||
65 | |||
66 | protected StorageManager m_storageManager; | 59 | protected StorageManager m_storageManager; |
67 | 60 | ||
68 | protected ClientStackManager m_clientStackManager; | 61 | protected ClientStackManager m_clientStackManager; |
@@ -111,6 +104,8 @@ namespace OpenSim.Region.ClientStack | |||
111 | m_log.Info("[REGION]: Starting HTTP server"); | 104 | m_log.Info("[REGION]: Starting HTTP server"); |
112 | m_httpServer.Start(); | 105 | m_httpServer.Start(); |
113 | 106 | ||
107 | MainServer.Instance = m_httpServer; | ||
108 | |||
114 | base.StartupSpecific(); | 109 | base.StartupSpecific(); |
115 | } | 110 | } |
116 | 111 | ||
diff --git a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs deleted file mode 100644 index e80f6ab..0000000 --- a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Reflection; | ||
29 | using log4net; | ||
30 | using OpenSim.Data; | ||
31 | using OpenSim.Framework; | ||
32 | using OpenSim.Framework.Communications; | ||
33 | using OpenSim.Framework.Communications.Cache; | ||
34 | using OpenSim.Framework.Servers; | ||
35 | using OpenSim.Framework.Servers.HttpServer; | ||
36 | using OpenSim.Region.Communications.OGS1; | ||
37 | using OpenSim.Region.Framework.Scenes; | ||
38 | |||
39 | namespace OpenSim.Region.Communications.Hypergrid | ||
40 | { | ||
41 | public class HGCommunicationsGridMode : CommunicationsManager // CommunicationsOGS1 | ||
42 | { | ||
43 | |||
44 | public HGCommunicationsGridMode( | ||
45 | NetworkServersInfo serversInfo, | ||
46 | SceneManager sman, LibraryRootFolder libraryRootFolder) | ||
47 | : base(serversInfo, libraryRootFolder) | ||
48 | { | ||
49 | |||
50 | HGUserServices userServices = new HGUserServices(this); | ||
51 | // This plugin arrangement could eventually be configurable rather than hardcoded here. | ||
52 | userServices.AddPlugin(new TemporaryUserProfilePlugin()); | ||
53 | userServices.AddPlugin(new HGUserDataPlugin(this, userServices)); | ||
54 | |||
55 | m_userService = userServices; | ||
56 | m_messageService = userServices; | ||
57 | m_avatarService = userServices; | ||
58 | } | ||
59 | } | ||
60 | } | ||
diff --git a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs deleted file mode 100644 index 4e3f5a1..0000000 --- a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs +++ /dev/null | |||
@@ -1,68 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Collections.Generic; | ||
29 | using OpenSim.Data; | ||
30 | using OpenSim.Framework; | ||
31 | using OpenSim.Framework.Communications; | ||
32 | using OpenSim.Framework.Communications.Cache; | ||
33 | using OpenSim.Framework.Communications.Osp; | ||
34 | using OpenSim.Framework.Servers; | ||
35 | using OpenSim.Framework.Servers.HttpServer; | ||
36 | using OpenSim.Region.Communications.Local; | ||
37 | using OpenSim.Region.Communications.OGS1; | ||
38 | |||
39 | namespace OpenSim.Region.Communications.Hypergrid | ||
40 | { | ||
41 | public class HGCommunicationsStandalone : CommunicationsManager | ||
42 | { | ||
43 | public HGCommunicationsStandalone( | ||
44 | ConfigSettings configSettings, | ||
45 | NetworkServersInfo serversInfo, | ||
46 | BaseHttpServer httpServer, | ||
47 | LibraryRootFolder libraryRootFolder, | ||
48 | bool dumpAssetsToFile) | ||
49 | : base(serversInfo, libraryRootFolder) | ||
50 | { | ||
51 | LocalUserServices localUserService = | ||
52 | new LocalUserServices( | ||
53 | serversInfo.DefaultHomeLocX, serversInfo.DefaultHomeLocY, this); | ||
54 | localUserService.AddPlugin(configSettings.StandaloneUserPlugin, configSettings.StandaloneUserSource); | ||
55 | |||
56 | HGUserServices hgUserService = new HGUserServices(this, localUserService); | ||
57 | // This plugin arrangement could eventually be configurable rather than hardcoded here. | ||
58 | hgUserService.AddPlugin(new TemporaryUserProfilePlugin()); | ||
59 | hgUserService.AddPlugin(new HGUserDataPlugin(this, hgUserService)); | ||
60 | |||
61 | m_userService = hgUserService; | ||
62 | m_userAdminService = hgUserService; | ||
63 | m_avatarService = hgUserService; | ||
64 | m_messageService = hgUserService; | ||
65 | |||
66 | } | ||
67 | } | ||
68 | } | ||
diff --git a/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs b/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs deleted file mode 100644 index 09d8285..0000000 --- a/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs +++ /dev/null | |||
@@ -1,337 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using OpenMetaverse; | ||
32 | using OpenSim.Framework; | ||
33 | using OpenSim.Framework.Communications; | ||
34 | using OpenSim.Framework.Communications.Cache; | ||
35 | using OpenSim.Framework.Communications.Clients; | ||
36 | using OpenSim.Region.Communications.OGS1; | ||
37 | using OpenSim.Region.Communications.Local; | ||
38 | using OpenSim.Services.Interfaces; | ||
39 | |||
40 | namespace OpenSim.Region.Communications.Hypergrid | ||
41 | { | ||
42 | /// <summary> | ||
43 | /// For the time being, this class is just an identity wrapper around OGS1UserServices, | ||
44 | /// so it always fails for foreign users. | ||
45 | /// Later it needs to talk with the foreign users' user servers. | ||
46 | /// </summary> | ||
47 | public class HGUserServices : OGS1UserServices | ||
48 | { | ||
49 | //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
50 | |||
51 | //private OGS1UserServices m_remoteUserServices; | ||
52 | private LocalUserServices m_localUserServices; | ||
53 | |||
54 | // Constructor called when running in grid mode | ||
55 | public HGUserServices(CommunicationsManager commsManager) | ||
56 | : base(commsManager) | ||
57 | { | ||
58 | } | ||
59 | |||
60 | // Constructor called when running in standalone | ||
61 | public HGUserServices(CommunicationsManager commsManager, LocalUserServices local) | ||
62 | : base(commsManager) | ||
63 | { | ||
64 | m_localUserServices = local; | ||
65 | } | ||
66 | |||
67 | public override void SetInventoryService(IInventoryService invService) | ||
68 | { | ||
69 | base.SetInventoryService(invService); | ||
70 | if (m_localUserServices != null) | ||
71 | m_localUserServices.SetInventoryService(invService); | ||
72 | } | ||
73 | |||
74 | public override UUID AddUser( | ||
75 | string firstName, string lastName, string password, string email, uint regX, uint regY, UUID uuid) | ||
76 | { | ||
77 | // Only valid to create users locally | ||
78 | if (m_localUserServices != null) | ||
79 | return m_localUserServices.AddUser(firstName, lastName, password, email, regX, regY, uuid); | ||
80 | |||
81 | return UUID.Zero; | ||
82 | } | ||
83 | |||
84 | public override bool AddUserAgent(UserAgentData agentdata) | ||
85 | { | ||
86 | if (m_localUserServices != null) | ||
87 | return m_localUserServices.AddUserAgent(agentdata); | ||
88 | |||
89 | return base.AddUserAgent(agentdata); | ||
90 | } | ||
91 | |||
92 | public override UserAgentData GetAgentByUUID(UUID userId) | ||
93 | { | ||
94 | string url = string.Empty; | ||
95 | if ((m_localUserServices != null) && !IsForeignUser(userId, out url)) | ||
96 | return m_localUserServices.GetAgentByUUID(userId); | ||
97 | |||
98 | return base.GetAgentByUUID(userId); | ||
99 | } | ||
100 | |||
101 | public override void LogOffUser(UUID userid, UUID regionid, ulong regionhandle, Vector3 position, Vector3 lookat) | ||
102 | { | ||
103 | string url = string.Empty; | ||
104 | if ((m_localUserServices != null) && !IsForeignUser(userid, out url)) | ||
105 | m_localUserServices.LogOffUser(userid, regionid, regionhandle, position, lookat); | ||
106 | else | ||
107 | base.LogOffUser(userid, regionid, regionhandle, position, lookat); | ||
108 | } | ||
109 | |||
110 | public override UserProfileData GetUserProfile(string firstName, string lastName) | ||
111 | { | ||
112 | if (m_localUserServices != null) | ||
113 | return m_localUserServices.GetUserProfile(firstName, lastName); | ||
114 | |||
115 | return base.GetUserProfile(firstName, lastName); | ||
116 | } | ||
117 | |||
118 | public override List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(UUID queryID, string query) | ||
119 | { | ||
120 | if (m_localUserServices != null) | ||
121 | return m_localUserServices.GenerateAgentPickerRequestResponse(queryID, query); | ||
122 | |||
123 | return base.GenerateAgentPickerRequestResponse(queryID, query); | ||
124 | } | ||
125 | |||
126 | /// <summary> | ||
127 | /// Get a user profile from the user server | ||
128 | /// </summary> | ||
129 | /// <param name="avatarID"></param> | ||
130 | /// <returns>null if the request fails</returns> | ||
131 | public override UserProfileData GetUserProfile(UUID avatarID) | ||
132 | { | ||
133 | //string url = string.Empty; | ||
134 | // Unfortunately we can't query for foreigners here, | ||
135 | // because we'll end up in an infinite loop... | ||
136 | //if ((m_localUserServices != null) && (!IsForeignUser(avatarID, out url))) | ||
137 | if (m_localUserServices != null) | ||
138 | return m_localUserServices.GetUserProfile(avatarID); | ||
139 | |||
140 | return base.GetUserProfile(avatarID); | ||
141 | } | ||
142 | |||
143 | public override void ClearUserAgent(UUID avatarID) | ||
144 | { | ||
145 | if (m_localUserServices != null) | ||
146 | m_localUserServices.ClearUserAgent(avatarID); | ||
147 | else | ||
148 | base.ClearUserAgent(avatarID); | ||
149 | } | ||
150 | |||
151 | /// <summary> | ||
152 | /// Retrieve the user information for the given master uuid. | ||
153 | /// </summary> | ||
154 | /// <param name="uuid"></param> | ||
155 | /// <returns></returns> | ||
156 | public override UserProfileData SetupMasterUser(string firstName, string lastName) | ||
157 | { | ||
158 | if (m_localUserServices != null) | ||
159 | return m_localUserServices.SetupMasterUser(firstName, lastName); | ||
160 | |||
161 | return base.SetupMasterUser(firstName, lastName); | ||
162 | } | ||
163 | |||
164 | /// <summary> | ||
165 | /// Retrieve the user information for the given master uuid. | ||
166 | /// </summary> | ||
167 | /// <param name="uuid"></param> | ||
168 | /// <returns></returns> | ||
169 | public override UserProfileData SetupMasterUser(string firstName, string lastName, string password) | ||
170 | { | ||
171 | if (m_localUserServices != null) | ||
172 | return m_localUserServices.SetupMasterUser(firstName, lastName, password); | ||
173 | |||
174 | return base.SetupMasterUser(firstName, lastName, password); | ||
175 | } | ||
176 | |||
177 | /// <summary> | ||
178 | /// Retrieve the user information for the given master uuid. | ||
179 | /// </summary> | ||
180 | /// <param name="uuid"></param> | ||
181 | /// <returns></returns> | ||
182 | public override UserProfileData SetupMasterUser(UUID uuid) | ||
183 | { | ||
184 | if (m_localUserServices != null) | ||
185 | return m_localUserServices.SetupMasterUser(uuid); | ||
186 | |||
187 | return base.SetupMasterUser(uuid); | ||
188 | } | ||
189 | |||
190 | public override bool ResetUserPassword(string firstName, string lastName, string newPassword) | ||
191 | { | ||
192 | if (m_localUserServices != null) | ||
193 | return m_localUserServices.ResetUserPassword(firstName, lastName, newPassword); | ||
194 | else | ||
195 | return base.ResetUserPassword(firstName, lastName, newPassword); | ||
196 | } | ||
197 | |||
198 | public override bool UpdateUserProfile(UserProfileData userProfile) | ||
199 | { | ||
200 | string url = string.Empty; | ||
201 | if ((m_localUserServices != null) && (!IsForeignUser(userProfile.ID, out url))) | ||
202 | return m_localUserServices.UpdateUserProfile(userProfile); | ||
203 | |||
204 | return base.UpdateUserProfile(userProfile); | ||
205 | } | ||
206 | |||
207 | public override bool AuthenticateUserByPassword(UUID userID, string password) | ||
208 | { | ||
209 | if (m_localUserServices != null) | ||
210 | return m_localUserServices.AuthenticateUserByPassword(userID, password); | ||
211 | else | ||
212 | return base.AuthenticateUserByPassword(userID, password); | ||
213 | } | ||
214 | |||
215 | #region IUserServices Friend Methods | ||
216 | |||
217 | // NOTE: We're still not dealing with foreign user friends | ||
218 | |||
219 | /// <summary> | ||
220 | /// Adds a new friend to the database for XUser | ||
221 | /// </summary> | ||
222 | /// <param name="friendlistowner">The agent that who's friends list is being added to</param> | ||
223 | /// <param name="friend">The agent that being added to the friends list of the friends list owner</param> | ||
224 | /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param> | ||
225 | public override void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) | ||
226 | { | ||
227 | if (m_localUserServices != null) | ||
228 | m_localUserServices.AddNewUserFriend(friendlistowner, friend, perms); | ||
229 | else | ||
230 | base.AddNewUserFriend(friendlistowner, friend, perms); | ||
231 | } | ||
232 | |||
233 | /// <summary> | ||
234 | /// Delete friend on friendlistowner's friendlist. | ||
235 | /// </summary> | ||
236 | /// <param name="friendlistowner">The agent that who's friends list is being updated</param> | ||
237 | /// <param name="friend">The Ex-friend agent</param> | ||
238 | public override void RemoveUserFriend(UUID friendlistowner, UUID friend) | ||
239 | { | ||
240 | if (m_localUserServices != null) | ||
241 | m_localUserServices.RemoveUserFriend(friendlistowner, friend); | ||
242 | else | ||
243 | base.RemoveUserFriend(friend, friend); | ||
244 | } | ||
245 | |||
246 | /// <summary> | ||
247 | /// Update permissions for friend on friendlistowner's friendlist. | ||
248 | /// </summary> | ||
249 | /// <param name="friendlistowner">The agent that who's friends list is being updated</param> | ||
250 | /// <param name="friend">The agent that is getting or loosing permissions</param> | ||
251 | /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param> | ||
252 | public override void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) | ||
253 | { | ||
254 | if (m_localUserServices != null) | ||
255 | m_localUserServices.UpdateUserFriendPerms(friendlistowner, friend, perms); | ||
256 | else | ||
257 | base.UpdateUserFriendPerms(friendlistowner, friend, perms); | ||
258 | } | ||
259 | /// <summary> | ||
260 | /// Returns a list of FriendsListItems that describe the friends and permissions in the friend relationship for UUID friendslistowner | ||
261 | /// </summary> | ||
262 | /// <param name="friendlistowner">The agent that we're retreiving the friends Data.</param> | ||
263 | public override List<FriendListItem> GetUserFriendList(UUID friendlistowner) | ||
264 | { | ||
265 | if (m_localUserServices != null) | ||
266 | return m_localUserServices.GetUserFriendList(friendlistowner); | ||
267 | |||
268 | return base.GetUserFriendList(friendlistowner); | ||
269 | } | ||
270 | |||
271 | #endregion | ||
272 | |||
273 | /// Appearance | ||
274 | public override AvatarAppearance GetUserAppearance(UUID user) | ||
275 | { | ||
276 | string url = string.Empty; | ||
277 | if ((m_localUserServices != null) && (!IsForeignUser(user, out url))) | ||
278 | return m_localUserServices.GetUserAppearance(user); | ||
279 | else | ||
280 | return base.GetUserAppearance(user); | ||
281 | } | ||
282 | |||
283 | public override void UpdateUserAppearance(UUID user, AvatarAppearance appearance) | ||
284 | { | ||
285 | string url = string.Empty; | ||
286 | if ((m_localUserServices != null) && (!IsForeignUser(user, out url))) | ||
287 | m_localUserServices.UpdateUserAppearance(user, appearance); | ||
288 | else | ||
289 | base.UpdateUserAppearance(user, appearance); | ||
290 | } | ||
291 | |||
292 | #region IMessagingService | ||
293 | |||
294 | public override Dictionary<UUID, FriendRegionInfo> GetFriendRegionInfos(List<UUID> uuids) | ||
295 | { | ||
296 | if (m_localUserServices != null) | ||
297 | return m_localUserServices.GetFriendRegionInfos(uuids); | ||
298 | |||
299 | return base.GetFriendRegionInfos(uuids); | ||
300 | } | ||
301 | #endregion | ||
302 | |||
303 | public override bool VerifySession(UUID userID, UUID sessionID) | ||
304 | { | ||
305 | string url = string.Empty; | ||
306 | if ((m_localUserServices != null) && (!IsForeignUser(userID, out url))) | ||
307 | return m_localUserServices.VerifySession(userID, sessionID); | ||
308 | else | ||
309 | return base.VerifySession(userID, sessionID); | ||
310 | } | ||
311 | |||
312 | |||
313 | protected override string GetUserServerURL(UUID userID) | ||
314 | { | ||
315 | string serverURL = string.Empty; | ||
316 | if (IsForeignUser(userID, out serverURL)) | ||
317 | return serverURL; | ||
318 | |||
319 | return m_commsManager.NetworkServersInfo.UserURL; | ||
320 | } | ||
321 | |||
322 | public bool IsForeignUser(UUID userID, out string userServerURL) | ||
323 | { | ||
324 | userServerURL = m_commsManager.NetworkServersInfo.UserURL; | ||
325 | CachedUserInfo uinfo = m_commsManager.UserProfileCacheService.GetUserDetails(userID); | ||
326 | if (uinfo != null) | ||
327 | { | ||
328 | if (!HGNetworkServersInfo.Singleton.IsLocalUser(uinfo.UserProfile)) | ||
329 | { | ||
330 | userServerURL = ((ForeignUserProfileData)(uinfo.UserProfile)).UserServerURI; | ||
331 | return true; | ||
332 | } | ||
333 | } | ||
334 | return false; | ||
335 | } | ||
336 | } | ||
337 | } | ||
diff --git a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs deleted file mode 100644 index eaf996d..0000000 --- a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Collections.Generic; | ||
29 | using OpenSim.Data; | ||
30 | using OpenSim.Framework; | ||
31 | using OpenSim.Framework.Communications; | ||
32 | using OpenSim.Framework.Communications.Cache; | ||
33 | using OpenSim.Framework.Communications.Osp; | ||
34 | |||
35 | namespace OpenSim.Region.Communications.Local | ||
36 | { | ||
37 | public class CommunicationsLocal : CommunicationsManager | ||
38 | { | ||
39 | public CommunicationsLocal( | ||
40 | ConfigSettings configSettings, | ||
41 | NetworkServersInfo serversInfo, | ||
42 | LibraryRootFolder libraryRootFolder) | ||
43 | : base(serversInfo, libraryRootFolder) | ||
44 | { | ||
45 | |||
46 | LocalUserServices lus | ||
47 | = new LocalUserServices( | ||
48 | serversInfo.DefaultHomeLocX, serversInfo.DefaultHomeLocY, this); | ||
49 | lus.AddPlugin(new TemporaryUserProfilePlugin()); | ||
50 | lus.AddPlugin(configSettings.StandaloneUserPlugin, configSettings.StandaloneUserSource); | ||
51 | m_userService = lus; | ||
52 | m_userAdminService = lus; | ||
53 | m_avatarService = lus; | ||
54 | m_messageService = lus; | ||
55 | |||
56 | //LocalLoginService loginService = CreateLoginService(libraryRootFolder, inventoryService, userService, backendService); | ||
57 | } | ||
58 | } | ||
59 | } | ||
diff --git a/OpenSim/Region/Communications/Local/LocalUserServices.cs b/OpenSim/Region/Communications/Local/LocalUserServices.cs deleted file mode 100644 index 89b55c4..0000000 --- a/OpenSim/Region/Communications/Local/LocalUserServices.cs +++ /dev/null | |||
@@ -1,100 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using OpenMetaverse; | ||
30 | using OpenSim.Framework; | ||
31 | using OpenSim.Framework.Communications; | ||
32 | using log4net; | ||
33 | using System.Reflection; | ||
34 | |||
35 | namespace OpenSim.Region.Communications.Local | ||
36 | { | ||
37 | public class LocalUserServices : UserManagerBase | ||
38 | { | ||
39 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
40 | private readonly uint m_defaultHomeX; | ||
41 | private readonly uint m_defaultHomeY; | ||
42 | |||
43 | /// <summary> | ||
44 | /// User services used when OpenSim is running in standalone mode. | ||
45 | /// </summary> | ||
46 | /// <param name="defaultHomeLocX"></param> | ||
47 | /// <param name="defaultHomeLocY"></param> | ||
48 | /// <param name="commsManager"></param> | ||
49 | public LocalUserServices( | ||
50 | uint defaultHomeLocX, uint defaultHomeLocY, CommunicationsManager commsManager) | ||
51 | : base(commsManager) | ||
52 | { | ||
53 | m_defaultHomeX = defaultHomeLocX; | ||
54 | m_defaultHomeY = defaultHomeLocY; | ||
55 | } | ||
56 | |||
57 | public override UserProfileData SetupMasterUser(string firstName, string lastName) | ||
58 | { | ||
59 | return SetupMasterUser(firstName, lastName, String.Empty); | ||
60 | } | ||
61 | |||
62 | public override UserProfileData SetupMasterUser(string firstName, string lastName, string password) | ||
63 | { | ||
64 | UserProfileData profile = GetUserProfile(firstName, lastName); | ||
65 | if (profile != null) | ||
66 | { | ||
67 | return profile; | ||
68 | } | ||
69 | |||
70 | m_log.Debug("Unknown Master User. Sandbox Mode: Creating Account"); | ||
71 | AddUser(firstName, lastName, password, "", m_defaultHomeX, m_defaultHomeY); | ||
72 | return GetUserProfile(firstName, lastName); | ||
73 | } | ||
74 | |||
75 | public override UserProfileData SetupMasterUser(UUID uuid) | ||
76 | { | ||
77 | UserProfileData data = GetUserProfile(uuid); | ||
78 | if (data == null) | ||
79 | { | ||
80 | throw new Exception("[LOCAL USER SERVICES]: Unknown master user UUID. Possible reason: UserServer is not running."); | ||
81 | } | ||
82 | return data; | ||
83 | } | ||
84 | |||
85 | public override bool AuthenticateUserByPassword(UUID userID, string password) | ||
86 | { | ||
87 | UserProfileData userProfile = GetUserProfile(userID); | ||
88 | |||
89 | if (null == userProfile) | ||
90 | return false; | ||
91 | |||
92 | string md5PasswordHash = Util.Md5Hash(Util.Md5Hash(password) + ":" + userProfile.PasswordSalt); | ||
93 | |||
94 | if (md5PasswordHash == userProfile.PasswordHash) | ||
95 | return true; | ||
96 | else | ||
97 | return false; | ||
98 | } | ||
99 | } | ||
100 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs deleted file mode 100644 index c631bf7..0000000 --- a/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Reflection; | ||
29 | using System.Runtime.InteropServices; | ||
30 | |||
31 | // General information about an assembly is controlled through the following | ||
32 | // set of attributes. Change these attribute values to modify the information | ||
33 | // associated with an assembly. | ||
34 | |||
35 | [assembly : AssemblyTitle("OpenSim.Region.Communications.Local")] | ||
36 | [assembly : AssemblyDescription("")] | ||
37 | [assembly : AssemblyConfiguration("")] | ||
38 | [assembly : AssemblyCompany("http://opensimulator.org")] | ||
39 | [assembly : AssemblyProduct("OpenSim.Region.Communications.Local")] | ||
40 | [assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] | ||
41 | [assembly : AssemblyTrademark("")] | ||
42 | [assembly : AssemblyCulture("")] | ||
43 | |||
44 | // Setting ComVisible to false makes the types in this assembly not visible | ||
45 | // to COM components. If you need to access a type in this assembly from | ||
46 | // COM, set the ComVisible attribute to true on that type. | ||
47 | |||
48 | [assembly : ComVisible(false)] | ||
49 | |||
50 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
51 | |||
52 | [assembly : Guid("fb173926-bd0a-4cd0-bb45-185b2f72ddfb")] | ||
53 | |||
54 | // Version information for an assembly consists of the following four values: | ||
55 | // | ||
56 | // Major Version | ||
57 | // Minor Version | ||
58 | // Build Number | ||
59 | // Revision | ||
60 | // | ||
61 | // You can specify all the values or you can default the Revision and Build Numbers | ||
62 | // by using the '*' as shown below: | ||
63 | |||
64 | [assembly : AssemblyVersion("0.6.5.*")] | ||
65 | [assembly : AssemblyFileVersion("0.6.5.0")] | ||
diff --git a/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs deleted file mode 100644 index 94e4ed2..0000000 --- a/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs +++ /dev/null | |||
@@ -1,54 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using OpenSim.Framework; | ||
29 | using OpenSim.Framework.Communications; | ||
30 | using OpenSim.Framework.Communications.Cache; | ||
31 | using OpenSim.Framework.Servers.HttpServer; | ||
32 | |||
33 | namespace OpenSim.Region.Communications.OGS1 | ||
34 | { | ||
35 | public class CommunicationsOGS1 : CommunicationsManager | ||
36 | { | ||
37 | public CommunicationsOGS1( | ||
38 | NetworkServersInfo serversInfo, | ||
39 | LibraryRootFolder libraryRootFolder) | ||
40 | : base(serversInfo, libraryRootFolder) | ||
41 | { | ||
42 | |||
43 | // This plugin arrangement could eventually be configurable rather than hardcoded here. | ||
44 | OGS1UserServices userServices = new OGS1UserServices(this); | ||
45 | userServices.AddPlugin(new TemporaryUserProfilePlugin()); | ||
46 | userServices.AddPlugin(new OGS1UserDataPlugin(this)); | ||
47 | |||
48 | m_userService = userServices; | ||
49 | m_messageService = userServices; | ||
50 | m_avatarService = (IAvatarService)m_userService; | ||
51 | } | ||
52 | |||
53 | } | ||
54 | } | ||
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs b/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs deleted file mode 100644 index cb1766a..0000000 --- a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs +++ /dev/null | |||
@@ -1,774 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text.RegularExpressions; | ||
34 | using System.Xml.Serialization; | ||
35 | using log4net; | ||
36 | using Nwc.XmlRpc; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Data; | ||
39 | using OpenSim.Framework; | ||
40 | using OpenSim.Framework.Communications; | ||
41 | using OpenSim.Framework.Communications.Clients; | ||
42 | |||
43 | namespace OpenSim.Region.Communications.OGS1 | ||
44 | { | ||
45 | public class OGS1UserDataPlugin : IUserDataPlugin | ||
46 | { | ||
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
48 | |||
49 | protected CommunicationsManager m_commsManager; | ||
50 | |||
51 | public OGS1UserDataPlugin() | ||
52 | { | ||
53 | } | ||
54 | |||
55 | public OGS1UserDataPlugin(CommunicationsManager commsManager) | ||
56 | { | ||
57 | m_log.DebugFormat("[OGS1 USER SERVICES]: {0} initialized", Name); | ||
58 | m_commsManager = commsManager; | ||
59 | } | ||
60 | |||
61 | public string Version { get { return "0.1"; } } | ||
62 | public string Name { get { return "Open Grid Services 1 (OGS1) User Data Plugin"; } } | ||
63 | public void Initialise() {} | ||
64 | |||
65 | public void Initialise(string connect) {} | ||
66 | |||
67 | public void Dispose() {} | ||
68 | |||
69 | // Arguably the presence of these means that IUserDataPlugin could be fissioned | ||
70 | public UserAgentData GetUserAgent(string name) { return null; } | ||
71 | public UserAgentData GetAgentByName(string name) { return null; } | ||
72 | public UserAgentData GetAgentByName(string fname, string lname) { return null; } | ||
73 | public void StoreWebLoginKey(UUID agentID, UUID webLoginKey) {} | ||
74 | public void AddNewUserProfile(UserProfileData user) {} | ||
75 | public void AddNewUserAgent(UserAgentData agent) {} | ||
76 | public bool MoneyTransferRequest(UUID from, UUID to, uint amount) { return false; } | ||
77 | public bool InventoryTransferRequest(UUID from, UUID to, UUID inventory) { return false; } | ||
78 | public void ResetAttachments(UUID userID) {} | ||
79 | public void LogoutUsers(UUID regionID) {} | ||
80 | |||
81 | public virtual void AddTemporaryUserProfile(UserProfileData userProfile) | ||
82 | { | ||
83 | // Not interested | ||
84 | } | ||
85 | |||
86 | public UserProfileData GetUserByUri(Uri uri) | ||
87 | { | ||
88 | WebRequest request = WebRequest.Create(uri); | ||
89 | |||
90 | WebResponse webResponse = request.GetResponse(); | ||
91 | |||
92 | XmlSerializer deserializer = new XmlSerializer(typeof(XmlRpcResponse)); | ||
93 | XmlRpcResponse xmlRpcResponse = (XmlRpcResponse)deserializer.Deserialize(webResponse.GetResponseStream()); | ||
94 | |||
95 | Hashtable respData = (Hashtable)xmlRpcResponse.Value; | ||
96 | |||
97 | return ConvertXMLRPCDataToUserProfile(respData); | ||
98 | } | ||
99 | |||
100 | // public Uri GetUserUri(UserProfileData userProfile) | ||
101 | // { | ||
102 | // throw new NotImplementedException(); | ||
103 | // } | ||
104 | |||
105 | public virtual UserAgentData GetAgentByUUID(UUID userId) | ||
106 | { | ||
107 | try | ||
108 | { | ||
109 | Hashtable param = new Hashtable(); | ||
110 | param["avatar_uuid"] = userId.ToString(); | ||
111 | IList parameters = new ArrayList(); | ||
112 | parameters.Add(param); | ||
113 | XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters); | ||
114 | |||
115 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 6000); | ||
116 | Hashtable respData = (Hashtable)resp.Value; | ||
117 | if (respData.Contains("error_type")) | ||
118 | { | ||
119 | //m_log.Warn("[GRID]: " + | ||
120 | // "Error sent by user server when trying to get agent: (" + | ||
121 | // (string) respData["error_type"] + | ||
122 | // "): " + (string)respData["error_desc"]); | ||
123 | return null; | ||
124 | } | ||
125 | UUID sessionid = UUID.Zero; | ||
126 | |||
127 | UserAgentData userAgent = new UserAgentData(); | ||
128 | userAgent.Handle = Convert.ToUInt64((string)respData["handle"]); | ||
129 | UUID.TryParse((string)respData["sessionid"], out sessionid); | ||
130 | userAgent.SessionID = sessionid; | ||
131 | |||
132 | if ((string)respData["agent_online"] == "TRUE") | ||
133 | { | ||
134 | userAgent.AgentOnline = true; | ||
135 | } | ||
136 | else | ||
137 | { | ||
138 | userAgent.AgentOnline = false; | ||
139 | } | ||
140 | |||
141 | return userAgent; | ||
142 | } | ||
143 | catch (Exception e) | ||
144 | { | ||
145 | m_log.ErrorFormat( | ||
146 | "[OGS1 USER SERVICES]: Error when trying to fetch agent data by uuid from remote user server: {0}", | ||
147 | e); | ||
148 | } | ||
149 | |||
150 | return null; | ||
151 | } | ||
152 | |||
153 | public virtual UserProfileData GetUserByName(string firstName, string lastName) | ||
154 | { | ||
155 | return GetUserProfile(firstName + " " + lastName); | ||
156 | } | ||
157 | |||
158 | public virtual List<AvatarPickerAvatar> GeneratePickerResults(UUID queryID, string query) | ||
159 | { | ||
160 | List<AvatarPickerAvatar> pickerlist = new List<AvatarPickerAvatar>(); | ||
161 | Regex objAlphaNumericPattern = new Regex("[^a-zA-Z0-9 ]"); | ||
162 | try | ||
163 | { | ||
164 | Hashtable param = new Hashtable(); | ||
165 | param["queryid"] = (string)queryID.ToString(); | ||
166 | param["avquery"] = objAlphaNumericPattern.Replace(query, String.Empty); | ||
167 | IList parameters = new ArrayList(); | ||
168 | parameters.Add(param); | ||
169 | XmlRpcRequest req = new XmlRpcRequest("get_avatar_picker_avatar", parameters); | ||
170 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 3000); | ||
171 | Hashtable respData = (Hashtable)resp.Value; | ||
172 | pickerlist = ConvertXMLRPCDataToAvatarPickerList(queryID, respData); | ||
173 | } | ||
174 | catch (WebException e) | ||
175 | { | ||
176 | m_log.Warn("[OGS1 USER SERVICES]: Error when trying to fetch Avatar Picker Response: " + | ||
177 | e.Message); | ||
178 | // Return Empty picker list (no results) | ||
179 | } | ||
180 | return pickerlist; | ||
181 | } | ||
182 | |||
183 | /// <summary> | ||
184 | /// Get a user profile from the user server | ||
185 | /// </summary> | ||
186 | /// <param name="avatarID"></param> | ||
187 | /// <returns>null if the request fails</returns> | ||
188 | protected virtual UserProfileData GetUserProfile(string name) | ||
189 | { | ||
190 | try | ||
191 | { | ||
192 | Hashtable param = new Hashtable(); | ||
193 | param["avatar_name"] = name; | ||
194 | IList parameters = new ArrayList(); | ||
195 | parameters.Add(param); | ||
196 | XmlRpcRequest req = new XmlRpcRequest("get_user_by_name", parameters); | ||
197 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000); | ||
198 | Hashtable respData = (Hashtable)resp.Value; | ||
199 | |||
200 | return ConvertXMLRPCDataToUserProfile(respData); | ||
201 | } | ||
202 | catch (WebException e) | ||
203 | { | ||
204 | m_log.ErrorFormat( | ||
205 | "[OGS1 USER SERVICES]: Error when trying to fetch profile data by name from remote user server: {0}", | ||
206 | e); | ||
207 | } | ||
208 | |||
209 | return null; | ||
210 | } | ||
211 | |||
212 | /// <summary> | ||
213 | /// Get a user profile from the user server | ||
214 | /// </summary> | ||
215 | /// <param name="avatarID"></param> | ||
216 | /// <returns>null if the request fails</returns> | ||
217 | public virtual UserProfileData GetUserByUUID(UUID avatarID) | ||
218 | { | ||
219 | try | ||
220 | { | ||
221 | Hashtable param = new Hashtable(); | ||
222 | param["avatar_uuid"] = avatarID.ToString(); | ||
223 | IList parameters = new ArrayList(); | ||
224 | parameters.Add(param); | ||
225 | XmlRpcRequest req = new XmlRpcRequest("get_user_by_uuid", parameters); | ||
226 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000); | ||
227 | Hashtable respData = (Hashtable)resp.Value; | ||
228 | |||
229 | return ConvertXMLRPCDataToUserProfile(respData); | ||
230 | } | ||
231 | catch (Exception e) | ||
232 | { | ||
233 | m_log.ErrorFormat( | ||
234 | "[OGS1 USER SERVICES]: Error when trying to fetch profile data by uuid from remote user server: {0}", | ||
235 | e); | ||
236 | } | ||
237 | |||
238 | return null; | ||
239 | } | ||
240 | |||
241 | public virtual bool UpdateUserProfile(UserProfileData userProfile) | ||
242 | { | ||
243 | m_log.Debug("[OGS1 USER SERVICES]: Asking UserServer to update profile."); | ||
244 | |||
245 | Hashtable param = new Hashtable(); | ||
246 | param["avatar_uuid"] = userProfile.ID.ToString(); | ||
247 | //param["AllowPublish"] = userProfile.ToString(); | ||
248 | param["FLImageID"] = userProfile.FirstLifeImage.ToString(); | ||
249 | param["ImageID"] = userProfile.Image.ToString(); | ||
250 | //param["MaturePublish"] = MaturePublish.ToString(); | ||
251 | param["AboutText"] = userProfile.AboutText; | ||
252 | param["FLAboutText"] = userProfile.FirstLifeAboutText; | ||
253 | //param["ProfileURL"] = userProfile.ProfileURL.ToString(); | ||
254 | |||
255 | param["home_region"] = userProfile.HomeRegion.ToString(); | ||
256 | param["home_region_id"] = userProfile.HomeRegionID.ToString(); | ||
257 | |||
258 | param["home_pos_x"] = userProfile.HomeLocationX.ToString(); | ||
259 | param["home_pos_y"] = userProfile.HomeLocationY.ToString(); | ||
260 | param["home_pos_z"] = userProfile.HomeLocationZ.ToString(); | ||
261 | param["home_look_x"] = userProfile.HomeLookAtX.ToString(); | ||
262 | param["home_look_y"] = userProfile.HomeLookAtY.ToString(); | ||
263 | param["home_look_z"] = userProfile.HomeLookAtZ.ToString(); | ||
264 | param["user_flags"] = userProfile.UserFlags.ToString(); | ||
265 | param["god_level"] = userProfile.GodLevel.ToString(); | ||
266 | param["custom_type"] = userProfile.CustomType.ToString(); | ||
267 | param["partner"] = userProfile.Partner.ToString(); | ||
268 | |||
269 | IList parameters = new ArrayList(); | ||
270 | parameters.Add(param); | ||
271 | |||
272 | XmlRpcRequest req = new XmlRpcRequest("update_user_profile", parameters); | ||
273 | XmlRpcResponse resp = req.Send(GetUserServerURL(userProfile.ID), 3000); | ||
274 | Hashtable respData = (Hashtable)resp.Value; | ||
275 | if (respData != null) | ||
276 | { | ||
277 | if (respData.Contains("returnString")) | ||
278 | { | ||
279 | if (((string)respData["returnString"]).ToUpper() != "TRUE") | ||
280 | { | ||
281 | m_log.Warn("[GRID]: Unable to update user profile, User Server Reported an issue"); | ||
282 | return false; | ||
283 | } | ||
284 | } | ||
285 | else | ||
286 | { | ||
287 | m_log.Warn("[GRID]: Unable to update user profile, UserServer didn't understand me!"); | ||
288 | return false; | ||
289 | } | ||
290 | } | ||
291 | else | ||
292 | { | ||
293 | m_log.Warn("[GRID]: Unable to update user profile, UserServer didn't understand me!"); | ||
294 | return false; | ||
295 | } | ||
296 | |||
297 | return true; | ||
298 | } | ||
299 | |||
300 | /// <summary> | ||
301 | /// Adds a new friend to the database for XUser | ||
302 | /// </summary> | ||
303 | /// <param name="friendlistowner">The agent that who's friends list is being added to</param> | ||
304 | /// <param name="friend">The agent that being added to the friends list of the friends list owner</param> | ||
305 | /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param> | ||
306 | public virtual void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) | ||
307 | { | ||
308 | try | ||
309 | { | ||
310 | Hashtable param = new Hashtable(); | ||
311 | param["ownerID"] = friendlistowner.Guid.ToString(); | ||
312 | param["friendID"] = friend.Guid.ToString(); | ||
313 | param["friendPerms"] = perms.ToString(); | ||
314 | IList parameters = new ArrayList(); | ||
315 | parameters.Add(param); | ||
316 | |||
317 | XmlRpcRequest req = new XmlRpcRequest("add_new_user_friend", parameters); | ||
318 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 3000); | ||
319 | Hashtable respData = (Hashtable)resp.Value; | ||
320 | if (respData != null) | ||
321 | { | ||
322 | if (respData.Contains("returnString")) | ||
323 | { | ||
324 | if ((string)respData["returnString"] == "TRUE") | ||
325 | { | ||
326 | |||
327 | } | ||
328 | else | ||
329 | { | ||
330 | m_log.Warn("[GRID]: Unable to add new friend, User Server Reported an issue"); | ||
331 | } | ||
332 | } | ||
333 | else | ||
334 | { | ||
335 | m_log.Warn("[GRID]: Unable to add new friend, UserServer didn't understand me!"); | ||
336 | } | ||
337 | } | ||
338 | else | ||
339 | { | ||
340 | m_log.Warn("[GRID]: Unable to add new friend, UserServer didn't understand me!"); | ||
341 | |||
342 | } | ||
343 | } | ||
344 | catch (WebException e) | ||
345 | { | ||
346 | m_log.Warn("[GRID]: Error when trying to AddNewUserFriend: " + | ||
347 | e.Message); | ||
348 | |||
349 | } | ||
350 | } | ||
351 | |||
352 | /// <summary> | ||
353 | /// Delete friend on friendlistowner's friendlist. | ||
354 | /// </summary> | ||
355 | /// <param name="friendlistowner">The agent that who's friends list is being updated</param> | ||
356 | /// <param name="friend">The Ex-friend agent</param> | ||
357 | public virtual void RemoveUserFriend(UUID friendlistowner, UUID friend) | ||
358 | { | ||
359 | try | ||
360 | { | ||
361 | Hashtable param = new Hashtable(); | ||
362 | param["ownerID"] = friendlistowner.Guid.ToString(); | ||
363 | param["friendID"] = friend.Guid.ToString(); | ||
364 | |||
365 | IList parameters = new ArrayList(); | ||
366 | parameters.Add(param); | ||
367 | |||
368 | XmlRpcRequest req = new XmlRpcRequest("remove_user_friend", parameters); | ||
369 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 3000); | ||
370 | Hashtable respData = (Hashtable)resp.Value; | ||
371 | if (respData != null) | ||
372 | { | ||
373 | if (respData.Contains("returnString")) | ||
374 | { | ||
375 | if ((string)respData["returnString"] == "TRUE") | ||
376 | { | ||
377 | |||
378 | } | ||
379 | else | ||
380 | { | ||
381 | m_log.Warn("[GRID]: Unable to remove friend, User Server Reported an issue"); | ||
382 | } | ||
383 | } | ||
384 | else | ||
385 | { | ||
386 | m_log.Warn("[GRID]: Unable to remove friend, UserServer didn't understand me!"); | ||
387 | } | ||
388 | } | ||
389 | else | ||
390 | { | ||
391 | m_log.Warn("[GRID]: Unable to remove friend, UserServer didn't understand me!"); | ||
392 | |||
393 | } | ||
394 | } | ||
395 | catch (WebException e) | ||
396 | { | ||
397 | m_log.Warn("[GRID]: Error when trying to RemoveUserFriend: " + | ||
398 | e.Message); | ||
399 | |||
400 | } | ||
401 | } | ||
402 | |||
403 | /// <summary> | ||
404 | /// Update permissions for friend on friendlistowner's friendlist. | ||
405 | /// </summary> | ||
406 | /// <param name="friendlistowner">The agent that who's friends list is being updated</param> | ||
407 | /// <param name="friend">The agent that is getting or loosing permissions</param> | ||
408 | /// <param name="perms">A uint bit vector for set perms that the friend being added has; 0 = none, 1=This friend can see when they sign on, 2 = map, 4 edit objects </param> | ||
409 | public virtual void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) | ||
410 | { | ||
411 | try | ||
412 | { | ||
413 | Hashtable param = new Hashtable(); | ||
414 | param["ownerID"] = friendlistowner.Guid.ToString(); | ||
415 | param["friendID"] = friend.Guid.ToString(); | ||
416 | param["friendPerms"] = perms.ToString(); | ||
417 | IList parameters = new ArrayList(); | ||
418 | parameters.Add(param); | ||
419 | |||
420 | XmlRpcRequest req = new XmlRpcRequest("update_user_friend_perms", parameters); | ||
421 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 3000); | ||
422 | Hashtable respData = (Hashtable)resp.Value; | ||
423 | if (respData != null) | ||
424 | { | ||
425 | if (respData.Contains("returnString")) | ||
426 | { | ||
427 | if ((string)respData["returnString"] == "TRUE") | ||
428 | { | ||
429 | |||
430 | } | ||
431 | else | ||
432 | { | ||
433 | m_log.Warn("[GRID]: Unable to update_user_friend_perms, User Server Reported an issue"); | ||
434 | } | ||
435 | } | ||
436 | else | ||
437 | { | ||
438 | m_log.Warn("[GRID]: Unable to update_user_friend_perms, UserServer didn't understand me!"); | ||
439 | } | ||
440 | } | ||
441 | else | ||
442 | { | ||
443 | m_log.Warn("[GRID]: Unable to update_user_friend_perms, UserServer didn't understand me!"); | ||
444 | |||
445 | } | ||
446 | } | ||
447 | catch (WebException e) | ||
448 | { | ||
449 | m_log.Warn("[GRID]: Error when trying to update_user_friend_perms: " + | ||
450 | e.Message); | ||
451 | } | ||
452 | } | ||
453 | /// <summary> | ||
454 | /// Returns a list of FriendsListItems that describe the friends and permissions in the friend relationship for UUID friendslistowner | ||
455 | /// </summary> | ||
456 | /// <param name="friendlistowner">The agent that we're retreiving the friends Data.</param> | ||
457 | public virtual List<FriendListItem> GetUserFriendList(UUID friendlistowner) | ||
458 | { | ||
459 | List<FriendListItem> buddylist = new List<FriendListItem>(); | ||
460 | |||
461 | try | ||
462 | { | ||
463 | Hashtable param = new Hashtable(); | ||
464 | param["ownerID"] = friendlistowner.Guid.ToString(); | ||
465 | |||
466 | IList parameters = new ArrayList(); | ||
467 | parameters.Add(param); | ||
468 | XmlRpcRequest req = new XmlRpcRequest("get_user_friend_list", parameters); | ||
469 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 8000); | ||
470 | Hashtable respData = (Hashtable)resp.Value; | ||
471 | |||
472 | if (respData != null && respData.Contains("avcount")) | ||
473 | { | ||
474 | buddylist = ConvertXMLRPCDataToFriendListItemList(respData); | ||
475 | } | ||
476 | |||
477 | } | ||
478 | catch (WebException e) | ||
479 | { | ||
480 | m_log.Warn("[OGS1 USER SERVICES]: Error when trying to fetch Avatar's friends list: " + | ||
481 | e.Message); | ||
482 | // Return Empty list (no friends) | ||
483 | } | ||
484 | return buddylist; | ||
485 | } | ||
486 | |||
487 | public virtual Dictionary<UUID, FriendRegionInfo> GetFriendRegionInfos(List<UUID> uuids) | ||
488 | { | ||
489 | Dictionary<UUID, FriendRegionInfo> result = new Dictionary<UUID, FriendRegionInfo>(); | ||
490 | |||
491 | // ask MessageServer about the current on-/offline status and regions the friends are in | ||
492 | ArrayList parameters = new ArrayList(); | ||
493 | Hashtable map = new Hashtable(); | ||
494 | |||
495 | ArrayList list = new ArrayList(); | ||
496 | foreach (UUID uuid in uuids) | ||
497 | { | ||
498 | list.Add(uuid.ToString()); | ||
499 | list.Add(uuid.ToString()); | ||
500 | } | ||
501 | map["uuids"] = list; | ||
502 | |||
503 | map["recv_key"] = m_commsManager.NetworkServersInfo.UserRecvKey; | ||
504 | map["send_key"] = m_commsManager.NetworkServersInfo.UserSendKey; | ||
505 | |||
506 | parameters.Add(map); | ||
507 | |||
508 | try | ||
509 | { | ||
510 | XmlRpcRequest req = new XmlRpcRequest("get_presence_info_bulk", parameters); | ||
511 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.MessagingURL, 8000); | ||
512 | Hashtable respData = resp != null ? (Hashtable)resp.Value : null; | ||
513 | |||
514 | if (respData == null || respData.ContainsKey("faultMessage")) | ||
515 | { | ||
516 | m_log.WarnFormat("[OGS1 USER SERVICES]: Contacting MessagingServer about user-regions resulted in error: {0}", | ||
517 | respData == null ? "<unknown error>" : respData["faultMessage"]); | ||
518 | } | ||
519 | else if (!respData.ContainsKey("count")) | ||
520 | { | ||
521 | m_log.WarnFormat("[OGS1 USER SERVICES]: Wrong format in response for MessagingServer request get_presence_info_bulk: missing 'count' field"); | ||
522 | } | ||
523 | else | ||
524 | { | ||
525 | int count = (int)respData["count"]; | ||
526 | m_log.DebugFormat("[OGS1 USER SERVICES]: Request returned {0} results.", count); | ||
527 | for (int i = 0; i < count; ++i) | ||
528 | { | ||
529 | if (respData.ContainsKey("uuid_" + i) && respData.ContainsKey("isOnline_" + i) && respData.ContainsKey("regionHandle_" + i)) | ||
530 | { | ||
531 | UUID uuid; | ||
532 | if (UUID.TryParse((string)respData["uuid_" + i], out uuid)) | ||
533 | { | ||
534 | FriendRegionInfo info = new FriendRegionInfo(); | ||
535 | info.isOnline = (bool)respData["isOnline_" + i]; | ||
536 | if (info.isOnline) | ||
537 | { | ||
538 | // TODO remove this after the next protocol update (say, r7800?) | ||
539 | info.regionHandle = Convert.ToUInt64(respData["regionHandle_" + i]); | ||
540 | |||
541 | // accept missing id | ||
542 | if (respData.ContainsKey("regionID_" + i)) | ||
543 | UUID.TryParse((string)respData["regionID_" + i], out info.regionID); | ||
544 | } | ||
545 | |||
546 | result.Add(uuid, info); | ||
547 | } | ||
548 | } | ||
549 | else | ||
550 | { | ||
551 | m_log.WarnFormat("[OGS1 USER SERVICES]: Response to get_presence_info_bulk contained an error in entry {0}", i); | ||
552 | } | ||
553 | } | ||
554 | } | ||
555 | } | ||
556 | catch (WebException e) | ||
557 | { | ||
558 | m_log.ErrorFormat("[OGS1 USER SERVICES]: Network problems when trying to fetch friend infos: {0}", e.Message); | ||
559 | } | ||
560 | |||
561 | m_log.DebugFormat("[OGS1 USER SERVICES]: Returning {0} entries", result.Count); | ||
562 | |||
563 | return result; | ||
564 | } | ||
565 | |||
566 | public virtual AvatarAppearance GetUserAppearance(UUID user) | ||
567 | { | ||
568 | AvatarAppearance appearance = null; | ||
569 | |||
570 | try | ||
571 | { | ||
572 | Hashtable param = new Hashtable(); | ||
573 | param["owner"] = user.ToString(); | ||
574 | |||
575 | IList parameters = new ArrayList(); | ||
576 | parameters.Add(param); | ||
577 | XmlRpcRequest req = new XmlRpcRequest("get_avatar_appearance", parameters); | ||
578 | XmlRpcResponse resp = req.Send(GetUserServerURL(user), 8000); | ||
579 | Hashtable respData = (Hashtable)resp.Value; | ||
580 | |||
581 | return ConvertXMLRPCDataToAvatarAppearance(respData); | ||
582 | } | ||
583 | catch (WebException e) | ||
584 | { | ||
585 | m_log.ErrorFormat("[OGS1 USER SERVICES]: Network problems when trying to fetch appearance for avatar {0}, {1}", user, e.Message); | ||
586 | } | ||
587 | |||
588 | return appearance; | ||
589 | } | ||
590 | |||
591 | public virtual void UpdateUserAppearance(UUID user, AvatarAppearance appearance) | ||
592 | { | ||
593 | try | ||
594 | { | ||
595 | Hashtable param = appearance.ToHashTable(); | ||
596 | param["owner"] = user.ToString(); | ||
597 | |||
598 | IList parameters = new ArrayList(); | ||
599 | parameters.Add(param); | ||
600 | XmlRpcRequest req = new XmlRpcRequest("update_avatar_appearance", parameters); | ||
601 | XmlRpcResponse resp = req.Send(GetUserServerURL(user), 8000); | ||
602 | Hashtable respData = (Hashtable)resp.Value; | ||
603 | |||
604 | if (respData != null) | ||
605 | { | ||
606 | if (respData.Contains("returnString")) | ||
607 | { | ||
608 | if ((string)respData["returnString"] == "TRUE") | ||
609 | { | ||
610 | m_log.DebugFormat("[OGS1 USER SERVICES]: Updated user appearance in {0}", GetUserServerURL(user)); | ||
611 | } | ||
612 | else | ||
613 | { | ||
614 | m_log.Warn("[GRID]: Unable to update_user_appearance, User Server Reported an issue"); | ||
615 | } | ||
616 | } | ||
617 | else | ||
618 | { | ||
619 | m_log.Warn("[GRID]: Unable to update_user_appearance, UserServer didn't understand me!"); | ||
620 | } | ||
621 | } | ||
622 | else | ||
623 | { | ||
624 | m_log.Warn("[GRID]: Unable to update_user_appearance, UserServer didn't understand me!"); | ||
625 | } | ||
626 | } | ||
627 | catch (WebException e) | ||
628 | { | ||
629 | m_log.WarnFormat("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance in {0}: {1}", | ||
630 | GetUserServerURL(user), e.Message); | ||
631 | // Return Empty list (no friends) | ||
632 | } | ||
633 | } | ||
634 | |||
635 | protected virtual string GetUserServerURL(UUID userID) | ||
636 | { | ||
637 | return m_commsManager.NetworkServersInfo.UserURL; | ||
638 | } | ||
639 | |||
640 | protected UserProfileData ConvertXMLRPCDataToUserProfile(Hashtable data) | ||
641 | { | ||
642 | if (data.Contains("error_type")) | ||
643 | { | ||
644 | //m_log.Warn("[GRID]: " + | ||
645 | // "Error sent by user server when trying to get user profile: (" + | ||
646 | // data["error_type"] + | ||
647 | // "): " + data["error_desc"]); | ||
648 | return null; | ||
649 | } | ||
650 | |||
651 | UserProfileData userData = new UserProfileData(); | ||
652 | userData.FirstName = (string)data["firstname"]; | ||
653 | userData.SurName = (string)data["lastname"]; | ||
654 | if (data["email"] != null) | ||
655 | userData.Email = (string)data["email"]; | ||
656 | userData.ID = new UUID((string)data["uuid"]); | ||
657 | userData.Created = Convert.ToInt32(data["profile_created"]); | ||
658 | if (data.Contains("server_inventory") && data["server_inventory"] != null) | ||
659 | userData.UserInventoryURI = (string)data["server_inventory"]; | ||
660 | if (data.Contains("server_asset") && data["server_asset"] != null) | ||
661 | userData.UserAssetURI = (string)data["server_asset"]; | ||
662 | if (data.Contains("profile_firstlife_about") && data["profile_firstlife_about"] != null) | ||
663 | userData.FirstLifeAboutText = (string)data["profile_firstlife_about"]; | ||
664 | userData.FirstLifeImage = new UUID((string)data["profile_firstlife_image"]); | ||
665 | userData.CanDoMask = Convert.ToUInt32((string)data["profile_can_do"]); | ||
666 | userData.WantDoMask = Convert.ToUInt32(data["profile_want_do"]); | ||
667 | userData.AboutText = (string)data["profile_about"]; | ||
668 | userData.Image = new UUID((string)data["profile_image"]); | ||
669 | userData.LastLogin = Convert.ToInt32((string)data["profile_lastlogin"]); | ||
670 | userData.HomeRegion = Convert.ToUInt64((string)data["home_region"]); | ||
671 | if (data.Contains("home_region_id")) | ||
672 | userData.HomeRegionID = new UUID((string)data["home_region_id"]); | ||
673 | else | ||
674 | userData.HomeRegionID = UUID.Zero; | ||
675 | userData.HomeLocation = | ||
676 | new Vector3((float)Convert.ToDecimal((string)data["home_coordinates_x"], Culture.NumberFormatInfo), | ||
677 | (float)Convert.ToDecimal((string)data["home_coordinates_y"], Culture.NumberFormatInfo), | ||
678 | (float)Convert.ToDecimal((string)data["home_coordinates_z"], Culture.NumberFormatInfo)); | ||
679 | userData.HomeLookAt = | ||
680 | new Vector3((float)Convert.ToDecimal((string)data["home_look_x"], Culture.NumberFormatInfo), | ||
681 | (float)Convert.ToDecimal((string)data["home_look_y"], Culture.NumberFormatInfo), | ||
682 | (float)Convert.ToDecimal((string)data["home_look_z"], Culture.NumberFormatInfo)); | ||
683 | if (data.Contains("user_flags")) | ||
684 | userData.UserFlags = Convert.ToInt32((string)data["user_flags"]); | ||
685 | if (data.Contains("god_level")) | ||
686 | userData.GodLevel = Convert.ToInt32((string)data["god_level"]); | ||
687 | |||
688 | if (data.Contains("custom_type")) | ||
689 | userData.CustomType = (string)data["custom_type"]; | ||
690 | else | ||
691 | userData.CustomType = ""; | ||
692 | if (userData.CustomType == null) | ||
693 | userData.CustomType = ""; | ||
694 | |||
695 | if (data.Contains("partner")) | ||
696 | userData.Partner = new UUID((string)data["partner"]); | ||
697 | else | ||
698 | userData.Partner = UUID.Zero; | ||
699 | |||
700 | return userData; | ||
701 | } | ||
702 | |||
703 | protected AvatarAppearance ConvertXMLRPCDataToAvatarAppearance(Hashtable data) | ||
704 | { | ||
705 | if (data != null) | ||
706 | { | ||
707 | if (data.Contains("error_type")) | ||
708 | { | ||
709 | m_log.Warn("[GRID]: " + | ||
710 | "Error sent by user server when trying to get user appearance: (" + | ||
711 | data["error_type"] + | ||
712 | "): " + data["error_desc"]); | ||
713 | return null; | ||
714 | } | ||
715 | else | ||
716 | { | ||
717 | return new AvatarAppearance(data); | ||
718 | } | ||
719 | } | ||
720 | else | ||
721 | { | ||
722 | m_log.Error("[GRID]: The avatar appearance is null, something bad happenend"); | ||
723 | return null; | ||
724 | } | ||
725 | } | ||
726 | |||
727 | protected List<AvatarPickerAvatar> ConvertXMLRPCDataToAvatarPickerList(UUID queryID, Hashtable data) | ||
728 | { | ||
729 | List<AvatarPickerAvatar> pickerlist = new List<AvatarPickerAvatar>(); | ||
730 | int pickercount = Convert.ToInt32((string)data["avcount"]); | ||
731 | UUID respqueryID = new UUID((string)data["queryid"]); | ||
732 | if (queryID == respqueryID) | ||
733 | { | ||
734 | for (int i = 0; i < pickercount; i++) | ||
735 | { | ||
736 | AvatarPickerAvatar apicker = new AvatarPickerAvatar(); | ||
737 | UUID avatarID = new UUID((string)data["avatarid" + i.ToString()]); | ||
738 | string firstname = (string)data["firstname" + i.ToString()]; | ||
739 | string lastname = (string)data["lastname" + i.ToString()]; | ||
740 | apicker.AvatarID = avatarID; | ||
741 | apicker.firstName = firstname; | ||
742 | apicker.lastName = lastname; | ||
743 | pickerlist.Add(apicker); | ||
744 | } | ||
745 | } | ||
746 | else | ||
747 | { | ||
748 | m_log.Warn("[OGS1 USER SERVICES]: Got invalid queryID from userServer"); | ||
749 | } | ||
750 | return pickerlist; | ||
751 | } | ||
752 | |||
753 | protected List<FriendListItem> ConvertXMLRPCDataToFriendListItemList(Hashtable data) | ||
754 | { | ||
755 | List<FriendListItem> buddylist = new List<FriendListItem>(); | ||
756 | int buddycount = Convert.ToInt32((string)data["avcount"]); | ||
757 | |||
758 | |||
759 | for (int i = 0; i < buddycount; i++) | ||
760 | { | ||
761 | FriendListItem buddylistitem = new FriendListItem(); | ||
762 | |||
763 | buddylistitem.FriendListOwner = new UUID((string)data["ownerID" + i.ToString()]); | ||
764 | buddylistitem.Friend = new UUID((string)data["friendID" + i.ToString()]); | ||
765 | buddylistitem.FriendListOwnerPerms = (uint)Convert.ToInt32((string)data["ownerPerms" + i.ToString()]); | ||
766 | buddylistitem.FriendPerms = (uint)Convert.ToInt32((string)data["friendPerms" + i.ToString()]); | ||
767 | |||
768 | buddylist.Add(buddylistitem); | ||
769 | } | ||
770 | |||
771 | return buddylist; | ||
772 | } | ||
773 | } | ||
774 | } | ||
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs deleted file mode 100644 index ed3526d..0000000 --- a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs +++ /dev/null | |||
@@ -1,176 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text.RegularExpressions; | ||
34 | using System.Xml.Serialization; | ||
35 | using log4net; | ||
36 | using Nwc.XmlRpc; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Data; | ||
39 | using OpenSim.Framework; | ||
40 | using OpenSim.Framework.Communications; | ||
41 | using OpenSim.Framework.Communications.Clients; | ||
42 | |||
43 | namespace OpenSim.Region.Communications.OGS1 | ||
44 | { | ||
45 | public class OGS1UserServices : UserManagerBase | ||
46 | { | ||
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
48 | |||
49 | public OGS1UserServices(CommunicationsManager commsManager) | ||
50 | : base(commsManager) | ||
51 | { | ||
52 | } | ||
53 | |||
54 | public override void ClearUserAgent(UUID avatarID) | ||
55 | { | ||
56 | // TODO: implement | ||
57 | // It may be possible to use the UserManagerBase implementation. | ||
58 | } | ||
59 | |||
60 | protected virtual string GetUserServerURL(UUID userID) | ||
61 | { | ||
62 | return m_commsManager.NetworkServersInfo.UserURL; | ||
63 | } | ||
64 | |||
65 | /// <summary> | ||
66 | /// Logs off a user on the user server | ||
67 | /// </summary> | ||
68 | /// <param name="UserID">UUID of the user</param> | ||
69 | /// <param name="regionID">UUID of the Region</param> | ||
70 | /// <param name="regionhandle">regionhandle</param> | ||
71 | /// <param name="position">final position</param> | ||
72 | /// <param name="lookat">final lookat</param> | ||
73 | public override void LogOffUser(UUID userid, UUID regionid, ulong regionhandle, Vector3 position, Vector3 lookat) | ||
74 | { | ||
75 | Hashtable param = new Hashtable(); | ||
76 | param["avatar_uuid"] = userid.Guid.ToString(); | ||
77 | param["region_uuid"] = regionid.Guid.ToString(); | ||
78 | param["region_handle"] = regionhandle.ToString(); | ||
79 | param["region_pos_x"] = position.X.ToString(); | ||
80 | param["region_pos_y"] = position.Y.ToString(); | ||
81 | param["region_pos_z"] = position.Z.ToString(); | ||
82 | param["lookat_x"] = lookat.X.ToString(); | ||
83 | param["lookat_y"] = lookat.Y.ToString(); | ||
84 | param["lookat_z"] = lookat.Z.ToString(); | ||
85 | |||
86 | IList parameters = new ArrayList(); | ||
87 | parameters.Add(param); | ||
88 | XmlRpcRequest req = new XmlRpcRequest("logout_of_simulator", parameters); | ||
89 | |||
90 | try | ||
91 | { | ||
92 | req.Send(GetUserServerURL(userid), 3000); | ||
93 | } | ||
94 | catch (WebException) | ||
95 | { | ||
96 | m_log.Warn("[LOGOFF]: Unable to notify grid server of user logoff"); | ||
97 | } | ||
98 | } | ||
99 | |||
100 | /// <summary> | ||
101 | /// Retrieve the user information for the given master uuid. | ||
102 | /// </summary> | ||
103 | /// <param name="uuid"></param> | ||
104 | /// <returns></returns> | ||
105 | public override UserProfileData SetupMasterUser(string firstName, string lastName) | ||
106 | { | ||
107 | return SetupMasterUser(firstName, lastName, String.Empty); | ||
108 | } | ||
109 | |||
110 | /// <summary> | ||
111 | /// Retrieve the user information for the given master uuid. | ||
112 | /// </summary> | ||
113 | /// <param name="uuid"></param> | ||
114 | /// <returns></returns> | ||
115 | public override UserProfileData SetupMasterUser(string firstName, string lastName, string password) | ||
116 | { | ||
117 | UserProfileData profile = GetUserProfile(firstName, lastName); | ||
118 | return profile; | ||
119 | } | ||
120 | |||
121 | /// <summary> | ||
122 | /// Retrieve the user information for the given master uuid. | ||
123 | /// </summary> | ||
124 | /// <param name="uuid"></param> | ||
125 | /// <returns></returns> | ||
126 | public override UserProfileData SetupMasterUser(UUID uuid) | ||
127 | { | ||
128 | UserProfileData data = GetUserProfile(uuid); | ||
129 | |||
130 | if (data == null) | ||
131 | { | ||
132 | throw new Exception( | ||
133 | "Could not retrieve profile for master user " + uuid + ". User server did not respond to the request."); | ||
134 | } | ||
135 | |||
136 | return data; | ||
137 | } | ||
138 | |||
139 | public override bool VerifySession(UUID userID, UUID sessionID) | ||
140 | { | ||
141 | m_log.DebugFormat("[OGS1 USER SERVICES]: Verifying user session for " + userID); | ||
142 | return AuthClient.VerifySession(GetUserServerURL(userID), userID, sessionID); | ||
143 | } | ||
144 | |||
145 | public override bool AuthenticateUserByPassword(UUID userID, string password) | ||
146 | { | ||
147 | Hashtable param = new Hashtable(); | ||
148 | param["user_uuid"] = userID.ToString(); | ||
149 | param["password"] = password; | ||
150 | IList parameters = new ArrayList(); | ||
151 | parameters.Add(param); | ||
152 | XmlRpcRequest req = new XmlRpcRequest("authenticate_user_by_password", parameters); | ||
153 | XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 30000); | ||
154 | |||
155 | // Temporary measure to deal with older services | ||
156 | if (resp.IsFault && resp.FaultCode == XmlRpcErrorCodes.SERVER_ERROR_METHOD) | ||
157 | { | ||
158 | throw new Exception( | ||
159 | String.Format( | ||
160 | "XMLRPC method 'authenticate_user_by_password' not yet implemented by user service at {0}", | ||
161 | m_commsManager.NetworkServersInfo.UserURL)); | ||
162 | } | ||
163 | |||
164 | Hashtable respData = (Hashtable)resp.Value; | ||
165 | |||
166 | if ((string)respData["auth_user"] == "TRUE") | ||
167 | { | ||
168 | return true; | ||
169 | } | ||
170 | else | ||
171 | { | ||
172 | return false; | ||
173 | } | ||
174 | } | ||
175 | } | ||
176 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs deleted file mode 100644 index 2b54f2e..0000000 --- a/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Reflection; | ||
29 | using System.Runtime.InteropServices; | ||
30 | |||
31 | // General information about an assembly is controlled through the following | ||
32 | // set of attributes. Change these attribute values to modify the information | ||
33 | // associated with an assembly. | ||
34 | |||
35 | [assembly : AssemblyTitle("OpenGrid.Framework.Communications.OGS1")] | ||
36 | [assembly : AssemblyDescription("")] | ||
37 | [assembly : AssemblyConfiguration("")] | ||
38 | [assembly : AssemblyCompany("http://opensimulator.org")] | ||
39 | [assembly : AssemblyProduct("OpenGrid.Framework.Communications.OGS1")] | ||
40 | [assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] | ||
41 | [assembly : AssemblyTrademark("")] | ||
42 | [assembly : AssemblyCulture("")] | ||
43 | |||
44 | // Setting ComVisible to false makes the types in this assembly not visible | ||
45 | // to COM components. If you need to access a type in this assembly from | ||
46 | // COM, set the ComVisible attribute to true on that type. | ||
47 | |||
48 | [assembly : ComVisible(false)] | ||
49 | |||
50 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
51 | |||
52 | [assembly : Guid("a8b2b39b-c83b-41e2-b0b5-7ccfc1fddae7")] | ||
53 | |||
54 | // Version information for an assembly consists of the following four values: | ||
55 | // | ||
56 | // Major Version | ||
57 | // Minor Version | ||
58 | // Build Number | ||
59 | // Revision | ||
60 | // | ||
61 | // You can specify all the values or you can default the Revision and Build Numbers | ||
62 | // by using the '*' as shown below: | ||
63 | |||
64 | [assembly : AssemblyVersion("0.6.5.*")] | ||
65 | [assembly : AssemblyFileVersion("0.6.5.0")] | ||
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index c9ee54f..012d581 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs | |||
@@ -30,7 +30,7 @@ using System.Reflection; | |||
30 | using log4net; | 30 | using log4net; |
31 | using OpenMetaverse; | 31 | using OpenMetaverse; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Framework.Communications.Cache; | 33 | |
34 | using OpenSim.Region.Framework.Scenes; | 34 | using OpenSim.Region.Framework.Scenes; |
35 | using OpenSim.Services.Interfaces; | 35 | using OpenSim.Services.Interfaces; |
36 | 36 | ||
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs index fa92fe8..c791cb4 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs | |||
@@ -31,7 +31,7 @@ using System.Reflection; | |||
31 | using log4net; | 31 | using log4net; |
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications.Cache; | 34 | |
35 | using OpenSim.Services.Interfaces; | 35 | using OpenSim.Services.Interfaces; |
36 | 36 | ||
37 | namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | 37 | namespace OpenSim.Region.CoreModules.Agent.AssetTransaction |
@@ -112,7 +112,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction | |||
112 | bool storeLocal, bool tempFile) | 112 | bool storeLocal, bool tempFile) |
113 | { | 113 | { |
114 | ourClient = remoteClient; | 114 | ourClient = remoteClient; |
115 | m_asset = new AssetBase(assetID, "blank", type); | 115 | m_asset = new AssetBase(assetID, "blank", type, remoteClient.AgentId.ToString()); |
116 | m_asset.Data = data; | 116 | m_asset.Data = data; |
117 | m_asset.Description = "empty"; | 117 | m_asset.Description = "empty"; |
118 | m_asset.Local = storeLocal; | 118 | m_asset.Local = storeLocal; |
diff --git a/OpenSim/Region/CoreModules/Agent/TextureDownload/TextureDownloadModule.cs b/OpenSim/Region/CoreModules/Agent/TextureDownload/TextureDownloadModule.cs index 71ff28c..c7bf6c8 100644 --- a/OpenSim/Region/CoreModules/Agent/TextureDownload/TextureDownloadModule.cs +++ b/OpenSim/Region/CoreModules/Agent/TextureDownload/TextureDownloadModule.cs | |||
@@ -33,7 +33,7 @@ using log4net; | |||
33 | using Nini.Config; | 33 | using Nini.Config; |
34 | using OpenMetaverse; | 34 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using OpenSim.Framework.Communications.Cache; | 36 | |
37 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
39 | using BlockingQueue = OpenSim.Framework.BlockingQueue<OpenSim.Region.Framework.Interfaces.ITextureSender>; | 39 | using BlockingQueue = OpenSim.Framework.BlockingQueue<OpenSim.Region.Framework.Interfaces.ITextureSender>; |
@@ -214,8 +214,8 @@ namespace OpenSim.Region.CoreModules.Agent.TextureDownload | |||
214 | { | 214 | { |
215 | Scene scene = (Scene)client.Scene; | 215 | Scene scene = (Scene)client.Scene; |
216 | 216 | ||
217 | CachedUserInfo profile = scene.CommsManager.UserProfileCacheService.GetUserDetails(client.AgentId); | 217 | ScenePresence sp = scene.GetScenePresence(client.AgentId); |
218 | if (profile == null) // Deny unknown user | 218 | if (sp == null) // Deny unknown user |
219 | return; | 219 | return; |
220 | 220 | ||
221 | IInventoryService invService = scene.InventoryService; | 221 | IInventoryService invService = scene.InventoryService; |
diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs index 7ac8bed..50c83b5 100644 --- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs +++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs | |||
@@ -240,7 +240,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender | |||
240 | { | 240 | { |
241 | string assetID = "j2kCache_" + AssetId.ToString(); | 241 | string assetID = "j2kCache_" + AssetId.ToString(); |
242 | 242 | ||
243 | AssetBase layerDecodeAsset = new AssetBase(assetID, assetID, (sbyte)AssetType.Notecard); | 243 | AssetBase layerDecodeAsset = new AssetBase(assetID, assetID, (sbyte)AssetType.Notecard, m_scene.RegionInfo.RegionID.ToString()); |
244 | layerDecodeAsset.Local = true; | 244 | layerDecodeAsset.Local = true; |
245 | layerDecodeAsset.Temporary = true; | 245 | layerDecodeAsset.Temporary = true; |
246 | 246 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 144c8d1..22c8937 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -31,7 +31,7 @@ using log4net; | |||
31 | using Nini.Config; | 31 | using Nini.Config; |
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications.Cache; | 34 | |
35 | using OpenSim.Region.Framework.Interfaces; | 35 | using OpenSim.Region.Framework.Interfaces; |
36 | using OpenSim.Region.Framework.Scenes; | 36 | using OpenSim.Region.Framework.Scenes; |
37 | using OpenSim.Services.Interfaces; | 37 | using OpenSim.Services.Interfaces; |
@@ -46,21 +46,16 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
46 | 46 | ||
47 | public bool TryGetAvatarAppearance(UUID avatarId, out AvatarAppearance appearance) | 47 | public bool TryGetAvatarAppearance(UUID avatarId, out AvatarAppearance appearance) |
48 | { | 48 | { |
49 | CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(avatarId); | 49 | AvatarData avatar = m_scene.AvatarService.GetAvatar(avatarId); |
50 | //if ((profile != null) && (profile.RootFolder != null)) | 50 | //if ((profile != null) && (profile.RootFolder != null)) |
51 | if (profile != null) | 51 | if (avatar != null) |
52 | { | 52 | { |
53 | appearance = m_scene.CommsManager.AvatarService.GetUserAppearance(avatarId); | 53 | appearance = avatar.ToAvatarAppearance(avatarId); |
54 | if (appearance != null) | 54 | return true; |
55 | { | ||
56 | //SetAppearanceAssets(profile, ref appearance); | ||
57 | //m_log.DebugFormat("[APPEARANCE]: Found : {0}", appearance.ToString()); | ||
58 | return true; | ||
59 | } | ||
60 | } | 55 | } |
61 | 56 | ||
62 | appearance = CreateDefault(avatarId); | ||
63 | m_log.ErrorFormat("[APPEARANCE]: Appearance not found for {0}, creating default", avatarId); | 57 | m_log.ErrorFormat("[APPEARANCE]: Appearance not found for {0}, creating default", avatarId); |
58 | appearance = CreateDefault(avatarId); | ||
64 | return false; | 59 | return false; |
65 | } | 60 | } |
66 | 61 | ||
@@ -160,21 +155,23 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
160 | /// <param name="e"></param> | 155 | /// <param name="e"></param> |
161 | public void AvatarIsWearing(Object sender, AvatarWearingArgs e) | 156 | public void AvatarIsWearing(Object sender, AvatarWearingArgs e) |
162 | { | 157 | { |
158 | m_log.DebugFormat("[APPEARANCE]: AvatarIsWearing"); | ||
159 | |||
163 | IClientAPI clientView = (IClientAPI)sender; | 160 | IClientAPI clientView = (IClientAPI)sender; |
164 | ScenePresence avatar = m_scene.GetScenePresence(clientView.AgentId); | 161 | ScenePresence sp = m_scene.GetScenePresence(clientView.AgentId); |
165 | 162 | ||
166 | if (avatar == null) | 163 | if (sp == null) |
167 | { | 164 | { |
168 | m_log.Error("[APPEARANCE]: Avatar is child agent, ignoring AvatarIsWearing event"); | 165 | m_log.Error("[APPEARANCE]: Avatar is child agent, ignoring AvatarIsWearing event"); |
169 | return; | 166 | return; |
170 | } | 167 | } |
171 | 168 | ||
172 | AvatarAppearance avatAppearance = null; | 169 | AvatarAppearance avatAppearance = sp.Appearance; |
173 | if (!TryGetAvatarAppearance(clientView.AgentId, out avatAppearance)) | 170 | //if (!TryGetAvatarAppearance(clientView.AgentId, out avatAppearance)) |
174 | { | 171 | //{ |
175 | m_log.Warn("[APPEARANCE]: We didn't seem to find the appearance, falling back to ScenePresence"); | 172 | // m_log.Warn("[APPEARANCE]: We didn't seem to find the appearance, falling back to ScenePresence"); |
176 | avatAppearance = avatar.Appearance; | 173 | // avatAppearance = sp.Appearance; |
177 | } | 174 | //} |
178 | 175 | ||
179 | //m_log.DebugFormat("[APPEARANCE]: Received wearables for {0}", clientView.Name); | 176 | //m_log.DebugFormat("[APPEARANCE]: Received wearables for {0}", clientView.Name); |
180 | 177 | ||
@@ -186,10 +183,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
186 | } | 183 | } |
187 | } | 184 | } |
188 | 185 | ||
189 | SetAppearanceAssets(avatar.UUID, ref avatAppearance); | 186 | SetAppearanceAssets(sp.UUID, ref avatAppearance); |
187 | AvatarData adata = new AvatarData(avatAppearance); | ||
188 | m_scene.AvatarService.SetAvatar(clientView.AgentId, adata); | ||
190 | 189 | ||
191 | m_scene.CommsManager.AvatarService.UpdateUserAppearance(clientView.AgentId, avatAppearance); | 190 | sp.Appearance = avatAppearance; |
192 | avatar.Appearance = avatAppearance; | ||
193 | } | 191 | } |
194 | 192 | ||
195 | public static void GetDefaultAvatarAppearance(out AvatarWearable[] wearables, out byte[] visualParams) | 193 | public static void GetDefaultAvatarAppearance(out AvatarWearable[] wearables, out byte[] visualParams) |
@@ -200,7 +198,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
200 | 198 | ||
201 | public void UpdateDatabase(UUID user, AvatarAppearance appearance) | 199 | public void UpdateDatabase(UUID user, AvatarAppearance appearance) |
202 | { | 200 | { |
203 | m_scene.CommsManager.AvatarService.UpdateUserAppearance(user, appearance); | 201 | //m_log.DebugFormat("[APPEARANCE]: UpdateDatabase"); |
202 | AvatarData adata = new AvatarData(appearance); | ||
203 | m_scene.AvatarService.SetAvatar(user, adata); | ||
204 | } | 204 | } |
205 | 205 | ||
206 | private static byte[] GetDefaultVisualParams() | 206 | private static byte[] GetDefaultVisualParams() |
diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs index 1a6cd6c..3614915 100644 --- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs | |||
@@ -130,7 +130,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule | |||
130 | } | 130 | } |
131 | else | 131 | else |
132 | { | 132 | { |
133 | string killer = DeadAvatar.Scene.CommsManager.UUIDNameRequestString(part.OwnerID); | 133 | string killer = DeadAvatar.Scene.GetUserName(part.OwnerID); |
134 | DeadAvatar.ControllingClient.SendAgentAlertMessage("You impaled yourself on " + part.Name + " owned by " + killer +"!", true); | 134 | DeadAvatar.ControllingClient.SendAgentAlertMessage("You impaled yourself on " + part.Name + " owned by " + killer +"!", true); |
135 | } | 135 | } |
136 | //DeadAvatar.Scene. part.ObjectOwner | 136 | //DeadAvatar.Scene. part.ObjectOwner |
diff --git a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs index 72ec869..fac052a 100644 --- a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs | |||
@@ -31,9 +31,10 @@ using log4net; | |||
31 | using Nini.Config; | 31 | using Nini.Config; |
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications.Cache; | 34 | |
35 | using OpenSim.Region.Framework.Interfaces; | 35 | using OpenSim.Region.Framework.Interfaces; |
36 | using OpenSim.Region.Framework.Scenes; | 36 | using OpenSim.Region.Framework.Scenes; |
37 | using OpenSim.Services.Interfaces; | ||
37 | 38 | ||
38 | namespace OpenSim.Region.CoreModules.Avatar.Dialog | 39 | namespace OpenSim.Region.CoreModules.Avatar.Dialog |
39 | { | 40 | { |
@@ -116,12 +117,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog | |||
116 | UUID avatarID, string objectName, UUID objectID, UUID ownerID, | 117 | UUID avatarID, string objectName, UUID objectID, UUID ownerID, |
117 | string message, UUID textureID, int ch, string[] buttonlabels) | 118 | string message, UUID textureID, int ch, string[] buttonlabels) |
118 | { | 119 | { |
119 | CachedUserInfo info = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(ownerID); | 120 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, ownerID); |
120 | string ownerFirstName, ownerLastName; | 121 | string ownerFirstName, ownerLastName; |
121 | if (info != null) | 122 | if (account != null) |
122 | { | 123 | { |
123 | ownerFirstName = info.UserProfile.FirstName; | 124 | ownerFirstName = account.FirstName; |
124 | ownerLastName = info.UserProfile.SurName; | 125 | ownerLastName = account.LastName; |
125 | } | 126 | } |
126 | else | 127 | else |
127 | { | 128 | { |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 086d4fe..cc324fe 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | |||
@@ -28,7 +28,6 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Net; | ||
32 | using System.Reflection; | 31 | using System.Reflection; |
33 | using log4net; | 32 | using log4net; |
34 | using Nini.Config; | 33 | using Nini.Config; |
@@ -36,1119 +35,676 @@ using Nwc.XmlRpc; | |||
36 | using OpenMetaverse; | 35 | using OpenMetaverse; |
37 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
38 | using OpenSim.Framework.Communications; | 37 | using OpenSim.Framework.Communications; |
39 | using OpenSim.Framework.Communications.Cache; | ||
40 | using OpenSim.Region.Framework.Interfaces; | 38 | using OpenSim.Region.Framework.Interfaces; |
41 | using OpenSim.Region.Framework.Scenes; | 39 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Services.Interfaces; | 40 | using OpenSim.Services.Interfaces; |
41 | using OpenSim.Services.Connectors.Friends; | ||
42 | using OpenSim.Server.Base; | ||
43 | using OpenSim.Framework.Servers.HttpServer; | ||
44 | using FriendInfo = OpenSim.Services.Interfaces.FriendInfo; | ||
45 | using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo; | ||
43 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 46 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
44 | 47 | ||
45 | namespace OpenSim.Region.CoreModules.Avatar.Friends | 48 | namespace OpenSim.Region.CoreModules.Avatar.Friends |
46 | { | 49 | { |
47 | /* | 50 | public class FriendsModule : ISharedRegionModule, IFriendsModule |
48 | This module handles adding/removing friends, and the the presence | ||
49 | notification process for login/logoff of friends. | ||
50 | |||
51 | The presence notification works as follows: | ||
52 | - After the user initially connects to a region (so we now have a UDP | ||
53 | connection to work with), this module fetches the friends of user | ||
54 | (those are cached), their on-/offline status, and info about the | ||
55 | region they are in from the MessageServer. | ||
56 | - (*) It then informs the user about the on-/offline status of her friends. | ||
57 | - It then informs all online friends currently on this region-server about | ||
58 | user's new online status (this will save some network traffic, as local | ||
59 | messages don't have to be transferred inter-region, and it will be all | ||
60 | that has to be done in Standalone Mode). | ||
61 | - For the rest of the online friends (those not on this region-server), | ||
62 | this module uses the provided region-information to map users to | ||
63 | regions, and sends one notification to every region containing the | ||
64 | friends to inform on that server. | ||
65 | - The region-server will handle that in the following way: | ||
66 | - If it finds the friend, it informs her about the user being online. | ||
67 | - If it doesn't find the friend (maybe she TPed away in the meantime), | ||
68 | it stores that information. | ||
69 | - After it processed all friends, it returns the list of friends it | ||
70 | couldn't find. | ||
71 | - If this list isn't empty, the FriendsModule re-requests information | ||
72 | about those online friends that have been missed and starts at (*) | ||
73 | again until all friends have been found, or until it tried 3 times | ||
74 | (to prevent endless loops due to some uncaught error). | ||
75 | |||
76 | NOTE: Online/Offline notifications don't need to be sent on region change. | ||
77 | |||
78 | We implement two XMLRpc handlers here, handling all the inter-region things | ||
79 | we have to handle: | ||
80 | - On-/Offline-Notifications (bulk) | ||
81 | - Terminate Friendship messages (single) | ||
82 | */ | ||
83 | |||
84 | public class FriendsModule : IRegionModule, IFriendsModule | ||
85 | { | 51 | { |
86 | private class Transaction | 52 | protected class UserFriendData |
87 | { | 53 | { |
88 | public UUID agentID; | 54 | public UUID PrincipalID; |
89 | public string agentName; | 55 | public FriendInfo[] Friends; |
90 | public uint count; | 56 | public int Refcount; |
57 | public UUID RegionID; | ||
91 | 58 | ||
92 | public Transaction(UUID agentID, string agentName) | 59 | public bool IsFriend(string friend) |
93 | { | 60 | { |
94 | this.agentID = agentID; | 61 | foreach (FriendInfo fi in Friends) |
95 | this.agentName = agentName; | 62 | { |
96 | this.count = 1; | 63 | if (fi.Friend == friend) |
64 | return true; | ||
65 | } | ||
66 | |||
67 | return false; | ||
97 | } | 68 | } |
98 | } | 69 | } |
99 | 70 | ||
100 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 71 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
101 | 72 | ||
102 | private Cache m_friendLists = new Cache(CacheFlags.AllowUpdate); | 73 | protected List<Scene> m_Scenes = new List<Scene>(); |
103 | 74 | ||
104 | private Dictionary<UUID, ulong> m_rootAgents = new Dictionary<UUID, ulong>(); | 75 | protected IPresenceService m_PresenceService = null; |
76 | protected IFriendsService m_FriendsService = null; | ||
77 | protected FriendsSimConnector m_FriendsSimConnector; | ||
105 | 78 | ||
106 | private Dictionary<UUID, UUID> m_pendingCallingcardRequests = new Dictionary<UUID,UUID>(); | 79 | protected Dictionary<UUID, UserFriendData> m_Friends = |
80 | new Dictionary<UUID, UserFriendData>(); | ||
107 | 81 | ||
108 | private Scene m_initialScene; // saves a lookup if we don't have a specific scene | 82 | protected List<UUID> m_NeedsListOfFriends = new List<UUID>(); |
109 | private Dictionary<ulong, Scene> m_scenes = new Dictionary<ulong,Scene>(); | ||
110 | private IMessageTransferModule m_TransferModule = null; | ||
111 | 83 | ||
112 | private IGridService m_gridServices = null; | 84 | protected IPresenceService PresenceService |
113 | |||
114 | #region IRegionModule Members | ||
115 | |||
116 | public void Initialise(Scene scene, IConfigSource config) | ||
117 | { | 85 | { |
118 | lock (m_scenes) | 86 | get |
119 | { | 87 | { |
120 | if (m_scenes.Count == 0) | 88 | if (m_PresenceService == null) |
121 | { | 89 | { |
122 | MainServer.Instance.AddXmlRPCHandler("presence_update_bulk", processPresenceUpdateBulk); | 90 | if (m_Scenes.Count > 0) |
123 | MainServer.Instance.AddXmlRPCHandler("terminate_friend", processTerminateFriend); | 91 | m_PresenceService = m_Scenes[0].RequestModuleInterface<IPresenceService>(); |
124 | m_friendLists.DefaultTTL = new TimeSpan(1, 0, 0); // store entries for one hour max | ||
125 | m_initialScene = scene; | ||
126 | } | 92 | } |
127 | 93 | ||
128 | if (!m_scenes.ContainsKey(scene.RegionInfo.RegionHandle)) | 94 | return m_PresenceService; |
129 | m_scenes[scene.RegionInfo.RegionHandle] = scene; | ||
130 | } | 95 | } |
131 | |||
132 | scene.RegisterModuleInterface<IFriendsModule>(this); | ||
133 | |||
134 | scene.EventManager.OnNewClient += OnNewClient; | ||
135 | scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; | ||
136 | scene.EventManager.OnAvatarEnteringNewParcel += AvatarEnteringParcel; | ||
137 | scene.EventManager.OnMakeChildAgent += MakeChildAgent; | ||
138 | scene.EventManager.OnClientClosed += ClientClosed; | ||
139 | } | 96 | } |
140 | 97 | ||
141 | public void PostInitialise() | 98 | protected IFriendsService FriendsService |
142 | { | 99 | { |
143 | if (m_scenes.Count > 0) | 100 | get |
144 | { | 101 | { |
145 | m_TransferModule = m_initialScene.RequestModuleInterface<IMessageTransferModule>(); | 102 | if (m_FriendsService == null) |
146 | m_gridServices = m_initialScene.GridService; | 103 | { |
147 | } | 104 | if (m_Scenes.Count > 0) |
148 | if (m_TransferModule == null) | 105 | m_FriendsService = m_Scenes[0].RequestModuleInterface<IFriendsService>(); |
149 | m_log.Error("[FRIENDS]: Unable to find a message transfer module, friendship offers will not work"); | 106 | } |
150 | } | ||
151 | |||
152 | public void Close() | ||
153 | { | ||
154 | } | ||
155 | 107 | ||
156 | public string Name | 108 | return m_FriendsService; |
157 | { | 109 | } |
158 | get { return "FriendsModule"; } | ||
159 | } | 110 | } |
160 | 111 | ||
161 | public bool IsSharedModule | 112 | protected IGridService GridService |
162 | { | 113 | { |
163 | get { return true; } | 114 | get |
115 | { | ||
116 | return m_Scenes[0].GridService; | ||
117 | } | ||
164 | } | 118 | } |
165 | 119 | ||
166 | #endregion | 120 | public IScene Scene |
167 | |||
168 | #region IInterregionFriendsComms | ||
169 | |||
170 | public List<UUID> InformFriendsInOtherRegion(UUID agentId, ulong destRegionHandle, List<UUID> friends, bool online) | ||
171 | { | 121 | { |
172 | List<UUID> tpdAway = new List<UUID>(); | 122 | get |
173 | |||
174 | // destRegionHandle is a region on another server | ||
175 | uint x = 0, y = 0; | ||
176 | Utils.LongToUInts(destRegionHandle, out x, out y); | ||
177 | GridRegion info = m_gridServices.GetRegionByPosition(m_initialScene.RegionInfo.ScopeID, (int)x, (int)y); | ||
178 | if (info != null) | ||
179 | { | 123 | { |
180 | string httpServer = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/presence_update_bulk"; | 124 | if (m_Scenes.Count > 0) |
181 | 125 | return m_Scenes[0]; | |
182 | Hashtable reqParams = new Hashtable(); | 126 | else |
183 | reqParams["agentID"] = agentId.ToString(); | 127 | return null; |
184 | reqParams["agentOnline"] = online; | ||
185 | int count = 0; | ||
186 | foreach (UUID uuid in friends) | ||
187 | { | ||
188 | reqParams["friendID_" + count++] = uuid.ToString(); | ||
189 | } | ||
190 | reqParams["friendCount"] = count; | ||
191 | |||
192 | IList parameters = new ArrayList(); | ||
193 | parameters.Add(reqParams); | ||
194 | try | ||
195 | { | ||
196 | XmlRpcRequest request = new XmlRpcRequest("presence_update_bulk", parameters); | ||
197 | XmlRpcResponse response = request.Send(httpServer, 5000); | ||
198 | Hashtable respData = (Hashtable)response.Value; | ||
199 | |||
200 | count = (int)respData["friendCount"]; | ||
201 | for (int i = 0; i < count; ++i) | ||
202 | { | ||
203 | UUID uuid; | ||
204 | if (UUID.TryParse((string)respData["friendID_" + i], out uuid)) tpdAway.Add(uuid); | ||
205 | } | ||
206 | } | ||
207 | catch (WebException e) | ||
208 | { | ||
209 | // Ignore connect failures, simulators come and go | ||
210 | // | ||
211 | if (!e.Message.Contains("ConnectFailure")) | ||
212 | { | ||
213 | m_log.Error("[OGS1 GRID SERVICES]: InformFriendsInOtherRegion XMLRPC failure: ", e); | ||
214 | } | ||
215 | } | ||
216 | catch (Exception e) | ||
217 | { | ||
218 | m_log.Error("[OGS1 GRID SERVICES]: InformFriendsInOtherRegion XMLRPC failure: ", e); | ||
219 | } | ||
220 | } | 128 | } |
221 | else m_log.WarnFormat("[OGS1 GRID SERVICES]: Couldn't find region {0}???", destRegionHandle); | ||
222 | |||
223 | return tpdAway; | ||
224 | } | 129 | } |
225 | 130 | ||
226 | public bool TriggerTerminateFriend(ulong destRegionHandle, UUID agentID, UUID exFriendID) | 131 | public void Initialise(IConfigSource config) |
227 | { | 132 | { |
228 | // destRegionHandle is a region on another server | 133 | IConfig friendsConfig = config.Configs["Friends"]; |
229 | uint x = 0, y = 0; | 134 | if (friendsConfig != null) |
230 | Utils.LongToUInts(destRegionHandle, out x, out y); | ||
231 | GridRegion info = m_gridServices.GetRegionByPosition(m_initialScene.RegionInfo.ScopeID, (int)x, (int)y); | ||
232 | if (info == null) | ||
233 | { | 135 | { |
234 | m_log.WarnFormat("[OGS1 GRID SERVICES]: Couldn't find region {0}", destRegionHandle); | 136 | int mPort = friendsConfig.GetInt("Port", 0); |
235 | return false; // region not found??? | ||
236 | } | ||
237 | 137 | ||
238 | string httpServer = "http://" + info.ExternalEndPoint.Address + ":" + info.HttpPort + "/presence_update_bulk"; | 138 | string connector = friendsConfig.GetString("Connector", String.Empty); |
139 | Object[] args = new Object[] { config }; | ||
239 | 140 | ||
240 | Hashtable reqParams = new Hashtable(); | 141 | m_FriendsService = ServerUtils.LoadPlugin<IFriendsService>(connector, args); |
241 | reqParams["agentID"] = agentID.ToString(); | 142 | m_FriendsSimConnector = new FriendsSimConnector(); |
242 | reqParams["friendID"] = exFriendID.ToString(); | ||
243 | 143 | ||
244 | IList parameters = new ArrayList(); | 144 | // Instantiate the request handler |
245 | parameters.Add(reqParams); | 145 | IHttpServer server = MainServer.GetHttpServer((uint)mPort); |
246 | try | 146 | server.AddStreamHandler(new FriendsRequestHandler(this)); |
247 | { | ||
248 | XmlRpcRequest request = new XmlRpcRequest("terminate_friend", parameters); | ||
249 | XmlRpcResponse response = request.Send(httpServer, 5000); | ||
250 | Hashtable respData = (Hashtable)response.Value; | ||
251 | 147 | ||
252 | return (bool)respData["success"]; | ||
253 | } | 148 | } |
254 | catch (Exception e) | 149 | |
150 | if (m_FriendsService == null) | ||
255 | { | 151 | { |
256 | m_log.Error("[OGS1 GRID SERVICES]: InformFriendsInOtherRegion XMLRPC failure: ", e); | 152 | m_log.Error("[FRIENDS]: No Connector defined in section Friends, or filed to load, cannot continue"); |
257 | return false; | 153 | throw new Exception("Connector load error"); |
258 | } | 154 | } |
155 | |||
259 | } | 156 | } |
260 | 157 | ||
261 | #endregion | 158 | public void PostInitialise() |
159 | { | ||
160 | } | ||
262 | 161 | ||
263 | #region Incoming XMLRPC messages | 162 | public void Close() |
264 | /// <summary> | ||
265 | /// Receive presence information changes about clients in other regions. | ||
266 | /// </summary> | ||
267 | /// <param name="req"></param> | ||
268 | /// <returns></returns> | ||
269 | public XmlRpcResponse processPresenceUpdateBulk(XmlRpcRequest req, IPEndPoint remoteClient) | ||
270 | { | 163 | { |
271 | Hashtable requestData = (Hashtable)req.Params[0]; | 164 | } |
272 | 165 | ||
273 | List<UUID> friendsNotHere = new List<UUID>(); | 166 | public void AddRegion(Scene scene) |
167 | { | ||
168 | m_Scenes.Add(scene); | ||
169 | scene.RegisterModuleInterface<IFriendsModule>(this); | ||
274 | 170 | ||
275 | // this is called with the expectation that all the friends in the request are on this region-server. | 171 | scene.EventManager.OnNewClient += OnNewClient; |
276 | // But as some time passed since we checked (on the other region-server, via the MessagingServer), | 172 | scene.EventManager.OnClientClosed += OnClientClosed; |
277 | // some of the friends might have teleported away. | 173 | scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; |
278 | // Actually, even now, between this line and the sending below, some people could TP away. So, | 174 | scene.EventManager.OnMakeChildAgent += OnMakeChildAgent; |
279 | // we'll have to lock the m_rootAgents list for the duration to prevent/delay that. | 175 | scene.EventManager.OnClientLogin += OnClientLogin; |
280 | lock (m_rootAgents) | 176 | } |
281 | { | ||
282 | List<ScenePresence> friendsHere = new List<ScenePresence>(); | ||
283 | |||
284 | try | ||
285 | { | ||
286 | UUID agentID = new UUID((string)requestData["agentID"]); | ||
287 | bool agentOnline = (bool)requestData["agentOnline"]; | ||
288 | int count = (int)requestData["friendCount"]; | ||
289 | for (int i = 0; i < count; ++i) | ||
290 | { | ||
291 | UUID uuid; | ||
292 | if (UUID.TryParse((string)requestData["friendID_" + i], out uuid)) | ||
293 | { | ||
294 | if (m_rootAgents.ContainsKey(uuid)) friendsHere.Add(GetRootPresenceFromAgentID(uuid)); | ||
295 | else friendsNotHere.Add(uuid); | ||
296 | } | ||
297 | } | ||
298 | 177 | ||
299 | // now send, as long as they are still here... | 178 | public void RegionLoaded(Scene scene) |
300 | UUID[] agentUUID = new UUID[] { agentID }; | 179 | { |
301 | if (agentOnline) | 180 | } |
302 | { | ||
303 | foreach (ScenePresence agent in friendsHere) | ||
304 | { | ||
305 | agent.ControllingClient.SendAgentOnline(agentUUID); | ||
306 | } | ||
307 | } | ||
308 | else | ||
309 | { | ||
310 | foreach (ScenePresence agent in friendsHere) | ||
311 | { | ||
312 | agent.ControllingClient.SendAgentOffline(agentUUID); | ||
313 | } | ||
314 | } | ||
315 | } | ||
316 | catch(Exception e) | ||
317 | { | ||
318 | m_log.Warn("[FRIENDS]: Got exception while parsing presence_update_bulk request:", e); | ||
319 | } | ||
320 | } | ||
321 | 181 | ||
322 | // no need to lock anymore; if TPs happen now, worst case is that we have an additional agent in this region, | 182 | public void RemoveRegion(Scene scene) |
323 | // which should be caught on the next iteration... | 183 | { |
324 | Hashtable result = new Hashtable(); | 184 | m_Scenes.Remove(scene); |
325 | int idx = 0; | 185 | } |
326 | foreach (UUID uuid in friendsNotHere) | ||
327 | { | ||
328 | result["friendID_" + idx++] = uuid.ToString(); | ||
329 | } | ||
330 | result["friendCount"] = idx; | ||
331 | 186 | ||
332 | XmlRpcResponse response = new XmlRpcResponse(); | 187 | public string Name |
333 | response.Value = result; | 188 | { |
189 | get { return "FriendsModule"; } | ||
190 | } | ||
334 | 191 | ||
335 | return response; | 192 | public Type ReplaceableInterface |
193 | { | ||
194 | get { return null; } | ||
336 | } | 195 | } |
337 | 196 | ||
338 | public XmlRpcResponse processTerminateFriend(XmlRpcRequest req, IPEndPoint remoteClient) | 197 | public uint GetFriendPerms(UUID principalID, UUID friendID) |
339 | { | 198 | { |
340 | Hashtable requestData = (Hashtable)req.Params[0]; | 199 | if (!m_Friends.ContainsKey(principalID)) |
200 | return 0; | ||
341 | 201 | ||
342 | bool success = false; | 202 | UserFriendData data = m_Friends[principalID]; |
343 | 203 | ||
344 | UUID agentID; | 204 | foreach (FriendInfo fi in data.Friends) |
345 | UUID friendID; | ||
346 | if (requestData.ContainsKey("agentID") && UUID.TryParse((string)requestData["agentID"], out agentID) && | ||
347 | requestData.ContainsKey("friendID") && UUID.TryParse((string)requestData["friendID"], out friendID)) | ||
348 | { | 205 | { |
349 | // try to find it and if it is there, prevent it to vanish before we sent the message | 206 | if (fi.Friend == friendID.ToString()) |
350 | lock (m_rootAgents) | 207 | return (uint)fi.TheirFlags; |
351 | { | ||
352 | if (m_rootAgents.ContainsKey(agentID)) | ||
353 | { | ||
354 | m_log.DebugFormat("[FRIEND]: Sending terminate friend {0} to agent {1}", friendID, agentID); | ||
355 | GetRootPresenceFromAgentID(agentID).ControllingClient.SendTerminateFriend(friendID); | ||
356 | success = true; | ||
357 | } | ||
358 | } | ||
359 | } | 208 | } |
360 | 209 | return 0; | |
361 | // return whether we were successful | ||
362 | Hashtable result = new Hashtable(); | ||
363 | result["success"] = success; | ||
364 | |||
365 | XmlRpcResponse response = new XmlRpcResponse(); | ||
366 | response.Value = result; | ||
367 | return response; | ||
368 | } | 210 | } |
369 | 211 | ||
370 | #endregion | ||
371 | |||
372 | #region Scene events | ||
373 | |||
374 | private void OnNewClient(IClientAPI client) | 212 | private void OnNewClient(IClientAPI client) |
375 | { | 213 | { |
376 | // All friends establishment protocol goes over instant message | ||
377 | // There's no way to send a message from the sim | ||
378 | // to a user to 'add a friend' without causing dialog box spam | ||
379 | |||
380 | // Subscribe to instant messages | ||
381 | client.OnInstantMessage += OnInstantMessage; | 214 | client.OnInstantMessage += OnInstantMessage; |
382 | |||
383 | // Friend list management | ||
384 | client.OnApproveFriendRequest += OnApproveFriendRequest; | 215 | client.OnApproveFriendRequest += OnApproveFriendRequest; |
385 | client.OnDenyFriendRequest += OnDenyFriendRequest; | 216 | client.OnDenyFriendRequest += OnDenyFriendRequest; |
386 | client.OnTerminateFriendship += OnTerminateFriendship; | 217 | client.OnTerminateFriendship += OnTerminateFriendship; |
387 | 218 | ||
388 | // ... calling card handling... | 219 | client.OnGrantUserRights += OnGrantUserRights; |
389 | client.OnOfferCallingCard += OnOfferCallingCard; | ||
390 | client.OnAcceptCallingCard += OnAcceptCallingCard; | ||
391 | client.OnDeclineCallingCard += OnDeclineCallingCard; | ||
392 | 220 | ||
393 | // we need this one exactly once per agent session (see comments in the handler below) | ||
394 | client.OnEconomyDataRequest += OnEconomyDataRequest; | ||
395 | |||
396 | // if it leaves, we want to know, too | ||
397 | client.OnLogout += OnLogout; | 221 | client.OnLogout += OnLogout; |
398 | |||
399 | client.OnGrantUserRights += GrantUserFriendRights; | ||
400 | client.OnTrackAgent += FindAgent; | ||
401 | client.OnFindAgent += FindAgent; | ||
402 | 222 | ||
403 | } | 223 | if (m_Friends.ContainsKey(client.AgentId)) |
404 | |||
405 | private void ClientClosed(UUID AgentId, Scene scene) | ||
406 | { | ||
407 | // agent's client was closed. As we handle logout in OnLogout, this here has only to handle | ||
408 | // TPing away (root agent is closed) or TPing/crossing in a region far enough away (client | ||
409 | // agent is closed). | ||
410 | // NOTE: In general, this doesn't mean that the agent logged out, just that it isn't around | ||
411 | // in one of the regions here anymore. | ||
412 | lock (m_rootAgents) | ||
413 | { | 224 | { |
414 | if (m_rootAgents.ContainsKey(AgentId)) | 225 | m_Friends[client.AgentId].Refcount++; |
415 | { | 226 | return; |
416 | m_rootAgents.Remove(AgentId); | ||
417 | } | ||
418 | } | 227 | } |
419 | } | ||
420 | 228 | ||
421 | private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID) | 229 | UserFriendData newFriends = new UserFriendData(); |
422 | { | 230 | |
423 | lock (m_rootAgents) | 231 | newFriends.PrincipalID = client.AgentId; |
424 | { | 232 | newFriends.Friends = m_FriendsService.GetFriends(client.AgentId); |
425 | m_rootAgents[avatar.UUID] = avatar.RegionHandle; | 233 | newFriends.Refcount = 1; |
426 | // Claim User! my user! Mine mine mine! | 234 | newFriends.RegionID = UUID.Zero; |
427 | } | 235 | |
236 | m_Friends.Add(client.AgentId, newFriends); | ||
237 | |||
238 | //StatusChange(client.AgentId, true); | ||
428 | } | 239 | } |
429 | 240 | ||
430 | private void MakeChildAgent(ScenePresence avatar) | 241 | private void OnClientClosed(UUID agentID, Scene scene) |
431 | { | 242 | { |
432 | lock (m_rootAgents) | 243 | if (m_Friends.ContainsKey(agentID)) |
433 | { | 244 | { |
434 | if (m_rootAgents.ContainsKey(avatar.UUID)) | 245 | if (m_Friends[agentID].Refcount == 1) |
435 | { | 246 | m_Friends.Remove(agentID); |
436 | // only delete if the region matches. As this is a shared module, the avatar could be | 247 | else |
437 | // root agent in another region on this server. | 248 | m_Friends[agentID].Refcount--; |
438 | if (m_rootAgents[avatar.UUID] == avatar.RegionHandle) | ||
439 | { | ||
440 | m_rootAgents.Remove(avatar.UUID); | ||
441 | // m_log.Debug("[FRIEND]: Removing " + avatar.Firstname + " " + avatar.Lastname + " as a root agent"); | ||
442 | } | ||
443 | } | ||
444 | } | 249 | } |
445 | } | 250 | } |
446 | #endregion | ||
447 | 251 | ||
448 | private ScenePresence GetRootPresenceFromAgentID(UUID AgentID) | 252 | private void OnLogout(IClientAPI client) |
449 | { | 253 | { |
450 | ScenePresence returnAgent = null; | 254 | StatusChange(client.AgentId, false); |
451 | lock (m_scenes) | 255 | m_Friends.Remove(client.AgentId); |
452 | { | ||
453 | ScenePresence queryagent = null; | ||
454 | foreach (Scene scene in m_scenes.Values) | ||
455 | { | ||
456 | queryagent = scene.GetScenePresence(AgentID); | ||
457 | if (queryagent != null) | ||
458 | { | ||
459 | if (!queryagent.IsChildAgent) | ||
460 | { | ||
461 | returnAgent = queryagent; | ||
462 | break; | ||
463 | } | ||
464 | } | ||
465 | } | ||
466 | } | ||
467 | return returnAgent; | ||
468 | } | 256 | } |
469 | 257 | ||
470 | private ScenePresence GetAnyPresenceFromAgentID(UUID AgentID) | 258 | private void OnMakeRootAgent(ScenePresence sp) |
471 | { | 259 | { |
472 | ScenePresence returnAgent = null; | 260 | UUID agentID = sp.ControllingClient.AgentId; |
473 | lock (m_scenes) | 261 | |
262 | if (m_Friends.ContainsKey(agentID)) | ||
474 | { | 263 | { |
475 | ScenePresence queryagent = null; | 264 | if (m_Friends[agentID].RegionID == UUID.Zero && m_Friends[agentID].Friends == null) |
476 | foreach (Scene scene in m_scenes.Values) | ||
477 | { | 265 | { |
478 | queryagent = scene.GetScenePresence(AgentID); | 266 | m_Friends[agentID].Friends = |
479 | if (queryagent != null) | 267 | m_FriendsService.GetFriends(agentID); |
480 | { | ||
481 | returnAgent = queryagent; | ||
482 | break; | ||
483 | } | ||
484 | } | 268 | } |
485 | } | 269 | m_Friends[agentID].RegionID = |
486 | return returnAgent; | 270 | sp.ControllingClient.Scene.RegionInfo.RegionID; |
487 | } | ||
488 | |||
489 | public void OfferFriendship(UUID fromUserId, IClientAPI toUserClient, string offerMessage) | ||
490 | { | ||
491 | CachedUserInfo userInfo = m_initialScene.CommsManager.UserProfileCacheService.GetUserDetails(fromUserId); | ||
492 | |||
493 | if (userInfo != null) | ||
494 | { | ||
495 | GridInstantMessage msg = new GridInstantMessage( | ||
496 | toUserClient.Scene, fromUserId, userInfo.UserProfile.Name, toUserClient.AgentId, | ||
497 | (byte)InstantMessageDialog.FriendshipOffered, offerMessage, false, Vector3.Zero); | ||
498 | |||
499 | FriendshipOffered(msg); | ||
500 | } | ||
501 | else | ||
502 | { | ||
503 | m_log.ErrorFormat("[FRIENDS]: No user found for id {0} in OfferFriendship()", fromUserId); | ||
504 | } | 271 | } |
505 | } | 272 | } |
506 | 273 | ||
507 | #region FriendRequestHandling | ||
508 | 274 | ||
509 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) | 275 | private void OnMakeChildAgent(ScenePresence sp) |
510 | { | 276 | { |
511 | // Friend Requests go by Instant Message.. using the dialog param | 277 | UUID agentID = sp.ControllingClient.AgentId; |
512 | // https://wiki.secondlife.com/wiki/ImprovedInstantMessage | ||
513 | 278 | ||
514 | if (im.dialog == (byte)InstantMessageDialog.FriendshipOffered) // 38 | 279 | if (m_Friends.ContainsKey(agentID)) |
515 | { | ||
516 | // fromAgentName is the *destination* name (the friend we offer friendship to) | ||
517 | ScenePresence initiator = GetAnyPresenceFromAgentID(new UUID(im.fromAgentID)); | ||
518 | im.fromAgentName = initiator != null ? initiator.Name : "(hippo)"; | ||
519 | |||
520 | FriendshipOffered(im); | ||
521 | } | ||
522 | else if (im.dialog == (byte)InstantMessageDialog.FriendshipAccepted) // 39 | ||
523 | { | ||
524 | FriendshipAccepted(client, im); | ||
525 | } | ||
526 | else if (im.dialog == (byte)InstantMessageDialog.FriendshipDeclined) // 40 | ||
527 | { | 280 | { |
528 | FriendshipDeclined(client, im); | 281 | if (m_Friends[agentID].RegionID == sp.ControllingClient.Scene.RegionInfo.RegionID) |
282 | m_Friends[agentID].RegionID = UUID.Zero; | ||
529 | } | 283 | } |
530 | } | 284 | } |
531 | |||
532 | /// <summary> | ||
533 | /// Invoked when a user offers a friendship. | ||
534 | /// </summary> | ||
535 | /// | ||
536 | /// <param name="im"></param> | ||
537 | /// <param name="client"></param> | ||
538 | private void FriendshipOffered(GridInstantMessage im) | ||
539 | { | ||
540 | // this is triggered by the initiating agent: | ||
541 | // A local agent offers friendship to some possibly remote friend. | ||
542 | // A IM is triggered, processed here and sent to the friend (possibly in a remote region). | ||
543 | |||
544 | m_log.DebugFormat("[FRIEND]: Offer(38) - From: {0}, FromName: {1} To: {2}, Session: {3}, Message: {4}, Offline {5}", | ||
545 | im.fromAgentID, im.fromAgentName, im.toAgentID, im.imSessionID, im.message, im.offline); | ||
546 | |||
547 | // 1.20 protocol sends an UUID in the message field, instead of the friendship offer text. | ||
548 | // For interoperability, we have to clear that | ||
549 | if (Util.isUUID(im.message)) im.message = ""; | ||
550 | |||
551 | // be sneeky and use the initiator-UUID as transactionID. This means we can be stateless. | ||
552 | // we have to look up the agent name on friendship-approval, though. | ||
553 | im.imSessionID = im.fromAgentID; | ||
554 | 285 | ||
555 | if (m_TransferModule != null) | 286 | private void OnClientLogin(IClientAPI client) |
556 | { | ||
557 | // Send it to whoever is the destination. | ||
558 | // If new friend is local, it will send an IM to the viewer. | ||
559 | // If new friend is remote, it will cause a OnGridInstantMessage on the remote server | ||
560 | m_TransferModule.SendInstantMessage( | ||
561 | im, | ||
562 | delegate(bool success) | ||
563 | { | ||
564 | m_log.DebugFormat("[FRIEND]: sending IM success = {0}", success); | ||
565 | } | ||
566 | ); | ||
567 | } | ||
568 | } | ||
569 | |||
570 | /// <summary> | ||
571 | /// Invoked when a user accepts a friendship offer. | ||
572 | /// </summary> | ||
573 | /// <param name="im"></param> | ||
574 | /// <param name="client"></param> | ||
575 | private void FriendshipAccepted(IClientAPI client, GridInstantMessage im) | ||
576 | { | ||
577 | m_log.DebugFormat("[FRIEND]: 39 - from client {0}, agent {2} {3}, imsession {4} to {5}: {6} (dialog {7})", | ||
578 | client.AgentId, im.fromAgentID, im.fromAgentName, im.imSessionID, im.toAgentID, im.message, im.dialog); | ||
579 | } | ||
580 | |||
581 | /// <summary> | ||
582 | /// Invoked when a user declines a friendship offer. | ||
583 | /// </summary> | ||
584 | /// May not currently be used - see OnDenyFriendRequest() instead | ||
585 | /// <param name="im"></param> | ||
586 | /// <param name="client"></param> | ||
587 | private void FriendshipDeclined(IClientAPI client, GridInstantMessage im) | ||
588 | { | 287 | { |
589 | UUID fromAgentID = new UUID(im.fromAgentID); | 288 | UUID agentID = client.AgentId; |
590 | UUID toAgentID = new UUID(im.toAgentID); | 289 | |
591 | 290 | // Inform the friends that this user is online | |
592 | // declining the friendship offer causes a type 40 IM being sent to the (possibly remote) initiator | 291 | StatusChange(agentID, true); |
593 | // toAgentID is initiator, fromAgentID declined friendship | ||
594 | m_log.DebugFormat("[FRIEND]: 40 - from client {0}, agent {1} {2}, imsession {3} to {4}: {5} (dialog {6})", | ||
595 | client != null ? client.AgentId.ToString() : "<null>", | ||
596 | fromAgentID, im.fromAgentName, im.imSessionID, im.toAgentID, im.message, im.dialog); | ||
597 | |||
598 | // Send the decline to whoever is the destination. | ||
599 | GridInstantMessage msg | ||
600 | = new GridInstantMessage( | ||
601 | client.Scene, fromAgentID, client.Name, toAgentID, | ||
602 | im.dialog, im.message, im.offline != 0, im.Position); | ||
603 | 292 | ||
604 | // If new friend is local, it will send an IM to the viewer. | 293 | // Register that we need to send the list of online friends to this user |
605 | // If new friend is remote, it will cause a OnGridInstantMessage on the remote server | 294 | lock (m_NeedsListOfFriends) |
606 | m_TransferModule.SendInstantMessage(msg, | 295 | if (!m_NeedsListOfFriends.Contains(agentID)) |
607 | delegate(bool success) { | 296 | { |
608 | m_log.DebugFormat("[FRIEND]: sending IM success = {0}", success); | 297 | m_NeedsListOfFriends.Add(agentID); |
609 | } | 298 | } |
610 | ); | ||
611 | } | 299 | } |
612 | 300 | ||
613 | private void OnGridInstantMessage(GridInstantMessage msg) | 301 | public void SendFriendsOnlineIfNeeded(IClientAPI client) |
614 | { | 302 | { |
615 | // This event won't be raised unless we have that agent, | 303 | UUID agentID = client.AgentId; |
616 | // so we can depend on the above not trying to send | 304 | if (m_NeedsListOfFriends.Contains(agentID)) |
617 | // via grid again | ||
618 | //m_log.DebugFormat("[FRIEND]: Got GridIM from {0}, to {1}, imSession {2}, message {3}, dialog {4}", | ||
619 | // msg.fromAgentID, msg.toAgentID, msg.imSessionID, msg.message, msg.dialog); | ||
620 | |||
621 | if (msg.dialog == (byte)InstantMessageDialog.FriendshipOffered || | ||
622 | msg.dialog == (byte)InstantMessageDialog.FriendshipAccepted || | ||
623 | msg.dialog == (byte)InstantMessageDialog.FriendshipDeclined) | ||
624 | { | 305 | { |
625 | // this should succeed as we *know* the root agent is here. | 306 | if (!m_Friends.ContainsKey(agentID)) |
626 | m_TransferModule.SendInstantMessage(msg, | 307 | { |
627 | delegate(bool success) { | 308 | m_log.DebugFormat("[FRIENDS MODULE]: agent {0} not found in local cache", agentID); |
628 | //m_log.DebugFormat("[FRIEND]: sending IM success = {0}", success); | 309 | return; |
629 | } | 310 | } |
630 | ); | ||
631 | } | ||
632 | 311 | ||
633 | if (msg.dialog == (byte)InstantMessageDialog.FriendshipAccepted) | 312 | client = LocateClientObject(agentID); |
634 | { | 313 | if (client == null) |
635 | // for accept friendship, we have to do a bit more | 314 | { |
636 | ApproveFriendship(new UUID(msg.fromAgentID), new UUID(msg.toAgentID), msg.fromAgentName); | 315 | m_log.DebugFormat("[FRIENDS MODULE]: agent's client {0} not found in local scene", agentID); |
316 | return; | ||
317 | } | ||
318 | |||
319 | List<UUID> online = GetOnlineFriends(agentID); | ||
320 | |||
321 | if (online.Count > 0) | ||
322 | { | ||
323 | m_log.DebugFormat("[FRIENDS MODULE]: User {0} in region {1} has {2} friends online", client.AgentId, client.Scene.RegionInfo.RegionName, online.Count); | ||
324 | client.SendAgentOnline(online.ToArray()); | ||
325 | } | ||
326 | |||
327 | lock (m_NeedsListOfFriends) | ||
328 | m_NeedsListOfFriends.Remove(agentID); | ||
637 | } | 329 | } |
638 | } | 330 | } |
639 | 331 | ||
640 | private void ApproveFriendship(UUID fromAgentID, UUID toAgentID, string fromName) | 332 | List<UUID> GetOnlineFriends(UUID userID) |
641 | { | 333 | { |
642 | m_log.DebugFormat("[FRIEND]: Approve friendship from {0} (ID: {1}) to {2}", | 334 | List<string> friendList = new List<string>(); |
643 | fromAgentID, fromName, toAgentID); | ||
644 | 335 | ||
645 | // a new friend was added in the initiator's and friend's data, so the cache entries are wrong now. | 336 | foreach (FriendInfo fi in m_Friends[userID].Friends) |
646 | lock (m_friendLists) | ||
647 | { | 337 | { |
648 | m_friendLists.Invalidate(fromAgentID.ToString()); | 338 | if ((fi.TheirFlags & 1) != 0) |
649 | m_friendLists.Invalidate(toAgentID.ToString()); | 339 | friendList.Add(fi.Friend); |
650 | } | 340 | } |
651 | 341 | ||
652 | // now send presence update and add a calling card for the new friend | 342 | PresenceInfo[] presence = PresenceService.GetAgents(friendList.ToArray()); |
653 | 343 | ||
654 | ScenePresence initiator = GetAnyPresenceFromAgentID(toAgentID); | 344 | List<UUID> online = new List<UUID>(); |
655 | if (initiator == null) | ||
656 | { | ||
657 | // quite wrong. Shouldn't happen. | ||
658 | m_log.WarnFormat("[FRIEND]: Coudn't find initiator of friend request {0}", toAgentID); | ||
659 | return; | ||
660 | } | ||
661 | 345 | ||
662 | m_log.DebugFormat("[FRIEND]: Tell {0} that {1} is online", | 346 | foreach (PresenceInfo pi in presence) |
663 | initiator.Name, fromName); | ||
664 | // tell initiator that friend is online | ||
665 | initiator.ControllingClient.SendAgentOnline(new UUID[] { fromAgentID }); | ||
666 | |||
667 | // find the folder for the friend... | ||
668 | //InventoryFolderImpl folder = | ||
669 | // initiator.Scene.CommsManager.UserProfileCacheService.GetUserDetails(toAgentID).FindFolderForType((int)InventoryType.CallingCard); | ||
670 | IInventoryService invService = initiator.Scene.InventoryService; | ||
671 | InventoryFolderBase folder = invService.GetFolderForType(toAgentID, AssetType.CallingCard); | ||
672 | if (folder != null) | ||
673 | { | 347 | { |
674 | // ... and add the calling card | 348 | if (pi.Online) |
675 | CreateCallingCard(initiator.ControllingClient, fromAgentID, folder.ID, fromName); | 349 | { |
350 | online.Add(new UUID(pi.UserID)); | ||
351 | //m_log.DebugFormat("[XXX] {0} friend online {1}", userID, pi.UserID); | ||
352 | } | ||
676 | } | 353 | } |
354 | |||
355 | return online; | ||
677 | } | 356 | } |
678 | 357 | ||
679 | private void OnApproveFriendRequest(IClientAPI client, UUID agentID, UUID friendID, List<UUID> callingCardFolders) | 358 | // |
359 | // Find the client for a ID | ||
360 | // | ||
361 | public IClientAPI LocateClientObject(UUID agentID) | ||
680 | { | 362 | { |
681 | m_log.DebugFormat("[FRIEND]: Got approve friendship from {0} {1}, agentID {2}, tid {3}", | 363 | Scene scene = GetClientScene(agentID); |
682 | client.Name, client.AgentId, agentID, friendID); | 364 | if(scene == null) |
365 | return null; | ||
683 | 366 | ||
684 | // store the new friend persistently for both avatars | 367 | ScenePresence presence = scene.GetScenePresence(agentID); |
685 | m_initialScene.StoreAddFriendship(friendID, agentID, (uint) FriendRights.CanSeeOnline); | 368 | if(presence == null) |
369 | return null; | ||
686 | 370 | ||
687 | // The cache entries aren't valid anymore either, as we just added a friend to both sides. | 371 | return presence.ControllingClient; |
688 | lock (m_friendLists) | 372 | } |
689 | { | ||
690 | m_friendLists.Invalidate(agentID.ToString()); | ||
691 | m_friendLists.Invalidate(friendID.ToString()); | ||
692 | } | ||
693 | |||
694 | // if it's a local friend, we don't have to do the lookup | ||
695 | ScenePresence friendPresence = GetAnyPresenceFromAgentID(friendID); | ||
696 | 373 | ||
697 | if (friendPresence != null) | 374 | // |
375 | // Find the scene for an agent | ||
376 | // | ||
377 | private Scene GetClientScene(UUID agentId) | ||
378 | { | ||
379 | lock (m_Scenes) | ||
698 | { | 380 | { |
699 | m_log.Debug("[FRIEND]: Local agent detected."); | 381 | foreach (Scene scene in m_Scenes) |
700 | 382 | { | |
701 | // create calling card | 383 | ScenePresence presence = scene.GetScenePresence(agentId); |
702 | CreateCallingCard(client, friendID, callingCardFolders[0], friendPresence.Name); | 384 | if (presence != null) |
703 | 385 | { | |
704 | // local message means OnGridInstantMessage won't be triggered, so do the work here. | 386 | if (!presence.IsChildAgent) |
705 | friendPresence.ControllingClient.SendInstantMessage( | 387 | return scene; |
706 | new GridInstantMessage(client.Scene, agentID, | 388 | } |
707 | client.Name, friendID, | 389 | } |
708 | (byte)InstantMessageDialog.FriendshipAccepted, | ||
709 | agentID.ToString(), false, Vector3.Zero)); | ||
710 | ApproveFriendship(agentID, friendID, client.Name); | ||
711 | } | 390 | } |
712 | else | 391 | return null; |
713 | { | 392 | } |
714 | m_log.Debug("[FRIEND]: Remote agent detected."); | ||
715 | |||
716 | // fetch the friend's name for the calling card. | ||
717 | CachedUserInfo info = m_initialScene.CommsManager.UserProfileCacheService.GetUserDetails(friendID); | ||
718 | |||
719 | // create calling card | ||
720 | CreateCallingCard(client, friendID, callingCardFolders[0], | ||
721 | info.UserProfile.FirstName + " " + info.UserProfile.SurName); | ||
722 | 393 | ||
723 | // Compose (remote) response to friend. | 394 | /// <summary> |
724 | GridInstantMessage msg = new GridInstantMessage(client.Scene, agentID, client.Name, friendID, | 395 | /// Caller beware! Call this only for root agents. |
725 | (byte)InstantMessageDialog.FriendshipAccepted, | 396 | /// </summary> |
726 | agentID.ToString(), false, Vector3.Zero); | 397 | /// <param name="agentID"></param> |
727 | if (m_TransferModule != null) | 398 | /// <param name="online"></param> |
399 | private void StatusChange(UUID agentID, bool online) | ||
400 | { | ||
401 | if (m_Friends.ContainsKey(agentID)) | ||
402 | { | ||
403 | List<FriendInfo> friendList = new List<FriendInfo>(); | ||
404 | foreach (FriendInfo fi in m_Friends[agentID].Friends) | ||
728 | { | 405 | { |
729 | m_TransferModule.SendInstantMessage(msg, | 406 | if ((fi.MyFlags & 1) != 0) |
730 | delegate(bool success) { | 407 | friendList.Add(fi); |
731 | m_log.DebugFormat("[FRIEND]: sending IM success = {0}", success); | 408 | } |
732 | } | 409 | foreach (FriendInfo fi in friendList) |
733 | ); | 410 | { |
411 | // Notify about this user status | ||
412 | StatusNotify(fi, agentID, online); | ||
734 | } | 413 | } |
735 | } | 414 | } |
736 | |||
737 | // tell client that new friend is online | ||
738 | client.SendAgentOnline(new UUID[] { friendID }); | ||
739 | } | 415 | } |
740 | 416 | ||
741 | private void OnDenyFriendRequest(IClientAPI client, UUID agentID, UUID friendID, List<UUID> callingCardFolders) | 417 | private void StatusNotify(FriendInfo friend, UUID userID, bool online) |
742 | { | 418 | { |
743 | m_log.DebugFormat("[FRIEND]: Got deny friendship from {0} {1}, agentID {2}, tid {3}", | 419 | UUID friendID = UUID.Zero; |
744 | client.Name, client.AgentId, agentID, friendID); | 420 | |
745 | 421 | if (UUID.TryParse(friend.Friend, out friendID)) | |
746 | // Compose response to other agent. | ||
747 | GridInstantMessage msg = new GridInstantMessage(client.Scene, agentID, client.Name, friendID, | ||
748 | (byte)InstantMessageDialog.FriendshipDeclined, | ||
749 | agentID.ToString(), false, Vector3.Zero); | ||
750 | // send decline to initiator | ||
751 | if (m_TransferModule != null) | ||
752 | { | 422 | { |
753 | m_TransferModule.SendInstantMessage(msg, | 423 | // Try local |
754 | delegate(bool success) { | 424 | if (LocalStatusNotification(userID, friendID, online)) |
755 | m_log.DebugFormat("[FRIEND]: sending IM success = {0}", success); | 425 | return; |
756 | } | 426 | |
757 | ); | 427 | // The friend is not here [as root]. Let's forward. |
428 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); | ||
429 | PresenceInfo friendSession = PresenceInfo.GetOnlinePresence(friendSessions); | ||
430 | if (friendSession != null) | ||
431 | { | ||
432 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); | ||
433 | m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); | ||
434 | } | ||
435 | |||
436 | // Friend is not online. Ignore. | ||
758 | } | 437 | } |
759 | } | 438 | } |
760 | 439 | ||
761 | private void OnTerminateFriendship(IClientAPI client, UUID agentID, UUID exfriendID) | 440 | private void OnInstantMessage(IClientAPI client, GridInstantMessage im) |
762 | { | 441 | { |
763 | // client.AgentId == agentID! | 442 | if (im.dialog == (byte)OpenMetaverse.InstantMessageDialog.FriendshipOffered) |
443 | { | ||
444 | // we got a friendship offer | ||
445 | UUID principalID = new UUID(im.fromAgentID); | ||
446 | UUID friendID = new UUID(im.toAgentID); | ||
764 | 447 | ||
765 | // this removes the friends from the stored friendlists. After the next login, they will be gone... | 448 | m_log.DebugFormat("[FRIENDS]: {0} offered friendship to {1}", principalID, friendID); |
766 | m_initialScene.StoreRemoveFriendship(agentID, exfriendID); | ||
767 | 449 | ||
768 | // ... now tell the two involved clients that they aren't friends anymore. | 450 | // This user wants to be friends with the other user. |
451 | // Let's add both relations to the DB, but one of them is inactive (-1) | ||
452 | FriendsService.StoreFriend(friendID, principalID.ToString(), 0); | ||
769 | 453 | ||
770 | // I don't know why we have to tell <agent>, as this was caused by her, but that's how it works in SL... | 454 | // Now let's ask the other user to be friends with this user |
771 | client.SendTerminateFriend(exfriendID); | 455 | ForwardFriendshipOffer(principalID, friendID, im); |
772 | |||
773 | // now send the friend, if online | ||
774 | ScenePresence presence = GetAnyPresenceFromAgentID(exfriendID); | ||
775 | if (presence != null) | ||
776 | { | ||
777 | m_log.DebugFormat("[FRIEND]: Sending terminate friend {0} to agent {1}", agentID, exfriendID); | ||
778 | presence.ControllingClient.SendTerminateFriend(agentID); | ||
779 | } | 456 | } |
780 | else | 457 | } |
781 | { | ||
782 | // retry 3 times, in case the agent TPed from the last known region... | ||
783 | for (int retry = 0; retry < 3; ++retry) | ||
784 | { | ||
785 | // wasn't sent, so ex-friend wasn't around on this region-server. Fetch info and try to send | ||
786 | UserAgentData data = m_initialScene.CommsManager.UserService.GetAgentByUUID(exfriendID); | ||
787 | |||
788 | if (null == data) | ||
789 | break; | ||
790 | |||
791 | if (!data.AgentOnline) | ||
792 | { | ||
793 | m_log.DebugFormat("[FRIEND]: {0} is offline, so not sending TerminateFriend", exfriendID); | ||
794 | break; // if ex-friend isn't online, we don't need to send | ||
795 | } | ||
796 | 458 | ||
797 | m_log.DebugFormat("[FRIEND]: Sending remote terminate friend {0} to agent {1}@{2}", | 459 | private void ForwardFriendshipOffer(UUID agentID, UUID friendID, GridInstantMessage im) |
798 | agentID, exfriendID, data.Handle); | 460 | { |
461 | // !!!!!!!! This is a hack so that we don't have to keep state (transactionID/imSessionID) | ||
462 | // We stick this agent's ID as imSession, so that it's directly available on the receiving end | ||
463 | im.imSessionID = im.fromAgentID; | ||
799 | 464 | ||
800 | // try to send to foreign region, retry if it fails (friend TPed away, for example) | 465 | // Try the local sim |
801 | if (TriggerTerminateFriend(data.Handle, exfriendID, agentID)) break; | 466 | if (LocalFriendshipOffered(friendID, im)) |
802 | } | 467 | return; |
803 | } | ||
804 | 468 | ||
805 | // clean up cache: FriendList is wrong now... | 469 | // The prospective friend is not here [as root]. Let's forward. |
806 | lock (m_friendLists) | 470 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); |
471 | PresenceInfo friendSession = PresenceInfo.GetOnlinePresence(friendSessions); | ||
472 | if (friendSession != null) | ||
807 | { | 473 | { |
808 | m_friendLists.Invalidate(agentID.ToString()); | 474 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); |
809 | m_friendLists.Invalidate(exfriendID.ToString()); | 475 | m_FriendsSimConnector.FriendshipOffered(region, agentID, friendID, im.message); |
810 | } | 476 | } |
477 | |||
478 | // If the prospective friend is not online, he'll get the message upon login. | ||
811 | } | 479 | } |
812 | 480 | ||
813 | #endregion | 481 | private void OnApproveFriendRequest(IClientAPI client, UUID agentID, UUID friendID, List<UUID> callingCardFolders) |
482 | { | ||
483 | FriendsService.StoreFriend(agentID, friendID.ToString(), 1); | ||
484 | FriendsService.StoreFriend(friendID, agentID.ToString(), 1); | ||
485 | // update the local cache | ||
486 | m_Friends[agentID].Friends = FriendsService.GetFriends(agentID); | ||
814 | 487 | ||
815 | #region CallingCards | 488 | m_log.DebugFormat("[FRIENDS]: {0} accepted friendship from {1}", agentID, friendID); |
816 | 489 | ||
817 | private void OnOfferCallingCard(IClientAPI client, UUID destID, UUID transactionID) | 490 | // |
818 | { | 491 | // Notify the friend |
819 | m_log.DebugFormat("[CALLING CARD]: got offer from {0} for {1}, transaction {2}", | 492 | // |
820 | client.AgentId, destID, transactionID); | 493 | |
821 | // This might be slightly wrong. On a multi-region server, we might get the child-agent instead of the root-agent | 494 | // Try Local |
822 | // (or the root instead of the child) | 495 | if (LocalFriendshipApproved(agentID, client.Name, friendID)) |
823 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | ||
824 | if (destAgent == null) | ||
825 | { | 496 | { |
826 | client.SendAlertMessage("The person you have offered a card to can't be found anymore."); | 497 | client.SendAgentOnline(new UUID[] { friendID }); |
827 | return; | 498 | return; |
828 | } | 499 | } |
829 | 500 | ||
830 | lock (m_pendingCallingcardRequests) | 501 | // The friend is not here |
502 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); | ||
503 | PresenceInfo friendSession = PresenceInfo.GetOnlinePresence(friendSessions); | ||
504 | if (friendSession != null) | ||
831 | { | 505 | { |
832 | m_pendingCallingcardRequests[transactionID] = client.AgentId; | 506 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); |
507 | m_FriendsSimConnector.FriendshipApproved(region, agentID, client.Name, friendID); | ||
508 | client.SendAgentOnline(new UUID[] { friendID }); | ||
833 | } | 509 | } |
834 | // inform the destination agent about the offer | ||
835 | destAgent.ControllingClient.SendOfferCallingCard(client.AgentId, transactionID); | ||
836 | } | ||
837 | 510 | ||
838 | private void CreateCallingCard(IClientAPI client, UUID creator, UUID folder, string name) | ||
839 | { | ||
840 | InventoryItemBase item = new InventoryItemBase(); | ||
841 | item.AssetID = UUID.Zero; | ||
842 | item.AssetType = (int)AssetType.CallingCard; | ||
843 | item.BasePermissions = (uint)PermissionMask.Copy; | ||
844 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
845 | item.CreatorId = creator.ToString(); | ||
846 | item.CurrentPermissions = item.BasePermissions; | ||
847 | item.Description = ""; | ||
848 | item.EveryOnePermissions = (uint)PermissionMask.None; | ||
849 | item.Flags = 0; | ||
850 | item.Folder = folder; | ||
851 | item.GroupID = UUID.Zero; | ||
852 | item.GroupOwned = false; | ||
853 | item.ID = UUID.Random(); | ||
854 | item.InvType = (int)InventoryType.CallingCard; | ||
855 | item.Name = name; | ||
856 | item.NextPermissions = item.EveryOnePermissions; | ||
857 | item.Owner = client.AgentId; | ||
858 | item.SalePrice = 10; | ||
859 | item.SaleType = (byte)SaleType.Not; | ||
860 | ((Scene)client.Scene).AddInventoryItem(client, item); | ||
861 | } | 511 | } |
862 | 512 | ||
863 | private void OnAcceptCallingCard(IClientAPI client, UUID transactionID, UUID folderID) | 513 | private void OnDenyFriendRequest(IClientAPI client, UUID agentID, UUID friendID, List<UUID> callingCardFolders) |
864 | { | 514 | { |
865 | m_log.DebugFormat("[CALLING CARD]: User {0} ({1} {2}) accepted tid {3}, folder {4}", | 515 | m_log.DebugFormat("[FRIENDS]: {0} denied friendship to {1}", agentID, friendID); |
866 | client.AgentId, | ||
867 | client.FirstName, client.LastName, | ||
868 | transactionID, folderID); | ||
869 | UUID destID; | ||
870 | lock (m_pendingCallingcardRequests) | ||
871 | { | ||
872 | if (!m_pendingCallingcardRequests.TryGetValue(transactionID, out destID)) | ||
873 | { | ||
874 | m_log.WarnFormat("[CALLING CARD]: Got a AcceptCallingCard from {0} without an offer before.", | ||
875 | client.Name); | ||
876 | return; | ||
877 | } | ||
878 | // else found pending calling card request with that transaction. | ||
879 | m_pendingCallingcardRequests.Remove(transactionID); | ||
880 | } | ||
881 | 516 | ||
517 | FriendsService.Delete(agentID, friendID.ToString()); | ||
518 | FriendsService.Delete(friendID, agentID.ToString()); | ||
882 | 519 | ||
883 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | 520 | // |
884 | // inform sender of the card that destination declined the offer | 521 | // Notify the friend |
885 | if (destAgent != null) destAgent.ControllingClient.SendAcceptCallingCard(transactionID); | 522 | // |
886 | 523 | ||
887 | // put a calling card into the inventory of receiver | 524 | // Try local |
888 | CreateCallingCard(client, destID, folderID, destAgent.Name); | 525 | if (LocalFriendshipDenied(agentID, client.Name, friendID)) |
889 | } | 526 | return; |
890 | 527 | ||
891 | private void OnDeclineCallingCard(IClientAPI client, UUID transactionID) | 528 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); |
892 | { | 529 | PresenceInfo friendSession = PresenceInfo.GetOnlinePresence(friendSessions); |
893 | m_log.DebugFormat("[CALLING CARD]: User {0} (ID:{1}) declined card, tid {2}", | 530 | if (friendSession != null) |
894 | client.Name, client.AgentId, transactionID); | ||
895 | UUID destID; | ||
896 | lock (m_pendingCallingcardRequests) | ||
897 | { | 531 | { |
898 | if (!m_pendingCallingcardRequests.TryGetValue(transactionID, out destID)) | 532 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); |
899 | { | 533 | m_FriendsSimConnector.FriendshipDenied(region, agentID, client.Name, friendID); |
900 | m_log.WarnFormat("[CALLING CARD]: Got a AcceptCallingCard from {0} without an offer before.", | ||
901 | client.Name); | ||
902 | return; | ||
903 | } | ||
904 | // else found pending calling card request with that transaction. | ||
905 | m_pendingCallingcardRequests.Remove(transactionID); | ||
906 | } | 534 | } |
907 | |||
908 | ScenePresence destAgent = GetAnyPresenceFromAgentID(destID); | ||
909 | // inform sender of the card that destination declined the offer | ||
910 | if (destAgent != null) destAgent.ControllingClient.SendDeclineCallingCard(transactionID); | ||
911 | } | 535 | } |
912 | 536 | ||
913 | /// <summary> | 537 | private void OnTerminateFriendship(IClientAPI client, UUID agentID, UUID exfriendID) |
914 | /// Send presence information about a client to other clients in both this region and others. | ||
915 | /// </summary> | ||
916 | /// <param name="client"></param> | ||
917 | /// <param name="friendList"></param> | ||
918 | /// <param name="iAmOnline"></param> | ||
919 | private void SendPresenceState(IClientAPI client, List<FriendListItem> friendList, bool iAmOnline) | ||
920 | { | 538 | { |
921 | //m_log.DebugFormat("[FRIEND]: {0} logged {1}; sending presence updates", client.Name, iAmOnline ? "in" : "out"); | 539 | FriendsService.Delete(agentID, exfriendID.ToString()); |
540 | FriendsService.Delete(exfriendID, agentID.ToString()); | ||
922 | 541 | ||
923 | if (friendList == null || friendList.Count == 0) | 542 | // Update local cache |
924 | { | 543 | m_Friends[agentID].Friends = FriendsService.GetFriends(agentID); |
925 | //m_log.DebugFormat("[FRIEND]: {0} doesn't have friends.", client.Name); | ||
926 | return; // nothing we can do if she doesn't have friends... | ||
927 | } | ||
928 | 544 | ||
929 | // collect sets of friendIDs; to send to (online and offline), and to receive from | 545 | client.SendTerminateFriend(exfriendID); |
930 | // TODO: If we ever switch to .NET >= 3, replace those Lists with HashSets. | ||
931 | // I can't believe that we have Dictionaries, but no Sets, considering Java introduced them years ago... | ||
932 | List<UUID> friendIDsToSendTo = new List<UUID>(); | ||
933 | List<UUID> candidateFriendIDsToReceive = new List<UUID>(); | ||
934 | |||
935 | foreach (FriendListItem item in friendList) | ||
936 | { | ||
937 | if (((item.FriendListOwnerPerms | item.FriendPerms) & (uint)FriendRights.CanSeeOnline) != 0) | ||
938 | { | ||
939 | // friend is allowed to see my presence => add | ||
940 | if ((item.FriendListOwnerPerms & (uint)FriendRights.CanSeeOnline) != 0) | ||
941 | friendIDsToSendTo.Add(item.Friend); | ||
942 | 546 | ||
943 | if ((item.FriendPerms & (uint)FriendRights.CanSeeOnline) != 0) | 547 | // |
944 | candidateFriendIDsToReceive.Add(item.Friend); | 548 | // Notify the friend |
945 | } | 549 | // |
946 | } | ||
947 | 550 | ||
948 | // we now have a list of "interesting" friends (which we have to find out on-/offline state for), | 551 | // Try local |
949 | // friends we want to send our online state to (if *they* are online, too), and | 552 | if (LocalFriendshipTerminated(exfriendID)) |
950 | // friends we want to receive online state for (currently unknown whether online or not) | 553 | return; |
951 | 554 | ||
952 | // as this processing might take some time and friends might TP away, we try up to three times to | 555 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { exfriendID.ToString() }); |
953 | // reach them. Most of the time, we *will* reach them, and this loop won't loop | 556 | PresenceInfo friendSession = PresenceInfo.GetOnlinePresence(friendSessions); |
954 | int retry = 0; | 557 | if (friendSession != null) |
955 | do | ||
956 | { | 558 | { |
957 | // build a list of friends to look up region-information and on-/offline-state for | 559 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); |
958 | List<UUID> friendIDsToLookup = new List<UUID>(friendIDsToSendTo); | 560 | m_FriendsSimConnector.FriendshipTerminated(region, agentID, exfriendID); |
959 | foreach (UUID uuid in candidateFriendIDsToReceive) | 561 | } |
960 | { | 562 | } |
961 | if (!friendIDsToLookup.Contains(uuid)) friendIDsToLookup.Add(uuid); | ||
962 | } | ||
963 | 563 | ||
964 | m_log.DebugFormat( | 564 | private void OnGrantUserRights(IClientAPI remoteClient, UUID requester, UUID target, int rights) |
965 | "[FRIEND]: {0} to lookup, {1} to send to, {2} candidates to receive from for agent {3}", | 565 | { |
966 | friendIDsToLookup.Count, friendIDsToSendTo.Count, candidateFriendIDsToReceive.Count, client.Name); | 566 | if (!m_Friends.ContainsKey(remoteClient.AgentId)) |
567 | return; | ||
967 | 568 | ||
968 | // we have to fetch FriendRegionInfos, as the (cached) FriendListItems don't | 569 | UserFriendData fd = m_Friends[remoteClient.AgentId]; |
969 | // necessarily contain the correct online state... | ||
970 | Dictionary<UUID, FriendRegionInfo> friendRegions = m_initialScene.GetFriendRegionInfos(friendIDsToLookup); | ||
971 | m_log.DebugFormat( | ||
972 | "[FRIEND]: Found {0} regionInfos for {1} friends of {2}", | ||
973 | friendRegions.Count, friendIDsToLookup.Count, client.Name); | ||
974 | 570 | ||
975 | // argument for SendAgentOn/Offline; we shouldn't generate that repeatedly within loops. | 571 | FriendsService.StoreFriend(requester, target.ToString(), rights); |
976 | UUID[] agentArr = new UUID[] { client.AgentId }; | ||
977 | 572 | ||
978 | // first, send to friend presence state to me, if I'm online... | 573 | foreach (FriendInfo fi in fd.Friends) |
979 | if (iAmOnline) | 574 | { |
575 | if (fi.Friend == target.ToString()) | ||
980 | { | 576 | { |
981 | List<UUID> friendIDsToReceive = new List<UUID>(); | 577 | IClientAPI friendClient = LocateClientObject(target); |
982 | |||
983 | for (int i = candidateFriendIDsToReceive.Count - 1; i >= 0; --i) | ||
984 | { | ||
985 | UUID uuid = candidateFriendIDsToReceive[i]; | ||
986 | FriendRegionInfo info; | ||
987 | if (friendRegions.TryGetValue(uuid, out info) && info != null && info.isOnline) | ||
988 | { | ||
989 | friendIDsToReceive.Add(uuid); | ||
990 | } | ||
991 | } | ||
992 | |||
993 | m_log.DebugFormat( | ||
994 | "[FRIEND]: Sending {0} online friends to {1}", friendIDsToReceive.Count, client.Name); | ||
995 | |||
996 | if (friendIDsToReceive.Count > 0) | ||
997 | client.SendAgentOnline(friendIDsToReceive.ToArray()); | ||
998 | |||
999 | // clear them for a possible second iteration; we don't have to repeat this | ||
1000 | candidateFriendIDsToReceive.Clear(); | ||
1001 | } | ||
1002 | 578 | ||
1003 | // now, send my presence state to my friends | 579 | int delta = rights ^ fi.MyFlags; |
1004 | for (int i = friendIDsToSendTo.Count - 1; i >= 0; --i) | 580 | if ((delta & ~1) != 0) |
1005 | { | ||
1006 | UUID uuid = friendIDsToSendTo[i]; | ||
1007 | FriendRegionInfo info; | ||
1008 | if (friendRegions.TryGetValue(uuid, out info) && info != null && info.isOnline) | ||
1009 | { | 581 | { |
1010 | // any client is good enough, root or child... | 582 | remoteClient.SendChangeUserRights(remoteClient.AgentId, target, rights & ~1); |
1011 | ScenePresence agent = GetAnyPresenceFromAgentID(uuid); | 583 | // |
1012 | if (agent != null) | 584 | // Notify the friend |
1013 | { | 585 | // |
1014 | //m_log.DebugFormat("[FRIEND]: Found local agent {0}", agent.Name); | ||
1015 | |||
1016 | // friend is online and on this server... | ||
1017 | if (iAmOnline) agent.ControllingClient.SendAgentOnline(agentArr); | ||
1018 | else agent.ControllingClient.SendAgentOffline(agentArr); | ||
1019 | 586 | ||
1020 | // done, remove it | 587 | if (friendClient != null) |
1021 | friendIDsToSendTo.RemoveAt(i); | 588 | { |
589 | friendClient.SendChangeUserRights(target, remoteClient.AgentId, rights & ~1); | ||
1022 | } | 590 | } |
1023 | } | 591 | } |
1024 | else | 592 | if ((delta & 1) != 0) |
1025 | { | ||
1026 | //m_log.DebugFormat("[FRIEND]: Friend {0} ({1}) is offline; not sending.", uuid, i); | ||
1027 | |||
1028 | // friend is offline => no need to try sending | ||
1029 | friendIDsToSendTo.RemoveAt(i); | ||
1030 | } | ||
1031 | } | ||
1032 | |||
1033 | m_log.DebugFormat("[FRIEND]: Have {0} friends to contact via inter-region comms.", friendIDsToSendTo.Count); | ||
1034 | |||
1035 | // we now have all the friends left that are online (we think), but not on this region-server | ||
1036 | if (friendIDsToSendTo.Count > 0) | ||
1037 | { | ||
1038 | // sort them into regions | ||
1039 | Dictionary<ulong, List<UUID>> friendsInRegion = new Dictionary<ulong,List<UUID>>(); | ||
1040 | foreach (UUID uuid in friendIDsToSendTo) | ||
1041 | { | 593 | { |
1042 | ulong handle = friendRegions[uuid].regionHandle; // this can't fail as we filtered above already | 594 | if (friendClient != null) |
1043 | List<UUID> friends; | ||
1044 | if (!friendsInRegion.TryGetValue(handle, out friends)) | ||
1045 | { | 595 | { |
1046 | friends = new List<UUID>(); | 596 | if ((rights & 1) != 0) |
1047 | friendsInRegion[handle] = friends; | 597 | friendClient.SendAgentOnline(new UUID[] { new UUID(remoteClient.AgentId) } ); |
598 | else | ||
599 | friendClient.SendAgentOffline(new UUID[] { new UUID(remoteClient.AgentId) } ); | ||
1048 | } | 600 | } |
1049 | friends.Add(uuid); | ||
1050 | } | ||
1051 | m_log.DebugFormat("[FRIEND]: Found {0} regions to send to.", friendRegions.Count); | ||
1052 | |||
1053 | // clear uuids list and collect missed friends in it for the next retry | ||
1054 | friendIDsToSendTo.Clear(); | ||
1055 | |||
1056 | // send bulk updates to the region | ||
1057 | foreach (KeyValuePair<ulong, List<UUID>> pair in friendsInRegion) | ||
1058 | { | ||
1059 | //m_log.DebugFormat("[FRIEND]: Inform {0} friends in region {1} that user {2} is {3}line", | ||
1060 | // pair.Value.Count, pair.Key, client.Name, iAmOnline ? "on" : "off"); | ||
1061 | |||
1062 | friendIDsToSendTo.AddRange(InformFriendsInOtherRegion(client.AgentId, pair.Key, pair.Value, iAmOnline)); | ||
1063 | } | 601 | } |
602 | if (friendClient != null) // Local, we're done | ||
603 | return; | ||
1064 | } | 604 | } |
1065 | // now we have in friendIDsToSendTo only the agents left that TPed away while we tried to contact them. | ||
1066 | // In most cases, it will be empty, and it won't loop here. But sometimes, we have to work harder and try again... | ||
1067 | } | 605 | } |
1068 | while (++retry < 3 && friendIDsToSendTo.Count > 0); | ||
1069 | } | ||
1070 | 606 | ||
1071 | private void OnEconomyDataRequest(UUID agentID) | 607 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { target.ToString() }); |
1072 | { | 608 | PresenceInfo friendSession = PresenceInfo.GetOnlinePresence(friendSessions); |
1073 | // KLUDGE: This is the only way I found to get a message (only) after login was completed and the | 609 | if (friendSession != null) |
1074 | // client is connected enough to receive UDP packets). | ||
1075 | // This packet seems to be sent only once, just after connection was established to the first | ||
1076 | // region after login. | ||
1077 | // We use it here to trigger a presence update; the old update-on-login was never be heard by | ||
1078 | // the freshly logged in viewer, as it wasn't connected to the region at that time. | ||
1079 | // TODO: Feel free to replace this by a better solution if you find one. | ||
1080 | |||
1081 | // get the agent. This should work every time, as we just got a packet from it | ||
1082 | //ScenePresence agent = GetRootPresenceFromAgentID(agentID); | ||
1083 | // KLUDGE 2: As this is sent quite early, the avatar isn't here as root agent yet. So, we have to cheat a bit | ||
1084 | ScenePresence agent = GetAnyPresenceFromAgentID(agentID); | ||
1085 | |||
1086 | // just to be paranoid... | ||
1087 | if (agent == null) | ||
1088 | { | 610 | { |
1089 | m_log.ErrorFormat("[FRIEND]: Got a packet from agent {0} who can't be found anymore!?", agentID); | 611 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); |
1090 | return; | 612 | // TODO: You might want to send the delta to save the lookup |
613 | // on the other end!! | ||
614 | m_FriendsSimConnector.GrantRights(region, requester, target); | ||
1091 | } | 615 | } |
616 | } | ||
617 | |||
618 | #region Local | ||
1092 | 619 | ||
1093 | List<FriendListItem> fl; | 620 | public bool LocalFriendshipOffered(UUID toID, GridInstantMessage im) |
1094 | lock (m_friendLists) | 621 | { |
622 | IClientAPI friendClient = LocateClientObject(toID); | ||
623 | if (friendClient != null) | ||
1095 | { | 624 | { |
1096 | fl = (List<FriendListItem>)m_friendLists.Get(agent.ControllingClient.AgentId.ToString(), | 625 | // the prospective friend in this sim as root agent |
1097 | m_initialScene.GetFriendList); | 626 | friendClient.SendInstantMessage(im); |
627 | // we're done | ||
628 | return true; | ||
1098 | } | 629 | } |
1099 | 630 | return false; | |
1100 | // tell everyone that we are online | ||
1101 | SendPresenceState(agent.ControllingClient, fl, true); | ||
1102 | } | 631 | } |
1103 | 632 | ||
1104 | private void OnLogout(IClientAPI remoteClient) | 633 | public bool LocalFriendshipApproved(UUID userID, string userName, UUID friendID) |
1105 | { | 634 | { |
1106 | List<FriendListItem> fl; | 635 | IClientAPI friendClient = LocateClientObject(friendID); |
1107 | lock (m_friendLists) | 636 | if (friendClient != null) |
1108 | { | 637 | { |
1109 | fl = (List<FriendListItem>)m_friendLists.Get(remoteClient.AgentId.ToString(), | 638 | // the prospective friend in this sim as root agent |
1110 | m_initialScene.GetFriendList); | 639 | GridInstantMessage im = new GridInstantMessage(Scene, userID, userName, friendID, |
640 | (byte)OpenMetaverse.InstantMessageDialog.FriendshipAccepted, userID.ToString(), false, Vector3.Zero); | ||
641 | friendClient.SendInstantMessage(im); | ||
642 | // update the local cache | ||
643 | m_Friends[friendID].Friends = FriendsService.GetFriends(friendID); | ||
644 | // we're done | ||
645 | return true; | ||
1111 | } | 646 | } |
1112 | 647 | ||
1113 | // tell everyone that we are offline | 648 | return false; |
1114 | SendPresenceState(remoteClient, fl, false); | ||
1115 | } | 649 | } |
1116 | private void GrantUserFriendRights(IClientAPI remoteClient, UUID requester, UUID target, int rights) | 650 | |
651 | public bool LocalFriendshipDenied(UUID userID, string userName, UUID friendID) | ||
1117 | { | 652 | { |
1118 | ((Scene)remoteClient.Scene).CommsManager.UpdateUserFriendPerms(requester, target, (uint)rights); | 653 | IClientAPI friendClient = LocateClientObject(friendID); |
654 | if (friendClient != null) | ||
655 | { | ||
656 | // the prospective friend in this sim as root agent | ||
657 | |||
658 | GridInstantMessage im = new GridInstantMessage(Scene, userID, userName, friendID, | ||
659 | (byte)OpenMetaverse.InstantMessageDialog.FriendshipDeclined, userID.ToString(), false, Vector3.Zero); | ||
660 | friendClient.SendInstantMessage(im); | ||
661 | // we're done | ||
662 | return true; | ||
663 | } | ||
664 | |||
665 | return false; | ||
1119 | } | 666 | } |
1120 | public void FindAgent(IClientAPI remoteClient, UUID hunter, UUID target) | 667 | |
668 | public bool LocalFriendshipTerminated(UUID exfriendID) | ||
1121 | { | 669 | { |
1122 | List<FriendListItem> friendList = GetUserFriends(hunter); | 670 | IClientAPI friendClient = LocateClientObject(exfriendID); |
1123 | foreach (FriendListItem item in friendList) | 671 | if (friendClient != null) |
1124 | { | 672 | { |
1125 | if (item.onlinestatus == true) | 673 | // the friend in this sim as root agent |
1126 | { | 674 | friendClient.SendTerminateFriend(exfriendID); |
1127 | if (item.Friend == target && (item.FriendPerms & (uint)FriendRights.CanSeeOnMap) != 0) | 675 | // update local cache |
1128 | { | 676 | m_Friends[exfriendID].Friends = FriendsService.GetFriends(exfriendID); |
1129 | ScenePresence SPTarget = ((Scene)remoteClient.Scene).GetScenePresence(target); | 677 | // we're done |
1130 | string regionname = SPTarget.Scene.RegionInfo.RegionName; | 678 | return true; |
1131 | remoteClient.SendScriptTeleportRequest("FindAgent", regionname,new Vector3(SPTarget.AbsolutePosition),new Vector3(SPTarget.Lookat)); | ||
1132 | } | ||
1133 | } | ||
1134 | else | ||
1135 | { | ||
1136 | remoteClient.SendAgentAlertMessage("The agent you are looking for is not online.", false); | ||
1137 | } | ||
1138 | } | 679 | } |
680 | |||
681 | return false; | ||
682 | } | ||
683 | |||
684 | public bool LocalGrantRights() | ||
685 | { | ||
686 | // TODO | ||
687 | return true; | ||
1139 | } | 688 | } |
1140 | 689 | ||
1141 | public List<FriendListItem> GetUserFriends(UUID agentID) | 690 | public bool LocalStatusNotification(UUID userID, UUID friendID, bool online) |
1142 | { | 691 | { |
1143 | List<FriendListItem> fl; | 692 | IClientAPI friendClient = LocateClientObject(friendID); |
1144 | lock (m_friendLists) | 693 | if (friendClient != null) |
1145 | { | 694 | { |
1146 | fl = (List<FriendListItem>)m_friendLists.Get(agentID.ToString(), | 695 | //m_log.DebugFormat("[FRIENDS]: Notify {0} that user {1} is {2}", friend.Friend, userID, online); |
1147 | m_initialScene.GetFriendList); | 696 | // the friend in this sim as root agent |
697 | if (online) | ||
698 | friendClient.SendAgentOnline(new UUID[] { userID }); | ||
699 | else | ||
700 | friendClient.SendAgentOffline(new UUID[] { userID }); | ||
701 | // we're done | ||
702 | return true; | ||
1148 | } | 703 | } |
1149 | 704 | ||
1150 | return fl; | 705 | return false; |
1151 | } | 706 | } |
707 | #endregion | ||
708 | |||
1152 | } | 709 | } |
1153 | #endregion | ||
1154 | } | 710 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs new file mode 100644 index 0000000..e7b74a9 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs | |||
@@ -0,0 +1,285 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.IO; | ||
31 | using System.Reflection; | ||
32 | using System.Xml; | ||
33 | |||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Server.Base; | ||
36 | using OpenSim.Framework.Servers.HttpServer; | ||
37 | |||
38 | using OpenMetaverse; | ||
39 | using log4net; | ||
40 | |||
41 | namespace OpenSim.Region.CoreModules.Avatar.Friends | ||
42 | { | ||
43 | public class FriendsRequestHandler : BaseStreamHandler | ||
44 | { | ||
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | |||
47 | private FriendsModule m_FriendsModule; | ||
48 | |||
49 | public FriendsRequestHandler(FriendsModule fmodule) | ||
50 | : base("POST", "/friends") | ||
51 | { | ||
52 | m_FriendsModule = fmodule; | ||
53 | } | ||
54 | |||
55 | public override byte[] Handle(string path, Stream requestData, | ||
56 | OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
57 | { | ||
58 | StreamReader sr = new StreamReader(requestData); | ||
59 | string body = sr.ReadToEnd(); | ||
60 | sr.Close(); | ||
61 | body = body.Trim(); | ||
62 | |||
63 | m_log.DebugFormat("[XXX]: query String: {0}", body); | ||
64 | |||
65 | try | ||
66 | { | ||
67 | Dictionary<string, object> request = | ||
68 | ServerUtils.ParseQueryString(body); | ||
69 | |||
70 | if (!request.ContainsKey("METHOD")) | ||
71 | return FailureResult(); | ||
72 | |||
73 | string method = request["METHOD"].ToString(); | ||
74 | request.Remove("METHOD"); | ||
75 | |||
76 | switch (method) | ||
77 | { | ||
78 | case "friendship_offered": | ||
79 | return FriendshipOffered(request); | ||
80 | case "friendship_approved": | ||
81 | return FriendshipApproved(request); | ||
82 | case "friendship_denied": | ||
83 | return FriendshipDenied(request); | ||
84 | case "friendship_terminated": | ||
85 | return FriendshipTerminated(request); | ||
86 | case "grant_rights": | ||
87 | return GrantRights(request); | ||
88 | case "status": | ||
89 | return StatusNotification(request); | ||
90 | } | ||
91 | } | ||
92 | catch (Exception e) | ||
93 | { | ||
94 | m_log.Debug("[FRIENDS]: Exception {0}" + e.ToString()); | ||
95 | } | ||
96 | |||
97 | return FailureResult(); | ||
98 | } | ||
99 | |||
100 | byte[] FriendshipOffered(Dictionary<string, object> request) | ||
101 | { | ||
102 | UUID fromID = UUID.Zero; | ||
103 | UUID toID = UUID.Zero; | ||
104 | string message = string.Empty; | ||
105 | |||
106 | if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID")) | ||
107 | return FailureResult(); | ||
108 | |||
109 | message = request["Message"].ToString(); | ||
110 | |||
111 | if (!UUID.TryParse(request["FromID"].ToString(), out fromID)) | ||
112 | return FailureResult(); | ||
113 | |||
114 | if (!UUID.TryParse(request["ToID"].ToString(), out toID)) | ||
115 | return FailureResult(); | ||
116 | |||
117 | GridInstantMessage im = new GridInstantMessage(m_FriendsModule.Scene, fromID, "", toID, | ||
118 | (byte)InstantMessageDialog.FriendshipOffered, message, false, Vector3.Zero); | ||
119 | |||
120 | if (m_FriendsModule.LocalFriendshipOffered(toID, im)) | ||
121 | return SuccessResult(); | ||
122 | |||
123 | return FailureResult(); | ||
124 | } | ||
125 | |||
126 | byte[] FriendshipApproved(Dictionary<string, object> request) | ||
127 | { | ||
128 | UUID fromID = UUID.Zero; | ||
129 | UUID toID = UUID.Zero; | ||
130 | string fromName = string.Empty; | ||
131 | |||
132 | if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID")) | ||
133 | return FailureResult(); | ||
134 | |||
135 | if (!UUID.TryParse(request["FromID"].ToString(), out fromID)) | ||
136 | return FailureResult(); | ||
137 | |||
138 | if (!UUID.TryParse(request["ToID"].ToString(), out toID)) | ||
139 | return FailureResult(); | ||
140 | |||
141 | if (request.ContainsKey("FromName")) | ||
142 | fromName = request["FromName"].ToString(); | ||
143 | |||
144 | if (m_FriendsModule.LocalFriendshipApproved(fromID, fromName, toID)) | ||
145 | return SuccessResult(); | ||
146 | |||
147 | return FailureResult(); | ||
148 | } | ||
149 | |||
150 | byte[] FriendshipDenied(Dictionary<string, object> request) | ||
151 | { | ||
152 | UUID fromID = UUID.Zero; | ||
153 | UUID toID = UUID.Zero; | ||
154 | string fromName = string.Empty; | ||
155 | |||
156 | if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID")) | ||
157 | return FailureResult(); | ||
158 | |||
159 | if (!UUID.TryParse(request["FromID"].ToString(), out fromID)) | ||
160 | return FailureResult(); | ||
161 | |||
162 | if (!UUID.TryParse(request["ToID"].ToString(), out toID)) | ||
163 | return FailureResult(); | ||
164 | |||
165 | if (request.ContainsKey("FromName")) | ||
166 | fromName = request["FromName"].ToString(); | ||
167 | |||
168 | if (m_FriendsModule.LocalFriendshipDenied(fromID, fromName, toID)) | ||
169 | return SuccessResult(); | ||
170 | |||
171 | return FailureResult(); | ||
172 | } | ||
173 | |||
174 | byte[] FriendshipTerminated(Dictionary<string, object> request) | ||
175 | { | ||
176 | UUID fromID = UUID.Zero; | ||
177 | UUID toID = UUID.Zero; | ||
178 | |||
179 | if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID")) | ||
180 | return FailureResult(); | ||
181 | |||
182 | if (!UUID.TryParse(request["FromID"].ToString(), out fromID)) | ||
183 | return FailureResult(); | ||
184 | |||
185 | if (!UUID.TryParse(request["ToID"].ToString(), out toID)) | ||
186 | return FailureResult(); | ||
187 | |||
188 | if (m_FriendsModule.LocalFriendshipTerminated(toID)) | ||
189 | return SuccessResult(); | ||
190 | |||
191 | return FailureResult(); | ||
192 | } | ||
193 | |||
194 | byte[] GrantRights(Dictionary<string, object> request) | ||
195 | { | ||
196 | UUID fromID = UUID.Zero; | ||
197 | UUID toID = UUID.Zero; | ||
198 | |||
199 | if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID")) | ||
200 | return FailureResult(); | ||
201 | |||
202 | if (!UUID.TryParse(request["FromID"].ToString(), out fromID)) | ||
203 | return FailureResult(); | ||
204 | |||
205 | if (!UUID.TryParse(request["ToID"].ToString(), out toID)) | ||
206 | return FailureResult(); | ||
207 | |||
208 | if (m_FriendsModule.LocalGrantRights(/* ??? */)) | ||
209 | return SuccessResult(); | ||
210 | |||
211 | return FailureResult(); | ||
212 | } | ||
213 | |||
214 | byte[] StatusNotification(Dictionary<string, object> request) | ||
215 | { | ||
216 | UUID fromID = UUID.Zero; | ||
217 | UUID toID = UUID.Zero; | ||
218 | bool online = false; | ||
219 | |||
220 | if (!request.ContainsKey("FromID") || !request.ContainsKey("ToID") || !request.ContainsKey("Online")) | ||
221 | return FailureResult(); | ||
222 | |||
223 | if (!UUID.TryParse(request["FromID"].ToString(), out fromID)) | ||
224 | return FailureResult(); | ||
225 | |||
226 | if (!UUID.TryParse(request["ToID"].ToString(), out toID)) | ||
227 | return FailureResult(); | ||
228 | |||
229 | if (!Boolean.TryParse(request["Online"].ToString(), out online)) | ||
230 | return FailureResult(); | ||
231 | |||
232 | if (m_FriendsModule.LocalStatusNotification(fromID, toID, online)) | ||
233 | return SuccessResult(); | ||
234 | |||
235 | return FailureResult(); | ||
236 | } | ||
237 | |||
238 | #region Misc | ||
239 | |||
240 | private byte[] FailureResult() | ||
241 | { | ||
242 | return BoolResult(false); | ||
243 | } | ||
244 | |||
245 | private byte[] SuccessResult() | ||
246 | { | ||
247 | return BoolResult(true); | ||
248 | } | ||
249 | |||
250 | private byte[] BoolResult(bool value) | ||
251 | { | ||
252 | XmlDocument doc = new XmlDocument(); | ||
253 | |||
254 | XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration, | ||
255 | "", ""); | ||
256 | |||
257 | doc.AppendChild(xmlnode); | ||
258 | |||
259 | XmlElement rootElement = doc.CreateElement("", "ServerResponse", | ||
260 | ""); | ||
261 | |||
262 | doc.AppendChild(rootElement); | ||
263 | |||
264 | XmlElement result = doc.CreateElement("", "RESULT", ""); | ||
265 | result.AppendChild(doc.CreateTextNode(value.ToString())); | ||
266 | |||
267 | rootElement.AppendChild(result); | ||
268 | |||
269 | return DocToBytes(doc); | ||
270 | } | ||
271 | |||
272 | private byte[] DocToBytes(XmlDocument doc) | ||
273 | { | ||
274 | MemoryStream ms = new MemoryStream(); | ||
275 | XmlTextWriter xw = new XmlTextWriter(ms, null); | ||
276 | xw.Formatting = Formatting.Indented; | ||
277 | doc.WriteTo(xw); | ||
278 | xw.Flush(); | ||
279 | |||
280 | return ms.ToArray(); | ||
281 | } | ||
282 | |||
283 | #endregion | ||
284 | } | ||
285 | } | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs index 8ce5092..7303fe7 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs | |||
@@ -30,7 +30,7 @@ using log4net; | |||
30 | using Nini.Config; | 30 | using Nini.Config; |
31 | using OpenMetaverse; | 31 | using OpenMetaverse; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Framework.Communications.Cache; | 33 | |
34 | using OpenSim.Region.Framework.Interfaces; | 34 | using OpenSim.Region.Framework.Interfaces; |
35 | using OpenSim.Region.Framework.Scenes; | 35 | using OpenSim.Region.Framework.Scenes; |
36 | using OpenSim.Services.Interfaces; | 36 | using OpenSim.Services.Interfaces; |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs index 9a68749..ab141eb 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/InstantMessageModule.cs | |||
@@ -24,6 +24,7 @@ | |||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | using System; | ||
27 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
28 | using System.Reflection; | 29 | using System.Reflection; |
29 | using log4net; | 30 | using log4net; |
@@ -36,9 +37,10 @@ using OpenSim.Region.Framework.Scenes; | |||
36 | 37 | ||
37 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | 38 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage |
38 | { | 39 | { |
39 | public class InstantMessageModule : IRegionModule | 40 | public class InstantMessageModule : ISharedRegionModule |
40 | { | 41 | { |
41 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 42 | private static readonly ILog m_log = LogManager.GetLogger( |
43 | MethodBase.GetCurrentMethod().DeclaringType); | ||
42 | 44 | ||
43 | /// <value> | 45 | /// <value> |
44 | /// Is this module enabled? | 46 | /// Is this module enabled? |
@@ -51,7 +53,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
51 | 53 | ||
52 | private IMessageTransferModule m_TransferModule = null; | 54 | private IMessageTransferModule m_TransferModule = null; |
53 | 55 | ||
54 | public void Initialise(Scene scene, IConfigSource config) | 56 | public void Initialise(IConfigSource config) |
55 | { | 57 | { |
56 | if (config.Configs["Messaging"] != null) | 58 | if (config.Configs["Messaging"] != null) |
57 | { | 59 | { |
@@ -62,6 +64,12 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
62 | } | 64 | } |
63 | 65 | ||
64 | m_enabled = true; | 66 | m_enabled = true; |
67 | } | ||
68 | |||
69 | public void AddRegion(Scene scene) | ||
70 | { | ||
71 | if (!m_enabled) | ||
72 | return; | ||
65 | 73 | ||
66 | lock (m_scenes) | 74 | lock (m_scenes) |
67 | { | 75 | { |
@@ -74,6 +82,39 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
74 | } | 82 | } |
75 | } | 83 | } |
76 | 84 | ||
85 | public void RegionLoaded(Scene scene) | ||
86 | { | ||
87 | if (!m_enabled) | ||
88 | return; | ||
89 | |||
90 | if (m_TransferModule == null) | ||
91 | { | ||
92 | m_TransferModule = | ||
93 | scene.RequestModuleInterface<IMessageTransferModule>(); | ||
94 | |||
95 | if (m_TransferModule == null) | ||
96 | { | ||
97 | m_log.Error("[INSTANT MESSAGE]: No message transfer module, IM will not work!"); | ||
98 | scene.EventManager.OnClientConnect -= OnClientConnect; | ||
99 | scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; | ||
100 | |||
101 | m_scenes.Clear(); | ||
102 | m_enabled = false; | ||
103 | } | ||
104 | } | ||
105 | } | ||
106 | |||
107 | public void RemoveRegion(Scene scene) | ||
108 | { | ||
109 | if (!m_enabled) | ||
110 | return; | ||
111 | |||
112 | lock (m_scenes) | ||
113 | { | ||
114 | m_scenes.Remove(scene); | ||
115 | } | ||
116 | } | ||
117 | |||
77 | void OnClientConnect(IClientCore client) | 118 | void OnClientConnect(IClientCore client) |
78 | { | 119 | { |
79 | IClientIM clientIM; | 120 | IClientIM clientIM; |
@@ -85,15 +126,6 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
85 | 126 | ||
86 | public void PostInitialise() | 127 | public void PostInitialise() |
87 | { | 128 | { |
88 | if (!m_enabled) | ||
89 | return; | ||
90 | |||
91 | m_TransferModule = | ||
92 | m_scenes[0].RequestModuleInterface<IMessageTransferModule>(); | ||
93 | |||
94 | if (m_TransferModule == null) | ||
95 | m_log.Error("[INSTANT MESSAGE]: No message transfer module, "+ | ||
96 | "IM will not work!"); | ||
97 | } | 129 | } |
98 | 130 | ||
99 | public void Close() | 131 | public void Close() |
@@ -105,9 +137,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
105 | get { return "InstantMessageModule"; } | 137 | get { return "InstantMessageModule"; } |
106 | } | 138 | } |
107 | 139 | ||
108 | public bool IsSharedModule | 140 | public Type ReplaceableInterface |
109 | { | 141 | { |
110 | get { return true; } | 142 | get { return null; } |
111 | } | 143 | } |
112 | 144 | ||
113 | #endregion | 145 | #endregion |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs index e5159b3..c0d3f31 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs | |||
@@ -37,21 +37,33 @@ using OpenSim.Framework; | |||
37 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
39 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 39 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
40 | using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo; | ||
41 | using OpenSim.Services.Interfaces; | ||
40 | 42 | ||
41 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | 43 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage |
42 | { | 44 | { |
43 | public class MessageTransferModule : IRegionModule, IMessageTransferModule | 45 | public class MessageTransferModule : ISharedRegionModule, IMessageTransferModule |
44 | { | 46 | { |
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
46 | 48 | ||
47 | // private bool m_Enabled = false; | 49 | private bool m_Enabled = false; |
48 | protected bool m_Gridmode = false; | ||
49 | protected List<Scene> m_Scenes = new List<Scene>(); | 50 | protected List<Scene> m_Scenes = new List<Scene>(); |
50 | protected Dictionary<UUID, ulong> m_UserRegionMap = new Dictionary<UUID, ulong>(); | 51 | protected Dictionary<UUID, UUID> m_UserRegionMap = new Dictionary<UUID, UUID>(); |
51 | 52 | ||
52 | public event UndeliveredMessage OnUndeliveredMessage; | 53 | public event UndeliveredMessage OnUndeliveredMessage; |
53 | 54 | ||
54 | public virtual void Initialise(Scene scene, IConfigSource config) | 55 | private IPresenceService m_PresenceService; |
56 | protected IPresenceService PresenceService | ||
57 | { | ||
58 | get | ||
59 | { | ||
60 | if (m_PresenceService == null) | ||
61 | m_PresenceService = m_Scenes[0].RequestModuleInterface<IPresenceService>(); | ||
62 | return m_PresenceService; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | public virtual void Initialise(IConfigSource config) | ||
55 | { | 67 | { |
56 | IConfig cnf = config.Configs["Messaging"]; | 68 | IConfig cnf = config.Configs["Messaging"]; |
57 | if (cnf != null && cnf.GetString( | 69 | if (cnf != null && cnf.GetString( |
@@ -62,20 +74,16 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
62 | return; | 74 | return; |
63 | } | 75 | } |
64 | 76 | ||
65 | cnf = config.Configs["Startup"]; | 77 | m_Enabled = true; |
66 | if (cnf != null) | 78 | } |
67 | m_Gridmode = cnf.GetBoolean("gridmode", false); | ||
68 | 79 | ||
69 | // m_Enabled = true; | 80 | public virtual void AddRegion(Scene scene) |
81 | { | ||
82 | if (!m_Enabled) | ||
83 | return; | ||
70 | 84 | ||
71 | lock (m_Scenes) | 85 | lock (m_Scenes) |
72 | { | 86 | { |
73 | if (m_Scenes.Count == 0) | ||
74 | { | ||
75 | MainServer.Instance.AddXmlRPCHandler( | ||
76 | "grid_instant_message", processXMLRPCGridInstantMessage); | ||
77 | } | ||
78 | |||
79 | m_log.Debug("[MESSAGE TRANSFER]: Message transfer module active"); | 87 | m_log.Debug("[MESSAGE TRANSFER]: Message transfer module active"); |
80 | scene.RegisterModuleInterface<IMessageTransferModule>(this); | 88 | scene.RegisterModuleInterface<IMessageTransferModule>(this); |
81 | m_Scenes.Add(scene); | 89 | m_Scenes.Add(scene); |
@@ -84,6 +92,26 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
84 | 92 | ||
85 | public virtual void PostInitialise() | 93 | public virtual void PostInitialise() |
86 | { | 94 | { |
95 | if (!m_Enabled) | ||
96 | return; | ||
97 | |||
98 | MainServer.Instance.AddXmlRPCHandler( | ||
99 | "grid_instant_message", processXMLRPCGridInstantMessage); | ||
100 | } | ||
101 | |||
102 | public virtual void RegionLoaded(Scene scene) | ||
103 | { | ||
104 | } | ||
105 | |||
106 | public virtual void RemoveRegion(Scene scene) | ||
107 | { | ||
108 | if (!m_Enabled) | ||
109 | return; | ||
110 | |||
111 | lock(m_Scenes) | ||
112 | { | ||
113 | m_Scenes.Remove(scene); | ||
114 | } | ||
87 | } | 115 | } |
88 | 116 | ||
89 | public virtual void Close() | 117 | public virtual void Close() |
@@ -95,9 +123,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
95 | get { return "MessageTransferModule"; } | 123 | get { return "MessageTransferModule"; } |
96 | } | 124 | } |
97 | 125 | ||
98 | public virtual bool IsSharedModule | 126 | public virtual Type ReplaceableInterface |
99 | { | 127 | { |
100 | get { return true; } | 128 | get { return null; } |
101 | } | 129 | } |
102 | 130 | ||
103 | public virtual void SendInstantMessage(GridInstantMessage im, MessageResultNotification result) | 131 | public virtual void SendInstantMessage(GridInstantMessage im, MessageResultNotification result) |
@@ -148,15 +176,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
148 | } | 176 | } |
149 | } | 177 | } |
150 | 178 | ||
151 | if (m_Gridmode) | 179 | SendGridInstantMessageViaXMLRPC(im, result); |
152 | { | ||
153 | //m_log.DebugFormat("[INSTANT MESSAGE]: Delivering via grid"); | ||
154 | // Still here, try send via Grid | ||
155 | SendGridInstantMessageViaXMLRPC(im, result); | ||
156 | return; | ||
157 | } | ||
158 | |||
159 | HandleUndeliveredMessage(im, result); | ||
160 | 180 | ||
161 | return; | 181 | return; |
162 | } | 182 | } |
@@ -409,7 +429,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
409 | /// <summary> | 429 | /// <summary> |
410 | /// delegate for sending a grid instant message asynchronously | 430 | /// delegate for sending a grid instant message asynchronously |
411 | /// </summary> | 431 | /// </summary> |
412 | public delegate void GridInstantMessageDelegate(GridInstantMessage im, MessageResultNotification result, ulong prevRegionHandle); | 432 | public delegate void GridInstantMessageDelegate(GridInstantMessage im, MessageResultNotification result, UUID prevRegionID); |
413 | 433 | ||
414 | protected virtual void GridInstantMessageCompleted(IAsyncResult iar) | 434 | protected virtual void GridInstantMessageCompleted(IAsyncResult iar) |
415 | { | 435 | { |
@@ -423,7 +443,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
423 | { | 443 | { |
424 | GridInstantMessageDelegate d = SendGridInstantMessageViaXMLRPCAsync; | 444 | GridInstantMessageDelegate d = SendGridInstantMessageViaXMLRPCAsync; |
425 | 445 | ||
426 | d.BeginInvoke(im, result, 0, GridInstantMessageCompleted, d); | 446 | d.BeginInvoke(im, result, UUID.Zero, GridInstantMessageCompleted, d); |
427 | } | 447 | } |
428 | 448 | ||
429 | /// <summary> | 449 | /// <summary> |
@@ -438,11 +458,11 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
438 | /// Pass in 0 the first time this method is called. It will be called recursively with the last | 458 | /// Pass in 0 the first time this method is called. It will be called recursively with the last |
439 | /// regionhandle tried | 459 | /// regionhandle tried |
440 | /// </param> | 460 | /// </param> |
441 | protected virtual void SendGridInstantMessageViaXMLRPCAsync(GridInstantMessage im, MessageResultNotification result, ulong prevRegionHandle) | 461 | protected virtual void SendGridInstantMessageViaXMLRPCAsync(GridInstantMessage im, MessageResultNotification result, UUID prevRegionID) |
442 | { | 462 | { |
443 | UUID toAgentID = new UUID(im.toAgentID); | 463 | UUID toAgentID = new UUID(im.toAgentID); |
444 | 464 | ||
445 | UserAgentData upd = null; | 465 | PresenceInfo upd = null; |
446 | 466 | ||
447 | bool lookupAgent = false; | 467 | bool lookupAgent = false; |
448 | 468 | ||
@@ -450,13 +470,13 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
450 | { | 470 | { |
451 | if (m_UserRegionMap.ContainsKey(toAgentID)) | 471 | if (m_UserRegionMap.ContainsKey(toAgentID)) |
452 | { | 472 | { |
453 | upd = new UserAgentData(); | 473 | upd = new PresenceInfo(); |
454 | upd.AgentOnline = true; | 474 | upd.Online = true; |
455 | upd.Handle = m_UserRegionMap[toAgentID]; | 475 | upd.RegionID = m_UserRegionMap[toAgentID]; |
456 | 476 | ||
457 | // We need to compare the current regionhandle with the previous region handle | 477 | // We need to compare the current regionhandle with the previous region handle |
458 | // or the recursive loop will never end because it will never try to lookup the agent again | 478 | // or the recursive loop will never end because it will never try to lookup the agent again |
459 | if (prevRegionHandle == upd.Handle) | 479 | if (prevRegionID == upd.RegionID) |
460 | { | 480 | { |
461 | lookupAgent = true; | 481 | lookupAgent = true; |
462 | } | 482 | } |
@@ -472,14 +492,23 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
472 | if (lookupAgent) | 492 | if (lookupAgent) |
473 | { | 493 | { |
474 | // Non-cached user agent lookup. | 494 | // Non-cached user agent lookup. |
475 | upd = m_Scenes[0].CommsManager.UserService.GetAgentByUUID(toAgentID); | 495 | PresenceInfo[] presences = PresenceService.GetAgents(new string[] { toAgentID.ToString() }); |
496 | if (presences != null) | ||
497 | { | ||
498 | foreach (PresenceInfo p in presences) | ||
499 | if (p.Online) | ||
500 | { | ||
501 | upd = presences[0]; | ||
502 | break; | ||
503 | } | ||
504 | } | ||
476 | 505 | ||
477 | if (upd != null) | 506 | if (upd != null) |
478 | { | 507 | { |
479 | // check if we've tried this before.. | 508 | // check if we've tried this before.. |
480 | // This is one way to end the recursive loop | 509 | // This is one way to end the recursive loop |
481 | // | 510 | // |
482 | if (upd.Handle == prevRegionHandle) | 511 | if (upd.RegionID == prevRegionID) |
483 | { | 512 | { |
484 | m_log.Error("[GRID INSTANT MESSAGE]: Unable to deliver an instant message"); | 513 | m_log.Error("[GRID INSTANT MESSAGE]: Unable to deliver an instant message"); |
485 | HandleUndeliveredMessage(im, result); | 514 | HandleUndeliveredMessage(im, result); |
@@ -496,12 +525,10 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
496 | 525 | ||
497 | if (upd != null) | 526 | if (upd != null) |
498 | { | 527 | { |
499 | if (upd.AgentOnline) | 528 | if (upd.Online) |
500 | { | 529 | { |
501 | uint x = 0, y = 0; | 530 | GridRegion reginfo = m_Scenes[0].GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, |
502 | Utils.LongToUInts(upd.Handle, out x, out y); | 531 | upd.RegionID); |
503 | GridRegion reginfo = m_Scenes[0].GridService.GetRegionByPosition(m_Scenes[0].RegionInfo.ScopeID, | ||
504 | (int)x, (int)y); | ||
505 | if (reginfo != null) | 532 | if (reginfo != null) |
506 | { | 533 | { |
507 | Hashtable msgdata = ConvertGridInstantMessageToXMLRPC(im); | 534 | Hashtable msgdata = ConvertGridInstantMessageToXMLRPC(im); |
@@ -517,11 +544,11 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
517 | { | 544 | { |
518 | if (m_UserRegionMap.ContainsKey(toAgentID)) | 545 | if (m_UserRegionMap.ContainsKey(toAgentID)) |
519 | { | 546 | { |
520 | m_UserRegionMap[toAgentID] = upd.Handle; | 547 | m_UserRegionMap[toAgentID] = upd.RegionID; |
521 | } | 548 | } |
522 | else | 549 | else |
523 | { | 550 | { |
524 | m_UserRegionMap.Add(toAgentID, upd.Handle); | 551 | m_UserRegionMap.Add(toAgentID, upd.RegionID); |
525 | } | 552 | } |
526 | } | 553 | } |
527 | result(true); | 554 | result(true); |
@@ -536,12 +563,12 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
536 | 563 | ||
537 | // This is recursive!!!!! | 564 | // This is recursive!!!!! |
538 | SendGridInstantMessageViaXMLRPCAsync(im, result, | 565 | SendGridInstantMessageViaXMLRPCAsync(im, result, |
539 | upd.Handle); | 566 | upd.RegionID); |
540 | } | 567 | } |
541 | } | 568 | } |
542 | else | 569 | else |
543 | { | 570 | { |
544 | m_log.WarnFormat("[GRID INSTANT MESSAGE]: Unable to find region {0}", upd.Handle); | 571 | m_log.WarnFormat("[GRID INSTANT MESSAGE]: Unable to find region {0}", upd.RegionID); |
545 | HandleUndeliveredMessage(im, result); | 572 | HandleUndeliveredMessage(im, result); |
546 | } | 573 | } |
547 | } | 574 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs index 2d4a635..24cbaeb 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs | |||
@@ -37,9 +37,9 @@ using OpenSim.Framework.Client; | |||
37 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
39 | 39 | ||
40 | namespace OpenSim.Region.CoreModules.Avatar.MuteList | 40 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage |
41 | { | 41 | { |
42 | public class MuteListModule : IRegionModule | 42 | public class MuteListModule : ISharedRegionModule |
43 | { | 43 | { |
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
45 | 45 | ||
@@ -47,11 +47,8 @@ namespace OpenSim.Region.CoreModules.Avatar.MuteList | |||
47 | private List<Scene> m_SceneList = new List<Scene>(); | 47 | private List<Scene> m_SceneList = new List<Scene>(); |
48 | private string m_RestURL = String.Empty; | 48 | private string m_RestURL = String.Empty; |
49 | 49 | ||
50 | public void Initialise(Scene scene, IConfigSource config) | 50 | public void Initialise(IConfigSource config) |
51 | { | 51 | { |
52 | if (!enabled) | ||
53 | return; | ||
54 | |||
55 | IConfig cnf = config.Configs["Messaging"]; | 52 | IConfig cnf = config.Configs["Messaging"]; |
56 | if (cnf == null) | 53 | if (cnf == null) |
57 | { | 54 | { |
@@ -59,39 +56,53 @@ namespace OpenSim.Region.CoreModules.Avatar.MuteList | |||
59 | return; | 56 | return; |
60 | } | 57 | } |
61 | 58 | ||
62 | if (cnf != null && cnf.GetString( | 59 | if (cnf != null && cnf.GetString("MuteListModule", "None") != |
63 | "MuteListModule", "None") != | ||
64 | "MuteListModule") | 60 | "MuteListModule") |
65 | { | 61 | { |
66 | enabled = false; | 62 | enabled = false; |
67 | return; | 63 | return; |
68 | } | 64 | } |
69 | 65 | ||
66 | m_RestURL = cnf.GetString("MuteListURL", ""); | ||
67 | if (m_RestURL == "") | ||
68 | { | ||
69 | m_log.Error("[MUTE LIST] Module was enabled, but no URL is given, disabling"); | ||
70 | enabled = false; | ||
71 | return; | ||
72 | } | ||
73 | } | ||
74 | |||
75 | public void AddRegion(Scene scene) | ||
76 | { | ||
77 | if (!enabled) | ||
78 | return; | ||
79 | |||
70 | lock (m_SceneList) | 80 | lock (m_SceneList) |
71 | { | 81 | { |
72 | if (m_SceneList.Count == 0) | 82 | m_SceneList.Add(scene); |
73 | { | ||
74 | m_RestURL = cnf.GetString("MuteListURL", ""); | ||
75 | if (m_RestURL == "") | ||
76 | { | ||
77 | m_log.Error("[MUTE LIST] Module was enabled, but no URL is given, disabling"); | ||
78 | enabled = false; | ||
79 | return; | ||
80 | } | ||
81 | } | ||
82 | if (!m_SceneList.Contains(scene)) | ||
83 | m_SceneList.Add(scene); | ||
84 | 83 | ||
85 | scene.EventManager.OnNewClient += OnNewClient; | 84 | scene.EventManager.OnNewClient += OnNewClient; |
86 | } | 85 | } |
87 | } | 86 | } |
88 | 87 | ||
89 | public void PostInitialise() | 88 | public void RegionLoaded(Scene scene) |
89 | { | ||
90 | } | ||
91 | |||
92 | public void RemoveRegion(Scene scene) | ||
90 | { | 93 | { |
91 | if (!enabled) | 94 | if (!enabled) |
92 | return; | 95 | return; |
93 | 96 | ||
94 | if (m_SceneList.Count == 0) | 97 | lock (m_SceneList) |
98 | { | ||
99 | m_SceneList.Remove(scene); | ||
100 | } | ||
101 | } | ||
102 | |||
103 | public void PostInitialise() | ||
104 | { | ||
105 | if (!enabled) | ||
95 | return; | 106 | return; |
96 | 107 | ||
97 | m_log.Debug("[MUTE LIST] Mute list enabled"); | 108 | m_log.Debug("[MUTE LIST] Mute list enabled"); |
@@ -102,26 +113,15 @@ namespace OpenSim.Region.CoreModules.Avatar.MuteList | |||
102 | get { return "MuteListModule"; } | 113 | get { return "MuteListModule"; } |
103 | } | 114 | } |
104 | 115 | ||
105 | public bool IsSharedModule | 116 | public Type ReplaceableInterface |
106 | { | 117 | { |
107 | get { return true; } | 118 | get { return null; } |
108 | } | 119 | } |
109 | 120 | ||
110 | public void Close() | 121 | public void Close() |
111 | { | 122 | { |
112 | } | 123 | } |
113 | 124 | ||
114 | // private IClientAPI FindClient(UUID agentID) | ||
115 | // { | ||
116 | // foreach (Scene s in m_SceneList) | ||
117 | // { | ||
118 | // ScenePresence presence = s.GetScenePresence(agentID); | ||
119 | // if (presence != null && !presence.IsChildAgent) | ||
120 | // return presence.ControllingClient; | ||
121 | // } | ||
122 | // return null; | ||
123 | // } | ||
124 | |||
125 | private void OnNewClient(IClientAPI client) | 125 | private void OnNewClient(IClientAPI client) |
126 | { | 126 | { |
127 | client.OnMuteListRequest += OnMuteListRequest; | 127 | client.OnMuteListRequest += OnMuteListRequest; |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs index ff38b6f..fdfcd10 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/OfflineMessageModule.cs | |||
@@ -40,82 +40,91 @@ using OpenSim.Region.Framework.Scenes; | |||
40 | 40 | ||
41 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | 41 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage |
42 | { | 42 | { |
43 | public class OfflineMessageModule : IRegionModule | 43 | public class OfflineMessageModule : ISharedRegionModule |
44 | { | 44 | { |
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
46 | 46 | ||
47 | private bool enabled = true; | 47 | private bool enabled = true; |
48 | private List<Scene> m_SceneList = new List<Scene>(); | 48 | private List<Scene> m_SceneList = new List<Scene>(); |
49 | private string m_RestURL = String.Empty; | 49 | private string m_RestURL = String.Empty; |
50 | IMessageTransferModule m_TransferModule = null; | ||
50 | private bool m_ForwardOfflineGroupMessages = true; | 51 | private bool m_ForwardOfflineGroupMessages = true; |
51 | 52 | ||
52 | public void Initialise(Scene scene, IConfigSource config) | 53 | public void Initialise(IConfigSource config) |
53 | { | 54 | { |
54 | if (!enabled) | ||
55 | return; | ||
56 | |||
57 | IConfig cnf = config.Configs["Messaging"]; | 55 | IConfig cnf = config.Configs["Messaging"]; |
58 | if (cnf == null) | 56 | if (cnf == null) |
59 | { | 57 | { |
60 | enabled = false; | 58 | enabled = false; |
61 | return; | 59 | return; |
62 | } | 60 | } |
63 | if (cnf != null && cnf.GetString( | 61 | if (cnf != null && cnf.GetString("OfflineMessageModule", "None") != |
64 | "OfflineMessageModule", "None") != | ||
65 | "OfflineMessageModule") | 62 | "OfflineMessageModule") |
66 | { | 63 | { |
67 | enabled = false; | 64 | enabled = false; |
68 | return; | 65 | return; |
69 | } | 66 | } |
70 | 67 | ||
71 | if (cnf != null) | 68 | m_RestURL = cnf.GetString("OfflineMessageURL", ""); |
72 | m_ForwardOfflineGroupMessages = cnf.GetBoolean("ForwardOfflineGroupMessages", m_ForwardOfflineGroupMessages); | 69 | if (m_RestURL == "") |
70 | { | ||
71 | m_log.Error("[OFFLINE MESSAGING] Module was enabled, but no URL is given, disabling"); | ||
72 | enabled = false; | ||
73 | return; | ||
74 | } | ||
75 | |||
76 | m_ForwardOfflineGroupMessages = cnf.GetBoolean("ForwardOfflineGroupMessages", m_ForwardOfflineGroupMessages); | ||
77 | } | ||
78 | |||
79 | public void AddRegion(Scene scene) | ||
80 | { | ||
81 | if (!enabled) | ||
82 | return; | ||
73 | 83 | ||
74 | lock (m_SceneList) | 84 | lock (m_SceneList) |
75 | { | 85 | { |
76 | if (m_SceneList.Count == 0) | 86 | m_SceneList.Add(scene); |
77 | { | ||
78 | m_RestURL = cnf.GetString("OfflineMessageURL", ""); | ||
79 | if (m_RestURL == "") | ||
80 | { | ||
81 | m_log.Error("[OFFLINE MESSAGING] Module was enabled, but no URL is given, disabling"); | ||
82 | enabled = false; | ||
83 | return; | ||
84 | } | ||
85 | } | ||
86 | if (!m_SceneList.Contains(scene)) | ||
87 | m_SceneList.Add(scene); | ||
88 | 87 | ||
89 | scene.EventManager.OnNewClient += OnNewClient; | 88 | scene.EventManager.OnNewClient += OnNewClient; |
90 | } | 89 | } |
91 | } | 90 | } |
92 | 91 | ||
93 | public void PostInitialise() | 92 | public void RegionLoaded(Scene scene) |
94 | { | 93 | { |
95 | if (!enabled) | 94 | if (!enabled) |
96 | return; | 95 | return; |
97 | 96 | ||
98 | if (m_SceneList.Count == 0) | 97 | if (m_TransferModule == null) |
99 | return; | ||
100 | |||
101 | IMessageTransferModule trans = m_SceneList[0].RequestModuleInterface<IMessageTransferModule>(); | ||
102 | if (trans == null) | ||
103 | { | 98 | { |
104 | enabled = false; | 99 | m_TransferModule = scene.RequestModuleInterface<IMessageTransferModule>(); |
105 | 100 | if (m_TransferModule == null) | |
106 | lock (m_SceneList) | ||
107 | { | 101 | { |
108 | foreach (Scene s in m_SceneList) | 102 | scene.EventManager.OnNewClient -= OnNewClient; |
109 | s.EventManager.OnNewClient -= OnNewClient; | ||
110 | 103 | ||
104 | enabled = false; | ||
111 | m_SceneList.Clear(); | 105 | m_SceneList.Clear(); |
106 | |||
107 | m_log.Error("[OFFLINE MESSAGING] No message transfer module is enabled. Diabling offline messages"); | ||
112 | } | 108 | } |
109 | m_TransferModule.OnUndeliveredMessage += UndeliveredMessage; | ||
110 | } | ||
111 | } | ||
113 | 112 | ||
114 | m_log.Error("[OFFLINE MESSAGING] No message transfer module is enabled. Diabling offline messages"); | 113 | public void RemoveRegion(Scene scene) |
114 | { | ||
115 | if (!enabled) | ||
115 | return; | 116 | return; |
117 | |||
118 | lock (m_SceneList) | ||
119 | { | ||
120 | m_SceneList.Remove(scene); | ||
116 | } | 121 | } |
122 | } | ||
117 | 123 | ||
118 | trans.OnUndeliveredMessage += UndeliveredMessage; | 124 | public void PostInitialise() |
125 | { | ||
126 | if (!enabled) | ||
127 | return; | ||
119 | 128 | ||
120 | m_log.Debug("[OFFLINE MESSAGING] Offline messages enabled"); | 129 | m_log.Debug("[OFFLINE MESSAGING] Offline messages enabled"); |
121 | } | 130 | } |
@@ -125,9 +134,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
125 | get { return "OfflineMessageModule"; } | 134 | get { return "OfflineMessageModule"; } |
126 | } | 135 | } |
127 | 136 | ||
128 | public bool IsSharedModule | 137 | public Type ReplaceableInterface |
129 | { | 138 | { |
130 | get { return true; } | 139 | get { return null; } |
131 | } | 140 | } |
132 | 141 | ||
133 | public void Close() | 142 | public void Close() |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs index f5ab454..bafad82 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs | |||
@@ -24,6 +24,7 @@ | |||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | using System; | ||
27 | using System.Collections; | 28 | using System.Collections; |
28 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
29 | using System.Net; | 30 | using System.Net; |
@@ -35,408 +36,123 @@ using OpenMetaverse; | |||
35 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
36 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
39 | using OpenSim.Services.Interfaces; | ||
38 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 40 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
41 | using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo; | ||
39 | 42 | ||
40 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | 43 | namespace OpenSim.Region.CoreModules.Avatar.InstantMessage |
41 | { | 44 | { |
42 | public class PresenceModule : IRegionModule, IPresenceModule | 45 | public class PresenceModule : ISharedRegionModule, IPresenceModule |
43 | { | 46 | { |
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger( |
45 | 48 | MethodBase.GetCurrentMethod().DeclaringType); | |
46 | private bool m_Enabled = false; | ||
47 | private bool m_Gridmode = false; | ||
48 | |||
49 | // some default scene for doing things that aren't connected to a specific scene. Avoids locking. | ||
50 | private Scene m_initialScene; | ||
51 | |||
52 | private List<Scene> m_Scenes = new List<Scene>(); | ||
53 | |||
54 | // we currently are only interested in root-agents. If the root isn't here, we don't know the region the | ||
55 | // user is in, so we have to ask the messaging server anyway. | ||
56 | private Dictionary<UUID, Scene> m_RootAgents = | ||
57 | new Dictionary<UUID, Scene>(); | ||
58 | 49 | ||
59 | public event PresenceChange OnPresenceChange; | 50 | public event PresenceChange OnPresenceChange; |
60 | public event BulkPresenceData OnBulkPresenceData; | 51 | public event BulkPresenceData OnBulkPresenceData; |
61 | 52 | ||
62 | public void Initialise(Scene scene, IConfigSource config) | 53 | protected List<Scene> m_Scenes = new List<Scene>(); |
63 | { | ||
64 | lock (m_Scenes) | ||
65 | { | ||
66 | // This is a shared module; Initialise will be called for every region on this server. | ||
67 | // Only check config once for the first region. | ||
68 | if (m_Scenes.Count == 0) | ||
69 | { | ||
70 | IConfig cnf = config.Configs["Messaging"]; | ||
71 | if (cnf != null && cnf.GetString( | ||
72 | "PresenceModule", "PresenceModule") != | ||
73 | "PresenceModule") | ||
74 | return; | ||
75 | |||
76 | cnf = config.Configs["Startup"]; | ||
77 | if (cnf != null) | ||
78 | m_Gridmode = cnf.GetBoolean("gridmode", false); | ||
79 | 54 | ||
80 | m_Enabled = true; | 55 | protected IPresenceService m_PresenceService = null; |
81 | 56 | ||
82 | m_initialScene = scene; | 57 | protected IPresenceService PresenceService |
83 | } | ||
84 | |||
85 | if (m_Gridmode) | ||
86 | NotifyMessageServerOfStartup(scene); | ||
87 | |||
88 | m_Scenes.Add(scene); | ||
89 | } | ||
90 | |||
91 | scene.RegisterModuleInterface<IPresenceModule>(this); | ||
92 | |||
93 | scene.EventManager.OnNewClient += OnNewClient; | ||
94 | scene.EventManager.OnSetRootAgentScene += OnSetRootAgentScene; | ||
95 | scene.EventManager.OnMakeChildAgent += OnMakeChildAgent; | ||
96 | } | ||
97 | |||
98 | public void PostInitialise() | ||
99 | { | ||
100 | } | ||
101 | |||
102 | public void Close() | ||
103 | { | 58 | { |
104 | if (!m_Gridmode || !m_Enabled) | 59 | get |
105 | return; | ||
106 | |||
107 | if (OnPresenceChange != null) | ||
108 | { | 60 | { |
109 | lock (m_RootAgents) | 61 | if (m_PresenceService == null) |
110 | { | 62 | { |
111 | // on shutdown, users are kicked, too | 63 | if (m_Scenes.Count > 0) |
112 | foreach (KeyValuePair<UUID, Scene> pair in m_RootAgents) | 64 | m_PresenceService = m_Scenes[0].RequestModuleInterface<IPresenceService>(); |
113 | { | ||
114 | OnPresenceChange(new PresenceInfo(pair.Key, UUID.Zero)); | ||
115 | } | ||
116 | } | 65 | } |
117 | } | ||
118 | 66 | ||
119 | lock (m_Scenes) | 67 | return m_PresenceService; |
120 | { | ||
121 | foreach (Scene scene in m_Scenes) | ||
122 | NotifyMessageServerOfShutdown(scene); | ||
123 | } | 68 | } |
124 | } | 69 | } |
125 | 70 | ||
126 | public string Name | 71 | public void Initialise(IConfigSource config) |
127 | { | ||
128 | get { return "PresenceModule"; } | ||
129 | } | ||
130 | |||
131 | public bool IsSharedModule | ||
132 | { | 72 | { |
133 | get { return true; } | ||
134 | } | 73 | } |
135 | 74 | ||
136 | public void RequestBulkPresenceData(UUID[] users) | 75 | public void AddRegion(Scene scene) |
137 | { | 76 | { |
138 | if (OnBulkPresenceData != null) | 77 | m_Scenes.Add(scene); |
139 | { | ||
140 | PresenceInfo[] result = new PresenceInfo[users.Length]; | ||
141 | if (m_Gridmode) | ||
142 | { | ||
143 | // first check the local information | ||
144 | List<UUID> uuids = new List<UUID>(); // the uuids to check remotely | ||
145 | List<int> indices = new List<int>(); // just for performance. | ||
146 | lock (m_RootAgents) | ||
147 | { | ||
148 | for (int i = 0; i < uuids.Count; ++i) | ||
149 | { | ||
150 | Scene scene; | ||
151 | if (m_RootAgents.TryGetValue(users[i], out scene)) | ||
152 | { | ||
153 | result[i] = new PresenceInfo(users[i], scene.RegionInfo.RegionID); | ||
154 | } | ||
155 | else | ||
156 | { | ||
157 | uuids.Add(users[i]); | ||
158 | indices.Add(i); | ||
159 | } | ||
160 | } | ||
161 | } | ||
162 | 78 | ||
163 | // now we have filtered out all the local root agents. The rest we have to request info about | 79 | scene.EventManager.OnNewClient += OnNewClient; |
164 | Dictionary<UUID, FriendRegionInfo> infos = m_initialScene.GetFriendRegionInfos(uuids); | ||
165 | for (int i = 0; i < uuids.Count; ++i) | ||
166 | { | ||
167 | FriendRegionInfo info; | ||
168 | if (infos.TryGetValue(uuids[i], out info) && info.isOnline) | ||
169 | { | ||
170 | UUID regionID = info.regionID; | ||
171 | if (regionID == UUID.Zero) | ||
172 | { | ||
173 | // TODO this is the old messaging-server protocol; only the regionHandle is available. | ||
174 | // Fetch region-info to get the id | ||
175 | uint x = 0, y = 0; | ||
176 | Utils.LongToUInts(info.regionHandle, out x, out y); | ||
177 | GridRegion regionInfo = m_initialScene.GridService.GetRegionByPosition(m_initialScene.RegionInfo.ScopeID, | ||
178 | (int)x, (int)y); | ||
179 | regionID = regionInfo.RegionID; | ||
180 | } | ||
181 | result[indices[i]] = new PresenceInfo(uuids[i], regionID); | ||
182 | } | ||
183 | else result[indices[i]] = new PresenceInfo(uuids[i], UUID.Zero); | ||
184 | } | ||
185 | } | ||
186 | else | ||
187 | { | ||
188 | // in standalone mode, we have all the info locally available. | ||
189 | lock (m_RootAgents) | ||
190 | { | ||
191 | for (int i = 0; i < users.Length; ++i) | ||
192 | { | ||
193 | Scene scene; | ||
194 | if (m_RootAgents.TryGetValue(users[i], out scene)) | ||
195 | { | ||
196 | result[i] = new PresenceInfo(users[i], scene.RegionInfo.RegionID); | ||
197 | } | ||
198 | else | ||
199 | { | ||
200 | result[i] = new PresenceInfo(users[i], UUID.Zero); | ||
201 | } | ||
202 | } | ||
203 | } | ||
204 | } | ||
205 | 80 | ||
206 | // tell everyone | 81 | scene.RegisterModuleInterface<IPresenceModule>(this); |
207 | OnBulkPresenceData(result); | ||
208 | } | ||
209 | } | 82 | } |
210 | 83 | ||
211 | // new client doesn't mean necessarily that user logged in, it just means it entered one of the | 84 | public void RegionLoaded(Scene scene) |
212 | // the regions on this server | ||
213 | public void OnNewClient(IClientAPI client) | ||
214 | { | 85 | { |
215 | client.OnConnectionClosed += OnConnectionClosed; | ||
216 | client.OnLogout += OnLogout; | ||
217 | |||
218 | // KLUDGE: See handler for details. | ||
219 | client.OnEconomyDataRequest += OnEconomyDataRequest; | ||
220 | } | 86 | } |
221 | 87 | ||
222 | // connection closed just means *one* client connection has been closed. It doesn't mean that the | 88 | public void RemoveRegion(Scene scene) |
223 | // user has logged off; it might have just TPed away. | ||
224 | public void OnConnectionClosed(IClientAPI client) | ||
225 | { | 89 | { |
226 | // TODO: Have to think what we have to do here... | 90 | m_Scenes.Remove(scene); |
227 | // Should we just remove the root from the list (if scene matches)? | ||
228 | if (!(client.Scene is Scene)) | ||
229 | return; | ||
230 | Scene scene = (Scene)client.Scene; | ||
231 | |||
232 | lock (m_RootAgents) | ||
233 | { | ||
234 | Scene rootScene; | ||
235 | if (!(m_RootAgents.TryGetValue(client.AgentId, out rootScene)) || scene != rootScene) | ||
236 | return; | ||
237 | |||
238 | m_RootAgents.Remove(client.AgentId); | ||
239 | } | ||
240 | |||
241 | // Should it have logged off, we'll do the logout part in OnLogout, even if no root is stored | ||
242 | // anymore. It logged off, after all... | ||
243 | } | 91 | } |
244 | 92 | ||
245 | // Triggered when the user logs off. | 93 | public void PostInitialise() |
246 | public void OnLogout(IClientAPI client) | ||
247 | { | 94 | { |
248 | if (!(client.Scene is Scene)) | ||
249 | return; | ||
250 | Scene scene = (Scene)client.Scene; | ||
251 | |||
252 | // On logout, we really remove the client from rootAgents, even if the scene doesn't match | ||
253 | lock (m_RootAgents) | ||
254 | { | ||
255 | if (m_RootAgents.ContainsKey(client.AgentId)) m_RootAgents.Remove(client.AgentId); | ||
256 | } | ||
257 | |||
258 | // now inform the messaging server and anyone who is interested | ||
259 | NotifyMessageServerOfAgentLeaving(client.AgentId, scene.RegionInfo.RegionID, scene.RegionInfo.RegionHandle); | ||
260 | if (OnPresenceChange != null) OnPresenceChange(new PresenceInfo(client.AgentId, UUID.Zero)); | ||
261 | } | 95 | } |
262 | 96 | ||
263 | public void OnSetRootAgentScene(UUID agentID, Scene scene) | 97 | public void Close() |
264 | { | 98 | { |
265 | // OnSetRootAgentScene can be called from several threads at once (with different agentID). | ||
266 | // Concurrent access to m_RootAgents is prone to failure on multi-core/-processor systems without | ||
267 | // correct locking). | ||
268 | lock (m_RootAgents) | ||
269 | { | ||
270 | Scene rootScene; | ||
271 | if (m_RootAgents.TryGetValue(agentID, out rootScene) && scene == rootScene) | ||
272 | { | ||
273 | return; | ||
274 | } | ||
275 | m_RootAgents[agentID] = scene; | ||
276 | } | ||
277 | |||
278 | // inform messaging server that agent changed the region | ||
279 | Util.FireAndForget( | ||
280 | delegate(object o) | ||
281 | { | ||
282 | NotifyMessageServerOfAgentLocation(agentID, scene.RegionInfo.RegionID, scene.RegionInfo.RegionHandle); | ||
283 | } | ||
284 | ); | ||
285 | } | 99 | } |
286 | 100 | ||
287 | private void OnEconomyDataRequest(UUID agentID) | 101 | public string Name |
288 | { | 102 | { |
289 | // KLUDGE: This is the only way I found to get a message (only) after login was completed and the | 103 | get { return "PresenceModule"; } |
290 | // client is connected enough to receive UDP packets. | ||
291 | // This packet seems to be sent only once, just after connection was established to the first | ||
292 | // region after login. | ||
293 | // We use it here to trigger a presence update; the old update-on-login was never be heard by | ||
294 | // the freshly logged in viewer, as it wasn't connected to the region at that time. | ||
295 | // TODO: Feel free to replace this by a better solution if you find one. | ||
296 | |||
297 | // get the agent. This should work every time, as we just got a packet from it | ||
298 | ScenePresence agent = null; | ||
299 | lock (m_Scenes) | ||
300 | { | ||
301 | foreach (Scene scene in m_Scenes) | ||
302 | { | ||
303 | agent = scene.GetScenePresence(agentID); | ||
304 | if (agent != null) break; | ||
305 | } | ||
306 | } | ||
307 | |||
308 | // just to be paranoid... | ||
309 | if (agent == null) | ||
310 | { | ||
311 | m_log.ErrorFormat("[PRESENCE]: Got a packet from agent {0} who can't be found anymore!?", agentID); | ||
312 | return; | ||
313 | } | ||
314 | |||
315 | // we are a bit premature here, but the next packet will switch this child agent to root. | ||
316 | if (OnPresenceChange != null) OnPresenceChange(new PresenceInfo(agentID, agent.Scene.RegionInfo.RegionID)); | ||
317 | } | 104 | } |
318 | 105 | ||
319 | public void OnMakeChildAgent(ScenePresence agent) | 106 | public Type ReplaceableInterface |
320 | { | 107 | { |
321 | // OnMakeChildAgent can be called from several threads at once (with different agent). | 108 | get { return null; } |
322 | // Concurrent access to m_RootAgents is prone to failure on multi-core/-processor systems without | ||
323 | // correct locking). | ||
324 | lock (m_RootAgents) | ||
325 | { | ||
326 | Scene rootScene; | ||
327 | if (m_RootAgents.TryGetValue(agent.UUID, out rootScene) && agent.Scene == rootScene) | ||
328 | { | ||
329 | m_RootAgents.Remove(agent.UUID); | ||
330 | } | ||
331 | } | ||
332 | // don't notify the messaging-server; either this agent just had been downgraded and another one will be upgraded | ||
333 | // to root momentarily (which will notify the messaging-server), or possibly it will be closed in a moment, | ||
334 | // which will update the messaging-server, too. | ||
335 | } | 109 | } |
336 | 110 | ||
337 | private void NotifyMessageServerOfStartup(Scene scene) | 111 | public void RequestBulkPresenceData(UUID[] users) |
338 | { | 112 | { |
339 | Hashtable xmlrpcdata = new Hashtable(); | ||
340 | xmlrpcdata["RegionUUID"] = scene.RegionInfo.RegionID.ToString(); | ||
341 | ArrayList SendParams = new ArrayList(); | ||
342 | SendParams.Add(xmlrpcdata); | ||
343 | try | ||
344 | { | ||
345 | XmlRpcRequest UpRequest = new XmlRpcRequest("region_startup", SendParams); | ||
346 | XmlRpcResponse resp = UpRequest.Send(scene.CommsManager.NetworkServersInfo.MessagingURL, 5000); | ||
347 | |||
348 | Hashtable responseData = (Hashtable)resp.Value; | ||
349 | if (responseData == null || (!responseData.ContainsKey("success")) || (string)responseData["success"] != "TRUE") | ||
350 | { | ||
351 | m_log.ErrorFormat("[PRESENCE]: Failed to notify message server of region startup for region {0}", scene.RegionInfo.RegionName); | ||
352 | } | ||
353 | } | ||
354 | catch (WebException) | ||
355 | { | ||
356 | m_log.ErrorFormat("[PRESENCE]: Failed to notify message server of region startup for region {0}", scene.RegionInfo.RegionName); | ||
357 | } | ||
358 | } | 113 | } |
359 | 114 | ||
360 | private void NotifyMessageServerOfShutdown(Scene scene) | 115 | public void OnNewClient(IClientAPI client) |
361 | { | 116 | { |
362 | if (m_Scenes[0].CommsManager.NetworkServersInfo.MessagingURL == string.Empty) | 117 | client.AddGenericPacketHandler("requestonlinenotification", OnRequestOnlineNotification); |
363 | return; | ||
364 | |||
365 | Hashtable xmlrpcdata = new Hashtable(); | ||
366 | xmlrpcdata["RegionUUID"] = scene.RegionInfo.RegionID.ToString(); | ||
367 | ArrayList SendParams = new ArrayList(); | ||
368 | SendParams.Add(xmlrpcdata); | ||
369 | try | ||
370 | { | ||
371 | XmlRpcRequest DownRequest = new XmlRpcRequest("region_shutdown", SendParams); | ||
372 | XmlRpcResponse resp = DownRequest.Send(scene.CommsManager.NetworkServersInfo.MessagingURL, 5000); | ||
373 | |||
374 | Hashtable responseData = (Hashtable)resp.Value; | ||
375 | if ((!responseData.ContainsKey("success")) || (string)responseData["success"] != "TRUE") | ||
376 | { | ||
377 | m_log.ErrorFormat("[PRESENCE]: Failed to notify message server of region shutdown for region {0}", scene.RegionInfo.RegionName); | ||
378 | } | ||
379 | } | ||
380 | catch (WebException) | ||
381 | { | ||
382 | m_log.ErrorFormat("[PRESENCE]: Failed to notify message server of region shutdown for region {0}", scene.RegionInfo.RegionName); | ||
383 | } | ||
384 | } | 118 | } |
385 | 119 | ||
386 | private void NotifyMessageServerOfAgentLocation(UUID agentID, UUID region, ulong regionHandle) | 120 | public void OnRequestOnlineNotification(Object sender, string method, List<String> args) |
387 | { | 121 | { |
388 | if (m_Scenes[0].CommsManager.NetworkServersInfo.MessagingURL == string.Empty) | 122 | if (!(sender is IClientAPI)) |
389 | return; | 123 | return; |
390 | 124 | ||
391 | Hashtable xmlrpcdata = new Hashtable(); | 125 | IClientAPI client = (IClientAPI)sender; |
392 | xmlrpcdata["AgentID"] = agentID.ToString(); | 126 | m_log.DebugFormat("[PRESENCE MODULE]: OnlineNotification requested by {0}", client.Name); |
393 | xmlrpcdata["RegionUUID"] = region.ToString(); | ||
394 | xmlrpcdata["RegionHandle"] = regionHandle.ToString(); | ||
395 | ArrayList SendParams = new ArrayList(); | ||
396 | SendParams.Add(xmlrpcdata); | ||
397 | try | ||
398 | { | ||
399 | XmlRpcRequest LocationRequest = new XmlRpcRequest("agent_location", SendParams); | ||
400 | XmlRpcResponse resp = LocationRequest.Send(m_Scenes[0].CommsManager.NetworkServersInfo.MessagingURL, 5000); | ||
401 | 127 | ||
402 | Hashtable responseData = (Hashtable)resp.Value; | 128 | PresenceInfo[] status = PresenceService.GetAgents(args.ToArray()); |
403 | if ((!responseData.ContainsKey("success")) || (string)responseData["success"] != "TRUE") | ||
404 | { | ||
405 | m_log.ErrorFormat("[PRESENCE]: Failed to notify message server of agent location for {0}", agentID.ToString()); | ||
406 | } | ||
407 | } | ||
408 | catch (WebException) | ||
409 | { | ||
410 | m_log.ErrorFormat("[PRESENCE]: Failed to notify message server of agent location for {0}", agentID.ToString()); | ||
411 | } | ||
412 | } | ||
413 | 129 | ||
414 | private void NotifyMessageServerOfAgentLeaving(UUID agentID, UUID region, ulong regionHandle) | 130 | List<UUID> online = new List<UUID>(); |
415 | { | 131 | List<UUID> offline = new List<UUID>(); |
416 | if (m_Scenes[0].CommsManager.NetworkServersInfo.MessagingURL == string.Empty) | ||
417 | return; | ||
418 | 132 | ||
419 | Hashtable xmlrpcdata = new Hashtable(); | 133 | foreach (PresenceInfo pi in status) |
420 | xmlrpcdata["AgentID"] = agentID.ToString(); | ||
421 | xmlrpcdata["RegionUUID"] = region.ToString(); | ||
422 | xmlrpcdata["RegionHandle"] = regionHandle.ToString(); | ||
423 | ArrayList SendParams = new ArrayList(); | ||
424 | SendParams.Add(xmlrpcdata); | ||
425 | try | ||
426 | { | 134 | { |
427 | XmlRpcRequest LeavingRequest = new XmlRpcRequest("agent_leaving", SendParams); | 135 | UUID uuid = new UUID(pi.UserID); |
428 | XmlRpcResponse resp = LeavingRequest.Send(m_Scenes[0].CommsManager.NetworkServersInfo.MessagingURL, 5000); | 136 | if (pi.Online) |
429 | |||
430 | Hashtable responseData = (Hashtable)resp.Value; | ||
431 | if ((!responseData.ContainsKey("success")) || (string)responseData["success"] != "TRUE") | ||
432 | { | 137 | { |
433 | m_log.ErrorFormat("[PRESENCE]: Failed to notify message server of agent leaving for {0}", agentID.ToString()); | 138 | if (!online.Contains(uuid)) |
139 | { | ||
140 | online.Add(uuid); | ||
141 | if (offline.Contains(uuid)) | ||
142 | offline.Remove(uuid); | ||
143 | } | ||
144 | } | ||
145 | else | ||
146 | { | ||
147 | if (!online.Contains(uuid) && !offline.Contains(uuid)) | ||
148 | offline.Add(uuid); | ||
434 | } | 149 | } |
435 | } | 150 | } |
436 | catch (WebException) | 151 | |
437 | { | 152 | if (online.Count > 0) |
438 | m_log.ErrorFormat("[PRESENCE]: Failed to notify message server of agent leaving for {0}", agentID.ToString()); | 153 | client.SendAgentOnline(online.ToArray()); |
439 | } | 154 | if (offline.Count > 0) |
155 | client.SendAgentOffline(offline.ToArray()); | ||
440 | } | 156 | } |
441 | } | 157 | } |
442 | } | 158 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs index 160a9bd..dc7439c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs | |||
@@ -37,7 +37,7 @@ using log4net; | |||
37 | using OpenMetaverse; | 37 | using OpenMetaverse; |
38 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
39 | using OpenSim.Framework.Communications; | 39 | using OpenSim.Framework.Communications; |
40 | using OpenSim.Framework.Communications.Cache; | 40 | |
41 | using OpenSim.Framework.Communications.Osp; | 41 | using OpenSim.Framework.Communications.Osp; |
42 | using OpenSim.Framework.Serialization; | 42 | using OpenSim.Framework.Serialization; |
43 | using OpenSim.Framework.Serialization.External; | 43 | using OpenSim.Framework.Serialization.External; |
@@ -53,7 +53,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
53 | 53 | ||
54 | protected TarArchiveReader archive; | 54 | protected TarArchiveReader archive; |
55 | 55 | ||
56 | private CachedUserInfo m_userInfo; | 56 | private UserAccount m_userInfo; |
57 | private string m_invPath; | 57 | private string m_invPath; |
58 | 58 | ||
59 | /// <value> | 59 | /// <value> |
@@ -67,7 +67,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
67 | private Stream m_loadStream; | 67 | private Stream m_loadStream; |
68 | 68 | ||
69 | public InventoryArchiveReadRequest( | 69 | public InventoryArchiveReadRequest( |
70 | Scene scene, CachedUserInfo userInfo, string invPath, string loadPath) | 70 | Scene scene, UserAccount userInfo, string invPath, string loadPath) |
71 | : this( | 71 | : this( |
72 | scene, | 72 | scene, |
73 | userInfo, | 73 | userInfo, |
@@ -77,7 +77,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
77 | } | 77 | } |
78 | 78 | ||
79 | public InventoryArchiveReadRequest( | 79 | public InventoryArchiveReadRequest( |
80 | Scene scene, CachedUserInfo userInfo, string invPath, Stream loadStream) | 80 | Scene scene, UserAccount userInfo, string invPath, Stream loadStream) |
81 | { | 81 | { |
82 | m_scene = scene; | 82 | m_scene = scene; |
83 | m_userInfo = userInfo; | 83 | m_userInfo = userInfo; |
@@ -103,7 +103,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
103 | //InventoryFolderImpl rootDestinationFolder = m_userInfo.RootFolder.FindFolderByPath(m_invPath); | 103 | //InventoryFolderImpl rootDestinationFolder = m_userInfo.RootFolder.FindFolderByPath(m_invPath); |
104 | InventoryFolderBase rootDestinationFolder | 104 | InventoryFolderBase rootDestinationFolder |
105 | = InventoryArchiveUtils.FindFolderByPath( | 105 | = InventoryArchiveUtils.FindFolderByPath( |
106 | m_scene.InventoryService, m_userInfo.UserProfile.ID, m_invPath); | 106 | m_scene.InventoryService, m_userInfo.PrincipalID, m_invPath); |
107 | 107 | ||
108 | if (null == rootDestinationFolder) | 108 | if (null == rootDestinationFolder) |
109 | { | 109 | { |
@@ -280,7 +280,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
280 | // even though there is a AssetType.RootCategory | 280 | // even though there is a AssetType.RootCategory |
281 | destFolder | 281 | destFolder |
282 | = new InventoryFolderBase( | 282 | = new InventoryFolderBase( |
283 | newFolderId, newFolderName, m_userInfo.UserProfile.ID, | 283 | newFolderId, newFolderName, m_userInfo.PrincipalID, |
284 | (short)AssetType.Unknown, destFolder.ID, 1); | 284 | (short)AssetType.Unknown, destFolder.ID, 1); |
285 | m_scene.InventoryService.AddFolder(destFolder); | 285 | m_scene.InventoryService.AddFolder(destFolder); |
286 | 286 | ||
@@ -357,7 +357,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
357 | // Don't use the item ID that's in the file | 357 | // Don't use the item ID that's in the file |
358 | item.ID = UUID.Random(); | 358 | item.ID = UUID.Random(); |
359 | 359 | ||
360 | UUID ospResolvedId = OspResolver.ResolveOspa(item.CreatorId, m_scene.CommsManager); | 360 | UUID ospResolvedId = OspResolver.ResolveOspa(item.CreatorId, m_scene.UserAccountService); |
361 | if (UUID.Zero != ospResolvedId) | 361 | if (UUID.Zero != ospResolvedId) |
362 | { | 362 | { |
363 | item.CreatorIdAsUuid = ospResolvedId; | 363 | item.CreatorIdAsUuid = ospResolvedId; |
@@ -368,10 +368,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
368 | } | 368 | } |
369 | else | 369 | else |
370 | { | 370 | { |
371 | item.CreatorIdAsUuid = m_userInfo.UserProfile.ID; | 371 | item.CreatorIdAsUuid = m_userInfo.PrincipalID; |
372 | } | 372 | } |
373 | 373 | ||
374 | item.Owner = m_userInfo.UserProfile.ID; | 374 | item.Owner = m_userInfo.PrincipalID; |
375 | 375 | ||
376 | // Reset folder ID to the one in which we want to load it | 376 | // Reset folder ID to the one in which we want to load it |
377 | item.Folder = loadFolder.ID; | 377 | item.Folder = loadFolder.ID; |
@@ -416,7 +416,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
416 | 416 | ||
417 | //m_log.DebugFormat("[INVENTORY ARCHIVER]: Importing asset {0}, type {1}", uuid, assetType); | 417 | //m_log.DebugFormat("[INVENTORY ARCHIVER]: Importing asset {0}, type {1}", uuid, assetType); |
418 | 418 | ||
419 | AssetBase asset = new AssetBase(new UUID(uuid), "RandomName", assetType); | 419 | AssetBase asset = new AssetBase(new UUID(uuid), "RandomName", assetType, UUID.Zero.ToString()); |
420 | asset.Data = data; | 420 | asset.Data = data; |
421 | 421 | ||
422 | m_scene.AssetService.Store(asset); | 422 | m_scene.AssetService.Store(asset); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index 98b686e..ef10104 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs | |||
@@ -37,10 +37,11 @@ using OpenSim.Framework; | |||
37 | using OpenSim.Framework.Serialization; | 37 | using OpenSim.Framework.Serialization; |
38 | using OpenSim.Framework.Serialization.External; | 38 | using OpenSim.Framework.Serialization.External; |
39 | using OpenSim.Framework.Communications; | 39 | using OpenSim.Framework.Communications; |
40 | using OpenSim.Framework.Communications.Cache; | 40 | |
41 | using OpenSim.Framework.Communications.Osp; | 41 | using OpenSim.Framework.Communications.Osp; |
42 | using OpenSim.Region.CoreModules.World.Archiver; | 42 | using OpenSim.Region.CoreModules.World.Archiver; |
43 | using OpenSim.Region.Framework.Scenes; | 43 | using OpenSim.Region.Framework.Scenes; |
44 | using OpenSim.Services.Interfaces; | ||
44 | 45 | ||
45 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | 46 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver |
46 | { | 47 | { |
@@ -54,7 +55,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
54 | private const string STAR_WILDCARD = "*"; | 55 | private const string STAR_WILDCARD = "*"; |
55 | 56 | ||
56 | private InventoryArchiverModule m_module; | 57 | private InventoryArchiverModule m_module; |
57 | private CachedUserInfo m_userInfo; | 58 | private UserAccount m_userInfo; |
58 | private string m_invPath; | 59 | private string m_invPath; |
59 | protected TarArchiveWriter m_archiveWriter; | 60 | protected TarArchiveWriter m_archiveWriter; |
60 | protected UuidGatherer m_assetGatherer; | 61 | protected UuidGatherer m_assetGatherer; |
@@ -89,7 +90,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
89 | /// </summary> | 90 | /// </summary> |
90 | public InventoryArchiveWriteRequest( | 91 | public InventoryArchiveWriteRequest( |
91 | Guid id, InventoryArchiverModule module, Scene scene, | 92 | Guid id, InventoryArchiverModule module, Scene scene, |
92 | CachedUserInfo userInfo, string invPath, string savePath) | 93 | UserAccount userInfo, string invPath, string savePath) |
93 | : this( | 94 | : this( |
94 | id, | 95 | id, |
95 | module, | 96 | module, |
@@ -105,7 +106,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
105 | /// </summary> | 106 | /// </summary> |
106 | public InventoryArchiveWriteRequest( | 107 | public InventoryArchiveWriteRequest( |
107 | Guid id, InventoryArchiverModule module, Scene scene, | 108 | Guid id, InventoryArchiverModule module, Scene scene, |
108 | CachedUserInfo userInfo, string invPath, Stream saveStream) | 109 | UserAccount userInfo, string invPath, Stream saveStream) |
109 | { | 110 | { |
110 | m_id = id; | 111 | m_id = id; |
111 | m_module = module; | 112 | m_module = module; |
@@ -148,7 +149,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
148 | m_userUuids[inventoryItem.CreatorIdAsUuid] = 1; | 149 | m_userUuids[inventoryItem.CreatorIdAsUuid] = 1; |
149 | 150 | ||
150 | InventoryItemBase saveItem = (InventoryItemBase)inventoryItem.Clone(); | 151 | InventoryItemBase saveItem = (InventoryItemBase)inventoryItem.Clone(); |
151 | saveItem.CreatorId = OspResolver.MakeOspa(saveItem.CreatorIdAsUuid, m_scene.CommsManager); | 152 | saveItem.CreatorId = OspResolver.MakeOspa(saveItem.CreatorIdAsUuid, m_scene.UserAccountService); |
152 | 153 | ||
153 | string serialization = UserInventoryItemSerializer.Serialize(saveItem); | 154 | string serialization = UserInventoryItemSerializer.Serialize(saveItem); |
154 | m_archiveWriter.WriteFile(filename, serialization); | 155 | m_archiveWriter.WriteFile(filename, serialization); |
@@ -215,7 +216,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
215 | { | 216 | { |
216 | InventoryFolderBase inventoryFolder = null; | 217 | InventoryFolderBase inventoryFolder = null; |
217 | InventoryItemBase inventoryItem = null; | 218 | InventoryItemBase inventoryItem = null; |
218 | InventoryFolderBase rootFolder = m_scene.InventoryService.GetRootFolder(m_userInfo.UserProfile.ID); | 219 | InventoryFolderBase rootFolder = m_scene.InventoryService.GetRootFolder(m_userInfo.PrincipalID); |
219 | 220 | ||
220 | bool foundStar = false; | 221 | bool foundStar = false; |
221 | 222 | ||
@@ -318,14 +319,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
318 | foreach (UUID creatorId in m_userUuids.Keys) | 319 | foreach (UUID creatorId in m_userUuids.Keys) |
319 | { | 320 | { |
320 | // Record the creator of this item | 321 | // Record the creator of this item |
321 | CachedUserInfo creator | 322 | UserAccount creator = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, creatorId); |
322 | = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(creatorId); | ||
323 | 323 | ||
324 | if (creator != null) | 324 | if (creator != null) |
325 | { | 325 | { |
326 | m_archiveWriter.WriteFile( | 326 | m_archiveWriter.WriteFile( |
327 | ArchiveConstants.USERS_PATH + creator.UserProfile.Name + ".xml", | 327 | ArchiveConstants.USERS_PATH + creator.FirstName + " " + creator.LastName + ".xml", |
328 | UserProfileSerializer.Serialize(creator.UserProfile)); | 328 | UserProfileSerializer.Serialize(creator.PrincipalID, creator.FirstName, creator.LastName)); |
329 | } | 329 | } |
330 | else | 330 | else |
331 | { | 331 | { |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index a898992..71b3062 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs | |||
@@ -34,7 +34,7 @@ using Nini.Config; | |||
34 | using OpenMetaverse; | 34 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using OpenSim.Framework.Communications; | 36 | using OpenSim.Framework.Communications; |
37 | using OpenSim.Framework.Communications.Cache; | 37 | |
38 | using OpenSim.Region.Framework.Interfaces; | 38 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes; | 39 | using OpenSim.Region.Framework.Scenes; |
40 | using OpenSim.Services.Interfaces; | 40 | using OpenSim.Services.Interfaces; |
@@ -113,7 +113,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
113 | /// Trigger the inventory archive saved event. | 113 | /// Trigger the inventory archive saved event. |
114 | /// </summary> | 114 | /// </summary> |
115 | protected internal void TriggerInventoryArchiveSaved( | 115 | protected internal void TriggerInventoryArchiveSaved( |
116 | Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, | 116 | Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, |
117 | Exception reportedException) | 117 | Exception reportedException) |
118 | { | 118 | { |
119 | InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved; | 119 | InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved; |
@@ -125,11 +125,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
125 | { | 125 | { |
126 | if (m_scenes.Count > 0) | 126 | if (m_scenes.Count > 0) |
127 | { | 127 | { |
128 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName, pass); | 128 | UserAccount userInfo = GetUserInfo(firstName, lastName, pass); |
129 | 129 | ||
130 | if (userInfo != null) | 130 | if (userInfo != null) |
131 | { | 131 | { |
132 | if (CheckPresence(userInfo.UserProfile.ID)) | 132 | if (CheckPresence(userInfo.PrincipalID)) |
133 | { | 133 | { |
134 | try | 134 | try |
135 | { | 135 | { |
@@ -150,8 +150,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
150 | else | 150 | else |
151 | { | 151 | { |
152 | m_log.ErrorFormat( | 152 | m_log.ErrorFormat( |
153 | "[INVENTORY ARCHIVER]: User {0} {1} not logged in to this region simulator", | 153 | "[INVENTORY ARCHIVER]: User {0} {1} {2} not logged in to this region simulator", |
154 | userInfo.UserProfile.Name, userInfo.UserProfile.ID); | 154 | userInfo.FirstName, userInfo.LastName, userInfo.PrincipalID); |
155 | } | 155 | } |
156 | } | 156 | } |
157 | } | 157 | } |
@@ -163,11 +163,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
163 | { | 163 | { |
164 | if (m_scenes.Count > 0) | 164 | if (m_scenes.Count > 0) |
165 | { | 165 | { |
166 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName, pass); | 166 | UserAccount userInfo = GetUserInfo(firstName, lastName, pass); |
167 | 167 | ||
168 | if (userInfo != null) | 168 | if (userInfo != null) |
169 | { | 169 | { |
170 | if (CheckPresence(userInfo.UserProfile.ID)) | 170 | if (CheckPresence(userInfo.PrincipalID)) |
171 | { | 171 | { |
172 | try | 172 | try |
173 | { | 173 | { |
@@ -188,8 +188,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
188 | else | 188 | else |
189 | { | 189 | { |
190 | m_log.ErrorFormat( | 190 | m_log.ErrorFormat( |
191 | "[INVENTORY ARCHIVER]: User {0} {1} not logged in to this region simulator", | 191 | "[INVENTORY ARCHIVER]: User {0} {1} {2} not logged in to this region simulator", |
192 | userInfo.UserProfile.Name, userInfo.UserProfile.ID); | 192 | userInfo.FirstName, userInfo.LastName, userInfo.PrincipalID); |
193 | } | 193 | } |
194 | } | 194 | } |
195 | } | 195 | } |
@@ -201,11 +201,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
201 | { | 201 | { |
202 | if (m_scenes.Count > 0) | 202 | if (m_scenes.Count > 0) |
203 | { | 203 | { |
204 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName, pass); | 204 | UserAccount userInfo = GetUserInfo(firstName, lastName, pass); |
205 | 205 | ||
206 | if (userInfo != null) | 206 | if (userInfo != null) |
207 | { | 207 | { |
208 | if (CheckPresence(userInfo.UserProfile.ID)) | 208 | if (CheckPresence(userInfo.PrincipalID)) |
209 | { | 209 | { |
210 | InventoryArchiveReadRequest request; | 210 | InventoryArchiveReadRequest request; |
211 | 211 | ||
@@ -230,8 +230,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
230 | else | 230 | else |
231 | { | 231 | { |
232 | m_log.ErrorFormat( | 232 | m_log.ErrorFormat( |
233 | "[INVENTORY ARCHIVER]: User {0} {1} not logged in to this region simulator", | 233 | "[INVENTORY ARCHIVER]: User {0} {1} {2} not logged in to this region simulator", |
234 | userInfo.UserProfile.Name, userInfo.UserProfile.ID); | 234 | userInfo.FirstName, userInfo.LastName, userInfo.PrincipalID); |
235 | } | 235 | } |
236 | } | 236 | } |
237 | } | 237 | } |
@@ -243,11 +243,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
243 | { | 243 | { |
244 | if (m_scenes.Count > 0) | 244 | if (m_scenes.Count > 0) |
245 | { | 245 | { |
246 | CachedUserInfo userInfo = GetUserInfo(firstName, lastName, pass); | 246 | UserAccount userInfo = GetUserInfo(firstName, lastName, pass); |
247 | 247 | ||
248 | if (userInfo != null) | 248 | if (userInfo != null) |
249 | { | 249 | { |
250 | if (CheckPresence(userInfo.UserProfile.ID)) | 250 | if (CheckPresence(userInfo.PrincipalID)) |
251 | { | 251 | { |
252 | InventoryArchiveReadRequest request; | 252 | InventoryArchiveReadRequest request; |
253 | 253 | ||
@@ -272,8 +272,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
272 | else | 272 | else |
273 | { | 273 | { |
274 | m_log.ErrorFormat( | 274 | m_log.ErrorFormat( |
275 | "[INVENTORY ARCHIVER]: User {0} {1} not logged in to this region simulator", | 275 | "[INVENTORY ARCHIVER]: User {0} {1} {2} not logged in to this region simulator", |
276 | userInfo.UserProfile.Name, userInfo.UserProfile.ID); | 276 | userInfo.FirstName, userInfo.LastName, userInfo.PrincipalID); |
277 | } | 277 | } |
278 | } | 278 | } |
279 | } | 279 | } |
@@ -345,7 +345,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
345 | } | 345 | } |
346 | 346 | ||
347 | private void SaveInvConsoleCommandCompleted( | 347 | private void SaveInvConsoleCommandCompleted( |
348 | Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, | 348 | Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, |
349 | Exception reportedException) | 349 | Exception reportedException) |
350 | { | 350 | { |
351 | lock (m_pendingConsoleSaves) | 351 | lock (m_pendingConsoleSaves) |
@@ -358,13 +358,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
358 | 358 | ||
359 | if (succeeded) | 359 | if (succeeded) |
360 | { | 360 | { |
361 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0}", userInfo.UserProfile.Name); | 361 | m_log.InfoFormat("[INVENTORY ARCHIVER]: Saved archive for {0} {1}", userInfo.FirstName, userInfo.LastName); |
362 | } | 362 | } |
363 | else | 363 | else |
364 | { | 364 | { |
365 | m_log.ErrorFormat( | 365 | m_log.ErrorFormat( |
366 | "[INVENTORY ARCHIVER]: Archive save for {0} failed - {1}", | 366 | "[INVENTORY ARCHIVER]: Archive save for {0} {1} failed - {2}", |
367 | userInfo.UserProfile.Name, reportedException.Message); | 367 | userInfo.FirstName, userInfo.LastName, reportedException.Message); |
368 | } | 368 | } |
369 | } | 369 | } |
370 | 370 | ||
@@ -375,11 +375,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
375 | /// <param name="lastName"></param> | 375 | /// <param name="lastName"></param> |
376 | /// <param name="pass">User password</param> | 376 | /// <param name="pass">User password</param> |
377 | /// <returns></returns> | 377 | /// <returns></returns> |
378 | protected CachedUserInfo GetUserInfo(string firstName, string lastName, string pass) | 378 | protected UserAccount GetUserInfo(string firstName, string lastName, string pass) |
379 | { | 379 | { |
380 | CachedUserInfo userInfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(firstName, lastName); | 380 | UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, firstName, lastName); |
381 | //m_aScene.CommsManager.UserService.GetUserProfile(firstName, lastName); | 381 | if (null == account) |
382 | if (null == userInfo) | ||
383 | { | 382 | { |
384 | m_log.ErrorFormat( | 383 | m_log.ErrorFormat( |
385 | "[INVENTORY ARCHIVER]: Failed to find user info for {0} {1}", | 384 | "[INVENTORY ARCHIVER]: Failed to find user info for {0} {1}", |
@@ -389,9 +388,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
389 | 388 | ||
390 | try | 389 | try |
391 | { | 390 | { |
392 | if (m_aScene.CommsManager.UserService.AuthenticateUserByPassword(userInfo.UserProfile.ID, pass)) | 391 | if (m_aScene.AuthenticationService.Authenticate(account.PrincipalID, pass, 1) != string.Empty) |
393 | { | 392 | { |
394 | return userInfo; | 393 | return account; |
395 | } | 394 | } |
396 | else | 395 | else |
397 | { | 396 | { |
@@ -412,14 +411,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
412 | /// Notify the client of loaded nodes if they are logged in | 411 | /// Notify the client of loaded nodes if they are logged in |
413 | /// </summary> | 412 | /// </summary> |
414 | /// <param name="loadedNodes">Can be empty. In which case, nothing happens</param> | 413 | /// <param name="loadedNodes">Can be empty. In which case, nothing happens</param> |
415 | private void UpdateClientWithLoadedNodes(CachedUserInfo userInfo, List<InventoryNodeBase> loadedNodes) | 414 | private void UpdateClientWithLoadedNodes(UserAccount userInfo, List<InventoryNodeBase> loadedNodes) |
416 | { | 415 | { |
417 | if (loadedNodes.Count == 0) | 416 | if (loadedNodes.Count == 0) |
418 | return; | 417 | return; |
419 | 418 | ||
420 | foreach (Scene scene in m_scenes.Values) | 419 | foreach (Scene scene in m_scenes.Values) |
421 | { | 420 | { |
422 | ScenePresence user = scene.GetScenePresence(userInfo.UserProfile.ID); | 421 | ScenePresence user = scene.GetScenePresence(userInfo.PrincipalID); |
423 | 422 | ||
424 | if (user != null && !user.IsChildAgent) | 423 | if (user != null && !user.IsChildAgent) |
425 | { | 424 | { |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs index e4dad18..9c95e78 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs | |||
@@ -38,7 +38,7 @@ using OpenSim.Framework; | |||
38 | using OpenSim.Framework.Serialization; | 38 | using OpenSim.Framework.Serialization; |
39 | using OpenSim.Framework.Serialization.External; | 39 | using OpenSim.Framework.Serialization.External; |
40 | using OpenSim.Framework.Communications; | 40 | using OpenSim.Framework.Communications; |
41 | using OpenSim.Framework.Communications.Cache; | 41 | |
42 | using OpenSim.Framework.Communications.Osp; | 42 | using OpenSim.Framework.Communications.Osp; |
43 | using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver; | 43 | using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver; |
44 | using OpenSim.Region.CoreModules.World.Serialiser; | 44 | using OpenSim.Region.CoreModules.World.Serialiser; |
@@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
65 | } | 65 | } |
66 | 66 | ||
67 | private void SaveCompleted( | 67 | private void SaveCompleted( |
68 | Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, | 68 | Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, |
69 | Exception reportedException) | 69 | Exception reportedException) |
70 | { | 70 | { |
71 | mre.Set(); | 71 | mre.Set(); |
@@ -76,124 +76,126 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
76 | /// </summary> | 76 | /// </summary> |
77 | // Commenting for now! The mock inventory service needs more beef, at least for | 77 | // Commenting for now! The mock inventory service needs more beef, at least for |
78 | // GetFolderForType | 78 | // GetFolderForType |
79 | [Test] | 79 | // REFACTORING PROBLEM. This needs to be rewritten. |
80 | public void TestSaveIarV0_1() | 80 | |
81 | { | 81 | // [Test] |
82 | TestHelper.InMethod(); | 82 | // public void TestSaveIarV0_1() |
83 | //log4net.Config.XmlConfigurator.Configure(); | 83 | // { |
84 | 84 | // TestHelper.InMethod(); | |
85 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); | 85 | // //log4net.Config.XmlConfigurator.Configure(); |
86 | 86 | ||
87 | Scene scene = SceneSetupHelpers.SetupScene("Inventory"); | 87 | // InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); |
88 | SceneSetupHelpers.SetupSceneModules(scene, archiverModule); | 88 | |
89 | CommunicationsManager cm = scene.CommsManager; | 89 | // Scene scene = SceneSetupHelpers.SetupScene("Inventory"); |
90 | 90 | // SceneSetupHelpers.SetupSceneModules(scene, archiverModule); | |
91 | // Create user | 91 | // CommunicationsManager cm = scene.CommsManager; |
92 | string userFirstName = "Jock"; | 92 | |
93 | string userLastName = "Stirrup"; | 93 | // // Create user |
94 | UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020"); | 94 | // string userFirstName = "Jock"; |
95 | 95 | // string userLastName = "Stirrup"; | |
96 | lock (this) | 96 | // UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020"); |
97 | { | 97 | |
98 | UserProfileTestUtils.CreateUserWithInventory( | 98 | // lock (this) |
99 | cm, userFirstName, userLastName, userId, InventoryReceived); | 99 | // { |
100 | Monitor.Wait(this, 60000); | 100 | // UserProfileTestUtils.CreateUserWithInventory( |
101 | } | 101 | // cm, userFirstName, userLastName, userId, InventoryReceived); |
102 | 102 | // Monitor.Wait(this, 60000); | |
103 | // Create asset | 103 | // } |
104 | SceneObjectGroup object1; | 104 | |
105 | SceneObjectPart part1; | 105 | // // Create asset |
106 | { | 106 | // SceneObjectGroup object1; |
107 | string partName = "My Little Dog Object"; | 107 | // SceneObjectPart part1; |
108 | UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040"); | 108 | // { |
109 | PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere(); | 109 | // string partName = "My Little Dog Object"; |
110 | Vector3 groupPosition = new Vector3(10, 20, 30); | 110 | // UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040"); |
111 | Quaternion rotationOffset = new Quaternion(20, 30, 40, 50); | 111 | // PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere(); |
112 | Vector3 offsetPosition = new Vector3(5, 10, 15); | 112 | // Vector3 groupPosition = new Vector3(10, 20, 30); |
113 | 113 | // Quaternion rotationOffset = new Quaternion(20, 30, 40, 50); | |
114 | part1 | 114 | // Vector3 offsetPosition = new Vector3(5, 10, 15); |
115 | = new SceneObjectPart( | 115 | |
116 | ownerId, shape, groupPosition, rotationOffset, offsetPosition); | 116 | // part1 |
117 | part1.Name = partName; | 117 | // = new SceneObjectPart( |
118 | 118 | // ownerId, shape, groupPosition, rotationOffset, offsetPosition); | |
119 | object1 = new SceneObjectGroup(part1); | 119 | // part1.Name = partName; |
120 | scene.AddNewSceneObject(object1, false); | 120 | |
121 | } | 121 | // object1 = new SceneObjectGroup(part1); |
122 | 122 | // scene.AddNewSceneObject(object1, false); | |
123 | UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060"); | 123 | // } |
124 | AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1); | 124 | |
125 | scene.AssetService.Store(asset1); | 125 | // UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060"); |
126 | 126 | // AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1); | |
127 | // Create item | 127 | // scene.AssetService.Store(asset1); |
128 | UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080"); | 128 | |
129 | InventoryItemBase item1 = new InventoryItemBase(); | 129 | // // Create item |
130 | item1.Name = "My Little Dog"; | 130 | // UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080"); |
131 | item1.AssetID = asset1.FullID; | 131 | // InventoryItemBase item1 = new InventoryItemBase(); |
132 | item1.ID = item1Id; | 132 | // item1.Name = "My Little Dog"; |
133 | InventoryFolderBase objsFolder | 133 | // item1.AssetID = asset1.FullID; |
134 | = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects"); | 134 | // item1.ID = item1Id; |
135 | item1.Folder = objsFolder.ID; | 135 | // InventoryFolderBase objsFolder |
136 | scene.AddInventoryItem(userId, item1); | 136 | // = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects"); |
137 | 137 | // item1.Folder = objsFolder.ID; | |
138 | MemoryStream archiveWriteStream = new MemoryStream(); | 138 | // scene.AddInventoryItem(userId, item1); |
139 | archiverModule.OnInventoryArchiveSaved += SaveCompleted; | 139 | |
140 | 140 | // MemoryStream archiveWriteStream = new MemoryStream(); | |
141 | mre.Reset(); | 141 | // archiverModule.OnInventoryArchiveSaved += SaveCompleted; |
142 | archiverModule.ArchiveInventory( | 142 | |
143 | Guid.NewGuid(), userFirstName, userLastName, "Objects", "troll", archiveWriteStream); | 143 | // mre.Reset(); |
144 | mre.WaitOne(60000, false); | 144 | // archiverModule.ArchiveInventory( |
145 | 145 | // Guid.NewGuid(), userFirstName, userLastName, "Objects", "troll", archiveWriteStream); | |
146 | byte[] archive = archiveWriteStream.ToArray(); | 146 | // mre.WaitOne(60000, false); |
147 | MemoryStream archiveReadStream = new MemoryStream(archive); | 147 | |
148 | TarArchiveReader tar = new TarArchiveReader(archiveReadStream); | 148 | // byte[] archive = archiveWriteStream.ToArray(); |
149 | 149 | // MemoryStream archiveReadStream = new MemoryStream(archive); | |
150 | //bool gotControlFile = false; | 150 | // TarArchiveReader tar = new TarArchiveReader(archiveReadStream); |
151 | bool gotObject1File = false; | 151 | |
152 | //bool gotObject2File = false; | 152 | // //bool gotControlFile = false; |
153 | string expectedObject1FileName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1); | 153 | // bool gotObject1File = false; |
154 | string expectedObject1FilePath = string.Format( | 154 | // //bool gotObject2File = false; |
155 | "{0}{1}{2}", | 155 | // string expectedObject1FileName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1); |
156 | ArchiveConstants.INVENTORY_PATH, | 156 | // string expectedObject1FilePath = string.Format( |
157 | InventoryArchiveWriteRequest.CreateArchiveFolderName(objsFolder), | 157 | // "{0}{1}{2}", |
158 | expectedObject1FileName); | 158 | // ArchiveConstants.INVENTORY_PATH, |
159 | 159 | // InventoryArchiveWriteRequest.CreateArchiveFolderName(objsFolder), | |
160 | string filePath; | 160 | // expectedObject1FileName); |
161 | TarArchiveReader.TarEntryType tarEntryType; | 161 | |
162 | 162 | // string filePath; | |
163 | Console.WriteLine("Reading archive"); | 163 | // TarArchiveReader.TarEntryType tarEntryType; |
164 | 164 | ||
165 | while (tar.ReadEntry(out filePath, out tarEntryType) != null) | 165 | // Console.WriteLine("Reading archive"); |
166 | { | 166 | |
167 | Console.WriteLine("Got {0}", filePath); | 167 | // while (tar.ReadEntry(out filePath, out tarEntryType) != null) |
168 | 168 | // { | |
169 | // if (ArchiveConstants.CONTROL_FILE_PATH == filePath) | 169 | // Console.WriteLine("Got {0}", filePath); |
170 | |||
171 | //// if (ArchiveConstants.CONTROL_FILE_PATH == filePath) | ||
172 | //// { | ||
173 | //// gotControlFile = true; | ||
174 | //// } | ||
175 | |||
176 | // if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml")) | ||
170 | // { | 177 | // { |
171 | // gotControlFile = true; | 178 | //// string fileName = filePath.Remove(0, "Objects/".Length); |
179 | //// | ||
180 | //// if (fileName.StartsWith(part1.Name)) | ||
181 | //// { | ||
182 | // Assert.That(expectedObject1FilePath, Is.EqualTo(filePath)); | ||
183 | // gotObject1File = true; | ||
184 | //// } | ||
185 | //// else if (fileName.StartsWith(part2.Name)) | ||
186 | //// { | ||
187 | //// Assert.That(fileName, Is.EqualTo(expectedObject2FileName)); | ||
188 | //// gotObject2File = true; | ||
189 | //// } | ||
172 | // } | 190 | // } |
173 | 191 | // } | |
174 | if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml")) | ||
175 | { | ||
176 | // string fileName = filePath.Remove(0, "Objects/".Length); | ||
177 | // | ||
178 | // if (fileName.StartsWith(part1.Name)) | ||
179 | // { | ||
180 | Assert.That(expectedObject1FilePath, Is.EqualTo(filePath)); | ||
181 | gotObject1File = true; | ||
182 | // } | ||
183 | // else if (fileName.StartsWith(part2.Name)) | ||
184 | // { | ||
185 | // Assert.That(fileName, Is.EqualTo(expectedObject2FileName)); | ||
186 | // gotObject2File = true; | ||
187 | // } | ||
188 | } | ||
189 | } | ||
190 | 192 | ||
191 | // Assert.That(gotControlFile, Is.True, "No control file in archive"); | 193 | //// Assert.That(gotControlFile, Is.True, "No control file in archive"); |
192 | Assert.That(gotObject1File, Is.True, "No item1 file in archive"); | 194 | // Assert.That(gotObject1File, Is.True, "No item1 file in archive"); |
193 | // Assert.That(gotObject2File, Is.True, "No object2 file in archive"); | 195 | //// Assert.That(gotObject2File, Is.True, "No object2 file in archive"); |
194 | 196 | ||
195 | // TODO: Test presence of more files and contents of files. | 197 | // // TODO: Test presence of more files and contents of files. |
196 | } | 198 | // } |
197 | 199 | ||
198 | /// <summary> | 200 | /// <summary> |
199 | /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where | 201 | /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where |
@@ -201,187 +203,189 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
201 | /// </summary> | 203 | /// </summary> |
202 | /// | 204 | /// |
203 | /// This test also does some deeper probing of loading into nested inventory structures | 205 | /// This test also does some deeper probing of loading into nested inventory structures |
204 | [Test] | 206 | /// REFACTORING PROBLEM. This needs to be rewritten. |
205 | public void TestLoadIarV0_1ExistingUsers() | 207 | // [Test] |
206 | { | 208 | // public void TestLoadIarV0_1ExistingUsers() |
207 | TestHelper.InMethod(); | 209 | // { |
208 | 210 | // TestHelper.InMethod(); | |
209 | //log4net.Config.XmlConfigurator.Configure(); | 211 | |
210 | 212 | // //log4net.Config.XmlConfigurator.Configure(); | |
211 | string userFirstName = "Mr"; | 213 | |
212 | string userLastName = "Tiddles"; | 214 | // string userFirstName = "Mr"; |
213 | UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000555"); | 215 | // string userLastName = "Tiddles"; |
214 | string userItemCreatorFirstName = "Lord"; | 216 | // UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000555"); |
215 | string userItemCreatorLastName = "Lucan"; | 217 | // string userItemCreatorFirstName = "Lord"; |
216 | UUID userItemCreatorUuid = UUID.Parse("00000000-0000-0000-0000-000000000666"); | 218 | // string userItemCreatorLastName = "Lucan"; |
217 | 219 | // UUID userItemCreatorUuid = UUID.Parse("00000000-0000-0000-0000-000000000666"); | |
218 | string item1Name = "b.lsl"; | 220 | |
219 | string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1Name, UUID.Random()); | 221 | // string item1Name = "b.lsl"; |
220 | 222 | // string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1Name, UUID.Random()); | |
221 | MemoryStream archiveWriteStream = new MemoryStream(); | 223 | |
222 | TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); | 224 | // MemoryStream archiveWriteStream = new MemoryStream(); |
223 | 225 | // TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); | |
224 | InventoryItemBase item1 = new InventoryItemBase(); | 226 | |
225 | item1.Name = item1Name; | 227 | // InventoryItemBase item1 = new InventoryItemBase(); |
226 | item1.AssetID = UUID.Random(); | 228 | // item1.Name = item1Name; |
227 | item1.GroupID = UUID.Random(); | 229 | // item1.AssetID = UUID.Random(); |
228 | item1.CreatorId = OspResolver.MakeOspa(userItemCreatorFirstName, userItemCreatorLastName); | 230 | // item1.GroupID = UUID.Random(); |
229 | //item1.CreatorId = userUuid.ToString(); | 231 | // item1.CreatorId = OspResolver.MakeOspa(userItemCreatorFirstName, userItemCreatorLastName); |
230 | //item1.CreatorId = "00000000-0000-0000-0000-000000000444"; | 232 | // //item1.CreatorId = userUuid.ToString(); |
231 | item1.Owner = UUID.Zero; | 233 | // //item1.CreatorId = "00000000-0000-0000-0000-000000000444"; |
232 | 234 | // item1.Owner = UUID.Zero; | |
233 | string item1FileName | 235 | |
234 | = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName); | 236 | // string item1FileName |
235 | tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1)); | 237 | // = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName); |
236 | tar.Close(); | 238 | // tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1)); |
237 | 239 | // tar.Close(); | |
238 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | 240 | |
239 | SerialiserModule serialiserModule = new SerialiserModule(); | 241 | // MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); |
240 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); | 242 | // SerialiserModule serialiserModule = new SerialiserModule(); |
241 | 243 | // InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); | |
242 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene | 244 | |
243 | Scene scene = SceneSetupHelpers.SetupScene("inventory"); | 245 | // // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene |
244 | IUserAdminService userAdminService = scene.CommsManager.UserAdminService; | 246 | // Scene scene = SceneSetupHelpers.SetupScene("inventory"); |
245 | 247 | // IUserAdminService userAdminService = scene.CommsManager.UserAdminService; | |
246 | SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); | 248 | |
247 | userAdminService.AddUser( | 249 | // SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); |
248 | userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid); | 250 | // userAdminService.AddUser( |
249 | userAdminService.AddUser( | 251 | // userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid); |
250 | userItemCreatorFirstName, userItemCreatorLastName, "hampshire", | 252 | // userAdminService.AddUser( |
251 | String.Empty, 1000, 1000, userItemCreatorUuid); | 253 | // userItemCreatorFirstName, userItemCreatorLastName, "hampshire", |
252 | 254 | // String.Empty, 1000, 1000, userItemCreatorUuid); | |
253 | archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "meowfood", archiveReadStream); | 255 | |
254 | 256 | // archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "meowfood", archiveReadStream); | |
255 | CachedUserInfo userInfo | 257 | |
256 | = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName); | 258 | // CachedUserInfo userInfo |
257 | 259 | // = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName); | |
258 | InventoryItemBase foundItem1 | 260 | |
259 | = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, item1Name); | 261 | // InventoryItemBase foundItem1 |
260 | 262 | // = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, item1Name); | |
261 | Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1"); | 263 | |
262 | 264 | // Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1"); | |
263 | // We have to disable this check since loaded items that did find users via OSPA resolution are now only storing the | 265 | |
264 | // UUID, not the OSPA itself. | 266 | //// We have to disable this check since loaded items that did find users via OSPA resolution are now only storing the |
267 | //// UUID, not the OSPA itself. | ||
268 | //// Assert.That( | ||
269 | //// foundItem1.CreatorId, Is.EqualTo(item1.CreatorId), | ||
270 | //// "Loaded item non-uuid creator doesn't match original"); | ||
265 | // Assert.That( | 271 | // Assert.That( |
266 | // foundItem1.CreatorId, Is.EqualTo(item1.CreatorId), | 272 | // foundItem1.CreatorId, Is.EqualTo(userItemCreatorUuid.ToString()), |
267 | // "Loaded item non-uuid creator doesn't match original"); | 273 | // "Loaded item non-uuid creator doesn't match original"); |
268 | Assert.That( | ||
269 | foundItem1.CreatorId, Is.EqualTo(userItemCreatorUuid.ToString()), | ||
270 | "Loaded item non-uuid creator doesn't match original"); | ||
271 | |||
272 | Assert.That( | ||
273 | foundItem1.CreatorIdAsUuid, Is.EqualTo(userItemCreatorUuid), | ||
274 | "Loaded item uuid creator doesn't match original"); | ||
275 | Assert.That(foundItem1.Owner, Is.EqualTo(userUuid), | ||
276 | "Loaded item owner doesn't match inventory reciever"); | ||
277 | |||
278 | // Now try loading to a root child folder | ||
279 | UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, userInfo.UserProfile.ID, "xA"); | ||
280 | archiveReadStream = new MemoryStream(archiveReadStream.ToArray()); | ||
281 | archiverModule.DearchiveInventory(userFirstName, userLastName, "xA", "meowfood", archiveReadStream); | ||
282 | |||
283 | InventoryItemBase foundItem2 | ||
284 | = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, "xA/" + item1Name); | ||
285 | Assert.That(foundItem2, Is.Not.Null, "Didn't find loaded item 2"); | ||
286 | |||
287 | // Now try loading to a more deeply nested folder | ||
288 | UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, userInfo.UserProfile.ID, "xB/xC"); | ||
289 | archiveReadStream = new MemoryStream(archiveReadStream.ToArray()); | ||
290 | archiverModule.DearchiveInventory(userFirstName, userLastName, "xB/xC", "meowfood", archiveReadStream); | ||
291 | |||
292 | InventoryItemBase foundItem3 | ||
293 | = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, "xB/xC/" + item1Name); | ||
294 | Assert.That(foundItem3, Is.Not.Null, "Didn't find loaded item 3"); | ||
295 | } | ||
296 | |||
297 | [Test] | ||
298 | public void TestIarV0_1WithEscapedChars() | ||
299 | { | ||
300 | TestHelper.InMethod(); | ||
301 | // log4net.Config.XmlConfigurator.Configure(); | ||
302 | |||
303 | string itemName = "You & you are a mean/man/"; | ||
304 | string humanEscapedItemName = @"You & you are a mean\/man\/"; | ||
305 | string userPassword = "meowfood"; | ||
306 | |||
307 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); | ||
308 | |||
309 | Scene scene = SceneSetupHelpers.SetupScene("Inventory"); | ||
310 | SceneSetupHelpers.SetupSceneModules(scene, archiverModule); | ||
311 | CommunicationsManager cm = scene.CommsManager; | ||
312 | |||
313 | // Create user | ||
314 | string userFirstName = "Jock"; | ||
315 | string userLastName = "Stirrup"; | ||
316 | UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020"); | ||
317 | |||
318 | lock (this) | ||
319 | { | ||
320 | UserProfileTestUtils.CreateUserWithInventory( | ||
321 | cm, userFirstName, userLastName, userPassword, userId, InventoryReceived); | ||
322 | Monitor.Wait(this, 60000); | ||
323 | } | ||
324 | |||
325 | // Create asset | ||
326 | SceneObjectGroup object1; | ||
327 | SceneObjectPart part1; | ||
328 | { | ||
329 | string partName = "part name"; | ||
330 | UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040"); | ||
331 | PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere(); | ||
332 | Vector3 groupPosition = new Vector3(10, 20, 30); | ||
333 | Quaternion rotationOffset = new Quaternion(20, 30, 40, 50); | ||
334 | Vector3 offsetPosition = new Vector3(5, 10, 15); | ||
335 | |||
336 | part1 | ||
337 | = new SceneObjectPart( | ||
338 | ownerId, shape, groupPosition, rotationOffset, offsetPosition); | ||
339 | part1.Name = partName; | ||
340 | |||
341 | object1 = new SceneObjectGroup(part1); | ||
342 | scene.AddNewSceneObject(object1, false); | ||
343 | } | ||
344 | |||
345 | UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060"); | ||
346 | AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1); | ||
347 | scene.AssetService.Store(asset1); | ||
348 | |||
349 | // Create item | ||
350 | UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080"); | ||
351 | InventoryItemBase item1 = new InventoryItemBase(); | ||
352 | item1.Name = itemName; | ||
353 | item1.AssetID = asset1.FullID; | ||
354 | item1.ID = item1Id; | ||
355 | InventoryFolderBase objsFolder | ||
356 | = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects"); | ||
357 | item1.Folder = objsFolder.ID; | ||
358 | scene.AddInventoryItem(userId, item1); | ||
359 | |||
360 | MemoryStream archiveWriteStream = new MemoryStream(); | ||
361 | archiverModule.OnInventoryArchiveSaved += SaveCompleted; | ||
362 | |||
363 | mre.Reset(); | ||
364 | archiverModule.ArchiveInventory( | ||
365 | Guid.NewGuid(), userFirstName, userLastName, "Objects", userPassword, archiveWriteStream); | ||
366 | mre.WaitOne(60000, false); | ||
367 | |||
368 | // LOAD ITEM | ||
369 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | ||
370 | |||
371 | archiverModule.DearchiveInventory(userFirstName, userLastName, "Scripts", userPassword, archiveReadStream); | ||
372 | |||
373 | InventoryItemBase foundItem1 | ||
374 | = InventoryArchiveUtils.FindItemByPath( | ||
375 | scene.InventoryService, userId, "Scripts/Objects/" + humanEscapedItemName); | ||
376 | 274 | ||
377 | Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1"); | ||
378 | // Assert.That( | 275 | // Assert.That( |
379 | // foundItem1.CreatorId, Is.EqualTo(userUuid), | 276 | // foundItem1.CreatorIdAsUuid, Is.EqualTo(userItemCreatorUuid), |
380 | // "Loaded item non-uuid creator doesn't match that of the loading user"); | 277 | // "Loaded item uuid creator doesn't match original"); |
381 | Assert.That( | 278 | // Assert.That(foundItem1.Owner, Is.EqualTo(userUuid), |
382 | foundItem1.Name, Is.EqualTo(itemName), | 279 | // "Loaded item owner doesn't match inventory reciever"); |
383 | "Loaded item name doesn't match saved name"); | 280 | |
384 | } | 281 | // // Now try loading to a root child folder |
282 | // UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, userInfo.UserProfile.ID, "xA"); | ||
283 | // archiveReadStream = new MemoryStream(archiveReadStream.ToArray()); | ||
284 | // archiverModule.DearchiveInventory(userFirstName, userLastName, "xA", "meowfood", archiveReadStream); | ||
285 | |||
286 | // InventoryItemBase foundItem2 | ||
287 | // = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, "xA/" + item1Name); | ||
288 | // Assert.That(foundItem2, Is.Not.Null, "Didn't find loaded item 2"); | ||
289 | |||
290 | // // Now try loading to a more deeply nested folder | ||
291 | // UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, userInfo.UserProfile.ID, "xB/xC"); | ||
292 | // archiveReadStream = new MemoryStream(archiveReadStream.ToArray()); | ||
293 | // archiverModule.DearchiveInventory(userFirstName, userLastName, "xB/xC", "meowfood", archiveReadStream); | ||
294 | |||
295 | // InventoryItemBase foundItem3 | ||
296 | // = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, "xB/xC/" + item1Name); | ||
297 | // Assert.That(foundItem3, Is.Not.Null, "Didn't find loaded item 3"); | ||
298 | //} | ||
299 | |||
300 | // REFACTORING PROBLEM. Needs rewrite. | ||
301 | // [Test] | ||
302 | // public void TestIarV0_1WithEscapedChars() | ||
303 | // { | ||
304 | // TestHelper.InMethod(); | ||
305 | //// log4net.Config.XmlConfigurator.Configure(); | ||
306 | |||
307 | // string itemName = "You & you are a mean/man/"; | ||
308 | // string humanEscapedItemName = @"You & you are a mean\/man\/"; | ||
309 | // string userPassword = "meowfood"; | ||
310 | |||
311 | // InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); | ||
312 | |||
313 | // Scene scene = SceneSetupHelpers.SetupScene("Inventory"); | ||
314 | // SceneSetupHelpers.SetupSceneModules(scene, archiverModule); | ||
315 | // CommunicationsManager cm = scene.CommsManager; | ||
316 | |||
317 | // // Create user | ||
318 | // string userFirstName = "Jock"; | ||
319 | // string userLastName = "Stirrup"; | ||
320 | // UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020"); | ||
321 | |||
322 | // lock (this) | ||
323 | // { | ||
324 | // UserProfileTestUtils.CreateUserWithInventory( | ||
325 | // cm, userFirstName, userLastName, userPassword, userId, InventoryReceived); | ||
326 | // Monitor.Wait(this, 60000); | ||
327 | // } | ||
328 | |||
329 | // // Create asset | ||
330 | // SceneObjectGroup object1; | ||
331 | // SceneObjectPart part1; | ||
332 | // { | ||
333 | // string partName = "part name"; | ||
334 | // UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040"); | ||
335 | // PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere(); | ||
336 | // Vector3 groupPosition = new Vector3(10, 20, 30); | ||
337 | // Quaternion rotationOffset = new Quaternion(20, 30, 40, 50); | ||
338 | // Vector3 offsetPosition = new Vector3(5, 10, 15); | ||
339 | |||
340 | // part1 | ||
341 | // = new SceneObjectPart( | ||
342 | // ownerId, shape, groupPosition, rotationOffset, offsetPosition); | ||
343 | // part1.Name = partName; | ||
344 | |||
345 | // object1 = new SceneObjectGroup(part1); | ||
346 | // scene.AddNewSceneObject(object1, false); | ||
347 | // } | ||
348 | |||
349 | // UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060"); | ||
350 | // AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1); | ||
351 | // scene.AssetService.Store(asset1); | ||
352 | |||
353 | // // Create item | ||
354 | // UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080"); | ||
355 | // InventoryItemBase item1 = new InventoryItemBase(); | ||
356 | // item1.Name = itemName; | ||
357 | // item1.AssetID = asset1.FullID; | ||
358 | // item1.ID = item1Id; | ||
359 | // InventoryFolderBase objsFolder | ||
360 | // = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects"); | ||
361 | // item1.Folder = objsFolder.ID; | ||
362 | // scene.AddInventoryItem(userId, item1); | ||
363 | |||
364 | // MemoryStream archiveWriteStream = new MemoryStream(); | ||
365 | // archiverModule.OnInventoryArchiveSaved += SaveCompleted; | ||
366 | |||
367 | // mre.Reset(); | ||
368 | // archiverModule.ArchiveInventory( | ||
369 | // Guid.NewGuid(), userFirstName, userLastName, "Objects", userPassword, archiveWriteStream); | ||
370 | // mre.WaitOne(60000, false); | ||
371 | |||
372 | // // LOAD ITEM | ||
373 | // MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | ||
374 | |||
375 | // archiverModule.DearchiveInventory(userFirstName, userLastName, "Scripts", userPassword, archiveReadStream); | ||
376 | |||
377 | // InventoryItemBase foundItem1 | ||
378 | // = InventoryArchiveUtils.FindItemByPath( | ||
379 | // scene.InventoryService, userId, "Scripts/Objects/" + humanEscapedItemName); | ||
380 | |||
381 | // Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1"); | ||
382 | //// Assert.That( | ||
383 | //// foundItem1.CreatorId, Is.EqualTo(userUuid), | ||
384 | //// "Loaded item non-uuid creator doesn't match that of the loading user"); | ||
385 | // Assert.That( | ||
386 | // foundItem1.Name, Is.EqualTo(itemName), | ||
387 | // "Loaded item name doesn't match saved name"); | ||
388 | // } | ||
385 | 389 | ||
386 | /// <summary> | 390 | /// <summary> |
387 | /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where | 391 | /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where |
@@ -390,199 +394,203 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests | |||
390 | /// | 394 | /// |
391 | /// This may possibly one day get overtaken by the as yet incomplete temporary profiles feature | 395 | /// This may possibly one day get overtaken by the as yet incomplete temporary profiles feature |
392 | /// (as tested in the a later commented out test) | 396 | /// (as tested in the a later commented out test) |
393 | [Test] | 397 | /// REFACTORING PROBLEM. Needs rewrite. |
394 | public void TestLoadIarV0_1AbsentUsers() | 398 | // [Test] |
395 | { | 399 | // public void TestLoadIarV0_1AbsentUsers() |
396 | TestHelper.InMethod(); | 400 | // { |
397 | 401 | // TestHelper.InMethod(); | |
398 | //log4net.Config.XmlConfigurator.Configure(); | 402 | |
399 | 403 | // //log4net.Config.XmlConfigurator.Configure(); | |
400 | string userFirstName = "Charlie"; | 404 | |
401 | string userLastName = "Chan"; | 405 | // string userFirstName = "Charlie"; |
402 | UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000999"); | 406 | // string userLastName = "Chan"; |
403 | string userItemCreatorFirstName = "Bat"; | 407 | // UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000999"); |
404 | string userItemCreatorLastName = "Man"; | 408 | // string userItemCreatorFirstName = "Bat"; |
405 | //UUID userItemCreatorUuid = UUID.Parse("00000000-0000-0000-0000-000000008888"); | 409 | // string userItemCreatorLastName = "Man"; |
406 | 410 | // //UUID userItemCreatorUuid = UUID.Parse("00000000-0000-0000-0000-000000008888"); | |
407 | string itemName = "b.lsl"; | 411 | |
408 | string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random()); | 412 | // string itemName = "b.lsl"; |
409 | 413 | // string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random()); | |
410 | MemoryStream archiveWriteStream = new MemoryStream(); | 414 | |
411 | TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); | 415 | // MemoryStream archiveWriteStream = new MemoryStream(); |
412 | 416 | // TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); | |
413 | InventoryItemBase item1 = new InventoryItemBase(); | 417 | |
414 | item1.Name = itemName; | 418 | // InventoryItemBase item1 = new InventoryItemBase(); |
415 | item1.AssetID = UUID.Random(); | 419 | // item1.Name = itemName; |
416 | item1.GroupID = UUID.Random(); | 420 | // item1.AssetID = UUID.Random(); |
417 | item1.CreatorId = OspResolver.MakeOspa(userItemCreatorFirstName, userItemCreatorLastName); | 421 | // item1.GroupID = UUID.Random(); |
418 | //item1.CreatorId = userUuid.ToString(); | 422 | // item1.CreatorId = OspResolver.MakeOspa(userItemCreatorFirstName, userItemCreatorLastName); |
419 | //item1.CreatorId = "00000000-0000-0000-0000-000000000444"; | 423 | // //item1.CreatorId = userUuid.ToString(); |
420 | item1.Owner = UUID.Zero; | 424 | // //item1.CreatorId = "00000000-0000-0000-0000-000000000444"; |
421 | 425 | // item1.Owner = UUID.Zero; | |
422 | string item1FileName | 426 | |
423 | = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName); | 427 | // string item1FileName |
424 | tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1)); | 428 | // = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName); |
425 | tar.Close(); | 429 | // tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1)); |
426 | 430 | // tar.Close(); | |
427 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | 431 | |
428 | SerialiserModule serialiserModule = new SerialiserModule(); | 432 | // MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); |
429 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); | 433 | // SerialiserModule serialiserModule = new SerialiserModule(); |
430 | 434 | // InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); | |
431 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene | 435 | |
432 | Scene scene = SceneSetupHelpers.SetupScene("inventory"); | 436 | // // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene |
433 | IUserAdminService userAdminService = scene.CommsManager.UserAdminService; | 437 | // Scene scene = SceneSetupHelpers.SetupScene("inventory"); |
434 | 438 | // IUserAdminService userAdminService = scene.CommsManager.UserAdminService; | |
435 | SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); | 439 | |
436 | userAdminService.AddUser( | 440 | // SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); |
437 | userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid); | 441 | // userAdminService.AddUser( |
438 | 442 | // userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid); | |
439 | archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "meowfood", archiveReadStream); | 443 | |
440 | 444 | // archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "meowfood", archiveReadStream); | |
441 | CachedUserInfo userInfo | 445 | |
442 | = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName); | 446 | // CachedUserInfo userInfo |
443 | 447 | // = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName); | |
444 | InventoryItemBase foundItem1 | 448 | |
445 | = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, itemName); | 449 | // InventoryItemBase foundItem1 |
446 | 450 | // = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, itemName); | |
447 | Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1"); | 451 | |
452 | // Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1"); | ||
453 | //// Assert.That( | ||
454 | //// foundItem1.CreatorId, Is.EqualTo(userUuid), | ||
455 | //// "Loaded item non-uuid creator doesn't match that of the loading user"); | ||
448 | // Assert.That( | 456 | // Assert.That( |
449 | // foundItem1.CreatorId, Is.EqualTo(userUuid), | 457 | // foundItem1.CreatorIdAsUuid, Is.EqualTo(userUuid), |
450 | // "Loaded item non-uuid creator doesn't match that of the loading user"); | 458 | // "Loaded item uuid creator doesn't match that of the loading user"); |
451 | Assert.That( | 459 | // } |
452 | foundItem1.CreatorIdAsUuid, Is.EqualTo(userUuid), | ||
453 | "Loaded item uuid creator doesn't match that of the loading user"); | ||
454 | } | ||
455 | 460 | ||
456 | /// <summary> | 461 | /// <summary> |
457 | /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where | 462 | /// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where |
458 | /// no account exists with the creator name | 463 | /// no account exists with the creator name |
459 | /// </summary> | 464 | /// </summary> |
460 | /// Disabled since temporary profiles have not yet been implemented. | 465 | /// Disabled since temporary profiles have not yet been implemented. |
466 | /// REFACTORING PROBLEM. Needs rewrite. | ||
467 | /// | ||
461 | //[Test] | 468 | //[Test] |
462 | public void TestLoadIarV0_1TempProfiles() | 469 | //public void TestLoadIarV0_1TempProfiles() |
463 | { | 470 | //{ |
464 | TestHelper.InMethod(); | 471 | // TestHelper.InMethod(); |
465 | 472 | ||
466 | //log4net.Config.XmlConfigurator.Configure(); | 473 | // //log4net.Config.XmlConfigurator.Configure(); |
467 | 474 | ||
468 | string userFirstName = "Dennis"; | 475 | // string userFirstName = "Dennis"; |
469 | string userLastName = "Menace"; | 476 | // string userLastName = "Menace"; |
470 | UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000aaa"); | 477 | // UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000aaa"); |
471 | string user2FirstName = "Walter"; | 478 | // string user2FirstName = "Walter"; |
472 | string user2LastName = "Mitty"; | 479 | // string user2LastName = "Mitty"; |
473 | 480 | ||
474 | string itemName = "b.lsl"; | 481 | // string itemName = "b.lsl"; |
475 | string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random()); | 482 | // string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random()); |
476 | 483 | ||
477 | MemoryStream archiveWriteStream = new MemoryStream(); | 484 | // MemoryStream archiveWriteStream = new MemoryStream(); |
478 | TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); | 485 | // TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream); |
479 | 486 | ||
480 | InventoryItemBase item1 = new InventoryItemBase(); | 487 | // InventoryItemBase item1 = new InventoryItemBase(); |
481 | item1.Name = itemName; | 488 | // item1.Name = itemName; |
482 | item1.AssetID = UUID.Random(); | 489 | // item1.AssetID = UUID.Random(); |
483 | item1.GroupID = UUID.Random(); | 490 | // item1.GroupID = UUID.Random(); |
484 | item1.CreatorId = OspResolver.MakeOspa(user2FirstName, user2LastName); | 491 | // item1.CreatorId = OspResolver.MakeOspa(user2FirstName, user2LastName); |
485 | item1.Owner = UUID.Zero; | 492 | // item1.Owner = UUID.Zero; |
486 | 493 | ||
487 | string item1FileName | 494 | // string item1FileName |
488 | = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName); | 495 | // = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName); |
489 | tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1)); | 496 | // tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1)); |
490 | tar.Close(); | 497 | // tar.Close(); |
491 | 498 | ||
492 | MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); | 499 | // MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray()); |
493 | SerialiserModule serialiserModule = new SerialiserModule(); | 500 | // SerialiserModule serialiserModule = new SerialiserModule(); |
494 | InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); | 501 | // InventoryArchiverModule archiverModule = new InventoryArchiverModule(true); |
495 | 502 | ||
496 | // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene | 503 | // // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene |
497 | Scene scene = SceneSetupHelpers.SetupScene(); | 504 | // Scene scene = SceneSetupHelpers.SetupScene(); |
498 | IUserAdminService userAdminService = scene.CommsManager.UserAdminService; | 505 | // IUserAdminService userAdminService = scene.CommsManager.UserAdminService; |
499 | 506 | ||
500 | SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); | 507 | // SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule); |
501 | userAdminService.AddUser( | 508 | // userAdminService.AddUser( |
502 | userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid); | 509 | // userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid); |
503 | 510 | ||
504 | archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "troll", archiveReadStream); | 511 | // archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "troll", archiveReadStream); |
505 | 512 | ||
506 | // Check that a suitable temporary user profile has been created. | 513 | // // Check that a suitable temporary user profile has been created. |
507 | UserProfileData user2Profile | 514 | // UserProfileData user2Profile |
508 | = scene.CommsManager.UserService.GetUserProfile( | 515 | // = scene.CommsManager.UserService.GetUserProfile( |
509 | OspResolver.HashName(user2FirstName + " " + user2LastName)); | 516 | // OspResolver.HashName(user2FirstName + " " + user2LastName)); |
510 | Assert.That(user2Profile, Is.Not.Null); | 517 | // Assert.That(user2Profile, Is.Not.Null); |
511 | Assert.That(user2Profile.FirstName == user2FirstName); | 518 | // Assert.That(user2Profile.FirstName == user2FirstName); |
512 | Assert.That(user2Profile.SurName == user2LastName); | 519 | // Assert.That(user2Profile.SurName == user2LastName); |
513 | 520 | ||
514 | CachedUserInfo userInfo | 521 | // CachedUserInfo userInfo |
515 | = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName); | 522 | // = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName); |
516 | userInfo.OnInventoryReceived += InventoryReceived; | 523 | // userInfo.OnInventoryReceived += InventoryReceived; |
517 | 524 | ||
518 | lock (this) | 525 | // lock (this) |
519 | { | 526 | // { |
520 | userInfo.FetchInventory(); | 527 | // userInfo.FetchInventory(); |
521 | Monitor.Wait(this, 60000); | 528 | // Monitor.Wait(this, 60000); |
522 | } | 529 | // } |
523 | 530 | ||
524 | InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName); | 531 | // InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName); |
525 | 532 | ||
526 | Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId)); | 533 | // Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId)); |
527 | Assert.That( | 534 | // Assert.That( |
528 | foundItem.CreatorIdAsUuid, Is.EqualTo(OspResolver.HashName(user2FirstName + " " + user2LastName))); | 535 | // foundItem.CreatorIdAsUuid, Is.EqualTo(OspResolver.HashName(user2FirstName + " " + user2LastName))); |
529 | Assert.That(foundItem.Owner, Is.EqualTo(userUuid)); | 536 | // Assert.That(foundItem.Owner, Is.EqualTo(userUuid)); |
530 | 537 | ||
531 | Console.WriteLine("### Successfully completed {0} ###", MethodBase.GetCurrentMethod()); | 538 | // Console.WriteLine("### Successfully completed {0} ###", MethodBase.GetCurrentMethod()); |
532 | } | 539 | //} |
533 | 540 | ||
534 | /// <summary> | 541 | /// <summary> |
535 | /// Test replication of an archive path to the user's inventory. | 542 | /// Test replication of an archive path to the user's inventory. |
536 | /// </summary> | 543 | /// </summary> |
537 | [Test] | 544 | //[Test] |
538 | public void TestReplicateArchivePathToUserInventory() | 545 | //public void TestReplicateArchivePathToUserInventory() |
539 | { | 546 | //{ |
540 | TestHelper.InMethod(); | 547 | // TestHelper.InMethod(); |
541 | 548 | ||
542 | //log4net.Config.XmlConfigurator.Configure(); | 549 | // //log4net.Config.XmlConfigurator.Configure(); |
543 | 550 | ||
544 | Scene scene = SceneSetupHelpers.SetupScene("inventory"); | 551 | // Scene scene = SceneSetupHelpers.SetupScene("inventory"); |
545 | CommunicationsManager commsManager = scene.CommsManager; | 552 | // CommunicationsManager commsManager = scene.CommsManager; |
546 | CachedUserInfo userInfo; | 553 | // CachedUserInfo userInfo; |
547 | 554 | ||
548 | lock (this) | 555 | // lock (this) |
549 | { | 556 | // { |
550 | userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager, InventoryReceived); | 557 | // // !!! REFACTORING PROBLEM. This needs to be rewritten |
551 | Monitor.Wait(this, 60000); | 558 | // userInfo = UserProfileTestUtils.CreateUserWithInventory(commsManager, InventoryReceived); |
552 | } | 559 | // Monitor.Wait(this, 60000); |
553 | 560 | // } | |
554 | //Console.WriteLine("userInfo.RootFolder 1: {0}", userInfo.RootFolder); | 561 | |
555 | 562 | // //Console.WriteLine("userInfo.RootFolder 1: {0}", userInfo.RootFolder); | |
556 | Dictionary <string, InventoryFolderBase> foldersCreated = new Dictionary<string, InventoryFolderBase>(); | 563 | |
557 | List<InventoryNodeBase> nodesLoaded = new List<InventoryNodeBase>(); | 564 | // Dictionary <string, InventoryFolderBase> foldersCreated = new Dictionary<string, InventoryFolderBase>(); |
558 | 565 | // List<InventoryNodeBase> nodesLoaded = new List<InventoryNodeBase>(); | |
559 | string folder1Name = "a"; | 566 | |
560 | string folder2Name = "b"; | 567 | // string folder1Name = "a"; |
561 | string itemName = "c.lsl"; | 568 | // string folder2Name = "b"; |
562 | 569 | // string itemName = "c.lsl"; | |
563 | string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1Name, UUID.Random()); | 570 | |
564 | string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random()); | 571 | // string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1Name, UUID.Random()); |
565 | string itemArchiveName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random()); | 572 | // string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random()); |
566 | 573 | // string itemArchiveName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random()); | |
567 | string itemArchivePath | 574 | |
568 | = string.Format( | 575 | // string itemArchivePath |
569 | "{0}{1}{2}{3}", | 576 | // = string.Format( |
570 | ArchiveConstants.INVENTORY_PATH, folder1ArchiveName, folder2ArchiveName, itemArchiveName); | 577 | // "{0}{1}{2}{3}", |
571 | 578 | // ArchiveConstants.INVENTORY_PATH, folder1ArchiveName, folder2ArchiveName, itemArchiveName); | |
572 | //Console.WriteLine("userInfo.RootFolder 2: {0}", userInfo.RootFolder); | 579 | |
573 | 580 | // //Console.WriteLine("userInfo.RootFolder 2: {0}", userInfo.RootFolder); | |
574 | new InventoryArchiveReadRequest(scene, userInfo, null, (Stream)null) | 581 | |
575 | .ReplicateArchivePathToUserInventory( | 582 | // new InventoryArchiveReadRequest(scene, userInfo, null, (Stream)null) |
576 | itemArchivePath, false, scene.InventoryService.GetRootFolder(userInfo.UserProfile.ID), | 583 | // .ReplicateArchivePathToUserInventory( |
577 | foldersCreated, nodesLoaded); | 584 | // itemArchivePath, false, scene.InventoryService.GetRootFolder(userInfo.UserProfile.ID), |
578 | 585 | // foldersCreated, nodesLoaded); | |
579 | //Console.WriteLine("userInfo.RootFolder 3: {0}", userInfo.RootFolder); | 586 | |
580 | //InventoryFolderImpl folder1 = userInfo.RootFolder.FindFolderByPath("a"); | 587 | // //Console.WriteLine("userInfo.RootFolder 3: {0}", userInfo.RootFolder); |
581 | InventoryFolderBase folder1 | 588 | // //InventoryFolderImpl folder1 = userInfo.RootFolder.FindFolderByPath("a"); |
582 | = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userInfo.UserProfile.ID, "a"); | 589 | // InventoryFolderBase folder1 |
583 | Assert.That(folder1, Is.Not.Null, "Could not find folder a"); | 590 | // = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userInfo.UserProfile.ID, "a"); |
584 | InventoryFolderBase folder2 = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, "b"); | 591 | // Assert.That(folder1, Is.Not.Null, "Could not find folder a"); |
585 | Assert.That(folder2, Is.Not.Null, "Could not find folder b"); | 592 | // InventoryFolderBase folder2 = InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, "b"); |
586 | } | 593 | // Assert.That(folder2, Is.Not.Null, "Could not find folder b"); |
594 | //} | ||
587 | } | 595 | } |
588 | } | 596 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index d9a021f..4f03b0e 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | |||
@@ -32,14 +32,14 @@ using log4net; | |||
32 | using Nini.Config; | 32 | using Nini.Config; |
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Communications.Cache; | 35 | |
36 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
38 | using OpenSim.Services.Interfaces; | 38 | using OpenSim.Services.Interfaces; |
39 | 39 | ||
40 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | 40 | namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer |
41 | { | 41 | { |
42 | public class InventoryTransferModule : IInventoryTransferModule, IRegionModule | 42 | public class InventoryTransferModule : IInventoryTransferModule, ISharedRegionModule |
43 | { | 43 | { |
44 | private static readonly ILog m_log | 44 | private static readonly ILog m_log |
45 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 45 | = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
@@ -50,10 +50,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
50 | new Dictionary<UUID, Scene>(); | 50 | new Dictionary<UUID, Scene>(); |
51 | 51 | ||
52 | private IMessageTransferModule m_TransferModule = null; | 52 | private IMessageTransferModule m_TransferModule = null; |
53 | private bool m_Enabled = true; | ||
53 | 54 | ||
54 | #region IRegionModule Members | 55 | #region IRegionModule Members |
55 | 56 | ||
56 | public void Initialise(Scene scene, IConfigSource config) | 57 | public void Initialise(IConfigSource config) |
57 | { | 58 | { |
58 | if (config.Configs["Messaging"] != null) | 59 | if (config.Configs["Messaging"] != null) |
59 | { | 60 | { |
@@ -62,29 +63,56 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
62 | if (config.Configs["Messaging"].GetString( | 63 | if (config.Configs["Messaging"].GetString( |
63 | "InventoryTransferModule", "InventoryTransferModule") != | 64 | "InventoryTransferModule", "InventoryTransferModule") != |
64 | "InventoryTransferModule") | 65 | "InventoryTransferModule") |
66 | { | ||
67 | m_Enabled = false; | ||
65 | return; | 68 | return; |
69 | } | ||
66 | } | 70 | } |
71 | } | ||
67 | 72 | ||
68 | if (!m_Scenelist.Contains(scene)) | 73 | public void AddRegion(Scene scene) |
69 | { | 74 | { |
70 | m_Scenelist.Add(scene); | 75 | if (!m_Enabled) |
76 | return; | ||
71 | 77 | ||
72 | scene.RegisterModuleInterface<IInventoryTransferModule>(this); | 78 | m_Scenelist.Add(scene); |
73 | 79 | ||
74 | scene.EventManager.OnNewClient += OnNewClient; | 80 | scene.RegisterModuleInterface<IInventoryTransferModule>(this); |
75 | scene.EventManager.OnClientClosed += ClientLoggedOut; | 81 | |
76 | scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; | 82 | scene.EventManager.OnNewClient += OnNewClient; |
77 | } | 83 | scene.EventManager.OnClientClosed += ClientLoggedOut; |
84 | scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; | ||
78 | } | 85 | } |
79 | 86 | ||
80 | public void PostInitialise() | 87 | public void RegionLoaded(Scene scene) |
81 | { | 88 | { |
82 | if (m_Scenelist.Count > 0) | 89 | if (m_TransferModule == null) |
83 | { | 90 | { |
84 | m_TransferModule = m_Scenelist[0].RequestModuleInterface<IMessageTransferModule>(); | 91 | m_TransferModule = m_Scenelist[0].RequestModuleInterface<IMessageTransferModule>(); |
85 | if (m_TransferModule == null) | 92 | if (m_TransferModule == null) |
93 | { | ||
86 | m_log.Error("[INVENTORY TRANSFER] No Message transfer module found, transfers will be local only"); | 94 | m_log.Error("[INVENTORY TRANSFER] No Message transfer module found, transfers will be local only"); |
95 | m_Enabled = false; | ||
96 | |||
97 | m_Scenelist.Clear(); | ||
98 | scene.EventManager.OnNewClient -= OnNewClient; | ||
99 | scene.EventManager.OnClientClosed -= ClientLoggedOut; | ||
100 | scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; | ||
101 | } | ||
87 | } | 102 | } |
103 | |||
104 | } | ||
105 | |||
106 | public void RemoveRegion(Scene scene) | ||
107 | { | ||
108 | scene.EventManager.OnNewClient -= OnNewClient; | ||
109 | scene.EventManager.OnClientClosed -= ClientLoggedOut; | ||
110 | scene.EventManager.OnIncomingInstantMessage -= OnGridInstantMessage; | ||
111 | m_Scenelist.Remove(scene); | ||
112 | } | ||
113 | |||
114 | public void PostInitialise() | ||
115 | { | ||
88 | } | 116 | } |
89 | 117 | ||
90 | public void Close() | 118 | public void Close() |
@@ -96,9 +124,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
96 | get { return "InventoryModule"; } | 124 | get { return "InventoryModule"; } |
97 | } | 125 | } |
98 | 126 | ||
99 | public bool IsSharedModule | 127 | public Type ReplaceableInterface |
100 | { | 128 | { |
101 | get { return true; } | 129 | get { return null; } |
102 | } | 130 | } |
103 | 131 | ||
104 | #endregion | 132 | #endregion |
diff --git a/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs b/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs index 261bd6c..d1d7df2 100644 --- a/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Lure/LureModule.cs | |||
@@ -37,34 +37,72 @@ using OpenSim.Region.Framework.Scenes; | |||
37 | 37 | ||
38 | namespace OpenSim.Region.CoreModules.Avatar.Lure | 38 | namespace OpenSim.Region.CoreModules.Avatar.Lure |
39 | { | 39 | { |
40 | public class LureModule : IRegionModule | 40 | public class LureModule : ISharedRegionModule |
41 | { | 41 | { |
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 42 | private static readonly ILog m_log = LogManager.GetLogger( |
43 | MethodBase.GetCurrentMethod().DeclaringType); | ||
43 | 44 | ||
44 | private readonly List<Scene> m_scenes = new List<Scene>(); | 45 | private readonly List<Scene> m_scenes = new List<Scene>(); |
45 | 46 | ||
46 | private IMessageTransferModule m_TransferModule = null; | 47 | private IMessageTransferModule m_TransferModule = null; |
48 | private bool m_Enabled = true; | ||
47 | 49 | ||
48 | public void Initialise(Scene scene, IConfigSource config) | 50 | public void Initialise(IConfigSource config) |
49 | { | 51 | { |
50 | if (config.Configs["Messaging"] != null) | 52 | if (config.Configs["Messaging"] != null) |
51 | { | 53 | { |
52 | if (config.Configs["Messaging"].GetString( | 54 | if (config.Configs["Messaging"].GetString( |
53 | "LureModule", "LureModule") != | 55 | "LureModule", "LureModule") != |
54 | "LureModule") | 56 | "LureModule") |
55 | return; | 57 | m_Enabled = false; |
56 | } | 58 | } |
59 | } | ||
60 | |||
61 | public void AddRegion(Scene scene) | ||
62 | { | ||
63 | if (!m_Enabled) | ||
64 | return; | ||
57 | 65 | ||
58 | lock (m_scenes) | 66 | lock (m_scenes) |
59 | { | 67 | { |
60 | if (!m_scenes.Contains(scene)) | 68 | m_scenes.Add(scene); |
69 | scene.EventManager.OnNewClient += OnNewClient; | ||
70 | scene.EventManager.OnIncomingInstantMessage += | ||
71 | OnGridInstantMessage; | ||
72 | } | ||
73 | } | ||
74 | |||
75 | public void RegionLoaded(Scene scene) | ||
76 | { | ||
77 | if (m_TransferModule == null) | ||
78 | { | ||
79 | m_TransferModule = | ||
80 | scene.RequestModuleInterface<IMessageTransferModule>(); | ||
81 | |||
82 | if (m_TransferModule == null) | ||
61 | { | 83 | { |
62 | m_scenes.Add(scene); | 84 | m_log.Error("[INSTANT MESSAGE]: No message transfer module, "+ |
63 | scene.EventManager.OnNewClient += OnNewClient; | 85 | "lures will not work!"); |
64 | scene.EventManager.OnIncomingInstantMessage += | 86 | |
87 | m_Enabled = false; | ||
88 | m_scenes.Clear(); | ||
89 | scene.EventManager.OnNewClient -= OnNewClient; | ||
90 | scene.EventManager.OnIncomingInstantMessage -= | ||
65 | OnGridInstantMessage; | 91 | OnGridInstantMessage; |
66 | } | 92 | } |
67 | } | 93 | } |
94 | |||
95 | } | ||
96 | |||
97 | public void RemoveRegion(Scene scene) | ||
98 | { | ||
99 | lock (m_scenes) | ||
100 | { | ||
101 | m_scenes.Remove(scene); | ||
102 | scene.EventManager.OnNewClient -= OnNewClient; | ||
103 | scene.EventManager.OnIncomingInstantMessage -= | ||
104 | OnGridInstantMessage; | ||
105 | } | ||
68 | } | 106 | } |
69 | 107 | ||
70 | void OnNewClient(IClientAPI client) | 108 | void OnNewClient(IClientAPI client) |
@@ -76,12 +114,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure | |||
76 | 114 | ||
77 | public void PostInitialise() | 115 | public void PostInitialise() |
78 | { | 116 | { |
79 | m_TransferModule = | ||
80 | m_scenes[0].RequestModuleInterface<IMessageTransferModule>(); | ||
81 | |||
82 | if (m_TransferModule == null) | ||
83 | m_log.Error("[INSTANT MESSAGE]: No message transfer module, "+ | ||
84 | "lures will not work!"); | ||
85 | } | 117 | } |
86 | 118 | ||
87 | public void Close() | 119 | public void Close() |
@@ -93,9 +125,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure | |||
93 | get { return "LureModule"; } | 125 | get { return "LureModule"; } |
94 | } | 126 | } |
95 | 127 | ||
96 | public bool IsSharedModule | 128 | public Type ReplaceableInterface |
97 | { | 129 | { |
98 | get { return true; } | 130 | get { return null; } |
99 | } | 131 | } |
100 | 132 | ||
101 | public void OnInstantMessage(IClientAPI client, GridInstantMessage im) | 133 | public void OnInstantMessage(IClientAPI client, GridInstantMessage im) |
diff --git a/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs b/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs deleted file mode 100644 index 8cf58c6..0000000 --- a/OpenSim/Region/CoreModules/Avatar/Profiles/AvatarProfilesModule.cs +++ /dev/null | |||
@@ -1,168 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Globalization; | ||
31 | using System.Reflection; | ||
32 | using log4net; | ||
33 | using Nini.Config; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Region.Framework.Interfaces; | ||
37 | using OpenSim.Region.Framework.Scenes; | ||
38 | |||
39 | namespace OpenSim.Region.CoreModules.Avatar.Profiles | ||
40 | { | ||
41 | public class AvatarProfilesModule : IRegionModule | ||
42 | { | ||
43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
44 | private Scene m_scene; | ||
45 | private IProfileModule m_profileModule = null; | ||
46 | private bool m_enabled = true; | ||
47 | |||
48 | public AvatarProfilesModule() | ||
49 | { | ||
50 | } | ||
51 | |||
52 | #region IRegionModule Members | ||
53 | |||
54 | public void Initialise(Scene scene, IConfigSource config) | ||
55 | { | ||
56 | IConfig profileConfig = config.Configs["Profile"]; | ||
57 | if (profileConfig != null) | ||
58 | { | ||
59 | if (profileConfig.GetString("Module", Name) != Name) | ||
60 | { | ||
61 | m_enabled = false; | ||
62 | return; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | m_scene = scene; | ||
67 | m_scene.EventManager.OnNewClient += NewClient; | ||
68 | } | ||
69 | |||
70 | public void PostInitialise() | ||
71 | { | ||
72 | if (!m_enabled) | ||
73 | return; | ||
74 | m_profileModule = m_scene.RequestModuleInterface<IProfileModule>(); | ||
75 | } | ||
76 | |||
77 | public void Close() | ||
78 | { | ||
79 | } | ||
80 | |||
81 | public string Name | ||
82 | { | ||
83 | get { return "AvatarProfilesModule"; } | ||
84 | } | ||
85 | |||
86 | public bool IsSharedModule | ||
87 | { | ||
88 | get { return false; } | ||
89 | } | ||
90 | |||
91 | #endregion | ||
92 | |||
93 | public void NewClient(IClientAPI client) | ||
94 | { | ||
95 | client.OnRequestAvatarProperties += RequestAvatarProperty; | ||
96 | client.OnUpdateAvatarProperties += UpdateAvatarProperties; | ||
97 | } | ||
98 | |||
99 | public void RemoveClient(IClientAPI client) | ||
100 | { | ||
101 | client.OnRequestAvatarProperties -= RequestAvatarProperty; | ||
102 | client.OnUpdateAvatarProperties -= UpdateAvatarProperties; | ||
103 | } | ||
104 | |||
105 | /// <summary> | ||
106 | /// | ||
107 | /// </summary> | ||
108 | /// <param name="remoteClient"></param> | ||
109 | /// <param name="avatarID"></param> | ||
110 | public void RequestAvatarProperty(IClientAPI remoteClient, UUID avatarID) | ||
111 | { | ||
112 | // FIXME: finish adding fields such as url, masking, etc. | ||
113 | UserProfileData profile = m_scene.CommsManager.UserService.GetUserProfile(avatarID); | ||
114 | if (null != profile) | ||
115 | { | ||
116 | Byte[] charterMember; | ||
117 | if (profile.CustomType == "") | ||
118 | { | ||
119 | charterMember = new Byte[1]; | ||
120 | charterMember[0] = (Byte)((profile.UserFlags & 0xf00) >> 8); | ||
121 | } | ||
122 | else | ||
123 | { | ||
124 | charterMember = Utils.StringToBytes(profile.CustomType); | ||
125 | } | ||
126 | |||
127 | if (m_profileModule != null) | ||
128 | { | ||
129 | Hashtable profileData = m_profileModule.GetProfileData(remoteClient.AgentId); | ||
130 | if (profileData["ProfileUrl"] != null) | ||
131 | profile.ProfileUrl = profileData["ProfileUrl"].ToString(); | ||
132 | } | ||
133 | remoteClient.SendAvatarProperties(profile.ID, profile.AboutText, | ||
134 | Util.ToDateTime(profile.Created).ToString("M/d/yyyy", CultureInfo.InvariantCulture), | ||
135 | charterMember, profile.FirstLifeAboutText, (uint)(profile.UserFlags & 0xff), | ||
136 | profile.FirstLifeImage, profile.Image, profile.ProfileUrl, profile.Partner); | ||
137 | } | ||
138 | else | ||
139 | { | ||
140 | m_log.Debug("[AvatarProfilesModule]: Got null for profile for " + avatarID.ToString()); | ||
141 | } | ||
142 | } | ||
143 | |||
144 | public void UpdateAvatarProperties(IClientAPI remoteClient, UserProfileData newProfile) | ||
145 | { | ||
146 | UserProfileData Profile = m_scene.CommsManager.UserService.GetUserProfile(newProfile.ID); | ||
147 | |||
148 | // if it's the profile of the user requesting the update, then we change only a few things. | ||
149 | if (remoteClient.AgentId.CompareTo(Profile.ID) == 0) | ||
150 | { | ||
151 | Profile.Image = newProfile.Image; | ||
152 | Profile.FirstLifeImage = newProfile.FirstLifeImage; | ||
153 | Profile.AboutText = newProfile.AboutText; | ||
154 | Profile.FirstLifeAboutText = newProfile.FirstLifeAboutText; | ||
155 | Profile.ProfileUrl = newProfile.ProfileUrl; | ||
156 | } | ||
157 | else | ||
158 | { | ||
159 | return; | ||
160 | } | ||
161 | |||
162 | if (m_scene.CommsManager.UserService.UpdateUserProfile(Profile)) | ||
163 | { | ||
164 | RequestAvatarProperty(remoteClient, newProfile.ID); | ||
165 | } | ||
166 | } | ||
167 | } | ||
168 | } | ||
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs new file mode 100644 index 0000000..80c0af8 --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -0,0 +1,1602 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Net; | ||
31 | using System.Reflection; | ||
32 | using System.Threading; | ||
33 | |||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Capabilities; | ||
36 | using OpenSim.Framework.Client; | ||
37 | using OpenSim.Region.Framework.Interfaces; | ||
38 | using OpenSim.Region.Framework.Scenes; | ||
39 | using OpenSim.Services.Interfaces; | ||
40 | |||
41 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
42 | |||
43 | using OpenMetaverse; | ||
44 | using log4net; | ||
45 | using Nini.Config; | ||
46 | |||
47 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||
48 | { | ||
49 | public class EntityTransferModule : ISharedRegionModule, IEntityTransferModule | ||
50 | { | ||
51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
52 | |||
53 | protected bool m_Enabled = false; | ||
54 | protected Scene m_aScene; | ||
55 | protected List<UUID> m_agentsInTransit; | ||
56 | |||
57 | #region ISharedRegionModule | ||
58 | |||
59 | public Type ReplaceableInterface | ||
60 | { | ||
61 | get { return null; } | ||
62 | } | ||
63 | |||
64 | public virtual string Name | ||
65 | { | ||
66 | get { return "BasicEntityTransferModule"; } | ||
67 | } | ||
68 | |||
69 | public virtual void Initialise(IConfigSource source) | ||
70 | { | ||
71 | IConfig moduleConfig = source.Configs["Modules"]; | ||
72 | if (moduleConfig != null) | ||
73 | { | ||
74 | string name = moduleConfig.GetString("EntityTransferModule", ""); | ||
75 | if (name == Name) | ||
76 | { | ||
77 | m_agentsInTransit = new List<UUID>(); | ||
78 | m_Enabled = true; | ||
79 | m_log.InfoFormat("[ENTITY TRANSFER MODULE]: {0} enabled.", Name); | ||
80 | } | ||
81 | } | ||
82 | } | ||
83 | |||
84 | public virtual void PostInitialise() | ||
85 | { | ||
86 | } | ||
87 | |||
88 | public virtual void AddRegion(Scene scene) | ||
89 | { | ||
90 | if (!m_Enabled) | ||
91 | return; | ||
92 | |||
93 | if (m_aScene == null) | ||
94 | m_aScene = scene; | ||
95 | |||
96 | scene.RegisterModuleInterface<IEntityTransferModule>(this); | ||
97 | scene.EventManager.OnNewClient += OnNewClient; | ||
98 | } | ||
99 | |||
100 | protected virtual void OnNewClient(IClientAPI client) | ||
101 | { | ||
102 | client.OnTeleportHomeRequest += TeleportHome; | ||
103 | } | ||
104 | |||
105 | public virtual void Close() | ||
106 | { | ||
107 | if (!m_Enabled) | ||
108 | return; | ||
109 | } | ||
110 | |||
111 | |||
112 | public virtual void RemoveRegion(Scene scene) | ||
113 | { | ||
114 | if (!m_Enabled) | ||
115 | return; | ||
116 | if (scene == m_aScene) | ||
117 | m_aScene = null; | ||
118 | } | ||
119 | |||
120 | public virtual void RegionLoaded(Scene scene) | ||
121 | { | ||
122 | if (!m_Enabled) | ||
123 | return; | ||
124 | |||
125 | } | ||
126 | |||
127 | |||
128 | #endregion | ||
129 | |||
130 | #region Agent Teleports | ||
131 | |||
132 | public void Teleport(ScenePresence sp, ulong regionHandle, Vector3 position, Vector3 lookAt, uint teleportFlags) | ||
133 | { | ||
134 | if (!sp.Scene.Permissions.CanTeleport(sp.UUID)) | ||
135 | return; | ||
136 | |||
137 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | ||
138 | |||
139 | // Reset animations; the viewer does that in teleports. | ||
140 | sp.Animator.ResetAnimations(); | ||
141 | |||
142 | try | ||
143 | { | ||
144 | if (regionHandle == sp.Scene.RegionInfo.RegionHandle) | ||
145 | { | ||
146 | m_log.DebugFormat( | ||
147 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation {0} within {1}", | ||
148 | position, sp.Scene.RegionInfo.RegionName); | ||
149 | |||
150 | // Teleport within the same region | ||
151 | if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) | ||
152 | { | ||
153 | Vector3 emergencyPos = new Vector3(128, 128, 128); | ||
154 | |||
155 | m_log.WarnFormat( | ||
156 | "[ENTITY TRANSFER MODULE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", | ||
157 | position, sp.Name, sp.UUID, emergencyPos); | ||
158 | position = emergencyPos; | ||
159 | } | ||
160 | |||
161 | // TODO: Get proper AVG Height | ||
162 | float localAVHeight = 1.56f; | ||
163 | float posZLimit = 22; | ||
164 | |||
165 | // TODO: Check other Scene HeightField | ||
166 | if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <= (int)Constants.RegionSize) | ||
167 | { | ||
168 | posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; | ||
169 | } | ||
170 | |||
171 | float newPosZ = posZLimit + localAVHeight; | ||
172 | if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) | ||
173 | { | ||
174 | position.Z = newPosZ; | ||
175 | } | ||
176 | |||
177 | // Only send this if the event queue is null | ||
178 | if (eq == null) | ||
179 | sp.ControllingClient.SendTeleportLocationStart(); | ||
180 | |||
181 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); | ||
182 | sp.Teleport(position); | ||
183 | } | ||
184 | else // Another region possibly in another simulator | ||
185 | { | ||
186 | uint x = 0, y = 0; | ||
187 | Utils.LongToUInts(regionHandle, out x, out y); | ||
188 | GridRegion reg = m_aScene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); | ||
189 | |||
190 | if (reg != null) | ||
191 | { | ||
192 | GridRegion finalDestination = GetFinalDestination(reg); | ||
193 | if (finalDestination == null) | ||
194 | { | ||
195 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final destination is having problems. Unable to teleport agent."); | ||
196 | sp.ControllingClient.SendTeleportFailed("Problem at destination"); | ||
197 | return; | ||
198 | } | ||
199 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final destination is x={0} y={1} uuid={2}", | ||
200 | finalDestination.RegionLocX / Constants.RegionSize, finalDestination.RegionLocY / Constants.RegionSize, finalDestination.RegionID); | ||
201 | |||
202 | // | ||
203 | // This is it | ||
204 | // | ||
205 | DoTeleport(sp, reg, finalDestination, position, lookAt, teleportFlags, eq); | ||
206 | // | ||
207 | // | ||
208 | // | ||
209 | } | ||
210 | else | ||
211 | { | ||
212 | // TP to a place that doesn't exist (anymore) | ||
213 | // Inform the viewer about that | ||
214 | sp.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); | ||
215 | |||
216 | // and set the map-tile to '(Offline)' | ||
217 | uint regX, regY; | ||
218 | Utils.LongToUInts(regionHandle, out regX, out regY); | ||
219 | |||
220 | MapBlockData block = new MapBlockData(); | ||
221 | block.X = (ushort)(regX / Constants.RegionSize); | ||
222 | block.Y = (ushort)(regY / Constants.RegionSize); | ||
223 | block.Access = 254; // == not there | ||
224 | |||
225 | List<MapBlockData> blocks = new List<MapBlockData>(); | ||
226 | blocks.Add(block); | ||
227 | sp.ControllingClient.SendMapBlock(blocks, 0); | ||
228 | } | ||
229 | } | ||
230 | } | ||
231 | catch (Exception e) | ||
232 | { | ||
233 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Exception on teleport: {0}\n{1}", e.Message, e.StackTrace); | ||
234 | sp.ControllingClient.SendTeleportFailed("Internal error"); | ||
235 | } | ||
236 | } | ||
237 | |||
238 | protected void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, Vector3 position, Vector3 lookAt, uint teleportFlags, IEventQueue eq) | ||
239 | { | ||
240 | if (reg == null || finalDestination == null) | ||
241 | { | ||
242 | sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); | ||
243 | return; | ||
244 | } | ||
245 | |||
246 | m_log.DebugFormat( | ||
247 | "[ENTITY TRANSFER MODULE]: Request Teleport to {0}:{1}:{2}/{3}", | ||
248 | reg.ExternalHostName, reg.HttpPort, finalDestination.RegionName, position); | ||
249 | |||
250 | uint newRegionX = (uint)(reg.RegionHandle >> 40); | ||
251 | uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); | ||
252 | uint oldRegionX = (uint)(sp.Scene.RegionInfo.RegionHandle >> 40); | ||
253 | uint oldRegionY = (((uint)(sp.Scene.RegionInfo.RegionHandle)) >> 8); | ||
254 | |||
255 | ulong destinationHandle = finalDestination.RegionHandle; | ||
256 | |||
257 | if (eq == null) | ||
258 | sp.ControllingClient.SendTeleportLocationStart(); | ||
259 | |||
260 | // Let's do DNS resolution only once in this process, please! | ||
261 | // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, | ||
262 | // it's actually doing a lot of work. | ||
263 | IPEndPoint endPoint = finalDestination.ExternalEndPoint; | ||
264 | if (endPoint.Address != null) | ||
265 | { | ||
266 | // Fixing a bug where teleporting while sitting results in the avatar ending up removed from | ||
267 | // both regions | ||
268 | if (sp.ParentID != (uint)0) | ||
269 | sp.StandUp(); | ||
270 | |||
271 | if (!sp.ValidateAttachments()) | ||
272 | { | ||
273 | sp.ControllingClient.SendTeleportFailed("Inconsistent attachment state"); | ||
274 | return; | ||
275 | } | ||
276 | |||
277 | // the avatar.Close below will clear the child region list. We need this below for (possibly) | ||
278 | // closing the child agents, so save it here (we need a copy as it is Clear()-ed). | ||
279 | //List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList()); | ||
280 | // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport | ||
281 | // failure at this point (unlike a border crossing failure). So perhaps this can never fail | ||
282 | // once we reach here... | ||
283 | //avatar.Scene.RemoveCapsHandler(avatar.UUID); | ||
284 | |||
285 | string capsPath = String.Empty; | ||
286 | |||
287 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | ||
288 | AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); | ||
289 | agentCircuit.startpos = position; | ||
290 | agentCircuit.child = true; | ||
291 | agentCircuit.Appearance = sp.Appearance; | ||
292 | if (currentAgentCircuit != null) | ||
293 | agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; | ||
294 | |||
295 | if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
296 | { | ||
297 | // brand new agent, let's create a new caps seed | ||
298 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
299 | } | ||
300 | |||
301 | string reason = String.Empty; | ||
302 | |||
303 | // Let's create an agent there if one doesn't exist yet. | ||
304 | if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason)) | ||
305 | { | ||
306 | sp.ControllingClient.SendTeleportFailed(String.Format("Destination refused: {0}", | ||
307 | reason)); | ||
308 | return; | ||
309 | } | ||
310 | |||
311 | // OK, it got this agent. Let's close some child agents | ||
312 | sp.CloseChildAgents(newRegionX, newRegionY); | ||
313 | |||
314 | if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
315 | { | ||
316 | #region IP Translation for NAT | ||
317 | IClientIPEndpoint ipepClient; | ||
318 | if (sp.ClientView.TryGet(out ipepClient)) | ||
319 | { | ||
320 | capsPath | ||
321 | = "http://" | ||
322 | + NetworkUtil.GetHostFor(ipepClient.EndPoint, finalDestination.ExternalHostName) | ||
323 | + ":" | ||
324 | + finalDestination.HttpPort | ||
325 | + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
326 | } | ||
327 | else | ||
328 | { | ||
329 | capsPath | ||
330 | = "http://" | ||
331 | + finalDestination.ExternalHostName | ||
332 | + ":" | ||
333 | + finalDestination.HttpPort | ||
334 | + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
335 | } | ||
336 | #endregion | ||
337 | |||
338 | if (eq != null) | ||
339 | { | ||
340 | #region IP Translation for NAT | ||
341 | // Uses ipepClient above | ||
342 | if (sp.ClientView.TryGet(out ipepClient)) | ||
343 | { | ||
344 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
345 | } | ||
346 | #endregion | ||
347 | |||
348 | eq.EnableSimulator(destinationHandle, endPoint, sp.UUID); | ||
349 | |||
350 | // ES makes the client send a UseCircuitCode message to the destination, | ||
351 | // which triggers a bunch of things there. | ||
352 | // So let's wait | ||
353 | Thread.Sleep(200); | ||
354 | |||
355 | eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); | ||
356 | |||
357 | } | ||
358 | else | ||
359 | { | ||
360 | sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint); | ||
361 | } | ||
362 | } | ||
363 | else | ||
364 | { | ||
365 | agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); | ||
366 | capsPath = "http://" + finalDestination.ExternalHostName + ":" + finalDestination.HttpPort | ||
367 | + "/CAPS/" + agentCircuit.CapsPath + "0000/"; | ||
368 | } | ||
369 | |||
370 | // Expect avatar crossing is a heavy-duty function at the destination. | ||
371 | // That is where MakeRoot is called, which fetches appearance and inventory. | ||
372 | // Plus triggers OnMakeRoot, which spawns a series of asynchronous updates. | ||
373 | //m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, | ||
374 | // position, false); | ||
375 | |||
376 | //{ | ||
377 | // avatar.ControllingClient.SendTeleportFailed("Problem with destination."); | ||
378 | // // We should close that agent we just created over at destination... | ||
379 | // List<ulong> lst = new List<ulong>(); | ||
380 | // lst.Add(reg.RegionHandle); | ||
381 | // SendCloseChildAgentAsync(avatar.UUID, lst); | ||
382 | // return; | ||
383 | //} | ||
384 | |||
385 | SetInTransit(sp.UUID); | ||
386 | |||
387 | // Let's send a full update of the agent. This is a synchronous call. | ||
388 | AgentData agent = new AgentData(); | ||
389 | sp.CopyTo(agent); | ||
390 | agent.Position = position; | ||
391 | SetCallbackURL(agent, sp.Scene.RegionInfo); | ||
392 | |||
393 | UpdateAgent(reg, finalDestination, agent); | ||
394 | |||
395 | m_log.DebugFormat( | ||
396 | "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID); | ||
397 | |||
398 | |||
399 | if (eq != null) | ||
400 | { | ||
401 | eq.TeleportFinishEvent(destinationHandle, 13, endPoint, | ||
402 | 0, teleportFlags, capsPath, sp.UUID); | ||
403 | } | ||
404 | else | ||
405 | { | ||
406 | sp.ControllingClient.SendRegionTeleport(destinationHandle, 13, endPoint, 4, | ||
407 | teleportFlags, capsPath); | ||
408 | } | ||
409 | |||
410 | // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which | ||
411 | // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation | ||
412 | // that the client contacted the destination before we send the attachments and close things here. | ||
413 | if (!WaitForCallback(sp.UUID)) | ||
414 | { | ||
415 | // Client never contacted destination. Let's restore everything back | ||
416 | sp.ControllingClient.SendTeleportFailed("Problems connecting to destination."); | ||
417 | |||
418 | ResetFromTransit(sp.UUID); | ||
419 | |||
420 | // Yikes! We should just have a ref to scene here. | ||
421 | //sp.Scene.InformClientOfNeighbours(sp); | ||
422 | EnableChildAgents(sp); | ||
423 | |||
424 | // Finally, kill the agent we just created at the destination. | ||
425 | m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); | ||
426 | |||
427 | return; | ||
428 | } | ||
429 | |||
430 | |||
431 | // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it | ||
432 | CrossAttachmentsIntoNewRegion(finalDestination, sp, true); | ||
433 | |||
434 | KillEntity(sp.Scene, sp.LocalId); | ||
435 | |||
436 | sp.MakeChildAgent(); | ||
437 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | ||
438 | |||
439 | if (NeedsClosing(oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||
440 | { | ||
441 | Thread.Sleep(5000); | ||
442 | sp.Close(); | ||
443 | sp.Scene.IncomingCloseAgent(sp.UUID); | ||
444 | } | ||
445 | else | ||
446 | // now we have a child agent in this region. | ||
447 | sp.Reset(); | ||
448 | |||
449 | |||
450 | // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! | ||
451 | if (sp.Scene.NeedSceneCacheClear(sp.UUID)) | ||
452 | { | ||
453 | m_log.DebugFormat( | ||
454 | "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed", | ||
455 | sp.UUID); | ||
456 | } | ||
457 | } | ||
458 | else | ||
459 | { | ||
460 | sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); | ||
461 | } | ||
462 | } | ||
463 | |||
464 | |||
465 | protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) | ||
466 | { | ||
467 | return m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); | ||
468 | } | ||
469 | |||
470 | protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) | ||
471 | { | ||
472 | return m_aScene.SimulationService.UpdateAgent(finalDestination, agent); | ||
473 | } | ||
474 | |||
475 | protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) | ||
476 | { | ||
477 | agent.CallbackURI = "http://" + region.ExternalHostName + ":" + region.HttpPort + | ||
478 | "/agent/" + agent.AgentID.ToString() + "/" + region.RegionID.ToString() + "/release/"; | ||
479 | |||
480 | } | ||
481 | |||
482 | protected void KillEntity(Scene scene, uint localID) | ||
483 | { | ||
484 | scene.SendKillObject(localID); | ||
485 | } | ||
486 | |||
487 | protected virtual GridRegion GetFinalDestination(GridRegion region) | ||
488 | { | ||
489 | return region; | ||
490 | } | ||
491 | |||
492 | protected virtual bool NeedsNewAgent(uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY) | ||
493 | { | ||
494 | return Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY); | ||
495 | } | ||
496 | |||
497 | protected virtual bool NeedsClosing(uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) | ||
498 | { | ||
499 | return Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY); | ||
500 | } | ||
501 | |||
502 | protected virtual bool IsOutsideRegion(Scene s, Vector3 pos) | ||
503 | { | ||
504 | |||
505 | if (s.TestBorderCross(pos, Cardinals.N)) | ||
506 | return true; | ||
507 | if (s.TestBorderCross(pos, Cardinals.S)) | ||
508 | return true; | ||
509 | if (s.TestBorderCross(pos, Cardinals.E)) | ||
510 | return true; | ||
511 | if (s.TestBorderCross(pos, Cardinals.W)) | ||
512 | return true; | ||
513 | |||
514 | return false; | ||
515 | } | ||
516 | |||
517 | |||
518 | #endregion | ||
519 | |||
520 | #region Teleport Home | ||
521 | |||
522 | public virtual void TeleportHome(UUID id, IClientAPI client) | ||
523 | { | ||
524 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); | ||
525 | |||
526 | OpenSim.Services.Interfaces.PresenceInfo pinfo = m_aScene.PresenceService.GetAgent(client.SessionId); | ||
527 | |||
528 | if (pinfo != null) | ||
529 | { | ||
530 | GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, pinfo.HomeRegionID); | ||
531 | if (regionInfo == null) | ||
532 | { | ||
533 | // can't find the Home region: Tell viewer and abort | ||
534 | client.SendTeleportFailed("Your home region could not be found."); | ||
535 | return; | ||
536 | } | ||
537 | // a little eekie that this goes back to Scene and with a forced cast, will fix that at some point... | ||
538 | ((Scene)(client.Scene)).RequestTeleportLocation( | ||
539 | client, regionInfo.RegionHandle, pinfo.HomePosition, pinfo.HomeLookAt, | ||
540 | (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome)); | ||
541 | } | ||
542 | } | ||
543 | |||
544 | #endregion | ||
545 | |||
546 | |||
547 | #region Agent Crossings | ||
548 | |||
549 | public void Cross(ScenePresence agent, bool isFlying) | ||
550 | { | ||
551 | Scene scene = agent.Scene; | ||
552 | Vector3 pos = agent.AbsolutePosition; | ||
553 | Vector3 newpos = new Vector3(pos.X, pos.Y, pos.Z); | ||
554 | uint neighbourx = scene.RegionInfo.RegionLocX; | ||
555 | uint neighboury = scene.RegionInfo.RegionLocY; | ||
556 | const float boundaryDistance = 1.7f; | ||
557 | Vector3 northCross = new Vector3(0, boundaryDistance, 0); | ||
558 | Vector3 southCross = new Vector3(0, -1 * boundaryDistance, 0); | ||
559 | Vector3 eastCross = new Vector3(boundaryDistance, 0, 0); | ||
560 | Vector3 westCross = new Vector3(-1 * boundaryDistance, 0, 0); | ||
561 | |||
562 | // distance to edge that will trigger crossing | ||
563 | |||
564 | |||
565 | // distance into new region to place avatar | ||
566 | const float enterDistance = 0.5f; | ||
567 | |||
568 | if (scene.TestBorderCross(pos + westCross, Cardinals.W)) | ||
569 | { | ||
570 | if (scene.TestBorderCross(pos + northCross, Cardinals.N)) | ||
571 | { | ||
572 | Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); | ||
573 | neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); | ||
574 | } | ||
575 | else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) | ||
576 | { | ||
577 | Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S); | ||
578 | if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0) | ||
579 | { | ||
580 | neighboury--; | ||
581 | newpos.Y = Constants.RegionSize - enterDistance; | ||
582 | } | ||
583 | else | ||
584 | { | ||
585 | neighboury = b.TriggerRegionY; | ||
586 | neighbourx = b.TriggerRegionX; | ||
587 | |||
588 | Vector3 newposition = pos; | ||
589 | newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; | ||
590 | newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; | ||
591 | agent.ControllingClient.SendAgentAlertMessage( | ||
592 | String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); | ||
593 | InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); | ||
594 | return; | ||
595 | } | ||
596 | } | ||
597 | |||
598 | Border ba = scene.GetCrossedBorder(pos + westCross, Cardinals.W); | ||
599 | if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0) | ||
600 | { | ||
601 | neighbourx--; | ||
602 | newpos.X = Constants.RegionSize - enterDistance; | ||
603 | } | ||
604 | else | ||
605 | { | ||
606 | neighboury = ba.TriggerRegionY; | ||
607 | neighbourx = ba.TriggerRegionX; | ||
608 | |||
609 | |||
610 | Vector3 newposition = pos; | ||
611 | newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; | ||
612 | newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; | ||
613 | agent.ControllingClient.SendAgentAlertMessage( | ||
614 | String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); | ||
615 | InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); | ||
616 | |||
617 | |||
618 | return; | ||
619 | } | ||
620 | |||
621 | } | ||
622 | else if (scene.TestBorderCross(pos + eastCross, Cardinals.E)) | ||
623 | { | ||
624 | Border b = scene.GetCrossedBorder(pos + eastCross, Cardinals.E); | ||
625 | neighbourx += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); | ||
626 | newpos.X = enterDistance; | ||
627 | |||
628 | if (scene.TestBorderCross(pos + southCross, Cardinals.S)) | ||
629 | { | ||
630 | Border ba = scene.GetCrossedBorder(pos + southCross, Cardinals.S); | ||
631 | if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0) | ||
632 | { | ||
633 | neighboury--; | ||
634 | newpos.Y = Constants.RegionSize - enterDistance; | ||
635 | } | ||
636 | else | ||
637 | { | ||
638 | neighboury = ba.TriggerRegionY; | ||
639 | neighbourx = ba.TriggerRegionX; | ||
640 | Vector3 newposition = pos; | ||
641 | newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; | ||
642 | newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; | ||
643 | agent.ControllingClient.SendAgentAlertMessage( | ||
644 | String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); | ||
645 | InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); | ||
646 | return; | ||
647 | } | ||
648 | } | ||
649 | else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) | ||
650 | { | ||
651 | Border c = scene.GetCrossedBorder(pos + northCross, Cardinals.N); | ||
652 | neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize); | ||
653 | newpos.Y = enterDistance; | ||
654 | } | ||
655 | |||
656 | |||
657 | } | ||
658 | else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) | ||
659 | { | ||
660 | Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S); | ||
661 | if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0) | ||
662 | { | ||
663 | neighboury--; | ||
664 | newpos.Y = Constants.RegionSize - enterDistance; | ||
665 | } | ||
666 | else | ||
667 | { | ||
668 | neighboury = b.TriggerRegionY; | ||
669 | neighbourx = b.TriggerRegionX; | ||
670 | Vector3 newposition = pos; | ||
671 | newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; | ||
672 | newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; | ||
673 | agent.ControllingClient.SendAgentAlertMessage( | ||
674 | String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); | ||
675 | InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); | ||
676 | return; | ||
677 | } | ||
678 | } | ||
679 | else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) | ||
680 | { | ||
681 | |||
682 | Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); | ||
683 | neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); | ||
684 | newpos.Y = enterDistance; | ||
685 | } | ||
686 | |||
687 | /* | ||
688 | |||
689 | if (pos.X < boundaryDistance) //West | ||
690 | { | ||
691 | neighbourx--; | ||
692 | newpos.X = Constants.RegionSize - enterDistance; | ||
693 | } | ||
694 | else if (pos.X > Constants.RegionSize - boundaryDistance) // East | ||
695 | { | ||
696 | neighbourx++; | ||
697 | newpos.X = enterDistance; | ||
698 | } | ||
699 | |||
700 | if (pos.Y < boundaryDistance) // South | ||
701 | { | ||
702 | neighboury--; | ||
703 | newpos.Y = Constants.RegionSize - enterDistance; | ||
704 | } | ||
705 | else if (pos.Y > Constants.RegionSize - boundaryDistance) // North | ||
706 | { | ||
707 | neighboury++; | ||
708 | newpos.Y = enterDistance; | ||
709 | } | ||
710 | */ | ||
711 | |||
712 | CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync; | ||
713 | d.BeginInvoke(agent, newpos, neighbourx, neighboury, isFlying, CrossAgentToNewRegionCompleted, d); | ||
714 | |||
715 | } | ||
716 | |||
717 | |||
718 | public delegate void InformClientToInitateTeleportToLocationDelegate(ScenePresence agent, uint regionX, uint regionY, | ||
719 | Vector3 position, | ||
720 | Scene initiatingScene); | ||
721 | |||
722 | private void InformClientToInitateTeleportToLocation(ScenePresence agent, uint regionX, uint regionY, Vector3 position, Scene initiatingScene) | ||
723 | { | ||
724 | |||
725 | // This assumes that we know what our neighbors are. | ||
726 | |||
727 | InformClientToInitateTeleportToLocationDelegate d = InformClientToInitiateTeleportToLocationAsync; | ||
728 | d.BeginInvoke(agent, regionX, regionY, position, initiatingScene, | ||
729 | InformClientToInitiateTeleportToLocationCompleted, | ||
730 | d); | ||
731 | } | ||
732 | |||
733 | public void InformClientToInitiateTeleportToLocationAsync(ScenePresence agent, uint regionX, uint regionY, Vector3 position, | ||
734 | Scene initiatingScene) | ||
735 | { | ||
736 | Thread.Sleep(10000); | ||
737 | IMessageTransferModule im = initiatingScene.RequestModuleInterface<IMessageTransferModule>(); | ||
738 | if (im != null) | ||
739 | { | ||
740 | UUID gotoLocation = Util.BuildFakeParcelID( | ||
741 | Util.UIntsToLong( | ||
742 | (regionX * | ||
743 | (uint)Constants.RegionSize), | ||
744 | (regionY * | ||
745 | (uint)Constants.RegionSize)), | ||
746 | (uint)(int)position.X, | ||
747 | (uint)(int)position.Y, | ||
748 | (uint)(int)position.Z); | ||
749 | GridInstantMessage m = new GridInstantMessage(initiatingScene, UUID.Zero, | ||
750 | "Region", agent.UUID, | ||
751 | (byte)InstantMessageDialog.GodLikeRequestTeleport, false, | ||
752 | "", gotoLocation, false, new Vector3(127, 0, 0), | ||
753 | new Byte[0]); | ||
754 | im.SendInstantMessage(m, delegate(bool success) | ||
755 | { | ||
756 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Client Initiating Teleport sending IM success = {0}", success); | ||
757 | }); | ||
758 | |||
759 | } | ||
760 | } | ||
761 | |||
762 | private void InformClientToInitiateTeleportToLocationCompleted(IAsyncResult iar) | ||
763 | { | ||
764 | InformClientToInitateTeleportToLocationDelegate icon = | ||
765 | (InformClientToInitateTeleportToLocationDelegate)iar.AsyncState; | ||
766 | icon.EndInvoke(iar); | ||
767 | } | ||
768 | |||
769 | public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying); | ||
770 | |||
771 | /// <summary> | ||
772 | /// This Closes child agents on neighboring regions | ||
773 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | ||
774 | /// </summary> | ||
775 | protected ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying) | ||
776 | { | ||
777 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3}", agent.Firstname, agent.Lastname, neighbourx, neighboury); | ||
778 | |||
779 | Scene m_scene = agent.Scene; | ||
780 | ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); | ||
781 | |||
782 | int x = (int)(neighbourx * Constants.RegionSize), y = (int)(neighboury * Constants.RegionSize); | ||
783 | GridRegion neighbourRegion = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); | ||
784 | |||
785 | if (neighbourRegion != null && agent.ValidateAttachments()) | ||
786 | { | ||
787 | pos = pos + (agent.Velocity); | ||
788 | |||
789 | SetInTransit(agent.UUID); | ||
790 | AgentData cAgent = new AgentData(); | ||
791 | agent.CopyTo(cAgent); | ||
792 | cAgent.Position = pos; | ||
793 | if (isFlying) | ||
794 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | ||
795 | cAgent.CallbackURI = "http://" + m_scene.RegionInfo.ExternalHostName + ":" + m_scene.RegionInfo.HttpPort + | ||
796 | "/agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/"; | ||
797 | |||
798 | m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent); | ||
799 | |||
800 | // Next, let's close the child agent connections that are too far away. | ||
801 | agent.CloseChildAgents(neighbourx, neighboury); | ||
802 | |||
803 | //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); | ||
804 | agent.ControllingClient.RequestClientInfo(); | ||
805 | |||
806 | //m_log.Debug("BEFORE CROSS"); | ||
807 | //Scene.DumpChildrenSeeds(UUID); | ||
808 | //DumpKnownRegions(); | ||
809 | string agentcaps; | ||
810 | if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) | ||
811 | { | ||
812 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.", | ||
813 | neighbourRegion.RegionHandle); | ||
814 | return agent; | ||
815 | } | ||
816 | // TODO Should construct this behind a method | ||
817 | string capsPath = | ||
818 | "http://" + neighbourRegion.ExternalHostName + ":" + neighbourRegion.HttpPort | ||
819 | + "/CAPS/" + agentcaps /*circuitdata.CapsPath*/ + "0000/"; | ||
820 | |||
821 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); | ||
822 | |||
823 | IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>(); | ||
824 | if (eq != null) | ||
825 | { | ||
826 | eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | ||
827 | capsPath, agent.UUID, agent.ControllingClient.SessionId); | ||
828 | } | ||
829 | else | ||
830 | { | ||
831 | agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | ||
832 | capsPath); | ||
833 | } | ||
834 | |||
835 | if (!WaitForCallback(agent.UUID)) | ||
836 | { | ||
837 | m_log.Debug("[ENTITY TRANSFER MODULE]: Callback never came in crossing agent"); | ||
838 | ResetFromTransit(agent.UUID); | ||
839 | |||
840 | // Yikes! We should just have a ref to scene here. | ||
841 | //agent.Scene.InformClientOfNeighbours(agent); | ||
842 | EnableChildAgents(agent); | ||
843 | |||
844 | return agent; | ||
845 | } | ||
846 | |||
847 | agent.MakeChildAgent(); | ||
848 | // now we have a child agent in this region. Request all interesting data about other (root) agents | ||
849 | agent.SendInitialFullUpdateToAllClients(); | ||
850 | |||
851 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | ||
852 | |||
853 | // m_scene.SendKillObject(m_localId); | ||
854 | |||
855 | agent.Scene.NotifyMyCoarseLocationChange(); | ||
856 | // the user may change their profile information in other region, | ||
857 | // so the userinfo in UserProfileCache is not reliable any more, delete it | ||
858 | // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! | ||
859 | if (agent.Scene.NeedSceneCacheClear(agent.UUID)) | ||
860 | { | ||
861 | m_log.DebugFormat( | ||
862 | "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID); | ||
863 | } | ||
864 | } | ||
865 | |||
866 | //m_log.Debug("AFTER CROSS"); | ||
867 | //Scene.DumpChildrenSeeds(UUID); | ||
868 | //DumpKnownRegions(); | ||
869 | return agent; | ||
870 | } | ||
871 | |||
872 | private void CrossAgentToNewRegionCompleted(IAsyncResult iar) | ||
873 | { | ||
874 | CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; | ||
875 | ScenePresence agent = icon.EndInvoke(iar); | ||
876 | |||
877 | // If the cross was successful, this agent is a child agent | ||
878 | if (agent.IsChildAgent) | ||
879 | agent.Reset(); | ||
880 | else // Not successful | ||
881 | agent.RestoreInCurrentScene(); | ||
882 | |||
883 | // In any case | ||
884 | agent.NotInTransit(); | ||
885 | |||
886 | //m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); | ||
887 | } | ||
888 | |||
889 | #endregion | ||
890 | |||
891 | #region Enable Child Agent | ||
892 | /// <summary> | ||
893 | /// This informs a single neighboring region about agent "avatar". | ||
894 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | ||
895 | /// </summary> | ||
896 | public void EnableChildAgent(ScenePresence sp, GridRegion region) | ||
897 | { | ||
898 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); | ||
899 | agent.BaseFolder = UUID.Zero; | ||
900 | agent.InventoryFolder = UUID.Zero; | ||
901 | agent.startpos = new Vector3(128, 128, 70); | ||
902 | agent.child = true; | ||
903 | agent.Appearance = sp.Appearance; | ||
904 | |||
905 | InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; | ||
906 | d.BeginInvoke(sp, agent, region, region.ExternalEndPoint, true, | ||
907 | InformClientOfNeighbourCompleted, | ||
908 | d); | ||
909 | } | ||
910 | #endregion | ||
911 | |||
912 | #region Enable Child Agents | ||
913 | |||
914 | private delegate void InformClientOfNeighbourDelegate( | ||
915 | ScenePresence avatar, AgentCircuitData a, GridRegion reg, IPEndPoint endPoint, bool newAgent); | ||
916 | |||
917 | /// <summary> | ||
918 | /// This informs all neighboring regions about agent "avatar". | ||
919 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | ||
920 | /// </summary> | ||
921 | public void EnableChildAgents(ScenePresence sp) | ||
922 | { | ||
923 | List<GridRegion> neighbours = new List<GridRegion>(); | ||
924 | RegionInfo m_regionInfo = sp.Scene.RegionInfo; | ||
925 | |||
926 | if (m_regionInfo != null) | ||
927 | { | ||
928 | neighbours = RequestNeighbours(sp.Scene, m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); | ||
929 | } | ||
930 | else | ||
931 | { | ||
932 | m_log.Debug("[ENTITY TRANSFER MODULE]: m_regionInfo was null in EnableChildAgents, is this a NPC?"); | ||
933 | } | ||
934 | |||
935 | /// We need to find the difference between the new regions where there are no child agents | ||
936 | /// and the regions where there are already child agents. We only send notification to the former. | ||
937 | List<ulong> neighbourHandles = NeighbourHandles(neighbours); // on this region | ||
938 | neighbourHandles.Add(sp.Scene.RegionInfo.RegionHandle); // add this region too | ||
939 | List<ulong> previousRegionNeighbourHandles; | ||
940 | |||
941 | if (sp.Scene.CapsModule != null) | ||
942 | { | ||
943 | previousRegionNeighbourHandles = | ||
944 | new List<ulong>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID).Keys); | ||
945 | } | ||
946 | else | ||
947 | { | ||
948 | previousRegionNeighbourHandles = new List<ulong>(); | ||
949 | } | ||
950 | |||
951 | List<ulong> newRegions = NewNeighbours(neighbourHandles, previousRegionNeighbourHandles); | ||
952 | List<ulong> oldRegions = OldNeighbours(neighbourHandles, previousRegionNeighbourHandles); | ||
953 | |||
954 | //Dump("Current Neighbors", neighbourHandles); | ||
955 | //Dump("Previous Neighbours", previousRegionNeighbourHandles); | ||
956 | //Dump("New Neighbours", newRegions); | ||
957 | //Dump("Old Neighbours", oldRegions); | ||
958 | |||
959 | /// Update the scene presence's known regions here on this region | ||
960 | sp.DropOldNeighbours(oldRegions); | ||
961 | |||
962 | /// Collect as many seeds as possible | ||
963 | Dictionary<ulong, string> seeds; | ||
964 | if (sp.Scene.CapsModule != null) | ||
965 | seeds | ||
966 | = new Dictionary<ulong, string>(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); | ||
967 | else | ||
968 | seeds = new Dictionary<ulong, string>(); | ||
969 | |||
970 | //m_log.Debug(" !!! No. of seeds: " + seeds.Count); | ||
971 | if (!seeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) | ||
972 | seeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); | ||
973 | |||
974 | /// Create the necessary child agents | ||
975 | List<AgentCircuitData> cagents = new List<AgentCircuitData>(); | ||
976 | foreach (GridRegion neighbour in neighbours) | ||
977 | { | ||
978 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | ||
979 | { | ||
980 | |||
981 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | ||
982 | AgentCircuitData agent = sp.ControllingClient.RequestClientInfo(); | ||
983 | agent.BaseFolder = UUID.Zero; | ||
984 | agent.InventoryFolder = UUID.Zero; | ||
985 | agent.startpos = new Vector3(128, 128, 70); | ||
986 | agent.child = true; | ||
987 | agent.Appearance = sp.Appearance; | ||
988 | if (currentAgentCircuit != null) | ||
989 | agent.ServiceURLs = currentAgentCircuit.ServiceURLs; | ||
990 | |||
991 | if (newRegions.Contains(neighbour.RegionHandle)) | ||
992 | { | ||
993 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
994 | sp.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath); | ||
995 | seeds.Add(neighbour.RegionHandle, agent.CapsPath); | ||
996 | } | ||
997 | else | ||
998 | agent.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, neighbour.RegionHandle); | ||
999 | |||
1000 | cagents.Add(agent); | ||
1001 | } | ||
1002 | } | ||
1003 | |||
1004 | /// Update all child agent with everyone's seeds | ||
1005 | foreach (AgentCircuitData a in cagents) | ||
1006 | { | ||
1007 | a.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds); | ||
1008 | } | ||
1009 | |||
1010 | if (sp.Scene.CapsModule != null) | ||
1011 | { | ||
1012 | sp.Scene.CapsModule.SetChildrenSeed(sp.UUID, seeds); | ||
1013 | } | ||
1014 | sp.KnownRegions = seeds; | ||
1015 | //avatar.Scene.DumpChildrenSeeds(avatar.UUID); | ||
1016 | //avatar.DumpKnownRegions(); | ||
1017 | |||
1018 | bool newAgent = false; | ||
1019 | int count = 0; | ||
1020 | foreach (GridRegion neighbour in neighbours) | ||
1021 | { | ||
1022 | //m_log.WarnFormat("--> Going to send child agent to {0}", neighbour.RegionName); | ||
1023 | // Don't do it if there's already an agent in that region | ||
1024 | if (newRegions.Contains(neighbour.RegionHandle)) | ||
1025 | newAgent = true; | ||
1026 | else | ||
1027 | newAgent = false; | ||
1028 | |||
1029 | if (neighbour.RegionHandle != sp.Scene.RegionInfo.RegionHandle) | ||
1030 | { | ||
1031 | InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; | ||
1032 | try | ||
1033 | { | ||
1034 | d.BeginInvoke(sp, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent, | ||
1035 | InformClientOfNeighbourCompleted, | ||
1036 | d); | ||
1037 | } | ||
1038 | |||
1039 | catch (ArgumentOutOfRangeException) | ||
1040 | { | ||
1041 | m_log.ErrorFormat( | ||
1042 | "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbor list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", | ||
1043 | neighbour.ExternalHostName, | ||
1044 | neighbour.RegionHandle, | ||
1045 | neighbour.RegionLocX, | ||
1046 | neighbour.RegionLocY); | ||
1047 | } | ||
1048 | catch (Exception e) | ||
1049 | { | ||
1050 | m_log.ErrorFormat( | ||
1051 | "[ENTITY TRANSFER MODULE]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}", | ||
1052 | neighbour.ExternalHostName, | ||
1053 | neighbour.RegionHandle, | ||
1054 | neighbour.RegionLocX, | ||
1055 | neighbour.RegionLocY, | ||
1056 | e); | ||
1057 | |||
1058 | // FIXME: Okay, even though we've failed, we're still going to throw the exception on, | ||
1059 | // since I don't know what will happen if we just let the client continue | ||
1060 | |||
1061 | // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. | ||
1062 | // throw e; | ||
1063 | |||
1064 | } | ||
1065 | } | ||
1066 | count++; | ||
1067 | } | ||
1068 | } | ||
1069 | |||
1070 | private void InformClientOfNeighbourCompleted(IAsyncResult iar) | ||
1071 | { | ||
1072 | InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate)iar.AsyncState; | ||
1073 | icon.EndInvoke(iar); | ||
1074 | //m_log.WarnFormat(" --> InformClientOfNeighbourCompleted"); | ||
1075 | } | ||
1076 | |||
1077 | /// <summary> | ||
1078 | /// Async component for informing client of which neighbours exist | ||
1079 | /// </summary> | ||
1080 | /// <remarks> | ||
1081 | /// This needs to run asynchronously, as a network timeout may block the thread for a long while | ||
1082 | /// </remarks> | ||
1083 | /// <param name="remoteClient"></param> | ||
1084 | /// <param name="a"></param> | ||
1085 | /// <param name="regionHandle"></param> | ||
1086 | /// <param name="endPoint"></param> | ||
1087 | private void InformClientOfNeighbourAsync(ScenePresence sp, AgentCircuitData a, GridRegion reg, | ||
1088 | IPEndPoint endPoint, bool newAgent) | ||
1089 | { | ||
1090 | // Let's wait just a little to give time to originating regions to catch up with closing child agents | ||
1091 | // after a cross here | ||
1092 | Thread.Sleep(500); | ||
1093 | |||
1094 | Scene m_scene = sp.Scene; | ||
1095 | |||
1096 | uint x, y; | ||
1097 | Utils.LongToUInts(reg.RegionHandle, out x, out y); | ||
1098 | x = x / Constants.RegionSize; | ||
1099 | y = y / Constants.RegionSize; | ||
1100 | m_log.Info("[ENTITY TRANSFER MODULE]: Starting to inform client about neighbour " + x + ", " + y + "(" + endPoint.ToString() + ")"); | ||
1101 | |||
1102 | string capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort | ||
1103 | + "/CAPS/" + a.CapsPath + "0000/"; | ||
1104 | |||
1105 | string reason = String.Empty; | ||
1106 | |||
1107 | |||
1108 | bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, 0, out reason); // m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, 0, out reason); | ||
1109 | |||
1110 | if (regionAccepted && newAgent) | ||
1111 | { | ||
1112 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | ||
1113 | if (eq != null) | ||
1114 | { | ||
1115 | #region IP Translation for NAT | ||
1116 | IClientIPEndpoint ipepClient; | ||
1117 | if (sp.ClientView.TryGet(out ipepClient)) | ||
1118 | { | ||
1119 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
1120 | } | ||
1121 | #endregion | ||
1122 | |||
1123 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: {0} is sending {1} EnableSimulator for neighbor region {2} @ {3} " + | ||
1124 | "and EstablishAgentCommunication with seed cap {4}", | ||
1125 | m_scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath); | ||
1126 | |||
1127 | eq.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID); | ||
1128 | eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); | ||
1129 | } | ||
1130 | else | ||
1131 | { | ||
1132 | sp.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint); | ||
1133 | // TODO: make Event Queue disablable! | ||
1134 | } | ||
1135 | |||
1136 | m_log.Info("[ENTITY TRANSFER MODULE]: Completed inform client about neighbour " + endPoint.ToString()); | ||
1137 | |||
1138 | } | ||
1139 | |||
1140 | } | ||
1141 | |||
1142 | protected List<GridRegion> RequestNeighbours(Scene pScene, uint pRegionLocX, uint pRegionLocY) | ||
1143 | { | ||
1144 | RegionInfo m_regionInfo = pScene.RegionInfo; | ||
1145 | |||
1146 | Border[] northBorders = pScene.NorthBorders.ToArray(); | ||
1147 | Border[] southBorders = pScene.SouthBorders.ToArray(); | ||
1148 | Border[] eastBorders = pScene.EastBorders.ToArray(); | ||
1149 | Border[] westBorders = pScene.WestBorders.ToArray(); | ||
1150 | |||
1151 | // Legacy one region. Provided for simplicity while testing the all inclusive method in the else statement. | ||
1152 | if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1) | ||
1153 | { | ||
1154 | return pScene.GridService.GetNeighbours(m_regionInfo.ScopeID, m_regionInfo.RegionID); | ||
1155 | } | ||
1156 | else | ||
1157 | { | ||
1158 | Vector2 extent = Vector2.Zero; | ||
1159 | for (int i = 0; i < eastBorders.Length; i++) | ||
1160 | { | ||
1161 | extent.X = (eastBorders[i].BorderLine.Z > extent.X) ? eastBorders[i].BorderLine.Z : extent.X; | ||
1162 | } | ||
1163 | for (int i = 0; i < northBorders.Length; i++) | ||
1164 | { | ||
1165 | extent.Y = (northBorders[i].BorderLine.Z > extent.Y) ? northBorders[i].BorderLine.Z : extent.Y; | ||
1166 | } | ||
1167 | |||
1168 | // Loss of fraction on purpose | ||
1169 | extent.X = ((int)extent.X / (int)Constants.RegionSize) + 1; | ||
1170 | extent.Y = ((int)extent.Y / (int)Constants.RegionSize) + 1; | ||
1171 | |||
1172 | int startX = (int)(pRegionLocX - 1) * (int)Constants.RegionSize; | ||
1173 | int startY = (int)(pRegionLocY - 1) * (int)Constants.RegionSize; | ||
1174 | |||
1175 | int endX = ((int)pRegionLocX + (int)extent.X) * (int)Constants.RegionSize; | ||
1176 | int endY = ((int)pRegionLocY + (int)extent.Y) * (int)Constants.RegionSize; | ||
1177 | |||
1178 | List<GridRegion> neighbours = pScene.GridService.GetRegionRange(m_regionInfo.ScopeID, startX, endX, startY, endY); | ||
1179 | neighbours.RemoveAll(delegate(GridRegion r) { return r.RegionID == m_regionInfo.RegionID; }); | ||
1180 | |||
1181 | return neighbours; | ||
1182 | } | ||
1183 | } | ||
1184 | |||
1185 | private List<ulong> NewNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | ||
1186 | { | ||
1187 | return currentNeighbours.FindAll(delegate(ulong handle) { return !previousNeighbours.Contains(handle); }); | ||
1188 | } | ||
1189 | |||
1190 | // private List<ulong> CommonNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | ||
1191 | // { | ||
1192 | // return currentNeighbours.FindAll(delegate(ulong handle) { return previousNeighbours.Contains(handle); }); | ||
1193 | // } | ||
1194 | |||
1195 | private List<ulong> OldNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | ||
1196 | { | ||
1197 | return previousNeighbours.FindAll(delegate(ulong handle) { return !currentNeighbours.Contains(handle); }); | ||
1198 | } | ||
1199 | |||
1200 | private List<ulong> NeighbourHandles(List<GridRegion> neighbours) | ||
1201 | { | ||
1202 | List<ulong> handles = new List<ulong>(); | ||
1203 | foreach (GridRegion reg in neighbours) | ||
1204 | { | ||
1205 | handles.Add(reg.RegionHandle); | ||
1206 | } | ||
1207 | return handles; | ||
1208 | } | ||
1209 | |||
1210 | private void Dump(string msg, List<ulong> handles) | ||
1211 | { | ||
1212 | m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg); | ||
1213 | foreach (ulong handle in handles) | ||
1214 | { | ||
1215 | uint x, y; | ||
1216 | Utils.LongToUInts(handle, out x, out y); | ||
1217 | x = x / Constants.RegionSize; | ||
1218 | y = y / Constants.RegionSize; | ||
1219 | m_log.InfoFormat("({0}, {1})", x, y); | ||
1220 | } | ||
1221 | } | ||
1222 | |||
1223 | #endregion | ||
1224 | |||
1225 | |||
1226 | #region Agent Arrived | ||
1227 | public void AgentArrivedAtDestination(UUID id) | ||
1228 | { | ||
1229 | //m_log.Debug(" >>> ReleaseAgent called <<< "); | ||
1230 | ResetFromTransit(id); | ||
1231 | } | ||
1232 | |||
1233 | #endregion | ||
1234 | |||
1235 | #region Object Transfers | ||
1236 | /// <summary> | ||
1237 | /// Move the given scene object into a new region depending on which region its absolute position has moved | ||
1238 | /// into. | ||
1239 | /// | ||
1240 | /// This method locates the new region handle and offsets the prim position for the new region | ||
1241 | /// </summary> | ||
1242 | /// <param name="attemptedPosition">the attempted out of region position of the scene object</param> | ||
1243 | /// <param name="grp">the scene object that we're crossing</param> | ||
1244 | public void Cross(SceneObjectGroup grp, Vector3 attemptedPosition, bool silent) | ||
1245 | { | ||
1246 | if (grp == null) | ||
1247 | return; | ||
1248 | if (grp.IsDeleted) | ||
1249 | return; | ||
1250 | |||
1251 | Scene scene = grp.Scene; | ||
1252 | if (scene == null) | ||
1253 | return; | ||
1254 | |||
1255 | if (grp.RootPart.DIE_AT_EDGE) | ||
1256 | { | ||
1257 | // We remove the object here | ||
1258 | try | ||
1259 | { | ||
1260 | scene.DeleteSceneObject(grp, false); | ||
1261 | } | ||
1262 | catch (Exception) | ||
1263 | { | ||
1264 | m_log.Warn("[DATABASE]: exception when trying to remove the prim that crossed the border."); | ||
1265 | } | ||
1266 | return; | ||
1267 | } | ||
1268 | |||
1269 | int thisx = (int)scene.RegionInfo.RegionLocX; | ||
1270 | int thisy = (int)scene.RegionInfo.RegionLocY; | ||
1271 | Vector3 EastCross = new Vector3(0.1f, 0, 0); | ||
1272 | Vector3 WestCross = new Vector3(-0.1f, 0, 0); | ||
1273 | Vector3 NorthCross = new Vector3(0, 0.1f, 0); | ||
1274 | Vector3 SouthCross = new Vector3(0, -0.1f, 0); | ||
1275 | |||
1276 | |||
1277 | // use this if no borders were crossed! | ||
1278 | ulong newRegionHandle | ||
1279 | = Util.UIntsToLong((uint)((thisx) * Constants.RegionSize), | ||
1280 | (uint)((thisy) * Constants.RegionSize)); | ||
1281 | |||
1282 | Vector3 pos = attemptedPosition; | ||
1283 | |||
1284 | int changeX = 1; | ||
1285 | int changeY = 1; | ||
1286 | |||
1287 | if (scene.TestBorderCross(attemptedPosition + WestCross, Cardinals.W)) | ||
1288 | { | ||
1289 | if (scene.TestBorderCross(attemptedPosition + SouthCross, Cardinals.S)) | ||
1290 | { | ||
1291 | |||
1292 | Border crossedBorderx = scene.GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W); | ||
1293 | |||
1294 | if (crossedBorderx.BorderLine.Z > 0) | ||
1295 | { | ||
1296 | pos.X = ((pos.X + crossedBorderx.BorderLine.Z)); | ||
1297 | changeX = (int)(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize); | ||
1298 | } | ||
1299 | else | ||
1300 | pos.X = ((pos.X + Constants.RegionSize)); | ||
1301 | |||
1302 | Border crossedBordery = scene.GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); | ||
1303 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
1304 | |||
1305 | if (crossedBordery.BorderLine.Z > 0) | ||
1306 | { | ||
1307 | pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); | ||
1308 | changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); | ||
1309 | } | ||
1310 | else | ||
1311 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
1312 | |||
1313 | |||
1314 | |||
1315 | newRegionHandle | ||
1316 | = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), | ||
1317 | (uint)((thisy - changeY) * Constants.RegionSize)); | ||
1318 | // x - 1 | ||
1319 | // y - 1 | ||
1320 | } | ||
1321 | else if (scene.TestBorderCross(attemptedPosition + NorthCross, Cardinals.N)) | ||
1322 | { | ||
1323 | Border crossedBorderx = scene.GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W); | ||
1324 | |||
1325 | if (crossedBorderx.BorderLine.Z > 0) | ||
1326 | { | ||
1327 | pos.X = ((pos.X + crossedBorderx.BorderLine.Z)); | ||
1328 | changeX = (int)(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize); | ||
1329 | } | ||
1330 | else | ||
1331 | pos.X = ((pos.X + Constants.RegionSize)); | ||
1332 | |||
1333 | |||
1334 | Border crossedBordery = scene.GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); | ||
1335 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
1336 | |||
1337 | if (crossedBordery.BorderLine.Z > 0) | ||
1338 | { | ||
1339 | pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); | ||
1340 | changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); | ||
1341 | } | ||
1342 | else | ||
1343 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
1344 | |||
1345 | newRegionHandle | ||
1346 | = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), | ||
1347 | (uint)((thisy + changeY) * Constants.RegionSize)); | ||
1348 | // x - 1 | ||
1349 | // y + 1 | ||
1350 | } | ||
1351 | else | ||
1352 | { | ||
1353 | Border crossedBorderx = scene.GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W); | ||
1354 | |||
1355 | if (crossedBorderx.BorderLine.Z > 0) | ||
1356 | { | ||
1357 | pos.X = ((pos.X + crossedBorderx.BorderLine.Z)); | ||
1358 | changeX = (int)(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize); | ||
1359 | } | ||
1360 | else | ||
1361 | pos.X = ((pos.X + Constants.RegionSize)); | ||
1362 | |||
1363 | newRegionHandle | ||
1364 | = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), | ||
1365 | (uint)(thisy * Constants.RegionSize)); | ||
1366 | // x - 1 | ||
1367 | } | ||
1368 | } | ||
1369 | else if (scene.TestBorderCross(attemptedPosition + EastCross, Cardinals.E)) | ||
1370 | { | ||
1371 | if (scene.TestBorderCross(attemptedPosition + SouthCross, Cardinals.S)) | ||
1372 | { | ||
1373 | |||
1374 | pos.X = ((pos.X - Constants.RegionSize)); | ||
1375 | Border crossedBordery = scene.GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); | ||
1376 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
1377 | |||
1378 | if (crossedBordery.BorderLine.Z > 0) | ||
1379 | { | ||
1380 | pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); | ||
1381 | changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); | ||
1382 | } | ||
1383 | else | ||
1384 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
1385 | |||
1386 | |||
1387 | newRegionHandle | ||
1388 | = Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize), | ||
1389 | (uint)((thisy - changeY) * Constants.RegionSize)); | ||
1390 | // x + 1 | ||
1391 | // y - 1 | ||
1392 | } | ||
1393 | else if (scene.TestBorderCross(attemptedPosition + NorthCross, Cardinals.N)) | ||
1394 | { | ||
1395 | pos.X = ((pos.X - Constants.RegionSize)); | ||
1396 | pos.Y = ((pos.Y - Constants.RegionSize)); | ||
1397 | newRegionHandle | ||
1398 | = Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize), | ||
1399 | (uint)((thisy + changeY) * Constants.RegionSize)); | ||
1400 | // x + 1 | ||
1401 | // y + 1 | ||
1402 | } | ||
1403 | else | ||
1404 | { | ||
1405 | pos.X = ((pos.X - Constants.RegionSize)); | ||
1406 | newRegionHandle | ||
1407 | = Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize), | ||
1408 | (uint)(thisy * Constants.RegionSize)); | ||
1409 | // x + 1 | ||
1410 | } | ||
1411 | } | ||
1412 | else if (scene.TestBorderCross(attemptedPosition + SouthCross, Cardinals.S)) | ||
1413 | { | ||
1414 | Border crossedBordery = scene.GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); | ||
1415 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
1416 | |||
1417 | if (crossedBordery.BorderLine.Z > 0) | ||
1418 | { | ||
1419 | pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); | ||
1420 | changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); | ||
1421 | } | ||
1422 | else | ||
1423 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
1424 | |||
1425 | newRegionHandle | ||
1426 | = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - changeY) * Constants.RegionSize)); | ||
1427 | // y - 1 | ||
1428 | } | ||
1429 | else if (scene.TestBorderCross(attemptedPosition + NorthCross, Cardinals.N)) | ||
1430 | { | ||
1431 | |||
1432 | pos.Y = ((pos.Y - Constants.RegionSize)); | ||
1433 | newRegionHandle | ||
1434 | = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + changeY) * Constants.RegionSize)); | ||
1435 | // y + 1 | ||
1436 | } | ||
1437 | |||
1438 | // Offset the positions for the new region across the border | ||
1439 | Vector3 oldGroupPosition = grp.RootPart.GroupPosition; | ||
1440 | grp.OffsetForNewRegion(pos); | ||
1441 | |||
1442 | // If we fail to cross the border, then reset the position of the scene object on that border. | ||
1443 | uint x = 0, y = 0; | ||
1444 | Utils.LongToUInts(newRegionHandle, out x, out y); | ||
1445 | GridRegion destination = scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
1446 | if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent)) | ||
1447 | { | ||
1448 | grp.OffsetForNewRegion(oldGroupPosition); | ||
1449 | grp.ScheduleGroupForFullUpdate(); | ||
1450 | } | ||
1451 | } | ||
1452 | |||
1453 | |||
1454 | /// <summary> | ||
1455 | /// Move the given scene object into a new region | ||
1456 | /// </summary> | ||
1457 | /// <param name="newRegionHandle"></param> | ||
1458 | /// <param name="grp">Scene Object Group that we're crossing</param> | ||
1459 | /// <returns> | ||
1460 | /// true if the crossing itself was successful, false on failure | ||
1461 | /// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region | ||
1462 | /// </returns> | ||
1463 | protected bool CrossPrimGroupIntoNewRegion(GridRegion destination, SceneObjectGroup grp, bool silent) | ||
1464 | { | ||
1465 | //m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<"); | ||
1466 | |||
1467 | bool successYN = false; | ||
1468 | grp.RootPart.UpdateFlag = 0; | ||
1469 | //int primcrossingXMLmethod = 0; | ||
1470 | |||
1471 | if (destination != null) | ||
1472 | { | ||
1473 | //string objectState = grp.GetStateSnapshot(); | ||
1474 | |||
1475 | //successYN | ||
1476 | // = m_sceneGridService.PrimCrossToNeighboringRegion( | ||
1477 | // newRegionHandle, grp.UUID, m_serialiser.SaveGroupToXml2(grp), primcrossingXMLmethod); | ||
1478 | //if (successYN && (objectState != "") && m_allowScriptCrossings) | ||
1479 | //{ | ||
1480 | // successYN = m_sceneGridService.PrimCrossToNeighboringRegion( | ||
1481 | // newRegionHandle, grp.UUID, objectState, 100); | ||
1482 | //} | ||
1483 | |||
1484 | //// And the new channel... | ||
1485 | //if (m_interregionCommsOut != null) | ||
1486 | // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); | ||
1487 | if (m_aScene.SimulationService != null) | ||
1488 | successYN = m_aScene.SimulationService.CreateObject(destination, grp, true); | ||
1489 | |||
1490 | if (successYN) | ||
1491 | { | ||
1492 | // We remove the object here | ||
1493 | try | ||
1494 | { | ||
1495 | grp.Scene.DeleteSceneObject(grp, silent); | ||
1496 | } | ||
1497 | catch (Exception e) | ||
1498 | { | ||
1499 | m_log.ErrorFormat( | ||
1500 | "[ENTITY TRANSFER MODULE]: Exception deleting the old object left behind on a border crossing for {0}, {1}", | ||
1501 | grp, e); | ||
1502 | } | ||
1503 | } | ||
1504 | else | ||
1505 | { | ||
1506 | if (!grp.IsDeleted) | ||
1507 | { | ||
1508 | if (grp.RootPart.PhysActor != null) | ||
1509 | { | ||
1510 | grp.RootPart.PhysActor.CrossingFailure(); | ||
1511 | } | ||
1512 | } | ||
1513 | |||
1514 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: Prim crossing failed for {0}", grp); | ||
1515 | } | ||
1516 | } | ||
1517 | else | ||
1518 | { | ||
1519 | m_log.Error("[ENTITY TRANSFER MODULE]: destination was unexpectedly null in Scene.CrossPrimGroupIntoNewRegion()"); | ||
1520 | } | ||
1521 | |||
1522 | return successYN; | ||
1523 | } | ||
1524 | |||
1525 | protected bool CrossAttachmentsIntoNewRegion(GridRegion destination, ScenePresence sp, bool silent) | ||
1526 | { | ||
1527 | List<SceneObjectGroup> m_attachments = sp.Attachments; | ||
1528 | lock (m_attachments) | ||
1529 | { | ||
1530 | // Validate | ||
1531 | foreach (SceneObjectGroup gobj in m_attachments) | ||
1532 | { | ||
1533 | if (gobj == null || gobj.IsDeleted) | ||
1534 | return false; | ||
1535 | } | ||
1536 | |||
1537 | foreach (SceneObjectGroup gobj in m_attachments) | ||
1538 | { | ||
1539 | // If the prim group is null then something must have happened to it! | ||
1540 | if (gobj != null && gobj.RootPart != null) | ||
1541 | { | ||
1542 | // Set the parent localID to 0 so it transfers over properly. | ||
1543 | gobj.RootPart.SetParentLocalId(0); | ||
1544 | gobj.AbsolutePosition = gobj.RootPart.AttachedPos; | ||
1545 | gobj.RootPart.IsAttachment = false; | ||
1546 | //gobj.RootPart.LastOwnerID = gobj.GetFromAssetID(); | ||
1547 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending attachment {0} to region {1}", gobj.UUID, destination.RegionName); | ||
1548 | CrossPrimGroupIntoNewRegion(destination, gobj, silent); | ||
1549 | } | ||
1550 | } | ||
1551 | m_attachments.Clear(); | ||
1552 | |||
1553 | return true; | ||
1554 | } | ||
1555 | } | ||
1556 | |||
1557 | #endregion | ||
1558 | |||
1559 | #region Misc | ||
1560 | |||
1561 | protected bool WaitForCallback(UUID id) | ||
1562 | { | ||
1563 | int count = 200; | ||
1564 | while (m_agentsInTransit.Contains(id) && count-- > 0) | ||
1565 | { | ||
1566 | //m_log.Debug(" >>> Waiting... " + count); | ||
1567 | Thread.Sleep(100); | ||
1568 | } | ||
1569 | |||
1570 | if (count > 0) | ||
1571 | return true; | ||
1572 | else | ||
1573 | return false; | ||
1574 | } | ||
1575 | |||
1576 | protected void SetInTransit(UUID id) | ||
1577 | { | ||
1578 | lock (m_agentsInTransit) | ||
1579 | { | ||
1580 | if (!m_agentsInTransit.Contains(id)) | ||
1581 | m_agentsInTransit.Add(id); | ||
1582 | } | ||
1583 | } | ||
1584 | |||
1585 | protected bool ResetFromTransit(UUID id) | ||
1586 | { | ||
1587 | lock (m_agentsInTransit) | ||
1588 | { | ||
1589 | if (m_agentsInTransit.Contains(id)) | ||
1590 | { | ||
1591 | m_agentsInTransit.Remove(id); | ||
1592 | return true; | ||
1593 | } | ||
1594 | } | ||
1595 | return false; | ||
1596 | } | ||
1597 | |||
1598 | |||
1599 | #endregion | ||
1600 | |||
1601 | } | ||
1602 | } | ||
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs new file mode 100644 index 0000000..28593fc --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs | |||
@@ -0,0 +1,273 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | |||
32 | using OpenSim.Framework; | ||
33 | using OpenSim.Region.Framework.Interfaces; | ||
34 | using OpenSim.Region.Framework.Scenes; | ||
35 | using OpenSim.Services.Connectors.Hypergrid; | ||
36 | using OpenSim.Services.Interfaces; | ||
37 | using OpenSim.Server.Base; | ||
38 | |||
39 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
40 | |||
41 | using OpenMetaverse; | ||
42 | using log4net; | ||
43 | using Nini.Config; | ||
44 | |||
45 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | ||
46 | { | ||
47 | public class HGEntityTransferModule : EntityTransferModule, ISharedRegionModule, IEntityTransferModule, IUserAgentVerificationModule | ||
48 | { | ||
49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
50 | |||
51 | private bool m_Initialized = false; | ||
52 | |||
53 | private GatekeeperServiceConnector m_GatekeeperConnector; | ||
54 | |||
55 | #region ISharedRegionModule | ||
56 | |||
57 | public override string Name | ||
58 | { | ||
59 | get { return "HGEntityTransferModule"; } | ||
60 | } | ||
61 | |||
62 | public override void Initialise(IConfigSource source) | ||
63 | { | ||
64 | IConfig moduleConfig = source.Configs["Modules"]; | ||
65 | if (moduleConfig != null) | ||
66 | { | ||
67 | string name = moduleConfig.GetString("EntityTransferModule", ""); | ||
68 | if (name == Name) | ||
69 | { | ||
70 | m_agentsInTransit = new List<UUID>(); | ||
71 | |||
72 | m_Enabled = true; | ||
73 | m_log.InfoFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); | ||
74 | } | ||
75 | } | ||
76 | } | ||
77 | |||
78 | public override void AddRegion(Scene scene) | ||
79 | { | ||
80 | base.AddRegion(scene); | ||
81 | if (m_Enabled) | ||
82 | { | ||
83 | scene.RegisterModuleInterface<IUserAgentVerificationModule>(this); | ||
84 | } | ||
85 | } | ||
86 | |||
87 | protected override void OnNewClient(IClientAPI client) | ||
88 | { | ||
89 | client.OnTeleportHomeRequest += TeleportHome; | ||
90 | client.OnConnectionClosed += new Action<IClientAPI>(OnConnectionClosed); | ||
91 | } | ||
92 | |||
93 | |||
94 | public override void RegionLoaded(Scene scene) | ||
95 | { | ||
96 | base.RegionLoaded(scene); | ||
97 | if (m_Enabled) | ||
98 | if (!m_Initialized) | ||
99 | { | ||
100 | m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService); | ||
101 | m_Initialized = true; | ||
102 | } | ||
103 | |||
104 | } | ||
105 | public override void RemoveRegion(Scene scene) | ||
106 | { | ||
107 | base.AddRegion(scene); | ||
108 | if (m_Enabled) | ||
109 | { | ||
110 | scene.UnregisterModuleInterface<IUserAgentVerificationModule>(this); | ||
111 | } | ||
112 | } | ||
113 | |||
114 | |||
115 | #endregion | ||
116 | |||
117 | #region HG overrides of IEntiryTransferModule | ||
118 | |||
119 | protected override GridRegion GetFinalDestination(GridRegion region) | ||
120 | { | ||
121 | int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, region.RegionID); | ||
122 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionID, flags); | ||
123 | if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) | ||
124 | { | ||
125 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region {0} is hyperlink", region.RegionID); | ||
126 | return m_GatekeeperConnector.GetHyperlinkRegion(region, region.RegionID); | ||
127 | } | ||
128 | return region; | ||
129 | } | ||
130 | |||
131 | protected override bool NeedsClosing(uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, GridRegion reg) | ||
132 | { | ||
133 | if (base.NeedsClosing(oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) | ||
134 | return true; | ||
135 | |||
136 | int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); | ||
137 | if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) | ||
138 | return true; | ||
139 | |||
140 | return false; | ||
141 | } | ||
142 | |||
143 | protected override bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason) | ||
144 | { | ||
145 | reason = string.Empty; | ||
146 | int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); | ||
147 | if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) | ||
148 | { | ||
149 | // this user is going to another grid | ||
150 | if (agentCircuit.ServiceURLs.ContainsKey("HomeURI")) | ||
151 | { | ||
152 | string userAgentDriver = agentCircuit.ServiceURLs["HomeURI"].ToString(); | ||
153 | IUserAgentService connector = new UserAgentServiceConnector(userAgentDriver); | ||
154 | bool success = connector.LoginAgentToGrid(agentCircuit, reg, finalDestination, out reason); | ||
155 | if (success) | ||
156 | // Log them out of this grid | ||
157 | m_aScene.PresenceService.LogoutAgent(agentCircuit.SessionID, sp.AbsolutePosition, sp.Lookat); | ||
158 | |||
159 | return success; | ||
160 | } | ||
161 | else | ||
162 | { | ||
163 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent does not have a HomeURI address"); | ||
164 | return false; | ||
165 | } | ||
166 | } | ||
167 | |||
168 | return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason); | ||
169 | } | ||
170 | |||
171 | public override void TeleportHome(UUID id, IClientAPI client) | ||
172 | { | ||
173 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); | ||
174 | |||
175 | // Let's find out if this is a foreign user or a local user | ||
176 | UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, id); | ||
177 | if (account != null) | ||
178 | { | ||
179 | // local grid user | ||
180 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local"); | ||
181 | base.TeleportHome(id, client); | ||
182 | return; | ||
183 | } | ||
184 | |||
185 | // Foreign user wants to go home | ||
186 | // | ||
187 | AgentCircuitData aCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode); | ||
188 | if (aCircuit == null || (aCircuit != null && !aCircuit.ServiceURLs.ContainsKey("HomeURI"))) | ||
189 | { | ||
190 | client.SendTeleportFailed("Your information has been lost"); | ||
191 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Unable to locate agent's gateway information"); | ||
192 | return; | ||
193 | } | ||
194 | |||
195 | IUserAgentService userAgentService = new UserAgentServiceConnector(aCircuit.ServiceURLs["HomeURI"].ToString()); | ||
196 | Vector3 position = Vector3.UnitY, lookAt = Vector3.UnitY; | ||
197 | GridRegion finalDestination = userAgentService.GetHomeRegion(aCircuit.AgentID, out position, out lookAt); | ||
198 | if (finalDestination == null) | ||
199 | { | ||
200 | client.SendTeleportFailed("Your home region could not be found"); | ||
201 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent's home region not found"); | ||
202 | return; | ||
203 | } | ||
204 | |||
205 | ScenePresence sp = ((Scene)(client.Scene)).GetScenePresence(client.AgentId); | ||
206 | if (sp == null) | ||
207 | { | ||
208 | client.SendTeleportFailed("Internal error"); | ||
209 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent not found in the scene where it is supposed to be"); | ||
210 | return; | ||
211 | } | ||
212 | |||
213 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | ||
214 | GridRegion homeGatekeeper = MakeRegion(aCircuit); | ||
215 | |||
216 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}:{5}", | ||
217 | aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName); | ||
218 | |||
219 | DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); | ||
220 | } | ||
221 | #endregion | ||
222 | |||
223 | #region IUserAgentVerificationModule | ||
224 | |||
225 | public bool VerifyClient(AgentCircuitData aCircuit, string token) | ||
226 | { | ||
227 | if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) | ||
228 | { | ||
229 | string url = aCircuit.ServiceURLs["HomeURI"].ToString(); | ||
230 | IUserAgentService security = new UserAgentServiceConnector(url); | ||
231 | return security.VerifyClient(aCircuit.SessionID, token); | ||
232 | } | ||
233 | |||
234 | return false; | ||
235 | } | ||
236 | |||
237 | void OnConnectionClosed(IClientAPI obj) | ||
238 | { | ||
239 | if (obj.IsLoggingOut) | ||
240 | { | ||
241 | AgentCircuitData aCircuit = ((Scene)(obj.Scene)).AuthenticateHandler.GetAgentCircuitData(obj.CircuitCode); | ||
242 | |||
243 | if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) | ||
244 | { | ||
245 | string url = aCircuit.ServiceURLs["HomeURI"].ToString(); | ||
246 | IUserAgentService security = new UserAgentServiceConnector(url); | ||
247 | security.LogoutAgent(obj.AgentId, obj.SessionId); | ||
248 | //m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Sent logout call to UserAgentService @ {0}", url); | ||
249 | } | ||
250 | else | ||
251 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: HomeURI not found for agent {0} logout", obj.AgentId); | ||
252 | } | ||
253 | } | ||
254 | |||
255 | #endregion | ||
256 | |||
257 | private GridRegion MakeRegion(AgentCircuitData aCircuit) | ||
258 | { | ||
259 | GridRegion region = new GridRegion(); | ||
260 | |||
261 | Uri uri = null; | ||
262 | if (!aCircuit.ServiceURLs.ContainsKey("HomeURI") || | ||
263 | (aCircuit.ServiceURLs.ContainsKey("HomeURI") && !Uri.TryCreate(aCircuit.ServiceURLs["HomeURI"].ToString(), UriKind.Absolute, out uri))) | ||
264 | return null; | ||
265 | |||
266 | region.ExternalHostName = uri.Host; | ||
267 | region.HttpPort = (uint)uri.Port; | ||
268 | region.RegionName = string.Empty; | ||
269 | region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); | ||
270 | return region; | ||
271 | } | ||
272 | } | ||
273 | } | ||
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs new file mode 100644 index 0000000..664f38d --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs | |||
@@ -0,0 +1,200 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using System.Threading; | ||
32 | using log4net; | ||
33 | using OpenMetaverse; | ||
34 | using OpenSim.Framework; | ||
35 | |||
36 | using OpenSim.Region.Framework.Scenes; | ||
37 | using OpenSim.Region.Framework.Scenes.Serialization; | ||
38 | using OpenSim.Region.Framework.Interfaces; | ||
39 | using OpenSim.Services.Interfaces; | ||
40 | |||
41 | //using HyperGrid.Framework; | ||
42 | //using OpenSim.Region.Communications.Hypergrid; | ||
43 | |||
44 | namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | ||
45 | { | ||
46 | public class HGAssetMapper | ||
47 | { | ||
48 | #region Fields | ||
49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
50 | |||
51 | // This maps between inventory server urls and inventory server clients | ||
52 | // private Dictionary<string, InventoryClient> m_inventoryServers = new Dictionary<string, InventoryClient>(); | ||
53 | |||
54 | private Scene m_scene; | ||
55 | |||
56 | #endregion | ||
57 | |||
58 | #region Constructor | ||
59 | |||
60 | public HGAssetMapper(Scene scene) | ||
61 | { | ||
62 | m_scene = scene; | ||
63 | } | ||
64 | |||
65 | #endregion | ||
66 | |||
67 | #region Internal functions | ||
68 | |||
69 | public AssetBase FetchAsset(string url, UUID assetID) | ||
70 | { | ||
71 | AssetBase asset = m_scene.AssetService.Get(url + "/" + assetID.ToString()); | ||
72 | |||
73 | if (asset != null) | ||
74 | { | ||
75 | m_log.DebugFormat("[HG ASSET MAPPER]: Copied asset {0} from {1} to local asset server. ", asset.ID, url); | ||
76 | return asset; | ||
77 | } | ||
78 | return null; | ||
79 | } | ||
80 | |||
81 | public bool PostAsset(string url, AssetBase asset) | ||
82 | { | ||
83 | if (asset != null) | ||
84 | { | ||
85 | // See long comment in AssetCache.AddAsset | ||
86 | if (!asset.Temporary || asset.Local) | ||
87 | { | ||
88 | // We need to copy the asset into a new asset, because | ||
89 | // we need to set its ID to be URL+UUID, so that the | ||
90 | // HGAssetService dispatches it to the remote grid. | ||
91 | // It's not pretty, but the best that can be done while | ||
92 | // not having a global naming infrastructure | ||
93 | AssetBase asset1 = new AssetBase(asset.FullID, asset.Name, asset.Type, asset.Metadata.CreatorID); | ||
94 | Copy(asset, asset1); | ||
95 | try | ||
96 | { | ||
97 | asset1.ID = url + "/" + asset.ID; | ||
98 | } | ||
99 | catch | ||
100 | { | ||
101 | m_log.Warn("[HG ASSET MAPPER]: Oops."); | ||
102 | } | ||
103 | |||
104 | m_scene.AssetService.Store(asset1); | ||
105 | m_log.DebugFormat("[HG ASSET MAPPER]: Posted copy of asset {0} from local asset server to {1}", asset1.ID, url); | ||
106 | } | ||
107 | return true; | ||
108 | } | ||
109 | else | ||
110 | m_log.Warn("[HG ASSET MAPPER]: Tried to post asset to remote server, but asset not in local cache."); | ||
111 | |||
112 | return false; | ||
113 | } | ||
114 | |||
115 | private void Copy(AssetBase from, AssetBase to) | ||
116 | { | ||
117 | to.Data = from.Data; | ||
118 | to.Description = from.Description; | ||
119 | to.FullID = from.FullID; | ||
120 | to.ID = from.ID; | ||
121 | to.Local = from.Local; | ||
122 | to.Name = from.Name; | ||
123 | to.Temporary = from.Temporary; | ||
124 | to.Type = from.Type; | ||
125 | |||
126 | } | ||
127 | |||
128 | // TODO: unused | ||
129 | // private void Dump(Dictionary<UUID, bool> lst) | ||
130 | // { | ||
131 | // m_log.Debug("XXX -------- UUID DUMP ------- XXX"); | ||
132 | // foreach (KeyValuePair<UUID, bool> kvp in lst) | ||
133 | // m_log.Debug(" >> " + kvp.Key + " (texture? " + kvp.Value + ")"); | ||
134 | // m_log.Debug("XXX -------- UUID DUMP ------- XXX"); | ||
135 | // } | ||
136 | |||
137 | #endregion | ||
138 | |||
139 | |||
140 | #region Public interface | ||
141 | |||
142 | public void Get(UUID assetID, UUID ownerID, string userAssetURL) | ||
143 | { | ||
144 | // Get the item from the remote asset server onto the local AssetCache | ||
145 | // and place an entry in m_assetMap | ||
146 | |||
147 | m_log.Debug("[HG ASSET MAPPER]: Fetching object " + assetID + " from asset server " + userAssetURL); | ||
148 | AssetBase asset = FetchAsset(userAssetURL, assetID); | ||
149 | |||
150 | if (asset != null) | ||
151 | { | ||
152 | // OK, now fetch the inside. | ||
153 | Dictionary<UUID, int> ids = new Dictionary<UUID, int>(); | ||
154 | HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, userAssetURL); | ||
155 | uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids); | ||
156 | foreach (UUID uuid in ids.Keys) | ||
157 | FetchAsset(userAssetURL, uuid); | ||
158 | |||
159 | m_log.DebugFormat("[HG ASSET MAPPER]: Successfully fetched asset {0} from asset server {1}", asset.ID, userAssetURL); | ||
160 | |||
161 | } | ||
162 | else | ||
163 | m_log.Warn("[HG ASSET MAPPER]: Could not fetch asset from remote asset server " + userAssetURL); | ||
164 | } | ||
165 | |||
166 | |||
167 | public void Post(UUID assetID, UUID ownerID, string userAssetURL) | ||
168 | { | ||
169 | // Post the item from the local AssetCache onto the remote asset server | ||
170 | // and place an entry in m_assetMap | ||
171 | |||
172 | m_log.Debug("[HG ASSET MAPPER]: Posting object " + assetID + " to asset server " + userAssetURL); | ||
173 | AssetBase asset = m_scene.AssetService.Get(assetID.ToString()); | ||
174 | if (asset != null) | ||
175 | { | ||
176 | Dictionary<UUID, int> ids = new Dictionary<UUID, int>(); | ||
177 | HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, string.Empty); | ||
178 | uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids); | ||
179 | foreach (UUID uuid in ids.Keys) | ||
180 | { | ||
181 | asset = m_scene.AssetService.Get(uuid.ToString()); | ||
182 | if (asset == null) | ||
183 | m_log.DebugFormat("[HG ASSET MAPPER]: Could not find asset {0}", uuid); | ||
184 | else | ||
185 | PostAsset(userAssetURL, asset); | ||
186 | } | ||
187 | |||
188 | // maybe all pieces got there... | ||
189 | m_log.DebugFormat("[HG ASSET MAPPER]: Successfully posted item {0} to asset server {1}", assetID, userAssetURL); | ||
190 | |||
191 | } | ||
192 | else | ||
193 | m_log.DebugFormat("[HG ASSET MAPPER]: Something wrong with asset {0}, it could not be found", assetID); | ||
194 | |||
195 | } | ||
196 | |||
197 | #endregion | ||
198 | |||
199 | } | ||
200 | } | ||
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs index 6f7f34f..25f5154 100644 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -25,55 +25,67 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
28 | using System.Reflection; | 30 | using System.Reflection; |
29 | using log4net; | 31 | |
30 | using Nini.Config; | ||
31 | using OpenMetaverse; | ||
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Framework.Communications; | ||
34 | using OpenSim.Framework.Communications.Cache; | ||
35 | using OpenSim.Region.Framework.Interfaces; | 33 | using OpenSim.Region.Framework.Interfaces; |
34 | using OpenSim.Region.Framework.Scenes; | ||
35 | using OpenSim.Services.Connectors.Hypergrid; | ||
36 | using OpenSim.Services.Interfaces; | ||
37 | using OpenSim.Server.Base; | ||
36 | 38 | ||
37 | namespace OpenSim.Region.Framework.Scenes.Hypergrid | 39 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
40 | |||
41 | using OpenMetaverse; | ||
42 | using log4net; | ||
43 | using Nini.Config; | ||
44 | |||
45 | namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | ||
38 | { | 46 | { |
39 | public partial class HGScene : Scene | 47 | public class HGInventoryAccessModule : BasicInventoryAccessModule, INonSharedRegionModule, IInventoryAccessModule |
40 | { | 48 | { |
41 | #region Fields | ||
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
43 | 50 | ||
44 | private HGAssetMapper m_assMapper; | 51 | private static HGAssetMapper m_assMapper; |
45 | public HGAssetMapper AssetMapper | 52 | public static HGAssetMapper AssetMapper |
46 | { | 53 | { |
47 | get { return m_assMapper; } | 54 | get { return m_assMapper; } |
48 | } | 55 | } |
49 | 56 | ||
50 | private IHyperAssetService m_hyper; | 57 | private bool m_Initialized = false; |
51 | private IHyperAssetService HyperAssets | 58 | |
59 | #region INonSharedRegionModule | ||
60 | |||
61 | public override string Name | ||
62 | { | ||
63 | get { return "HGInventoryAccessModule"; } | ||
64 | } | ||
65 | |||
66 | public override void Initialise(IConfigSource source) | ||
52 | { | 67 | { |
53 | get | 68 | IConfig moduleConfig = source.Configs["Modules"]; |
69 | if (moduleConfig != null) | ||
54 | { | 70 | { |
55 | if (m_hyper == null) | 71 | string name = moduleConfig.GetString("InventoryAccessModule", ""); |
56 | m_hyper = RequestModuleInterface<IHyperAssetService>(); | 72 | if (name == Name) |
57 | return m_hyper; | 73 | { |
74 | m_Enabled = true; | ||
75 | m_log.InfoFormat("[HG INVENTORY ACCESS MODULE]: {0} enabled.", Name); | ||
76 | } | ||
58 | } | 77 | } |
59 | } | 78 | } |
60 | 79 | ||
61 | #endregion | 80 | public override void AddRegion(Scene scene) |
62 | |||
63 | #region Constructors | ||
64 | |||
65 | public HGScene(RegionInfo regInfo, AgentCircuitManager authen, | ||
66 | CommunicationsManager commsMan, SceneCommunicationService sceneGridService, | ||
67 | StorageManager storeManager, | ||
68 | ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, | ||
69 | bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) | ||
70 | : base(regInfo, authen, commsMan, sceneGridService, storeManager, moduleLoader, | ||
71 | dumpAssetsToFile, physicalPrim, SeeIntoRegionFromNeighbor, config, simulatorVersion) | ||
72 | { | 81 | { |
73 | m_log.Info("[HGScene]: Starting HGScene."); | 82 | if (!m_Enabled) |
74 | m_assMapper = new HGAssetMapper(this); | 83 | return; |
84 | |||
85 | base.AddRegion(scene); | ||
86 | m_assMapper = new HGAssetMapper(scene); | ||
87 | scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem; | ||
75 | 88 | ||
76 | EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem; | ||
77 | } | 89 | } |
78 | 90 | ||
79 | #endregion | 91 | #endregion |
@@ -82,17 +94,16 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid | |||
82 | 94 | ||
83 | public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) | 95 | public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) |
84 | { | 96 | { |
85 | CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(avatarID); | 97 | string userAssetServer = string.Empty; |
86 | if (userInfo != null) | 98 | if (IsForeignUser(avatarID, out userAssetServer)) |
87 | { | 99 | { |
88 | m_assMapper.Post(assetID, avatarID); | 100 | m_assMapper.Post(assetID, avatarID, userAssetServer); |
89 | } | 101 | } |
90 | } | 102 | } |
91 | 103 | ||
92 | #endregion | 104 | #endregion |
93 | 105 | ||
94 | #region Overrides of Scene.Inventory methods | 106 | #region Overrides of Basic Inventory Access methods |
95 | |||
96 | /// | 107 | /// |
97 | /// CapsUpdateInventoryItemAsset | 108 | /// CapsUpdateInventoryItemAsset |
98 | /// | 109 | /// |
@@ -135,7 +146,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid | |||
135 | //{ | 146 | //{ |
136 | InventoryItemBase item = new InventoryItemBase(itemID); | 147 | InventoryItemBase item = new InventoryItemBase(itemID); |
137 | item.Owner = remoteClient.AgentId; | 148 | item.Owner = remoteClient.AgentId; |
138 | item = InventoryService.GetItem(item); | 149 | item = m_Scene.InventoryService.GetItem(item); |
139 | //if (item == null) | 150 | //if (item == null) |
140 | //{ // Fetch the item | 151 | //{ // Fetch the item |
141 | // item = new InventoryItemBase(); | 152 | // item = new InventoryItemBase(); |
@@ -143,32 +154,54 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid | |||
143 | // item.ID = itemID; | 154 | // item.ID = itemID; |
144 | // item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo); | 155 | // item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo); |
145 | //} | 156 | //} |
146 | if (item != null) | 157 | string userAssetServer = string.Empty; |
158 | if (item != null && IsForeignUser(remoteClient.AgentId, out userAssetServer)) | ||
147 | { | 159 | { |
148 | m_assMapper.Get(item.AssetID, remoteClient.AgentId); | 160 | m_assMapper.Get(item.AssetID, remoteClient.AgentId, userAssetServer); |
149 | 161 | ||
150 | } | 162 | } |
151 | //} | 163 | //} |
152 | 164 | ||
153 | // OK, we're done fetching. Pass it up to the default RezObject | 165 | // OK, we're done fetching. Pass it up to the default RezObject |
154 | return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, | 166 | return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, |
155 | RezSelected, RemoveItem, fromTaskID, attachment); | 167 | RezSelected, RemoveItem, fromTaskID, attachment); |
156 | 168 | ||
157 | } | 169 | } |
158 | 170 | ||
159 | protected override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) | 171 | public override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) |
160 | { | 172 | { |
161 | string userAssetServer = HyperAssets.GetUserAssetServer(sender); | 173 | string userAssetServer = string.Empty; |
162 | if ((userAssetServer != string.Empty) && (userAssetServer != HyperAssets.GetSimAssetServer())) | 174 | if (IsForeignUser(sender, out userAssetServer)) |
163 | m_assMapper.Get(item.AssetID, sender); | 175 | m_assMapper.Get(item.AssetID, sender, userAssetServer); |
164 | 176 | ||
165 | userAssetServer = HyperAssets.GetUserAssetServer(receiver); | 177 | if (IsForeignUser(receiver, out userAssetServer)) |
166 | if ((userAssetServer != string.Empty) && (userAssetServer != HyperAssets.GetSimAssetServer())) | 178 | m_assMapper.Post(item.AssetID, receiver, userAssetServer); |
167 | m_assMapper.Post(item.AssetID, receiver); | ||
168 | } | 179 | } |
169 | 180 | ||
170 | #endregion | 181 | #endregion |
171 | 182 | ||
172 | } | 183 | public bool IsForeignUser(UUID userID, out string assetServerURL) |
184 | { | ||
185 | assetServerURL = string.Empty; | ||
186 | UserAccount account = null; | ||
187 | if (m_Scene.UserAccountService != null) | ||
188 | account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, userID); | ||
189 | |||
190 | if (account == null) // foreign | ||
191 | { | ||
192 | ScenePresence sp = null; | ||
193 | if (m_Scene.TryGetAvatar(userID, out sp)) | ||
194 | { | ||
195 | AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | ||
196 | if (aCircuit.ServiceURLs.ContainsKey("AssetServerURI")) | ||
197 | { | ||
198 | assetServerURL = aCircuit.ServiceURLs["AssetServerURI"].ToString(); | ||
199 | assetServerURL = assetServerURL.Trim(new char[] { '/' }); return true; | ||
200 | } | ||
201 | } | ||
202 | } | ||
173 | 203 | ||
204 | return false; | ||
205 | } | ||
206 | } | ||
174 | } | 207 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGUuidGatherer.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGUuidGatherer.cs index 5d4e7ac..fcb544f 100644 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGUuidGatherer.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGUuidGatherer.cs | |||
@@ -29,10 +29,11 @@ using System; | |||
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | 30 | ||
31 | using OpenSim.Framework; | 31 | using OpenSim.Framework; |
32 | using OpenSim.Region.Framework.Scenes; | ||
32 | using OpenSim.Services.Interfaces; | 33 | using OpenSim.Services.Interfaces; |
33 | using OpenMetaverse; | 34 | using OpenMetaverse; |
34 | 35 | ||
35 | namespace OpenSim.Region.Framework.Scenes.Hypergrid | 36 | namespace OpenSim.Region.CoreModules.Framework.InventoryAccess |
36 | { | 37 | { |
37 | public class HGUuidGatherer : UuidGatherer | 38 | public class HGUuidGatherer : UuidGatherer |
38 | { | 39 | { |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs new file mode 100644 index 0000000..e0df288 --- /dev/null +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -0,0 +1,655 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Net; | ||
31 | using System.Reflection; | ||
32 | using System.Threading; | ||
33 | |||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Capabilities; | ||
36 | using OpenSim.Framework.Client; | ||
37 | using OpenSim.Region.Framework.Interfaces; | ||
38 | using OpenSim.Region.Framework.Scenes; | ||
39 | using OpenSim.Region.Framework.Scenes.Serialization; | ||
40 | using OpenSim.Services.Interfaces; | ||
41 | |||
42 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
43 | |||
44 | using OpenMetaverse; | ||
45 | using log4net; | ||
46 | using Nini.Config; | ||
47 | |||
48 | namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | ||
49 | { | ||
50 | public class BasicInventoryAccessModule : INonSharedRegionModule, IInventoryAccessModule | ||
51 | { | ||
52 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
53 | |||
54 | protected bool m_Enabled = false; | ||
55 | protected Scene m_Scene; | ||
56 | |||
57 | #region INonSharedRegionModule | ||
58 | |||
59 | public Type ReplaceableInterface | ||
60 | { | ||
61 | get { return null; } | ||
62 | } | ||
63 | |||
64 | public virtual string Name | ||
65 | { | ||
66 | get { return "BasicInventoryAccessModule"; } | ||
67 | } | ||
68 | |||
69 | public virtual void Initialise(IConfigSource source) | ||
70 | { | ||
71 | IConfig moduleConfig = source.Configs["Modules"]; | ||
72 | if (moduleConfig != null) | ||
73 | { | ||
74 | string name = moduleConfig.GetString("InventoryAccessModule", ""); | ||
75 | if (name == Name) | ||
76 | { | ||
77 | m_Enabled = true; | ||
78 | m_log.InfoFormat("[INVENTORY ACCESS MODULE]: {0} enabled.", Name); | ||
79 | } | ||
80 | } | ||
81 | } | ||
82 | |||
83 | public virtual void PostInitialise() | ||
84 | { | ||
85 | } | ||
86 | |||
87 | public virtual void AddRegion(Scene scene) | ||
88 | { | ||
89 | if (!m_Enabled) | ||
90 | return; | ||
91 | |||
92 | m_Scene = scene; | ||
93 | |||
94 | scene.RegisterModuleInterface<IInventoryAccessModule>(this); | ||
95 | scene.EventManager.OnNewClient += OnNewClient; | ||
96 | } | ||
97 | |||
98 | protected virtual void OnNewClient(IClientAPI client) | ||
99 | { | ||
100 | |||
101 | } | ||
102 | |||
103 | public virtual void Close() | ||
104 | { | ||
105 | if (!m_Enabled) | ||
106 | return; | ||
107 | } | ||
108 | |||
109 | |||
110 | public virtual void RemoveRegion(Scene scene) | ||
111 | { | ||
112 | if (!m_Enabled) | ||
113 | return; | ||
114 | m_Scene = null; | ||
115 | } | ||
116 | |||
117 | public virtual void RegionLoaded(Scene scene) | ||
118 | { | ||
119 | if (!m_Enabled) | ||
120 | return; | ||
121 | |||
122 | } | ||
123 | |||
124 | #endregion | ||
125 | |||
126 | #region Inventory Access | ||
127 | |||
128 | /// <summary> | ||
129 | /// Capability originating call to update the asset of an item in an agent's inventory | ||
130 | /// </summary> | ||
131 | /// <param name="remoteClient"></param> | ||
132 | /// <param name="itemID"></param> | ||
133 | /// <param name="data"></param> | ||
134 | /// <returns></returns> | ||
135 | public virtual UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data) | ||
136 | { | ||
137 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
138 | item = m_Scene.InventoryService.GetItem(item); | ||
139 | |||
140 | if (item != null) | ||
141 | { | ||
142 | if ((InventoryType)item.InvType == InventoryType.Notecard) | ||
143 | { | ||
144 | if (!m_Scene.Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId)) | ||
145 | { | ||
146 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false); | ||
147 | return UUID.Zero; | ||
148 | } | ||
149 | |||
150 | remoteClient.SendAgentAlertMessage("Notecard saved", false); | ||
151 | } | ||
152 | else if ((InventoryType)item.InvType == InventoryType.LSL) | ||
153 | { | ||
154 | if (!m_Scene.Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId)) | ||
155 | { | ||
156 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false); | ||
157 | return UUID.Zero; | ||
158 | } | ||
159 | |||
160 | remoteClient.SendAgentAlertMessage("Script saved", false); | ||
161 | } | ||
162 | |||
163 | AssetBase asset = | ||
164 | CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data, remoteClient.AgentId.ToString()); | ||
165 | item.AssetID = asset.FullID; | ||
166 | m_Scene.AssetService.Store(asset); | ||
167 | |||
168 | m_Scene.InventoryService.UpdateItem(item); | ||
169 | |||
170 | // remoteClient.SendInventoryItemCreateUpdate(item); | ||
171 | return (asset.FullID); | ||
172 | } | ||
173 | else | ||
174 | { | ||
175 | m_log.ErrorFormat( | ||
176 | "[AGENT INVENTORY]: Could not find item {0} for caps inventory update", | ||
177 | itemID); | ||
178 | } | ||
179 | |||
180 | return UUID.Zero; | ||
181 | } | ||
182 | |||
183 | /// <summary> | ||
184 | /// Delete a scene object from a scene and place in the given avatar's inventory. | ||
185 | /// Returns the UUID of the newly created asset. | ||
186 | /// </summary> | ||
187 | /// <param name="action"></param> | ||
188 | /// <param name="folderID"></param> | ||
189 | /// <param name="objectGroup"></param> | ||
190 | /// <param name="remoteClient"> </param> | ||
191 | public virtual UUID DeleteToInventory(DeRezAction action, UUID folderID, | ||
192 | SceneObjectGroup objectGroup, IClientAPI remoteClient) | ||
193 | { | ||
194 | UUID assetID = UUID.Zero; | ||
195 | |||
196 | Vector3 inventoryStoredPosition = new Vector3 | ||
197 | (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) | ||
198 | ? 250 | ||
199 | : objectGroup.AbsolutePosition.X) | ||
200 | , | ||
201 | (objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) | ||
202 | ? 250 | ||
203 | : objectGroup.AbsolutePosition.X, | ||
204 | objectGroup.AbsolutePosition.Z); | ||
205 | |||
206 | Vector3 originalPosition = objectGroup.AbsolutePosition; | ||
207 | |||
208 | objectGroup.AbsolutePosition = inventoryStoredPosition; | ||
209 | |||
210 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); | ||
211 | |||
212 | objectGroup.AbsolutePosition = originalPosition; | ||
213 | |||
214 | // Get the user info of the item destination | ||
215 | // | ||
216 | UUID userID = UUID.Zero; | ||
217 | |||
218 | if (action == DeRezAction.Take || action == DeRezAction.TakeCopy || | ||
219 | action == DeRezAction.SaveToExistingUserInventoryItem) | ||
220 | { | ||
221 | // Take or take copy require a taker | ||
222 | // Saving changes requires a local user | ||
223 | // | ||
224 | if (remoteClient == null) | ||
225 | return UUID.Zero; | ||
226 | |||
227 | userID = remoteClient.AgentId; | ||
228 | } | ||
229 | else | ||
230 | { | ||
231 | // All returns / deletes go to the object owner | ||
232 | // | ||
233 | |||
234 | userID = objectGroup.RootPart.OwnerID; | ||
235 | } | ||
236 | |||
237 | if (userID == UUID.Zero) // Can't proceed | ||
238 | { | ||
239 | return UUID.Zero; | ||
240 | } | ||
241 | |||
242 | // If we're returning someone's item, it goes back to the | ||
243 | // owner's Lost And Found folder. | ||
244 | // Delete is treated like return in this case | ||
245 | // Deleting your own items makes them go to trash | ||
246 | // | ||
247 | |||
248 | InventoryFolderBase folder = null; | ||
249 | InventoryItemBase item = null; | ||
250 | |||
251 | if (DeRezAction.SaveToExistingUserInventoryItem == action) | ||
252 | { | ||
253 | item = new InventoryItemBase(objectGroup.RootPart.FromUserInventoryItemID, userID); | ||
254 | item = m_Scene.InventoryService.GetItem(item); | ||
255 | |||
256 | //item = userInfo.RootFolder.FindItem( | ||
257 | // objectGroup.RootPart.FromUserInventoryItemID); | ||
258 | |||
259 | if (null == item) | ||
260 | { | ||
261 | m_log.DebugFormat( | ||
262 | "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.", | ||
263 | objectGroup.Name, objectGroup.UUID); | ||
264 | return UUID.Zero; | ||
265 | } | ||
266 | } | ||
267 | else | ||
268 | { | ||
269 | // Folder magic | ||
270 | // | ||
271 | if (action == DeRezAction.Delete) | ||
272 | { | ||
273 | // Deleting someone else's item | ||
274 | // | ||
275 | |||
276 | |||
277 | if (remoteClient == null || | ||
278 | objectGroup.OwnerID != remoteClient.AgentId) | ||
279 | { | ||
280 | // Folder skeleton may not be loaded and we | ||
281 | // have to wait for the inventory to find | ||
282 | // the destination folder | ||
283 | // | ||
284 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); | ||
285 | } | ||
286 | else | ||
287 | { | ||
288 | // Assume inventory skeleton was loaded during login | ||
289 | // and all folders can be found | ||
290 | // | ||
291 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder); | ||
292 | } | ||
293 | } | ||
294 | else if (action == DeRezAction.Return) | ||
295 | { | ||
296 | |||
297 | // Dump to lost + found unconditionally | ||
298 | // | ||
299 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); | ||
300 | } | ||
301 | |||
302 | if (folderID == UUID.Zero && folder == null) | ||
303 | { | ||
304 | if (action == DeRezAction.Delete) | ||
305 | { | ||
306 | // Deletes go to trash by default | ||
307 | // | ||
308 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.TrashFolder); | ||
309 | } | ||
310 | else | ||
311 | { | ||
312 | // Catch all. Use lost & found | ||
313 | // | ||
314 | |||
315 | folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); | ||
316 | } | ||
317 | } | ||
318 | |||
319 | if (folder == null) // None of the above | ||
320 | { | ||
321 | //folder = userInfo.RootFolder.FindFolder(folderID); | ||
322 | folder = new InventoryFolderBase(folderID); | ||
323 | |||
324 | if (folder == null) // Nowhere to put it | ||
325 | { | ||
326 | return UUID.Zero; | ||
327 | } | ||
328 | } | ||
329 | |||
330 | item = new InventoryItemBase(); | ||
331 | item.CreatorId = objectGroup.RootPart.CreatorID.ToString(); | ||
332 | item.ID = UUID.Random(); | ||
333 | item.InvType = (int)InventoryType.Object; | ||
334 | item.Folder = folder.ID; | ||
335 | item.Owner = userID; | ||
336 | } | ||
337 | |||
338 | AssetBase asset = CreateAsset( | ||
339 | objectGroup.GetPartName(objectGroup.RootPart.LocalId), | ||
340 | objectGroup.GetPartDescription(objectGroup.RootPart.LocalId), | ||
341 | (sbyte)AssetType.Object, | ||
342 | Utils.StringToBytes(sceneObjectXml), | ||
343 | objectGroup.OwnerID.ToString()); | ||
344 | m_Scene.AssetService.Store(asset); | ||
345 | assetID = asset.FullID; | ||
346 | |||
347 | if (DeRezAction.SaveToExistingUserInventoryItem == action) | ||
348 | { | ||
349 | item.AssetID = asset.FullID; | ||
350 | m_Scene.InventoryService.UpdateItem(item); | ||
351 | } | ||
352 | else | ||
353 | { | ||
354 | item.AssetID = asset.FullID; | ||
355 | |||
356 | if (remoteClient != null && (remoteClient.AgentId != objectGroup.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) | ||
357 | { | ||
358 | uint perms = objectGroup.GetEffectivePermissions(); | ||
359 | uint nextPerms = (perms & 7) << 13; | ||
360 | if ((nextPerms & (uint)PermissionMask.Copy) == 0) | ||
361 | perms &= ~(uint)PermissionMask.Copy; | ||
362 | if ((nextPerms & (uint)PermissionMask.Transfer) == 0) | ||
363 | perms &= ~(uint)PermissionMask.Transfer; | ||
364 | if ((nextPerms & (uint)PermissionMask.Modify) == 0) | ||
365 | perms &= ~(uint)PermissionMask.Modify; | ||
366 | |||
367 | item.BasePermissions = perms & objectGroup.RootPart.NextOwnerMask; | ||
368 | item.CurrentPermissions = item.BasePermissions; | ||
369 | item.NextPermissions = objectGroup.RootPart.NextOwnerMask; | ||
370 | item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; | ||
371 | item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask; | ||
372 | item.CurrentPermissions |= 8; // Slam! | ||
373 | } | ||
374 | else | ||
375 | { | ||
376 | item.BasePermissions = objectGroup.GetEffectivePermissions(); | ||
377 | item.CurrentPermissions = objectGroup.GetEffectivePermissions(); | ||
378 | item.NextPermissions = objectGroup.RootPart.NextOwnerMask; | ||
379 | item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; | ||
380 | item.GroupPermissions = objectGroup.RootPart.GroupMask; | ||
381 | |||
382 | item.CurrentPermissions |= 8; // Slam! | ||
383 | } | ||
384 | |||
385 | // TODO: add the new fields (Flags, Sale info, etc) | ||
386 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
387 | item.Description = asset.Description; | ||
388 | item.Name = asset.Name; | ||
389 | item.AssetType = asset.Type; | ||
390 | |||
391 | m_Scene.InventoryService.AddItem(item); | ||
392 | |||
393 | if (remoteClient != null && item.Owner == remoteClient.AgentId) | ||
394 | { | ||
395 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | ||
396 | } | ||
397 | else | ||
398 | { | ||
399 | ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner); | ||
400 | if (notifyUser != null) | ||
401 | { | ||
402 | notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0); | ||
403 | } | ||
404 | } | ||
405 | } | ||
406 | |||
407 | return assetID; | ||
408 | } | ||
409 | |||
410 | |||
411 | /// <summary> | ||
412 | /// Rez an object into the scene from the user's inventory | ||
413 | /// </summary> | ||
414 | /// <param name="remoteClient"></param> | ||
415 | /// <param name="itemID"></param> | ||
416 | /// <param name="RayEnd"></param> | ||
417 | /// <param name="RayStart"></param> | ||
418 | /// <param name="RayTargetID"></param> | ||
419 | /// <param name="BypassRayCast"></param> | ||
420 | /// <param name="RayEndIsIntersection"></param> | ||
421 | /// <param name="RezSelected"></param> | ||
422 | /// <param name="RemoveItem"></param> | ||
423 | /// <param name="fromTaskID"></param> | ||
424 | /// <param name="attachment"></param> | ||
425 | /// <returns>The SceneObjectGroup rezzed or null if rez was unsuccessful.</returns> | ||
426 | public virtual SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, | ||
427 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | ||
428 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) | ||
429 | { | ||
430 | // Work out position details | ||
431 | byte bRayEndIsIntersection = (byte)0; | ||
432 | |||
433 | if (RayEndIsIntersection) | ||
434 | { | ||
435 | bRayEndIsIntersection = (byte)1; | ||
436 | } | ||
437 | else | ||
438 | { | ||
439 | bRayEndIsIntersection = (byte)0; | ||
440 | } | ||
441 | |||
442 | Vector3 scale = new Vector3(0.5f, 0.5f, 0.5f); | ||
443 | |||
444 | |||
445 | Vector3 pos = m_Scene.GetNewRezLocation( | ||
446 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | ||
447 | BypassRayCast, bRayEndIsIntersection, true, scale, false); | ||
448 | |||
449 | // Rez object | ||
450 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
451 | item = m_Scene.InventoryService.GetItem(item); | ||
452 | |||
453 | if (item != null) | ||
454 | { | ||
455 | AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); | ||
456 | |||
457 | if (rezAsset != null) | ||
458 | { | ||
459 | UUID itemId = UUID.Zero; | ||
460 | |||
461 | // If we have permission to copy then link the rezzed object back to the user inventory | ||
462 | // item that it came from. This allows us to enable 'save object to inventory' | ||
463 | if (!m_Scene.Permissions.BypassPermissions()) | ||
464 | { | ||
465 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy) | ||
466 | { | ||
467 | itemId = item.ID; | ||
468 | } | ||
469 | } | ||
470 | else | ||
471 | { | ||
472 | // Brave new fullperm world | ||
473 | // | ||
474 | itemId = item.ID; | ||
475 | } | ||
476 | |||
477 | string xmlData = Utils.BytesToString(rezAsset.Data); | ||
478 | SceneObjectGroup group | ||
479 | = SceneObjectSerializer.FromOriginalXmlFormat(itemId, xmlData); | ||
480 | |||
481 | if (!m_Scene.Permissions.CanRezObject( | ||
482 | group.Children.Count, remoteClient.AgentId, pos) | ||
483 | && !attachment) | ||
484 | { | ||
485 | // The client operates in no fail mode. It will | ||
486 | // have already removed the item from the folder | ||
487 | // if it's no copy. | ||
488 | // Put it back if it's not an attachment | ||
489 | // | ||
490 | if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment)) | ||
491 | remoteClient.SendBulkUpdateInventory(item); | ||
492 | return null; | ||
493 | } | ||
494 | |||
495 | group.ResetIDs(); | ||
496 | |||
497 | if (attachment) | ||
498 | { | ||
499 | group.RootPart.ObjectFlags |= (uint)PrimFlags.Phantom; | ||
500 | group.RootPart.IsAttachment = true; | ||
501 | } | ||
502 | |||
503 | m_Scene.AddNewSceneObject(group, true); | ||
504 | |||
505 | // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); | ||
506 | // if attachment we set it's asset id so object updates can reflect that | ||
507 | // if not, we set it's position in world. | ||
508 | if (!attachment) | ||
509 | { | ||
510 | float offsetHeight = 0; | ||
511 | pos = m_Scene.GetNewRezLocation( | ||
512 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | ||
513 | BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(out offsetHeight), false); | ||
514 | pos.Z += offsetHeight; | ||
515 | group.AbsolutePosition = pos; | ||
516 | // m_log.InfoFormat("rezx point for inventory rezz is {0} {1} {2} and offsetheight was {3}", pos.X, pos.Y, pos.Z, offsetHeight); | ||
517 | |||
518 | } | ||
519 | else | ||
520 | { | ||
521 | group.SetFromItemID(itemID); | ||
522 | } | ||
523 | |||
524 | SceneObjectPart rootPart = null; | ||
525 | try | ||
526 | { | ||
527 | rootPart = group.GetChildPart(group.UUID); | ||
528 | } | ||
529 | catch (NullReferenceException) | ||
530 | { | ||
531 | string isAttachment = ""; | ||
532 | |||
533 | if (attachment) | ||
534 | isAttachment = " Object was an attachment"; | ||
535 | |||
536 | m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart." + isAttachment); | ||
537 | } | ||
538 | |||
539 | // Since renaming the item in the inventory does not affect the name stored | ||
540 | // in the serialization, transfer the correct name from the inventory to the | ||
541 | // object itself before we rez. | ||
542 | rootPart.Name = item.Name; | ||
543 | rootPart.Description = item.Description; | ||
544 | |||
545 | List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values); | ||
546 | |||
547 | group.SetGroup(remoteClient.ActiveGroupId, remoteClient); | ||
548 | if (rootPart.OwnerID != item.Owner) | ||
549 | { | ||
550 | //Need to kill the for sale here | ||
551 | rootPart.ObjectSaleType = 0; | ||
552 | rootPart.SalePrice = 10; | ||
553 | |||
554 | if (m_Scene.Permissions.PropagatePermissions()) | ||
555 | { | ||
556 | if ((item.CurrentPermissions & 8) != 0) | ||
557 | { | ||
558 | foreach (SceneObjectPart part in partList) | ||
559 | { | ||
560 | part.EveryoneMask = item.EveryOnePermissions; | ||
561 | part.NextOwnerMask = item.NextPermissions; | ||
562 | part.GroupMask = 0; // DO NOT propagate here | ||
563 | } | ||
564 | } | ||
565 | group.ApplyNextOwnerPermissions(); | ||
566 | } | ||
567 | } | ||
568 | |||
569 | foreach (SceneObjectPart part in partList) | ||
570 | { | ||
571 | if (part.OwnerID != item.Owner) | ||
572 | { | ||
573 | part.LastOwnerID = part.OwnerID; | ||
574 | part.OwnerID = item.Owner; | ||
575 | part.Inventory.ChangeInventoryOwner(item.Owner); | ||
576 | } | ||
577 | else if (((item.CurrentPermissions & 8) != 0) && (!attachment)) // Slam! | ||
578 | { | ||
579 | part.EveryoneMask = item.EveryOnePermissions; | ||
580 | part.NextOwnerMask = item.NextPermissions; | ||
581 | |||
582 | part.GroupMask = 0; // DO NOT propagate here | ||
583 | } | ||
584 | } | ||
585 | |||
586 | rootPart.TrimPermissions(); | ||
587 | |||
588 | if (!attachment) | ||
589 | { | ||
590 | if (group.RootPart.Shape.PCode == (byte)PCode.Prim) | ||
591 | { | ||
592 | group.ClearPartAttachmentData(); | ||
593 | } | ||
594 | } | ||
595 | |||
596 | if (!attachment) | ||
597 | { | ||
598 | // Fire on_rez | ||
599 | group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0); | ||
600 | |||
601 | rootPart.ScheduleFullUpdate(); | ||
602 | } | ||
603 | |||
604 | if (!m_Scene.Permissions.BypassPermissions()) | ||
605 | { | ||
606 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
607 | { | ||
608 | // If this is done on attachments, no | ||
609 | // copy ones will be lost, so avoid it | ||
610 | // | ||
611 | if (!attachment) | ||
612 | { | ||
613 | List<UUID> uuids = new List<UUID>(); | ||
614 | uuids.Add(item.ID); | ||
615 | m_Scene.InventoryService.DeleteItems(item.Owner, uuids); | ||
616 | } | ||
617 | } | ||
618 | } | ||
619 | |||
620 | return rootPart.ParentGroup; | ||
621 | } | ||
622 | } | ||
623 | |||
624 | return null; | ||
625 | } | ||
626 | |||
627 | public virtual void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) | ||
628 | { | ||
629 | } | ||
630 | |||
631 | #endregion | ||
632 | |||
633 | #region Misc | ||
634 | |||
635 | /// <summary> | ||
636 | /// Create a new asset data structure. | ||
637 | /// </summary> | ||
638 | /// <param name="name"></param> | ||
639 | /// <param name="description"></param> | ||
640 | /// <param name="invType"></param> | ||
641 | /// <param name="assetType"></param> | ||
642 | /// <param name="data"></param> | ||
643 | /// <returns></returns> | ||
644 | private AssetBase CreateAsset(string name, string description, sbyte assetType, byte[] data, string creatorID) | ||
645 | { | ||
646 | AssetBase asset = new AssetBase(UUID.Random(), name, assetType, creatorID); | ||
647 | asset.Description = description; | ||
648 | asset.Data = (data == null) ? new byte[1] : data; | ||
649 | |||
650 | return asset; | ||
651 | } | ||
652 | |||
653 | #endregion | ||
654 | } | ||
655 | } | ||
diff --git a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs index 13f58bd..e37da9f 100644 --- a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs +++ b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs | |||
@@ -31,12 +31,13 @@ using System.Reflection; | |||
31 | 31 | ||
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Framework.Communications; | 33 | using OpenSim.Framework.Communications; |
34 | using OpenSim.Framework.Communications.Cache; | 34 | |
35 | using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver; | 35 | using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver; |
36 | using OpenSim.Region.Framework; | 36 | using OpenSim.Region.Framework; |
37 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
39 | using OpenSim.Services.Interfaces; | 39 | using OpenSim.Services.Interfaces; |
40 | using OpenSim.Server.Base; | ||
40 | 41 | ||
41 | using OpenMetaverse; | 42 | using OpenMetaverse; |
42 | using log4net; | 43 | using log4net; |
@@ -53,6 +54,8 @@ namespace OpenSim.Region.CoreModules.Framework.Library | |||
53 | private string m_LibraryName = "OpenSim Library"; | 54 | private string m_LibraryName = "OpenSim Library"; |
54 | private Scene m_Scene; | 55 | private Scene m_Scene; |
55 | 56 | ||
57 | private ILibraryService m_Library; | ||
58 | |||
56 | #region ISharedRegionModule | 59 | #region ISharedRegionModule |
57 | 60 | ||
58 | public void Initialise(IConfigSource config) | 61 | public void Initialise(IConfigSource config) |
@@ -60,9 +63,22 @@ namespace OpenSim.Region.CoreModules.Framework.Library | |||
60 | m_Enabled = config.Configs["Modules"].GetBoolean("LibraryModule", m_Enabled); | 63 | m_Enabled = config.Configs["Modules"].GetBoolean("LibraryModule", m_Enabled); |
61 | if (m_Enabled) | 64 | if (m_Enabled) |
62 | { | 65 | { |
63 | IConfig libConfig = config.Configs["LibraryModule"]; | 66 | IConfig libConfig = config.Configs["LibraryService"]; |
64 | if (libConfig != null) | 67 | if (libConfig != null) |
65 | m_LibraryName = libConfig.GetString("LibraryName", m_LibraryName); | 68 | { |
69 | string dllName = libConfig.GetString("LocalServiceModule", string.Empty); | ||
70 | m_log.Debug("[LIBRARY MODULE]: Library service dll is " + dllName); | ||
71 | if (dllName != string.Empty) | ||
72 | { | ||
73 | Object[] args = new Object[] { config }; | ||
74 | m_Library = ServerUtils.LoadPlugin<ILibraryService>(dllName, args); | ||
75 | } | ||
76 | } | ||
77 | } | ||
78 | if (m_Library == null) | ||
79 | { | ||
80 | m_log.Warn("[LIBRARY MODULE]: No local library service. Module will be disabled."); | ||
81 | m_Enabled = false; | ||
66 | } | 82 | } |
67 | } | 83 | } |
68 | 84 | ||
@@ -91,10 +107,15 @@ namespace OpenSim.Region.CoreModules.Framework.Library | |||
91 | { | 107 | { |
92 | m_Scene = scene; | 108 | m_Scene = scene; |
93 | } | 109 | } |
110 | scene.RegisterModuleInterface<ILibraryService>(m_Library); | ||
94 | } | 111 | } |
95 | 112 | ||
96 | public void RemoveRegion(Scene scene) | 113 | public void RemoveRegion(Scene scene) |
97 | { | 114 | { |
115 | if (!m_Enabled) | ||
116 | return; | ||
117 | |||
118 | scene.UnregisterModuleInterface<ILibraryService>(m_Library); | ||
98 | } | 119 | } |
99 | 120 | ||
100 | public void RegionLoaded(Scene scene) | 121 | public void RegionLoaded(Scene scene) |
@@ -127,27 +148,23 @@ namespace OpenSim.Region.CoreModules.Framework.Library | |||
127 | 148 | ||
128 | protected void LoadLibrariesFromArchives() | 149 | protected void LoadLibrariesFromArchives() |
129 | { | 150 | { |
130 | InventoryFolderImpl lib = m_Scene.CommsManager.UserProfileCacheService.LibraryRoot; | 151 | InventoryFolderImpl lib = m_Library.LibraryRootFolder; |
131 | if (lib == null) | 152 | if (lib == null) |
132 | { | 153 | { |
133 | m_log.Debug("[LIBRARY MODULE]: No library. Ignoring Library Module"); | 154 | m_log.Debug("[LIBRARY MODULE]: No library. Ignoring Library Module"); |
134 | return; | 155 | return; |
135 | } | 156 | } |
136 | 157 | ||
137 | lib.Name = m_LibraryName; | ||
138 | |||
139 | RegionInfo regInfo = new RegionInfo(); | 158 | RegionInfo regInfo = new RegionInfo(); |
140 | Scene m_MockScene = new Scene(regInfo); | 159 | Scene m_MockScene = new Scene(regInfo); |
141 | m_MockScene.CommsManager = m_Scene.CommsManager; | 160 | LocalInventoryService invService = new LocalInventoryService(lib); |
142 | LocalInventoryService invService = new LocalInventoryService((LibraryRootFolder)lib); | ||
143 | m_MockScene.RegisterModuleInterface<IInventoryService>(invService); | 161 | m_MockScene.RegisterModuleInterface<IInventoryService>(invService); |
144 | m_MockScene.RegisterModuleInterface<IAssetService>(m_Scene.AssetService); | 162 | m_MockScene.RegisterModuleInterface<IAssetService>(m_Scene.AssetService); |
145 | 163 | ||
146 | UserProfileData profile = new UserProfileData(); | 164 | UserAccount uinfo = new UserAccount(lib.Owner); |
147 | profile.FirstName = "OpenSim"; | 165 | uinfo.FirstName = "OpenSim"; |
148 | profile.ID = lib.Owner; | 166 | uinfo.LastName = "Library"; |
149 | profile.SurName = "Library"; | 167 | uinfo.ServiceURLs = new Dictionary<string, object>(); |
150 | CachedUserInfo uinfo = new CachedUserInfo(invService, profile); | ||
151 | 168 | ||
152 | foreach (string iarFileName in Directory.GetFiles(pathToLibraries, "*.iar")) | 169 | foreach (string iarFileName in Directory.GetFiles(pathToLibraries, "*.iar")) |
153 | { | 170 | { |
@@ -175,6 +192,15 @@ namespace OpenSim.Region.CoreModules.Framework.Library | |||
175 | m_log.DebugFormat("[LIBRARY MODULE]: Exception when processing archive {0}: {1}", iarFileName, e.Message); | 192 | m_log.DebugFormat("[LIBRARY MODULE]: Exception when processing archive {0}: {1}", iarFileName, e.Message); |
176 | } | 193 | } |
177 | } | 194 | } |
195 | |||
196 | } | ||
197 | |||
198 | private void DumpLibrary() | ||
199 | { | ||
200 | InventoryFolderImpl lib = m_Library.LibraryRootFolder; | ||
201 | |||
202 | m_log.DebugFormat(" - folder {0}", lib.Name); | ||
203 | DumpFolder(lib); | ||
178 | } | 204 | } |
179 | // | 205 | // |
180 | // private void DumpLibrary() | 206 | // private void DumpLibrary() |
diff --git a/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs b/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs index 2c95b5a..49589fd 100644 --- a/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs +++ b/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs | |||
@@ -29,7 +29,7 @@ using System.Collections.Generic; | |||
29 | using System.Reflection; | 29 | using System.Reflection; |
30 | 30 | ||
31 | using OpenSim.Framework; | 31 | using OpenSim.Framework; |
32 | using OpenSim.Framework.Communications.Cache; | 32 | |
33 | using OpenSim.Services.Interfaces; | 33 | using OpenSim.Services.Interfaces; |
34 | 34 | ||
35 | using OpenMetaverse; | 35 | using OpenMetaverse; |
@@ -41,9 +41,9 @@ namespace OpenSim.Region.CoreModules.Framework.Library | |||
41 | { | 41 | { |
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
43 | 43 | ||
44 | private LibraryRootFolder m_Library; | 44 | private InventoryFolderImpl m_Library; |
45 | 45 | ||
46 | public LocalInventoryService(LibraryRootFolder lib) | 46 | public LocalInventoryService(InventoryFolderImpl lib) |
47 | { | 47 | { |
48 | m_Library = lib; | 48 | m_Library = lib; |
49 | } | 49 | } |
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs deleted file mode 100644 index 0b54746..0000000 --- a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs +++ /dev/null | |||
@@ -1,311 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text.RegularExpressions; | ||
34 | using log4net; | ||
35 | using Nini.Config; | ||
36 | using OpenMetaverse; | ||
37 | using Nwc.XmlRpc; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Communications; | ||
40 | using OpenSim.Framework.Communications.Services; | ||
41 | using OpenSim.Framework.Communications.Cache; | ||
42 | using OpenSim.Framework.Capabilities; | ||
43 | using OpenSim.Framework.Servers.HttpServer; | ||
44 | using OpenSim.Region.Framework.Scenes; | ||
45 | using OpenSim.Region.Framework.Interfaces; | ||
46 | |||
47 | namespace OpenSim.Region.CoreModules.Hypergrid | ||
48 | { | ||
49 | public class HGStandaloneLoginModule : IRegionModule, ILoginServiceToRegionsConnector | ||
50 | { | ||
51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
52 | |||
53 | protected List<Scene> m_scenes = new List<Scene>(); | ||
54 | protected Scene m_firstScene; | ||
55 | |||
56 | protected bool m_enabled = false; // Module is only enabled if running in standalone mode | ||
57 | |||
58 | protected HGLoginAuthService m_loginService; | ||
59 | |||
60 | #region IRegionModule Members | ||
61 | |||
62 | public void Initialise(Scene scene, IConfigSource source) | ||
63 | { | ||
64 | if (m_firstScene == null) | ||
65 | { | ||
66 | m_firstScene = scene; | ||
67 | |||
68 | IConfig startupConfig = source.Configs["Startup"]; | ||
69 | if (startupConfig != null) | ||
70 | { | ||
71 | m_enabled = !startupConfig.GetBoolean("gridmode", false); | ||
72 | } | ||
73 | |||
74 | if (m_enabled) | ||
75 | { | ||
76 | m_log.Debug("[HGLogin]: HGlogin module enabled"); | ||
77 | bool authenticate = true; | ||
78 | string welcomeMessage = "Welcome to OpenSim"; | ||
79 | IConfig standaloneConfig = source.Configs["StandAlone"]; | ||
80 | if (standaloneConfig != null) | ||
81 | { | ||
82 | authenticate = standaloneConfig.GetBoolean("accounts_authenticate", true); | ||
83 | welcomeMessage = standaloneConfig.GetString("welcome_message"); | ||
84 | } | ||
85 | |||
86 | //TODO: fix casting. | ||
87 | LibraryRootFolder rootFolder = m_firstScene.CommsManager.UserProfileCacheService.LibraryRoot as LibraryRootFolder; | ||
88 | |||
89 | IHttpServer httpServer = MainServer.Instance; | ||
90 | |||
91 | //TODO: fix the casting of the user service, maybe by registering the userManagerBase with scenes, or refactoring so we just need a IUserService reference | ||
92 | m_loginService | ||
93 | = new HGLoginAuthService( | ||
94 | (UserManagerBase)m_firstScene.CommsManager.UserAdminService, | ||
95 | welcomeMessage, | ||
96 | m_firstScene.CommsManager.InterServiceInventoryService, | ||
97 | m_firstScene.CommsManager.NetworkServersInfo, | ||
98 | authenticate, | ||
99 | rootFolder, | ||
100 | this); | ||
101 | |||
102 | httpServer.AddXmlRPCHandler("hg_login", m_loginService.XmlRpcLoginMethod); | ||
103 | httpServer.AddXmlRPCHandler("check_auth_session", m_loginService.XmlRPCCheckAuthSession, false); | ||
104 | httpServer.AddXmlRPCHandler("get_avatar_appearance", XmlRPCGetAvatarAppearance); | ||
105 | httpServer.AddXmlRPCHandler("update_avatar_appearance", XmlRPCUpdateAvatarAppearance); | ||
106 | |||
107 | } | ||
108 | } | ||
109 | |||
110 | if (m_enabled) | ||
111 | { | ||
112 | AddScene(scene); | ||
113 | } | ||
114 | } | ||
115 | |||
116 | public void PostInitialise() | ||
117 | { | ||
118 | |||
119 | } | ||
120 | |||
121 | public void Close() | ||
122 | { | ||
123 | |||
124 | } | ||
125 | |||
126 | public string Name | ||
127 | { | ||
128 | get { return "HGStandaloneLoginModule"; } | ||
129 | } | ||
130 | |||
131 | public bool IsSharedModule | ||
132 | { | ||
133 | get { return true; } | ||
134 | } | ||
135 | |||
136 | #endregion | ||
137 | |||
138 | protected void AddScene(Scene scene) | ||
139 | { | ||
140 | lock (m_scenes) | ||
141 | { | ||
142 | if (!m_scenes.Contains(scene)) | ||
143 | { | ||
144 | m_scenes.Add(scene); | ||
145 | } | ||
146 | } | ||
147 | } | ||
148 | |||
149 | public bool NewUserConnection(ulong regionHandle, AgentCircuitData agent, out string reason) | ||
150 | { | ||
151 | reason = String.Empty; | ||
152 | return true; | ||
153 | } | ||
154 | |||
155 | public void LogOffUserFromGrid(ulong regionHandle, UUID AvatarID, UUID RegionSecret, string message) | ||
156 | { | ||
157 | Scene scene; | ||
158 | if (TryGetRegion(regionHandle, out scene)) | ||
159 | { | ||
160 | scene.HandleLogOffUserFromGrid(AvatarID, RegionSecret, message); | ||
161 | } | ||
162 | } | ||
163 | |||
164 | public RegionInfo RequestNeighbourInfo(ulong regionhandle) | ||
165 | { | ||
166 | Scene scene; | ||
167 | if (TryGetRegion(regionhandle, out scene)) | ||
168 | { | ||
169 | return scene.RegionInfo; | ||
170 | } | ||
171 | return null; | ||
172 | } | ||
173 | |||
174 | public RegionInfo RequestClosestRegion(string region) | ||
175 | { | ||
176 | Scene scene; | ||
177 | if (TryGetRegion(region, out scene)) | ||
178 | { | ||
179 | return scene.RegionInfo; | ||
180 | } | ||
181 | else if (m_scenes.Count > 0) | ||
182 | { | ||
183 | return m_scenes[0].RegionInfo; | ||
184 | } | ||
185 | return null; | ||
186 | } | ||
187 | |||
188 | public RegionInfo RequestNeighbourInfo(UUID regionID) | ||
189 | { | ||
190 | Scene scene; | ||
191 | if (TryGetRegion(regionID, out scene)) | ||
192 | { | ||
193 | return scene.RegionInfo; | ||
194 | } | ||
195 | return null; | ||
196 | } | ||
197 | |||
198 | protected bool TryGetRegion(ulong regionHandle, out Scene scene) | ||
199 | { | ||
200 | lock (m_scenes) | ||
201 | { | ||
202 | foreach (Scene nextScene in m_scenes) | ||
203 | { | ||
204 | if (nextScene.RegionInfo.RegionHandle == regionHandle) | ||
205 | { | ||
206 | scene = nextScene; | ||
207 | return true; | ||
208 | } | ||
209 | } | ||
210 | } | ||
211 | |||
212 | scene = null; | ||
213 | return false; | ||
214 | } | ||
215 | |||
216 | protected bool TryGetRegion(UUID regionID, out Scene scene) | ||
217 | { | ||
218 | lock (m_scenes) | ||
219 | { | ||
220 | foreach (Scene nextScene in m_scenes) | ||
221 | { | ||
222 | if (nextScene.RegionInfo.RegionID == regionID) | ||
223 | { | ||
224 | scene = nextScene; | ||
225 | return true; | ||
226 | } | ||
227 | } | ||
228 | } | ||
229 | |||
230 | scene = null; | ||
231 | return false; | ||
232 | } | ||
233 | |||
234 | protected bool TryGetRegion(string regionName, out Scene scene) | ||
235 | { | ||
236 | lock (m_scenes) | ||
237 | { | ||
238 | foreach (Scene nextScene in m_scenes) | ||
239 | { | ||
240 | if (nextScene.RegionInfo.RegionName.Equals(regionName, StringComparison.InvariantCultureIgnoreCase)) | ||
241 | { | ||
242 | scene = nextScene; | ||
243 | return true; | ||
244 | } | ||
245 | } | ||
246 | } | ||
247 | |||
248 | scene = null; | ||
249 | return false; | ||
250 | } | ||
251 | |||
252 | public XmlRpcResponse XmlRPCGetAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient) | ||
253 | { | ||
254 | XmlRpcResponse response = new XmlRpcResponse(); | ||
255 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
256 | AvatarAppearance appearance; | ||
257 | Hashtable responseData; | ||
258 | if (requestData.Contains("owner")) | ||
259 | { | ||
260 | appearance = m_firstScene.CommsManager.AvatarService.GetUserAppearance(new UUID((string)requestData["owner"])); | ||
261 | if (appearance == null) | ||
262 | { | ||
263 | responseData = new Hashtable(); | ||
264 | responseData["error_type"] = "no appearance"; | ||
265 | responseData["error_desc"] = "There was no appearance found for this avatar"; | ||
266 | } | ||
267 | else | ||
268 | { | ||
269 | responseData = appearance.ToHashTable(); | ||
270 | } | ||
271 | } | ||
272 | else | ||
273 | { | ||
274 | responseData = new Hashtable(); | ||
275 | responseData["error_type"] = "unknown_avatar"; | ||
276 | responseData["error_desc"] = "The avatar appearance requested is not in the database"; | ||
277 | } | ||
278 | |||
279 | response.Value = responseData; | ||
280 | return response; | ||
281 | } | ||
282 | |||
283 | public XmlRpcResponse XmlRPCUpdateAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient) | ||
284 | { | ||
285 | XmlRpcResponse response = new XmlRpcResponse(); | ||
286 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
287 | Hashtable responseData; | ||
288 | if (requestData.Contains("owner")) | ||
289 | { | ||
290 | AvatarAppearance appearance = new AvatarAppearance(requestData); | ||
291 | |||
292 | // TODO: Sometime in the future we may have a database layer that is capable of updating appearance when | ||
293 | // the TextureEntry is null. When that happens, this check can be removed | ||
294 | if (appearance.Texture != null) | ||
295 | m_firstScene.CommsManager.AvatarService.UpdateUserAppearance(new UUID((string)requestData["owner"]), appearance); | ||
296 | |||
297 | responseData = new Hashtable(); | ||
298 | responseData["returnString"] = "TRUE"; | ||
299 | } | ||
300 | else | ||
301 | { | ||
302 | responseData = new Hashtable(); | ||
303 | responseData["error_type"] = "unknown_avatar"; | ||
304 | responseData["error_desc"] = "The avatar appearance requested is not in the database"; | ||
305 | } | ||
306 | response.Value = responseData; | ||
307 | return response; | ||
308 | } | ||
309 | } | ||
310 | |||
311 | } | ||
diff --git a/OpenSim/Region/CoreModules/InterGrid/OGSRadmin.cs b/OpenSim/Region/CoreModules/InterGrid/OGSRadmin.cs index 0f2ba32..b7d3904 100644 --- a/OpenSim/Region/CoreModules/InterGrid/OGSRadmin.cs +++ b/OpenSim/Region/CoreModules/InterGrid/OGSRadmin.cs | |||
@@ -46,7 +46,6 @@ namespace OpenSim.Region.CoreModules.InterGrid | |||
46 | { | 46 | { |
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | private readonly List<Scene> m_scenes = new List<Scene>(); | 48 | private readonly List<Scene> m_scenes = new List<Scene>(); |
49 | private CommunicationsManager m_com; | ||
50 | private IConfigSource m_settings; | 49 | private IConfigSource m_settings; |
51 | 50 | ||
52 | #region Implementation of IRegionModuleBase | 51 | #region Implementation of IRegionModuleBase |
@@ -88,7 +87,6 @@ namespace OpenSim.Region.CoreModules.InterGrid | |||
88 | { | 87 | { |
89 | if (m_settings.Configs["Startup"].GetBoolean("gridmode", false)) | 88 | if (m_settings.Configs["Startup"].GetBoolean("gridmode", false)) |
90 | { | 89 | { |
91 | m_com = m_scenes[0].CommsManager; | ||
92 | MainServer.Instance.AddXmlRPCHandler("grid_message", GridWideMessage); | 90 | MainServer.Instance.AddXmlRPCHandler("grid_message", GridWideMessage); |
93 | } | 91 | } |
94 | } | 92 | } |
@@ -119,14 +117,15 @@ namespace OpenSim.Region.CoreModules.InterGrid | |||
119 | 117 | ||
120 | Hashtable requestData = (Hashtable)req.Params[0]; | 118 | Hashtable requestData = (Hashtable)req.Params[0]; |
121 | 119 | ||
122 | if ((!requestData.Contains("password") || (string)requestData["password"] != m_com.NetworkServersInfo.GridRecvKey)) | 120 | // REFACTORING PROBLEM. This authorization needs to be replaced with some other |
123 | { | 121 | //if ((!requestData.Contains("password") || (string)requestData["password"] != m_com.NetworkServersInfo.GridRecvKey)) |
124 | responseData["accepted"] = false; | 122 | //{ |
125 | responseData["success"] = false; | 123 | // responseData["accepted"] = false; |
126 | responseData["error"] = "Invalid Key"; | 124 | // responseData["success"] = false; |
127 | response.Value = responseData; | 125 | // responseData["error"] = "Invalid Key"; |
128 | return response; | 126 | // response.Value = responseData; |
129 | } | 127 | // return response; |
128 | //} | ||
130 | 129 | ||
131 | string message = (string)requestData["message"]; | 130 | string message = (string)requestData["message"]; |
132 | string user = (string)requestData["user"]; | 131 | string user = (string)requestData["user"]; |
diff --git a/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs b/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs index 10a3232..8cf4619 100644 --- a/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs +++ b/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs | |||
@@ -528,32 +528,34 @@ namespace OpenSim.Region.CoreModules.InterGrid | |||
528 | userProfile.PasswordHash = "$1$"; | 528 | userProfile.PasswordHash = "$1$"; |
529 | userProfile.PasswordSalt = ""; | 529 | userProfile.PasswordSalt = ""; |
530 | userProfile.SurName = agentData.lastname; | 530 | userProfile.SurName = agentData.lastname; |
531 | userProfile.UserAssetURI = homeScene.CommsManager.NetworkServersInfo.AssetURL; | 531 | //userProfile.UserAssetURI = homeScene.CommsManager.NetworkServersInfo.AssetURL; |
532 | userProfile.UserFlags = 0; | 532 | userProfile.UserFlags = 0; |
533 | userProfile.UserInventoryURI = homeScene.CommsManager.NetworkServersInfo.InventoryURL; | 533 | //userProfile.UserInventoryURI = homeScene.CommsManager.NetworkServersInfo.InventoryURL; |
534 | userProfile.WantDoMask = 0; | 534 | userProfile.WantDoMask = 0; |
535 | userProfile.WebLoginKey = UUID.Random(); | 535 | userProfile.WebLoginKey = UUID.Random(); |
536 | 536 | ||
537 | // Do caps registration | 537 | // !!! REFACTORING PROBLEM. This needs to be changed for 0.7 |
538 | // get seed capagentData.firstname = FirstName;agentData.lastname = LastName; | 538 | // |
539 | if (homeScene.CommsManager.UserService.GetUserProfile(agentData.AgentID) == null && !GridMode) | 539 | //// Do caps registration |
540 | { | 540 | //// get seed capagentData.firstname = FirstName;agentData.lastname = LastName; |
541 | homeScene.CommsManager.UserAdminService.AddUser( | 541 | //if (homeScene.CommsManager.UserService.GetUserProfile(agentData.AgentID) == null && !GridMode) |
542 | agentData.firstname, agentData.lastname, CreateRandomStr(7), "", | 542 | //{ |
543 | homeScene.RegionInfo.RegionLocX, homeScene.RegionInfo.RegionLocY, agentData.AgentID); | 543 | // homeScene.CommsManager.UserAdminService.AddUser( |
544 | // agentData.firstname, agentData.lastname, CreateRandomStr(7), "", | ||
545 | // homeScene.RegionInfo.RegionLocX, homeScene.RegionInfo.RegionLocY, agentData.AgentID); | ||
544 | 546 | ||
545 | UserProfileData userProfile2 = homeScene.CommsManager.UserService.GetUserProfile(agentData.AgentID); | 547 | // UserProfileData userProfile2 = homeScene.CommsManager.UserService.GetUserProfile(agentData.AgentID); |
546 | if (userProfile2 != null) | 548 | // if (userProfile2 != null) |
547 | { | 549 | // { |
548 | userProfile = userProfile2; | 550 | // userProfile = userProfile2; |
549 | userProfile.AboutText = "OGP USER"; | 551 | // userProfile.AboutText = "OGP USER"; |
550 | userProfile.FirstLifeAboutText = "OGP USER"; | 552 | // userProfile.FirstLifeAboutText = "OGP USER"; |
551 | homeScene.CommsManager.UserService.UpdateUserProfile(userProfile); | 553 | // homeScene.CommsManager.UserService.UpdateUserProfile(userProfile); |
552 | } | 554 | // } |
553 | } | 555 | //} |
554 | 556 | ||
555 | // Stick our data in the cache so the region will know something about us | 557 | //// Stick our data in the cache so the region will know something about us |
556 | homeScene.CommsManager.UserProfileCacheService.PreloadUserCache(userProfile); | 558 | //homeScene.CommsManager.UserProfileCacheService.PreloadUserCache(userProfile); |
557 | 559 | ||
558 | // Call 'new user' event handler | 560 | // Call 'new user' event handler |
559 | string reason; | 561 | string reason; |
diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml index ebc7f59..0195c03 100644 --- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml +++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml | |||
@@ -8,6 +8,10 @@ | |||
8 | </Dependencies> | 8 | </Dependencies> |
9 | 9 | ||
10 | <Extension path = "/OpenSim/RegionModules"> | 10 | <Extension path = "/OpenSim/RegionModules"> |
11 | <RegionModule id="EntityTransferModule" type="OpenSim.Region.CoreModules.Framework.EntityTransfer.EntityTransferModule" /> | ||
12 | <RegionModule id="HGEntityTransferModule" type="OpenSim.Region.CoreModules.Framework.EntityTransfer.HGEntityTransferModule" /> | ||
13 | <RegionModule id="InventoryAccessModule" type="OpenSim.Region.CoreModules.Framework.InventoryAccess.BasicInventoryAccessModule" /> | ||
14 | <RegionModule id="HGInventoryAccessModule" type="OpenSim.Region.CoreModules.Framework.InventoryAccess.HGInventoryAccessModule" /> | ||
11 | <RegionModule id="LandManagementModule" type="OpenSim.Region.CoreModules.World.Land.LandManagementModule" /> | 15 | <RegionModule id="LandManagementModule" type="OpenSim.Region.CoreModules.World.Land.LandManagementModule" /> |
12 | <RegionModule id="ExportSerialisationModule" type="OpenSim.Region.CoreModules.World.Serialiser.SerialiserModule" /> | 16 | <RegionModule id="ExportSerialisationModule" type="OpenSim.Region.CoreModules.World.Serialiser.SerialiserModule" /> |
13 | <RegionModule id="ArchiverModule" type="OpenSim.Region.CoreModules.World.Archiver.ArchiverModule" /> | 17 | <RegionModule id="ArchiverModule" type="OpenSim.Region.CoreModules.World.Archiver.ArchiverModule" /> |
@@ -17,15 +21,25 @@ | |||
17 | <RegionModule id="HGWorldMapModule" type="OpenSim.Region.CoreModules.Hypergrid.HGWorldMapModule" /> | 21 | <RegionModule id="HGWorldMapModule" type="OpenSim.Region.CoreModules.Hypergrid.HGWorldMapModule" /> |
18 | <RegionModule id="UrlModule" type="OpenSim.Region.CoreModules.Scripting.LSLHttp.UrlModule" /> | 22 | <RegionModule id="UrlModule" type="OpenSim.Region.CoreModules.Scripting.LSLHttp.UrlModule" /> |
19 | <RegionModule id="Chat" type="OpenSim.Region.CoreModules.Avatar.Chat.ChatModule" /> | 23 | <RegionModule id="Chat" type="OpenSim.Region.CoreModules.Avatar.Chat.ChatModule" /> |
24 | <RegionModule id="FriendsModule" type="OpenSim.Region.CoreModules.Avatar.Friends.FriendsModule" /> | ||
25 | <RegionModule id="PresenceModule" type="OpenSim.Region.CoreModules.Avatar.InstantMessage.PresenceModule" /> | ||
26 | <RegionModule id="MuteListModule" type="OpenSim.Region.CoreModules.Avatar.InstantMessage.MuteListModule" /> | ||
27 | <RegionModule id="OfflineMessageModule" type="OpenSim.Region.CoreModules.Avatar.InstantMessage.OfflineMessageModule" /> | ||
28 | <RegionModule id="InstantMessageModule" type="OpenSim.Region.CoreModules.Avatar.InstantMessage.InstantMessageModule" /> | ||
29 | <RegionModule id="MessageTransferModule" type="OpenSim.Region.CoreModules.Avatar.InstantMessage.MessageTransferModule" /> | ||
30 | <RegionModule id="LureModule" type="OpenSim.Region.CoreModules.Avatar.Lure.LureModule" /> | ||
31 | <RegionModule id="InventoryTransferModule" type="OpenSim.Region.CoreModules.Avatar.Inventory.Transfer.InventoryTransferModule" /> | ||
20 | <RegionModule id="CoreAssetCache" type="OpenSim.Region.CoreModules.Asset.CoreAssetCache" /> | 32 | <RegionModule id="CoreAssetCache" type="OpenSim.Region.CoreModules.Asset.CoreAssetCache" /> |
21 | <RegionModule id="GlynnTuckerAssetCache" type="OpenSim.Region.CoreModules.Asset.GlynnTuckerAssetCache" /> | 33 | <RegionModule id="GlynnTuckerAssetCache" type="OpenSim.Region.CoreModules.Asset.GlynnTuckerAssetCache" /> |
22 | <RegionModule id="CenomeMemoryAssetCache" type="OpenSim.Region.CoreModules.Asset.CenomeMemoryAssetCache"/> | 34 | <RegionModule id="CenomeMemoryAssetCache" type="OpenSim.Region.CoreModules.Asset.CenomeMemoryAssetCache"/> |
23 | <RegionModule id="LibraryModule" type="OpenSim.Region.CoreModules.Framework.Library.LibraryModule"/> | 35 | <RegionModule id="LibraryModule" type="OpenSim.Region.CoreModules.Framework.Library.LibraryModule"/> |
24 | <!-- Service connectors OUT modules --> | 36 | <!-- Service connectors OUT modules --> |
25 | <RegionModule id="LocalUserServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.User.LocalUserServicesConnector" /> | ||
26 | <RegionModule id="RemoteUserServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.User.RemoteUserServicesConnector" /> | ||
27 | <RegionModule id="LocalAssetServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.LocalAssetServicesConnector" /> | 37 | <RegionModule id="LocalAssetServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.LocalAssetServicesConnector" /> |
28 | <RegionModule id="RemoteAssetServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.RemoteAssetServicesConnector" /> | 38 | <RegionModule id="RemoteAssetServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.RemoteAssetServicesConnector" /> |
39 | <RegionModule id="LocalAvatarServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar.LocalAvatarServicesConnector" /> | ||
40 | <RegionModule id="RemoteAvatarServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar.RemoteAvatarServicesConnector" /> | ||
41 | <RegionModule id="LocalAuthenticationServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Authentication.LocalAuthenticationServicesConnector" /> | ||
42 | <RegionModule id="RemoteAuthenticationServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Authentication.RemoteAuthenticationServicesConnector" /> | ||
29 | <RegionModule id="LocalAuthorizationServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization.LocalAuthorizationServicesConnector" /> | 43 | <RegionModule id="LocalAuthorizationServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization.LocalAuthorizationServicesConnector" /> |
30 | <RegionModule id="RemoteAuthorizationServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization.RemoteAuthorizationServicesConnector" /> | 44 | <RegionModule id="RemoteAuthorizationServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization.RemoteAuthorizationServicesConnector" /> |
31 | <RegionModule id="HGAssetBroker" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.HGAssetBroker" /> | 45 | <RegionModule id="HGAssetBroker" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset.HGAssetBroker" /> |
@@ -36,17 +50,24 @@ | |||
36 | <RegionModule id="RemoteNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour.RemoteNeighbourServicesConnector" /> | 50 | <RegionModule id="RemoteNeighbourServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Neighbour.RemoteNeighbourServicesConnector" /> |
37 | <RegionModule id="LocalLandServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Land.LocalLandServicesConnector" /> | 51 | <RegionModule id="LocalLandServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Land.LocalLandServicesConnector" /> |
38 | <RegionModule id="RemoteLandServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Land.RemoteLandServicesConnector" /> | 52 | <RegionModule id="RemoteLandServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Land.RemoteLandServicesConnector" /> |
39 | <RegionModule id="LocalInterregionComms" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion.LocalInterregionComms" /> | ||
40 | <RegionModule id="RESTInterregionComms" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion.RESTInterregionComms" /> | ||
41 | <RegionModule id="LocalGridServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.LocalGridServicesConnector" /> | 53 | <RegionModule id="LocalGridServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.LocalGridServicesConnector" /> |
42 | <RegionModule id="RemoteGridServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.RemoteGridServicesConnector" /> | 54 | <RegionModule id="RemoteGridServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.RemoteGridServicesConnector" /> |
43 | <RegionModule id="HGGridConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.HGGridConnector" /> | 55 | <RegionModule id="LocalPresenceServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence.LocalPresenceServicesConnector" /> |
56 | <RegionModule id="RemotePresenceServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence.RemotePresenceServicesConnector" /> | ||
57 | <RegionModule id="LocalUserAccountServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts.LocalUserAccountServicesConnector" /> | ||
58 | <RegionModule id="RemoteUserAccountServicesConnector" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts.RemoteUserAccountServicesConnector" /> | ||
59 | <RegionModule id="LocalSimulationConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation.LocalSimulationConnectorModule" /> | ||
60 | <RegionModule id="RemoteSimulationConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation.RemoteSimulationConnectorModule" /> | ||
44 | <!-- Service connectors IN modules --> | 61 | <!-- Service connectors IN modules --> |
45 | <RegionModule id="AssetServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Asset.AssetServiceInConnectorModule" /> | 62 | <RegionModule id="AssetServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Asset.AssetServiceInConnectorModule" /> |
46 | <RegionModule id="InventoryServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Inventory.InventoryServiceInConnectorModule" /> | 63 | <RegionModule id="InventoryServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Inventory.InventoryServiceInConnectorModule" /> |
47 | <RegionModule id="LandServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Land.LandServiceInConnectorModule" /> | 64 | <RegionModule id="LandServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Land.LandServiceInConnectorModule" /> |
48 | <RegionModule id="NeighbourServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Neighbour.NeighbourServiceInConnectorModule" /> \ | 65 | <RegionModule id="NeighbourServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Neighbour.NeighbourServiceInConnectorModule" /> \ |
49 | <RegionModule id="HypergridServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid.HypergridServiceInConnectorModule" /> \ | 66 | <RegionModule id="HypergridServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Hypergrid.HypergridServiceInConnectorModule" /> \ |
67 | <RegionModule id="LLLoginServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Login.LLLoginServiceInConnectorModule" /> \ | ||
68 | <RegionModule id="SimulationServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Simulation.SimulationServiceInConnectorModule" /> \ | ||
69 | <RegionModule id="GridInfoServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid.GridInfoServiceInConnectorModule" /> \ | ||
70 | <RegionModule id="AuthenticationServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Authentication.AuthenticationServiceInConnectorModule" /> | ||
50 | <RegionModule id="AccessModule" type="OpenSim.Region.CoreModules.World.AccessModule" /> \ | 71 | <RegionModule id="AccessModule" type="OpenSim.Region.CoreModules.World.AccessModule" /> \ |
51 | 72 | ||
52 | </Extension> | 73 | </Extension> |
diff --git a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs index e3c7bbf..643764f 100644 --- a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs | |||
@@ -309,7 +309,8 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture | |||
309 | } | 309 | } |
310 | 310 | ||
311 | // Create a new asset for user | 311 | // Create a new asset for user |
312 | AssetBase asset = new AssetBase(UUID.Random(), "DynamicImage" + Util.RandomClass.Next(1, 10000), (sbyte)AssetType.Texture); | 312 | AssetBase asset = new AssetBase(UUID.Random(), "DynamicImage" + Util.RandomClass.Next(1, 10000), (sbyte)AssetType.Texture, |
313 | scene.RegionInfo.RegionID.ToString()); | ||
313 | asset.Data = assetData; | 314 | asset.Data = assetData; |
314 | asset.Description = String.Format("URL image : {0}", Url); | 315 | asset.Description = String.Format("URL image : {0}", Url); |
315 | asset.Local = false; | 316 | asset.Local = false; |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Asset/AssetServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Asset/AssetServiceInConnectorModule.cs index 879cc70..2324380 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Asset/AssetServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Asset/AssetServiceInConnectorModule.cs | |||
@@ -51,11 +51,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Asset | |||
51 | 51 | ||
52 | public void Initialise(IConfigSource config) | 52 | public void Initialise(IConfigSource config) |
53 | { | 53 | { |
54 | //// This module is only on for standalones in hypergrid mode | ||
55 | //enabled = ((!config.Configs["Startup"].GetBoolean("gridmode", true)) && | ||
56 | // config.Configs["Startup"].GetBoolean("hypergrid", true)) || | ||
57 | // ((config.Configs["MXP"] != null) && config.Configs["MXP"].GetBoolean("Enabled", true)); | ||
58 | //m_log.DebugFormat("[RegionAssetService]: enabled? {0}", enabled); | ||
59 | m_Config = config; | 54 | m_Config = config; |
60 | IConfig moduleConfig = config.Configs["Modules"]; | 55 | IConfig moduleConfig = config.Configs["Modules"]; |
61 | if (moduleConfig != null) | 56 | if (moduleConfig != null) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Authentication/AuthenticationServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Authentication/AuthenticationServiceInConnectorModule.cs new file mode 100644 index 0000000..02acddc --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Authentication/AuthenticationServiceInConnectorModule.cs | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Reflection; | ||
30 | using System.Collections.Generic; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Framework.Servers.HttpServer; | ||
35 | using OpenSim.Region.Framework.Scenes; | ||
36 | using OpenSim.Region.Framework.Interfaces; | ||
37 | using OpenSim.Server.Base; | ||
38 | using OpenSim.Server.Handlers.Base; | ||
39 | using OpenSim.Server.Handlers.Authentication; | ||
40 | using OpenSim.Services.Interfaces; | ||
41 | |||
42 | namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Authentication | ||
43 | { | ||
44 | public class AuthenticationServiceInConnectorModule : ISharedRegionModule | ||
45 | { | ||
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | private static bool m_Enabled = false; | ||
48 | |||
49 | private IConfigSource m_Config; | ||
50 | bool m_Registered = false; | ||
51 | |||
52 | #region IRegionModule interface | ||
53 | |||
54 | public void Initialise(IConfigSource config) | ||
55 | { | ||
56 | m_Config = config; | ||
57 | IConfig moduleConfig = config.Configs["Modules"]; | ||
58 | if (moduleConfig != null) | ||
59 | { | ||
60 | m_Enabled = moduleConfig.GetBoolean("AuthenticationServiceInConnector", false); | ||
61 | if (m_Enabled) | ||
62 | { | ||
63 | m_log.Info("[AUTHENTICATION IN CONNECTOR]: Authentication Service In Connector enabled"); | ||
64 | } | ||
65 | |||
66 | } | ||
67 | |||
68 | } | ||
69 | |||
70 | public void PostInitialise() | ||
71 | { | ||
72 | } | ||
73 | |||
74 | public void Close() | ||
75 | { | ||
76 | } | ||
77 | |||
78 | public Type ReplaceableInterface | ||
79 | { | ||
80 | get { return null; } | ||
81 | } | ||
82 | |||
83 | public string Name | ||
84 | { | ||
85 | get { return "AuthenticationServiceInConnectorModule"; } | ||
86 | } | ||
87 | |||
88 | public void AddRegion(Scene scene) | ||
89 | { | ||
90 | if (!m_Enabled) | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | public void RemoveRegion(Scene scene) | ||
95 | { | ||
96 | if (!m_Enabled) | ||
97 | return; | ||
98 | } | ||
99 | |||
100 | public void RegionLoaded(Scene scene) | ||
101 | { | ||
102 | if (!m_Enabled) | ||
103 | return; | ||
104 | |||
105 | if (!m_Registered) | ||
106 | { | ||
107 | m_Registered = true; | ||
108 | |||
109 | m_log.Info("[AUTHENTICATION IN CONNECTOR]: Starting..."); | ||
110 | |||
111 | new AuthenticationServiceConnector(m_Config, MainServer.Instance, "AuthenticationService"); | ||
112 | } | ||
113 | |||
114 | } | ||
115 | |||
116 | #endregion | ||
117 | |||
118 | } | ||
119 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/GridInfoServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/GridInfoServiceInConnectorModule.cs new file mode 100644 index 0000000..6d975af --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/GridInfoServiceInConnectorModule.cs | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Reflection; | ||
30 | using System.Collections.Generic; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Framework.Servers.HttpServer; | ||
35 | using OpenSim.Region.Framework.Scenes; | ||
36 | using OpenSim.Region.Framework.Interfaces; | ||
37 | using OpenSim.Server.Base; | ||
38 | using OpenSim.Server.Handlers.Base; | ||
39 | using OpenSim.Server.Handlers.Grid; | ||
40 | using OpenSim.Services.Interfaces; | ||
41 | |||
42 | namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid | ||
43 | { | ||
44 | public class GridInfoServiceInConnectorModule : ISharedRegionModule | ||
45 | { | ||
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | private static bool m_Enabled = false; | ||
48 | |||
49 | private IConfigSource m_Config; | ||
50 | bool m_Registered = false; | ||
51 | |||
52 | #region IRegionModule interface | ||
53 | |||
54 | public void Initialise(IConfigSource config) | ||
55 | { | ||
56 | m_Config = config; | ||
57 | IConfig moduleConfig = config.Configs["Modules"]; | ||
58 | if (moduleConfig != null) | ||
59 | { | ||
60 | m_Enabled = moduleConfig.GetBoolean("GridInfoServiceInConnector", false); | ||
61 | if (m_Enabled) | ||
62 | { | ||
63 | m_log.Info("[GRIDINFO IN CONNECTOR]: GridInfo Service In Connector enabled"); | ||
64 | } | ||
65 | |||
66 | } | ||
67 | |||
68 | } | ||
69 | |||
70 | public void PostInitialise() | ||
71 | { | ||
72 | } | ||
73 | |||
74 | public void Close() | ||
75 | { | ||
76 | } | ||
77 | |||
78 | public Type ReplaceableInterface | ||
79 | { | ||
80 | get { return null; } | ||
81 | } | ||
82 | |||
83 | public string Name | ||
84 | { | ||
85 | get { return "GridInfoService"; } | ||
86 | } | ||
87 | |||
88 | public void AddRegion(Scene scene) | ||
89 | { | ||
90 | if (!m_Enabled) | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | public void RemoveRegion(Scene scene) | ||
95 | { | ||
96 | if (!m_Enabled) | ||
97 | return; | ||
98 | } | ||
99 | |||
100 | public void RegionLoaded(Scene scene) | ||
101 | { | ||
102 | if (!m_Enabled) | ||
103 | return; | ||
104 | |||
105 | if (!m_Registered) | ||
106 | { | ||
107 | m_Registered = true; | ||
108 | |||
109 | m_log.Info("[GridInfo]: Starting..."); | ||
110 | |||
111 | new GridInfoServerInConnector(m_Config, MainServer.Instance, "GridInfoService"); | ||
112 | } | ||
113 | |||
114 | } | ||
115 | |||
116 | #endregion | ||
117 | |||
118 | } | ||
119 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs index b12d778..c6848bb 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Grid/HypergridServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs | |||
@@ -36,11 +36,11 @@ using OpenSim.Region.Framework.Scenes; | |||
36 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Server.Base; | 37 | using OpenSim.Server.Base; |
38 | using OpenSim.Server.Handlers.Base; | 38 | using OpenSim.Server.Handlers.Base; |
39 | using OpenSim.Server.Handlers.Grid; | 39 | using OpenSim.Server.Handlers.Hypergrid; |
40 | using OpenSim.Services.Interfaces; | 40 | using OpenSim.Services.Interfaces; |
41 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 41 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
42 | 42 | ||
43 | namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid | 43 | namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Hypergrid |
44 | { | 44 | { |
45 | public class HypergridServiceInConnectorModule : ISharedRegionModule | 45 | public class HypergridServiceInConnectorModule : ISharedRegionModule |
46 | { | 46 | { |
@@ -49,16 +49,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid | |||
49 | 49 | ||
50 | private IConfigSource m_Config; | 50 | private IConfigSource m_Config; |
51 | bool m_Registered = false; | 51 | bool m_Registered = false; |
52 | HypergridServiceInConnector m_HypergridHandler; | 52 | GatekeeperServiceInConnector m_HypergridHandler; |
53 | 53 | ||
54 | #region IRegionModule interface | 54 | #region IRegionModule interface |
55 | 55 | ||
56 | public void Initialise(IConfigSource config) | 56 | public void Initialise(IConfigSource config) |
57 | { | 57 | { |
58 | //// This module is only on for standalones in hypergrid mode | ||
59 | //enabled = (!config.Configs["Startup"].GetBoolean("gridmode", true)) && | ||
60 | // config.Configs["Startup"].GetBoolean("hypergrid", true); | ||
61 | //m_log.DebugFormat("[RegionInventoryService]: enabled? {0}", enabled); | ||
62 | m_Config = config; | 58 | m_Config = config; |
63 | IConfig moduleConfig = config.Configs["Modules"]; | 59 | IConfig moduleConfig = config.Configs["Modules"]; |
64 | if (moduleConfig != null) | 60 | if (moduleConfig != null) |
@@ -102,9 +98,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid | |||
102 | { | 98 | { |
103 | if (!m_Enabled) | 99 | if (!m_Enabled) |
104 | return; | 100 | return; |
105 | |||
106 | GridRegion rinfo = new GridRegion(scene.RegionInfo); | ||
107 | m_HypergridHandler.RemoveRegion(rinfo); | ||
108 | } | 101 | } |
109 | 102 | ||
110 | public void RegionLoaded(Scene scene) | 103 | public void RegionLoaded(Scene scene) |
@@ -118,14 +111,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid | |||
118 | 111 | ||
119 | m_log.Info("[HypergridService]: Starting..."); | 112 | m_log.Info("[HypergridService]: Starting..."); |
120 | 113 | ||
121 | // Object[] args = new Object[] { m_Config, MainServer.Instance }; | 114 | ISimulationService simService = scene.RequestModuleInterface<ISimulationService>(); |
115 | m_HypergridHandler = new GatekeeperServiceInConnector(m_Config, MainServer.Instance, simService); | ||
116 | scene.RegisterModuleInterface<IGatekeeperService>(m_HypergridHandler.GateKeeper); | ||
122 | 117 | ||
123 | m_HypergridHandler = new HypergridServiceInConnector(m_Config, MainServer.Instance, scene.RequestModuleInterface<IHyperlinkService>()); | 118 | new UserAgentServerConnector(m_Config, MainServer.Instance); |
124 | //ServerUtils.LoadPlugin<HypergridServiceInConnector>("OpenSim.Server.Handlers.dll:HypergridServiceInConnector", args); | ||
125 | } | 119 | } |
126 | |||
127 | GridRegion rinfo = new GridRegion(scene.RegionInfo); | ||
128 | m_HypergridHandler.AddRegion(rinfo); | ||
129 | } | 120 | } |
130 | 121 | ||
131 | #endregion | 122 | #endregion |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Inventory/InventoryServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Inventory/InventoryServiceInConnectorModule.cs index 54c6d89..ae03cdf 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Inventory/InventoryServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Inventory/InventoryServiceInConnectorModule.cs | |||
@@ -51,10 +51,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Inventory | |||
51 | 51 | ||
52 | public void Initialise(IConfigSource config) | 52 | public void Initialise(IConfigSource config) |
53 | { | 53 | { |
54 | //// This module is only on for standalones in hypergrid mode | ||
55 | //enabled = (!config.Configs["Startup"].GetBoolean("gridmode", true)) && | ||
56 | // config.Configs["Startup"].GetBoolean("hypergrid", true); | ||
57 | //m_log.DebugFormat("[RegionInventoryService]: enabled? {0}", enabled); | ||
58 | m_Config = config; | 54 | m_Config = config; |
59 | IConfig moduleConfig = config.Configs["Modules"]; | 55 | IConfig moduleConfig = config.Configs["Modules"]; |
60 | if (moduleConfig != null) | 56 | if (moduleConfig != null) |
@@ -98,9 +94,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Inventory | |||
98 | 94 | ||
99 | m_log.Info("[RegionInventoryService]: Starting..."); | 95 | m_log.Info("[RegionInventoryService]: Starting..."); |
100 | 96 | ||
101 | Object[] args = new Object[] { m_Config, MainServer.Instance, String.Empty }; | 97 | Object[] args = new Object[] { m_Config, MainServer.Instance, "HGInventoryService" }; |
102 | 98 | ||
103 | ServerUtils.LoadPlugin<IServiceConnector>("OpenSim.Server.Handlers.dll:InventoryServiceInConnector", args); | 99 | ServerUtils.LoadPlugin<IServiceConnector>("OpenSim.Server.Handlers.dll:HGInventoryServiceInConnector", args); |
104 | } | 100 | } |
105 | } | 101 | } |
106 | 102 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Login/LLLoginServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Login/LLLoginServiceInConnectorModule.cs new file mode 100644 index 0000000..2a9366c --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Login/LLLoginServiceInConnectorModule.cs | |||
@@ -0,0 +1,128 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Reflection; | ||
30 | using System.Collections.Generic; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Framework.Servers.HttpServer; | ||
35 | using OpenSim.Region.Framework.Scenes; | ||
36 | using OpenSim.Region.Framework.Interfaces; | ||
37 | using OpenSim.Server.Base; | ||
38 | using OpenSim.Server.Handlers.Base; | ||
39 | using OpenSim.Server.Handlers.Login; | ||
40 | using OpenSim.Services.Interfaces; | ||
41 | |||
42 | |||
43 | namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Login | ||
44 | { | ||
45 | public class LLLoginServiceInConnectorModule : ISharedRegionModule | ||
46 | { | ||
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
48 | private static bool m_Enabled = false; | ||
49 | private static bool m_Registered = false; | ||
50 | |||
51 | private IConfigSource m_Config; | ||
52 | private List<Scene> m_Scenes = new List<Scene>(); | ||
53 | |||
54 | #region IRegionModule interface | ||
55 | |||
56 | public void Initialise(IConfigSource config) | ||
57 | { | ||
58 | m_Config = config; | ||
59 | |||
60 | IConfig moduleConfig = config.Configs["Modules"]; | ||
61 | if (moduleConfig != null) | ||
62 | { | ||
63 | m_Enabled = moduleConfig.GetBoolean("LLLoginServiceInConnector", false); | ||
64 | if (m_Enabled) | ||
65 | { | ||
66 | m_log.Info("[LLLOGIN IN CONNECTOR]: LLLoginerviceInConnector enabled"); | ||
67 | } | ||
68 | |||
69 | } | ||
70 | |||
71 | } | ||
72 | |||
73 | public void PostInitialise() | ||
74 | { | ||
75 | if (!m_Enabled) | ||
76 | return; | ||
77 | |||
78 | m_log.Info("[LLLOGIN IN CONNECTOR]: Starting..."); | ||
79 | } | ||
80 | |||
81 | public void Close() | ||
82 | { | ||
83 | } | ||
84 | |||
85 | public Type ReplaceableInterface | ||
86 | { | ||
87 | get { return null; } | ||
88 | } | ||
89 | |||
90 | public string Name | ||
91 | { | ||
92 | get { return "LLLoginServiceInConnectorModule"; } | ||
93 | } | ||
94 | |||
95 | public void AddRegion(Scene scene) | ||
96 | { | ||
97 | if (!m_Enabled) | ||
98 | return; | ||
99 | |||
100 | m_Scenes.Add(scene); | ||
101 | |||
102 | } | ||
103 | |||
104 | public void RemoveRegion(Scene scene) | ||
105 | { | ||
106 | if (m_Enabled && m_Scenes.Contains(scene)) | ||
107 | m_Scenes.Remove(scene); | ||
108 | } | ||
109 | |||
110 | public void RegionLoaded(Scene scene) | ||
111 | { | ||
112 | if (!m_Enabled) | ||
113 | return; | ||
114 | |||
115 | if (!m_Registered) | ||
116 | { | ||
117 | m_Registered = true; | ||
118 | new LLLoginServiceInConnector(m_Config, MainServer.Instance, scene); | ||
119 | //Object[] args = new Object[] { m_Config, MainServer.Instance, this, scene }; | ||
120 | //ServerUtils.LoadPlugin<IServiceConnector>("OpenSim.Server.Handlers.dll:LLLoginServiceInConnector", args); | ||
121 | } | ||
122 | |||
123 | } | ||
124 | |||
125 | #endregion | ||
126 | |||
127 | } | ||
128 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Simulation/SimulationServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Simulation/SimulationServiceInConnectorModule.cs index f28a318..5ee1c97 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Simulation/SimulationServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Simulation/SimulationServiceInConnectorModule.cs | |||
@@ -58,11 +58,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Simulation | |||
58 | IConfig moduleConfig = config.Configs["Modules"]; | 58 | IConfig moduleConfig = config.Configs["Modules"]; |
59 | if (moduleConfig != null) | 59 | if (moduleConfig != null) |
60 | { | 60 | { |
61 | string name = moduleConfig.GetString("SimulationService", ""); | 61 | m_Enabled = moduleConfig.GetBoolean("SimulationServiceInConnector", false); |
62 | if (name == Name) | 62 | if (m_Enabled) |
63 | { | 63 | { |
64 | m_Enabled = true; | 64 | m_log.Info("[SIM SERVICE]: SimulationService IN connector enabled"); |
65 | m_log.Info("[SIM SERVICE]: SimulationService enabled"); | ||
66 | 65 | ||
67 | } | 66 | } |
68 | } | 67 | } |
@@ -84,7 +83,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Simulation | |||
84 | 83 | ||
85 | public string Name | 84 | public string Name |
86 | { | 85 | { |
87 | get { return "SimulationService"; } | 86 | get { return "SimulationServiceInConnectorModule"; } |
88 | } | 87 | } |
89 | 88 | ||
90 | public void AddRegion(Scene scene) | 89 | public void AddRegion(Scene scene) |
@@ -92,6 +91,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Simulation | |||
92 | if (!m_Enabled) | 91 | if (!m_Enabled) |
93 | return; | 92 | return; |
94 | 93 | ||
94 | } | ||
95 | |||
96 | public void RemoveRegion(Scene scene) | ||
97 | { | ||
98 | } | ||
99 | |||
100 | public void RegionLoaded(Scene scene) | ||
101 | { | ||
102 | if (!m_Enabled) | ||
103 | return; | ||
104 | |||
95 | if (!m_Registered) | 105 | if (!m_Registered) |
96 | { | 106 | { |
97 | m_Registered = true; | 107 | m_Registered = true; |
@@ -104,14 +114,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Simulation | |||
104 | } | 114 | } |
105 | } | 115 | } |
106 | 116 | ||
107 | public void RemoveRegion(Scene scene) | ||
108 | { | ||
109 | } | ||
110 | |||
111 | public void RegionLoaded(Scene scene) | ||
112 | { | ||
113 | } | ||
114 | |||
115 | #endregion | 117 | #endregion |
116 | 118 | ||
117 | } | 119 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs index 0aa753d..af2f3d6 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs | |||
@@ -31,7 +31,7 @@ using System; | |||
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Reflection; | 32 | using System.Reflection; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications.Cache; | 34 | |
35 | using OpenSim.Server.Base; | 35 | using OpenSim.Server.Base; |
36 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
@@ -366,18 +366,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset | |||
366 | 366 | ||
367 | public string GetUserAssetServer(UUID userID) | 367 | public string GetUserAssetServer(UUID userID) |
368 | { | 368 | { |
369 | CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(userID); | 369 | UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, userID); |
370 | if ((uinfo != null) && (uinfo.UserProfile != null)) | 370 | |
371 | { | 371 | if (account != null && account.ServiceURLs.ContainsKey("AssetServerURI") && account.ServiceURLs["AssetServerURI"] != null) |
372 | if ((uinfo.UserProfile.UserAssetURI == string.Empty) || (uinfo.UserProfile.UserAssetURI == "")) | 372 | return account.ServiceURLs["AssetServerURI"].ToString(); |
373 | return m_LocalAssetServiceURI; | 373 | |
374 | return uinfo.UserProfile.UserAssetURI.Trim('/'); | 374 | return string.Empty; |
375 | } | ||
376 | else | ||
377 | { | ||
378 | // we don't know anyting about this user | ||
379 | return string.Empty; | ||
380 | } | ||
381 | } | 375 | } |
382 | 376 | ||
383 | public string GetSimAssetServer() | 377 | public string GetSimAssetServer() |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authentication/LocalAuthenticationServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authentication/LocalAuthenticationServiceConnector.cs new file mode 100644 index 0000000..acc362b --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authentication/LocalAuthenticationServiceConnector.cs | |||
@@ -0,0 +1,164 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.Region.Framework.Interfaces; | ||
34 | using OpenSim.Region.Framework.Scenes; | ||
35 | using OpenSim.Server.Base; | ||
36 | using OpenSim.Services.Interfaces; | ||
37 | |||
38 | using OpenMetaverse; | ||
39 | |||
40 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authentication | ||
41 | { | ||
42 | public class LocalAuthenticationServicesConnector : ISharedRegionModule, IAuthenticationService | ||
43 | { | ||
44 | private static readonly ILog m_log = | ||
45 | LogManager.GetLogger( | ||
46 | MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | |||
48 | private IAuthenticationService m_AuthenticationService; | ||
49 | |||
50 | private bool m_Enabled = false; | ||
51 | |||
52 | #region ISharedRegionModule | ||
53 | |||
54 | public Type ReplaceableInterface | ||
55 | { | ||
56 | get { return null; } | ||
57 | } | ||
58 | |||
59 | public string Name | ||
60 | { | ||
61 | get { return "LocalAuthenticationServicesConnector"; } | ||
62 | } | ||
63 | |||
64 | public void Initialise(IConfigSource source) | ||
65 | { | ||
66 | IConfig moduleConfig = source.Configs["Modules"]; | ||
67 | if (moduleConfig != null) | ||
68 | { | ||
69 | string name = moduleConfig.GetString("AuthenticationServices", ""); | ||
70 | if (name == Name) | ||
71 | { | ||
72 | IConfig userConfig = source.Configs["AuthenticationService"]; | ||
73 | if (userConfig == null) | ||
74 | { | ||
75 | m_log.Error("[AUTH CONNECTOR]: AuthenticationService missing from OpenSim.ini"); | ||
76 | return; | ||
77 | } | ||
78 | |||
79 | string serviceDll = userConfig.GetString("LocalServiceModule", | ||
80 | String.Empty); | ||
81 | |||
82 | if (serviceDll == String.Empty) | ||
83 | { | ||
84 | m_log.Error("[AUTH CONNECTOR]: No LocalServiceModule named in section AuthenticationService"); | ||
85 | return; | ||
86 | } | ||
87 | |||
88 | Object[] args = new Object[] { source }; | ||
89 | m_AuthenticationService = | ||
90 | ServerUtils.LoadPlugin<IAuthenticationService>(serviceDll, | ||
91 | args); | ||
92 | |||
93 | if (m_AuthenticationService == null) | ||
94 | { | ||
95 | m_log.Error("[AUTH CONNECTOR]: Can't load Authentication service"); | ||
96 | return; | ||
97 | } | ||
98 | m_Enabled = true; | ||
99 | m_log.Info("[AUTH CONNECTOR]: Local Authentication connector enabled"); | ||
100 | } | ||
101 | } | ||
102 | } | ||
103 | |||
104 | public void PostInitialise() | ||
105 | { | ||
106 | if (!m_Enabled) | ||
107 | return; | ||
108 | } | ||
109 | |||
110 | public void Close() | ||
111 | { | ||
112 | if (!m_Enabled) | ||
113 | return; | ||
114 | } | ||
115 | |||
116 | public void AddRegion(Scene scene) | ||
117 | { | ||
118 | if (!m_Enabled) | ||
119 | return; | ||
120 | |||
121 | scene.RegisterModuleInterface<IAuthenticationService>(m_AuthenticationService); | ||
122 | } | ||
123 | |||
124 | public void RemoveRegion(Scene scene) | ||
125 | { | ||
126 | if (!m_Enabled) | ||
127 | return; | ||
128 | } | ||
129 | |||
130 | public void RegionLoaded(Scene scene) | ||
131 | { | ||
132 | if (!m_Enabled) | ||
133 | return; | ||
134 | } | ||
135 | |||
136 | #endregion | ||
137 | |||
138 | #region IAuthenticationService | ||
139 | |||
140 | public string Authenticate(UUID principalID, string password, int lifetime) | ||
141 | { | ||
142 | // Not implemented at the regions | ||
143 | return string.Empty; | ||
144 | } | ||
145 | |||
146 | public bool Verify(UUID principalID, string token, int lifetime) | ||
147 | { | ||
148 | return m_AuthenticationService.Verify(principalID, token, lifetime); | ||
149 | } | ||
150 | |||
151 | public bool Release(UUID principalID, string token) | ||
152 | { | ||
153 | return m_AuthenticationService.Release(principalID, token); | ||
154 | } | ||
155 | |||
156 | public bool SetPassword(UUID principalID, string passwd) | ||
157 | { | ||
158 | return m_AuthenticationService.SetPassword(principalID, passwd); | ||
159 | } | ||
160 | |||
161 | #endregion | ||
162 | |||
163 | } | ||
164 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authentication/RemoteAuthenticationServiceConnector.cs index cca5bb4..a053bc2 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authentication/RemoteAuthenticationServiceConnector.cs | |||
@@ -26,24 +26,23 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Reflection; | ||
30 | using log4net; | ||
31 | using Nini.Config; | 29 | using Nini.Config; |
30 | using log4net; | ||
31 | using System.Reflection; | ||
32 | using OpenSim.Region.Framework.Interfaces; | 32 | using OpenSim.Region.Framework.Interfaces; |
33 | using OpenSim.Region.Framework.Scenes; | 33 | using OpenSim.Region.Framework.Scenes; |
34 | using OpenSim.Server.Base; | ||
35 | using OpenSim.Services.Interfaces; | 34 | using OpenSim.Services.Interfaces; |
35 | using OpenSim.Services.Connectors; | ||
36 | 36 | ||
37 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | 37 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authentication |
38 | { | 38 | { |
39 | public class LocalUserServicesConnector : ISharedRegionModule | 39 | public class RemoteAuthenticationServicesConnector : AuthenticationServicesConnector, |
40 | ISharedRegionModule, IAuthenticationService | ||
40 | { | 41 | { |
41 | private static readonly ILog m_log = | 42 | private static readonly ILog m_log = |
42 | LogManager.GetLogger( | 43 | LogManager.GetLogger( |
43 | MethodBase.GetCurrentMethod().DeclaringType); | 44 | MethodBase.GetCurrentMethod().DeclaringType); |
44 | 45 | ||
45 | private IUserAccountService m_UserService; | ||
46 | |||
47 | private bool m_Enabled = false; | 46 | private bool m_Enabled = false; |
48 | 47 | ||
49 | public Type ReplaceableInterface | 48 | public Type ReplaceableInterface |
@@ -53,45 +52,29 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
53 | 52 | ||
54 | public string Name | 53 | public string Name |
55 | { | 54 | { |
56 | get { return "LocalUserServicesConnector"; } | 55 | get { return "RemoteAuthenticationServicesConnector"; } |
57 | } | 56 | } |
58 | 57 | ||
59 | public void Initialise(IConfigSource source) | 58 | public override void Initialise(IConfigSource source) |
60 | { | 59 | { |
61 | IConfig moduleConfig = source.Configs["Modules"]; | 60 | IConfig moduleConfig = source.Configs["Modules"]; |
62 | if (moduleConfig != null) | 61 | if (moduleConfig != null) |
63 | { | 62 | { |
64 | string name = moduleConfig.GetString("UserServices", ""); | 63 | string name = moduleConfig.GetString("AuthenticationServices", ""); |
65 | if (name == Name) | 64 | if (name == Name) |
66 | { | 65 | { |
67 | IConfig userConfig = source.Configs["UserService"]; | 66 | IConfig userConfig = source.Configs["AuthenticationService"]; |
68 | if (userConfig == null) | 67 | if (userConfig == null) |
69 | { | 68 | { |
70 | m_log.Error("[USER CONNECTOR]: UserService missing from OpenSim.ini"); | 69 | m_log.Error("[AUTH CONNECTOR]: AuthenticationService missing from OpenSim.ini"); |
71 | return; | 70 | return; |
72 | } | 71 | } |
73 | 72 | ||
74 | string serviceDll = userConfig.GetString("LocalServiceModule", | 73 | m_Enabled = true; |
75 | String.Empty); | ||
76 | |||
77 | if (serviceDll == String.Empty) | ||
78 | { | ||
79 | m_log.Error("[USER CONNECTOR]: No LocalServiceModule named in section UserService"); | ||
80 | return; | ||
81 | } | ||
82 | 74 | ||
83 | Object[] args = new Object[] { source }; | 75 | base.Initialise(source); |
84 | m_UserService = | ||
85 | ServerUtils.LoadPlugin<IUserAccountService>(serviceDll, | ||
86 | args); | ||
87 | 76 | ||
88 | if (m_UserService == null) | 77 | m_log.Info("[AUTH CONNECTOR]: Remote Authentication enabled"); |
89 | { | ||
90 | m_log.Error("[USER CONNECTOR]: Can't load user service"); | ||
91 | return; | ||
92 | } | ||
93 | m_Enabled = true; | ||
94 | m_log.Info("[USER CONNECTOR]: Local user connector enabled"); | ||
95 | } | 78 | } |
96 | } | 79 | } |
97 | } | 80 | } |
@@ -113,7 +96,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
113 | if (!m_Enabled) | 96 | if (!m_Enabled) |
114 | return; | 97 | return; |
115 | 98 | ||
116 | scene.RegisterModuleInterface<IUserAccountService>(m_UserService); | 99 | scene.RegisterModuleInterface<IAuthenticationService>(this); |
117 | } | 100 | } |
118 | 101 | ||
119 | public void RemoveRegion(Scene scene) | 102 | public void RemoveRegion(Scene scene) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/RemoteAuthorizationServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/RemoteAuthorizationServiceConnector.cs index 68499f3..01a2615 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/RemoteAuthorizationServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/RemoteAuthorizationServiceConnector.cs | |||
@@ -139,9 +139,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization | |||
139 | 139 | ||
140 | if (scene != null) | 140 | if (scene != null) |
141 | { | 141 | { |
142 | UserProfileData profile = scene.CommsManager.UserService.GetUserProfile(new UUID(userID)); | 142 | UserAccount account = scene.UserAccountService.GetUserAccount(UUID.Zero, userID); |
143 | isAuthorized = IsAuthorizedForRegion(userID, profile.FirstName, profile.SurName, | 143 | isAuthorized = IsAuthorizedForRegion(userID, account.FirstName, account.LastName, |
144 | profile.Email, scene.RegionInfo.RegionName, regionID, out message); | 144 | account.Email, scene.RegionInfo.RegionName, regionID, out message); |
145 | } | 145 | } |
146 | else | 146 | else |
147 | { | 147 | { |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Avatar/LocalAvatarServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Avatar/LocalAvatarServiceConnector.cs new file mode 100644 index 0000000..47f19a3 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Avatar/LocalAvatarServiceConnector.cs | |||
@@ -0,0 +1,168 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.Region.Framework.Interfaces; | ||
34 | using OpenSim.Region.Framework.Scenes; | ||
35 | using OpenSim.Server.Base; | ||
36 | using OpenSim.Services.Interfaces; | ||
37 | |||
38 | using OpenMetaverse; | ||
39 | |||
40 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar | ||
41 | { | ||
42 | public class LocalAvatarServicesConnector : ISharedRegionModule, IAvatarService | ||
43 | { | ||
44 | private static readonly ILog m_log = | ||
45 | LogManager.GetLogger( | ||
46 | MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | |||
48 | private IAvatarService m_AvatarService; | ||
49 | |||
50 | private bool m_Enabled = false; | ||
51 | |||
52 | #region ISharedRegionModule | ||
53 | |||
54 | public Type ReplaceableInterface | ||
55 | { | ||
56 | get { return null; } | ||
57 | } | ||
58 | |||
59 | public string Name | ||
60 | { | ||
61 | get { return "LocalAvatarServicesConnector"; } | ||
62 | } | ||
63 | |||
64 | public void Initialise(IConfigSource source) | ||
65 | { | ||
66 | IConfig moduleConfig = source.Configs["Modules"]; | ||
67 | if (moduleConfig != null) | ||
68 | { | ||
69 | string name = moduleConfig.GetString("AvatarServices", ""); | ||
70 | if (name == Name) | ||
71 | { | ||
72 | IConfig userConfig = source.Configs["AvatarService"]; | ||
73 | if (userConfig == null) | ||
74 | { | ||
75 | m_log.Error("[AVATAR CONNECTOR]: AvatarService missing from OpenSim.ini"); | ||
76 | return; | ||
77 | } | ||
78 | |||
79 | string serviceDll = userConfig.GetString("LocalServiceModule", | ||
80 | String.Empty); | ||
81 | |||
82 | if (serviceDll == String.Empty) | ||
83 | { | ||
84 | m_log.Error("[AVATAR CONNECTOR]: No LocalServiceModule named in section AvatarService"); | ||
85 | return; | ||
86 | } | ||
87 | |||
88 | Object[] args = new Object[] { source }; | ||
89 | m_AvatarService = | ||
90 | ServerUtils.LoadPlugin<IAvatarService>(serviceDll, | ||
91 | args); | ||
92 | |||
93 | if (m_AvatarService == null) | ||
94 | { | ||
95 | m_log.Error("[AVATAR CONNECTOR]: Can't load user account service"); | ||
96 | return; | ||
97 | } | ||
98 | m_Enabled = true; | ||
99 | m_log.Info("[AVATAR CONNECTOR]: Local avatar connector enabled"); | ||
100 | } | ||
101 | } | ||
102 | } | ||
103 | |||
104 | public void PostInitialise() | ||
105 | { | ||
106 | if (!m_Enabled) | ||
107 | return; | ||
108 | } | ||
109 | |||
110 | public void Close() | ||
111 | { | ||
112 | if (!m_Enabled) | ||
113 | return; | ||
114 | } | ||
115 | |||
116 | public void AddRegion(Scene scene) | ||
117 | { | ||
118 | if (!m_Enabled) | ||
119 | return; | ||
120 | |||
121 | scene.RegisterModuleInterface<IAvatarService>(this); | ||
122 | } | ||
123 | |||
124 | public void RemoveRegion(Scene scene) | ||
125 | { | ||
126 | if (!m_Enabled) | ||
127 | return; | ||
128 | } | ||
129 | |||
130 | public void RegionLoaded(Scene scene) | ||
131 | { | ||
132 | if (!m_Enabled) | ||
133 | return; | ||
134 | } | ||
135 | |||
136 | #endregion | ||
137 | |||
138 | #region IAvatarService | ||
139 | |||
140 | public AvatarData GetAvatar(UUID userID) | ||
141 | { | ||
142 | return m_AvatarService.GetAvatar(userID); | ||
143 | } | ||
144 | |||
145 | public bool SetAvatar(UUID userID, AvatarData avatar) | ||
146 | { | ||
147 | return m_AvatarService.SetAvatar(userID, avatar); | ||
148 | } | ||
149 | |||
150 | public bool ResetAvatar(UUID userID) | ||
151 | { | ||
152 | return m_AvatarService.ResetAvatar(userID); | ||
153 | } | ||
154 | |||
155 | public bool SetItems(UUID userID, string[] names, string[] values) | ||
156 | { | ||
157 | return m_AvatarService.SetItems(userID, names, values); | ||
158 | } | ||
159 | |||
160 | public bool RemoveItems(UUID userID, string[] names) | ||
161 | { | ||
162 | return m_AvatarService.RemoveItems(userID, names); | ||
163 | } | ||
164 | |||
165 | #endregion | ||
166 | |||
167 | } | ||
168 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Avatar/RemoteAvatarServiceConnector.cs index cef9129..48759b5 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Avatar/RemoteAvatarServiceConnector.cs | |||
@@ -34,10 +34,10 @@ using OpenSim.Region.Framework.Scenes; | |||
34 | using OpenSim.Services.Interfaces; | 34 | using OpenSim.Services.Interfaces; |
35 | using OpenSim.Services.Connectors; | 35 | using OpenSim.Services.Connectors; |
36 | 36 | ||
37 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | 37 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar |
38 | { | 38 | { |
39 | public class RemoteUserServicesConnector : UserServicesConnector, | 39 | public class RemoteAvatarServicesConnector : AvatarServicesConnector, |
40 | ISharedRegionModule, IUserAccountService | 40 | ISharedRegionModule, IAvatarService |
41 | { | 41 | { |
42 | private static readonly ILog m_log = | 42 | private static readonly ILog m_log = |
43 | LogManager.GetLogger( | 43 | LogManager.GetLogger( |
@@ -52,7 +52,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
52 | 52 | ||
53 | public string Name | 53 | public string Name |
54 | { | 54 | { |
55 | get { return "RemoteUserServicesConnector"; } | 55 | get { return "RemoteAvatarServicesConnector"; } |
56 | } | 56 | } |
57 | 57 | ||
58 | public override void Initialise(IConfigSource source) | 58 | public override void Initialise(IConfigSource source) |
@@ -60,13 +60,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
60 | IConfig moduleConfig = source.Configs["Modules"]; | 60 | IConfig moduleConfig = source.Configs["Modules"]; |
61 | if (moduleConfig != null) | 61 | if (moduleConfig != null) |
62 | { | 62 | { |
63 | string name = moduleConfig.GetString("UserServices", ""); | 63 | string name = moduleConfig.GetString("AvatarServices", ""); |
64 | if (name == Name) | 64 | if (name == Name) |
65 | { | 65 | { |
66 | IConfig userConfig = source.Configs["UserService"]; | 66 | IConfig userConfig = source.Configs["AvatarService"]; |
67 | if (userConfig == null) | 67 | if (userConfig == null) |
68 | { | 68 | { |
69 | m_log.Error("[USER CONNECTOR]: UserService missing from OpanSim.ini"); | 69 | m_log.Error("[AVATAR CONNECTOR]: AvatarService missing from OpanSim.ini"); |
70 | return; | 70 | return; |
71 | } | 71 | } |
72 | 72 | ||
@@ -74,7 +74,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
74 | 74 | ||
75 | base.Initialise(source); | 75 | base.Initialise(source); |
76 | 76 | ||
77 | m_log.Info("[USER CONNECTOR]: Remote users enabled"); | 77 | m_log.Info("[AVATAR CONNECTOR]: Remote avatars enabled"); |
78 | } | 78 | } |
79 | } | 79 | } |
80 | } | 80 | } |
@@ -96,7 +96,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User | |||
96 | if (!m_Enabled) | 96 | if (!m_Enabled) |
97 | return; | 97 | return; |
98 | 98 | ||
99 | scene.RegisterModuleInterface<IUserAccountService>(this); | 99 | scene.RegisterModuleInterface<IAvatarService>(this); |
100 | } | 100 | } |
101 | 101 | ||
102 | public void RemoveRegion(Scene scene) | 102 | public void RemoveRegion(Scene scene) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs deleted file mode 100644 index 0974372..0000000 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGCommands.cs +++ /dev/null | |||
@@ -1,303 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using System.Xml; | ||
32 | using log4net; | ||
33 | using Nini.Config; | ||
34 | using OpenSim.Framework; | ||
35 | //using OpenSim.Framework.Communications; | ||
36 | using OpenSim.Framework.Console; | ||
37 | using OpenSim.Region.Framework; | ||
38 | using OpenSim.Region.Framework.Scenes; | ||
39 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
40 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
41 | |||
42 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid | ||
43 | { | ||
44 | public class HGCommands | ||
45 | { | ||
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | private HGGridConnector m_HGGridConnector; | ||
48 | private Scene m_scene; | ||
49 | |||
50 | private static uint m_autoMappingX = 0; | ||
51 | private static uint m_autoMappingY = 0; | ||
52 | private static bool m_enableAutoMapping = false; | ||
53 | |||
54 | public HGCommands(HGGridConnector hgConnector, Scene scene) | ||
55 | { | ||
56 | m_HGGridConnector = hgConnector; | ||
57 | m_scene = scene; | ||
58 | } | ||
59 | |||
60 | //public static Scene CreateScene(RegionInfo regionInfo, AgentCircuitManager circuitManager, CommunicationsManager m_commsManager, | ||
61 | // StorageManager storageManager, ModuleLoader m_moduleLoader, ConfigSettings m_configSettings, OpenSimConfigSource m_config, string m_version) | ||
62 | //{ | ||
63 | // HGSceneCommunicationService sceneGridService = new HGSceneCommunicationService(m_commsManager, HGServices); | ||
64 | |||
65 | // return | ||
66 | // new HGScene( | ||
67 | // regionInfo, circuitManager, m_commsManager, sceneGridService, storageManager, | ||
68 | // m_moduleLoader, false, m_configSettings.PhysicalPrim, | ||
69 | // m_configSettings.See_into_region_from_neighbor, m_config.Source, m_version); | ||
70 | //} | ||
71 | |||
72 | public void RunCommand(string module, string[] cmdparams) | ||
73 | { | ||
74 | List<string> args = new List<string>(cmdparams); | ||
75 | if (args.Count < 1) | ||
76 | return; | ||
77 | |||
78 | string command = args[0]; | ||
79 | args.RemoveAt(0); | ||
80 | |||
81 | cmdparams = args.ToArray(); | ||
82 | |||
83 | RunHGCommand(command, cmdparams); | ||
84 | |||
85 | } | ||
86 | |||
87 | private void RunHGCommand(string command, string[] cmdparams) | ||
88 | { | ||
89 | if (command.Equals("link-mapping")) | ||
90 | { | ||
91 | if (cmdparams.Length == 2) | ||
92 | { | ||
93 | try | ||
94 | { | ||
95 | m_autoMappingX = Convert.ToUInt32(cmdparams[0]); | ||
96 | m_autoMappingY = Convert.ToUInt32(cmdparams[1]); | ||
97 | m_enableAutoMapping = true; | ||
98 | } | ||
99 | catch (Exception) | ||
100 | { | ||
101 | m_autoMappingX = 0; | ||
102 | m_autoMappingY = 0; | ||
103 | m_enableAutoMapping = false; | ||
104 | } | ||
105 | } | ||
106 | } | ||
107 | else if (command.Equals("link-region")) | ||
108 | { | ||
109 | if (cmdparams.Length < 3) | ||
110 | { | ||
111 | if ((cmdparams.Length == 1) || (cmdparams.Length == 2)) | ||
112 | { | ||
113 | LoadXmlLinkFile(cmdparams); | ||
114 | } | ||
115 | else | ||
116 | { | ||
117 | LinkRegionCmdUsage(); | ||
118 | } | ||
119 | return; | ||
120 | } | ||
121 | |||
122 | if (cmdparams[2].Contains(":")) | ||
123 | { | ||
124 | // New format | ||
125 | int xloc, yloc; | ||
126 | string mapName; | ||
127 | try | ||
128 | { | ||
129 | xloc = Convert.ToInt32(cmdparams[0]); | ||
130 | yloc = Convert.ToInt32(cmdparams[1]); | ||
131 | mapName = cmdparams[2]; | ||
132 | if (cmdparams.Length > 3) | ||
133 | for (int i = 3; i < cmdparams.Length; i++) | ||
134 | mapName += " " + cmdparams[i]; | ||
135 | |||
136 | m_log.Info(">> MapName: " + mapName); | ||
137 | //internalPort = Convert.ToUInt32(cmdparams[4]); | ||
138 | //remotingPort = Convert.ToUInt32(cmdparams[5]); | ||
139 | } | ||
140 | catch (Exception e) | ||
141 | { | ||
142 | m_log.Warn("[HGrid] Wrong format for link-region command: " + e.Message); | ||
143 | LinkRegionCmdUsage(); | ||
144 | return; | ||
145 | } | ||
146 | |||
147 | // Convert cell coordinates given by the user to meters | ||
148 | xloc = xloc * (int)Constants.RegionSize; | ||
149 | yloc = yloc * (int)Constants.RegionSize; | ||
150 | m_HGGridConnector.TryLinkRegionToCoords(m_scene, null, mapName, xloc, yloc); | ||
151 | } | ||
152 | else | ||
153 | { | ||
154 | // old format | ||
155 | GridRegion regInfo; | ||
156 | int xloc, yloc; | ||
157 | uint externalPort; | ||
158 | string externalHostName; | ||
159 | try | ||
160 | { | ||
161 | xloc = Convert.ToInt32(cmdparams[0]); | ||
162 | yloc = Convert.ToInt32(cmdparams[1]); | ||
163 | externalPort = Convert.ToUInt32(cmdparams[3]); | ||
164 | externalHostName = cmdparams[2]; | ||
165 | //internalPort = Convert.ToUInt32(cmdparams[4]); | ||
166 | //remotingPort = Convert.ToUInt32(cmdparams[5]); | ||
167 | } | ||
168 | catch (Exception e) | ||
169 | { | ||
170 | m_log.Warn("[HGrid] Wrong format for link-region command: " + e.Message); | ||
171 | LinkRegionCmdUsage(); | ||
172 | return; | ||
173 | } | ||
174 | |||
175 | // Convert cell coordinates given by the user to meters | ||
176 | xloc = xloc * (int)Constants.RegionSize; | ||
177 | yloc = yloc * (int)Constants.RegionSize; | ||
178 | if (m_HGGridConnector.TryCreateLink(m_scene, null, xloc, yloc, "", externalPort, externalHostName, out regInfo)) | ||
179 | { | ||
180 | if (cmdparams.Length >= 5) | ||
181 | { | ||
182 | regInfo.RegionName = ""; | ||
183 | for (int i = 4; i < cmdparams.Length; i++) | ||
184 | regInfo.RegionName += cmdparams[i] + " "; | ||
185 | } | ||
186 | } | ||
187 | } | ||
188 | return; | ||
189 | } | ||
190 | else if (command.Equals("unlink-region")) | ||
191 | { | ||
192 | if (cmdparams.Length < 1) | ||
193 | { | ||
194 | UnlinkRegionCmdUsage(); | ||
195 | return; | ||
196 | } | ||
197 | if (m_HGGridConnector.TryUnlinkRegion(m_scene, cmdparams[0])) | ||
198 | m_log.InfoFormat("[HGrid]: Successfully unlinked {0}", cmdparams[0]); | ||
199 | else | ||
200 | m_log.InfoFormat("[HGrid]: Unable to unlink {0}, region not found", cmdparams[0]); | ||
201 | } | ||
202 | } | ||
203 | |||
204 | private void LoadXmlLinkFile(string[] cmdparams) | ||
205 | { | ||
206 | //use http://www.hgurl.com/hypergrid.xml for test | ||
207 | try | ||
208 | { | ||
209 | XmlReader r = XmlReader.Create(cmdparams[0]); | ||
210 | XmlConfigSource cs = new XmlConfigSource(r); | ||
211 | string[] excludeSections = null; | ||
212 | |||
213 | if (cmdparams.Length == 2) | ||
214 | { | ||
215 | if (cmdparams[1].ToLower().StartsWith("excludelist:")) | ||
216 | { | ||
217 | string excludeString = cmdparams[1].ToLower(); | ||
218 | excludeString = excludeString.Remove(0, 12); | ||
219 | char[] splitter = { ';' }; | ||
220 | |||
221 | excludeSections = excludeString.Split(splitter); | ||
222 | } | ||
223 | } | ||
224 | |||
225 | for (int i = 0; i < cs.Configs.Count; i++) | ||
226 | { | ||
227 | bool skip = false; | ||
228 | if ((excludeSections != null) && (excludeSections.Length > 0)) | ||
229 | { | ||
230 | for (int n = 0; n < excludeSections.Length; n++) | ||
231 | { | ||
232 | if (excludeSections[n] == cs.Configs[i].Name.ToLower()) | ||
233 | { | ||
234 | skip = true; | ||
235 | break; | ||
236 | } | ||
237 | } | ||
238 | } | ||
239 | if (!skip) | ||
240 | { | ||
241 | ReadLinkFromConfig(cs.Configs[i]); | ||
242 | } | ||
243 | } | ||
244 | } | ||
245 | catch (Exception e) | ||
246 | { | ||
247 | m_log.Error(e.ToString()); | ||
248 | } | ||
249 | } | ||
250 | |||
251 | |||
252 | private void ReadLinkFromConfig(IConfig config) | ||
253 | { | ||
254 | GridRegion regInfo; | ||
255 | int xloc, yloc; | ||
256 | uint externalPort; | ||
257 | string externalHostName; | ||
258 | uint realXLoc, realYLoc; | ||
259 | |||
260 | xloc = Convert.ToInt32(config.GetString("xloc", "0")); | ||
261 | yloc = Convert.ToInt32(config.GetString("yloc", "0")); | ||
262 | externalPort = Convert.ToUInt32(config.GetString("externalPort", "0")); | ||
263 | externalHostName = config.GetString("externalHostName", ""); | ||
264 | realXLoc = Convert.ToUInt32(config.GetString("real-xloc", "0")); | ||
265 | realYLoc = Convert.ToUInt32(config.GetString("real-yloc", "0")); | ||
266 | |||
267 | if (m_enableAutoMapping) | ||
268 | { | ||
269 | xloc = (int)((xloc % 100) + m_autoMappingX); | ||
270 | yloc = (int)((yloc % 100) + m_autoMappingY); | ||
271 | } | ||
272 | |||
273 | if (((realXLoc == 0) && (realYLoc == 0)) || | ||
274 | (((realXLoc - xloc < 3896) || (xloc - realXLoc < 3896)) && | ||
275 | ((realYLoc - yloc < 3896) || (yloc - realYLoc < 3896)))) | ||
276 | { | ||
277 | xloc = xloc * (int)Constants.RegionSize; | ||
278 | yloc = yloc * (int)Constants.RegionSize; | ||
279 | if ( | ||
280 | m_HGGridConnector.TryCreateLink(m_scene, null, xloc, yloc, "", externalPort, | ||
281 | externalHostName, out regInfo)) | ||
282 | { | ||
283 | regInfo.RegionName = config.GetString("localName", ""); | ||
284 | } | ||
285 | } | ||
286 | } | ||
287 | |||
288 | |||
289 | private void LinkRegionCmdUsage() | ||
290 | { | ||
291 | m_log.Info("Usage: link-region <Xloc> <Yloc> <HostName>:<HttpPort>[:<RemoteRegionName>]"); | ||
292 | m_log.Info("Usage: link-region <Xloc> <Yloc> <HostName> <HttpPort> [<LocalName>]"); | ||
293 | m_log.Info("Usage: link-region <URI_of_xml> [<exclude>]"); | ||
294 | } | ||
295 | |||
296 | private void UnlinkRegionCmdUsage() | ||
297 | { | ||
298 | m_log.Info("Usage: unlink-region <HostName>:<HttpPort>"); | ||
299 | m_log.Info("Usage: unlink-region <LocalName>"); | ||
300 | } | ||
301 | |||
302 | } | ||
303 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs deleted file mode 100644 index 131febd..0000000 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs +++ /dev/null | |||
@@ -1,811 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Net; | ||
31 | using System.Reflection; | ||
32 | using System.Xml; | ||
33 | |||
34 | using OpenSim.Framework.Communications.Cache; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Region.Framework.Interfaces; | ||
37 | using OpenSim.Region.Framework.Scenes; | ||
38 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
39 | using OpenSim.Services.Interfaces; | ||
40 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
41 | using OpenSim.Server.Base; | ||
42 | using OpenSim.Services.Connectors.Grid; | ||
43 | using OpenSim.Framework.Console; | ||
44 | |||
45 | using OpenMetaverse; | ||
46 | using log4net; | ||
47 | using Nini.Config; | ||
48 | |||
49 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid | ||
50 | { | ||
51 | public class HGGridConnector : ISharedRegionModule, IGridService, IHyperlinkService | ||
52 | { | ||
53 | private static readonly ILog m_log = | ||
54 | LogManager.GetLogger( | ||
55 | MethodBase.GetCurrentMethod().DeclaringType); | ||
56 | private static string LocalAssetServerURI, LocalInventoryServerURI, LocalUserServerURI; | ||
57 | |||
58 | private bool m_Enabled = false; | ||
59 | private bool m_Initialized = false; | ||
60 | |||
61 | private Scene m_aScene; | ||
62 | private Dictionary<ulong, Scene> m_LocalScenes = new Dictionary<ulong, Scene>(); | ||
63 | |||
64 | private IGridService m_GridServiceConnector; | ||
65 | private HypergridServiceConnector m_HypergridServiceConnector; | ||
66 | |||
67 | // Hyperlink regions are hyperlinks on the map | ||
68 | protected Dictionary<UUID, GridRegion> m_HyperlinkRegions = new Dictionary<UUID, GridRegion>(); | ||
69 | |||
70 | // Known regions are home regions of visiting foreign users. | ||
71 | // They are not on the map as static hyperlinks. They are dynamic hyperlinks, they go away when | ||
72 | // the visitor goes away. They are mapped to X=0 on the map. | ||
73 | // This is key-ed on agent ID | ||
74 | protected Dictionary<UUID, GridRegion> m_knownRegions = new Dictionary<UUID, GridRegion>(); | ||
75 | |||
76 | protected Dictionary<UUID, ulong> m_HyperlinkHandles = new Dictionary<UUID, ulong>(); | ||
77 | |||
78 | #region ISharedRegionModule | ||
79 | |||
80 | public Type ReplaceableInterface | ||
81 | { | ||
82 | get { return null; } | ||
83 | } | ||
84 | |||
85 | public string Name | ||
86 | { | ||
87 | get { return "HGGridServicesConnector"; } | ||
88 | } | ||
89 | |||
90 | public void Initialise(IConfigSource source) | ||
91 | { | ||
92 | IConfig moduleConfig = source.Configs["Modules"]; | ||
93 | if (moduleConfig != null) | ||
94 | { | ||
95 | string name = moduleConfig.GetString("GridServices", ""); | ||
96 | if (name == Name) | ||
97 | { | ||
98 | IConfig gridConfig = source.Configs["GridService"]; | ||
99 | if (gridConfig == null) | ||
100 | { | ||
101 | m_log.Error("[HGGRID CONNECTOR]: GridService missing from OpenSim.ini"); | ||
102 | return; | ||
103 | } | ||
104 | |||
105 | |||
106 | InitialiseConnectorModule(source); | ||
107 | |||
108 | m_Enabled = true; | ||
109 | m_log.Info("[HGGRID CONNECTOR]: HG grid enabled"); | ||
110 | } | ||
111 | } | ||
112 | } | ||
113 | |||
114 | private void InitialiseConnectorModule(IConfigSource source) | ||
115 | { | ||
116 | IConfig gridConfig = source.Configs["GridService"]; | ||
117 | if (gridConfig == null) | ||
118 | { | ||
119 | m_log.Error("[HGGRID CONNECTOR]: GridService missing from OpenSim.ini"); | ||
120 | throw new Exception("Grid connector init error"); | ||
121 | } | ||
122 | |||
123 | string module = gridConfig.GetString("GridServiceConnectorModule", String.Empty); | ||
124 | if (module == String.Empty) | ||
125 | { | ||
126 | m_log.Error("[HGGRID CONNECTOR]: No GridServiceConnectorModule named in section GridService"); | ||
127 | //return; | ||
128 | throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); | ||
129 | } | ||
130 | |||
131 | Object[] args = new Object[] { source }; | ||
132 | m_GridServiceConnector = ServerUtils.LoadPlugin<IGridService>(module, args); | ||
133 | |||
134 | } | ||
135 | |||
136 | public void PostInitialise() | ||
137 | { | ||
138 | if (m_Enabled) | ||
139 | ((ISharedRegionModule)m_GridServiceConnector).PostInitialise(); | ||
140 | } | ||
141 | |||
142 | public void Close() | ||
143 | { | ||
144 | } | ||
145 | |||
146 | public void AddRegion(Scene scene) | ||
147 | { | ||
148 | if (!m_Enabled) | ||
149 | return; | ||
150 | |||
151 | m_LocalScenes[scene.RegionInfo.RegionHandle] = scene; | ||
152 | scene.RegisterModuleInterface<IGridService>(this); | ||
153 | scene.RegisterModuleInterface<IHyperlinkService>(this); | ||
154 | |||
155 | ((ISharedRegionModule)m_GridServiceConnector).AddRegion(scene); | ||
156 | |||
157 | // Yikes!! Remove this as soon as user services get refactored | ||
158 | LocalAssetServerURI = scene.CommsManager.NetworkServersInfo.AssetURL; | ||
159 | LocalInventoryServerURI = scene.CommsManager.NetworkServersInfo.InventoryURL; | ||
160 | LocalUserServerURI = scene.CommsManager.NetworkServersInfo.UserURL; | ||
161 | HGNetworkServersInfo.Init(LocalAssetServerURI, LocalInventoryServerURI, LocalUserServerURI); | ||
162 | |||
163 | } | ||
164 | |||
165 | public void RemoveRegion(Scene scene) | ||
166 | { | ||
167 | if (m_Enabled) | ||
168 | { | ||
169 | m_LocalScenes.Remove(scene.RegionInfo.RegionHandle); | ||
170 | ((ISharedRegionModule)m_GridServiceConnector).RemoveRegion(scene); | ||
171 | } | ||
172 | } | ||
173 | |||
174 | public void RegionLoaded(Scene scene) | ||
175 | { | ||
176 | if (!m_Enabled) | ||
177 | return; | ||
178 | |||
179 | if (!m_Initialized) | ||
180 | { | ||
181 | m_aScene = scene; | ||
182 | |||
183 | m_HypergridServiceConnector = new HypergridServiceConnector(scene.AssetService); | ||
184 | |||
185 | HGCommands hgCommands = new HGCommands(this, scene); | ||
186 | MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "link-region", | ||
187 | "link-region <Xloc> <Yloc> <HostName>:<HttpPort>[:<RemoteRegionName>] <cr>", | ||
188 | "Link a hypergrid region", hgCommands.RunCommand); | ||
189 | MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "unlink-region", | ||
190 | "unlink-region <local name> or <HostName>:<HttpPort> <cr>", | ||
191 | "Unlink a hypergrid region", hgCommands.RunCommand); | ||
192 | MainConsole.Instance.Commands.AddCommand("HGGridServicesConnector", false, "link-mapping", "link-mapping [<x> <y>] <cr>", | ||
193 | "Set local coordinate to map HG regions to", hgCommands.RunCommand); | ||
194 | |||
195 | m_Initialized = true; | ||
196 | } | ||
197 | } | ||
198 | |||
199 | #endregion | ||
200 | |||
201 | #region IGridService | ||
202 | |||
203 | public string RegisterRegion(UUID scopeID, GridRegion regionInfo) | ||
204 | { | ||
205 | // Region doesn't exist here. Trying to link remote region | ||
206 | if (regionInfo.RegionID.Equals(UUID.Zero)) | ||
207 | { | ||
208 | m_log.Info("[HGrid]: Linking remote region " + regionInfo.ExternalHostName + ":" + regionInfo.HttpPort); | ||
209 | ulong regionHandle = 0; | ||
210 | regionInfo.RegionID = m_HypergridServiceConnector.LinkRegion(regionInfo, out regionHandle); | ||
211 | if (!regionInfo.RegionID.Equals(UUID.Zero)) | ||
212 | { | ||
213 | AddHyperlinkRegion(regionInfo, regionHandle); | ||
214 | m_log.Info("[HGrid]: Successfully linked to region_uuid " + regionInfo.RegionID); | ||
215 | |||
216 | // Try get the map image | ||
217 | m_HypergridServiceConnector.GetMapImage(regionInfo); | ||
218 | return String.Empty; | ||
219 | } | ||
220 | else | ||
221 | { | ||
222 | m_log.Info("[HGrid]: No such region " + regionInfo.ExternalHostName + ":" + regionInfo.HttpPort + "(" + regionInfo.InternalEndPoint.Port + ")"); | ||
223 | return "No such region"; | ||
224 | } | ||
225 | // Note that these remote regions aren't registered in localBackend, so return null, no local listeners | ||
226 | } | ||
227 | else // normal grid | ||
228 | return m_GridServiceConnector.RegisterRegion(scopeID, regionInfo); | ||
229 | } | ||
230 | |||
231 | public bool DeregisterRegion(UUID regionID) | ||
232 | { | ||
233 | // Try the hyperlink collection | ||
234 | if (m_HyperlinkRegions.ContainsKey(regionID)) | ||
235 | { | ||
236 | RemoveHyperlinkRegion(regionID); | ||
237 | return true; | ||
238 | } | ||
239 | // Try the foreign users home collection | ||
240 | |||
241 | foreach (GridRegion r in m_knownRegions.Values) | ||
242 | if (r.RegionID == regionID) | ||
243 | { | ||
244 | RemoveHyperlinkHomeRegion(regionID); | ||
245 | return true; | ||
246 | } | ||
247 | |||
248 | // Finally, try the normal route | ||
249 | return m_GridServiceConnector.DeregisterRegion(regionID); | ||
250 | } | ||
251 | |||
252 | public List<GridRegion> GetNeighbours(UUID scopeID, UUID regionID) | ||
253 | { | ||
254 | // No serving neighbours on hyperliked regions. | ||
255 | // Just the regular regions. | ||
256 | return m_GridServiceConnector.GetNeighbours(scopeID, regionID); | ||
257 | } | ||
258 | |||
259 | public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID) | ||
260 | { | ||
261 | // Try the hyperlink collection | ||
262 | if (m_HyperlinkRegions.ContainsKey(regionID)) | ||
263 | return m_HyperlinkRegions[regionID]; | ||
264 | |||
265 | // Try the foreign users home collection | ||
266 | foreach (GridRegion r in m_knownRegions.Values) | ||
267 | if (r.RegionID == regionID) | ||
268 | return r; | ||
269 | |||
270 | // Finally, try the normal route | ||
271 | return m_GridServiceConnector.GetRegionByUUID(scopeID, regionID); | ||
272 | } | ||
273 | |||
274 | public GridRegion GetRegionByPosition(UUID scopeID, int x, int y) | ||
275 | { | ||
276 | int snapX = (int) (x / Constants.RegionSize) * (int)Constants.RegionSize; | ||
277 | int snapY = (int) (y / Constants.RegionSize) * (int)Constants.RegionSize; | ||
278 | // Try the hyperlink collection | ||
279 | foreach (GridRegion r in m_HyperlinkRegions.Values) | ||
280 | { | ||
281 | if ((r.RegionLocX == snapX) && (r.RegionLocY == snapY)) | ||
282 | return r; | ||
283 | } | ||
284 | |||
285 | // Try the foreign users home collection | ||
286 | foreach (GridRegion r in m_knownRegions.Values) | ||
287 | { | ||
288 | if ((r.RegionLocX == snapX) && (r.RegionLocY == snapY)) | ||
289 | { | ||
290 | return r; | ||
291 | } | ||
292 | } | ||
293 | |||
294 | // Finally, try the normal route | ||
295 | return m_GridServiceConnector.GetRegionByPosition(scopeID, x, y); | ||
296 | } | ||
297 | |||
298 | public GridRegion GetRegionByName(UUID scopeID, string regionName) | ||
299 | { | ||
300 | // Try normal grid first | ||
301 | GridRegion region = m_GridServiceConnector.GetRegionByName(scopeID, regionName); | ||
302 | if (region != null) | ||
303 | return region; | ||
304 | |||
305 | // Try the hyperlink collection | ||
306 | foreach (GridRegion r in m_HyperlinkRegions.Values) | ||
307 | { | ||
308 | if (r.RegionName == regionName) | ||
309 | return r; | ||
310 | } | ||
311 | |||
312 | // Try the foreign users home collection | ||
313 | foreach (GridRegion r in m_knownRegions.Values) | ||
314 | { | ||
315 | if (r.RegionName == regionName) | ||
316 | return r; | ||
317 | } | ||
318 | return null; | ||
319 | } | ||
320 | |||
321 | public List<GridRegion> GetRegionsByName(UUID scopeID, string name, int maxNumber) | ||
322 | { | ||
323 | List<GridRegion> rinfos = new List<GridRegion>(); | ||
324 | |||
325 | if (name == string.Empty) | ||
326 | return rinfos; | ||
327 | |||
328 | foreach (GridRegion r in m_HyperlinkRegions.Values) | ||
329 | if ((r.RegionName != null) && r.RegionName.ToLower().StartsWith(name.ToLower())) | ||
330 | rinfos.Add(r); | ||
331 | |||
332 | rinfos.AddRange(m_GridServiceConnector.GetRegionsByName(scopeID, name, maxNumber)); | ||
333 | return rinfos; | ||
334 | } | ||
335 | |||
336 | public List<GridRegion> GetRegionRange(UUID scopeID, int xmin, int xmax, int ymin, int ymax) | ||
337 | { | ||
338 | int snapXmin = (int)(xmin / Constants.RegionSize) * (int)Constants.RegionSize; | ||
339 | // int snapXmax = (int)(xmax / Constants.RegionSize) * (int)Constants.RegionSize; | ||
340 | int snapYmin = (int)(ymin / Constants.RegionSize) * (int)Constants.RegionSize; | ||
341 | int snapYmax = (int)(ymax / Constants.RegionSize) * (int)Constants.RegionSize; | ||
342 | |||
343 | List<GridRegion> rinfos = new List<GridRegion>(); | ||
344 | foreach (GridRegion r in m_HyperlinkRegions.Values) | ||
345 | if ((r.RegionLocX > snapXmin) && (r.RegionLocX < snapYmax) && | ||
346 | (r.RegionLocY > snapYmin) && (r.RegionLocY < snapYmax)) | ||
347 | rinfos.Add(r); | ||
348 | |||
349 | rinfos.AddRange(m_GridServiceConnector.GetRegionRange(scopeID, xmin, xmax, ymin, ymax)); | ||
350 | |||
351 | return rinfos; | ||
352 | } | ||
353 | |||
354 | #endregion | ||
355 | |||
356 | #region Auxiliary | ||
357 | |||
358 | private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle) | ||
359 | { | ||
360 | m_HyperlinkRegions[regionInfo.RegionID] = regionInfo; | ||
361 | m_HyperlinkHandles[regionInfo.RegionID] = regionHandle; | ||
362 | } | ||
363 | |||
364 | private void RemoveHyperlinkRegion(UUID regionID) | ||
365 | { | ||
366 | m_HyperlinkRegions.Remove(regionID); | ||
367 | m_HyperlinkHandles.Remove(regionID); | ||
368 | } | ||
369 | |||
370 | private void AddHyperlinkHomeRegion(UUID userID, GridRegion regionInfo, ulong regionHandle) | ||
371 | { | ||
372 | m_knownRegions[userID] = regionInfo; | ||
373 | m_HyperlinkHandles[regionInfo.RegionID] = regionHandle; | ||
374 | } | ||
375 | |||
376 | private void RemoveHyperlinkHomeRegion(UUID regionID) | ||
377 | { | ||
378 | foreach (KeyValuePair<UUID, GridRegion> kvp in m_knownRegions) | ||
379 | { | ||
380 | if (kvp.Value.RegionID == regionID) | ||
381 | { | ||
382 | m_knownRegions.Remove(kvp.Key); | ||
383 | } | ||
384 | } | ||
385 | m_HyperlinkHandles.Remove(regionID); | ||
386 | } | ||
387 | #endregion | ||
388 | |||
389 | #region IHyperlinkService | ||
390 | |||
391 | private static Random random = new Random(); | ||
392 | |||
393 | |||
394 | public GridRegion TryLinkRegionToCoords(Scene m_scene, IClientAPI client, string mapName, int xloc, int yloc) | ||
395 | { | ||
396 | string host = "127.0.0.1"; | ||
397 | string portstr; | ||
398 | string regionName = ""; | ||
399 | uint port = 9000; | ||
400 | string[] parts = mapName.Split(new char[] { ':' }); | ||
401 | if (parts.Length >= 1) | ||
402 | { | ||
403 | host = parts[0]; | ||
404 | } | ||
405 | if (parts.Length >= 2) | ||
406 | { | ||
407 | portstr = parts[1]; | ||
408 | //m_log.Debug("-- port = " + portstr); | ||
409 | if (!UInt32.TryParse(portstr, out port)) | ||
410 | regionName = parts[1]; | ||
411 | } | ||
412 | // always take the last one | ||
413 | if (parts.Length >= 3) | ||
414 | { | ||
415 | regionName = parts[2]; | ||
416 | } | ||
417 | |||
418 | // Sanity check. Don't ever link to this sim. | ||
419 | IPAddress ipaddr = null; | ||
420 | try | ||
421 | { | ||
422 | ipaddr = Util.GetHostFromDNS(host); | ||
423 | } | ||
424 | catch { } | ||
425 | |||
426 | if ((ipaddr != null) && | ||
427 | !((m_scene.RegionInfo.ExternalEndPoint.Address.Equals(ipaddr)) && (m_scene.RegionInfo.HttpPort == port))) | ||
428 | { | ||
429 | GridRegion regInfo; | ||
430 | bool success = TryCreateLink(m_scene, client, xloc, yloc, regionName, port, host, out regInfo); | ||
431 | if (success) | ||
432 | { | ||
433 | regInfo.RegionName = mapName; | ||
434 | return regInfo; | ||
435 | } | ||
436 | } | ||
437 | |||
438 | return null; | ||
439 | } | ||
440 | |||
441 | |||
442 | // From the map search and secondlife://blah | ||
443 | public GridRegion TryLinkRegion(Scene m_scene, IClientAPI client, string mapName) | ||
444 | { | ||
445 | int xloc = random.Next(0, Int16.MaxValue) * (int) Constants.RegionSize; | ||
446 | return TryLinkRegionToCoords(m_scene, client, mapName, xloc, 0); | ||
447 | } | ||
448 | |||
449 | public bool TryCreateLink(Scene m_scene, IClientAPI client, int xloc, int yloc, | ||
450 | string externalRegionName, uint externalPort, string externalHostName, out GridRegion regInfo) | ||
451 | { | ||
452 | m_log.DebugFormat("[HGrid]: Link to {0}:{1}, in {2}-{3}", externalHostName, externalPort, xloc, yloc); | ||
453 | |||
454 | regInfo = new GridRegion(); | ||
455 | regInfo.RegionName = externalRegionName; | ||
456 | regInfo.HttpPort = externalPort; | ||
457 | regInfo.ExternalHostName = externalHostName; | ||
458 | regInfo.RegionLocX = xloc; | ||
459 | regInfo.RegionLocY = yloc; | ||
460 | |||
461 | try | ||
462 | { | ||
463 | regInfo.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int)0); | ||
464 | } | ||
465 | catch (Exception e) | ||
466 | { | ||
467 | m_log.Warn("[HGrid]: Wrong format for link-region: " + e.Message); | ||
468 | return false; | ||
469 | } | ||
470 | |||
471 | // Finally, link it | ||
472 | if (RegisterRegion(UUID.Zero, regInfo) != String.Empty) | ||
473 | { | ||
474 | m_log.Warn("[HGrid]: Unable to link region"); | ||
475 | return false; | ||
476 | } | ||
477 | |||
478 | int x, y; | ||
479 | if (!Check4096(m_scene, regInfo, out x, out y)) | ||
480 | { | ||
481 | DeregisterRegion(regInfo.RegionID); | ||
482 | if (client != null) | ||
483 | client.SendAlertMessage("Region is too far (" + x + ", " + y + ")"); | ||
484 | m_log.Info("[HGrid]: Unable to link, region is too far (" + x + ", " + y + ")"); | ||
485 | return false; | ||
486 | } | ||
487 | |||
488 | if (!CheckCoords(m_scene.RegionInfo.RegionLocX, m_scene.RegionInfo.RegionLocY, x, y)) | ||
489 | { | ||
490 | DeregisterRegion(regInfo.RegionID); | ||
491 | if (client != null) | ||
492 | client.SendAlertMessage("Region has incompatible coordinates (" + x + ", " + y + ")"); | ||
493 | m_log.Info("[HGrid]: Unable to link, region has incompatible coordinates (" + x + ", " + y + ")"); | ||
494 | return false; | ||
495 | } | ||
496 | |||
497 | m_log.Debug("[HGrid]: link region succeeded"); | ||
498 | return true; | ||
499 | } | ||
500 | |||
501 | public bool TryUnlinkRegion(Scene m_scene, string mapName) | ||
502 | { | ||
503 | GridRegion regInfo = null; | ||
504 | if (mapName.Contains(":")) | ||
505 | { | ||
506 | string host = "127.0.0.1"; | ||
507 | //string portstr; | ||
508 | //string regionName = ""; | ||
509 | uint port = 9000; | ||
510 | string[] parts = mapName.Split(new char[] { ':' }); | ||
511 | if (parts.Length >= 1) | ||
512 | { | ||
513 | host = parts[0]; | ||
514 | } | ||
515 | // if (parts.Length >= 2) | ||
516 | // { | ||
517 | // portstr = parts[1]; | ||
518 | // if (!UInt32.TryParse(portstr, out port)) | ||
519 | // regionName = parts[1]; | ||
520 | // } | ||
521 | // always take the last one | ||
522 | // if (parts.Length >= 3) | ||
523 | // { | ||
524 | // regionName = parts[2]; | ||
525 | // } | ||
526 | foreach (GridRegion r in m_HyperlinkRegions.Values) | ||
527 | if (host.Equals(r.ExternalHostName) && (port == r.HttpPort)) | ||
528 | regInfo = r; | ||
529 | } | ||
530 | else | ||
531 | { | ||
532 | foreach (GridRegion r in m_HyperlinkRegions.Values) | ||
533 | if (r.RegionName.Equals(mapName)) | ||
534 | regInfo = r; | ||
535 | } | ||
536 | if (regInfo != null) | ||
537 | { | ||
538 | return DeregisterRegion(regInfo.RegionID); | ||
539 | } | ||
540 | else | ||
541 | { | ||
542 | m_log.InfoFormat("[HGrid]: Region {0} not found", mapName); | ||
543 | return false; | ||
544 | } | ||
545 | } | ||
546 | |||
547 | /// <summary> | ||
548 | /// Cope with this viewer limitation. | ||
549 | /// </summary> | ||
550 | /// <param name="regInfo"></param> | ||
551 | /// <returns></returns> | ||
552 | public bool Check4096(Scene m_scene, GridRegion regInfo, out int x, out int y) | ||
553 | { | ||
554 | ulong realHandle = m_HyperlinkHandles[regInfo.RegionID]; | ||
555 | uint ux = 0, uy = 0; | ||
556 | Utils.LongToUInts(realHandle, out ux, out uy); | ||
557 | x = (int)(ux / Constants.RegionSize); | ||
558 | y = (int)(uy / Constants.RegionSize); | ||
559 | |||
560 | if ((Math.Abs((int)m_scene.RegionInfo.RegionLocX - x) >= 4096) || | ||
561 | (Math.Abs((int)m_scene.RegionInfo.RegionLocY - y) >= 4096)) | ||
562 | { | ||
563 | return false; | ||
564 | } | ||
565 | return true; | ||
566 | } | ||
567 | |||
568 | public bool CheckCoords(uint thisx, uint thisy, int x, int y) | ||
569 | { | ||
570 | if ((thisx == x) && (thisy == y)) | ||
571 | return false; | ||
572 | return true; | ||
573 | } | ||
574 | |||
575 | public GridRegion TryLinkRegion(IClientAPI client, string regionDescriptor) | ||
576 | { | ||
577 | return TryLinkRegion((Scene)client.Scene, client, regionDescriptor); | ||
578 | } | ||
579 | |||
580 | public GridRegion GetHyperlinkRegion(ulong handle) | ||
581 | { | ||
582 | foreach (GridRegion r in m_HyperlinkRegions.Values) | ||
583 | if (r.RegionHandle == handle) | ||
584 | return r; | ||
585 | foreach (GridRegion r in m_knownRegions.Values) | ||
586 | if (r.RegionHandle == handle) | ||
587 | return r; | ||
588 | return null; | ||
589 | } | ||
590 | |||
591 | public ulong FindRegionHandle(ulong handle) | ||
592 | { | ||
593 | foreach (GridRegion r in m_HyperlinkRegions.Values) | ||
594 | if ((r.RegionHandle == handle) && (m_HyperlinkHandles.ContainsKey(r.RegionID))) | ||
595 | return m_HyperlinkHandles[r.RegionID]; | ||
596 | |||
597 | foreach (GridRegion r in m_knownRegions.Values) | ||
598 | if ((r.RegionHandle == handle) && (m_HyperlinkHandles.ContainsKey(r.RegionID))) | ||
599 | return m_HyperlinkHandles[r.RegionID]; | ||
600 | |||
601 | return handle; | ||
602 | } | ||
603 | |||
604 | public bool SendUserInformation(GridRegion regInfo, AgentCircuitData agentData) | ||
605 | { | ||
606 | CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(agentData.AgentID); | ||
607 | |||
608 | if (uinfo == null) | ||
609 | return false; | ||
610 | |||
611 | if ((IsLocalUser(uinfo) && (GetHyperlinkRegion(regInfo.RegionHandle) != null)) || | ||
612 | (!IsLocalUser(uinfo) && !IsGoingHome(uinfo, regInfo))) | ||
613 | { | ||
614 | m_log.Info("[HGrid]: Local user is going to foreign region or foreign user is going elsewhere"); | ||
615 | |||
616 | // Set the position of the region on the remote grid | ||
617 | // ulong realHandle = FindRegionHandle(regInfo.RegionHandle); | ||
618 | uint x = 0, y = 0; | ||
619 | Utils.LongToUInts(regInfo.RegionHandle, out x, out y); | ||
620 | GridRegion clonedRegion = new GridRegion(regInfo); | ||
621 | clonedRegion.RegionLocX = (int)x; | ||
622 | clonedRegion.RegionLocY = (int)y; | ||
623 | |||
624 | // Get the user's home region information and adapt the region handle | ||
625 | GridRegion home = GetRegionByUUID(m_aScene.RegionInfo.ScopeID, uinfo.UserProfile.HomeRegionID); | ||
626 | if (m_HyperlinkHandles.ContainsKey(uinfo.UserProfile.HomeRegionID)) | ||
627 | { | ||
628 | ulong realHandle = m_HyperlinkHandles[uinfo.UserProfile.HomeRegionID]; | ||
629 | Utils.LongToUInts(realHandle, out x, out y); | ||
630 | m_log.DebugFormat("[HGrid]: Foreign user is going elsewhere. Adjusting home handle from {0}-{1} to {2}-{3}", home.RegionLocX, home.RegionLocY, x, y); | ||
631 | home.RegionLocX = (int)x; | ||
632 | home.RegionLocY = (int)y; | ||
633 | } | ||
634 | |||
635 | // Get the user's service URLs | ||
636 | string serverURI = ""; | ||
637 | if (uinfo.UserProfile is ForeignUserProfileData) | ||
638 | serverURI = Util.ServerURI(((ForeignUserProfileData)uinfo.UserProfile).UserServerURI); | ||
639 | string userServer = (serverURI == "") || (serverURI == null) ? LocalUserServerURI : serverURI; | ||
640 | |||
641 | string assetServer = Util.ServerURI(uinfo.UserProfile.UserAssetURI); | ||
642 | if ((assetServer == null) || (assetServer == "")) | ||
643 | assetServer = LocalAssetServerURI; | ||
644 | |||
645 | string inventoryServer = Util.ServerURI(uinfo.UserProfile.UserInventoryURI); | ||
646 | if ((inventoryServer == null) || (inventoryServer == "")) | ||
647 | inventoryServer = LocalInventoryServerURI; | ||
648 | |||
649 | if (!m_HypergridServiceConnector.InformRegionOfUser(clonedRegion, agentData, home, userServer, assetServer, inventoryServer)) | ||
650 | { | ||
651 | m_log.Warn("[HGrid]: Could not inform remote region of transferring user."); | ||
652 | return false; | ||
653 | } | ||
654 | } | ||
655 | //if ((uinfo == null) || !IsGoingHome(uinfo, regInfo)) | ||
656 | //{ | ||
657 | // m_log.Info("[HGrid]: User seems to be going to foreign region."); | ||
658 | // if (!InformRegionOfUser(regInfo, agentData)) | ||
659 | // { | ||
660 | // m_log.Warn("[HGrid]: Could not inform remote region of transferring user."); | ||
661 | // return false; | ||
662 | // } | ||
663 | //} | ||
664 | //else | ||
665 | // m_log.Info("[HGrid]: User seems to be going home " + uinfo.UserProfile.FirstName + " " + uinfo.UserProfile.SurName); | ||
666 | |||
667 | // May need to change agent's name | ||
668 | if (IsLocalUser(uinfo) && (GetHyperlinkRegion(regInfo.RegionHandle) != null)) | ||
669 | { | ||
670 | agentData.firstname = agentData.firstname + "." + agentData.lastname; | ||
671 | agentData.lastname = "@" + LocalUserServerURI.Replace("http://", ""); ; //HGNetworkServersInfo.Singleton.LocalUserServerURI; | ||
672 | } | ||
673 | |||
674 | return true; | ||
675 | } | ||
676 | |||
677 | public void AdjustUserInformation(AgentCircuitData agentData) | ||
678 | { | ||
679 | CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(agentData.AgentID); | ||
680 | if ((uinfo != null) && (uinfo.UserProfile != null) && | ||
681 | (IsLocalUser(uinfo) || !(uinfo.UserProfile is ForeignUserProfileData))) | ||
682 | { | ||
683 | //m_log.Debug("---------------> Local User!"); | ||
684 | string[] parts = agentData.firstname.Split(new char[] { '.' }); | ||
685 | if (parts.Length == 2) | ||
686 | { | ||
687 | agentData.firstname = parts[0]; | ||
688 | agentData.lastname = parts[1]; | ||
689 | } | ||
690 | } | ||
691 | //else | ||
692 | // m_log.Debug("---------------> Foreign User!"); | ||
693 | } | ||
694 | |||
695 | // Check if a local user exists with the same UUID as the incoming foreign user | ||
696 | public bool CheckUserAtEntry(UUID userID, UUID sessionID, out bool comingHome) | ||
697 | { | ||
698 | comingHome = false; | ||
699 | |||
700 | CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(userID); | ||
701 | if (uinfo != null) | ||
702 | { | ||
703 | // uh-oh we have a potential intruder | ||
704 | if (uinfo.SessionID != sessionID) | ||
705 | // can't have a foreigner with a local UUID | ||
706 | return false; | ||
707 | else | ||
708 | // oh, so it's you! welcome back | ||
709 | comingHome = true; | ||
710 | } | ||
711 | |||
712 | // OK, user can come in | ||
713 | return true; | ||
714 | } | ||
715 | |||
716 | public void AcceptUser(ForeignUserProfileData user, GridRegion home) | ||
717 | { | ||
718 | m_aScene.CommsManager.UserProfileCacheService.PreloadUserCache(user); | ||
719 | ulong realHandle = home.RegionHandle; | ||
720 | // Change the local coordinates | ||
721 | // X=0 on the map | ||
722 | home.RegionLocX = 0; | ||
723 | home.RegionLocY = random.Next(0, 10000) * (int)Constants.RegionSize; | ||
724 | |||
725 | AddHyperlinkHomeRegion(user.ID, home, realHandle); | ||
726 | |||
727 | DumpUserData(user); | ||
728 | DumpRegionData(home); | ||
729 | |||
730 | } | ||
731 | |||
732 | public bool IsLocalUser(UUID userID) | ||
733 | { | ||
734 | CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(userID); | ||
735 | return IsLocalUser(uinfo); | ||
736 | } | ||
737 | |||
738 | #endregion | ||
739 | |||
740 | #region IHyperlink Misc | ||
741 | |||
742 | protected bool IsComingHome(ForeignUserProfileData userData) | ||
743 | { | ||
744 | return (userData.UserServerURI == LocalUserServerURI); | ||
745 | } | ||
746 | |||
747 | // Is the user going back to the home region or the home grid? | ||
748 | protected bool IsGoingHome(CachedUserInfo uinfo, GridRegion rinfo) | ||
749 | { | ||
750 | if (uinfo == null) | ||
751 | return false; | ||
752 | |||
753 | if (uinfo.UserProfile == null) | ||
754 | return false; | ||
755 | |||
756 | if (!(uinfo.UserProfile is ForeignUserProfileData)) | ||
757 | // it's a home user, can't be outside to return home | ||
758 | return false; | ||
759 | |||
760 | // OK, it's a foreign user with a ForeignUserProfileData | ||
761 | // and is going back to exactly the home region. | ||
762 | // We can't check if it's going back to a non-home region | ||
763 | // of the home grid. That will be dealt with in the | ||
764 | // receiving end | ||
765 | return (uinfo.UserProfile.HomeRegionID == rinfo.RegionID); | ||
766 | } | ||
767 | |||
768 | protected bool IsLocalUser(CachedUserInfo uinfo) | ||
769 | { | ||
770 | if (uinfo == null) | ||
771 | return false; | ||
772 | |||
773 | return !(uinfo.UserProfile is ForeignUserProfileData); | ||
774 | |||
775 | } | ||
776 | |||
777 | |||
778 | protected bool IsLocalRegion(ulong handle) | ||
779 | { | ||
780 | return m_LocalScenes.ContainsKey(handle); | ||
781 | } | ||
782 | |||
783 | private void DumpUserData(ForeignUserProfileData userData) | ||
784 | { | ||
785 | m_log.Info(" ------------ User Data Dump ----------"); | ||
786 | m_log.Info(" >> Name: " + userData.FirstName + " " + userData.SurName); | ||
787 | m_log.Info(" >> HomeID: " + userData.HomeRegionID); | ||
788 | m_log.Info(" >> UserServer: " + userData.UserServerURI); | ||
789 | m_log.Info(" >> InvServer: " + userData.UserInventoryURI); | ||
790 | m_log.Info(" >> AssetServer: " + userData.UserAssetURI); | ||
791 | m_log.Info(" ------------ -------------- ----------"); | ||
792 | } | ||
793 | |||
794 | private void DumpRegionData(GridRegion rinfo) | ||
795 | { | ||
796 | m_log.Info(" ------------ Region Data Dump ----------"); | ||
797 | m_log.Info(" >> handle: " + rinfo.RegionHandle); | ||
798 | m_log.Info(" >> coords: " + rinfo.RegionLocX + ", " + rinfo.RegionLocY); | ||
799 | m_log.Info(" >> external host name: " + rinfo.ExternalHostName); | ||
800 | m_log.Info(" >> http port: " + rinfo.HttpPort); | ||
801 | m_log.Info(" >> external EP address: " + rinfo.ExternalEndPoint.Address); | ||
802 | m_log.Info(" >> external EP port: " + rinfo.ExternalEndPoint.Port); | ||
803 | m_log.Info(" ------------ -------------- ----------"); | ||
804 | } | ||
805 | |||
806 | |||
807 | #endregion | ||
808 | |||
809 | |||
810 | } | ||
811 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs index 144b5a4..1b00c8a 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/LocalGridServiceConnector.cs | |||
@@ -238,6 +238,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid | |||
238 | return m_GridService.GetRegionRange(scopeID, xmin, xmax, ymin, ymax); | 238 | return m_GridService.GetRegionRange(scopeID, xmin, xmax, ymin, ymax); |
239 | } | 239 | } |
240 | 240 | ||
241 | public List<GridRegion> GetDefaultRegions(UUID scopeID) | ||
242 | { | ||
243 | return m_GridService.GetDefaultRegions(scopeID); | ||
244 | } | ||
245 | |||
246 | public List<GridRegion> GetFallbackRegions(UUID scopeID, int x, int y) | ||
247 | { | ||
248 | return m_GridService.GetFallbackRegions(scopeID, x, y); | ||
249 | } | ||
250 | |||
251 | public int GetRegionFlags(UUID scopeID, UUID regionID) | ||
252 | { | ||
253 | return m_GridService.GetRegionFlags(scopeID, regionID); | ||
254 | } | ||
255 | |||
241 | #endregion | 256 | #endregion |
242 | 257 | ||
243 | public void NeighboursCommand(string module, string[] cmdparams) | 258 | public void NeighboursCommand(string module, string[] cmdparams) |
@@ -250,5 +265,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid | |||
250 | m_log.InfoFormat(" {0} @ {1}={2}", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize); | 265 | m_log.InfoFormat(" {0} @ {1}={2}", r.RegionName, r.RegionLocX / Constants.RegionSize, r.RegionLocY / Constants.RegionSize); |
251 | } | 266 | } |
252 | } | 267 | } |
268 | |||
253 | } | 269 | } |
254 | } | 270 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs index 391e7c8..2c234d2 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs | |||
@@ -188,9 +188,26 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid | |||
188 | return rinfo; | 188 | return rinfo; |
189 | } | 189 | } |
190 | 190 | ||
191 | // Let's not override GetRegionsByName -- let's get them all from the grid server | 191 | public override List<GridRegion> GetRegionsByName(UUID scopeID, string name, int maxNumber) |
192 | { | ||
193 | List<GridRegion> rinfo = m_LocalGridService.GetRegionsByName(scopeID, name, maxNumber); | ||
194 | List<GridRegion> grinfo = base.GetRegionsByName(scopeID, name, maxNumber); | ||
195 | |||
196 | if (grinfo != null) | ||
197 | rinfo.AddRange(grinfo); | ||
198 | return rinfo; | ||
199 | } | ||
200 | |||
192 | // Let's not override GetRegionRange -- let's get them all from the grid server | 201 | // Let's not override GetRegionRange -- let's get them all from the grid server |
193 | 202 | ||
203 | public override int GetRegionFlags(UUID scopeID, UUID regionID) | ||
204 | { | ||
205 | int flags = m_LocalGridService.GetRegionFlags(scopeID, regionID); | ||
206 | if (flags == -1) | ||
207 | flags = base.GetRegionFlags(scopeID, regionID); | ||
208 | |||
209 | return flags; | ||
210 | } | ||
194 | #endregion | 211 | #endregion |
195 | } | 212 | } |
196 | } | 213 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs index 2ca90f8..95d8737 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs | |||
@@ -56,7 +56,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests | |||
56 | config.AddConfig("GridService"); | 56 | config.AddConfig("GridService"); |
57 | config.Configs["Modules"].Set("GridServices", "LocalGridServicesConnector"); | 57 | config.Configs["Modules"].Set("GridServices", "LocalGridServicesConnector"); |
58 | config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService"); | 58 | config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService"); |
59 | config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll:NullRegionData"); | 59 | config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); |
60 | 60 | ||
61 | m_LocalConnector = new LocalGridServicesConnector(config); | 61 | m_LocalConnector = new LocalGridServicesConnector(config); |
62 | } | 62 | } |
@@ -92,7 +92,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests | |||
92 | r2.HttpPort = 9002; | 92 | r2.HttpPort = 9002; |
93 | r2.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0); | 93 | r2.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0); |
94 | s = new Scene(new RegionInfo()); | 94 | s = new Scene(new RegionInfo()); |
95 | s.RegionInfo.RegionID = r1.RegionID; | 95 | s.RegionInfo.RegionID = r2.RegionID; |
96 | m_LocalConnector.AddRegion(s); | 96 | m_LocalConnector.AddRegion(s); |
97 | 97 | ||
98 | GridRegion r3 = new GridRegion(); | 98 | GridRegion r3 = new GridRegion(); |
@@ -104,7 +104,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests | |||
104 | r3.HttpPort = 9003; | 104 | r3.HttpPort = 9003; |
105 | r3.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0); | 105 | r3.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), 0); |
106 | s = new Scene(new RegionInfo()); | 106 | s = new Scene(new RegionInfo()); |
107 | s.RegionInfo.RegionID = r1.RegionID; | 107 | s.RegionInfo.RegionID = r3.RegionID; |
108 | m_LocalConnector.AddRegion(s); | 108 | m_LocalConnector.AddRegion(s); |
109 | 109 | ||
110 | m_LocalConnector.RegisterRegion(UUID.Zero, r1); | 110 | m_LocalConnector.RegisterRegion(UUID.Zero, r1); |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs deleted file mode 100644 index fa3681a..0000000 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs +++ /dev/null | |||
@@ -1,843 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.IO; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text; | ||
34 | using log4net; | ||
35 | using Nini.Config; | ||
36 | using OpenMetaverse; | ||
37 | using OpenMetaverse.StructuredData; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Communications; | ||
40 | using OpenSim.Framework.Communications.Clients; | ||
41 | using OpenSim.Region.Framework.Interfaces; | ||
42 | using OpenSim.Region.Framework.Scenes; | ||
43 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
44 | using OpenSim.Region.Framework.Scenes.Serialization; | ||
45 | using OpenSim.Services.Interfaces; | ||
46 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
47 | |||
48 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | ||
49 | { | ||
50 | public class RESTInterregionComms : ISharedRegionModule, IInterregionCommsOut | ||
51 | { | ||
52 | private bool initialized = false; | ||
53 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
54 | |||
55 | protected bool m_enabled = false; | ||
56 | protected Scene m_aScene; | ||
57 | // RESTInterregionComms does not care about local regions; it delegates that to the Local module | ||
58 | protected LocalInterregionComms m_localBackend; | ||
59 | |||
60 | protected CommunicationsManager m_commsManager; | ||
61 | |||
62 | protected RegionToRegionClient m_regionClient; | ||
63 | |||
64 | protected IHyperlinkService m_hyperlinkService; | ||
65 | |||
66 | protected bool m_safemode; | ||
67 | protected IPAddress m_thisIP; | ||
68 | |||
69 | #region IRegionModule | ||
70 | |||
71 | public virtual void Initialise(IConfigSource config) | ||
72 | { | ||
73 | IConfig startupConfig = config.Configs["Communications"]; | ||
74 | |||
75 | if ((startupConfig == null) || ((startupConfig != null) | ||
76 | && (startupConfig.GetString("InterregionComms", "RESTComms") == "RESTComms"))) | ||
77 | { | ||
78 | m_log.Info("[REST COMMS]: Enabling InterregionComms RESTComms module"); | ||
79 | m_enabled = true; | ||
80 | if (config.Configs["Hypergrid"] != null) | ||
81 | m_safemode = config.Configs["Hypergrid"].GetBoolean("safemode", false); | ||
82 | } | ||
83 | } | ||
84 | |||
85 | public virtual void PostInitialise() | ||
86 | { | ||
87 | } | ||
88 | |||
89 | public virtual void Close() | ||
90 | { | ||
91 | } | ||
92 | |||
93 | public void AddRegion(Scene scene) | ||
94 | { | ||
95 | } | ||
96 | |||
97 | public void RemoveRegion(Scene scene) | ||
98 | { | ||
99 | if (m_enabled) | ||
100 | { | ||
101 | m_localBackend.RemoveScene(scene); | ||
102 | scene.UnregisterModuleInterface<IInterregionCommsOut>(this); | ||
103 | } | ||
104 | } | ||
105 | |||
106 | public void RegionLoaded(Scene scene) | ||
107 | { | ||
108 | if (m_enabled) | ||
109 | { | ||
110 | if (!initialized) | ||
111 | { | ||
112 | InitOnce(scene); | ||
113 | initialized = true; | ||
114 | AddHTTPHandlers(); | ||
115 | } | ||
116 | InitEach(scene); | ||
117 | } | ||
118 | } | ||
119 | |||
120 | public Type ReplaceableInterface | ||
121 | { | ||
122 | get { return null; } | ||
123 | } | ||
124 | |||
125 | public virtual string Name | ||
126 | { | ||
127 | get { return "RESTInterregionCommsModule"; } | ||
128 | } | ||
129 | |||
130 | protected virtual void InitEach(Scene scene) | ||
131 | { | ||
132 | m_localBackend.Init(scene); | ||
133 | scene.RegisterModuleInterface<IInterregionCommsOut>(this); | ||
134 | } | ||
135 | |||
136 | protected virtual void InitOnce(Scene scene) | ||
137 | { | ||
138 | m_localBackend = new LocalInterregionComms(); | ||
139 | m_commsManager = scene.CommsManager; | ||
140 | m_aScene = scene; | ||
141 | m_hyperlinkService = m_aScene.RequestModuleInterface<IHyperlinkService>(); | ||
142 | m_regionClient = new RegionToRegionClient(m_aScene, m_hyperlinkService); | ||
143 | m_thisIP = Util.GetHostFromDNS(scene.RegionInfo.ExternalHostName); | ||
144 | } | ||
145 | |||
146 | protected virtual void AddHTTPHandlers() | ||
147 | { | ||
148 | MainServer.Instance.AddHTTPHandler("/agent/", AgentHandler); | ||
149 | MainServer.Instance.AddHTTPHandler("/object/", ObjectHandler); | ||
150 | } | ||
151 | |||
152 | #endregion /* IRegionModule */ | ||
153 | |||
154 | #region IInterregionComms | ||
155 | |||
156 | /** | ||
157 | * Agent-related communications | ||
158 | */ | ||
159 | |||
160 | public bool SendCreateChildAgent(ulong regionHandle, AgentCircuitData aCircuit, uint teleportFlags, out string reason) | ||
161 | { | ||
162 | // Try local first | ||
163 | if (m_localBackend.SendCreateChildAgent(regionHandle, aCircuit, teleportFlags, out reason)) | ||
164 | return true; | ||
165 | |||
166 | // else do the remote thing | ||
167 | if (!m_localBackend.IsLocalRegion(regionHandle)) | ||
168 | { | ||
169 | uint x = 0, y = 0; | ||
170 | Utils.LongToUInts(regionHandle, out x, out y); | ||
171 | GridRegion regInfo = m_aScene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
172 | if (regInfo != null) | ||
173 | { | ||
174 | m_regionClient.SendUserInformation(regInfo, aCircuit); | ||
175 | |||
176 | return m_regionClient.DoCreateChildAgentCall(regInfo, aCircuit, "None", teleportFlags, out reason); | ||
177 | } | ||
178 | //else | ||
179 | // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); | ||
180 | } | ||
181 | return false; | ||
182 | } | ||
183 | |||
184 | public bool SendChildAgentUpdate(ulong regionHandle, AgentData cAgentData) | ||
185 | { | ||
186 | // Try local first | ||
187 | if (m_localBackend.SendChildAgentUpdate(regionHandle, cAgentData)) | ||
188 | return true; | ||
189 | |||
190 | // else do the remote thing | ||
191 | if (!m_localBackend.IsLocalRegion(regionHandle)) | ||
192 | { | ||
193 | uint x = 0, y = 0; | ||
194 | Utils.LongToUInts(regionHandle, out x, out y); | ||
195 | GridRegion regInfo = m_aScene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
196 | if (regInfo != null) | ||
197 | { | ||
198 | return m_regionClient.DoChildAgentUpdateCall(regInfo, cAgentData); | ||
199 | } | ||
200 | //else | ||
201 | // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); | ||
202 | } | ||
203 | return false; | ||
204 | |||
205 | } | ||
206 | |||
207 | public bool SendChildAgentUpdate(ulong regionHandle, AgentPosition cAgentData) | ||
208 | { | ||
209 | // Try local first | ||
210 | if (m_localBackend.SendChildAgentUpdate(regionHandle, cAgentData)) | ||
211 | return true; | ||
212 | |||
213 | // else do the remote thing | ||
214 | if (!m_localBackend.IsLocalRegion(regionHandle)) | ||
215 | { | ||
216 | uint x = 0, y = 0; | ||
217 | Utils.LongToUInts(regionHandle, out x, out y); | ||
218 | GridRegion regInfo = m_aScene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
219 | if (regInfo != null) | ||
220 | { | ||
221 | return m_regionClient.DoChildAgentUpdateCall(regInfo, cAgentData); | ||
222 | } | ||
223 | //else | ||
224 | // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); | ||
225 | } | ||
226 | return false; | ||
227 | |||
228 | } | ||
229 | |||
230 | public bool SendRetrieveRootAgent(ulong regionHandle, UUID id, out IAgentData agent) | ||
231 | { | ||
232 | // Try local first | ||
233 | if (m_localBackend.SendRetrieveRootAgent(regionHandle, id, out agent)) | ||
234 | return true; | ||
235 | |||
236 | // else do the remote thing | ||
237 | if (!m_localBackend.IsLocalRegion(regionHandle)) | ||
238 | { | ||
239 | uint x = 0, y = 0; | ||
240 | Utils.LongToUInts(regionHandle, out x, out y); | ||
241 | GridRegion regInfo = m_aScene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
242 | if (regInfo != null) | ||
243 | { | ||
244 | return m_regionClient.DoRetrieveRootAgentCall(regInfo, id, out agent); | ||
245 | } | ||
246 | //else | ||
247 | // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); | ||
248 | } | ||
249 | return false; | ||
250 | |||
251 | } | ||
252 | |||
253 | public bool SendReleaseAgent(ulong regionHandle, UUID id, string uri) | ||
254 | { | ||
255 | // Try local first | ||
256 | if (m_localBackend.SendReleaseAgent(regionHandle, id, uri)) | ||
257 | return true; | ||
258 | |||
259 | // else do the remote thing | ||
260 | return m_regionClient.DoReleaseAgentCall(regionHandle, id, uri); | ||
261 | } | ||
262 | |||
263 | |||
264 | public bool SendCloseAgent(ulong regionHandle, UUID id) | ||
265 | { | ||
266 | // Try local first | ||
267 | if (m_localBackend.SendCloseAgent(regionHandle, id)) | ||
268 | return true; | ||
269 | |||
270 | // else do the remote thing | ||
271 | if (!m_localBackend.IsLocalRegion(regionHandle)) | ||
272 | { | ||
273 | uint x = 0, y = 0; | ||
274 | Utils.LongToUInts(regionHandle, out x, out y); | ||
275 | GridRegion regInfo = m_aScene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
276 | if (regInfo != null) | ||
277 | { | ||
278 | return m_regionClient.DoCloseAgentCall(regInfo, id); | ||
279 | } | ||
280 | //else | ||
281 | // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); | ||
282 | } | ||
283 | return false; | ||
284 | } | ||
285 | |||
286 | /** | ||
287 | * Object-related communications | ||
288 | */ | ||
289 | |||
290 | public bool SendCreateObject(ulong regionHandle, SceneObjectGroup sog, bool isLocalCall) | ||
291 | { | ||
292 | // Try local first | ||
293 | if (m_localBackend.SendCreateObject(regionHandle, sog, true)) | ||
294 | { | ||
295 | //m_log.Debug("[REST COMMS]: LocalBackEnd SendCreateObject succeeded"); | ||
296 | return true; | ||
297 | } | ||
298 | |||
299 | // else do the remote thing | ||
300 | if (!m_localBackend.IsLocalRegion(regionHandle)) | ||
301 | { | ||
302 | uint x = 0, y = 0; | ||
303 | Utils.LongToUInts(regionHandle, out x, out y); | ||
304 | GridRegion regInfo = m_aScene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
305 | if (regInfo != null) | ||
306 | { | ||
307 | return m_regionClient.DoCreateObjectCall( | ||
308 | regInfo, sog, SceneObjectSerializer.ToXml2Format(sog), m_aScene.m_allowScriptCrossings); | ||
309 | } | ||
310 | //else | ||
311 | // m_log.Warn("[REST COMMS]: Region not found " + regionHandle); | ||
312 | } | ||
313 | return false; | ||
314 | } | ||
315 | |||
316 | public bool SendCreateObject(ulong regionHandle, UUID userID, UUID itemID) | ||
317 | { | ||
318 | // Not Implemented | ||
319 | return false; | ||
320 | } | ||
321 | |||
322 | #endregion /* IInterregionComms */ | ||
323 | |||
324 | #region Incoming calls from remote instances | ||
325 | |||
326 | /** | ||
327 | * Agent-related incoming calls | ||
328 | */ | ||
329 | |||
330 | public Hashtable AgentHandler(Hashtable request) | ||
331 | { | ||
332 | //m_log.Debug("[CONNECTION DEBUGGING]: AgentHandler Called"); | ||
333 | |||
334 | m_log.Debug("---------------------------"); | ||
335 | m_log.Debug(" >> uri=" + request["uri"]); | ||
336 | m_log.Debug(" >> content-type=" + request["content-type"]); | ||
337 | m_log.Debug(" >> http-method=" + request["http-method"]); | ||
338 | m_log.Debug("---------------------------\n"); | ||
339 | |||
340 | Hashtable responsedata = new Hashtable(); | ||
341 | responsedata["content_type"] = "text/html"; | ||
342 | responsedata["keepalive"] = false; | ||
343 | |||
344 | |||
345 | UUID agentID; | ||
346 | string action; | ||
347 | ulong regionHandle; | ||
348 | if (!GetParams((string)request["uri"], out agentID, out regionHandle, out action)) | ||
349 | { | ||
350 | m_log.InfoFormat("[REST COMMS]: Invalid parameters for agent message {0}", request["uri"]); | ||
351 | responsedata["int_response_code"] = 404; | ||
352 | responsedata["str_response_string"] = "false"; | ||
353 | |||
354 | return responsedata; | ||
355 | } | ||
356 | |||
357 | // Next, let's parse the verb | ||
358 | string method = (string)request["http-method"]; | ||
359 | if (method.Equals("PUT")) | ||
360 | { | ||
361 | DoAgentPut(request, responsedata); | ||
362 | return responsedata; | ||
363 | } | ||
364 | else if (method.Equals("POST")) | ||
365 | { | ||
366 | DoAgentPost(request, responsedata, agentID); | ||
367 | return responsedata; | ||
368 | } | ||
369 | else if (method.Equals("GET")) | ||
370 | { | ||
371 | DoAgentGet(request, responsedata, agentID, regionHandle); | ||
372 | return responsedata; | ||
373 | } | ||
374 | else if (method.Equals("DELETE")) | ||
375 | { | ||
376 | DoAgentDelete(request, responsedata, agentID, action, regionHandle); | ||
377 | return responsedata; | ||
378 | } | ||
379 | else | ||
380 | { | ||
381 | m_log.InfoFormat("[REST COMMS]: method {0} not supported in agent message", method); | ||
382 | responsedata["int_response_code"] = 404; | ||
383 | responsedata["str_response_string"] = "false"; | ||
384 | |||
385 | return responsedata; | ||
386 | } | ||
387 | |||
388 | } | ||
389 | |||
390 | protected virtual void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id) | ||
391 | { | ||
392 | if (m_safemode) | ||
393 | { | ||
394 | // Authentication | ||
395 | string authority = string.Empty; | ||
396 | string authToken = string.Empty; | ||
397 | if (!GetAuthentication(request, out authority, out authToken)) | ||
398 | { | ||
399 | m_log.InfoFormat("[REST COMMS]: Authentication failed for agent message {0}", request["uri"]); | ||
400 | responsedata["int_response_code"] = 403; | ||
401 | responsedata["str_response_string"] = "Forbidden"; | ||
402 | return ; | ||
403 | } | ||
404 | if (!VerifyKey(id, authority, authToken)) | ||
405 | { | ||
406 | m_log.InfoFormat("[REST COMMS]: Authentication failed for agent message {0}", request["uri"]); | ||
407 | responsedata["int_response_code"] = 403; | ||
408 | responsedata["str_response_string"] = "Forbidden"; | ||
409 | return ; | ||
410 | } | ||
411 | m_log.DebugFormat("[REST COMMS]: Authentication succeeded for {0}", id); | ||
412 | } | ||
413 | |||
414 | OSDMap args = RegionClient.GetOSDMap((string)request["body"]); | ||
415 | if (args == null) | ||
416 | { | ||
417 | responsedata["int_response_code"] = 400; | ||
418 | responsedata["str_response_string"] = "false"; | ||
419 | return; | ||
420 | } | ||
421 | |||
422 | // retrieve the regionhandle | ||
423 | ulong regionhandle = 0; | ||
424 | if (args["destination_handle"] != null) | ||
425 | UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle); | ||
426 | |||
427 | AgentCircuitData aCircuit = new AgentCircuitData(); | ||
428 | try | ||
429 | { | ||
430 | aCircuit.UnpackAgentCircuitData(args); | ||
431 | } | ||
432 | catch (Exception ex) | ||
433 | { | ||
434 | m_log.InfoFormat("[REST COMMS]: exception on unpacking ChildCreate message {0}", ex.Message); | ||
435 | return; | ||
436 | } | ||
437 | |||
438 | OSDMap resp = new OSDMap(2); | ||
439 | string reason = String.Empty; | ||
440 | uint teleportFlags = 0; | ||
441 | if (args.ContainsKey("teleport_flags")) | ||
442 | { | ||
443 | teleportFlags = args["teleport_flags"].AsUInteger(); | ||
444 | } | ||
445 | |||
446 | // This is the meaning of POST agent | ||
447 | m_regionClient.AdjustUserInformation(aCircuit); | ||
448 | bool result = m_localBackend.SendCreateChildAgent(regionhandle, aCircuit, teleportFlags, out reason); | ||
449 | |||
450 | resp["reason"] = OSD.FromString(reason); | ||
451 | resp["success"] = OSD.FromBoolean(result); | ||
452 | |||
453 | // TODO: add reason if not String.Empty? | ||
454 | responsedata["int_response_code"] = 200; | ||
455 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); | ||
456 | } | ||
457 | |||
458 | protected virtual void DoAgentPut(Hashtable request, Hashtable responsedata) | ||
459 | { | ||
460 | OSDMap args = RegionClient.GetOSDMap((string)request["body"]); | ||
461 | if (args == null) | ||
462 | { | ||
463 | responsedata["int_response_code"] = 400; | ||
464 | responsedata["str_response_string"] = "false"; | ||
465 | return; | ||
466 | } | ||
467 | |||
468 | // retrieve the regionhandle | ||
469 | ulong regionhandle = 0; | ||
470 | if (args["destination_handle"] != null) | ||
471 | UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle); | ||
472 | |||
473 | string messageType; | ||
474 | if (args["message_type"] != null) | ||
475 | messageType = args["message_type"].AsString(); | ||
476 | else | ||
477 | { | ||
478 | m_log.Warn("[REST COMMS]: Agent Put Message Type not found. "); | ||
479 | messageType = "AgentData"; | ||
480 | } | ||
481 | |||
482 | bool result = true; | ||
483 | if ("AgentData".Equals(messageType)) | ||
484 | { | ||
485 | AgentData agent = new AgentData(); | ||
486 | try | ||
487 | { | ||
488 | agent.Unpack(args); | ||
489 | } | ||
490 | catch (Exception ex) | ||
491 | { | ||
492 | m_log.InfoFormat("[REST COMMS]: exception on unpacking ChildAgentUpdate message {0}", ex.Message); | ||
493 | return; | ||
494 | } | ||
495 | |||
496 | //agent.Dump(); | ||
497 | // This is one of the meanings of PUT agent | ||
498 | result = m_localBackend.SendChildAgentUpdate(regionhandle, agent); | ||
499 | |||
500 | } | ||
501 | else if ("AgentPosition".Equals(messageType)) | ||
502 | { | ||
503 | AgentPosition agent = new AgentPosition(); | ||
504 | try | ||
505 | { | ||
506 | agent.Unpack(args); | ||
507 | } | ||
508 | catch (Exception ex) | ||
509 | { | ||
510 | m_log.InfoFormat("[REST COMMS]: exception on unpacking ChildAgentUpdate message {0}", ex.Message); | ||
511 | return; | ||
512 | } | ||
513 | //agent.Dump(); | ||
514 | // This is one of the meanings of PUT agent | ||
515 | result = m_localBackend.SendChildAgentUpdate(regionhandle, agent); | ||
516 | |||
517 | } | ||
518 | |||
519 | responsedata["int_response_code"] = 200; | ||
520 | responsedata["str_response_string"] = result.ToString(); | ||
521 | } | ||
522 | |||
523 | protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, ulong regionHandle) | ||
524 | { | ||
525 | IAgentData agent = null; | ||
526 | bool result = m_localBackend.SendRetrieveRootAgent(regionHandle, id, out agent); | ||
527 | OSDMap map = null; | ||
528 | if (result) | ||
529 | { | ||
530 | if (agent != null) // just to make sure | ||
531 | { | ||
532 | map = agent.Pack(); | ||
533 | string strBuffer = ""; | ||
534 | try | ||
535 | { | ||
536 | strBuffer = OSDParser.SerializeJsonString(map); | ||
537 | } | ||
538 | catch (Exception e) | ||
539 | { | ||
540 | m_log.WarnFormat("[REST COMMS]: Exception thrown on serialization of CreateObject: {0}", e.Message); | ||
541 | // ignore. buffer will be empty, caller should check. | ||
542 | } | ||
543 | |||
544 | responsedata["content_type"] = "application/json"; | ||
545 | responsedata["int_response_code"] = 200; | ||
546 | responsedata["str_response_string"] = strBuffer; | ||
547 | } | ||
548 | else | ||
549 | { | ||
550 | responsedata["int_response_code"] = 500; | ||
551 | responsedata["str_response_string"] = "Internal error"; | ||
552 | } | ||
553 | } | ||
554 | else | ||
555 | { | ||
556 | responsedata["int_response_code"] = 404; | ||
557 | responsedata["str_response_string"] = "Not Found"; | ||
558 | } | ||
559 | } | ||
560 | |||
561 | protected virtual void DoAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, ulong regionHandle) | ||
562 | { | ||
563 | //m_log.Debug(" >>> DoDelete action:" + action + "; regionHandle:" + regionHandle); | ||
564 | |||
565 | if (action.Equals("release")) | ||
566 | m_localBackend.SendReleaseAgent(regionHandle, id, ""); | ||
567 | else | ||
568 | m_localBackend.SendCloseAgent(regionHandle, id); | ||
569 | |||
570 | responsedata["int_response_code"] = 200; | ||
571 | responsedata["str_response_string"] = "OpenSim agent " + id.ToString(); | ||
572 | |||
573 | m_log.Debug("[REST COMMS]: Agent Deleted."); | ||
574 | } | ||
575 | |||
576 | /** | ||
577 | * Object-related incoming calls | ||
578 | */ | ||
579 | |||
580 | public Hashtable ObjectHandler(Hashtable request) | ||
581 | { | ||
582 | m_log.Debug("[CONNECTION DEBUGGING]: ObjectHandler Called"); | ||
583 | |||
584 | m_log.Debug("---------------------------"); | ||
585 | m_log.Debug(" >> uri=" + request["uri"]); | ||
586 | m_log.Debug(" >> content-type=" + request["content-type"]); | ||
587 | m_log.Debug(" >> http-method=" + request["http-method"]); | ||
588 | m_log.Debug("---------------------------\n"); | ||
589 | |||
590 | Hashtable responsedata = new Hashtable(); | ||
591 | responsedata["content_type"] = "text/html"; | ||
592 | |||
593 | UUID objectID; | ||
594 | string action; | ||
595 | ulong regionHandle; | ||
596 | if (!GetParams((string)request["uri"], out objectID, out regionHandle, out action)) | ||
597 | { | ||
598 | m_log.InfoFormat("[REST COMMS]: Invalid parameters for object message {0}", request["uri"]); | ||
599 | responsedata["int_response_code"] = 404; | ||
600 | responsedata["str_response_string"] = "false"; | ||
601 | |||
602 | return responsedata; | ||
603 | } | ||
604 | |||
605 | // Next, let's parse the verb | ||
606 | string method = (string)request["http-method"]; | ||
607 | if (method.Equals("POST")) | ||
608 | { | ||
609 | DoObjectPost(request, responsedata, regionHandle); | ||
610 | return responsedata; | ||
611 | } | ||
612 | else if (method.Equals("PUT")) | ||
613 | { | ||
614 | DoObjectPut(request, responsedata, regionHandle); | ||
615 | return responsedata; | ||
616 | } | ||
617 | //else if (method.Equals("DELETE")) | ||
618 | //{ | ||
619 | // DoObjectDelete(request, responsedata, agentID, action, regionHandle); | ||
620 | // return responsedata; | ||
621 | //} | ||
622 | else | ||
623 | { | ||
624 | m_log.InfoFormat("[REST COMMS]: method {0} not supported in object message", method); | ||
625 | responsedata["int_response_code"] = 404; | ||
626 | responsedata["str_response_string"] = "false"; | ||
627 | |||
628 | return responsedata; | ||
629 | } | ||
630 | |||
631 | } | ||
632 | |||
633 | protected virtual void DoObjectPost(Hashtable request, Hashtable responsedata, ulong regionhandle) | ||
634 | { | ||
635 | OSDMap args = RegionClient.GetOSDMap((string)request["body"]); | ||
636 | if (args == null) | ||
637 | { | ||
638 | responsedata["int_response_code"] = 400; | ||
639 | responsedata["str_response_string"] = "false"; | ||
640 | return; | ||
641 | } | ||
642 | |||
643 | string sogXmlStr = "", extraStr = "", stateXmlStr = ""; | ||
644 | if (args["sog"] != null) | ||
645 | sogXmlStr = args["sog"].AsString(); | ||
646 | if (args["extra"] != null) | ||
647 | extraStr = args["extra"].AsString(); | ||
648 | |||
649 | IScene s = m_localBackend.GetScene(regionhandle); | ||
650 | SceneObjectGroup sog = null; | ||
651 | try | ||
652 | { | ||
653 | sog = SceneObjectSerializer.FromXml2Format(sogXmlStr); | ||
654 | sog.ExtraFromXmlString(extraStr); | ||
655 | } | ||
656 | catch (Exception ex) | ||
657 | { | ||
658 | m_log.InfoFormat("[REST COMMS]: exception on deserializing scene object {0}", ex.Message); | ||
659 | responsedata["int_response_code"] = 400; | ||
660 | responsedata["str_response_string"] = "false"; | ||
661 | return; | ||
662 | } | ||
663 | |||
664 | if ((args["state"] != null) && m_aScene.m_allowScriptCrossings) | ||
665 | { | ||
666 | stateXmlStr = args["state"].AsString(); | ||
667 | if (stateXmlStr != "") | ||
668 | { | ||
669 | try | ||
670 | { | ||
671 | sog.SetState(stateXmlStr, s); | ||
672 | } | ||
673 | catch (Exception ex) | ||
674 | { | ||
675 | m_log.InfoFormat("[REST COMMS]: exception on setting state for scene object {0}", ex.Message); | ||
676 | |||
677 | } | ||
678 | } | ||
679 | } | ||
680 | // This is the meaning of POST object | ||
681 | bool result = m_localBackend.SendCreateObject(regionhandle, sog, false); | ||
682 | |||
683 | responsedata["int_response_code"] = 200; | ||
684 | responsedata["str_response_string"] = result.ToString(); | ||
685 | } | ||
686 | |||
687 | protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, ulong regionhandle) | ||
688 | { | ||
689 | OSDMap args = RegionClient.GetOSDMap((string)request["body"]); | ||
690 | if (args == null) | ||
691 | { | ||
692 | responsedata["int_response_code"] = 400; | ||
693 | responsedata["str_response_string"] = "false"; | ||
694 | return; | ||
695 | } | ||
696 | |||
697 | UUID userID = UUID.Zero, itemID = UUID.Zero; | ||
698 | if (args["userid"] != null) | ||
699 | userID = args["userid"].AsUUID(); | ||
700 | if (args["itemid"] != null) | ||
701 | itemID = args["itemid"].AsUUID(); | ||
702 | |||
703 | // This is the meaning of PUT object | ||
704 | bool result = m_localBackend.SendCreateObject(regionhandle, userID, itemID); | ||
705 | |||
706 | responsedata["int_response_code"] = 200; | ||
707 | responsedata["str_response_string"] = result.ToString(); | ||
708 | } | ||
709 | |||
710 | #endregion | ||
711 | |||
712 | #region Misc | ||
713 | |||
714 | |||
715 | /// <summary> | ||
716 | /// Extract the param from an uri. | ||
717 | /// </summary> | ||
718 | /// <param name="uri">Something like this: /agent/uuid/ or /agent/uuid/handle/release</param> | ||
719 | /// <param name="uri">uuid on uuid field</param> | ||
720 | /// <param name="action">optional action</param> | ||
721 | public static bool GetParams(string uri, out UUID uuid, out ulong regionHandle, out string action) | ||
722 | { | ||
723 | uuid = UUID.Zero; | ||
724 | action = ""; | ||
725 | regionHandle = 0; | ||
726 | |||
727 | uri = uri.Trim(new char[] { '/' }); | ||
728 | string[] parts = uri.Split('/'); | ||
729 | if (parts.Length <= 1) | ||
730 | { | ||
731 | return false; | ||
732 | } | ||
733 | else | ||
734 | { | ||
735 | if (!UUID.TryParse(parts[1], out uuid)) | ||
736 | return false; | ||
737 | |||
738 | if (parts.Length >= 3) | ||
739 | UInt64.TryParse(parts[2], out regionHandle); | ||
740 | if (parts.Length >= 4) | ||
741 | action = parts[3]; | ||
742 | |||
743 | return true; | ||
744 | } | ||
745 | } | ||
746 | |||
747 | public static bool GetAuthentication(Hashtable request, out string authority, out string authKey) | ||
748 | { | ||
749 | authority = string.Empty; | ||
750 | authKey = string.Empty; | ||
751 | |||
752 | Uri authUri; | ||
753 | Hashtable headers = (Hashtable)request["headers"]; | ||
754 | |||
755 | // Authorization keys look like this: | ||
756 | // http://orgrid.org:8002/<uuid> | ||
757 | if (headers.ContainsKey("authorization") && (string)headers["authorization"] != "None") | ||
758 | { | ||
759 | if (Uri.TryCreate((string)headers["authorization"], UriKind.Absolute, out authUri)) | ||
760 | { | ||
761 | authority = authUri.Authority; | ||
762 | authKey = authUri.PathAndQuery.Trim('/'); | ||
763 | m_log.DebugFormat("[REST COMMS]: Got authority {0} and key {1}", authority, authKey); | ||
764 | return true; | ||
765 | } | ||
766 | else | ||
767 | m_log.Debug("[REST COMMS]: Wrong format for Authorization header: " + (string)headers["authorization"]); | ||
768 | } | ||
769 | else | ||
770 | m_log.Debug("[REST COMMS]: Authorization header not found"); | ||
771 | |||
772 | return false; | ||
773 | } | ||
774 | |||
775 | bool VerifyKey(UUID userID, string authority, string key) | ||
776 | { | ||
777 | string[] parts = authority.Split(':'); | ||
778 | IPAddress ipaddr = IPAddress.None; | ||
779 | uint port = 0; | ||
780 | if (parts.Length <= 2) | ||
781 | ipaddr = Util.GetHostFromDNS(parts[0]); | ||
782 | if (parts.Length == 2) | ||
783 | UInt32.TryParse(parts[1], out port); | ||
784 | |||
785 | // local authority (standalone), local call | ||
786 | if (m_thisIP.Equals(ipaddr) && (m_aScene.RegionInfo.HttpPort == port)) | ||
787 | return ((IAuthentication)m_aScene.CommsManager.UserAdminService).VerifyKey(userID, key); | ||
788 | // remote call | ||
789 | else | ||
790 | return AuthClient.VerifyKey("http://" + authority, userID, key); | ||
791 | } | ||
792 | |||
793 | |||
794 | #endregion Misc | ||
795 | |||
796 | protected class RegionToRegionClient : RegionClient | ||
797 | { | ||
798 | Scene m_aScene = null; | ||
799 | IHyperlinkService m_hyperlinkService; | ||
800 | |||
801 | public RegionToRegionClient(Scene s, IHyperlinkService hyperService) | ||
802 | { | ||
803 | m_aScene = s; | ||
804 | m_hyperlinkService = hyperService; | ||
805 | } | ||
806 | |||
807 | public override ulong GetRegionHandle(ulong handle) | ||
808 | { | ||
809 | if (m_aScene.SceneGridService is HGSceneCommunicationService) | ||
810 | { | ||
811 | if (m_hyperlinkService != null) | ||
812 | return m_hyperlinkService.FindRegionHandle(handle); | ||
813 | } | ||
814 | |||
815 | return handle; | ||
816 | } | ||
817 | |||
818 | public override bool IsHyperlink(ulong handle) | ||
819 | { | ||
820 | if (m_aScene.SceneGridService is HGSceneCommunicationService) | ||
821 | { | ||
822 | if ((m_hyperlinkService != null) && (m_hyperlinkService.GetHyperlinkRegion(handle) != null)) | ||
823 | return true; | ||
824 | } | ||
825 | return false; | ||
826 | } | ||
827 | |||
828 | public override void SendUserInformation(GridRegion regInfo, AgentCircuitData aCircuit) | ||
829 | { | ||
830 | if (m_hyperlinkService != null) | ||
831 | m_hyperlinkService.SendUserInformation(regInfo, aCircuit); | ||
832 | |||
833 | } | ||
834 | |||
835 | public override void AdjustUserInformation(AgentCircuitData aCircuit) | ||
836 | { | ||
837 | if (m_hyperlinkService != null) | ||
838 | m_hyperlinkService.AdjustUserInformation(aCircuit); | ||
839 | } | ||
840 | } | ||
841 | |||
842 | } | ||
843 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs index 811569f..1e51187 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs | |||
@@ -40,12 +40,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
40 | { | 40 | { |
41 | public abstract class BaseInventoryConnector : IInventoryService | 41 | public abstract class BaseInventoryConnector : IInventoryService |
42 | { | 42 | { |
43 | protected InventoryCache m_cache; | 43 | protected static InventoryCache m_cache; |
44 | private static bool m_Initialized; | ||
44 | 45 | ||
45 | protected virtual void Init(IConfigSource source) | 46 | protected virtual void Init(IConfigSource source) |
46 | { | 47 | { |
47 | m_cache = new InventoryCache(); | 48 | if (!m_Initialized) |
48 | m_cache.Init(source, this); | 49 | { |
50 | m_cache = new InventoryCache(); | ||
51 | m_cache.Init(source, this); | ||
52 | m_Initialized = true; | ||
53 | } | ||
49 | } | 54 | } |
50 | 55 | ||
51 | /// <summary> | 56 | /// <summary> |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index 1fdf1ef..c6312e0 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs | |||
@@ -31,7 +31,7 @@ using System; | |||
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Reflection; | 32 | using System.Reflection; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications.Cache; | 34 | |
35 | using OpenSim.Server.Base; | 35 | using OpenSim.Server.Base; |
36 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
@@ -41,31 +41,20 @@ using OpenMetaverse; | |||
41 | 41 | ||
42 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | 42 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory |
43 | { | 43 | { |
44 | public class HGInventoryBroker : BaseInventoryConnector, ISharedRegionModule, IInventoryService | 44 | public class HGInventoryBroker : BaseInventoryConnector, INonSharedRegionModule, IInventoryService |
45 | { | 45 | { |
46 | private static readonly ILog m_log = | 46 | private static readonly ILog m_log = |
47 | LogManager.GetLogger( | 47 | LogManager.GetLogger( |
48 | MethodBase.GetCurrentMethod().DeclaringType); | 48 | MethodBase.GetCurrentMethod().DeclaringType); |
49 | 49 | ||
50 | private bool m_Enabled = false; | 50 | private static bool m_Initialized = false; |
51 | private bool m_Initialized = false; | 51 | private static bool m_Enabled = false; |
52 | private Scene m_Scene; | ||
53 | private UserProfileCacheService m_UserProfileService; // This should change to IUserProfileService | ||
54 | |||
55 | private IInventoryService m_GridService; | ||
56 | private ISessionAuthInventoryService m_HGService; | ||
57 | 52 | ||
58 | private string m_LocalGridInventoryURI = string.Empty; | 53 | private static IInventoryService m_GridService; |
54 | private static ISessionAuthInventoryService m_HGService; | ||
59 | 55 | ||
60 | private string LocalGridInventory | 56 | private Scene m_Scene; |
61 | { | 57 | private IUserAccountService m_UserAccountService; |
62 | get | ||
63 | { | ||
64 | if (m_LocalGridInventoryURI == null || m_LocalGridInventoryURI == "") | ||
65 | m_LocalGridInventoryURI = m_Scene.CommsManager.NetworkServersInfo.InventoryURL; | ||
66 | return m_LocalGridInventoryURI; | ||
67 | } | ||
68 | } | ||
69 | 58 | ||
70 | public Type ReplaceableInterface | 59 | public Type ReplaceableInterface |
71 | { | 60 | { |
@@ -79,65 +68,67 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
79 | 68 | ||
80 | public void Initialise(IConfigSource source) | 69 | public void Initialise(IConfigSource source) |
81 | { | 70 | { |
82 | IConfig moduleConfig = source.Configs["Modules"]; | 71 | if (!m_Initialized) |
83 | if (moduleConfig != null) | ||
84 | { | 72 | { |
85 | string name = moduleConfig.GetString("InventoryServices", ""); | 73 | IConfig moduleConfig = source.Configs["Modules"]; |
86 | if (name == Name) | 74 | if (moduleConfig != null) |
87 | { | 75 | { |
88 | IConfig inventoryConfig = source.Configs["InventoryService"]; | 76 | string name = moduleConfig.GetString("InventoryServices", ""); |
89 | if (inventoryConfig == null) | 77 | if (name == Name) |
90 | { | ||
91 | m_log.Error("[HG INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); | ||
92 | return; | ||
93 | } | ||
94 | |||
95 | string localDll = inventoryConfig.GetString("LocalGridInventoryService", | ||
96 | String.Empty); | ||
97 | string HGDll = inventoryConfig.GetString("HypergridInventoryService", | ||
98 | String.Empty); | ||
99 | |||
100 | if (localDll == String.Empty) | ||
101 | { | ||
102 | m_log.Error("[HG INVENTORY CONNECTOR]: No LocalGridInventoryService named in section InventoryService"); | ||
103 | //return; | ||
104 | throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); | ||
105 | } | ||
106 | |||
107 | if (HGDll == String.Empty) | ||
108 | { | 78 | { |
109 | m_log.Error("[HG INVENTORY CONNECTOR]: No HypergridInventoryService named in section InventoryService"); | 79 | IConfig inventoryConfig = source.Configs["InventoryService"]; |
110 | //return; | 80 | if (inventoryConfig == null) |
111 | throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); | 81 | { |
82 | m_log.Error("[HG INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); | ||
83 | return; | ||
84 | } | ||
85 | |||
86 | string localDll = inventoryConfig.GetString("LocalGridInventoryService", | ||
87 | String.Empty); | ||
88 | string HGDll = inventoryConfig.GetString("HypergridInventoryService", | ||
89 | String.Empty); | ||
90 | |||
91 | if (localDll == String.Empty) | ||
92 | { | ||
93 | m_log.Error("[HG INVENTORY CONNECTOR]: No LocalGridInventoryService named in section InventoryService"); | ||
94 | //return; | ||
95 | throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); | ||
96 | } | ||
97 | |||
98 | if (HGDll == String.Empty) | ||
99 | { | ||
100 | m_log.Error("[HG INVENTORY CONNECTOR]: No HypergridInventoryService named in section InventoryService"); | ||
101 | //return; | ||
102 | throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); | ||
103 | } | ||
104 | |||
105 | Object[] args = new Object[] { source }; | ||
106 | m_GridService = | ||
107 | ServerUtils.LoadPlugin<IInventoryService>(localDll, | ||
108 | args); | ||
109 | |||
110 | m_HGService = | ||
111 | ServerUtils.LoadPlugin<ISessionAuthInventoryService>(HGDll, | ||
112 | args); | ||
113 | |||
114 | if (m_GridService == null) | ||
115 | { | ||
116 | m_log.Error("[HG INVENTORY CONNECTOR]: Can't load local inventory service"); | ||
117 | return; | ||
118 | } | ||
119 | if (m_HGService == null) | ||
120 | { | ||
121 | m_log.Error("[HG INVENTORY CONNECTOR]: Can't load hypergrid inventory service"); | ||
122 | return; | ||
123 | } | ||
124 | |||
125 | Init(source); | ||
126 | |||
127 | m_Enabled = true; | ||
128 | m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled"); | ||
112 | } | 129 | } |
113 | |||
114 | Object[] args = new Object[] { source }; | ||
115 | m_GridService = | ||
116 | ServerUtils.LoadPlugin<IInventoryService>(localDll, | ||
117 | args); | ||
118 | |||
119 | m_HGService = | ||
120 | ServerUtils.LoadPlugin<ISessionAuthInventoryService>(HGDll, | ||
121 | args); | ||
122 | |||
123 | if (m_GridService == null) | ||
124 | { | ||
125 | m_log.Error("[HG INVENTORY CONNECTOR]: Can't load local inventory service"); | ||
126 | return; | ||
127 | } | ||
128 | if (m_HGService == null) | ||
129 | { | ||
130 | m_log.Error("[HG INVENTORY CONNECTOR]: Can't load hypergrid inventory service"); | ||
131 | return; | ||
132 | } | ||
133 | |||
134 | m_LocalGridInventoryURI = inventoryConfig.GetString("InventoryServerURI", string.Empty); | ||
135 | |||
136 | Init(source); | ||
137 | |||
138 | m_Enabled = true; | ||
139 | m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled"); | ||
140 | } | 130 | } |
131 | m_Initialized = true; | ||
141 | } | 132 | } |
142 | } | 133 | } |
143 | 134 | ||
@@ -154,17 +145,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
154 | if (!m_Enabled) | 145 | if (!m_Enabled) |
155 | return; | 146 | return; |
156 | 147 | ||
157 | if (!m_Initialized) | 148 | m_Scene = scene; |
158 | { | 149 | m_UserAccountService = m_Scene.UserAccountService; |
159 | m_Scene = scene; | ||
160 | // HACK for now. Ugh! | ||
161 | m_UserProfileService = m_Scene.CommsManager.UserProfileCacheService; | ||
162 | // ugh! | ||
163 | m_UserProfileService.SetInventoryService(this); | ||
164 | scene.CommsManager.UserService.SetInventoryService(this); | ||
165 | |||
166 | m_Initialized = true; | ||
167 | } | ||
168 | 150 | ||
169 | scene.RegisterModuleInterface<IInventoryService>(this); | 151 | scene.RegisterModuleInterface<IInventoryService>(this); |
170 | m_cache.AddRegion(scene); | 152 | m_cache.AddRegion(scene); |
@@ -201,22 +183,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
201 | 183 | ||
202 | public override InventoryCollection GetUserInventory(UUID userID) | 184 | public override InventoryCollection GetUserInventory(UUID userID) |
203 | { | 185 | { |
204 | if (IsLocalGridUser(userID)) | 186 | return null; |
205 | return m_GridService.GetUserInventory(userID); | ||
206 | else | ||
207 | return null; | ||
208 | } | 187 | } |
209 | 188 | ||
210 | public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) | 189 | public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) |
211 | { | 190 | { |
212 | if (IsLocalGridUser(userID)) | ||
213 | m_GridService.GetUserInventory(userID, callback); | ||
214 | else | ||
215 | { | ||
216 | UUID sessionID = GetSessionID(userID); | ||
217 | string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); | ||
218 | m_HGService.GetUserInventory(uri, sessionID, callback); | ||
219 | } | ||
220 | } | 191 | } |
221 | 192 | ||
222 | // Inherited. See base | 193 | // Inherited. See base |
@@ -236,19 +207,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
236 | 207 | ||
237 | public override InventoryCollection GetFolderContent(UUID userID, UUID folderID) | 208 | public override InventoryCollection GetFolderContent(UUID userID, UUID folderID) |
238 | { | 209 | { |
239 | if (IsLocalGridUser(userID)) | 210 | string uri = string.Empty; |
211 | if (!IsForeignUser(userID, out uri)) | ||
240 | return m_GridService.GetFolderContent(userID, folderID); | 212 | return m_GridService.GetFolderContent(userID, folderID); |
241 | else | 213 | else |
242 | { | 214 | { |
243 | UUID sessionID = GetSessionID(userID); | 215 | UUID sessionID = GetSessionID(userID); |
244 | string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); | 216 | uri = uri + "/" + userID.ToString(); |
245 | return m_HGService.GetFolderContent(uri, folderID, sessionID); | 217 | return m_HGService.GetFolderContent(uri, folderID, sessionID); |
246 | } | 218 | } |
247 | } | 219 | } |
248 | 220 | ||
249 | public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID) | 221 | public override Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID) |
250 | { | 222 | { |
251 | if (IsLocalGridUser(userID)) | 223 | string uri = string.Empty; |
224 | if (!IsForeignUser(userID, out uri)) | ||
252 | { | 225 | { |
253 | // This is not pretty, but it will have to do for now | 226 | // This is not pretty, but it will have to do for now |
254 | if (m_GridService is BaseInventoryConnector) | 227 | if (m_GridService is BaseInventoryConnector) |
@@ -265,7 +238,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
265 | else | 238 | else |
266 | { | 239 | { |
267 | UUID sessionID = GetSessionID(userID); | 240 | UUID sessionID = GetSessionID(userID); |
268 | string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); | 241 | uri = uri + "/" + userID.ToString(); |
269 | return m_HGService.GetSystemFolders(uri, sessionID); | 242 | return m_HGService.GetSystemFolders(uri, sessionID); |
270 | } | 243 | } |
271 | } | 244 | } |
@@ -301,12 +274,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
301 | 274 | ||
302 | public override List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID) | 275 | public override List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID) |
303 | { | 276 | { |
304 | if (IsLocalGridUser(userID)) | 277 | string uri = string.Empty; |
278 | if (!IsForeignUser(userID, out uri)) | ||
305 | return m_GridService.GetFolderItems(userID, folderID); | 279 | return m_GridService.GetFolderItems(userID, folderID); |
306 | else | 280 | else |
307 | { | 281 | { |
308 | UUID sessionID = GetSessionID(userID); | 282 | UUID sessionID = GetSessionID(userID); |
309 | string uri = GetUserInventoryURI(userID) + "/" + userID; | 283 | uri = uri + "/" + userID.ToString(); |
310 | return m_HGService.GetFolderItems(uri, folderID, sessionID); | 284 | return m_HGService.GetFolderItems(uri, folderID, sessionID); |
311 | } | 285 | } |
312 | } | 286 | } |
@@ -316,12 +290,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
316 | if (folder == null) | 290 | if (folder == null) |
317 | return false; | 291 | return false; |
318 | 292 | ||
319 | if (IsLocalGridUser(folder.Owner)) | 293 | string uri = string.Empty; |
294 | if (!IsForeignUser(folder.Owner, out uri)) | ||
320 | return m_GridService.AddFolder(folder); | 295 | return m_GridService.AddFolder(folder); |
321 | else | 296 | else |
322 | { | 297 | { |
323 | UUID sessionID = GetSessionID(folder.Owner); | 298 | UUID sessionID = GetSessionID(folder.Owner); |
324 | string uri = GetUserInventoryURI(folder.Owner) + "/" + folder.Owner.ToString(); | 299 | uri = uri + "/" + folder.Owner.ToString(); |
325 | return m_HGService.AddFolder(uri, folder, sessionID); | 300 | return m_HGService.AddFolder(uri, folder, sessionID); |
326 | } | 301 | } |
327 | } | 302 | } |
@@ -331,12 +306,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
331 | if (folder == null) | 306 | if (folder == null) |
332 | return false; | 307 | return false; |
333 | 308 | ||
334 | if (IsLocalGridUser(folder.Owner)) | 309 | string uri = string.Empty; |
310 | if (!IsForeignUser(folder.Owner, out uri)) | ||
335 | return m_GridService.UpdateFolder(folder); | 311 | return m_GridService.UpdateFolder(folder); |
336 | else | 312 | else |
337 | { | 313 | { |
338 | UUID sessionID = GetSessionID(folder.Owner); | 314 | UUID sessionID = GetSessionID(folder.Owner); |
339 | string uri = GetUserInventoryURI(folder.Owner) + "/" + folder.Owner.ToString(); | 315 | uri = uri + "/" + folder.Owner.ToString(); |
340 | return m_HGService.UpdateFolder(uri, folder, sessionID); | 316 | return m_HGService.UpdateFolder(uri, folder, sessionID); |
341 | } | 317 | } |
342 | } | 318 | } |
@@ -348,12 +324,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
348 | if (folderIDs.Count == 0) | 324 | if (folderIDs.Count == 0) |
349 | return false; | 325 | return false; |
350 | 326 | ||
351 | if (IsLocalGridUser(ownerID)) | 327 | string uri = string.Empty; |
328 | if (!IsForeignUser(ownerID, out uri)) | ||
352 | return m_GridService.DeleteFolders(ownerID, folderIDs); | 329 | return m_GridService.DeleteFolders(ownerID, folderIDs); |
353 | else | 330 | else |
354 | { | 331 | { |
355 | UUID sessionID = GetSessionID(ownerID); | 332 | UUID sessionID = GetSessionID(ownerID); |
356 | string uri = GetUserInventoryURI(ownerID) + "/" + ownerID.ToString(); | 333 | uri = uri + "/" + ownerID.ToString(); |
357 | return m_HGService.DeleteFolders(uri, folderIDs, sessionID); | 334 | return m_HGService.DeleteFolders(uri, folderIDs, sessionID); |
358 | } | 335 | } |
359 | } | 336 | } |
@@ -363,12 +340,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
363 | if (folder == null) | 340 | if (folder == null) |
364 | return false; | 341 | return false; |
365 | 342 | ||
366 | if (IsLocalGridUser(folder.Owner)) | 343 | string uri = string.Empty; |
344 | if (!IsForeignUser(folder.Owner, out uri)) | ||
367 | return m_GridService.MoveFolder(folder); | 345 | return m_GridService.MoveFolder(folder); |
368 | else | 346 | else |
369 | { | 347 | { |
370 | UUID sessionID = GetSessionID(folder.Owner); | 348 | UUID sessionID = GetSessionID(folder.Owner); |
371 | string uri = GetUserInventoryURI(folder.Owner) + "/" + folder.Owner.ToString(); | 349 | uri = uri + "/" + folder.Owner.ToString(); |
372 | return m_HGService.MoveFolder(uri, folder, sessionID); | 350 | return m_HGService.MoveFolder(uri, folder, sessionID); |
373 | } | 351 | } |
374 | } | 352 | } |
@@ -378,12 +356,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
378 | if (folder == null) | 356 | if (folder == null) |
379 | return false; | 357 | return false; |
380 | 358 | ||
381 | if (IsLocalGridUser(folder.Owner)) | 359 | string uri = string.Empty; |
360 | if (!IsForeignUser(folder.Owner, out uri)) | ||
382 | return m_GridService.PurgeFolder(folder); | 361 | return m_GridService.PurgeFolder(folder); |
383 | else | 362 | else |
384 | { | 363 | { |
385 | UUID sessionID = GetSessionID(folder.Owner); | 364 | UUID sessionID = GetSessionID(folder.Owner); |
386 | string uri = GetUserInventoryURI(folder.Owner) + "/" + folder.Owner.ToString(); | 365 | uri = uri + "/" + folder.Owner.ToString(); |
387 | return m_HGService.PurgeFolder(uri, folder, sessionID); | 366 | return m_HGService.PurgeFolder(uri, folder, sessionID); |
388 | } | 367 | } |
389 | } | 368 | } |
@@ -396,14 +375,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
396 | if (item == null) | 375 | if (item == null) |
397 | return false; | 376 | return false; |
398 | 377 | ||
399 | if (IsLocalGridUser(item.Owner)) | 378 | string uri = string.Empty; |
379 | if (!IsForeignUser(item.Owner, out uri)) | ||
400 | { | 380 | { |
401 | return m_GridService.AddItem(item); | 381 | return m_GridService.AddItem(item); |
402 | } | 382 | } |
403 | else | 383 | else |
404 | { | 384 | { |
405 | UUID sessionID = GetSessionID(item.Owner); | 385 | UUID sessionID = GetSessionID(item.Owner); |
406 | string uri = GetUserInventoryURI(item.Owner) + "/" + item.Owner.ToString(); | 386 | uri = uri + "/" + item.Owner.ToString(); |
407 | return m_HGService.AddItem(uri, item, sessionID); | 387 | return m_HGService.AddItem(uri, item, sessionID); |
408 | } | 388 | } |
409 | } | 389 | } |
@@ -413,12 +393,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
413 | if (item == null) | 393 | if (item == null) |
414 | return false; | 394 | return false; |
415 | 395 | ||
416 | if (IsLocalGridUser(item.Owner)) | 396 | string uri = string.Empty; |
397 | if (!IsForeignUser(item.Owner, out uri)) | ||
417 | return m_GridService.UpdateItem(item); | 398 | return m_GridService.UpdateItem(item); |
418 | else | 399 | else |
419 | { | 400 | { |
420 | UUID sessionID = GetSessionID(item.Owner); | 401 | UUID sessionID = GetSessionID(item.Owner); |
421 | string uri = GetUserInventoryURI(item.Owner) + "/" + item.Owner.ToString(); | 402 | uri = uri + "/" + item.Owner.ToString(); |
422 | return m_HGService.UpdateItem(uri, item, sessionID); | 403 | return m_HGService.UpdateItem(uri, item, sessionID); |
423 | } | 404 | } |
424 | } | 405 | } |
@@ -430,12 +411,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
430 | if (items.Count == 0) | 411 | if (items.Count == 0) |
431 | return true; | 412 | return true; |
432 | 413 | ||
433 | if (IsLocalGridUser(ownerID)) | 414 | string uri = string.Empty; |
415 | if (!IsForeignUser(ownerID, out uri)) | ||
434 | return m_GridService.MoveItems(ownerID, items); | 416 | return m_GridService.MoveItems(ownerID, items); |
435 | else | 417 | else |
436 | { | 418 | { |
437 | UUID sessionID = GetSessionID(ownerID); | 419 | UUID sessionID = GetSessionID(ownerID); |
438 | string uri = GetUserInventoryURI(ownerID) + "/" + ownerID.ToString(); | 420 | uri = uri + "/" + ownerID.ToString(); |
439 | return m_HGService.MoveItems(uri, items, sessionID); | 421 | return m_HGService.MoveItems(uri, items, sessionID); |
440 | } | 422 | } |
441 | } | 423 | } |
@@ -449,12 +431,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
449 | if (itemIDs.Count == 0) | 431 | if (itemIDs.Count == 0) |
450 | return true; | 432 | return true; |
451 | 433 | ||
452 | if (IsLocalGridUser(ownerID)) | 434 | string uri = string.Empty; |
435 | if (!IsForeignUser(ownerID, out uri)) | ||
453 | return m_GridService.DeleteItems(ownerID, itemIDs); | 436 | return m_GridService.DeleteItems(ownerID, itemIDs); |
454 | else | 437 | else |
455 | { | 438 | { |
456 | UUID sessionID = GetSessionID(ownerID); | 439 | UUID sessionID = GetSessionID(ownerID); |
457 | string uri = GetUserInventoryURI(ownerID) + "/" + ownerID.ToString(); | 440 | uri = uri + "/" + ownerID.ToString(); |
458 | return m_HGService.DeleteItems(uri, itemIDs, sessionID); | 441 | return m_HGService.DeleteItems(uri, itemIDs, sessionID); |
459 | } | 442 | } |
460 | } | 443 | } |
@@ -464,12 +447,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
464 | if (item == null) | 447 | if (item == null) |
465 | return null; | 448 | return null; |
466 | m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetItem {0} for user {1}", item.ID, item.Owner); | 449 | m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetItem {0} for user {1}", item.ID, item.Owner); |
467 | if (IsLocalGridUser(item.Owner)) | 450 | string uri = string.Empty; |
451 | if (!IsForeignUser(item.Owner, out uri)) | ||
468 | return m_GridService.GetItem(item); | 452 | return m_GridService.GetItem(item); |
469 | else | 453 | else |
470 | { | 454 | { |
471 | UUID sessionID = GetSessionID(item.Owner); | 455 | UUID sessionID = GetSessionID(item.Owner); |
472 | string uri = GetUserInventoryURI(item.Owner) + "/" + item.Owner.ToString(); | 456 | uri = uri + "/" + item.Owner.ToString(); |
473 | return m_HGService.QueryItem(uri, item, sessionID); | 457 | return m_HGService.QueryItem(uri, item, sessionID); |
474 | } | 458 | } |
475 | } | 459 | } |
@@ -479,12 +463,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
479 | if (folder == null) | 463 | if (folder == null) |
480 | return null; | 464 | return null; |
481 | 465 | ||
482 | if (IsLocalGridUser(folder.Owner)) | 466 | string uri = string.Empty; |
467 | if (!IsForeignUser(folder.Owner, out uri)) | ||
483 | return m_GridService.GetFolder(folder); | 468 | return m_GridService.GetFolder(folder); |
484 | else | 469 | else |
485 | { | 470 | { |
486 | UUID sessionID = GetSessionID(folder.Owner); | 471 | UUID sessionID = GetSessionID(folder.Owner); |
487 | string uri = GetUserInventoryURI(folder.Owner) + "/" + folder.Owner.ToString(); | 472 | uri = uri + "/" + folder.Owner.ToString(); |
488 | return m_HGService.QueryFolder(uri, folder, sessionID); | 473 | return m_HGService.QueryFolder(uri, folder, sessionID); |
489 | } | 474 | } |
490 | } | 475 | } |
@@ -501,12 +486,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
501 | 486 | ||
502 | public override int GetAssetPermissions(UUID userID, UUID assetID) | 487 | public override int GetAssetPermissions(UUID userID, UUID assetID) |
503 | { | 488 | { |
504 | if (IsLocalGridUser(userID)) | 489 | string uri = string.Empty; |
490 | if (!IsForeignUser(userID, out uri)) | ||
505 | return m_GridService.GetAssetPermissions(userID, assetID); | 491 | return m_GridService.GetAssetPermissions(userID, assetID); |
506 | else | 492 | else |
507 | { | 493 | { |
508 | UUID sessionID = GetSessionID(userID); | 494 | UUID sessionID = GetSessionID(userID); |
509 | string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); | 495 | uri = uri + "/" + userID.ToString(); |
510 | return m_HGService.GetAssetPermissions(uri, assetID, sessionID); | 496 | return m_HGService.GetAssetPermissions(uri, assetID, sessionID); |
511 | } | 497 | } |
512 | } | 498 | } |
@@ -515,61 +501,40 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
515 | 501 | ||
516 | private UUID GetSessionID(UUID userID) | 502 | private UUID GetSessionID(UUID userID) |
517 | { | 503 | { |
518 | CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID); | 504 | ScenePresence sp = null; |
519 | if (uinfo != null) | 505 | if (m_Scene.TryGetAvatar(userID, out sp)) |
520 | return uinfo.SessionID; | 506 | { |
507 | return sp.ControllingClient.SessionId; | ||
508 | } | ||
521 | 509 | ||
522 | m_log.DebugFormat("[HG INVENTORY CONNECTOR]: user profile for {0} not found", userID); | 510 | m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scene presence for {0} not found", userID); |
523 | return UUID.Zero; | 511 | return UUID.Zero; |
524 | } | 512 | } |
525 | 513 | ||
526 | private bool IsLocalGridUser(UUID userID) | 514 | private bool IsForeignUser(UUID userID, out string inventoryURL) |
527 | { | 515 | { |
528 | if (m_UserProfileService == null) | 516 | inventoryURL = string.Empty; |
529 | { | 517 | UserAccount account = null; |
530 | m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, no profile service. Returning false."); | 518 | if (m_Scene.UserAccountService != null) |
531 | return false; | 519 | account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, userID); |
532 | } | ||
533 | 520 | ||
534 | CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID); | 521 | if (account == null) // foreign user |
535 | if (uinfo == null) | ||
536 | { | 522 | { |
537 | m_log.DebugFormat("[HG INVENTORY CONNECTOR]: IsLocalGridUser, no profile for user {0}. Returning true.", userID); | 523 | ScenePresence sp = null; |
538 | return true; | 524 | m_Scene.TryGetAvatar(userID, out sp); |
539 | } | 525 | if (sp != null) |
540 | 526 | { | |
541 | if ((uinfo.UserProfile.UserInventoryURI == null) || (uinfo.UserProfile.UserInventoryURI == "")) | 527 | AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
542 | // this happens in standalone profiles, apparently | 528 | if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI")) |
543 | return true; | 529 | { |
544 | 530 | inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString(); | |
545 | string userInventoryServerURI = Util.ServerURI(uinfo.UserProfile.UserInventoryURI); | 531 | inventoryURL = inventoryURL.Trim(new char[] { '/' }); |
546 | 532 | return true; | |
547 | string uri = LocalGridInventory.TrimEnd('/'); | 533 | } |
548 | 534 | } | |
549 | if ((userInventoryServerURI == uri) || (userInventoryServerURI == "")) | ||
550 | { | ||
551 | return true; | ||
552 | } | 535 | } |
553 | m_log.DebugFormat("[HG INVENTORY CONNECTOR]: user {0} is foreign({1} - {2})", userID, userInventoryServerURI, uri); | ||
554 | return false; | 536 | return false; |
555 | } | 537 | } |
556 | 538 | ||
557 | private string GetUserInventoryURI(UUID userID) | ||
558 | { | ||
559 | string invURI = LocalGridInventory; | ||
560 | |||
561 | CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID); | ||
562 | if ((uinfo == null) || (uinfo.UserProfile == null)) | ||
563 | return invURI; | ||
564 | |||
565 | string userInventoryServerURI = Util.ServerURI(uinfo.UserProfile.UserInventoryURI); | ||
566 | |||
567 | if ((userInventoryServerURI != null) && | ||
568 | (userInventoryServerURI != "")) | ||
569 | invURI = userInventoryServerURI; | ||
570 | return invURI; | ||
571 | } | ||
572 | |||
573 | |||
574 | } | 539 | } |
575 | } | 540 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index 191e859..e97d21f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs | |||
@@ -131,9 +131,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
131 | 131 | ||
132 | if (!m_Initialized) | 132 | if (!m_Initialized) |
133 | { | 133 | { |
134 | // ugh! | ||
135 | scene.CommsManager.UserProfileCacheService.SetInventoryService(this); | ||
136 | scene.CommsManager.UserService.SetInventoryService(this); | ||
137 | m_Initialized = true; | 134 | m_Initialized = true; |
138 | } | 135 | } |
139 | 136 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs index 69504df..aa3b30d 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteInventoryServiceConnector.cs | |||
@@ -32,7 +32,7 @@ using System.Reflection; | |||
32 | using Nini.Config; | 32 | using Nini.Config; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Statistics; | 34 | using OpenSim.Framework.Statistics; |
35 | using OpenSim.Framework.Communications.Cache; | 35 | |
36 | using OpenSim.Services.Connectors; | 36 | using OpenSim.Services.Connectors; |
37 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
@@ -49,7 +49,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
49 | private bool m_Enabled = false; | 49 | private bool m_Enabled = false; |
50 | private bool m_Initialized = false; | 50 | private bool m_Initialized = false; |
51 | private Scene m_Scene; | 51 | private Scene m_Scene; |
52 | private UserProfileCacheService m_UserProfileService; | ||
53 | private InventoryServicesConnector m_RemoteConnector; | 52 | private InventoryServicesConnector m_RemoteConnector; |
54 | 53 | ||
55 | public Type ReplaceableInterface | 54 | public Type ReplaceableInterface |
@@ -114,9 +113,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
114 | 113 | ||
115 | if (!m_Initialized) | 114 | if (!m_Initialized) |
116 | { | 115 | { |
117 | // ugh! | ||
118 | scene.CommsManager.UserProfileCacheService.SetInventoryService(this); | ||
119 | scene.CommsManager.UserService.SetInventoryService(this); | ||
120 | m_Initialized = true; | 116 | m_Initialized = true; |
121 | } | 117 | } |
122 | 118 | ||
@@ -134,10 +130,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
134 | 130 | ||
135 | public void RegionLoaded(Scene scene) | 131 | public void RegionLoaded(Scene scene) |
136 | { | 132 | { |
137 | m_UserProfileService = m_Scene.CommsManager.UserProfileCacheService; | ||
138 | if (m_UserProfileService != null) | ||
139 | m_log.Debug("[XXXX] Set m_UserProfileService in " + m_Scene.RegionInfo.RegionName); | ||
140 | |||
141 | if (!m_Enabled) | 133 | if (!m_Enabled) |
142 | return; | 134 | return; |
143 | 135 | ||
@@ -345,23 +337,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | |||
345 | 337 | ||
346 | private UUID GetSessionID(UUID userID) | 338 | private UUID GetSessionID(UUID userID) |
347 | { | 339 | { |
348 | //if (m_Scene == null) | ||
349 | //{ | ||
350 | // m_log.Debug("[INVENTORY CONNECTOR]: OOPS! scene is null"); | ||
351 | //} | ||
352 | |||
353 | if (m_UserProfileService == null) | ||
354 | { | ||
355 | //m_log.Debug("[INVENTORY CONNECTOR]: OOPS! UserProfileCacheService is null"); | ||
356 | return UUID.Zero; | ||
357 | } | ||
358 | |||
359 | CachedUserInfo uinfo = m_UserProfileService.GetUserDetails(userID); | ||
360 | if (uinfo != null) | ||
361 | return uinfo.SessionID; | ||
362 | m_log.DebugFormat("[INVENTORY CONNECTOR]: user profile for {0} not found", userID); | ||
363 | return UUID.Zero; | 340 | return UUID.Zero; |
364 | |||
365 | } | 341 | } |
366 | 342 | ||
367 | } | 343 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/LocalPresenceServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/LocalPresenceServiceConnector.cs new file mode 100644 index 0000000..d78daf9 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/LocalPresenceServiceConnector.cs | |||
@@ -0,0 +1,200 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Reflection; | ||
30 | |||
31 | using OpenSim.Region.Framework.Interfaces; | ||
32 | using OpenSim.Region.Framework.Scenes; | ||
33 | using OpenSim.Server.Base; | ||
34 | using OpenSim.Services.Interfaces; | ||
35 | using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo; | ||
36 | |||
37 | using OpenMetaverse; | ||
38 | using log4net; | ||
39 | using Nini.Config; | ||
40 | |||
41 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence | ||
42 | { | ||
43 | public class LocalPresenceServicesConnector : ISharedRegionModule, IPresenceService | ||
44 | { | ||
45 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | |||
47 | private bool m_Enabled = false; | ||
48 | |||
49 | private PresenceDetector m_PresenceDetector; | ||
50 | private IPresenceService m_PresenceService; | ||
51 | |||
52 | public LocalPresenceServicesConnector() | ||
53 | { | ||
54 | } | ||
55 | |||
56 | public LocalPresenceServicesConnector(IConfigSource source) | ||
57 | { | ||
58 | Initialise(source); | ||
59 | } | ||
60 | |||
61 | #region ISharedRegionModule | ||
62 | |||
63 | public Type ReplaceableInterface | ||
64 | { | ||
65 | get { return null; } | ||
66 | } | ||
67 | |||
68 | public string Name | ||
69 | { | ||
70 | get { return "LocalPresenceServicesConnector"; } | ||
71 | } | ||
72 | |||
73 | public void Initialise(IConfigSource source) | ||
74 | { | ||
75 | IConfig moduleConfig = source.Configs["Modules"]; | ||
76 | if (moduleConfig != null) | ||
77 | { | ||
78 | string name = moduleConfig.GetString("PresenceServices", ""); | ||
79 | if (name == Name) | ||
80 | { | ||
81 | IConfig inventoryConfig = source.Configs["PresenceService"]; | ||
82 | if (inventoryConfig == null) | ||
83 | { | ||
84 | m_log.Error("[LOCAL PRESENCE CONNECTOR]: PresenceService missing from OpenSim.ini"); | ||
85 | return; | ||
86 | } | ||
87 | |||
88 | string serviceDll = inventoryConfig.GetString("LocalServiceModule", String.Empty); | ||
89 | |||
90 | if (serviceDll == String.Empty) | ||
91 | { | ||
92 | m_log.Error("[LOCAL PRESENCE CONNECTOR]: No LocalServiceModule named in section PresenceService"); | ||
93 | return; | ||
94 | } | ||
95 | |||
96 | Object[] args = new Object[] { source }; | ||
97 | m_log.DebugFormat("[LOCAL PRESENCE CONNECTOR]: Service dll = {0}", serviceDll); | ||
98 | |||
99 | m_PresenceService = ServerUtils.LoadPlugin<IPresenceService>(serviceDll, args); | ||
100 | |||
101 | if (m_PresenceService == null) | ||
102 | { | ||
103 | m_log.Error("[LOCAL PRESENCE CONNECTOR]: Can't load presence service"); | ||
104 | //return; | ||
105 | throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); | ||
106 | } | ||
107 | |||
108 | //Init(source); | ||
109 | |||
110 | m_PresenceDetector = new PresenceDetector(this); | ||
111 | |||
112 | m_Enabled = true; | ||
113 | m_log.Info("[LOCAL PRESENCE CONNECTOR]: Local presence connector enabled"); | ||
114 | } | ||
115 | } | ||
116 | } | ||
117 | |||
118 | public void PostInitialise() | ||
119 | { | ||
120 | } | ||
121 | |||
122 | public void Close() | ||
123 | { | ||
124 | } | ||
125 | |||
126 | public void AddRegion(Scene scene) | ||
127 | { | ||
128 | if (!m_Enabled) | ||
129 | return; | ||
130 | |||
131 | // m_log.DebugFormat( | ||
132 | // "[LOCAL PRESENCE CONNECTOR]: Registering IPresenceService to scene {0}", scene.RegionInfo.RegionName); | ||
133 | |||
134 | scene.RegisterModuleInterface<IPresenceService>(this); | ||
135 | m_PresenceDetector.AddRegion(scene); | ||
136 | |||
137 | m_log.InfoFormat("[LOCAL PRESENCE CONNECTOR]: Enabled local presence for region {0}", scene.RegionInfo.RegionName); | ||
138 | |||
139 | } | ||
140 | |||
141 | public void RemoveRegion(Scene scene) | ||
142 | { | ||
143 | if (!m_Enabled) | ||
144 | return; | ||
145 | |||
146 | m_PresenceDetector.RemoveRegion(scene); | ||
147 | } | ||
148 | |||
149 | public void RegionLoaded(Scene scene) | ||
150 | { | ||
151 | if (!m_Enabled) | ||
152 | return; | ||
153 | |||
154 | } | ||
155 | |||
156 | #endregion | ||
157 | |||
158 | #region IPresenceService | ||
159 | |||
160 | public bool LoginAgent(string userID, UUID sessionID, UUID secureSessionID) | ||
161 | { | ||
162 | m_log.Warn("[LOCAL PRESENCE CONNECTOR]: LoginAgent connector not implemented at the simulators"); | ||
163 | return false; | ||
164 | } | ||
165 | |||
166 | public bool LogoutAgent(UUID sessionID, Vector3 position, Vector3 lookat) | ||
167 | { | ||
168 | return m_PresenceService.LogoutAgent(sessionID, position, lookat); | ||
169 | } | ||
170 | |||
171 | |||
172 | public bool LogoutRegionAgents(UUID regionID) | ||
173 | { | ||
174 | return m_PresenceService.LogoutRegionAgents(regionID); | ||
175 | } | ||
176 | |||
177 | public bool ReportAgent(UUID sessionID, UUID regionID, Vector3 position, Vector3 lookAt) | ||
178 | { | ||
179 | return m_PresenceService.ReportAgent(sessionID, regionID, position, lookAt); | ||
180 | } | ||
181 | |||
182 | public PresenceInfo GetAgent(UUID sessionID) | ||
183 | { | ||
184 | return m_PresenceService.GetAgent(sessionID); | ||
185 | } | ||
186 | |||
187 | public PresenceInfo[] GetAgents(string[] userIDs) | ||
188 | { | ||
189 | return m_PresenceService.GetAgents(userIDs); | ||
190 | } | ||
191 | |||
192 | public bool SetHomeLocation(string userID, UUID regionID, Vector3 position, Vector3 lookAt) | ||
193 | { | ||
194 | return m_PresenceService.SetHomeLocation(userID, regionID, position, lookAt); | ||
195 | } | ||
196 | |||
197 | #endregion | ||
198 | |||
199 | } | ||
200 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs new file mode 100644 index 0000000..891fc14 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs | |||
@@ -0,0 +1,100 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Reflection; | ||
30 | |||
31 | using OpenSim.Framework; | ||
32 | using OpenSim.Region.Framework.Scenes; | ||
33 | using OpenSim.Services.Interfaces; | ||
34 | |||
35 | using OpenMetaverse; | ||
36 | using log4net; | ||
37 | |||
38 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence | ||
39 | { | ||
40 | public class PresenceDetector | ||
41 | { | ||
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
43 | |||
44 | private IPresenceService m_PresenceService; | ||
45 | private Scene m_aScene; | ||
46 | |||
47 | public PresenceDetector(IPresenceService presenceservice) | ||
48 | { | ||
49 | m_PresenceService = presenceservice; | ||
50 | } | ||
51 | |||
52 | public void AddRegion(Scene scene) | ||
53 | { | ||
54 | scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; | ||
55 | scene.EventManager.OnNewClient += OnNewClient; | ||
56 | |||
57 | m_PresenceService.LogoutRegionAgents(scene.RegionInfo.RegionID); | ||
58 | |||
59 | if (m_aScene == null) | ||
60 | m_aScene = scene; | ||
61 | } | ||
62 | |||
63 | public void RemoveRegion(Scene scene) | ||
64 | { | ||
65 | scene.EventManager.OnMakeRootAgent -= OnMakeRootAgent; | ||
66 | scene.EventManager.OnNewClient -= OnNewClient; | ||
67 | |||
68 | m_PresenceService.LogoutRegionAgents(scene.RegionInfo.RegionID); | ||
69 | |||
70 | } | ||
71 | |||
72 | public void OnMakeRootAgent(ScenePresence sp) | ||
73 | { | ||
74 | m_log.DebugFormat("[PRESENCE DETECTOR]: Detected root presence {0} in {1}", sp.UUID, sp.Scene.RegionInfo.RegionName); | ||
75 | m_PresenceService.ReportAgent(sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID, sp.AbsolutePosition, sp.Lookat); | ||
76 | } | ||
77 | |||
78 | public void OnNewClient(IClientAPI client) | ||
79 | { | ||
80 | client.OnLogout += OnLogout; | ||
81 | } | ||
82 | |||
83 | public void OnLogout(IClientAPI client) | ||
84 | { | ||
85 | client.OnLogout -= OnLogout; | ||
86 | |||
87 | ScenePresence sp = null; | ||
88 | Vector3 position = new Vector3(128, 128, 0); | ||
89 | Vector3 lookat = new Vector3(0, 1, 0); | ||
90 | |||
91 | if (m_aScene.TryGetAvatar(client.AgentId, out sp)) | ||
92 | { | ||
93 | position = sp.AbsolutePosition; | ||
94 | lookat = sp.Lookat; | ||
95 | } | ||
96 | m_PresenceService.LogoutAgent(client.SessionId, position, lookat); | ||
97 | |||
98 | } | ||
99 | } | ||
100 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/RemotePresenceServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/RemotePresenceServiceConnector.cs new file mode 100644 index 0000000..865f99e --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/RemotePresenceServiceConnector.cs | |||
@@ -0,0 +1,164 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Reflection; | ||
30 | |||
31 | using OpenSim.Region.Framework.Interfaces; | ||
32 | using OpenSim.Region.Framework.Scenes; | ||
33 | using OpenSim.Server.Base; | ||
34 | using OpenSim.Services.Interfaces; | ||
35 | using OpenSim.Services.Connectors; | ||
36 | using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo; | ||
37 | |||
38 | using OpenMetaverse; | ||
39 | using log4net; | ||
40 | using Nini.Config; | ||
41 | |||
42 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence | ||
43 | { | ||
44 | public class RemotePresenceServicesConnector : ISharedRegionModule, IPresenceService | ||
45 | { | ||
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | |||
48 | #region ISharedRegionModule | ||
49 | |||
50 | private bool m_Enabled = false; | ||
51 | |||
52 | private PresenceDetector m_PresenceDetector; | ||
53 | private IPresenceService m_RemoteConnector; | ||
54 | |||
55 | public Type ReplaceableInterface | ||
56 | { | ||
57 | get { return null; } | ||
58 | } | ||
59 | |||
60 | public string Name | ||
61 | { | ||
62 | get { return "RemotePresenceServicesConnector"; } | ||
63 | } | ||
64 | |||
65 | public void Initialise(IConfigSource source) | ||
66 | { | ||
67 | IConfig moduleConfig = source.Configs["Modules"]; | ||
68 | if (moduleConfig != null) | ||
69 | { | ||
70 | string name = moduleConfig.GetString("PresenceServices", ""); | ||
71 | if (name == Name) | ||
72 | { | ||
73 | m_RemoteConnector = new PresenceServicesConnector(source); | ||
74 | |||
75 | m_Enabled = true; | ||
76 | |||
77 | m_PresenceDetector = new PresenceDetector(this); | ||
78 | |||
79 | m_log.Info("[INVENTORY CONNECTOR]: Remote presence enabled"); | ||
80 | } | ||
81 | } | ||
82 | |||
83 | } | ||
84 | |||
85 | public void PostInitialise() | ||
86 | { | ||
87 | } | ||
88 | |||
89 | public void Close() | ||
90 | { | ||
91 | } | ||
92 | |||
93 | public void AddRegion(Scene scene) | ||
94 | { | ||
95 | if (!m_Enabled) | ||
96 | return; | ||
97 | |||
98 | scene.RegisterModuleInterface<IPresenceService>(this); | ||
99 | m_PresenceDetector.AddRegion(scene); | ||
100 | |||
101 | m_log.InfoFormat("[REMOTE PRESENCE CONNECTOR]: Enabled remote presence for region {0}", scene.RegionInfo.RegionName); | ||
102 | |||
103 | } | ||
104 | |||
105 | public void RemoveRegion(Scene scene) | ||
106 | { | ||
107 | if (!m_Enabled) | ||
108 | return; | ||
109 | |||
110 | m_PresenceDetector.RemoveRegion(scene); | ||
111 | } | ||
112 | |||
113 | public void RegionLoaded(Scene scene) | ||
114 | { | ||
115 | if (!m_Enabled) | ||
116 | return; | ||
117 | |||
118 | } | ||
119 | |||
120 | #endregion | ||
121 | |||
122 | #region IPresenceService | ||
123 | |||
124 | public bool LoginAgent(string userID, UUID sessionID, UUID secureSessionID) | ||
125 | { | ||
126 | m_log.Warn("[REMOTE PRESENCE CONNECTOR]: LoginAgent connector not implemented at the simulators"); | ||
127 | return false; | ||
128 | } | ||
129 | |||
130 | public bool LogoutAgent(UUID sessionID, Vector3 position, Vector3 lookat) | ||
131 | { | ||
132 | return m_RemoteConnector.LogoutAgent(sessionID, position, lookat); | ||
133 | } | ||
134 | |||
135 | |||
136 | public bool LogoutRegionAgents(UUID regionID) | ||
137 | { | ||
138 | return m_RemoteConnector.LogoutRegionAgents(regionID); | ||
139 | } | ||
140 | |||
141 | public bool ReportAgent(UUID sessionID, UUID regionID, Vector3 position, Vector3 lookAt) | ||
142 | { | ||
143 | return m_RemoteConnector.ReportAgent(sessionID, regionID, position, lookAt); | ||
144 | } | ||
145 | |||
146 | public PresenceInfo GetAgent(UUID sessionID) | ||
147 | { | ||
148 | return m_RemoteConnector.GetAgent(sessionID); | ||
149 | } | ||
150 | |||
151 | public PresenceInfo[] GetAgents(string[] userIDs) | ||
152 | { | ||
153 | return m_RemoteConnector.GetAgents(userIDs); | ||
154 | } | ||
155 | |||
156 | public bool SetHomeLocation(string userID, UUID regionID, Vector3 position, Vector3 lookAt) | ||
157 | { | ||
158 | return m_RemoteConnector.SetHomeLocation(userID, regionID, position, lookAt); | ||
159 | } | ||
160 | |||
161 | #endregion | ||
162 | |||
163 | } | ||
164 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/Tests/PresenceConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/Tests/PresenceConnectorsTests.cs new file mode 100644 index 0000000..ca42461 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/Tests/PresenceConnectorsTests.cs | |||
@@ -0,0 +1,104 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.IO; | ||
31 | using System.Reflection; | ||
32 | using System.Threading; | ||
33 | using log4net.Config; | ||
34 | using NUnit.Framework; | ||
35 | using NUnit.Framework.SyntaxHelpers; | ||
36 | using OpenMetaverse; | ||
37 | using OpenSim.Framework; | ||
38 | using Nini.Config; | ||
39 | |||
40 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence; | ||
41 | using OpenSim.Region.Framework.Scenes; | ||
42 | using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo; | ||
43 | using OpenSim.Tests.Common; | ||
44 | using OpenSim.Tests.Common.Setup; | ||
45 | |||
46 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence.Tests | ||
47 | { | ||
48 | [TestFixture] | ||
49 | public class PresenceConnectorsTests | ||
50 | { | ||
51 | LocalPresenceServicesConnector m_LocalConnector; | ||
52 | private void SetUp() | ||
53 | { | ||
54 | IConfigSource config = new IniConfigSource(); | ||
55 | config.AddConfig("Modules"); | ||
56 | config.AddConfig("PresenceService"); | ||
57 | config.Configs["Modules"].Set("PresenceServices", "LocalPresenceServicesConnector"); | ||
58 | config.Configs["PresenceService"].Set("LocalServiceModule", "OpenSim.Services.PresenceService.dll:PresenceService"); | ||
59 | config.Configs["PresenceService"].Set("StorageProvider", "OpenSim.Data.Null.dll"); | ||
60 | |||
61 | m_LocalConnector = new LocalPresenceServicesConnector(config); | ||
62 | } | ||
63 | |||
64 | /// <summary> | ||
65 | /// Test OpenSim Presence. | ||
66 | /// </summary> | ||
67 | [Test] | ||
68 | public void TestPresenceV0_1() | ||
69 | { | ||
70 | SetUp(); | ||
71 | |||
72 | string user1 = UUID.Zero.ToString(); | ||
73 | UUID session1 = UUID.Zero; | ||
74 | |||
75 | // this is not implemented by this connector | ||
76 | //m_LocalConnector.LoginAgent(user1, session1, UUID.Zero); | ||
77 | PresenceInfo result = m_LocalConnector.GetAgent(session1); | ||
78 | Assert.IsNotNull(result, "Retrieved GetAgent is null"); | ||
79 | Assert.That(result.UserID, Is.EqualTo(user1), "Retrieved userID does not match"); | ||
80 | Assert.IsTrue(result.Online, "Agent just logged in but is offline"); | ||
81 | |||
82 | UUID region1 = UUID.Random(); | ||
83 | bool r = m_LocalConnector.ReportAgent(session1, region1, Vector3.Zero, Vector3.Zero); | ||
84 | Assert.IsTrue(r, "First ReportAgent returned false"); | ||
85 | result = m_LocalConnector.GetAgent(session1); | ||
86 | Assert.That(result.RegionID, Is.EqualTo(region1), "Agent is not in the right region (region1)"); | ||
87 | |||
88 | UUID region2 = UUID.Random(); | ||
89 | r = m_LocalConnector.ReportAgent(session1, region2, Vector3.Zero, Vector3.Zero); | ||
90 | Assert.IsTrue(r, "Second ReportAgent returned false"); | ||
91 | result = m_LocalConnector.GetAgent(session1); | ||
92 | Assert.That(result.RegionID, Is.EqualTo(region2), "Agent is not in the right region (region2)"); | ||
93 | |||
94 | r = m_LocalConnector.LogoutAgent(session1, Vector3.Zero, Vector3.UnitY); | ||
95 | Assert.IsTrue(r, "LogoutAgent returned false"); | ||
96 | result = m_LocalConnector.GetAgent(session1); | ||
97 | Assert.IsNotNull(result, "Agent session disappeared from storage after logout"); | ||
98 | Assert.IsFalse(result.Online, "Agent is reported to be Online after logout"); | ||
99 | |||
100 | r = m_LocalConnector.ReportAgent(session1, region1, Vector3.Zero, Vector3.Zero); | ||
101 | Assert.IsFalse(r, "ReportAgent of non-logged in user returned true"); | ||
102 | } | ||
103 | } | ||
104 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/LocalInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index d68c683..e913891 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/LocalInterregionComms.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs | |||
@@ -33,33 +33,49 @@ using OpenMetaverse; | |||
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Region.Framework.Interfaces; | 34 | using OpenSim.Region.Framework.Interfaces; |
35 | using OpenSim.Region.Framework.Scenes; | 35 | using OpenSim.Region.Framework.Scenes; |
36 | using OpenSim.Services.Interfaces; | ||
37 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
36 | 38 | ||
37 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | 39 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation |
38 | { | 40 | { |
39 | public class LocalInterregionComms : ISharedRegionModule, IInterregionCommsOut, IInterregionCommsIn | 41 | public class LocalSimulationConnectorModule : ISharedRegionModule, ISimulationService |
40 | { | 42 | { |
41 | private bool m_enabled = false; | ||
42 | |||
43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
44 | private List<Scene> m_sceneList = new List<Scene>(); | 44 | private List<Scene> m_sceneList = new List<Scene>(); |
45 | 45 | ||
46 | #region Events | 46 | private IEntityTransferModule m_AgentTransferModule; |
47 | public event ChildAgentUpdateReceived OnChildAgentUpdate; | 47 | protected IEntityTransferModule AgentTransferModule |
48 | { | ||
49 | get | ||
50 | { | ||
51 | if (m_AgentTransferModule == null) | ||
52 | m_AgentTransferModule = m_sceneList[0].RequestModuleInterface<IEntityTransferModule>(); | ||
53 | return m_AgentTransferModule; | ||
54 | } | ||
55 | } | ||
48 | 56 | ||
49 | #endregion /* Events */ | 57 | private bool m_ModuleEnabled = false; |
50 | 58 | ||
51 | #region IRegionModule | 59 | #region IRegionModule |
52 | 60 | ||
53 | public void Initialise(IConfigSource config) | 61 | public void Initialise(IConfigSource config) |
54 | { | 62 | { |
55 | if (m_sceneList.Count == 0) | 63 | IConfig moduleConfig = config.Configs["Modules"]; |
64 | if (moduleConfig != null) | ||
56 | { | 65 | { |
57 | IConfig startupConfig = config.Configs["Communications"]; | 66 | string name = moduleConfig.GetString("SimulationServices", ""); |
58 | 67 | if (name == Name) | |
59 | if ((startupConfig != null) && (startupConfig.GetString("InterregionComms", "RESTComms") == "LocalComms")) | ||
60 | { | 68 | { |
61 | m_log.Debug("[LOCAL COMMS]: Enabling InterregionComms LocalComms module"); | 69 | //IConfig userConfig = config.Configs["SimulationService"]; |
62 | m_enabled = true; | 70 | //if (userConfig == null) |
71 | //{ | ||
72 | // m_log.Error("[AVATAR CONNECTOR]: SimulationService missing from OpanSim.ini"); | ||
73 | // return; | ||
74 | //} | ||
75 | |||
76 | m_ModuleEnabled = true; | ||
77 | |||
78 | m_log.Info("[SIMULATION CONNECTOR]: Local simulation enabled"); | ||
63 | } | 79 | } |
64 | } | 80 | } |
65 | } | 81 | } |
@@ -70,22 +86,24 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
70 | 86 | ||
71 | public void AddRegion(Scene scene) | 87 | public void AddRegion(Scene scene) |
72 | { | 88 | { |
89 | if (!m_ModuleEnabled) | ||
90 | return; | ||
91 | |||
92 | Init(scene); | ||
93 | scene.RegisterModuleInterface<ISimulationService>(this); | ||
73 | } | 94 | } |
74 | 95 | ||
75 | public void RemoveRegion(Scene scene) | 96 | public void RemoveRegion(Scene scene) |
76 | { | 97 | { |
77 | if (m_enabled) | 98 | if (!m_ModuleEnabled) |
78 | { | 99 | return; |
79 | RemoveScene(scene); | 100 | |
80 | } | 101 | RemoveScene(scene); |
102 | scene.UnregisterModuleInterface<ISimulationService>(this); | ||
81 | } | 103 | } |
82 | 104 | ||
83 | public void RegionLoaded(Scene scene) | 105 | public void RegionLoaded(Scene scene) |
84 | { | 106 | { |
85 | if (m_enabled) | ||
86 | { | ||
87 | Init(scene); | ||
88 | } | ||
89 | } | 107 | } |
90 | 108 | ||
91 | public void Close() | 109 | public void Close() |
@@ -99,7 +117,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
99 | 117 | ||
100 | public string Name | 118 | public string Name |
101 | { | 119 | { |
102 | get { return "LocalInterregionCommsModule"; } | 120 | get { return "LocalSimulationConnectorModule"; } |
103 | } | 121 | } |
104 | 122 | ||
105 | /// <summary> | 123 | /// <summary> |
@@ -128,9 +146,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
128 | lock (m_sceneList) | 146 | lock (m_sceneList) |
129 | { | 147 | { |
130 | m_sceneList.Add(scene); | 148 | m_sceneList.Add(scene); |
131 | if (m_enabled) | ||
132 | scene.RegisterModuleInterface<IInterregionCommsOut>(this); | ||
133 | scene.RegisterModuleInterface<IInterregionCommsIn>(this); | ||
134 | } | 149 | } |
135 | 150 | ||
136 | } | 151 | } |
@@ -138,40 +153,58 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
138 | 153 | ||
139 | #endregion /* IRegionModule */ | 154 | #endregion /* IRegionModule */ |
140 | 155 | ||
141 | #region IInterregionComms | 156 | #region ISimulation |
157 | |||
158 | public IScene GetScene(ulong regionhandle) | ||
159 | { | ||
160 | foreach (Scene s in m_sceneList) | ||
161 | { | ||
162 | if (s.RegionInfo.RegionHandle == regionhandle) | ||
163 | return s; | ||
164 | } | ||
165 | // ? weird. should not happen | ||
166 | return m_sceneList[0]; | ||
167 | } | ||
142 | 168 | ||
143 | /** | 169 | /** |
144 | * Agent-related communications | 170 | * Agent-related communications |
145 | */ | 171 | */ |
146 | 172 | ||
147 | public bool SendCreateChildAgent(ulong regionHandle, AgentCircuitData aCircuit, uint teleportFlags, out string reason) | 173 | public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason) |
148 | { | 174 | { |
175 | if (destination == null) | ||
176 | { | ||
177 | reason = "Given destination was null"; | ||
178 | m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: CreateAgent was given a null destination"); | ||
179 | return false; | ||
180 | } | ||
149 | 181 | ||
150 | foreach (Scene s in m_sceneList) | 182 | foreach (Scene s in m_sceneList) |
151 | { | 183 | { |
152 | if (s.RegionInfo.RegionHandle == regionHandle) | 184 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) |
153 | { | 185 | { |
154 | // m_log.DebugFormat("[LOCAL COMMS]: Found region {0} to send SendCreateChildAgent", regionHandle); | 186 | m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Found region {0} to send SendCreateChildAgent", destination.RegionName); |
155 | return s.NewUserConnection(aCircuit, teleportFlags, out reason); | 187 | return s.NewUserConnection(aCircuit, teleportFlags, out reason); |
156 | } | 188 | } |
157 | } | 189 | } |
158 | 190 | ||
159 | // m_log.DebugFormat("[LOCAL COMMS]: Did not find region {0} for SendCreateChildAgent", regionHandle); | 191 | m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Did not find region {0} for SendCreateChildAgent", destination.RegionName); |
160 | uint x = 0, y = 0; | 192 | reason = "Did not find region " + destination.RegionName; |
161 | Utils.LongToUInts(regionHandle, out x, out y); | ||
162 | reason = "Did not find region " + x + "-" + y; | ||
163 | return false; | 193 | return false; |
164 | } | 194 | } |
165 | 195 | ||
166 | public bool SendChildAgentUpdate(ulong regionHandle, AgentData cAgentData) | 196 | public bool UpdateAgent(GridRegion destination, AgentData cAgentData) |
167 | { | 197 | { |
198 | if (destination == null) | ||
199 | return false; | ||
200 | |||
168 | foreach (Scene s in m_sceneList) | 201 | foreach (Scene s in m_sceneList) |
169 | { | 202 | { |
170 | if (s.RegionInfo.RegionHandle == regionHandle) | 203 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) |
171 | { | 204 | { |
172 | //m_log.DebugFormat( | 205 | m_log.DebugFormat( |
173 | // "[LOCAL COMMS]: Found region {0} {1} to send ChildAgentUpdate", | 206 | "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", |
174 | // s.RegionInfo.RegionName, regionHandle); | 207 | s.RegionInfo.RegionName, destination.RegionHandle); |
175 | 208 | ||
176 | s.IncomingChildAgentDataUpdate(cAgentData); | 209 | s.IncomingChildAgentDataUpdate(cAgentData); |
177 | return true; | 210 | return true; |
@@ -182,11 +215,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
182 | return false; | 215 | return false; |
183 | } | 216 | } |
184 | 217 | ||
185 | public bool SendChildAgentUpdate(ulong regionHandle, AgentPosition cAgentData) | 218 | public bool UpdateAgent(GridRegion destination, AgentPosition cAgentData) |
186 | { | 219 | { |
220 | if (destination == null) | ||
221 | return false; | ||
222 | |||
187 | foreach (Scene s in m_sceneList) | 223 | foreach (Scene s in m_sceneList) |
188 | { | 224 | { |
189 | if (s.RegionInfo.RegionHandle == regionHandle) | 225 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) |
190 | { | 226 | { |
191 | //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); | 227 | //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); |
192 | s.IncomingChildAgentDataUpdate(cAgentData); | 228 | s.IncomingChildAgentDataUpdate(cAgentData); |
@@ -197,12 +233,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
197 | return false; | 233 | return false; |
198 | } | 234 | } |
199 | 235 | ||
200 | public bool SendRetrieveRootAgent(ulong regionHandle, UUID id, out IAgentData agent) | 236 | public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent) |
201 | { | 237 | { |
202 | agent = null; | 238 | agent = null; |
239 | |||
240 | if (destination == null) | ||
241 | return false; | ||
242 | |||
203 | foreach (Scene s in m_sceneList) | 243 | foreach (Scene s in m_sceneList) |
204 | { | 244 | { |
205 | if (s.RegionInfo.RegionHandle == regionHandle) | 245 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) |
206 | { | 246 | { |
207 | //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); | 247 | //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); |
208 | return s.IncomingRetrieveRootAgent(id, out agent); | 248 | return s.IncomingRetrieveRootAgent(id, out agent); |
@@ -212,35 +252,30 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
212 | return false; | 252 | return false; |
213 | } | 253 | } |
214 | 254 | ||
215 | public bool SendReleaseAgent(ulong regionHandle, UUID id, string uri) | 255 | public bool ReleaseAgent(UUID origin, UUID id, string uri) |
216 | { | 256 | { |
217 | //uint x, y; | ||
218 | //Utils.LongToUInts(regionHandle, out x, out y); | ||
219 | //x = x / Constants.RegionSize; | ||
220 | //y = y / Constants.RegionSize; | ||
221 | //m_log.Debug("\n >>> Local SendReleaseAgent " + x + "-" + y); | ||
222 | foreach (Scene s in m_sceneList) | 257 | foreach (Scene s in m_sceneList) |
223 | { | 258 | { |
224 | if (s.RegionInfo.RegionHandle == regionHandle) | 259 | if (s.RegionInfo.RegionID == origin) |
225 | { | 260 | { |
226 | //m_log.Debug("[LOCAL COMMS]: Found region to SendReleaseAgent"); | 261 | m_log.Debug("[LOCAL COMMS]: Found region to SendReleaseAgent"); |
227 | return s.IncomingReleaseAgent(id); | 262 | AgentTransferModule.AgentArrivedAtDestination(id); |
263 | return true; | ||
264 | // return s.IncomingReleaseAgent(id); | ||
228 | } | 265 | } |
229 | } | 266 | } |
230 | //m_log.Debug("[LOCAL COMMS]: region not found in SendReleaseAgent"); | 267 | //m_log.Debug("[LOCAL COMMS]: region not found in SendReleaseAgent " + origin); |
231 | return false; | 268 | return false; |
232 | } | 269 | } |
233 | 270 | ||
234 | public bool SendCloseAgent(ulong regionHandle, UUID id) | 271 | public bool CloseAgent(GridRegion destination, UUID id) |
235 | { | 272 | { |
236 | //uint x, y; | 273 | if (destination == null) |
237 | //Utils.LongToUInts(regionHandle, out x, out y); | 274 | return false; |
238 | //x = x / Constants.RegionSize; | 275 | |
239 | //y = y / Constants.RegionSize; | ||
240 | //m_log.Debug("\n >>> Local SendCloseAgent " + x + "-" + y); | ||
241 | foreach (Scene s in m_sceneList) | 276 | foreach (Scene s in m_sceneList) |
242 | { | 277 | { |
243 | if (s.RegionInfo.RegionHandle == regionHandle) | 278 | if (s.RegionInfo.RegionID == destination.RegionID) |
244 | { | 279 | { |
245 | //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent"); | 280 | //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent"); |
246 | return s.IncomingCloseAgent(id); | 281 | return s.IncomingCloseAgent(id); |
@@ -254,11 +289,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
254 | * Object-related communications | 289 | * Object-related communications |
255 | */ | 290 | */ |
256 | 291 | ||
257 | public bool SendCreateObject(ulong regionHandle, SceneObjectGroup sog, bool isLocalCall) | 292 | public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall) |
258 | { | 293 | { |
294 | if (destination == null) | ||
295 | return false; | ||
296 | |||
259 | foreach (Scene s in m_sceneList) | 297 | foreach (Scene s in m_sceneList) |
260 | { | 298 | { |
261 | if (s.RegionInfo.RegionHandle == regionHandle) | 299 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) |
262 | { | 300 | { |
263 | //m_log.Debug("[LOCAL COMMS]: Found region to SendCreateObject"); | 301 | //m_log.Debug("[LOCAL COMMS]: Found region to SendCreateObject"); |
264 | if (isLocalCall) | 302 | if (isLocalCall) |
@@ -278,11 +316,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
278 | return false; | 316 | return false; |
279 | } | 317 | } |
280 | 318 | ||
281 | public bool SendCreateObject(ulong regionHandle, UUID userID, UUID itemID) | 319 | public bool CreateObject(GridRegion destination, UUID userID, UUID itemID) |
282 | { | 320 | { |
321 | if (destination == null) | ||
322 | return false; | ||
323 | |||
283 | foreach (Scene s in m_sceneList) | 324 | foreach (Scene s in m_sceneList) |
284 | { | 325 | { |
285 | if (s.RegionInfo.RegionHandle == regionHandle) | 326 | if (s.RegionInfo.RegionHandle == destination.RegionHandle) |
286 | { | 327 | { |
287 | return s.IncomingCreateObject(userID, itemID); | 328 | return s.IncomingCreateObject(userID, itemID); |
288 | } | 329 | } |
@@ -295,21 +336,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion | |||
295 | 336 | ||
296 | #region Misc | 337 | #region Misc |
297 | 338 | ||
298 | public Scene GetScene(ulong regionhandle) | 339 | public bool IsLocalRegion(ulong regionhandle) |
299 | { | 340 | { |
300 | foreach (Scene s in m_sceneList) | 341 | foreach (Scene s in m_sceneList) |
301 | { | ||
302 | if (s.RegionInfo.RegionHandle == regionhandle) | 342 | if (s.RegionInfo.RegionHandle == regionhandle) |
303 | return s; | 343 | return true; |
304 | } | 344 | return false; |
305 | // ? weird. should not happen | ||
306 | return m_sceneList[0]; | ||
307 | } | 345 | } |
308 | 346 | ||
309 | public bool IsLocalRegion(ulong regionhandle) | 347 | public bool IsLocalRegion(UUID id) |
310 | { | 348 | { |
311 | foreach (Scene s in m_sceneList) | 349 | foreach (Scene s in m_sceneList) |
312 | if (s.RegionInfo.RegionHandle == regionhandle) | 350 | if (s.RegionInfo.RegionID == id) |
313 | return true; | 351 | return true; |
314 | return false; | 352 | return false; |
315 | } | 353 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs new file mode 100644 index 0000000..2b1f815 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs | |||
@@ -0,0 +1,300 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.IO; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text; | ||
34 | using log4net; | ||
35 | using Nini.Config; | ||
36 | using OpenMetaverse; | ||
37 | using OpenMetaverse.StructuredData; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Communications; | ||
40 | using OpenSim.Region.Framework.Interfaces; | ||
41 | using OpenSim.Region.Framework.Scenes; | ||
42 | using OpenSim.Region.Framework.Scenes.Serialization; | ||
43 | using OpenSim.Services.Interfaces; | ||
44 | using OpenSim.Services.Connectors.Simulation; | ||
45 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
46 | |||
47 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | ||
48 | { | ||
49 | public class RemoteSimulationConnectorModule : ISharedRegionModule, ISimulationService | ||
50 | { | ||
51 | private bool initialized = false; | ||
52 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
53 | |||
54 | protected bool m_enabled = false; | ||
55 | protected Scene m_aScene; | ||
56 | // RemoteSimulationConnector does not care about local regions; it delegates that to the Local module | ||
57 | protected LocalSimulationConnectorModule m_localBackend; | ||
58 | protected SimulationServiceConnector m_remoteConnector; | ||
59 | |||
60 | protected bool m_safemode; | ||
61 | protected IPAddress m_thisIP; | ||
62 | |||
63 | #region IRegionModule | ||
64 | |||
65 | public virtual void Initialise(IConfigSource config) | ||
66 | { | ||
67 | |||
68 | IConfig moduleConfig = config.Configs["Modules"]; | ||
69 | if (moduleConfig != null) | ||
70 | { | ||
71 | string name = moduleConfig.GetString("SimulationServices", ""); | ||
72 | if (name == Name) | ||
73 | { | ||
74 | //IConfig userConfig = config.Configs["SimulationService"]; | ||
75 | //if (userConfig == null) | ||
76 | //{ | ||
77 | // m_log.Error("[AVATAR CONNECTOR]: SimulationService missing from OpanSim.ini"); | ||
78 | // return; | ||
79 | //} | ||
80 | |||
81 | m_remoteConnector = new SimulationServiceConnector(); | ||
82 | |||
83 | m_enabled = true; | ||
84 | |||
85 | m_log.Info("[SIMULATION CONNECTOR]: Remote simulation enabled"); | ||
86 | } | ||
87 | } | ||
88 | } | ||
89 | |||
90 | public virtual void PostInitialise() | ||
91 | { | ||
92 | } | ||
93 | |||
94 | public virtual void Close() | ||
95 | { | ||
96 | } | ||
97 | |||
98 | public void AddRegion(Scene scene) | ||
99 | { | ||
100 | if (!m_enabled) | ||
101 | return; | ||
102 | |||
103 | if (!initialized) | ||
104 | { | ||
105 | InitOnce(scene); | ||
106 | initialized = true; | ||
107 | } | ||
108 | InitEach(scene); | ||
109 | } | ||
110 | |||
111 | public void RemoveRegion(Scene scene) | ||
112 | { | ||
113 | if (m_enabled) | ||
114 | { | ||
115 | m_localBackend.RemoveScene(scene); | ||
116 | scene.UnregisterModuleInterface<ISimulationService>(this); | ||
117 | } | ||
118 | } | ||
119 | |||
120 | public void RegionLoaded(Scene scene) | ||
121 | { | ||
122 | if (!m_enabled) | ||
123 | return; | ||
124 | } | ||
125 | |||
126 | public Type ReplaceableInterface | ||
127 | { | ||
128 | get { return null; } | ||
129 | } | ||
130 | |||
131 | public virtual string Name | ||
132 | { | ||
133 | get { return "RemoteSimulationConnectorModule"; } | ||
134 | } | ||
135 | |||
136 | protected virtual void InitEach(Scene scene) | ||
137 | { | ||
138 | m_localBackend.Init(scene); | ||
139 | scene.RegisterModuleInterface<ISimulationService>(this); | ||
140 | } | ||
141 | |||
142 | protected virtual void InitOnce(Scene scene) | ||
143 | { | ||
144 | m_localBackend = new LocalSimulationConnectorModule(); | ||
145 | m_aScene = scene; | ||
146 | //m_regionClient = new RegionToRegionClient(m_aScene, m_hyperlinkService); | ||
147 | m_thisIP = Util.GetHostFromDNS(scene.RegionInfo.ExternalHostName); | ||
148 | } | ||
149 | |||
150 | #endregion /* IRegionModule */ | ||
151 | |||
152 | #region IInterregionComms | ||
153 | |||
154 | public IScene GetScene(ulong handle) | ||
155 | { | ||
156 | return m_localBackend.GetScene(handle); | ||
157 | } | ||
158 | |||
159 | /** | ||
160 | * Agent-related communications | ||
161 | */ | ||
162 | |||
163 | public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason) | ||
164 | { | ||
165 | if (destination == null) | ||
166 | { | ||
167 | reason = "Given destination was null"; | ||
168 | m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent was given a null destination"); | ||
169 | return false; | ||
170 | } | ||
171 | |||
172 | // Try local first | ||
173 | if (m_localBackend.CreateAgent(destination, aCircuit, teleportFlags, out reason)) | ||
174 | return true; | ||
175 | |||
176 | // else do the remote thing | ||
177 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | ||
178 | { | ||
179 | //m_regionClient.SendUserInformation(regInfo, aCircuit); | ||
180 | return m_remoteConnector.CreateAgent(destination, aCircuit, teleportFlags, out reason); | ||
181 | } | ||
182 | return false; | ||
183 | } | ||
184 | |||
185 | public bool UpdateAgent(GridRegion destination, AgentData cAgentData) | ||
186 | { | ||
187 | if (destination == null) | ||
188 | return false; | ||
189 | |||
190 | // Try local first | ||
191 | if (m_localBackend.UpdateAgent(destination, cAgentData)) | ||
192 | return true; | ||
193 | |||
194 | // else do the remote thing | ||
195 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | ||
196 | return m_remoteConnector.UpdateAgent(destination, cAgentData); | ||
197 | |||
198 | return false; | ||
199 | |||
200 | } | ||
201 | |||
202 | public bool UpdateAgent(GridRegion destination, AgentPosition cAgentData) | ||
203 | { | ||
204 | if (destination == null) | ||
205 | return false; | ||
206 | |||
207 | // Try local first | ||
208 | if (m_localBackend.UpdateAgent(destination, cAgentData)) | ||
209 | return true; | ||
210 | |||
211 | // else do the remote thing | ||
212 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | ||
213 | return m_remoteConnector.UpdateAgent(destination, cAgentData); | ||
214 | |||
215 | return false; | ||
216 | |||
217 | } | ||
218 | |||
219 | public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent) | ||
220 | { | ||
221 | agent = null; | ||
222 | |||
223 | if (destination == null) | ||
224 | return false; | ||
225 | |||
226 | // Try local first | ||
227 | if (m_localBackend.RetrieveAgent(destination, id, out agent)) | ||
228 | return true; | ||
229 | |||
230 | // else do the remote thing | ||
231 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | ||
232 | return m_remoteConnector.RetrieveAgent(destination, id, out agent); | ||
233 | |||
234 | return false; | ||
235 | |||
236 | } | ||
237 | |||
238 | public bool ReleaseAgent(UUID origin, UUID id, string uri) | ||
239 | { | ||
240 | // Try local first | ||
241 | if (m_localBackend.ReleaseAgent(origin, id, uri)) | ||
242 | return true; | ||
243 | |||
244 | // else do the remote thing | ||
245 | if (!m_localBackend.IsLocalRegion(origin)) | ||
246 | return m_remoteConnector.ReleaseAgent(origin, id, uri); | ||
247 | |||
248 | return false; | ||
249 | } | ||
250 | |||
251 | |||
252 | public bool CloseAgent(GridRegion destination, UUID id) | ||
253 | { | ||
254 | if (destination == null) | ||
255 | return false; | ||
256 | |||
257 | // Try local first | ||
258 | if (m_localBackend.CloseAgent(destination, id)) | ||
259 | return true; | ||
260 | |||
261 | // else do the remote thing | ||
262 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | ||
263 | return m_remoteConnector.CloseAgent(destination, id); | ||
264 | |||
265 | return false; | ||
266 | } | ||
267 | |||
268 | /** | ||
269 | * Object-related communications | ||
270 | */ | ||
271 | |||
272 | public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall) | ||
273 | { | ||
274 | if (destination == null) | ||
275 | return false; | ||
276 | |||
277 | // Try local first | ||
278 | if (m_localBackend.CreateObject(destination, sog, isLocalCall)) | ||
279 | { | ||
280 | //m_log.Debug("[REST COMMS]: LocalBackEnd SendCreateObject succeeded"); | ||
281 | return true; | ||
282 | } | ||
283 | |||
284 | // else do the remote thing | ||
285 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | ||
286 | return m_remoteConnector.CreateObject(destination, sog, isLocalCall); | ||
287 | |||
288 | return false; | ||
289 | } | ||
290 | |||
291 | public bool CreateObject(GridRegion destination, UUID userID, UUID itemID) | ||
292 | { | ||
293 | // Not Implemented | ||
294 | return false; | ||
295 | } | ||
296 | |||
297 | #endregion /* IInterregionComms */ | ||
298 | |||
299 | } | ||
300 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs new file mode 100644 index 0000000..07fee79 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs | |||
@@ -0,0 +1,189 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.Region.Framework.Interfaces; | ||
34 | using OpenSim.Region.Framework.Scenes; | ||
35 | using OpenSim.Server.Base; | ||
36 | using OpenSim.Services.Interfaces; | ||
37 | |||
38 | using OpenMetaverse; | ||
39 | |||
40 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts | ||
41 | { | ||
42 | public class LocalUserAccountServicesConnector : ISharedRegionModule, IUserAccountService | ||
43 | { | ||
44 | private static readonly ILog m_log = | ||
45 | LogManager.GetLogger( | ||
46 | MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | |||
48 | private IUserAccountService m_UserService; | ||
49 | private UserAccountCache m_Cache; | ||
50 | |||
51 | private bool m_Enabled = false; | ||
52 | |||
53 | #region ISharedRegionModule | ||
54 | |||
55 | public Type ReplaceableInterface | ||
56 | { | ||
57 | get { return null; } | ||
58 | } | ||
59 | |||
60 | public string Name | ||
61 | { | ||
62 | get { return "LocalUserAccountServicesConnector"; } | ||
63 | } | ||
64 | |||
65 | public void Initialise(IConfigSource source) | ||
66 | { | ||
67 | IConfig moduleConfig = source.Configs["Modules"]; | ||
68 | if (moduleConfig != null) | ||
69 | { | ||
70 | string name = moduleConfig.GetString("UserAccountServices", ""); | ||
71 | if (name == Name) | ||
72 | { | ||
73 | IConfig userConfig = source.Configs["UserAccountService"]; | ||
74 | if (userConfig == null) | ||
75 | { | ||
76 | m_log.Error("[USER CONNECTOR]: UserAccountService missing from OpenSim.ini"); | ||
77 | return; | ||
78 | } | ||
79 | |||
80 | string serviceDll = userConfig.GetString("LocalServiceModule", | ||
81 | String.Empty); | ||
82 | |||
83 | if (serviceDll == String.Empty) | ||
84 | { | ||
85 | m_log.Error("[USER CONNECTOR]: No LocalServiceModule named in section UserService"); | ||
86 | return; | ||
87 | } | ||
88 | |||
89 | Object[] args = new Object[] { source }; | ||
90 | m_UserService = | ||
91 | ServerUtils.LoadPlugin<IUserAccountService>(serviceDll, | ||
92 | args); | ||
93 | |||
94 | if (m_UserService == null) | ||
95 | { | ||
96 | m_log.Error("[USER CONNECTOR]: Can't load user account service"); | ||
97 | return; | ||
98 | } | ||
99 | m_Enabled = true; | ||
100 | m_Cache = new UserAccountCache(); | ||
101 | |||
102 | m_log.Info("[USER CONNECTOR]: Local user connector enabled"); | ||
103 | } | ||
104 | } | ||
105 | } | ||
106 | |||
107 | public void PostInitialise() | ||
108 | { | ||
109 | if (!m_Enabled) | ||
110 | return; | ||
111 | } | ||
112 | |||
113 | public void Close() | ||
114 | { | ||
115 | if (!m_Enabled) | ||
116 | return; | ||
117 | } | ||
118 | |||
119 | public void AddRegion(Scene scene) | ||
120 | { | ||
121 | if (!m_Enabled) | ||
122 | return; | ||
123 | |||
124 | scene.RegisterModuleInterface<IUserAccountService>(m_UserService); | ||
125 | } | ||
126 | |||
127 | public void RemoveRegion(Scene scene) | ||
128 | { | ||
129 | if (!m_Enabled) | ||
130 | return; | ||
131 | } | ||
132 | |||
133 | public void RegionLoaded(Scene scene) | ||
134 | { | ||
135 | if (!m_Enabled) | ||
136 | return; | ||
137 | } | ||
138 | |||
139 | #endregion | ||
140 | |||
141 | #region IUserAccountService | ||
142 | |||
143 | public UserAccount GetUserAccount(UUID scopeID, UUID userID) | ||
144 | { | ||
145 | UserAccount account = m_Cache.Get(userID); | ||
146 | if (account != null) | ||
147 | return account; | ||
148 | |||
149 | account = m_UserService.GetUserAccount(scopeID, userID); | ||
150 | if (account != null) | ||
151 | m_Cache.Cache(account); | ||
152 | |||
153 | return account; | ||
154 | } | ||
155 | |||
156 | public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) | ||
157 | { | ||
158 | UserAccount account = m_Cache.Get(firstName + " " + lastName); | ||
159 | if (account != null) | ||
160 | return account; | ||
161 | |||
162 | account = m_UserService.GetUserAccount(scopeID, firstName, lastName); | ||
163 | if (account != null) | ||
164 | m_Cache.Cache(account); | ||
165 | |||
166 | return account; | ||
167 | } | ||
168 | |||
169 | public UserAccount GetUserAccount(UUID scopeID, string Email) | ||
170 | { | ||
171 | return m_UserService.GetUserAccount(scopeID, Email); | ||
172 | } | ||
173 | |||
174 | public List<UserAccount> GetUserAccounts(UUID scopeID, string query) | ||
175 | { | ||
176 | return m_UserService.GetUserAccounts(scopeID, query); | ||
177 | } | ||
178 | |||
179 | // Update all updatable fields | ||
180 | // | ||
181 | public bool StoreUserAccount(UserAccount data) | ||
182 | { | ||
183 | return m_UserService.StoreUserAccount(data); | ||
184 | } | ||
185 | |||
186 | #endregion | ||
187 | |||
188 | } | ||
189 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs new file mode 100644 index 0000000..13acdf2 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs | |||
@@ -0,0 +1,148 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using Nini.Config; | ||
30 | using log4net; | ||
31 | using System.Reflection; | ||
32 | using OpenSim.Region.Framework.Interfaces; | ||
33 | using OpenSim.Region.Framework.Scenes; | ||
34 | using OpenSim.Services.Interfaces; | ||
35 | using OpenSim.Services.Connectors; | ||
36 | |||
37 | using OpenMetaverse; | ||
38 | |||
39 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts | ||
40 | { | ||
41 | public class RemoteUserAccountServicesConnector : UserAccountServicesConnector, | ||
42 | ISharedRegionModule, IUserAccountService | ||
43 | { | ||
44 | private static readonly ILog m_log = | ||
45 | LogManager.GetLogger( | ||
46 | MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | |||
48 | private bool m_Enabled = false; | ||
49 | private UserAccountCache m_Cache; | ||
50 | |||
51 | public Type ReplaceableInterface | ||
52 | { | ||
53 | get { return null; } | ||
54 | } | ||
55 | |||
56 | public string Name | ||
57 | { | ||
58 | get { return "RemoteUserAccountServicesConnector"; } | ||
59 | } | ||
60 | |||
61 | public override void Initialise(IConfigSource source) | ||
62 | { | ||
63 | IConfig moduleConfig = source.Configs["Modules"]; | ||
64 | if (moduleConfig != null) | ||
65 | { | ||
66 | string name = moduleConfig.GetString("UserAccountServices", ""); | ||
67 | if (name == Name) | ||
68 | { | ||
69 | IConfig userConfig = source.Configs["UserAccountService"]; | ||
70 | if (userConfig == null) | ||
71 | { | ||
72 | m_log.Error("[USER CONNECTOR]: UserAccountService missing from OpanSim.ini"); | ||
73 | return; | ||
74 | } | ||
75 | |||
76 | m_Enabled = true; | ||
77 | |||
78 | base.Initialise(source); | ||
79 | m_Cache = new UserAccountCache(); | ||
80 | |||
81 | m_log.Info("[USER CONNECTOR]: Remote users enabled"); | ||
82 | } | ||
83 | } | ||
84 | } | ||
85 | |||
86 | public void PostInitialise() | ||
87 | { | ||
88 | if (!m_Enabled) | ||
89 | return; | ||
90 | } | ||
91 | |||
92 | public void Close() | ||
93 | { | ||
94 | if (!m_Enabled) | ||
95 | return; | ||
96 | } | ||
97 | |||
98 | public void AddRegion(Scene scene) | ||
99 | { | ||
100 | if (!m_Enabled) | ||
101 | return; | ||
102 | |||
103 | scene.RegisterModuleInterface<IUserAccountService>(this); | ||
104 | } | ||
105 | |||
106 | public void RemoveRegion(Scene scene) | ||
107 | { | ||
108 | if (!m_Enabled) | ||
109 | return; | ||
110 | } | ||
111 | |||
112 | public void RegionLoaded(Scene scene) | ||
113 | { | ||
114 | if (!m_Enabled) | ||
115 | return; | ||
116 | } | ||
117 | |||
118 | #region Overwritten methods from IUserAccountService | ||
119 | |||
120 | public override UserAccount GetUserAccount(UUID scopeID, UUID userID) | ||
121 | { | ||
122 | UserAccount account = m_Cache.Get(userID); | ||
123 | if (account != null) | ||
124 | return account; | ||
125 | |||
126 | account = base.GetUserAccount(scopeID, userID); | ||
127 | if (account != null) | ||
128 | m_Cache.Cache(account); | ||
129 | |||
130 | return account; | ||
131 | } | ||
132 | |||
133 | public override UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) | ||
134 | { | ||
135 | UserAccount account = m_Cache.Get(firstName + " " + lastName); | ||
136 | if (account != null) | ||
137 | return account; | ||
138 | |||
139 | account = base.GetUserAccount(scopeID, firstName, lastName); | ||
140 | if (account != null) | ||
141 | m_Cache.Cache(account); | ||
142 | |||
143 | return account; | ||
144 | } | ||
145 | |||
146 | #endregion | ||
147 | } | ||
148 | } | ||
diff --git a/OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs index 4b8fc26..e430fc7 100644 --- a/OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -24,49 +24,64 @@ | |||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | |||
28 | using System; | 27 | using System; |
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | 28 | using System.Reflection; |
33 | using System.Text.RegularExpressions; | 29 | using System.Collections.Generic; |
34 | using System.Xml.Serialization; | ||
35 | using log4net; | ||
36 | using Nwc.XmlRpc; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Data; | ||
39 | using OpenSim.Framework; | 30 | using OpenSim.Framework; |
40 | using OpenSim.Framework.Communications; | 31 | using OpenSim.Services.Interfaces; |
41 | using OpenSim.Framework.Communications.Clients; | 32 | using OpenMetaverse; |
42 | using OpenSim.Region.Communications.OGS1; | 33 | using log4net; |
43 | 34 | ||
44 | namespace OpenSim.Region.Communications.Hypergrid | 35 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts |
45 | { | 36 | { |
46 | public class HGUserDataPlugin : OGS1UserDataPlugin | 37 | public class UserAccountCache |
47 | { | 38 | { |
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 39 | //private static readonly ILog m_log = |
40 | // LogManager.GetLogger( | ||
41 | // MethodBase.GetCurrentMethod().DeclaringType); | ||
42 | |||
43 | private ICnmCache<UUID, UserAccount> m_UUIDCache; | ||
44 | private Dictionary<string, UUID> m_NameCache; | ||
49 | 45 | ||
50 | HGUserServices m_UserServices; | 46 | public UserAccountCache() |
51 | |||
52 | public HGUserDataPlugin() | ||
53 | { | 47 | { |
48 | // Warning: the size values are a bit fuzzy. What matters | ||
49 | // most for this cache is the count value (128 entries). | ||
50 | m_UUIDCache = CnmSynchronizedCache<UUID, UserAccount>.Synchronized(new CnmMemoryCache<UUID, UserAccount>( | ||
51 | 128, 128*512, TimeSpan.FromMinutes(30.0))); | ||
52 | m_NameCache = new Dictionary<string, UUID>(); // this one is unbound | ||
54 | } | 53 | } |
55 | 54 | ||
56 | public HGUserDataPlugin(CommunicationsManager commsManager, HGUserServices userServices) | 55 | public void Cache(UserAccount account) |
57 | { | 56 | { |
58 | m_log.DebugFormat("[HG USER SERVICES]: {0} initialized", Name); | 57 | m_UUIDCache.Set(account.PrincipalID, account, 512); |
59 | m_commsManager = commsManager; | 58 | m_NameCache[account.Name] = account.PrincipalID; |
60 | m_UserServices = userServices; | 59 | |
60 | //m_log.DebugFormat("[USER CACHE]: cached user {0} {1}", account.FirstName, account.LastName); | ||
61 | } | 61 | } |
62 | 62 | ||
63 | protected override string GetUserServerURL(UUID userID) | 63 | public UserAccount Get(UUID userID) |
64 | { | 64 | { |
65 | string url = string.Empty; | 65 | UserAccount account = null; |
66 | if (m_UserServices.IsForeignUser(userID, out url)) | 66 | if (m_UUIDCache.TryGetValue(userID, out account)) |
67 | return url; | 67 | { |
68 | return m_commsManager.NetworkServersInfo.UserURL; | 68 | //m_log.DebugFormat("[USER CACHE]: Account {0} {1} found in cache", account.FirstName, account.LastName); |
69 | return account; | ||
70 | } | ||
71 | |||
72 | return null; | ||
69 | } | 73 | } |
70 | 74 | ||
75 | public UserAccount Get(string name) | ||
76 | { | ||
77 | if (!m_NameCache.ContainsKey(name)) | ||
78 | return null; | ||
79 | |||
80 | UserAccount account = null; | ||
81 | if (m_UUIDCache.TryGetValue(m_NameCache[name], out account)) | ||
82 | return account; | ||
83 | |||
84 | return null; | ||
85 | } | ||
71 | } | 86 | } |
72 | } | 87 | } |
diff --git a/OpenSim/Region/CoreModules/World/Access/AccessModule.cs b/OpenSim/Region/CoreModules/World/Access/AccessModule.cs index e4fe352..c355b13 100644 --- a/OpenSim/Region/CoreModules/World/Access/AccessModule.cs +++ b/OpenSim/Region/CoreModules/World/Access/AccessModule.cs | |||
@@ -33,7 +33,6 @@ using Nini.Config; | |||
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Console; | 35 | using OpenSim.Framework.Console; |
36 | using OpenSim.Framework.Communications.Cache; | ||
37 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
39 | using OpenSim.Services.Interfaces; | 38 | using OpenSim.Services.Interfaces; |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 381c8f7..b1b2336f8 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs | |||
@@ -38,10 +38,11 @@ using OpenMetaverse; | |||
38 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
39 | using OpenSim.Framework.Serialization; | 39 | using OpenSim.Framework.Serialization; |
40 | using OpenSim.Framework.Serialization.External; | 40 | using OpenSim.Framework.Serialization.External; |
41 | using OpenSim.Framework.Communications.Cache; | 41 | |
42 | using OpenSim.Region.CoreModules.World.Terrain; | 42 | using OpenSim.Region.CoreModules.World.Terrain; |
43 | using OpenSim.Region.Framework.Interfaces; | 43 | using OpenSim.Region.Framework.Interfaces; |
44 | using OpenSim.Region.Framework.Scenes; | 44 | using OpenSim.Region.Framework.Scenes; |
45 | using OpenSim.Services.Interfaces; | ||
45 | 46 | ||
46 | namespace OpenSim.Region.CoreModules.World.Archiver | 47 | namespace OpenSim.Region.CoreModules.World.Archiver |
47 | { | 48 | { |
@@ -193,10 +194,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
193 | 194 | ||
194 | // Try to retain the original creator/owner/lastowner if their uuid is present on this grid | 195 | // Try to retain the original creator/owner/lastowner if their uuid is present on this grid |
195 | // otherwise, use the master avatar uuid instead | 196 | // otherwise, use the master avatar uuid instead |
196 | UUID masterAvatarId = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
197 | |||
198 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | ||
199 | masterAvatarId = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
200 | 197 | ||
201 | // Reload serialized parcels | 198 | // Reload serialized parcels |
202 | m_log.InfoFormat("[ARCHIVER]: Loading {0} parcels. Please wait.", serialisedParcels.Count); | 199 | m_log.InfoFormat("[ARCHIVER]: Loading {0} parcels. Please wait.", serialisedParcels.Count); |
@@ -205,7 +202,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
205 | { | 202 | { |
206 | LandData parcel = LandDataSerializer.Deserialize(serialisedParcel); | 203 | LandData parcel = LandDataSerializer.Deserialize(serialisedParcel); |
207 | if (!ResolveUserUuid(parcel.OwnerID)) | 204 | if (!ResolveUserUuid(parcel.OwnerID)) |
208 | parcel.OwnerID = masterAvatarId; | 205 | parcel.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
209 | landData.Add(parcel); | 206 | landData.Add(parcel); |
210 | } | 207 | } |
211 | m_scene.EventManager.TriggerIncomingLandDataFromStorage(landData); | 208 | m_scene.EventManager.TriggerIncomingLandDataFromStorage(landData); |
@@ -244,13 +241,13 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
244 | foreach (SceneObjectPart part in sceneObject.Children.Values) | 241 | foreach (SceneObjectPart part in sceneObject.Children.Values) |
245 | { | 242 | { |
246 | if (!ResolveUserUuid(part.CreatorID)) | 243 | if (!ResolveUserUuid(part.CreatorID)) |
247 | part.CreatorID = masterAvatarId; | 244 | part.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
248 | 245 | ||
249 | if (!ResolveUserUuid(part.OwnerID)) | 246 | if (!ResolveUserUuid(part.OwnerID)) |
250 | part.OwnerID = masterAvatarId; | 247 | part.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
251 | 248 | ||
252 | if (!ResolveUserUuid(part.LastOwnerID)) | 249 | if (!ResolveUserUuid(part.LastOwnerID)) |
253 | part.LastOwnerID = masterAvatarId; | 250 | part.LastOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
254 | 251 | ||
255 | // And zap any troublesome sit target information | 252 | // And zap any troublesome sit target information |
256 | part.SitTargetOrientation = new Quaternion(0, 0, 0, 1); | 253 | part.SitTargetOrientation = new Quaternion(0, 0, 0, 1); |
@@ -266,11 +263,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
266 | { | 263 | { |
267 | if (!ResolveUserUuid(kvp.Value.OwnerID)) | 264 | if (!ResolveUserUuid(kvp.Value.OwnerID)) |
268 | { | 265 | { |
269 | kvp.Value.OwnerID = masterAvatarId; | 266 | kvp.Value.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
270 | } | 267 | } |
271 | if (!ResolveUserUuid(kvp.Value.CreatorID)) | 268 | if (!ResolveUserUuid(kvp.Value.CreatorID)) |
272 | { | 269 | { |
273 | kvp.Value.CreatorID = masterAvatarId; | 270 | kvp.Value.CreatorID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
274 | } | 271 | } |
275 | } | 272 | } |
276 | } | 273 | } |
@@ -304,8 +301,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
304 | { | 301 | { |
305 | if (!m_validUserUuids.ContainsKey(uuid)) | 302 | if (!m_validUserUuids.ContainsKey(uuid)) |
306 | { | 303 | { |
307 | CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(uuid); | 304 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, uuid); |
308 | if (profile != null && profile.UserProfile != null) | 305 | if (account != null) |
309 | m_validUserUuids.Add(uuid, true); | 306 | m_validUserUuids.Add(uuid, true); |
310 | else | 307 | else |
311 | m_validUserUuids.Add(uuid, false); | 308 | m_validUserUuids.Add(uuid, false); |
@@ -350,7 +347,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
350 | 347 | ||
351 | //m_log.DebugFormat("[ARCHIVER]: Importing asset {0}, type {1}", uuid, assetType); | 348 | //m_log.DebugFormat("[ARCHIVER]: Importing asset {0}, type {1}", uuid, assetType); |
352 | 349 | ||
353 | AssetBase asset = new AssetBase(new UUID(uuid), String.Empty, assetType); | 350 | AssetBase asset = new AssetBase(new UUID(uuid), String.Empty, assetType, UUID.Zero.ToString()); |
354 | asset.Data = data; | 351 | asset.Data = data; |
355 | 352 | ||
356 | // We're relying on the asset service to do the sensible thing and not store the asset if it already | 353 | // We're relying on the asset service to do the sensible thing and not store the asset if it already |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsDearchiver.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsDearchiver.cs index 2d2c570..2c04008 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/AssetsDearchiver.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsDearchiver.cs | |||
@@ -158,7 +158,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
158 | 158 | ||
159 | m_log.DebugFormat("[ARCHIVER]: Importing asset {0}", filename); | 159 | m_log.DebugFormat("[ARCHIVER]: Importing asset {0}", filename); |
160 | 160 | ||
161 | AssetBase asset = new AssetBase(new UUID(filename), metadata.Name, metadata.AssetType); | 161 | AssetBase asset = new AssetBase(new UUID(filename), metadata.Name, metadata.AssetType, UUID.Zero.ToString()); |
162 | asset.Description = metadata.Description; | 162 | asset.Description = metadata.Description; |
163 | asset.Data = data; | 163 | asset.Data = data; |
164 | 164 | ||
diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index e77a23b..de16d89 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs | |||
@@ -34,7 +34,7 @@ using NUnit.Framework; | |||
34 | using NUnit.Framework.SyntaxHelpers; | 34 | using NUnit.Framework.SyntaxHelpers; |
35 | using OpenMetaverse; | 35 | using OpenMetaverse; |
36 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
37 | using OpenSim.Framework.Communications.Cache; | 37 | |
38 | using OpenSim.Framework.Serialization; | 38 | using OpenSim.Framework.Serialization; |
39 | using OpenSim.Framework.Serialization.External; | 39 | using OpenSim.Framework.Serialization.External; |
40 | using OpenSim.Region.CoreModules.World.Serialiser; | 40 | using OpenSim.Region.CoreModules.World.Serialiser; |
@@ -63,7 +63,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | |||
63 | SerialiserModule serialiserModule = new SerialiserModule(); | 63 | SerialiserModule serialiserModule = new SerialiserModule(); |
64 | TerrainModule terrainModule = new TerrainModule(); | 64 | TerrainModule terrainModule = new TerrainModule(); |
65 | 65 | ||
66 | m_scene = SceneSetupHelpers.SetupScene("scene1"); | 66 | m_scene = SceneSetupHelpers.SetupScene("useraccounts"); |
67 | SceneSetupHelpers.SetupSceneModules(m_scene, m_archiverModule, serialiserModule, terrainModule); | 67 | SceneSetupHelpers.SetupSceneModules(m_scene, m_archiverModule, serialiserModule, terrainModule); |
68 | } | 68 | } |
69 | 69 | ||
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 03da269..e3bab2d 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | |||
@@ -57,10 +57,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
57 | if (!m_scene.RegionInfo.EstateSettings.UseGlobalTime) | 57 | if (!m_scene.RegionInfo.EstateSettings.UseGlobalTime) |
58 | sun=(uint)(m_scene.RegionInfo.EstateSettings.SunPosition*1024.0) + 0x1800; | 58 | sun=(uint)(m_scene.RegionInfo.EstateSettings.SunPosition*1024.0) + 0x1800; |
59 | UUID estateOwner; | 59 | UUID estateOwner; |
60 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 60 | estateOwner = m_scene.RegionInfo.EstateSettings.EstateOwner; |
61 | estateOwner = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
62 | else | ||
63 | estateOwner = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
64 | 61 | ||
65 | if (m_scene.Permissions.IsGod(remote_client.AgentId)) | 62 | if (m_scene.Permissions.IsGod(remote_client.AgentId)) |
66 | estateOwner = remote_client.AgentId; | 63 | estateOwner = remote_client.AgentId; |
@@ -241,8 +238,6 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
241 | 238 | ||
242 | if (user == m_scene.RegionInfo.EstateSettings.EstateOwner) | 239 | if (user == m_scene.RegionInfo.EstateSettings.EstateOwner) |
243 | return; // never process EO | 240 | return; // never process EO |
244 | if (user == m_scene.RegionInfo.MasterAvatarAssignedUUID) | ||
245 | return; // never process owner | ||
246 | 241 | ||
247 | if ((estateAccessType & 4) != 0) // User add | 242 | if ((estateAccessType & 4) != 0) // User add |
248 | { | 243 | { |
@@ -709,16 +704,9 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
709 | lsri.TaskID = sog.UUID; | 704 | lsri.TaskID = sog.UUID; |
710 | lsri.TaskLocalID = sog.LocalId; | 705 | lsri.TaskLocalID = sog.LocalId; |
711 | lsri.TaskName = sog.GetPartName(obj); | 706 | lsri.TaskName = sog.GetPartName(obj); |
712 | if (m_scene.CommsManager.UUIDNameCachedTest(sog.OwnerID)) | 707 | lsri.OwnerName = "waiting"; |
713 | { | 708 | lock (uuidNameLookupList) |
714 | lsri.OwnerName = m_scene.CommsManager.UUIDNameRequestString(sog.OwnerID); | 709 | uuidNameLookupList.Add(sog.OwnerID); |
715 | } | ||
716 | else | ||
717 | { | ||
718 | lsri.OwnerName = "waiting"; | ||
719 | lock (uuidNameLookupList) | ||
720 | uuidNameLookupList.Add(sog.OwnerID); | ||
721 | } | ||
722 | 710 | ||
723 | if (filter.Length != 0) | 711 | if (filter.Length != 0) |
724 | { | 712 | { |
@@ -769,7 +757,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
769 | for (int i = 0; i < uuidarr.Length; i++) | 757 | for (int i = 0; i < uuidarr.Length; i++) |
770 | { | 758 | { |
771 | // string lookupname = m_scene.CommsManager.UUIDNameRequestString(uuidarr[i]); | 759 | // string lookupname = m_scene.CommsManager.UUIDNameRequestString(uuidarr[i]); |
772 | m_scene.CommsManager.UUIDNameRequestString(uuidarr[i]); | 760 | m_scene.GetUserName(uuidarr[i]); |
773 | // we drop it. It gets cached though... so we're ready for the next request. | 761 | // we drop it. It gets cached though... so we're ready for the next request. |
774 | } | 762 | } |
775 | } | 763 | } |
@@ -808,14 +796,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
808 | args.waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight; | 796 | args.waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight; |
809 | args.regionFlags = GetRegionFlags(); | 797 | args.regionFlags = GetRegionFlags(); |
810 | args.regionName = m_scene.RegionInfo.RegionName; | 798 | args.regionName = m_scene.RegionInfo.RegionName; |
811 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 799 | args.SimOwner = m_scene.RegionInfo.EstateSettings.EstateOwner; |
812 | args.SimOwner = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
813 | else | ||
814 | args.SimOwner = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
815 | |||
816 | // Fudge estate owner | ||
817 | //if (m_scene.Permissions.IsGod(remoteClient.AgentId)) | ||
818 | // args.SimOwner = remoteClient.AgentId; | ||
819 | 800 | ||
820 | args.terrainBase0 = UUID.Zero; | 801 | args.terrainBase0 = UUID.Zero; |
821 | args.terrainBase1 = UUID.Zero; | 802 | args.terrainBase1 = UUID.Zero; |
@@ -1194,8 +1175,6 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1194 | 1175 | ||
1195 | public bool IsManager(UUID avatarID) | 1176 | public bool IsManager(UUID avatarID) |
1196 | { | 1177 | { |
1197 | if (avatarID == m_scene.RegionInfo.MasterAvatarAssignedUUID) | ||
1198 | return true; | ||
1199 | if (avatarID == m_scene.RegionInfo.EstateSettings.EstateOwner) | 1178 | if (avatarID == m_scene.RegionInfo.EstateSettings.EstateOwner) |
1200 | return true; | 1179 | return true; |
1201 | 1180 | ||
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateTerrainXferHandler.cs b/OpenSim/Region/CoreModules/World/Estate/EstateTerrainXferHandler.cs index 2ff635b..b8d8b10 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateTerrainXferHandler.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateTerrainXferHandler.cs | |||
@@ -52,7 +52,7 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
52 | 52 | ||
53 | public EstateTerrainXferHandler(IClientAPI pRemoteClient, string pClientFilename) | 53 | public EstateTerrainXferHandler(IClientAPI pRemoteClient, string pClientFilename) |
54 | { | 54 | { |
55 | m_asset = new AssetBase(UUID.Zero, pClientFilename, type); | 55 | m_asset = new AssetBase(UUID.Zero, pClientFilename, type, pRemoteClient.AgentId.ToString()); |
56 | m_asset.Data = new byte[0]; | 56 | m_asset.Data = new byte[0]; |
57 | m_asset.Description = "empty"; | 57 | m_asset.Description = "empty"; |
58 | m_asset.Local = true; | 58 | m_asset.Local = true; |
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 9b39b09..f0c87f4 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -227,10 +227,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
227 | ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene); | 227 | ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene); |
228 | 228 | ||
229 | fullSimParcel.SetLandBitmap(fullSimParcel.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize)); | 229 | fullSimParcel.SetLandBitmap(fullSimParcel.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize)); |
230 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 230 | fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
231 | fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
232 | else | ||
233 | fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
234 | fullSimParcel.LandData.ClaimDate = Util.UnixTimeSinceEpoch(); | 231 | fullSimParcel.LandData.ClaimDate = Util.UnixTimeSinceEpoch(); |
235 | AddLandObject(fullSimParcel); | 232 | AddLandObject(fullSimParcel); |
236 | } | 233 | } |
@@ -1090,10 +1087,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1090 | { | 1087 | { |
1091 | if (m_scene.Permissions.CanAbandonParcel(remote_client.AgentId, land)) | 1088 | if (m_scene.Permissions.CanAbandonParcel(remote_client.AgentId, land)) |
1092 | { | 1089 | { |
1093 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 1090 | land.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
1094 | land.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
1095 | else | ||
1096 | land.LandData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
1097 | land.LandData.GroupID = UUID.Zero; | 1091 | land.LandData.GroupID = UUID.Zero; |
1098 | land.LandData.IsGroupOwned = false; | 1092 | land.LandData.IsGroupOwned = false; |
1099 | m_scene.ForEachClient(SendParcelOverlay); | 1093 | m_scene.ForEachClient(SendParcelOverlay); |
@@ -1114,10 +1108,7 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1114 | { | 1108 | { |
1115 | if (m_scene.Permissions.CanReclaimParcel(remote_client.AgentId, land)) | 1109 | if (m_scene.Permissions.CanReclaimParcel(remote_client.AgentId, land)) |
1116 | { | 1110 | { |
1117 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 1111 | land.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; |
1118 | land.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
1119 | else | ||
1120 | land.LandData.OwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
1121 | land.LandData.ClaimDate = Util.UnixTimeSinceEpoch(); | 1112 | land.LandData.ClaimDate = Util.UnixTimeSinceEpoch(); |
1122 | land.LandData.GroupID = UUID.Zero; | 1113 | land.LandData.GroupID = UUID.Zero; |
1123 | land.LandData.IsGroupOwned = false; | 1114 | land.LandData.IsGroupOwned = false; |
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 1533462..4652d70 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs | |||
@@ -32,7 +32,7 @@ using log4net; | |||
32 | using Nini.Config; | 32 | using Nini.Config; |
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Communications.Cache; | 35 | |
36 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
38 | using OpenSim.Services.Interfaces; | 38 | using OpenSim.Services.Interfaces; |
@@ -95,6 +95,23 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
95 | 95 | ||
96 | protected Scene m_scene; | 96 | protected Scene m_scene; |
97 | 97 | ||
98 | private InventoryFolderImpl m_libraryRootFolder; | ||
99 | protected InventoryFolderImpl LibraryRootFolder | ||
100 | { | ||
101 | get | ||
102 | { | ||
103 | if (m_libraryRootFolder != null) | ||
104 | return m_libraryRootFolder; | ||
105 | |||
106 | ILibraryService lib = m_scene.RequestModuleInterface<ILibraryService>(); | ||
107 | if (lib != null) | ||
108 | { | ||
109 | m_libraryRootFolder = lib.LibraryRootFolder; | ||
110 | } | ||
111 | return m_libraryRootFolder; | ||
112 | } | ||
113 | } | ||
114 | |||
98 | #region Constants | 115 | #region Constants |
99 | // These are here for testing. They will be taken out | 116 | // These are here for testing. They will be taken out |
100 | 117 | ||
@@ -462,12 +479,6 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
462 | { | 479 | { |
463 | if (user == UUID.Zero) return false; | 480 | if (user == UUID.Zero) return false; |
464 | 481 | ||
465 | if (m_scene.RegionInfo.MasterAvatarAssignedUUID != UUID.Zero) | ||
466 | { | ||
467 | if (m_RegionOwnerIsGod && (m_scene.RegionInfo.MasterAvatarAssignedUUID == user)) | ||
468 | return true; | ||
469 | } | ||
470 | |||
471 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | 482 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) |
472 | { | 483 | { |
473 | if (m_scene.RegionInfo.EstateSettings.EstateOwner == user && m_RegionOwnerIsGod) | 484 | if (m_scene.RegionInfo.EstateSettings.EstateOwner == user && m_RegionOwnerIsGod) |
@@ -479,10 +490,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
479 | 490 | ||
480 | if (m_allowGridGods) | 491 | if (m_allowGridGods) |
481 | { | 492 | { |
482 | CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(user); | 493 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, user); |
483 | if (profile != null && profile.UserProfile != null) | 494 | if (account != null) |
484 | { | 495 | { |
485 | if (profile.UserProfile.GodLevel >= 200) | 496 | if (account.UserLevel >= 200) |
486 | return true; | 497 | return true; |
487 | } | 498 | } |
488 | } | 499 | } |
@@ -499,13 +510,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
499 | if (m_friendsModule == null) | 510 | if (m_friendsModule == null) |
500 | return false; | 511 | return false; |
501 | 512 | ||
502 | List<FriendListItem> profile = m_friendsModule.GetUserFriends(user); | 513 | uint friendPerms = m_friendsModule.GetFriendPerms(user, objectOwner); |
514 | if ((friendPerms & (uint)FriendRights.CanModifyObjects) != 0) | ||
515 | return true; | ||
503 | 516 | ||
504 | foreach (FriendListItem item in profile) | ||
505 | { | ||
506 | if (item.Friend == objectOwner && (item.FriendPerms & (uint)FriendRights.CanModifyObjects) != 0) | ||
507 | return true; | ||
508 | } | ||
509 | return false; | 517 | return false; |
510 | } | 518 | } |
511 | 519 | ||
@@ -1011,9 +1019,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1011 | IInventoryService invService = m_scene.InventoryService; | 1019 | IInventoryService invService = m_scene.InventoryService; |
1012 | InventoryItemBase assetRequestItem = new InventoryItemBase(notecard, user); | 1020 | InventoryItemBase assetRequestItem = new InventoryItemBase(notecard, user); |
1013 | assetRequestItem = invService.GetItem(assetRequestItem); | 1021 | assetRequestItem = invService.GetItem(assetRequestItem); |
1014 | if (assetRequestItem == null) // Library item | 1022 | if (assetRequestItem == null && LibraryRootFolder != null) // Library item |
1015 | { | 1023 | { |
1016 | assetRequestItem = scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); | 1024 | assetRequestItem = LibraryRootFolder.FindItem(notecard); |
1017 | 1025 | ||
1018 | if (assetRequestItem != null) // Implicitly readable | 1026 | if (assetRequestItem != null) // Implicitly readable |
1019 | return true; | 1027 | return true; |
@@ -1431,9 +1439,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1431 | IInventoryService invService = m_scene.InventoryService; | 1439 | IInventoryService invService = m_scene.InventoryService; |
1432 | InventoryItemBase assetRequestItem = new InventoryItemBase(script, user); | 1440 | InventoryItemBase assetRequestItem = new InventoryItemBase(script, user); |
1433 | assetRequestItem = invService.GetItem(assetRequestItem); | 1441 | assetRequestItem = invService.GetItem(assetRequestItem); |
1434 | if (assetRequestItem == null) // Library item | 1442 | if (assetRequestItem == null && LibraryRootFolder != null) // Library item |
1435 | { | 1443 | { |
1436 | assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(script); | 1444 | assetRequestItem = LibraryRootFolder.FindItem(script); |
1437 | 1445 | ||
1438 | if (assetRequestItem != null) // Implicitly readable | 1446 | if (assetRequestItem != null) // Implicitly readable |
1439 | return true; | 1447 | return true; |
@@ -1526,9 +1534,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions | |||
1526 | IInventoryService invService = m_scene.InventoryService; | 1534 | IInventoryService invService = m_scene.InventoryService; |
1527 | InventoryItemBase assetRequestItem = new InventoryItemBase(notecard, user); | 1535 | InventoryItemBase assetRequestItem = new InventoryItemBase(notecard, user); |
1528 | assetRequestItem = invService.GetItem(assetRequestItem); | 1536 | assetRequestItem = invService.GetItem(assetRequestItem); |
1529 | if (assetRequestItem == null) // Library item | 1537 | if (assetRequestItem == null && LibraryRootFolder != null) // Library item |
1530 | { | 1538 | { |
1531 | assetRequestItem = m_scene.CommsManager.UserProfileCacheService.LibraryRoot.FindItem(notecard); | 1539 | assetRequestItem = LibraryRootFolder.FindItem(notecard); |
1532 | 1540 | ||
1533 | if (assetRequestItem != null) // Implicitly readable | 1541 | if (assetRequestItem != null) // Implicitly readable |
1534 | return true; | 1542 | return true; |
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index be46fa5..56b50dc 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs | |||
@@ -32,7 +32,6 @@ using OpenMetaverse; | |||
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Region.Framework.Interfaces; | 33 | using OpenSim.Region.Framework.Interfaces; |
34 | using OpenSim.Region.Framework.Scenes; | 34 | using OpenSim.Region.Framework.Scenes; |
35 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
36 | using OpenSim.Services.Interfaces; | 35 | using OpenSim.Services.Interfaces; |
37 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 36 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
38 | 37 | ||
@@ -104,25 +103,6 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
104 | if (info != null) regionInfos.Add(info); | 103 | if (info != null) regionInfos.Add(info); |
105 | } | 104 | } |
106 | 105 | ||
107 | if ((regionInfos.Count == 0) && IsHypergridOn()) | ||
108 | { | ||
109 | // OK, we tried but there are no regions matching that name. | ||
110 | // Let's check quickly if this is a domain name, and if so link to it | ||
111 | if (mapName.Contains(".")) | ||
112 | { | ||
113 | // It probably is a domain name. Try to link to it. | ||
114 | GridRegion regInfo; | ||
115 | Scene cScene = GetClientScene(remoteClient); | ||
116 | IHyperlinkService hyperService = cScene.RequestModuleInterface<IHyperlinkService>(); | ||
117 | if (hyperService != null) | ||
118 | { | ||
119 | regInfo = hyperService.TryLinkRegion(remoteClient, mapName); | ||
120 | if (regInfo != null) | ||
121 | regionInfos.Add(regInfo); | ||
122 | } | ||
123 | } | ||
124 | } | ||
125 | |||
126 | List<MapBlockData> blocks = new List<MapBlockData>(); | 106 | List<MapBlockData> blocks = new List<MapBlockData>(); |
127 | 107 | ||
128 | MapBlockData data; | 108 | MapBlockData data; |
@@ -158,11 +138,6 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
158 | remoteClient.SendMapBlock(blocks, 0); | 138 | remoteClient.SendMapBlock(blocks, 0); |
159 | } | 139 | } |
160 | 140 | ||
161 | private bool IsHypergridOn() | ||
162 | { | ||
163 | return (m_scene.SceneGridService is HGSceneCommunicationService); | ||
164 | } | ||
165 | |||
166 | private Scene GetClientScene(IClientAPI client) | 141 | private Scene GetClientScene(IClientAPI client) |
167 | { | 142 | { |
168 | foreach (Scene s in m_scenes) | 143 | foreach (Scene s in m_scenes) |
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 44a651f..b63d014 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | |||
@@ -1080,7 +1080,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1080 | AssetBase asset = new AssetBase( | 1080 | AssetBase asset = new AssetBase( |
1081 | m_scene.RegionInfo.RegionSettings.TerrainImageID, | 1081 | m_scene.RegionInfo.RegionSettings.TerrainImageID, |
1082 | "terrainImage_" + m_scene.RegionInfo.RegionID.ToString() + "_" + lastMapRefresh.ToString(), | 1082 | "terrainImage_" + m_scene.RegionInfo.RegionID.ToString() + "_" + lastMapRefresh.ToString(), |
1083 | (sbyte)AssetType.Texture); | 1083 | (sbyte)AssetType.Texture, |
1084 | m_scene.RegionInfo.RegionID.ToString()); | ||
1084 | asset.Data = data; | 1085 | asset.Data = data; |
1085 | asset.Description = m_scene.RegionInfo.RegionName; | 1086 | asset.Description = m_scene.RegionInfo.RegionName; |
1086 | asset.Temporary = temporary; | 1087 | asset.Temporary = temporary; |
diff --git a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs index 4df9094..6949d7c 100644 --- a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs +++ b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs | |||
@@ -101,21 +101,9 @@ namespace OpenSim.Region.DataSnapshot | |||
101 | try | 101 | try |
102 | { | 102 | { |
103 | m_enabled = config.Configs["DataSnapshot"].GetBoolean("index_sims", m_enabled); | 103 | m_enabled = config.Configs["DataSnapshot"].GetBoolean("index_sims", m_enabled); |
104 | if (config.Configs["Startup"].GetBoolean("gridmode", false)) | 104 | IConfig conf = config.Configs["GridService"]; |
105 | { | 105 | if (conf != null) |
106 | m_gridinfo.Add( | 106 | m_gridinfo.Add("gridserverURL", conf.GetString("GridServerURI", "http://127.0.0.1:8003")); |
107 | "gridserverURL", | ||
108 | config.Configs["Network"].GetString( | ||
109 | "grid_server_url", "http://127.0.0.1:" + ConfigSettings.DefaultGridServerHttpPort.ToString())); | ||
110 | m_gridinfo.Add( | ||
111 | "userserverURL", | ||
112 | config.Configs["Network"].GetString( | ||
113 | "user_server_url", "http://127.0.0.1:" + ConfigSettings.DefaultUserServerHttpPort.ToString())); | ||
114 | m_gridinfo.Add( | ||
115 | "assetserverURL", | ||
116 | config.Configs["Network"].GetString( | ||
117 | "asset_server_url", "http://127.0.0.1:" + ConfigSettings.DefaultAssetServerHttpPort.ToString())); | ||
118 | } | ||
119 | 107 | ||
120 | m_gridinfo.Add( | 108 | m_gridinfo.Add( |
121 | "Name", config.Configs["DataSnapshot"].GetString("gridname", "the lost continent of hippo")); | 109 | "Name", config.Configs["DataSnapshot"].GetString("gridname", "the lost continent of hippo")); |
diff --git a/OpenSim/Region/DataSnapshot/EstateSnapshot.cs b/OpenSim/Region/DataSnapshot/EstateSnapshot.cs index 5fff89f..8da9e8c 100644 --- a/OpenSim/Region/DataSnapshot/EstateSnapshot.cs +++ b/OpenSim/Region/DataSnapshot/EstateSnapshot.cs | |||
@@ -29,9 +29,10 @@ using System; | |||
29 | using System.Xml; | 29 | using System.Xml; |
30 | using OpenMetaverse; | 30 | using OpenMetaverse; |
31 | using OpenSim.Framework; | 31 | using OpenSim.Framework; |
32 | using OpenSim.Framework.Communications.Cache; | 32 | |
33 | using OpenSim.Region.DataSnapshot.Interfaces; | 33 | using OpenSim.Region.DataSnapshot.Interfaces; |
34 | using OpenSim.Region.Framework.Scenes; | 34 | using OpenSim.Region.Framework.Scenes; |
35 | using OpenSim.Services.Interfaces; | ||
35 | 36 | ||
36 | namespace OpenSim.Region.DataSnapshot.Providers | 37 | namespace OpenSim.Region.DataSnapshot.Providers |
37 | { | 38 | { |
@@ -55,21 +56,17 @@ namespace OpenSim.Region.DataSnapshot.Providers | |||
55 | //Now in DataSnapshotProvider module form! | 56 | //Now in DataSnapshotProvider module form! |
56 | XmlNode estatedata = factory.CreateNode(XmlNodeType.Element, "estate", ""); | 57 | XmlNode estatedata = factory.CreateNode(XmlNodeType.Element, "estate", ""); |
57 | 58 | ||
58 | UUID ownerid = m_scene.RegionInfo.MasterAvatarAssignedUUID; | 59 | UUID ownerid = m_scene.RegionInfo.EstateSettings.EstateOwner; |
59 | if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero) | ||
60 | ownerid = m_scene.RegionInfo.EstateSettings.EstateOwner; | ||
61 | |||
62 | CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(ownerid); | ||
63 | 60 | ||
61 | UserAccount userInfo = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, ownerid); | ||
64 | //TODO: Change to query userserver about the master avatar UUID ? | 62 | //TODO: Change to query userserver about the master avatar UUID ? |
65 | String firstname; | 63 | String firstname; |
66 | String lastname; | 64 | String lastname; |
67 | 65 | ||
68 | if (userInfo != null) | 66 | if (userInfo != null) |
69 | { | 67 | { |
70 | UserProfileData userProfile = userInfo.UserProfile; | 68 | firstname = userInfo.FirstName; |
71 | firstname = userProfile.FirstName; | 69 | lastname = userInfo.LastName; |
72 | lastname = userProfile.SurName; | ||
73 | 70 | ||
74 | //TODO: Fix the marshalling system to have less copypasta gruntwork | 71 | //TODO: Fix the marshalling system to have less copypasta gruntwork |
75 | XmlNode user = factory.CreateNode(XmlNodeType.Element, "user", ""); | 72 | XmlNode user = factory.CreateNode(XmlNodeType.Element, "user", ""); |
diff --git a/OpenSim/Region/DataSnapshot/LandSnapshot.cs b/OpenSim/Region/DataSnapshot/LandSnapshot.cs index 51eacef..64d29f2 100644 --- a/OpenSim/Region/DataSnapshot/LandSnapshot.cs +++ b/OpenSim/Region/DataSnapshot/LandSnapshot.cs | |||
@@ -32,11 +32,12 @@ using System.Xml; | |||
32 | using log4net; | 32 | using log4net; |
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Communications.Cache; | 35 | |
36 | using OpenSim.Region.CoreModules.World.Land; | 36 | using OpenSim.Region.CoreModules.World.Land; |
37 | using OpenSim.Region.DataSnapshot.Interfaces; | 37 | using OpenSim.Region.DataSnapshot.Interfaces; |
38 | using OpenSim.Region.Framework.Interfaces; | 38 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes; | 39 | using OpenSim.Region.Framework.Scenes; |
40 | using OpenSim.Services.Interfaces; | ||
40 | 41 | ||
41 | namespace OpenSim.Region.DataSnapshot.Providers | 42 | namespace OpenSim.Region.DataSnapshot.Providers |
42 | { | 43 | { |
@@ -258,8 +259,8 @@ namespace OpenSim.Region.DataSnapshot.Providers | |||
258 | try | 259 | try |
259 | { | 260 | { |
260 | XmlNode username = nodeFactory.CreateNode(XmlNodeType.Element, "name", ""); | 261 | XmlNode username = nodeFactory.CreateNode(XmlNodeType.Element, "name", ""); |
261 | CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userOwnerUUID); | 262 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, userOwnerUUID); |
262 | username.InnerText = profile.UserProfile.FirstName + " " + profile.UserProfile.SurName; | 263 | username.InnerText = account.FirstName + " " + account.LastName; |
263 | userblock.AppendChild(username); | 264 | userblock.AppendChild(username); |
264 | } | 265 | } |
265 | catch (Exception) | 266 | catch (Exception) |
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index ce9362f..a1957d1 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs | |||
@@ -83,7 +83,7 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
83 | public event DeRezObject OnDeRezObject; | 83 | public event DeRezObject OnDeRezObject; |
84 | public event Action<IClientAPI> OnRegionHandShakeReply; | 84 | public event Action<IClientAPI> OnRegionHandShakeReply; |
85 | public event GenericCall2 OnRequestWearables; | 85 | public event GenericCall2 OnRequestWearables; |
86 | public event GenericCall2 OnCompleteMovementToRegion; | 86 | public event GenericCall1 OnCompleteMovementToRegion; |
87 | public event UpdateAgent OnAgentUpdate; | 87 | public event UpdateAgent OnAgentUpdate; |
88 | public event AgentRequestSit OnAgentRequestSit; | 88 | public event AgentRequestSit OnAgentRequestSit; |
89 | public event AgentSit OnAgentSit; | 89 | public event AgentSit OnAgentSit; |
@@ -353,7 +353,11 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
353 | get { return true; } | 353 | get { return true; } |
354 | set { } | 354 | set { } |
355 | } | 355 | } |
356 | 356 | public bool IsLoggingOut | |
357 | { | ||
358 | get { return false; } | ||
359 | set { } | ||
360 | } | ||
357 | public UUID ActiveGroupId | 361 | public UUID ActiveGroupId |
358 | { | 362 | { |
359 | get { return UUID.Zero; } | 363 | get { return UUID.Zero; } |
@@ -655,7 +659,7 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
655 | 659 | ||
656 | if (OnCompleteMovementToRegion != null) | 660 | if (OnCompleteMovementToRegion != null) |
657 | { | 661 | { |
658 | OnCompleteMovementToRegion(); | 662 | OnCompleteMovementToRegion(this); |
659 | } | 663 | } |
660 | } | 664 | } |
661 | public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) | 665 | public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) |
@@ -1145,5 +1149,9 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
1145 | public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals) | 1149 | public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals) |
1146 | { | 1150 | { |
1147 | } | 1151 | } |
1152 | |||
1153 | public void SendChangeUserRights(UUID agentID, UUID friendID, int rights) | ||
1154 | { | ||
1155 | } | ||
1148 | } | 1156 | } |
1149 | } | 1157 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/ITeleportModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs index 5f9129d..e8738c4 100644 --- a/OpenSim/Region/Framework/Interfaces/ITeleportModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs | |||
@@ -26,16 +26,35 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using OpenSim.Services.Interfaces; |
30 | using System.Text; | 30 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
31 | |||
31 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | ||
32 | using OpenSim.Region.Framework.Scenes; | 34 | using OpenSim.Region.Framework.Scenes; |
33 | 35 | ||
34 | namespace OpenSim.Region.Framework.Interfaces | 36 | namespace OpenSim.Region.Framework.Interfaces |
35 | { | 37 | { |
36 | public interface ITeleportModule | 38 | public interface IEntityTransferModule |
37 | { | 39 | { |
38 | void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position, | 40 | void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position, |
39 | Vector3 lookAt, uint teleportFlags); | 41 | Vector3 lookAt, uint teleportFlags); |
42 | |||
43 | void TeleportHome(UUID id, IClientAPI client); | ||
44 | |||
45 | void Cross(ScenePresence agent, bool isFlying); | ||
46 | |||
47 | void AgentArrivedAtDestination(UUID agent); | ||
48 | |||
49 | void EnableChildAgents(ScenePresence agent); | ||
50 | |||
51 | void EnableChildAgent(ScenePresence agent, GridRegion region); | ||
52 | |||
53 | void Cross(SceneObjectGroup sog, Vector3 position, bool silent); | ||
54 | } | ||
55 | |||
56 | public interface IUserAgentVerificationModule | ||
57 | { | ||
58 | bool VerifyClient(AgentCircuitData aCircuit, string token); | ||
40 | } | 59 | } |
41 | } | 60 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IFriendsModule.cs b/OpenSim/Region/Framework/Interfaces/IFriendsModule.cs index 8386030..0ff7dee 100644 --- a/OpenSim/Region/Framework/Interfaces/IFriendsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IFriendsModule.cs | |||
@@ -33,19 +33,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
33 | { | 33 | { |
34 | public interface IFriendsModule | 34 | public interface IFriendsModule |
35 | { | 35 | { |
36 | /// <summary> | 36 | uint GetFriendPerms(UUID PrincipalID, UUID FriendID); |
37 | /// Offer a friendship to a user from the server end rather than by direct initiation from a client. | 37 | void SendFriendsOnlineIfNeeded(IClientAPI client); |
38 | /// </summary> | ||
39 | /// <param name="fromUserId"> | ||
40 | /// A user with this id must existing in the user data store, but need not be logged on. | ||
41 | /// </param> | ||
42 | /// <param name="toUserClient"> | ||
43 | /// An actually logged in client to which the offer is being made. | ||
44 | /// FIXME: This is somewhat too tightly coupled - it should arguably be possible to offer friendships even if the | ||
45 | /// receiving user is not currently online. | ||
46 | /// </param> | ||
47 | /// <param name="offerMessage"></param> | ||
48 | void OfferFriendship(UUID fromUserId, IClientAPI toUserClient, string offerMessage); | ||
49 | List<FriendListItem> GetUserFriends(UUID agentID); | ||
50 | } | 38 | } |
51 | } | 39 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs new file mode 100644 index 0000000..2401402 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs | |||
@@ -0,0 +1,20 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | |||
4 | using OpenSim.Framework; | ||
5 | using OpenSim.Region.Framework.Scenes; | ||
6 | |||
7 | using OpenMetaverse; | ||
8 | |||
9 | namespace OpenSim.Region.Framework.Interfaces | ||
10 | { | ||
11 | public interface IInventoryAccessModule | ||
12 | { | ||
13 | UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data); | ||
14 | UUID DeleteToInventory(DeRezAction action, UUID folderID, SceneObjectGroup objectGroup, IClientAPI remoteClient); | ||
15 | SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, | ||
16 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | ||
17 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment); | ||
18 | void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver); | ||
19 | } | ||
20 | } | ||
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs index 2d038ce..fbadd91 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.IO; | 29 | using System.IO; |
30 | using OpenSim.Framework.Communications.Cache; | 30 | using OpenSim.Services.Interfaces; |
31 | 31 | ||
32 | namespace OpenSim.Region.Framework.Interfaces | 32 | namespace OpenSim.Region.Framework.Interfaces |
33 | { | 33 | { |
@@ -41,7 +41,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
41 | /// <param name="savePath">The stream to which the archive was saved</param> | 41 | /// <param name="savePath">The stream to which the archive was saved</param> |
42 | /// <param name="reportedException">Contains the exception generated if the save did not succeed</param> | 42 | /// <param name="reportedException">Contains the exception generated if the save did not succeed</param> |
43 | public delegate void InventoryArchiveSaved( | 43 | public delegate void InventoryArchiveSaved( |
44 | Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException); | 44 | Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, Exception reportedException); |
45 | 45 | ||
46 | public interface IInventoryArchiverModule | 46 | public interface IInventoryArchiverModule |
47 | { | 47 | { |
diff --git a/OpenSim/Region/Framework/Interfaces/IPresenceModule.cs b/OpenSim/Region/Framework/Interfaces/IPresenceModule.cs index 630c6a3..d44c1e1 100644 --- a/OpenSim/Region/Framework/Interfaces/IPresenceModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IPresenceModule.cs | |||
@@ -31,13 +31,13 @@ namespace OpenSim.Region.Framework.Interfaces | |||
31 | { | 31 | { |
32 | public struct PresenceInfo | 32 | public struct PresenceInfo |
33 | { | 33 | { |
34 | public UUID userID; | 34 | public string UserID; |
35 | public UUID regionID; | 35 | public UUID RegionID; |
36 | 36 | ||
37 | public PresenceInfo(UUID userID, UUID regionID) | 37 | public PresenceInfo(string userID, UUID regionID) |
38 | { | 38 | { |
39 | this.userID = userID; | 39 | UserID = userID; |
40 | this.regionID = regionID; | 40 | RegionID = regionID; |
41 | } | 41 | } |
42 | } | 42 | } |
43 | 43 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 712dcc7..7307662 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -384,7 +384,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
384 | } | 384 | } |
385 | } | 385 | } |
386 | 386 | ||
387 | AssetBase Animasset = new AssetBase(UUID.Random(), "Random Animation", (sbyte)AssetType.Animation); | 387 | AssetBase Animasset = new AssetBase(UUID.Random(), "Random Animation", (sbyte)AssetType.Animation, m_scenePresence.UUID.ToString()); |
388 | Animasset.Data = anim.ToBytes(); | 388 | Animasset.Data = anim.ToBytes(); |
389 | Animasset.Temporary = true; | 389 | Animasset.Temporary = true; |
390 | Animasset.Local = true; | 390 | Animasset.Local = true; |
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs index 9a7863b..c08b961 100644 --- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs +++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs | |||
@@ -32,6 +32,7 @@ using System.Timers; | |||
32 | using log4net; | 32 | using log4net; |
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Region.Framework.Interfaces; | ||
35 | 36 | ||
36 | namespace OpenSim.Region.Framework.Scenes | 37 | namespace OpenSim.Region.Framework.Scenes |
37 | { | 38 | { |
@@ -137,7 +138,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
137 | 138 | ||
138 | try | 139 | try |
139 | { | 140 | { |
140 | m_scene.DeleteToInventory(x.action, x.folderID, x.objectGroup, x.remoteClient); | 141 | IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); |
142 | if (invAccess != null) | ||
143 | invAccess.DeleteToInventory(x.action, x.folderID, x.objectGroup, x.remoteClient); | ||
141 | if (x.permissionToDelete) | 144 | if (x.permissionToDelete) |
142 | m_scene.DeleteSceneObject(x.objectGroup, false); | 145 | m_scene.DeleteSceneObject(x.objectGroup, false); |
143 | } | 146 | } |
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 57e1c37..ac04462 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -66,13 +66,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
66 | public event OnClientConnectCoreDelegate OnClientConnect; | 66 | public event OnClientConnectCoreDelegate OnClientConnect; |
67 | 67 | ||
68 | public delegate void OnNewClientDelegate(IClientAPI client); | 68 | public delegate void OnNewClientDelegate(IClientAPI client); |
69 | 69 | ||
70 | /// <summary> | 70 | /// <summary> |
71 | /// Deprecated in favour of OnClientConnect. | 71 | /// Deprecated in favour of OnClientConnect. |
72 | /// Will be marked Obsolete after IClientCore has 100% of IClientAPI interfaces. | 72 | /// Will be marked Obsolete after IClientCore has 100% of IClientAPI interfaces. |
73 | /// </summary> | 73 | /// </summary> |
74 | public event OnNewClientDelegate OnNewClient; | 74 | public event OnNewClientDelegate OnNewClient; |
75 | 75 | ||
76 | public delegate void OnClientLoginDelegate(IClientAPI client); | ||
77 | public event OnClientLoginDelegate OnClientLogin; | ||
78 | |||
76 | public delegate void OnNewPresenceDelegate(ScenePresence presence); | 79 | public delegate void OnNewPresenceDelegate(ScenePresence presence); |
77 | 80 | ||
78 | public event OnNewPresenceDelegate OnNewPresence; | 81 | public event OnNewPresenceDelegate OnNewPresence; |
@@ -583,6 +586,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
583 | } | 586 | } |
584 | } | 587 | } |
585 | 588 | ||
589 | public void TriggerOnClientLogin(IClientAPI client) | ||
590 | { | ||
591 | OnClientLoginDelegate handlerClientLogin = OnClientLogin; | ||
592 | if (handlerClientLogin != null) | ||
593 | { | ||
594 | foreach (OnClientLoginDelegate d in handlerClientLogin.GetInvocationList()) | ||
595 | { | ||
596 | try | ||
597 | { | ||
598 | d(client); | ||
599 | } | ||
600 | catch (Exception e) | ||
601 | { | ||
602 | m_log.ErrorFormat( | ||
603 | "[EVENT MANAGER]: Delegate for TriggerOnClientLogin failed - continuing. {0} {1}", | ||
604 | e.Message, e.StackTrace); | ||
605 | } | ||
606 | } | ||
607 | } | ||
608 | |||
609 | } | ||
610 | |||
586 | public void TriggerOnNewPresence(ScenePresence presence) | 611 | public void TriggerOnNewPresence(ScenePresence presence) |
587 | { | 612 | { |
588 | OnNewPresenceDelegate handlerNewPresence = OnNewPresence; | 613 | OnNewPresenceDelegate handlerNewPresence = OnNewPresence; |
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs deleted file mode 100644 index ec50598..0000000 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs +++ /dev/null | |||
@@ -1,265 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using System.Threading; | ||
32 | using log4net; | ||
33 | using OpenMetaverse; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Framework.Communications.Cache; | ||
36 | using OpenSim.Framework.Communications.Clients; | ||
37 | using OpenSim.Region.Framework.Scenes.Serialization; | ||
38 | using OpenSim.Region.Framework.Interfaces; | ||
39 | using OpenSim.Services.Interfaces; | ||
40 | |||
41 | //using HyperGrid.Framework; | ||
42 | //using OpenSim.Region.Communications.Hypergrid; | ||
43 | |||
44 | namespace OpenSim.Region.Framework.Scenes.Hypergrid | ||
45 | { | ||
46 | public class HGAssetMapper | ||
47 | { | ||
48 | #region Fields | ||
49 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
50 | |||
51 | // This maps between inventory server urls and inventory server clients | ||
52 | // private Dictionary<string, InventoryClient> m_inventoryServers = new Dictionary<string, InventoryClient>(); | ||
53 | |||
54 | private Scene m_scene; | ||
55 | |||
56 | private IHyperAssetService m_hyper; | ||
57 | IHyperAssetService HyperlinkAssets | ||
58 | { | ||
59 | get | ||
60 | { | ||
61 | if (m_hyper == null) | ||
62 | m_hyper = m_scene.RequestModuleInterface<IHyperAssetService>(); | ||
63 | return m_hyper; | ||
64 | } | ||
65 | } | ||
66 | |||
67 | #endregion | ||
68 | |||
69 | #region Constructor | ||
70 | |||
71 | public HGAssetMapper(Scene scene) | ||
72 | { | ||
73 | m_scene = scene; | ||
74 | } | ||
75 | |||
76 | #endregion | ||
77 | |||
78 | #region Internal functions | ||
79 | |||
80 | // private string UserAssetURL(UUID userID) | ||
81 | // { | ||
82 | // CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID); | ||
83 | // if (uinfo != null) | ||
84 | // return (uinfo.UserProfile.UserAssetURI == "") ? null : uinfo.UserProfile.UserAssetURI; | ||
85 | // return null; | ||
86 | // } | ||
87 | |||
88 | // private string UserInventoryURL(UUID userID) | ||
89 | // { | ||
90 | // CachedUserInfo uinfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(userID); | ||
91 | // if (uinfo != null) | ||
92 | // return (uinfo.UserProfile.UserInventoryURI == "") ? null : uinfo.UserProfile.UserInventoryURI; | ||
93 | // return null; | ||
94 | // } | ||
95 | |||
96 | |||
97 | public AssetBase FetchAsset(string url, UUID assetID) | ||
98 | { | ||
99 | AssetBase asset = m_scene.AssetService.Get(url + "/" + assetID.ToString()); | ||
100 | |||
101 | if (asset != null) | ||
102 | { | ||
103 | m_log.DebugFormat("[HGScene]: Copied asset {0} from {1} to local asset server. ", asset.ID, url); | ||
104 | return asset; | ||
105 | } | ||
106 | return null; | ||
107 | } | ||
108 | |||
109 | public bool PostAsset(string url, AssetBase asset) | ||
110 | { | ||
111 | if (asset != null) | ||
112 | { | ||
113 | // See long comment in AssetCache.AddAsset | ||
114 | if (!asset.Temporary || asset.Local) | ||
115 | { | ||
116 | // We need to copy the asset into a new asset, because | ||
117 | // we need to set its ID to be URL+UUID, so that the | ||
118 | // HGAssetService dispatches it to the remote grid. | ||
119 | // It's not pretty, but the best that can be done while | ||
120 | // not having a global naming infrastructure | ||
121 | AssetBase asset1 = new AssetBase(asset.FullID, asset.Name, asset.Type); | ||
122 | Copy(asset, asset1); | ||
123 | try | ||
124 | { | ||
125 | asset1.ID = url + "/" + asset.ID; | ||
126 | } | ||
127 | catch | ||
128 | { | ||
129 | m_log.Warn("[HGScene]: Oops."); | ||
130 | } | ||
131 | |||
132 | m_scene.AssetService.Store(asset1); | ||
133 | m_log.DebugFormat("[HGScene]: Posted copy of asset {0} from local asset server to {1}", asset1.ID, url); | ||
134 | } | ||
135 | return true; | ||
136 | } | ||
137 | else | ||
138 | m_log.Warn("[HGScene]: Tried to post asset to remote server, but asset not in local cache."); | ||
139 | |||
140 | return false; | ||
141 | } | ||
142 | |||
143 | private void Copy(AssetBase from, AssetBase to) | ||
144 | { | ||
145 | to.Data = from.Data; | ||
146 | to.Description = from.Description; | ||
147 | to.FullID = from.FullID; | ||
148 | to.ID = from.ID; | ||
149 | to.Local = from.Local; | ||
150 | to.Name = from.Name; | ||
151 | to.Temporary = from.Temporary; | ||
152 | to.Type = from.Type; | ||
153 | |||
154 | } | ||
155 | |||
156 | // TODO: unused | ||
157 | // private void Dump(Dictionary<UUID, bool> lst) | ||
158 | // { | ||
159 | // m_log.Debug("XXX -------- UUID DUMP ------- XXX"); | ||
160 | // foreach (KeyValuePair<UUID, bool> kvp in lst) | ||
161 | // m_log.Debug(" >> " + kvp.Key + " (texture? " + kvp.Value + ")"); | ||
162 | // m_log.Debug("XXX -------- UUID DUMP ------- XXX"); | ||
163 | // } | ||
164 | |||
165 | #endregion | ||
166 | |||
167 | |||
168 | #region Public interface | ||
169 | |||
170 | public void Get(UUID assetID, UUID ownerID) | ||
171 | { | ||
172 | // Get the item from the remote asset server onto the local AssetCache | ||
173 | // and place an entry in m_assetMap | ||
174 | |||
175 | string userAssetURL = HyperlinkAssets.GetUserAssetServer(ownerID); | ||
176 | if ((userAssetURL != string.Empty) && (userAssetURL != HyperlinkAssets.GetSimAssetServer())) | ||
177 | { | ||
178 | m_log.Debug("[HGScene]: Fetching object " + assetID + " from asset server " + userAssetURL); | ||
179 | AssetBase asset = FetchAsset(userAssetURL, assetID); | ||
180 | |||
181 | if (asset != null) | ||
182 | { | ||
183 | // OK, now fetch the inside. | ||
184 | Dictionary<UUID, int> ids = new Dictionary<UUID, int>(); | ||
185 | HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, userAssetURL); | ||
186 | uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids); | ||
187 | foreach (UUID uuid in ids.Keys) | ||
188 | FetchAsset(userAssetURL, uuid); | ||
189 | |||
190 | m_log.DebugFormat("[HGScene]: Successfully fetched asset {0} from asset server {1}", asset.ID, userAssetURL); | ||
191 | |||
192 | } | ||
193 | else | ||
194 | m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL); | ||
195 | } | ||
196 | else | ||
197 | m_log.Debug("[HGScene]: user's asset server is the local region's asset server"); | ||
198 | } | ||
199 | |||
200 | //public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo) | ||
201 | //{ | ||
202 | // InventoryClient invCli = null; | ||
203 | // string inventoryURL = UserInventoryURL(item.Owner); | ||
204 | // if (!m_inventoryServers.TryGetValue(inventoryURL, out invCli)) | ||
205 | // { | ||
206 | // m_log.Debug("[HGScene]: Starting new InventorytClient for " + inventoryURL); | ||
207 | // invCli = new InventoryClient(inventoryURL); | ||
208 | // m_inventoryServers.Add(inventoryURL, invCli); | ||
209 | // } | ||
210 | |||
211 | // item = invCli.GetInventoryItem(item); | ||
212 | // if (item != null) | ||
213 | // { | ||
214 | // // Change the folder, stick it in root folder, all items flattened out here in this region cache | ||
215 | // item.Folder = rootFolder; | ||
216 | // //userInfo.AddItem(item); don't use this, it calls back to the inventory server | ||
217 | // lock (userInfo.RootFolder.Items) | ||
218 | // { | ||
219 | // userInfo.RootFolder.Items[item.ID] = item; | ||
220 | // } | ||
221 | |||
222 | // } | ||
223 | // return item; | ||
224 | //} | ||
225 | |||
226 | public void Post(UUID assetID, UUID ownerID) | ||
227 | { | ||
228 | // Post the item from the local AssetCache onto the remote asset server | ||
229 | // and place an entry in m_assetMap | ||
230 | |||
231 | string userAssetURL = HyperlinkAssets.GetUserAssetServer(ownerID); | ||
232 | if ((userAssetURL != string.Empty) && (userAssetURL != HyperlinkAssets.GetSimAssetServer())) | ||
233 | { | ||
234 | m_log.Debug("[HGScene]: Posting object " + assetID + " to asset server " + userAssetURL); | ||
235 | AssetBase asset = m_scene.AssetService.Get(assetID.ToString()); | ||
236 | if (asset != null) | ||
237 | { | ||
238 | Dictionary<UUID, int> ids = new Dictionary<UUID, int>(); | ||
239 | HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, string.Empty); | ||
240 | uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids); | ||
241 | foreach (UUID uuid in ids.Keys) | ||
242 | { | ||
243 | asset = m_scene.AssetService.Get(uuid.ToString()); | ||
244 | if (asset == null) | ||
245 | m_log.DebugFormat("[HGScene]: Could not find asset {0}", uuid); | ||
246 | else | ||
247 | PostAsset(userAssetURL, asset); | ||
248 | } | ||
249 | |||
250 | // maybe all pieces got there... | ||
251 | m_log.DebugFormat("[HGScene]: Successfully posted item {0} to asset server {1}", assetID, userAssetURL); | ||
252 | |||
253 | } | ||
254 | else | ||
255 | m_log.DebugFormat("[HGScene]: Something wrong with asset {0}, it could not be found", assetID); | ||
256 | } | ||
257 | else | ||
258 | m_log.Debug("[HGScene]: user's asset server is local region's asset server"); | ||
259 | |||
260 | } | ||
261 | |||
262 | #endregion | ||
263 | |||
264 | } | ||
265 | } | ||
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.cs deleted file mode 100644 index b1981b6..0000000 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.cs +++ /dev/null | |||
@@ -1,77 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using OpenMetaverse; | ||
29 | using OpenSim.Framework; | ||
30 | using OpenSim.Framework.Communications.Cache; | ||
31 | using TPFlags = OpenSim.Framework.Constants.TeleportFlags; | ||
32 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
33 | |||
34 | namespace OpenSim.Region.Framework.Scenes.Hypergrid | ||
35 | { | ||
36 | public partial class HGScene : Scene | ||
37 | { | ||
38 | /// <summary> | ||
39 | /// Teleport an avatar to their home region | ||
40 | /// </summary> | ||
41 | /// <param name="agentId"></param> | ||
42 | /// <param name="client"></param> | ||
43 | public override void TeleportClientHome(UUID agentId, IClientAPI client) | ||
44 | { | ||
45 | m_log.Debug("[HGScene]: TeleportClientHome " + client.FirstName + " " + client.LastName); | ||
46 | |||
47 | CachedUserInfo uinfo = CommsManager.UserProfileCacheService.GetUserDetails(agentId); | ||
48 | if (uinfo != null) | ||
49 | { | ||
50 | UserProfileData UserProfile = uinfo.UserProfile; | ||
51 | |||
52 | if (UserProfile != null) | ||
53 | { | ||
54 | GridRegion regionInfo = GridService.GetRegionByUUID(UUID.Zero, UserProfile.HomeRegionID); | ||
55 | //if (regionInfo != null) | ||
56 | //{ | ||
57 | // UserProfile.HomeRegionID = regionInfo.RegionID; | ||
58 | // //CommsManager.UserService.UpdateUserProfile(UserProfile); | ||
59 | //} | ||
60 | if (regionInfo == null) | ||
61 | { | ||
62 | // can't find the Home region: Tell viewer and abort | ||
63 | client.SendTeleportFailed("Your home-region could not be found."); | ||
64 | return; | ||
65 | } | ||
66 | RequestTeleportLocation( | ||
67 | client, regionInfo.RegionHandle, UserProfile.HomeLocation, UserProfile.HomeLookAt, | ||
68 | (uint)(TPFlags.SetLastToTarget | TPFlags.ViaHome)); | ||
69 | } | ||
70 | } | ||
71 | else | ||
72 | client.SendTeleportFailed("Sorry! I lost your home-region information."); | ||
73 | |||
74 | } | ||
75 | |||
76 | } | ||
77 | } | ||
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs deleted file mode 100644 index 416826c..0000000 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs +++ /dev/null | |||
@@ -1,391 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Net; | ||
31 | using System.Reflection; | ||
32 | using System.Threading; | ||
33 | using log4net; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Framework.Client; | ||
37 | using OpenSim.Framework.Communications; | ||
38 | using OpenSim.Framework.Communications.Cache; | ||
39 | using OpenSim.Framework.Capabilities; | ||
40 | using OpenSim.Region.Framework.Interfaces; | ||
41 | using OpenSim.Services.Interfaces; | ||
42 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
43 | |||
44 | namespace OpenSim.Region.Framework.Scenes.Hypergrid | ||
45 | { | ||
46 | public class HGSceneCommunicationService : SceneCommunicationService | ||
47 | { | ||
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
49 | |||
50 | private IHyperlinkService m_hg; | ||
51 | IHyperlinkService HyperlinkService | ||
52 | { | ||
53 | get | ||
54 | { | ||
55 | if (m_hg == null) | ||
56 | m_hg = m_scene.RequestModuleInterface<IHyperlinkService>(); | ||
57 | return m_hg; | ||
58 | } | ||
59 | } | ||
60 | |||
61 | public HGSceneCommunicationService(CommunicationsManager commsMan) : base(commsMan) | ||
62 | { | ||
63 | } | ||
64 | |||
65 | |||
66 | /// <summary> | ||
67 | /// Try to teleport an agent to a new region. | ||
68 | /// </summary> | ||
69 | /// <param name="remoteClient"></param> | ||
70 | /// <param name="RegionHandle"></param> | ||
71 | /// <param name="position"></param> | ||
72 | /// <param name="lookAt"></param> | ||
73 | /// <param name="flags"></param> | ||
74 | public override void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position, | ||
75 | Vector3 lookAt, uint teleportFlags) | ||
76 | { | ||
77 | if (!avatar.Scene.Permissions.CanTeleport(avatar.UUID)) | ||
78 | return; | ||
79 | |||
80 | bool destRegionUp = true; | ||
81 | |||
82 | IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>(); | ||
83 | |||
84 | // Reset animations; the viewer does that in teleports. | ||
85 | avatar.Animator.ResetAnimations(); | ||
86 | |||
87 | if (regionHandle == m_regionInfo.RegionHandle) | ||
88 | { | ||
89 | // Teleport within the same region | ||
90 | if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0) | ||
91 | { | ||
92 | Vector3 emergencyPos = new Vector3(128, 128, 128); | ||
93 | |||
94 | m_log.WarnFormat( | ||
95 | "[HGSceneCommService]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", | ||
96 | position, avatar.Name, avatar.UUID, emergencyPos); | ||
97 | position = emergencyPos; | ||
98 | } | ||
99 | // TODO: Get proper AVG Height | ||
100 | float localAVHeight = 1.56f; | ||
101 | |||
102 | float posZLimit = 22; | ||
103 | |||
104 | if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <= (int)Constants.RegionSize) | ||
105 | { | ||
106 | posZLimit = (float) avatar.Scene.Heightmap[(int) position.X, (int) position.Y]; | ||
107 | } | ||
108 | |||
109 | float newPosZ = posZLimit + localAVHeight; | ||
110 | if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) | ||
111 | { | ||
112 | position.Z = newPosZ; | ||
113 | } | ||
114 | |||
115 | // Only send this if the event queue is null | ||
116 | if (eq == null) | ||
117 | avatar.ControllingClient.SendTeleportLocationStart(); | ||
118 | |||
119 | |||
120 | avatar.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); | ||
121 | avatar.Teleport(position); | ||
122 | } | ||
123 | else | ||
124 | { | ||
125 | uint x = 0, y = 0; | ||
126 | Utils.LongToUInts(regionHandle, out x, out y); | ||
127 | GridRegion reg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); | ||
128 | |||
129 | if (reg != null) | ||
130 | { | ||
131 | |||
132 | uint newRegionX = (uint)(reg.RegionHandle >> 40); | ||
133 | uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); | ||
134 | uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40); | ||
135 | uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8); | ||
136 | |||
137 | /// | ||
138 | /// Hypergrid mod start | ||
139 | /// | ||
140 | /// | ||
141 | bool isHyperLink = (HyperlinkService.GetHyperlinkRegion(reg.RegionHandle) != null); | ||
142 | bool isHomeUser = true; | ||
143 | ulong realHandle = regionHandle; | ||
144 | CachedUserInfo uinfo = m_commsProvider.UserProfileCacheService.GetUserDetails(avatar.UUID); | ||
145 | if (uinfo != null) | ||
146 | { | ||
147 | isHomeUser = HyperlinkService.IsLocalUser(uinfo.UserProfile.ID); | ||
148 | realHandle = m_hg.FindRegionHandle(regionHandle); | ||
149 | m_log.Debug("XXX ---- home user? " + isHomeUser + " --- hyperlink? " + isHyperLink + " --- real handle: " + realHandle.ToString()); | ||
150 | } | ||
151 | /// | ||
152 | /// Hypergrid mod stop | ||
153 | /// | ||
154 | /// | ||
155 | |||
156 | if (eq == null) | ||
157 | avatar.ControllingClient.SendTeleportLocationStart(); | ||
158 | |||
159 | |||
160 | // Let's do DNS resolution only once in this process, please! | ||
161 | // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, | ||
162 | // it's actually doing a lot of work. | ||
163 | IPEndPoint endPoint = reg.ExternalEndPoint; | ||
164 | if (endPoint.Address == null) | ||
165 | { | ||
166 | // Couldn't resolve the name. Can't TP, because the viewer wants IP addresses. | ||
167 | destRegionUp = false; | ||
168 | } | ||
169 | |||
170 | if (destRegionUp) | ||
171 | { | ||
172 | // Fixing a bug where teleporting while sitting results in the avatar ending up removed from | ||
173 | // both regions | ||
174 | if (avatar.ParentID != (uint)0) | ||
175 | avatar.StandUp(); | ||
176 | |||
177 | if (!avatar.ValidateAttachments()) | ||
178 | { | ||
179 | avatar.ControllingClient.SendTeleportFailed("Inconsistent attachment state"); | ||
180 | return; | ||
181 | } | ||
182 | |||
183 | // the avatar.Close below will clear the child region list. We need this below for (possibly) | ||
184 | // closing the child agents, so save it here (we need a copy as it is Clear()-ed). | ||
185 | //List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList()); | ||
186 | // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport | ||
187 | // failure at this point (unlike a border crossing failure). So perhaps this can never fail | ||
188 | // once we reach here... | ||
189 | //avatar.Scene.RemoveCapsHandler(avatar.UUID); | ||
190 | |||
191 | string capsPath = String.Empty; | ||
192 | AgentCircuitData agentCircuit = avatar.ControllingClient.RequestClientInfo(); | ||
193 | agentCircuit.BaseFolder = UUID.Zero; | ||
194 | agentCircuit.InventoryFolder = UUID.Zero; | ||
195 | agentCircuit.startpos = position; | ||
196 | agentCircuit.child = true; | ||
197 | if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
198 | { | ||
199 | // brand new agent, let's create a new caps seed | ||
200 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
201 | } | ||
202 | |||
203 | string reason = String.Empty; | ||
204 | |||
205 | //if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agentCircuit)) | ||
206 | if (!m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, agentCircuit, teleportFlags, out reason)) | ||
207 | { | ||
208 | avatar.ControllingClient.SendTeleportFailed(String.Format("Destination is not accepting teleports: {0}", | ||
209 | reason)); | ||
210 | return; | ||
211 | } | ||
212 | |||
213 | // Let's close some agents | ||
214 | if (isHyperLink) // close them all except this one | ||
215 | { | ||
216 | List<ulong> regions = new List<ulong>(avatar.KnownChildRegionHandles); | ||
217 | regions.Remove(avatar.Scene.RegionInfo.RegionHandle); | ||
218 | SendCloseChildAgentConnections(avatar.UUID, regions); | ||
219 | } | ||
220 | else // close just a few | ||
221 | avatar.CloseChildAgents(newRegionX, newRegionY); | ||
222 | |||
223 | if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY) || isHyperLink) | ||
224 | { | ||
225 | capsPath | ||
226 | = "http://" | ||
227 | + reg.ExternalHostName | ||
228 | + ":" | ||
229 | + reg.HttpPort | ||
230 | + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
231 | |||
232 | if (eq != null) | ||
233 | { | ||
234 | #region IP Translation for NAT | ||
235 | IClientIPEndpoint ipepClient; | ||
236 | if (avatar.ClientView.TryGet(out ipepClient)) | ||
237 | { | ||
238 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
239 | } | ||
240 | #endregion | ||
241 | |||
242 | eq.EnableSimulator(realHandle, endPoint, avatar.UUID); | ||
243 | |||
244 | // ES makes the client send a UseCircuitCode message to the destination, | ||
245 | // which triggers a bunch of things there. | ||
246 | // So let's wait | ||
247 | Thread.Sleep(2000); | ||
248 | |||
249 | eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); | ||
250 | } | ||
251 | else | ||
252 | { | ||
253 | avatar.ControllingClient.InformClientOfNeighbour(realHandle, endPoint); | ||
254 | // TODO: make Event Queue disablable! | ||
255 | } | ||
256 | } | ||
257 | else | ||
258 | { | ||
259 | // child agent already there | ||
260 | agentCircuit.CapsPath = avatar.Scene.CapsModule.GetChildSeed(avatar.UUID, reg.RegionHandle); | ||
261 | capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort | ||
262 | + "/CAPS/" + agentCircuit.CapsPath + "0000/"; | ||
263 | } | ||
264 | |||
265 | //m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, | ||
266 | // position, false); | ||
267 | |||
268 | //if (!m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, | ||
269 | // position, false)) | ||
270 | //{ | ||
271 | // avatar.ControllingClient.SendTeleportFailed("Problem with destination."); | ||
272 | // // We should close that agent we just created over at destination... | ||
273 | // List<ulong> lst = new List<ulong>(); | ||
274 | // lst.Add(realHandle); | ||
275 | // SendCloseChildAgentAsync(avatar.UUID, lst); | ||
276 | // return; | ||
277 | //} | ||
278 | |||
279 | SetInTransit(avatar.UUID); | ||
280 | // Let's send a full update of the agent. This is a synchronous call. | ||
281 | AgentData agent = new AgentData(); | ||
282 | avatar.CopyTo(agent); | ||
283 | agent.Position = position; | ||
284 | agent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort + | ||
285 | "/agent/" + avatar.UUID.ToString() + "/" + avatar.Scene.RegionInfo.RegionHandle.ToString() + "/release/"; | ||
286 | |||
287 | m_interregionCommsOut.SendChildAgentUpdate(reg.RegionHandle, agent); | ||
288 | |||
289 | m_log.DebugFormat( | ||
290 | "[CAPS]: Sending new CAPS seed url {0} to client {1}", agentCircuit.CapsPath, avatar.UUID); | ||
291 | |||
292 | |||
293 | /// | ||
294 | /// Hypergrid mod: realHandle instead of reg.RegionHandle | ||
295 | /// | ||
296 | /// | ||
297 | if (eq != null) | ||
298 | { | ||
299 | eq.TeleportFinishEvent(realHandle, 13, endPoint, | ||
300 | 4, teleportFlags, capsPath, avatar.UUID); | ||
301 | } | ||
302 | else | ||
303 | { | ||
304 | avatar.ControllingClient.SendRegionTeleport(realHandle, 13, endPoint, 4, | ||
305 | teleportFlags, capsPath); | ||
306 | } | ||
307 | /// | ||
308 | /// Hypergrid mod stop | ||
309 | /// | ||
310 | |||
311 | |||
312 | // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which | ||
313 | // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation | ||
314 | // that the client contacted the destination before we send the attachments and close things here. | ||
315 | if (!WaitForCallback(avatar.UUID)) | ||
316 | { | ||
317 | // Client never contacted destination. Let's restore everything back | ||
318 | avatar.ControllingClient.SendTeleportFailed("Problems connecting to destination."); | ||
319 | |||
320 | ResetFromTransit(avatar.UUID); | ||
321 | // Yikes! We should just have a ref to scene here. | ||
322 | avatar.Scene.InformClientOfNeighbours(avatar); | ||
323 | |||
324 | // Finally, kill the agent we just created at the destination. | ||
325 | m_interregionCommsOut.SendCloseAgent(reg.RegionHandle, avatar.UUID); | ||
326 | |||
327 | return; | ||
328 | } | ||
329 | |||
330 | // Can't go back from here | ||
331 | if (KiPrimitive != null) | ||
332 | { | ||
333 | KiPrimitive(avatar.LocalId); | ||
334 | } | ||
335 | |||
336 | avatar.MakeChildAgent(); | ||
337 | |||
338 | // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it | ||
339 | avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true); | ||
340 | |||
341 | |||
342 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | ||
343 | /// | ||
344 | /// Hypergrid mod: extra check for isHyperLink | ||
345 | /// | ||
346 | if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY) || isHyperLink) | ||
347 | { | ||
348 | Thread.Sleep(5000); | ||
349 | avatar.Close(); | ||
350 | CloseConnection(avatar.UUID); | ||
351 | } | ||
352 | // if (teleport success) // seems to be always success here | ||
353 | // the user may change their profile information in other region, | ||
354 | // so the userinfo in UserProfileCache is not reliable any more, delete it | ||
355 | if (avatar.Scene.NeedSceneCacheClear(avatar.UUID) || isHyperLink) | ||
356 | { | ||
357 | m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID); | ||
358 | m_log.DebugFormat( | ||
359 | "[HGSceneCommService]: User {0} is going to another region, profile cache removed", | ||
360 | avatar.UUID); | ||
361 | } | ||
362 | } | ||
363 | else | ||
364 | { | ||
365 | avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); | ||
366 | } | ||
367 | } | ||
368 | else | ||
369 | { | ||
370 | // TP to a place that doesn't exist (anymore) | ||
371 | // Inform the viewer about that | ||
372 | avatar.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); | ||
373 | |||
374 | // and set the map-tile to '(Offline)' | ||
375 | uint regX, regY; | ||
376 | Utils.LongToUInts(regionHandle, out regX, out regY); | ||
377 | |||
378 | MapBlockData block = new MapBlockData(); | ||
379 | block.X = (ushort)(regX / Constants.RegionSize); | ||
380 | block.Y = (ushort)(regY / Constants.RegionSize); | ||
381 | block.Access = 254; // == not there | ||
382 | |||
383 | List<MapBlockData> blocks = new List<MapBlockData>(); | ||
384 | blocks.Add(block); | ||
385 | avatar.ControllingClient.SendMapBlock(blocks, 0); | ||
386 | } | ||
387 | } | ||
388 | } | ||
389 | |||
390 | } | ||
391 | } | ||
diff --git a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs index e9660b1..d25d5dd 100644 --- a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs +++ b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs | |||
@@ -36,8 +36,7 @@ using OpenMetaverse; | |||
36 | using OpenMetaverse.StructuredData; | 36 | using OpenMetaverse.StructuredData; |
37 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | using OpenSim.Framework.Communications; | 38 | using OpenSim.Framework.Communications; |
39 | using OpenSim.Framework.Communications.Services; | 39 | |
40 | using OpenSim.Framework.Communications.Cache; | ||
41 | using OpenSim.Framework.Console; | 40 | using OpenSim.Framework.Console; |
42 | using OpenSim.Framework.Servers; | 41 | using OpenSim.Framework.Servers; |
43 | using OpenSim.Framework.Servers.HttpServer; | 42 | using OpenSim.Framework.Servers.HttpServer; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index c6cee75..6df25d6 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -35,7 +35,7 @@ using OpenMetaverse; | |||
35 | using OpenMetaverse.Packets; | 35 | using OpenMetaverse.Packets; |
36 | using log4net; | 36 | using log4net; |
37 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | using OpenSim.Framework.Communications.Cache; | 38 | |
39 | using OpenSim.Region.Framework; | 39 | using OpenSim.Region.Framework; |
40 | using OpenSim.Region.Framework.Interfaces; | 40 | using OpenSim.Region.Framework.Interfaces; |
41 | using OpenSim.Region.Framework.Scenes.Serialization; | 41 | using OpenSim.Region.Framework.Scenes.Serialization; |
@@ -101,12 +101,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
101 | { | 101 | { |
102 | userlevel = 1; | 102 | userlevel = 1; |
103 | } | 103 | } |
104 | // TODO: remove this cruft once MasterAvatar is fully deprecated | ||
105 | // | ||
106 | if (m_regInfo.MasterAvatarAssignedUUID == AgentID) | ||
107 | { | ||
108 | userlevel = 2; | ||
109 | } | ||
110 | EventManager.TriggerOnNewInventoryItemUploadComplete(AgentID, item.AssetID, item.Name, userlevel); | 104 | EventManager.TriggerOnNewInventoryItemUploadComplete(AgentID, item.AssetID, item.Name, userlevel); |
111 | } | 105 | } |
112 | else | 106 | else |
@@ -132,61 +126,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
132 | } | 126 | } |
133 | 127 | ||
134 | /// <summary> | 128 | /// <summary> |
135 | /// Capability originating call to update the asset of an item in an agent's inventory | ||
136 | /// </summary> | ||
137 | /// <param name="remoteClient"></param> | ||
138 | /// <param name="itemID"></param> | ||
139 | /// <param name="data"></param> | ||
140 | /// <returns></returns> | ||
141 | public virtual UUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, UUID itemID, byte[] data) | ||
142 | { | ||
143 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
144 | item = InventoryService.GetItem(item); | ||
145 | |||
146 | if (item != null) | ||
147 | { | ||
148 | if ((InventoryType)item.InvType == InventoryType.Notecard) | ||
149 | { | ||
150 | if (!Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId)) | ||
151 | { | ||
152 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false); | ||
153 | return UUID.Zero; | ||
154 | } | ||
155 | |||
156 | remoteClient.SendAgentAlertMessage("Notecard saved", false); | ||
157 | } | ||
158 | else if ((InventoryType)item.InvType == InventoryType.LSL) | ||
159 | { | ||
160 | if (!Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId)) | ||
161 | { | ||
162 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false); | ||
163 | return UUID.Zero; | ||
164 | } | ||
165 | |||
166 | remoteClient.SendAgentAlertMessage("Script saved", false); | ||
167 | } | ||
168 | |||
169 | AssetBase asset = | ||
170 | CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data); | ||
171 | item.AssetID = asset.FullID; | ||
172 | AssetService.Store(asset); | ||
173 | |||
174 | InventoryService.UpdateItem(item); | ||
175 | |||
176 | // remoteClient.SendInventoryItemCreateUpdate(item); | ||
177 | return (asset.FullID); | ||
178 | } | ||
179 | else | ||
180 | { | ||
181 | m_log.ErrorFormat( | ||
182 | "[AGENT INVENTORY]: Could not find item {0} for caps inventory update", | ||
183 | itemID); | ||
184 | } | ||
185 | |||
186 | return UUID.Zero; | ||
187 | } | ||
188 | |||
189 | /// <summary> | ||
190 | /// <see>CapsUpdatedInventoryItemAsset(IClientAPI, UUID, byte[])</see> | 129 | /// <see>CapsUpdatedInventoryItemAsset(IClientAPI, UUID, byte[])</see> |
191 | /// </summary> | 130 | /// </summary> |
192 | public UUID CapsUpdateInventoryItemAsset(UUID avatarId, UUID itemID, byte[] data) | 131 | public UUID CapsUpdateInventoryItemAsset(UUID avatarId, UUID itemID, byte[] data) |
@@ -195,7 +134,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
195 | 134 | ||
196 | if (TryGetAvatar(avatarId, out avatar)) | 135 | if (TryGetAvatar(avatarId, out avatar)) |
197 | { | 136 | { |
198 | return CapsUpdateInventoryItemAsset(avatar.ControllingClient, itemID, data); | 137 | IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>(); |
138 | if (invAccess != null) | ||
139 | return invAccess.CapsUpdateInventoryItemAsset(avatar.ControllingClient, itemID, data); | ||
199 | } | 140 | } |
200 | else | 141 | else |
201 | { | 142 | { |
@@ -251,7 +192,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
251 | return new ArrayList(); | 192 | return new ArrayList(); |
252 | } | 193 | } |
253 | 194 | ||
254 | AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data); | 195 | AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data, remoteClient.AgentId); |
255 | AssetService.Store(asset); | 196 | AssetService.Store(asset); |
256 | 197 | ||
257 | if (isScriptRunning) | 198 | if (isScriptRunning) |
@@ -478,7 +419,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
478 | itemCopy.SaleType = item.SaleType; | 419 | itemCopy.SaleType = item.SaleType; |
479 | 420 | ||
480 | if (InventoryService.AddItem(itemCopy)) | 421 | if (InventoryService.AddItem(itemCopy)) |
481 | TransferInventoryAssets(itemCopy, senderId, recipient); | 422 | { |
423 | IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>(); | ||
424 | if (invAccess != null) | ||
425 | invAccess.TransferInventoryAssets(itemCopy, senderId, recipient); | ||
426 | } | ||
482 | 427 | ||
483 | if (!Permissions.BypassPermissions()) | 428 | if (!Permissions.BypassPermissions()) |
484 | { | 429 | { |
@@ -500,10 +445,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
500 | 445 | ||
501 | } | 446 | } |
502 | 447 | ||
503 | protected virtual void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) | ||
504 | { | ||
505 | } | ||
506 | |||
507 | /// <summary> | 448 | /// <summary> |
508 | /// Give an entire inventory folder from one user to another. The entire contents (including all descendent | 449 | /// Give an entire inventory folder from one user to another. The entire contents (including all descendent |
509 | /// folders) is given. | 450 | /// folders) is given. |
@@ -573,7 +514,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
573 | "[AGENT INVENTORY]: CopyInventoryItem received by {0} with oldAgentID {1}, oldItemID {2}, new FolderID {3}, newName {4}", | 514 | "[AGENT INVENTORY]: CopyInventoryItem received by {0} with oldAgentID {1}, oldItemID {2}, new FolderID {3}, newName {4}", |
574 | remoteClient.AgentId, oldAgentID, oldItemID, newFolderID, newName); | 515 | remoteClient.AgentId, oldAgentID, oldItemID, newFolderID, newName); |
575 | 516 | ||
576 | InventoryItemBase item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(oldItemID); | 517 | InventoryItemBase item = null; |
518 | if (LibraryService != null && LibraryService.LibraryRootFolder != null) | ||
519 | item = LibraryService.LibraryRootFolder.FindItem(oldItemID); | ||
577 | 520 | ||
578 | if (item == null) | 521 | if (item == null) |
579 | { | 522 | { |
@@ -627,15 +570,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
627 | /// <summary> | 570 | /// <summary> |
628 | /// Create a new asset data structure. | 571 | /// Create a new asset data structure. |
629 | /// </summary> | 572 | /// </summary> |
630 | /// <param name="name"></param> | 573 | private AssetBase CreateAsset(string name, string description, sbyte assetType, byte[] data, UUID creatorID) |
631 | /// <param name="description"></param> | ||
632 | /// <param name="invType"></param> | ||
633 | /// <param name="assetType"></param> | ||
634 | /// <param name="data"></param> | ||
635 | /// <returns></returns> | ||
636 | private AssetBase CreateAsset(string name, string description, sbyte assetType, byte[] data) | ||
637 | { | 574 | { |
638 | AssetBase asset = new AssetBase(UUID.Random(), name, assetType); | 575 | AssetBase asset = new AssetBase(UUID.Random(), name, assetType, creatorID.ToString()); |
639 | asset.Description = description; | 576 | asset.Description = description; |
640 | asset.Data = (data == null) ? new byte[1] : data; | 577 | asset.Data = (data == null) ? new byte[1] : data; |
641 | 578 | ||
@@ -745,13 +682,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
745 | 682 | ||
746 | if (transactionID == UUID.Zero) | 683 | if (transactionID == UUID.Zero) |
747 | { | 684 | { |
748 | CachedUserInfo userInfo | 685 | ScenePresence presence; |
749 | = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); | 686 | if (TryGetAvatar(remoteClient.AgentId, out presence)) |
750 | |||
751 | if (userInfo != null) | ||
752 | { | 687 | { |
753 | ScenePresence presence; | ||
754 | TryGetAvatar(remoteClient.AgentId, out presence); | ||
755 | byte[] data = null; | 688 | byte[] data = null; |
756 | 689 | ||
757 | if (invType == (sbyte)InventoryType.Landmark && presence != null) | 690 | if (invType == (sbyte)InventoryType.Landmark && presence != null) |
@@ -765,7 +698,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
765 | data = Encoding.ASCII.GetBytes(strdata); | 698 | data = Encoding.ASCII.GetBytes(strdata); |
766 | } | 699 | } |
767 | 700 | ||
768 | AssetBase asset = CreateAsset(name, description, assetType, data); | 701 | AssetBase asset = CreateAsset(name, description, assetType, data, remoteClient.AgentId); |
769 | AssetService.Store(asset); | 702 | AssetService.Store(asset); |
770 | 703 | ||
771 | CreateNewInventoryItem(remoteClient, remoteClient.AgentId.ToString(), folderID, asset.Name, 0, callbackID, asset, invType, nextOwnerMask, creationDate); | 704 | CreateNewInventoryItem(remoteClient, remoteClient.AgentId.ToString(), folderID, asset.Name, 0, callbackID, asset, invType, nextOwnerMask, creationDate); |
@@ -773,7 +706,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
773 | else | 706 | else |
774 | { | 707 | { |
775 | m_log.ErrorFormat( | 708 | m_log.ErrorFormat( |
776 | "userInfo for agent uuid {0} unexpectedly null in CreateNewInventoryItem", | 709 | "ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", |
777 | remoteClient.AgentId); | 710 | remoteClient.AgentId); |
778 | } | 711 | } |
779 | } | 712 | } |
@@ -1166,15 +1099,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
1166 | 1099 | ||
1167 | private void SendInventoryUpdate(IClientAPI client, InventoryFolderBase folder, bool fetchFolders, bool fetchItems) | 1100 | private void SendInventoryUpdate(IClientAPI client, InventoryFolderBase folder, bool fetchFolders, bool fetchItems) |
1168 | { | 1101 | { |
1102 | if (folder == null) | ||
1103 | return; | ||
1104 | |||
1169 | m_log.DebugFormat("[AGENT INVENTORY]: Send Inventory Folder {0} Update to {1} {2}", folder.Name, client.FirstName, client.LastName); | 1105 | m_log.DebugFormat("[AGENT INVENTORY]: Send Inventory Folder {0} Update to {1} {2}", folder.Name, client.FirstName, client.LastName); |
1170 | InventoryCollection contents = InventoryService.GetFolderContent(client.AgentId, folder.ID); | 1106 | InventoryCollection contents = InventoryService.GetFolderContent(client.AgentId, folder.ID); |
1171 | InventoryFolderBase containingFolder = new InventoryFolderBase(); | 1107 | InventoryFolderBase containingFolder = new InventoryFolderBase(); |
1172 | containingFolder.ID = folder.ID; | 1108 | containingFolder.ID = folder.ID; |
1173 | containingFolder.Owner = client.AgentId; | 1109 | containingFolder.Owner = client.AgentId; |
1174 | containingFolder = InventoryService.GetFolder(containingFolder); | 1110 | containingFolder = InventoryService.GetFolder(containingFolder); |
1175 | int version = containingFolder.Version; | 1111 | if (containingFolder != null) |
1112 | { | ||
1113 | int version = containingFolder.Version; | ||
1176 | 1114 | ||
1177 | client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, version, fetchFolders, fetchItems); | 1115 | client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, version, fetchFolders, fetchItems); |
1116 | } | ||
1178 | } | 1117 | } |
1179 | 1118 | ||
1180 | /// <summary> | 1119 | /// <summary> |
@@ -1216,9 +1155,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1216 | item = InventoryService.GetItem(item); | 1155 | item = InventoryService.GetItem(item); |
1217 | 1156 | ||
1218 | // Try library | 1157 | // Try library |
1219 | if (null == item) | 1158 | if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null) |
1220 | { | 1159 | { |
1221 | item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); | 1160 | item = LibraryService.LibraryRootFolder.FindItem(itemID); |
1222 | } | 1161 | } |
1223 | 1162 | ||
1224 | if (item != null) | 1163 | if (item != null) |
@@ -1285,9 +1224,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1285 | 1224 | ||
1286 | // Try library | 1225 | // Try library |
1287 | // XXX clumsy, possibly should be one call | 1226 | // XXX clumsy, possibly should be one call |
1288 | if (null == item) | 1227 | if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null) |
1289 | { | 1228 | { |
1290 | item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); | 1229 | item = LibraryService.LibraryRootFolder.FindItem(itemID); |
1291 | } | 1230 | } |
1292 | 1231 | ||
1293 | if (item != null) | 1232 | if (item != null) |
@@ -1344,7 +1283,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1344 | itemBase.InvType, part.UUID, remoteClient.AgentId)) | 1283 | itemBase.InvType, part.UUID, remoteClient.AgentId)) |
1345 | return; | 1284 | return; |
1346 | 1285 | ||
1347 | AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}")); | 1286 | AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, |
1287 | Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}"), | ||
1288 | remoteClient.AgentId); | ||
1348 | AssetService.Store(asset); | 1289 | AssetService.Store(asset); |
1349 | 1290 | ||
1350 | TaskInventoryItem taskItem = new TaskInventoryItem(); | 1291 | TaskInventoryItem taskItem = new TaskInventoryItem(); |
@@ -1612,232 +1553,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1612 | } | 1553 | } |
1613 | } | 1554 | } |
1614 | 1555 | ||
1615 | /// <summary> | ||
1616 | /// Delete a scene object from a scene and place in the given avatar's inventory. | ||
1617 | /// Returns the UUID of the newly created asset. | ||
1618 | /// </summary> | ||
1619 | /// <param name="action"></param> | ||
1620 | /// <param name="folderID"></param> | ||
1621 | /// <param name="objectGroup"></param> | ||
1622 | /// <param name="remoteClient"> </param> | ||
1623 | public virtual UUID DeleteToInventory(DeRezAction action, UUID folderID, | ||
1624 | SceneObjectGroup objectGroup, IClientAPI remoteClient) | ||
1625 | { | ||
1626 | UUID assetID = UUID.Zero; | ||
1627 | |||
1628 | Vector3 inventoryStoredPosition = new Vector3 | ||
1629 | (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) | ||
1630 | ? 250 | ||
1631 | : objectGroup.AbsolutePosition.X) | ||
1632 | , | ||
1633 | (objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) | ||
1634 | ? 250 | ||
1635 | : objectGroup.AbsolutePosition.X, | ||
1636 | objectGroup.AbsolutePosition.Z); | ||
1637 | |||
1638 | Vector3 originalPosition = objectGroup.AbsolutePosition; | ||
1639 | |||
1640 | objectGroup.AbsolutePosition = inventoryStoredPosition; | ||
1641 | |||
1642 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(objectGroup); | ||
1643 | |||
1644 | objectGroup.AbsolutePosition = originalPosition; | ||
1645 | |||
1646 | // Get the user info of the item destination | ||
1647 | // | ||
1648 | UUID userID = UUID.Zero; | ||
1649 | |||
1650 | if (action == DeRezAction.Take || action == DeRezAction.TakeCopy || | ||
1651 | action == DeRezAction.SaveToExistingUserInventoryItem) | ||
1652 | { | ||
1653 | // Take or take copy require a taker | ||
1654 | // Saving changes requires a local user | ||
1655 | // | ||
1656 | if (remoteClient == null) | ||
1657 | return UUID.Zero; | ||
1658 | |||
1659 | userID = remoteClient.AgentId; | ||
1660 | } | ||
1661 | else | ||
1662 | { | ||
1663 | // All returns / deletes go to the object owner | ||
1664 | // | ||
1665 | |||
1666 | userID = objectGroup.RootPart.OwnerID; | ||
1667 | } | ||
1668 | |||
1669 | if (userID == UUID.Zero) // Can't proceed | ||
1670 | { | ||
1671 | return UUID.Zero; | ||
1672 | } | ||
1673 | |||
1674 | // If we're returning someone's item, it goes back to the | ||
1675 | // owner's Lost And Found folder. | ||
1676 | // Delete is treated like return in this case | ||
1677 | // Deleting your own items makes them go to trash | ||
1678 | // | ||
1679 | |||
1680 | InventoryFolderBase folder = null; | ||
1681 | InventoryItemBase item = null; | ||
1682 | |||
1683 | if (DeRezAction.SaveToExistingUserInventoryItem == action) | ||
1684 | { | ||
1685 | item = new InventoryItemBase(objectGroup.RootPart.FromUserInventoryItemID, userID); | ||
1686 | item = InventoryService.GetItem(item); | ||
1687 | |||
1688 | //item = userInfo.RootFolder.FindItem( | ||
1689 | // objectGroup.RootPart.FromUserInventoryItemID); | ||
1690 | |||
1691 | if (null == item) | ||
1692 | { | ||
1693 | m_log.DebugFormat( | ||
1694 | "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.", | ||
1695 | objectGroup.Name, objectGroup.UUID); | ||
1696 | return UUID.Zero; | ||
1697 | } | ||
1698 | } | ||
1699 | else | ||
1700 | { | ||
1701 | // Folder magic | ||
1702 | // | ||
1703 | if (action == DeRezAction.Delete) | ||
1704 | { | ||
1705 | // Deleting someone else's item | ||
1706 | // | ||
1707 | |||
1708 | |||
1709 | if (remoteClient == null || | ||
1710 | objectGroup.OwnerID != remoteClient.AgentId) | ||
1711 | { | ||
1712 | // Folder skeleton may not be loaded and we | ||
1713 | // have to wait for the inventory to find | ||
1714 | // the destination folder | ||
1715 | // | ||
1716 | folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); | ||
1717 | } | ||
1718 | else | ||
1719 | { | ||
1720 | // Assume inventory skeleton was loaded during login | ||
1721 | // and all folders can be found | ||
1722 | // | ||
1723 | folder = InventoryService.GetFolderForType(userID, AssetType.TrashFolder); | ||
1724 | } | ||
1725 | } | ||
1726 | else if (action == DeRezAction.Return) | ||
1727 | { | ||
1728 | |||
1729 | // Dump to lost + found unconditionally | ||
1730 | // | ||
1731 | folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); | ||
1732 | } | ||
1733 | |||
1734 | if (folderID == UUID.Zero && folder == null) | ||
1735 | { | ||
1736 | if (action == DeRezAction.Delete) | ||
1737 | { | ||
1738 | // Deletes go to trash by default | ||
1739 | // | ||
1740 | folder = InventoryService.GetFolderForType(userID, AssetType.TrashFolder); | ||
1741 | } | ||
1742 | else | ||
1743 | { | ||
1744 | // Catch all. Use lost & found | ||
1745 | // | ||
1746 | |||
1747 | folder = InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); | ||
1748 | } | ||
1749 | } | ||
1750 | |||
1751 | if (folder == null) // None of the above | ||
1752 | { | ||
1753 | //folder = userInfo.RootFolder.FindFolder(folderID); | ||
1754 | folder = new InventoryFolderBase(folderID); | ||
1755 | |||
1756 | if (folder == null) // Nowhere to put it | ||
1757 | { | ||
1758 | return UUID.Zero; | ||
1759 | } | ||
1760 | } | ||
1761 | |||
1762 | item = new InventoryItemBase(); | ||
1763 | item.CreatorId = objectGroup.RootPart.CreatorID.ToString(); | ||
1764 | item.ID = UUID.Random(); | ||
1765 | item.InvType = (int)InventoryType.Object; | ||
1766 | item.Folder = folder.ID; | ||
1767 | item.Owner = userID; | ||
1768 | } | ||
1769 | |||
1770 | AssetBase asset = CreateAsset( | ||
1771 | objectGroup.GetPartName(objectGroup.RootPart.LocalId), | ||
1772 | objectGroup.GetPartDescription(objectGroup.RootPart.LocalId), | ||
1773 | (sbyte)AssetType.Object, | ||
1774 | Utils.StringToBytes(sceneObjectXml)); | ||
1775 | AssetService.Store(asset); | ||
1776 | assetID = asset.FullID; | ||
1777 | |||
1778 | if (DeRezAction.SaveToExistingUserInventoryItem == action) | ||
1779 | { | ||
1780 | item.AssetID = asset.FullID; | ||
1781 | InventoryService.UpdateItem(item); | ||
1782 | } | ||
1783 | else | ||
1784 | { | ||
1785 | item.AssetID = asset.FullID; | ||
1786 | |||
1787 | if (remoteClient != null && (remoteClient.AgentId != objectGroup.RootPart.OwnerID) && Permissions.PropagatePermissions()) | ||
1788 | { | ||
1789 | uint perms=objectGroup.GetEffectivePermissions(); | ||
1790 | uint nextPerms=(perms & 7) << 13; | ||
1791 | if ((nextPerms & (uint)PermissionMask.Copy) == 0) | ||
1792 | perms &= ~(uint)PermissionMask.Copy; | ||
1793 | if ((nextPerms & (uint)PermissionMask.Transfer) == 0) | ||
1794 | perms &= ~(uint)PermissionMask.Transfer; | ||
1795 | if ((nextPerms & (uint)PermissionMask.Modify) == 0) | ||
1796 | perms &= ~(uint)PermissionMask.Modify; | ||
1797 | |||
1798 | item.BasePermissions = perms & objectGroup.RootPart.NextOwnerMask; | ||
1799 | item.CurrentPermissions = item.BasePermissions; | ||
1800 | item.NextPermissions = objectGroup.RootPart.NextOwnerMask; | ||
1801 | item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; | ||
1802 | item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask; | ||
1803 | item.CurrentPermissions |= 8; // Slam! | ||
1804 | } | ||
1805 | else | ||
1806 | { | ||
1807 | item.BasePermissions = objectGroup.GetEffectivePermissions(); | ||
1808 | item.CurrentPermissions = objectGroup.GetEffectivePermissions(); | ||
1809 | item.NextPermissions = objectGroup.RootPart.NextOwnerMask; | ||
1810 | item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; | ||
1811 | item.GroupPermissions = objectGroup.RootPart.GroupMask; | ||
1812 | |||
1813 | item.CurrentPermissions |= 8; // Slam! | ||
1814 | } | ||
1815 | |||
1816 | // TODO: add the new fields (Flags, Sale info, etc) | ||
1817 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
1818 | item.Description = asset.Description; | ||
1819 | item.Name = asset.Name; | ||
1820 | item.AssetType = asset.Type; | ||
1821 | |||
1822 | InventoryService.AddItem(item); | ||
1823 | |||
1824 | if (remoteClient != null && item.Owner == remoteClient.AgentId) | ||
1825 | { | ||
1826 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | ||
1827 | } | ||
1828 | else | ||
1829 | { | ||
1830 | ScenePresence notifyUser = GetScenePresence(item.Owner); | ||
1831 | if (notifyUser != null) | ||
1832 | { | ||
1833 | notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0); | ||
1834 | } | ||
1835 | } | ||
1836 | } | ||
1837 | |||
1838 | return assetID; | ||
1839 | } | ||
1840 | |||
1841 | public void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID) | 1556 | public void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp, UUID itemID, UUID agentID) |
1842 | { | 1557 | { |
1843 | SceneObjectGroup objectGroup = grp; | 1558 | SceneObjectGroup objectGroup = grp; |
@@ -1864,7 +1579,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1864 | objectGroup.GetPartName(objectGroup.LocalId), | 1579 | objectGroup.GetPartName(objectGroup.LocalId), |
1865 | objectGroup.GetPartDescription(objectGroup.LocalId), | 1580 | objectGroup.GetPartDescription(objectGroup.LocalId), |
1866 | (sbyte)AssetType.Object, | 1581 | (sbyte)AssetType.Object, |
1867 | Utils.StringToBytes(sceneObjectXml)); | 1582 | Utils.StringToBytes(sceneObjectXml), |
1583 | remoteClient.AgentId); | ||
1868 | AssetService.Store(asset); | 1584 | AssetService.Store(asset); |
1869 | 1585 | ||
1870 | item.AssetID = asset.FullID; | 1586 | item.AssetID = asset.FullID; |
@@ -1911,7 +1627,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1911 | grp.GetPartName(grp.LocalId), | 1627 | grp.GetPartName(grp.LocalId), |
1912 | grp.GetPartDescription(grp.LocalId), | 1628 | grp.GetPartDescription(grp.LocalId), |
1913 | (sbyte)AssetType.Object, | 1629 | (sbyte)AssetType.Object, |
1914 | Utils.StringToBytes(sceneObjectXml)); | 1630 | Utils.StringToBytes(sceneObjectXml), |
1631 | remoteClient.AgentId); | ||
1915 | AssetService.Store(asset); | 1632 | AssetService.Store(asset); |
1916 | 1633 | ||
1917 | InventoryItemBase item = new InventoryItemBase(); | 1634 | InventoryItemBase item = new InventoryItemBase(); |
@@ -1978,225 +1695,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1978 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | 1695 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, |
1979 | bool RezSelected, bool RemoveItem, UUID fromTaskID) | 1696 | bool RezSelected, bool RemoveItem, UUID fromTaskID) |
1980 | { | 1697 | { |
1981 | RezObject( | 1698 | IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>(); |
1982 | remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, | 1699 | if (invAccess != null) |
1983 | RezSelected, RemoveItem, fromTaskID, false); | 1700 | invAccess.RezObject( |
1984 | } | 1701 | remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, |
1985 | 1702 | RezSelected, RemoveItem, fromTaskID, false); | |
1986 | /// <summary> | ||
1987 | /// Rez an object into the scene from the user's inventory | ||
1988 | /// </summary> | ||
1989 | /// <param name="remoteClient"></param> | ||
1990 | /// <param name="itemID"></param> | ||
1991 | /// <param name="RayEnd"></param> | ||
1992 | /// <param name="RayStart"></param> | ||
1993 | /// <param name="RayTargetID"></param> | ||
1994 | /// <param name="BypassRayCast"></param> | ||
1995 | /// <param name="RayEndIsIntersection"></param> | ||
1996 | /// <param name="RezSelected"></param> | ||
1997 | /// <param name="RemoveItem"></param> | ||
1998 | /// <param name="fromTaskID"></param> | ||
1999 | /// <param name="attachment"></param> | ||
2000 | /// <returns>The SceneObjectGroup rezzed or null if rez was unsuccessful.</returns> | ||
2001 | public virtual SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, | ||
2002 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | ||
2003 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) | ||
2004 | { | ||
2005 | // Work out position details | ||
2006 | byte bRayEndIsIntersection = (byte)0; | ||
2007 | |||
2008 | if (RayEndIsIntersection) | ||
2009 | { | ||
2010 | bRayEndIsIntersection = (byte)1; | ||
2011 | } | ||
2012 | else | ||
2013 | { | ||
2014 | bRayEndIsIntersection = (byte)0; | ||
2015 | } | ||
2016 | |||
2017 | Vector3 scale = new Vector3(0.5f, 0.5f, 0.5f); | ||
2018 | |||
2019 | |||
2020 | Vector3 pos = GetNewRezLocation( | ||
2021 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | ||
2022 | BypassRayCast, bRayEndIsIntersection,true,scale, false); | ||
2023 | |||
2024 | // Rez object | ||
2025 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
2026 | item = InventoryService.GetItem(item); | ||
2027 | |||
2028 | if (item != null) | ||
2029 | { | ||
2030 | AssetBase rezAsset = AssetService.Get(item.AssetID.ToString()); | ||
2031 | |||
2032 | if (rezAsset != null) | ||
2033 | { | ||
2034 | UUID itemId = UUID.Zero; | ||
2035 | |||
2036 | // If we have permission to copy then link the rezzed object back to the user inventory | ||
2037 | // item that it came from. This allows us to enable 'save object to inventory' | ||
2038 | if (!Permissions.BypassPermissions()) | ||
2039 | { | ||
2040 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == (uint)PermissionMask.Copy) | ||
2041 | { | ||
2042 | itemId = item.ID; | ||
2043 | } | ||
2044 | } | ||
2045 | else | ||
2046 | { | ||
2047 | // Brave new fullperm world | ||
2048 | // | ||
2049 | itemId = item.ID; | ||
2050 | } | ||
2051 | |||
2052 | string xmlData = Utils.BytesToString(rezAsset.Data); | ||
2053 | SceneObjectGroup group | ||
2054 | = SceneObjectSerializer.FromOriginalXmlFormat(itemId, xmlData); | ||
2055 | |||
2056 | if (!Permissions.CanRezObject( | ||
2057 | group.Children.Count, remoteClient.AgentId, pos) | ||
2058 | && !attachment) | ||
2059 | { | ||
2060 | // The client operates in no fail mode. It will | ||
2061 | // have already removed the item from the folder | ||
2062 | // if it's no copy. | ||
2063 | // Put it back if it's not an attachment | ||
2064 | // | ||
2065 | if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment)) | ||
2066 | remoteClient.SendBulkUpdateInventory(item); | ||
2067 | return null; | ||
2068 | } | ||
2069 | |||
2070 | group.ResetIDs(); | ||
2071 | |||
2072 | if (attachment) | ||
2073 | { | ||
2074 | group.RootPart.ObjectFlags |= (uint)PrimFlags.Phantom; | ||
2075 | group.RootPart.IsAttachment = true; | ||
2076 | } | ||
2077 | |||
2078 | AddNewSceneObject(group, true); | ||
2079 | |||
2080 | // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); | ||
2081 | // if attachment we set it's asset id so object updates can reflect that | ||
2082 | // if not, we set it's position in world. | ||
2083 | if (!attachment) | ||
2084 | { | ||
2085 | float offsetHeight = 0; | ||
2086 | pos = GetNewRezLocation( | ||
2087 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | ||
2088 | BypassRayCast, bRayEndIsIntersection, true, group.GetAxisAlignedBoundingBox(out offsetHeight), false); | ||
2089 | pos.Z += offsetHeight; | ||
2090 | group.AbsolutePosition = pos; | ||
2091 | // m_log.InfoFormat("rezx point for inventory rezz is {0} {1} {2} and offsetheight was {3}", pos.X, pos.Y, pos.Z, offsetHeight); | ||
2092 | |||
2093 | } | ||
2094 | else | ||
2095 | { | ||
2096 | group.SetFromItemID(itemID); | ||
2097 | } | ||
2098 | |||
2099 | SceneObjectPart rootPart = null; | ||
2100 | try | ||
2101 | { | ||
2102 | rootPart = group.GetChildPart(group.UUID); | ||
2103 | } | ||
2104 | catch (NullReferenceException) | ||
2105 | { | ||
2106 | string isAttachment = ""; | ||
2107 | |||
2108 | if (attachment) | ||
2109 | isAttachment = " Object was an attachment"; | ||
2110 | |||
2111 | m_log.Error("[AGENT INVENTORY]: Error rezzing ItemID: " + itemID + " object has no rootpart." + isAttachment); | ||
2112 | } | ||
2113 | |||
2114 | // Since renaming the item in the inventory does not affect the name stored | ||
2115 | // in the serialization, transfer the correct name from the inventory to the | ||
2116 | // object itself before we rez. | ||
2117 | rootPart.Name = item.Name; | ||
2118 | rootPart.Description = item.Description; | ||
2119 | |||
2120 | List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values); | ||
2121 | |||
2122 | group.SetGroup(remoteClient.ActiveGroupId, remoteClient); | ||
2123 | if (rootPart.OwnerID != item.Owner) | ||
2124 | { | ||
2125 | //Need to kill the for sale here | ||
2126 | rootPart.ObjectSaleType = 0; | ||
2127 | rootPart.SalePrice = 10; | ||
2128 | |||
2129 | if (Permissions.PropagatePermissions()) | ||
2130 | { | ||
2131 | if ((item.CurrentPermissions & 8) != 0) | ||
2132 | { | ||
2133 | foreach (SceneObjectPart part in partList) | ||
2134 | { | ||
2135 | part.EveryoneMask = item.EveryOnePermissions; | ||
2136 | part.NextOwnerMask = item.NextPermissions; | ||
2137 | part.GroupMask = 0; // DO NOT propagate here | ||
2138 | } | ||
2139 | } | ||
2140 | group.ApplyNextOwnerPermissions(); | ||
2141 | } | ||
2142 | } | ||
2143 | |||
2144 | foreach (SceneObjectPart part in partList) | ||
2145 | { | ||
2146 | if (part.OwnerID != item.Owner) | ||
2147 | { | ||
2148 | part.LastOwnerID = part.OwnerID; | ||
2149 | part.OwnerID = item.Owner; | ||
2150 | part.Inventory.ChangeInventoryOwner(item.Owner); | ||
2151 | } | ||
2152 | else if (((item.CurrentPermissions & 8) != 0) && (!attachment)) // Slam! | ||
2153 | { | ||
2154 | part.EveryoneMask = item.EveryOnePermissions; | ||
2155 | part.NextOwnerMask = item.NextPermissions; | ||
2156 | |||
2157 | part.GroupMask = 0; // DO NOT propagate here | ||
2158 | } | ||
2159 | } | ||
2160 | |||
2161 | rootPart.TrimPermissions(); | ||
2162 | |||
2163 | if (!attachment) | ||
2164 | { | ||
2165 | if (group.RootPart.Shape.PCode == (byte)PCode.Prim) | ||
2166 | { | ||
2167 | group.ClearPartAttachmentData(); | ||
2168 | } | ||
2169 | } | ||
2170 | |||
2171 | if (!attachment) | ||
2172 | { | ||
2173 | // Fire on_rez | ||
2174 | group.CreateScriptInstances(0, true, DefaultScriptEngine, 0); | ||
2175 | |||
2176 | rootPart.ScheduleFullUpdate(); | ||
2177 | } | ||
2178 | |||
2179 | if (!Permissions.BypassPermissions()) | ||
2180 | { | ||
2181 | if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) | ||
2182 | { | ||
2183 | // If this is done on attachments, no | ||
2184 | // copy ones will be lost, so avoid it | ||
2185 | // | ||
2186 | if (!attachment) | ||
2187 | { | ||
2188 | List<UUID> uuids = new List<UUID>(); | ||
2189 | uuids.Add(item.ID); | ||
2190 | InventoryService.DeleteItems(item.Owner, uuids); | ||
2191 | } | ||
2192 | } | ||
2193 | } | ||
2194 | |||
2195 | return rootPart.ParentGroup; | ||
2196 | } | ||
2197 | } | ||
2198 | |||
2199 | return null; | ||
2200 | } | 1703 | } |
2201 | 1704 | ||
2202 | /// <summary> | 1705 | /// <summary> |
@@ -2420,7 +1923,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2420 | // XXYY!! | 1923 | // XXYY!! |
2421 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | 1924 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); |
2422 | item = InventoryService.GetItem(item); | 1925 | item = InventoryService.GetItem(item); |
2423 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); | 1926 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); |
2424 | 1927 | ||
2425 | if (m_AvatarFactory != null) | 1928 | if (m_AvatarFactory != null) |
2426 | { | 1929 | { |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index ac04dc7..bc10230 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -32,7 +32,7 @@ using OpenMetaverse; | |||
32 | using OpenMetaverse.Packets; | 32 | using OpenMetaverse.Packets; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications; | 34 | using OpenSim.Framework.Communications; |
35 | using OpenSim.Framework.Communications.Cache; | 35 | using OpenSim.Services.Interfaces; |
36 | 36 | ||
37 | namespace OpenSim.Region.Framework.Scenes | 37 | namespace OpenSim.Region.Framework.Scenes |
38 | { | 38 | { |
@@ -371,14 +371,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
371 | { | 371 | { |
372 | //EventManager.TriggerAvatarPickerRequest(); | 372 | //EventManager.TriggerAvatarPickerRequest(); |
373 | 373 | ||
374 | List<AvatarPickerAvatar> AvatarResponses = new List<AvatarPickerAvatar>(); | 374 | List<UserAccount> accounts = UserAccountService.GetUserAccounts(RegionInfo.ScopeID, query); |
375 | AvatarResponses = m_sceneGridService.GenerateAgentPickerRequestResponse(RequestID, query); | 375 | |
376 | if (accounts == null) | ||
377 | return; | ||
376 | 378 | ||
377 | AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply); | 379 | AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply); |
378 | // TODO: don't create new blocks if recycling an old packet | 380 | // TODO: don't create new blocks if recycling an old packet |
379 | 381 | ||
380 | AvatarPickerReplyPacket.DataBlock[] searchData = | 382 | AvatarPickerReplyPacket.DataBlock[] searchData = |
381 | new AvatarPickerReplyPacket.DataBlock[AvatarResponses.Count]; | 383 | new AvatarPickerReplyPacket.DataBlock[accounts.Count]; |
382 | AvatarPickerReplyPacket.AgentDataBlock agentData = new AvatarPickerReplyPacket.AgentDataBlock(); | 384 | AvatarPickerReplyPacket.AgentDataBlock agentData = new AvatarPickerReplyPacket.AgentDataBlock(); |
383 | 385 | ||
384 | agentData.AgentID = avatarID; | 386 | agentData.AgentID = avatarID; |
@@ -387,16 +389,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
387 | //byte[] bytes = new byte[AvatarResponses.Count*32]; | 389 | //byte[] bytes = new byte[AvatarResponses.Count*32]; |
388 | 390 | ||
389 | int i = 0; | 391 | int i = 0; |
390 | foreach (AvatarPickerAvatar item in AvatarResponses) | 392 | foreach (UserAccount item in accounts) |
391 | { | 393 | { |
392 | UUID translatedIDtem = item.AvatarID; | 394 | UUID translatedIDtem = item.PrincipalID; |
393 | searchData[i] = new AvatarPickerReplyPacket.DataBlock(); | 395 | searchData[i] = new AvatarPickerReplyPacket.DataBlock(); |
394 | searchData[i].AvatarID = translatedIDtem; | 396 | searchData[i].AvatarID = translatedIDtem; |
395 | searchData[i].FirstName = Utils.StringToBytes((string) item.firstName); | 397 | searchData[i].FirstName = Utils.StringToBytes((string) item.FirstName); |
396 | searchData[i].LastName = Utils.StringToBytes((string) item.lastName); | 398 | searchData[i].LastName = Utils.StringToBytes((string) item.LastName); |
397 | i++; | 399 | i++; |
398 | } | 400 | } |
399 | if (AvatarResponses.Count == 0) | 401 | if (accounts.Count == 0) |
400 | { | 402 | { |
401 | searchData = new AvatarPickerReplyPacket.DataBlock[0]; | 403 | searchData = new AvatarPickerReplyPacket.DataBlock[0]; |
402 | } | 404 | } |
@@ -455,7 +457,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
455 | } | 457 | } |
456 | ); | 458 | ); |
457 | } | 459 | } |
458 | 460 | ||
461 | public void HandleUUIDNameRequest(UUID uuid, IClientAPI remote_client) | ||
462 | { | ||
463 | if (LibraryService != null && (LibraryService.LibraryRootFolder.Owner == uuid)) | ||
464 | { | ||
465 | remote_client.SendNameReply(uuid, "Mr", "OpenSim"); | ||
466 | } | ||
467 | else | ||
468 | { | ||
469 | string[] names = GetUserNames(uuid); | ||
470 | if (names.Length == 2) | ||
471 | { | ||
472 | remote_client.SendNameReply(uuid, names[0], names[1]); | ||
473 | } | ||
474 | |||
475 | } | ||
476 | } | ||
477 | |||
459 | /// <summary> | 478 | /// <summary> |
460 | /// Handle a fetch inventory request from the client | 479 | /// Handle a fetch inventory request from the client |
461 | /// </summary> | 480 | /// </summary> |
@@ -464,7 +483,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
464 | /// <param name="ownerID"></param> | 483 | /// <param name="ownerID"></param> |
465 | public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID) | 484 | public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID) |
466 | { | 485 | { |
467 | if (ownerID == CommsManager.UserProfileCacheService.LibraryRoot.Owner) | 486 | if (LibraryService != null && LibraryService.LibraryRootFolder != null && ownerID == LibraryService.LibraryRootFolder.Owner) |
468 | { | 487 | { |
469 | //m_log.Debug("request info for library item"); | 488 | //m_log.Debug("request info for library item"); |
470 | return; | 489 | return; |
@@ -498,13 +517,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
498 | // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc. | 517 | // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc. |
499 | // can be handled transparently). | 518 | // can be handled transparently). |
500 | InventoryFolderImpl fold = null; | 519 | InventoryFolderImpl fold = null; |
501 | if ((fold = CommsManager.UserProfileCacheService.LibraryRoot.FindFolder(folderID)) != null) | 520 | if (LibraryService != null && LibraryService.LibraryRootFolder != null) |
502 | { | 521 | if ((fold = LibraryService.LibraryRootFolder.FindFolder(folderID)) != null) |
503 | remoteClient.SendInventoryFolderDetails( | 522 | { |
504 | fold.Owner, folderID, fold.RequestListOfItems(), | 523 | remoteClient.SendInventoryFolderDetails( |
505 | fold.RequestListOfFolders(), fold.Version, fetchFolders, fetchItems); | 524 | fold.Owner, folderID, fold.RequestListOfItems(), |
506 | return; | 525 | fold.RequestListOfFolders(), fold.Version, fetchFolders, fetchItems); |
507 | } | 526 | return; |
527 | } | ||
508 | 528 | ||
509 | // We're going to send the reply async, because there may be | 529 | // We're going to send the reply async, because there may be |
510 | // an enormous quantity of packets -- basically the entire inventory! | 530 | // an enormous quantity of packets -- basically the entire inventory! |
@@ -552,15 +572,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
552 | // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc. | 572 | // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc. |
553 | // can be handled transparently). | 573 | // can be handled transparently). |
554 | InventoryFolderImpl fold; | 574 | InventoryFolderImpl fold; |
555 | if ((fold = CommsManager.UserProfileCacheService.LibraryRoot.FindFolder(folderID)) != null) | 575 | if (LibraryService != null && LibraryService.LibraryRootFolder != null) |
556 | { | 576 | if ((fold = LibraryService.LibraryRootFolder.FindFolder(folderID)) != null) |
557 | version = 0; | 577 | { |
558 | InventoryCollection ret = new InventoryCollection(); | 578 | version = 0; |
559 | ret.Folders = new List<InventoryFolderBase>(); | 579 | InventoryCollection ret = new InventoryCollection(); |
560 | ret.Items = fold.RequestListOfItems(); | 580 | ret.Folders = new List<InventoryFolderBase>(); |
581 | ret.Items = fold.RequestListOfItems(); | ||
561 | 582 | ||
562 | return ret; | 583 | return ret; |
563 | } | 584 | } |
564 | 585 | ||
565 | InventoryCollection contents = new InventoryCollection(); | 586 | InventoryCollection contents = new InventoryCollection(); |
566 | 587 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 41fd1e1..d00c990 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -41,8 +41,7 @@ using OpenMetaverse.Imaging; | |||
41 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
42 | using OpenSim.Services.Interfaces; | 42 | using OpenSim.Services.Interfaces; |
43 | using OpenSim.Framework.Communications; | 43 | using OpenSim.Framework.Communications; |
44 | using OpenSim.Framework.Communications.Cache; | 44 | |
45 | using OpenSim.Framework.Communications.Clients; | ||
46 | using OpenSim.Framework.Console; | 45 | using OpenSim.Framework.Console; |
47 | using OpenSim.Region.Framework.Interfaces; | 46 | using OpenSim.Region.Framework.Interfaces; |
48 | using OpenSim.Region.Framework.Scenes.Scripting; | 47 | using OpenSim.Region.Framework.Scenes.Scripting; |
@@ -141,7 +140,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
141 | protected ModuleLoader m_moduleLoader; | 140 | protected ModuleLoader m_moduleLoader; |
142 | protected StorageManager m_storageManager; | 141 | protected StorageManager m_storageManager; |
143 | protected AgentCircuitManager m_authenticateHandler; | 142 | protected AgentCircuitManager m_authenticateHandler; |
144 | public CommunicationsManager CommsManager; | ||
145 | 143 | ||
146 | protected SceneCommunicationService m_sceneGridService; | 144 | protected SceneCommunicationService m_sceneGridService; |
147 | public bool LoginsDisabled = true; | 145 | public bool LoginsDisabled = true; |
@@ -189,11 +187,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
189 | { | 187 | { |
190 | m_AuthorizationService = RequestModuleInterface<IAuthorizationService>(); | 188 | m_AuthorizationService = RequestModuleInterface<IAuthorizationService>(); |
191 | 189 | ||
192 | if (m_AuthorizationService == null) | 190 | //if (m_AuthorizationService == null) |
193 | { | 191 | //{ |
194 | // don't throw an exception if no authorization service is set for the time being | 192 | // // don't throw an exception if no authorization service is set for the time being |
195 | m_log.InfoFormat("[SCENE]: No Authorization service is configured"); | 193 | // m_log.InfoFormat("[SCENE]: No Authorization service is configured"); |
196 | } | 194 | //} |
197 | } | 195 | } |
198 | 196 | ||
199 | return m_AuthorizationService; | 197 | return m_AuthorizationService; |
@@ -240,6 +238,73 @@ namespace OpenSim.Region.Framework.Scenes | |||
240 | } | 238 | } |
241 | } | 239 | } |
242 | 240 | ||
241 | protected ILibraryService m_LibraryService; | ||
242 | |||
243 | public ILibraryService LibraryService | ||
244 | { | ||
245 | get | ||
246 | { | ||
247 | if (m_LibraryService == null) | ||
248 | m_LibraryService = RequestModuleInterface<ILibraryService>(); | ||
249 | |||
250 | return m_LibraryService; | ||
251 | } | ||
252 | } | ||
253 | |||
254 | protected ISimulationService m_simulationService; | ||
255 | public ISimulationService SimulationService | ||
256 | { | ||
257 | get | ||
258 | { | ||
259 | if (m_simulationService == null) | ||
260 | m_simulationService = RequestModuleInterface<ISimulationService>(); | ||
261 | return m_simulationService; | ||
262 | } | ||
263 | } | ||
264 | |||
265 | protected IAuthenticationService m_AuthenticationService; | ||
266 | public IAuthenticationService AuthenticationService | ||
267 | { | ||
268 | get | ||
269 | { | ||
270 | if (m_AuthenticationService == null) | ||
271 | m_AuthenticationService = RequestModuleInterface<IAuthenticationService>(); | ||
272 | return m_AuthenticationService; | ||
273 | } | ||
274 | } | ||
275 | |||
276 | protected IPresenceService m_PresenceService; | ||
277 | public IPresenceService PresenceService | ||
278 | { | ||
279 | get | ||
280 | { | ||
281 | if (m_PresenceService == null) | ||
282 | m_PresenceService = RequestModuleInterface<IPresenceService>(); | ||
283 | return m_PresenceService; | ||
284 | } | ||
285 | } | ||
286 | protected IUserAccountService m_UserAccountService; | ||
287 | public IUserAccountService UserAccountService | ||
288 | { | ||
289 | get | ||
290 | { | ||
291 | if (m_UserAccountService == null) | ||
292 | m_UserAccountService = RequestModuleInterface<IUserAccountService>(); | ||
293 | return m_UserAccountService; | ||
294 | } | ||
295 | } | ||
296 | |||
297 | protected OpenSim.Services.Interfaces.IAvatarService m_AvatarService; | ||
298 | public OpenSim.Services.Interfaces.IAvatarService AvatarService | ||
299 | { | ||
300 | get | ||
301 | { | ||
302 | if (m_AvatarService == null) | ||
303 | m_AvatarService = RequestModuleInterface<IAvatarService>(); | ||
304 | return m_AvatarService; | ||
305 | } | ||
306 | } | ||
307 | |||
243 | protected IXMLRPC m_xmlrpcModule; | 308 | protected IXMLRPC m_xmlrpcModule; |
244 | protected IWorldComm m_worldCommModule; | 309 | protected IWorldComm m_worldCommModule; |
245 | protected IAvatarFactory m_AvatarFactory; | 310 | protected IAvatarFactory m_AvatarFactory; |
@@ -249,10 +314,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
249 | } | 314 | } |
250 | protected IConfigSource m_config; | 315 | protected IConfigSource m_config; |
251 | protected IRegionSerialiserModule m_serialiser; | 316 | protected IRegionSerialiserModule m_serialiser; |
252 | protected IInterregionCommsOut m_interregionCommsOut; | ||
253 | protected IInterregionCommsIn m_interregionCommsIn; | ||
254 | protected IDialogModule m_dialogModule; | 317 | protected IDialogModule m_dialogModule; |
255 | protected ITeleportModule m_teleportModule; | 318 | protected IEntityTransferModule m_teleportModule; |
256 | 319 | ||
257 | protected ICapabilitiesModule m_capsModule; | 320 | protected ICapabilitiesModule m_capsModule; |
258 | public ICapabilitiesModule CapsModule | 321 | public ICapabilitiesModule CapsModule |
@@ -483,7 +546,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
483 | #region Constructors | 546 | #region Constructors |
484 | 547 | ||
485 | public Scene(RegionInfo regInfo, AgentCircuitManager authen, | 548 | public Scene(RegionInfo regInfo, AgentCircuitManager authen, |
486 | CommunicationsManager commsMan, SceneCommunicationService sceneGridService, | 549 | SceneCommunicationService sceneGridService, |
487 | StorageManager storeManager, | 550 | StorageManager storeManager, |
488 | ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, | 551 | ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, |
489 | bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) | 552 | bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) |
@@ -519,7 +582,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
519 | m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); | 582 | m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); |
520 | m_moduleLoader = moduleLoader; | 583 | m_moduleLoader = moduleLoader; |
521 | m_authenticateHandler = authen; | 584 | m_authenticateHandler = authen; |
522 | CommsManager = commsMan; | ||
523 | m_sceneGridService = sceneGridService; | 585 | m_sceneGridService = sceneGridService; |
524 | m_storageManager = storeManager; | 586 | m_storageManager = storeManager; |
525 | m_regInfo = regInfo; | 587 | m_regInfo = regInfo; |
@@ -776,6 +838,36 @@ namespace OpenSim.Region.Framework.Scenes | |||
776 | return m_simulatorVersion; | 838 | return m_simulatorVersion; |
777 | } | 839 | } |
778 | 840 | ||
841 | public string[] GetUserNames(UUID uuid) | ||
842 | { | ||
843 | string[] returnstring = new string[0]; | ||
844 | |||
845 | UserAccount account = UserAccountService.GetUserAccount(RegionInfo.ScopeID, uuid); | ||
846 | |||
847 | if (account != null) | ||
848 | { | ||
849 | returnstring = new string[2]; | ||
850 | returnstring[0] = account.FirstName; | ||
851 | returnstring[1] = account.LastName; | ||
852 | } | ||
853 | |||
854 | return returnstring; | ||
855 | } | ||
856 | |||
857 | public string GetUserName(UUID uuid) | ||
858 | { | ||
859 | string[] names = GetUserNames(uuid); | ||
860 | if (names.Length == 2) | ||
861 | { | ||
862 | string firstname = names[0]; | ||
863 | string lastname = names[1]; | ||
864 | |||
865 | return firstname + " " + lastname; | ||
866 | |||
867 | } | ||
868 | return "(hippos)"; | ||
869 | } | ||
870 | |||
779 | /// <summary> | 871 | /// <summary> |
780 | /// Another region is up. | 872 | /// Another region is up. |
781 | /// | 873 | /// |
@@ -809,7 +901,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
809 | regInfo.RegionName = otherRegion.RegionName; | 901 | regInfo.RegionName = otherRegion.RegionName; |
810 | regInfo.ScopeID = otherRegion.ScopeID; | 902 | regInfo.ScopeID = otherRegion.ScopeID; |
811 | regInfo.ExternalHostName = otherRegion.ExternalHostName; | 903 | regInfo.ExternalHostName = otherRegion.ExternalHostName; |
812 | 904 | GridRegion r = new GridRegion(regInfo); | |
813 | try | 905 | try |
814 | { | 906 | { |
815 | ForEachScenePresence(delegate(ScenePresence agent) | 907 | ForEachScenePresence(delegate(ScenePresence agent) |
@@ -823,7 +915,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
823 | List<ulong> old = new List<ulong>(); | 915 | List<ulong> old = new List<ulong>(); |
824 | old.Add(otherRegion.RegionHandle); | 916 | old.Add(otherRegion.RegionHandle); |
825 | agent.DropOldNeighbours(old); | 917 | agent.DropOldNeighbours(old); |
826 | InformClientOfNeighbor(agent, regInfo); | 918 | if (m_teleportModule != null) |
919 | m_teleportModule.EnableChildAgent(agent, r); | ||
827 | } | 920 | } |
828 | } | 921 | } |
829 | ); | 922 | ); |
@@ -971,6 +1064,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
971 | { | 1064 | { |
972 | foreach (RegionInfo region in m_regionRestartNotifyList) | 1065 | foreach (RegionInfo region in m_regionRestartNotifyList) |
973 | { | 1066 | { |
1067 | GridRegion r = new GridRegion(region); | ||
974 | try | 1068 | try |
975 | { | 1069 | { |
976 | ForEachScenePresence(delegate(ScenePresence agent) | 1070 | ForEachScenePresence(delegate(ScenePresence agent) |
@@ -978,9 +1072,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
978 | // If agent is a root agent. | 1072 | // If agent is a root agent. |
979 | if (!agent.IsChildAgent) | 1073 | if (!agent.IsChildAgent) |
980 | { | 1074 | { |
981 | //agent.ControllingClient.new | 1075 | if (m_teleportModule != null) |
982 | //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo()); | 1076 | m_teleportModule.EnableChildAgent(agent, r); |
983 | InformClientOfNeighbor(agent, region); | ||
984 | } | 1077 | } |
985 | } | 1078 | } |
986 | ); | 1079 | ); |
@@ -1123,11 +1216,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1123 | XferManager = RequestModuleInterface<IXfer>(); | 1216 | XferManager = RequestModuleInterface<IXfer>(); |
1124 | m_AvatarFactory = RequestModuleInterface<IAvatarFactory>(); | 1217 | m_AvatarFactory = RequestModuleInterface<IAvatarFactory>(); |
1125 | m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); | 1218 | m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); |
1126 | m_interregionCommsOut = RequestModuleInterface<IInterregionCommsOut>(); | ||
1127 | m_interregionCommsIn = RequestModuleInterface<IInterregionCommsIn>(); | ||
1128 | m_dialogModule = RequestModuleInterface<IDialogModule>(); | 1219 | m_dialogModule = RequestModuleInterface<IDialogModule>(); |
1129 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); | 1220 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); |
1130 | m_teleportModule = RequestModuleInterface<ITeleportModule>(); | 1221 | m_teleportModule = RequestModuleInterface<IEntityTransferModule>(); |
1131 | } | 1222 | } |
1132 | 1223 | ||
1133 | #endregion | 1224 | #endregion |
@@ -1564,7 +1655,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1564 | GridRegion region = new GridRegion(RegionInfo); | 1655 | GridRegion region = new GridRegion(RegionInfo); |
1565 | string error = GridService.RegisterRegion(RegionInfo.ScopeID, region); | 1656 | string error = GridService.RegisterRegion(RegionInfo.ScopeID, region); |
1566 | if (error != String.Empty) | 1657 | if (error != String.Empty) |
1658 | { | ||
1567 | throw new Exception(error); | 1659 | throw new Exception(error); |
1660 | } | ||
1568 | 1661 | ||
1569 | m_sceneGridService.SetScene(this); | 1662 | m_sceneGridService.SetScene(this); |
1570 | m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface<INeighbourService>(), RegionInfo); | 1663 | m_sceneGridService.InformNeighborsThatRegionisUp(RequestModuleInterface<INeighbourService>(), RegionInfo); |
@@ -1951,7 +2044,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1951 | /// Move the given scene object into a new region depending on which region its absolute position has moved | 2044 | /// Move the given scene object into a new region depending on which region its absolute position has moved |
1952 | /// into. | 2045 | /// into. |
1953 | /// | 2046 | /// |
1954 | /// This method locates the new region handle and offsets the prim position for the new region | ||
1955 | /// </summary> | 2047 | /// </summary> |
1956 | /// <param name="attemptedPosition">the attempted out of region position of the scene object</param> | 2048 | /// <param name="attemptedPosition">the attempted out of region position of the scene object</param> |
1957 | /// <param name="grp">the scene object that we're crossing</param> | 2049 | /// <param name="grp">the scene object that we're crossing</param> |
@@ -1993,191 +2085,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1993 | return; | 2085 | return; |
1994 | } | 2086 | } |
1995 | 2087 | ||
1996 | int thisx = (int)RegionInfo.RegionLocX; | 2088 | if (m_teleportModule != null) |
1997 | int thisy = (int)RegionInfo.RegionLocY; | 2089 | m_teleportModule.Cross(grp, attemptedPosition, silent); |
1998 | Vector3 EastCross = new Vector3(0.1f,0,0); | ||
1999 | Vector3 WestCross = new Vector3(-0.1f, 0, 0); | ||
2000 | Vector3 NorthCross = new Vector3(0, 0.1f, 0); | ||
2001 | Vector3 SouthCross = new Vector3(0, -0.1f, 0); | ||
2002 | |||
2003 | |||
2004 | // use this if no borders were crossed! | ||
2005 | ulong newRegionHandle | ||
2006 | = Util.UIntsToLong((uint)((thisx) * Constants.RegionSize), | ||
2007 | (uint)((thisy) * Constants.RegionSize)); | ||
2008 | |||
2009 | Vector3 pos = attemptedPosition; | ||
2010 | |||
2011 | int changeX = 1; | ||
2012 | int changeY = 1; | ||
2013 | |||
2014 | if (TestBorderCross(attemptedPosition + WestCross, Cardinals.W)) | ||
2015 | { | ||
2016 | if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S)) | ||
2017 | { | ||
2018 | |||
2019 | Border crossedBorderx = GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W); | ||
2020 | |||
2021 | if (crossedBorderx.BorderLine.Z > 0) | ||
2022 | { | ||
2023 | pos.X = ((pos.X + crossedBorderx.BorderLine.Z)); | ||
2024 | changeX = (int)(crossedBorderx.BorderLine.Z /(int) Constants.RegionSize); | ||
2025 | } | ||
2026 | else | ||
2027 | pos.X = ((pos.X + Constants.RegionSize)); | ||
2028 | |||
2029 | Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); | ||
2030 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
2031 | |||
2032 | if (crossedBordery.BorderLine.Z > 0) | ||
2033 | { | ||
2034 | pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); | ||
2035 | changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); | ||
2036 | } | ||
2037 | else | ||
2038 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
2039 | |||
2040 | |||
2041 | |||
2042 | newRegionHandle | ||
2043 | = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), | ||
2044 | (uint)((thisy - changeY) * Constants.RegionSize)); | ||
2045 | // x - 1 | ||
2046 | // y - 1 | ||
2047 | } | ||
2048 | else if (TestBorderCross(attemptedPosition + NorthCross, Cardinals.N)) | ||
2049 | { | ||
2050 | Border crossedBorderx = GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W); | ||
2051 | |||
2052 | if (crossedBorderx.BorderLine.Z > 0) | ||
2053 | { | ||
2054 | pos.X = ((pos.X + crossedBorderx.BorderLine.Z)); | ||
2055 | changeX = (int)(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize); | ||
2056 | } | ||
2057 | else | ||
2058 | pos.X = ((pos.X + Constants.RegionSize)); | ||
2059 | |||
2060 | |||
2061 | Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); | ||
2062 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
2063 | |||
2064 | try | ||
2065 | { | ||
2066 | if (crossedBordery.BorderLine.Z > 0) | ||
2067 | { | ||
2068 | pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); | ||
2069 | changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); | ||
2070 | } | ||
2071 | else | ||
2072 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
2073 | |||
2074 | newRegionHandle | ||
2075 | = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), | ||
2076 | (uint)((thisy + changeY) * Constants.RegionSize)); | ||
2077 | // x - 1 | ||
2078 | // y + 1 | ||
2079 | } | ||
2080 | catch (Exception ex) | ||
2081 | { | ||
2082 | } | ||
2083 | } | ||
2084 | else | ||
2085 | { | ||
2086 | Border crossedBorderx = GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W); | ||
2087 | |||
2088 | if (crossedBorderx.BorderLine.Z > 0) | ||
2089 | { | ||
2090 | pos.X = ((pos.X + crossedBorderx.BorderLine.Z)); | ||
2091 | changeX = (int)(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize); | ||
2092 | } | ||
2093 | else | ||
2094 | pos.X = ((pos.X + Constants.RegionSize)); | ||
2095 | |||
2096 | newRegionHandle | ||
2097 | = Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize), | ||
2098 | (uint) (thisy*Constants.RegionSize)); | ||
2099 | // x - 1 | ||
2100 | } | ||
2101 | } | ||
2102 | else if (TestBorderCross(attemptedPosition + EastCross, Cardinals.E)) | ||
2103 | { | ||
2104 | if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S)) | ||
2105 | { | ||
2106 | |||
2107 | pos.X = ((pos.X - Constants.RegionSize)); | ||
2108 | Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); | ||
2109 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
2110 | |||
2111 | if (crossedBordery.BorderLine.Z > 0) | ||
2112 | { | ||
2113 | pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); | ||
2114 | changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); | ||
2115 | } | ||
2116 | else | ||
2117 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
2118 | |||
2119 | |||
2120 | newRegionHandle | ||
2121 | = Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize), | ||
2122 | (uint)((thisy - changeY) * Constants.RegionSize)); | ||
2123 | // x + 1 | ||
2124 | // y - 1 | ||
2125 | } | ||
2126 | else if (TestBorderCross(attemptedPosition + NorthCross, Cardinals.N)) | ||
2127 | { | ||
2128 | pos.X = ((pos.X - Constants.RegionSize)); | ||
2129 | pos.Y = ((pos.Y - Constants.RegionSize)); | ||
2130 | newRegionHandle | ||
2131 | = Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize), | ||
2132 | (uint)((thisy + changeY) * Constants.RegionSize)); | ||
2133 | // x + 1 | ||
2134 | // y + 1 | ||
2135 | } | ||
2136 | else | ||
2137 | { | ||
2138 | pos.X = ((pos.X - Constants.RegionSize)); | ||
2139 | newRegionHandle | ||
2140 | = Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize), | ||
2141 | (uint) (thisy*Constants.RegionSize)); | ||
2142 | // x + 1 | ||
2143 | } | ||
2144 | } | ||
2145 | else if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S)) | ||
2146 | { | ||
2147 | Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S); | ||
2148 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
2149 | |||
2150 | if (crossedBordery.BorderLine.Z > 0) | ||
2151 | { | ||
2152 | pos.Y = ((pos.Y + crossedBordery.BorderLine.Z)); | ||
2153 | changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize); | ||
2154 | } | ||
2155 | else | ||
2156 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
2157 | |||
2158 | newRegionHandle | ||
2159 | = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - changeY) * Constants.RegionSize)); | ||
2160 | // y - 1 | ||
2161 | } | ||
2162 | else if (TestBorderCross(attemptedPosition + NorthCross, Cardinals.N)) | ||
2163 | { | ||
2164 | |||
2165 | pos.Y = ((pos.Y - Constants.RegionSize)); | ||
2166 | newRegionHandle | ||
2167 | = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + changeY) * Constants.RegionSize)); | ||
2168 | // y + 1 | ||
2169 | } | ||
2170 | |||
2171 | // Offset the positions for the new region across the border | ||
2172 | Vector3 oldGroupPosition = grp.RootPart.GroupPosition; | ||
2173 | grp.OffsetForNewRegion(pos); | ||
2174 | |||
2175 | // If we fail to cross the border, then reset the position of the scene object on that border. | ||
2176 | if (!CrossPrimGroupIntoNewRegion(newRegionHandle, grp, silent)) | ||
2177 | { | ||
2178 | grp.OffsetForNewRegion(oldGroupPosition); | ||
2179 | grp.ScheduleGroupForFullUpdate(); | ||
2180 | } | ||
2181 | } | 2090 | } |
2182 | 2091 | ||
2183 | public Border GetCrossedBorder(Vector3 position, Cardinals gridline) | 2092 | public Border GetCrossedBorder(Vector3 position, Cardinals gridline) |
@@ -2361,75 +2270,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2361 | 2270 | ||
2362 | 2271 | ||
2363 | /// <summary> | 2272 | /// <summary> |
2364 | /// Move the given scene object into a new region | ||
2365 | /// </summary> | ||
2366 | /// <param name="newRegionHandle"></param> | ||
2367 | /// <param name="grp">Scene Object Group that we're crossing</param> | ||
2368 | /// <returns> | ||
2369 | /// true if the crossing itself was successful, false on failure | ||
2370 | /// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region | ||
2371 | /// </returns> | ||
2372 | public bool CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp, bool silent) | ||
2373 | { | ||
2374 | //m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<"); | ||
2375 | |||
2376 | bool successYN = false; | ||
2377 | grp.RootPart.UpdateFlag = 0; | ||
2378 | //int primcrossingXMLmethod = 0; | ||
2379 | |||
2380 | if (newRegionHandle != 0) | ||
2381 | { | ||
2382 | //string objectState = grp.GetStateSnapshot(); | ||
2383 | |||
2384 | //successYN | ||
2385 | // = m_sceneGridService.PrimCrossToNeighboringRegion( | ||
2386 | // newRegionHandle, grp.UUID, m_serialiser.SaveGroupToXml2(grp), primcrossingXMLmethod); | ||
2387 | //if (successYN && (objectState != "") && m_allowScriptCrossings) | ||
2388 | //{ | ||
2389 | // successYN = m_sceneGridService.PrimCrossToNeighboringRegion( | ||
2390 | // newRegionHandle, grp.UUID, objectState, 100); | ||
2391 | //} | ||
2392 | |||
2393 | // And the new channel... | ||
2394 | if (m_interregionCommsOut != null) | ||
2395 | successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); | ||
2396 | |||
2397 | if (successYN) | ||
2398 | { | ||
2399 | // We remove the object here | ||
2400 | try | ||
2401 | { | ||
2402 | DeleteSceneObject(grp, silent); | ||
2403 | } | ||
2404 | catch (Exception e) | ||
2405 | { | ||
2406 | m_log.ErrorFormat( | ||
2407 | "[INTERREGION]: Exception deleting the old object left behind on a border crossing for {0}, {1}", | ||
2408 | grp, e); | ||
2409 | } | ||
2410 | } | ||
2411 | else | ||
2412 | { | ||
2413 | if (!grp.IsDeleted) | ||
2414 | { | ||
2415 | if (grp.RootPart.PhysActor != null) | ||
2416 | { | ||
2417 | grp.RootPart.PhysActor.CrossingFailure(); | ||
2418 | } | ||
2419 | } | ||
2420 | |||
2421 | m_log.ErrorFormat("[INTERREGION]: Prim crossing failed for {0}", grp); | ||
2422 | } | ||
2423 | } | ||
2424 | else | ||
2425 | { | ||
2426 | m_log.Error("[INTERREGION]: region handle was unexpectedly 0 in Scene.CrossPrimGroupIntoNewRegion()"); | ||
2427 | } | ||
2428 | |||
2429 | return successYN; | ||
2430 | } | ||
2431 | |||
2432 | /// <summary> | ||
2433 | /// Called when objects or attachments cross the border between regions. | 2273 | /// Called when objects or attachments cross the border between regions. |
2434 | /// </summary> | 2274 | /// </summary> |
2435 | /// <param name="sog"></param> | 2275 | /// <param name="sog"></param> |
@@ -2501,6 +2341,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2501 | 2341 | ||
2502 | return false; | 2342 | return false; |
2503 | } | 2343 | } |
2344 | |||
2345 | sceneObject.SetScene(this); | ||
2346 | |||
2504 | // Force allocation of new LocalId | 2347 | // Force allocation of new LocalId |
2505 | // | 2348 | // |
2506 | foreach (SceneObjectPart p in sceneObject.Children.Values) | 2349 | foreach (SceneObjectPart p in sceneObject.Children.Values) |
@@ -2579,6 +2422,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2579 | /// <param name="client"></param> | 2422 | /// <param name="client"></param> |
2580 | public override void AddNewClient(IClientAPI client) | 2423 | public override void AddNewClient(IClientAPI client) |
2581 | { | 2424 | { |
2425 | bool vialogin = false; | ||
2426 | |||
2582 | m_clientManager.Add(client); | 2427 | m_clientManager.Add(client); |
2583 | 2428 | ||
2584 | CheckHeartbeat(); | 2429 | CheckHeartbeat(); |
@@ -2613,6 +2458,38 @@ namespace OpenSim.Region.Framework.Scenes | |||
2613 | { | 2458 | { |
2614 | AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); | 2459 | AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); |
2615 | 2460 | ||
2461 | // Do the verification here | ||
2462 | System.Net.EndPoint ep = client.GetClientEP(); | ||
2463 | if (aCircuit != null) | ||
2464 | { | ||
2465 | if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0) | ||
2466 | { | ||
2467 | m_log.DebugFormat("[Scene]: Incoming client {0} {1} in region {2} via Login", aCircuit.firstname, aCircuit.lastname, RegionInfo.RegionName); | ||
2468 | vialogin = true; | ||
2469 | IUserAgentVerificationModule userVerification = RequestModuleInterface<IUserAgentVerificationModule>(); | ||
2470 | if (userVerification != null) | ||
2471 | { | ||
2472 | if (!userVerification.VerifyClient(aCircuit, ep.ToString())) | ||
2473 | { | ||
2474 | // uh-oh, this is fishy | ||
2475 | m_log.WarnFormat("[Scene]: Agent {0} with session {1} connecting with unidentified end point {2}. Refusing service.", | ||
2476 | client.AgentId, client.SessionId, ep.ToString()); | ||
2477 | try | ||
2478 | { | ||
2479 | client.Close(); | ||
2480 | } | ||
2481 | catch (Exception e) | ||
2482 | { | ||
2483 | m_log.DebugFormat("[Scene]: Exception while closing aborted client: {0}", e.StackTrace); | ||
2484 | } | ||
2485 | return; | ||
2486 | } | ||
2487 | else | ||
2488 | m_log.DebugFormat("[Scene]: User Client Verification for {0} {1} returned true", aCircuit.firstname, aCircuit.lastname); | ||
2489 | } | ||
2490 | } | ||
2491 | } | ||
2492 | |||
2616 | m_log.Debug("[Scene] Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); | 2493 | m_log.Debug("[Scene] Adding new agent " + client.Name + " to scene " + RegionInfo.RegionName); |
2617 | /* | 2494 | /* |
2618 | string logMsg = string.Format("[SCENE]: Adding new {0} agent for {1} in {2}", | 2495 | string logMsg = string.Format("[SCENE]: Adding new {0} agent for {1} in {2}", |
@@ -2622,9 +2499,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2622 | m_log.Debug(logMsg); | 2499 | m_log.Debug(logMsg); |
2623 | */ | 2500 | */ |
2624 | 2501 | ||
2625 | CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); | 2502 | //CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); |
2626 | |||
2627 | ScenePresence sp = CreateAndAddScenePresence(client); | 2503 | ScenePresence sp = CreateAndAddScenePresence(client); |
2504 | sp.Appearance = aCircuit.Appearance; | ||
2628 | 2505 | ||
2629 | // HERE!!! Do the initial attachments right here | 2506 | // HERE!!! Do the initial attachments right here |
2630 | // first agent upon login is a root agent by design. | 2507 | // first agent upon login is a root agent by design. |
@@ -2638,6 +2515,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2638 | 2515 | ||
2639 | m_LastLogin = Util.EnvironmentTickCount(); | 2516 | m_LastLogin = Util.EnvironmentTickCount(); |
2640 | EventManager.TriggerOnNewClient(client); | 2517 | EventManager.TriggerOnNewClient(client); |
2518 | if (vialogin) | ||
2519 | EventManager.TriggerOnClientLogin(client); | ||
2641 | } | 2520 | } |
2642 | 2521 | ||
2643 | 2522 | ||
@@ -2755,7 +2634,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2755 | { | 2634 | { |
2756 | client.OnTeleportLocationRequest += RequestTeleportLocation; | 2635 | client.OnTeleportLocationRequest += RequestTeleportLocation; |
2757 | client.OnTeleportLandmarkRequest += RequestTeleportLandmark; | 2636 | client.OnTeleportLandmarkRequest += RequestTeleportLandmark; |
2758 | client.OnTeleportHomeRequest += TeleportClientHome; | ||
2759 | } | 2637 | } |
2760 | 2638 | ||
2761 | public virtual void SubscribeToClientScriptEvents(IClientAPI client) | 2639 | public virtual void SubscribeToClientScriptEvents(IClientAPI client) |
@@ -2775,7 +2653,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2775 | 2653 | ||
2776 | public virtual void SubscribeToClientGridEvents(IClientAPI client) | 2654 | public virtual void SubscribeToClientGridEvents(IClientAPI client) |
2777 | { | 2655 | { |
2778 | client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest; | 2656 | client.OnNameFromUUIDRequest += HandleUUIDNameRequest; |
2779 | client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; | 2657 | client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; |
2780 | client.OnAvatarPickerRequest += ProcessAvatarPickerRequest; | 2658 | client.OnAvatarPickerRequest += ProcessAvatarPickerRequest; |
2781 | client.OnSetStartLocationRequest += SetHomeRezPoint; | 2659 | client.OnSetStartLocationRequest += SetHomeRezPoint; |
@@ -2911,7 +2789,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2911 | { | 2789 | { |
2912 | client.OnTeleportLocationRequest -= RequestTeleportLocation; | 2790 | client.OnTeleportLocationRequest -= RequestTeleportLocation; |
2913 | client.OnTeleportLandmarkRequest -= RequestTeleportLandmark; | 2791 | client.OnTeleportLandmarkRequest -= RequestTeleportLandmark; |
2914 | client.OnTeleportHomeRequest -= TeleportClientHome; | 2792 | //client.OnTeleportHomeRequest -= TeleportClientHome; |
2915 | } | 2793 | } |
2916 | 2794 | ||
2917 | public virtual void UnSubscribeToClientScriptEvents(IClientAPI client) | 2795 | public virtual void UnSubscribeToClientScriptEvents(IClientAPI client) |
@@ -2931,7 +2809,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2931 | 2809 | ||
2932 | public virtual void UnSubscribeToClientGridEvents(IClientAPI client) | 2810 | public virtual void UnSubscribeToClientGridEvents(IClientAPI client) |
2933 | { | 2811 | { |
2934 | client.OnNameFromUUIDRequest -= CommsManager.HandleUUIDNameRequest; | 2812 | client.OnNameFromUUIDRequest -= HandleUUIDNameRequest; |
2935 | client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest; | 2813 | client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest; |
2936 | client.OnAvatarPickerRequest -= ProcessAvatarPickerRequest; | 2814 | client.OnAvatarPickerRequest -= ProcessAvatarPickerRequest; |
2937 | client.OnSetStartLocationRequest -= SetHomeRezPoint; | 2815 | client.OnSetStartLocationRequest -= SetHomeRezPoint; |
@@ -2958,30 +2836,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2958 | /// <param name="client">The IClientAPI for the client</param> | 2836 | /// <param name="client">The IClientAPI for the client</param> |
2959 | public virtual void TeleportClientHome(UUID agentId, IClientAPI client) | 2837 | public virtual void TeleportClientHome(UUID agentId, IClientAPI client) |
2960 | { | 2838 | { |
2961 | UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(agentId); | 2839 | if (m_teleportModule != null) |
2962 | if (UserProfile != null) | 2840 | m_teleportModule.TeleportHome(agentId, client); |
2841 | else | ||
2963 | { | 2842 | { |
2964 | GridRegion regionInfo = GridService.GetRegionByUUID(UUID.Zero, UserProfile.HomeRegionID); | 2843 | m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); |
2965 | if (regionInfo == null) | 2844 | client.SendTeleportFailed("Unable to perform teleports on this simulator."); |
2966 | { | ||
2967 | uint x = 0, y = 0; | ||
2968 | Utils.LongToUInts(UserProfile.HomeRegion, out x, out y); | ||
2969 | regionInfo = GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
2970 | if (regionInfo != null) // home region can be away temporarily, too | ||
2971 | { | ||
2972 | UserProfile.HomeRegionID = regionInfo.RegionID; | ||
2973 | CommsManager.UserService.UpdateUserProfile(UserProfile); | ||
2974 | } | ||
2975 | } | ||
2976 | if (regionInfo == null) | ||
2977 | { | ||
2978 | // can't find the Home region: Tell viewer and abort | ||
2979 | client.SendTeleportFailed("Your home-region could not be found."); | ||
2980 | return; | ||
2981 | } | ||
2982 | RequestTeleportLocation( | ||
2983 | client, regionInfo.RegionHandle, UserProfile.HomeLocation, UserProfile.HomeLookAt, | ||
2984 | (uint)(TPFlags.SetLastToTarget | TPFlags.ViaHome)); | ||
2985 | } | 2845 | } |
2986 | } | 2846 | } |
2987 | 2847 | ||
@@ -3072,7 +2932,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3072 | } | 2932 | } |
3073 | 2933 | ||
3074 | /// <summary> | 2934 | /// <summary> |
3075 | /// Sets the Home Point. The GridService uses this to know where to put a user when they log-in | 2935 | /// Sets the Home Point. The LoginService uses this to know where to put a user when they log-in |
3076 | /// </summary> | 2936 | /// </summary> |
3077 | /// <param name="remoteClient"></param> | 2937 | /// <param name="remoteClient"></param> |
3078 | /// <param name="regionHandle"></param> | 2938 | /// <param name="regionHandle"></param> |
@@ -3081,27 +2941,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
3081 | /// <param name="flags"></param> | 2941 | /// <param name="flags"></param> |
3082 | public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags) | 2942 | public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags) |
3083 | { | 2943 | { |
3084 | UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(remoteClient.AgentId); | 2944 | if (PresenceService.SetHomeLocation(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt)) |
3085 | if (UserProfile != null) | ||
3086 | { | ||
3087 | // I know I'm ignoring the regionHandle provided by the teleport location request. | ||
3088 | // reusing the TeleportLocationRequest delegate, so regionHandle isn't valid | ||
3089 | UserProfile.HomeRegionID = RegionInfo.RegionID; | ||
3090 | // TODO: The next line can be removed, as soon as only homeRegionID based UserServers are around. | ||
3091 | // TODO: The HomeRegion property can be removed then, too | ||
3092 | UserProfile.HomeRegion = RegionInfo.RegionHandle; | ||
3093 | |||
3094 | UserProfile.HomeLocation = position; | ||
3095 | UserProfile.HomeLookAt = lookAt; | ||
3096 | CommsManager.UserService.UpdateUserProfile(UserProfile); | ||
3097 | |||
3098 | // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. | 2945 | // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. |
3099 | m_dialogModule.SendAlertToUser(remoteClient, "Home position set."); | 2946 | m_dialogModule.SendAlertToUser(remoteClient, "Home position set."); |
3100 | } | ||
3101 | else | 2947 | else |
3102 | { | ||
3103 | m_dialogModule.SendAlertToUser(remoteClient, "Set Home request Failed."); | 2948 | m_dialogModule.SendAlertToUser(remoteClient, "Set Home request Failed."); |
3104 | } | ||
3105 | } | 2949 | } |
3106 | 2950 | ||
3107 | /// <summary> | 2951 | /// <summary> |
@@ -3174,14 +3018,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3174 | m_sceneGraph.removeUserCount(!childagentYN); | 3018 | m_sceneGraph.removeUserCount(!childagentYN); |
3175 | CapsModule.RemoveCapsHandler(agentID); | 3019 | CapsModule.RemoveCapsHandler(agentID); |
3176 | 3020 | ||
3177 | if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) | 3021 | // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever |
3178 | { | 3022 | // this method is doing is HORRIBLE!!! |
3179 | CommsManager.UserProfileCacheService.RemoveUser(agentID); | 3023 | avatar.Scene.NeedSceneCacheClear(avatar.UUID); |
3180 | } | ||
3181 | 3024 | ||
3182 | if (!avatar.IsChildAgent) | 3025 | if (!avatar.IsChildAgent) |
3183 | { | 3026 | { |
3184 | m_sceneGridService.LogOffUser(agentID, RegionInfo.RegionID, RegionInfo.RegionHandle, avatar.AbsolutePosition, avatar.Lookat); | ||
3185 | //List<ulong> childknownRegions = new List<ulong>(); | 3027 | //List<ulong> childknownRegions = new List<ulong>(); |
3186 | //List<ulong> ckn = avatar.KnownChildRegionHandles; | 3028 | //List<ulong> ckn = avatar.KnownChildRegionHandles; |
3187 | //for (int i = 0; i < ckn.Count; i++) | 3029 | //for (int i = 0; i < ckn.Count; i++) |
@@ -3236,12 +3078,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3236 | m_log.Error("[SCENE] Scene.cs:RemoveClient exception: " + e.ToString()); | 3078 | m_log.Error("[SCENE] Scene.cs:RemoveClient exception: " + e.ToString()); |
3237 | } | 3079 | } |
3238 | 3080 | ||
3239 | // Remove client agent from profile, so new logins will work | ||
3240 | if (!childagentYN) | ||
3241 | { | ||
3242 | m_sceneGridService.ClearUserAgent(agentID); | ||
3243 | } | ||
3244 | |||
3245 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); | 3081 | m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); |
3246 | 3082 | ||
3247 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); | 3083 | //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); |
@@ -3315,14 +3151,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3315 | m_sceneGridService.KiPrimitive += SendKillObject; | 3151 | m_sceneGridService.KiPrimitive += SendKillObject; |
3316 | m_sceneGridService.OnGetLandData += GetLandData; | 3152 | m_sceneGridService.OnGetLandData += GetLandData; |
3317 | 3153 | ||
3318 | if (m_interregionCommsIn != null) | ||
3319 | { | ||
3320 | m_log.Debug("[SCENE]: Registering with InterregionCommsIn"); | ||
3321 | m_interregionCommsIn.OnChildAgentUpdate += IncomingChildAgentDataUpdate; | ||
3322 | } | ||
3323 | else | ||
3324 | m_log.Debug("[SCENE]: Unable to register with InterregionCommsIn"); | ||
3325 | |||
3326 | } | 3154 | } |
3327 | 3155 | ||
3328 | /// <summary> | 3156 | /// <summary> |
@@ -3340,9 +3168,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3340 | m_sceneGridService.OnCloseAgentConnection -= IncomingCloseAgent; | 3168 | m_sceneGridService.OnCloseAgentConnection -= IncomingCloseAgent; |
3341 | m_sceneGridService.OnGetLandData -= GetLandData; | 3169 | m_sceneGridService.OnGetLandData -= GetLandData; |
3342 | 3170 | ||
3343 | if (m_interregionCommsIn != null) | ||
3344 | m_interregionCommsIn.OnChildAgentUpdate -= IncomingChildAgentDataUpdate; | ||
3345 | |||
3346 | // this does nothing; should be removed | 3171 | // this does nothing; should be removed |
3347 | m_sceneGridService.Close(); | 3172 | m_sceneGridService.Close(); |
3348 | 3173 | ||
@@ -3399,7 +3224,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3399 | agent.AgentID, agent.circuitcode, teleportFlags); | 3224 | agent.AgentID, agent.circuitcode, teleportFlags); |
3400 | 3225 | ||
3401 | reason = String.Empty; | 3226 | reason = String.Empty; |
3402 | if (!AuthenticateUser(agent, out reason)) | 3227 | if (!VerifyUserPresence(agent, out reason)) |
3403 | return false; | 3228 | return false; |
3404 | 3229 | ||
3405 | if (!AuthorizeUser(agent, out reason)) | 3230 | if (!AuthorizeUser(agent, out reason)) |
@@ -3494,40 +3319,39 @@ namespace OpenSim.Region.Framework.Scenes | |||
3494 | } | 3319 | } |
3495 | } | 3320 | } |
3496 | 3321 | ||
3322 | agent.teleportFlags = teleportFlags; | ||
3497 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); | 3323 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); |
3498 | 3324 | ||
3499 | // rewrite session_id | ||
3500 | CachedUserInfo userinfo = CommsManager.UserProfileCacheService.GetUserDetails(agent.AgentID); | ||
3501 | if (userinfo != null) | ||
3502 | { | ||
3503 | userinfo.SessionID = agent.SessionID; | ||
3504 | } | ||
3505 | else | ||
3506 | { | ||
3507 | m_log.WarnFormat( | ||
3508 | "[CONNECTION BEGIN]: We couldn't find a User Info record for {0}. This is usually an indication that the UUID we're looking up is invalid", agent.AgentID); | ||
3509 | } | ||
3510 | |||
3511 | return true; | 3325 | return true; |
3512 | } | 3326 | } |
3513 | 3327 | ||
3514 | /// <summary> | 3328 | /// <summary> |
3515 | /// Verifies that the user has a session on the Grid | 3329 | /// Verifies that the user has a presence on the Grid |
3516 | /// </summary> | 3330 | /// </summary> |
3517 | /// <param name="agent">Circuit Data of the Agent we're verifying</param> | 3331 | /// <param name="agent">Circuit Data of the Agent we're verifying</param> |
3518 | /// <param name="reason">Outputs the reason for the false response on this string</param> | 3332 | /// <param name="reason">Outputs the reason for the false response on this string</param> |
3519 | /// <returns>True if the user has a session on the grid. False if it does not. False will | 3333 | /// <returns>True if the user has a session on the grid. False if it does not. False will |
3520 | /// also return a reason.</returns> | 3334 | /// also return a reason.</returns> |
3521 | public virtual bool AuthenticateUser(AgentCircuitData agent, out string reason) | 3335 | public virtual bool VerifyUserPresence(AgentCircuitData agent, out string reason) |
3522 | { | 3336 | { |
3523 | reason = String.Empty; | 3337 | reason = String.Empty; |
3524 | 3338 | ||
3525 | bool result = CommsManager.UserService.VerifySession(agent.AgentID, agent.SessionID); | 3339 | IPresenceService presence = RequestModuleInterface<IPresenceService>(); |
3526 | m_log.Debug("[CONNECTION BEGIN]: User authentication returned " + result); | 3340 | if (presence == null) |
3527 | if (!result) | 3341 | { |
3528 | reason = String.Format("Failed to authenticate user {0} {1}, access denied.", agent.firstname, agent.lastname); | 3342 | reason = String.Format("Failed to verify user {0} {1} in region {2}. Presence service does not exist.", agent.firstname, agent.lastname, RegionInfo.RegionName); |
3343 | return false; | ||
3344 | } | ||
3345 | |||
3346 | OpenSim.Services.Interfaces.PresenceInfo pinfo = presence.GetAgent(agent.SessionID); | ||
3529 | 3347 | ||
3530 | return result; | 3348 | if (pinfo == null || (pinfo != null && pinfo.Online == false)) |
3349 | { | ||
3350 | reason = String.Format("Failed to verify user {0} {1}, access denied to region {2}.", agent.firstname, agent.lastname, RegionInfo.RegionName); | ||
3351 | return false; | ||
3352 | } | ||
3353 | |||
3354 | return true; | ||
3531 | } | 3355 | } |
3532 | 3356 | ||
3533 | /// <summary> | 3357 | /// <summary> |
@@ -3728,8 +3552,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3728 | /// <returns>true if we handled it.</returns> | 3552 | /// <returns>true if we handled it.</returns> |
3729 | public virtual bool IncomingChildAgentDataUpdate(AgentData cAgentData) | 3553 | public virtual bool IncomingChildAgentDataUpdate(AgentData cAgentData) |
3730 | { | 3554 | { |
3731 | // m_log.DebugFormat( | 3555 | m_log.DebugFormat( |
3732 | // "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); | 3556 | "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); |
3733 | 3557 | ||
3734 | // We have to wait until the viewer contacts this region after receiving EAC. | 3558 | // We have to wait until the viewer contacts this region after receiving EAC. |
3735 | // That calls AddNewClient, which finally creates the ScenePresence | 3559 | // That calls AddNewClient, which finally creates the ScenePresence |
@@ -3798,16 +3622,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3798 | return false; | 3622 | return false; |
3799 | } | 3623 | } |
3800 | 3624 | ||
3801 | public virtual bool IncomingReleaseAgent(UUID id) | ||
3802 | { | ||
3803 | return m_sceneGridService.ReleaseAgent(id); | ||
3804 | } | ||
3805 | |||
3806 | public void SendReleaseAgent(ulong regionHandle, UUID id, string uri) | ||
3807 | { | ||
3808 | m_interregionCommsOut.SendReleaseAgent(regionHandle, id, uri); | ||
3809 | } | ||
3810 | |||
3811 | /// <summary> | 3625 | /// <summary> |
3812 | /// Tell a single agent to disconnect from the region. | 3626 | /// Tell a single agent to disconnect from the region. |
3813 | /// </summary> | 3627 | /// </summary> |
@@ -3852,30 +3666,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3852 | } | 3666 | } |
3853 | 3667 | ||
3854 | /// <summary> | 3668 | /// <summary> |
3855 | /// Tell neighboring regions about this agent | ||
3856 | /// When the regions respond with a true value, | ||
3857 | /// tell the agents about the region. | ||
3858 | /// | ||
3859 | /// We have to tell the regions about the agents first otherwise it'll deny them access | ||
3860 | /// | ||
3861 | /// </summary> | ||
3862 | /// <param name="presence"></param> | ||
3863 | public void InformClientOfNeighbours(ScenePresence presence) | ||
3864 | { | ||
3865 | m_sceneGridService.EnableNeighbourChildAgents(presence, m_neighbours); | ||
3866 | } | ||
3867 | |||
3868 | /// <summary> | ||
3869 | /// Tell a neighboring region about this agent | ||
3870 | /// </summary> | ||
3871 | /// <param name="presence"></param> | ||
3872 | /// <param name="region"></param> | ||
3873 | public void InformClientOfNeighbor(ScenePresence presence, RegionInfo region) | ||
3874 | { | ||
3875 | m_sceneGridService.EnableNeighbourChildAgents(presence, m_neighbours); | ||
3876 | } | ||
3877 | |||
3878 | /// <summary> | ||
3879 | /// Tries to teleport agent to other region. | 3669 | /// Tries to teleport agent to other region. |
3880 | /// </summary> | 3670 | /// </summary> |
3881 | /// <param name="remoteClient"></param> | 3671 | /// <param name="remoteClient"></param> |
@@ -3950,16 +3740,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3950 | } | 3740 | } |
3951 | 3741 | ||
3952 | if (m_teleportModule != null) | 3742 | if (m_teleportModule != null) |
3953 | { | 3743 | m_teleportModule.Teleport(sp, regionHandle, position, lookAt, teleportFlags); |
3954 | m_teleportModule.RequestTeleportToLocation(sp, regionHandle, | ||
3955 | position, lookAt, teleportFlags); | ||
3956 | } | ||
3957 | else | 3744 | else |
3958 | { | 3745 | { |
3959 | m_sceneGridService.RequestTeleportToLocation(sp, regionHandle, | 3746 | m_log.DebugFormat("[SCENE]: Unable to perform teleports: no AgentTransferModule is active"); |
3960 | position, lookAt, teleportFlags); | 3747 | sp.ControllingClient.SendTeleportFailed("Unable to perform teleports on this simulator."); |
3961 | } | 3748 | } |
3962 | |||
3963 | } | 3749 | } |
3964 | } | 3750 | } |
3965 | 3751 | ||
@@ -3985,7 +3771,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3985 | 3771 | ||
3986 | public void CrossAgentToNewRegion(ScenePresence agent, bool isFlying) | 3772 | public void CrossAgentToNewRegion(ScenePresence agent, bool isFlying) |
3987 | { | 3773 | { |
3988 | m_sceneGridService.CrossAgentToNewRegion(this, agent, isFlying); | 3774 | if (m_teleportModule != null) |
3775 | m_teleportModule.Cross(agent, isFlying); | ||
3776 | else | ||
3777 | { | ||
3778 | m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule"); | ||
3779 | } | ||
3989 | } | 3780 | } |
3990 | 3781 | ||
3991 | public void SendOutChildAgentUpdates(AgentPosition cadu, ScenePresence presence) | 3782 | public void SendOutChildAgentUpdates(AgentPosition cadu, ScenePresence presence) |
@@ -4011,35 +3802,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
4011 | objectCapacity = objects; | 3802 | objectCapacity = objects; |
4012 | } | 3803 | } |
4013 | 3804 | ||
4014 | public List<FriendListItem> GetFriendList(string id) | ||
4015 | { | ||
4016 | UUID avatarID; | ||
4017 | if (!UUID.TryParse(id, out avatarID)) | ||
4018 | return new List<FriendListItem>(); | ||
4019 | |||
4020 | return CommsManager.GetUserFriendList(avatarID); | ||
4021 | } | ||
4022 | |||
4023 | public Dictionary<UUID, FriendRegionInfo> GetFriendRegionInfos(List<UUID> uuids) | ||
4024 | { | ||
4025 | return CommsManager.GetFriendRegionInfos(uuids); | ||
4026 | } | ||
4027 | |||
4028 | public virtual void StoreAddFriendship(UUID ownerID, UUID friendID, uint perms) | ||
4029 | { | ||
4030 | m_sceneGridService.AddNewUserFriend(ownerID, friendID, perms); | ||
4031 | } | ||
4032 | |||
4033 | public virtual void StoreUpdateFriendship(UUID ownerID, UUID friendID, uint perms) | ||
4034 | { | ||
4035 | m_sceneGridService.UpdateUserFriendPerms(ownerID, friendID, perms); | ||
4036 | } | ||
4037 | |||
4038 | public virtual void StoreRemoveFriendship(UUID ownerID, UUID ExfriendID) | ||
4039 | { | ||
4040 | m_sceneGridService.RemoveUserFriend(ownerID, ExfriendID); | ||
4041 | } | ||
4042 | |||
4043 | #endregion | 3805 | #endregion |
4044 | 3806 | ||
4045 | public void HandleObjectPermissionsUpdate(IClientAPI controller, UUID agentID, UUID sessionID, byte field, uint localId, uint mask, byte set) | 3807 | public void HandleObjectPermissionsUpdate(IClientAPI controller, UUID agentID, UUID sessionID, byte field, uint localId, uint mask, byte set) |
@@ -4631,7 +4393,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4631 | group.GetPartName(localID), | 4393 | group.GetPartName(localID), |
4632 | group.GetPartDescription(localID), | 4394 | group.GetPartDescription(localID), |
4633 | (sbyte)AssetType.Object, | 4395 | (sbyte)AssetType.Object, |
4634 | Utils.StringToBytes(sceneObjectXml)); | 4396 | Utils.StringToBytes(sceneObjectXml), |
4397 | group.OwnerID); | ||
4635 | AssetService.Store(asset); | 4398 | AssetService.Store(asset); |
4636 | 4399 | ||
4637 | InventoryItemBase item = new InventoryItemBase(); | 4400 | InventoryItemBase item = new InventoryItemBase(); |
@@ -4955,5 +4718,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
4955 | if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 2000) | 4718 | if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 2000) |
4956 | StartTimer(); | 4719 | StartTimer(); |
4957 | } | 4720 | } |
4721 | |||
4722 | public override ISceneObject DeserializeObject(string representation) | ||
4723 | { | ||
4724 | return SceneObjectSerializer.FromXml2Format(representation); | ||
4725 | } | ||
4726 | |||
4727 | public override bool AllowScriptCrossings | ||
4728 | { | ||
4729 | get { return m_allowScriptCrossings; } | ||
4730 | } | ||
4958 | } | 4731 | } |
4959 | } | 4732 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 5e798c0..4f6e824 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs | |||
@@ -34,7 +34,7 @@ using log4net; | |||
34 | using Nini.Config; | 34 | using Nini.Config; |
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using OpenSim.Framework.Console; | 36 | using OpenSim.Framework.Console; |
37 | using OpenSim.Framework.Communications.Cache; | 37 | |
38 | using OpenSim.Region.Framework.Interfaces; | 38 | using OpenSim.Region.Framework.Interfaces; |
39 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 39 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
40 | 40 | ||
@@ -510,5 +510,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
510 | 510 | ||
511 | MainConsole.Instance.Commands.AddCommand(modulename, shared, command, shorthelp, longhelp, callback); | 511 | MainConsole.Instance.Commands.AddCommand(modulename, shared, command, shorthelp, longhelp, callback); |
512 | } | 512 | } |
513 | |||
514 | public virtual ISceneObject DeserializeObject(string representation) | ||
515 | { | ||
516 | return null; | ||
517 | } | ||
518 | |||
519 | public virtual bool AllowScriptCrossings | ||
520 | { | ||
521 | get { return false; } | ||
522 | } | ||
523 | |||
513 | } | 524 | } |
514 | } | 525 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 2f6a0db..e87f7ca 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | |||
@@ -36,7 +36,6 @@ using log4net; | |||
36 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
37 | using OpenSim.Framework.Client; | 37 | using OpenSim.Framework.Client; |
38 | using OpenSim.Framework.Communications; | 38 | using OpenSim.Framework.Communications; |
39 | using OpenSim.Framework.Communications.Cache; | ||
40 | using OpenSim.Framework.Capabilities; | 39 | using OpenSim.Framework.Capabilities; |
41 | using OpenSim.Region.Framework.Interfaces; | 40 | using OpenSim.Region.Framework.Interfaces; |
42 | using OpenSim.Services.Interfaces; | 41 | using OpenSim.Services.Interfaces; |
@@ -56,8 +55,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
56 | { | 55 | { |
57 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 56 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
58 | 57 | ||
59 | protected CommunicationsManager m_commsProvider; | ||
60 | protected IInterregionCommsOut m_interregionCommsOut; | ||
61 | protected RegionInfo m_regionInfo; | 58 | protected RegionInfo m_regionInfo; |
62 | protected Scene m_scene; | 59 | protected Scene m_scene; |
63 | 60 | ||
@@ -118,17 +115,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
118 | 115 | ||
119 | public KiPrimitiveDelegate KiPrimitive; | 116 | public KiPrimitiveDelegate KiPrimitive; |
120 | 117 | ||
121 | public SceneCommunicationService(CommunicationsManager commsMan) | 118 | public SceneCommunicationService() |
122 | { | 119 | { |
123 | m_commsProvider = commsMan; | ||
124 | m_agentsInTransit = new List<UUID>(); | ||
125 | } | 120 | } |
126 | 121 | ||
127 | public void SetScene(Scene s) | 122 | public void SetScene(Scene s) |
128 | { | 123 | { |
129 | m_scene = s; | 124 | m_scene = s; |
130 | m_regionInfo = s.RegionInfo; | 125 | m_regionInfo = s.RegionInfo; |
131 | m_interregionCommsOut = m_scene.RequestModuleInterface<IInterregionCommsOut>(); | ||
132 | } | 126 | } |
133 | 127 | ||
134 | /// <summary> | 128 | /// <summary> |
@@ -148,377 +142,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
148 | { | 142 | { |
149 | } | 143 | } |
150 | 144 | ||
151 | #region CommsManager Event handlers | ||
152 | |||
153 | /// <summary> | ||
154 | /// A New User will arrive shortly, Informs the scene that there's a new user on the way | ||
155 | /// </summary> | ||
156 | /// <param name="agent">Data we need to ensure that the agent can connect</param> | ||
157 | /// | ||
158 | protected void NewUserConnection(AgentCircuitData agent) | ||
159 | { | ||
160 | handlerExpectUser = OnExpectUser; | ||
161 | if (handlerExpectUser != null) | ||
162 | { | ||
163 | //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname); | ||
164 | handlerExpectUser(agent); | ||
165 | } | ||
166 | } | ||
167 | |||
168 | /// <summary> | ||
169 | /// The Grid has requested us to log-off the user | ||
170 | /// </summary> | ||
171 | /// <param name="AgentID">Unique ID of agent to log-off</param> | ||
172 | /// <param name="RegionSecret">The secret string that the region establishes with the grid when registering</param> | ||
173 | /// <param name="message">The message to send to the user that tells them why they were logged off</param> | ||
174 | protected void GridLogOffUser(UUID AgentID, UUID RegionSecret, string message) | ||
175 | { | ||
176 | handlerLogOffUser = OnLogOffUser; | ||
177 | if (handlerLogOffUser != null) | ||
178 | { | ||
179 | handlerLogOffUser(AgentID, RegionSecret, message); | ||
180 | } | ||
181 | } | ||
182 | |||
183 | /// <summary> | ||
184 | /// Inform the scene that we've got an update about a child agent that we have | ||
185 | /// </summary> | ||
186 | /// <param name="cAgentData"></param> | ||
187 | /// <returns></returns> | ||
188 | protected bool ChildAgentUpdate(ChildAgentDataUpdate cAgentData) | ||
189 | { | ||
190 | handlerChildAgentUpdate = OnChildAgentUpdate; | ||
191 | if (handlerChildAgentUpdate != null) | ||
192 | handlerChildAgentUpdate(cAgentData); | ||
193 | |||
194 | return true; | ||
195 | } | ||
196 | |||
197 | |||
198 | protected void AgentCrossing(UUID agentID, Vector3 position, bool isFlying) | ||
199 | { | ||
200 | handlerAvatarCrossingIntoRegion = OnAvatarCrossingIntoRegion; | ||
201 | if (handlerAvatarCrossingIntoRegion != null) | ||
202 | { | ||
203 | handlerAvatarCrossingIntoRegion(agentID, position, isFlying); | ||
204 | } | ||
205 | } | ||
206 | |||
207 | protected void PrimCrossing(UUID primID, Vector3 position, bool isPhysical) | ||
208 | { | ||
209 | handlerPrimCrossingIntoRegion = OnPrimCrossingIntoRegion; | ||
210 | if (handlerPrimCrossingIntoRegion != null) | ||
211 | { | ||
212 | handlerPrimCrossingIntoRegion(primID, position, isPhysical); | ||
213 | } | ||
214 | } | ||
215 | |||
216 | protected bool CloseConnection(UUID agentID) | ||
217 | { | ||
218 | m_log.Debug("[INTERREGION]: Incoming Agent Close Request for agent: " + agentID); | ||
219 | |||
220 | handlerCloseAgentConnection = OnCloseAgentConnection; | ||
221 | if (handlerCloseAgentConnection != null) | ||
222 | { | ||
223 | return handlerCloseAgentConnection(agentID); | ||
224 | } | ||
225 | |||
226 | return false; | ||
227 | } | ||
228 | |||
229 | protected LandData FetchLandData(uint x, uint y) | ||
230 | { | ||
231 | handlerGetLandData = OnGetLandData; | ||
232 | if (handlerGetLandData != null) | ||
233 | { | ||
234 | return handlerGetLandData(x, y); | ||
235 | } | ||
236 | return null; | ||
237 | } | ||
238 | |||
239 | #endregion | ||
240 | |||
241 | #region Inform Client of Neighbours | ||
242 | |||
243 | private delegate void InformClientOfNeighbourDelegate( | ||
244 | ScenePresence avatar, AgentCircuitData a, GridRegion reg, IPEndPoint endPoint, bool newAgent); | ||
245 | |||
246 | private void InformClientOfNeighbourCompleted(IAsyncResult iar) | ||
247 | { | ||
248 | InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate) iar.AsyncState; | ||
249 | icon.EndInvoke(iar); | ||
250 | } | ||
251 | |||
252 | /// <summary> | ||
253 | /// Async component for informing client of which neighbours exist | ||
254 | /// </summary> | ||
255 | /// <remarks> | ||
256 | /// This needs to run asynchronously, as a network timeout may block the thread for a long while | ||
257 | /// </remarks> | ||
258 | /// <param name="remoteClient"></param> | ||
259 | /// <param name="a"></param> | ||
260 | /// <param name="regionHandle"></param> | ||
261 | /// <param name="endPoint"></param> | ||
262 | private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, GridRegion reg, | ||
263 | IPEndPoint endPoint, bool newAgent) | ||
264 | { | ||
265 | // Let's wait just a little to give time to originating regions to catch up with closing child agents | ||
266 | // after a cross here | ||
267 | Thread.Sleep(500); | ||
268 | |||
269 | uint x, y; | ||
270 | Utils.LongToUInts(reg.RegionHandle, out x, out y); | ||
271 | x = x / Constants.RegionSize; | ||
272 | y = y / Constants.RegionSize; | ||
273 | m_log.Info("[INTERGRID]: Starting to inform client about neighbour " + x + ", " + y + "(" + endPoint.ToString() + ")"); | ||
274 | |||
275 | string capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort | ||
276 | + "/CAPS/" + a.CapsPath + "0000/"; | ||
277 | |||
278 | string reason = String.Empty; | ||
279 | |||
280 | |||
281 | bool regionAccepted = m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, 0, out reason); | ||
282 | |||
283 | if (regionAccepted && newAgent) | ||
284 | { | ||
285 | IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>(); | ||
286 | if (eq != null) | ||
287 | { | ||
288 | #region IP Translation for NAT | ||
289 | IClientIPEndpoint ipepClient; | ||
290 | if (avatar.ClientView.TryGet(out ipepClient)) | ||
291 | { | ||
292 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
293 | } | ||
294 | #endregion | ||
295 | |||
296 | eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); | ||
297 | eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); | ||
298 | m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}", | ||
299 | capsPath, avatar.UUID, avatar.Scene.RegionInfo.RegionName); | ||
300 | } | ||
301 | else | ||
302 | { | ||
303 | avatar.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint); | ||
304 | // TODO: make Event Queue disablable! | ||
305 | } | ||
306 | |||
307 | m_log.Info("[INTERGRID]: Completed inform client about neighbour " + endPoint.ToString()); | ||
308 | |||
309 | } | ||
310 | |||
311 | } | ||
312 | |||
313 | public List<GridRegion> RequestNeighbours(Scene pScene, uint pRegionLocX, uint pRegionLocY) | ||
314 | { | ||
315 | Border[] northBorders = pScene.NorthBorders.ToArray(); | ||
316 | Border[] southBorders = pScene.SouthBorders.ToArray(); | ||
317 | Border[] eastBorders = pScene.EastBorders.ToArray(); | ||
318 | Border[] westBorders = pScene.WestBorders.ToArray(); | ||
319 | |||
320 | // Legacy one region. Provided for simplicity while testing the all inclusive method in the else statement. | ||
321 | if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1) | ||
322 | { | ||
323 | return m_scene.GridService.GetNeighbours(m_regionInfo.ScopeID, m_regionInfo.RegionID); | ||
324 | } | ||
325 | else | ||
326 | { | ||
327 | Vector2 extent = Vector2.Zero; | ||
328 | for (int i = 0; i < eastBorders.Length; i++) | ||
329 | { | ||
330 | extent.X = (eastBorders[i].BorderLine.Z > extent.X) ? eastBorders[i].BorderLine.Z : extent.X; | ||
331 | } | ||
332 | for (int i = 0; i < northBorders.Length; i++) | ||
333 | { | ||
334 | extent.Y = (northBorders[i].BorderLine.Z > extent.Y) ? northBorders[i].BorderLine.Z : extent.Y; | ||
335 | } | ||
336 | |||
337 | // Loss of fraction on purpose | ||
338 | extent.X = ((int)extent.X / (int)Constants.RegionSize) + 1; | ||
339 | extent.Y = ((int)extent.Y / (int)Constants.RegionSize) + 1; | ||
340 | |||
341 | int startX = (int)(pRegionLocX - 1) * (int)Constants.RegionSize; | ||
342 | int startY = (int)(pRegionLocY - 1) * (int)Constants.RegionSize; | ||
343 | |||
344 | int endX = ((int)pRegionLocX + (int)extent.X) * (int)Constants.RegionSize; | ||
345 | int endY = ((int)pRegionLocY + (int)extent.Y) * (int)Constants.RegionSize; | ||
346 | |||
347 | List<GridRegion> neighbours = m_scene.GridService.GetRegionRange(m_regionInfo.ScopeID, startX, endX, startY, endY); | ||
348 | neighbours.RemoveAll(delegate(GridRegion r) { return r.RegionID == m_regionInfo.RegionID; }); | ||
349 | |||
350 | return neighbours; | ||
351 | } | ||
352 | } | ||
353 | |||
354 | /// <summary> | ||
355 | /// This informs all neighboring regions about agent "avatar". | ||
356 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | ||
357 | /// </summary> | ||
358 | public void EnableNeighbourChildAgents(ScenePresence avatar, List<RegionInfo> lstneighbours) | ||
359 | { | ||
360 | List<GridRegion> neighbours = new List<GridRegion>(); | ||
361 | |||
362 | if (m_regionInfo != null) | ||
363 | { | ||
364 | neighbours = RequestNeighbours(avatar.Scene,m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); | ||
365 | } | ||
366 | else | ||
367 | { | ||
368 | m_log.Debug("[ENABLENEIGHBOURCHILDAGENTS]: m_regionInfo was null in EnableNeighbourChildAgents, is this a NPC?"); | ||
369 | } | ||
370 | |||
371 | /// We need to find the difference between the new regions where there are no child agents | ||
372 | /// and the regions where there are already child agents. We only send notification to the former. | ||
373 | List<ulong> neighbourHandles = NeighbourHandles(neighbours); // on this region | ||
374 | neighbourHandles.Add(avatar.Scene.RegionInfo.RegionHandle); // add this region too | ||
375 | List<ulong> previousRegionNeighbourHandles ; | ||
376 | |||
377 | if (avatar.Scene.CapsModule != null) | ||
378 | { | ||
379 | previousRegionNeighbourHandles = | ||
380 | new List<ulong>(avatar.Scene.CapsModule.GetChildrenSeeds(avatar.UUID).Keys); | ||
381 | } | ||
382 | else | ||
383 | { | ||
384 | previousRegionNeighbourHandles = new List<ulong>(); | ||
385 | } | ||
386 | |||
387 | List<ulong> newRegions = NewNeighbours(neighbourHandles, previousRegionNeighbourHandles); | ||
388 | List<ulong> oldRegions = OldNeighbours(neighbourHandles, previousRegionNeighbourHandles); | ||
389 | |||
390 | //Dump("Current Neighbors", neighbourHandles); | ||
391 | //Dump("Previous Neighbours", previousRegionNeighbourHandles); | ||
392 | //Dump("New Neighbours", newRegions); | ||
393 | //Dump("Old Neighbours", oldRegions); | ||
394 | |||
395 | /// Update the scene presence's known regions here on this region | ||
396 | avatar.DropOldNeighbours(oldRegions); | ||
397 | |||
398 | /// Collect as many seeds as possible | ||
399 | Dictionary<ulong, string> seeds; | ||
400 | if (avatar.Scene.CapsModule != null) | ||
401 | seeds | ||
402 | = new Dictionary<ulong, string>(avatar.Scene.CapsModule.GetChildrenSeeds(avatar.UUID)); | ||
403 | else | ||
404 | seeds = new Dictionary<ulong, string>(); | ||
405 | |||
406 | //m_log.Debug(" !!! No. of seeds: " + seeds.Count); | ||
407 | if (!seeds.ContainsKey(avatar.Scene.RegionInfo.RegionHandle)) | ||
408 | seeds.Add(avatar.Scene.RegionInfo.RegionHandle, avatar.ControllingClient.RequestClientInfo().CapsPath); | ||
409 | |||
410 | /// Create the necessary child agents | ||
411 | List<AgentCircuitData> cagents = new List<AgentCircuitData>(); | ||
412 | foreach (GridRegion neighbour in neighbours) | ||
413 | { | ||
414 | if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle) | ||
415 | { | ||
416 | |||
417 | AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); | ||
418 | agent.BaseFolder = UUID.Zero; | ||
419 | agent.InventoryFolder = UUID.Zero; | ||
420 | agent.startpos = new Vector3(128, 128, 70); | ||
421 | agent.child = true; | ||
422 | |||
423 | if (newRegions.Contains(neighbour.RegionHandle)) | ||
424 | { | ||
425 | agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
426 | avatar.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath); | ||
427 | seeds.Add(neighbour.RegionHandle, agent.CapsPath); | ||
428 | } | ||
429 | else | ||
430 | agent.CapsPath = avatar.Scene.CapsModule.GetChildSeed(avatar.UUID, neighbour.RegionHandle); | ||
431 | |||
432 | cagents.Add(agent); | ||
433 | } | ||
434 | } | ||
435 | |||
436 | /// Update all child agent with everyone's seeds | ||
437 | foreach (AgentCircuitData a in cagents) | ||
438 | { | ||
439 | a.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds); | ||
440 | } | ||
441 | |||
442 | if (avatar.Scene.CapsModule != null) | ||
443 | { | ||
444 | // These two are the same thing! | ||
445 | avatar.Scene.CapsModule.SetChildrenSeed(avatar.UUID, seeds); | ||
446 | } | ||
447 | avatar.KnownRegions = seeds; | ||
448 | //avatar.Scene.DumpChildrenSeeds(avatar.UUID); | ||
449 | //avatar.DumpKnownRegions(); | ||
450 | |||
451 | bool newAgent = false; | ||
452 | int count = 0; | ||
453 | foreach (GridRegion neighbour in neighbours) | ||
454 | { | ||
455 | // Don't do it if there's already an agent in that region | ||
456 | if (newRegions.Contains(neighbour.RegionHandle)) | ||
457 | newAgent = true; | ||
458 | else | ||
459 | newAgent = false; | ||
460 | |||
461 | if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle) | ||
462 | { | ||
463 | InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; | ||
464 | try | ||
465 | { | ||
466 | d.BeginInvoke(avatar, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent, | ||
467 | InformClientOfNeighbourCompleted, | ||
468 | d); | ||
469 | } | ||
470 | |||
471 | catch (ArgumentOutOfRangeException) | ||
472 | { | ||
473 | m_log.ErrorFormat( | ||
474 | "[REGIONINFO]: Neighbour Regions response included the current region in the neighbor list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", | ||
475 | neighbour.ExternalHostName, | ||
476 | neighbour.RegionHandle, | ||
477 | neighbour.RegionLocX, | ||
478 | neighbour.RegionLocY); | ||
479 | } | ||
480 | catch (Exception e) | ||
481 | { | ||
482 | m_log.ErrorFormat( | ||
483 | "[REGIONINFO]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}", | ||
484 | neighbour.ExternalHostName, | ||
485 | neighbour.RegionHandle, | ||
486 | neighbour.RegionLocX, | ||
487 | neighbour.RegionLocY, | ||
488 | e); | ||
489 | |||
490 | // FIXME: Okay, even though we've failed, we're still going to throw the exception on, | ||
491 | // since I don't know what will happen if we just let the client continue | ||
492 | |||
493 | // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. | ||
494 | // throw e; | ||
495 | |||
496 | } | ||
497 | } | ||
498 | count++; | ||
499 | } | ||
500 | } | ||
501 | |||
502 | /// <summary> | ||
503 | /// This informs a single neighboring region about agent "avatar". | ||
504 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | ||
505 | /// </summary> | ||
506 | public void InformNeighborChildAgent(ScenePresence avatar, GridRegion region) | ||
507 | { | ||
508 | AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo(); | ||
509 | agent.BaseFolder = UUID.Zero; | ||
510 | agent.InventoryFolder = UUID.Zero; | ||
511 | agent.startpos = new Vector3(128, 128, 70); | ||
512 | agent.child = true; | ||
513 | |||
514 | InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; | ||
515 | d.BeginInvoke(avatar, agent, region, region.ExternalEndPoint, true, | ||
516 | InformClientOfNeighbourCompleted, | ||
517 | d); | ||
518 | } | ||
519 | |||
520 | #endregion | ||
521 | |||
522 | public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle); | 145 | public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle); |
523 | 146 | ||
524 | private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar) | 147 | private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar) |
@@ -550,7 +173,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
550 | } | 173 | } |
551 | else | 174 | else |
552 | { | 175 | { |
553 | m_log.WarnFormat("[INTERGRID]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); | 176 | m_log.InfoFormat("[INTERGRID]: Failed to inform neighbour {0}-{1} that I'm here.", x / Constants.RegionSize, y / Constants.RegionSize); |
554 | } | 177 | } |
555 | } | 178 | } |
556 | 179 | ||
@@ -592,7 +215,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
592 | try | 215 | try |
593 | { | 216 | { |
594 | //m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData); | 217 | //m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData); |
595 | m_interregionCommsOut.SendChildAgentUpdate(regionHandle, cAgentData); | 218 | uint x = 0, y = 0; |
219 | Utils.LongToUInts(regionHandle, out x, out y); | ||
220 | GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
221 | m_scene.SimulationService.UpdateAgent(destination, cAgentData); | ||
596 | } | 222 | } |
597 | catch | 223 | catch |
598 | { | 224 | { |
@@ -652,7 +278,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
652 | // let's do our best, but there's not much we can do if the neighbour doesn't accept. | 278 | // let's do our best, but there's not much we can do if the neighbour doesn't accept. |
653 | 279 | ||
654 | //m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID); | 280 | //m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID); |
655 | m_interregionCommsOut.SendCloseAgent(regionHandle, agentID); | 281 | uint x = 0, y = 0; |
282 | Utils.LongToUInts(regionHandle, out x, out y); | ||
283 | GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); | ||
284 | m_scene.SimulationService.CloseAgent(destination, agentID); | ||
656 | } | 285 | } |
657 | 286 | ||
658 | private void SendCloseChildAgentCompleted(IAsyncResult iar) | 287 | private void SendCloseChildAgentCompleted(IAsyncResult iar) |
@@ -671,822 +300,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
671 | d); | 300 | d); |
672 | } | 301 | } |
673 | } | 302 | } |
674 | 303 | ||
675 | |||
676 | /// <summary> | ||
677 | /// Try to teleport an agent to a new region. | ||
678 | /// </summary> | ||
679 | /// <param name="remoteClient"></param> | ||
680 | /// <param name="RegionHandle"></param> | ||
681 | /// <param name="position"></param> | ||
682 | /// <param name="lookAt"></param> | ||
683 | /// <param name="flags"></param> | ||
684 | public virtual void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position, | ||
685 | Vector3 lookAt, uint teleportFlags) | ||
686 | { | ||
687 | if (!avatar.Scene.Permissions.CanTeleport(avatar.UUID)) | ||
688 | return; | ||
689 | |||
690 | bool destRegionUp = true; | ||
691 | |||
692 | IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>(); | ||
693 | |||
694 | // Reset animations; the viewer does that in teleports. | ||
695 | avatar.Animator.ResetAnimations(); | ||
696 | |||
697 | if (regionHandle == m_regionInfo.RegionHandle) | ||
698 | { | ||
699 | m_log.DebugFormat( | ||
700 | "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation {0} within {1}", | ||
701 | position, m_regionInfo.RegionName); | ||
702 | |||
703 | // Teleport within the same region | ||
704 | if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0) | ||
705 | { | ||
706 | Vector3 emergencyPos = new Vector3(128, 128, 128); | ||
707 | |||
708 | m_log.WarnFormat( | ||
709 | "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", | ||
710 | position, avatar.Name, avatar.UUID, emergencyPos); | ||
711 | position = emergencyPos; | ||
712 | } | ||
713 | |||
714 | // TODO: Get proper AVG Height | ||
715 | float localAVHeight = 1.56f; | ||
716 | float posZLimit = 22; | ||
717 | |||
718 | // TODO: Check other Scene HeightField | ||
719 | if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <=(int)Constants.RegionSize) | ||
720 | { | ||
721 | posZLimit = (float) avatar.Scene.Heightmap[(int) position.X, (int) position.Y]; | ||
722 | } | ||
723 | |||
724 | float newPosZ = posZLimit + localAVHeight; | ||
725 | if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ))) | ||
726 | { | ||
727 | position.Z = newPosZ; | ||
728 | } | ||
729 | |||
730 | // Only send this if the event queue is null | ||
731 | if (eq == null) | ||
732 | avatar.ControllingClient.SendTeleportLocationStart(); | ||
733 | |||
734 | avatar.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); | ||
735 | avatar.Teleport(position); | ||
736 | } | ||
737 | else | ||
738 | { | ||
739 | uint x = 0, y = 0; | ||
740 | Utils.LongToUInts(regionHandle, out x, out y); | ||
741 | GridRegion reg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); | ||
742 | |||
743 | if (reg != null) | ||
744 | { | ||
745 | m_log.DebugFormat( | ||
746 | "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation to {0} in {1}", | ||
747 | position, reg.RegionName); | ||
748 | |||
749 | if (eq == null) | ||
750 | avatar.ControllingClient.SendTeleportLocationStart(); | ||
751 | |||
752 | // Let's do DNS resolution only once in this process, please! | ||
753 | // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field, | ||
754 | // it's actually doing a lot of work. | ||
755 | IPEndPoint endPoint = reg.ExternalEndPoint; | ||
756 | if (endPoint.Address == null) | ||
757 | { | ||
758 | // Couldn't resolve the name. Can't TP, because the viewer wants IP addresses. | ||
759 | destRegionUp = false; | ||
760 | } | ||
761 | |||
762 | if (destRegionUp) | ||
763 | { | ||
764 | uint newRegionX = (uint)(reg.RegionHandle >> 40); | ||
765 | uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); | ||
766 | uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40); | ||
767 | uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8); | ||
768 | |||
769 | // Fixing a bug where teleporting while sitting results in the avatar ending up removed from | ||
770 | // both regions | ||
771 | if (avatar.ParentID != (uint)0) | ||
772 | avatar.StandUp(); | ||
773 | |||
774 | if (!avatar.ValidateAttachments()) | ||
775 | { | ||
776 | avatar.ControllingClient.SendTeleportFailed("Inconsistent attachment state"); | ||
777 | return; | ||
778 | } | ||
779 | |||
780 | // the avatar.Close below will clear the child region list. We need this below for (possibly) | ||
781 | // closing the child agents, so save it here (we need a copy as it is Clear()-ed). | ||
782 | //List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList()); | ||
783 | // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport | ||
784 | // failure at this point (unlike a border crossing failure). So perhaps this can never fail | ||
785 | // once we reach here... | ||
786 | //avatar.Scene.RemoveCapsHandler(avatar.UUID); | ||
787 | |||
788 | string capsPath = String.Empty; | ||
789 | AgentCircuitData agentCircuit = avatar.ControllingClient.RequestClientInfo(); | ||
790 | agentCircuit.BaseFolder = UUID.Zero; | ||
791 | agentCircuit.InventoryFolder = UUID.Zero; | ||
792 | agentCircuit.startpos = position; | ||
793 | agentCircuit.child = true; | ||
794 | |||
795 | if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
796 | { | ||
797 | // brand new agent, let's create a new caps seed | ||
798 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | ||
799 | } | ||
800 | |||
801 | string reason = String.Empty; | ||
802 | |||
803 | // Let's create an agent there if one doesn't exist yet. | ||
804 | //if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agentCircuit)) | ||
805 | if (!m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, agentCircuit, teleportFlags, out reason)) | ||
806 | { | ||
807 | avatar.ControllingClient.SendTeleportFailed(String.Format("Destination is not accepting teleports: {0}", | ||
808 | reason)); | ||
809 | return; | ||
810 | } | ||
811 | |||
812 | // OK, it got this agent. Let's close some child agents | ||
813 | avatar.CloseChildAgents(newRegionX, newRegionY); | ||
814 | |||
815 | if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
816 | { | ||
817 | #region IP Translation for NAT | ||
818 | IClientIPEndpoint ipepClient; | ||
819 | if (avatar.ClientView.TryGet(out ipepClient)) | ||
820 | { | ||
821 | capsPath | ||
822 | = "http://" | ||
823 | + NetworkUtil.GetHostFor(ipepClient.EndPoint, reg.ExternalHostName) | ||
824 | + ":" | ||
825 | + reg.HttpPort | ||
826 | + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
827 | } | ||
828 | else | ||
829 | { | ||
830 | capsPath | ||
831 | = "http://" | ||
832 | + reg.ExternalHostName | ||
833 | + ":" | ||
834 | + reg.HttpPort | ||
835 | + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath); | ||
836 | } | ||
837 | #endregion | ||
838 | |||
839 | if (eq != null) | ||
840 | { | ||
841 | #region IP Translation for NAT | ||
842 | // Uses ipepClient above | ||
843 | if (avatar.ClientView.TryGet(out ipepClient)) | ||
844 | { | ||
845 | endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address); | ||
846 | } | ||
847 | #endregion | ||
848 | |||
849 | eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); | ||
850 | |||
851 | // ES makes the client send a UseCircuitCode message to the destination, | ||
852 | // which triggers a bunch of things there. | ||
853 | // So let's wait | ||
854 | Thread.Sleep(2000); | ||
855 | |||
856 | eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); | ||
857 | } | ||
858 | else | ||
859 | { | ||
860 | avatar.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint); | ||
861 | } | ||
862 | } | ||
863 | else | ||
864 | { | ||
865 | agentCircuit.CapsPath = avatar.Scene.CapsModule.GetChildSeed(avatar.UUID, reg.RegionHandle); | ||
866 | capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort | ||
867 | + "/CAPS/" + agentCircuit.CapsPath + "0000/"; | ||
868 | } | ||
869 | |||
870 | // Expect avatar crossing is a heavy-duty function at the destination. | ||
871 | // That is where MakeRoot is called, which fetches appearance and inventory. | ||
872 | // Plus triggers OnMakeRoot, which spawns a series of asynchronous updates. | ||
873 | //m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId, | ||
874 | // position, false); | ||
875 | |||
876 | //{ | ||
877 | // avatar.ControllingClient.SendTeleportFailed("Problem with destination."); | ||
878 | // // We should close that agent we just created over at destination... | ||
879 | // List<ulong> lst = new List<ulong>(); | ||
880 | // lst.Add(reg.RegionHandle); | ||
881 | // SendCloseChildAgentAsync(avatar.UUID, lst); | ||
882 | // return; | ||
883 | //} | ||
884 | |||
885 | SetInTransit(avatar.UUID); | ||
886 | // Let's send a full update of the agent. This is a synchronous call. | ||
887 | AgentData agent = new AgentData(); | ||
888 | avatar.CopyTo(agent); | ||
889 | agent.Position = position; | ||
890 | agent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort + | ||
891 | "/agent/" + avatar.UUID.ToString() + "/" + avatar.Scene.RegionInfo.RegionHandle.ToString() + "/release/"; | ||
892 | |||
893 | m_interregionCommsOut.SendChildAgentUpdate(reg.RegionHandle, agent); | ||
894 | |||
895 | m_log.DebugFormat( | ||
896 | "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, avatar.UUID); | ||
897 | |||
898 | |||
899 | if (eq != null) | ||
900 | { | ||
901 | eq.TeleportFinishEvent(reg.RegionHandle, 13, endPoint, | ||
902 | 0, teleportFlags, capsPath, avatar.UUID); | ||
903 | } | ||
904 | else | ||
905 | { | ||
906 | avatar.ControllingClient.SendRegionTeleport(reg.RegionHandle, 13, endPoint, 4, | ||
907 | teleportFlags, capsPath); | ||
908 | } | ||
909 | |||
910 | // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which | ||
911 | // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation | ||
912 | // that the client contacted the destination before we send the attachments and close things here. | ||
913 | if (!WaitForCallback(avatar.UUID)) | ||
914 | { | ||
915 | // Client never contacted destination. Let's restore everything back | ||
916 | avatar.ControllingClient.SendTeleportFailed("Problems connecting to destination."); | ||
917 | |||
918 | ResetFromTransit(avatar.UUID); | ||
919 | |||
920 | // Yikes! We should just have a ref to scene here. | ||
921 | avatar.Scene.InformClientOfNeighbours(avatar); | ||
922 | |||
923 | // Finally, kill the agent we just created at the destination. | ||
924 | m_interregionCommsOut.SendCloseAgent(reg.RegionHandle, avatar.UUID); | ||
925 | |||
926 | return; | ||
927 | } | ||
928 | |||
929 | // Can't go back from here | ||
930 | if (KiPrimitive != null) | ||
931 | { | ||
932 | KiPrimitive(avatar.LocalId); | ||
933 | } | ||
934 | |||
935 | avatar.MakeChildAgent(); | ||
936 | |||
937 | // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it | ||
938 | avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true); | ||
939 | |||
940 | // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone | ||
941 | |||
942 | if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY)) | ||
943 | { | ||
944 | Thread.Sleep(5000); | ||
945 | avatar.Close(); | ||
946 | CloseConnection(avatar.UUID); | ||
947 | } | ||
948 | else | ||
949 | // now we have a child agent in this region. | ||
950 | avatar.Reset(); | ||
951 | |||
952 | |||
953 | // if (teleport success) // seems to be always success here | ||
954 | // the user may change their profile information in other region, | ||
955 | // so the userinfo in UserProfileCache is not reliable any more, delete it | ||
956 | if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) | ||
957 | { | ||
958 | m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID); | ||
959 | m_log.DebugFormat( | ||
960 | "[SCENE COMMUNICATION SERVICE]: User {0} is going to another region, profile cache removed", | ||
961 | avatar.UUID); | ||
962 | } | ||
963 | } | ||
964 | else | ||
965 | { | ||
966 | avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); | ||
967 | } | ||
968 | } | ||
969 | else | ||
970 | { | ||
971 | // TP to a place that doesn't exist (anymore) | ||
972 | // Inform the viewer about that | ||
973 | avatar.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore"); | ||
974 | |||
975 | // and set the map-tile to '(Offline)' | ||
976 | uint regX, regY; | ||
977 | Utils.LongToUInts(regionHandle, out regX, out regY); | ||
978 | |||
979 | MapBlockData block = new MapBlockData(); | ||
980 | block.X = (ushort)(regX / Constants.RegionSize); | ||
981 | block.Y = (ushort)(regY / Constants.RegionSize); | ||
982 | block.Access = 254; // == not there | ||
983 | |||
984 | List<MapBlockData> blocks = new List<MapBlockData>(); | ||
985 | blocks.Add(block); | ||
986 | avatar.ControllingClient.SendMapBlock(blocks, 0); | ||
987 | } | ||
988 | } | ||
989 | } | ||
990 | |||
991 | protected bool IsOutsideRegion(Scene s, Vector3 pos) | ||
992 | { | ||
993 | |||
994 | if (s.TestBorderCross(pos,Cardinals.N)) | ||
995 | return true; | ||
996 | if (s.TestBorderCross(pos, Cardinals.S)) | ||
997 | return true; | ||
998 | if (s.TestBorderCross(pos, Cardinals.E)) | ||
999 | return true; | ||
1000 | if (s.TestBorderCross(pos, Cardinals.W)) | ||
1001 | return true; | ||
1002 | |||
1003 | return false; | ||
1004 | } | ||
1005 | |||
1006 | public bool WaitForCallback(UUID id) | ||
1007 | { | ||
1008 | int count = 200; | ||
1009 | while (m_agentsInTransit.Contains(id) && count-- > 0) | ||
1010 | { | ||
1011 | //m_log.Debug(" >>> Waiting... " + count); | ||
1012 | Thread.Sleep(100); | ||
1013 | } | ||
1014 | |||
1015 | if (count > 0) | ||
1016 | return true; | ||
1017 | else | ||
1018 | return false; | ||
1019 | } | ||
1020 | |||
1021 | public bool ReleaseAgent(UUID id) | ||
1022 | { | ||
1023 | //m_log.Debug(" >>> ReleaseAgent called <<< "); | ||
1024 | return ResetFromTransit(id); | ||
1025 | } | ||
1026 | |||
1027 | public void SetInTransit(UUID id) | ||
1028 | { | ||
1029 | lock (m_agentsInTransit) | ||
1030 | { | ||
1031 | if (!m_agentsInTransit.Contains(id)) | ||
1032 | m_agentsInTransit.Add(id); | ||
1033 | } | ||
1034 | } | ||
1035 | |||
1036 | protected bool ResetFromTransit(UUID id) | ||
1037 | { | ||
1038 | lock (m_agentsInTransit) | ||
1039 | { | ||
1040 | if (m_agentsInTransit.Contains(id)) | ||
1041 | { | ||
1042 | m_agentsInTransit.Remove(id); | ||
1043 | return true; | ||
1044 | } | ||
1045 | } | ||
1046 | return false; | ||
1047 | } | ||
1048 | |||
1049 | private List<ulong> NeighbourHandles(List<GridRegion> neighbours) | ||
1050 | { | ||
1051 | List<ulong> handles = new List<ulong>(); | ||
1052 | foreach (GridRegion reg in neighbours) | ||
1053 | { | ||
1054 | handles.Add(reg.RegionHandle); | ||
1055 | } | ||
1056 | return handles; | ||
1057 | } | ||
1058 | |||
1059 | private List<ulong> NewNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | ||
1060 | { | ||
1061 | return currentNeighbours.FindAll(delegate(ulong handle) { return !previousNeighbours.Contains(handle); }); | ||
1062 | } | ||
1063 | |||
1064 | // private List<ulong> CommonNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | ||
1065 | // { | ||
1066 | // return currentNeighbours.FindAll(delegate(ulong handle) { return previousNeighbours.Contains(handle); }); | ||
1067 | // } | ||
1068 | |||
1069 | private List<ulong> OldNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours) | ||
1070 | { | ||
1071 | return previousNeighbours.FindAll(delegate(ulong handle) { return !currentNeighbours.Contains(handle); }); | ||
1072 | } | ||
1073 | |||
1074 | public void CrossAgentToNewRegion(Scene scene, ScenePresence agent, bool isFlying) | ||
1075 | { | ||
1076 | Vector3 pos = agent.AbsolutePosition; | ||
1077 | Vector3 newpos = new Vector3(pos.X, pos.Y, pos.Z); | ||
1078 | uint neighbourx = m_regionInfo.RegionLocX; | ||
1079 | uint neighboury = m_regionInfo.RegionLocY; | ||
1080 | const float boundaryDistance = 1.7f; | ||
1081 | Vector3 northCross = new Vector3(0,boundaryDistance, 0); | ||
1082 | Vector3 southCross = new Vector3(0, -1 * boundaryDistance, 0); | ||
1083 | Vector3 eastCross = new Vector3(boundaryDistance, 0, 0); | ||
1084 | Vector3 westCross = new Vector3(-1 * boundaryDistance, 0, 0); | ||
1085 | |||
1086 | // distance to edge that will trigger crossing | ||
1087 | |||
1088 | |||
1089 | // distance into new region to place avatar | ||
1090 | const float enterDistance = 0.5f; | ||
1091 | |||
1092 | if (scene.TestBorderCross(pos + westCross, Cardinals.W)) | ||
1093 | { | ||
1094 | if (scene.TestBorderCross(pos + northCross, Cardinals.N)) | ||
1095 | { | ||
1096 | Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); | ||
1097 | neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); | ||
1098 | } | ||
1099 | else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) | ||
1100 | { | ||
1101 | Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S); | ||
1102 | if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0) | ||
1103 | { | ||
1104 | neighboury--; | ||
1105 | newpos.Y = Constants.RegionSize - enterDistance; | ||
1106 | } | ||
1107 | else | ||
1108 | { | ||
1109 | neighboury = b.TriggerRegionY; | ||
1110 | neighbourx = b.TriggerRegionX; | ||
1111 | |||
1112 | Vector3 newposition = pos; | ||
1113 | newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; | ||
1114 | newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; | ||
1115 | agent.ControllingClient.SendAgentAlertMessage( | ||
1116 | String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); | ||
1117 | InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); | ||
1118 | return; | ||
1119 | } | ||
1120 | } | ||
1121 | |||
1122 | Border ba = scene.GetCrossedBorder(pos + westCross, Cardinals.W); | ||
1123 | if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0) | ||
1124 | { | ||
1125 | neighbourx--; | ||
1126 | newpos.X = Constants.RegionSize - enterDistance; | ||
1127 | } | ||
1128 | else | ||
1129 | { | ||
1130 | neighboury = ba.TriggerRegionY; | ||
1131 | neighbourx = ba.TriggerRegionX; | ||
1132 | |||
1133 | |||
1134 | Vector3 newposition = pos; | ||
1135 | newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; | ||
1136 | newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; | ||
1137 | agent.ControllingClient.SendAgentAlertMessage( | ||
1138 | String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); | ||
1139 | InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); | ||
1140 | |||
1141 | |||
1142 | return; | ||
1143 | } | ||
1144 | |||
1145 | } | ||
1146 | else if (scene.TestBorderCross(pos + eastCross, Cardinals.E)) | ||
1147 | { | ||
1148 | Border b = scene.GetCrossedBorder(pos + eastCross, Cardinals.E); | ||
1149 | neighbourx += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); | ||
1150 | newpos.X = enterDistance; | ||
1151 | |||
1152 | if (scene.TestBorderCross(pos + southCross, Cardinals.S)) | ||
1153 | { | ||
1154 | Border ba = scene.GetCrossedBorder(pos + southCross, Cardinals.S); | ||
1155 | if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0) | ||
1156 | { | ||
1157 | neighboury--; | ||
1158 | newpos.Y = Constants.RegionSize - enterDistance; | ||
1159 | } | ||
1160 | else | ||
1161 | { | ||
1162 | neighboury = ba.TriggerRegionY; | ||
1163 | neighbourx = ba.TriggerRegionX; | ||
1164 | Vector3 newposition = pos; | ||
1165 | newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; | ||
1166 | newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; | ||
1167 | agent.ControllingClient.SendAgentAlertMessage( | ||
1168 | String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); | ||
1169 | InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); | ||
1170 | return; | ||
1171 | } | ||
1172 | } | ||
1173 | else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) | ||
1174 | { | ||
1175 | Border c = scene.GetCrossedBorder(pos + northCross, Cardinals.N); | ||
1176 | neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize); | ||
1177 | newpos.Y = enterDistance; | ||
1178 | } | ||
1179 | |||
1180 | |||
1181 | } | ||
1182 | else if (scene.TestBorderCross(pos + southCross, Cardinals.S)) | ||
1183 | { | ||
1184 | Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S); | ||
1185 | if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0) | ||
1186 | { | ||
1187 | neighboury--; | ||
1188 | newpos.Y = Constants.RegionSize - enterDistance; | ||
1189 | } | ||
1190 | else | ||
1191 | { | ||
1192 | neighboury = b.TriggerRegionY; | ||
1193 | neighbourx = b.TriggerRegionX; | ||
1194 | Vector3 newposition = pos; | ||
1195 | newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize; | ||
1196 | newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize; | ||
1197 | agent.ControllingClient.SendAgentAlertMessage( | ||
1198 | String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false); | ||
1199 | InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene); | ||
1200 | return; | ||
1201 | } | ||
1202 | } | ||
1203 | else if (scene.TestBorderCross(pos + northCross, Cardinals.N)) | ||
1204 | { | ||
1205 | |||
1206 | Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N); | ||
1207 | neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize); | ||
1208 | newpos.Y = enterDistance; | ||
1209 | } | ||
1210 | |||
1211 | /* | ||
1212 | |||
1213 | if (pos.X < boundaryDistance) //West | ||
1214 | { | ||
1215 | neighbourx--; | ||
1216 | newpos.X = Constants.RegionSize - enterDistance; | ||
1217 | } | ||
1218 | else if (pos.X > Constants.RegionSize - boundaryDistance) // East | ||
1219 | { | ||
1220 | neighbourx++; | ||
1221 | newpos.X = enterDistance; | ||
1222 | } | ||
1223 | |||
1224 | if (pos.Y < boundaryDistance) // South | ||
1225 | { | ||
1226 | neighboury--; | ||
1227 | newpos.Y = Constants.RegionSize - enterDistance; | ||
1228 | } | ||
1229 | else if (pos.Y > Constants.RegionSize - boundaryDistance) // North | ||
1230 | { | ||
1231 | neighboury++; | ||
1232 | newpos.Y = enterDistance; | ||
1233 | } | ||
1234 | */ | ||
1235 | |||
1236 | CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync; | ||
1237 | d.BeginInvoke(agent, newpos, neighbourx, neighboury, isFlying, CrossAgentToNewRegionCompleted, d); | ||
1238 | } | ||
1239 | |||
1240 | public delegate void InformClientToInitateTeleportToLocationDelegate(ScenePresence agent, uint regionX, uint regionY, | ||
1241 | Vector3 position, | ||
1242 | Scene initiatingScene); | ||
1243 | |||
1244 | public void InformClientToInitateTeleportToLocation(ScenePresence agent, uint regionX, uint regionY, Vector3 position, | ||
1245 | Scene initiatingScene) | ||
1246 | { | ||
1247 | |||
1248 | // This assumes that we know what our neighbors are. | ||
1249 | |||
1250 | InformClientToInitateTeleportToLocationDelegate d = InformClientToInitiateTeleportToLocationAsync; | ||
1251 | d.BeginInvoke(agent,regionX,regionY,position,initiatingScene, | ||
1252 | InformClientToInitiateTeleportToLocationCompleted, | ||
1253 | d); | ||
1254 | } | ||
1255 | |||
1256 | public void InformClientToInitiateTeleportToLocationAsync(ScenePresence agent, uint regionX, uint regionY, Vector3 position, | ||
1257 | Scene initiatingScene) | ||
1258 | { | ||
1259 | Thread.Sleep(10000); | ||
1260 | IMessageTransferModule im = initiatingScene.RequestModuleInterface<IMessageTransferModule>(); | ||
1261 | if (im != null) | ||
1262 | { | ||
1263 | UUID gotoLocation = Util.BuildFakeParcelID( | ||
1264 | Util.UIntsToLong( | ||
1265 | (regionX * | ||
1266 | (uint)Constants.RegionSize), | ||
1267 | (regionY * | ||
1268 | (uint)Constants.RegionSize)), | ||
1269 | (uint)(int)position.X, | ||
1270 | (uint)(int)position.Y, | ||
1271 | (uint)(int)position.Z); | ||
1272 | GridInstantMessage m = new GridInstantMessage(initiatingScene, UUID.Zero, | ||
1273 | "Region", agent.UUID, | ||
1274 | (byte)InstantMessageDialog.GodLikeRequestTeleport, false, | ||
1275 | "", gotoLocation, false, new Vector3(127, 0, 0), | ||
1276 | new Byte[0]); | ||
1277 | im.SendInstantMessage(m, delegate(bool success) | ||
1278 | { | ||
1279 | m_log.DebugFormat("[CLIENT]: Client Initiating Teleport sending IM success = {0}", success); | ||
1280 | }); | ||
1281 | |||
1282 | } | ||
1283 | } | ||
1284 | |||
1285 | private void InformClientToInitiateTeleportToLocationCompleted(IAsyncResult iar) | ||
1286 | { | ||
1287 | InformClientToInitateTeleportToLocationDelegate icon = | ||
1288 | (InformClientToInitateTeleportToLocationDelegate) iar.AsyncState; | ||
1289 | icon.EndInvoke(iar); | ||
1290 | } | ||
1291 | |||
1292 | public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying); | ||
1293 | |||
1294 | /// <summary> | ||
1295 | /// This Closes child agents on neighboring regions | ||
1296 | /// Calls an asynchronous method to do so.. so it doesn't lag the sim. | ||
1297 | /// </summary> | ||
1298 | protected ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying) | ||
1299 | { | ||
1300 | m_log.DebugFormat("[SCENE COMM]: Crossing agent {0} {1} to {2}-{3}", agent.Firstname, agent.Lastname, neighbourx, neighboury); | ||
1301 | |||
1302 | ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); | ||
1303 | |||
1304 | int x = (int)(neighbourx * Constants.RegionSize), y = (int)(neighboury * Constants.RegionSize); | ||
1305 | GridRegion neighbourRegion = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); | ||
1306 | |||
1307 | if (neighbourRegion != null && agent.ValidateAttachments()) | ||
1308 | { | ||
1309 | pos = pos + (agent.Velocity); | ||
1310 | |||
1311 | //CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID); | ||
1312 | //if (userInfo != null) | ||
1313 | //{ | ||
1314 | // userInfo.DropInventory(); | ||
1315 | //} | ||
1316 | //else | ||
1317 | //{ | ||
1318 | // m_log.WarnFormat("[SCENE COMM]: No cached user info found for {0} {1} on leaving region {2}", | ||
1319 | // agent.Name, agent.UUID, agent.Scene.RegionInfo.RegionName); | ||
1320 | //} | ||
1321 | |||
1322 | //bool crossingSuccessful = | ||
1323 | // CrossToNeighbouringRegion(neighbourHandle, agent.ControllingClient.AgentId, pos, | ||
1324 | //isFlying); | ||
1325 | |||
1326 | SetInTransit(agent.UUID); | ||
1327 | AgentData cAgent = new AgentData(); | ||
1328 | agent.CopyTo(cAgent); | ||
1329 | cAgent.Position = pos; | ||
1330 | if (isFlying) | ||
1331 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | ||
1332 | cAgent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort + | ||
1333 | "/agent/" + agent.UUID.ToString() + "/" + agent.Scene.RegionInfo.RegionHandle.ToString() + "/release/"; | ||
1334 | |||
1335 | m_interregionCommsOut.SendChildAgentUpdate(neighbourHandle, cAgent); | ||
1336 | |||
1337 | // Next, let's close the child agent connections that are too far away. | ||
1338 | agent.CloseChildAgents(neighbourx, neighboury); | ||
1339 | |||
1340 | //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); | ||
1341 | agent.ControllingClient.RequestClientInfo(); | ||
1342 | |||
1343 | //m_log.Debug("BEFORE CROSS"); | ||
1344 | //Scene.DumpChildrenSeeds(UUID); | ||
1345 | //DumpKnownRegions(); | ||
1346 | string agentcaps; | ||
1347 | if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps)) | ||
1348 | { | ||
1349 | m_log.ErrorFormat("[SCENE COMM]: No CAPS information for region handle {0}, exiting CrossToNewRegion.", | ||
1350 | neighbourRegion.RegionHandle); | ||
1351 | return agent; | ||
1352 | } | ||
1353 | // TODO Should construct this behind a method | ||
1354 | string capsPath = | ||
1355 | "http://" + neighbourRegion.ExternalHostName + ":" + neighbourRegion.HttpPort | ||
1356 | + "/CAPS/" + agentcaps /*circuitdata.CapsPath*/ + "0000/"; | ||
1357 | |||
1358 | m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); | ||
1359 | |||
1360 | IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>(); | ||
1361 | if (eq != null) | ||
1362 | { | ||
1363 | eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | ||
1364 | capsPath, agent.UUID, agent.ControllingClient.SessionId); | ||
1365 | } | ||
1366 | else | ||
1367 | { | ||
1368 | agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | ||
1369 | capsPath); | ||
1370 | } | ||
1371 | |||
1372 | if (!WaitForCallback(agent.UUID)) | ||
1373 | { | ||
1374 | ResetFromTransit(agent.UUID); | ||
1375 | |||
1376 | // Yikes! We should just have a ref to scene here. | ||
1377 | agent.Scene.InformClientOfNeighbours(agent); | ||
1378 | |||
1379 | return agent; | ||
1380 | } | ||
1381 | |||
1382 | agent.MakeChildAgent(); | ||
1383 | // now we have a child agent in this region. Request all interesting data about other (root) agents | ||
1384 | agent.SendInitialFullUpdateToAllClients(); | ||
1385 | |||
1386 | agent.CrossAttachmentsIntoNewRegion(neighbourHandle, true); | ||
1387 | |||
1388 | // m_scene.SendKillObject(m_localId); | ||
1389 | |||
1390 | agent.Scene.NotifyMyCoarseLocationChange(); | ||
1391 | // the user may change their profile information in other region, | ||
1392 | // so the userinfo in UserProfileCache is not reliable any more, delete it | ||
1393 | if (agent.Scene.NeedSceneCacheClear(agent.UUID)) | ||
1394 | { | ||
1395 | agent.Scene.CommsManager.UserProfileCacheService.RemoveUser(agent.UUID); | ||
1396 | m_log.DebugFormat( | ||
1397 | "[SCENE COMM]: User {0} is going to another region, profile cache removed", agent.UUID); | ||
1398 | } | ||
1399 | } | ||
1400 | |||
1401 | //m_log.Debug("AFTER CROSS"); | ||
1402 | //Scene.DumpChildrenSeeds(UUID); | ||
1403 | //DumpKnownRegions(); | ||
1404 | return agent; | ||
1405 | } | ||
1406 | |||
1407 | private void CrossAgentToNewRegionCompleted(IAsyncResult iar) | ||
1408 | { | ||
1409 | CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; | ||
1410 | ScenePresence agent = icon.EndInvoke(iar); | ||
1411 | |||
1412 | // If the cross was successful, this agent is a child agent | ||
1413 | if (agent.IsChildAgent) | ||
1414 | { | ||
1415 | agent.Reset(); | ||
1416 | } | ||
1417 | else // Not successful | ||
1418 | { | ||
1419 | //CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID); | ||
1420 | //if (userInfo != null) | ||
1421 | //{ | ||
1422 | // userInfo.FetchInventory(); | ||
1423 | //} | ||
1424 | agent.RestoreInCurrentScene(); | ||
1425 | } | ||
1426 | // In any case | ||
1427 | agent.NotInTransit(); | ||
1428 | |||
1429 | //m_log.DebugFormat("[SCENE COMM]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); | ||
1430 | } | ||
1431 | |||
1432 | |||
1433 | public void LogOffUser(UUID userid, UUID regionid, ulong regionhandle, Vector3 position, Vector3 lookat) | ||
1434 | { | ||
1435 | m_commsProvider.LogOffUser(userid, regionid, regionhandle, position, lookat); | ||
1436 | } | ||
1437 | |||
1438 | // deprecated as of 2008-08-27 | ||
1439 | public void LogOffUser(UUID userid, UUID regionid, ulong regionhandle, float posx, float posy, float posz) | ||
1440 | { | ||
1441 | m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz); | ||
1442 | } | ||
1443 | |||
1444 | public void ClearUserAgent(UUID avatarID) | ||
1445 | { | ||
1446 | m_commsProvider.UserService.ClearUserAgent(avatarID); | ||
1447 | } | ||
1448 | |||
1449 | public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) | ||
1450 | { | ||
1451 | m_commsProvider.AddNewUserFriend(friendlistowner, friend, perms); | ||
1452 | } | ||
1453 | |||
1454 | public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) | ||
1455 | { | ||
1456 | m_commsProvider.UpdateUserFriendPerms(friendlistowner, friend, perms); | ||
1457 | } | ||
1458 | |||
1459 | public void RemoveUserFriend(UUID friendlistowner, UUID friend) | ||
1460 | { | ||
1461 | m_commsProvider.RemoveUserFriend(friendlistowner, friend); | ||
1462 | } | ||
1463 | |||
1464 | public List<FriendListItem> GetUserFriendList(UUID friendlistowner) | ||
1465 | { | ||
1466 | return m_commsProvider.GetUserFriendList(friendlistowner); | ||
1467 | } | ||
1468 | |||
1469 | public List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(UUID queryID, string query) | ||
1470 | { | ||
1471 | return m_commsProvider.GenerateAgentPickerRequestResponse(queryID, query); | ||
1472 | } | ||
1473 | |||
1474 | public List<GridRegion> RequestNamedRegions(string name, int maxNumber) | 304 | public List<GridRegion> RequestNamedRegions(string name, int maxNumber) |
1475 | { | 305 | { |
1476 | return m_scene.GridService.GetRegionsByName(UUID.Zero, name, maxNumber); | 306 | return m_scene.GridService.GetRegionsByName(UUID.Zero, name, maxNumber); |
1477 | } | 307 | } |
1478 | 308 | ||
1479 | //private void Dump(string msg, List<ulong> handles) | ||
1480 | //{ | ||
1481 | // m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg); | ||
1482 | // foreach (ulong handle in handles) | ||
1483 | // { | ||
1484 | // uint x, y; | ||
1485 | // Utils.LongToUInts(handle, out x, out y); | ||
1486 | // x = x / Constants.RegionSize; | ||
1487 | // y = y / Constants.RegionSize; | ||
1488 | // m_log.InfoFormat("({0}, {1})", x, y); | ||
1489 | // } | ||
1490 | //} | ||
1491 | } | 309 | } |
1492 | } | 310 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 321cc45..369552f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -35,6 +35,7 @@ using log4net; | |||
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using OpenSim.Region.Framework.Scenes.Types; | 36 | using OpenSim.Region.Framework.Scenes.Types; |
37 | using OpenSim.Region.Physics.Manager; | 37 | using OpenSim.Region.Physics.Manager; |
38 | using OpenSim.Region.Framework.Interfaces; | ||
38 | 39 | ||
39 | namespace OpenSim.Region.Framework.Scenes | 40 | namespace OpenSim.Region.Framework.Scenes |
40 | { | 41 | { |
@@ -517,33 +518,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
517 | /// <returns>The scene object that was attached. Null if the scene object could not be found</returns> | 518 | /// <returns>The scene object that was attached. Null if the scene object could not be found</returns> |
518 | public SceneObjectGroup RezSingleAttachment(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | 519 | public SceneObjectGroup RezSingleAttachment(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) |
519 | { | 520 | { |
520 | SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient, | 521 | IInventoryAccessModule invAccess = m_parentScene.RequestModuleInterface<IInventoryAccessModule>(); |
521 | itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, | 522 | if (invAccess != null) |
522 | false, false, remoteClient.AgentId, true); | ||
523 | |||
524 | if (objatt != null) | ||
525 | { | 523 | { |
526 | bool tainted = false; | 524 | SceneObjectGroup objatt = invAccess.RezObject(remoteClient, |
527 | if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) | 525 | itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, |
528 | tainted = true; | 526 | false, false, remoteClient.AgentId, true); |
527 | |||
529 | 528 | ||
530 | if (AttachObject( | 529 | if (objatt != null) |
531 | remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false)) | ||
532 | { | 530 | { |
531 | bool tainted = false; | ||
532 | if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) | ||
533 | tainted = true; | ||
534 | |||
535 | AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false); | ||
533 | objatt.ScheduleGroupForFullUpdate(); | 536 | objatt.ScheduleGroupForFullUpdate(); |
534 | if (tainted) | 537 | if (tainted) |
535 | objatt.HasGroupChanged = true; | 538 | objatt.HasGroupChanged = true; |
536 | 539 | ||
537 | // Fire after attach, so we don't get messy perms dialogs | 540 | // Fire after attach, so we don't get messy perms dialogs |
538 | // 3 == AttachedRez | 541 | // 3 == AttachedRez |
539 | objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3); | 542 | objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3); |
540 | |||
541 | // Do this last so that event listeners have access to all the effects of the attachment | ||
542 | m_parentScene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId); | ||
543 | } | 543 | } |
544 | return objatt; | ||
544 | } | 545 | } |
545 | 546 | return null; | |
546 | return objatt; | ||
547 | } | 547 | } |
548 | 548 | ||
549 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. | 549 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. |
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index c2e3370..6395d98 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs | |||
@@ -468,11 +468,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
468 | return presences; | 468 | return presences; |
469 | } | 469 | } |
470 | 470 | ||
471 | public RegionInfo GetRegionInfo(ulong regionHandle) | 471 | public RegionInfo GetRegionInfo(UUID regionID) |
472 | { | 472 | { |
473 | foreach (Scene scene in m_localScenes) | 473 | foreach (Scene scene in m_localScenes) |
474 | { | 474 | { |
475 | if (scene.RegionInfo.RegionHandle == regionHandle) | 475 | if (scene.RegionInfo.RegionID == regionID) |
476 | { | 476 | { |
477 | return scene.RegionInfo; | 477 | return scene.RegionInfo; |
478 | } | 478 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index a555eae..04e3221 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -34,7 +34,6 @@ using System.Reflection; | |||
34 | using OpenMetaverse; | 34 | using OpenMetaverse; |
35 | using log4net; | 35 | using log4net; |
36 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
37 | using OpenSim.Framework.Communications.Cache; | ||
38 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes.Scripting; | 38 | using OpenSim.Region.Framework.Scenes.Scripting; |
40 | 39 | ||
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 4973663..f83a4d2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -33,12 +33,12 @@ using OpenMetaverse; | |||
33 | using log4net; | 33 | using log4net; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Client; | 35 | using OpenSim.Framework.Client; |
36 | using OpenSim.Framework.Communications.Cache; | ||
37 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes.Animation; | 37 | using OpenSim.Region.Framework.Scenes.Animation; |
39 | using OpenSim.Region.Framework.Scenes.Types; | 38 | using OpenSim.Region.Framework.Scenes.Types; |
40 | using OpenSim.Region.Physics.Manager; | 39 | using OpenSim.Region.Physics.Manager; |
41 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 40 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
41 | using OpenSim.Services.Interfaces; | ||
42 | 42 | ||
43 | namespace OpenSim.Region.Framework.Scenes | 43 | namespace OpenSim.Region.Framework.Scenes |
44 | { | 44 | { |
@@ -256,6 +256,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
256 | 256 | ||
257 | // For teleports and crossings callbacks | 257 | // For teleports and crossings callbacks |
258 | string m_callbackURI; | 258 | string m_callbackURI; |
259 | UUID m_originRegionID; | ||
260 | |||
259 | ulong m_rootRegionHandle; | 261 | ulong m_rootRegionHandle; |
260 | 262 | ||
261 | /// <value> | 263 | /// <value> |
@@ -1112,8 +1114,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1112 | /// This is called upon a very important packet sent from the client, | 1114 | /// This is called upon a very important packet sent from the client, |
1113 | /// so it's client-controlled. Never call this method directly. | 1115 | /// so it's client-controlled. Never call this method directly. |
1114 | /// </summary> | 1116 | /// </summary> |
1115 | public void CompleteMovement() | 1117 | public void CompleteMovement(IClientAPI client) |
1116 | { | 1118 | { |
1119 | //m_log.Debug("[SCENE PRESENCE]: CompleteMovement"); | ||
1120 | |||
1117 | Vector3 look = Velocity; | 1121 | Vector3 look = Velocity; |
1118 | if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) | 1122 | if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) |
1119 | { | 1123 | { |
@@ -1138,7 +1142,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1138 | if ((m_callbackURI != null) && !m_callbackURI.Equals("")) | 1142 | if ((m_callbackURI != null) && !m_callbackURI.Equals("")) |
1139 | { | 1143 | { |
1140 | m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI); | 1144 | m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI); |
1141 | Scene.SendReleaseAgent(m_rootRegionHandle, UUID, m_callbackURI); | 1145 | Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI); |
1142 | m_callbackURI = null; | 1146 | m_callbackURI = null; |
1143 | } | 1147 | } |
1144 | 1148 | ||
@@ -1146,6 +1150,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
1146 | 1150 | ||
1147 | m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look); | 1151 | m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look); |
1148 | SendInitialData(); | 1152 | SendInitialData(); |
1153 | |||
1154 | // Create child agents in neighbouring regions | ||
1155 | if (!m_isChildAgent) | ||
1156 | { | ||
1157 | IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>(); | ||
1158 | if (m_agentTransfer != null) | ||
1159 | m_agentTransfer.EnableChildAgents(this); | ||
1160 | else | ||
1161 | m_log.DebugFormat("[SCENE PRESENCE]: Unable to create child agents in neighbours, because AgentTransferModule is not active"); | ||
1162 | |||
1163 | IFriendsModule friendsModule = m_scene.RequestModuleInterface<IFriendsModule>(); | ||
1164 | if (friendsModule != null) | ||
1165 | friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); | ||
1166 | } | ||
1167 | |||
1149 | } | 1168 | } |
1150 | 1169 | ||
1151 | /// <summary> | 1170 | /// <summary> |
@@ -2204,6 +2223,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2204 | { | 2223 | { |
2205 | if (m_isChildAgent) | 2224 | if (m_isChildAgent) |
2206 | { | 2225 | { |
2226 | // WHAT??? | ||
2207 | m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!"); | 2227 | m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!"); |
2208 | 2228 | ||
2209 | // we have to reset the user's child agent connections. | 2229 | // we have to reset the user's child agent connections. |
@@ -2227,7 +2247,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2227 | 2247 | ||
2228 | if (m_scene.SceneGridService != null) | 2248 | if (m_scene.SceneGridService != null) |
2229 | { | 2249 | { |
2230 | m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List<RegionInfo>()); | 2250 | IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>(); |
2251 | if (m_agentTransfer != null) | ||
2252 | m_agentTransfer.EnableChildAgents(this); | ||
2231 | } | 2253 | } |
2232 | 2254 | ||
2233 | return; | 2255 | return; |
@@ -2524,14 +2546,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2524 | m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, | 2546 | m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, |
2525 | pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); | 2547 | pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); |
2526 | 2548 | ||
2527 | if (!m_isChildAgent) | ||
2528 | { | ||
2529 | m_scene.InformClientOfNeighbours(this); | ||
2530 | } | ||
2531 | |||
2532 | SendInitialFullUpdateToAllClients(); | 2549 | SendInitialFullUpdateToAllClients(); |
2533 | SendAppearanceToAllOtherAgents(); | 2550 | SendAppearanceToAllOtherAgents(); |
2534 | } | 2551 | } |
2535 | 2552 | ||
2536 | /// <summary> | 2553 | /// <summary> |
2537 | /// Tell the client for this scene presence what items it should be wearing now | 2554 | /// Tell the client for this scene presence what items it should be wearing now |
@@ -2613,14 +2630,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
2613 | } | 2630 | } |
2614 | } | 2631 | } |
2615 | } | 2632 | } |
2633 | |||
2616 | } | 2634 | } |
2617 | 2635 | ||
2636 | |||
2618 | #endregion Bake Cache Check | 2637 | #endregion Bake Cache Check |
2619 | 2638 | ||
2620 | m_appearance.SetAppearance(textureEntry, visualParams); | 2639 | m_appearance.SetAppearance(textureEntry, visualParams); |
2621 | if (m_appearance.AvatarHeight > 0) | 2640 | if (m_appearance.AvatarHeight > 0) |
2622 | SetHeight(m_appearance.AvatarHeight); | 2641 | SetHeight(m_appearance.AvatarHeight); |
2623 | m_scene.CommsManager.AvatarService.UpdateUserAppearance(m_controllingClient.AgentId, m_appearance); | 2642 | |
2643 | // This is not needed, because only the transient data changed | ||
2644 | //AvatarData adata = new AvatarData(m_appearance); | ||
2645 | //m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata); | ||
2624 | 2646 | ||
2625 | SendAppearanceToAllOtherAgents(); | 2647 | SendAppearanceToAllOtherAgents(); |
2626 | if (!m_startAnimationSet) | 2648 | if (!m_startAnimationSet) |
@@ -2640,7 +2662,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2640 | public void SetWearable(int wearableId, AvatarWearable wearable) | 2662 | public void SetWearable(int wearableId, AvatarWearable wearable) |
2641 | { | 2663 | { |
2642 | m_appearance.SetWearable(wearableId, wearable); | 2664 | m_appearance.SetWearable(wearableId, wearable); |
2643 | m_scene.CommsManager.AvatarService.UpdateUserAppearance(m_controllingClient.AgentId, m_appearance); | 2665 | AvatarData adata = new AvatarData(m_appearance); |
2666 | m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata); | ||
2644 | m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++); | 2667 | m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++); |
2645 | } | 2668 | } |
2646 | 2669 | ||
@@ -2963,11 +2986,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2963 | // For now, assign god level 200 to anyone | 2986 | // For now, assign god level 200 to anyone |
2964 | // who is granted god powers, but has no god level set. | 2987 | // who is granted god powers, but has no god level set. |
2965 | // | 2988 | // |
2966 | CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(agentID); | 2989 | UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, agentID); |
2967 | if (profile.UserProfile.GodLevel > 0) | 2990 | if (account != null) |
2968 | m_godlevel = profile.UserProfile.GodLevel; | 2991 | { |
2969 | else | 2992 | if (account.UserLevel > 0) |
2970 | m_godlevel = 200; | 2993 | m_godlevel = account.UserLevel; |
2994 | else | ||
2995 | m_godlevel = 200; | ||
2996 | } | ||
2971 | } | 2997 | } |
2972 | else | 2998 | else |
2973 | { | 2999 | { |
@@ -3033,7 +3059,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3033 | public void CopyTo(AgentData cAgent) | 3059 | public void CopyTo(AgentData cAgent) |
3034 | { | 3060 | { |
3035 | cAgent.AgentID = UUID; | 3061 | cAgent.AgentID = UUID; |
3036 | cAgent.RegionHandle = m_rootRegionHandle; | 3062 | cAgent.RegionID = Scene.RegionInfo.RegionID; |
3037 | 3063 | ||
3038 | cAgent.Position = AbsolutePosition; | 3064 | cAgent.Position = AbsolutePosition; |
3039 | cAgent.Velocity = m_velocity; | 3065 | cAgent.Velocity = m_velocity; |
@@ -3132,7 +3158,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3132 | 3158 | ||
3133 | public void CopyFrom(AgentData cAgent) | 3159 | public void CopyFrom(AgentData cAgent) |
3134 | { | 3160 | { |
3135 | m_rootRegionHandle = cAgent.RegionHandle; | 3161 | m_originRegionID = cAgent.RegionID; |
3136 | 3162 | ||
3137 | m_callbackURI = cAgent.CallbackURI; | 3163 | m_callbackURI = cAgent.CallbackURI; |
3138 | 3164 | ||
@@ -3490,36 +3516,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3490 | } | 3516 | } |
3491 | } | 3517 | } |
3492 | 3518 | ||
3493 | public bool CrossAttachmentsIntoNewRegion(ulong regionHandle, bool silent) | ||
3494 | { | ||
3495 | lock (m_attachments) | ||
3496 | { | ||
3497 | // Validate | ||
3498 | foreach (SceneObjectGroup gobj in m_attachments) | ||
3499 | { | ||
3500 | if (gobj == null || gobj.IsDeleted) | ||
3501 | return false; | ||
3502 | } | ||
3503 | |||
3504 | foreach (SceneObjectGroup gobj in m_attachments) | ||
3505 | { | ||
3506 | // If the prim group is null then something must have happened to it! | ||
3507 | if (gobj != null && gobj.RootPart != null) | ||
3508 | { | ||
3509 | // Set the parent localID to 0 so it transfers over properly. | ||
3510 | gobj.RootPart.SetParentLocalId(0); | ||
3511 | gobj.AbsolutePosition = gobj.RootPart.AttachedPos; | ||
3512 | gobj.RootPart.IsAttachment = false; | ||
3513 | //gobj.RootPart.LastOwnerID = gobj.GetFromAssetID(); | ||
3514 | m_log.DebugFormat("[ATTACHMENT]: Sending attachment {0} to region {1}", gobj.UUID, regionHandle); | ||
3515 | m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj, silent); | ||
3516 | } | ||
3517 | } | ||
3518 | m_attachments.Clear(); | ||
3519 | |||
3520 | return true; | ||
3521 | } | ||
3522 | } | ||
3523 | 3519 | ||
3524 | public void initializeScenePresence(IClientAPI client, RegionInfo region, Scene scene) | 3520 | public void initializeScenePresence(IClientAPI client, RegionInfo region, Scene scene) |
3525 | { | 3521 | { |
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs index e4296ef..c6cf4cc 100644 --- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs +++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs | |||
@@ -31,7 +31,6 @@ using OpenMetaverse; | |||
31 | using log4net; | 31 | using log4net; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Framework.Client; | 33 | using OpenSim.Framework.Client; |
34 | using OpenSim.Framework.Communications.Cache; | ||
35 | using OpenSim.Region.Framework.Interfaces; | 34 | using OpenSim.Region.Framework.Interfaces; |
36 | using OpenSim.Region.Framework.Scenes.Types; | 35 | using OpenSim.Region.Framework.Scenes.Types; |
37 | 36 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs index 0ed00de..b775d27 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs | |||
@@ -32,8 +32,7 @@ using NUnit.Framework.SyntaxHelpers; | |||
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications; | 34 | using OpenSim.Framework.Communications; |
35 | using OpenSim.Framework.Communications.Cache; | 35 | |
36 | using OpenSim.Region.Communications.Local; | ||
37 | using OpenSim.Region.Framework.Scenes; | 36 | using OpenSim.Region.Framework.Scenes; |
38 | using OpenSim.Tests.Common; | 37 | using OpenSim.Tests.Common; |
39 | using OpenSim.Tests.Common.Mock; | 38 | using OpenSim.Tests.Common.Mock; |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs index 709cca2..0b7608d 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs | |||
@@ -32,8 +32,7 @@ using NUnit.Framework.SyntaxHelpers; | |||
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Communications; | 34 | using OpenSim.Framework.Communications; |
35 | using OpenSim.Framework.Communications.Cache; | 35 | |
36 | using OpenSim.Region.Communications.Local; | ||
37 | using OpenSim.Region.Framework.Scenes; | 36 | using OpenSim.Region.Framework.Scenes; |
38 | using OpenSim.Tests.Common; | 37 | using OpenSim.Tests.Common; |
39 | using OpenSim.Tests.Common.Mock; | 38 | using OpenSim.Tests.Common.Mock; |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs index f00dd66..501207e 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs | |||
@@ -40,8 +40,8 @@ using OpenSim.Framework; | |||
40 | using OpenSim.Framework.Communications; | 40 | using OpenSim.Framework.Communications; |
41 | using OpenSim.Region.Framework.Scenes; | 41 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Region.Framework.Interfaces; | 42 | using OpenSim.Region.Framework.Interfaces; |
43 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion; | ||
44 | using OpenSim.Region.CoreModules.World.Serialiser; | 43 | using OpenSim.Region.CoreModules.World.Serialiser; |
44 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; | ||
45 | using OpenSim.Tests.Common; | 45 | using OpenSim.Tests.Common; |
46 | using OpenSim.Tests.Common.Mock; | 46 | using OpenSim.Tests.Common.Mock; |
47 | using OpenSim.Tests.Common.Setup; | 47 | using OpenSim.Tests.Common.Setup; |
@@ -58,7 +58,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
58 | public UUID agent1, agent2, agent3; | 58 | public UUID agent1, agent2, agent3; |
59 | public static Random random; | 59 | public static Random random; |
60 | public ulong region1,region2,region3; | 60 | public ulong region1,region2,region3; |
61 | public TestCommunicationsManager cm; | ||
62 | public AgentCircuitData acd1; | 61 | public AgentCircuitData acd1; |
63 | public SceneObjectGroup sog1, sog2, sog3; | 62 | public SceneObjectGroup sog1, sog2, sog3; |
64 | public TestClient testclient; | 63 | public TestClient testclient; |
@@ -66,12 +65,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
66 | [TestFixtureSetUp] | 65 | [TestFixtureSetUp] |
67 | public void Init() | 66 | public void Init() |
68 | { | 67 | { |
69 | cm = new TestCommunicationsManager(); | 68 | scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); |
70 | scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000, cm); | 69 | scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); |
71 | scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000, cm); | 70 | scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); |
72 | scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000, cm); | ||
73 | 71 | ||
74 | ISharedRegionModule interregionComms = new RESTInterregionComms(); | 72 | ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); |
75 | interregionComms.Initialise(new IniConfigSource()); | 73 | interregionComms.Initialise(new IniConfigSource()); |
76 | interregionComms.PostInitialise(); | 74 | interregionComms.PostInitialise(); |
77 | SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms); | 75 | SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms); |
@@ -373,7 +371,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
373 | 371 | ||
374 | Assert.That(presence.HasAttachments(), Is.False, "Presence has attachments before cross"); | 372 | Assert.That(presence.HasAttachments(), Is.False, "Presence has attachments before cross"); |
375 | 373 | ||
376 | Assert.That(presence2.CrossAttachmentsIntoNewRegion(region1, true), Is.True, "Cross was not successful"); | 374 | //Assert.That(presence2.CrossAttachmentsIntoNewRegion(region1, true), Is.True, "Cross was not successful"); |
377 | Assert.That(presence2.HasAttachments(), Is.False, "Presence2 objects were not deleted"); | 375 | Assert.That(presence2.HasAttachments(), Is.False, "Presence2 objects were not deleted"); |
378 | Assert.That(presence.HasAttachments(), Is.True, "Presence has not received new objects"); | 376 | Assert.That(presence.HasAttachments(), Is.True, "Presence has not received new objects"); |
379 | } | 377 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs index 8a27b7b..c77220c 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs | |||
@@ -132,7 +132,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
132 | RegionInfo regionInfo = new RegionInfo(0,0,null,null); | 132 | RegionInfo regionInfo = new RegionInfo(0,0,null,null); |
133 | FakeStorageManager storageManager = new FakeStorageManager(); | 133 | FakeStorageManager storageManager = new FakeStorageManager(); |
134 | 134 | ||
135 | new Scene(regionInfo, null, null, null, storageManager, null, false, false, false, null, null); | 135 | new Scene(regionInfo, null, null, storageManager, null, false, false, false, null, null); |
136 | } | 136 | } |
137 | } | 137 | } |
138 | } | 138 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs index b46eb8e..cafe48a 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs | |||
@@ -34,7 +34,7 @@ using OpenMetaverse; | |||
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Communications; | 35 | using OpenSim.Framework.Communications; |
36 | using OpenSim.Region.Framework.Interfaces; | 36 | using OpenSim.Region.Framework.Interfaces; |
37 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion; | 37 | using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; |
38 | using OpenSim.Tests.Common; | 38 | using OpenSim.Tests.Common; |
39 | using OpenSim.Tests.Common.Mock; | 39 | using OpenSim.Tests.Common.Mock; |
40 | using OpenSim.Tests.Common.Setup; | 40 | using OpenSim.Tests.Common.Setup; |
@@ -113,17 +113,16 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
113 | 113 | ||
114 | UUID sceneAId = UUID.Parse("00000000-0000-0000-0000-000000000100"); | 114 | UUID sceneAId = UUID.Parse("00000000-0000-0000-0000-000000000100"); |
115 | UUID sceneBId = UUID.Parse("00000000-0000-0000-0000-000000000200"); | 115 | UUID sceneBId = UUID.Parse("00000000-0000-0000-0000-000000000200"); |
116 | TestCommunicationsManager cm = new TestCommunicationsManager(); | ||
117 | 116 | ||
118 | // shared module | 117 | // shared module |
119 | ISharedRegionModule interregionComms = new RESTInterregionComms(); | 118 | ISharedRegionModule interregionComms = new LocalSimulationConnectorModule(); |
120 | 119 | ||
121 | 120 | ||
122 | Scene sceneB = SceneSetupHelpers.SetupScene("sceneB", sceneBId, 1010, 1010, cm, "grid"); | 121 | Scene sceneB = SceneSetupHelpers.SetupScene("sceneB", sceneBId, 1010, 1010, "grid"); |
123 | SceneSetupHelpers.SetupSceneModules(sceneB, new IniConfigSource(), interregionComms); | 122 | SceneSetupHelpers.SetupSceneModules(sceneB, new IniConfigSource(), interregionComms); |
124 | sceneB.RegisterRegionWithGrid(); | 123 | sceneB.RegisterRegionWithGrid(); |
125 | 124 | ||
126 | Scene sceneA = SceneSetupHelpers.SetupScene("sceneA", sceneAId, 1000, 1000, cm, "grid"); | 125 | Scene sceneA = SceneSetupHelpers.SetupScene("sceneA", sceneAId, 1000, 1000, "grid"); |
127 | SceneSetupHelpers.SetupSceneModules(sceneA, new IniConfigSource(), interregionComms); | 126 | SceneSetupHelpers.SetupSceneModules(sceneA, new IniConfigSource(), interregionComms); |
128 | sceneA.RegisterRegionWithGrid(); | 127 | sceneA.RegisterRegionWithGrid(); |
129 | 128 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs index a36c4db..6686264 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/UuidGathererTests.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
58 | TestHelper.InMethod(); | 58 | TestHelper.InMethod(); |
59 | 59 | ||
60 | UUID corruptAssetUuid = UUID.Parse("00000000-0000-0000-0000-000000000666"); | 60 | UUID corruptAssetUuid = UUID.Parse("00000000-0000-0000-0000-000000000666"); |
61 | AssetBase corruptAsset = AssetHelpers.CreateAsset(corruptAssetUuid, "CORRUPT ASSET"); | 61 | AssetBase corruptAsset = AssetHelpers.CreateAsset(corruptAssetUuid, "CORRUPT ASSET", UUID.Zero); |
62 | m_assetService.Store(corruptAsset); | 62 | m_assetService.Store(corruptAsset); |
63 | 63 | ||
64 | IDictionary<UUID, int> foundAssetUuids = new Dictionary<UUID, int>(); | 64 | IDictionary<UUID, int> foundAssetUuids = new Dictionary<UUID, int>(); |
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 009dd37..96530a1 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs | |||
@@ -627,6 +627,12 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
627 | set { if (!value) Disconnect("IsActive Disconnected?"); } | 627 | set { if (!value) Disconnect("IsActive Disconnected?"); } |
628 | } | 628 | } |
629 | 629 | ||
630 | public bool IsLoggingOut | ||
631 | { | ||
632 | get { return false; } | ||
633 | set { } | ||
634 | } | ||
635 | |||
630 | public bool SendLogoutPacketWhenClosing | 636 | public bool SendLogoutPacketWhenClosing |
631 | { | 637 | { |
632 | set { } | 638 | set { } |
@@ -673,7 +679,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
673 | public event DeRezObject OnDeRezObject; | 679 | public event DeRezObject OnDeRezObject; |
674 | public event Action<IClientAPI> OnRegionHandShakeReply; | 680 | public event Action<IClientAPI> OnRegionHandShakeReply; |
675 | public event GenericCall2 OnRequestWearables; | 681 | public event GenericCall2 OnRequestWearables; |
676 | public event GenericCall2 OnCompleteMovementToRegion; | 682 | public event GenericCall1 OnCompleteMovementToRegion; |
677 | public event UpdateAgent OnAgentUpdate; | 683 | public event UpdateAgent OnAgentUpdate; |
678 | public event AgentRequestSit OnAgentRequestSit; | 684 | public event AgentRequestSit OnAgentRequestSit; |
679 | public event AgentSit OnAgentSit; | 685 | public event AgentSit OnAgentSit; |
@@ -907,7 +913,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
907 | 913 | ||
908 | if (OnCompleteMovementToRegion != null) | 914 | if (OnCompleteMovementToRegion != null) |
909 | { | 915 | { |
910 | OnCompleteMovementToRegion(); | 916 | OnCompleteMovementToRegion(this); |
911 | } | 917 | } |
912 | } | 918 | } |
913 | 919 | ||
@@ -1669,5 +1675,9 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
1669 | public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals) | 1675 | public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals) |
1670 | { | 1676 | { |
1671 | } | 1677 | } |
1678 | |||
1679 | public void SendChangeUserRights(UUID agentID, UUID friendID, int rights) | ||
1680 | { | ||
1681 | } | ||
1672 | } | 1682 | } |
1673 | } | 1683 | } |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Chat/ChannelState.cs b/OpenSim/Region/OptionalModules/Avatar/Chat/ChannelState.cs index b3fa07f..66265d8 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Chat/ChannelState.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Chat/ChannelState.cs | |||
@@ -483,12 +483,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
483 | case "%host" : | 483 | case "%host" : |
484 | result = result.Replace(vvar, rs.Host); | 484 | result = result.Replace(vvar, rs.Host); |
485 | break; | 485 | break; |
486 | case "%master1" : | ||
487 | result = result.Replace(vvar, rs.MA1); | ||
488 | break; | ||
489 | case "%master2" : | ||
490 | result = result.Replace(vvar, rs.MA2); | ||
491 | break; | ||
492 | case "%locx" : | 486 | case "%locx" : |
493 | result = result.Replace(vvar, rs.LocX); | 487 | result = result.Replace(vvar, rs.LocX); |
494 | break; | 488 | break; |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Chat/RegionState.cs b/OpenSim/Region/OptionalModules/Avatar/Chat/RegionState.cs index 773507c..53b103e 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Chat/RegionState.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Chat/RegionState.cs | |||
@@ -57,8 +57,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
57 | internal string Host = String.Empty; | 57 | internal string Host = String.Empty; |
58 | internal string LocX = String.Empty; | 58 | internal string LocX = String.Empty; |
59 | internal string LocY = String.Empty; | 59 | internal string LocY = String.Empty; |
60 | internal string MA1 = String.Empty; | ||
61 | internal string MA2 = String.Empty; | ||
62 | internal string IDK = String.Empty; | 60 | internal string IDK = String.Empty; |
63 | 61 | ||
64 | // System values - used only be the IRC classes themselves | 62 | // System values - used only be the IRC classes themselves |
@@ -85,8 +83,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
85 | Host = scene.RegionInfo.ExternalHostName; | 83 | Host = scene.RegionInfo.ExternalHostName; |
86 | LocX = Convert.ToString(scene.RegionInfo.RegionLocX); | 84 | LocX = Convert.ToString(scene.RegionInfo.RegionLocX); |
87 | LocY = Convert.ToString(scene.RegionInfo.RegionLocY); | 85 | LocY = Convert.ToString(scene.RegionInfo.RegionLocY); |
88 | MA1 = scene.RegionInfo.MasterAvatarFirstName; | ||
89 | MA2 = scene.RegionInfo.MasterAvatarLastName; | ||
90 | IDK = Convert.ToString(_idk_++); | 86 | IDK = Convert.ToString(_idk_++); |
91 | 87 | ||
92 | // OpenChannel conditionally establishes a connection to the | 88 | // OpenChannel conditionally establishes a connection to the |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs index 35819a6..242bc3f 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs | |||
@@ -41,7 +41,7 @@ using log4net; | |||
41 | using Nini.Config; | 41 | using Nini.Config; |
42 | using Nwc.XmlRpc; | 42 | using Nwc.XmlRpc; |
43 | using OpenSim.Framework; | 43 | using OpenSim.Framework; |
44 | using OpenSim.Framework.Communications.Cache; | 44 | |
45 | using OpenSim.Framework.Capabilities; | 45 | using OpenSim.Framework.Capabilities; |
46 | using OpenSim.Framework.Servers; | 46 | using OpenSim.Framework.Servers; |
47 | using OpenSim.Framework.Servers.HttpServer; | 47 | using OpenSim.Framework.Servers.HttpServer; |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs index cb76200..34d0e24 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs | |||
@@ -39,7 +39,7 @@ using log4net; | |||
39 | using Nini.Config; | 39 | using Nini.Config; |
40 | using Nwc.XmlRpc; | 40 | using Nwc.XmlRpc; |
41 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
42 | using OpenSim.Framework.Communications.Cache; | 42 | |
43 | using OpenSim.Framework.Capabilities; | 43 | using OpenSim.Framework.Capabilities; |
44 | using OpenSim.Framework.Servers; | 44 | using OpenSim.Framework.Servers; |
45 | using OpenSim.Framework.Servers.HttpServer; | 45 | using OpenSim.Framework.Servers.HttpServer; |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index 8d32e66..68e6497 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs | |||
@@ -43,6 +43,8 @@ using OpenSim.Region.CoreModules.Framework.EventQueue; | |||
43 | using OpenSim.Region.Framework.Interfaces; | 43 | using OpenSim.Region.Framework.Interfaces; |
44 | using OpenSim.Region.Framework.Scenes; | 44 | using OpenSim.Region.Framework.Scenes; |
45 | 45 | ||
46 | using OpenSim.Services.Interfaces; | ||
47 | |||
46 | using Caps = OpenSim.Framework.Capabilities.Caps; | 48 | using Caps = OpenSim.Framework.Capabilities.Caps; |
47 | using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags; | 49 | using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags; |
48 | 50 | ||
@@ -507,10 +509,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
507 | { | 509 | { |
508 | if (m_debugEnabled) | 510 | if (m_debugEnabled) |
509 | { | 511 | { |
510 | UserProfileData targetUserProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(member.AgentID); | 512 | UserAccount targetUser = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, member.AgentID); |
511 | if (targetUserProfile != null) | 513 | if (targetUser != null) |
512 | { | 514 | { |
513 | m_log.DebugFormat("[GROUPS]: Prepping group notice {0} for agent: {1} who Accepts Notices ({2})", NoticeID, targetUserProfile.Name, member.AcceptNotices); | 515 | m_log.DebugFormat("[GROUPS]: Prepping group notice {0} for agent: {1} who Accepts Notices ({2})", NoticeID, targetUser.FirstName + " " + targetUser.LastName, member.AcceptNotices); |
514 | } | 516 | } |
515 | else | 517 | else |
516 | { | 518 | { |
@@ -990,9 +992,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
990 | remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, groupID, true); | 992 | remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, groupID, true); |
991 | 993 | ||
992 | GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, groupID, null); | 994 | GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, groupID, null); |
993 | UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(ejecteeID); | 995 | UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, ejecteeID); |
994 | 996 | if ((groupInfo == null) || (account == null)) | |
995 | if ((groupInfo == null) || (userProfile == null)) | ||
996 | { | 997 | { |
997 | return; | 998 | return; |
998 | } | 999 | } |
@@ -1032,9 +1033,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1032 | msg.toAgentID = remoteClient.AgentId.Guid; | 1033 | msg.toAgentID = remoteClient.AgentId.Guid; |
1033 | msg.timestamp = 0; | 1034 | msg.timestamp = 0; |
1034 | msg.fromAgentName = remoteClient.Name; | 1035 | msg.fromAgentName = remoteClient.Name; |
1035 | if (userProfile != null) | 1036 | if (account != null) |
1036 | { | 1037 | { |
1037 | msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, userProfile.Name); | 1038 | msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, account.FirstName + " " + account.LastName); |
1038 | } | 1039 | } |
1039 | else | 1040 | else |
1040 | { | 1041 | { |
@@ -1147,8 +1148,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1147 | info.RequestID.AgentID = client.AgentId; | 1148 | info.RequestID.AgentID = client.AgentId; |
1148 | info.RequestID.SessionID = client.SessionId; | 1149 | info.RequestID.SessionID = client.SessionId; |
1149 | 1150 | ||
1150 | UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(client.AgentId); | 1151 | //UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(client.AgentId); |
1151 | if (userProfile == null) | 1152 | UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(client.Scene.RegionInfo.ScopeID, client.AgentId); |
1153 | if (account == null) | ||
1152 | { | 1154 | { |
1153 | // This should be impossible. If I've been passed a reference to a client | 1155 | // This should be impossible. If I've been passed a reference to a client |
1154 | // that client should be registered with the UserService. So something | 1156 | // that client should be registered with the UserService. So something |
@@ -1157,19 +1159,17 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1157 | m_log.WarnFormat("[GROUPS]: Could not find a user profile for {0} / {1}", client.Name, client.AgentId); | 1159 | m_log.WarnFormat("[GROUPS]: Could not find a user profile for {0} / {1}", client.Name, client.AgentId); |
1158 | 1160 | ||
1159 | // Default to local user service and hope for the best? | 1161 | // Default to local user service and hope for the best? |
1160 | info.RequestID.UserServiceURL = m_sceneList[0].CommsManager.NetworkServersInfo.UserURL; | 1162 | // REFACTORING PROBLEM |
1163 | //info.RequestID.UserServiceURL = m_sceneList[0].CommsManager.NetworkServersInfo.UserURL; | ||
1161 | 1164 | ||
1162 | } | 1165 | } |
1163 | else if (userProfile is ForeignUserProfileData) | ||
1164 | { | ||
1165 | // They aren't from around here | ||
1166 | ForeignUserProfileData fupd = (ForeignUserProfileData)userProfile; | ||
1167 | info.RequestID.UserServiceURL = fupd.UserServerURI; | ||
1168 | } | ||
1169 | else | 1166 | else |
1170 | { | 1167 | { |
1168 | string domain = string.Empty; //m_sceneList[0].CommsManager.NetworkServersInfo.UserURL; | ||
1169 | if (account.ServiceURLs["HomeURI"] != null) | ||
1170 | domain = account.ServiceURLs["HomeURI"].ToString(); | ||
1171 | // They're a local user, use this: | 1171 | // They're a local user, use this: |
1172 | info.RequestID.UserServiceURL = m_sceneList[0].CommsManager.NetworkServersInfo.UserURL; | 1172 | info.RequestID.UserServiceURL = domain; |
1173 | } | 1173 | } |
1174 | 1174 | ||
1175 | m_clientRequestIDInfo.Add(client.AgentId, info); | 1175 | m_clientRequestIDInfo.Add(client.AgentId, info); |
@@ -1342,12 +1342,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1342 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); | 1342 | if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); |
1343 | 1343 | ||
1344 | // TODO: All the client update functions need to be reexamined because most do too much and send too much stuff | 1344 | // TODO: All the client update functions need to be reexamined because most do too much and send too much stuff |
1345 | UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(dataForAgentID); | 1345 | UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(remoteClient.Scene.RegionInfo.ScopeID, dataForAgentID); |
1346 | string firstname, lastname; | 1346 | string firstname, lastname; |
1347 | if (userProfile != null) | 1347 | if (account != null) |
1348 | { | 1348 | { |
1349 | firstname = userProfile.FirstName; | 1349 | firstname = account.FirstName; |
1350 | lastname = userProfile.SurName; | 1350 | lastname = account.LastName; |
1351 | } | 1351 | } |
1352 | else | 1352 | else |
1353 | { | 1353 | { |
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Graphics.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Graphics.cs index 8ea7ad3..a0dc38b 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Graphics.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Graphics.cs | |||
@@ -49,7 +49,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
49 | 49 | ||
50 | public UUID SaveBitmap(Bitmap data, bool lossless, bool temporary) | 50 | public UUID SaveBitmap(Bitmap data, bool lossless, bool temporary) |
51 | { | 51 | { |
52 | AssetBase asset = new AssetBase(UUID.Random(), "MRMDynamicImage", (sbyte)AssetType.Texture); | 52 | AssetBase asset = new AssetBase(UUID.Random(), "MRMDynamicImage", (sbyte)AssetType.Texture, m_scene.RegionInfo.RegionID.ToString()); |
53 | asset.Data = OpenJPEG.EncodeFromImage(data, lossless); | 53 | asset.Data = OpenJPEG.EncodeFromImage(data, lossless); |
54 | asset.Description = "MRM Image"; | 54 | asset.Description = "MRM Image"; |
55 | asset.Local = false; | 55 | asset.Local = false; |
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs index f2adcb7..2ddc31b 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs | |||
@@ -212,8 +212,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
212 | if (script.StartsWith("//MRM:C#")) | 212 | if (script.StartsWith("//MRM:C#")) |
213 | { | 213 | { |
214 | if (m_config.GetBoolean("OwnerOnly", true)) | 214 | if (m_config.GetBoolean("OwnerOnly", true)) |
215 | if (m_scene.GetSceneObjectPart(localID).OwnerID != m_scene.RegionInfo.MasterAvatarAssignedUUID | 215 | if (m_scene.GetSceneObjectPart(localID).OwnerID != m_scene.RegionInfo.EstateSettings.EstateOwner |
216 | || m_scene.GetSceneObjectPart(localID).CreatorID != m_scene.RegionInfo.MasterAvatarAssignedUUID) | 216 | || m_scene.GetSceneObjectPart(localID).CreatorID != m_scene.RegionInfo.EstateSettings.EstateOwner) |
217 | return; | 217 | return; |
218 | 218 | ||
219 | script = ConvertMRMKeywords(script); | 219 | script = ConvertMRMKeywords(script); |
@@ -280,7 +280,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
280 | public void GetGlobalEnvironment(uint localID, out IWorld world, out IHost host) | 280 | public void GetGlobalEnvironment(uint localID, out IWorld world, out IHost host) |
281 | { | 281 | { |
282 | // UUID should be changed to object owner. | 282 | // UUID should be changed to object owner. |
283 | UUID owner = m_scene.RegionInfo.MasterAvatarAssignedUUID; | 283 | UUID owner = m_scene.RegionInfo.EstateSettings.EstateOwner; |
284 | SEUser securityUser = new SEUser(owner, "Name Unassigned"); | 284 | SEUser securityUser = new SEUser(owner, "Name Unassigned"); |
285 | SecurityCredential creds = new SecurityCredential(securityUser, m_scene); | 285 | SecurityCredential creds = new SecurityCredential(securityUser, m_scene); |
286 | 286 | ||
diff --git a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs index 3160cd3..b9a75cc 100644 --- a/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs +++ b/OpenSim/Region/OptionalModules/World/MoneyModule/SampleMoneyModule.cs | |||
@@ -36,10 +36,11 @@ using Nwc.XmlRpc; | |||
36 | using Mono.Addins; | 36 | using Mono.Addins; |
37 | using OpenMetaverse; | 37 | using OpenMetaverse; |
38 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
39 | using OpenSim.Framework.Communications.Cache; | 39 | |
40 | using OpenSim.Framework.Servers.HttpServer; | 40 | using OpenSim.Framework.Servers.HttpServer; |
41 | using OpenSim.Region.Framework.Interfaces; | 41 | using OpenSim.Region.Framework.Interfaces; |
42 | using OpenSim.Region.Framework.Scenes; | 42 | using OpenSim.Region.Framework.Scenes; |
43 | using OpenSim.Services.Interfaces; | ||
43 | 44 | ||
44 | namespace OpenSim.Region.OptionalModules.World.MoneyModule | 45 | namespace OpenSim.Region.OptionalModules.World.MoneyModule |
45 | { | 46 | { |
@@ -65,7 +66,6 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule | |||
65 | // private UUID EconomyBaseAccount = UUID.Zero; | 66 | // private UUID EconomyBaseAccount = UUID.Zero; |
66 | 67 | ||
67 | private float EnergyEfficiency = 0f; | 68 | private float EnergyEfficiency = 0f; |
68 | private bool gridmode = false; | ||
69 | // private ObjectPaid handerOnObjectPaid; | 69 | // private ObjectPaid handerOnObjectPaid; |
70 | private bool m_enabled = true; | 70 | private bool m_enabled = true; |
71 | private bool m_sellEnabled = false; | 71 | private bool m_sellEnabled = false; |
@@ -242,7 +242,6 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule | |||
242 | { | 242 | { |
243 | if (config == "Startup" && startupConfig != null) | 243 | if (config == "Startup" && startupConfig != null) |
244 | { | 244 | { |
245 | gridmode = startupConfig.GetBoolean("gridmode", false); | ||
246 | m_enabled = (startupConfig.GetString("economymodule", "BetaGridLikeMoneyModule") == "BetaGridLikeMoneyModule"); | 245 | m_enabled = (startupConfig.GetString("economymodule", "BetaGridLikeMoneyModule") == "BetaGridLikeMoneyModule"); |
247 | } | 246 | } |
248 | 247 | ||
@@ -292,18 +291,7 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule | |||
292 | 291 | ||
293 | private void GetClientFunds(IClientAPI client) | 292 | private void GetClientFunds(IClientAPI client) |
294 | { | 293 | { |
295 | // Here we check if we're in grid mode | 294 | CheckExistAndRefreshFunds(client.AgentId); |
296 | // I imagine that the 'check balance' | ||
297 | // function for the client should be here or shortly after | ||
298 | |||
299 | if (gridmode) | ||
300 | { | ||
301 | CheckExistAndRefreshFunds(client.AgentId); | ||
302 | } | ||
303 | else | ||
304 | { | ||
305 | CheckExistAndRefreshFunds(client.AgentId); | ||
306 | } | ||
307 | 295 | ||
308 | } | 296 | } |
309 | 297 | ||
@@ -398,10 +386,10 @@ namespace OpenSim.Region.OptionalModules.World.MoneyModule | |||
398 | { | 386 | { |
399 | // try avatar username surname | 387 | // try avatar username surname |
400 | Scene scene = GetRandomScene(); | 388 | Scene scene = GetRandomScene(); |
401 | CachedUserInfo profile = scene.CommsManager.UserProfileCacheService.GetUserDetails(agentID); | 389 | UserAccount account = scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, agentID); |
402 | if (profile != null && profile.UserProfile != null) | 390 | if (account != null) |
403 | { | 391 | { |
404 | string avatarname = profile.UserProfile.FirstName + " " + profile.UserProfile.SurName; | 392 | string avatarname = account.FirstName + " " + account.LastName; |
405 | return avatarname; | 393 | return avatarname; |
406 | } | 394 | } |
407 | else | 395 | else |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index b331001..f8ab8d8 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | |||
@@ -189,7 +189,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
189 | public event DeRezObject OnDeRezObject; | 189 | public event DeRezObject OnDeRezObject; |
190 | public event Action<IClientAPI> OnRegionHandShakeReply; | 190 | public event Action<IClientAPI> OnRegionHandShakeReply; |
191 | public event GenericCall2 OnRequestWearables; | 191 | public event GenericCall2 OnRequestWearables; |
192 | public event GenericCall2 OnCompleteMovementToRegion; | 192 | public event GenericCall1 OnCompleteMovementToRegion; |
193 | public event UpdateAgent OnAgentUpdate; | 193 | public event UpdateAgent OnAgentUpdate; |
194 | public event AgentRequestSit OnAgentRequestSit; | 194 | public event AgentRequestSit OnAgentRequestSit; |
195 | public event AgentSit OnAgentSit; | 195 | public event AgentSit OnAgentSit; |
@@ -457,6 +457,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
457 | set { } | 457 | set { } |
458 | } | 458 | } |
459 | 459 | ||
460 | public bool IsLoggingOut | ||
461 | { | ||
462 | get { return false; } | ||
463 | set { } | ||
464 | } | ||
460 | public UUID ActiveGroupId | 465 | public UUID ActiveGroupId |
461 | { | 466 | { |
462 | get { return UUID.Zero; } | 467 | get { return UUID.Zero; } |
@@ -739,7 +744,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
739 | 744 | ||
740 | if (OnCompleteMovementToRegion != null) | 745 | if (OnCompleteMovementToRegion != null) |
741 | { | 746 | { |
742 | OnCompleteMovementToRegion(); | 747 | OnCompleteMovementToRegion(this); |
743 | } | 748 | } |
744 | } | 749 | } |
745 | public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) | 750 | public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) |
@@ -1150,5 +1155,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
1150 | public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals) | 1155 | public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals) |
1151 | { | 1156 | { |
1152 | } | 1157 | } |
1158 | |||
1159 | public void SendChangeUserRights(UUID agentID, UUID friendID, int rights) | ||
1160 | { | ||
1161 | } | ||
1153 | } | 1162 | } |
1154 | } | 1163 | } |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index ac39a53..6e742f1 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | |||
@@ -34,6 +34,7 @@ using OpenSim.Region.Framework.Scenes; | |||
34 | using OpenSim.Region.CoreModules.Avatar.NPC; | 34 | using OpenSim.Region.CoreModules.Avatar.NPC; |
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using Timer=System.Timers.Timer; | 36 | using Timer=System.Timers.Timer; |
37 | using OpenSim.Services.Interfaces; | ||
37 | 38 | ||
38 | namespace OpenSim.Region.OptionalModules.World.NPC | 39 | namespace OpenSim.Region.OptionalModules.World.NPC |
39 | { | 40 | { |
@@ -63,11 +64,16 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
63 | if (m_appearanceCache.ContainsKey(target)) | 64 | if (m_appearanceCache.ContainsKey(target)) |
64 | return m_appearanceCache[target]; | 65 | return m_appearanceCache[target]; |
65 | 66 | ||
66 | AvatarAppearance x = scene.CommsManager.AvatarService.GetUserAppearance(target); | 67 | AvatarData adata = scene.AvatarService.GetAvatar(target); |
68 | if (adata != null) | ||
69 | { | ||
70 | AvatarAppearance x = adata.ToAvatarAppearance(target); | ||
67 | 71 | ||
68 | m_appearanceCache.Add(target, x); | 72 | m_appearanceCache.Add(target, x); |
69 | 73 | ||
70 | return x; | 74 | return x; |
75 | } | ||
76 | return new AvatarAppearance(); | ||
71 | } | 77 | } |
72 | 78 | ||
73 | public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom) | 79 | public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom) |
diff --git a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs index c8e6e4b..3ed338b 100644 --- a/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs +++ b/OpenSim/Region/OptionalModules/World/TreePopulator/TreePopulatorModule.cs | |||
@@ -306,8 +306,6 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator | |||
306 | 306 | ||
307 | m_log.InfoFormat("[TREES]: New tree planting for copse {0}", copsename); | 307 | m_log.InfoFormat("[TREES]: New tree planting for copse {0}", copsename); |
308 | UUID uuid = m_scene.RegionInfo.EstateSettings.EstateOwner; | 308 | UUID uuid = m_scene.RegionInfo.EstateSettings.EstateOwner; |
309 | if (uuid == UUID.Zero) | ||
310 | uuid = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
311 | 309 | ||
312 | foreach (Copse copse in m_copse) | 310 | foreach (Copse copse in m_copse) |
313 | { | 311 | { |
@@ -760,8 +758,6 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator | |||
760 | Util.GetDistanceTo(position, copse.m_seed_point) <= copse.m_range) | 758 | Util.GetDistanceTo(position, copse.m_seed_point) <= copse.m_range) |
761 | { | 759 | { |
762 | UUID uuid = m_scene.RegionInfo.EstateSettings.EstateOwner; | 760 | UUID uuid = m_scene.RegionInfo.EstateSettings.EstateOwner; |
763 | if (uuid == UUID.Zero) | ||
764 | uuid = m_scene.RegionInfo.MasterAvatarAssignedUUID; | ||
765 | 761 | ||
766 | CreateTree(uuid, copse, position); | 762 | CreateTree(uuid, copse, position); |
767 | } | 763 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index aa876ec..dc4249c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -38,7 +38,7 @@ using OpenMetaverse; | |||
38 | using OpenMetaverse.Packets; | 38 | using OpenMetaverse.Packets; |
39 | using OpenSim; | 39 | using OpenSim; |
40 | using OpenSim.Framework; | 40 | using OpenSim.Framework; |
41 | using OpenSim.Framework.Communications.Cache; | 41 | |
42 | using OpenSim.Region.CoreModules; | 42 | using OpenSim.Region.CoreModules; |
43 | using OpenSim.Region.CoreModules.World.Land; | 43 | using OpenSim.Region.CoreModules.World.Land; |
44 | using OpenSim.Region.CoreModules.World.Terrain; | 44 | using OpenSim.Region.CoreModules.World.Terrain; |
@@ -52,9 +52,10 @@ using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | |||
52 | using OpenSim.Region.ScriptEngine.Interfaces; | 52 | using OpenSim.Region.ScriptEngine.Interfaces; |
53 | using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces; | 53 | using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces; |
54 | using OpenSim.Services.Interfaces; | 54 | using OpenSim.Services.Interfaces; |
55 | 55 | using OpenSim.Services.Interfaces; | |
56 | using PrimType = OpenSim.Region.Framework.Scenes.PrimType; | ||
57 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 56 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
57 | using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo; | ||
58 | using PrimType = OpenSim.Region.Framework.Scenes.PrimType; | ||
58 | using AssetLandmark = OpenSim.Framework.AssetLandmark; | 59 | using AssetLandmark = OpenSim.Framework.AssetLandmark; |
59 | 60 | ||
60 | using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat; | 61 | using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat; |
@@ -848,10 +849,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
848 | public string resolveName(UUID objecUUID) | 849 | public string resolveName(UUID objecUUID) |
849 | { | 850 | { |
850 | // try avatar username surname | 851 | // try avatar username surname |
851 | CachedUserInfo profile = World.CommsManager.UserProfileCacheService.GetUserDetails(objecUUID); | 852 | UserAccount account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, objecUUID); |
852 | if (profile != null && profile.UserProfile != null) | 853 | if (account != null) |
853 | { | 854 | { |
854 | string avatarname = profile.UserProfile.FirstName + " " + profile.UserProfile.SurName; | 855 | string avatarname = account.Name; |
855 | return avatarname; | 856 | return avatarname; |
856 | } | 857 | } |
857 | // try an scene object | 858 | // try an scene object |
@@ -3887,13 +3888,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3887 | 3888 | ||
3888 | UUID uuid = (UUID)id; | 3889 | UUID uuid = (UUID)id; |
3889 | 3890 | ||
3890 | UserProfileData userProfile = | 3891 | UserAccount account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, uuid); |
3891 | World.CommsManager.UserService.GetUserProfile(uuid); | ||
3892 | 3892 | ||
3893 | UserAgentData userAgent = | 3893 | PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() }); |
3894 | World.CommsManager.UserService.GetAgentByUUID(uuid); | 3894 | PresenceInfo pinfo = PresenceInfo.GetOnlinePresence(pinfos); |
3895 | 3895 | ||
3896 | if (userProfile == null || userAgent == null) | 3896 | if (pinfo == null) |
3897 | return UUID.Zero.ToString(); | 3897 | return UUID.Zero.ToString(); |
3898 | 3898 | ||
3899 | string reply = String.Empty; | 3899 | string reply = String.Empty; |
@@ -3902,17 +3902,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3902 | { | 3902 | { |
3903 | case 1: // DATA_ONLINE (0|1) | 3903 | case 1: // DATA_ONLINE (0|1) |
3904 | // TODO: implement fetching of this information | 3904 | // TODO: implement fetching of this information |
3905 | if (userProfile.CurrentAgent!=null && userProfile.CurrentAgent.AgentOnline) | 3905 | if (pinfo != null) |
3906 | reply = "1"; | 3906 | reply = "1"; |
3907 | else | 3907 | else |
3908 | reply = "0"; | 3908 | reply = "0"; |
3909 | break; | 3909 | break; |
3910 | case 2: // DATA_NAME (First Last) | 3910 | case 2: // DATA_NAME (First Last) |
3911 | reply = userProfile.FirstName + " " + userProfile.SurName; | 3911 | reply = account.FirstName + " " + account.LastName; |
3912 | break; | 3912 | break; |
3913 | case 3: // DATA_BORN (YYYY-MM-DD) | 3913 | case 3: // DATA_BORN (YYYY-MM-DD) |
3914 | DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0); | 3914 | DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0); |
3915 | born = born.AddSeconds(userProfile.Created); | 3915 | born = born.AddSeconds(account.Created); |
3916 | reply = born.ToString("yyyy-MM-dd"); | 3916 | reply = born.ToString("yyyy-MM-dd"); |
3917 | break; | 3917 | break; |
3918 | case 4: // DATA_RATING (0,0,0,0,0,0) | 3918 | case 4: // DATA_RATING (0,0,0,0,0,0) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 2c8b0ea..85ee29d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -36,12 +36,11 @@ using OpenMetaverse; | |||
36 | using Nini.Config; | 36 | using Nini.Config; |
37 | using OpenSim; | 37 | using OpenSim; |
38 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
39 | using OpenSim.Framework.Communications.Cache; | 39 | |
40 | using OpenSim.Framework.Console; | 40 | using OpenSim.Framework.Console; |
41 | using OpenSim.Region.CoreModules.Avatar.NPC; | 41 | using OpenSim.Region.CoreModules.Avatar.NPC; |
42 | using OpenSim.Region.Framework.Interfaces; | 42 | using OpenSim.Region.Framework.Interfaces; |
43 | using OpenSim.Region.Framework.Scenes; | 43 | using OpenSim.Region.Framework.Scenes; |
44 | using OpenSim.Region.Framework.Scenes.Hypergrid; | ||
45 | using OpenSim.Region.ScriptEngine.Shared; | 44 | using OpenSim.Region.ScriptEngine.Shared; |
46 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; | 45 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; |
47 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 46 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
@@ -607,21 +606,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
607 | // and convert the regionName to the target region | 606 | // and convert the regionName to the target region |
608 | if (regionName.Contains(".") && regionName.Contains(":")) | 607 | if (regionName.Contains(".") && regionName.Contains(":")) |
609 | { | 608 | { |
609 | List<GridRegion> regions = World.GridService.GetRegionsByName(World.RegionInfo.ScopeID, regionName, 1); | ||
610 | // Try to link the region | 610 | // Try to link the region |
611 | IHyperlinkService hyperService = World.RequestModuleInterface<IHyperlinkService>(); | 611 | if (regions != null && regions.Count > 0) |
612 | if (hyperService != null) | ||
613 | { | 612 | { |
614 | GridRegion regInfo = hyperService.TryLinkRegion(presence.ControllingClient, | 613 | GridRegion regInfo = regions[0]; |
615 | regionName); | 614 | regionName = regInfo.RegionName; |
616 | // Get the region name | ||
617 | if (regInfo != null) | ||
618 | { | ||
619 | regionName = regInfo.RegionName; | ||
620 | } | ||
621 | else | ||
622 | { | ||
623 | // Might need to ping the client here in case of failure?? | ||
624 | } | ||
625 | } | 615 | } |
626 | } | 616 | } |
627 | presence.ControllingClient.SendTeleportLocationStart(); | 617 | presence.ControllingClient.SendTeleportLocationStart(); |
@@ -1484,7 +1474,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1484 | m_host.AddScriptLPS(1); | 1474 | m_host.AddScriptLPS(1); |
1485 | 1475 | ||
1486 | // Create new asset | 1476 | // Create new asset |
1487 | AssetBase asset = new AssetBase(UUID.Random(), notecardName, (sbyte)AssetType.Notecard); | 1477 | AssetBase asset = new AssetBase(UUID.Random(), notecardName, (sbyte)AssetType.Notecard, m_host.OwnerID.ToString()); |
1488 | asset.Description = "Script Generated Notecard"; | 1478 | asset.Description = "Script Generated Notecard"; |
1489 | string notecardData = String.Empty; | 1479 | string notecardData = String.Empty; |
1490 | 1480 | ||
@@ -1691,15 +1681,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1691 | { | 1681 | { |
1692 | CheckThreatLevel(ThreatLevel.Low, "osAvatarName2Key"); | 1682 | CheckThreatLevel(ThreatLevel.Low, "osAvatarName2Key"); |
1693 | 1683 | ||
1694 | CachedUserInfo userInfo = World.CommsManager.UserProfileCacheService.GetUserDetails(firstname, lastname); | 1684 | UserAccount account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, firstname, lastname); |
1695 | 1685 | if (null == account) | |
1696 | if (null == userInfo) | ||
1697 | { | 1686 | { |
1698 | return UUID.Zero.ToString(); | 1687 | return UUID.Zero.ToString(); |
1699 | } | 1688 | } |
1700 | else | 1689 | else |
1701 | { | 1690 | { |
1702 | return userInfo.UserProfile.ID.ToString(); | 1691 | return account.PrincipalID.ToString(); |
1703 | } | 1692 | } |
1704 | } | 1693 | } |
1705 | 1694 | ||
@@ -1710,15 +1699,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1710 | 1699 | ||
1711 | if (UUID.TryParse(id, out key)) | 1700 | if (UUID.TryParse(id, out key)) |
1712 | { | 1701 | { |
1713 | CachedUserInfo userInfo = World.CommsManager.UserProfileCacheService.GetUserDetails(key); | 1702 | UserAccount account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, key); |
1714 | 1703 | if (null == account) | |
1715 | if (null == userInfo) | ||
1716 | { | 1704 | { |
1717 | return ""; | 1705 | return ""; |
1718 | } | 1706 | } |
1719 | else | 1707 | else |
1720 | { | 1708 | { |
1721 | return userInfo.UserProfile.Name; | 1709 | return account.Name; |
1722 | } | 1710 | } |
1723 | } | 1711 | } |
1724 | else | 1712 | else |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index b75a2e4..829fbb7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs | |||
@@ -29,7 +29,7 @@ using System; | |||
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using OpenMetaverse; | 30 | using OpenMetaverse; |
31 | using OpenSim.Framework; | 31 | using OpenSim.Framework; |
32 | using OpenSim.Framework.Communications.Cache; | 32 | |
33 | using OpenSim.Region.Framework.Scenes; | 33 | using OpenSim.Region.Framework.Scenes; |
34 | using OpenSim.Region.ScriptEngine.Shared; | 34 | using OpenSim.Region.ScriptEngine.Shared; |
35 | using OpenSim.Region.ScriptEngine.Shared.Api; | 35 | using OpenSim.Region.ScriptEngine.Shared.Api; |