From 1a7aa1adc551da5e81bcf3a4fec6856012b50d71 Mon Sep 17 00:00:00 2001 From: mingchen Date: Tue, 10 Jul 2007 19:31:33 +0000 Subject: [PATCH] *Added everything --- OpenSim.FxCop | 7241 +++++++++++++++++ OpenSim.sln | 329 + OpenSim.suo | Bin 0 -> 300544 bytes .../Communications/CommunicationsManager.cs | 69 + .../Framework/Communications/IGridServices.cs | 43 + .../IInterRegionCommunications.cs | 38 + .../Framework/Communications/IUserServices.cs | 43 + .../OpenSim.Framework.Communications.csproj | 112 + ...enSim.Framework.Communications.csproj.user | 12 + .../Communications/Properties/AssemblyInfo.cs | 60 + .../OpenSim.Framework.Communications.dll | Bin 0 -> 16384 bytes .../OpenSim.Framework.Communications.pdb | Bin 0 -> 11776 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 17744 bytes ...amework.Communications.csproj.FileList.txt | 7 + .../OpenSim.Framework.Communications.dll | Bin 0 -> 16384 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 17203 bytes .../Configuration/ConfigurationManager.cs | 65 + .../Configuration/ConfigurationMember.cs | 44 + .../Configuration/ConfigurationOption.cs | 13 + .../OpenSim.Framework.Configuration.csproj | 105 + ...penSim.Framework.Configuration.csproj.user | 12 + .../OpenSim.Framework.GenericConfig.csproj | 90 + ...penSim.Framework.GenericConfig.csproj.user | 12 + .../Configuration/XmlConfiguration.cs | 121 + .../Debug/OpenSim.Framework.Configuration.dll | Bin 0 -> 20480 bytes .../Debug/OpenSim.Framework.Configuration.pdb | Bin 0 -> 19968 bytes ...ramework.Configuration.csproj.FileList.txt | 7 + .../OpenSim.Framework.Configuration.dll | Bin 0 -> 20480 bytes OpenSim/Framework/Console/AssemblyInfo.cs | 56 + .../Framework/Console/ConsoleCallbacksBase.cs | 35 + OpenSim/Framework/Console/LogBase.cs | 282 + OpenSim/Framework/Console/MainLog.cs | 47 + .../Console/OpenSim.Framework.Console.csproj | 89 + .../OpenSim.Framework.Console.csproj.user | 12 + .../obj/Debug/OpenSim.Framework.Console.dll | Bin 0 -> 20480 bytes .../obj/Debug/OpenSim.Framework.Console.pdb | Bin 0 -> 22016 bytes ...nSim.Framework.Console.csproj.FileList.txt | 7 + .../obj/Release/OpenSim.Framework.Console.dll | Bin 0 -> 20480 bytes OpenSim/Framework/Data.DB4o/DB4oGridData.cs | 162 + OpenSim/Framework/Data.DB4o/DB4oManager.cs | 163 + OpenSim/Framework/Data.DB4o/DB4oUserData.cs | 202 + .../OpenSim.Framework.Data.DB4o.csproj | 111 + .../OpenSim.Framework.Data.DB4o.csproj.user | 12 + .../Data.DB4o/Properties/AssemblyInfo.cs | 33 + .../obj/Debug/OpenSim.Framework.Data.DB4o.dll | Bin 0 -> 20480 bytes .../obj/Debug/OpenSim.Framework.Data.DB4o.pdb | Bin 0 -> 28160 bytes ...im.Framework.Data.DB4o.csproj.FileList.txt | 7 + .../Release/OpenSim.Framework.Data.DB4o.dll | Bin 0 -> 20480 bytes OpenSim/Framework/Data.MSSQL/MSSQLGridData.cs | 194 + OpenSim/Framework/Data.MSSQL/MSSQLManager.cs | 211 + .../OpenSim.Framework.Data.MSSQL.csproj | 102 + .../OpenSim.Framework.Data.MSSQL.csproj.user | 12 + .../Data.MSSQL/Properties/AssemblyInfo.cs | 33 + .../Debug/OpenSim.Framework.Data.MSSQL.dll | Bin 0 -> 24576 bytes .../Debug/OpenSim.Framework.Data.MSSQL.pdb | Bin 0 -> 19968 bytes ...m.Framework.Data.MSSQL.csproj.FileList.txt | 7 + .../Release/OpenSim.Framework.Data.MSSQL.dll | Bin 0 -> 24576 bytes OpenSim/Framework/Data.MySQL/MySQLGridData.cs | 287 + .../Data.MySQL/MySQLInventoryData.cs | 309 + OpenSim/Framework/Data.MySQL/MySQLLogData.cs | 105 + OpenSim/Framework/Data.MySQL/MySQLManager.cs | 602 ++ OpenSim/Framework/Data.MySQL/MySQLUserData.cs | 256 + .../OpenSim.Framework.Data.MySQL.csproj | 115 + .../OpenSim.Framework.Data.MySQL.csproj.user | 12 + .../Data.MySQL/Properties/AssemblyInfo.cs | 33 + .../Debug/OpenSim.Framework.Data.MySQL.dll | Bin 0 -> 40960 bytes .../Debug/OpenSim.Framework.Data.MySQL.pdb | Bin 0 -> 50688 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 13897 bytes ...m.Framework.Data.MySQL.csproj.FileList.txt | 7 + .../Release/OpenSim.Framework.Data.MySQL.dll | Bin 0 -> 36864 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 13897 bytes .../OpenSim.Framework.Data.SQLite.csproj | 106 + .../OpenSim.Framework.Data.SQLite.csproj.user | 12 + .../Data.SQLite/Properties/AssemblyInfo.cs | 33 + .../Framework/Data.SQLite/SQLiteGridData.cs | 197 + .../Framework/Data.SQLite/SQLiteManager.cs | 206 + .../Debug/OpenSim.Framework.Data.SQLite.dll | Bin 0 -> 24576 bytes .../Debug/OpenSim.Framework.Data.SQLite.pdb | Bin 0 -> 19968 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 12660 bytes ....Framework.Data.SQLite.csproj.FileList.txt | 7 + .../Release/OpenSim.Framework.Data.SQLite.dll | Bin 0 -> 24576 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 12660 bytes OpenSim/Framework/Data/GridData.cs | 111 + OpenSim/Framework/Data/ILogData.cs | 90 + OpenSim/Framework/Data/IniConfig.cs | 96 + OpenSim/Framework/Data/InventoryData.cs | 185 + .../Data/OpenSim.Framework.Data.csproj | 120 + .../Data/OpenSim.Framework.Data.csproj.user | 12 + .../Framework/Data/Properties/AssemblyInfo.cs | 33 + OpenSim/Framework/Data/ReservationData.cs | 47 + OpenSim/Framework/Data/SimProfileData.cs | 182 + OpenSim/Framework/Data/UserData.cs | 128 + OpenSim/Framework/Data/UserProfileData.cs | 180 + .../Data/obj/Debug/OpenSim.Framework.Data.dll | Bin 0 -> 24576 bytes .../Data/obj/Debug/OpenSim.Framework.Data.pdb | Bin 0 -> 19968 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 6644 bytes ...OpenSim.Framework.Data.csproj.FileList.txt | 7 + .../obj/Release/OpenSim.Framework.Data.dll | Bin 0 -> 24576 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 6644 bytes OpenSim/Framework/General/AgentInventory.cs | 265 + .../General/AuthenticateSessionBase.cs | 130 + OpenSim/Framework/General/BlockingQueue.cs | 58 + .../Framework/General/IRegionCommsListener.cs | 46 + .../Interfaces/AuthenticateResponse.cs | 43 + .../Interfaces/Configuration/IGridConfig.cs | 59 + .../Interfaces/Configuration/IUserConfig.cs | 53 + .../General/Interfaces/IAssetServer.cs | 64 + .../General/Interfaces/IClientAPI.cs | 177 + .../General/Interfaces/ILocalStorage.cs | 68 + .../General/Interfaces/IUserServer.cs | 39 + .../Framework/General/Interfaces/IWorld.cs | 42 + OpenSim/Framework/General/LoginService.cs | 34 + .../General/OpenSim.Framework.csproj | 207 + .../General/OpenSim.Framework.csproj.user | 12 + .../General/Properties/AssemblyInfo.cs | 31 + .../Framework/General/RegionCommsListener.cs | 68 + OpenSim/Framework/General/Remoting.cs | 135 + .../General/Types/AgentCiruitData.cs | 47 + .../Framework/General/Types/AgentWearable.cs | 57 + OpenSim/Framework/General/Types/AssetBase.cs | 46 + .../Framework/General/Types/AssetLandmark.cs | 59 + .../Framework/General/Types/AssetStorage.cs | 47 + .../Framework/General/Types/EstateSettings.cs | 93 + OpenSim/Framework/General/Types/Login.cs | 49 + .../Framework/General/Types/MapBlockData.cs | 23 + .../Framework/General/Types/NeighbourInfo.cs | 42 + .../General/Types/NetworkServersInfo.cs | 115 + OpenSim/Framework/General/Types/ParcelData.cs | 112 + OpenSim/Framework/General/Types/PrimData.cs | 228 + .../General/Types/PrimitiveBaseShape.cs | 102 + .../Framework/General/Types/RegionHandle.cs | 121 + OpenSim/Framework/General/Types/RegionInfo.cs | 358 + OpenSim/Framework/General/Types/UUID.cs | 127 + OpenSim/Framework/General/UserProfile.cs | 87 + OpenSim/Framework/General/Util.cs | 184 + .../General/obj/Debug/OpenSim.Framework.dll | Bin 0 -> 65536 bytes .../General/obj/Debug/OpenSim.Framework.pdb | Bin 0 -> 112128 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 17294 bytes .../obj/OpenSim.Framework.csproj.FileList.txt | 6 + .../General/obj/Release/OpenSim.Framework.dll | Bin 0 -> 61440 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 17272 bytes OpenSim/Framework/Servers/BaseHttpServer.cs | 224 + .../Framework/Servers/BaseStreamHandler.cs | 40 + OpenSim/Framework/Servers/CheckSumServer.cs | 127 + OpenSim/Framework/Servers/IStreamHandler.cs | 22 + .../Servers/OpenSim.Framework.Servers.csproj | 125 + .../OpenSim.Framework.Servers.csproj.user | 12 + OpenSim/Framework/Servers/RestMethod.cs | 31 + .../Framework/Servers/RestStreamHandler.cs | 31 + OpenSim/Framework/Servers/UDPServerBase.cs | 87 + OpenSim/Framework/Servers/XmlRpcMethod.cs | 33 + .../obj/Debug/OpenSim.Framework.Servers.dll | Bin 0 -> 20480 bytes .../obj/Debug/OpenSim.Framework.Servers.pdb | Bin 0 -> 26112 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 11772 bytes ...nSim.Framework.Servers.csproj.FileList.txt | 7 + .../obj/Release/OpenSim.Framework.Servers.dll | Bin 0 -> 20480 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 11323 bytes .../Services/IAssetServicesCoreFunctions.cs | 11 + .../Services/IGridServicesCoreFunctions.cs | 10 + .../Services/IUserServicesCoreFunctions.cs | 10 + .../OpenSim.Framework.Services.csproj | 90 + .../OpenSim.Framework.Services.csproj.user | 12 + .../obj/Debug/OpenSim.Framework.Services.dll | Bin 0 -> 16384 bytes .../obj/Debug/OpenSim.Framework.Services.pdb | Bin 0 -> 7680 bytes ...Sim.Framework.Services.csproj.FileList.txt | 7 + .../Release/OpenSim.Framework.Services.dll | Bin 0 -> 16384 bytes .../Framework/UserManager/LoginResponse.cs | 643 ++ .../OpenSim.Framework.UserManagement.csproj | 131 + ...enSim.Framework.UserManagement.csproj.user | 12 + .../Framework/UserManager/UserManagerBase.cs | 630 ++ .../OpenSim.Framework.UserManagement.dll | Bin 0 -> 36864 bytes .../OpenSim.Framework.UserManagement.pdb | Bin 0 -> 52736 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 38671 bytes ...amework.UserManagement.csproj.FileList.txt | 7 + .../OpenSim.Framework.UserManagement.dll | Bin 0 -> 36864 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 39830 bytes OpenSim/Grid/AssetServer/AssetServerMain.cs | 21 + .../OpenSim.Grid.AssetServer.csproj | 96 + .../OpenSim.Grid.AssetServer.csproj.user | 12 + .../obj/Debug/OpenSim.Grid.AssetServer.pdb | Bin 0 -> 11776 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 23369 bytes ...enSim.Grid.AssetServer.csproj.FileList.txt | 7 + .../Release/ResolveAssemblyReference.cache | Bin 0 -> 23369 bytes OpenSim/Grid/GridServer/GridServerMain.cs | 22 + .../GridServer/OpenSim.Grid.GridServer.csproj | 96 + .../OpenSim.Grid.GridServer.csproj.user | 12 + .../obj/Debug/OpenSim.Grid.GridServer.pdb | Bin 0 -> 11776 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 23365 bytes ...penSim.Grid.GridServer.csproj.FileList.txt | 7 + .../Release/ResolveAssemblyReference.cache | Bin 0 -> 23365 bytes OpenSim/Grid/Old/AssetServer/Main.cs | 406 + .../AssetServer/Properties/AssemblyInfo.cs | 58 + .../obj/Debug/OpenSim.Grid.AssetServer.pdb | Bin 0 -> 19968 bytes ...enSim.Grid.AssetServer.csproj.FileList.txt | 7 + .../Framework.Manager/GridManagementAgent.cs | 138 + .../Framework.Manager/GridServerManager.cs | 93 + .../Debug/OpenSim.Grid.Framework.Manager.dll | Bin 0 -> 16384 bytes .../Debug/OpenSim.Grid.Framework.Manager.pdb | Bin 0 -> 15872 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 13633 bytes ...Grid.Framework.Manager.csproj.FileList.txt | 7 + .../OpenSim.Grid.Framework.Manager.dll | Bin 0 -> 16384 bytes .../Old/GridServer.Config/AssemblyInfo.cs | 56 + .../Old/GridServer.Config/DbGridConfig.cs | 160 + .../Debug/OpenSim.Grid.GridServer.Config.dll | Bin 0 -> 20480 bytes .../Debug/OpenSim.Grid.GridServer.Config.pdb | Bin 0 -> 13824 bytes ...Grid.GridServer.Config.csproj.FileList.txt | 7 + .../OpenSim.Grid.GridServer.Config.dll | Bin 0 -> 20480 bytes OpenSim/Grid/Old/GridServer/GridManager.cs | 691 ++ OpenSim/Grid/Old/GridServer/Main.cs | 258 + .../Old/GridServer/Properties/AssemblyInfo.cs | 58 + .../obj/Debug/OpenSim.Grid.GridServer.pdb | Bin 0 -> 34304 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 25104 bytes ...penSim.Grid.GridServer.csproj.FileList.txt | 7 + .../Release/ResolveAssemblyReference.cache | Bin 0 -> 25104 bytes .../Old/InventoryServer/InventoryManager.cs | 125 + OpenSim/Grid/Old/InventoryServer/Main.cs | 87 + .../Old/Manager/OpenGridServices.Manager.mds | 16 + .../OpenGridServices.Manager.userprefs | 39 + .../OpenGridServices.Manager.usertasks | 2 + .../OpenGridServices.Manager/AssemblyInfo.cs | 32 + .../OpenGridServices.Manager/BlockingQueue.cs | 33 + .../Connect to grid server.cs | 16 + .../ConnectToGridServerDialog.cs | 29 + .../GridServerConnectionManager.cs | 106 + .../Manager/OpenGridServices.Manager/Main.cs | 96 + .../OpenGridServices.Manager/MainWindow.cs | 76 + .../OpenGridServices.Manager.mdp | 43 + .../OpenGridServices.Manager.pidb | Bin 0 -> 12308 bytes .../OpenGridServices.Manager/RegionBlock.cs | 37 + .../Manager/OpenGridServices.Manager/Util.cs | 133 + ...vices.Manager.ConnectToGridServerDialog.cs | 226 + .../OpenGridServices.Manager.MainWindow.cs | 256 + .../gtk-gui/generated.cs | 35 + .../gtk-gui/gui.stetic | 502 ++ .../Old/UserServer.Config/AssemblyInfo.cs | 56 + .../Old/UserServer.Config/DbUserConfig.cs | 95 + .../Debug/OpenSim.Grid.UserServer.Config.dll | Bin 0 -> 20480 bytes .../Debug/OpenSim.Grid.UserServer.Config.pdb | Bin 0 -> 13824 bytes ...Grid.UserServer.Config.csproj.FileList.txt | 7 + .../OpenSim.Grid.UserServer.Config.dll | Bin 0 -> 20480 bytes OpenSim/Grid/Services/Asset/AssetServices.cs | 33 + .../Asset/OpenSim.Grid.Services.Asset.csproj | 114 + .../OpenSim.Grid.Services.Asset.csproj.user | 12 + .../obj/Debug/OpenSim.Grid.Services.Asset.dll | Bin 0 -> 16384 bytes .../obj/Debug/OpenSim.Grid.Services.Asset.pdb | Bin 0 -> 11776 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 19044 bytes ...im.Grid.Services.Asset.csproj.FileList.txt | 7 + .../Release/OpenSim.Grid.Services.Asset.dll | Bin 0 -> 16384 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 19044 bytes .../Local/AssetServicesCoreFunctionsLocal.cs | 12 + .../Local/GridServicesCoreFunctionsLocal.cs | 12 + ...m.Grid.Services.CoreFunctions.Local.csproj | 96 + ...d.Services.CoreFunctions.Local.csproj.user | 12 + .../Local/UserServicesCoreFunctionsLocal.cs | 12 + ...nSim.Grid.Services.CoreFunctions.Local.dll | Bin 0 -> 16384 bytes ...nSim.Grid.Services.CoreFunctions.Local.pdb | Bin 0 -> 7680 bytes ...es.CoreFunctions.Local.csproj.FileList.txt | 7 + ...nSim.Grid.Services.CoreFunctions.Local.dll | Bin 0 -> 16384 bytes .../AssetServicesCoreFunctionsRemote.cs | 12 + .../Remote/GridServicesCoreFunctionsRemote.cs | 12 + ....Grid.Services.CoreFunctions.Remote.csproj | 96 + ....Services.CoreFunctions.Remote.csproj.user | 12 + .../Remote/UserServicesCoreFunctionsRemote.cs | 12 + ...Sim.Grid.Services.CoreFunctions.Remote.dll | Bin 0 -> 16384 bytes ...Sim.Grid.Services.CoreFunctions.Remote.pdb | Bin 0 -> 7680 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 2540 bytes ...s.CoreFunctions.Remote.csproj.FileList.txt | 7 + ...Sim.Grid.Services.CoreFunctions.Remote.dll | Bin 0 -> 16384 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 2540 bytes OpenSim/Grid/Services/Grid/GridServices.cs | 31 + .../Grid/OpenSim.Grid.Services.Grid.csproj | 114 + .../OpenSim.Grid.Services.Grid.csproj.user | 12 + .../obj/Debug/OpenSim.Grid.Services.Grid.dll | Bin 0 -> 16384 bytes .../obj/Debug/OpenSim.Grid.Services.Grid.pdb | Bin 0 -> 11776 bytes ...Sim.Grid.Services.Grid.csproj.FileList.txt | 7 + .../Release/OpenSim.Grid.Services.Grid.dll | Bin 0 -> 16384 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 17768 bytes .../User/OpenSim.Grid.Services.User.csproj | 114 + .../OpenSim.Grid.Services.User.csproj.user | 12 + OpenSim/Grid/Services/User/UserServices.cs | 32 + .../obj/Debug/OpenSim.Grid.Services.User.dll | Bin 0 -> 16384 bytes .../obj/Debug/OpenSim.Grid.Services.User.pdb | Bin 0 -> 11776 bytes ...Sim.Grid.Services.User.csproj.FileList.txt | 7 + .../Release/OpenSim.Grid.Services.User.dll | Bin 0 -> 16384 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 4856 bytes .../UserServer/OpenSim.Grid.UserServer.csproj | 96 + .../OpenSim.Grid.UserServer.csproj.user | 12 + OpenSim/Grid/UserServer/UserServerMain.cs | 22 + .../obj/Debug/OpenSim.Grid.UserServer.pdb | Bin 0 -> 11776 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 23365 bytes ...penSim.Grid.UserServer.csproj.FileList.txt | 7 + .../Release/ResolveAssemblyReference.cache | Bin 0 -> 23365 bytes OpenSim/Region/Application/Application.cs | 120 + OpenSim/Region/Application/OpenSim.csproj | 190 + .../Region/Application/OpenSim.csproj.user | 13 + OpenSim/Region/Application/OpenSimMain.cs | 471 ++ OpenSim/Region/Application/VersionInfo.cs | 36 + .../Region/Application/obj/Debug/OpenSim.pdb | Bin 0 -> 28160 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 83427 bytes .../obj/OpenSim.csproj.FileList.txt | 7 + .../Release/ResolveAssemblyReference.cache | Bin 0 -> 83335 bytes OpenSim/Region/Caches/AssetCache.cs | 669 ++ .../Caches/OpenSim.Region.Caches.csproj | 97 + .../Caches/OpenSim.Region.Caches.csproj.user | 12 + .../Region/Caches/Properties/AssemblyInfo.cs | 33 + .../obj/Debug/OpenSim.Region.Caches.dll | Bin 0 -> 24576 bytes .../obj/Debug/OpenSim.Region.Caches.pdb | Bin 0 -> 28160 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 9497 bytes .../OpenSim.Region.Caches.csproj.FileList.txt | 7 + .../obj/Release/OpenSim.Region.Caches.dll | Bin 0 -> 24576 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 9405 bytes OpenSim/Region/Capabilities/Caps.cs | 336 + OpenSim/Region/Capabilities/LLSDArray.cs | 42 + OpenSim/Region/Capabilities/LLSDCapEvent.cs | 41 + .../Region/Capabilities/LLSDCapsDetails.cs | 15 + OpenSim/Region/Capabilities/LLSDEmpty.cs | 38 + OpenSim/Region/Capabilities/LLSDHelpers.cs | 164 + OpenSim/Region/Capabilities/LLSDMapLayer.cs | 46 + .../Capabilities/LLSDMapLayerResponse.cs | 41 + OpenSim/Region/Capabilities/LLSDMapRequest.cs | 13 + OpenSim/Region/Capabilities/LLSDMethod.cs | 8 + .../Region/Capabilities/LLSDStreamHandler.cs | 40 + OpenSim/Region/Capabilities/LLSDTest.cs | 41 + OpenSim/Region/Capabilities/LLSDType.cs | 59 + .../Region/Capabilities/LLSDUploadReply.cs | 44 + .../OpenSim.Region.Capabilities.csproj | 149 + .../OpenSim.Region.Capabilities.csproj.user | 12 + .../obj/Debug/OpenSim.Region.Capabilities.dll | Bin 0 -> 24576 bytes .../obj/Debug/OpenSim.Region.Capabilities.pdb | Bin 0 -> 50688 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 22992 bytes ...im.Region.Capabilities.csproj.FileList.txt | 7 + .../Release/OpenSim.Region.Capabilities.dll | Bin 0 -> 24576 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 22900 bytes .../ClientStack/Assets/InventoryCache.cs | 337 + .../ClientStack/ClientStackNetworkHandler.cs | 40 + OpenSim/Region/ClientStack/ClientView.API.cs | 1090 +++ .../ClientView.AgentAssetUpload.cs | 357 + .../ClientStack/ClientView.PacketHandlers.cs | 257 + .../ClientStack/ClientView.ProcessPackets.cs | 597 ++ OpenSim/Region/ClientStack/ClientView.cs | 271 + OpenSim/Region/ClientStack/ClientViewBase.cs | 326 + .../OpenSim.Region.ClientStack.csproj | 166 + .../OpenSim.Region.ClientStack.csproj.user | 12 + OpenSim/Region/ClientStack/PacketServer.cs | 179 + .../ClientStack/RegionApplicationBase.cs | 117 + OpenSim/Region/ClientStack/UDPServer.cs | 196 + .../obj/Debug/OpenSim.Region.ClientStack.dll | Bin 0 -> 81920 bytes .../obj/Debug/OpenSim.Region.ClientStack.pdb | Bin 0 -> 112128 bytes ...Sim.Region.ClientStack.csproj.FileList.txt | 7 + .../Release/OpenSim.Region.ClientStack.dll | Bin 0 -> 77824 bytes .../Local/CommunicationsLocal.cs | 53 + .../Local/LocalBackEndServices.cs | 206 + .../Communications/Local/LocalUserServices.cs | 142 + ...OpenSim.Region.Communications.Local.csproj | 121 + ...im.Region.Communications.Local.csproj.user | 12 + .../Local/Properties/AssemblyInfo.cs | 33 + .../OpenSim.Region.Communications.Local.dll | Bin 0 -> 24576 bytes .../OpenSim.Region.Communications.Local.pdb | Bin 0 -> 24064 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 25021 bytes ...n.Communications.Local.csproj.FileList.txt | 7 + .../OpenSim.Region.Communications.Local.dll | Bin 0 -> 20480 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 24929 bytes .../Communications/OGS1/CommunicationsOGS1.cs | 17 + .../Communications/OGS1/OGS1GridServices.cs | 267 + .../Communications/OGS1/OGS1InterSimComms.cs | 69 + .../Communications/OGS1/OGS1UserServices.cs | 106 + .../OpenSim.Region.Communications.OGS1.csproj | 142 + ...Sim.Region.Communications.OGS1.csproj.user | 12 + .../OGS1/Properties/AssemblyInfo.cs | 33 + .../OpenSim.Region.Communications.OGS1.dll | Bin 0 -> 28672 bytes .../OpenSim.Region.Communications.OGS1.pdb | Bin 0 -> 32256 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 26628 bytes ...on.Communications.OGS1.csproj.FileList.txt | 7 + .../OpenSim.Region.Communications.OGS1.dll | Bin 0 -> 28672 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 26536 bytes OpenSim/Region/Environment/EstateManager.cs | 300 + .../OpenSim.Region.Environment.csproj | 285 + .../OpenSim.Region.Environment.csproj.user | 12 + OpenSim/Region/Environment/ParcelManager.cs | 891 ++ OpenSim/Region/Environment/RegionManager.cs | 29 + OpenSim/Region/Environment/Scenes/Entity.cs | 115 + .../Region/Environment/Scenes/EntityBase.cs | 142 + .../Environment/Scenes/IScenePresenceBody.cs | 14 + .../Region/Environment/Scenes/Primitive.cs | 594 ++ .../Region/Environment/Scenes/PrimitiveOld.cs | 583 ++ .../Scenes/Scene.PacketHandlers.cs | 568 ++ OpenSim/Region/Environment/Scenes/Scene.cs | 787 ++ .../Region/Environment/Scenes/SceneBase.cs | 197 + .../Region/Environment/Scenes/SceneEvents.cs | 50 + .../Region/Environment/Scenes/SceneObject.cs | 246 + .../Scenes/ScenePresence.Animations.cs | 74 + .../Environment/Scenes/ScenePresence.Body.cs | 85 + .../Environment/Scenes/ScenePresence.cs | 549 ++ .../CSharpEngine/CSharpScriptEngine.cs | 102 + .../Engines/JScriptEngine/JScriptEngine.cs | 102 + .../Engines/JVMEngine/ClassInstance.cs | 45 + .../Engines/JVMEngine/ClassRecord.cs | 503 ++ .../scripting/Engines/JVMEngine/Heap.cs | 43 + .../Engines/JVMEngine/Interpreter.cs | 135 + .../Engines/JVMEngine/InterpreterLogic.cs | 427 + .../Engines/JVMEngine/InterpreterMethods.cs | 96 + .../Engines/JVMEngine/InterpreterReturn.cs | 40 + .../scripting/Engines/JVMEngine/JavaEngine.cs | 29 + .../scripting/Engines/JVMEngine/MainMemory.cs | 45 + .../Engines/JVMEngine/MethodMemory.cs | 46 + .../scripting/Engines/JVMEngine/Object.cs | 37 + .../scripting/Engines/JVMEngine/OpenSimJVM.cs | 171 + .../scripting/Engines/JVMEngine/Stack.cs | 42 + .../scripting/Engines/JVMEngine/StackFrame.cs | 49 + .../scripting/Engines/JVMEngine/Thread.cs | 119 + .../Engines/JVMEngine/Types/ArrayReference.cs | 10 + .../Engines/JVMEngine/Types/BaseType.cs | 10 + .../JVMEngine/Types/ObjectReference.cs | 16 + .../JVMEngine/Types/PrimitiveTypes/Byte.cs | 10 + .../JVMEngine/Types/PrimitiveTypes/Char.cs | 10 + .../JVMEngine/Types/PrimitiveTypes/Float.cs | 16 + .../JVMEngine/Types/PrimitiveTypes/Int.cs | 16 + .../Environment/Scenes/scripting/Script.cs | 64 + .../Environment/Scenes/scripting/ScriptAPI.cs | 25 + .../Scenes/scripting/ScriptInfo.cs | 58 + .../Scenes/scripting/ScriptManager.cs | 99 + .../obj/Debug/OpenSim.Region.Environment.dll | Bin 0 -> 106496 bytes .../obj/Debug/OpenSim.Region.Environment.pdb | Bin 0 -> 267776 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 51912 bytes ...Sim.Region.Environment.csproj.FileList.txt | 7 + .../Release/OpenSim.Region.Environment.dll | Bin 0 -> 98304 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 51798 bytes .../Examples/SimpleApp/LlsdMethodEntry.cs | 10 + OpenSim/Region/Examples/SimpleApp/MyWorld.cs | 93 + OpenSim/Region/Examples/SimpleApp/Program.cs | 130 + .../SimpleApp/Properties/AssemblyInfo.cs | 31 + .../Examples/SimpleApp/SimpleApp.csproj | 177 + .../Examples/SimpleApp/SimpleApp.csproj.user | 12 + .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 74819 bytes .../SimpleApp/obj/Debug/SimpleApp.pdb | Bin 0 -> 19968 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 74727 bytes .../obj/SimpleApp.csproj.FileList.txt | 7 + .../GridInterfaces/Local/AssemblyInfo.cs | 56 + .../GridInterfaces/Local/LocalAssetServer.cs | 310 + ...OpenSim.Region.GridInterfaces.Local.csproj | 107 + ...im.Region.GridInterfaces.Local.csproj.user | 12 + .../OpenSim.Region.GridInterfaces.Local.dll | Bin 0 -> 20480 bytes .../OpenSim.Region.GridInterfaces.Local.pdb | Bin 0 -> 19968 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 11467 bytes ...n.GridInterfaces.Local.csproj.FileList.txt | 7 + .../OpenSim.Region.GridInterfaces.Local.dll | Bin 0 -> 20480 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 10901 bytes .../GridInterfaces/Remote/AssemblyInfo.cs | 56 + ...penSim.Region.GridInterfaces.Remote.csproj | 107 + ...m.Region.GridInterfaces.Remote.csproj.user | 12 + .../Remote/RemoteAssetServer.cs | 133 + .../OpenSim.Region.GridInterfaces.Remote.dll | Bin 0 -> 16384 bytes .../OpenSim.Region.GridInterfaces.Remote.pdb | Bin 0 -> 15872 bytes ....GridInterfaces.Remote.csproj.FileList.txt | 7 + .../OpenSim.Region.GridInterfaces.Remote.dll | Bin 0 -> 16384 bytes .../BasicPhysicsPlugin/AssemblyInfo.cs | 56 + .../BasicPhysicsPlugin/BasicPhysicsPlugin.cs | 301 + ...m.Region.Physics.BasicPhysicsPlugin.csproj | 93 + ...ion.Physics.BasicPhysicsPlugin.csproj.user | 12 + ...nSim.Region.Physics.BasicPhysicsPlugin.dll | Bin 0 -> 20480 bytes ...nSim.Region.Physics.BasicPhysicsPlugin.pdb | Bin 0 -> 22016 bytes ...ics.BasicPhysicsPlugin.csproj.FileList.txt | 7 + ...nSim.Region.Physics.BasicPhysicsPlugin.dll | Bin 0 -> 20480 bytes .../Region/Physics/Manager/AssemblyInfo.cs | 56 + .../OpenSim.Region.Physics.Manager.csproj | 112 + ...OpenSim.Region.Physics.Manager.csproj.user | 12 + .../Region/Physics/Manager/PhysicsActor.cs | 167 + .../Region/Physics/Manager/PhysicsManager.cs | 115 + .../Region/Physics/Manager/PhysicsScene.cs | 110 + .../Region/Physics/Manager/PhysicsVector.cs | 55 + .../Debug/OpenSim.Region.Physics.Manager.dll | Bin 0 -> 20480 bytes .../Debug/OpenSim.Region.Physics.Manager.pdb | Bin 0 -> 28160 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 11518 bytes ...Region.Physics.Manager.csproj.FileList.txt | 7 + .../OpenSim.Region.Physics.Manager.dll | Bin 0 -> 20480 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 11518 bytes .../Region/Physics/OdePlugin/AssemblyInfo.cs | 56 + OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 457 ++ .../OpenSim.Region.Physics.OdePlugin.csproj | 97 + ...enSim.Region.Physics.OdePlugin.csproj.user | 12 + .../OpenSim.Region.Physics.OdePlugin.dll | Bin 0 -> 20480 bytes .../OpenSim.Region.Physics.OdePlugin.pdb | Bin 0 -> 30208 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 7614 bytes ...gion.Physics.OdePlugin.csproj.FileList.txt | 7 + .../OpenSim.Region.Physics.OdePlugin.dll | Bin 0 -> 20480 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 9678 bytes .../Physics/PhysXPlugin/AssemblyInfo.cs | 56 + .../OpenSim.Region.Physics.PhysXPlugin.csproj | 97 + ...Sim.Region.Physics.PhysXPlugin.csproj.user | 12 + .../Region/Physics/PhysXPlugin/PhysXPlugin.cs | 425 + .../OpenSim.Region.Physics.PhysXPlugin.dll | Bin 0 -> 20480 bytes .../OpenSim.Region.Physics.PhysXPlugin.pdb | Bin 0 -> 28160 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 7673 bytes ...on.Physics.PhysXPlugin.csproj.FileList.txt | 7 + .../OpenSim.Region.Physics.PhysXPlugin.dll | Bin 0 -> 20480 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 9796 bytes .../Scripting/Properties/AssemblyInfo.cs | 35 + OpenSim/Region/Scripting/Script.cs | 32 + OpenSim/Region/Scripting/ScriptAccess.cs | 31 + .../LocalStorageBerkeleyDB/BDBLocalStorage.cs | 112 + ...gion.Storage.LocalStorageBerkeleyDB.csproj | 112 + ...Storage.LocalStorageBerkeleyDB.csproj.user | 12 + ....Region.Storage.LocalStorageBerkeleyDB.dll | Bin 0 -> 16384 bytes ....Region.Storage.LocalStorageBerkeleyDB.pdb | Bin 0 -> 15872 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 12725 bytes ...LocalStorageBerkeleyDB.csproj.FileList.txt | 7 + ....Region.Storage.LocalStorageBerkeleyDB.dll | Bin 0 -> 16384 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 18157 bytes .../Storage/LocalStorageDb4o/AssemblyInfo.cs | 56 + .../LocalStorageDb4o/Db4LocalStorage.cs | 267 + .../Storage/LocalStorageDb4o/MapStorage.cs | 39 + ...Sim.Region.Storage.LocalStorageDb4o.csproj | 116 + ...egion.Storage.LocalStorageDb4o.csproj.user | 12 + .../LocalStorageDb4o/UUIDParcelQuery.cs | 47 + .../Storage/LocalStorageDb4o/UUIDPrimQuery.cs | 47 + ...penSim.Region.Storage.LocalStorageDb4o.dll | Bin 0 -> 24576 bytes ...penSim.Region.Storage.LocalStorageDb4o.pdb | Bin 0 -> 26112 bytes ...orage.LocalStorageDb4o.csproj.FileList.txt | 7 + ...penSim.Region.Storage.LocalStorageDb4o.dll | Bin 0 -> 20480 bytes ...m.Region.Storage.LocalStorageSQLite.csproj | 111 + ...ion.Storage.LocalStorageSQLite.csproj.user | 12 + .../Properties/AssemblyInfo.cs | 60 + .../LocalStorageSQLite/SQLiteLocalStorage.cs | 198 + ...nSim.Region.Storage.LocalStorageSQLite.dll | Bin 0 -> 20480 bytes ...nSim.Region.Storage.LocalStorageSQLite.pdb | Bin 0 -> 15872 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 12750 bytes ...age.LocalStorageSQLite.csproj.FileList.txt | 7 + ...nSim.Region.Storage.LocalStorageSQLite.dll | Bin 0 -> 20480 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 18251 bytes ...OpenSim.Region.Terrain.BasicTerrain.csproj | 110 + ...im.Region.Terrain.BasicTerrain.csproj.user | 12 + .../Properties/AssemblyInfo.cs | 60 + .../Terrain.BasicTerrain/TerrainEngine.cs | 928 +++ .../Terrain.BasicTerrain/TerrainFilter.cs | 126 + .../OpenSim.Region.Terrain.BasicTerrain.dll | Bin 0 -> 32768 bytes .../OpenSim.Region.Terrain.BasicTerrain.pdb | Bin 0 -> 38400 bytes .../obj/Debug/ResolveAssemblyReference.cache | Bin 0 -> 4790 bytes ...n.Terrain.BasicTerrain.csproj.FileList.txt | 7 + .../OpenSim.Region.Terrain.BasicTerrain.dll | Bin 0 -> 28672 bytes .../Release/ResolveAssemblyReference.cache | Bin 0 -> 8142 bytes Prebuild/Prebuild.sln | 19 + Prebuild/README | 230 + Prebuild/TODO | 21 + Prebuild/doc/prebuild-example1.xml | 300 + Prebuild/doc/prebuild-example2.xml | 72 + Prebuild/doc/prebuild-example3.xml | 113 + Prebuild/doc/prebuild-example4.xml | 715 ++ Prebuild/doc/prebuild-example5.xml | 187 + Prebuild/prebuild | 2 + Prebuild/scripts/Clean.bat | 2 + Prebuild/scripts/Help.bat | 2 + Prebuild/scripts/MonoDevelop.sh | 2 + Prebuild/scripts/Prebuild.nsi | 231 + Prebuild/scripts/SharpDevelop.bat | 4 + Prebuild/scripts/SharpDevelop2.bat | 4 + Prebuild/scripts/VS2002.bat | 4 + Prebuild/scripts/VS2003.bat | 4 + Prebuild/scripts/VS2005.bat | 4 + Prebuild/scripts/autotools.bat | 4 + Prebuild/scripts/autotools.sh | 2 + Prebuild/scripts/nant.bat | 4 + Prebuild/scripts/nant.sh | 2 + Prebuild/src/App.ico | Bin 0 -> 4286 bytes .../src/Core/Attributes/DataNodeAttribute.cs | 81 + .../Core/Attributes/OptionNodeAttribute.cs | 80 + .../src/Core/Attributes/TargetAttribute.cs | 80 + Prebuild/src/Core/FatalException.cs | 94 + Prebuild/src/Core/Interfaces/IDataNode.cs | 56 + Prebuild/src/Core/Interfaces/ITarget.cs | 60 + Prebuild/src/Core/Kernel.cs | 758 ++ Prebuild/src/Core/Nodes/ConfigurationNode.cs | 187 + Prebuild/src/Core/Nodes/DataNode.cs | 82 + Prebuild/src/Core/Nodes/ExcludeNode.cs | 85 + Prebuild/src/Core/Nodes/FileNode.cs | 238 + Prebuild/src/Core/Nodes/FilesNode.cs | 223 + Prebuild/src/Core/Nodes/MatchNode.cs | 299 + Prebuild/src/Core/Nodes/OptionsNode.cs | 655 ++ Prebuild/src/Core/Nodes/ProcessNode.cs | 119 + Prebuild/src/Core/Nodes/ProjectNode.cs | 510 ++ Prebuild/src/Core/Nodes/ReferenceNode.cs | 153 + Prebuild/src/Core/Nodes/ReferencePathNode.cs | 108 + Prebuild/src/Core/Nodes/SolutionNode.cs | 288 + Prebuild/src/Core/Parse/IfContext.cs | 163 + Prebuild/src/Core/Parse/Preprocessor.cs | 519 ++ Prebuild/src/Core/Targets/AutotoolsTarget.cs | 926 +++ Prebuild/src/Core/Targets/DebugTarget.cs | 102 + .../src/Core/Targets/MonoDevelopTarget.cs | 458 ++ Prebuild/src/Core/Targets/NAntTarget.cs | 621 ++ .../src/Core/Targets/SharpDevelop2Target.cs | 90 + .../src/Core/Targets/SharpDevelopTarget.cs | 437 + Prebuild/src/Core/Targets/VS2002Target.cs | 96 + Prebuild/src/Core/Targets/VS2003Target.cs | 633 ++ Prebuild/src/Core/Targets/VS2005Target.cs | 883 ++ Prebuild/src/Core/UnknownLanguageException.cs | 63 + .../Core/Utilities/CommandLineCollection.cs | 162 + .../src/Core/Utilities/CurrentDirectory.cs | 89 + Prebuild/src/Core/Utilities/Helper.cs | 661 ++ Prebuild/src/Core/Utilities/Log.cs | 279 + Prebuild/src/Core/WarningException.cs | 93 + Prebuild/src/Prebuild.cs | 165 + Prebuild/src/Prebuild.csproj | 205 + Prebuild/src/Prebuild.csproj.user | 12 + Prebuild/src/Prebuild.snk | Bin 0 -> 596 bytes Prebuild/src/Properties/AssemblyInfo.cs | 101 + Prebuild/src/data/dnpb-1.0.xsd | 183 + Prebuild/src/data/dnpb-1.1.xsd | 184 + Prebuild/src/data/dnpb-1.2.xsd | 198 + Prebuild/src/data/dnpb-1.3.xsd | 206 + Prebuild/src/data/dnpb-1.4.xsd | 212 + Prebuild/src/data/dnpb-1.5.xsd | 215 + Prebuild/src/data/prebuild-1.6.xsd | 231 + Prebuild/src/data/prebuild-1.7.xsd | 261 + ThirdPartyLicenses/Axiom.txt | 141 + ThirdPartyLicenses/MySQL.txt | 78 + ThirdPartyLicenses/ODE.txt | 13 + ThirdPartyLicenses/OpenJpeg.txt | 30 + ThirdPartyLicenses/libsl.txt | 23 + prebuild.xml | 1002 +++ runprebuild.bat | 2 + share/php/generateUserFunction.php | 46 + share/regions/config_0.xml | 3 + share/regions/config_1.xml | 3 + share/regions/config_10.xml | 3 + share/regions/config_100.xml | 3 + share/regions/config_1000.xml | 3 + share/regions/config_1001.xml | 3 + share/regions/config_1002.xml | 3 + share/regions/config_1003.xml | 3 + share/regions/config_1004.xml | 3 + share/regions/config_1005.xml | 3 + share/regions/config_1006.xml | 3 + share/regions/config_1007.xml | 3 + share/regions/config_1008.xml | 3 + share/regions/config_1009.xml | 3 + share/regions/config_101.xml | 3 + share/regions/config_1010.xml | 3 + share/regions/config_1011.xml | 3 + share/regions/config_1012.xml | 3 + share/regions/config_1013.xml | 3 + share/regions/config_1014.xml | 3 + share/regions/config_1015.xml | 3 + share/regions/config_1016.xml | 3 + share/regions/config_1017.xml | 3 + share/regions/config_1018.xml | 3 + share/regions/config_1019.xml | 3 + share/regions/config_102.xml | 3 + share/regions/config_1020.xml | 3 + share/regions/config_1021.xml | 3 + share/regions/config_1022.xml | 3 + share/regions/config_1023.xml | 3 + share/regions/config_103.xml | 3 + share/regions/config_104.xml | 3 + share/regions/config_105.xml | 3 + share/regions/config_106.xml | 3 + share/regions/config_107.xml | 3 + share/regions/config_108.xml | 3 + share/regions/config_109.xml | 3 + share/regions/config_11.xml | 3 + share/regions/config_110.xml | 3 + share/regions/config_111.xml | 3 + share/regions/config_112.xml | 3 + share/regions/config_113.xml | 3 + share/regions/config_114.xml | 3 + share/regions/config_115.xml | 3 + share/regions/config_116.xml | 3 + share/regions/config_117.xml | 3 + share/regions/config_118.xml | 3 + share/regions/config_119.xml | 3 + share/regions/config_12.xml | 3 + share/regions/config_120.xml | 3 + share/regions/config_121.xml | 3 + share/regions/config_122.xml | 3 + share/regions/config_123.xml | 3 + share/regions/config_124.xml | 3 + share/regions/config_125.xml | 3 + share/regions/config_126.xml | 3 + share/regions/config_127.xml | 3 + share/regions/config_128.xml | 3 + share/regions/config_129.xml | 3 + share/regions/config_13.xml | 3 + share/regions/config_130.xml | 3 + share/regions/config_131.xml | 3 + share/regions/config_132.xml | 3 + share/regions/config_133.xml | 3 + share/regions/config_134.xml | 3 + share/regions/config_135.xml | 3 + share/regions/config_136.xml | 3 + share/regions/config_137.xml | 3 + share/regions/config_138.xml | 3 + share/regions/config_139.xml | 3 + share/regions/config_14.xml | 3 + share/regions/config_140.xml | 3 + share/regions/config_141.xml | 3 + share/regions/config_142.xml | 3 + share/regions/config_143.xml | 3 + share/regions/config_144.xml | 3 + share/regions/config_145.xml | 3 + share/regions/config_146.xml | 3 + share/regions/config_147.xml | 3 + share/regions/config_148.xml | 3 + share/regions/config_149.xml | 3 + share/regions/config_15.xml | 3 + share/regions/config_150.xml | 3 + share/regions/config_151.xml | 3 + share/regions/config_152.xml | 3 + share/regions/config_153.xml | 3 + share/regions/config_154.xml | 3 + share/regions/config_155.xml | 3 + share/regions/config_156.xml | 3 + share/regions/config_157.xml | 3 + share/regions/config_158.xml | 3 + share/regions/config_159.xml | 3 + share/regions/config_16.xml | 3 + share/regions/config_160.xml | 3 + share/regions/config_161.xml | 3 + share/regions/config_162.xml | 3 + share/regions/config_163.xml | 3 + share/regions/config_164.xml | 3 + share/regions/config_165.xml | 3 + share/regions/config_166.xml | 3 + share/regions/config_167.xml | 3 + share/regions/config_168.xml | 3 + share/regions/config_169.xml | 3 + share/regions/config_17.xml | 3 + share/regions/config_170.xml | 3 + share/regions/config_171.xml | 3 + share/regions/config_172.xml | 3 + share/regions/config_173.xml | 3 + share/regions/config_174.xml | 3 + share/regions/config_175.xml | 3 + share/regions/config_176.xml | 3 + share/regions/config_177.xml | 3 + share/regions/config_178.xml | 3 + share/regions/config_179.xml | 3 + share/regions/config_18.xml | 3 + share/regions/config_180.xml | 3 + share/regions/config_181.xml | 3 + share/regions/config_182.xml | 3 + share/regions/config_183.xml | 3 + share/regions/config_184.xml | 3 + share/regions/config_185.xml | 3 + share/regions/config_186.xml | 3 + share/regions/config_187.xml | 3 + share/regions/config_188.xml | 3 + share/regions/config_189.xml | 3 + share/regions/config_19.xml | 3 + share/regions/config_190.xml | 3 + share/regions/config_191.xml | 3 + share/regions/config_192.xml | 3 + share/regions/config_193.xml | 3 + share/regions/config_194.xml | 3 + share/regions/config_195.xml | 3 + share/regions/config_196.xml | 3 + share/regions/config_197.xml | 3 + share/regions/config_198.xml | 3 + share/regions/config_199.xml | 3 + share/regions/config_2.xml | 3 + share/regions/config_20.xml | 3 + share/regions/config_200.xml | 3 + share/regions/config_201.xml | 3 + share/regions/config_202.xml | 3 + share/regions/config_203.xml | 3 + share/regions/config_204.xml | 3 + share/regions/config_205.xml | 3 + share/regions/config_206.xml | 3 + share/regions/config_207.xml | 3 + share/regions/config_208.xml | 3 + share/regions/config_209.xml | 3 + share/regions/config_21.xml | 3 + share/regions/config_210.xml | 3 + share/regions/config_211.xml | 3 + share/regions/config_212.xml | 3 + share/regions/config_213.xml | 3 + share/regions/config_214.xml | 3 + share/regions/config_215.xml | 3 + share/regions/config_216.xml | 3 + share/regions/config_217.xml | 3 + share/regions/config_218.xml | 3 + share/regions/config_219.xml | 3 + share/regions/config_22.xml | 3 + share/regions/config_220.xml | 3 + share/regions/config_221.xml | 3 + share/regions/config_222.xml | 3 + share/regions/config_223.xml | 3 + share/regions/config_224.xml | 3 + share/regions/config_225.xml | 3 + share/regions/config_226.xml | 3 + share/regions/config_227.xml | 3 + share/regions/config_228.xml | 3 + share/regions/config_229.xml | 3 + share/regions/config_23.xml | 3 + share/regions/config_230.xml | 3 + share/regions/config_231.xml | 3 + share/regions/config_232.xml | 3 + share/regions/config_233.xml | 3 + share/regions/config_234.xml | 3 + share/regions/config_235.xml | 3 + share/regions/config_236.xml | 3 + share/regions/config_237.xml | 3 + share/regions/config_238.xml | 3 + share/regions/config_239.xml | 3 + share/regions/config_24.xml | 3 + share/regions/config_240.xml | 3 + share/regions/config_241.xml | 3 + share/regions/config_242.xml | 3 + share/regions/config_243.xml | 3 + share/regions/config_244.xml | 3 + share/regions/config_245.xml | 3 + share/regions/config_246.xml | 3 + share/regions/config_247.xml | 3 + share/regions/config_248.xml | 3 + share/regions/config_249.xml | 3 + share/regions/config_25.xml | 3 + share/regions/config_250.xml | 3 + share/regions/config_251.xml | 3 + share/regions/config_252.xml | 3 + share/regions/config_253.xml | 3 + share/regions/config_254.xml | 3 + share/regions/config_255.xml | 3 + share/regions/config_256.xml | 3 + share/regions/config_257.xml | 3 + share/regions/config_258.xml | 3 + share/regions/config_259.xml | 3 + share/regions/config_26.xml | 3 + share/regions/config_260.xml | 3 + share/regions/config_261.xml | 3 + share/regions/config_262.xml | 3 + share/regions/config_263.xml | 3 + share/regions/config_264.xml | 3 + share/regions/config_265.xml | 3 + share/regions/config_266.xml | 3 + share/regions/config_267.xml | 3 + share/regions/config_268.xml | 3 + share/regions/config_269.xml | 3 + share/regions/config_27.xml | 3 + share/regions/config_270.xml | 3 + share/regions/config_271.xml | 3 + share/regions/config_272.xml | 3 + share/regions/config_273.xml | 3 + share/regions/config_274.xml | 3 + share/regions/config_275.xml | 3 + share/regions/config_276.xml | 3 + share/regions/config_277.xml | 3 + share/regions/config_278.xml | 3 + share/regions/config_279.xml | 3 + share/regions/config_28.xml | 3 + share/regions/config_280.xml | 3 + share/regions/config_281.xml | 3 + share/regions/config_282.xml | 3 + share/regions/config_283.xml | 3 + share/regions/config_284.xml | 3 + share/regions/config_285.xml | 3 + share/regions/config_286.xml | 3 + share/regions/config_287.xml | 3 + share/regions/config_288.xml | 3 + share/regions/config_289.xml | 3 + share/regions/config_29.xml | 3 + share/regions/config_290.xml | 3 + share/regions/config_291.xml | 3 + share/regions/config_292.xml | 3 + share/regions/config_293.xml | 3 + share/regions/config_294.xml | 3 + share/regions/config_295.xml | 3 + share/regions/config_296.xml | 3 + share/regions/config_297.xml | 3 + share/regions/config_298.xml | 3 + share/regions/config_299.xml | 3 + share/regions/config_3.xml | 3 + share/regions/config_30.xml | 3 + share/regions/config_300.xml | 3 + share/regions/config_301.xml | 3 + share/regions/config_302.xml | 3 + share/regions/config_303.xml | 3 + share/regions/config_304.xml | 3 + share/regions/config_305.xml | 3 + share/regions/config_306.xml | 3 + share/regions/config_307.xml | 3 + share/regions/config_308.xml | 3 + share/regions/config_309.xml | 3 + share/regions/config_31.xml | 3 + share/regions/config_310.xml | 3 + share/regions/config_311.xml | 3 + share/regions/config_312.xml | 3 + share/regions/config_313.xml | 3 + share/regions/config_314.xml | 3 + share/regions/config_315.xml | 3 + share/regions/config_316.xml | 3 + share/regions/config_317.xml | 3 + share/regions/config_318.xml | 3 + share/regions/config_319.xml | 3 + share/regions/config_32.xml | 3 + share/regions/config_320.xml | 3 + share/regions/config_321.xml | 3 + share/regions/config_322.xml | 3 + share/regions/config_323.xml | 3 + share/regions/config_324.xml | 3 + share/regions/config_325.xml | 3 + share/regions/config_326.xml | 3 + share/regions/config_327.xml | 3 + share/regions/config_328.xml | 3 + share/regions/config_329.xml | 3 + share/regions/config_33.xml | 3 + share/regions/config_330.xml | 3 + share/regions/config_331.xml | 3 + share/regions/config_332.xml | 3 + share/regions/config_333.xml | 3 + share/regions/config_334.xml | 3 + share/regions/config_335.xml | 3 + share/regions/config_336.xml | 3 + share/regions/config_337.xml | 3 + share/regions/config_338.xml | 3 + share/regions/config_339.xml | 3 + share/regions/config_34.xml | 3 + share/regions/config_340.xml | 3 + share/regions/config_341.xml | 3 + share/regions/config_342.xml | 3 + share/regions/config_343.xml | 3 + share/regions/config_344.xml | 3 + share/regions/config_345.xml | 3 + share/regions/config_346.xml | 3 + share/regions/config_347.xml | 3 + share/regions/config_348.xml | 3 + share/regions/config_349.xml | 3 + share/regions/config_35.xml | 3 + share/regions/config_350.xml | 3 + share/regions/config_351.xml | 3 + share/regions/config_352.xml | 3 + share/regions/config_353.xml | 3 + share/regions/config_354.xml | 3 + share/regions/config_355.xml | 3 + share/regions/config_356.xml | 3 + share/regions/config_357.xml | 3 + share/regions/config_358.xml | 3 + share/regions/config_359.xml | 3 + share/regions/config_36.xml | 3 + share/regions/config_360.xml | 3 + share/regions/config_361.xml | 3 + share/regions/config_362.xml | 3 + share/regions/config_363.xml | 3 + share/regions/config_364.xml | 3 + share/regions/config_365.xml | 3 + share/regions/config_366.xml | 3 + share/regions/config_367.xml | 3 + share/regions/config_368.xml | 3 + share/regions/config_369.xml | 3 + share/regions/config_37.xml | 3 + share/regions/config_370.xml | 3 + share/regions/config_371.xml | 3 + share/regions/config_372.xml | 3 + share/regions/config_373.xml | 3 + share/regions/config_374.xml | 3 + share/regions/config_375.xml | 3 + share/regions/config_376.xml | 3 + share/regions/config_377.xml | 3 + share/regions/config_378.xml | 3 + share/regions/config_379.xml | 3 + share/regions/config_38.xml | 3 + share/regions/config_380.xml | 3 + share/regions/config_381.xml | 3 + share/regions/config_382.xml | 3 + share/regions/config_383.xml | 3 + share/regions/config_384.xml | 3 + share/regions/config_385.xml | 3 + share/regions/config_386.xml | 3 + share/regions/config_387.xml | 3 + share/regions/config_388.xml | 3 + share/regions/config_389.xml | 3 + share/regions/config_39.xml | 3 + share/regions/config_390.xml | 3 + share/regions/config_391.xml | 3 + share/regions/config_392.xml | 3 + share/regions/config_393.xml | 3 + share/regions/config_394.xml | 3 + share/regions/config_395.xml | 3 + share/regions/config_396.xml | 3 + share/regions/config_397.xml | 3 + share/regions/config_398.xml | 3 + share/regions/config_399.xml | 3 + share/regions/config_4.xml | 3 + share/regions/config_40.xml | 3 + share/regions/config_400.xml | 3 + share/regions/config_401.xml | 3 + share/regions/config_402.xml | 3 + share/regions/config_403.xml | 3 + share/regions/config_404.xml | 3 + share/regions/config_405.xml | 3 + share/regions/config_406.xml | 3 + share/regions/config_407.xml | 3 + share/regions/config_408.xml | 3 + share/regions/config_409.xml | 3 + share/regions/config_41.xml | 3 + share/regions/config_410.xml | 3 + share/regions/config_411.xml | 3 + share/regions/config_412.xml | 3 + share/regions/config_413.xml | 3 + share/regions/config_414.xml | 3 + share/regions/config_415.xml | 3 + share/regions/config_416.xml | 3 + share/regions/config_417.xml | 3 + share/regions/config_418.xml | 3 + share/regions/config_419.xml | 3 + share/regions/config_42.xml | 3 + share/regions/config_420.xml | 3 + share/regions/config_421.xml | 3 + share/regions/config_422.xml | 3 + share/regions/config_423.xml | 3 + share/regions/config_424.xml | 3 + share/regions/config_425.xml | 3 + share/regions/config_426.xml | 3 + share/regions/config_427.xml | 3 + share/regions/config_428.xml | 3 + share/regions/config_429.xml | 3 + share/regions/config_43.xml | 3 + share/regions/config_430.xml | 3 + share/regions/config_431.xml | 3 + share/regions/config_432.xml | 3 + share/regions/config_433.xml | 3 + share/regions/config_434.xml | 3 + share/regions/config_435.xml | 3 + share/regions/config_436.xml | 3 + share/regions/config_437.xml | 3 + share/regions/config_438.xml | 3 + share/regions/config_439.xml | 3 + share/regions/config_44.xml | 3 + share/regions/config_440.xml | 3 + share/regions/config_441.xml | 3 + share/regions/config_442.xml | 3 + share/regions/config_443.xml | 3 + share/regions/config_444.xml | 3 + share/regions/config_445.xml | 3 + share/regions/config_446.xml | 3 + share/regions/config_447.xml | 3 + share/regions/config_448.xml | 3 + share/regions/config_449.xml | 3 + share/regions/config_45.xml | 3 + share/regions/config_450.xml | 3 + share/regions/config_451.xml | 3 + share/regions/config_452.xml | 3 + share/regions/config_453.xml | 3 + share/regions/config_454.xml | 3 + share/regions/config_455.xml | 3 + share/regions/config_456.xml | 3 + share/regions/config_457.xml | 3 + share/regions/config_458.xml | 3 + share/regions/config_459.xml | 3 + share/regions/config_46.xml | 3 + share/regions/config_460.xml | 3 + share/regions/config_461.xml | 3 + share/regions/config_462.xml | 3 + share/regions/config_463.xml | 3 + share/regions/config_464.xml | 3 + share/regions/config_465.xml | 3 + share/regions/config_466.xml | 3 + share/regions/config_467.xml | 3 + share/regions/config_468.xml | 3 + share/regions/config_469.xml | 3 + share/regions/config_47.xml | 3 + share/regions/config_470.xml | 3 + share/regions/config_471.xml | 3 + share/regions/config_472.xml | 3 + share/regions/config_473.xml | 3 + share/regions/config_474.xml | 3 + share/regions/config_475.xml | 3 + share/regions/config_476.xml | 3 + share/regions/config_477.xml | 3 + share/regions/config_478.xml | 3 + share/regions/config_479.xml | 3 + share/regions/config_48.xml | 3 + share/regions/config_480.xml | 3 + share/regions/config_481.xml | 3 + share/regions/config_482.xml | 3 + share/regions/config_483.xml | 3 + share/regions/config_484.xml | 3 + share/regions/config_485.xml | 3 + share/regions/config_486.xml | 3 + share/regions/config_487.xml | 3 + share/regions/config_488.xml | 3 + share/regions/config_489.xml | 3 + share/regions/config_49.xml | 3 + share/regions/config_490.xml | 3 + share/regions/config_491.xml | 3 + share/regions/config_492.xml | 3 + share/regions/config_493.xml | 3 + share/regions/config_494.xml | 3 + share/regions/config_495.xml | 3 + share/regions/config_496.xml | 3 + share/regions/config_497.xml | 3 + share/regions/config_498.xml | 3 + share/regions/config_499.xml | 3 + share/regions/config_5.xml | 3 + share/regions/config_50.xml | 3 + share/regions/config_500.xml | 3 + share/regions/config_501.xml | 3 + share/regions/config_502.xml | 3 + share/regions/config_503.xml | 3 + share/regions/config_504.xml | 3 + share/regions/config_505.xml | 3 + share/regions/config_506.xml | 3 + share/regions/config_507.xml | 3 + share/regions/config_508.xml | 3 + share/regions/config_509.xml | 3 + share/regions/config_51.xml | 3 + share/regions/config_510.xml | 3 + share/regions/config_511.xml | 3 + share/regions/config_512.xml | 3 + share/regions/config_513.xml | 3 + share/regions/config_514.xml | 3 + share/regions/config_515.xml | 3 + share/regions/config_516.xml | 3 + share/regions/config_517.xml | 3 + share/regions/config_518.xml | 3 + share/regions/config_519.xml | 3 + share/regions/config_52.xml | 3 + share/regions/config_520.xml | 3 + share/regions/config_521.xml | 3 + share/regions/config_522.xml | 3 + share/regions/config_523.xml | 3 + share/regions/config_524.xml | 3 + share/regions/config_525.xml | 3 + share/regions/config_526.xml | 3 + share/regions/config_527.xml | 3 + share/regions/config_528.xml | 3 + share/regions/config_529.xml | 3 + share/regions/config_53.xml | 3 + share/regions/config_530.xml | 3 + share/regions/config_531.xml | 3 + share/regions/config_532.xml | 3 + share/regions/config_533.xml | 3 + share/regions/config_534.xml | 3 + share/regions/config_535.xml | 3 + share/regions/config_536.xml | 3 + share/regions/config_537.xml | 3 + share/regions/config_538.xml | 3 + share/regions/config_539.xml | 3 + share/regions/config_54.xml | 3 + share/regions/config_540.xml | 3 + share/regions/config_541.xml | 3 + share/regions/config_542.xml | 3 + share/regions/config_543.xml | 3 + share/regions/config_544.xml | 3 + share/regions/config_545.xml | 3 + share/regions/config_546.xml | 3 + share/regions/config_547.xml | 3 + share/regions/config_548.xml | 3 + share/regions/config_549.xml | 3 + share/regions/config_55.xml | 3 + share/regions/config_550.xml | 3 + share/regions/config_551.xml | 3 + share/regions/config_552.xml | 3 + share/regions/config_553.xml | 3 + share/regions/config_554.xml | 3 + share/regions/config_555.xml | 3 + share/regions/config_556.xml | 3 + share/regions/config_557.xml | 3 + share/regions/config_558.xml | 3 + share/regions/config_559.xml | 3 + share/regions/config_56.xml | 3 + share/regions/config_560.xml | 3 + share/regions/config_561.xml | 3 + share/regions/config_562.xml | 3 + share/regions/config_563.xml | 3 + share/regions/config_564.xml | 3 + share/regions/config_565.xml | 3 + share/regions/config_566.xml | 3 + share/regions/config_567.xml | 3 + share/regions/config_568.xml | 3 + share/regions/config_569.xml | 3 + share/regions/config_57.xml | 3 + share/regions/config_570.xml | 3 + share/regions/config_571.xml | 3 + share/regions/config_572.xml | 3 + share/regions/config_573.xml | 3 + share/regions/config_574.xml | 3 + share/regions/config_575.xml | 3 + share/regions/config_576.xml | 3 + share/regions/config_577.xml | 3 + share/regions/config_578.xml | 3 + share/regions/config_579.xml | 3 + share/regions/config_58.xml | 3 + share/regions/config_580.xml | 3 + share/regions/config_581.xml | 3 + share/regions/config_582.xml | 3 + share/regions/config_583.xml | 3 + share/regions/config_584.xml | 3 + share/regions/config_585.xml | 3 + share/regions/config_586.xml | 3 + share/regions/config_587.xml | 3 + share/regions/config_588.xml | 3 + share/regions/config_589.xml | 3 + share/regions/config_59.xml | 3 + share/regions/config_590.xml | 3 + share/regions/config_591.xml | 3 + share/regions/config_592.xml | 3 + share/regions/config_593.xml | 3 + share/regions/config_594.xml | 3 + share/regions/config_595.xml | 3 + share/regions/config_596.xml | 3 + share/regions/config_597.xml | 3 + share/regions/config_598.xml | 3 + share/regions/config_599.xml | 3 + share/regions/config_6.xml | 3 + share/regions/config_60.xml | 3 + share/regions/config_600.xml | 3 + share/regions/config_601.xml | 3 + share/regions/config_602.xml | 3 + share/regions/config_603.xml | 3 + share/regions/config_604.xml | 3 + share/regions/config_605.xml | 3 + share/regions/config_606.xml | 3 + share/regions/config_607.xml | 3 + share/regions/config_608.xml | 3 + share/regions/config_609.xml | 3 + share/regions/config_61.xml | 3 + share/regions/config_610.xml | 3 + share/regions/config_611.xml | 3 + share/regions/config_612.xml | 3 + share/regions/config_613.xml | 3 + share/regions/config_614.xml | 3 + share/regions/config_615.xml | 3 + share/regions/config_616.xml | 3 + share/regions/config_617.xml | 3 + share/regions/config_618.xml | 3 + share/regions/config_619.xml | 3 + share/regions/config_62.xml | 3 + share/regions/config_620.xml | 3 + share/regions/config_621.xml | 3 + share/regions/config_622.xml | 3 + share/regions/config_623.xml | 3 + share/regions/config_624.xml | 3 + share/regions/config_625.xml | 3 + share/regions/config_626.xml | 3 + share/regions/config_627.xml | 3 + share/regions/config_628.xml | 3 + share/regions/config_629.xml | 3 + share/regions/config_63.xml | 3 + share/regions/config_630.xml | 3 + share/regions/config_631.xml | 3 + share/regions/config_632.xml | 3 + share/regions/config_633.xml | 3 + share/regions/config_634.xml | 3 + share/regions/config_635.xml | 3 + share/regions/config_636.xml | 3 + share/regions/config_637.xml | 3 + share/regions/config_638.xml | 3 + share/regions/config_639.xml | 3 + share/regions/config_64.xml | 3 + share/regions/config_640.xml | 3 + share/regions/config_641.xml | 3 + share/regions/config_642.xml | 3 + share/regions/config_643.xml | 3 + share/regions/config_644.xml | 3 + share/regions/config_645.xml | 3 + share/regions/config_646.xml | 3 + share/regions/config_647.xml | 3 + share/regions/config_648.xml | 3 + share/regions/config_649.xml | 3 + share/regions/config_65.xml | 3 + share/regions/config_650.xml | 3 + share/regions/config_651.xml | 3 + share/regions/config_652.xml | 3 + share/regions/config_653.xml | 3 + share/regions/config_654.xml | 3 + share/regions/config_655.xml | 3 + share/regions/config_656.xml | 3 + share/regions/config_657.xml | 3 + share/regions/config_658.xml | 3 + share/regions/config_659.xml | 3 + share/regions/config_66.xml | 3 + share/regions/config_660.xml | 3 + share/regions/config_661.xml | 3 + share/regions/config_662.xml | 3 + share/regions/config_663.xml | 3 + share/regions/config_664.xml | 3 + share/regions/config_665.xml | 3 + share/regions/config_666.xml | 3 + share/regions/config_667.xml | 3 + share/regions/config_668.xml | 3 + share/regions/config_669.xml | 3 + share/regions/config_67.xml | 3 + share/regions/config_670.xml | 3 + share/regions/config_671.xml | 3 + share/regions/config_672.xml | 3 + share/regions/config_673.xml | 3 + share/regions/config_674.xml | 3 + share/regions/config_675.xml | 3 + share/regions/config_676.xml | 3 + share/regions/config_677.xml | 3 + share/regions/config_678.xml | 3 + share/regions/config_679.xml | 3 + share/regions/config_68.xml | 3 + share/regions/config_680.xml | 3 + share/regions/config_681.xml | 3 + share/regions/config_682.xml | 3 + share/regions/config_683.xml | 3 + share/regions/config_684.xml | 3 + share/regions/config_685.xml | 3 + share/regions/config_686.xml | 3 + share/regions/config_687.xml | 3 + share/regions/config_688.xml | 3 + share/regions/config_689.xml | 3 + share/regions/config_69.xml | 3 + share/regions/config_690.xml | 3 + share/regions/config_691.xml | 3 + share/regions/config_692.xml | 3 + share/regions/config_693.xml | 3 + share/regions/config_694.xml | 3 + share/regions/config_695.xml | 3 + share/regions/config_696.xml | 3 + share/regions/config_697.xml | 3 + share/regions/config_698.xml | 3 + share/regions/config_699.xml | 3 + share/regions/config_7.xml | 3 + share/regions/config_70.xml | 3 + share/regions/config_700.xml | 3 + share/regions/config_701.xml | 3 + share/regions/config_702.xml | 3 + share/regions/config_703.xml | 3 + share/regions/config_704.xml | 3 + share/regions/config_705.xml | 3 + share/regions/config_706.xml | 3 + share/regions/config_707.xml | 3 + share/regions/config_708.xml | 3 + share/regions/config_709.xml | 3 + share/regions/config_71.xml | 3 + share/regions/config_710.xml | 3 + share/regions/config_711.xml | 3 + share/regions/config_712.xml | 3 + share/regions/config_713.xml | 3 + share/regions/config_714.xml | 3 + share/regions/config_715.xml | 3 + share/regions/config_716.xml | 3 + share/regions/config_717.xml | 3 + share/regions/config_718.xml | 3 + share/regions/config_719.xml | 3 + share/regions/config_72.xml | 3 + share/regions/config_720.xml | 3 + share/regions/config_721.xml | 3 + share/regions/config_722.xml | 3 + share/regions/config_723.xml | 3 + share/regions/config_724.xml | 3 + share/regions/config_725.xml | 3 + share/regions/config_726.xml | 3 + share/regions/config_727.xml | 3 + share/regions/config_728.xml | 3 + share/regions/config_729.xml | 3 + share/regions/config_73.xml | 3 + share/regions/config_730.xml | 3 + share/regions/config_731.xml | 3 + share/regions/config_732.xml | 3 + share/regions/config_733.xml | 3 + share/regions/config_734.xml | 3 + share/regions/config_735.xml | 3 + share/regions/config_736.xml | 3 + share/regions/config_737.xml | 3 + share/regions/config_738.xml | 3 + share/regions/config_739.xml | 3 + share/regions/config_74.xml | 3 + share/regions/config_740.xml | 3 + share/regions/config_741.xml | 3 + share/regions/config_742.xml | 3 + share/regions/config_743.xml | 3 + share/regions/config_744.xml | 3 + share/regions/config_745.xml | 3 + share/regions/config_746.xml | 3 + share/regions/config_747.xml | 3 + share/regions/config_748.xml | 3 + share/regions/config_749.xml | 3 + share/regions/config_75.xml | 3 + share/regions/config_750.xml | 3 + share/regions/config_751.xml | 3 + share/regions/config_752.xml | 3 + share/regions/config_753.xml | 3 + share/regions/config_754.xml | 3 + share/regions/config_755.xml | 3 + share/regions/config_756.xml | 3 + share/regions/config_757.xml | 3 + share/regions/config_758.xml | 3 + share/regions/config_759.xml | 3 + share/regions/config_76.xml | 3 + share/regions/config_760.xml | 3 + share/regions/config_761.xml | 3 + share/regions/config_762.xml | 3 + share/regions/config_763.xml | 3 + share/regions/config_764.xml | 3 + share/regions/config_765.xml | 3 + share/regions/config_766.xml | 3 + share/regions/config_767.xml | 3 + share/regions/config_768.xml | 3 + share/regions/config_769.xml | 3 + share/regions/config_77.xml | 3 + share/regions/config_770.xml | 3 + share/regions/config_771.xml | 3 + share/regions/config_772.xml | 3 + share/regions/config_773.xml | 3 + share/regions/config_774.xml | 3 + share/regions/config_775.xml | 3 + share/regions/config_776.xml | 3 + share/regions/config_777.xml | 3 + share/regions/config_778.xml | 3 + share/regions/config_779.xml | 3 + share/regions/config_78.xml | 3 + share/regions/config_780.xml | 3 + share/regions/config_781.xml | 3 + share/regions/config_782.xml | 3 + share/regions/config_783.xml | 3 + share/regions/config_784.xml | 3 + share/regions/config_785.xml | 3 + share/regions/config_786.xml | 3 + share/regions/config_787.xml | 3 + share/regions/config_788.xml | 3 + share/regions/config_789.xml | 3 + share/regions/config_79.xml | 3 + share/regions/config_790.xml | 3 + share/regions/config_791.xml | 3 + share/regions/config_792.xml | 3 + share/regions/config_793.xml | 3 + share/regions/config_794.xml | 3 + share/regions/config_795.xml | 3 + share/regions/config_796.xml | 3 + share/regions/config_797.xml | 3 + share/regions/config_798.xml | 3 + share/regions/config_799.xml | 3 + share/regions/config_8.xml | 3 + share/regions/config_80.xml | 3 + share/regions/config_800.xml | 3 + share/regions/config_801.xml | 3 + share/regions/config_802.xml | 3 + share/regions/config_803.xml | 3 + share/regions/config_804.xml | 3 + share/regions/config_805.xml | 3 + share/regions/config_806.xml | 3 + share/regions/config_807.xml | 3 + share/regions/config_808.xml | 3 + share/regions/config_809.xml | 3 + share/regions/config_81.xml | 3 + share/regions/config_810.xml | 3 + share/regions/config_811.xml | 3 + share/regions/config_812.xml | 3 + share/regions/config_813.xml | 3 + share/regions/config_814.xml | 3 + share/regions/config_815.xml | 3 + share/regions/config_816.xml | 3 + share/regions/config_817.xml | 3 + share/regions/config_818.xml | 3 + share/regions/config_819.xml | 3 + share/regions/config_82.xml | 3 + share/regions/config_820.xml | 3 + share/regions/config_821.xml | 3 + share/regions/config_822.xml | 3 + share/regions/config_823.xml | 3 + share/regions/config_824.xml | 3 + share/regions/config_825.xml | 3 + share/regions/config_826.xml | 3 + share/regions/config_827.xml | 3 + share/regions/config_828.xml | 3 + share/regions/config_829.xml | 3 + share/regions/config_83.xml | 3 + share/regions/config_830.xml | 3 + share/regions/config_831.xml | 3 + share/regions/config_832.xml | 3 + share/regions/config_833.xml | 3 + share/regions/config_834.xml | 3 + share/regions/config_835.xml | 3 + share/regions/config_836.xml | 3 + share/regions/config_837.xml | 3 + share/regions/config_838.xml | 3 + share/regions/config_839.xml | 3 + share/regions/config_84.xml | 3 + share/regions/config_840.xml | 3 + share/regions/config_841.xml | 3 + share/regions/config_842.xml | 3 + share/regions/config_843.xml | 3 + share/regions/config_844.xml | 3 + share/regions/config_845.xml | 3 + share/regions/config_846.xml | 3 + share/regions/config_847.xml | 3 + share/regions/config_848.xml | 3 + share/regions/config_849.xml | 3 + share/regions/config_85.xml | 3 + share/regions/config_850.xml | 3 + share/regions/config_851.xml | 3 + share/regions/config_852.xml | 3 + share/regions/config_853.xml | 3 + share/regions/config_854.xml | 3 + share/regions/config_855.xml | 3 + share/regions/config_856.xml | 3 + share/regions/config_857.xml | 3 + share/regions/config_858.xml | 3 + share/regions/config_859.xml | 3 + share/regions/config_86.xml | 3 + share/regions/config_860.xml | 3 + share/regions/config_861.xml | 3 + share/regions/config_862.xml | 3 + share/regions/config_863.xml | 3 + share/regions/config_864.xml | 3 + share/regions/config_865.xml | 3 + share/regions/config_866.xml | 3 + share/regions/config_867.xml | 3 + share/regions/config_868.xml | 3 + share/regions/config_869.xml | 3 + share/regions/config_87.xml | 3 + share/regions/config_870.xml | 3 + share/regions/config_871.xml | 3 + share/regions/config_872.xml | 3 + share/regions/config_873.xml | 3 + share/regions/config_874.xml | 3 + share/regions/config_875.xml | 3 + share/regions/config_876.xml | 3 + share/regions/config_877.xml | 3 + share/regions/config_878.xml | 3 + share/regions/config_879.xml | 3 + share/regions/config_88.xml | 3 + share/regions/config_880.xml | 3 + share/regions/config_881.xml | 3 + share/regions/config_882.xml | 3 + share/regions/config_883.xml | 3 + share/regions/config_884.xml | 3 + share/regions/config_885.xml | 3 + share/regions/config_886.xml | 3 + share/regions/config_887.xml | 3 + share/regions/config_888.xml | 3 + share/regions/config_889.xml | 3 + share/regions/config_89.xml | 3 + share/regions/config_890.xml | 3 + share/regions/config_891.xml | 3 + share/regions/config_892.xml | 3 + share/regions/config_893.xml | 3 + share/regions/config_894.xml | 3 + share/regions/config_895.xml | 3 + share/regions/config_896.xml | 3 + share/regions/config_897.xml | 3 + share/regions/config_898.xml | 3 + share/regions/config_899.xml | 3 + share/regions/config_9.xml | 3 + share/regions/config_90.xml | 3 + share/regions/config_900.xml | 3 + share/regions/config_901.xml | 3 + share/regions/config_902.xml | 3 + share/regions/config_903.xml | 3 + share/regions/config_904.xml | 3 + share/regions/config_905.xml | 3 + share/regions/config_906.xml | 3 + share/regions/config_907.xml | 3 + share/regions/config_908.xml | 3 + share/regions/config_909.xml | 3 + share/regions/config_91.xml | 3 + share/regions/config_910.xml | 3 + share/regions/config_911.xml | 3 + share/regions/config_912.xml | 3 + share/regions/config_913.xml | 3 + share/regions/config_914.xml | 3 + share/regions/config_915.xml | 3 + share/regions/config_916.xml | 3 + share/regions/config_917.xml | 3 + share/regions/config_918.xml | 3 + share/regions/config_919.xml | 3 + share/regions/config_92.xml | 3 + share/regions/config_920.xml | 3 + share/regions/config_921.xml | 3 + share/regions/config_922.xml | 3 + share/regions/config_923.xml | 3 + share/regions/config_924.xml | 3 + share/regions/config_925.xml | 3 + share/regions/config_926.xml | 3 + share/regions/config_927.xml | 3 + share/regions/config_928.xml | 3 + share/regions/config_929.xml | 3 + share/regions/config_93.xml | 3 + share/regions/config_930.xml | 3 + share/regions/config_931.xml | 3 + share/regions/config_932.xml | 3 + share/regions/config_933.xml | 3 + share/regions/config_934.xml | 3 + share/regions/config_935.xml | 3 + share/regions/config_936.xml | 3 + share/regions/config_937.xml | 3 + share/regions/config_938.xml | 3 + share/regions/config_939.xml | 3 + share/regions/config_94.xml | 3 + share/regions/config_940.xml | 3 + share/regions/config_941.xml | 3 + share/regions/config_942.xml | 3 + share/regions/config_943.xml | 3 + share/regions/config_944.xml | 3 + share/regions/config_945.xml | 3 + share/regions/config_946.xml | 3 + share/regions/config_947.xml | 3 + share/regions/config_948.xml | 3 + share/regions/config_949.xml | 3 + share/regions/config_95.xml | 3 + share/regions/config_950.xml | 3 + share/regions/config_951.xml | 3 + share/regions/config_952.xml | 3 + share/regions/config_953.xml | 3 + share/regions/config_954.xml | 3 + share/regions/config_955.xml | 3 + share/regions/config_956.xml | 3 + share/regions/config_957.xml | 3 + share/regions/config_958.xml | 3 + share/regions/config_959.xml | 3 + share/regions/config_96.xml | 3 + share/regions/config_960.xml | 3 + share/regions/config_961.xml | 3 + share/regions/config_962.xml | 3 + share/regions/config_963.xml | 3 + share/regions/config_964.xml | 3 + share/regions/config_965.xml | 3 + share/regions/config_966.xml | 3 + share/regions/config_967.xml | 3 + share/regions/config_968.xml | 3 + share/regions/config_969.xml | 3 + share/regions/config_97.xml | 3 + share/regions/config_970.xml | 3 + share/regions/config_971.xml | 3 + share/regions/config_972.xml | 3 + share/regions/config_973.xml | 3 + share/regions/config_974.xml | 3 + share/regions/config_975.xml | 3 + share/regions/config_976.xml | 3 + share/regions/config_977.xml | 3 + share/regions/config_978.xml | 3 + share/regions/config_979.xml | 3 + share/regions/config_98.xml | 3 + share/regions/config_980.xml | 3 + share/regions/config_981.xml | 3 + share/regions/config_982.xml | 3 + share/regions/config_983.xml | 3 + share/regions/config_984.xml | 3 + share/regions/config_985.xml | 3 + share/regions/config_986.xml | 3 + share/regions/config_987.xml | 3 + share/regions/config_988.xml | 3 + share/regions/config_989.xml | 3 + share/regions/config_99.xml | 3 + share/regions/config_990.xml | 3 + share/regions/config_991.xml | 3 + share/regions/config_992.xml | 3 + share/regions/config_993.xml | 3 + share/regions/config_994.xml | 3 + share/regions/config_995.xml | 3 + share/regions/config_996.xml | 3 + share/regions/config_997.xml | 3 + share/regions/config_998.xml | 3 + share/regions/config_999.xml | 3 + share/sql/mysql-agents.sql | 24 + share/sql/mysql-inventoryfolders.sql | 9 + share/sql/mysql-inventoryitems.sql | 14 + share/sql/mysql-logs.sql | 10 + share/sql/mysql-regions.sql | 29 + share/sql/mysql-reservations.txt | 16 + share/sql/mysql-users.sql | 34 + 1651 files changed, 65671 insertions(+) create mode 100644 OpenSim.FxCop create mode 100644 OpenSim.sln create mode 100644 OpenSim.suo create mode 100644 OpenSim/Framework/Communications/CommunicationsManager.cs create mode 100644 OpenSim/Framework/Communications/IGridServices.cs create mode 100644 OpenSim/Framework/Communications/IInterRegionCommunications.cs create mode 100644 OpenSim/Framework/Communications/IUserServices.cs create mode 100644 OpenSim/Framework/Communications/OpenSim.Framework.Communications.csproj create mode 100644 OpenSim/Framework/Communications/OpenSim.Framework.Communications.csproj.user create mode 100644 OpenSim/Framework/Communications/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Framework/Communications/obj/Debug/OpenSim.Framework.Communications.dll create mode 100644 OpenSim/Framework/Communications/obj/Debug/OpenSim.Framework.Communications.pdb create mode 100644 OpenSim/Framework/Communications/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Communications/obj/OpenSim.Framework.Communications.csproj.FileList.txt create mode 100644 OpenSim/Framework/Communications/obj/Release/OpenSim.Framework.Communications.dll create mode 100644 OpenSim/Framework/Communications/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Configuration/ConfigurationManager.cs create mode 100644 OpenSim/Framework/Configuration/ConfigurationMember.cs create mode 100644 OpenSim/Framework/Configuration/ConfigurationOption.cs create mode 100644 OpenSim/Framework/Configuration/OpenSim.Framework.Configuration.csproj create mode 100644 OpenSim/Framework/Configuration/OpenSim.Framework.Configuration.csproj.user create mode 100644 OpenSim/Framework/Configuration/OpenSim.Framework.GenericConfig.csproj create mode 100644 OpenSim/Framework/Configuration/OpenSim.Framework.GenericConfig.csproj.user create mode 100644 OpenSim/Framework/Configuration/XmlConfiguration.cs create mode 100644 OpenSim/Framework/Configuration/obj/Debug/OpenSim.Framework.Configuration.dll create mode 100644 OpenSim/Framework/Configuration/obj/Debug/OpenSim.Framework.Configuration.pdb create mode 100644 OpenSim/Framework/Configuration/obj/OpenSim.Framework.Configuration.csproj.FileList.txt create mode 100644 OpenSim/Framework/Configuration/obj/Release/OpenSim.Framework.Configuration.dll create mode 100644 OpenSim/Framework/Console/AssemblyInfo.cs create mode 100644 OpenSim/Framework/Console/ConsoleCallbacksBase.cs create mode 100644 OpenSim/Framework/Console/LogBase.cs create mode 100644 OpenSim/Framework/Console/MainLog.cs create mode 100644 OpenSim/Framework/Console/OpenSim.Framework.Console.csproj create mode 100644 OpenSim/Framework/Console/OpenSim.Framework.Console.csproj.user create mode 100644 OpenSim/Framework/Console/obj/Debug/OpenSim.Framework.Console.dll create mode 100644 OpenSim/Framework/Console/obj/Debug/OpenSim.Framework.Console.pdb create mode 100644 OpenSim/Framework/Console/obj/OpenSim.Framework.Console.csproj.FileList.txt create mode 100644 OpenSim/Framework/Console/obj/Release/OpenSim.Framework.Console.dll create mode 100644 OpenSim/Framework/Data.DB4o/DB4oGridData.cs create mode 100644 OpenSim/Framework/Data.DB4o/DB4oManager.cs create mode 100644 OpenSim/Framework/Data.DB4o/DB4oUserData.cs create mode 100644 OpenSim/Framework/Data.DB4o/OpenSim.Framework.Data.DB4o.csproj create mode 100644 OpenSim/Framework/Data.DB4o/OpenSim.Framework.Data.DB4o.csproj.user create mode 100644 OpenSim/Framework/Data.DB4o/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Framework/Data.DB4o/obj/Debug/OpenSim.Framework.Data.DB4o.dll create mode 100644 OpenSim/Framework/Data.DB4o/obj/Debug/OpenSim.Framework.Data.DB4o.pdb create mode 100644 OpenSim/Framework/Data.DB4o/obj/OpenSim.Framework.Data.DB4o.csproj.FileList.txt create mode 100644 OpenSim/Framework/Data.DB4o/obj/Release/OpenSim.Framework.Data.DB4o.dll create mode 100644 OpenSim/Framework/Data.MSSQL/MSSQLGridData.cs create mode 100644 OpenSim/Framework/Data.MSSQL/MSSQLManager.cs create mode 100644 OpenSim/Framework/Data.MSSQL/OpenSim.Framework.Data.MSSQL.csproj create mode 100644 OpenSim/Framework/Data.MSSQL/OpenSim.Framework.Data.MSSQL.csproj.user create mode 100644 OpenSim/Framework/Data.MSSQL/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Framework/Data.MSSQL/obj/Debug/OpenSim.Framework.Data.MSSQL.dll create mode 100644 OpenSim/Framework/Data.MSSQL/obj/Debug/OpenSim.Framework.Data.MSSQL.pdb create mode 100644 OpenSim/Framework/Data.MSSQL/obj/OpenSim.Framework.Data.MSSQL.csproj.FileList.txt create mode 100644 OpenSim/Framework/Data.MSSQL/obj/Release/OpenSim.Framework.Data.MSSQL.dll create mode 100644 OpenSim/Framework/Data.MySQL/MySQLGridData.cs create mode 100644 OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs create mode 100644 OpenSim/Framework/Data.MySQL/MySQLLogData.cs create mode 100644 OpenSim/Framework/Data.MySQL/MySQLManager.cs create mode 100644 OpenSim/Framework/Data.MySQL/MySQLUserData.cs create mode 100644 OpenSim/Framework/Data.MySQL/OpenSim.Framework.Data.MySQL.csproj create mode 100644 OpenSim/Framework/Data.MySQL/OpenSim.Framework.Data.MySQL.csproj.user create mode 100644 OpenSim/Framework/Data.MySQL/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Framework/Data.MySQL/obj/Debug/OpenSim.Framework.Data.MySQL.dll create mode 100644 OpenSim/Framework/Data.MySQL/obj/Debug/OpenSim.Framework.Data.MySQL.pdb create mode 100644 OpenSim/Framework/Data.MySQL/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Data.MySQL/obj/OpenSim.Framework.Data.MySQL.csproj.FileList.txt create mode 100644 OpenSim/Framework/Data.MySQL/obj/Release/OpenSim.Framework.Data.MySQL.dll create mode 100644 OpenSim/Framework/Data.MySQL/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Data.SQLite/OpenSim.Framework.Data.SQLite.csproj create mode 100644 OpenSim/Framework/Data.SQLite/OpenSim.Framework.Data.SQLite.csproj.user create mode 100644 OpenSim/Framework/Data.SQLite/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Framework/Data.SQLite/SQLiteGridData.cs create mode 100644 OpenSim/Framework/Data.SQLite/SQLiteManager.cs create mode 100644 OpenSim/Framework/Data.SQLite/obj/Debug/OpenSim.Framework.Data.SQLite.dll create mode 100644 OpenSim/Framework/Data.SQLite/obj/Debug/OpenSim.Framework.Data.SQLite.pdb create mode 100644 OpenSim/Framework/Data.SQLite/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Data.SQLite/obj/OpenSim.Framework.Data.SQLite.csproj.FileList.txt create mode 100644 OpenSim/Framework/Data.SQLite/obj/Release/OpenSim.Framework.Data.SQLite.dll create mode 100644 OpenSim/Framework/Data.SQLite/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Data/GridData.cs create mode 100644 OpenSim/Framework/Data/ILogData.cs create mode 100644 OpenSim/Framework/Data/IniConfig.cs create mode 100644 OpenSim/Framework/Data/InventoryData.cs create mode 100644 OpenSim/Framework/Data/OpenSim.Framework.Data.csproj create mode 100644 OpenSim/Framework/Data/OpenSim.Framework.Data.csproj.user create mode 100644 OpenSim/Framework/Data/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Framework/Data/ReservationData.cs create mode 100644 OpenSim/Framework/Data/SimProfileData.cs create mode 100644 OpenSim/Framework/Data/UserData.cs create mode 100644 OpenSim/Framework/Data/UserProfileData.cs create mode 100644 OpenSim/Framework/Data/obj/Debug/OpenSim.Framework.Data.dll create mode 100644 OpenSim/Framework/Data/obj/Debug/OpenSim.Framework.Data.pdb create mode 100644 OpenSim/Framework/Data/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Data/obj/OpenSim.Framework.Data.csproj.FileList.txt create mode 100644 OpenSim/Framework/Data/obj/Release/OpenSim.Framework.Data.dll create mode 100644 OpenSim/Framework/Data/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/General/AgentInventory.cs create mode 100644 OpenSim/Framework/General/AuthenticateSessionBase.cs create mode 100644 OpenSim/Framework/General/BlockingQueue.cs create mode 100644 OpenSim/Framework/General/IRegionCommsListener.cs create mode 100644 OpenSim/Framework/General/Interfaces/AuthenticateResponse.cs create mode 100644 OpenSim/Framework/General/Interfaces/Configuration/IGridConfig.cs create mode 100644 OpenSim/Framework/General/Interfaces/Configuration/IUserConfig.cs create mode 100644 OpenSim/Framework/General/Interfaces/IAssetServer.cs create mode 100644 OpenSim/Framework/General/Interfaces/IClientAPI.cs create mode 100644 OpenSim/Framework/General/Interfaces/ILocalStorage.cs create mode 100644 OpenSim/Framework/General/Interfaces/IUserServer.cs create mode 100644 OpenSim/Framework/General/Interfaces/IWorld.cs create mode 100644 OpenSim/Framework/General/LoginService.cs create mode 100644 OpenSim/Framework/General/OpenSim.Framework.csproj create mode 100644 OpenSim/Framework/General/OpenSim.Framework.csproj.user create mode 100644 OpenSim/Framework/General/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Framework/General/RegionCommsListener.cs create mode 100644 OpenSim/Framework/General/Remoting.cs create mode 100644 OpenSim/Framework/General/Types/AgentCiruitData.cs create mode 100644 OpenSim/Framework/General/Types/AgentWearable.cs create mode 100644 OpenSim/Framework/General/Types/AssetBase.cs create mode 100644 OpenSim/Framework/General/Types/AssetLandmark.cs create mode 100644 OpenSim/Framework/General/Types/AssetStorage.cs create mode 100644 OpenSim/Framework/General/Types/EstateSettings.cs create mode 100644 OpenSim/Framework/General/Types/Login.cs create mode 100644 OpenSim/Framework/General/Types/MapBlockData.cs create mode 100644 OpenSim/Framework/General/Types/NeighbourInfo.cs create mode 100644 OpenSim/Framework/General/Types/NetworkServersInfo.cs create mode 100644 OpenSim/Framework/General/Types/ParcelData.cs create mode 100644 OpenSim/Framework/General/Types/PrimData.cs create mode 100644 OpenSim/Framework/General/Types/PrimitiveBaseShape.cs create mode 100644 OpenSim/Framework/General/Types/RegionHandle.cs create mode 100644 OpenSim/Framework/General/Types/RegionInfo.cs create mode 100644 OpenSim/Framework/General/Types/UUID.cs create mode 100644 OpenSim/Framework/General/UserProfile.cs create mode 100644 OpenSim/Framework/General/Util.cs create mode 100644 OpenSim/Framework/General/obj/Debug/OpenSim.Framework.dll create mode 100644 OpenSim/Framework/General/obj/Debug/OpenSim.Framework.pdb create mode 100644 OpenSim/Framework/General/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/General/obj/OpenSim.Framework.csproj.FileList.txt create mode 100644 OpenSim/Framework/General/obj/Release/OpenSim.Framework.dll create mode 100644 OpenSim/Framework/General/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Servers/BaseHttpServer.cs create mode 100644 OpenSim/Framework/Servers/BaseStreamHandler.cs create mode 100644 OpenSim/Framework/Servers/CheckSumServer.cs create mode 100644 OpenSim/Framework/Servers/IStreamHandler.cs create mode 100644 OpenSim/Framework/Servers/OpenSim.Framework.Servers.csproj create mode 100644 OpenSim/Framework/Servers/OpenSim.Framework.Servers.csproj.user create mode 100644 OpenSim/Framework/Servers/RestMethod.cs create mode 100644 OpenSim/Framework/Servers/RestStreamHandler.cs create mode 100644 OpenSim/Framework/Servers/UDPServerBase.cs create mode 100644 OpenSim/Framework/Servers/XmlRpcMethod.cs create mode 100644 OpenSim/Framework/Servers/obj/Debug/OpenSim.Framework.Servers.dll create mode 100644 OpenSim/Framework/Servers/obj/Debug/OpenSim.Framework.Servers.pdb create mode 100644 OpenSim/Framework/Servers/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Servers/obj/OpenSim.Framework.Servers.csproj.FileList.txt create mode 100644 OpenSim/Framework/Servers/obj/Release/OpenSim.Framework.Servers.dll create mode 100644 OpenSim/Framework/Servers/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/Services/IAssetServicesCoreFunctions.cs create mode 100644 OpenSim/Framework/Services/IGridServicesCoreFunctions.cs create mode 100644 OpenSim/Framework/Services/IUserServicesCoreFunctions.cs create mode 100644 OpenSim/Framework/Services/OpenSim.Framework.Services.csproj create mode 100644 OpenSim/Framework/Services/OpenSim.Framework.Services.csproj.user create mode 100644 OpenSim/Framework/Services/obj/Debug/OpenSim.Framework.Services.dll create mode 100644 OpenSim/Framework/Services/obj/Debug/OpenSim.Framework.Services.pdb create mode 100644 OpenSim/Framework/Services/obj/OpenSim.Framework.Services.csproj.FileList.txt create mode 100644 OpenSim/Framework/Services/obj/Release/OpenSim.Framework.Services.dll create mode 100644 OpenSim/Framework/UserManager/LoginResponse.cs create mode 100644 OpenSim/Framework/UserManager/OpenSim.Framework.UserManagement.csproj create mode 100644 OpenSim/Framework/UserManager/OpenSim.Framework.UserManagement.csproj.user create mode 100644 OpenSim/Framework/UserManager/UserManagerBase.cs create mode 100644 OpenSim/Framework/UserManager/obj/Debug/OpenSim.Framework.UserManagement.dll create mode 100644 OpenSim/Framework/UserManager/obj/Debug/OpenSim.Framework.UserManagement.pdb create mode 100644 OpenSim/Framework/UserManager/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Framework/UserManager/obj/OpenSim.Framework.UserManagement.csproj.FileList.txt create mode 100644 OpenSim/Framework/UserManager/obj/Release/OpenSim.Framework.UserManagement.dll create mode 100644 OpenSim/Framework/UserManager/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/AssetServer/AssetServerMain.cs create mode 100644 OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj create mode 100644 OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj.user create mode 100644 OpenSim/Grid/AssetServer/obj/Debug/OpenSim.Grid.AssetServer.pdb create mode 100644 OpenSim/Grid/AssetServer/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/AssetServer/obj/OpenSim.Grid.AssetServer.csproj.FileList.txt create mode 100644 OpenSim/Grid/AssetServer/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/GridServer/GridServerMain.cs create mode 100644 OpenSim/Grid/GridServer/OpenSim.Grid.GridServer.csproj create mode 100644 OpenSim/Grid/GridServer/OpenSim.Grid.GridServer.csproj.user create mode 100644 OpenSim/Grid/GridServer/obj/Debug/OpenSim.Grid.GridServer.pdb create mode 100644 OpenSim/Grid/GridServer/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/GridServer/obj/OpenSim.Grid.GridServer.csproj.FileList.txt create mode 100644 OpenSim/Grid/GridServer/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Old/AssetServer/Main.cs create mode 100644 OpenSim/Grid/Old/AssetServer/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Grid/Old/AssetServer/obj/Debug/OpenSim.Grid.AssetServer.pdb create mode 100644 OpenSim/Grid/Old/AssetServer/obj/OpenSim.Grid.AssetServer.csproj.FileList.txt create mode 100644 OpenSim/Grid/Old/Framework.Manager/GridManagementAgent.cs create mode 100644 OpenSim/Grid/Old/Framework.Manager/GridServerManager.cs create mode 100644 OpenSim/Grid/Old/Framework.Manager/obj/Debug/OpenSim.Grid.Framework.Manager.dll create mode 100644 OpenSim/Grid/Old/Framework.Manager/obj/Debug/OpenSim.Grid.Framework.Manager.pdb create mode 100644 OpenSim/Grid/Old/Framework.Manager/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Old/Framework.Manager/obj/OpenSim.Grid.Framework.Manager.csproj.FileList.txt create mode 100644 OpenSim/Grid/Old/Framework.Manager/obj/Release/OpenSim.Grid.Framework.Manager.dll create mode 100644 OpenSim/Grid/Old/GridServer.Config/AssemblyInfo.cs create mode 100644 OpenSim/Grid/Old/GridServer.Config/DbGridConfig.cs create mode 100644 OpenSim/Grid/Old/GridServer.Config/obj/Debug/OpenSim.Grid.GridServer.Config.dll create mode 100644 OpenSim/Grid/Old/GridServer.Config/obj/Debug/OpenSim.Grid.GridServer.Config.pdb create mode 100644 OpenSim/Grid/Old/GridServer.Config/obj/OpenSim.Grid.GridServer.Config.csproj.FileList.txt create mode 100644 OpenSim/Grid/Old/GridServer.Config/obj/Release/OpenSim.Grid.GridServer.Config.dll create mode 100644 OpenSim/Grid/Old/GridServer/GridManager.cs create mode 100644 OpenSim/Grid/Old/GridServer/Main.cs create mode 100644 OpenSim/Grid/Old/GridServer/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Grid/Old/GridServer/obj/Debug/OpenSim.Grid.GridServer.pdb create mode 100644 OpenSim/Grid/Old/GridServer/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Old/GridServer/obj/OpenSim.Grid.GridServer.csproj.FileList.txt create mode 100644 OpenSim/Grid/Old/GridServer/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Old/InventoryServer/InventoryManager.cs create mode 100644 OpenSim/Grid/Old/InventoryServer/Main.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager.mds create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager.userprefs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager.usertasks create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/AssemblyInfo.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/BlockingQueue.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Connect to grid server.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/ConnectToGridServerDialog.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/GridServerConnectionManager.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Main.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/MainWindow.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/OpenGridServices.Manager.mdp create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/OpenGridServices.Manager.pidb create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/RegionBlock.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Util.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/OpenGridServices.Manager.ConnectToGridServerDialog.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/OpenGridServices.Manager.MainWindow.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/generated.cs create mode 100644 OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/gui.stetic create mode 100644 OpenSim/Grid/Old/UserServer.Config/AssemblyInfo.cs create mode 100644 OpenSim/Grid/Old/UserServer.Config/DbUserConfig.cs create mode 100644 OpenSim/Grid/Old/UserServer.Config/obj/Debug/OpenSim.Grid.UserServer.Config.dll create mode 100644 OpenSim/Grid/Old/UserServer.Config/obj/Debug/OpenSim.Grid.UserServer.Config.pdb create mode 100644 OpenSim/Grid/Old/UserServer.Config/obj/OpenSim.Grid.UserServer.Config.csproj.FileList.txt create mode 100644 OpenSim/Grid/Old/UserServer.Config/obj/Release/OpenSim.Grid.UserServer.Config.dll create mode 100644 OpenSim/Grid/Services/Asset/AssetServices.cs create mode 100644 OpenSim/Grid/Services/Asset/OpenSim.Grid.Services.Asset.csproj create mode 100644 OpenSim/Grid/Services/Asset/OpenSim.Grid.Services.Asset.csproj.user create mode 100644 OpenSim/Grid/Services/Asset/obj/Debug/OpenSim.Grid.Services.Asset.dll create mode 100644 OpenSim/Grid/Services/Asset/obj/Debug/OpenSim.Grid.Services.Asset.pdb create mode 100644 OpenSim/Grid/Services/Asset/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Services/Asset/obj/OpenSim.Grid.Services.Asset.csproj.FileList.txt create mode 100644 OpenSim/Grid/Services/Asset/obj/Release/OpenSim.Grid.Services.Asset.dll create mode 100644 OpenSim/Grid/Services/Asset/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/AssetServicesCoreFunctionsLocal.cs create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/GridServicesCoreFunctionsLocal.cs create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/OpenSim.Grid.Services.CoreFunctions.Local.csproj create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/OpenSim.Grid.Services.CoreFunctions.Local.csproj.user create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/UserServicesCoreFunctionsLocal.cs create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Local.dll create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Local.pdb create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/obj/OpenSim.Grid.Services.CoreFunctions.Local.csproj.FileList.txt create mode 100644 OpenSim/Grid/Services/CoreFunctions/Local/obj/Release/OpenSim.Grid.Services.CoreFunctions.Local.dll create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/AssetServicesCoreFunctionsRemote.cs create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/GridServicesCoreFunctionsRemote.cs create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/OpenSim.Grid.Services.CoreFunctions.Remote.csproj create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/OpenSim.Grid.Services.CoreFunctions.Remote.csproj.user create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/UserServicesCoreFunctionsRemote.cs create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Remote.dll create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Remote.pdb create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/obj/OpenSim.Grid.Services.CoreFunctions.Remote.csproj.FileList.txt create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/obj/Release/OpenSim.Grid.Services.CoreFunctions.Remote.dll create mode 100644 OpenSim/Grid/Services/CoreFunctions/Remote/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Services/Grid/GridServices.cs create mode 100644 OpenSim/Grid/Services/Grid/OpenSim.Grid.Services.Grid.csproj create mode 100644 OpenSim/Grid/Services/Grid/OpenSim.Grid.Services.Grid.csproj.user create mode 100644 OpenSim/Grid/Services/Grid/obj/Debug/OpenSim.Grid.Services.Grid.dll create mode 100644 OpenSim/Grid/Services/Grid/obj/Debug/OpenSim.Grid.Services.Grid.pdb create mode 100644 OpenSim/Grid/Services/Grid/obj/OpenSim.Grid.Services.Grid.csproj.FileList.txt create mode 100644 OpenSim/Grid/Services/Grid/obj/Release/OpenSim.Grid.Services.Grid.dll create mode 100644 OpenSim/Grid/Services/Grid/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/Services/User/OpenSim.Grid.Services.User.csproj create mode 100644 OpenSim/Grid/Services/User/OpenSim.Grid.Services.User.csproj.user create mode 100644 OpenSim/Grid/Services/User/UserServices.cs create mode 100644 OpenSim/Grid/Services/User/obj/Debug/OpenSim.Grid.Services.User.dll create mode 100644 OpenSim/Grid/Services/User/obj/Debug/OpenSim.Grid.Services.User.pdb create mode 100644 OpenSim/Grid/Services/User/obj/OpenSim.Grid.Services.User.csproj.FileList.txt create mode 100644 OpenSim/Grid/Services/User/obj/Release/OpenSim.Grid.Services.User.dll create mode 100644 OpenSim/Grid/Services/User/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/UserServer/OpenSim.Grid.UserServer.csproj create mode 100644 OpenSim/Grid/UserServer/OpenSim.Grid.UserServer.csproj.user create mode 100644 OpenSim/Grid/UserServer/UserServerMain.cs create mode 100644 OpenSim/Grid/UserServer/obj/Debug/OpenSim.Grid.UserServer.pdb create mode 100644 OpenSim/Grid/UserServer/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Grid/UserServer/obj/OpenSim.Grid.UserServer.csproj.FileList.txt create mode 100644 OpenSim/Grid/UserServer/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Application/Application.cs create mode 100644 OpenSim/Region/Application/OpenSim.csproj create mode 100644 OpenSim/Region/Application/OpenSim.csproj.user create mode 100644 OpenSim/Region/Application/OpenSimMain.cs create mode 100644 OpenSim/Region/Application/VersionInfo.cs create mode 100644 OpenSim/Region/Application/obj/Debug/OpenSim.pdb create mode 100644 OpenSim/Region/Application/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Application/obj/OpenSim.csproj.FileList.txt create mode 100644 OpenSim/Region/Application/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Caches/AssetCache.cs create mode 100644 OpenSim/Region/Caches/OpenSim.Region.Caches.csproj create mode 100644 OpenSim/Region/Caches/OpenSim.Region.Caches.csproj.user create mode 100644 OpenSim/Region/Caches/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Region/Caches/obj/Debug/OpenSim.Region.Caches.dll create mode 100644 OpenSim/Region/Caches/obj/Debug/OpenSim.Region.Caches.pdb create mode 100644 OpenSim/Region/Caches/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Caches/obj/OpenSim.Region.Caches.csproj.FileList.txt create mode 100644 OpenSim/Region/Caches/obj/Release/OpenSim.Region.Caches.dll create mode 100644 OpenSim/Region/Caches/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Capabilities/Caps.cs create mode 100644 OpenSim/Region/Capabilities/LLSDArray.cs create mode 100644 OpenSim/Region/Capabilities/LLSDCapEvent.cs create mode 100644 OpenSim/Region/Capabilities/LLSDCapsDetails.cs create mode 100644 OpenSim/Region/Capabilities/LLSDEmpty.cs create mode 100644 OpenSim/Region/Capabilities/LLSDHelpers.cs create mode 100644 OpenSim/Region/Capabilities/LLSDMapLayer.cs create mode 100644 OpenSim/Region/Capabilities/LLSDMapLayerResponse.cs create mode 100644 OpenSim/Region/Capabilities/LLSDMapRequest.cs create mode 100644 OpenSim/Region/Capabilities/LLSDMethod.cs create mode 100644 OpenSim/Region/Capabilities/LLSDStreamHandler.cs create mode 100644 OpenSim/Region/Capabilities/LLSDTest.cs create mode 100644 OpenSim/Region/Capabilities/LLSDType.cs create mode 100644 OpenSim/Region/Capabilities/LLSDUploadReply.cs create mode 100644 OpenSim/Region/Capabilities/OpenSim.Region.Capabilities.csproj create mode 100644 OpenSim/Region/Capabilities/OpenSim.Region.Capabilities.csproj.user create mode 100644 OpenSim/Region/Capabilities/obj/Debug/OpenSim.Region.Capabilities.dll create mode 100644 OpenSim/Region/Capabilities/obj/Debug/OpenSim.Region.Capabilities.pdb create mode 100644 OpenSim/Region/Capabilities/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Capabilities/obj/OpenSim.Region.Capabilities.csproj.FileList.txt create mode 100644 OpenSim/Region/Capabilities/obj/Release/OpenSim.Region.Capabilities.dll create mode 100644 OpenSim/Region/Capabilities/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/ClientStack/Assets/InventoryCache.cs create mode 100644 OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs create mode 100644 OpenSim/Region/ClientStack/ClientView.API.cs create mode 100644 OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs create mode 100644 OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs create mode 100644 OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs create mode 100644 OpenSim/Region/ClientStack/ClientView.cs create mode 100644 OpenSim/Region/ClientStack/ClientViewBase.cs create mode 100644 OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj create mode 100644 OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj.user create mode 100644 OpenSim/Region/ClientStack/PacketServer.cs create mode 100644 OpenSim/Region/ClientStack/RegionApplicationBase.cs create mode 100644 OpenSim/Region/ClientStack/UDPServer.cs create mode 100644 OpenSim/Region/ClientStack/obj/Debug/OpenSim.Region.ClientStack.dll create mode 100644 OpenSim/Region/ClientStack/obj/Debug/OpenSim.Region.ClientStack.pdb create mode 100644 OpenSim/Region/ClientStack/obj/OpenSim.Region.ClientStack.csproj.FileList.txt create mode 100644 OpenSim/Region/ClientStack/obj/Release/OpenSim.Region.ClientStack.dll create mode 100644 OpenSim/Region/Communications/Local/CommunicationsLocal.cs create mode 100644 OpenSim/Region/Communications/Local/LocalBackEndServices.cs create mode 100644 OpenSim/Region/Communications/Local/LocalUserServices.cs create mode 100644 OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj create mode 100644 OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj.user create mode 100644 OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Region/Communications/Local/obj/Debug/OpenSim.Region.Communications.Local.dll create mode 100644 OpenSim/Region/Communications/Local/obj/Debug/OpenSim.Region.Communications.Local.pdb create mode 100644 OpenSim/Region/Communications/Local/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Communications/Local/obj/OpenSim.Region.Communications.Local.csproj.FileList.txt create mode 100644 OpenSim/Region/Communications/Local/obj/Release/OpenSim.Region.Communications.Local.dll create mode 100644 OpenSim/Region/Communications/Local/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs create mode 100644 OpenSim/Region/Communications/OGS1/OGS1GridServices.cs create mode 100644 OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs create mode 100644 OpenSim/Region/Communications/OGS1/OGS1UserServices.cs create mode 100644 OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj create mode 100644 OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj.user create mode 100644 OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Region/Communications/OGS1/obj/Debug/OpenSim.Region.Communications.OGS1.dll create mode 100644 OpenSim/Region/Communications/OGS1/obj/Debug/OpenSim.Region.Communications.OGS1.pdb create mode 100644 OpenSim/Region/Communications/OGS1/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Communications/OGS1/obj/OpenSim.Region.Communications.OGS1.csproj.FileList.txt create mode 100644 OpenSim/Region/Communications/OGS1/obj/Release/OpenSim.Region.Communications.OGS1.dll create mode 100644 OpenSim/Region/Communications/OGS1/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Environment/EstateManager.cs create mode 100644 OpenSim/Region/Environment/OpenSim.Region.Environment.csproj create mode 100644 OpenSim/Region/Environment/OpenSim.Region.Environment.csproj.user create mode 100644 OpenSim/Region/Environment/ParcelManager.cs create mode 100644 OpenSim/Region/Environment/RegionManager.cs create mode 100644 OpenSim/Region/Environment/Scenes/Entity.cs create mode 100644 OpenSim/Region/Environment/Scenes/EntityBase.cs create mode 100644 OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs create mode 100644 OpenSim/Region/Environment/Scenes/Primitive.cs create mode 100644 OpenSim/Region/Environment/Scenes/PrimitiveOld.cs create mode 100644 OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs create mode 100644 OpenSim/Region/Environment/Scenes/Scene.cs create mode 100644 OpenSim/Region/Environment/Scenes/SceneBase.cs create mode 100644 OpenSim/Region/Environment/Scenes/SceneEvents.cs create mode 100644 OpenSim/Region/Environment/Scenes/SceneObject.cs create mode 100644 OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs create mode 100644 OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs create mode 100644 OpenSim/Region/Environment/Scenes/ScenePresence.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpEngine/CSharpScriptEngine.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine/JScriptEngine.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassInstance.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassRecord.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Heap.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Interpreter.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterLogic.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterMethods.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterReturn.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/JavaEngine.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MainMemory.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MethodMemory.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Object.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/OpenSimJVM.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Stack.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/StackFrame.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Thread.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ArrayReference.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/BaseType.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ObjectReference.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Byte.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Char.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Float.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Int.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/Script.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/ScriptAPI.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs create mode 100644 OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs create mode 100644 OpenSim/Region/Environment/obj/Debug/OpenSim.Region.Environment.dll create mode 100644 OpenSim/Region/Environment/obj/Debug/OpenSim.Region.Environment.pdb create mode 100644 OpenSim/Region/Environment/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Environment/obj/OpenSim.Region.Environment.csproj.FileList.txt create mode 100644 OpenSim/Region/Environment/obj/Release/OpenSim.Region.Environment.dll create mode 100644 OpenSim/Region/Environment/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Examples/SimpleApp/LlsdMethodEntry.cs create mode 100644 OpenSim/Region/Examples/SimpleApp/MyWorld.cs create mode 100644 OpenSim/Region/Examples/SimpleApp/Program.cs create mode 100644 OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj create mode 100644 OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj.user create mode 100644 OpenSim/Region/Examples/SimpleApp/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Examples/SimpleApp/obj/Debug/SimpleApp.pdb create mode 100644 OpenSim/Region/Examples/SimpleApp/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Examples/SimpleApp/obj/SimpleApp.csproj.FileList.txt create mode 100644 OpenSim/Region/GridInterfaces/Local/AssemblyInfo.cs create mode 100644 OpenSim/Region/GridInterfaces/Local/LocalAssetServer.cs create mode 100644 OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj create mode 100644 OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj.user create mode 100644 OpenSim/Region/GridInterfaces/Local/obj/Debug/OpenSim.Region.GridInterfaces.Local.dll create mode 100644 OpenSim/Region/GridInterfaces/Local/obj/Debug/OpenSim.Region.GridInterfaces.Local.pdb create mode 100644 OpenSim/Region/GridInterfaces/Local/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/GridInterfaces/Local/obj/OpenSim.Region.GridInterfaces.Local.csproj.FileList.txt create mode 100644 OpenSim/Region/GridInterfaces/Local/obj/Release/OpenSim.Region.GridInterfaces.Local.dll create mode 100644 OpenSim/Region/GridInterfaces/Local/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs create mode 100644 OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj create mode 100644 OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj.user create mode 100644 OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs create mode 100644 OpenSim/Region/GridInterfaces/Remote/obj/Debug/OpenSim.Region.GridInterfaces.Remote.dll create mode 100644 OpenSim/Region/GridInterfaces/Remote/obj/Debug/OpenSim.Region.GridInterfaces.Remote.pdb create mode 100644 OpenSim/Region/GridInterfaces/Remote/obj/OpenSim.Region.GridInterfaces.Remote.csproj.FileList.txt create mode 100644 OpenSim/Region/GridInterfaces/Remote/obj/Release/OpenSim.Region.GridInterfaces.Remote.dll create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.user create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/obj/Debug/OpenSim.Region.Physics.BasicPhysicsPlugin.dll create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/obj/Debug/OpenSim.Region.Physics.BasicPhysicsPlugin.pdb create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/obj/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.FileList.txt create mode 100644 OpenSim/Region/Physics/BasicPhysicsPlugin/obj/Release/OpenSim.Region.Physics.BasicPhysicsPlugin.dll create mode 100644 OpenSim/Region/Physics/Manager/AssemblyInfo.cs create mode 100644 OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj create mode 100644 OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj.user create mode 100644 OpenSim/Region/Physics/Manager/PhysicsActor.cs create mode 100644 OpenSim/Region/Physics/Manager/PhysicsManager.cs create mode 100644 OpenSim/Region/Physics/Manager/PhysicsScene.cs create mode 100644 OpenSim/Region/Physics/Manager/PhysicsVector.cs create mode 100644 OpenSim/Region/Physics/Manager/obj/Debug/OpenSim.Region.Physics.Manager.dll create mode 100644 OpenSim/Region/Physics/Manager/obj/Debug/OpenSim.Region.Physics.Manager.pdb create mode 100644 OpenSim/Region/Physics/Manager/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Physics/Manager/obj/OpenSim.Region.Physics.Manager.csproj.FileList.txt create mode 100644 OpenSim/Region/Physics/Manager/obj/Release/OpenSim.Region.Physics.Manager.dll create mode 100644 OpenSim/Region/Physics/Manager/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs create mode 100644 OpenSim/Region/Physics/OdePlugin/OdePlugin.cs create mode 100644 OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj create mode 100644 OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj.user create mode 100644 OpenSim/Region/Physics/OdePlugin/obj/Debug/OpenSim.Region.Physics.OdePlugin.dll create mode 100644 OpenSim/Region/Physics/OdePlugin/obj/Debug/OpenSim.Region.Physics.OdePlugin.pdb create mode 100644 OpenSim/Region/Physics/OdePlugin/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Physics/OdePlugin/obj/OpenSim.Region.Physics.OdePlugin.csproj.FileList.txt create mode 100644 OpenSim/Region/Physics/OdePlugin/obj/Release/OpenSim.Region.Physics.OdePlugin.dll create mode 100644 OpenSim/Region/Physics/OdePlugin/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs create mode 100644 OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj create mode 100644 OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj.user create mode 100644 OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs create mode 100644 OpenSim/Region/Physics/PhysXPlugin/obj/Debug/OpenSim.Region.Physics.PhysXPlugin.dll create mode 100644 OpenSim/Region/Physics/PhysXPlugin/obj/Debug/OpenSim.Region.Physics.PhysXPlugin.pdb create mode 100644 OpenSim/Region/Physics/PhysXPlugin/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Physics/PhysXPlugin/obj/OpenSim.Region.Physics.PhysXPlugin.csproj.FileList.txt create mode 100644 OpenSim/Region/Physics/PhysXPlugin/obj/Release/OpenSim.Region.Physics.PhysXPlugin.dll create mode 100644 OpenSim/Region/Physics/PhysXPlugin/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Scripting/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Region/Scripting/Script.cs create mode 100644 OpenSim/Region/Scripting/ScriptAccess.cs create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.user create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/OpenSim.Region.Storage.LocalStorageBerkeleyDB.dll create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/OpenSim.Region.Storage.LocalStorageBerkeleyDB.pdb create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.FileList.txt create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Release/OpenSim.Region.Storage.LocalStorageBerkeleyDB.dll create mode 100644 OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/AssemblyInfo.cs create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj.user create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/obj/Debug/OpenSim.Region.Storage.LocalStorageDb4o.dll create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/obj/Debug/OpenSim.Region.Storage.LocalStorageDb4o.pdb create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/obj/OpenSim.Region.Storage.LocalStorageDb4o.csproj.FileList.txt create mode 100644 OpenSim/Region/Storage/LocalStorageDb4o/obj/Release/OpenSim.Region.Storage.LocalStorageDb4o.dll create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj.user create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/obj/Debug/OpenSim.Region.Storage.LocalStorageSQLite.dll create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/obj/Debug/OpenSim.Region.Storage.LocalStorageSQLite.pdb create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/obj/OpenSim.Region.Storage.LocalStorageSQLite.csproj.FileList.txt create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/obj/Release/OpenSim.Region.Storage.LocalStorageSQLite.dll create mode 100644 OpenSim/Region/Storage/LocalStorageSQLite/obj/Release/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj create mode 100644 OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj.user create mode 100644 OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs create mode 100644 OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs create mode 100644 OpenSim/Region/Terrain.BasicTerrain/obj/Debug/OpenSim.Region.Terrain.BasicTerrain.dll create mode 100644 OpenSim/Region/Terrain.BasicTerrain/obj/Debug/OpenSim.Region.Terrain.BasicTerrain.pdb create mode 100644 OpenSim/Region/Terrain.BasicTerrain/obj/Debug/ResolveAssemblyReference.cache create mode 100644 OpenSim/Region/Terrain.BasicTerrain/obj/OpenSim.Region.Terrain.BasicTerrain.csproj.FileList.txt create mode 100644 OpenSim/Region/Terrain.BasicTerrain/obj/Release/OpenSim.Region.Terrain.BasicTerrain.dll create mode 100644 OpenSim/Region/Terrain.BasicTerrain/obj/Release/ResolveAssemblyReference.cache create mode 100644 Prebuild/Prebuild.sln create mode 100644 Prebuild/README create mode 100644 Prebuild/TODO create mode 100644 Prebuild/doc/prebuild-example1.xml create mode 100644 Prebuild/doc/prebuild-example2.xml create mode 100644 Prebuild/doc/prebuild-example3.xml create mode 100644 Prebuild/doc/prebuild-example4.xml create mode 100644 Prebuild/doc/prebuild-example5.xml create mode 100644 Prebuild/prebuild create mode 100644 Prebuild/scripts/Clean.bat create mode 100644 Prebuild/scripts/Help.bat create mode 100644 Prebuild/scripts/MonoDevelop.sh create mode 100644 Prebuild/scripts/Prebuild.nsi create mode 100644 Prebuild/scripts/SharpDevelop.bat create mode 100644 Prebuild/scripts/SharpDevelop2.bat create mode 100644 Prebuild/scripts/VS2002.bat create mode 100644 Prebuild/scripts/VS2003.bat create mode 100644 Prebuild/scripts/VS2005.bat create mode 100644 Prebuild/scripts/autotools.bat create mode 100644 Prebuild/scripts/autotools.sh create mode 100644 Prebuild/scripts/nant.bat create mode 100644 Prebuild/scripts/nant.sh create mode 100644 Prebuild/src/App.ico create mode 100644 Prebuild/src/Core/Attributes/DataNodeAttribute.cs create mode 100644 Prebuild/src/Core/Attributes/OptionNodeAttribute.cs create mode 100644 Prebuild/src/Core/Attributes/TargetAttribute.cs create mode 100644 Prebuild/src/Core/FatalException.cs create mode 100644 Prebuild/src/Core/Interfaces/IDataNode.cs create mode 100644 Prebuild/src/Core/Interfaces/ITarget.cs create mode 100644 Prebuild/src/Core/Kernel.cs create mode 100644 Prebuild/src/Core/Nodes/ConfigurationNode.cs create mode 100644 Prebuild/src/Core/Nodes/DataNode.cs create mode 100644 Prebuild/src/Core/Nodes/ExcludeNode.cs create mode 100644 Prebuild/src/Core/Nodes/FileNode.cs create mode 100644 Prebuild/src/Core/Nodes/FilesNode.cs create mode 100644 Prebuild/src/Core/Nodes/MatchNode.cs create mode 100644 Prebuild/src/Core/Nodes/OptionsNode.cs create mode 100644 Prebuild/src/Core/Nodes/ProcessNode.cs create mode 100644 Prebuild/src/Core/Nodes/ProjectNode.cs create mode 100644 Prebuild/src/Core/Nodes/ReferenceNode.cs create mode 100644 Prebuild/src/Core/Nodes/ReferencePathNode.cs create mode 100644 Prebuild/src/Core/Nodes/SolutionNode.cs create mode 100644 Prebuild/src/Core/Parse/IfContext.cs create mode 100644 Prebuild/src/Core/Parse/Preprocessor.cs create mode 100644 Prebuild/src/Core/Targets/AutotoolsTarget.cs create mode 100644 Prebuild/src/Core/Targets/DebugTarget.cs create mode 100644 Prebuild/src/Core/Targets/MonoDevelopTarget.cs create mode 100644 Prebuild/src/Core/Targets/NAntTarget.cs create mode 100644 Prebuild/src/Core/Targets/SharpDevelop2Target.cs create mode 100644 Prebuild/src/Core/Targets/SharpDevelopTarget.cs create mode 100644 Prebuild/src/Core/Targets/VS2002Target.cs create mode 100644 Prebuild/src/Core/Targets/VS2003Target.cs create mode 100644 Prebuild/src/Core/Targets/VS2005Target.cs create mode 100644 Prebuild/src/Core/UnknownLanguageException.cs create mode 100644 Prebuild/src/Core/Utilities/CommandLineCollection.cs create mode 100644 Prebuild/src/Core/Utilities/CurrentDirectory.cs create mode 100644 Prebuild/src/Core/Utilities/Helper.cs create mode 100644 Prebuild/src/Core/Utilities/Log.cs create mode 100644 Prebuild/src/Core/WarningException.cs create mode 100644 Prebuild/src/Prebuild.cs create mode 100644 Prebuild/src/Prebuild.csproj create mode 100644 Prebuild/src/Prebuild.csproj.user create mode 100644 Prebuild/src/Prebuild.snk create mode 100644 Prebuild/src/Properties/AssemblyInfo.cs create mode 100644 Prebuild/src/data/dnpb-1.0.xsd create mode 100644 Prebuild/src/data/dnpb-1.1.xsd create mode 100644 Prebuild/src/data/dnpb-1.2.xsd create mode 100644 Prebuild/src/data/dnpb-1.3.xsd create mode 100644 Prebuild/src/data/dnpb-1.4.xsd create mode 100644 Prebuild/src/data/dnpb-1.5.xsd create mode 100644 Prebuild/src/data/prebuild-1.6.xsd create mode 100644 Prebuild/src/data/prebuild-1.7.xsd create mode 100644 ThirdPartyLicenses/Axiom.txt create mode 100644 ThirdPartyLicenses/MySQL.txt create mode 100644 ThirdPartyLicenses/ODE.txt create mode 100644 ThirdPartyLicenses/OpenJpeg.txt create mode 100644 ThirdPartyLicenses/libsl.txt create mode 100644 prebuild.xml create mode 100644 runprebuild.bat create mode 100644 share/php/generateUserFunction.php create mode 100644 share/regions/config_0.xml create mode 100644 share/regions/config_1.xml create mode 100644 share/regions/config_10.xml create mode 100644 share/regions/config_100.xml create mode 100644 share/regions/config_1000.xml create mode 100644 share/regions/config_1001.xml create mode 100644 share/regions/config_1002.xml create mode 100644 share/regions/config_1003.xml create mode 100644 share/regions/config_1004.xml create mode 100644 share/regions/config_1005.xml create mode 100644 share/regions/config_1006.xml create mode 100644 share/regions/config_1007.xml create mode 100644 share/regions/config_1008.xml create mode 100644 share/regions/config_1009.xml create mode 100644 share/regions/config_101.xml create mode 100644 share/regions/config_1010.xml create mode 100644 share/regions/config_1011.xml create mode 100644 share/regions/config_1012.xml create mode 100644 share/regions/config_1013.xml create mode 100644 share/regions/config_1014.xml create mode 100644 share/regions/config_1015.xml create mode 100644 share/regions/config_1016.xml create mode 100644 share/regions/config_1017.xml create mode 100644 share/regions/config_1018.xml create mode 100644 share/regions/config_1019.xml create mode 100644 share/regions/config_102.xml create mode 100644 share/regions/config_1020.xml create mode 100644 share/regions/config_1021.xml create mode 100644 share/regions/config_1022.xml create mode 100644 share/regions/config_1023.xml create mode 100644 share/regions/config_103.xml create mode 100644 share/regions/config_104.xml create mode 100644 share/regions/config_105.xml create mode 100644 share/regions/config_106.xml create mode 100644 share/regions/config_107.xml create mode 100644 share/regions/config_108.xml create mode 100644 share/regions/config_109.xml create mode 100644 share/regions/config_11.xml create mode 100644 share/regions/config_110.xml create mode 100644 share/regions/config_111.xml create mode 100644 share/regions/config_112.xml create mode 100644 share/regions/config_113.xml create mode 100644 share/regions/config_114.xml create mode 100644 share/regions/config_115.xml create mode 100644 share/regions/config_116.xml create mode 100644 share/regions/config_117.xml create mode 100644 share/regions/config_118.xml create mode 100644 share/regions/config_119.xml create mode 100644 share/regions/config_12.xml create mode 100644 share/regions/config_120.xml create mode 100644 share/regions/config_121.xml create mode 100644 share/regions/config_122.xml create mode 100644 share/regions/config_123.xml create mode 100644 share/regions/config_124.xml create mode 100644 share/regions/config_125.xml create mode 100644 share/regions/config_126.xml create mode 100644 share/regions/config_127.xml create mode 100644 share/regions/config_128.xml create mode 100644 share/regions/config_129.xml create mode 100644 share/regions/config_13.xml create mode 100644 share/regions/config_130.xml create mode 100644 share/regions/config_131.xml create mode 100644 share/regions/config_132.xml create mode 100644 share/regions/config_133.xml create mode 100644 share/regions/config_134.xml create mode 100644 share/regions/config_135.xml create mode 100644 share/regions/config_136.xml create mode 100644 share/regions/config_137.xml create mode 100644 share/regions/config_138.xml create mode 100644 share/regions/config_139.xml create mode 100644 share/regions/config_14.xml create mode 100644 share/regions/config_140.xml create mode 100644 share/regions/config_141.xml create mode 100644 share/regions/config_142.xml create mode 100644 share/regions/config_143.xml create mode 100644 share/regions/config_144.xml create mode 100644 share/regions/config_145.xml create mode 100644 share/regions/config_146.xml create mode 100644 share/regions/config_147.xml create mode 100644 share/regions/config_148.xml create mode 100644 share/regions/config_149.xml create mode 100644 share/regions/config_15.xml create mode 100644 share/regions/config_150.xml create mode 100644 share/regions/config_151.xml create mode 100644 share/regions/config_152.xml create mode 100644 share/regions/config_153.xml create mode 100644 share/regions/config_154.xml create mode 100644 share/regions/config_155.xml create mode 100644 share/regions/config_156.xml create mode 100644 share/regions/config_157.xml create mode 100644 share/regions/config_158.xml create mode 100644 share/regions/config_159.xml create mode 100644 share/regions/config_16.xml create mode 100644 share/regions/config_160.xml create mode 100644 share/regions/config_161.xml create mode 100644 share/regions/config_162.xml create mode 100644 share/regions/config_163.xml create mode 100644 share/regions/config_164.xml create mode 100644 share/regions/config_165.xml create mode 100644 share/regions/config_166.xml create mode 100644 share/regions/config_167.xml create mode 100644 share/regions/config_168.xml create mode 100644 share/regions/config_169.xml create mode 100644 share/regions/config_17.xml create mode 100644 share/regions/config_170.xml create mode 100644 share/regions/config_171.xml create mode 100644 share/regions/config_172.xml create mode 100644 share/regions/config_173.xml create mode 100644 share/regions/config_174.xml create mode 100644 share/regions/config_175.xml create mode 100644 share/regions/config_176.xml create mode 100644 share/regions/config_177.xml create mode 100644 share/regions/config_178.xml create mode 100644 share/regions/config_179.xml create mode 100644 share/regions/config_18.xml create mode 100644 share/regions/config_180.xml create mode 100644 share/regions/config_181.xml create mode 100644 share/regions/config_182.xml create mode 100644 share/regions/config_183.xml create mode 100644 share/regions/config_184.xml create mode 100644 share/regions/config_185.xml create mode 100644 share/regions/config_186.xml create mode 100644 share/regions/config_187.xml create mode 100644 share/regions/config_188.xml create mode 100644 share/regions/config_189.xml create mode 100644 share/regions/config_19.xml create mode 100644 share/regions/config_190.xml create mode 100644 share/regions/config_191.xml create mode 100644 share/regions/config_192.xml create mode 100644 share/regions/config_193.xml create mode 100644 share/regions/config_194.xml create mode 100644 share/regions/config_195.xml create mode 100644 share/regions/config_196.xml create mode 100644 share/regions/config_197.xml create mode 100644 share/regions/config_198.xml create mode 100644 share/regions/config_199.xml create mode 100644 share/regions/config_2.xml create mode 100644 share/regions/config_20.xml create mode 100644 share/regions/config_200.xml create mode 100644 share/regions/config_201.xml create mode 100644 share/regions/config_202.xml create mode 100644 share/regions/config_203.xml create mode 100644 share/regions/config_204.xml create mode 100644 share/regions/config_205.xml create mode 100644 share/regions/config_206.xml create mode 100644 share/regions/config_207.xml create mode 100644 share/regions/config_208.xml create mode 100644 share/regions/config_209.xml create mode 100644 share/regions/config_21.xml create mode 100644 share/regions/config_210.xml create mode 100644 share/regions/config_211.xml create mode 100644 share/regions/config_212.xml create mode 100644 share/regions/config_213.xml create mode 100644 share/regions/config_214.xml create mode 100644 share/regions/config_215.xml create mode 100644 share/regions/config_216.xml create mode 100644 share/regions/config_217.xml create mode 100644 share/regions/config_218.xml create mode 100644 share/regions/config_219.xml create mode 100644 share/regions/config_22.xml create mode 100644 share/regions/config_220.xml create mode 100644 share/regions/config_221.xml create mode 100644 share/regions/config_222.xml create mode 100644 share/regions/config_223.xml create mode 100644 share/regions/config_224.xml create mode 100644 share/regions/config_225.xml create mode 100644 share/regions/config_226.xml create mode 100644 share/regions/config_227.xml create mode 100644 share/regions/config_228.xml create mode 100644 share/regions/config_229.xml create mode 100644 share/regions/config_23.xml create mode 100644 share/regions/config_230.xml create mode 100644 share/regions/config_231.xml create mode 100644 share/regions/config_232.xml create mode 100644 share/regions/config_233.xml create mode 100644 share/regions/config_234.xml create mode 100644 share/regions/config_235.xml create mode 100644 share/regions/config_236.xml create mode 100644 share/regions/config_237.xml create mode 100644 share/regions/config_238.xml create mode 100644 share/regions/config_239.xml create mode 100644 share/regions/config_24.xml create mode 100644 share/regions/config_240.xml create mode 100644 share/regions/config_241.xml create mode 100644 share/regions/config_242.xml create mode 100644 share/regions/config_243.xml create mode 100644 share/regions/config_244.xml create mode 100644 share/regions/config_245.xml create mode 100644 share/regions/config_246.xml create mode 100644 share/regions/config_247.xml create mode 100644 share/regions/config_248.xml create mode 100644 share/regions/config_249.xml create mode 100644 share/regions/config_25.xml create mode 100644 share/regions/config_250.xml create mode 100644 share/regions/config_251.xml create mode 100644 share/regions/config_252.xml create mode 100644 share/regions/config_253.xml create mode 100644 share/regions/config_254.xml create mode 100644 share/regions/config_255.xml create mode 100644 share/regions/config_256.xml create mode 100644 share/regions/config_257.xml create mode 100644 share/regions/config_258.xml create mode 100644 share/regions/config_259.xml create mode 100644 share/regions/config_26.xml create mode 100644 share/regions/config_260.xml create mode 100644 share/regions/config_261.xml create mode 100644 share/regions/config_262.xml create mode 100644 share/regions/config_263.xml create mode 100644 share/regions/config_264.xml create mode 100644 share/regions/config_265.xml create mode 100644 share/regions/config_266.xml create mode 100644 share/regions/config_267.xml create mode 100644 share/regions/config_268.xml create mode 100644 share/regions/config_269.xml create mode 100644 share/regions/config_27.xml create mode 100644 share/regions/config_270.xml create mode 100644 share/regions/config_271.xml create mode 100644 share/regions/config_272.xml create mode 100644 share/regions/config_273.xml create mode 100644 share/regions/config_274.xml create mode 100644 share/regions/config_275.xml create mode 100644 share/regions/config_276.xml create mode 100644 share/regions/config_277.xml create mode 100644 share/regions/config_278.xml create mode 100644 share/regions/config_279.xml create mode 100644 share/regions/config_28.xml create mode 100644 share/regions/config_280.xml create mode 100644 share/regions/config_281.xml create mode 100644 share/regions/config_282.xml create mode 100644 share/regions/config_283.xml create mode 100644 share/regions/config_284.xml create mode 100644 share/regions/config_285.xml create mode 100644 share/regions/config_286.xml create mode 100644 share/regions/config_287.xml create mode 100644 share/regions/config_288.xml create mode 100644 share/regions/config_289.xml create mode 100644 share/regions/config_29.xml create mode 100644 share/regions/config_290.xml create mode 100644 share/regions/config_291.xml create mode 100644 share/regions/config_292.xml create mode 100644 share/regions/config_293.xml create mode 100644 share/regions/config_294.xml create mode 100644 share/regions/config_295.xml create mode 100644 share/regions/config_296.xml create mode 100644 share/regions/config_297.xml create mode 100644 share/regions/config_298.xml create mode 100644 share/regions/config_299.xml create mode 100644 share/regions/config_3.xml create mode 100644 share/regions/config_30.xml create mode 100644 share/regions/config_300.xml create mode 100644 share/regions/config_301.xml create mode 100644 share/regions/config_302.xml create mode 100644 share/regions/config_303.xml create mode 100644 share/regions/config_304.xml create mode 100644 share/regions/config_305.xml create mode 100644 share/regions/config_306.xml create mode 100644 share/regions/config_307.xml create mode 100644 share/regions/config_308.xml create mode 100644 share/regions/config_309.xml create mode 100644 share/regions/config_31.xml create mode 100644 share/regions/config_310.xml create mode 100644 share/regions/config_311.xml create mode 100644 share/regions/config_312.xml create mode 100644 share/regions/config_313.xml create mode 100644 share/regions/config_314.xml create mode 100644 share/regions/config_315.xml create mode 100644 share/regions/config_316.xml create mode 100644 share/regions/config_317.xml create mode 100644 share/regions/config_318.xml create mode 100644 share/regions/config_319.xml create mode 100644 share/regions/config_32.xml create mode 100644 share/regions/config_320.xml create mode 100644 share/regions/config_321.xml create mode 100644 share/regions/config_322.xml create mode 100644 share/regions/config_323.xml create mode 100644 share/regions/config_324.xml create mode 100644 share/regions/config_325.xml create mode 100644 share/regions/config_326.xml create mode 100644 share/regions/config_327.xml create mode 100644 share/regions/config_328.xml create mode 100644 share/regions/config_329.xml create mode 100644 share/regions/config_33.xml create mode 100644 share/regions/config_330.xml create mode 100644 share/regions/config_331.xml create mode 100644 share/regions/config_332.xml create mode 100644 share/regions/config_333.xml create mode 100644 share/regions/config_334.xml create mode 100644 share/regions/config_335.xml create mode 100644 share/regions/config_336.xml create mode 100644 share/regions/config_337.xml create mode 100644 share/regions/config_338.xml create mode 100644 share/regions/config_339.xml create mode 100644 share/regions/config_34.xml create mode 100644 share/regions/config_340.xml create mode 100644 share/regions/config_341.xml create mode 100644 share/regions/config_342.xml create mode 100644 share/regions/config_343.xml create mode 100644 share/regions/config_344.xml create mode 100644 share/regions/config_345.xml create mode 100644 share/regions/config_346.xml create mode 100644 share/regions/config_347.xml create mode 100644 share/regions/config_348.xml create mode 100644 share/regions/config_349.xml create mode 100644 share/regions/config_35.xml create mode 100644 share/regions/config_350.xml create mode 100644 share/regions/config_351.xml create mode 100644 share/regions/config_352.xml create mode 100644 share/regions/config_353.xml create mode 100644 share/regions/config_354.xml create mode 100644 share/regions/config_355.xml create mode 100644 share/regions/config_356.xml create mode 100644 share/regions/config_357.xml create mode 100644 share/regions/config_358.xml create mode 100644 share/regions/config_359.xml create mode 100644 share/regions/config_36.xml create mode 100644 share/regions/config_360.xml create mode 100644 share/regions/config_361.xml create mode 100644 share/regions/config_362.xml create mode 100644 share/regions/config_363.xml create mode 100644 share/regions/config_364.xml create mode 100644 share/regions/config_365.xml create mode 100644 share/regions/config_366.xml create mode 100644 share/regions/config_367.xml create mode 100644 share/regions/config_368.xml create mode 100644 share/regions/config_369.xml create mode 100644 share/regions/config_37.xml create mode 100644 share/regions/config_370.xml create mode 100644 share/regions/config_371.xml create mode 100644 share/regions/config_372.xml create mode 100644 share/regions/config_373.xml create mode 100644 share/regions/config_374.xml create mode 100644 share/regions/config_375.xml create mode 100644 share/regions/config_376.xml create mode 100644 share/regions/config_377.xml create mode 100644 share/regions/config_378.xml create mode 100644 share/regions/config_379.xml create mode 100644 share/regions/config_38.xml create mode 100644 share/regions/config_380.xml create mode 100644 share/regions/config_381.xml create mode 100644 share/regions/config_382.xml create mode 100644 share/regions/config_383.xml create mode 100644 share/regions/config_384.xml create mode 100644 share/regions/config_385.xml create mode 100644 share/regions/config_386.xml create mode 100644 share/regions/config_387.xml create mode 100644 share/regions/config_388.xml create mode 100644 share/regions/config_389.xml create mode 100644 share/regions/config_39.xml create mode 100644 share/regions/config_390.xml create mode 100644 share/regions/config_391.xml create mode 100644 share/regions/config_392.xml create mode 100644 share/regions/config_393.xml create mode 100644 share/regions/config_394.xml create mode 100644 share/regions/config_395.xml create mode 100644 share/regions/config_396.xml create mode 100644 share/regions/config_397.xml create mode 100644 share/regions/config_398.xml create mode 100644 share/regions/config_399.xml create mode 100644 share/regions/config_4.xml create mode 100644 share/regions/config_40.xml create mode 100644 share/regions/config_400.xml create mode 100644 share/regions/config_401.xml create mode 100644 share/regions/config_402.xml create mode 100644 share/regions/config_403.xml create mode 100644 share/regions/config_404.xml create mode 100644 share/regions/config_405.xml create mode 100644 share/regions/config_406.xml create mode 100644 share/regions/config_407.xml create mode 100644 share/regions/config_408.xml create mode 100644 share/regions/config_409.xml create mode 100644 share/regions/config_41.xml create mode 100644 share/regions/config_410.xml create mode 100644 share/regions/config_411.xml create mode 100644 share/regions/config_412.xml create mode 100644 share/regions/config_413.xml create mode 100644 share/regions/config_414.xml create mode 100644 share/regions/config_415.xml create mode 100644 share/regions/config_416.xml create mode 100644 share/regions/config_417.xml create mode 100644 share/regions/config_418.xml create mode 100644 share/regions/config_419.xml create mode 100644 share/regions/config_42.xml create mode 100644 share/regions/config_420.xml create mode 100644 share/regions/config_421.xml create mode 100644 share/regions/config_422.xml create mode 100644 share/regions/config_423.xml create mode 100644 share/regions/config_424.xml create mode 100644 share/regions/config_425.xml create mode 100644 share/regions/config_426.xml create mode 100644 share/regions/config_427.xml create mode 100644 share/regions/config_428.xml create mode 100644 share/regions/config_429.xml create mode 100644 share/regions/config_43.xml create mode 100644 share/regions/config_430.xml create mode 100644 share/regions/config_431.xml create mode 100644 share/regions/config_432.xml create mode 100644 share/regions/config_433.xml create mode 100644 share/regions/config_434.xml create mode 100644 share/regions/config_435.xml create mode 100644 share/regions/config_436.xml create mode 100644 share/regions/config_437.xml create mode 100644 share/regions/config_438.xml create mode 100644 share/regions/config_439.xml create mode 100644 share/regions/config_44.xml create mode 100644 share/regions/config_440.xml create mode 100644 share/regions/config_441.xml create mode 100644 share/regions/config_442.xml create mode 100644 share/regions/config_443.xml create mode 100644 share/regions/config_444.xml create mode 100644 share/regions/config_445.xml create mode 100644 share/regions/config_446.xml create mode 100644 share/regions/config_447.xml create mode 100644 share/regions/config_448.xml create mode 100644 share/regions/config_449.xml create mode 100644 share/regions/config_45.xml create mode 100644 share/regions/config_450.xml create mode 100644 share/regions/config_451.xml create mode 100644 share/regions/config_452.xml create mode 100644 share/regions/config_453.xml create mode 100644 share/regions/config_454.xml create mode 100644 share/regions/config_455.xml create mode 100644 share/regions/config_456.xml create mode 100644 share/regions/config_457.xml create mode 100644 share/regions/config_458.xml create mode 100644 share/regions/config_459.xml create mode 100644 share/regions/config_46.xml create mode 100644 share/regions/config_460.xml create mode 100644 share/regions/config_461.xml create mode 100644 share/regions/config_462.xml create mode 100644 share/regions/config_463.xml create mode 100644 share/regions/config_464.xml create mode 100644 share/regions/config_465.xml create mode 100644 share/regions/config_466.xml create mode 100644 share/regions/config_467.xml create mode 100644 share/regions/config_468.xml create mode 100644 share/regions/config_469.xml create mode 100644 share/regions/config_47.xml create mode 100644 share/regions/config_470.xml create mode 100644 share/regions/config_471.xml create mode 100644 share/regions/config_472.xml create mode 100644 share/regions/config_473.xml create mode 100644 share/regions/config_474.xml create mode 100644 share/regions/config_475.xml create mode 100644 share/regions/config_476.xml create mode 100644 share/regions/config_477.xml create mode 100644 share/regions/config_478.xml create mode 100644 share/regions/config_479.xml create mode 100644 share/regions/config_48.xml create mode 100644 share/regions/config_480.xml create mode 100644 share/regions/config_481.xml create mode 100644 share/regions/config_482.xml create mode 100644 share/regions/config_483.xml create mode 100644 share/regions/config_484.xml create mode 100644 share/regions/config_485.xml create mode 100644 share/regions/config_486.xml create mode 100644 share/regions/config_487.xml create mode 100644 share/regions/config_488.xml create mode 100644 share/regions/config_489.xml create mode 100644 share/regions/config_49.xml create mode 100644 share/regions/config_490.xml create mode 100644 share/regions/config_491.xml create mode 100644 share/regions/config_492.xml create mode 100644 share/regions/config_493.xml create mode 100644 share/regions/config_494.xml create mode 100644 share/regions/config_495.xml create mode 100644 share/regions/config_496.xml create mode 100644 share/regions/config_497.xml create mode 100644 share/regions/config_498.xml create mode 100644 share/regions/config_499.xml create mode 100644 share/regions/config_5.xml create mode 100644 share/regions/config_50.xml create mode 100644 share/regions/config_500.xml create mode 100644 share/regions/config_501.xml create mode 100644 share/regions/config_502.xml create mode 100644 share/regions/config_503.xml create mode 100644 share/regions/config_504.xml create mode 100644 share/regions/config_505.xml create mode 100644 share/regions/config_506.xml create mode 100644 share/regions/config_507.xml create mode 100644 share/regions/config_508.xml create mode 100644 share/regions/config_509.xml create mode 100644 share/regions/config_51.xml create mode 100644 share/regions/config_510.xml create mode 100644 share/regions/config_511.xml create mode 100644 share/regions/config_512.xml create mode 100644 share/regions/config_513.xml create mode 100644 share/regions/config_514.xml create mode 100644 share/regions/config_515.xml create mode 100644 share/regions/config_516.xml create mode 100644 share/regions/config_517.xml create mode 100644 share/regions/config_518.xml create mode 100644 share/regions/config_519.xml create mode 100644 share/regions/config_52.xml create mode 100644 share/regions/config_520.xml create mode 100644 share/regions/config_521.xml create mode 100644 share/regions/config_522.xml create mode 100644 share/regions/config_523.xml create mode 100644 share/regions/config_524.xml create mode 100644 share/regions/config_525.xml create mode 100644 share/regions/config_526.xml create mode 100644 share/regions/config_527.xml create mode 100644 share/regions/config_528.xml create mode 100644 share/regions/config_529.xml create mode 100644 share/regions/config_53.xml create mode 100644 share/regions/config_530.xml create mode 100644 share/regions/config_531.xml create mode 100644 share/regions/config_532.xml create mode 100644 share/regions/config_533.xml create mode 100644 share/regions/config_534.xml create mode 100644 share/regions/config_535.xml create mode 100644 share/regions/config_536.xml create mode 100644 share/regions/config_537.xml create mode 100644 share/regions/config_538.xml create mode 100644 share/regions/config_539.xml create mode 100644 share/regions/config_54.xml create mode 100644 share/regions/config_540.xml create mode 100644 share/regions/config_541.xml create mode 100644 share/regions/config_542.xml create mode 100644 share/regions/config_543.xml create mode 100644 share/regions/config_544.xml create mode 100644 share/regions/config_545.xml create mode 100644 share/regions/config_546.xml create mode 100644 share/regions/config_547.xml create mode 100644 share/regions/config_548.xml create mode 100644 share/regions/config_549.xml create mode 100644 share/regions/config_55.xml create mode 100644 share/regions/config_550.xml create mode 100644 share/regions/config_551.xml create mode 100644 share/regions/config_552.xml create mode 100644 share/regions/config_553.xml create mode 100644 share/regions/config_554.xml create mode 100644 share/regions/config_555.xml create mode 100644 share/regions/config_556.xml create mode 100644 share/regions/config_557.xml create mode 100644 share/regions/config_558.xml create mode 100644 share/regions/config_559.xml create mode 100644 share/regions/config_56.xml create mode 100644 share/regions/config_560.xml create mode 100644 share/regions/config_561.xml create mode 100644 share/regions/config_562.xml create mode 100644 share/regions/config_563.xml create mode 100644 share/regions/config_564.xml create mode 100644 share/regions/config_565.xml create mode 100644 share/regions/config_566.xml create mode 100644 share/regions/config_567.xml create mode 100644 share/regions/config_568.xml create mode 100644 share/regions/config_569.xml create mode 100644 share/regions/config_57.xml create mode 100644 share/regions/config_570.xml create mode 100644 share/regions/config_571.xml create mode 100644 share/regions/config_572.xml create mode 100644 share/regions/config_573.xml create mode 100644 share/regions/config_574.xml create mode 100644 share/regions/config_575.xml create mode 100644 share/regions/config_576.xml create mode 100644 share/regions/config_577.xml create mode 100644 share/regions/config_578.xml create mode 100644 share/regions/config_579.xml create mode 100644 share/regions/config_58.xml create mode 100644 share/regions/config_580.xml create mode 100644 share/regions/config_581.xml create mode 100644 share/regions/config_582.xml create mode 100644 share/regions/config_583.xml create mode 100644 share/regions/config_584.xml create mode 100644 share/regions/config_585.xml create mode 100644 share/regions/config_586.xml create mode 100644 share/regions/config_587.xml create mode 100644 share/regions/config_588.xml create mode 100644 share/regions/config_589.xml create mode 100644 share/regions/config_59.xml create mode 100644 share/regions/config_590.xml create mode 100644 share/regions/config_591.xml create mode 100644 share/regions/config_592.xml create mode 100644 share/regions/config_593.xml create mode 100644 share/regions/config_594.xml create mode 100644 share/regions/config_595.xml create mode 100644 share/regions/config_596.xml create mode 100644 share/regions/config_597.xml create mode 100644 share/regions/config_598.xml create mode 100644 share/regions/config_599.xml create mode 100644 share/regions/config_6.xml create mode 100644 share/regions/config_60.xml create mode 100644 share/regions/config_600.xml create mode 100644 share/regions/config_601.xml create mode 100644 share/regions/config_602.xml create mode 100644 share/regions/config_603.xml create mode 100644 share/regions/config_604.xml create mode 100644 share/regions/config_605.xml create mode 100644 share/regions/config_606.xml create mode 100644 share/regions/config_607.xml create mode 100644 share/regions/config_608.xml create mode 100644 share/regions/config_609.xml create mode 100644 share/regions/config_61.xml create mode 100644 share/regions/config_610.xml create mode 100644 share/regions/config_611.xml create mode 100644 share/regions/config_612.xml create mode 100644 share/regions/config_613.xml create mode 100644 share/regions/config_614.xml create mode 100644 share/regions/config_615.xml create mode 100644 share/regions/config_616.xml create mode 100644 share/regions/config_617.xml create mode 100644 share/regions/config_618.xml create mode 100644 share/regions/config_619.xml create mode 100644 share/regions/config_62.xml create mode 100644 share/regions/config_620.xml create mode 100644 share/regions/config_621.xml create mode 100644 share/regions/config_622.xml create mode 100644 share/regions/config_623.xml create mode 100644 share/regions/config_624.xml create mode 100644 share/regions/config_625.xml create mode 100644 share/regions/config_626.xml create mode 100644 share/regions/config_627.xml create mode 100644 share/regions/config_628.xml create mode 100644 share/regions/config_629.xml create mode 100644 share/regions/config_63.xml create mode 100644 share/regions/config_630.xml create mode 100644 share/regions/config_631.xml create mode 100644 share/regions/config_632.xml create mode 100644 share/regions/config_633.xml create mode 100644 share/regions/config_634.xml create mode 100644 share/regions/config_635.xml create mode 100644 share/regions/config_636.xml create mode 100644 share/regions/config_637.xml create mode 100644 share/regions/config_638.xml create mode 100644 share/regions/config_639.xml create mode 100644 share/regions/config_64.xml create mode 100644 share/regions/config_640.xml create mode 100644 share/regions/config_641.xml create mode 100644 share/regions/config_642.xml create mode 100644 share/regions/config_643.xml create mode 100644 share/regions/config_644.xml create mode 100644 share/regions/config_645.xml create mode 100644 share/regions/config_646.xml create mode 100644 share/regions/config_647.xml create mode 100644 share/regions/config_648.xml create mode 100644 share/regions/config_649.xml create mode 100644 share/regions/config_65.xml create mode 100644 share/regions/config_650.xml create mode 100644 share/regions/config_651.xml create mode 100644 share/regions/config_652.xml create mode 100644 share/regions/config_653.xml create mode 100644 share/regions/config_654.xml create mode 100644 share/regions/config_655.xml create mode 100644 share/regions/config_656.xml create mode 100644 share/regions/config_657.xml create mode 100644 share/regions/config_658.xml create mode 100644 share/regions/config_659.xml create mode 100644 share/regions/config_66.xml create mode 100644 share/regions/config_660.xml create mode 100644 share/regions/config_661.xml create mode 100644 share/regions/config_662.xml create mode 100644 share/regions/config_663.xml create mode 100644 share/regions/config_664.xml create mode 100644 share/regions/config_665.xml create mode 100644 share/regions/config_666.xml create mode 100644 share/regions/config_667.xml create mode 100644 share/regions/config_668.xml create mode 100644 share/regions/config_669.xml create mode 100644 share/regions/config_67.xml create mode 100644 share/regions/config_670.xml create mode 100644 share/regions/config_671.xml create mode 100644 share/regions/config_672.xml create mode 100644 share/regions/config_673.xml create mode 100644 share/regions/config_674.xml create mode 100644 share/regions/config_675.xml create mode 100644 share/regions/config_676.xml create mode 100644 share/regions/config_677.xml create mode 100644 share/regions/config_678.xml create mode 100644 share/regions/config_679.xml create mode 100644 share/regions/config_68.xml create mode 100644 share/regions/config_680.xml create mode 100644 share/regions/config_681.xml create mode 100644 share/regions/config_682.xml create mode 100644 share/regions/config_683.xml create mode 100644 share/regions/config_684.xml create mode 100644 share/regions/config_685.xml create mode 100644 share/regions/config_686.xml create mode 100644 share/regions/config_687.xml create mode 100644 share/regions/config_688.xml create mode 100644 share/regions/config_689.xml create mode 100644 share/regions/config_69.xml create mode 100644 share/regions/config_690.xml create mode 100644 share/regions/config_691.xml create mode 100644 share/regions/config_692.xml create mode 100644 share/regions/config_693.xml create mode 100644 share/regions/config_694.xml create mode 100644 share/regions/config_695.xml create mode 100644 share/regions/config_696.xml create mode 100644 share/regions/config_697.xml create mode 100644 share/regions/config_698.xml create mode 100644 share/regions/config_699.xml create mode 100644 share/regions/config_7.xml create mode 100644 share/regions/config_70.xml create mode 100644 share/regions/config_700.xml create mode 100644 share/regions/config_701.xml create mode 100644 share/regions/config_702.xml create mode 100644 share/regions/config_703.xml create mode 100644 share/regions/config_704.xml create mode 100644 share/regions/config_705.xml create mode 100644 share/regions/config_706.xml create mode 100644 share/regions/config_707.xml create mode 100644 share/regions/config_708.xml create mode 100644 share/regions/config_709.xml create mode 100644 share/regions/config_71.xml create mode 100644 share/regions/config_710.xml create mode 100644 share/regions/config_711.xml create mode 100644 share/regions/config_712.xml create mode 100644 share/regions/config_713.xml create mode 100644 share/regions/config_714.xml create mode 100644 share/regions/config_715.xml create mode 100644 share/regions/config_716.xml create mode 100644 share/regions/config_717.xml create mode 100644 share/regions/config_718.xml create mode 100644 share/regions/config_719.xml create mode 100644 share/regions/config_72.xml create mode 100644 share/regions/config_720.xml create mode 100644 share/regions/config_721.xml create mode 100644 share/regions/config_722.xml create mode 100644 share/regions/config_723.xml create mode 100644 share/regions/config_724.xml create mode 100644 share/regions/config_725.xml create mode 100644 share/regions/config_726.xml create mode 100644 share/regions/config_727.xml create mode 100644 share/regions/config_728.xml create mode 100644 share/regions/config_729.xml create mode 100644 share/regions/config_73.xml create mode 100644 share/regions/config_730.xml create mode 100644 share/regions/config_731.xml create mode 100644 share/regions/config_732.xml create mode 100644 share/regions/config_733.xml create mode 100644 share/regions/config_734.xml create mode 100644 share/regions/config_735.xml create mode 100644 share/regions/config_736.xml create mode 100644 share/regions/config_737.xml create mode 100644 share/regions/config_738.xml create mode 100644 share/regions/config_739.xml create mode 100644 share/regions/config_74.xml create mode 100644 share/regions/config_740.xml create mode 100644 share/regions/config_741.xml create mode 100644 share/regions/config_742.xml create mode 100644 share/regions/config_743.xml create mode 100644 share/regions/config_744.xml create mode 100644 share/regions/config_745.xml create mode 100644 share/regions/config_746.xml create mode 100644 share/regions/config_747.xml create mode 100644 share/regions/config_748.xml create mode 100644 share/regions/config_749.xml create mode 100644 share/regions/config_75.xml create mode 100644 share/regions/config_750.xml create mode 100644 share/regions/config_751.xml create mode 100644 share/regions/config_752.xml create mode 100644 share/regions/config_753.xml create mode 100644 share/regions/config_754.xml create mode 100644 share/regions/config_755.xml create mode 100644 share/regions/config_756.xml create mode 100644 share/regions/config_757.xml create mode 100644 share/regions/config_758.xml create mode 100644 share/regions/config_759.xml create mode 100644 share/regions/config_76.xml create mode 100644 share/regions/config_760.xml create mode 100644 share/regions/config_761.xml create mode 100644 share/regions/config_762.xml create mode 100644 share/regions/config_763.xml create mode 100644 share/regions/config_764.xml create mode 100644 share/regions/config_765.xml create mode 100644 share/regions/config_766.xml create mode 100644 share/regions/config_767.xml create mode 100644 share/regions/config_768.xml create mode 100644 share/regions/config_769.xml create mode 100644 share/regions/config_77.xml create mode 100644 share/regions/config_770.xml create mode 100644 share/regions/config_771.xml create mode 100644 share/regions/config_772.xml create mode 100644 share/regions/config_773.xml create mode 100644 share/regions/config_774.xml create mode 100644 share/regions/config_775.xml create mode 100644 share/regions/config_776.xml create mode 100644 share/regions/config_777.xml create mode 100644 share/regions/config_778.xml create mode 100644 share/regions/config_779.xml create mode 100644 share/regions/config_78.xml create mode 100644 share/regions/config_780.xml create mode 100644 share/regions/config_781.xml create mode 100644 share/regions/config_782.xml create mode 100644 share/regions/config_783.xml create mode 100644 share/regions/config_784.xml create mode 100644 share/regions/config_785.xml create mode 100644 share/regions/config_786.xml create mode 100644 share/regions/config_787.xml create mode 100644 share/regions/config_788.xml create mode 100644 share/regions/config_789.xml create mode 100644 share/regions/config_79.xml create mode 100644 share/regions/config_790.xml create mode 100644 share/regions/config_791.xml create mode 100644 share/regions/config_792.xml create mode 100644 share/regions/config_793.xml create mode 100644 share/regions/config_794.xml create mode 100644 share/regions/config_795.xml create mode 100644 share/regions/config_796.xml create mode 100644 share/regions/config_797.xml create mode 100644 share/regions/config_798.xml create mode 100644 share/regions/config_799.xml create mode 100644 share/regions/config_8.xml create mode 100644 share/regions/config_80.xml create mode 100644 share/regions/config_800.xml create mode 100644 share/regions/config_801.xml create mode 100644 share/regions/config_802.xml create mode 100644 share/regions/config_803.xml create mode 100644 share/regions/config_804.xml create mode 100644 share/regions/config_805.xml create mode 100644 share/regions/config_806.xml create mode 100644 share/regions/config_807.xml create mode 100644 share/regions/config_808.xml create mode 100644 share/regions/config_809.xml create mode 100644 share/regions/config_81.xml create mode 100644 share/regions/config_810.xml create mode 100644 share/regions/config_811.xml create mode 100644 share/regions/config_812.xml create mode 100644 share/regions/config_813.xml create mode 100644 share/regions/config_814.xml create mode 100644 share/regions/config_815.xml create mode 100644 share/regions/config_816.xml create mode 100644 share/regions/config_817.xml create mode 100644 share/regions/config_818.xml create mode 100644 share/regions/config_819.xml create mode 100644 share/regions/config_82.xml create mode 100644 share/regions/config_820.xml create mode 100644 share/regions/config_821.xml create mode 100644 share/regions/config_822.xml create mode 100644 share/regions/config_823.xml create mode 100644 share/regions/config_824.xml create mode 100644 share/regions/config_825.xml create mode 100644 share/regions/config_826.xml create mode 100644 share/regions/config_827.xml create mode 100644 share/regions/config_828.xml create mode 100644 share/regions/config_829.xml create mode 100644 share/regions/config_83.xml create mode 100644 share/regions/config_830.xml create mode 100644 share/regions/config_831.xml create mode 100644 share/regions/config_832.xml create mode 100644 share/regions/config_833.xml create mode 100644 share/regions/config_834.xml create mode 100644 share/regions/config_835.xml create mode 100644 share/regions/config_836.xml create mode 100644 share/regions/config_837.xml create mode 100644 share/regions/config_838.xml create mode 100644 share/regions/config_839.xml create mode 100644 share/regions/config_84.xml create mode 100644 share/regions/config_840.xml create mode 100644 share/regions/config_841.xml create mode 100644 share/regions/config_842.xml create mode 100644 share/regions/config_843.xml create mode 100644 share/regions/config_844.xml create mode 100644 share/regions/config_845.xml create mode 100644 share/regions/config_846.xml create mode 100644 share/regions/config_847.xml create mode 100644 share/regions/config_848.xml create mode 100644 share/regions/config_849.xml create mode 100644 share/regions/config_85.xml create mode 100644 share/regions/config_850.xml create mode 100644 share/regions/config_851.xml create mode 100644 share/regions/config_852.xml create mode 100644 share/regions/config_853.xml create mode 100644 share/regions/config_854.xml create mode 100644 share/regions/config_855.xml create mode 100644 share/regions/config_856.xml create mode 100644 share/regions/config_857.xml create mode 100644 share/regions/config_858.xml create mode 100644 share/regions/config_859.xml create mode 100644 share/regions/config_86.xml create mode 100644 share/regions/config_860.xml create mode 100644 share/regions/config_861.xml create mode 100644 share/regions/config_862.xml create mode 100644 share/regions/config_863.xml create mode 100644 share/regions/config_864.xml create mode 100644 share/regions/config_865.xml create mode 100644 share/regions/config_866.xml create mode 100644 share/regions/config_867.xml create mode 100644 share/regions/config_868.xml create mode 100644 share/regions/config_869.xml create mode 100644 share/regions/config_87.xml create mode 100644 share/regions/config_870.xml create mode 100644 share/regions/config_871.xml create mode 100644 share/regions/config_872.xml create mode 100644 share/regions/config_873.xml create mode 100644 share/regions/config_874.xml create mode 100644 share/regions/config_875.xml create mode 100644 share/regions/config_876.xml create mode 100644 share/regions/config_877.xml create mode 100644 share/regions/config_878.xml create mode 100644 share/regions/config_879.xml create mode 100644 share/regions/config_88.xml create mode 100644 share/regions/config_880.xml create mode 100644 share/regions/config_881.xml create mode 100644 share/regions/config_882.xml create mode 100644 share/regions/config_883.xml create mode 100644 share/regions/config_884.xml create mode 100644 share/regions/config_885.xml create mode 100644 share/regions/config_886.xml create mode 100644 share/regions/config_887.xml create mode 100644 share/regions/config_888.xml create mode 100644 share/regions/config_889.xml create mode 100644 share/regions/config_89.xml create mode 100644 share/regions/config_890.xml create mode 100644 share/regions/config_891.xml create mode 100644 share/regions/config_892.xml create mode 100644 share/regions/config_893.xml create mode 100644 share/regions/config_894.xml create mode 100644 share/regions/config_895.xml create mode 100644 share/regions/config_896.xml create mode 100644 share/regions/config_897.xml create mode 100644 share/regions/config_898.xml create mode 100644 share/regions/config_899.xml create mode 100644 share/regions/config_9.xml create mode 100644 share/regions/config_90.xml create mode 100644 share/regions/config_900.xml create mode 100644 share/regions/config_901.xml create mode 100644 share/regions/config_902.xml create mode 100644 share/regions/config_903.xml create mode 100644 share/regions/config_904.xml create mode 100644 share/regions/config_905.xml create mode 100644 share/regions/config_906.xml create mode 100644 share/regions/config_907.xml create mode 100644 share/regions/config_908.xml create mode 100644 share/regions/config_909.xml create mode 100644 share/regions/config_91.xml create mode 100644 share/regions/config_910.xml create mode 100644 share/regions/config_911.xml create mode 100644 share/regions/config_912.xml create mode 100644 share/regions/config_913.xml create mode 100644 share/regions/config_914.xml create mode 100644 share/regions/config_915.xml create mode 100644 share/regions/config_916.xml create mode 100644 share/regions/config_917.xml create mode 100644 share/regions/config_918.xml create mode 100644 share/regions/config_919.xml create mode 100644 share/regions/config_92.xml create mode 100644 share/regions/config_920.xml create mode 100644 share/regions/config_921.xml create mode 100644 share/regions/config_922.xml create mode 100644 share/regions/config_923.xml create mode 100644 share/regions/config_924.xml create mode 100644 share/regions/config_925.xml create mode 100644 share/regions/config_926.xml create mode 100644 share/regions/config_927.xml create mode 100644 share/regions/config_928.xml create mode 100644 share/regions/config_929.xml create mode 100644 share/regions/config_93.xml create mode 100644 share/regions/config_930.xml create mode 100644 share/regions/config_931.xml create mode 100644 share/regions/config_932.xml create mode 100644 share/regions/config_933.xml create mode 100644 share/regions/config_934.xml create mode 100644 share/regions/config_935.xml create mode 100644 share/regions/config_936.xml create mode 100644 share/regions/config_937.xml create mode 100644 share/regions/config_938.xml create mode 100644 share/regions/config_939.xml create mode 100644 share/regions/config_94.xml create mode 100644 share/regions/config_940.xml create mode 100644 share/regions/config_941.xml create mode 100644 share/regions/config_942.xml create mode 100644 share/regions/config_943.xml create mode 100644 share/regions/config_944.xml create mode 100644 share/regions/config_945.xml create mode 100644 share/regions/config_946.xml create mode 100644 share/regions/config_947.xml create mode 100644 share/regions/config_948.xml create mode 100644 share/regions/config_949.xml create mode 100644 share/regions/config_95.xml create mode 100644 share/regions/config_950.xml create mode 100644 share/regions/config_951.xml create mode 100644 share/regions/config_952.xml create mode 100644 share/regions/config_953.xml create mode 100644 share/regions/config_954.xml create mode 100644 share/regions/config_955.xml create mode 100644 share/regions/config_956.xml create mode 100644 share/regions/config_957.xml create mode 100644 share/regions/config_958.xml create mode 100644 share/regions/config_959.xml create mode 100644 share/regions/config_96.xml create mode 100644 share/regions/config_960.xml create mode 100644 share/regions/config_961.xml create mode 100644 share/regions/config_962.xml create mode 100644 share/regions/config_963.xml create mode 100644 share/regions/config_964.xml create mode 100644 share/regions/config_965.xml create mode 100644 share/regions/config_966.xml create mode 100644 share/regions/config_967.xml create mode 100644 share/regions/config_968.xml create mode 100644 share/regions/config_969.xml create mode 100644 share/regions/config_97.xml create mode 100644 share/regions/config_970.xml create mode 100644 share/regions/config_971.xml create mode 100644 share/regions/config_972.xml create mode 100644 share/regions/config_973.xml create mode 100644 share/regions/config_974.xml create mode 100644 share/regions/config_975.xml create mode 100644 share/regions/config_976.xml create mode 100644 share/regions/config_977.xml create mode 100644 share/regions/config_978.xml create mode 100644 share/regions/config_979.xml create mode 100644 share/regions/config_98.xml create mode 100644 share/regions/config_980.xml create mode 100644 share/regions/config_981.xml create mode 100644 share/regions/config_982.xml create mode 100644 share/regions/config_983.xml create mode 100644 share/regions/config_984.xml create mode 100644 share/regions/config_985.xml create mode 100644 share/regions/config_986.xml create mode 100644 share/regions/config_987.xml create mode 100644 share/regions/config_988.xml create mode 100644 share/regions/config_989.xml create mode 100644 share/regions/config_99.xml create mode 100644 share/regions/config_990.xml create mode 100644 share/regions/config_991.xml create mode 100644 share/regions/config_992.xml create mode 100644 share/regions/config_993.xml create mode 100644 share/regions/config_994.xml create mode 100644 share/regions/config_995.xml create mode 100644 share/regions/config_996.xml create mode 100644 share/regions/config_997.xml create mode 100644 share/regions/config_998.xml create mode 100644 share/regions/config_999.xml create mode 100644 share/sql/mysql-agents.sql create mode 100644 share/sql/mysql-inventoryfolders.sql create mode 100644 share/sql/mysql-inventoryitems.sql create mode 100644 share/sql/mysql-logs.sql create mode 100644 share/sql/mysql-regions.sql create mode 100644 share/sql/mysql-reservations.txt create mode 100644 share/sql/mysql-users.sql diff --git a/OpenSim.FxCop b/OpenSim.FxCop new file mode 100644 index 0000000000..1e2ea2d798 --- /dev/null +++ b/OpenSim.FxCop @@ -0,0 +1,7241 @@ + + + + True + http://www.gotdotnet.com/team/fxcop//xsl/1.35/FxCopReport.xsl + + + + + + True + True + True + 10 + 1 + + False + False + + False + 120 + + + + $(ProjectDir)/lib/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sim + OpenSim + + + + + + + + + Sim + OpenSim.Assets + + + + + + + + + OpenSim.CAPS + + + + + Sim + OpenSim.CAPS + + + + + OpenSim.CAPS + + + + + + + + + Sim + OpenSim.Config.SimConfigDb4o + + + Sim + OpenSim.Config.SimConfigDb4o + + + + + + + + + OpenSim.Framework.Assets + + + + + Sim + OpenSim.Framework.Assets + + + + + + + + + Sim + OpenSim.Framework.Console + + + + + + + + + OpenSim.Framework.Grid + + + + + Sim + OpenSim.Framework.Grid + + + + + + + + + Sim + OpenSim.Framework.Interfaces + + + + + + + + + OpenSim.Framework.Inventory + + + + + Sim + OpenSim.Framework.Inventory + + + + + + + + + OpenSim.Framework.Sims + + + + + Sim + OpenSim.Framework.Sims + + + + + + + + + OpenSim.Framework.Terrain + + + + + Sim + OpenSim.Framework.Terrain + + + + + + + + + OpenSim.Framework.User + + + + + Sim + OpenSim.Framework.User + + + + + + + + + OpenSim.Framework.Utilities + + + + + Sim + OpenSim.Framework.Utilities + + + + + + + + + Sim + OpenSim.GridInterfaces.Local + + + + + + + + + OpenSim.GridInterfaces.Remote + + + + + Sim + OpenSim.GridInterfaces.Remote + + + + + + + + + Plugin + OpenSim.Physics.BasicPhysicsPlugin + + + + + Sim + OpenSim.Physics.BasicPhysicsPlugin + + + + + + + + + Sim + OpenSim.Physics.Manager + + + + + + + + + OpenSim.Physics.OdePlugin + + + + + Plugin + OpenSim.Physics.OdePlugin + + + + + Sim + OpenSim.Physics.OdePlugin + + + + + + + + + OpenSim.Physics.PhysXPlugin + + + + + Plugin + OpenSim.Physics.PhysXPlugin + + + + + Sim + OpenSim.Physics.PhysXPlugin + + + + + + + + + Sim + OpenSim.Storage.LocalStorageDb4o + + + + + + + + + OpenSim.types + + + + + OpenSim.types + + + + + Sim + OpenSim.types + + + + + + + + + OpenSim.UserServer + + + + + Sim + OpenSim.UserServer + + + + + + + + + OpenSim.world + + + + + Sim + OpenSim.world + + + + + + + + + OpenSim.world.scripting + + + + + OpenSim.world.scripting + + + OpenSim.world.scripting + + + + + Sim + OpenSim.world.scripting + + + + + + + + + + + + + OpenGridServices.ServerConsole + + + + + OpenGridServices.ServerConsole + + + + + OpenGridServices.ServerConsole + + + + + + + + + + + conscmd_callback + + + + + conscmd + ServerConsole.conscmd_callback + + + + + conscmd_callback + + + + + + + + + conscmd_callback.RunCmd(String, String[]):Void + cmdparams + cmdparams + + + + + + + + + ShowWhat + + + + + + + + + + + + + ConsoleBase.CmdPrompt(String, String):String + defaultresponse + defaultresponse + + + + + + + + + OptionA + + + + + OptionB + + + + + ConsoleBase.CmdPrompt(String, String, String, String):String + defaultresponse + defaultresponse + + + + + + + + + Passwd + ConsoleBase.PasswdPrompt(String):String + + + + + + + + + Cmd + + + + + ConsoleBase.RunCmd(String, String[]):Object + cmdparams + cmdparams + + + + + + + + + ShowWhat + + + + + + + + + Line + + + + + + + + + Line + + + + + + + + + + + + + Sim + ConsoleType.SimChat + + + + + + + + + ConsoleType.TCP + + + + + + + + + + + MainConsole + + + + + + + + + + + + + + + + + OpenSim.Config.SimConfigDb4o + + + + + OpenSim.Config.SimConfigDb4o + + + + + OpenSim.Config.SimConfigDb4o + + + + + + + + + + + Plugin + OpenSim.Config.SimConfigDb4o.Db40ConfigPlugin + + + + + + + + + Sim + OpenSim.Config.SimConfigDb4o.DbSimConfig + + + + + Db + OpenSim.Config.SimConfigDb4o.DbSimConfig + + + + + + + + + DbSimConfig.InitConfig(Boolean):Void + System.Exception + + + + + DbSimConfig.InitConfig(Boolean):Void + System.UInt32.ToString + System.UInt32.ToString(System.IFormatProvider) + + + + + DbSimConfig.InitConfig(Boolean):Void + System.UInt64.ToString + System.UInt64.ToString(System.IFormatProvider) + + + + + + + + + DbSimConfig.LoadDefaults():Void + System.Convert.ToInt32(System.String) + System.Convert.ToInt32(System.String,System.IFormatProvider) + + + DbSimConfig.LoadDefaults():Void + System.Convert.ToInt32(System.String) + System.Convert.ToInt32(System.String,System.IFormatProvider) + + + DbSimConfig.LoadDefaults():Void + System.Convert.ToInt32(System.String) + System.Convert.ToInt32(System.String,System.IFormatProvider) + + + + + + + + + + + + + Map + + + + + + + + + + + + + + + + + + + OpenSim + + + + + OpenSim + + + + + OpenSim + + + + + OpenSim + + + + + OpenSim + + + + + + + + + + + + + 'args' + RegionServer.Main(String[]):Void + + + 'args' + RegionServer.Main(String[]):Void + + + + + + + + + + + + + + + + + + + OpenSim.Framework.Console + + + + + OpenSim.Framework.Console + + + + + OpenSim.Framework.Console + + + + + + + + + + + + + ConsoleBase.CmdPrompt(String, String):String + defaultresponse + defaultresponse + + + + + + + + + OptionA + + + + + OptionB + + + + + ConsoleBase.CmdPrompt(String, String, String, String):String + defaultresponse + defaultresponse + + + + + + + + + Cmd + + + + + ConsoleBase.RunCmd(String, String[]):Object + cmdparams + cmdparams + + + + + + + + + ShowWhat + + + + + + + + + + + + + Sim + ConsoleType.SimChat + + + + + + + + + ConsoleType.TCP + + + + + + + + + + + MainConsole + + + + + + + + + + + + + + + + + OpenSim.Framework + + + + + OpenSim.Framework + + + + + OpenSim.Framework + + + + + + + + + + + + + Data + + + + + + + + + Description + + + + + + + + + FullID + + + + + + + + + InvType + + + + + + + + + Name + + + + + + + + + Type + + + + + + + + + + + + + PrimData.PrimData() + ParentID + System.UInt32 + 0 + + + + + + + + + FullID + + + + + + + + + LocalID + + + + + + + + + OwnerID + + + + + + + + + ParentID + + + + + + + + + PathBegin + + + + + + + + + PathCurve + + + + + + + + + PathEnd + + + + + + + + + PathRadiusOffset + + + + + + + + + PathRevolutions + + + + + + + + + PathScaleX + + + + + + + + + PathScaleY + + + + + + + + + PathShearX + + + + + + + + + PathShearY + + + + + + + + + PathSkew + + + + + + + + + PathTaperX + + + + + + + + + PathTaperY + + + + + + + + + PathTwist + + + + + + + + + PathTwistBegin + + + + + + + + + PCode + + + + + + + + + Position + + + + + + + + + ProfileBegin + + + + + + + + + ProfileCurve + + + + + + + + + ProfileEnd + + + + + + + + + ProfileHollow + + + + + + + + + Rotation + + + + + + + + + Scale + + + + + + + + + Texture + + + + + + + + + + + + + + + Login + LoginService + LogOn + + + + + + + + + + + + + + + AgentID + + + + + + + + + circuitcode + + + + + circuitcode + AgentCircuitData.circuitcode + + + + + + + + + firstname + + + + + firstname + AgentCircuitData.firstname + + + + + + + + + lastname + + + + + lastname + AgentCircuitData.lastname + + + + + + + + + SecureSessionID + + + + + + + + + SessionID + + + + + + + + + + + OpenSim.Framework.Interfaces.ARequest + + + OpenSim.Framework.Interfaces.ARequest + + + + + + + + + AssetID + + + + + + + + + IsTexture + + + + + + + + + + + + + Authorised + + + + + Authorised + AuthenticateResponse.Authorised + + + + + + + + + LoginInfo + + + + + Login + LoginInfo + LogOn + + + + + + + + + + + Plugin + OpenSim.Framework.Interfaces.IAssetPlugin + + + + + + + + + GetAssetServer + + + + + + + + + + + + + IsTexture + + + + + + + + + + + + + ID + assetID + Id + + + + + + + + + ServerUrl + + + + + ServerKey + + + + + ServerUrl + IAssetServer.SetServerInfo(String, String):Void + + + + + + + + + + + Plugin + OpenSim.Framework.Interfaces.IGridPlugin + + + + + + + + + GetGridServer + + + + + + + + + + + + + ID + sessionID + Id + + + + + ID + agentID + Id + + + + + + + + + GetName + + + + + + + + + ID + sessionID + Id + + + + + ID + agentID + Id + + + + + Logout + LogoutSession + LogOff + + + + + + + + + Neighbours + IGridServer.RequestNeighbours():NeighbourInfo[] + + + + + + + + + IGridServer.RequestUUIDBlock():UUIDBlock + + + + + + + + + ServerUrl + + + + + SendKey + + + + + RecvKey + + + + + IGridServer.SetServerInfo(String, String, String):Void + Recv + RecvKey + + + + + ServerUrl + IGridServer.SetServerInfo(String, String, String):Void + + + + + + + + + + + + + ID + primID + Id + + + + + + + + + ShutDown + method + ShutDown + Shutdown + + + + + + + + + + + Sim + OpenSim.Framework.Interfaces.ISimConfig + + + + + + + + + GetConfigObject + + + + + + + + + + + + + ID + agentID + Id + + + + + + + + + ServerUrl + + + + + SendKey + + + + + RecvKey + + + + + IUserServer.SetServerInfo(String, String, String):Void + Recv + RecvKey + + + + + ServerUrl + IUserServer.SetServerInfo(String, String, String):Void + + + + + + + + + + + + + Logout + LogoutSession + LogOff + + + + + + + + + + + Login + Login + LogOn + + + + + + + + + Agent + + + + + + + + + BaseFolder + + + + + + + + + First + + + + + + + + + InventoryFolder + + + + + + + + + Last + + + + + + + + + SecureSession + + + + + + + + + Session + + + + + + + + + + + Neighbour + OpenSim.Framework.Interfaces.NeighbourInfo + + + + + + + + + regionhandle + + + + + regionhandle + NeighbourInfo.regionhandle + + + + + + + + + RegionLocX + + + + + + + + + RegionLocY + + + + + + + + + sim_ip + + + + + sim + NeighbourInfo.sim_ip + + + + + sim_ip + + + + + + + + + sim_port + + + + + sim + NeighbourInfo.sim_port + + + + + sim_port + + + + + + + + + + + + + agentcircuits + + + + + agentcircuits + + + + + agentcircuits + RemoteGridBase.agentcircuits:Dictionary`2<System.UInt32,OpenSim.Framework.Interfaces.AgentCircuitData> + + + + + + + + + Logout + LogoutSession + LogOff + + + + + + + + + + + Sim + OpenSim.Framework.Interfaces.SimConfig + + + + + + + + + AssetSendKey + + + + + + + + + AssetURL + + + + + + + + + GridRecvKey + + + + + Recv + SimConfig.GridRecvKey + + + + + + + + + GridSendKey + + + + + + + + + GridURL + + + + + + + + + IPListenAddr + + + + + Addr + SimConfig.IPListenAddr + + + + + + + + + IPListenPort + + + + + + + + + RegionHandle + + + + + + + + + RegionLocX + + + + + + + + + RegionLocY + + + + + + + + + RegionName + + + + + + + + + SimConfig.SaveMap(Single[]):Void + heightmap + heightmap + + + + + + + + + UserRecvKey + + + + + Recv + SimConfig.UserRecvKey + + + + + + + + + UserSendKey + + + + + + + + + UserURL + + + + + + + + + + + UUIDBlock + + + + + OpenSim.Framework.Interfaces.UUIDBlock + + + OpenSim.Framework.Interfaces.UUIDBlock + + + + + + + + + BlockEnd + + + + + + + + + BlockStart + + + + + + + + + + + + + + + + + AgentInventory.AgentInventory() + AgentInventory.AgentInventory() AgentInventory.Initialise():Void + + + + + + + + + ID + folderID + Id + + + + + + + + + AgentID + + + + + + + + + ID + folderID + Id + + + + + + + + + Initialise + AgentInventory.Initialise():Void + + + + + + + + + InventoryFolders + + + + + + + + + InventoryItems + + + + + + + + + InventoryRoot + + + + + + + + + LastCached + + + + + + + + + ID + itemID + Id + + + + + + + + + Wearables + + + + + Wearables + AgentInventory.Wearables + + + + + + + + + + + + + AssetID + + + + + + + + + ItemID + + + + + + + + + + + + + DefaultType + + + + + + + + + FolderID + + + + + + + + + FolderName + + + + + + + + + Items + + + + + System.Collections.Generic.List`1<OpenSim.Framework.Inventory.InventoryItem> + InventoryFolder.Items + + + + + + + + + OwnerID + + + + + + + + + ParentID + + + + + + + + + Version + + + + + + + + + + + + + AssetID + + + + + + + + + CreatorID + + + + + + + + + Description + + + + + + + + + FolderID + + + + + + + + + InvType + + + + + + + + + ItemID + + + + + + + + + Name + + + + + + + + + OwnerID + + + + + + + + + Type + + + + + + + + + + + + + + + Sim + OpenSim.Framework.Sims.SimProfile + + + + + + + + + SimProfile.LoadFromGrid(UInt64, String, String, String):SimProfile + System.Exception + + + + + GridURL + + + + + SendKey + + + + + RecvKey + + + + + SimProfile.LoadFromGrid(UInt64, String, String, String):SimProfile + Recv + RecvKey + + + + + region_handle + + + + + GridURL + + + + + RecvKey + SimProfile.LoadFromGrid(UInt64, String, String, String):SimProfile + + + + + SimProfile.LoadFromGrid(UInt64, String, String, String):SimProfile + System.Convert.ToUInt16(System.Object) + System.Convert.ToUInt16(System.Object,System.IFormatProvider) + + + + + SimProfile.LoadFromGrid(UInt64, String, String, String):SimProfile + System.Convert.ToUInt32(System.Object) + System.Convert.ToUInt32(System.Object,System.IFormatProvider) + + + SimProfile.LoadFromGrid(UInt64, String, String, String):SimProfile + System.Convert.ToUInt32(System.Object) + System.Convert.ToUInt32(System.Object,System.IFormatProvider) + + + + + SimProfile.LoadFromGrid(UInt64, String, String, String):SimProfile + System.Convert.ToUInt64(System.Object) + System.Convert.ToUInt64(System.Object,System.IFormatProvider) + + + + + SimProfile.LoadFromGrid(UInt64, String, String, String):SimProfile + System.UInt64.ToString + System.UInt64.ToString(System.IFormatProvider) + + + + + + + + + + + Sim + OpenSim.Framework.Sims.SimProfileBase + + + + + + + + + caps_url + + + + + caps_url + + + + + + + + + recvkey + + + + + recvkey + SimProfileBase.recvkey + + + + + + + + + regionhandle + + + + + regionhandle + SimProfileBase.regionhandle + + + + + + + + + RegionLocX + + + + + + + + + RegionLocY + + + + + + + + + regionname + + + + + regionname + SimProfileBase.regionname + + + + + + + + + sendkey + + + + + sendkey + SimProfileBase.sendkey + + + + + + + + + sim_ip + + + + + sim + SimProfileBase.sim_ip + + + + + sim_ip + + + + + + + + + sim_port + + + + + sim + SimProfileBase.sim_port + + + + + sim_port + + + + + + + + + UUID + + + + + + + + + + + + + + + Heightmap + OpenSim.Framework.Terrain.HeightmapGenHills + + + + + + + + + HeightmapGenHills.GenerateHeightmap(Int32, Single, Single, Boolean):Single[] + num + numHills + + + + + Heightmap + HeightmapGenHills.GenerateHeightmap(Int32, Single, Single, Boolean):Single[] + + + + + + + + + HeightmapGenHills.NumHills + + + + + + + + + + + + + + + + + UserProfile.UserProfile() + IsGridGod + System.Boolean + false + + + + + + + + + Sim + UserProfile.AddSimCircuit(UInt32, LLUUID):Void + + + + + regionUUID + + + + + + + + + AssetURL + + + + + + + + + Circuits + + + + + + + + + CurrentSecureSessionID + + + + + + + + + CurrentSessionID + + + + + + + + + firstname + + + + + firstname + UserProfile.firstname + + + + + + + + + homelookat + + + + + homelookat + UserProfile.homelookat + + + + + + + + + homepos + + + + + homepos + UserProfile.homepos + + + + + + + + + homeregionhandle + + + + + homeregionhandle + UserProfile.homeregionhandle + + + + + + + + + Inventory + + + + + + + + + IsGridGod + + + + + + + + + IsLocal + + + + + + + + + lastname + + + + + lastname + UserProfile.lastname + + + + + + + + + MD5passwd + + + + + + + + + UUID + + + + + + + + + + + + + response + + + + + Customise + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + + + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + GridResp + Nwc.XmlRpc.XmlRpcResponse + + + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.UInt32.ToString + System.UInt32.ToString(System.IFormatProvider) + + + UserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.UInt32.ToString + System.UInt32.ToString(System.IFormatProvider) + + + + + + + + + DefaultStartupMsg + + + + + + + + + GridRecvKey + + + + + Recv + UserProfileManager.GridRecvKey + + + + + + + + + GridSendKey + + + + + + + + + GridURL + + + + + + + + + UserProfileManager.ParseXMLRPC(String):String + System.Exception + + + + + UserProfileManager.ParseXMLRPC(String):String + + + + + UserProfileManager.ParseXMLRPC(String):String + System.Int32.ToString + System.Int32.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Int32.ToString + System.Int32.ToString(System.IFormatProvider) + + + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + UserProfileManager.ParseXMLRPC(String):String + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + + + + + + + UserProfileManager.SetKeys(String, String, String, String):Void + recv + recvKey + + + + + url + UserProfileManager.SetKeys(String, String, String, String):Void + + + + + + + + + + + + + UserProfileManagerBase.AuthenticateUser(String, String, String):Boolean + firstname + firstname + + + + + UserProfileManagerBase.AuthenticateUser(String, String, String):Boolean + lastname + lastname + + + + + UserProfileManagerBase.AuthenticateUser(String, String, String):Boolean + passwd + passwd + + + + + + + + + MD5passwd + + + + + UserProfileManagerBase.CreateNewProfile(String, String, String):UserProfile + firstname + firstname + + + + + UserProfileManagerBase.CreateNewProfile(String, String, String):UserProfile + lastname + lastname + + + + + UserProfileManagerBase.CreateNewProfile(String, String, String):UserProfile + M + MD5passwd + + + + + + + + + ProfileLLUUID + + + + + ProfileLLUUID + + + + + UserProfileManagerBase.GetProfileByLLUUID(LLUUID):UserProfile + + + + + + + + + UserProfileManagerBase.GetProfileByName(String, String):UserProfile + firstname + firstname + + + + + UserProfileManagerBase.GetProfileByName(String, String):UserProfile + lastname + lastname + + + + + + + + + ID + agentID + Id + + + + + + + + + GodID + + + + + ID + GodID + Id + + + + + + + + + UserProfiles + + + + + + + + + + + + + + + OpenSim.Framework.Utilities.BlockingQueue`1 + Queue + + + + + + + + + Util + OpenSim.Framework.Utilities.Util + + + + + Util + + + + + Util + System.Web.Util + + + + + + + + + Xfer + Util.GetNextXferID():UInt32 + + + + + Util.GetNextXferID():UInt32 + + + + + GetNextXferID + + + + + + + + + X + + + + + Y + + + + + Util.UIntsToLong(UInt32, UInt32):UInt64 + X + + + + + Util.UIntsToLong(UInt32, UInt32):UInt64 + Y + + + + + Ints + Util.UIntsToLong(UInt32, UInt32):UInt64 + + + + + + + + + + + + + + + + + + + OpenSim.GridInterfaces.Local + + + + + OpenSim.GridInterfaces.Local + + + + + OpenSim.GridInterfaces.Local + + + + + + + + + + + + + Data + + + + + + + + + Name + + + + + + + + + Type + + + + + + + + + UUID + + + + + + + + + + + AssetUUIDQuery + + + + + + + + + 'asset' + AssetUUIDQuery.Match(AssetStorage):Boolean + + + + + + + + + + + Plugin + OpenSim.GridInterfaces.Local.LocalAssetPlugin + + + + + + + + + + + LocalAssetServer.LocalAssetServer() + System.Exception + + + + + + + + + LocalAssetServer.LoadAsset(AssetBase, Boolean, String):Void + + + + + image + LocalAssetServer.LoadAsset(AssetBase, Boolean, String):Void + + + + + + + + + 'asset' + LocalAssetServer.UploadNewAsset(AssetBase):Void + + + + + + + + + + + Plugin + OpenSim.GridInterfaces.Local.LocalGridPlugin + + + + + + + + + + + Logout + LogoutSession + LogOff + + + + + + + + + Sessions + + + + + System.Collections.Generic.List`1<OpenSim.Framework.Interfaces.Login> + LocalGridServer.Sessions + + + + + + + + + + + + + + + + + + + OpenSim.GridInterfaces.Remote + + + + + OpenSim.GridInterfaces.Remote + + + + + OpenSim.GridInterfaces.Remote + + + + + + + + + + + Plugin + OpenSim.GridInterfaces.Remote.RemoteAssetPlugin + + + + + + + + + Plugin + OpenSim.GridInterfaces.Remote.RemoteGridPlugin + + + + + + + + + + + agentcircuits + + + + + + + + + circuitcode + RemoteGridServer.AuthenticateSession(LLUUID, LLUUID, UInt32):AuthenticateResponse + circuitCode + IGridServer.AuthenticateSession(LLUUID, LLUUID, UInt32):AuthenticateResponse + + + + + + + + + RemoteGridServer.GridRecvKey + + + + + + + + + RemoteGridServer.GridSendKey + + + + + + + + + RemoteGridServer.LogoutSession(LLUUID, LLUUID, UInt32):Boolean + WebRequest.Create(Uri):WebRequest + WebRequest.Create(String):WebRequest + + + + + RemoteGridServer.LogoutSession(LLUUID, LLUUID, UInt32):Boolean + GridResponse + System.String + + + + + Logout + LogoutSession + LogOff + + + + + 'sessionID' + RemoteGridServer.LogoutSession(LLUUID, LLUUID, UInt32):Boolean + + + + + + + + + + + + + + + + + + + OpenSim.Physics.Manager + + + + + OpenSim.Physics.Manager + + + + + OpenSim.Physics.Manager + + + + + + + + + + + Plugin + OpenSim.Physics.Manager.IPhysicsPlugin + + + + + + + + + GetName + + + + + + + + + GetScene + + + + + + + + + + + + + 'heightMap' + NullPhysicsScene.SetTerrain(Single[]):Void + + + + + + + + + NullPhysicsScene.Simulate(Single):Void + System.Int32.ToString + System.Int32.ToString(System.IFormatProvider) + + + + + + + + + + + + + Kinematic + PhysicsActor.Kinematic:Boolean + + + + + + + + + + + + + PhysicsManager.GetPhysicsScene(String):PhysicsScene + System.String.Format(System.String,System.Object) + System.String.Format(System.IFormatProvider,System.String,System.Object[]) + + + + + + + + + Plugins + PhysicsManager.LoadPlugins():Void + + + + + + + + + + + + + PhysicsVector.PhysicsVector(Single, Single, Single) + x + + + + + PhysicsVector.PhysicsVector(Single, Single, Single) + y + + + + + PhysicsVector.PhysicsVector(Single, Single, Single) + z + + + + + + + + + X + + + + + X + PhysicsVector.X + + + + + + + + + Y + + + + + Y + PhysicsVector.Y + + + + + + + + + Z + + + + + Z + PhysicsVector.Z + + + + + + + + + PhysicsVector.Zero + OpenSim.Physics.Manager.PhysicsVector + + + + + + + + + + + + + + + + + + + OpenSim.RegionServer + + + + + OpenSim.RegionServer + + + + + OpenSim.RegionServer + + + + + OpenSim.RegionServer + + + + + OpenSim.RegionServer + + + + + + + + + + + + + ID + transactionID + Id + + + + + + + + + ID + transactionID + Id + + + + + + + + + ID + transactionID + Id + + + + + + + + + ID + assetID + Id + + + + + AgentAssetUpload.HandleUploadPacket(AssetUploadRequestPacket, LLUUID):Void + System.Int32.ToString(System.String) + System.Int32.ToString(System.String,System.IFormatProvider) + + + AgentAssetUpload.HandleUploadPacket(AssetUploadRequestPacket, LLUUID):Void + System.Int32.ToString(System.String) + System.Int32.ToString(System.String,System.IFormatProvider) + + + + + 'assetID' + AgentAssetUpload.HandleUploadPacket(AssetUploadRequestPacket, LLUUID):Void + + + 'pack' + AgentAssetUpload.HandleUploadPacket(AssetUploadRequestPacket, LLUUID):Void + + + + + + + + + AgentAssetUpload.HandleXferPacket(SendXferPacketPacket):Void + xfer + xferPacket + + + + + Xfer + AgentAssetUpload.HandleXferPacket(SendXferPacketPacket):Void + + + + + + + + + + + + + AssetTransaction.AssetTransaction() + UploadComplete + System.Boolean + false + + + + + + + + + AddToInventory + + + + + + + + + Asset + + + + + + + + + InventFolder + + + + + + + + + TransactionID + + + + + + + + + UploadComplete + + + + + + + + + XferID + + + + + Xfer + AssetTransaction.XferID + + + + + + + + + + + Grid + OpenSim.Framework.Grid + + + + + + + + + AssetDll + + + + + + + + + AssetServer + + + + + + + + + GridDll + + + + + + + + + GridServer + + + + + + + + + Initialise + Grid.Initialise():Void + + + + + + + + + Grid.LoadAssetDll(String):IAssetServer + + + + + + + + + Grid.LoadGridDll(String):IGridServer + + + + + + + + + + + Sim + OpenSim.OpenSimApplication + + + + + + + + + OpenSimApplication.RemoveClientCircuit(UInt32):Void + circuitcode + circuitcode + + + + + + + + + OpenSimApplication.SendPacketTo(Byte[], Int32, SocketFlags, UInt32):Void + circuitcode + circuitcode + + + + + + + + + StartUp + method + StartUp + Startup + + + + + + + + + + + Sim + OpenSim.OpenSimMain + + + + + OpenSim.OpenSimMain + System.Timers.Timer, System.Net.Sockets.Socket + + + + + + + + + OpenSimMain.OpenSimMain() + loginserver + System.Boolean + false + + + OpenSimMain.OpenSimMain() + sandbox + System.Boolean + false + + + + + + + + + _physicsEngine + + + + + _physicsEngine + + + + + + + + + OpenSimMain.LoadConfigDll(String):SimConfig + + + + + + + + + loginserver + + + + + loginserver + OpenSimMain.loginserver + + + + + + + + + sandbox + + + + + + + + + Server + + + + + + + + + Timer.set_Interval(Double):Void + OpenSimMain.StartUp():Void + + + + + OpenSimMain.StartUp():Void + System.UInt32.ToString + System.UInt32.ToString(System.IFormatProvider) + + + OpenSimMain.StartUp():Void + System.UInt32.ToString + System.UInt32.ToString(System.IFormatProvider) + + + + + + + + + + + Sim + OpenSim.OpenSimRoot + + + + + + + + + OpenSimRoot.OpenSimRoot() + Sandbox + System.Boolean + false + + + + + + + + + Application + + + + + + + + + AssetCache + + + + + + + + + Cfg + + + + + Cfg + OpenSimRoot.Cfg + + + + + + + + + ClientThreads + + + + + + + + + GridServers + + + + + + + + + HttpServer + + + + + + + + + InventoryCache + + + + + + + + + LocalWorld + + + + + + + + + Sandbox + + + + + + + + + StartUp + method + StartUp + Startup + + + + + + + + + startuptime + + + + + startuptime + OpenSimRoot.startuptime + + + + + + + + + + + Que + OpenSim.QueItem + + + + + + + + + Incoming + + + + + + + + + Packet + + + + + + + + + + + Sim + OpenSim.SimClient + + + + + OpenSim.SimClient + System.Timers.Timer + + + + + + + + + SimClient.SimClient(EndPoint, UseCircuitCodePacket) + Sequence + System.UInt32 + 0 + + + SimClient.SimClient(EndPoint, UseCircuitCodePacket) + debug + System.Boolean + false + + + + + Timer.Timer(Double) + SimClient.SimClient(EndPoint, UseCircuitCodePacket) + + + + + SimClient.SimClient(EndPoint, UseCircuitCodePacket) + initialcirpack + initialcirpack + + + + + + + + + AgentID + + + + + + + + + CircuitCode + + + + + + + + + ClientAvatar + + + + + + + + + NewPack + + + + + + + + + SimClient.newAssetFolder + + + + + + + + + NewPack + + + + + + + + + Pack + + + + + SimClient.ProcessInPacket(Packet):Void + wear + libsecondlife.Packets.AgentIsNowWearingPacket + + + + + op_Equality + "" + SimClient.ProcessInPacket(Packet):Void + + + + + + + + + SimClient.ProcessOutPacket(Packet):Void + System.Exception + + + + + Pack + + + + + + + + + SecureSessionID + + + + + + + + + SessionID + + + + + + + + + userEP + + + + + + + + + + + OpenSim.SimConsole + OpenSim.Framework.Console.ConsoleBase + + + + + Sim + OpenSim.SimConsole + + + + + + + + + SimConsole.SimConsole(ConsoleType, String, Int32) + constype + constype + + + + + SimConsole.SimConsole(ConsoleType, String, Int32) + sparam + sparam + + + + + SimConsole.SimConsole(ConsoleType, String, Int32) + iparam + iparam + + + + + iparam + SimConsole.SimConsole(ConsoleType, String, Int32) + + + + + sparam + SimConsole.SimConsole(ConsoleType, String, Int32) + + + + + + + + + op_Equality + "" + SimConsole.CmdPrompt(String, String):String + + + + + + + + + SimConsole.ConsType + + + + + + + + + SimConsole.MainConsolePrompt():Void + System.UInt64.ToString + System.UInt64.ToString(System.IFormatProvider) + + + + + + + + + 'cmdparams' + SimConsole.RunCmd(String, String[]):Object + + + + + + + + + SimConsole.ShowCommands(String):Void + System.String.Format(System.String,System.Object[]) + System.String.Format(System.IFormatProvider,System.String,System.Object[]) + + + SimConsole.ShowCommands(String):Void + System.String.Format(System.String,System.Object[]) + System.String.Format(System.IFormatProvider,System.String,System.Object[]) + + + + + + + + + + + + + Version + + + + + + + + + + + + + + + + + ID + imageID + Id + + + + + + + + + AssetRequests + + + + + System.Collections.Generic.List`1<OpenSim.Assets.AssetRequest> + AssetCache.AssetRequests + + + + + + + + + Assets + + + + + + + + + sourceAsset + AssetCache.CloneAsset(LLUUID, AssetInfo):AssetInfo + OpenSim.Assets.AssetInfo + OpenSim.Framework.Assets.AssetBase + + + + + AssetCache.CloneAsset(LLUUID, AssetInfo):AssetInfo + + + + + newOwner + AssetCache.CloneAsset(LLUUID, AssetInfo):AssetInfo + + + + + 'sourceAsset' + AssetCache.CloneAsset(LLUUID, AssetInfo):AssetInfo + + + + + + + + + source + AssetCache.CloneImage(LLUUID, TextureImage):TextureImage + OpenSim.Assets.TextureImage + OpenSim.Framework.Assets.AssetBase + + + + + AssetCache.CloneImage(LLUUID, TextureImage):TextureImage + + + + + newOwner + AssetCache.CloneImage(LLUUID, TextureImage):TextureImage + + + + + 'source' + AssetCache.CloneImage(LLUUID, TextureImage):TextureImage + + + + + + + + + ID + agentID + Id + + + + + + + + + ID + assetID + Id + + + + + + + + + RequestedAssets + + + + + + + + + RequestedTextures + + + + + + + + + AssetCache.RunAssetManager():Void + System.Exception + + + + + + + + + TextureRequests + + + + + System.Collections.Generic.List`1<OpenSim.Assets.AssetRequest> + AssetCache.TextureRequests + + + + + + + + + Textures + + + + + + + + + + + OpenSim.Assets.AssetInfo + OpenSim.Framework.Assets.AssetBase + + + + + + + + + AssetInfo.AssetInfo(AssetBase) + a + aBase + + + + + 'aBase' + AssetInfo.AssetInfo(AssetBase) + + + + + + + + + + + + + AssetRequest.AssetRequest() + DataPointer + System.Int64 + 0 + + + AssetRequest.AssetRequest() + NumPackets + System.Int32 + 0 + + + AssetRequest.AssetRequest() + PacketCounter + System.Int32 + 0 + + + + + + + + + AssetInf + + + + + + + + + DataPointer + + + + + + + + + ImageInfo + + + + + + + + + IsTextureRequest + + + + + + + + + NumPackets + + + + + Num + AssetRequest.NumPackets + + + + + + + + + PacketCounter + + + + + + + + + RequestAssetID + + + + + + + + + RequestUser + + + + + + + + + TransferRequestID + + + + + + + + + + + + + ID + folderID + Id + + + + + + + + + ID + clientID + Id + + + + + + + + + ID + folderID + Id + + + + + + + + + ID + folderID + Id + + + + + + + + + FetchItems + + + + + + + + + FetchDescend + + + + + + + + + ID + agentID + Id + + + + + + + + + ID + itemID + Id + + + + + + + + + + + OpenSim.Assets.TextureImage + OpenSim.Framework.Assets.AssetBase + + + + + + + + + TextureImage.TextureImage(AssetBase) + a + aBase + + + + + 'aBase' + TextureImage.TextureImage(AssetBase) + + + + + + + + + + + + + + + Sim + OpenSim.CAPS.SimCAPSHTTPServer + + + + + SimCAPSHTTPServer + + + + + OpenSim.CAPS.SimCAPSHTTPServer + System.Net.HttpListener + + + + + + + + + SimCAPSHTTPServer.HandleRequest(Object):Void + stateinfo + stateinfo + + + + + + + + + HTTPD + + + + + + + + + Listener + + + + + + + + + SimCAPSHTTPServer.LoadAdminPage():Void + System.Exception + + + + + + + + + SimCAPSHTTPServer.ParseLLSDXML(String):String + + + + + requestBody + SimCAPSHTTPServer.ParseLLSDXML(String):String + + + + + + + + + SimCAPSHTTPServer.ParseREST(String, String, String):String + System.Exception + + + + + SimCAPSHTTPServer.ParseREST(String, String, String):String + System.String.Format(System.String,System.Object[]) + System.String.Format(System.IFormatProvider,System.String,System.Object[]) + + + + + + + + + SimCAPSHTTPServer.ParseXMLRPC(String):String + System.Exception + + + + + SimCAPSHTTPServer.ParseXMLRPC(String):String + + + + + SimCAPSHTTPServer.ParseXMLRPC(String):String + System.Convert.ToUInt32(System.Object) + System.Convert.ToUInt32(System.Object,System.IFormatProvider) + + + + + + + + + SimCAPSHTTPServer.StartHTTP():Void + System.Exception + + + + + SimCAPSHTTPServer.StartHTTP():Void + + + + + + + + + + + + + + + + + mesh + + + + + System.Collections.Generic.List`1<OpenSim.types.Triangle> + Mesh.mesh + + + + + + + + + Mesh.op_Addition(Mesh, Mesh):Mesh + a + + + + + Mesh.op_Addition(Mesh, Mesh):Mesh + b + + + + + Add + Mesh.op_Addition(Mesh, Mesh):Mesh + + + + + Mesh + Mesh.op_Addition(Mesh, Mesh):Mesh + + + + + + + + + + + + + A + + + + + B + + + + + C + + + + + Triangle.Triangle(Vector3, Vector3, Vector3) + A + + + + + Triangle.Triangle(Vector3, Vector3, Vector3) + B + + + + + Triangle.Triangle(Vector3, Vector3, Vector3) + C + + + + + + + + + + + + + + + + + LocalUserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Int32.ToString + System.Int32.ToString(System.IFormatProvider) + + + LocalUserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Int32.ToString + System.Int32.ToString(System.IFormatProvider) + + + + + LocalUserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + LocalUserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + LocalUserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + LocalUserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + LocalUserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + LocalUserProfileManager.CustomiseResponse(Hashtable&, UserProfile):Void + System.Single.ToString + System.Single.ToString(System.IFormatProvider) + + + + + + + + + + + OpenSim.UserServer.LoginServer + OpenSim.Framework.Grid.LoginService + + + + + OpenSim.UserServer.LoginServer + System.Net.Sockets.Socket + + + + + Login + LoginServer + LogOn + + + + + + + + + LoginServer.LoginServer(IGridServer) + _needPasswd + System.Boolean + false + + + LoginServer.LoginServer(IGridServer) + userAccounts + System.Boolean + false + + + + + + + + + LoginServer.Authenticate(String, String, String):Boolean + passwd + passwd + + + + + + + + + clientAddress + + + + + + + + + Customise + LoginServer.CustomiseLoginResponse(Hashtable, String, String):Void + + + + + Login + CustomiseLoginResponse + LogOn + + + + + + + + + LoginServer.EncodePassword(String):String + System.String.ToLower + System.String.ToLower(System.Globalization.CultureInfo) + + + + + + + + + LoginServer.GetAgentId(String, String):LLUUID + System.Int32.ToString(System.String) + System.Int32.ToString(System.String,System.IFormatProvider) + + + + + + + + + LoginServer.InitializeLogin():Void + 4 + UserProfileManager.SetKeys(String, String, String, String):Void + Welcome to OpenSim + + + + + Sim + OpenSim + + + + + + + + + LoginServer.LoginRequest(StreamReader, StreamWriter):Void + System.Exception + + + + + LoginServer.LoginRequest(StreamReader, StreamWriter):Void + System.Convert.ToInt32(System.String) + System.Convert.ToInt32(System.String,System.IFormatProvider) + + + + + op_Inequality + "" + LoginServer.LoginRequest(StreamReader, StreamWriter):Void + + + + + + + + + writer + LoginServer.ProcessXmlRequest(XmlRpcRequest, StreamWriter):Boolean + System.IO.StreamWriter + System.IO.TextWriter + + + + + LoginServer.ProcessXmlRequest(XmlRpcRequest, StreamWriter):Boolean + System.Int32.ToString + System.Int32.ToString(System.IFormatProvider) + + + + + LoginServer.ProcessXmlRequest(XmlRpcRequest, StreamWriter):Boolean + System.Int32.ToString(System.String) + System.Int32.ToString(System.String,System.IFormatProvider) + + + + + 'request' + LoginServer.ProcessXmlRequest(XmlRpcRequest, StreamWriter):Boolean + + + 'writer' + LoginServer.ProcessXmlRequest(XmlRpcRequest, StreamWriter):Boolean + + + 'writer' + LoginServer.ProcessXmlRequest(XmlRpcRequest, StreamWriter):Boolean + + + + + + + + + remoteAddress + + + + + + + + + LoginServer.RunLogin():Void + System.Exception + + + LoginServer.RunLogin():Void + System.Exception + + + + + LoginServer.RunLogin():Void + clientEndPoint + System.Net.IPEndPoint + + + + + + + + + + + + + + + + + Avatar.Avatar() + PhysicsEngineFlying + System.Boolean + false + + + + + + + + + Avatar.Avatar(SimClient) + _updateCount + System.Int16 + 0 + + + Avatar.Avatar(SimClient) + avatarAppearanceTexture + libsecondlife.LLObject+TextureEntry + null + + + Avatar.Avatar(SimClient) + movementflag + System.Byte + 0 + + + Avatar.Avatar(SimClient) + updateflag + System.Boolean + false + + + + + TheClient + + + + + + + + + anim_seq + + + + + anim + Avatar.anim_seq + + + + + anim_seq + + + + + + + + + Animations + + + + + + + + + RegionInfo + + + + + RegionInfo + Avatar.CompleteMovement(World):Void + + + + + + + + + ControllingClient + + + + + + + + + current_anim + + + + + anim + Avatar.current_anim + + + + + current_anim + + + + + + + + + firstname + + + + + firstname + Avatar.firstname + + + + + + + + + lastname + + + + + lastname + Avatar.lastname + + + + + + + + + Anims + Avatar.LoadAnims():Void + + + + + + + + + PhysActor + + + + + + + + + PhysicsEngineFlying + + + + + + + + + Anim + Avatar.SendAnimPack():Void + + + + + + + + + 'userInfo' + Avatar.SendAppearanceToOtherAgent(SimClient):Void + + + + + + + + + RegionInfo + + + + + RegionInfo + Avatar.SendRegionHandshake(World):Void + + + + + + + + + + + + + AnimsLLUUID + + + + + Anims + AvatarAnimations.AnimsLLUUID + + + + + + + + + AnimsNames + + + + + Anims + AvatarAnimations.AnimsNames + + + + + + + + + Anims + AvatarAnimations.LoadAnims():Void + + + + + + + + + + + + + Entity.Entity() + localid + System.UInt32 + 0 + + + + + + + + + addForces + + + + + + + + + BackUp + method + BackUp + Backup + + + + + + + + + children + + + + + System.Collections.Generic.List`1<OpenSim.world.Entity> + Entity.children + + + + + + + + + getMesh + + + + + + + + + getName + + + + + + + + + localid + + + + + localid + Entity.localid + + + + + + + + + name + + + + + + + + + position + + + + + + + + + rotation + + + + + + + + + update + + + + + + + + + uuid + + + + + uuid + Entity.uuid + + + + + + + + + velocity + + + + + + + + + + + + + X + + + + + X + NewForce.X + + + + + + + + + Y + + + + + Y + NewForce.Y + + + + + + + + + Z + + + + + Z + NewForce.Z + + + + + + + + + + + 'UpdateFlag' + updateFlag + + + + + + + + + Primitive.Primitive() + dirtyFlag + System.Boolean + false + + + Primitive.Primitive() + mesh_cutbegin + System.Single + 0.0 + + + Primitive.Primitive() + newPrimFlag + System.Boolean + false + + + Primitive.Primitive() + physicsEnabled + System.Boolean + false + + + Primitive.Primitive() + physicstest + System.Boolean + false + + + Primitive.Primitive() + updateFlag + System.Boolean + false + + + + + + + + + localID-702000 + Primitive.CreateFromPacket(ObjectAddPacket, LLUUID, UInt32):Void + + + + + ID + agentID + Id + + + + + ID + localID + Id + + + + + Primitive.CreateFromPacket(ObjectAddPacket, LLUUID, UInt32):Void + System.UInt32.ToString(System.String) + System.UInt32.ToString(System.String,System.IFormatProvider) + + + + + 'addPacket' + Primitive.CreateFromPacket(ObjectAddPacket, LLUUID, UInt32):Void + + + + + + + + + 'store' + Primitive.CreateFromStorage(PrimData):Void + + + + + + + + + dirtyFlag + + + + + + + + + mesh_cutbegin + + + + + cutbegin + Primitive.mesh_cutbegin + + + + + mesh_cutbegin + + + + + + + + + mesh_cutend + + + + + cutend + Primitive.mesh_cutend + + + + + mesh_cutend + + + + + + + + + newPrimFlag + + + + + + + + + PhysActor + + + + + + + + + primData + + + + + + + + + RemoteClient + + + + + 'RemoteClient' + Primitive.UpdateClient(SimClient):Void + + + + + + + + + updateFlag + + + + + + + + + 'pack' + Primitive.UpdateObjectFlags(ObjectFlagUpdatePacket):Void + + + + + + + + + 'addPacket' + Primitive.UpdateShape(ObjectDataBlock):Void + + + + + + + + + + + + + ScriptEngine.ScriptEngine(World) + env + env + + + + + env + ScriptEngine.ScriptEngine(World) + + + + + + + + + ScriptEngine.LoadScript():Void + + + + + + + + + + + + + HeightMap + + + + + + + + + + + World + OpenSim.world + + + + + + + + + World.World() + _localNumber + System.UInt32 + 0 + + + + + + + + + _localNumber + + + + + _localNumber + + + + + + + + + AgentClient + + + + + + + + + AgentClient + + + + + + + + + DeRezPacket + + + + + AgentClient + + + + + World.DeRezObject(DeRezObjectPacket, SimClient):Void + Rez + DeRezPacket + + + + + Rez + World.DeRezObject(DeRezObjectPacket, SimClient):Void + + + + + AgentClient + World.DeRezObject(DeRezObjectPacket, SimClient):Void + + + + + De + World.DeRezObject(DeRezObjectPacket, SimClient):Void + + + + + + + + + Entities + + + + + + + + + RemoteClient + + + + + Prims + World.GetInitialPrims(SimClient):Void + + + + + + + + + LandMap + + + + + + + + + Prims + World.LoadPrimsFromStorage():Void + + + + + + + + + World.LoadStorageDLL(String):Boolean + + + + + + + + + localStorage + + + + + + + + + World.Rand + + + + + + + + + Scripts + + + + + + + + + RemoteClient + + + + + 'RemoteClient' + World.SendLayerData(SimClient):Void + + + 'RemoteClient' + World.SendLayerData(SimClient):Void + + + 'RemoteClient' + World.SendLayerData(SimClient):Void + + + + + + + + + + + + + + + + + IScriptHost.Register(IScript):Boolean + iscript + iscript + + + + + + + + + + + + + + + + + + + OpenSim.Storage.LocalStorageDb4o + + + + + OpenSim.Storage.LocalStorageDb4o + + + + + OpenSim.Storage.LocalStorageDb4o + + + + + + + + + + + + + Db4LocalStorage.Db4LocalStorage() + System.Exception + + + + + + + + + 'receiver' + Db4LocalStorage.LoadPrimitives(ILocalStorageReceiver):Void + + + + + + + + + 'prim' + Db4LocalStorage.StorePrim(PrimData):Void + + + + + + + + + + + UUIDQuery + + + + + + + + + 'prim' + UUIDQuery.Match(PrimData):Boolean + + + + + + + + + + + + + + + + + + + OpenSim.Physics.BasicPhysicsPlugin + + + + + + + + + + OpenSim.Physics.BasicPhysicsPlugin + + + + + + + + + + OpenSim.Physics.BasicPhysicsPlugin + + + + + + + + + + + + + + + + + + BasicActor.flying + + + + + + + + + BasicActor.SetAcceleration(PhysicsVector):Void + accel + accel + + + + + + + + + + + Plugin + OpenSim.Physics.BasicPhysicsPlugin.BasicPhysicsPlugin + + + + + BasicPhysicsPlugin + OpenSim.Physics.BasicPhysicsPlugin + + + + + + + + + + + + + + + + + OpenSim.Physics.OdePlugin + + + + + OpenSim.Physics.OdePlugin + + + + + OpenSim.Physics.OdePlugin + + + + + + + + + + + OdeCharacter + + + + + + + + + parent_scene + OdeCharacter.OdeCharacter(OdeScene, PhysicsVector) + + + + + 'pos' + OdeCharacter.OdeCharacter(OdeScene, PhysicsVector) + + + + + + + + + OdeCharacter.capsule_geom + + + + + + + + + OdeCharacter.gravityAccel + + + + + + + + + OdeCharacter.SetAcceleration(PhysicsVector):Void + accel + accel + + + + + + + + + + + Plugin + OpenSim.Physics.OdePlugin.OdePlugin + + + + + OdePlugin + OpenSim.Physics.OdePlugin + + + + + + + + + + + OdePrim._position + + + + + + + + + OdePrim.SetAcceleration(PhysicsVector):Void + accel + accel + + + + + + + + + + + + + 'position' + OdeScene.AddPrim(PhysicsVector, PhysicsVector):PhysicsActor + + + 'size' + OdeScene.AddPrim(PhysicsVector, PhysicsVector):PhysicsActor + + + + + + + + + OdeScene.Land + + + + + + + + + OdeScene.LandGeom + + + + + + + + + 'heightMap' + OdeScene.SetTerrain(Single[]):Void + + + 'heightMap' + OdeScene.SetTerrain(Single[]):Void + + + + + + + + + space + + + + + space + + + + + + + + + world + + + + + world + + + + + + + + + + + + + + + + + + + OpenSim.Physics.PhysXPlugin + + + + + OpenSim.Physics.PhysXPlugin + + + + + OpenSim.Physics.PhysXPlugin + + + + + + + + + + + + + PhysXCharacter.SetAcceleration(PhysicsVector):Void + accel + accel + + + + + + + + + + + Plugin + OpenSim.Physics.PhysXPlugin.PhysXPlugin + + + + + PhysXPlugin + OpenSim.Physics.PhysXPlugin + + + + + + + + + + + PhysXPrim._position + + + + + + + + + PhysXPrim.SetAcceleration(PhysicsVector):Void + accel + accel + + + + + + + + + + + + + + + + Save it for a rainy day. + Save it for a rainy day. + Save it for a rainy day. + + + + + No valid permission requests were found for assembly '{0}'. You should always specify the minimum security permissions using SecurityAction.RequestMinimum. + + + Sign '{0}' with a strong name key. + + + Consider merging the types defined in '{0}' with another namespace. + + + It appears that field '{0}' is never used or is only ever assigned to. Use this field or remove it. + + + Change '{0}' to be read-only by removing the property setter. + + + The compound word '{0}' in {1} '{2}' exists as a discrete term. If your usage is intended to be single word, case it as '{3}'. + + + '{0}' is marked ComVisible(true) but has the following ComVisible(false) types in its object hierarchy: {1} + + + Consider changing the type of parameter '{0}' in {1} from {2} to its base type {3}. This method appears to only require base class members in its implementation. Suppress this violation if there is a compelling reason to require the more derived type in the method signature. + + + '{0}' contains a call chain that results in a call to a virtual method defined by the class. Review the following call stack for unintended consequences: {1} + + + Modify '{0}' to catch a more specific exception than '{1}' or rethrow the exception. + + + Remove the readonly declaration from '{0}' or change the field to one that is an immutable reference type. If the reference type '{1}' is, in fact, immutable, exclude this message. + + + Make '{0}' private or internal (Friend in VB, public private in C++) and provide a public or protected property to access it. + + + Change '{0}' in {1} to use Collection<T>, ReadOnlyCollection<T> or KeyedCollection<K,V> + + + {0} initializes field {1} of type {2} to {3}. Remove this initialization as it will be done automatically by the runtime. + + + {0} passes a literal as parameter {1} of a call to {2}. Retrieve the following string argument from a resource table instead: '{3}' + + + Consider a design that does not require that '{0}' be a reference parameter. + + + {0} creates an exception of type '{1}', an exception type that is not sufficiently specific and should never be raised by user code. If this exception instance might be thrown, use a different exception type. + + + Modify the call to {0} in method {1} to set the timer interval to a value that's greater than or equal to one second. + + + Correct the casing of member name '{0}'. + Correct the casing of namespace name '{0}'. + Correct the casing of parameter name '{0}'. + Correct the casing of type name '{0}'. + + + Correct the spelling of the unrecognized token '{0}' in member name '{1}'. + Consider providing a more meaningful name than the one-letter token '{0}' in member name '{1}'. + Correct the spelling of the unrecognized token '{0}' in namespace '{1}'. + In method {0}, correct the spelling of the unrecognized token '{1}' in parameter name '{2}' or strip it entirely if it represents any sort of hungarian notation. + In method {0}, consider providing a more meaningful name than the one-letter parameter name '{1}'. + Correct the spelling of the unrecognized token '{0}' in type name '{1}'. + + + Change member names {0} and '{1}' so that they differ by more than case. + + + Remove all underscores from member '{0}'. + Remove all underscores from parameter '{0}'. + Remove all underscores from type '{0}'. + + + Rename '{0}' so that it does not end in '{1}'. + + + Correct the spelling of the unrecognized token '{0}' in the literal '{1}'. + + + Correct the capitalization of member name '{0}'. + Correct the capitalization of namespace name '{0}'. + Correct the capitalization of parameter name '{0}'. + Correct the capitalization of type name '{0}'. + + + Add an AssemblyVersion attribute to '{0}'. + + + '{0}' should be marked with CLSCompliantAttribute and its value should be true. + + + Mark '{0}' as ComVisible(false) at the assembly level, then mark all types within the assembly that should be exposed to Com clients as ComVisible(true). + + + The 'this' parameter (or 'Me' in VB) of {0} is never used. Mark the member as static (or Shared in VB) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate. + + + Consider making '{0}' non-public or a constant. + + + Correct the potential overflow in the operation '{0}' in '{1}'. + + + Provide a method named '{0}' as a friendly alternate for operator {1}. + + + Consider adding an overload of the equality operator for '{0}' that takes the same parameters as {1}. + + + '{0}' should override Equals. + '{0}' should override the equality (==) and inequality (!=) operators. + + + Change parameter name '{0}' of method {1} to '{2}' in order to match the identifier as it has been declared in {3}. + + + Modify {0} to call {1} instead of {2}. + + + Make '{0}' private. + + + Add a property getter to '{0}'. + + + {0} declares a local, '{1}', of type {2}, which is never used or is only assigned to. Use this local or remove it. + + + Parameter '{0}' of {1} is never used. Remove the parameter or use it in the method body. + + + Correct the capitalization of '{0}' in member name '{1}'. + 'Id' is an abbreviation and therefore is not subject to acronym casing guidelines. Correct the capitalization of 'ID' in member name '{0}' by changing it to 'Id'. + 'Id' is an abbreviation and therefore is not subject to acronym casing guidelines. Correct the capitalization of '{0}' in parameter name '{1}' by changing it to '{2}'. + Correct the capitalization of '{0}' in type name '{1}'. + + + {0} makes a call to {1} that does not explicitly provide a CultureInfo. This should be replaced with a call to {2}. + + + {0} makes a call to {1} that does not explicitly provide an IFormatProvider. This should be replaced with a call to {2}. + + + Remove the public constructors from '{0}'. + + + Replace the call to String.{0}({1}) in '{2}' with a call to String.IsNullOrEmpty. + + + The type name '{0}' conflicts in whole or in part with the namespace name '{1}'. Change either name to eliminate the conflict. + + + Implement IDisposable on '{0}' as it instantiates members of the following IDisposable types: {1} + + + Implement IDisposable on '{0}'. + + + Change the type of parameter '{0}' of method {1} from string to System.Uri, or provide an overload of {1}, that allows '{0}' to be passed as a System.Uri object. + + + Replace the term '{0}' in member name '{1}' with the preferred alternate '{2}'. + Replace the term '{0}' in type name '{1}' with the preferred alternate '{2}'. + + + Change '{0}' to a property if appropriate. + + + Validate parameter {0} passed to externally visible method {1}. + + + + diff --git a/OpenSim.sln b/OpenSim.sln new file mode 100644 index 0000000000..bb4217e224 --- /dev/null +++ b/OpenSim.sln @@ -0,0 +1,329 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim", "OpenSim\Region\Application\OpenSim.csproj", "{438A9556-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework", "OpenSim\Framework\General\OpenSim.Framework.csproj", "{8ACA2445-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework.Communications", "OpenSim\Framework\Communications\OpenSim.Framework.Communications.csproj", "{CB52B7E7-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework.Configuration", "OpenSim\Framework\Configuration\OpenSim.Framework.Configuration.csproj", "{A45242A2-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework.Console", "OpenSim\Framework\Console\OpenSim.Framework.Console.csproj", "{A7CD0630-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework.Data", "OpenSim\Framework\Data\OpenSim.Framework.Data.csproj", "{36B72A9B-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework.Data.DB4o", "OpenSim\Framework\Data.DB4o\OpenSim.Framework.Data.DB4o.csproj", "{FD2D303D-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework.Servers", "OpenSim\Framework\Servers\OpenSim.Framework.Servers.csproj", "{2CC71860-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework.Services", "OpenSim\Framework\Services\OpenSim.Framework.Services.csproj", "{6251A10E-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework.UserManagement", "OpenSim\Framework\UserManager\OpenSim.Framework.UserManagement.csproj", "{586E2916-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Grid.AssetServer", "OpenSim\Grid\AssetServer\OpenSim.Grid.AssetServer.csproj", "{E5F1A03B-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Grid.GridServer", "OpenSim\Grid\GridServer\OpenSim.Grid.GridServer.csproj", "{60FCC3A6-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Grid.Services.Asset", "OpenSim\Grid\Services\Asset\OpenSim.Grid.Services.Asset.csproj", "{F22B4FF8-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Grid.Services.CoreFunctions.Local", "OpenSim\Grid\Services\CoreFunctions\Local\OpenSim.Grid.Services.CoreFunctions.Local.csproj", "{FE7B9CD5-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Grid.Services.CoreFunctions.Remote", "OpenSim\Grid\Services\CoreFunctions\Remote\OpenSim.Grid.Services.CoreFunctions.Remote.csproj", "{E5E729AD-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Grid.Services.Grid", "OpenSim\Grid\Services\Grid\OpenSim.Grid.Services.Grid.csproj", "{C14E4DD8-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Grid.Services.User", "OpenSim\Grid\Services\User\OpenSim.Grid.Services.User.csproj", "{DCF71AE6-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Grid.UserServer", "OpenSim\Grid\UserServer\OpenSim.Grid.UserServer.csproj", "{2FC96F92-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Caches", "OpenSim\Region\Caches\OpenSim.Region.Caches.csproj", "{61FCCDB3-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Capabilities", "OpenSim\Region\Capabilities\OpenSim.Region.Capabilities.csproj", "{39038E85-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.ClientStack", "OpenSim\Region\ClientStack\OpenSim.Region.ClientStack.csproj", "{DC3698B2-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Communications.Local", "OpenSim\Region\Communications\Local\OpenSim.Region.Communications.Local.csproj", "{BFB5D807-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Communications.OGS1", "OpenSim\Region\Communications\OGS1\OpenSim.Region.Communications.OGS1.csproj", "{4806E378-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Environment", "OpenSim\Region\Environment\OpenSim.Region.Environment.csproj", "{DCBA491C-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.GridInterfaces.Local", "OpenSim\Region\GridInterfaces\Local\OpenSim.Region.GridInterfaces.Local.csproj", "{241A8CDD-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.GridInterfaces.Remote", "OpenSim\Region\GridInterfaces\Remote\OpenSim.Region.GridInterfaces.Remote.csproj", "{98C7B681-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Physics.BasicPhysicsPlugin", "OpenSim\Region\Physics\BasicPhysicsPlugin\OpenSim.Region.Physics.BasicPhysicsPlugin.csproj", "{15B4FEF3-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Physics.Manager", "OpenSim\Region\Physics\Manager\OpenSim.Region.Physics.Manager.csproj", "{F4FF31EB-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Physics.OdePlugin", "OpenSim\Region\Physics\OdePlugin\OpenSim.Region.Physics.OdePlugin.csproj", "{90620634-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Physics.PhysXPlugin", "OpenSim\Region\Physics\PhysXPlugin\OpenSim.Region.Physics.PhysXPlugin.csproj", "{A6D191D8-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Storage.LocalStorageBerkeleyDB", "OpenSim\Region\Storage\LocalStorageBerkeleyDB\OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj", "{A4691E59-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Storage.LocalStorageDb4o", "OpenSim\Region\Storage\LocalStorageDb4o\OpenSim.Region.Storage.LocalStorageDb4o.csproj", "{43DB702D-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Storage.LocalStorageSQLite", "OpenSim\Region\Storage\LocalStorageSQLite\OpenSim.Region.Storage.LocalStorageSQLite.csproj", "{477B9270-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Region.Terrain.BasicTerrain", "OpenSim\Region\Terrain.BasicTerrain\OpenSim.Region.Terrain.BasicTerrain.csproj", "{C9E0F891-0000-0000-0000-000000000000}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleApp", "OpenSim\Region\Examples\SimpleApp\SimpleApp.csproj", "{24B12448-0000-0000-0000-000000000000}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + ({438A9556-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).4 = ({CB52B7E7-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).5 = ({A45242A2-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).7 = ({36B72A9B-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).8 = ({2CC71860-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).9 = ({586E2916-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).10 = ({61FCCDB3-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).11 = ({DC3698B2-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).12 = ({BFB5D807-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).13 = ({4806E378-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).14 = ({DCBA491C-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).15 = ({F4FF31EB-0000-0000-0000-000000000000}) + ({438A9556-0000-0000-0000-000000000000}).16 = ({C9E0F891-0000-0000-0000-000000000000}) + ({8ACA2445-0000-0000-0000-000000000000}).2 = ({A45242A2-0000-0000-0000-000000000000}) + ({8ACA2445-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000}) + ({CB52B7E7-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({CB52B7E7-0000-0000-0000-000000000000}).2 = ({36B72A9B-0000-0000-0000-000000000000}) + ({A45242A2-0000-0000-0000-000000000000}).0 = ({8ACA2445-0000-0000-0000-000000000000}) + ({A45242A2-0000-0000-0000-000000000000}).1 = ({A7CD0630-0000-0000-0000-000000000000}) + ({FD2D303D-0000-0000-0000-000000000000}).2 = ({36B72A9B-0000-0000-0000-000000000000}) + ({2CC71860-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({2CC71860-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000}) + ({586E2916-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000}) + ({586E2916-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000}) + ({586E2916-0000-0000-0000-000000000000}).4 = ({36B72A9B-0000-0000-0000-000000000000}) + ({586E2916-0000-0000-0000-000000000000}).6 = ({2CC71860-0000-0000-0000-000000000000}) + ({E5F1A03B-0000-0000-0000-000000000000}).0 = ({A45242A2-0000-0000-0000-000000000000}) + ({E5F1A03B-0000-0000-0000-000000000000}).1 = ({F22B4FF8-0000-0000-0000-000000000000}) + ({60FCC3A6-0000-0000-0000-000000000000}).0 = ({A45242A2-0000-0000-0000-000000000000}) + ({60FCC3A6-0000-0000-0000-000000000000}).1 = ({C14E4DD8-0000-0000-0000-000000000000}) + ({F22B4FF8-0000-0000-0000-000000000000}).0 = ({A45242A2-0000-0000-0000-000000000000}) + ({F22B4FF8-0000-0000-0000-000000000000}).1 = ({2CC71860-0000-0000-0000-000000000000}) + ({F22B4FF8-0000-0000-0000-000000000000}).2 = ({6251A10E-0000-0000-0000-000000000000}) + ({F22B4FF8-0000-0000-0000-000000000000}).3 = ({FE7B9CD5-0000-0000-0000-000000000000}) + ({F22B4FF8-0000-0000-0000-000000000000}).4 = ({E5E729AD-0000-0000-0000-000000000000}) + ({FE7B9CD5-0000-0000-0000-000000000000}).0 = ({6251A10E-0000-0000-0000-000000000000}) + ({E5E729AD-0000-0000-0000-000000000000}).0 = ({6251A10E-0000-0000-0000-000000000000}) + ({C14E4DD8-0000-0000-0000-000000000000}).0 = ({A45242A2-0000-0000-0000-000000000000}) + ({C14E4DD8-0000-0000-0000-000000000000}).1 = ({2CC71860-0000-0000-0000-000000000000}) + ({C14E4DD8-0000-0000-0000-000000000000}).2 = ({6251A10E-0000-0000-0000-000000000000}) + ({C14E4DD8-0000-0000-0000-000000000000}).3 = ({FE7B9CD5-0000-0000-0000-000000000000}) + ({C14E4DD8-0000-0000-0000-000000000000}).4 = ({E5E729AD-0000-0000-0000-000000000000}) + ({DCF71AE6-0000-0000-0000-000000000000}).0 = ({A45242A2-0000-0000-0000-000000000000}) + ({DCF71AE6-0000-0000-0000-000000000000}).1 = ({2CC71860-0000-0000-0000-000000000000}) + ({DCF71AE6-0000-0000-0000-000000000000}).2 = ({6251A10E-0000-0000-0000-000000000000}) + ({DCF71AE6-0000-0000-0000-000000000000}).3 = ({FE7B9CD5-0000-0000-0000-000000000000}) + ({DCF71AE6-0000-0000-0000-000000000000}).4 = ({E5E729AD-0000-0000-0000-000000000000}) + ({2FC96F92-0000-0000-0000-000000000000}).0 = ({A45242A2-0000-0000-0000-000000000000}) + ({2FC96F92-0000-0000-0000-000000000000}).1 = ({DCF71AE6-0000-0000-0000-000000000000}) + ({61FCCDB3-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({39038E85-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({39038E85-0000-0000-0000-000000000000}).2 = ({2CC71860-0000-0000-0000-000000000000}) + ({39038E85-0000-0000-0000-000000000000}).3 = ({61FCCDB3-0000-0000-0000-000000000000}) + ({DC3698B2-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000}) + ({DC3698B2-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000}) + ({DC3698B2-0000-0000-0000-000000000000}).5 = ({2CC71860-0000-0000-0000-000000000000}) + ({DC3698B2-0000-0000-0000-000000000000}).6 = ({61FCCDB3-0000-0000-0000-000000000000}) + ({DC3698B2-0000-0000-0000-000000000000}).7 = ({F4FF31EB-0000-0000-0000-000000000000}) + ({DC3698B2-0000-0000-0000-000000000000}).8 = ({C9E0F891-0000-0000-0000-000000000000}) + ({BFB5D807-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({BFB5D807-0000-0000-0000-000000000000}).2 = ({CB52B7E7-0000-0000-0000-000000000000}) + ({BFB5D807-0000-0000-0000-000000000000}).3 = ({36B72A9B-0000-0000-0000-000000000000}) + ({BFB5D807-0000-0000-0000-000000000000}).4 = ({586E2916-0000-0000-0000-000000000000}) + ({4806E378-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({4806E378-0000-0000-0000-000000000000}).2 = ({CB52B7E7-0000-0000-0000-000000000000}) + ({4806E378-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000}) + ({4806E378-0000-0000-0000-000000000000}).4 = ({36B72A9B-0000-0000-0000-000000000000}) + ({4806E378-0000-0000-0000-000000000000}).5 = ({2CC71860-0000-0000-0000-000000000000}) + ({DCBA491C-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000}) + ({DCBA491C-0000-0000-0000-000000000000}).5 = ({CB52B7E7-0000-0000-0000-000000000000}) + ({DCBA491C-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000}) + ({DCBA491C-0000-0000-0000-000000000000}).8 = ({2CC71860-0000-0000-0000-000000000000}) + ({DCBA491C-0000-0000-0000-000000000000}).9 = ({61FCCDB3-0000-0000-0000-000000000000}) + ({DCBA491C-0000-0000-0000-000000000000}).10 = ({39038E85-0000-0000-0000-000000000000}) + ({DCBA491C-0000-0000-0000-000000000000}).11 = ({F4FF31EB-0000-0000-0000-000000000000}) + ({DCBA491C-0000-0000-0000-000000000000}).12 = ({C9E0F891-0000-0000-0000-000000000000}) + ({241A8CDD-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000}) + ({241A8CDD-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000}) + ({98C7B681-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({98C7B681-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000}) + ({15B4FEF3-0000-0000-0000-000000000000}).1 = ({F4FF31EB-0000-0000-0000-000000000000}) + ({F4FF31EB-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({F4FF31EB-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000}) + ({90620634-0000-0000-0000-000000000000}).2 = ({F4FF31EB-0000-0000-0000-000000000000}) + ({A6D191D8-0000-0000-0000-000000000000}).1 = ({F4FF31EB-0000-0000-0000-000000000000}) + ({A4691E59-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000}) + ({A4691E59-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000}) + ({43DB702D-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000}) + ({43DB702D-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000}) + ({477B9270-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({477B9270-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).2 = ({CB52B7E7-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).4 = ({2CC71860-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).5 = ({586E2916-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).6 = ({61FCCDB3-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).7 = ({39038E85-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).8 = ({DC3698B2-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).9 = ({BFB5D807-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).10 = ({DCBA491C-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).11 = ({241A8CDD-0000-0000-0000-000000000000}) + ({24B12448-0000-0000-0000-000000000000}).12 = ({F4FF31EB-0000-0000-0000-000000000000}) + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {CB52B7E7-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB52B7E7-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB52B7E7-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB52B7E7-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {A45242A2-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A45242A2-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A45242A2-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A45242A2-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {36B72A9B-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36B72A9B-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36B72A9B-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36B72A9B-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {FD2D303D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD2D303D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD2D303D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD2D303D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {2CC71860-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CC71860-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CC71860-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CC71860-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {6251A10E-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6251A10E-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6251A10E-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6251A10E-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {586E2916-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {586E2916-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {586E2916-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {586E2916-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {E5F1A03B-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5F1A03B-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5F1A03B-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5F1A03B-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {60FCC3A6-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60FCC3A6-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60FCC3A6-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60FCC3A6-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {F22B4FF8-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F22B4FF8-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F22B4FF8-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F22B4FF8-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {FE7B9CD5-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE7B9CD5-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE7B9CD5-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE7B9CD5-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {E5E729AD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5E729AD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5E729AD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5E729AD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {C14E4DD8-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C14E4DD8-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C14E4DD8-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C14E4DD8-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {DCF71AE6-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCF71AE6-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCF71AE6-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCF71AE6-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {2FC96F92-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2FC96F92-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FC96F92-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2FC96F92-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {61FCCDB3-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61FCCDB3-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61FCCDB3-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61FCCDB3-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {39038E85-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39038E85-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39038E85-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39038E85-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {DC3698B2-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC3698B2-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC3698B2-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC3698B2-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {BFB5D807-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BFB5D807-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BFB5D807-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BFB5D807-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {4806E378-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4806E378-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4806E378-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4806E378-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {DCBA491C-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCBA491C-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCBA491C-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCBA491C-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {241A8CDD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {241A8CDD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {241A8CDD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {241A8CDD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {98C7B681-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98C7B681-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98C7B681-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98C7B681-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {15B4FEF3-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15B4FEF3-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15B4FEF3-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {15B4FEF3-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {F4FF31EB-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4FF31EB-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4FF31EB-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4FF31EB-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {90620634-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90620634-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90620634-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90620634-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {A6D191D8-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A6D191D8-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A6D191D8-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A6D191D8-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {A4691E59-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4691E59-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4691E59-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4691E59-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {43DB702D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43DB702D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43DB702D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43DB702D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {477B9270-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {477B9270-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {477B9270-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {477B9270-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {C9E0F891-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9E0F891-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9E0F891-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9E0F891-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {24B12448-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24B12448-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24B12448-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24B12448-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/OpenSim.suo b/OpenSim.suo new file mode 100644 index 0000000000000000000000000000000000000000..28669b6d7fc2ac49dff747e1657f50b9d035c397 GIT binary patch literal 300544 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 ^9@W&kMUwIaTBzd$b|} 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 JU&}t?{{l16h4cUb literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Communications/CommunicationsManager.cs b/OpenSim/Framework/Communications/CommunicationsManager.cs new file mode 100644 index 0000000000..f90e76654b --- /dev/null +++ b/OpenSim/Framework/Communications/CommunicationsManager.cs @@ -0,0 +1,69 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Text; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Data; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework.Communications +{ + + public class CommunicationsManager + { + public IUserServices UserServer; + public IGridServices GridServer; + public IInterRegionCommunications InterRegion; + + public NetworkServersInfo ServersInfo; + public CommunicationsManager(NetworkServersInfo serversInfo) + { + ServersInfo = serversInfo; + } + + #region Packet Handlers + public void HandleUUIDNameRequest(LLUUID uuid, IClientAPI remote_client) + { + Encoding enc = Encoding.ASCII; + UserProfileData profileData = this.UserServer.GetUserProfile(uuid); + if (profileData != null) + { + UUIDNameReplyPacket packet = new UUIDNameReplyPacket(); + packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1]; + packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock(); + packet.UUIDNameBlock[0].ID = profileData.UUID; + packet.UUIDNameBlock[0].FirstName = enc.GetBytes(profileData.username + "\0"); + packet.UUIDNameBlock[0].LastName = enc.GetBytes(profileData.surname +"\0"); + remote_client.OutPacket((Packet)packet); + } + + } + #endregion + } +} diff --git a/OpenSim/Framework/Communications/IGridServices.cs b/OpenSim/Framework/Communications/IGridServices.cs new file mode 100644 index 0000000000..c296209184 --- /dev/null +++ b/OpenSim/Framework/Communications/IGridServices.cs @@ -0,0 +1,43 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System.Collections.Generic; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework.Communications +{ + + + public interface IGridServices + { + RegionCommsListener RegisterRegion(RegionInfo regionInfos); + List RequestNeighbours(RegionInfo regionInfo); + RegionInfo RequestNeighbourInfo(ulong regionHandle); + List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY); + } +} diff --git a/OpenSim/Framework/Communications/IInterRegionCommunications.cs b/OpenSim/Framework/Communications/IInterRegionCommunications.cs new file mode 100644 index 0000000000..55f12ac572 --- /dev/null +++ b/OpenSim/Framework/Communications/IInterRegionCommunications.cs @@ -0,0 +1,38 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework.Communications +{ + public interface IInterRegionCommunications + { + bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData); + bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position); + } +} diff --git a/OpenSim/Framework/Communications/IUserServices.cs b/OpenSim/Framework/Communications/IUserServices.cs new file mode 100644 index 0000000000..0b1f86c39d --- /dev/null +++ b/OpenSim/Framework/Communications/IUserServices.cs @@ -0,0 +1,43 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using OpenSim.Framework.Data; + +namespace OpenSim.Framework.Communications +{ + public interface IUserServices + { + UserProfileData GetUserProfile(string firstName, string lastName); + UserProfileData GetUserProfile(string name); + UserProfileData GetUserProfile(LLUUID avatarID); + + UserProfileData SetupMasterUser(string firstName, string lastName); + UserProfileData SetupMasterUser(string firstName, string lastName, string password); + + } +} diff --git a/OpenSim/Framework/Communications/OpenSim.Framework.Communications.csproj b/OpenSim/Framework/Communications/OpenSim.Framework.Communications.csproj new file mode 100644 index 0000000000..0ee62e9984 --- /dev/null +++ b/OpenSim/Framework/Communications/OpenSim.Framework.Communications.csproj @@ -0,0 +1,112 @@ + + + Local + 8.0.50727 + 2.0 + {CB52B7E7-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Communications + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Communications + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Data + {36B72A9B-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Communications/OpenSim.Framework.Communications.csproj.user b/OpenSim/Framework/Communications/OpenSim.Framework.Communications.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Communications/OpenSim.Framework.Communications.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Communications/Properties/AssemblyInfo.cs b/OpenSim/Framework/Communications/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..09f6473ae4 --- /dev/null +++ b/OpenSim/Framework/Communications/Properties/AssemblyInfo.cs @@ -0,0 +1,60 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenGrid.Framework.Communications")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenGrid.Framework.Communications")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("13e7c396-78a9-4a5c-baf2-6f980ea75d95")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Framework/Communications/obj/Debug/OpenSim.Framework.Communications.dll b/OpenSim/Framework/Communications/obj/Debug/OpenSim.Framework.Communications.dll new file mode 100644 index 0000000000000000000000000000000000000000..92379c8175cb1c7f34b3b8f8396b693c389ba426 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Communications/obj/Debug/OpenSim.Framework.Communications.pdb b/OpenSim/Framework/Communications/obj/Debug/OpenSim.Framework.Communications.pdb new file mode 100644 index 0000000000000000000000000000000000000000..eeec98db2ff4290c29ce6ed1af8e2f1e17c35fc9 GIT binary patch literal 11776 zcmeHNZA@EL7(N#&UmcU;WQYki6WoODwm1fYb6tQTjUcdsqG{sF<#ubJEo+Oo#2?id zW8z2l!yjVQs9W^M{`s*V>Jkzc7B`b6&iGfI#zd3JHvPd81)t}BK-+=3rOpcXWzT)? zJzw{n_dVx5=e}J}NQp(`(O|;a?rN{EclP)?oz1e_U0PDr;S-QN?Vs3)+a#YM6*^hh zRiJ^le*bmBlC`UWO6kS5J9um43-;3u(!KO!Wd=a&#KM9NoS($Sl2xsNx#51#OyN1l zVV{`pJ(BnK$vqEF{q*CPj>8`P+5X0Jk2!+p94G38m@D$0*!ON^_t}wWx{qIM`|9b~ zdsCb?l=JHk#!k=uapujc7l!6a?!0gl((J%GpcGgSuvXyD(ne-Va9A7agc z+_3XXy;#owb6ZUH|9ocsOkSx?EB*hcfsc$Xo18g<4txi0MdAT~^I!}3Rv;fJ031Lu z@OSH;`+_C8qk-GcyQL($(>nA0E%xbC64(8;h=jtJ8iGtvx&Y1(wteNo@xme8Gw%U_ zc`9H@ZfIbBc7B$&d70g5Z}s~o_J_to3Dw^_u10*Ju)i}F2&lf8V*lHLP{VJ zibmoYk3E4%V80rZmADW}t3Pfw6Gby|G!tBGMoDib{V}}M3}+%|423=9%%QijB%2yA z*T3`Io%W5NoszEAKhrYS`p>3CZfsjzWwNN__AR#3m=Ntjzvar~_OAPOSxH1=jQ{34 zSnncWmSxp)QR5i&9f~K^usonXnLv`BHWnI=t4cI7G8PKL`B$-ATAJJ!P)5}Re2122 z_#S!D_sAWAL_lm}y{q%Qk%Srx1{4+5MfLJ!1`dsD*_f*ZqDk0npL>3u`QXv7y`R<= z=Y4YQ!+q>)kLVEhfNdBI$G3s^0EJ3m-Cc&Rx;g0~M|IM!NGhN{G&ObwFkE$T(A)74 z9Oz#4;Dj27MyNYC3RI#n>zd`Oh0{UrhAcy+Hqq{@X{>QWkY0g&P)a`b(TIZaIvsr9 zQavHYW6@w}Ox1M8_l+ZS1K#&6%CRk$uR=WzA+4Tf1bv(wtNc&&B=t`68z1cyu+C-N z(^FF<{27DM^te+`7TbhKG6o=ni@+{0;{xbgvRLfFIkE&XgUuSVy)OV=Ptu~kS$-Oz zG@>5Iv;)j`o4~YPGx#>}FSGN>JHUu@C7s|F@Lk|mFztOG*aJrYl6%4TgP#EJ0>1`E zUh*CAZtxLs8(8mSJ^I-P)FPE}j`iqg7w|AJ1bBeQ0YA{9<+I*zD9drP&y+HqwE4y} zcAxQlBZz1Ds$$nACtk)m(hp|8Oz@1)d)RC-4Y%17yfalyousC%rhDfq84TBaB~Y_U z#PgYQWrk zmg}6kH<)>r{Y_1*9;S^aiyO4>KE&^yFAv{aqB1j!rjuey{Tb)o7ncTe91gB zXim#)*kI-{{b)uyAM@~6s#TU2W7~{>78(7eZdi`Yv#fps%37F2n6Ve53w)I>e4#F7 z+ROEOGdHVDLp%kX0r)#GUj-8H14)3fJH`aeIB#lQY*m~Q_q$bS_RAoVu@&Ii_|QD_{_ z3mS#S;hb9OcRyrVl0zDJMQ)HTcfHif#pDS%`cFP`#ryhqQ{SB3@k2A?DX#8NWYil8 zMujVaI7VDw?g!Msh#Irje-0V)I=jNP%YFW@)_>;O*SDjkEBym~0b?$i{($ppC0{^a QVab210mgSMS-Tqe6L-c-%>V!Z literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Communications/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Framework/Communications/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..1da8503116e6757b687dd1a93baa093a7a52de30 GIT binary patch literal 17744 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Communications/obj/OpenSim.Framework.Communications.csproj.FileList.txt b/OpenSim/Framework/Communications/obj/OpenSim.Framework.Communications.csproj.FileList.txt new file mode 100644 index 0000000000..65487b40bb --- /dev/null +++ b/OpenSim/Framework/Communications/obj/OpenSim.Framework.Communications.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.Communications.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.Communications.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Communications.dll +obj\Debug\OpenSim.Framework.Communications.pdb +..\..\..\bin\OpenSim.Framework.Communications.pdb diff --git a/OpenSim/Framework/Communications/obj/Release/OpenSim.Framework.Communications.dll b/OpenSim/Framework/Communications/obj/Release/OpenSim.Framework.Communications.dll new file mode 100644 index 0000000000000000000000000000000000000000..b9da0a0210bea7dd21515dd9c4d17d38e7e55093 GIT binary patch literal 16384 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 g>71jgbkYq~xgbYXxiB|W configurationMembers = new List(); + + public ConfigurationManager() + { + } + + public void addConfigurationMember(ConfigurationMember configMember) + { + if (!configurationMembers.Contains(configMember)) + { + configurationMembers.Add(configMember); + } + } + + public void gatherConfiguration() + { + foreach (ConfigurationMember configMember in configurationMembers) + { + if (configMember.configurationFilename.Trim() != "") + { + XmlConfiguration xmlConfig = new XmlConfiguration(configMember.configurationFilename); + xmlConfig.LoadData(); + string attribute = ""; + foreach (ConfigurationOption configOption in configMember.configurationOptions) + { + attribute = xmlConfig.GetAttribute(configOption.configurationKey); + if (attribute == "") + { + if (configMember.configurationDescription.Trim() != "") + { + attribute = MainLog.Instance.CmdPrompt(configMember.configurationDescription + ": " + configOption.configurationQuestion, configOption.configurationDefault); + } + else + { + attribute = MainLog.Instance.CmdPrompt(configMember.configurationDescription + ": " + configOption.configurationQuestion, configOption.configurationDefault); + } + xmlConfig.SetAttribute(configOption.configurationKey, attribute); + } + configMember.handleConfigurationItem(configOption.configurationKey, attribute); + } + xmlConfig.Commit(); + xmlConfig.Close(); + } + else + { + //Error out, no filename specified + } + } + } + + public void clearConfigurationMembers() + { + configurationMembers.Clear(); + } + } +} diff --git a/OpenSim/Framework/Configuration/ConfigurationMember.cs b/OpenSim/Framework/Configuration/ConfigurationMember.cs new file mode 100644 index 0000000000..03ec3a6775 --- /dev/null +++ b/OpenSim/Framework/Configuration/ConfigurationMember.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Configuration +{ + public abstract class ConfigurationMember + { + public List configurationOptions = new List(); + public string configurationFilename = ""; + public string configurationDescription = ""; + public abstract void handleConfigurationItem(string configuration_key, string configuration_value); + + + public void setConfigurationFilename(string filename) + { + configurationFilename = filename; + } + public void setConfigurationDescription(string desc) + { + configurationDescription = desc; + } + public void addConfigurationOption(string configuration_key, string configuration_question, string configuration_default) + { + ConfigurationOption configOption = new ConfigurationOption(); + configOption.configurationKey = configuration_key; + configOption.configurationQuestion = configuration_question; + configOption.configurationDefault = configuration_default; + + if (configuration_key != "" && configuration_question != "") + { + if (!configurationOptions.Contains(configOption)) + { + configurationOptions.Add(configOption); + } + } + else + { + //Can't add it, error out. + } + } + } +} diff --git a/OpenSim/Framework/Configuration/ConfigurationOption.cs b/OpenSim/Framework/Configuration/ConfigurationOption.cs new file mode 100644 index 0000000000..8cf7aee562 --- /dev/null +++ b/OpenSim/Framework/Configuration/ConfigurationOption.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Configuration +{ + public class ConfigurationOption + { + public string configurationKey = ""; + public string configurationQuestion = ""; + public string configurationDefault = ""; + } +} diff --git a/OpenSim/Framework/Configuration/OpenSim.Framework.Configuration.csproj b/OpenSim/Framework/Configuration/OpenSim.Framework.Configuration.csproj new file mode 100644 index 0000000000..aafee76aed --- /dev/null +++ b/OpenSim/Framework/Configuration/OpenSim.Framework.Configuration.csproj @@ -0,0 +1,105 @@ + + + Local + 8.0.50727 + 2.0 + {A45242A2-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Configuration + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Configuration + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Configuration/OpenSim.Framework.Configuration.csproj.user b/OpenSim/Framework/Configuration/OpenSim.Framework.Configuration.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Configuration/OpenSim.Framework.Configuration.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Configuration/OpenSim.Framework.GenericConfig.csproj b/OpenSim/Framework/Configuration/OpenSim.Framework.GenericConfig.csproj new file mode 100644 index 0000000000..384252f944 --- /dev/null +++ b/OpenSim/Framework/Configuration/OpenSim.Framework.GenericConfig.csproj @@ -0,0 +1,90 @@ + + + Local + 8.0.50727 + 2.0 + {752716E0-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.GenericConfig + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.GenericConfig + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Configuration/OpenSim.Framework.GenericConfig.csproj.user b/OpenSim/Framework/Configuration/OpenSim.Framework.GenericConfig.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Configuration/OpenSim.Framework.GenericConfig.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Configuration/XmlConfiguration.cs b/OpenSim/Framework/Configuration/XmlConfiguration.cs new file mode 100644 index 0000000000..135b8b7be7 --- /dev/null +++ b/OpenSim/Framework/Configuration/XmlConfiguration.cs @@ -0,0 +1,121 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.IO; +using System.Xml; + +namespace OpenSim.Framework.Configuration +{ + public class XmlConfiguration + { + private XmlDocument doc; + private XmlNode rootNode; + private XmlNode configNode; + private string fileName; + private bool createdFile = false; + + public XmlConfiguration(string filename) + { + fileName = filename; + } + + public void LoadData() + { + doc = new XmlDocument(); + + if (File.Exists(fileName)) + { + XmlTextReader reader = new XmlTextReader(fileName); + reader.WhitespaceHandling = WhitespaceHandling.None; + doc.Load(reader); + reader.Close(); + } + else + { + createdFile = true; + rootNode = doc.CreateNode(XmlNodeType.Element, "Root", ""); + doc.AppendChild(rootNode); + configNode = doc.CreateNode(XmlNodeType.Element, "Config", ""); + rootNode.AppendChild(configNode); + } + + + rootNode = doc.FirstChild; + if (rootNode.Name != "Root") + throw new Exception("Error: Invalid .xml File. Missing "); + + configNode = rootNode.FirstChild; + if (configNode.Name != "Config") + throw new Exception("Error: Invalid .xml File. first child should be "); + + if (createdFile) + { + this.Commit(); + } + } + + public string GetAttribute(string attributeName) + { + string result = ""; + if (configNode.Attributes[attributeName] != null) + { + result = ((XmlAttribute)configNode.Attributes.GetNamedItem(attributeName)).Value; + } + return result; + } + + public bool SetAttribute(string attributeName, string attributeValue) + { + if (configNode.Attributes[attributeName] != null) + { + ((XmlAttribute)configNode.Attributes.GetNamedItem(attributeName)).Value = attributeValue; + } + else + { + XmlAttribute attri; + attri = doc.CreateAttribute(attributeName); + attri.Value = attributeValue; + configNode.Attributes.Append(attri); + } + return true; + } + + public void Commit() + { + doc.Save(fileName); + } + + public void Close() + { + configNode = null; + rootNode = null; + doc = null; + } + + } +} diff --git a/OpenSim/Framework/Configuration/obj/Debug/OpenSim.Framework.Configuration.dll b/OpenSim/Framework/Configuration/obj/Debug/OpenSim.Framework.Configuration.dll new file mode 100644 index 0000000000000000000000000000000000000000..58741133f7e36a050a5b2a71e1eff73cbfe53822 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Configuration/obj/OpenSim.Framework.Configuration.csproj.FileList.txt b/OpenSim/Framework/Configuration/obj/OpenSim.Framework.Configuration.csproj.FileList.txt new file mode 100644 index 0000000000..0596621604 --- /dev/null +++ b/OpenSim/Framework/Configuration/obj/OpenSim.Framework.Configuration.csproj.FileList.txt @@ -0,0 +1,7 @@ +obj\Release\ResolveAssemblyReference.cache +..\..\..\bin\OpenSim.Framework.Configuration.dll +obj\Release\OpenSim.Framework.Configuration.dll +..\..\..\bin\OpenSim.Framework.Configuration.pdb +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Configuration.dll +obj\Debug\OpenSim.Framework.Configuration.pdb diff --git a/OpenSim/Framework/Configuration/obj/Release/OpenSim.Framework.Configuration.dll b/OpenSim/Framework/Configuration/obj/Release/OpenSim.Framework.Configuration.dll new file mode 100644 index 0000000000000000000000000000000000000000..577e36e43c41f63439f3111f3353da634fc4e98e GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Console/AssemblyInfo.cs b/OpenSim/Framework/Console/AssemblyInfo.cs new file mode 100644 index 0000000000..30f61673a5 --- /dev/null +++ b/OpenSim/Framework/Console/AssemblyInfo.cs @@ -0,0 +1,56 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("ServerConsole")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ServerConsole")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] diff --git a/OpenSim/Framework/Console/ConsoleCallbacksBase.cs b/OpenSim/Framework/Console/ConsoleCallbacksBase.cs new file mode 100644 index 0000000000..346cfe6cd3 --- /dev/null +++ b/OpenSim/Framework/Console/ConsoleCallbacksBase.cs @@ -0,0 +1,35 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Framework.Console +{ + public interface conscmd_callback + { + void RunCmd(string cmd, string[] cmdparams); + void Show(string ShowWhat); + } +} diff --git a/OpenSim/Framework/Console/LogBase.cs b/OpenSim/Framework/Console/LogBase.cs new file mode 100644 index 0000000000..f73e15e1b6 --- /dev/null +++ b/OpenSim/Framework/Console/LogBase.cs @@ -0,0 +1,282 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.IO; +using System.Net; + +namespace OpenSim.Framework.Console +{ + public enum LogPriority : int + { + CRITICAL, + HIGH, + MEDIUM, + NORMAL, + LOW, + VERBOSE, + EXTRAVERBOSE + } + + public class LogBase + { + StreamWriter Log; + public conscmd_callback cmdparser; + public string componentname; + private bool m_silent; + + public LogBase(string LogFile, string componentname, conscmd_callback cmdparser, bool silent) + { + this.componentname = componentname; + this.cmdparser = cmdparser; + this.m_silent = silent; + System.Console.WriteLine("ServerConsole.cs - creating new local console"); + + if (String.IsNullOrEmpty(LogFile)) + { + LogFile = componentname + ".log"; + } + + System.Console.WriteLine("Logs will be saved to current directory in " + LogFile); + Log = File.AppendText(LogFile); + Log.WriteLine("========================================================================"); + Log.WriteLine(componentname + " Started at " + DateTime.Now.ToString()); + } + + public void Close() + { + Log.WriteLine("Shutdown at " + DateTime.Now.ToString()); + Log.Close(); + } + + public void Write(string format, params object[] args) + { + Notice(format, args); + return; + } + + public void WriteLine(LogPriority importance, string format, params object[] args) + { + Log.WriteLine(format, args); + Log.Flush(); + if (!m_silent) + { + System.Console.WriteLine(format, args); + } + return; + } + + public void Warn(string format, params object[] args) + { + WriteNewLine(ConsoleColor.Yellow, format, args); + return; + } + + public void Notice(string format, params object[] args) + { + WriteNewLine(ConsoleColor.White, format, args); + return; + } + + public void Error(string format, params object[] args) + { + WriteNewLine(ConsoleColor.Red, format, args); + return; + } + + public void Verbose(string format, params object[] args) + { + WriteNewLine(ConsoleColor.Gray, format, args); + return; + } + + public void Status(string format, params object[] args) + { + WriteNewLine(ConsoleColor.Blue, format, args); + return; + } + + private void WriteNewLine(ConsoleColor color, string format, params object[] args) + { + Log.WriteLine(format, args); + Log.Flush(); + if (!m_silent) + { + try + { + System.Console.ForegroundColor = color; + System.Console.WriteLine(format, args); + System.Console.ResetColor(); + } + catch (ArgumentNullException) + { + // Some older systems dont support coloured text. + System.Console.WriteLine(format, args); + } + } + return; + } + + public string ReadLine() + { + string TempStr = System.Console.ReadLine(); + Log.WriteLine(TempStr); + return TempStr; + } + + public int Read() + { + int TempInt = System.Console.Read(); + Log.Write((char)TempInt); + return TempInt; + } + + public IPAddress CmdPromptIPAddress(string prompt, string defaultvalue) + { + IPAddress address; + string addressStr; + + while (true) + { + addressStr = MainLog.Instance.CmdPrompt(prompt, defaultvalue); + if (IPAddress.TryParse(addressStr, out address)) + { + break; + } + else + { + MainLog.Instance.Error("Illegal address. Please re-enter."); + } + } + + return address; + } + + public int CmdPromptIPPort(string prompt, string defaultvalue) + { + int port; + string portStr; + + while (true) + { + portStr = MainLog.Instance.CmdPrompt(prompt, defaultvalue); + if (int.TryParse(portStr, out port)) + { + if (port >= IPEndPoint.MinPort && port <= IPEndPoint.MaxPort) + { + break; + } + } + + MainLog.Instance.Error("Illegal address. Please re-enter."); + } + + return port; + } + + // Displays a prompt and waits for the user to enter a string, then returns that string + // Done with no echo and suitable for passwords + public string PasswdPrompt(string prompt) + { + // FIXME: Needs to be better abstracted + Log.WriteLine(prompt); + this.Write(prompt); + ConsoleColor oldfg = System.Console.ForegroundColor; + System.Console.ForegroundColor = System.Console.BackgroundColor; + string temp = System.Console.ReadLine(); + System.Console.ForegroundColor = oldfg; + return temp; + } + + // Displays a command prompt and waits for the user to enter a string, then returns that string + public string CmdPrompt(string prompt) + { + this.Write(String.Format("{0}: ", prompt)); + return this.ReadLine(); + } + + // Displays a command prompt and returns a default value if the user simply presses enter + public string CmdPrompt(string prompt, string defaultresponse) + { + string temp = CmdPrompt(String.Format("{0} [{1}]", prompt, defaultresponse)); + if (temp == "") + { + return defaultresponse; + } + else + { + return temp; + } + } + + // Displays a command prompt and returns a default value, user may only enter 1 of 2 options + public string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB) + { + bool itisdone = false; + string temp = CmdPrompt(prompt, defaultresponse); + while (itisdone == false) + { + if ((temp == OptionA) || (temp == OptionB)) + { + itisdone = true; + } + else + { + Notice("Valid options are " + OptionA + " or " + OptionB); + temp = CmdPrompt(prompt, defaultresponse); + } + } + return temp; + } + + // Runs a command with a number of parameters + public Object RunCmd(string Cmd, string[] cmdparams) + { + cmdparser.RunCmd(Cmd, cmdparams); + return null; + } + + // Shows data about something + public void ShowCommands(string ShowWhat) + { + cmdparser.Show(ShowWhat); + } + + public void MainLogPrompt() + { + string[] tempstrarray; + string tempstr = this.CmdPrompt(this.componentname + "# "); + tempstrarray = tempstr.Split(' '); + string cmd = tempstrarray[0]; + Array.Reverse(tempstrarray); + Array.Resize(ref tempstrarray, tempstrarray.Length - 1); + Array.Reverse(tempstrarray); + string[] cmdparams = (string[])tempstrarray; + RunCmd(cmd, cmdparams); + } + } +} diff --git a/OpenSim/Framework/Console/MainLog.cs b/OpenSim/Framework/Console/MainLog.cs new file mode 100644 index 0000000000..7d526225f9 --- /dev/null +++ b/OpenSim/Framework/Console/MainLog.cs @@ -0,0 +1,47 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Framework.Console +{ + public class MainLog { + + private static LogBase instance; + + public static LogBase Instance + { + get + { + return instance; + } + set + { + instance = value; + } + } + } + +} diff --git a/OpenSim/Framework/Console/OpenSim.Framework.Console.csproj b/OpenSim/Framework/Console/OpenSim.Framework.Console.csproj new file mode 100644 index 0000000000..c02a5066dc --- /dev/null +++ b/OpenSim/Framework/Console/OpenSim.Framework.Console.csproj @@ -0,0 +1,89 @@ + + + Local + 8.0.50727 + 2.0 + {A7CD0630-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Console + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Console + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + + + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Console/OpenSim.Framework.Console.csproj.user b/OpenSim/Framework/Console/OpenSim.Framework.Console.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Console/OpenSim.Framework.Console.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Console/obj/Debug/OpenSim.Framework.Console.dll b/OpenSim/Framework/Console/obj/Debug/OpenSim.Framework.Console.dll new file mode 100644 index 0000000000000000000000000000000000000000..1ef17e4b717fea45402ce2b6407f105dc2e788fd GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Console/obj/Debug/OpenSim.Framework.Console.pdb b/OpenSim/Framework/Console/obj/Debug/OpenSim.Framework.Console.pdb new file mode 100644 index 0000000000000000000000000000000000000000..69fe8fa641ab9902ad9eb6ab73aa66cdb8788650 GIT binary patch literal 22016 zcmeI3eUR1FdB@LhS+2ZC5D*Z|ii^Bv_b!525X-_Mg5_m#F}{QmmfZz5?(QY`u0dzC zy)`6pQti+NJD6%?8x!qFS~H=oMoe(RD9w=OMdHwxKWrpznn@yBo1qCxKi~6m@9*Bd zi_2!iOz<9f_WL{MdCtr8oO7P@JLlZr+K$$ADwEpQQ`K18ICpN<+UAv2AFfFzM~|4Y zqS+8CjER7`&=JK6a~zcaUH}$&V7M_`PMs--_o)SvZ=E^wh4-oMWwp4=Fs{tR{YiB>wo`||NhS(jNP-;#YaB& z>D$L{du8kkEc&O0t$tz4m%AIj+jjq&e>l1P*dL{zd_==WVeZM@B4`-IGGj(TqoFa-2O#Ag3yp&=fyP4&?IOwGzGd0nhH&WJ_ub7 zRY6xk<%$mpa%M7_9y;`~Si2ne$uTcsYDRKo=|jz0fW2?i=sEq4T|$ zq-f*fP0e?0@96C4Y2UPdXM1;ZN7ts6>6WhcU8(e)n;KKynN(-{rZuVU%Ud$-HLV$A zS{HB1gd8byWXQ2Cm!s9^=uBT~q3inT2r-BhD0`d3328K^}WwBt~i54AxLD?+#$ zlBPoyDF<(X%YKxM_Vaw>(ub~I^39hcS?F8>$HPXhL;1AlQ;@}HK`Q&5x+r}s&*};F zhrA>1(&W zy87UZ;T6w6ePE07tu-s`*sCN{W%RX5)x|l4t?MnGmq3v%GqUF!MAa6P)B|CLF?=aOOI!#PnbLNnLDy=jh{mrR|;QnVE;;14|WdK zwDzRZI-hg>{w(Q1R{RmBdhE^3_hfq7yEx;^J=d&WuQR`Vd|i7F=XY+5kS{()7KAY( zzRE1(C&jNL-Oc@e%wc5XV@UH%d4tY-RSDt44(wlSl8|1O)!3QJ;4q}~Dblu(DA~Xd zdN5q$df0Y`vEDylGtQomhQ0~yJLTJ_bJGxp(!N)TSk^6R-q!l-&z`a4In<&4SDBA` zr>`|P1UfzOI+1)GYdX5U9Zr+DgFKQCGQkd%9k)ZSKb_6{(O*$%J6H!veL6P|0pFOI zKwDfJThiSy`e*AxI|N&|(RhV;9r)Qqb*N)qs;8s1{Wq%PNQpXFClXhOI<8NrHOB^` zN9fO_cbGb74}o{H#PU$bN7~a{?Wi7DJ;7dkeLZn|u?{4fLOsnrEj@Q-2Bb?^*OxHZ z6*f4qe_4|gn?oIT{I6@@<%Xx7r~7EvF!Cu+kQ==5>FzP;M*B_>Y<}9eQ+E|1FlQ6b zgm&K4-qIFpV*~O>Ajt=r;PYsHd=BN-%_-hz=K02KZ139H+>`b`ZQ%3kS?lH9Jxgdm z<0tX$c>7_<4{Al&4e3rM@I%{C>8x$f^Ih9lclQjq?TfwtI^?%}D?`IU#$@8hq3w-b zZB6M^*Up~RP0QNa((Rdy)#D&KJV;*U3$oHf?hsZv0TymK4Jg*FKO;t9QU6B_Ja_Xhkoa&hi@wy&r^d32ppIA8lMi``(5mA7sK@A-QB5 zL;n=|fq76H{;uh4aky!948oHYE8V6WUL5pZdwq6!CNV zg+9#lDZi&9)0Wa(T7C@1`RA^G;T#L={t>Ug?&?F}Iq}J$|4nywGYswAnuqLONV0(+ z+D>vw-3L1Uf)7~WUzX$VCH$r!u`jf*c}HqjW2&pGrMoRdy9V;E73$jPU$Slwh5-5P zLgL9#mp{sM>yH}`^|Y^we99B#WE0kP{XQaYliWUHx}URoz8lY(o^(q(-Exnr4}PbF z41M9&wK%VpK2p6JXGQ5dTR6m(Z3fyGZ;|&nq!95h>=Rj!%u$=ipa@jfHYEbRI(bliJuZJcVl=mup*^B5h%pslkppVL% z4vo*1w+G(qkje|bSowBC3eCQ}jiBs)GpKhuY?qx5%FZ*uTZmr;-U`-$yeDL3CB|>I z4*V$S>Yr`(8ExMTgAMCR8&l9O+0E_SqTF69uIC+;C%bJ1rQa4%)2t;|&vm`Zb9=PX z<+b_paE!LRZN5C#YTxc9y~=a@vC`#z%$IkkFR#;=*Oe=8aj){+-YdcqF2wca#lY(O zaS(rP(xCdEG3(oRZLjj&9;z`n=dIM$vep6Zy>CeE6z|Voa3z)s&B=BL-wN3LtK4z*>{4IDY+wGqsKVu5Z z-bY@Q{RpVCKM$&3{sNo~J_@?B>nQiCg0hdpcYB)1?r(_NbK;|VAmF!b*|O~r;!hCQ znEVo`1?bD*G*J91@JZrVfKP!}f=`3h;C^s1_!aP4@NYr&@fSh-vCZEAK0|y3_*GDC zR&YLcJ@#K_^PUt>p8zJ4xK_RU*4@5nnxfLJx!k)Fayk{hlK({k{%L zzvscYeg}z5zZbwdpKk&94dM&IZ-QEDUIgpGZ-E+vhe7i5A9fj?O6ydfbwn89B_Mz$nGzQ z8rfL=ukbIFr9SvqP(Ao>pxW^7psT~p2|a5*NH_QXpI@(rlNNM)&6oEd;CRx11ZphG z=JGqQ6Q2p50Ox}L1r-ys5U8m4)`{4we5dF^}{d08qZf7PZ8Jn`#-P={1tc` z_-pWXkovP91>Xd>fGW2Ye24gU@Lka9sQy!r1|65!XE)|%*m0%=7hlgfTxy@)xRW)N zuduJ(`+J0}3-P|Lh@3r!fLbHCKg(VM4h3C%Y6{9zYux*IehrfyWdnubzPu5j>^U-5 z&Q-ZS+C#c~e~#?CwDQTbXdEew@nu{LP9n~sgMDuq2WsqJ0&48D{$+0fc_*=RdLk&> zUkb|hlR&4#Ds-rY=0JMa(Yz2Yf~sx1=wEv`r?H`czcf3bd!fBPeh54U{S4AQ<5VaK zt%9~dcS8?CPe2EuW6;l_O6GkPR1Y;lI)lF#+6z4keGfVb4a1Pt&=P1P)Cui|9)%7- zN1+qYX=oCisPp1A&;j!PoO<|gZiXlPIV8N#;}ys#{wdF&Mnv&9eR_wNd)VVWp8tZ! z89rYf^(o(QA7`A{_;bFT$(~>5)7Sd=-}rJjc)7p#`M>Yu_%B<|eLntU&wtEgm&fZo zstuxr9vAt1Exul@5#oQz#~<=2U$68RJ-*}1d)Vji@VMH`5B2dM`uKOeyg@HmgslBr z{3r7Ki;EetxXbSo6d_Lt4LnZ|5!d8=j3@o3cgpbEH+Ryma{sf}#D18-Bm)1%GbP?Q*p7L>0+TxrfC9m{ARRr}e4+9s*K=11WBQih$qv^X~#i;Rjr zhsU#7CCC(DgQ>Fdl5J28TBE9=B&79m6|@oB0(C-q584gwfgXjPf(}53prg=n=mc~U zIt}R^Mti#|XdYA#t$=nwJx~_XI&_`iYtO~dRA`EsF_z+O zy%nbLhcy$;>=-Y3jehb`w@B~iE)VX=M8^G)AjrBjC!1tp4zj1Lth;~@vM$ZbF38JD zhse0g@F45byetlWqHlxluf43jkqh!J-OFE-FZ*$HM&4d92U(ZqW!V^nvMa4$_ZP*q zKghduFJGT8dxw>Gm%c&PrFmIw7s}SU9hv;)ZIE~AUcMzSzW~EV#$Uq5+TzlkeCSK{ zK}FFId_wt-=j7{Xd&qOh<|+4o@^`rZ`|_J~ZSLJb&*gAoS|GVKKcDrx3GWwkKd1;k z!126~Y0di>{f;3r`5!j~d6(|x+w%TS7w1ks?;Bm3mu=Vks#_~`KOe;}t;6L#T@mVW zGCuD%eHZHT>Q1{LufOmP`5fQnt7E|pK23MQktw_+4tX5U=c&uvKzFRMx^iuE>0W+* zUS9W|rQ}_@muDReeqZ;8rQ}_@muD@^$@4OSjol?&%vQRKi;S0NJq$V@wdsYIVnJue z^LbbkLmu5>MW*m_E97xJp9kM~t2Xe2VO9^`KOUb;@3`PUGpNaZW>DilGpO;O8JGnN zmo2;|Sx?;x?n}h@w}>v?{T*T7bM(9qVwpE5_g~qMy1X8yZvKK~{h}mm?uWi!^Jb(Q zC<14ty@JYCI_mWb;=KxCqFzC~*CB>OuOOc8MRa~r9K@?W3s3hIedSvY&v!vVu_{yh zzg@%YB3^NH*ZjaJGxH^#ZyYE70EzR!yP*&!@-W#(esL(Iy;q+U_y6OsO<|U~Fu46c zyjTCPdj9f$)YVu2yEb0P{oiz!aicpSopTfijT`M1rW7-Xi>Et{%lhEyPGV&rJe}v? z)(3AlyoNq_hv8NC!P9wiUvo|8yE?Bb4$?tqofC=~#KqIOWnXhm=aD+6Ee^`3y)bjk z2E{|rv%Uui12xX8;H`YLO^EDVRUUn#Hw?WLG=Bq1RxQ*&1(vAy{G^MeOLrJLXSUuh zl=n;G`=MJsQKdmOE!FmnReH#=s?F)v+HD=3?U~yCeXAAw8mu;Rj(NNC-+Ad4PN%)n zwH8vi15%5$1yxI@L&5z^1Ia62IRp#L;9(LJ`adHx5sLeN7HP*Z^(ZF2_K#W@+CYs7 zl@Y9cCC}B6EFB*s8fUy_*fmjWk>-!~9_p!aknRe`Lz;71V=jf%F0D0GY5mDmQ0K89 zgf54wpevwq7`O#`ebRZ(A82yt!L*mBN6x4_<-y6EJp zhgNFk_+00-&$ezpdc!yV`qwA^apcs$`#fp2oRHnQx_ev7)OPbBaK>1dy@MaK^9?~~ zs`XBnQ1<_W-ZST?K>6Sm(0lp+Qodi)S?hxQzffyH@c%P;)*2w6&oW_GUG0Z{Q{Nx_ bzSaQwey#9YTgqWz7MMM-Y~@@Rhz0&10*?Ll literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Console/obj/OpenSim.Framework.Console.csproj.FileList.txt b/OpenSim/Framework/Console/obj/OpenSim.Framework.Console.csproj.FileList.txt new file mode 100644 index 0000000000..89bfae73a1 --- /dev/null +++ b/OpenSim/Framework/Console/obj/OpenSim.Framework.Console.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.Console.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.Console.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Console.dll +obj\Debug\OpenSim.Framework.Console.pdb +..\..\..\bin\OpenSim.Framework.Console.pdb diff --git a/OpenSim/Framework/Console/obj/Release/OpenSim.Framework.Console.dll b/OpenSim/Framework/Console/obj/Release/OpenSim.Framework.Console.dll new file mode 100644 index 0000000000000000000000000000000000000000..48bd8c8d987487f695dda0840aa4fd2d4f2f6f45 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.DB4o/DB4oGridData.cs b/OpenSim/Framework/Data.DB4o/DB4oGridData.cs new file mode 100644 index 0000000000..5fec367173 --- /dev/null +++ b/OpenSim/Framework/Data.DB4o/DB4oGridData.cs @@ -0,0 +1,162 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using libsecondlife; + +namespace OpenSim.Framework.Data.DB4o +{ + /// + /// A grid server storage mechanism employing the DB4o database system + /// + class DB4oGridData : IGridData + { + /// + /// The database manager object + /// + DB4oGridManager manager; + + /// + /// Called when the plugin is first loaded (as constructors are not called) + /// + public void Initialise() { + manager = new DB4oGridManager("gridserver.yap"); + } + + /// + /// Returns a list of regions within the specified ranges + /// + /// minimum X coordinate + /// minimum Y coordinate + /// maximum X coordinate + /// maximum Y coordinate + /// An array of region profiles + public SimProfileData[] GetProfilesInRange(uint a, uint b, uint c, uint d) + { + return null; + } + + /// + /// Returns a region located at the specified regionHandle (warning multiple regions may occupy the one spot, first found is returned) + /// + /// The handle to search for + /// A region profile + public SimProfileData GetProfileByHandle(ulong handle) { + lock (manager.simProfiles) + { + foreach (LLUUID UUID in manager.simProfiles.Keys) + { + if (manager.simProfiles[UUID].regionHandle == handle) + { + return manager.simProfiles[UUID]; + } + } + } + throw new Exception("Unable to find profile with handle (" + handle.ToString() + ")"); + } + + /// + /// Returns a specific region + /// + /// The region ID code + /// A region profile + public SimProfileData GetProfileByLLUUID(LLUUID uuid) + { + lock (manager.simProfiles) + { + if (manager.simProfiles.ContainsKey(uuid)) + return manager.simProfiles[uuid]; + } + throw new Exception("Unable to find profile with UUID (" + uuid.ToStringHyphenated() + "). Total Registered Regions: " + manager.simProfiles.Count); + } + + /// + /// Adds a new specified region to the database + /// + /// The profile to add + /// A dataresponse enum indicating success + public DataResponse AddProfile(SimProfileData profile) + { + lock (manager.simProfiles) + { + if (manager.AddRow(profile)) + { + return DataResponse.RESPONSE_OK; + } + else + { + return DataResponse.RESPONSE_ERROR; + } + } + } + + /// + /// Authenticates a new region using the shared secrets. NOT SECURE. + /// + /// The UUID the region is authenticating with + /// The location the region is logging into (unused in Db4o) + /// The shared secret + /// Authenticated? + public bool AuthenticateSim(LLUUID uuid, ulong handle, string key) { + if (manager.simProfiles[uuid].regionRecvKey == key) + return true; + return false; + } + + /// + /// Shuts down the database + /// + public void Close() + { + manager = null; + } + + /// + /// Returns the providers name + /// + /// The name of the storage system + public string getName() + { + return "DB4o Grid Provider"; + } + + /// + /// Returns the providers version + /// + /// The version of the storage system + public string getVersion() + { + return "0.1"; + } + + public ReservationData GetReservationAtPoint(uint x, uint y) + { + return null; + } + } +} diff --git a/OpenSim/Framework/Data.DB4o/DB4oManager.cs b/OpenSim/Framework/Data.DB4o/DB4oManager.cs new file mode 100644 index 0000000000..0df6350e26 --- /dev/null +++ b/OpenSim/Framework/Data.DB4o/DB4oManager.cs @@ -0,0 +1,163 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using Db4objects.Db4o; +using libsecondlife; + +namespace OpenSim.Framework.Data.DB4o +{ + /// + /// A Database manager for Db4o + /// + class DB4oGridManager + { + /// + /// A list of the current regions connected (in-memory cache) + /// + public Dictionary simProfiles = new Dictionary(); + /// + /// Database File Name + /// + string dbfl; + + /// + /// Creates a new grid storage manager + /// + /// Filename to the database file + public DB4oGridManager(string db4odb) + { + dbfl = db4odb; + IObjectContainer database; + database = Db4oFactory.OpenFile(dbfl); + IObjectSet result = database.Get(typeof(SimProfileData)); + // Loads the file into the in-memory cache + foreach(SimProfileData row in result) { + simProfiles.Add(row.UUID, row); + } + database.Close(); + } + + /// + /// Adds a new profile to the database (Warning: Probably slow.) + /// + /// The profile to add + /// Successful? + public bool AddRow(SimProfileData row) + { + if (simProfiles.ContainsKey(row.UUID)) + { + simProfiles[row.UUID] = row; + } + else + { + simProfiles.Add(row.UUID, row); + } + + try + { + IObjectContainer database; + database = Db4oFactory.OpenFile(dbfl); + database.Set(row); + database.Close(); + return true; + } + catch (Exception) + { + return false; + } + } + + + } + + /// + /// A manager for the DB4o database (user profiles) + /// + class DB4oUserManager + { + /// + /// A list of the user profiles (in memory cache) + /// + public Dictionary userProfiles = new Dictionary(); + /// + /// Database filename + /// + string dbfl; + + /// + /// Initialises a new DB manager + /// + /// The filename to the database + public DB4oUserManager(string db4odb) + { + dbfl = db4odb; + IObjectContainer database; + database = Db4oFactory.OpenFile(dbfl); + // Load to cache + IObjectSet result = database.Get(typeof(UserProfileData)); + foreach (UserProfileData row in result) + { + userProfiles.Add(row.UUID, row); + } + database.Close(); + } + + /// + /// Adds a new profile to the database (Warning: Probably slow.) + /// + /// The profile to add + /// Successful? + public bool AddRow(UserProfileData row) + { + if (userProfiles.ContainsKey(row.UUID)) + { + userProfiles[row.UUID] = row; + } + else + { + userProfiles.Add(row.UUID, row); + } + + try + { + IObjectContainer database; + database = Db4oFactory.OpenFile(dbfl); + database.Set(row); + database.Close(); + return true; + } + catch (Exception) + { + return false; + } + } + + + } +} diff --git a/OpenSim/Framework/Data.DB4o/DB4oUserData.cs b/OpenSim/Framework/Data.DB4o/DB4oUserData.cs new file mode 100644 index 0000000000..2e33ab0f43 --- /dev/null +++ b/OpenSim/Framework/Data.DB4o/DB4oUserData.cs @@ -0,0 +1,202 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using libsecondlife; + +namespace OpenSim.Framework.Data.DB4o +{ + /// + /// A User storage interface for the DB4o database system + /// + public class DB4oUserData : IUserData + { + /// + /// The database manager + /// + DB4oUserManager manager; + + /// + /// Artificial constructor called upon plugin load + /// + public void Initialise() + { + manager = new DB4oUserManager("userprofiles.yap"); + } + + /// + /// Loads a specified user profile from a UUID + /// + /// The users UUID + /// A user profile + public UserProfileData getUserByUUID(LLUUID uuid) + { + if(manager.userProfiles.ContainsKey(uuid)) + return manager.userProfiles[uuid]; + return null; + } + + /// + /// Returns a user by searching for its name + /// + /// The users account name + /// A matching users profile + public UserProfileData getUserByName(string name) + { + return getUserByName(name.Split(' ')[0], name.Split(' ')[1]); + } + + /// + /// Returns a user by searching for its name + /// + /// The first part of the users account name + /// The second part of the users account name + /// A matching users profile + public UserProfileData getUserByName(string fname, string lname) + { + foreach (UserProfileData profile in manager.userProfiles.Values) + { + if (profile.username == fname && profile.surname == lname) + return profile; + } + return null; + } + + /// + /// Returns a user by UUID direct + /// + /// The users account ID + /// A matching users profile + public UserAgentData getAgentByUUID(LLUUID uuid) + { + try + { + return getUserByUUID(uuid).currentAgent; + } + catch (Exception) + { + return null; + } + } + + /// + /// Returns a session by account name + /// + /// The account name + /// The users session agent + public UserAgentData getAgentByName(string name) + { + return getAgentByName(name.Split(' ')[0], name.Split(' ')[1]); + } + + /// + /// Returns a session by account name + /// + /// The first part of the users account name + /// The second part of the users account name + /// A user agent + public UserAgentData getAgentByName(string fname, string lname) + { + try + { + return getUserByName(fname,lname).currentAgent; + } + catch (Exception) + { + return null; + } + } + + /// + /// Creates a new user profile + /// + /// The profile to add to the database + public void addNewUserProfile(UserProfileData user) + { + try + { + manager.AddRow(user); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + /// + /// Creates a new user agent + /// + /// The agent to add to the database + public void addNewUserAgent(UserAgentData agent) + { + // Do nothing. yet. + } + + /// + /// Transfers money between two user accounts + /// + /// Starting account + /// End account + /// The amount to move + /// Success? + public bool moneyTransferRequest(LLUUID from, LLUUID to, uint amount) + { + return true; + } + + /// + /// Transfers inventory between two accounts + /// + /// Move to inventory server + /// Senders account + /// Recievers account + /// Inventory item + /// Success? + public bool inventoryTransferRequest(LLUUID from, LLUUID to, LLUUID item) + { + return true; + } + + /// + /// Returns the name of the storage provider + /// + /// Storage provider name + public string getName() + { + return "DB4o Userdata"; + } + + /// + /// Returns the version of the storage provider + /// + /// Storage provider version + public string getVersion() + { + return "0.1"; + } + } +} diff --git a/OpenSim/Framework/Data.DB4o/OpenSim.Framework.Data.DB4o.csproj b/OpenSim/Framework/Data.DB4o/OpenSim.Framework.Data.DB4o.csproj new file mode 100644 index 0000000000..f6e831117a --- /dev/null +++ b/OpenSim/Framework/Data.DB4o/OpenSim.Framework.Data.DB4o.csproj @@ -0,0 +1,111 @@ + + + Local + 8.0.50727 + 2.0 + {FD2D303D-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Data.DB4o + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Data.DB4o + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Data + {36B72A9B-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Data.DB4o/OpenSim.Framework.Data.DB4o.csproj.user b/OpenSim/Framework/Data.DB4o/OpenSim.Framework.Data.DB4o.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Data.DB4o/OpenSim.Framework.Data.DB4o.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Data.DB4o/Properties/AssemblyInfo.cs b/OpenSim/Framework/Data.DB4o/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..905cd9b25a --- /dev/null +++ b/OpenSim/Framework/Data.DB4o/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Framework.Data.DB4o")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Framework.Data.DB4o")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("57991e15-79da-41b7-aa06-2e6b49165a63")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Framework/Data.DB4o/obj/Debug/OpenSim.Framework.Data.DB4o.dll b/OpenSim/Framework/Data.DB4o/obj/Debug/OpenSim.Framework.Data.DB4o.dll new file mode 100644 index 0000000000000000000000000000000000000000..115ac6a6ee65b4b47fbc6fd682298242ea391502 GIT binary patch literal 20480 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 G7WjWpSdOj$ literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.DB4o/obj/OpenSim.Framework.Data.DB4o.csproj.FileList.txt b/OpenSim/Framework/Data.DB4o/obj/OpenSim.Framework.Data.DB4o.csproj.FileList.txt new file mode 100644 index 0000000000..5e8b768a4d --- /dev/null +++ b/OpenSim/Framework/Data.DB4o/obj/OpenSim.Framework.Data.DB4o.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.Data.DB4o.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.Data.DB4o.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Data.DB4o.dll +obj\Debug\OpenSim.Framework.Data.DB4o.pdb +..\..\..\bin\OpenSim.Framework.Data.DB4o.pdb diff --git a/OpenSim/Framework/Data.DB4o/obj/Release/OpenSim.Framework.Data.DB4o.dll b/OpenSim/Framework/Data.DB4o/obj/Release/OpenSim.Framework.Data.DB4o.dll new file mode 100644 index 0000000000000000000000000000000000000000..c1fbd9f08f492f384ebc795f502eb075e22d1fbd GIT binary patch literal 20480 zcmeHNYj7Labv}0iEI^Qg1n^~wf(+^vl9FIjqNvbvV@aeQjP#5xzZIW>r&!qJaccx1ECym?6 z{m$712$GH`^|;d?-IZ|mp2t0p?>?}1!NVVWltM%l#^;@Ph+f2s~AxR68_+N>cb!ze0JkQl$7==FK-rb{&LNMLe3ZJf*6eO zm3vh!Hpk%i4sPux`XU3d^g2V-uvGSw@EIahP`zT{4^}y%tZQ6!!T;(_AkbCnL92RY zh|Xkf#~z17a@&mt*V2Pe&9xiZXKkZk!BBEN10~x*QG0>iTgwOS0D%C30D%C30D%C3 z0D%C30D%C30D%C3|33)K@wplopG`H2(9@fUekVz!MEXA`?L8s7AKlPDsW~f&;+N12 zYn?cc##yoC?o6R=HGJ$Tp`I%Q*O=0zy_AB0pkl{d{CoOZ_}W{n$hUwDvBFbRd-qHh9ed zY}TUJB{UbX!OIF@!?c1;6usU98&(4wb`qPt8UA7xu=s$mVXqSWm^uKVr>9#Z3J1d zc}FVLiFq7HGF829eF&1-PLR-cjPnvj{rpGJsSDbzFV81Zp&KoT*zV1y`Dm;Yxx`<$ zf${W8)wvmrZKB<|1ubVQ$bA@ah54dUC+)qL5=a^C6iwYn7$vWc%eW)#qB`oA))A`C z#A=2iNj*M)WIh`85?TE)a8eDi7Q2Wno{6<0sVuU1CU%qk`yy$psnEIws)ta%dM4J1 zcSnB4I^*lDj}&$7s^qCrFXUKuKQ_;hh1H{P3Ae=O>)Ybhq!#&W>Gb@4p(YQnj#;>m zM>@BGZqZu1Te{b2P2PyFwyz`i?$vg)!VTlU*4s9^F*(u@IhbquC1e)veoC9=yEps1 z`H8t$Biau4-Izg*J-XC`K}c$$)`v0vDz3NOoVlV~eXwbH(ihf8Sr`>z>yw?>i=>|R z9*sT$JYs@JHGs7PeXV|whRvNRt#c<@aeWq>X*}eWmeOYjz=b_7tk=)C!|qmyw*D<9 zn0BKD&io11)Xm$4KNc;t;|_2BaBS>&R42Lfo}ka};y~DAn&R`4AdeqkD_44Z%=@hu zar}Bige}gG85SIt2Cc+gwW_kOX@uR3;#G`77FLhGX+D8{@ir(re+p!tP-LYq@=ah{ zQF?d0mH)4{Z|6bx$G$S~cwss6(Y?z5HsW`i=eK2hvO9WqZUf@HnhKz2faLm56a5YD zFLHatwawC`!xo=iL39d>W&Oz!dIPJH;aY#-+~pH2KQU^1n7&PI{hQP zj3NGadJB?wM7~9__7{Zyz0jL9w)~3r^O{cI5c(h5>uA@7n5IK4?-zQf(1Oqhg+3+p zn$YhEO@@CE!b$*5(L{JOoFW@kr-#Cq5#=$^6#bz{{vrJ5kbh5TdxW)zgr1KWkw*F~ zKzM|H2~?-Ai~KdAN@vS{&_+58kbcd#`58#~VqBQ=eHA9ctw6KFjS3f%-yv4fgm4kj zuOde{9es34D8_WPYC`)qwa#xV8dlrT9#&`RScao~?xvenDx6@D3&!j7!o8{PRQ-tiq|cpFoaNI#XQ?5qiYa{U5WT7HS0BZAt=iym&!{`8p3eB( zZ>qa7Cm!&*Yw)>}9`d+wLau?Lzr)EH0N`p z+7((&_xs$0_AIs2gFZK_y@2)pd7tBoI_MFf!AIZ zCrs;vev=*u{~djso(+GCUZa=7-=!bW_3%H_kLbU`Z{b_4F7mIiPelF=l2qhvQtCsI zepp^pZ$rL4(x4jXc4%LtgOL4W{xMFy}su7{7R4Txeu z@|DQFs+WE{at;!Xl2m^R%P#d-ku%h*z7=s*onjoi=${~IpdUsaS1f-5y&Cl<*mUS$ zLv-<@cIkhH_9ygL)D}efp6WxCAE^PFg5?061MQP212m&2v^wG__o&D9RxOJawGOnM zZUJ3S_keB}x{FSuJxCWo?-0p|(2olp7x`KGBD4;DS-U~4YLl8(SJVsYFVzi|($;7% zQCjU&A6MU2*Hw6qXIJfoFKNuHg-g+#FpI68@D1df!f(GNcTAzG$8XXoX1;&jcG$|7 z3&uz2=(JH9F^k##_?^_aVA*H0Lpe8>9opMxW%GpsapQn(<`3sexkv1 zwHO@S_dGGkOXuO=vX?3R5j}29_#;Yt9LFe*6=wEhp!^#5xOku%E4u*5S1waj{FDJ%(Z~*$ zT*J1eM}UkuZa8$HY~~ld3|hre(=o>i#)7Qkd9Yk?%l5k{P*UC~=IpcY(#M*fvCYXT zcex6~nJ}mTF!#o;~tuls%ws!1=FobI6u~B<;Q3UH(AI|mYc%w&+%HCp~xqhI!xOT=rcY zH)Ig-eLP0vl&2|giTjwJn6iyr9;X1rz%GFV_VJV?I9k}fBq>N7D5Zo-q7ue7CNao9 z4Ervc$Q#qTzmHB>-T{OB8L1oPGs_x*-G`0`y9eJ;E3qwihzI_`_dz&DgMNM9e zeZCG^O^!iI!-Pk#X|m!_bZLNB)QB(E9kaFZes@+vbrI=SB3>KRk8+#pnOx@C)?nsYibO@(PN5 z^}bW1ZGCTCuG5=SNiEr&YSZ*YIHOb|l2KZ!ttw9opAPA%SSUlPE)z~eiwp8pTfNRS z*^FDVBh?nogy5?_0n3D*(NY`h>d>))jnc_x?vWOGI)R%?b$PNbk#!|FG%SR6#l%&z zxvtJ{B%3)sjY%w4NjjGM(kn+Zw?6+bIOnCzgbrFvp5s8}HQ@}UE+LaOAwAg~&1kBT z8WnhLMKqE!Q{_}!>QZX%GceW~iQTS=M75NuRh*|Qc4@H-6D;a8)SQ}o7#$i_owOJ_ zmL}&O^QGKkDdIO0%4|enO|RD}l)%**4YRURfb?Sl5{sdTM0!mk8d}h&*EB@6WJkq3 zLYgMnr4tyEsFn_;LtakLRdafdqo=)`u2yrpDpJl#twexyDvi*d5JS`zj$$~t#6$$G zxd$5*MSJlQ1pkP-6m8hCb6}v?=-sh(=RiKUwXb(<=hj@Vr+@1iS^bxC6-G{N^ zS{EF3(f>VxgZ(VGGu&E!RepCMIz4FFLxsX&d_j>sp&Euf19P8uHljb?dj(g3K!8Ai zK!8AiK!Cvi9s){!AHgr{bBkkmZ|d>9u}sc(2l2UkH_>kVK3BPRhw$qfjnW962Hl6J z?-4wmAEhJUhe7wF&DXW?^&8&XGI>6M#Jk@vTJN_M&2Lw3Lt-_G=Vu#!ymQ4cp5G_% z%+A*a;#Y1bpyl(0gQtIf+BTsri5`F95Plj?6>@Ur3BQDs!E#TZ5}O{X{OiL>6By7L zT7$k7`yreM9GpP;gfzV<&Qb6NVvayl#Cc%9WK@Lg0&=nGEM!BHTTWWuse=$BR^xwE z&Kpim{=Kl~(}(xreDL@WR7;4?CmTME6@YOLQ4Qq#{_@Dm$&7zrJBVKw6di)EN%1_0 z?5Az*z#1y z*tj)lyk9&BXF?vA#eSEL&eE~@u=Lr38Nz4hB4$tl$Yro5c%&9ab!k7q6 + /// A grid data interface for Microsoft SQL Server + /// + public class SqlGridData : IGridData + { + /// + /// Database manager + /// + private MSSqlManager database; + + /// + /// Initialises the Grid Interface + /// + public void Initialise() + { + database = new MSSqlManager("localhost", "db", "user", "password", "false"); + } + + /// + /// Shuts down the grid interface + /// + public void Close() + { + database.Close(); + } + + /// + /// Returns the storage system name + /// + /// A string containing the storage system name + public string getName() + { + return "Sql OpenGridData"; + } + + /// + /// Returns the storage system version + /// + /// A string containing the storage system version + public string getVersion() + { + return "0.1"; + } + + /// + /// Returns a list of regions within the specified ranges + /// + /// minimum X coordinate + /// minimum Y coordinate + /// maximum X coordinate + /// maximum Y coordinate + /// An array of region profiles + public SimProfileData[] GetProfilesInRange(uint a, uint b, uint c, uint d) + { + return null; + } + + /// + /// Returns a sim profile from it's location + /// + /// Region location handle + /// Sim profile + public SimProfileData GetProfileByHandle(ulong handle) + { + Dictionary param = new Dictionary(); + param["handle"] = handle.ToString(); + + IDbCommand result = database.Query("SELECT * FROM regions WHERE handle = @handle", param); + IDataReader reader = result.ExecuteReader(); + + SimProfileData row = database.getRow(reader); + reader.Close(); + result.Dispose(); + + return row; + } + + /// + /// Returns a sim profile from it's UUID + /// + /// The region UUID + /// The sim profile + public SimProfileData GetProfileByLLUUID(LLUUID uuid) + { + Dictionary param = new Dictionary(); + param["uuid"] = uuid.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM regions WHERE uuid = @uuid", param); + IDataReader reader = result.ExecuteReader(); + + SimProfileData row = database.getRow(reader); + reader.Close(); + result.Dispose(); + + return row; + } + + /// + /// Adds a new specified region to the database + /// + /// The profile to add + /// A dataresponse enum indicating success + public DataResponse AddProfile(SimProfileData profile) + { + if (database.insertRow(profile)) + { + return DataResponse.RESPONSE_OK; + } + else + { + return DataResponse.RESPONSE_ERROR; + } + } + + /// + /// DEPRECIATED. Attempts to authenticate a region by comparing a shared secret. + /// + /// The UUID of the challenger + /// The attempted regionHandle of the challenger + /// The secret + /// Whether the secret and regionhandle match the database entry for UUID + public bool AuthenticateSim(LLUUID uuid, ulong handle, string authkey) + { + bool throwHissyFit = false; // Should be true by 1.0 + + if (throwHissyFit) + throw new Exception("CRYPTOWEAK AUTHENTICATE: Refusing to authenticate due to replay potential."); + + SimProfileData data = GetProfileByLLUUID(uuid); + + return (handle == data.regionHandle && authkey == data.regionSecret); + } + + /// + /// NOT YET FUNCTIONAL. Provides a cryptographic authentication of a region + /// + /// This requires a security audit. + /// + /// + /// + /// + /// + public bool AuthenticateSim(LLUUID uuid, ulong handle, string authhash, string challenge) + { + SHA512Managed HashProvider = new SHA512Managed(); + ASCIIEncoding TextProvider = new ASCIIEncoding(); + + byte[] stream = TextProvider.GetBytes(uuid.ToStringHyphenated() + ":" + handle.ToString() + ":" + challenge); + byte[] hash = HashProvider.ComputeHash(stream); + return false; + } + public ReservationData GetReservationAtPoint(uint x, uint y) + { + return null; + } + } + +} diff --git a/OpenSim/Framework/Data.MSSQL/MSSQLManager.cs b/OpenSim/Framework/Data.MSSQL/MSSQLManager.cs new file mode 100644 index 0000000000..49bf31ccb2 --- /dev/null +++ b/OpenSim/Framework/Data.MSSQL/MSSQLManager.cs @@ -0,0 +1,211 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using libsecondlife; + +namespace OpenSim.Framework.Data.MSSQL +{ + /// + /// A management class for the MS SQL Storage Engine + /// + class MSSqlManager + { + /// + /// The database connection object + /// + IDbConnection dbcon; + + /// + /// Initialises and creates a new Sql connection and maintains it. + /// + /// The Sql server being connected to + /// The name of the Sql database being used + /// The username logging into the database + /// The password for the user logging in + /// Whether to use connection pooling or not, can be one of the following: 'yes', 'true', 'no' or 'false', if unsure use 'false'. + public MSSqlManager(string hostname, string database, string username, string password, string cpooling) + { + try + { + string connectionString = "Server=" + hostname + ";Database=" + database + ";User ID=" + username + ";Password=" + password + ";Pooling=" + cpooling + ";"; + dbcon = new SqlConnection(connectionString); + + dbcon.Open(); + } + catch (Exception e) + { + throw new Exception("Error initialising Sql Database: " + e.ToString()); + } + } + + /// + /// Shuts down the database connection + /// + public void Close() + { + dbcon.Close(); + dbcon = null; + } + + /// + /// Runs a query with protection against SQL Injection by using parameterised input. + /// + /// The SQL string - replace any variables such as WHERE x = "y" with WHERE x = @y + /// The parameters - index so that @y is indexed as 'y' + /// A Sql DB Command + public IDbCommand Query(string sql, Dictionary parameters) + { + SqlCommand dbcommand = (SqlCommand)dbcon.CreateCommand(); + dbcommand.CommandText = sql; + foreach (KeyValuePair param in parameters) + { + dbcommand.Parameters.AddWithValue(param.Key, param.Value); + } + + return (IDbCommand)dbcommand; + } + + /// + /// Runs a database reader object and returns a region row + /// + /// An active database reader + /// A region row + public SimProfileData getRow(IDataReader reader) + { + SimProfileData regionprofile = new SimProfileData(); + + if (reader.Read()) + { + // Region Main + regionprofile.regionHandle = (ulong)reader["regionHandle"]; + regionprofile.regionName = (string)reader["regionName"]; + regionprofile.UUID = new LLUUID((string)reader["uuid"]); + + // Secrets + regionprofile.regionRecvKey = (string)reader["regionRecvKey"]; + regionprofile.regionSecret = (string)reader["regionSecret"]; + regionprofile.regionSendKey = (string)reader["regionSendKey"]; + + // Region Server + regionprofile.regionDataURI = (string)reader["regionDataURI"]; + regionprofile.regionOnline = false; // Needs to be pinged before this can be set. + regionprofile.serverIP = (string)reader["serverIP"]; + regionprofile.serverPort = (uint)reader["serverPort"]; + regionprofile.serverURI = (string)reader["serverURI"]; + + // Location + regionprofile.regionLocX = (uint)((int)reader["locX"]); + regionprofile.regionLocY = (uint)((int)reader["locY"]); + regionprofile.regionLocZ = (uint)((int)reader["locZ"]); + + // Neighbours - 0 = No Override + regionprofile.regionEastOverrideHandle = (ulong)reader["eastOverrideHandle"]; + regionprofile.regionWestOverrideHandle = (ulong)reader["westOverrideHandle"]; + regionprofile.regionSouthOverrideHandle = (ulong)reader["southOverrideHandle"]; + regionprofile.regionNorthOverrideHandle = (ulong)reader["northOverrideHandle"]; + + // Assets + regionprofile.regionAssetURI = (string)reader["regionAssetURI"]; + regionprofile.regionAssetRecvKey = (string)reader["regionAssetRecvKey"]; + regionprofile.regionAssetSendKey = (string)reader["regionAssetSendKey"]; + + // Userserver + regionprofile.regionUserURI = (string)reader["regionUserURI"]; + regionprofile.regionUserRecvKey = (string)reader["regionUserRecvKey"]; + regionprofile.regionUserSendKey = (string)reader["regionUserSendKey"]; + } + else + { + throw new Exception("No rows to return"); + } + return regionprofile; + } + + /// + /// Creates a new region in the database + /// + /// The region profile to insert + /// Successful? + public bool insertRow(SimProfileData profile) + { + string sql = "REPLACE INTO regions VALUES (regionHandle, regionName, uuid, regionRecvKey, regionSecret, regionSendKey, regionDataURI, "; + sql += "serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, "; + sql += "regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey) VALUES "; + + sql += "(@regionHandle, @regionName, @uuid, @regionRecvKey, @regionSecret, @regionSendKey, @regionDataURI, "; + sql += "@serverIP, @serverPort, @serverURI, @locX, @locY, @locZ, @eastOverrideHandle, @westOverrideHandle, @southOverrideHandle, @northOverrideHandle, @regionAssetURI, @regionAssetRecvKey, "; + sql += "@regionAssetSendKey, @regionUserURI, @regionUserRecvKey, @regionUserSendKey);"; + + Dictionary parameters = new Dictionary(); + + parameters["regionHandle"] = profile.regionHandle.ToString(); + parameters["regionName"] = profile.regionName; + parameters["uuid"] = profile.UUID.ToString(); + parameters["regionRecvKey"] = profile.regionRecvKey; + parameters["regionSendKey"] = profile.regionSendKey; + parameters["regionDataURI"] = profile.regionDataURI; + parameters["serverIP"] = profile.serverIP; + parameters["serverPort"] = profile.serverPort.ToString(); + parameters["serverURI"] = profile.serverURI; + parameters["locX"] = profile.regionLocX.ToString(); + parameters["locY"] = profile.regionLocY.ToString(); + parameters["locZ"] = profile.regionLocZ.ToString(); + parameters["eastOverrideHandle"] = profile.regionEastOverrideHandle.ToString(); + parameters["westOverrideHandle"] = profile.regionWestOverrideHandle.ToString(); + parameters["northOverrideHandle"] = profile.regionNorthOverrideHandle.ToString(); + parameters["southOverrideHandle"] = profile.regionSouthOverrideHandle.ToString(); + parameters["regionAssetURI"] = profile.regionAssetURI; + parameters["regionAssetRecvKey"] = profile.regionAssetRecvKey; + parameters["regionAssetSendKey"] = profile.regionAssetSendKey; + parameters["regionUserURI"] = profile.regionUserURI; + parameters["regionUserRecvKey"] = profile.regionUserRecvKey; + parameters["regionUserSendKey"] = profile.regionUserSendKey; + + bool returnval = false; + + try + { + IDbCommand result = Query(sql, parameters); + + if (result.ExecuteNonQuery() == 1) + returnval = true; + + result.Dispose(); + } + catch (Exception) + { + return false; + } + + return returnval; + } + } +} diff --git a/OpenSim/Framework/Data.MSSQL/OpenSim.Framework.Data.MSSQL.csproj b/OpenSim/Framework/Data.MSSQL/OpenSim.Framework.Data.MSSQL.csproj new file mode 100644 index 0000000000..6da0ab207c --- /dev/null +++ b/OpenSim/Framework/Data.MSSQL/OpenSim.Framework.Data.MSSQL.csproj @@ -0,0 +1,102 @@ + + + Local + 8.0.50727 + 2.0 + {17F7F694-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Data.MSSQL + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Data.MSSQL + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libsecondlife.dll + False + + + OpenSim.Framework.Data.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Xml.dll + False + + + + + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Data.MSSQL/OpenSim.Framework.Data.MSSQL.csproj.user b/OpenSim/Framework/Data.MSSQL/OpenSim.Framework.Data.MSSQL.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Data.MSSQL/OpenSim.Framework.Data.MSSQL.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Data.MSSQL/Properties/AssemblyInfo.cs b/OpenSim/Framework/Data.MSSQL/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..066c739dbb --- /dev/null +++ b/OpenSim/Framework/Data.MSSQL/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Framework.Data.MSSQL")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Framework.Data.MSSQL")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0e1c1ca4-2cf2-4315-b0e7-432c02feea8a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Framework/Data.MSSQL/obj/Debug/OpenSim.Framework.Data.MSSQL.dll b/OpenSim/Framework/Data.MSSQL/obj/Debug/OpenSim.Framework.Data.MSSQL.dll new file mode 100644 index 0000000000000000000000000000000000000000..1d5fbfb3663714c0543741a8d55f0747b596466c GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.MSSQL/obj/Debug/OpenSim.Framework.Data.MSSQL.pdb b/OpenSim/Framework/Data.MSSQL/obj/Debug/OpenSim.Framework.Data.MSSQL.pdb new file mode 100644 index 0000000000000000000000000000000000000000..166422789984db5b41ea207fdedd11ca29936e54 GIT binary patch literal 19968 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.MSSQL/obj/OpenSim.Framework.Data.MSSQL.csproj.FileList.txt b/OpenSim/Framework/Data.MSSQL/obj/OpenSim.Framework.Data.MSSQL.csproj.FileList.txt new file mode 100644 index 0000000000..4730f890ca --- /dev/null +++ b/OpenSim/Framework/Data.MSSQL/obj/OpenSim.Framework.Data.MSSQL.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.Data.MSSQL.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.Data.MSSQL.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Data.MSSQL.dll +obj\Debug\OpenSim.Framework.Data.MSSQL.pdb +..\..\..\bin\OpenSim.Framework.Data.MSSQL.pdb diff --git a/OpenSim/Framework/Data.MSSQL/obj/Release/OpenSim.Framework.Data.MSSQL.dll b/OpenSim/Framework/Data.MSSQL/obj/Release/OpenSim.Framework.Data.MSSQL.dll new file mode 100644 index 0000000000000000000000000000000000000000..646992c3edbec27aa07543c7add606b44c99be65 GIT binary patch literal 24576 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 + /// A MySQL Interface for the Grid Server + /// + public class MySQLGridData : IGridData + { + /// + /// MySQL Database Manager + /// + private MySQLManager database; + + /// + /// Initialises the Grid Interface + /// + public void Initialise() + { + IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini"); + string settingHostname = GridDataMySqlFile.ParseFileReadValue("hostname"); + string settingDatabase = GridDataMySqlFile.ParseFileReadValue("database"); + string settingUsername = GridDataMySqlFile.ParseFileReadValue("username"); + string settingPassword = GridDataMySqlFile.ParseFileReadValue("password"); + string settingPooling = GridDataMySqlFile.ParseFileReadValue("pooling"); + string settingPort = GridDataMySqlFile.ParseFileReadValue("port"); + + database = new MySQLManager(settingHostname, settingDatabase, settingUsername, settingPassword, settingPooling, settingPort); + } + + /// + /// Shuts down the grid interface + /// + public void Close() + { + database.Close(); + } + + /// + /// Returns the plugin name + /// + /// Plugin name + public string getName() + { + return "MySql OpenGridData"; + } + + /// + /// Returns the plugin version + /// + /// Plugin version + public string getVersion() + { + return "0.1"; + } + + /// + /// Returns all the specified region profiles within coordates -- coordinates are inclusive + /// + /// Minimum X coordinate + /// Minimum Y coordinate + /// Maximum X coordinate + /// Maximum Y coordinate + /// + public SimProfileData[] GetProfilesInRange(uint xmin, uint ymin, uint xmax, uint ymax) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?xmin"] = xmin.ToString(); + param["?ymin"] = ymin.ToString(); + param["?xmax"] = xmax.ToString(); + param["?ymax"] = ymax.ToString(); + + IDbCommand result = database.Query("SELECT * FROM regions WHERE locX >= ?xmin AND locX <= ?xmax AND locY >= ?ymin AND locY <= ?ymax", param); + IDataReader reader = result.ExecuteReader(); + + SimProfileData row; + + List rows = new List(); + + while ((row = database.readSimRow(reader)) != null) + { + rows.Add(row); + } + reader.Close(); + result.Dispose(); + + return rows.ToArray(); + + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Returns a sim profile from it's location + /// + /// Region location handle + /// Sim profile + public SimProfileData GetProfileByHandle(ulong handle) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?handle"] = handle.ToString(); + + IDbCommand result = database.Query("SELECT * FROM regions WHERE regionHandle = ?handle", param); + IDataReader reader = result.ExecuteReader(); + + SimProfileData row = database.readSimRow(reader); + reader.Close(); + result.Dispose(); + + return row; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Returns a sim profile from it's UUID + /// + /// The region UUID + /// The sim profile + public SimProfileData GetProfileByLLUUID(LLUUID uuid) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?uuid"] = uuid.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM regions WHERE uuid = ?uuid", param); + IDataReader reader = result.ExecuteReader(); + + SimProfileData row = database.readSimRow(reader); + reader.Close(); + result.Dispose(); + + return row; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Adds a new profile to the database + /// + /// The profile to add + /// Successful? + public DataResponse AddProfile(SimProfileData profile) + { + lock (database) + { + if (database.insertRegion(profile)) + { + return DataResponse.RESPONSE_OK; + } + else + { + return DataResponse.RESPONSE_ERROR; + } + } + } + + /// + /// DEPRECIATED. Attempts to authenticate a region by comparing a shared secret. + /// + /// The UUID of the challenger + /// The attempted regionHandle of the challenger + /// The secret + /// Whether the secret and regionhandle match the database entry for UUID + public bool AuthenticateSim(LLUUID uuid, ulong handle, string authkey) + { + bool throwHissyFit = false; // Should be true by 1.0 + + if (throwHissyFit) + throw new Exception("CRYPTOWEAK AUTHENTICATE: Refusing to authenticate due to replay potential."); + + SimProfileData data = GetProfileByLLUUID(uuid); + + return (handle == data.regionHandle && authkey == data.regionSecret); + } + + /// + /// NOT YET FUNCTIONAL. Provides a cryptographic authentication of a region + /// + /// This requires a security audit. + /// + /// + /// + /// + /// + public bool AuthenticateSim(LLUUID uuid, ulong handle, string authhash, string challenge) + { + SHA512Managed HashProvider = new SHA512Managed(); + ASCIIEncoding TextProvider = new ASCIIEncoding(); + + byte[] stream = TextProvider.GetBytes(uuid.ToStringHyphenated() + ":" + handle.ToString() + ":" + challenge); + byte[] hash = HashProvider.ComputeHash(stream); + + return false; + } + + public ReservationData GetReservationAtPoint(uint x, uint y) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?x"] = x.ToString(); + param["?y"] = y.ToString(); + IDbCommand result = database.Query("SELECT * FROM reservations WHERE resXMin <= ?x AND resXMax >= ?x AND resYMin <= ?y AND resYMax >= ?y", param); + IDataReader reader = result.ExecuteReader(); + + ReservationData row = database.readReservationRow(reader); + reader.Close(); + result.Dispose(); + + return row; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + } + + +} diff --git a/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs b/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs new file mode 100644 index 0000000000..790759a1b5 --- /dev/null +++ b/OpenSim/Framework/Data.MySQL/MySQLInventoryData.cs @@ -0,0 +1,309 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Data; +using libsecondlife; + +namespace OpenSim.Framework.Data.MySQL +{ + /// + /// A MySQL interface for the inventory server + /// + class MySQLInventoryData : IInventoryData + { + /// + /// The database manager + /// + public MySQLManager database; + + /// + /// Loads and initialises this database plugin + /// + public void Initialise() + { + IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini"); + string settingHostname = GridDataMySqlFile.ParseFileReadValue("hostname"); + string settingDatabase = GridDataMySqlFile.ParseFileReadValue("database"); + string settingUsername = GridDataMySqlFile.ParseFileReadValue("username"); + string settingPassword = GridDataMySqlFile.ParseFileReadValue("password"); + string settingPooling = GridDataMySqlFile.ParseFileReadValue("pooling"); + string settingPort = GridDataMySqlFile.ParseFileReadValue("port"); + + database = new MySQLManager(settingHostname, settingDatabase, settingUsername, settingPassword, settingPooling, settingPort); + } + + /// + /// The name of this DB provider + /// + /// Name of DB provider + public string getName() + { + return "MySQL Inventory Data Interface"; + } + + /// + /// Closes this DB provider + /// + public void Close() + { + // Do nothing. + } + + /// + /// Returns the version of this DB provider + /// + /// A string containing the DB provider + public string getVersion() + { + return "0.1"; + } + + /// + /// Returns a list of items in a specified folder + /// + /// The folder to search + /// A list containing inventory items + public List getInventoryInFolder(LLUUID folderID) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?uuid"] = folderID.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid", param); + IDataReader reader = result.ExecuteReader(); + + List items = database.readInventoryItems(reader); + + reader.Close(); + result.Dispose(); + + return items; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Returns a list of the root folders within a users inventory + /// + /// The user whos inventory is to be searched + /// A list of folder objects + public List getUserRootFolders(LLUUID user) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?uuid"] = user.ToStringHyphenated(); + param["?zero"] = LLUUID.Zero.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", param); + IDataReader reader = result.ExecuteReader(); + + List items = database.readInventoryFolders(reader); + + reader.Close(); + result.Dispose(); + + return items; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Returns a list of folders in a users inventory contained within the specified folder + /// + /// The folder to search + /// A list of inventory folders + public List getInventoryFolders(LLUUID parentID) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?uuid"] = parentID.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid", param); + IDataReader reader = result.ExecuteReader(); + + List items = database.readInventoryFolders(reader); + + reader.Close(); + result.Dispose(); + + return items; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Returns a specified inventory item + /// + /// The item to return + /// An inventory item + public InventoryItemBase getInventoryItem(LLUUID item) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?uuid"] = item.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", param); + IDataReader reader = result.ExecuteReader(); + + List items = database.readInventoryItems(reader); + + reader.Close(); + result.Dispose(); + + if (items.Count > 0) + { + return items[0]; + } + else + { + return null; + } + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Returns a specified inventory folder + /// + /// The folder to return + /// A folder class + public InventoryFolderBase getInventoryFolder(LLUUID folder) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?uuid"] = folder.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", param); + IDataReader reader = result.ExecuteReader(); + + List items = database.readInventoryFolders(reader); + + reader.Close(); + result.Dispose(); + + if (items.Count > 0) + { + return items[0]; + } + else + { + return null; + } + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Adds a specified item to the database + /// + /// The inventory item + public void addInventoryItem(InventoryItemBase item) + { + lock (database) + { + database.insertItem(item); + } + } + + /// + /// Updates the specified inventory item + /// + /// Inventory item to update + public void updateInventoryItem(InventoryItemBase item) + { + addInventoryItem(item); + } + + /// + /// Creates a new inventory folder + /// + /// Folder to create + public void addInventoryFolder(InventoryFolderBase folder) + { + lock (database) + { + database.insertFolder(folder); + } + } + + /// + /// Updates an inventory folder + /// + /// Folder to update + public void updateInventoryFolder(InventoryFolderBase folder) + { + addInventoryFolder(folder); + } + } +} diff --git a/OpenSim/Framework/Data.MySQL/MySQLLogData.cs b/OpenSim/Framework/Data.MySQL/MySQLLogData.cs new file mode 100644 index 0000000000..38f9fd3940 --- /dev/null +++ b/OpenSim/Framework/Data.MySQL/MySQLLogData.cs @@ -0,0 +1,105 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; + +namespace OpenSim.Framework.Data.MySQL +{ + /// + /// An interface to the log database for MySQL + /// + class MySQLLogData : ILogData + { + /// + /// The database manager + /// + public MySQLManager database; + + /// + /// Artificial constructor called when the plugin is loaded + /// + public void Initialise() + { + IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini"); + string settingHostname = GridDataMySqlFile.ParseFileReadValue("hostname"); + string settingDatabase = GridDataMySqlFile.ParseFileReadValue("database"); + string settingUsername = GridDataMySqlFile.ParseFileReadValue("username"); + string settingPassword = GridDataMySqlFile.ParseFileReadValue("password"); + string settingPooling = GridDataMySqlFile.ParseFileReadValue("pooling"); + string settingPort = GridDataMySqlFile.ParseFileReadValue("port"); + + database = new MySQLManager(settingHostname, settingDatabase, settingUsername, settingPassword, settingPooling, settingPort); + } + + /// + /// Saves a log item to the database + /// + /// The daemon triggering the event + /// The target of the action (region / agent UUID, etc) + /// The method call where the problem occured + /// The arguments passed to the method + /// How critical is this? + /// The message to log + public void saveLog(string serverDaemon, string target, string methodCall, string arguments, int priority, string logMessage) + { + try + { + database.insertLogRow(serverDaemon, target, methodCall, arguments, priority, logMessage); + } + catch + { + database.Reconnect(); + } + } + + /// + /// Returns the name of this DB provider + /// + /// A string containing the DB provider name + public string getName() + { + return "MySQL Logdata Interface"; + } + + /// + /// Closes the database provider + /// + public void Close() + { + // Do nothing. + } + + /// + /// Returns the version of this DB provider + /// + /// A string containing the provider version + public string getVersion() + { + return "0.1"; + } + } +} diff --git a/OpenSim/Framework/Data.MySQL/MySQLManager.cs b/OpenSim/Framework/Data.MySQL/MySQLManager.cs new file mode 100644 index 0000000000..88365a31df --- /dev/null +++ b/OpenSim/Framework/Data.MySQL/MySQLManager.cs @@ -0,0 +1,602 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Data; +using libsecondlife; +using MySql.Data.MySqlClient; + +namespace OpenSim.Framework.Data.MySQL +{ + /// + /// A MySQL Database manager + /// + class MySQLManager + { + /// + /// The database connection object + /// + IDbConnection dbcon; + /// + /// Connection string for ADO.net + /// + string connectionString; + + /// + /// Initialises and creates a new MySQL connection and maintains it. + /// + /// The MySQL server being connected to + /// The name of the MySQL database being used + /// The username logging into the database + /// The password for the user logging in + /// Whether to use connection pooling or not, can be one of the following: 'yes', 'true', 'no' or 'false', if unsure use 'false'. + public MySQLManager(string hostname, string database, string username, string password, string cpooling, string port) + { + try + { + connectionString = "Server=" + hostname + ";Port=" + port + ";Database=" + database + ";User ID=" + username + ";Password=" + password + ";Pooling=" + cpooling + ";"; + dbcon = new MySqlConnection(connectionString); + + dbcon.Open(); + + Console.WriteLine("MySQL connection established"); + } + catch (Exception e) + { + throw new Exception("Error initialising MySql Database: " + e.ToString()); + } + } + + /// + /// Shuts down the database connection + /// + public void Close() + { + dbcon.Close(); + dbcon = null; + } + + /// + /// Reconnects to the database + /// + public void Reconnect() + { + lock (dbcon) + { + try + { + // Close the DB connection + dbcon.Close(); + // Try reopen it + dbcon = new MySqlConnection(connectionString); + dbcon.Open(); + } + catch (Exception e) + { + Console.WriteLine("Unable to reconnect to database " + e.ToString()); + } + } + } + + /// + /// Runs a query with protection against SQL Injection by using parameterised input. + /// + /// The SQL string - replace any variables such as WHERE x = "y" with WHERE x = @y + /// The parameters - index so that @y is indexed as 'y' + /// A MySQL DB Command + public IDbCommand Query(string sql, Dictionary parameters) + { + try + { + MySqlCommand dbcommand = (MySqlCommand)dbcon.CreateCommand(); + dbcommand.CommandText = sql; + foreach (KeyValuePair param in parameters) + { + dbcommand.Parameters.Add(param.Key, param.Value); + } + + return (IDbCommand)dbcommand; + } + catch + { + lock (dbcon) + { + // Close the DB connection + try + { + dbcon.Close(); + } + catch { } + + // Try reopen it + try + { + dbcon = new MySqlConnection(connectionString); + dbcon.Open(); + } + catch (Exception e) + { + Console.WriteLine("Unable to reconnect to database " + e.ToString()); + } + + // Run the query again + try + { + MySqlCommand dbcommand = (MySqlCommand)dbcon.CreateCommand(); + dbcommand.CommandText = sql; + foreach (KeyValuePair param in parameters) + { + dbcommand.Parameters.Add(param.Key, param.Value); + } + + return (IDbCommand)dbcommand; + } + catch (Exception e) + { + // Return null if it fails. + Console.WriteLine("Failed during Query generation: " + e.ToString()); + return null; + } + } + } + } + + /// + /// Reads a region row from a database reader + /// + /// An active database reader + /// A region profile + public SimProfileData readSimRow(IDataReader reader) + { + SimProfileData retval = new SimProfileData(); + + if (reader.Read()) + { + // Region Main + retval.regionHandle = Convert.ToUInt64(reader["regionHandle"].ToString()); + retval.regionName = (string)reader["regionName"]; + retval.UUID = new LLUUID((string)reader["uuid"]); + + // Secrets + retval.regionRecvKey = (string)reader["regionRecvKey"]; + retval.regionSecret = (string)reader["regionSecret"]; + retval.regionSendKey = (string)reader["regionSendKey"]; + + // Region Server + retval.regionDataURI = (string)reader["regionDataURI"]; + retval.regionOnline = false; // Needs to be pinged before this can be set. + retval.serverIP = (string)reader["serverIP"]; + retval.serverPort = (uint)reader["serverPort"]; + retval.serverURI = (string)reader["serverURI"]; + + // Location + retval.regionLocX = Convert.ToUInt32(reader["locX"].ToString()); + retval.regionLocY = Convert.ToUInt32(reader["locY"].ToString()); + retval.regionLocZ = Convert.ToUInt32(reader["locZ"].ToString()); + + // Neighbours - 0 = No Override + retval.regionEastOverrideHandle = Convert.ToUInt64(reader["eastOverrideHandle"].ToString()); + retval.regionWestOverrideHandle = Convert.ToUInt64(reader["westOverrideHandle"].ToString()); + retval.regionSouthOverrideHandle = Convert.ToUInt64(reader["southOverrideHandle"].ToString()); + retval.regionNorthOverrideHandle = Convert.ToUInt64(reader["northOverrideHandle"].ToString()); + + // Assets + retval.regionAssetURI = (string)reader["regionAssetURI"]; + retval.regionAssetRecvKey = (string)reader["regionAssetRecvKey"]; + retval.regionAssetSendKey = (string)reader["regionAssetSendKey"]; + + // Userserver + retval.regionUserURI = (string)reader["regionUserURI"]; + retval.regionUserRecvKey = (string)reader["regionUserRecvKey"]; + retval.regionUserSendKey = (string)reader["regionUserSendKey"]; + + // World Map Addition + string tempRegionMap = reader["regionMapTexture"].ToString(); + if (tempRegionMap != "") + { + retval.regionMapTextureID = new LLUUID(tempRegionMap); + } + else + { + retval.regionMapTextureID = new LLUUID(); + } + } + else + { + return null; + } + return retval; + } + + /// + /// Reads a reservation row from a database reader + /// + /// An active database reader + /// A reservation data object + public ReservationData readReservationRow(IDataReader reader) + { + ReservationData retval = new ReservationData(); + if (reader.Read()) + { + retval.gridRecvKey = (string)reader["gridRecvKey"]; + retval.gridSendKey = (string)reader["gridSendKey"]; + retval.reservationCompany = (string)reader["resCompany"]; + retval.reservationMaxX = Convert.ToInt32(reader["resXMax"].ToString()); + retval.reservationMaxY = Convert.ToInt32(reader["resYMax"].ToString()); + retval.reservationMinX = Convert.ToInt32(reader["resXMin"].ToString()); + retval.reservationMinY = Convert.ToInt32(reader["resYMin"].ToString()); + retval.reservationName = (string)reader["resName"]; + retval.status = Convert.ToInt32(reader["status"].ToString()) == 1; + retval.userUUID = new LLUUID((string)reader["userUUID"]); + + } + else + { + return null; + } + return retval; + } + /// + /// Reads an agent row from a database reader + /// + /// An active database reader + /// A user session agent + public UserAgentData readAgentRow(IDataReader reader) + { + UserAgentData retval = new UserAgentData(); + + if (reader.Read()) + { + // Agent IDs + retval.UUID = new LLUUID((string)reader["UUID"]); + retval.sessionID = new LLUUID((string)reader["sessionID"]); + retval.secureSessionID = new LLUUID((string)reader["secureSessionID"]); + + // Agent Who? + retval.agentIP = (string)reader["agentIP"]; + retval.agentPort = Convert.ToUInt32(reader["agentPort"].ToString()); + retval.agentOnline = Convert.ToBoolean(reader["agentOnline"].ToString()); + + // Login/Logout times (UNIX Epoch) + retval.loginTime = Convert.ToInt32(reader["loginTime"].ToString()); + retval.logoutTime = Convert.ToInt32(reader["logoutTime"].ToString()); + + // Current position + retval.currentRegion = (string)reader["currentRegion"]; + retval.currentHandle = Convert.ToUInt64(reader["currentHandle"].ToString()); + LLVector3.TryParse((string)reader["currentPos"], out retval.currentPos); + } + else + { + return null; + } + return retval; + } + + /// + /// Reads a user profile from an active data reader + /// + /// An active database reader + /// A user profile + public UserProfileData readUserRow(IDataReader reader) + { + UserProfileData retval = new UserProfileData(); + + if (reader.Read()) + { + retval.UUID = new LLUUID((string)reader["UUID"]); + retval.username = (string)reader["username"]; + retval.surname = (string)reader["lastname"]; + + retval.passwordHash = (string)reader["passwordHash"]; + retval.passwordSalt = (string)reader["passwordSalt"]; + + retval.homeRegion = Convert.ToUInt64(reader["homeRegion"].ToString()); + retval.homeLocation = new LLVector3( + Convert.ToSingle(reader["homeLocationX"].ToString()), + Convert.ToSingle(reader["homeLocationY"].ToString()), + Convert.ToSingle(reader["homeLocationZ"].ToString())); + retval.homeLookAt = new LLVector3( + Convert.ToSingle(reader["homeLookAtX"].ToString()), + Convert.ToSingle(reader["homeLookAtY"].ToString()), + Convert.ToSingle(reader["homeLookAtZ"].ToString())); + + retval.created = Convert.ToInt32(reader["created"].ToString()); + retval.lastLogin = Convert.ToInt32(reader["lastLogin"].ToString()); + + retval.userInventoryURI = (string)reader["userInventoryURI"]; + retval.userAssetURI = (string)reader["userAssetURI"]; + + retval.profileCanDoMask = Convert.ToUInt32(reader["profileCanDoMask"].ToString()); + retval.profileWantDoMask = Convert.ToUInt32(reader["profileWantDoMask"].ToString()); + + retval.profileAboutText = (string)reader["profileAboutText"]; + retval.profileFirstText = (string)reader["profileFirstText"]; + + retval.profileImage = new LLUUID((string)reader["profileImage"]); + retval.profileFirstImage = new LLUUID((string)reader["profileFirstImage"]); + + } + else + { + return null; + } + return retval; + } + + /// + /// Reads a list of inventory folders returned by a query. + /// + /// A MySQL Data Reader + /// A List containing inventory folders + public List readInventoryFolders(IDataReader reader) + { + List rows = new List(); + + while(reader.Read()) + { + try + { + InventoryFolderBase folder = new InventoryFolderBase(); + + folder.agentID = new LLUUID((string)reader["agentID"]); + folder.parentID = new LLUUID((string)reader["parentFolderID"]); + folder.folderID = new LLUUID((string)reader["folderID"]); + folder.name = (string)reader["folderName"]; + + rows.Add(folder); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + return rows; + } + + /// + /// Reads a collection of items from an SQL result + /// + /// The SQL Result + /// A List containing Inventory Items + public List readInventoryItems(IDataReader reader) + { + List rows = new List(); + + while (reader.Read()) + { + try + { + InventoryItemBase item = new InventoryItemBase(); + + item.assetID = new LLUUID((string)reader["assetID"]); + item.avatarID = new LLUUID((string)reader["avatarID"]); + item.inventoryCurrentPermissions = Convert.ToUInt32(reader["inventoryCurrentPermissions"].ToString()); + item.inventoryDescription = (string)reader["inventoryDescription"]; + item.inventoryID = new LLUUID((string)reader["inventoryID"]); + item.inventoryName = (string)reader["inventoryName"]; + item.inventoryNextPermissions = Convert.ToUInt32(reader["inventoryNextPermissions"].ToString()); + item.parentFolderID = new LLUUID((string)reader["parentFolderID"]); + item.type = Convert.ToInt32(reader["type"].ToString()); + + rows.Add(item); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + return rows; + } + + /// + /// Inserts a new row into the log database + /// + /// The daemon which triggered this event + /// Who were we operating on when this occured (region UUID, user UUID, etc) + /// The method call where the problem occured + /// The arguments passed to the method + /// How critical is this? + /// Extra message info + /// Saved successfully? + public bool insertLogRow(string serverDaemon, string target, string methodCall, string arguments, int priority, string logMessage) + { + string sql = "INSERT INTO logs (`target`, `server`, `method`, `arguments`, `priority`, `message`) VALUES "; + sql += "(?target, ?server, ?method, ?arguments, ?priority, ?message)"; + + Dictionary parameters = new Dictionary(); + parameters["?server"] = serverDaemon; + parameters["?target"] = target; + parameters["?method"] = methodCall; + parameters["?arguments"] = arguments; + parameters["?priority"] = priority.ToString(); + parameters["?message"] = logMessage; + + bool returnval = false; + + try + { + IDbCommand result = Query(sql, parameters); + + if (result.ExecuteNonQuery() == 1) + returnval = true; + + result.Dispose(); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + return false; + } + + return returnval; + } + + /// + /// Inserts a new item into the database + /// + /// The item + /// Success? + public bool insertItem(InventoryItemBase item) + { + string sql = "REPLACE INTO inventoryitems (inventoryID, assetID, type, parentFolderID, avatarID, inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions) VALUES "; + sql += "(?inventoryID, ?assetID, ?type, ?parentFolderID, ?avatarID, ?inventoryName, ?inventoryDescription, ?inventoryNextPermissions, ?inventoryCurrentPermissions)"; + + Dictionary parameters = new Dictionary(); + parameters["?inventoryID"] = item.inventoryID.ToStringHyphenated(); + parameters["?assetID"] = item.assetID.ToStringHyphenated(); + parameters["?type"] = item.type.ToString(); + parameters["?parentFolderID"] = item.parentFolderID.ToStringHyphenated(); + parameters["?avatarID"] = item.avatarID.ToStringHyphenated(); + parameters["?inventoryName"] = item.inventoryName; + parameters["?inventoryDescription"] = item.inventoryDescription; + parameters["?inventoryNextPermissions"] = item.inventoryNextPermissions.ToString(); + parameters["?inventoryCurrentPermissions"] = item.inventoryCurrentPermissions.ToString(); + + bool returnval = false; + + try + { + IDbCommand result = Query(sql, parameters); + + if (result.ExecuteNonQuery() == 1) + returnval = true; + + result.Dispose(); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + return false; + } + + return returnval; + } + + /// + /// Inserts a new folder into the database + /// + /// The folder + /// Success? + public bool insertFolder(InventoryFolderBase folder) + { + string sql = "REPLACE INTO inventoryfolders (folderID, agentID, parentFolderID, folderName) VALUES "; + sql += "(?folderID, ?agentID, ?parentFolderID, ?folderName)"; + + Dictionary parameters = new Dictionary(); + parameters["?folderID"] = folder.folderID.ToStringHyphenated(); + parameters["?agentID"] = folder.agentID.ToStringHyphenated(); + parameters["?parentFolderID"] = folder.parentID.ToStringHyphenated(); + parameters["?folderName"] = folder.name; + + bool returnval = false; + try + { + IDbCommand result = Query(sql, parameters); + + if (result.ExecuteNonQuery() == 1) + returnval = true; + + result.Dispose(); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + return false; + } + return returnval; + } + + /// + /// Inserts a new region into the database + /// + /// The region to insert + /// Success? + public bool insertRegion(SimProfileData regiondata) + { + string sql = "REPLACE INTO regions (regionHandle, regionName, uuid, regionRecvKey, regionSecret, regionSendKey, regionDataURI, "; + sql += "serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, "; + sql += "regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture) VALUES "; + + sql += "(?regionHandle, ?regionName, ?uuid, ?regionRecvKey, ?regionSecret, ?regionSendKey, ?regionDataURI, "; + sql += "?serverIP, ?serverPort, ?serverURI, ?locX, ?locY, ?locZ, ?eastOverrideHandle, ?westOverrideHandle, ?southOverrideHandle, ?northOverrideHandle, ?regionAssetURI, ?regionAssetRecvKey, "; + sql += "?regionAssetSendKey, ?regionUserURI, ?regionUserRecvKey, ?regionUserSendKey, ?regionMapTexture);"; + + Dictionary parameters = new Dictionary(); + + parameters["?regionHandle"] = regiondata.regionHandle.ToString(); + parameters["?regionName"] = regiondata.regionName.ToString(); + parameters["?uuid"] = regiondata.UUID.ToStringHyphenated(); + parameters["?regionRecvKey"] = regiondata.regionRecvKey.ToString(); + parameters["?regionSecret"] = regiondata.regionSecret.ToString(); + parameters["?regionSendKey"] = regiondata.regionSendKey.ToString(); + parameters["?regionDataURI"] = regiondata.regionDataURI.ToString(); + parameters["?serverIP"] = regiondata.serverIP.ToString(); + parameters["?serverPort"] = regiondata.serverPort.ToString(); + parameters["?serverURI"] = regiondata.serverURI.ToString(); + parameters["?locX"] = regiondata.regionLocX.ToString(); + parameters["?locY"] = regiondata.regionLocY.ToString(); + parameters["?locZ"] = regiondata.regionLocZ.ToString(); + parameters["?eastOverrideHandle"] = regiondata.regionEastOverrideHandle.ToString(); + parameters["?westOverrideHandle"] = regiondata.regionWestOverrideHandle.ToString(); + parameters["?northOverrideHandle"] = regiondata.regionNorthOverrideHandle.ToString(); + parameters["?southOverrideHandle"] = regiondata.regionSouthOverrideHandle.ToString(); + parameters["?regionAssetURI"] = regiondata.regionAssetURI.ToString(); + parameters["?regionAssetRecvKey"] = regiondata.regionAssetRecvKey.ToString(); + parameters["?regionAssetSendKey"] = regiondata.regionAssetSendKey.ToString(); + parameters["?regionUserURI"] = regiondata.regionUserURI.ToString(); + parameters["?regionUserRecvKey"] = regiondata.regionUserRecvKey.ToString(); + parameters["?regionUserSendKey"] = regiondata.regionUserSendKey.ToString(); + parameters["?regionMapTexture"] = regiondata.regionMapTextureID.ToStringHyphenated(); + + bool returnval = false; + + try + { + + IDbCommand result = Query(sql, parameters); + + //Console.WriteLine(result.CommandText); + + if (result.ExecuteNonQuery() == 1) + returnval = true; + + result.Dispose(); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + return false; + } + + return returnval; + } + } +} diff --git a/OpenSim/Framework/Data.MySQL/MySQLUserData.cs b/OpenSim/Framework/Data.MySQL/MySQLUserData.cs new file mode 100644 index 0000000000..c116536372 --- /dev/null +++ b/OpenSim/Framework/Data.MySQL/MySQLUserData.cs @@ -0,0 +1,256 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Data; +using libsecondlife; + +namespace OpenSim.Framework.Data.MySQL +{ + /// + /// A database interface class to a user profile storage system + /// + class MySQLUserData : IUserData + { + /// + /// Database manager for MySQL + /// + public MySQLManager database; + + /// + /// Loads and initialises the MySQL storage plugin + /// + public void Initialise() + { + // Load from an INI file connection details + // TODO: move this to XML? + IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini"); + string settingHostname = GridDataMySqlFile.ParseFileReadValue("hostname"); + string settingDatabase = GridDataMySqlFile.ParseFileReadValue("database"); + string settingUsername = GridDataMySqlFile.ParseFileReadValue("username"); + string settingPassword = GridDataMySqlFile.ParseFileReadValue("password"); + string settingPooling = GridDataMySqlFile.ParseFileReadValue("pooling"); + string settingPort = GridDataMySqlFile.ParseFileReadValue("port"); + + database = new MySQLManager(settingHostname, settingDatabase, settingUsername, settingPassword, settingPooling, settingPort); + } + + /// + /// Searches the database for a specified user profile + /// + /// The account name of the user + /// A user profile + public UserProfileData getUserByName(string name) + { + return getUserByName(name.Split(' ')[0], name.Split(' ')[1]); + } + + /// + /// Searches the database for a specified user profile by name components + /// + /// The first part of the account name + /// The second part of the account name + /// A user profile + public UserProfileData getUserByName(string user, string last) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?first"] = user; + param["?second"] = last; + + IDbCommand result = database.Query("SELECT * FROM users WHERE username = ?first AND lastname = ?second", param); + IDataReader reader = result.ExecuteReader(); + + UserProfileData row = database.readUserRow(reader); + + reader.Close(); + result.Dispose(); + + return row; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Searches the database for a specified user profile by UUID + /// + /// The account ID + /// The users profile + public UserProfileData getUserByUUID(LLUUID uuid) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?uuid"] = uuid.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM users WHERE UUID = ?uuid", param); + IDataReader reader = result.ExecuteReader(); + + UserProfileData row = database.readUserRow(reader); + + reader.Close(); + result.Dispose(); + + return row; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Returns a user session searching by name + /// + /// The account name + /// The users session + public UserAgentData getAgentByName(string name) + { + return getAgentByName(name.Split(' ')[0], name.Split(' ')[1]); + } + + /// + /// Returns a user session by account name + /// + /// First part of the users account name + /// Second part of the users account name + /// The users session + public UserAgentData getAgentByName(string user, string last) + { + UserProfileData profile = getUserByName(user, last); + return getAgentByUUID(profile.UUID); + } + + /// + /// Returns an agent session by account UUID + /// + /// The accounts UUID + /// The users session + public UserAgentData getAgentByUUID(LLUUID uuid) + { + try + { + lock (database) + { + Dictionary param = new Dictionary(); + param["?uuid"] = uuid.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM agents WHERE UUID = ?uuid", param); + IDataReader reader = result.ExecuteReader(); + + UserAgentData row = database.readAgentRow(reader); + + reader.Close(); + result.Dispose(); + + return row; + } + } + catch (Exception e) + { + database.Reconnect(); + Console.WriteLine(e.ToString()); + return null; + } + } + + /// + /// Creates a new users profile + /// + /// The user profile to create + public void addNewUserProfile(UserProfileData user) + { + } + + /// + /// Creates a new agent + /// + /// The agent to create + public void addNewUserAgent(UserAgentData agent) + { + // Do nothing. + } + + /// + /// Performs a money transfer request between two accounts + /// + /// The senders account ID + /// The recievers account ID + /// The amount to transfer + /// Success? + public bool moneyTransferRequest(LLUUID from, LLUUID to, uint amount) + { + return false; + } + + /// + /// Performs an inventory transfer request between two accounts + /// + /// TODO: Move to inventory server + /// The senders account ID + /// The recievers account ID + /// The item to transfer + /// Success? + public bool inventoryTransferRequest(LLUUID from, LLUUID to, LLUUID item) + { + return false; + } + + /// + /// Database provider name + /// + /// Provider name + public string getName() + { + return "MySQL Userdata Interface"; + } + + /// + /// Database provider version + /// + /// provider version + public string getVersion() + { + return "0.1"; + } + } +} diff --git a/OpenSim/Framework/Data.MySQL/OpenSim.Framework.Data.MySQL.csproj b/OpenSim/Framework/Data.MySQL/OpenSim.Framework.Data.MySQL.csproj new file mode 100644 index 0000000000..9b47577b95 --- /dev/null +++ b/OpenSim/Framework/Data.MySQL/OpenSim.Framework.Data.MySQL.csproj @@ -0,0 +1,115 @@ + + + Local + 8.0.50727 + 2.0 + {17F7F6BE-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Data.MySQL + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Data.MySQL + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libsecondlife.dll + False + + + ..\..\..\bin\MySql.Data.dll + False + + + OpenSim.Framework.Data.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Xml.dll + False + + + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Data.MySQL/OpenSim.Framework.Data.MySQL.csproj.user b/OpenSim/Framework/Data.MySQL/OpenSim.Framework.Data.MySQL.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Data.MySQL/OpenSim.Framework.Data.MySQL.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Data.MySQL/Properties/AssemblyInfo.cs b/OpenSim/Framework/Data.MySQL/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..52d6a54499 --- /dev/null +++ b/OpenSim/Framework/Data.MySQL/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Framework.Data.MySQL")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Framework.Data.MySQL")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e49826b2-dcef-41be-a5bd-596733fa3304")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Framework/Data.MySQL/obj/Debug/OpenSim.Framework.Data.MySQL.dll b/OpenSim/Framework/Data.MySQL/obj/Debug/OpenSim.Framework.Data.MySQL.dll new file mode 100644 index 0000000000000000000000000000000000000000..3cc5abc38fc98dd8b855c444a5168214be8b5a36 GIT binary patch literal 40960 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 QsA{09fvN`nAJ)MC1(Q4}TL1t6 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.MySQL/obj/Debug/OpenSim.Framework.Data.MySQL.pdb b/OpenSim/Framework/Data.MySQL/obj/Debug/OpenSim.Framework.Data.MySQL.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ee032789f68231cdd89aaa07787429a9bb9a1362 GIT binary patch literal 50688 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 ND1k-^{HICa{{sepa037U literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.MySQL/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Framework/Data.MySQL/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..a702f48a61ee7053a68eb3b27904e3bd181e45e7 GIT binary patch literal 13897 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 URRq7HsvtR6b=&dUJgU|I0~_xUc>n+a literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.MySQL/obj/OpenSim.Framework.Data.MySQL.csproj.FileList.txt b/OpenSim/Framework/Data.MySQL/obj/OpenSim.Framework.Data.MySQL.csproj.FileList.txt new file mode 100644 index 0000000000..c93459e3aa --- /dev/null +++ b/OpenSim/Framework/Data.MySQL/obj/OpenSim.Framework.Data.MySQL.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.Data.MySQL.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.Data.MySQL.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Data.MySQL.dll +obj\Debug\OpenSim.Framework.Data.MySQL.pdb +..\..\..\bin\OpenSim.Framework.Data.MySQL.pdb diff --git a/OpenSim/Framework/Data.MySQL/obj/Release/OpenSim.Framework.Data.MySQL.dll b/OpenSim/Framework/Data.MySQL/obj/Release/OpenSim.Framework.Data.MySQL.dll new file mode 100644 index 0000000000000000000000000000000000000000..89a14d6154ceda9932352b3be6996de0911aa1ac GIT binary patch literal 36864 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 + + Local + 8.0.50727 + 2.0 + {6ECC56A9-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Data.SQLite + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Data.SQLite + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libsecondlife.dll + False + + + OpenSim.Framework.Data.dll + False + + + System.dll + False + + + System.Data.dll + False + + + ..\..\..\bin\System.Data.SQLite.dll + False + + + System.Xml.dll + False + + + + + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Data.SQLite/OpenSim.Framework.Data.SQLite.csproj.user b/OpenSim/Framework/Data.SQLite/OpenSim.Framework.Data.SQLite.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Data.SQLite/OpenSim.Framework.Data.SQLite.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Data.SQLite/Properties/AssemblyInfo.cs b/OpenSim/Framework/Data.SQLite/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..9de5edbc53 --- /dev/null +++ b/OpenSim/Framework/Data.SQLite/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Framework.Data.SQLite")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Framework.Data.SQLite")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6113d5ce-4547-49f4-9236-0dcc503457b1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Framework/Data.SQLite/SQLiteGridData.cs b/OpenSim/Framework/Data.SQLite/SQLiteGridData.cs new file mode 100644 index 0000000000..511c5f020c --- /dev/null +++ b/OpenSim/Framework/Data.SQLite/SQLiteGridData.cs @@ -0,0 +1,197 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Data; +using System.Security.Cryptography; +using System.Text; +using libsecondlife; + +namespace OpenSim.Framework.Data.SQLite +{ + /// + /// A Grid Interface to the SQLite database + /// + public class SQLiteGridData : IGridData + { + /// + /// A database manager + /// + private SQLiteManager database; + + /// + /// Initialises the Grid Interface + /// + public void Initialise() + { + database = new SQLiteManager("localhost", "db", "user", "password", "false"); + } + + /// + /// Shuts down the grid interface + /// + public void Close() + { + database.Close(); + } + + /// + /// Returns the name of this grid interface + /// + /// A string containing the grid interface + public string getName() + { + return "SQLite OpenGridData"; + } + + /// + /// Returns the version of this grid interface + /// + /// A string containing the version + public string getVersion() + { + return "0.1"; + } + + /// + /// Returns a list of regions within the specified ranges + /// + /// minimum X coordinate + /// minimum Y coordinate + /// maximum X coordinate + /// maximum Y coordinate + /// An array of region profiles + public SimProfileData[] GetProfilesInRange(uint a, uint b, uint c, uint d) + { + return null; + } + + /// + /// Returns a sim profile from it's location + /// + /// Region location handle + /// Sim profile + public SimProfileData GetProfileByHandle(ulong handle) + { + Dictionary param = new Dictionary(); + param["handle"] = handle.ToString(); + + IDbCommand result = database.Query("SELECT * FROM regions WHERE handle = @handle", param); + IDataReader reader = result.ExecuteReader(); + + SimProfileData row = database.getRow(reader); + reader.Close(); + result.Dispose(); + + return row; + } + + /// + /// Returns a sim profile from it's UUID + /// + /// The region UUID + /// The sim profile + public SimProfileData GetProfileByLLUUID(LLUUID uuid) + { + Dictionary param = new Dictionary(); + param["uuid"] = uuid.ToStringHyphenated(); + + IDbCommand result = database.Query("SELECT * FROM regions WHERE uuid = @uuid", param); + IDataReader reader = result.ExecuteReader(); + + SimProfileData row = database.getRow(reader); + reader.Close(); + result.Dispose(); + + return row; + } + + /// + /// Adds a new specified region to the database + /// + /// The profile to add + /// A dataresponse enum indicating success + public DataResponse AddProfile(SimProfileData profile) + { + if (database.insertRow(profile)) + { + return DataResponse.RESPONSE_OK; + } + else + { + return DataResponse.RESPONSE_ERROR; + } + } + + /// + /// DEPRECIATED. Attempts to authenticate a region by comparing a shared secret. + /// + /// The UUID of the challenger + /// The attempted regionHandle of the challenger + /// The secret + /// Whether the secret and regionhandle match the database entry for UUID + public bool AuthenticateSim(LLUUID uuid, ulong handle, string authkey) + { + bool throwHissyFit = false; // Should be true by 1.0 + + if (throwHissyFit) + throw new Exception("CRYPTOWEAK AUTHENTICATE: Refusing to authenticate due to replay potential."); + + SimProfileData data = GetProfileByLLUUID(uuid); + + return (handle == data.regionHandle && authkey == data.regionSecret); + } + + /// + /// NOT YET FUNCTIONAL. Provides a cryptographic authentication of a region + /// + /// This requires a security audit. + /// + /// + /// + /// + /// + public bool AuthenticateSim(LLUUID uuid, ulong handle, string authhash, string challenge) + { + SHA512Managed HashProvider = new SHA512Managed(); + ASCIIEncoding TextProvider = new ASCIIEncoding(); + + byte[] stream = TextProvider.GetBytes(uuid.ToStringHyphenated() + ":" + handle.ToString() + ":" + challenge); + byte[] hash = HashProvider.ComputeHash(stream); + + return false; + } + + public ReservationData GetReservationAtPoint(uint x, uint y) + { + return null; + } + } + + +} diff --git a/OpenSim/Framework/Data.SQLite/SQLiteManager.cs b/OpenSim/Framework/Data.SQLite/SQLiteManager.cs new file mode 100644 index 0000000000..c9931ab644 --- /dev/null +++ b/OpenSim/Framework/Data.SQLite/SQLiteManager.cs @@ -0,0 +1,206 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SQLite; +using libsecondlife; + +namespace OpenSim.Framework.Data.SQLite +{ + class SQLiteManager + { + IDbConnection dbcon; + + /// + /// Initialises and creates a new SQLite connection and maintains it. + /// + /// The SQLite server being connected to + /// The name of the SQLite database being used + /// The username logging into the database + /// The password for the user logging in + /// Whether to use connection pooling or not, can be one of the following: 'yes', 'true', 'no' or 'false', if unsure use 'false'. + public SQLiteManager(string hostname, string database, string username, string password, string cpooling) + { + try + { + string connectionString = "URI=file:GridServerSqlite.db;"; + dbcon = new SQLiteConnection(connectionString); + + dbcon.Open(); + } + catch (Exception e) + { + throw new Exception("Error initialising SQLite Database: " + e.ToString()); + } + } + + /// + /// Shuts down the database connection + /// + public void Close() + { + dbcon.Close(); + dbcon = null; + } + + /// + /// Runs a query with protection against SQL Injection by using parameterised input. + /// + /// The SQL string - replace any variables such as WHERE x = "y" with WHERE x = @y + /// The parameters - index so that @y is indexed as 'y' + /// A SQLite DB Command + public IDbCommand Query(string sql, Dictionary parameters) + { + SQLiteCommand dbcommand = (SQLiteCommand)dbcon.CreateCommand(); + dbcommand.CommandText = sql; + foreach (KeyValuePair param in parameters) + { + SQLiteParameter paramx = new SQLiteParameter(param.Key,param.Value); + dbcommand.Parameters.Add(paramx); + } + + return (IDbCommand)dbcommand; + } + + /// + /// Reads a region row from a database reader + /// + /// An active database reader + /// A region profile + public SimProfileData getRow(IDataReader reader) + { + SimProfileData retval = new SimProfileData(); + + if (reader.Read()) + { + // Region Main + retval.regionHandle = (ulong)reader["regionHandle"]; + retval.regionName = (string)reader["regionName"]; + retval.UUID = new LLUUID((string)reader["uuid"]); + + // Secrets + retval.regionRecvKey = (string)reader["regionRecvKey"]; + retval.regionSecret = (string)reader["regionSecret"]; + retval.regionSendKey = (string)reader["regionSendKey"]; + + // Region Server + retval.regionDataURI = (string)reader["regionDataURI"]; + retval.regionOnline = false; // Needs to be pinged before this can be set. + retval.serverIP = (string)reader["serverIP"]; + retval.serverPort = (uint)reader["serverPort"]; + retval.serverURI = (string)reader["serverURI"]; + + // Location + retval.regionLocX = (uint)((int)reader["locX"]); + retval.regionLocY = (uint)((int)reader["locY"]); + retval.regionLocZ = (uint)((int)reader["locZ"]); + + // Neighbours - 0 = No Override + retval.regionEastOverrideHandle = (ulong)reader["eastOverrideHandle"]; + retval.regionWestOverrideHandle = (ulong)reader["westOverrideHandle"]; + retval.regionSouthOverrideHandle = (ulong)reader["southOverrideHandle"]; + retval.regionNorthOverrideHandle = (ulong)reader["northOverrideHandle"]; + + // Assets + retval.regionAssetURI = (string)reader["regionAssetURI"]; + retval.regionAssetRecvKey = (string)reader["regionAssetRecvKey"]; + retval.regionAssetSendKey = (string)reader["regionAssetSendKey"]; + + // Userserver + retval.regionUserURI = (string)reader["regionUserURI"]; + retval.regionUserRecvKey = (string)reader["regionUserRecvKey"]; + retval.regionUserSendKey = (string)reader["regionUserSendKey"]; + } + else + { + throw new Exception("No rows to return"); + } + return retval; + } + + /// + /// Inserts a new region into the database + /// + /// The region to insert + /// Success? + public bool insertRow(SimProfileData profile) + { + string sql = "REPLACE INTO regions VALUES (regionHandle, regionName, uuid, regionRecvKey, regionSecret, regionSendKey, regionDataURI, "; + sql += "serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, "; + sql += "regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey) VALUES "; + + sql += "(@regionHandle, @regionName, @uuid, @regionRecvKey, @regionSecret, @regionSendKey, @regionDataURI, "; + sql += "@serverIP, @serverPort, @serverURI, @locX, @locY, @locZ, @eastOverrideHandle, @westOverrideHandle, @southOverrideHandle, @northOverrideHandle, @regionAssetURI, @regionAssetRecvKey, "; + sql += "@regionAssetSendKey, @regionUserURI, @regionUserRecvKey, @regionUserSendKey);"; + + Dictionary parameters = new Dictionary(); + + parameters["regionHandle"] = profile.regionHandle.ToString(); + parameters["regionName"] = profile.regionName; + parameters["uuid"] = profile.UUID.ToString(); + parameters["regionRecvKey"] = profile.regionRecvKey; + parameters["regionSendKey"] = profile.regionSendKey; + parameters["regionDataURI"] = profile.regionDataURI; + parameters["serverIP"] = profile.serverIP; + parameters["serverPort"] = profile.serverPort.ToString(); + parameters["serverURI"] = profile.serverURI; + parameters["locX"] = profile.regionLocX.ToString(); + parameters["locY"] = profile.regionLocY.ToString(); + parameters["locZ"] = profile.regionLocZ.ToString(); + parameters["eastOverrideHandle"] = profile.regionEastOverrideHandle.ToString(); + parameters["westOverrideHandle"] = profile.regionWestOverrideHandle.ToString(); + parameters["northOverrideHandle"] = profile.regionNorthOverrideHandle.ToString(); + parameters["southOverrideHandle"] = profile.regionSouthOverrideHandle.ToString(); + parameters["regionAssetURI"] = profile.regionAssetURI; + parameters["regionAssetRecvKey"] = profile.regionAssetRecvKey; + parameters["regionAssetSendKey"] = profile.regionAssetSendKey; + parameters["regionUserURI"] = profile.regionUserURI; + parameters["regionUserRecvKey"] = profile.regionUserRecvKey; + parameters["regionUserSendKey"] = profile.regionUserSendKey; + + bool returnval = false; + + try + { + IDbCommand result = Query(sql, parameters); + + if (result.ExecuteNonQuery() == 1) + returnval = true; + + result.Dispose(); + } + catch (Exception) + { + return false; + } + + return returnval; + } + } +} diff --git a/OpenSim/Framework/Data.SQLite/obj/Debug/OpenSim.Framework.Data.SQLite.dll b/OpenSim/Framework/Data.SQLite/obj/Debug/OpenSim.Framework.Data.SQLite.dll new file mode 100644 index 0000000000000000000000000000000000000000..470465234c80d789de6dd84744d0b16d6818c568 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.SQLite/obj/Debug/OpenSim.Framework.Data.SQLite.pdb b/OpenSim/Framework/Data.SQLite/obj/Debug/OpenSim.Framework.Data.SQLite.pdb new file mode 100644 index 0000000000000000000000000000000000000000..774da0e4871595f961bef32ac18d6a23111a3f44 GIT binary patch literal 19968 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.SQLite/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Framework/Data.SQLite/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..8974db715a4fc654caabd7727e8123ef5bda50ee GIT binary patch literal 12660 zcmeHNUyu|>8K2&p+ufNvZaI)hNW{BmD-R)+<=ps|qG4v^yEW&4)7dtu z+m2xsHuc84@vpNjQ8eA6t#2ymMc3BM&bIMl+B7ns(r0&D2lT?Gba!8FeQraprzg9< zTkF#r@tXF)(&Ncl$JO&mS95h}DLKQ`Icm7IloU@`rm1IKs(};Vra3dNmNs?NS7{(2 zL;PRW2q~!BEiF5uWn9aSc;-YCR{o%7>-JIJDH`;y(Q;X91L{1wp!|RCy8FH`YNa-jRAh)o5=#-oUl^&Y5`$C8;k8e8krB`XiQoAU>?Q8rP4K{_1#qs`MX) znMT^tGgcvM8abWoD5SH-r{fvJOG)n9PW6D|QdE`KS*3`=O=w1J35iBL>-fN~?ieX| zGYV=pHOC#ZvPRC(v(1|0==rocyMwG~&gx`TRxe}>-D!3*n(OK|@;Z_%hnI9-{i5Uy z^=LLeBouM~qpn^6e?gh}^<>z)4_WXhy>tBU|9JYX6G{ukl^DcQ5)8J(VCl(I(tAj6 zrMR*TVmS$hX5r}<=9@ZBQTj)av;yKLq@%@r=^sVXN{E|DG~#vFZDWh(i1tS{C+XTo zVY-2>_BwPz&v_%t*HU~;t)f?|5tt}pJn|uS-BnO-p{&ZS5FaDaipD}gev&tkn!p=g>Bv^}plA4=C>@ixk?v_sqmv4%t|x)On*_jv8sQY8Ed62rb> zRIPM(d|+{|l2;mpxRFZVPT7?^Ant@%N1_${LSUd2uk>9M33rf~TsW?)HAi#zFUrej z(*u1Q(wW|De}695(>D+SZ*RnmPRg!)5+V-KMWPkM06_*XKY+g&ZH+0o4K-Dnkz&;- zpPZUg-t0A6$XQAXet(PR=+TrnEwrTIu7}KN%QoDZ{7OF@vFwCZaBa(6mZDK*6{hhz znkL3I!(LG?gU<%8k%sG@4W~v-ZQ6y}|<1HZHb4Uj2P75by%gLGk7Zg}bTu!lfxrReA^~K|O zBPH@S-$aq#YqfcBZmbKGdnq5g=rx->N8mRepaiP(uL+?YVGsKiMbH2xbK2+;uW*8E zwwK{Bhj7I_^?nZFlsO#X5YCuex0NDGd=6Pvw$U?g)F?&PUCSt6CT`0Eq|RQW`hf!S z9D(y5painzRYDb8eoCNf3%oI}-cGIwzs%t{hw#uG?&1)>n!^bW;iI`NNs27<2A#0} zQg%a)8}uN>;@2{0VNPzGgJoW%qzN=L%3-Ur#Ot4 z;XV%Gx_Rn;z!*j|LP*9iy~@>Lq7J9Vw1+L5evATs`1V6dP3VUVtlW?{N&&xOkU{=h zn-oIzNr9$RZ&FB62S@Wx#(wIL4H-yNU}2mdD*uFpt2W4CV$goGUXvx4i{M` z4c}wc=1L+*9ULxsKvkJ0P@>EX#n@?qCG2YgP}x^S$~^C*45raKWono*dFo)*n>6?2 zO;y31Q=*Lp+B_pLg?(87DtlU_%_)&KF|4Q%LJUhI%zaq;h(X4Br_QVzW|m7GEX-g< zf+b!Zq8K|VP>G!ofXbc_dG)x+D;cZeI%#T{G)Jg|uinWVtuW_vV9sL#S=i?Vpt3oU zImZZKZ$f!!?Sl33 zRl}@$hB{bS_dH9mO_oS@Z7Q^TY=O&wgBy}n+d%seQQ z6IjA@0jMl1QYPc03{F|=l&N9LoS_c(?cBdzq0L!}v6R3RwqF1$+efIf=$Rr=UG(5I zzD}DOrp@=LgUc5Y!?yMaeIKDJFVVx&B=s_=vqxYH`?LU5HYrl)L6JH!+|Zn*zmP;1 zQ}Uc7Jx?HvZz~8-B!_zN?F^%TjW3?KJo&_%fBRYcr7Qc6Z@pvaylgym`u5Gw?Y%U7=aPTD_?hFqxziiucjkxw@&dzcka#GCt0@E-S3Gt0*D(8Ep$={m?g&-oNA#pb{c{v!y9BngaRI1o zr%3%BBK2k51=e{}!@PNwI#^iLpRbVSHIU{3fhTNK04m!il4h%qG`KOYlct7A^GoXB z<({+IZEFRGKEtI;eMePZukhyr_>&MQ!?p-OWkVu=Hv9O4PYmk(sbT(Hqzl9s#IqP^8R&NSW9}locP7gnoW_YVzj(zn*0HoB&H9EYrjg!}YOWb%ve< zs^ZGfuZpX~KvmoV`BiZn6sU@0e}oXju|HH0#Iv**j(Pp1;kY-jG#u|Cgcy$Z%BAr~ zo`~V3#$OsvYywNe4&AScoqC`uc4dCmv)59^Dx9nS_`cM!)<3F)46E_LQn70Bmx|R( fpep7nzbfXeKvlRUzbf2QpepF-R|PGDRGa<>f&yvZ literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.SQLite/obj/OpenSim.Framework.Data.SQLite.csproj.FileList.txt b/OpenSim/Framework/Data.SQLite/obj/OpenSim.Framework.Data.SQLite.csproj.FileList.txt new file mode 100644 index 0000000000..3d9d645afd --- /dev/null +++ b/OpenSim/Framework/Data.SQLite/obj/OpenSim.Framework.Data.SQLite.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.Data.SQLite.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.Data.SQLite.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Data.SQLite.dll +obj\Debug\OpenSim.Framework.Data.SQLite.pdb +..\..\..\bin\OpenSim.Framework.Data.SQLite.pdb diff --git a/OpenSim/Framework/Data.SQLite/obj/Release/OpenSim.Framework.Data.SQLite.dll b/OpenSim/Framework/Data.SQLite/obj/Release/OpenSim.Framework.Data.SQLite.dll new file mode 100644 index 0000000000000000000000000000000000000000..2a40d65ddb3d16bea25121fb6357648c5ef9a05f GIT binary patch literal 24576 zcmeHPe{dYtegE$6-Jb3w9q4RJ2wQk%V_O#XA=@(8fdRwN~Ir%i|aXlXiRl1VZYiW!(B4ec<6WJ*bxwkc)k589+n6Wnx?hT)&43~fW2 z3H0-QZ&!CK$;L_gPugA2efPc3_xs-azR&xG1Rt$ml0osCKZQ4bJ9qUn8J`aY3w5%{&zZ${XEar`bMa6Zs4 zz{rTae_m7zn}6&l%5v&Hq9>S$rN;tM(^Bke@&*xluy`~ee{eBJly=SYF7mw_AfOX{ z_54Oo90t5f+m4+_PWW~o5^U3lU)|9MByF1|3x>ki1t{5W6u-KokBC_ekC1_ofslca zfslcafslcafslcafslcaf&YgLTuf(hra$Tz+oYfE?=;k{38J2Wfzlqw`B74{? zxCRF5YEe};w`ami<@RK~tx&t`V4u)6s|}fmbsc2$O zO}f>AQ-gH_q7*X-Xw2d#|&E@Ib1nTLR9_9H$j=$_vs(Psjvvl-|-hJ*`zEufn3lIW{J zbgM*v6hz@Q*RV?Q9Fa}l#AxgMHmSThsN62mejmLE2bKA>M34EXtmtNmp7zm;a9f%0 zk!UrD?vUt*g6K|(KCp-irglm6OF^_(qTdLjyCwS5AbN{LH>rV+-zw38Ai77Q#UQ#@ zqQ4bH-y_k_2hrOk`qx49cAz&k+HV4tvCTomal0Pjfeoq_yG_Fk(d|TpDq;#CeKJ~0 zt9mW{QeApagO59yLy5+ih%{}E1FY-45Y`qU|Hp{`|0USBnEC-ASaL{OT94lRYHI#!!o8?&X%s5`OIS!M0 zGmaN+j>DuL<#^HNI85qMju&l?!=%2y9531&he7&XtNw49>7te&2n&f00)RR%W>fW92?p!hlB@kSZK2x4FYIwQuSCD)(pKlZuJ9g z+oiTO#l<>vN#ESMDso9}=x&L0d+Xp^%DUC6&gszWO!CTRo2-jknpKLbZ>^ue(MS+&mg@_mJz8kw@cQxO6703`CROVBLxH=2m9- z26_4G#-?lb&V7n^Mdkh3vpds0>D@iI?nHp`2$UcnL%%kD5Zkus%oA{GW7f5cWei~8s zd^gfMJuc)6LXO6E#dNwqb}!_4AwL3yd0<9Z^7&fYM(+VXoKujyN90u0rO=lJV?9bQ zjT&6y!`D5J_7wVp%+a4w8|=R7<=&>X$PIQ1OIojN!5f3~8)a^@lBPI4y@_)_Q1&Wq zsQI6~9M_Vd*Sy@IvIn_;^K!!?_n%(wm~uOGZ+W@*G8By=;QArv@jn*kw(uT9igv6 zM(IUJh1Ow2R5BnHS{-HiM>@-YfK=&QkQ#j(GD5Ek{GWyV4TMB77uOO26_(6>CCN2#4|ihPn@r$WTW4Es>zQSkWL$kViro{0Q8 z*6J_gw&{OnYihbHo5_dQtm?@)`Ofe2pw{1l1q7bR%kNheDGg6STq-jU#CH zu)qjWP&@ePM7DriDREq&S1=RAar+^wP%WA7rICtR&K9TB`|-ZiJZIUb(}OuTm(Jcj zTy)KJp;RK7Jd`WvCQbXw_MYtlyI9~_XxhnJcBwc)*%`+*r)gy3elzc0rVh$1mXqef z6Uq!u3|Qqd$`!3L6(;hK>AY*%G*Ge}Q|hOubLE29N_xO5m87|oK46wjyO^iJq9~uU zXYSiccUMh&hS2L#+d5S&nZnl$%P})oKqn_ncg#9R#j<1CB2|EHBFC+ji*7MjDk2G^ z!{Ch1M@`#d?+%!*SEZ9FkLAjfW*xL|<{+FbnFK-{6Wu73ilU zITZ_TP=BG|RZaa>cgifg#eB{+(Fqze;pW*K^CNnKs_LMAchoADU7wsW^OQ#p^*fF^ zJyDw34+^{<^t-s`PgGsB=P8#dys;Up!h>luohiGfZB?@HpqMuuI#4YZYPAel(?^R= zaiV0_Fu&%3YRRqID=3cG7=-DZeR_p5R%OO6PENVYRbZ!3&99(<50zYbW_byO)v4lS z)fUVxR}Y#_-Y!;{*5%40MYq0BOGx1+L8`sTiUdSMV`eFLUZk8_wH}+oRkt`%EEU~4 zho>yZEpw<(GF0BF^BMoMK{KSj>rOEmsW2Fa>zFN>j&lPkQMi{H4KAxjJov zY|LClXkG3ubLMESR5eF)MH{nolFLZv$@j5l?`?oY-oBN{7qMgGNhz?n2 z&BN?VX0V8P<>U~USQ=Sihwgc9RGRZ!XJ>SO>&3 zmiaL=f0o^rxvZJDO?NR){7WzBj9 z#?jka8O{ZZFyfb}$mJR=xF^Mk44pUgSga0PWx1s1XoB)opeeb~dTMV`uVQ6djQ)c& z6|A8M>;mP`)6*C%t8#MaOciUpJ0q~EoHIrFsT?jQypVfS9D`Z4VUixOXDTj#W>lHN zwd7#`?j1YjHFEJfB%;1QJCMl?mGf4CXX#=BGhpA0i}ms#TInxMTBvhsnlN7~=n#W+ z9(Raz+c=F;2K$+(sEDUD6L78>TcB3%O&*?_XgyepHQb(8Do~^Etz-$$(XjP7$?(TV zYwD3v!3FAHRgZdQ<0WYGc$OkBb$l^(f@qT|_`to3$G98=GswoKb7SbENNro zVf5M%aeEFe80d-2bDyff%R~!rjL{H=cbNKd3qAy+3>~H;ppy&MLY0djh0QRW973QQ z)D_Uzhw`>1W&L1g+z;oaHo@*K)pE!DkX}hw3+koXU|6%3E@XLB>tmbYdd!dRrMQd( zM*Rq{rH^AL!N*UC^wq>Um${lqXS=J5b+){^XlKj%Azm8qm)9>JELwPE<*I@qxwJ|@ zxNF4L*WzoJH@A{iu%)f&Trgf~;p<)07wGZQpbcv4!?rIFxIw$+?gjPiSbgv=*9OBk zs9!07Pxl4Fm6vB`Hi*^-aZpoZyDt#Peolt6pOeAdhfeTi?8*zW^x|p*n!UQ3%rX+-s3b+ zq3q&4%keBO2E+Ib;F4irPuigUxXT)$LrB&4l`kL1aD^X&mM=2(wHUZ3>6M9GU!S_&O^98G+=Myc9E&%n?An9 zlb6sOFuv(vs$A&uAcb!j4bWQ^=h~&V0;+SkNi#sLC9Gr_9s;~o)38+)-#>kC`qSGE zJ^A7*cMQ_S0cv>W1MffD-uvALG(FYaU__N9ADTf*qoJl+l50|H)MQdOlvI1FBWfsW zsvVXMFi6IYNJpwYjstkAy-^sobmG*qDb*e`G_|F(G1*{5#2Iy{sjcyN#88wZ3zbDf z!?%BD_JzM6d1G&s&`vTMQdcxJwgn=qLG$a9s@|yTNlkC*RCQI=vzdw`5Q<0}osREzy zX4u=PSzgn}giQ~=F_r&%u}cOHuwiop%KG+$Xx$OJwMA^#)VJgBjAhZnG&XMb3y=66 zo!nPD4b0yyOT(Ain?U~W02=DrIEpg1*i!QQumfdze@*__rwy=Y7I;&M-_!7Bk-r~J zU|a6e{p`M^QFjUdc$`ycV;J>MirNRjXa(C;%-|%pwy=|kt+1t-K~G}Sz@VM*wTJkV z*OKsc#4E?!WbCWYC+Ea_%>Nai-!H~$6m3~zqb(0FYpnbtyx{+C5Mvaqd+A6m9j85_ zjK9G=jfg6VjlOp)2in3TWFTZ9WFTZ9WFTZ9WFTZ9WFTZ9WZ)NLpilnoUl0DYHatQG iLIy$xLIy$xLIy$xLIy$xLIy$xLIy$xLI(bCGVnk7PODP@ literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data.SQLite/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Framework/Data.SQLite/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..1b4d5ce8ae1002bd3463bffaf630790a48cd4230 GIT binary patch literal 12660 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 WRE1metHM16s)CMwRnRg>wdsFJx@T+v literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data/GridData.cs b/OpenSim/Framework/Data/GridData.cs new file mode 100644 index 0000000000..5a17d2044b --- /dev/null +++ b/OpenSim/Framework/Data/GridData.cs @@ -0,0 +1,111 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Data +{ + public enum DataResponse + { + RESPONSE_OK, + RESPONSE_AUTHREQUIRED, + RESPONSE_INVALIDCREDENTIALS, + RESPONSE_ERROR + } + + /// + /// A standard grid interface + /// + public interface IGridData + { + /// + /// Returns a sim profile from a regionHandle + /// + /// A 64bit Region Handle + /// A simprofile + SimProfileData GetProfileByHandle(ulong regionHandle); + + /// + /// Returns a sim profile from a UUID + /// + /// A 128bit UUID + /// A sim profile + SimProfileData GetProfileByLLUUID(LLUUID UUID); + + /// + /// Returns all profiles within the specified range + /// + /// Minimum sim coordinate (X) + /// Minimum sim coordinate (Y) + /// Maximum sim coordinate (X) + /// Maximum sim coordinate (Y) + /// An array containing all the sim profiles in the specified range + SimProfileData[] GetProfilesInRange(uint Xmin, uint Ymin, uint Xmax, uint Ymax); + + /// + /// Authenticates a sim by use of it's recv key. + /// WARNING: Insecure + /// + /// The UUID sent by the sim + /// The regionhandle sent by the sim + /// The recieving key sent by the sim + /// Whether the sim has been authenticated + bool AuthenticateSim(LLUUID UUID, ulong regionHandle, string simrecvkey); + + /// + /// Initialises the interface + /// + void Initialise(); + + /// + /// Closes the interface + /// + void Close(); + + /// + /// The plugin being loaded + /// + /// A string containing the plugin name + string getName(); + + /// + /// The plugins version + /// + /// A string containing the plugin version + string getVersion(); + + /// + /// Adds a new profile to the database + /// + /// The profile to add + /// RESPONSE_OK if successful, error if not. + DataResponse AddProfile(SimProfileData profile); + + ReservationData GetReservationAtPoint(uint x, uint y); + + } +} diff --git a/OpenSim/Framework/Data/ILogData.cs b/OpenSim/Framework/Data/ILogData.cs new file mode 100644 index 0000000000..059fef533f --- /dev/null +++ b/OpenSim/Framework/Data/ILogData.cs @@ -0,0 +1,90 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Framework.Data +{ + /// + /// The severity of an individual log message + /// + public enum LogSeverity : int + { + /// + /// Critical: systems failure + /// + CRITICAL = 1, + /// + /// Major: warning prior to systems failure + /// + MAJOR = 2, + /// + /// Medium: an individual non-critical task failed + /// + MEDIUM = 3, + /// + /// Low: Informational warning + /// + LOW = 4, + /// + /// Info: Information + /// + INFO = 5, + /// + /// Verbose: Debug Information + /// + VERBOSE = 6 + } + + /// + /// An interface to a LogData storage system + /// + public interface ILogData + { + void saveLog(string serverDaemon, string target, string methodCall, string arguments, int priority,string logMessage); + /// + /// Initialises the interface + /// + void Initialise(); + + /// + /// Closes the interface + /// + void Close(); + + /// + /// The plugin being loaded + /// + /// A string containing the plugin name + string getName(); + + /// + /// The plugins version + /// + /// A string containing the plugin version + string getVersion(); + } + +} diff --git a/OpenSim/Framework/Data/IniConfig.cs b/OpenSim/Framework/Data/IniConfig.cs new file mode 100644 index 0000000000..2b52fd1d65 --- /dev/null +++ b/OpenSim/Framework/Data/IniConfig.cs @@ -0,0 +1,96 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.IO; +using System.Text.RegularExpressions; +/* + Taken from public code listing at by Alex Pinsker + http://alexpinsker.blogspot.com/2005/12/reading-ini-file-from-c_113432097333021549.html + */ + +namespace OpenSim.Framework.Data +{ + /// + /// Parse settings from ini-like files + /// + public class IniFile + { + static IniFile() + { + _iniKeyValuePatternRegex = new Regex( + @"((\s)*(?([^\=^\s^\n]+))[\s^\n]* + # key part (surrounding whitespace stripped) + \= + (\s)*(?([^\n^\s]+(\n){0,1}))) + # value part (surrounding whitespace stripped) + ", + RegexOptions.IgnorePatternWhitespace | + RegexOptions.Compiled | + RegexOptions.CultureInvariant); + } + static private Regex _iniKeyValuePatternRegex; + + public IniFile(string iniFileName) + { + _iniFileName = iniFileName; + } + + public string ParseFileReadValue(string key) + { + using (StreamReader reader = + new StreamReader(_iniFileName)) + { + do + { + string line = reader.ReadLine(); + Match match = + _iniKeyValuePatternRegex.Match(line); + if (match.Success) + { + string currentKey = + match.Groups["Key"].Value as string; + if (currentKey != null && + currentKey.Trim().CompareTo(key) == 0) + { + string value = + match.Groups["Value"].Value as string; + return value; + } + } + + } + while (reader.Peek() != -1); + } + return null; + } + + public string IniFileName + { + get { return _iniFileName; } + } private string _iniFileName; + } +} diff --git a/OpenSim/Framework/Data/InventoryData.cs b/OpenSim/Framework/Data/InventoryData.cs new file mode 100644 index 0000000000..c2a1d0637a --- /dev/null +++ b/OpenSim/Framework/Data/InventoryData.cs @@ -0,0 +1,185 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using libsecondlife; + +namespace OpenSim.Framework.Data +{ + /// + /// Inventory Item - contains all the properties associated with an individual inventory piece. + /// + public class InventoryItemBase + { + /// + /// A UUID containing the ID for the inventory item itself + /// + public LLUUID inventoryID; + /// + /// The UUID of the associated asset on the asset server + /// + public LLUUID assetID; + /// + /// This is an enumerated value determining the type of asset (eg Notecard, Sound, Object, etc) + /// + public int type; + /// + /// The folder this item is contained in (NULL_KEY = Inventory Root) + /// + public LLUUID parentFolderID; + /// + /// The owner of this inventory item + /// + public LLUUID avatarID; + /// + /// The name of the inventory item (must be less than 64 characters) + /// + public string inventoryName; + /// + /// The description of the inventory item (must be less than 64 characters) + /// + public string inventoryDescription; + /// + /// A mask containing the permissions for the next owner (cannot be enforced) + /// + public uint inventoryNextPermissions; + /// + /// A mask containing permissions for the current owner (cannot be enforced) + /// + public uint inventoryCurrentPermissions; + } + + /// + /// A Class for folders which contain users inventory + /// + public class InventoryFolderBase + { + /// + /// The name of the folder (64 characters or less) + /// + public string name; + /// + /// The agent who's inventory this is contained by + /// + public LLUUID agentID; + /// + /// The folder this folder is contained in (NULL_KEY for root) + /// + public LLUUID parentID; + /// + /// The UUID for this folder + /// + public LLUUID folderID; + } + + /// + /// An interface for accessing inventory data from a storage server + /// + public interface IInventoryData + { + /// + /// Initialises the interface + /// + void Initialise(); + + /// + /// Closes the interface + /// + void Close(); + + /// + /// The plugin being loaded + /// + /// A string containing the plugin name + string getName(); + + /// + /// The plugins version + /// + /// A string containing the plugin version + string getVersion(); + + /// + /// Returns a list of inventory items contained within the specified folder + /// + /// The UUID of the target folder + /// A List of InventoryItemBase items + List getInventoryInFolder(LLUUID folderID); + + /// + /// Returns a list of folders in the users inventory root. + /// + /// The UUID of the user who is having inventory being returned + /// A list of folders + List getUserRootFolders(LLUUID user); + + /// + /// Returns a list of inventory folders contained in the folder 'parentID' + /// + /// The folder to get subfolders for + /// A list of inventory folders + List getInventoryFolders(LLUUID parentID); + + /// + /// Returns an inventory item by its UUID + /// + /// The UUID of the item to be returned + /// A class containing item information + InventoryItemBase getInventoryItem(LLUUID item); + + /// + /// Returns a specified inventory folder by its UUID + /// + /// The UUID of the folder to be returned + /// A class containing folder information + InventoryFolderBase getInventoryFolder(LLUUID folder); + + /// + /// Creates a new inventory item based on item + /// + /// The item to be created + void addInventoryItem(InventoryItemBase item); + + /// + /// Updates an inventory item with item (updates based on ID) + /// + /// The updated item + void updateInventoryItem(InventoryItemBase item); + + /// + /// Adds a new folder specified by folder + /// + /// The inventory folder + void addInventoryFolder(InventoryFolderBase folder); + + /// + /// Updates a folder based on its ID with folder + /// + /// The inventory folder + void updateInventoryFolder(InventoryFolderBase folder); + } +} diff --git a/OpenSim/Framework/Data/OpenSim.Framework.Data.csproj b/OpenSim/Framework/Data/OpenSim.Framework.Data.csproj new file mode 100644 index 0000000000..25d139e3c8 --- /dev/null +++ b/OpenSim/Framework/Data/OpenSim.Framework.Data.csproj @@ -0,0 +1,120 @@ + + + Local + 8.0.50727 + 2.0 + {36B72A9B-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Data + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Data + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Xml.dll + False + + + ..\..\..\bin\XMLRPC.dll + False + + + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Data/OpenSim.Framework.Data.csproj.user b/OpenSim/Framework/Data/OpenSim.Framework.Data.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Data/OpenSim.Framework.Data.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Data/Properties/AssemblyInfo.cs b/OpenSim/Framework/Data/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f9260a1787 --- /dev/null +++ b/OpenSim/Framework/Data/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Framework.Data")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Framework.Data")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3a711c34-b0c0-4264-b0fe-f366eabf9d7b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Framework/Data/ReservationData.cs b/OpenSim/Framework/Data/ReservationData.cs new file mode 100644 index 0000000000..0078df0bce --- /dev/null +++ b/OpenSim/Framework/Data/ReservationData.cs @@ -0,0 +1,47 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Data +{ + public class ReservationData + { + public LLUUID userUUID = new LLUUID(); + public int reservationMinX = 0; + public int reservationMinY = 0; + public int reservationMaxX = 65536; + public int reservationMaxY = 65536; + + public string reservationName = ""; + public string reservationCompany = ""; + public bool status = true; + + public string gridSendKey = ""; + public string gridRecvKey = ""; + } +} diff --git a/OpenSim/Framework/Data/SimProfileData.cs b/OpenSim/Framework/Data/SimProfileData.cs new file mode 100644 index 0000000000..9db8574f98 --- /dev/null +++ b/OpenSim/Framework/Data/SimProfileData.cs @@ -0,0 +1,182 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using Nwc.XmlRpc; + +using System; +using System.Collections; + +namespace OpenSim.Framework.Data +{ + /// + /// A class which contains information known to the grid server about a region + /// + public class SimProfileData + { + /// + /// The name of the region + /// + public string regionName = ""; + + /// + /// A 64-bit number combining map position into a (mostly) unique ID + /// + public ulong regionHandle; + + /// + /// OGS/OpenSim Specific ID for a region + /// + public LLUUID UUID; + + /// + /// Coordinates of the region + /// + public uint regionLocX; + public uint regionLocY; + public uint regionLocZ; // Reserved (round-robin, layers, etc) + + /// + /// Authentication secrets + /// + /// Not very secure, needs improvement. + public string regionSendKey = ""; + public string regionRecvKey = ""; + public string regionSecret = ""; + + /// + /// Whether the region is online + /// + public bool regionOnline; + + /// + /// Information about the server that the region is currently hosted on + /// + public string serverIP = ""; + public uint serverPort; + public string serverURI = ""; + + /// + /// Set of optional overrides. Can be used to create non-eulicidean spaces. + /// + public ulong regionNorthOverrideHandle; + public ulong regionSouthOverrideHandle; + public ulong regionEastOverrideHandle; + public ulong regionWestOverrideHandle; + + /// + /// Optional: URI Location of the region database + /// + /// Used for floating sim pools where the region data is not nessecarily coupled to a specific server + public string regionDataURI = ""; + + /// + /// Region Asset Details + /// + public string regionAssetURI = ""; + public string regionAssetSendKey = ""; + public string regionAssetRecvKey = ""; + + /// + /// Region Userserver Details + /// + public string regionUserURI = ""; + public string regionUserSendKey = ""; + public string regionUserRecvKey = ""; + + /// + /// Region Map Texture Asset + /// + public LLUUID regionMapTextureID = new LLUUID("00000000-0000-0000-9999-000000000006"); + + /// + /// Get Sim profile data from grid server when in grid mode + /// + /// + /// + /// + /// + public SimProfileData RequestSimProfileData(LLUUID region_uuid, string gridserver_url, string gridserver_sendkey, string gridserver_recvkey) + { + Hashtable requestData = new Hashtable(); + requestData["region_uuid"] = region_uuid.UUID.ToString(); + requestData["authkey"] = gridserver_sendkey; + ArrayList SendParams = new ArrayList(); + SendParams.Add(requestData); + XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams); + XmlRpcResponse GridResp = GridReq.Send(gridserver_url, 3000); + + Hashtable responseData = (Hashtable)GridResp.Value; + + if (responseData.ContainsKey("error")) + { + return null; + } + + SimProfileData simData = new SimProfileData(); + simData.regionLocX = Convert.ToUInt32((string)responseData["region_locx"]); + simData.regionLocY = Convert.ToUInt32((string)responseData["region_locy"]); + simData.regionHandle = Helpers.UIntsToLong((simData.regionLocX * 256), (simData.regionLocY * 256)); + simData.serverIP = (string)responseData["sim_ip"]; + simData.serverPort = Convert.ToUInt32((string)responseData["sim_port"]); + simData.serverURI = "http://" + simData.serverIP + ":" + simData.serverPort.ToString() + "/"; + simData.UUID = new LLUUID((string)responseData["region_UUID"]); + simData.regionName = (string)responseData["region_name"]; + + return simData; + } + public SimProfileData RequestSimProfileData(ulong region_handle, string gridserver_url, string gridserver_sendkey, string gridserver_recvkey) + { + Hashtable requestData = new Hashtable(); + requestData["region_handle"] = region_handle.ToString(); + requestData["authkey"] = gridserver_sendkey; + ArrayList SendParams = new ArrayList(); + SendParams.Add(requestData); + XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams); + XmlRpcResponse GridResp = GridReq.Send(gridserver_url, 3000); + + Hashtable responseData = (Hashtable)GridResp.Value; + + if (responseData.ContainsKey("error")) + { + return null; + } + + SimProfileData simData = new SimProfileData(); + simData.regionLocX = Convert.ToUInt32((string)responseData["region_locx"]); + simData.regionLocY = Convert.ToUInt32((string)responseData["region_locy"]); + simData.regionHandle = Helpers.UIntsToLong((simData.regionLocX * 256), (simData.regionLocY * 256)); + simData.serverIP = (string)responseData["sim_ip"]; + simData.serverPort = Convert.ToUInt32((string)responseData["sim_port"]); + simData.serverURI = "http://" + simData.serverIP + ":" + simData.serverPort.ToString() + "/"; + simData.UUID = new LLUUID((string)responseData["region_UUID"]); + simData.regionName = (string)responseData["region_name"]; + + return simData; + } + } +} diff --git a/OpenSim/Framework/Data/UserData.cs b/OpenSim/Framework/Data/UserData.cs new file mode 100644 index 0000000000..c65f9fd722 --- /dev/null +++ b/OpenSim/Framework/Data/UserData.cs @@ -0,0 +1,128 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Data +{ + /// + /// An interface for connecting to user storage servers. + /// + public interface IUserData + { + /// + /// Returns a user profile from a database via their UUID + /// + /// The accounts UUID + /// The user data profile + UserProfileData getUserByUUID(LLUUID user); + + /// + /// Returns a users profile by searching their username + /// + /// The users username + /// The user data profile + UserProfileData getUserByName(string name); + + /// + /// Returns a users profile by searching their username parts + /// + /// Account firstname + /// Account lastname + /// The user data profile + UserProfileData getUserByName(string fname, string lname); + + /// + /// Returns the current agent for a user searching by it's UUID + /// + /// The users UUID + /// The current agent session + UserAgentData getAgentByUUID(LLUUID user); + + /// + /// Returns the current session agent for a user searching by username + /// + /// The users account name + /// The current agent session + UserAgentData getAgentByName(string name); + + /// + /// Returns the current session agent for a user searching by username parts + /// + /// The users first account name + /// The users account surname + /// The current agent session + UserAgentData getAgentByName(string fname, string lname); + + /// + /// Adds a new User profile to the database + /// + /// UserProfile to add + void addNewUserProfile(UserProfileData user); + + /// + /// Adds a new agent to the database + /// + /// The agent to add + void addNewUserAgent(UserAgentData agent); + + /// + /// Attempts to move currency units between accounts (NOT RELIABLE / TRUSTWORTHY. DONT TRY RUN YOUR OWN CURRENCY EXCHANGE WITH REAL VALUES) + /// + /// The account to transfer from + /// The account to transfer to + /// The amount to transfer + /// Successful? + bool moneyTransferRequest(LLUUID from, LLUUID to, uint amount); + + /// + /// Attempts to move inventory between accounts, if inventory is copyable it will be copied into the target account. + /// + /// User to transfer from + /// User to transfer to + /// Specified inventory item + /// Successful? + bool inventoryTransferRequest(LLUUID from, LLUUID to, LLUUID inventory); + + /// + /// Returns the plugin version + /// + /// Plugin version in MAJOR.MINOR.REVISION.BUILD format + string getVersion(); + + /// + /// Returns the plugin name + /// + /// Plugin name, eg MySQL User Provider + string getName(); + + /// + /// Initialises the plugin (artificial constructor) + /// + void Initialise(); + } +} diff --git a/OpenSim/Framework/Data/UserProfileData.cs b/OpenSim/Framework/Data/UserProfileData.cs new file mode 100644 index 0000000000..bb7d48cc79 --- /dev/null +++ b/OpenSim/Framework/Data/UserProfileData.cs @@ -0,0 +1,180 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using libsecondlife; + +namespace OpenSim.Framework.Data +{ + /// + /// Information about a particular user known to the userserver + /// + public class UserProfileData + { + /// + /// The ID value for this user + /// + public LLUUID UUID; + + /// + /// The first component of a users account name + /// + public string username; + /// + /// The second component of a users account name + /// + public string surname; + + /// + /// A salted hash containing the users password, in the format md5(md5(password) + ":" + salt) + /// + /// This is double MD5'd because the client sends an unsalted MD5 to the loginserver + public string passwordHash; + /// + /// The salt used for the users hash, should be 32 bytes or longer + /// + public string passwordSalt; + + /// + /// The regionhandle of the users preffered home region. If multiple sims occupy the same spot, the grid may decide which region the user logs into + /// + public ulong homeRegion; + /// + /// The coordinates inside the region of the home location + /// + public LLVector3 homeLocation; + /// + /// Where the user will be looking when they rez. + /// + public LLVector3 homeLookAt; + + /// + /// A UNIX Timestamp (seconds since epoch) for the users creation + /// + public int created; + /// + /// A UNIX Timestamp for the users last login date / time + /// + public int lastLogin; + + /// + /// A URI to the users inventory server, used for foreigners and large grids + /// + public string userInventoryURI; + /// + /// A URI to the users asset server, used for foreigners and large grids. + /// + public string userAssetURI; + + /// + /// A uint mask containing the "I can do" fields of the users profile + /// + public uint profileCanDoMask; + /// + /// A uint mask containing the "I want to do" part of the users profile + /// + public uint profileWantDoMask; // Profile window "I want to" mask + + /// + /// The about text listed in a users profile. + /// + public string profileAboutText; + /// + /// The first life about text listed in a users profile + /// + public string profileFirstText; + + /// + /// The profile image for an avatar stored on the asset server + /// + public LLUUID profileImage; + /// + /// The profile image for the users first life tab + /// + public LLUUID profileFirstImage; + /// + /// The users last registered agent (filled in on the user server) + /// + public UserAgentData currentAgent; + } + + /// + /// Information about a users session + /// + public class UserAgentData + { + /// + /// The UUID of the users avatar (not the agent!) + /// + public LLUUID UUID; + /// + /// The IP address of the user + /// + public string agentIP = String.Empty; + /// + /// The port of the user + /// + public uint agentPort; + /// + /// Is the user online? + /// + public bool agentOnline; + /// + /// The session ID for the user (also the agent ID) + /// + public LLUUID sessionID; + /// + /// The "secure" session ID for the user + /// + /// Not very secure. Dont rely on it for anything more than Linden Lab does. + public LLUUID secureSessionID; + /// + /// The region the user logged into initially + /// + public LLUUID regionID; + /// + /// A unix timestamp from when the user logged in + /// + public int loginTime; + /// + /// When this agent expired and logged out, 0 if still online + /// + public int logoutTime; + /// + /// Current region the user is logged into + /// + public LLUUID currentRegion; + /// + /// Region handle of the current region the user is in + /// + public ulong currentHandle; + /// + /// The position of the user within the region + /// + public LLVector3 currentPos; + } +} diff --git a/OpenSim/Framework/Data/obj/Debug/OpenSim.Framework.Data.dll b/OpenSim/Framework/Data/obj/Debug/OpenSim.Framework.Data.dll new file mode 100644 index 0000000000000000000000000000000000000000..a6af7475fb4ecf48d9b0afeeff0a07a7f25f0915 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Framework/Data/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..e4bc13ee22641d55ed1d5757a8394de06f5d5950 GIT binary patch literal 6644 zcmeHLOLN;)6qX$MA;pc8LTL-76KHvKnz7T@Km(bQx`bwEN@z;x3~4>GeVvNRQb&>t z>84$${a8d$4BNUDwnlE+ zR?!zF*D2dpMbKuL)5#d6py)b8oZ8NtZoAEL-W#A&`}ABRl8)Blv|&j+66 zEDfkzoBMuDRGM6ktW@sAFdms0ftYOUWjnECTCFCroSJPXxk!b%BI&>8Md<4>RKJbl zc8C#%i%n&OWE3|*N!$T(D8j2wfA_Dh5J-O+bm=b%rLEoHjTokHqS#DvC&UQ%kWFJy zZxVbiFkT>MjY3$cGHq4XtaPDS)MlKDs~1=f4w}A56`IvzsK6|qvX@-X3QkuyMd7sT z1lyIFTJ`UAm&a}J@tvO_o2&|%ITfuUoFm0Plenw8z9 zHF?$aVqaKZoQkzn^GsI77SoW2Ep<8K?5&O3wvy5-miFjs{b~9ii9nYJbY_wM(VG6?WPmIOuLI2F$YLIoAI| zK}l&B!Q*R~j1%IHVrX?}|0@X5ClG1BW6ssYCOVXfV5rP(nZw&8WR^>~T|(x&g!f6v zJeNi3ekkiAxo+qW;5QlS2chh^QK%z>c<|^uV6Og(B``?ZMS!bKfE)1e7oa*iy;pyR z!sRxcXQE5@veJ?%FJVqXCclK^60!_PxQj}L%wUUY-16(vhJ`0lm^GhwJzOk@7x{*x z7mkT@7LOo~O`-AH*)#^S*9uImUtmz4n+0Y!HaJ!FORfhp8~PqV^4`$*LaIN3ovn0N zf9wE;dIhMCE}8rT6fzlOP!^bOebUI6#oj!X_G5z+jl<8-Cjc6hc?6pJJ!lY8=DQAH zsNVwB(IsWRfzqZ7OLCtwJxrO$u)#+2ed$EiHuNd{(4fshXzJIXLr9y;9l%h(0;;1+ z+I$Hmq)mp$G+RvN!OOFcjbA^lrtviGGpmQ0^#nG!;{-bl*x=O+H1%`vCFIp-9l%gO z1*)S3x2A| zXTE?xm>T-YkUFPGowq@WkUDR507HEfsE#hF^9GcVIvIYe@ryn7#regB&3muCqVk)K zFG2E8!??CuhVST6Q@*QrHJw^v%J;LbraWq+v+~I8YRVEDHD#&oYRa^Vnlin*nlg;i T^y34C3nN#J3H8(sOb7o39~+M) literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Data/obj/OpenSim.Framework.Data.csproj.FileList.txt b/OpenSim/Framework/Data/obj/OpenSim.Framework.Data.csproj.FileList.txt new file mode 100644 index 0000000000..4cdda62dcf --- /dev/null +++ b/OpenSim/Framework/Data/obj/OpenSim.Framework.Data.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.Data.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.Data.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Data.dll +obj\Debug\OpenSim.Framework.Data.pdb +..\..\..\bin\OpenSim.Framework.Data.pdb diff --git a/OpenSim/Framework/Data/obj/Release/OpenSim.Framework.Data.dll b/OpenSim/Framework/Data/obj/Release/OpenSim.Framework.Data.dll new file mode 100644 index 0000000000000000000000000000000000000000..63a11d13dcf46dc7bc503d6b40c8e2efd8d5ca03 GIT binary patch literal 24576 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 tpT2ymmHUt z>84%6f*-(!$AZU#*9@;2C<`773QH(UT=x72_`Yjfwi=fvW#{p2@6q|JbFa=l_dDlG zQB*}y{z2oFEt`NiJ!hAFFYu~i{z%<+D*01Za6TB{u_*k&_S~s``3e3T-%+ePVci!~ zuBeB;<&5u`ua_LV{H$0x<((JqRB2*=^fXJTgA>+%E6K+^&~x_u!b%W|+CpfB zf>wIfc7#Mj+nTrXMbB|WIfMs6{+Jb<3$2nP=&wEmp;7#&X&MH`anGvESmn_3)2-!X zieBx4*-)x+o6 zRrCM-{NsnY0K*uD)HRAE#3(i1NTnb)=krU=|0Ua9Iz4y%qaLFt>nqSX=m(FkqyK?o- z;XQ9$drdc>>oS~KXew9C1xNQcK-Whoau7+HuiM8FE9mw=V+9MLZ@bGw>h{*YpA^*= zS7R%cJ28q!rp6$qntRzvESXkoNi4VSIB70YVXjE}uX_>tMhw;OqPQDkjNxKa86g?P zO;A$zKpc(ns@vZ~YbylOUj|+JOG0Vu_jfaf>02naQrrtM#yw=y7}VPYp9@Tyl%aruH1NNQ8FDcIG-e>0=NMWe+O!y(|h$dC|qvSc_zAaFE1^b z@)8y#Wb#WmAtB3vgnOyv$PBiG#x1`oZCH3x=A8Ai=i_3#yvR2k-8?BS+B||dHiO1% zcheZiek(AEL4iSeZWWk)*x*bpD0@E0Z0P#|$$LXT0IB{8cDB=9{iO>S>NTJSx@7Xt zP{?GAL0MqB4M-zj7W?y5I)n{QH4i^Sp9E-9<_T!(PoP0WnIF4=q5c5WK$n#H9!iHY zEXf1P^f6_g!Uh|y_odS{$Iz$oLz6Z~psC-14iRmxb^$~E7N~(PY4Z(~h&DMM(`*Tq z2QSY)Hh%rIo5s_0z^p!I)-%}Pt`qDSV3Sv~(A2NMmxxzib^$~E0;qv5dG$Gzh*uil zxdx=^W73?!21h5@a}j0cNtsVUg@`hrbOA&C7^s0RDf1DO4rTaWKA=n=Q|1M1aO?zI zjA-*BY4aiI5Ygs?E?}td12xbkZQg^@p$)&^2DIs8+ALv%+aKgded`tc!PL;tMASJ; z>bwg|MAUhw3mEF#Kn-+BowuMw)XDK%jbH4EuP-evZar}0b(P<2d InventoryFolders; + public Dictionary InventoryItems; + public InventoryFolder InventoryRoot; + public int LastCached; //maybe used by opensim app, time this was last stored/compared to user server + public LLUUID AgentID; + public AvatarWearable[] Wearables; + + public AgentInventory() + { + InventoryFolders = new Dictionary(); + InventoryItems = new Dictionary(); + this.Initialise(); + } + + public virtual void Initialise() + { + Wearables = new AvatarWearable[13]; //should be 12 of these + for (int i = 0; i < 13; i++) + { + Wearables[i] = new AvatarWearable(); + } + + } + + public bool CreateNewFolder(LLUUID folderID, ushort type) + { + InventoryFolder Folder = new InventoryFolder(); + Folder.FolderID = folderID; + Folder.OwnerID = this.AgentID; + Folder.DefaultType = type; + this.InventoryFolders.Add(Folder.FolderID, Folder); + return (true); + } + + public void CreateRootFolder(LLUUID newAgentID, bool createTextures) + { + this.AgentID = newAgentID; + InventoryRoot = new InventoryFolder(); + InventoryRoot.FolderID = LLUUID.Random(); + InventoryRoot.ParentID = new LLUUID(); + InventoryRoot.Version = 1; + InventoryRoot.DefaultType = 8; + InventoryRoot.OwnerID = this.AgentID; + InventoryRoot.FolderName = "My Inventory"; + InventoryFolders.Add(InventoryRoot.FolderID, InventoryRoot); + InventoryRoot.OwnerID = this.AgentID; + if (createTextures) + { + this.CreateNewFolder(LLUUID.Random(), 0, "Textures", InventoryRoot.FolderID); + } + } + + public bool CreateNewFolder(LLUUID folderID, ushort type, string folderName) + { + InventoryFolder Folder = new InventoryFolder(); + Folder.FolderID = folderID; + Folder.OwnerID = this.AgentID; + Folder.DefaultType = type; + Folder.FolderName = folderName; + this.InventoryFolders.Add(Folder.FolderID, Folder); + + return (true); + } + + public bool CreateNewFolder(LLUUID folderID, ushort type, string folderName, LLUUID parent) + { + if (!this.InventoryFolders.ContainsKey(folderID)) + { + System.Console.WriteLine("creating new folder called " + folderName + " in agents inventory"); + InventoryFolder Folder = new InventoryFolder(); + Folder.FolderID = folderID; + Folder.OwnerID = this.AgentID; + Folder.DefaultType = type; + Folder.FolderName = folderName; + Folder.ParentID = parent; + this.InventoryFolders.Add(Folder.FolderID, Folder); + } + + return (true); + } + + public bool HasFolder(LLUUID folderID) + { + if (this.InventoryFolders.ContainsKey(folderID)) + { + return true; + } + return false; + } + + public LLUUID GetFolderID(string folderName) + { + foreach (InventoryFolder inv in this.InventoryFolders.Values) + { + if (inv.FolderName == folderName) + { + return inv.FolderID; + } + } + + return LLUUID.Zero; + } + + public bool UpdateItemAsset(LLUUID itemID, AssetBase asset) + { + if(this.InventoryItems.ContainsKey(itemID)) + { + InventoryItem Item = this.InventoryItems[itemID]; + Item.AssetID = asset.FullID; + System.Console.WriteLine("updated inventory item " + itemID.ToStringHyphenated() + " so it now is set to asset " + asset.FullID.ToStringHyphenated()); + //TODO need to update the rest of the info + } + return true; + } + + public bool UpdateItemDetails(LLUUID itemID, UpdateInventoryItemPacket.InventoryDataBlock packet) + { + System.Console.WriteLine("updating inventory item details"); + if (this.InventoryItems.ContainsKey(itemID)) + { + System.Console.WriteLine("changing name to "+ Util.FieldToString(packet.Name)); + InventoryItem Item = this.InventoryItems[itemID]; + Item.Name = Util.FieldToString(packet.Name); + System.Console.WriteLine("updated inventory item " + itemID.ToStringHyphenated()); + //TODO need to update the rest of the info + } + return true; + } + + public LLUUID AddToInventory(LLUUID folderID, AssetBase asset) + { + if (this.InventoryFolders.ContainsKey(folderID)) + { + LLUUID NewItemID = LLUUID.Random(); + + InventoryItem Item = new InventoryItem(); + Item.FolderID = folderID; + Item.OwnerID = AgentID; + Item.AssetID = asset.FullID; + Item.ItemID = NewItemID; + Item.Type = asset.Type; + Item.Name = asset.Name; + Item.Description = asset.Description; + Item.InvType = asset.InvType; + this.InventoryItems.Add(Item.ItemID, Item); + InventoryFolder Folder = InventoryFolders[Item.FolderID]; + Folder.Items.Add(Item); + return (Item.ItemID); + } + else + { + return (null); + } + } + + public bool DeleteFromInventory(LLUUID itemID) + { + bool res = false; + if (this.InventoryItems.ContainsKey(itemID)) + { + InventoryItem item = this.InventoryItems[itemID]; + this.InventoryItems.Remove(itemID); + foreach (InventoryFolder fold in InventoryFolders.Values) + { + if (fold.Items.Contains(item)) + { + fold.Items.Remove(item); + break; + } + } + res = true; + + } + return res; + } + } + + public class InventoryFolder + { + public List Items; + //public List Subfolders; + public LLUUID FolderID; + public LLUUID OwnerID; + public LLUUID ParentID = LLUUID.Zero; + public string FolderName; + public ushort DefaultType; + public ushort Version; + + public InventoryFolder() + { + Items = new List(); + //Subfolders = new List(); + } + + } + + public class InventoryItem + { + public LLUUID FolderID; + public LLUUID OwnerID; + public LLUUID ItemID; + public LLUUID AssetID; + public LLUUID CreatorID; + public sbyte InvType; + public sbyte Type; + public string Name =""; + public string Description; + + public InventoryItem() + { + this.CreatorID = LLUUID.Zero; + } + + public string ExportString() + { + string typ = "notecard"; + string result = ""; + result += "\tinv_object\t0\n\t{\n"; + result += "\t\tobj_id\t%s\n"; + result += "\t\tparent_id\t"+ ItemID.ToString() +"\n"; + result += "\t\ttype\t"+ typ +"\n"; + result += "\t\tname\t" + Name+"|\n"; + result += "\t}\n"; + return result; + } + } +} diff --git a/OpenSim/Framework/General/AuthenticateSessionBase.cs b/OpenSim/Framework/General/AuthenticateSessionBase.cs new file mode 100644 index 0000000000..71616e3e3d --- /dev/null +++ b/OpenSim/Framework/General/AuthenticateSessionBase.cs @@ -0,0 +1,130 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework +{ + public class AuthenticateSessionsBase + { + public Dictionary AgentCircuits = new Dictionary(); + + public AuthenticateSessionsBase() + { + + } + + public virtual AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitcode) + { + AgentCircuitData validcircuit = null; + if (this.AgentCircuits.ContainsKey(circuitcode)) + { + validcircuit = this.AgentCircuits[circuitcode]; + } + AuthenticateResponse user = new AuthenticateResponse(); + if (validcircuit == null) + { + //don't have this circuit code in our list + user.Authorised = false; + return (user); + } + + if ((sessionID == validcircuit.SessionID) && (agentID == validcircuit.AgentID)) + { + user.Authorised = true; + user.LoginInfo = new Login(); + user.LoginInfo.Agent = agentID; + user.LoginInfo.Session = sessionID; + user.LoginInfo.SecureSession = validcircuit.SecureSessionID; + user.LoginInfo.First = validcircuit.firstname; + user.LoginInfo.Last = validcircuit.lastname; + user.LoginInfo.InventoryFolder = validcircuit.InventoryFolder; + user.LoginInfo.BaseFolder = validcircuit.BaseFolder; + } + else + { + // Invalid + user.Authorised = false; + } + + return (user); + } + + public virtual void AddNewCircuit(uint circuitCode, AgentCircuitData agentData) + { + if (this.AgentCircuits.ContainsKey(circuitCode)) + { + this.AgentCircuits[circuitCode] = agentData; + } + else + { + this.AgentCircuits.Add(circuitCode, agentData); + } + } + + public LLVector3 GetPosition(uint circuitCode) + { + LLVector3 vec = new LLVector3(); + if (this.AgentCircuits.ContainsKey(circuitCode)) + { + vec = this.AgentCircuits[circuitCode].startpos; + } + return vec; + } + + public void UpdateAgentData(AgentCircuitData agentData) + { + if (this.AgentCircuits.ContainsKey((uint)agentData.circuitcode)) + { + this.AgentCircuits[(uint)agentData.circuitcode].firstname = agentData.firstname; + this.AgentCircuits[(uint)agentData.circuitcode].lastname = agentData.lastname; + this.AgentCircuits[(uint)agentData.circuitcode].startpos = agentData.startpos; + // Console.WriteLine("update user start pos is " + agentData.startpos.X + " , " + agentData.startpos.Y + " , " + agentData.startpos.Z); + } + } + + public void UpdateAgentChildStatus(uint circuitcode, bool childstatus) + { + if (this.AgentCircuits.ContainsKey(circuitcode)) + { + this.AgentCircuits[circuitcode].child = childstatus; + } + } + + public bool GetAgentChildStatus(uint circuitcode) + { + if (this.AgentCircuits.ContainsKey(circuitcode)) + { + return this.AgentCircuits[circuitcode].child; + } + return false; + } + } +} \ No newline at end of file diff --git a/OpenSim/Framework/General/BlockingQueue.cs b/OpenSim/Framework/General/BlockingQueue.cs new file mode 100644 index 0000000000..0cc8124d4c --- /dev/null +++ b/OpenSim/Framework/General/BlockingQueue.cs @@ -0,0 +1,58 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using System.Threading; + +namespace OpenSim.Framework.Utilities +{ + public class BlockingQueue + { + private Queue _queue = new Queue(); + private object _queueSync = new object(); + + public void Enqueue(T value) + { + lock (_queueSync) + { + _queue.Enqueue(value); + Monitor.Pulse(_queueSync); + } + } + + public T Dequeue() + { + lock (_queueSync) + { + if (_queue.Count < 1) + Monitor.Wait(_queueSync); + + return _queue.Dequeue(); + } + } + } +} diff --git a/OpenSim/Framework/General/IRegionCommsListener.cs b/OpenSim/Framework/General/IRegionCommsListener.cs new file mode 100644 index 0000000000..32444f9eef --- /dev/null +++ b/OpenSim/Framework/General/IRegionCommsListener.cs @@ -0,0 +1,46 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework +{ + public delegate void ExpectUserDelegate(ulong regionHandle, AgentCircuitData agent); + public delegate void UpdateNeighbours(List neighbours); + public delegate void AgentCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position); + + public interface IRegionCommsListener + { + event ExpectUserDelegate OnExpectUser; + event GenericCall2 OnExpectChildAgent; + event AgentCrossing OnAvatarCrossingIntoRegion; + event UpdateNeighbours OnNeighboursUpdate; + } +} diff --git a/OpenSim/Framework/General/Interfaces/AuthenticateResponse.cs b/OpenSim/Framework/General/Interfaces/AuthenticateResponse.cs new file mode 100644 index 0000000000..508485b541 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/AuthenticateResponse.cs @@ -0,0 +1,43 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using OpenSim.Framework.Types; + +namespace OpenSim.Framework.Interfaces +{ + public class AuthenticateResponse + { + public bool Authorised; + public Login LoginInfo; + + public AuthenticateResponse() + { + + } + + } +} diff --git a/OpenSim/Framework/General/Interfaces/Configuration/IGridConfig.cs b/OpenSim/Framework/General/Interfaces/Configuration/IGridConfig.cs new file mode 100644 index 0000000000..81dc2939dc --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/Configuration/IGridConfig.cs @@ -0,0 +1,59 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +//using OpenSim.world; + +namespace OpenSim.Framework.Interfaces +{ + /// + /// + + + public abstract class GridConfig + { + public string GridOwner; + public string DefaultStartupMsg; + public string DefaultAssetServer; + public string AssetSendKey; + public string AssetRecvKey; + public string DefaultUserServer; + public string UserSendKey; + public string UserRecvKey; + public string SimSendKey; + public string SimRecvKey; + + + public abstract void InitConfig(); + + } + + public interface IGridConfig + { + GridConfig GetConfigObject(); + } +} diff --git a/OpenSim/Framework/General/Interfaces/Configuration/IUserConfig.cs b/OpenSim/Framework/General/Interfaces/Configuration/IUserConfig.cs new file mode 100644 index 0000000000..ae6cedb9c0 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/Configuration/IUserConfig.cs @@ -0,0 +1,53 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +//using OpenSim.world; + +namespace OpenSim.Framework.Interfaces +{ + /// + /// + + + public abstract class UserConfig + { + public string DefaultStartupMsg; + public string GridServerURL; + public string GridSendKey; + public string GridRecvKey; + + + public abstract void InitConfig(); + + } + + public interface IUserConfig + { + UserConfig GetConfigObject(); + } +} diff --git a/OpenSim/Framework/General/Interfaces/IAssetServer.cs b/OpenSim/Framework/General/Interfaces/IAssetServer.cs new file mode 100644 index 0000000000..ab60dd7291 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/IAssetServer.cs @@ -0,0 +1,64 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework.Interfaces +{ + /// + /// Description of IAssetServer. + /// + + public interface IAssetServer + { + void SetReceiver(IAssetReceiver receiver); + void RequestAsset(LLUUID assetID, bool isTexture); + void UpdateAsset(AssetBase asset); + void UploadNewAsset(AssetBase asset); + void SetServerInfo(string ServerUrl, string ServerKey); + void Close(); + } + + // could change to delegate? + public interface IAssetReceiver + { + void AssetReceived(AssetBase asset, bool IsTexture); + void AssetNotFound(AssetBase asset); + } + + public interface IAssetPlugin + { + IAssetServer GetAssetServer(); + } + + public struct ARequest + { + public LLUUID AssetID; + public bool IsTexture; + } +} diff --git a/OpenSim/Framework/General/Interfaces/IClientAPI.cs b/OpenSim/Framework/General/Interfaces/IClientAPI.cs new file mode 100644 index 0000000000..7042f40964 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/IClientAPI.cs @@ -0,0 +1,177 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using System.Net; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework.Interfaces +{ + public delegate void ChatFromViewer(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID); + public delegate void ImprovedInstantMessage(LLUUID fromAgentID, LLUUID toAgentID, uint timestamp, string fromAgentName, string message); // Cut down from full list + public delegate void RezObject(AssetBase primAsset, LLVector3 pos); + public delegate void ModifyTerrain(float height, float seconds, byte size, byte action, float north, float west); + public delegate void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam); + public delegate void StartAnim(LLUUID animID, int seq); + public delegate void LinkObjects(uint parent, List children); + public delegate void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY); + public delegate void TeleportLocationRequest(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags); + + public delegate void GenericCall(IClientAPI remoteClient); + public delegate void GenericCall2(); + public delegate void GenericCall3(Packet packet); // really don't want to be passing packets in these events, so this is very temporary. + public delegate void GenericCall4(Packet packet, IClientAPI remoteClient); + public delegate void GenericCall5(IClientAPI remoteClient, bool status); + public delegate void GenericCall6(LLUUID uid); + public delegate void GenericCall7(uint localID, string message); + + public delegate void UpdateShape(uint localID, ObjectShapePacket.ObjectDataBlock shapeBlock); + public delegate void ObjectSelect(uint localID, IClientAPI remoteClient); + public delegate void UpdatePrimFlags(uint localID, Packet packet, IClientAPI remoteClient); + public delegate void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient); + public delegate void UpdateVector(uint localID, LLVector3 pos, IClientAPI remoteClient); + public delegate void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient); + public delegate void UpdatePrimSingleRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient); + public delegate void UpdatePrimGroupRotation(uint localID,LLVector3 pos, LLQuaternion rot, IClientAPI remoteClient); + public delegate void ObjectDuplicate(uint localID, LLVector3 offset, uint dupeFlags); + public delegate void StatusChange(bool status); + public delegate void NewAvatar(IClientAPI remoteClient, LLUUID agentID, bool status); + public delegate void UpdateAgent(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation); + public delegate void MoveObject(LLUUID objectID, LLVector3 offset, LLVector3 grapPos, IClientAPI remoteClient); + + public delegate void ParcelPropertiesRequest(int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client); + public delegate void ParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client); + public delegate void ParcelJoinRequest(int west, int south, int east, int north, IClientAPI remote_client); + public delegate void ParcelPropertiesUpdateRequest(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client); // NOTETOSELFremove the packet part + + public delegate void EstateOwnerMessageRequest(EstateOwnerMessagePacket packet, IClientAPI remote_client); + + public delegate void UUIDNameRequest(LLUUID id, IClientAPI remote_client); + + public interface IClientAPI + { + event ImprovedInstantMessage OnInstantMessage; + event ChatFromViewer OnChatFromViewer; + event RezObject OnRezObject; + event ModifyTerrain OnModifyTerrain; + event SetAppearance OnSetAppearance; + event StartAnim OnStartAnim; + event LinkObjects OnLinkObjects; + event RequestMapBlocks OnRequestMapBlocks; + event TeleportLocationRequest OnTeleportLocationRequest; + + event GenericCall4 OnDeRezObject; + event GenericCall OnRegionHandShakeReply; + event GenericCall OnRequestWearables; + event GenericCall2 OnCompleteMovementToRegion; + event UpdateAgent OnAgentUpdate; + event GenericCall OnRequestAvatarsData; + event GenericCall4 OnAddPrim; + event ObjectDuplicate OnObjectDuplicate; + event UpdateVector OnGrapObject; + event ObjectSelect OnDeGrapObject; + event MoveObject OnGrapUpdate; + + event UpdateShape OnUpdatePrimShape; + event ObjectSelect OnObjectSelect; + event GenericCall7 OnObjectDescription; + event GenericCall7 OnObjectName; + event UpdatePrimFlags OnUpdatePrimFlags; + event UpdatePrimTexture OnUpdatePrimTexture; + event UpdateVector OnUpdatePrimGroupPosition; + event UpdateVector OnUpdatePrimSinglePosition; + event UpdatePrimRotation OnUpdatePrimGroupRotation; + event UpdatePrimSingleRotation OnUpdatePrimSingleRotation; + event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation; + event UpdateVector OnUpdatePrimScale; + event StatusChange OnChildAgentStatus; + event GenericCall2 OnStopMovement; + event NewAvatar OnNewAvatar; + event GenericCall6 OnRemoveAvatar; + + event UUIDNameRequest OnNameFromUUIDRequest; + + event ParcelPropertiesRequest OnParcelPropertiesRequest; + event ParcelDivideRequest OnParcelDivideRequest; + event ParcelJoinRequest OnParcelJoinRequest; + event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest; + + event EstateOwnerMessageRequest OnEstateOwnerMessage; + + LLVector3 StartPos + { + get; + set; + } + + LLUUID AgentId + { + get; + } + + string FirstName + { + get; + } + + string LastName + { + get; + } + + void OutPacket(Packet newPack); + void SendWearables(AvatarWearable[] wearables); + void SendRegionHandshake(RegionInfo regionInfo); + void SendChatMessage(string message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID); + void SendChatMessage(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID); + void SendInstantMessage(string message, LLUUID target); + void SendLayerData(float[] map); + void SendLayerData(int px, int py, float[] map); + void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos, LLVector3 look); + void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint ); + AgentCircuitData RequestClientInfo(); + void CrossRegion(ulong newRegionHandle, LLVector3 pos, LLVector3 lookAt, IPEndPoint newRegionExternalEndPoint ); + void SendMapBlock(List mapBlocks); + void SendLocalTeleport(LLVector3 position, LLVector3 lookAt, uint flags); + void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, uint locationID, uint flags); + void SendTeleportCancel(); + void SendTeleportLocationStart(); + void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance); + + void SendAvatarData(ulong regionHandle, string firstName, string lastName, LLUUID avatarID, uint avatarLocalID, LLVector3 Pos, byte[] textureEntry); + void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLVector3 velocity); + + void AttachObject(uint localID, LLQuaternion rotation, byte attachPoint); + void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID textureID , uint flags); + void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLUUID textureID, uint flags); + void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID); + void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLUUID textureID, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID); + void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLQuaternion rotation); + } +} diff --git a/OpenSim/Framework/General/Interfaces/ILocalStorage.cs b/OpenSim/Framework/General/Interfaces/ILocalStorage.cs new file mode 100644 index 0000000000..dbdb25d765 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/ILocalStorage.cs @@ -0,0 +1,68 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using libsecondlife; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework.Interfaces +{ + /// + /// ILocalStorage. Really hacked together right now needs cleaning up + /// + public interface ILocalStorage + { + void Initialise(string datastore); + + void StorePrim(PrimData prim); + void RemovePrim(LLUUID primID); + void LoadPrimitives(ILocalStorageReceiver receiver); + + float[] LoadWorld(); + void SaveMap(float[] heightmap); + + void SaveParcels(ParcelData[] parcels); + void SaveParcel(ParcelData parcel); + void RemoveParcel(ParcelData parcel); + void RemoveAllParcels(); + void LoadParcels(ILocalStorageParcelReceiver recv); + + void ShutDown(); + } + + public interface ILocalStorageReceiver + { + void PrimFromStorage(PrimData prim); + } + + public interface ILocalStorageParcelReceiver + { + void ParcelFromStorage(ParcelData data); + void NoParcelDataFromStorage(); + } +} + diff --git a/OpenSim/Framework/General/Interfaces/IUserServer.cs b/OpenSim/Framework/General/Interfaces/IUserServer.cs new file mode 100644 index 0000000000..b3700d2ec4 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/IUserServer.cs @@ -0,0 +1,39 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using OpenSim.Framework.Inventory; + +namespace OpenSim.Framework.Interfaces +{ + public interface IUserServer + { + AgentInventory RequestAgentsInventory(LLUUID agentID); + void SetServerInfo(string ServerUrl, string SendKey, string RecvKey); + bool UpdateAgentsInventory(LLUUID agentID, AgentInventory inventory); + } +} diff --git a/OpenSim/Framework/General/Interfaces/IWorld.cs b/OpenSim/Framework/General/Interfaces/IWorld.cs new file mode 100644 index 0000000000..204c01bab0 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/IWorld.cs @@ -0,0 +1,42 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework.Interfaces +{ + public interface IWorld + { + void AddNewClient(IClientAPI client, bool child); + void RemoveClient(LLUUID agentID); + + RegionInfo RegionInfo { get; } + object SyncRoot { get; } + uint NextLocalId { get; } + } +} diff --git a/OpenSim/Framework/General/LoginService.cs b/OpenSim/Framework/General/LoginService.cs new file mode 100644 index 0000000000..02efcec554 --- /dev/null +++ b/OpenSim/Framework/General/LoginService.cs @@ -0,0 +1,34 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Framework.Grid +{ + public abstract class LoginService + { + + } +} \ No newline at end of file diff --git a/OpenSim/Framework/General/OpenSim.Framework.csproj b/OpenSim/Framework/General/OpenSim.Framework.csproj new file mode 100644 index 0000000000..24e8a3b439 --- /dev/null +++ b/OpenSim/Framework/General/OpenSim.Framework.csproj @@ -0,0 +1,207 @@ + + + Local + 8.0.50727 + 2.0 + {8ACA2445-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework + JScript + Grid + IE50 + false + Library + + OpenSim.Framework + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + ..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework.Configuration + {A45242A2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/General/OpenSim.Framework.csproj.user b/OpenSim/Framework/General/OpenSim.Framework.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/General/OpenSim.Framework.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/General/Properties/AssemblyInfo.cs b/OpenSim/Framework/General/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..004040bf91 --- /dev/null +++ b/OpenSim/Framework/General/Properties/AssemblyInfo.cs @@ -0,0 +1,31 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.FrameWork")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.FrameWork")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a08e20c7-f191-4137-b1f0-9291408fa521")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Framework/General/RegionCommsListener.cs b/OpenSim/Framework/General/RegionCommsListener.cs new file mode 100644 index 0000000000..2b0bc62171 --- /dev/null +++ b/OpenSim/Framework/General/RegionCommsListener.cs @@ -0,0 +1,68 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Framework +{ + public class RegionCommsListener :IRegionCommsListener + { + public event ExpectUserDelegate OnExpectUser; + public event GenericCall2 OnExpectChildAgent; + public event AgentCrossing OnAvatarCrossingIntoRegion; + public event UpdateNeighbours OnNeighboursUpdate; + + /// + /// + /// + /// + /// + public virtual bool TriggerExpectUser(ulong regionHandle, AgentCircuitData agent) + { + if(OnExpectUser != null) + { + + OnExpectUser(regionHandle, agent); + return true; + } + + return false; + } + + public virtual bool TriggerExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position) + { + if (OnAvatarCrossingIntoRegion != null) + { + OnAvatarCrossingIntoRegion(regionHandle, agentID, position); + return true; + } + return false; + } + } +} diff --git a/OpenSim/Framework/General/Remoting.cs b/OpenSim/Framework/General/Remoting.cs new file mode 100644 index 0000000000..df32db2060 --- /dev/null +++ b/OpenSim/Framework/General/Remoting.cs @@ -0,0 +1,135 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Security.Cryptography; +using System.Text; + +namespace OpenSim.Framework +{ + /// + /// NEEDS AUDIT. + /// + /// + /// Suggested implementation + /// Store two digests for each foreign host. A local copy of the local hash using the local challenge (when issued), and a local copy of the remote hash using the remote challenge. + /// When sending data to the foreign host - run 'Sign' on the data and affix the returned byte[] to the message. + /// When recieving data from the foreign host - run 'Authenticate' against the data and the attached byte[]. + /// Both hosts should be performing these operations for this to be effective. + /// + class RemoteDigest + { + private byte[] currentHash; + private byte[] secret; + + private SHA512Managed SHA512; + + /// + /// Initialises a new RemoteDigest authentication mechanism + /// + /// Needs an audit by a cryptographic professional - was not "roll your own"'d by choice but rather a serious lack of decent authentication mechanisms in .NET remoting + /// The shared secret between systems (for inter-sim, this is provided in encrypted form during connection, for grid this is input manually in setup) + /// Binary salt - some common value - to be decided what + /// The challenge key provided by the third party + public RemoteDigest(string sharedSecret, byte[] salt, string challenge) + { + SHA512 = new SHA512Managed(); + Rfc2898DeriveBytes RFC2898 = new Rfc2898DeriveBytes(sharedSecret,salt); + secret = RFC2898.GetBytes(512); + ASCIIEncoding ASCII = new ASCIIEncoding(); + + currentHash = SHA512.ComputeHash(AppendArrays(secret, ASCII.GetBytes(challenge))); + } + + /// + /// Authenticates a piece of incoming data against the local digest. Upon successful authentication, digest string is incremented. + /// + /// The incoming data + /// The remote digest + /// + public bool Authenticate(byte[] data, byte[] digest) + { + byte[] newHash = SHA512.ComputeHash(AppendArrays(AppendArrays(currentHash, secret), data)); + if (digest == newHash) + { + currentHash = newHash; + return true; + } + else + { + throw new Exception("Hash comparison failed. Key resync required."); + } + } + + /// + /// Signs a new bit of data with the current hash. Returns a byte array which should be affixed to the message. + /// Signing a piece of data will automatically increment the hash - if you sign data and do not send it, the + /// hashes will get out of sync and throw an exception when validation is attempted. + /// + /// The outgoing data + /// The local digest + public byte[] Sign(byte[] data) + { + currentHash = SHA512.ComputeHash(AppendArrays(AppendArrays(currentHash, secret), data)); + return currentHash; + } + + /// + /// Generates a new challenge string to be issued to a foreign host. Challenges are 1024-bit (effective strength of less than 512-bits) messages generated using the Crytographic Random Number Generator. + /// + /// A 128-character hexadecimal string containing the challenge. + public static string GenerateChallenge() + { + RNGCryptoServiceProvider RNG = new RNGCryptoServiceProvider(); + byte[] bytes = new byte[64]; + RNG.GetBytes(bytes); + + StringBuilder sb = new StringBuilder(bytes.Length * 2); + foreach (byte b in bytes) + { + sb.AppendFormat("{0:x2}", b); + } + return sb.ToString(); + } + + /// + /// Helper function, merges two byte arrays + /// + /// Sourced from MSDN Forum + /// A + /// B + /// C + private byte[] AppendArrays(byte[] a, byte[] b) + { + byte[] c = new byte[a.Length + b.Length]; + Buffer.BlockCopy(a, 0, c, 0, a.Length); + Buffer.BlockCopy(b, 0, c, a.Length, b.Length); + return c; + } + + } +} diff --git a/OpenSim/Framework/General/Types/AgentCiruitData.cs b/OpenSim/Framework/General/Types/AgentCiruitData.cs new file mode 100644 index 0000000000..00e9d0afc2 --- /dev/null +++ b/OpenSim/Framework/General/Types/AgentCiruitData.cs @@ -0,0 +1,47 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class AgentCircuitData + { + public AgentCircuitData() { } + public LLUUID AgentID; + public LLUUID SessionID; + public LLUUID SecureSessionID; + public LLVector3 startpos; + public string firstname; + public string lastname; + public uint circuitcode; + public bool child; + public LLUUID InventoryFolder; + public LLUUID BaseFolder; + public string CapsPath = ""; + } +} diff --git a/OpenSim/Framework/General/Types/AgentWearable.cs b/OpenSim/Framework/General/Types/AgentWearable.cs new file mode 100644 index 0000000000..6152b7dd75 --- /dev/null +++ b/OpenSim/Framework/General/Types/AgentWearable.cs @@ -0,0 +1,57 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class AvatarWearable + { + public LLUUID AssetID = new LLUUID("00000000-0000-0000-0000-000000000000"); + public LLUUID ItemID = new LLUUID("00000000-0000-0000-0000-000000000000"); + + public AvatarWearable() + { + + } + + public static AvatarWearable[] DefaultWearables + { + get + { + AvatarWearable[] defaultWearables = new AvatarWearable[13]; //should be 13 of these + for (int i = 0; i < 13; i++) + { + defaultWearables[i] = new AvatarWearable(); + } + defaultWearables[0].AssetID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73"); + defaultWearables[0].ItemID = LLUUID.Random(); + return defaultWearables; + } + } + } +} diff --git a/OpenSim/Framework/General/Types/AssetBase.cs b/OpenSim/Framework/General/Types/AssetBase.cs new file mode 100644 index 0000000000..c203f5197e --- /dev/null +++ b/OpenSim/Framework/General/Types/AssetBase.cs @@ -0,0 +1,46 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class AssetBase + { + public byte[] Data; + public LLUUID FullID; + public sbyte Type; + public sbyte InvType; + public string Name; + public string Description; + + public AssetBase() + { + + } + } +} diff --git a/OpenSim/Framework/General/Types/AssetLandmark.cs b/OpenSim/Framework/General/Types/AssetLandmark.cs new file mode 100644 index 0000000000..8aa872e86d --- /dev/null +++ b/OpenSim/Framework/General/Types/AssetLandmark.cs @@ -0,0 +1,59 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Text; +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class AssetLandmark : AssetBase + { + public int Version; + public LLVector3 Position; + public LLUUID RegionID; + + public AssetLandmark(AssetBase a) + { + this.Data = a.Data; + this.FullID = a.FullID; + this.Type = a.Type; + this.InvType = a.InvType; + this.Name = a.Name; + this.Description = a.Description; + InternData(); + } + + private void InternData() + { + string temp = Encoding.UTF8.GetString(Data).Trim(); + string[] parts = temp.Split('\n'); + int.TryParse(parts[0].Substring(17, 1), out Version); + LLUUID.TryParse(parts[1].Substring(10, 36), out RegionID); + LLVector3.TryParse(parts[2].Substring(11, parts[2].Length - 11), out Position); + } + } +} diff --git a/OpenSim/Framework/General/Types/AssetStorage.cs b/OpenSim/Framework/General/Types/AssetStorage.cs new file mode 100644 index 0000000000..3681336fd4 --- /dev/null +++ b/OpenSim/Framework/General/Types/AssetStorage.cs @@ -0,0 +1,47 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class AssetStorage + { + + public AssetStorage() { + } + + public AssetStorage(LLUUID assetUUID) { + UUID=assetUUID; + } + + public byte[] Data; + public sbyte Type; + public string Name; + public LLUUID UUID; + } +} diff --git a/OpenSim/Framework/General/Types/EstateSettings.cs b/OpenSim/Framework/General/Types/EstateSettings.cs new file mode 100644 index 0000000000..436b109194 --- /dev/null +++ b/OpenSim/Framework/General/Types/EstateSettings.cs @@ -0,0 +1,93 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class EstateSettings + { + //Settings to this island + public float billableFactor = (float)0.0; + public uint estateID = 0; + public uint parentEstateID = 0; + + public byte maxAgents = 40; + public float objectBonusFactor = (float)1.0; + + public int redirectGridX = 0; //?? + public int redirectGridY = 0; //?? + public Simulator.RegionFlags regionFlags = Simulator.RegionFlags.None; //Booleam values of various region settings + public Simulator.SimAccess simAccess = Simulator.SimAccess.Mature; //Is sim PG, Mature, etc? Mature by default. + public float sunHour = 0; + + public float terrainRaiseLimit = 0; + public float terrainLowerLimit = 0; + + public bool useFixedSun = false; + public int pricePerMeter = 1; + + public ushort regionWaterHeight = 20; + public bool regionAllowTerraform = true; + + // Region Information + // Low resolution 'base' textures. No longer used. + public LLUUID terrainBase0 = new LLUUID("b8d3965a-ad78-bf43-699b-bff8eca6c975"); // Default + public LLUUID terrainBase1 = new LLUUID("abb783e6-3e93-26c0-248a-247666855da3"); // Default + public LLUUID terrainBase2 = new LLUUID("179cdabd-398a-9b6b-1391-4dc333ba321f"); // Default + public LLUUID terrainBase3 = new LLUUID("beb169c7-11ea-fff2-efe5-0f24dc881df2"); // Default + + // Higher resolution terrain textures + public LLUUID terrainDetail0 = new LLUUID("00000000-0000-0000-0000-000000000000"); + public LLUUID terrainDetail1 = new LLUUID("00000000-0000-0000-0000-000000000000"); + public LLUUID terrainDetail2 = new LLUUID("00000000-0000-0000-0000-000000000000"); + public LLUUID terrainDetail3 = new LLUUID("00000000-0000-0000-0000-000000000000"); + + // First quad - each point is bilinearly interpolated at each meter of terrain + public float terrainStartHeight0 = 10.0f; + public float terrainStartHeight1 = 10.0f; + public float terrainStartHeight2 = 10.0f; + public float terrainStartHeight3 = 10.0f; + + // Second quad - also bilinearly interpolated. + // Terrain texturing is done that: + // 0..3 (0 = base0, 3 = base3) = (terrain[x,y] - start[x,y]) / range[x,y] + public float terrainHeightRange0 = 60.0f; //00 + public float terrainHeightRange1 = 60.0f; //01 + public float terrainHeightRange2 = 60.0f; //10 + public float terrainHeightRange3 = 60.0f; //11 + + // Terrain Default (Must be in F32 Format!) + public string terrainFile = "default.r32"; + public double terrainMultiplier = 60.0; + public float waterHeight = (float)20.0; + + public LLUUID terrainImageID = LLUUID.Zero; // the assetID that is the current Map image for this region + + } +} diff --git a/OpenSim/Framework/General/Types/Login.cs b/OpenSim/Framework/General/Types/Login.cs new file mode 100644 index 0000000000..d54c0195c8 --- /dev/null +++ b/OpenSim/Framework/General/Types/Login.cs @@ -0,0 +1,49 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class Login + { + public string First = "Test"; + public string Last = "User"; + public LLUUID Agent; + public LLUUID Session; + public LLUUID SecureSession = LLUUID.Zero; + public LLUUID InventoryFolder; + public LLUUID BaseFolder; + public uint CircuitCode; + public string CapsPath =""; + + public Login() + { + + } + } +} diff --git a/OpenSim/Framework/General/Types/MapBlockData.cs b/OpenSim/Framework/General/Types/MapBlockData.cs new file mode 100644 index 0000000000..fbb3b7392d --- /dev/null +++ b/OpenSim/Framework/General/Types/MapBlockData.cs @@ -0,0 +1,23 @@ +using System; +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class MapBlockData + { + public uint Flags; + public ushort X; + public ushort Y; + public byte Agents; + public byte Access; + public byte WaterHeight; + public LLUUID MapImageId; + public String Name; + public uint RegionFlags; + + public MapBlockData() + { + + } + } +} diff --git a/OpenSim/Framework/General/Types/NeighbourInfo.cs b/OpenSim/Framework/General/Types/NeighbourInfo.cs new file mode 100644 index 0000000000..bb67981481 --- /dev/null +++ b/OpenSim/Framework/General/Types/NeighbourInfo.cs @@ -0,0 +1,42 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Framework.Types +{ + public class NeighbourInfo + { + public NeighbourInfo() + { + } + + public ulong regionhandle; + public uint RegionLocX; + public uint RegionLocY; + public string sim_ip; + public uint sim_port; + } +} diff --git a/OpenSim/Framework/General/Types/NetworkServersInfo.cs b/OpenSim/Framework/General/Types/NetworkServersInfo.cs new file mode 100644 index 0000000000..b7acb2f86e --- /dev/null +++ b/OpenSim/Framework/General/Types/NetworkServersInfo.cs @@ -0,0 +1,115 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using OpenSim.Framework.Configuration; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; + +namespace OpenSim.Framework.Types +{ + public class NetworkServersInfo : ConfigurationMember + { + public string AssetURL = "http://127.0.0.1:8003/"; + public string AssetSendKey = ""; + + public string GridURL = ""; + public string GridSendKey = ""; + public string GridRecvKey = ""; + public string UserURL = ""; + public string UserSendKey = ""; + public string UserRecvKey = ""; + public bool isSandbox; + + public uint DefaultHomeLocX = 0; + public uint DefaultHomeLocY = 0; + + public int HttpListenerPort = 9000; + public int RemotingListenerPort = 8895; + + public NetworkServersInfo() + { + this.setConfigurationDescription("NETWORK SERVERS INFORMATION"); + this.setConfigurationFilename("network_servers_information.xml"); + + this.addConfigurationOption("HttpListenerPort","HTTP Listener Port","9000"); + this.addConfigurationOption("RemotingListenerPort","Remoting Listener Port","8895"); + this.addConfigurationOption("DefaultLocationX","Default Home Location (X Axis)","1000"); + this.addConfigurationOption("DefaultLocationY","Default Home Location (Y Axis)","1000"); + + this.addConfigurationOption("GridServerURL","Grid Server URL","http://127.0.0.1:8001"); + this.addConfigurationOption("GridSendKey","Key to send to grid server","null"); + this.addConfigurationOption("GridRecvKey","Key to expect from grid server","null"); + + this.addConfigurationOption("UserServerURL","User Server URL","http://127.0.0.1:8002"); + this.addConfigurationOption("UserSendKey","Key to send to user server","null"); + this.addConfigurationOption("UserRecvKey","Key to expect from user server","null"); + + this.addConfigurationOption("AssetServerURL","Asset Server URL","http://127.0.0.1:8003"); + } + + public override void handleConfigurationItem(string configuration_key, string configuration_value) + { + switch(configuration_key) + { + case "HttpListenerPort": + this.HttpListenerPort = Convert.ToInt32(configuration_value); + break; + case "RemotingListenerPort": + this.RemotingListenerPort = Convert.ToInt32(configuration_value); + break; + case "DefaultLocationX": + this.DefaultHomeLocX = Convert.ToUInt32(configuration_value); + break; + case "DefaultLocationY": + this.DefaultHomeLocY = Convert.ToUInt32(configuration_value); + break; + case "GridServerURL": + this.GridURL = configuration_value; + break; + case "GridSendKey": + this.GridSendKey = configuration_value; + break; + case "GridRecvKey": + this.GridRecvKey = configuration_value; + break; + case "UserServerURL": + this.UserURL = configuration_value; + break; + case "UserSendKey": + this.UserSendKey = configuration_value; + break; + case "UserRecvKey": + this.UserRecvKey = configuration_value; + break; + case "AssetServerURL": + this.AssetURL = configuration_value; + break; + } + } + } +} diff --git a/OpenSim/Framework/General/Types/ParcelData.cs b/OpenSim/Framework/General/Types/ParcelData.cs new file mode 100644 index 0000000000..761d55e42c --- /dev/null +++ b/OpenSim/Framework/General/Types/ParcelData.cs @@ -0,0 +1,112 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + + public class ParcelData + { + public byte[] parcelBitmapByteArray = new byte[512]; + public string parcelName = ""; + public string parcelDesc = ""; + public LLUUID ownerID = new LLUUID(); + public bool isGroupOwned = false; + public LLVector3 AABBMin = new LLVector3(); + public LLVector3 AABBMax = new LLVector3(); + public int area = 0; + public uint auctionID = 0; //Unemplemented. If set to 0, not being auctioned + public LLUUID authBuyerID = new LLUUID(); //Unemplemented. Authorized Buyer's UUID + public Parcel.ParcelCategory category = new Parcel.ParcelCategory(); //Unemplemented. Parcel's chosen category + public int claimDate = 0; //Unemplemented + public int claimPrice = 0; //Unemplemented + public LLUUID groupID = new LLUUID(); //Unemplemented + public int groupPrims = 0; //Unemplemented + public int salePrice = 0; //Unemeplemented. Parcels price. + public Parcel.ParcelStatus parcelStatus = Parcel.ParcelStatus.None; + public Parcel.ParcelFlags parcelFlags = Parcel.ParcelFlags.None; + public byte landingType = 0; + public byte mediaAutoScale = 0; + public LLUUID mediaID = LLUUID.Zero; + public int localID = 0; + public LLUUID globalID = new LLUUID(); + + public string mediaURL = ""; + public string musicURL = ""; + public float passHours = 0; + public int passPrice = 0; + public LLUUID snapshotID = LLUUID.Zero; + public LLVector3 userLocation = new LLVector3(); + public LLVector3 userLookAt = new LLVector3(); + + public ParcelData() + { + globalID = LLUUID.Random(); + } + + public ParcelData Copy() + { + ParcelData parcelData = new ParcelData(); + + parcelData.AABBMax = this.AABBMax; + parcelData.AABBMin = this.AABBMin; + parcelData.area = this.area; + parcelData.auctionID = this.auctionID; + parcelData.authBuyerID = this.authBuyerID; + parcelData.category = this.category; + parcelData.claimDate = this.claimDate; + parcelData.claimPrice = this.claimPrice; + parcelData.globalID = this.globalID; + parcelData.groupID = this.groupID; + parcelData.groupPrims = this.groupPrims; + parcelData.isGroupOwned = this.isGroupOwned; + parcelData.localID = this.localID; + parcelData.landingType = this.landingType; + parcelData.mediaAutoScale = this.mediaAutoScale; + parcelData.mediaID = this.mediaID; + parcelData.mediaURL = this.mediaURL; + parcelData.musicURL = this.musicURL; + parcelData.ownerID = this.ownerID; + parcelData.parcelBitmapByteArray = (byte[])this.parcelBitmapByteArray.Clone(); + parcelData.parcelDesc = this.parcelDesc; + parcelData.parcelFlags = this.parcelFlags; + parcelData.parcelName = this.parcelName; + parcelData.parcelStatus = this.parcelStatus; + parcelData.passHours = this.passHours; + parcelData.passPrice = this.passPrice; + parcelData.salePrice = this.salePrice; + parcelData.snapshotID = this.snapshotID; + parcelData.userLocation = this.userLocation; + parcelData.userLookAt = this.userLookAt; + + return parcelData; + + } + } + +} diff --git a/OpenSim/Framework/General/Types/PrimData.cs b/OpenSim/Framework/General/Types/PrimData.cs new file mode 100644 index 0000000000..ff81bcdc6a --- /dev/null +++ b/OpenSim/Framework/General/Types/PrimData.cs @@ -0,0 +1,228 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public class PrimData + { + private const uint FULL_MASK_PERMISSIONS = 2147483647; + + public LLUUID OwnerID; + public byte PCode; + public ushort PathBegin; + public ushort PathEnd; + public byte PathScaleX; + public byte PathScaleY; + public byte PathShearX; + public byte PathShearY; + public sbyte PathSkew; + public ushort ProfileBegin; + public ushort ProfileEnd; + public LLVector3 Scale; + public byte PathCurve; + public byte ProfileCurve; + public uint ParentID = 0; + public ushort ProfileHollow; + public sbyte PathRadiusOffset; + public byte PathRevolutions; + public sbyte PathTaperX; + public sbyte PathTaperY; + public sbyte PathTwist; + public sbyte PathTwistBegin; + public byte[] TextureEntry; // a LL textureEntry in byte[] format + + public Int32 CreationDate; + public uint OwnerMask = FULL_MASK_PERMISSIONS; + public uint NextOwnerMask = FULL_MASK_PERMISSIONS; + public uint GroupMask = FULL_MASK_PERMISSIONS; + public uint EveryoneMask = FULL_MASK_PERMISSIONS; + public uint BaseMask = FULL_MASK_PERMISSIONS; + + //following only used during prim storage + public LLVector3 Position; + public LLQuaternion Rotation = new LLQuaternion(0, 1, 0, 0); + public uint LocalID; + public LLUUID FullID; + + public PrimData() + { + + } + + public PrimData(byte[] data) + { + int i = 0; + + this.OwnerID = new LLUUID(data, i); i += 16; + this.PCode = data[i++]; + this.PathBegin = (ushort)(data[i++] + (data[i++] << 8)); + this.PathEnd = (ushort)(data[i++] + (data[i++] << 8)); + this.PathScaleX = data[i++]; + this.PathScaleY = data[i++]; + this.PathShearX = data[i++]; + this.PathShearY = data[i++]; + this.PathSkew = (sbyte)data[i++]; + this.ProfileBegin = (ushort)(data[i++] + (data[i++] << 8)); + this.ProfileEnd = (ushort)(data[i++] + (data[i++] << 8)); + this.Scale = new LLVector3(data, i); i += 12; + this.PathCurve = data[i++]; + this.ProfileCurve = data[i++]; + this.ParentID = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); + this.ProfileHollow = (ushort)(data[i++] + (data[i++] << 8)); + this.PathRadiusOffset = (sbyte)data[i++]; + this.PathRevolutions = data[i++]; + this.PathTaperX = (sbyte)data[i++]; + this.PathTaperY = (sbyte)data[i++]; + this.PathTwist = (sbyte)data[i++]; + this.PathTwistBegin = (sbyte)data[i++]; + ushort length = (ushort)(data[i++] + (data[i++] << 8)); + this.TextureEntry = new byte[length]; + Array.Copy(data, i, TextureEntry, 0, length); i += length; + this.CreationDate = (Int32)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); + this.OwnerMask = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); + this.NextOwnerMask = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); + this.GroupMask = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); + this.EveryoneMask = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); + this.BaseMask = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); + this.Position = new LLVector3(data, i); i += 12; + this.Rotation = new LLQuaternion(data, i, true); i += 12; + this.LocalID = (uint)(data[i++] + (data[i++] << 8) + (data[i++] << 16) + (data[i++] << 24)); + this.FullID = new LLUUID(data, i); i += 16; + + } + + public byte[] ToBytes() + { + int i = 0; + byte[] bytes = new byte[126 + TextureEntry.Length]; + Array.Copy(OwnerID.GetBytes(), 0, bytes, i, 16); i += 16; + bytes[i++] = this.PCode; + bytes[i++] = (byte)(this.PathBegin % 256); + bytes[i++] = (byte)((this.PathBegin >> 8) % 256); + bytes[i++] = (byte)(this.PathEnd % 256); + bytes[i++] = (byte)((this.PathEnd >> 8) % 256); + bytes[i++] = this.PathScaleX; + bytes[i++] = this.PathScaleY; + bytes[i++] = this.PathShearX; + bytes[i++] = this.PathShearY; + bytes[i++] = (byte)this.PathSkew; + bytes[i++] = (byte)(this.ProfileBegin % 256); + bytes[i++] = (byte)((this.ProfileBegin >> 8) % 256); + bytes[i++] = (byte)(this.ProfileEnd % 256); + bytes[i++] = (byte)((this.ProfileEnd >> 8) % 256); + Array.Copy(Scale.GetBytes(), 0, bytes, i, 12); i += 12; + bytes[i++] = this.PathCurve; + bytes[i++] = this.ProfileCurve; + bytes[i++] = (byte)(ParentID % 256); + bytes[i++] = (byte)((ParentID >> 8) % 256); + bytes[i++] = (byte)((ParentID >> 16) % 256); + bytes[i++] = (byte)((ParentID >> 24) % 256); + bytes[i++] = (byte)(this.ProfileHollow % 256); + bytes[i++] = (byte)((this.ProfileHollow >> 8) % 256); + bytes[i++] = ((byte)this.PathRadiusOffset); + bytes[i++] = this.PathRevolutions; + bytes[i++] = ((byte)this.PathTaperX); + bytes[i++] = ((byte)this.PathTaperY); + bytes[i++] = ((byte)this.PathTwist); + bytes[i++] = ((byte)this.PathTwistBegin); + bytes[i++] = (byte)(TextureEntry.Length % 256); + bytes[i++] = (byte)((TextureEntry.Length >> 8) % 256); + Array.Copy(TextureEntry, 0, bytes, i, TextureEntry.Length); i += TextureEntry.Length; + bytes[i++] = (byte)(this.CreationDate % 256); + bytes[i++] = (byte)((this.CreationDate >> 8) % 256); + bytes[i++] = (byte)((this.CreationDate >> 16) % 256); + bytes[i++] = (byte)((this.CreationDate >> 24) % 256); + bytes[i++] = (byte)(this.OwnerMask % 256); + bytes[i++] = (byte)((this.OwnerMask >> 8) % 256); + bytes[i++] = (byte)((this.OwnerMask >> 16) % 256); + bytes[i++] = (byte)((this.OwnerMask >> 24) % 256); + bytes[i++] = (byte)(this.NextOwnerMask % 256); + bytes[i++] = (byte)((this.NextOwnerMask >> 8) % 256); + bytes[i++] = (byte)((this.NextOwnerMask >> 16) % 256); + bytes[i++] = (byte)((this.NextOwnerMask >> 24) % 256); + bytes[i++] = (byte)(this.GroupMask % 256); + bytes[i++] = (byte)((this.GroupMask >> 8) % 256); + bytes[i++] = (byte)((this.GroupMask >> 16) % 256); + bytes[i++] = (byte)((this.GroupMask >> 24) % 256); + bytes[i++] = (byte)(this.EveryoneMask % 256); + bytes[i++] = (byte)((this.EveryoneMask >> 8) % 256); + bytes[i++] = (byte)((this.EveryoneMask >> 16) % 256); + bytes[i++] = (byte)((this.EveryoneMask >> 24) % 256); + bytes[i++] = (byte)(this.BaseMask % 256); + bytes[i++] = (byte)((this.BaseMask >> 8) % 256); + bytes[i++] = (byte)((this.BaseMask >> 16) % 256); + bytes[i++] = (byte)((this.BaseMask >> 24) % 256); + Array.Copy(this.Position.GetBytes(), 0, bytes, i, 12); i += 12; + if (this.Rotation == new LLQuaternion(0, 0, 0, 0)) + { + this.Rotation = new LLQuaternion(0, 1, 0, 0); + } + Array.Copy(this.Rotation.GetBytes(), 0, bytes, i, 12); i += 12; + bytes[i++] = (byte)(this.LocalID % 256); + bytes[i++] = (byte)((this.LocalID >> 8) % 256); + bytes[i++] = (byte)((this.LocalID >> 16) % 256); + bytes[i++] = (byte)((this.LocalID >> 24) % 256); + Array.Copy(FullID.GetBytes(), 0, bytes, i, 16); i += 16; + + return bytes; + } + + public static PrimData DefaultCube() + { + PrimData primData = new PrimData(); + primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + primData.FullID = LLUUID.Random(); + primData.Scale = new LLVector3(0.5f, 0.5f, 0.5f); + primData.Rotation = new LLQuaternion(0, 0, 0, 1); + primData.PCode = 9; + primData.ParentID = 0; + primData.PathBegin = 0; + primData.PathEnd = 0; + primData.PathScaleX = 0; + primData.PathScaleY = 0; + primData.PathShearX = 0; + primData.PathShearY = 0; + primData.PathSkew = 0; + primData.ProfileBegin = 0; + primData.ProfileEnd = 0; + primData.PathCurve = 16; + primData.ProfileCurve = 1; + primData.ProfileHollow = 0; + primData.PathRadiusOffset = 0; + primData.PathRevolutions = 0; + primData.PathTaperX = 0; + primData.PathTaperY = 0; + primData.PathTwist = 0; + primData.PathTwistBegin = 0; + + return primData; + } + } +} diff --git a/OpenSim/Framework/General/Types/PrimitiveBaseShape.cs b/OpenSim/Framework/General/Types/PrimitiveBaseShape.cs new file mode 100644 index 0000000000..a6671d10fc --- /dev/null +++ b/OpenSim/Framework/General/Types/PrimitiveBaseShape.cs @@ -0,0 +1,102 @@ +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + public enum ShapeType + { + Box, + Sphere, + Ring, + Tube, + Torus, + Prism, + Scuplted, + Cylinder, + Foliage, + Unknown + } + + public class PrimitiveBaseShape + { + private ShapeType type = ShapeType.Unknown; + + public byte PCode; + public ushort PathBegin; + public ushort PathEnd; + public byte PathScaleX; + public byte PathScaleY; + public byte PathShearX; + public byte PathShearY; + public sbyte PathSkew; + public ushort ProfileBegin; + public ushort ProfileEnd; + public LLVector3 Scale; + public byte PathCurve; + public byte ProfileCurve; + public ushort ProfileHollow; + public sbyte PathRadiusOffset; + public byte PathRevolutions; + public sbyte PathTaperX; + public sbyte PathTaperY; + public sbyte PathTwist; + public sbyte PathTwistBegin; + public byte[] TextureEntry; // a LL textureEntry in byte[] format + + public ShapeType PrimType + { + get + { + return this.type; + } + } + + public LLVector3 PrimScale + { + get + { + return this.Scale; + } + } + + public PrimitiveBaseShape() + { + + } + + //void returns need to change of course + public void GetMesh() + { + + } + + public static PrimitiveBaseShape DefaultBox() + { + PrimitiveBaseShape primShape = new PrimitiveBaseShape(); + + primShape.type = ShapeType.Box; + primShape.Scale = new LLVector3(0.5f, 0.5f, 0.5f); + primShape.PCode = 9; + primShape.PathBegin = 0; + primShape.PathEnd = 0; + primShape.PathScaleX = 0; + primShape.PathScaleY = 0; + primShape.PathShearX = 0; + primShape.PathShearY = 0; + primShape.PathSkew = 0; + primShape.ProfileBegin = 0; + primShape.ProfileEnd = 0; + primShape.PathCurve = 16; + primShape.ProfileCurve = 1; + primShape.ProfileHollow = 0; + primShape.PathRadiusOffset = 0; + primShape.PathRevolutions = 0; + primShape.PathTaperX = 0; + primShape.PathTaperY = 0; + primShape.PathTwist = 0; + primShape.PathTwistBegin = 0; + + return primShape; + } + } + +} diff --git a/OpenSim/Framework/General/Types/RegionHandle.cs b/OpenSim/Framework/General/Types/RegionHandle.cs new file mode 100644 index 0000000000..4a055adae8 --- /dev/null +++ b/OpenSim/Framework/General/Types/RegionHandle.cs @@ -0,0 +1,121 @@ +using System; +using System.Net; + +namespace OpenSim.Framework.Types +{ + /// + /// A class for manipulating RegionHandle coordinates + /// + class RegionHandle + { + private UInt64 handle; + + /// + /// Initialises a new grid-aware RegionHandle + /// + /// IP Address of the Grid Server for this region + /// Grid X Coordinate + /// Grid Y Coordinate + public RegionHandle(string ip, short x, short y) + { + IPAddress addr = IPAddress.Parse(ip); + + if (addr.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork) + throw new Exception("Bad RegionHandle Parameter - must be an IPv4 address"); + + uint baseHandle = BitConverter.ToUInt32(addr.GetAddressBytes(), 0); + + // Split the IP address in half + short a = (short)((baseHandle << 16) & 0xFFFF); + short b = (short)((baseHandle << 0) & 0xFFFF); + + // Raise the bounds a little + uint nx = (uint)x; + uint ny = (uint)y; + + // Multiply grid coords to get region coords + nx *= 256; + ny *= 256; + + // Stuff the IP address in too + nx = (uint)a << 16; + ny = (uint)b << 16; + + handle = ((UInt64)nx << 32) | (uint)ny; + } + + /// + /// Initialises a new RegionHandle that is not inter-grid aware + /// + /// Grid X Coordinate + /// Grid Y Coordinate + public RegionHandle(uint x, uint y) + { + handle = ((x * 256) << 32) | (y * 256); + } + + /// + /// Initialises a new RegionHandle from an existing value + /// + /// A U64 RegionHandle + public RegionHandle(UInt64 Region) + { + handle = Region; + } + + /// + /// Returns the Grid Masked RegionHandle - For use in Teleport packets and other packets where sending the grid IP address may be handy. + /// + /// Do not use for SimulatorEnable packets. The client will choke. + /// Region Handle including IP Address encoding + public UInt64 getTeleportHandle() + { + return handle; + } + + /// + /// Returns a RegionHandle which may be used for SimulatorEnable packets. Removes the IP address encoding and returns the lower bounds. + /// + /// A U64 RegionHandle for use in SimulatorEnable packets. + public UInt64 getNeighbourHandle() + { + UInt64 mask = 0x0000FFFF0000FFFF; + + return handle | mask; + } + + /// + /// Returns the IP Address of the GridServer from a Grid-Encoded RegionHandle + /// + /// Grid Server IP Address + public IPAddress getGridIP() + { + uint a = (uint)((handle >> 16) & 0xFFFF); + uint b = (uint)((handle >> 48) & 0xFFFF); + + return new IPAddress((long)(a << 16) | (long)b); + } + + /// + /// Returns the X Coordinate from a Grid-Encoded RegionHandle + /// + /// X Coordinate + public uint getGridX() + { + uint x = (uint)((handle >> 32) & 0xFFFF); + + return x; + } + + /// + /// Returns the Y Coordinate from a Grid-Encoded RegionHandle + /// + /// Y Coordinate + public uint getGridY() + { + uint y = (uint)((handle >> 0) & 0xFFFF); + + return y; + } + } +} diff --git a/OpenSim/Framework/General/Types/RegionInfo.cs b/OpenSim/Framework/General/Types/RegionInfo.cs new file mode 100644 index 0000000000..9c73a36f8e --- /dev/null +++ b/OpenSim/Framework/General/Types/RegionInfo.cs @@ -0,0 +1,358 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Globalization; +using System.Net; +using System.Net.Sockets; +using libsecondlife; +using OpenSim.Framework.Configuration; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Framework.Types +{ + public class RegionInfo : ConfigurationMember + { + public LLUUID SimUUID = new LLUUID(); + public string RegionName = ""; + + private IPEndPoint m_internalEndPoint; + public IPEndPoint InternalEndPoint + { + get + { + return m_internalEndPoint; + } + } + + public IPEndPoint ExternalEndPoint + { + get + { + // Old one defaults to IPv6 + //return new IPEndPoint( Dns.GetHostAddresses( m_externalHostName )[0], m_internalEndPoint.Port ); + + // New method favors IPv4 + IPAddress ia = null; + foreach (IPAddress Adr in Dns.GetHostAddresses(m_externalHostName)) + { + if (ia == null) + ia = Adr; + + if (Adr.AddressFamily == AddressFamily.InterNetwork) + { + ia = Adr; + break; + } + + } + + return new IPEndPoint(ia, m_internalEndPoint.Port); + } + } + + private string m_externalHostName; + public string ExternalHostName + { + get + { + return m_externalHostName; + } + } + + private uint? m_regionLocX; + public uint RegionLocX + { + get + { + return m_regionLocX.Value; + } + } + + private uint? m_regionLocY; + public uint RegionLocY + { + get + { + return m_regionLocY.Value; + } + } + + private ulong? m_regionHandle; + public ulong RegionHandle + { + get + { + if (!m_regionHandle.HasValue) + { + m_regionHandle = Util.UIntsToLong((RegionLocX * 256), (RegionLocY * 256)); + } + + return m_regionHandle.Value; + } + } + + public string DataStore = ""; + public bool isSandbox = false; + + public LLUUID MasterAvatarAssignedUUID = new LLUUID(); + public string MasterAvatarFirstName = ""; + public string MasterAvatarLastName = ""; + public string MasterAvatarSandboxPassword = ""; + + public EstateSettings estateSettings; + + public RegionInfo() + { + estateSettings = new EstateSettings(); + this.setConfigurationDescription("REGION INFORMATION"); + this.addConfigurationOption("SimName", "Simulator Name", "OpenSim Test"); + this.addConfigurationOption("SimLocationX", "Grid Location (X Axis)", "1000"); + this.addConfigurationOption("SimLocationY", "Grid Location (Y Axis)", "1000"); + this.addConfigurationOption("Datastore", "Filename for local storage", "localworld.yap"); + this.addConfigurationOption("InternalIPAddress", "Internal IP Address for incoming UDP client connections", "0.0.0.0"); + this.addConfigurationOption("InternalIPPort", "Internal IP Port for incoming UDP client connections", "9000"); + this.addConfigurationOption("ExternalHostName", "External Host Name", "127.0.0.1"); + this.addConfigurationOption("TerrainFile", "Default Terrain File", "default.r32"); + this.addConfigurationOption("TerrainMultiplier", "Terrain Height Multiplier", "60.0"); + this.addConfigurationOption("MasterAvatarFirst", "First Name of Master Avatar", "Test"); + this.addConfigurationOption("MasterAvatarLast", "Last Name of Master Avatar", "User"); + } + + public override void handleConfigurationItem(string configuration_key, string configuration_value) + { + switch (configuration_key) + { + case "SimName": + break; + case "SimLocationX": + break; + case "SimLocationY": + break; + case "Datastore": + break; + case "InternalIPAddress": + break; + case "InternalIPPort": + break; + case "ExternalHostName": + break; + case "TerrainFile": + break; + case "TerrainMultiplier": + break; + case "MasterAvatarFirst": + break; + case "MasterAvatarLast": + break; + } + } + public void InitConfig(bool sandboxMode, IGenericConfig configData) + { + this.isSandbox = sandboxMode; + try + { + string attri = ""; + + // Sim UUID + string simId = configData.GetAttribute("SimUUID"); + if (String.IsNullOrEmpty( simId )) + { + this.SimUUID = LLUUID.Random(); + } + else + { + this.SimUUID = new LLUUID(simId); + } + configData.SetAttribute("SimUUID", this.SimUUID.ToString()); + + this.RegionName = GetString(configData, "SimName", "OpenSim test", "Region Name"); + + //m_regionLocX = (uint) GetInt(configData, "SimLocationX", 1000, "Grid Location X"); + + attri = ""; + attri = configData.GetAttribute("SimLocationX"); + if (attri == "") + { + string location = MainLog.Instance.CmdPrompt("Grid Location X", "1000"); + configData.SetAttribute("SimLocationX", location); + m_regionLocX = (uint)Convert.ToUInt32(location); + } + else + { + m_regionLocX = (uint)Convert.ToUInt32(attri); + } + // Sim/Grid location Y + attri = ""; + attri = configData.GetAttribute("SimLocationY"); + if (attri == "") + { + string location = MainLog.Instance.CmdPrompt("Grid Location Y", "1000"); + configData.SetAttribute("SimLocationY", location); + m_regionLocY = (uint)Convert.ToUInt32(location); + } + else + { + m_regionLocY = (uint)Convert.ToUInt32(attri); + } + + m_regionHandle = null; + + this.DataStore = GetString(configData, "Datastore", "localworld.yap", "Filename for local storage"); + + IPAddress internalAddress = GetIPAddress(configData, "InternalIPAddress", "0.0.0.0", "Internal IP Address for UDP client connections"); + int internalPort = GetIPPort(configData, "InternalIPPort", "9000", "Internal IP Port for UDP client connections"); + m_internalEndPoint = new IPEndPoint(internalAddress, internalPort); + + m_externalHostName = GetString(configData, "ExternalHostName", "127.0.0.1", "External Host Name"); + + estateSettings.terrainFile = + GetString(configData, "TerrainFile", "default.r32", "GENERAL SETTING: Default Terrain File"); + + attri = ""; + attri = configData.GetAttribute("TerrainMultiplier"); + if (attri == "") + { + string re = MainLog.Instance.CmdPrompt("GENERAL SETTING: Terrain Height Multiplier", "60.0"); + this.estateSettings.terrainMultiplier = Convert.ToDouble(re, CultureInfo.InvariantCulture); + configData.SetAttribute("TerrainMultiplier", this.estateSettings.terrainMultiplier.ToString()); + } + else + { + this.estateSettings.terrainMultiplier = Convert.ToDouble(attri); + } + + attri = ""; + attri = configData.GetAttribute("MasterAvatarFirstName"); + if (attri == "") + { + this.MasterAvatarFirstName = MainLog.Instance.CmdPrompt("First name of Master Avatar (Land and Region Owner)", "Test"); + + configData.SetAttribute("MasterAvatarFirstName", this.MasterAvatarFirstName); + } + else + { + this.MasterAvatarFirstName = attri; + } + + attri = ""; + attri = configData.GetAttribute("MasterAvatarLastName"); + if (attri == "") + { + this.MasterAvatarLastName = MainLog.Instance.CmdPrompt("Last name of Master Avatar (Land and Region Owner)", "User"); + + configData.SetAttribute("MasterAvatarLastName", this.MasterAvatarLastName); + } + else + { + this.MasterAvatarLastName = attri; + } + + if (isSandbox) //Sandbox Mode Specific Settings + { + attri = ""; + attri = configData.GetAttribute("MasterAvatarSandboxPassword"); + if (attri == "") + { + this.MasterAvatarSandboxPassword = MainLog.Instance.CmdPrompt("Password of Master Avatar (Needed for sandbox mode account creation only)", "test"); + + //Should I store this? + configData.SetAttribute("MasterAvatarSandboxPassword", this.MasterAvatarSandboxPassword); + } + else + { + this.MasterAvatarSandboxPassword = attri; + } + } + + configData.Commit(); + } + catch (Exception e) + { + MainLog.Instance.Warn("Config.cs:InitConfig() - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + + MainLog.Instance.Verbose("Sim settings loaded:"); + MainLog.Instance.Verbose("UUID: " + this.SimUUID.ToStringHyphenated()); + MainLog.Instance.Verbose("Name: " + this.RegionName); + MainLog.Instance.Verbose("Region Location: [" + this.RegionLocX.ToString() + "," + this.RegionLocY + "]"); + MainLog.Instance.Verbose("Region Handle: " + this.RegionHandle.ToString()); + MainLog.Instance.Verbose("Listening on IP end point: " + m_internalEndPoint.ToString() ); + MainLog.Instance.Verbose("Sandbox Mode? " + isSandbox.ToString()); + + } + + private uint GetInt(IGenericConfig configData, string p, int p_3, string p_4) + { + throw new Exception("The method or operation is not implemented."); + } + + private string GetString(IGenericConfig configData, string attrName, string defaultvalue, string prompt) + { + string s = configData.GetAttribute(attrName); + + if (String.IsNullOrEmpty( s )) + { + s = MainLog.Instance.CmdPrompt(prompt, defaultvalue); + configData.SetAttribute(attrName, s ); + } + return s; + } + + private IPAddress GetIPAddress(IGenericConfig configData, string attrName, string defaultvalue, string prompt) + { + string addressStr = configData.GetAttribute(attrName); + + IPAddress address; + + if (!IPAddress.TryParse(addressStr, out address)) + { + address = MainLog.Instance.CmdPromptIPAddress(prompt, defaultvalue); + configData.SetAttribute(attrName, address.ToString()); + } + return address; + } + + private int GetIPPort(IGenericConfig configData, string attrName, string defaultvalue, string prompt) + { + string portStr = configData.GetAttribute(attrName); + + int port; + + if (!int.TryParse(portStr, out port)) + { + port = MainLog.Instance.CmdPromptIPPort(prompt, defaultvalue); + configData.SetAttribute(attrName, port.ToString()); + } + + return port; + } + } +} diff --git a/OpenSim/Framework/General/Types/UUID.cs b/OpenSim/Framework/General/Types/UUID.cs new file mode 100644 index 0000000000..9cde18e5f8 --- /dev/null +++ b/OpenSim/Framework/General/Types/UUID.cs @@ -0,0 +1,127 @@ +using System; +using libsecondlife; + +namespace OpenSim.Framework.Types +{ + class UUID + { + public LLUUID llUUID; + + public UUID(string uuid) + { + llUUID = new LLUUID(uuid); + } + + public UUID(byte[] uuid) + { + llUUID = new LLUUID(uuid, 0); + } + + public UUID(byte[] uuid, int offset) + { + llUUID = new LLUUID(uuid, offset); + } + + public UUID() + { + llUUID = LLUUID.Zero; + } + + public UUID(ulong uuid) + { + llUUID = new LLUUID(uuid); + } + + public UUID(UInt32 first, UInt32 second, UInt32 third, UInt32 fourth) + { + byte[] uuid = new byte[16]; + + byte[] n = BitConverter.GetBytes(first); + n.CopyTo(uuid, 0); + n = BitConverter.GetBytes(second); + n.CopyTo(uuid, 4); + n = BitConverter.GetBytes(third); + n.CopyTo(uuid, 8); + n = BitConverter.GetBytes(fourth); + n.CopyTo(uuid, 12); + + llUUID = new LLUUID(uuid,0); + } + + public override string ToString() + { + return llUUID.ToString(); + } + + public string ToStringHyphenated() + { + return llUUID.ToStringHyphenated(); + } + + public byte[] GetBytes() + { + return llUUID.GetBytes(); + } + + public UInt32[] GetInts() + { + UInt32[] ints = new UInt32[4]; + ints[0] = BitConverter.ToUInt32(llUUID.Data, 0); + ints[1] = BitConverter.ToUInt32(llUUID.Data, 4); + ints[2] = BitConverter.ToUInt32(llUUID.Data, 8); + ints[3] = BitConverter.ToUInt32(llUUID.Data, 12); + + return ints; + } + + public LLUUID GetLLUUID() + { + return llUUID; + } + + public uint CRC() + { + return llUUID.CRC(); + } + + public override int GetHashCode() + { + return llUUID.GetHashCode(); + } + + public void Combine(UUID other) + { + llUUID.Combine(other.GetLLUUID()); + } + + public void Combine(LLUUID other) + { + llUUID.Combine(other); + } + + public override bool Equals(Object other) + { + return llUUID.Equals(other); + } + + public static bool operator ==(UUID a, UUID b) + { + return a.llUUID.Equals(b.GetLLUUID()); + } + + public static bool operator !=(UUID a, UUID b) + { + return !a.llUUID.Equals(b.GetLLUUID()); + } + + public static bool operator ==(UUID a, LLUUID b) + { + return a.Equals(b); + } + + public static bool operator !=(UUID a, LLUUID b) + { + return !a.Equals(b); + } + } +} diff --git a/OpenSim/Framework/General/UserProfile.cs b/OpenSim/Framework/General/UserProfile.cs new file mode 100644 index 0000000000..243208a422 --- /dev/null +++ b/OpenSim/Framework/General/UserProfile.cs @@ -0,0 +1,87 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using System.Security.Cryptography; +using libsecondlife; +using OpenSim.Framework.Inventory; + +namespace OpenSim.Framework.User +{ + public class UserProfile + { + + public string firstname; + public string lastname; + public ulong homeregionhandle; + public LLVector3 homepos; + public LLVector3 homelookat; + + public bool IsGridGod = false; + public bool IsLocal = true; // will be used in future for visitors from foreign grids + public string AssetURL; + public string MD5passwd; + + public LLUUID CurrentSessionID; + public LLUUID CurrentSecureSessionID; + public LLUUID UUID; + public Dictionary Circuits = new Dictionary(); // tracks circuit codes + + public AgentInventory Inventory; + + public UserProfile() + { + Circuits = new Dictionary(); + Inventory = new AgentInventory(); + homeregionhandle = Helpers.UIntsToLong((1000 * 256), (1000 * 256)); + homepos = new LLVector3(); + homelookat = new LLVector3(); + } + + public void InitSessionData() + { + RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider(); + + byte[] randDataS = new byte[16]; + byte[] randDataSS = new byte[16]; + + rand.GetBytes(randDataS); + rand.GetBytes(randDataSS); + + CurrentSecureSessionID = new LLUUID(randDataSS,0); + CurrentSessionID = new LLUUID(randDataS,0); + + } + + public void AddSimCircuit(uint circuitCode, LLUUID regionUUID) + { + if (this.Circuits.ContainsKey(regionUUID) == false) + this.Circuits.Add(regionUUID, circuitCode); + } + + } +} diff --git a/OpenSim/Framework/General/Util.cs b/OpenSim/Framework/General/Util.cs new file mode 100644 index 0000000000..13e3af2c10 --- /dev/null +++ b/OpenSim/Framework/General/Util.cs @@ -0,0 +1,184 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Security.Cryptography; +using System.Text; +using libsecondlife; + +namespace OpenSim.Framework.Utilities +{ + public class Util + { + private static Random randomClass = new Random(); + private static uint nextXferID = 5000; + private static object XferLock = new object(); + + public static ulong UIntsToLong(uint X, uint Y) + { + return Helpers.UIntsToLong(X, Y); + } + + public static Random RandomClass + { + get + { + return randomClass; + } + } + + public static uint GetNextXferID() + { + uint id = 0; + lock(XferLock) + { + id = nextXferID; + nextXferID++; + } + return id; + } + + public static int UnixTimeSinceEpoch() + { + TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1)); + int timestamp = (int)t.TotalSeconds; + return timestamp; + } + + public static string Md5Hash(string pass) + { + MD5 md5 = MD5CryptoServiceProvider.Create(); + byte[] dataMd5 = md5.ComputeHash(Encoding.Default.GetBytes(pass)); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < dataMd5.Length; i++) + sb.AppendFormat("{0:x2}", dataMd5[i]); + return sb.ToString(); + } + + public static string GetRandomCapsPath() + { + LLUUID caps = LLUUID.Random(); + string capsPath = caps.ToStringHyphenated(); + capsPath = capsPath.Remove(capsPath.Length - 4, 4); + return capsPath; + } + + //public static int fast_distance2d(int x, int y) + //{ + // x = System.Math.Abs(x); + // y = System.Math.Abs(y); + + // int min = System.Math.Min(x, y); + + // return (x + y - (min >> 1) - (min >> 2) + (min >> 4)); + //} + + public static string FieldToString(byte[] bytes) + { + return FieldToString(bytes, String.Empty); + } + + /// + /// Convert a variable length field (byte array) to a string, with a + /// field name prepended to each line of the output + /// + /// If the byte array has unprintable characters in it, a + /// hex dump will be put in the string instead + /// The byte array to convert to a string + /// A field name to prepend to each line of output + /// An ASCII string or a string containing a hex dump, minus + /// the null terminator + public static string FieldToString(byte[] bytes, string fieldName) + { + // Check for a common case + if (bytes.Length == 0) return String.Empty; + + StringBuilder output = new StringBuilder(); + bool printable = true; + + for (int i = 0; i < bytes.Length; ++i) + { + // Check if there are any unprintable characters in the array + if ((bytes[i] < 0x20 || bytes[i] > 0x7E) && bytes[i] != 0x09 + && bytes[i] != 0x0D && bytes[i] != 0x0A && bytes[i] != 0x00) + { + printable = false; + break; + } + } + + if (printable) + { + if (fieldName.Length > 0) + { + output.Append(fieldName); + output.Append(": "); + } + + if (bytes[bytes.Length - 1] == 0x00) + output.Append(UTF8Encoding.UTF8.GetString(bytes, 0, bytes.Length - 1)); + else + output.Append(UTF8Encoding.UTF8.GetString(bytes)); + } + else + { + for (int i = 0; i < bytes.Length; i += 16) + { + if (i != 0) + output.Append(Environment.NewLine); + if (fieldName.Length > 0) + { + output.Append(fieldName); + output.Append(": "); + } + + for (int j = 0; j < 16; j++) + { + if ((i + j) < bytes.Length) + output.Append(String.Format("{0:X2} ", bytes[i + j])); + else + output.Append(" "); + } + + for (int j = 0; j < 16 && (i + j) < bytes.Length; j++) + { + if (bytes[i + j] >= 0x20 && bytes[i + j] < 0x7E) + output.Append((char)bytes[i + j]); + else + output.Append("."); + } + } + } + + return output.ToString(); + } + public Util() + { + + } + } +} diff --git a/OpenSim/Framework/General/obj/Debug/OpenSim.Framework.dll b/OpenSim/Framework/General/obj/Debug/OpenSim.Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..e1c100fc95e0e1709dd86fa2cf3553df610bc40e GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/General/obj/Debug/OpenSim.Framework.pdb b/OpenSim/Framework/General/obj/Debug/OpenSim.Framework.pdb new file mode 100644 index 0000000000000000000000000000000000000000..6d80ee4a15139640d5e9be8d2701ffda89893ca2 GIT binary patch literal 112128 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/General/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Framework/General/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..cf7a79d21d994e7c12eca1dcd02aed07c7227490 GIT binary patch literal 17294 zcmeHOeQ;FO72msg+3b6SY}OVC6haWN3SsljM-(9hBdG);L7<9m-|oJI2QT~Rz6}s& zTH^n1t956S zQ(3XbNI0e)UsxNe#=pvn<{m5AlQ0&>jh3rHvs|53Gw6tv~G9&6E~Njp)L9*)1+?%u2?j6^9e+HA*+_JqB~j2Q_(zUVNw z8w!oc@vYIV9>ei?3JN@hg=75L?$w&P){HDRw+^}f<$LEZDuz|s7?P?2QAnZ`HJI!3 zk(l1xxW1#O%e2g-u|8tP*DsCK+mVel6;24%P|UJ?(4I3`aph(s-eGo!S`vD=Ukm zaaBl-*^I{=luKGeZc~bR!64PK5G4=+h*F3k#7z)iB2fsH+1I7n?3N70Fx|zL?j+mn znAvF>v0~kEjP8ilyMiXJIA+j1#*BE>G@N25swb010(~8iqWH#E4!%*x24Yhz)FfQu zu5C#pj%NpS4c$nG2OdNhd_1r2A2a*ulTWB$rn))~Vmt|kslb3e0qaolv(!F;>S`Ip zL=p_M#M@7ey}xY_wNFCRS0E;%9TUjgGuNMjrgDg>Xvf@2?G&!LJhL}Kl*kM_V2$ox?4y!v^e+SwI?n@3`) zMe- zmgtV*52v%Ik}$HGCacR%n8^*@Wio8B6O?fz6Sj3zm>jen@51dUn`+n1#JJ2gc+!+K zBgk-iec={M?{WhCLIeF-QIUrg@KWUU`b*MYK5a#Vn{LHB&90t=jw~_b_bF;;s=bo2 zU#!>kp#f&d(C!$iJ!$);8OU-2G1l?v@%rwe)e8&?U+QxDQf(vgFnxS0NX$ka-B?vs z)!bN>Ng}H#Nvj&v6&atpk~%2I=;y!}n;8VXqAkdh!(oqK=_7U@rHkQ$)Z)>USEx3s zsgdshq#U7Zj%3EZliNgk5Oc381*`f4oDSZT9N&{*jQ-4ed(}!WOA5jJ4M(U<9gj{a+LmVRbav0_iL6?u> z8&vV706ycZ;U>9!B5STf9ibDisZt-`hGMFq+(|6q7XP`B5vg{^xwpp~+ zmaL77)^?|@O+AT-$lScWRM8k>Gl%;)Y|X&uI7GbWtEqS+|6yfCMteOvZYA;WmAvouEHv9Dn#`k{VuRY%%d$m^3_oD%j&d zfonriR+GrJ+{K&ET`2QQ=Puu+1@?D4Q9D7tT2uEE^|d4!feC z(gF*v=w}2|uIT4fW32*}*fIfV>~4`)Eh4WJGf$e_c16c&fn8Vhs!N$)gEC75marxP zXl$`anMDM!T|<2+k;Xnu-p}N)pE-eLPH#}J>$WuYHTojuX?{yJb~{l4yL?plutovU z_7@>{mv24+mo@?H&7pW1e%NOsn99FP2?bkdd1mD>vrf_i3lZ!T!4$9Fpc<a=yame45m>@11wij^M9R#PD1*)Tyr0QoKl5i= zU@3zA#ih+@(B>9_DQui93la8Hf+=_T8P!;UKy~I7fX0}}d;I@SZsw-oAW@z)IZPTx@ATaW>m`t) zOaax{Xa5p*IzJVF#y%nBCj0*+;8G@lgJmdQwwq)o*_U=Y_fkWiRXNNmKhZ~UMXJjy z4ZQkTpc1<#0F7N0dG(RVD`j7vG`XF*1&AB2D=Kv<69i?h2rOYA2tZ?(Mao=~D1(!v zc|ViGer7yzLrV51xU?w)Z7vE-Vebn-V;4l)oR?^W6UTYlFSf5=GqL{MlMH8ekp$tWx>y4Jgk;r&^i5V(9J`ZM z4-cn`<5sfj(cx5af<{)wNt&z%;N*m?iW3xBRq?i5R>fQMtg3hcDy!l}XjWCc_>xue z0xYX4UUtZ;cm!MC+Wc5XOT>{rTH#lB_Mt74x@R>gi*R#ogx$g0?* z$f}B;bFwOa)@4;i8ZWCNozJR@%uH5AhL%+o5m{D6WX`GzFD$FV8)sF;Q^!@^CBV~{ IO?Aw_0V~{8*#H0l literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/General/obj/OpenSim.Framework.csproj.FileList.txt b/OpenSim/Framework/General/obj/OpenSim.Framework.csproj.FileList.txt new file mode 100644 index 0000000000..042611965e --- /dev/null +++ b/OpenSim/Framework/General/obj/OpenSim.Framework.csproj.FileList.txt @@ -0,0 +1,6 @@ +..\..\..\bin\OpenSim.Framework.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.dll +obj\Debug\OpenSim.Framework.pdb diff --git a/OpenSim/Framework/General/obj/Release/OpenSim.Framework.dll b/OpenSim/Framework/General/obj/Release/OpenSim.Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..6d35b4a021cdb2b87f7e959eb2297623fadaf776 GIT binary patch literal 61440 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 BP^SO@ literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs new file mode 100644 index 0000000000..f79047737a --- /dev/null +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs @@ -0,0 +1,224 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using Nwc.XmlRpc; +using OpenSim.Framework.Console; + +namespace OpenSim.Framework.Servers +{ + public class BaseHttpServer + { + protected Thread m_workerThread; + protected HttpListener m_httpListener; + protected Dictionary m_rpcHandlers = new Dictionary(); + protected Dictionary m_streamHandlers = new Dictionary(); + protected int m_port; + protected bool m_firstcaps = true; + + public BaseHttpServer(int port) + { + m_port = port; + } + + public void AddStreamHandler( IStreamHandler handler) + { + string httpMethod = handler.HttpMethod; + string path = handler.Path; + + string handlerKey = GetHandlerKey(httpMethod, path); + m_streamHandlers.Add(handlerKey, handler); + } + + private static string GetHandlerKey(string httpMethod, string path) + { + return httpMethod + ":" + path; + } + + public bool AddXmlRPCHandler(string method, XmlRpcMethod handler) + { + if (!this.m_rpcHandlers.ContainsKey(method)) + { + this.m_rpcHandlers.Add(method, handler); + return true; + } + + //must already have a handler for that path so return false + return false; + } + + + public virtual void HandleRequest(Object stateinfo) + { + HttpListenerContext context = (HttpListenerContext)stateinfo; + + HttpListenerRequest request = context.Request; + HttpListenerResponse response = context.Response; + + response.KeepAlive = false; + response.SendChunked = false; + + string path = request.RawUrl; + string handlerKey = GetHandlerKey( request.HttpMethod, path ); + + IStreamHandler streamHandler; + + if (TryGetStreamHandler( handlerKey, out streamHandler)) + { + byte[] buffer = streamHandler.Handle(path, request.InputStream); + request.InputStream.Close(); + + response.ContentType = streamHandler.ContentType; + response.ContentLength64 = buffer.LongLength; + response.OutputStream.Write(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + else + { + HandleXmlRpcRequests(request, response); + } + } + + private bool TryGetStreamHandler(string handlerKey, out IStreamHandler streamHandler) + { + string bestMatch = null; + + foreach (string pattern in m_streamHandlers.Keys) + { + if (handlerKey.StartsWith(pattern)) + { + if (String.IsNullOrEmpty(bestMatch) || pattern.Length > bestMatch.Length) + { + bestMatch = pattern; + } + } + } + + if (String.IsNullOrEmpty(bestMatch)) + { + streamHandler = null; + return false; + } + else + { + streamHandler = m_streamHandlers[bestMatch]; + return true; + } + } + + private void HandleXmlRpcRequests(HttpListenerRequest request, HttpListenerResponse response) + { + Stream requestStream = request.InputStream; + + Encoding encoding = Encoding.UTF8; + StreamReader reader = new StreamReader(requestStream, encoding); + + string requestBody = reader.ReadToEnd(); + reader.Close(); + requestStream.Close(); + + XmlRpcRequest xmlRprcRequest = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody); + + string methodName = xmlRprcRequest.MethodName; + + XmlRpcResponse xmlRpcResponse; + + XmlRpcMethod method; + if (this.m_rpcHandlers.TryGetValue(methodName, out method)) + { + xmlRpcResponse = method(xmlRprcRequest); + } + else + { + xmlRpcResponse = new XmlRpcResponse(); + Hashtable unknownMethodError = new Hashtable(); + unknownMethodError["reason"] = "XmlRequest"; ; + unknownMethodError["message"] = "Unknown Rpc Request ["+methodName+"]"; + unknownMethodError["login"] = "false"; + xmlRpcResponse.Value = unknownMethodError; + } + + response.AddHeader("Content-type", "text/xml"); + + string responseString = XmlRpcResponseSerializer.Singleton.Serialize(xmlRpcResponse); + + byte[] buffer = Encoding.UTF8.GetBytes(responseString); + + response.SendChunked = false; + response.ContentLength64 = buffer.Length; + response.ContentEncoding = Encoding.UTF8; + + response.OutputStream.Write(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + + public void Start() + { + MainLog.Instance.WriteLine(LogPriority.LOW, "BaseHttpServer.cs: Starting up HTTP Server"); + + m_workerThread = new Thread(new ThreadStart(StartHTTP)); + m_workerThread.IsBackground = true; + m_workerThread.Start(); + } + + private void StartHTTP() + { + try + { + MainLog.Instance.WriteLine(LogPriority.LOW, "BaseHttpServer.cs: StartHTTP() - Spawned main thread OK"); + m_httpListener = new HttpListener(); + + m_httpListener.Prefixes.Add("http://+:" + m_port + "/"); + m_httpListener.Start(); + + HttpListenerContext context; + while (true) + { + context = m_httpListener.GetContext(); + ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), context); + } + } + catch (Exception e) + { + MainLog.Instance.WriteLine(LogPriority.MEDIUM, e.Message); + } + } + + + public void RemoveStreamHandler(string httpMethod, string path) + { + m_streamHandlers.Remove(GetHandlerKey(httpMethod, path)); + } + } +} diff --git a/OpenSim/Framework/Servers/BaseStreamHandler.cs b/OpenSim/Framework/Servers/BaseStreamHandler.cs new file mode 100644 index 0000000000..5fcf678105 --- /dev/null +++ b/OpenSim/Framework/Servers/BaseStreamHandler.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace OpenSim.Framework.Servers +{ + public abstract class BaseStreamHandler : IStreamHandler + { + virtual public string ContentType + { + get { return "application/xml"; } + } + + private string m_httpMethod; + virtual public string HttpMethod + { + get { return m_httpMethod; } + } + + private string m_path; + virtual public string Path + { + get { return m_path; } + } + + protected string GetParam( string path ) + { + return path.Substring( m_path.Length ); + } + + public abstract byte[] Handle(string path, Stream request); + + protected BaseStreamHandler(string path, string httpMethod ) + { + m_httpMethod = httpMethod; + m_path = path; + } + } +} diff --git a/OpenSim/Framework/Servers/CheckSumServer.cs b/OpenSim/Framework/Servers/CheckSumServer.cs new file mode 100644 index 0000000000..89ec095239 --- /dev/null +++ b/OpenSim/Framework/Servers/CheckSumServer.cs @@ -0,0 +1,127 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Framework.Servers +{/* + public class CheckSumServer : UDPServerBase + { + //protected ConsoleBase m_log; + + public CheckSumServer(int port) + : base(port) + { + } + + protected override void OnReceivedData(IAsyncResult result) + { + ipeSender = new IPEndPoint(IPAddress.Any, 0); + epSender = (EndPoint)ipeSender; + Packet packet = null; + int numBytes = Server.EndReceiveFrom(result, ref epSender); + int packetEnd = numBytes - 1; + + packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer); + + if (packet.Type == PacketType.SecuredTemplateChecksumRequest) + { + SecuredTemplateChecksumRequestPacket checksum = (SecuredTemplateChecksumRequestPacket)packet; + TemplateChecksumReplyPacket checkreply = new TemplateChecksumReplyPacket(); + checkreply.DataBlock.Checksum = 3220703154;//180572585; + checkreply.DataBlock.Flags = 0; + checkreply.DataBlock.MajorVersion = 1; + checkreply.DataBlock.MinorVersion = 15; + checkreply.DataBlock.PatchVersion = 0; + checkreply.DataBlock.ServerVersion = 0; + checkreply.TokenBlock.Token = checksum.TokenBlock.Token; + this.SendPacket(checkreply, epSender); + + /* + //if we wanted to echo the the checksum/ version from the client (so that any client worked) + SecuredTemplateChecksumRequestPacket checkrequest = new SecuredTemplateChecksumRequestPacket(); + checkrequest.TokenBlock.Token = checksum.TokenBlock.Token; + this.SendPacket(checkrequest, epSender); + + } + else if (packet.Type == PacketType.TemplateChecksumReply) + { + //echo back the client checksum reply (Hegemon's method) + TemplateChecksumReplyPacket checksum2 = (TemplateChecksumReplyPacket)packet; + TemplateChecksumReplyPacket checkreply2 = new TemplateChecksumReplyPacket(); + checkreply2.DataBlock.Checksum = checksum2.DataBlock.Checksum; + checkreply2.DataBlock.Flags = checksum2.DataBlock.Flags; + checkreply2.DataBlock.MajorVersion = checksum2.DataBlock.MajorVersion; + checkreply2.DataBlock.MinorVersion = checksum2.DataBlock.MinorVersion; + checkreply2.DataBlock.PatchVersion = checksum2.DataBlock.PatchVersion; + checkreply2.DataBlock.ServerVersion = checksum2.DataBlock.ServerVersion; + checkreply2.TokenBlock.Token = checksum2.TokenBlock.Token; + this.SendPacket(checkreply2, epSender); + } + else + { + } + + Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); + } + + private void SendPacket(Packet Pack, EndPoint endp) + { + if (!Pack.Header.Resent) + { + Pack.Header.Sequence = 1; + } + + byte[] ZeroOutBuffer = new byte[4096]; + byte[] sendbuffer; + sendbuffer = Pack.ToBytes(); + + try + { + if (Pack.Header.Zerocoded) + { + int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer); + this.SendPackTo(ZeroOutBuffer, packetsize, SocketFlags.None, endp); + } + else + { + this.SendPackTo(sendbuffer, sendbuffer.Length, SocketFlags.None, endp); + } + } + catch (Exception) + { + OpenSim.Framework.Console.MainLog.Instance.Warn("OpenSimClient.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection "); + + } + } + + private void SendPackTo(byte[] buffer, int size, SocketFlags flags, EndPoint endp) + { + this.Server.SendTo(buffer, size, flags, endp); + } + * } + */ + +} \ No newline at end of file diff --git a/OpenSim/Framework/Servers/IStreamHandler.cs b/OpenSim/Framework/Servers/IStreamHandler.cs new file mode 100644 index 0000000000..6cab40d06c --- /dev/null +++ b/OpenSim/Framework/Servers/IStreamHandler.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace OpenSim.Framework.Servers +{ + public interface IStreamHandler + { + // Handle request stream, return byte array + byte[] Handle(string path, Stream request ); + + // Return response content type + string ContentType { get; } + + // Return required http method + string HttpMethod { get;} + + // Return path + string Path { get; } + } +} diff --git a/OpenSim/Framework/Servers/OpenSim.Framework.Servers.csproj b/OpenSim/Framework/Servers/OpenSim.Framework.Servers.csproj new file mode 100644 index 0000000000..51edf0c7a7 --- /dev/null +++ b/OpenSim/Framework/Servers/OpenSim.Framework.Servers.csproj @@ -0,0 +1,125 @@ + + + Local + 8.0.50727 + 2.0 + {2CC71860-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Servers + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Servers + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + ..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Servers/OpenSim.Framework.Servers.csproj.user b/OpenSim/Framework/Servers/OpenSim.Framework.Servers.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Servers/OpenSim.Framework.Servers.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Servers/RestMethod.cs b/OpenSim/Framework/Servers/RestMethod.cs new file mode 100644 index 0000000000..c6cb230c93 --- /dev/null +++ b/OpenSim/Framework/Servers/RestMethod.cs @@ -0,0 +1,31 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Framework.Servers +{ + public delegate string RestMethod( string request, string path, string param ); +} diff --git a/OpenSim/Framework/Servers/RestStreamHandler.cs b/OpenSim/Framework/Servers/RestStreamHandler.cs new file mode 100644 index 0000000000..7ca369d398 --- /dev/null +++ b/OpenSim/Framework/Servers/RestStreamHandler.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace OpenSim.Framework.Servers +{ + public class RestStreamHandler : BaseStreamHandler + { + RestMethod m_restMethod; + + override public byte[] Handle(string path, Stream request ) + { + Encoding encoding = Encoding.UTF8; + StreamReader streamReader = new StreamReader(request, encoding); + + string requestBody = streamReader.ReadToEnd(); + streamReader.Close(); + + string param = GetParam(path); + string responseString = m_restMethod(requestBody, path, param ); + + return Encoding.UTF8.GetBytes(responseString); + } + + public RestStreamHandler(string httpMethod, string path, RestMethod restMethod) : base( path, httpMethod ) + { + m_restMethod = restMethod; + } + } +} diff --git a/OpenSim/Framework/Servers/UDPServerBase.cs b/OpenSim/Framework/Servers/UDPServerBase.cs new file mode 100644 index 0000000000..508eb9d365 --- /dev/null +++ b/OpenSim/Framework/Servers/UDPServerBase.cs @@ -0,0 +1,87 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Net; +using System.Net.Sockets; +using libsecondlife.Packets; + +namespace OpenSim.Framework.Servers +{ + public class UDPServerBase + { + public Socket Server; + protected IPEndPoint ServerIncoming; + protected byte[] RecvBuffer = new byte[4096]; + protected byte[] ZeroBuffer = new byte[8192]; + protected IPEndPoint ipeSender; + protected EndPoint epSender; + protected AsyncCallback ReceivedData; + protected int listenPort; + + public UDPServerBase(int port) + { + listenPort = port; + } + + protected virtual void OnReceivedData(IAsyncResult result) + { + ipeSender = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0); + epSender = (EndPoint)ipeSender; + Packet packet = null; + int numBytes = Server.EndReceiveFrom(result, ref epSender); + int packetEnd = numBytes - 1; + + packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer); + + Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); + } + + protected virtual void AddNewClient(Packet packet) + { + } + + public virtual void ServerListener() + { + + ServerIncoming = new IPEndPoint(IPAddress.Parse("0.0.0.0"), listenPort); + Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + Server.Bind(ServerIncoming); + + ipeSender = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0); + epSender = (EndPoint)ipeSender; + ReceivedData = new AsyncCallback(this.OnReceivedData); + Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); + } + + public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode) + { + + } + } +} + diff --git a/OpenSim/Framework/Servers/XmlRpcMethod.cs b/OpenSim/Framework/Servers/XmlRpcMethod.cs new file mode 100644 index 0000000000..b76ac51e72 --- /dev/null +++ b/OpenSim/Framework/Servers/XmlRpcMethod.cs @@ -0,0 +1,33 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using Nwc.XmlRpc; + +namespace OpenSim.Framework.Servers +{ + public delegate XmlRpcResponse XmlRpcMethod( XmlRpcRequest request ); +} diff --git a/OpenSim/Framework/Servers/obj/Debug/OpenSim.Framework.Servers.dll b/OpenSim/Framework/Servers/obj/Debug/OpenSim.Framework.Servers.dll new file mode 100644 index 0000000000000000000000000000000000000000..d5aadcbfba986e4b52fc6cccc41cfd70ba50ca3f GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Servers/obj/Debug/OpenSim.Framework.Servers.pdb b/OpenSim/Framework/Servers/obj/Debug/OpenSim.Framework.Servers.pdb new file mode 100644 index 0000000000000000000000000000000000000000..aac553250ef910c9b69c17821276c68dc1537ae1 GIT binary patch literal 26112 zcmeI43zU`Bb;rNU3|HPV2r7s;!tjP+1{lCcR0alyATTncMT2!-7Z@4tjCU@tYV1d< zmNbdg6}zgb8ejDhW9w>spkjinsglGMH6fO^rmM|rscErdN?TS}qW%5Penso7k84IRPEnZf;sCaH^S=rzLqZZZ%P#^Pu zFpI~7dWU9O=>0tnG!V}J&1b!I=4xQx-3;*H(3z`%GrZ*ke^?%yCqFjSF)%Fn?6X3! zAmpc)PHPPuYP{ykH_!TM(LJ@nt`(2>dGz~LOCR{2cHj*gh#;_z@y;{;W6+u&2@Qg6t~sDZBhzox{f z|JS?fo{uMEdwT11WEwbL<3Hd37f=n&0n_19cn0j}0Qq>?S6|rs{^RBIt`bqfBD8`cb@`H@2w&lI9~q$$M5egx%rXzUVdla zfW5Djzu(lW+*3mXpML!5$GG|6ZT&2`bam~BQ<4?TKV<%ZAm9QVkmto7+bpv5%Dv9f{JWjv#2dbajVM*G9Sy(yhs)>u~8dHn-cyMwhN<#i^9q zbSlxXp}Ha2+?q(K$exv`f;vpnb=jmnFSR_DteTyOp&xx zE49Yn2ai#|I@0_ux|gu)BH`_XJ!>S{ABiu4H9z#y>8pVg<^Q$!y5JXOvB4iTepBm5 z*_-T7wwH*gQ#R(~HvIG0XBAhrr?`?ukD)98-?BN6oQYV9{*S zt6deKzIn_6$ANRf@gV*yln=uXgz^&jFpe=JTr|5~GI z{O{_!cffgn{Z@=QcgdN47uYswiR;w) zEP>RYm2OR`b){d!+P;pNHGrZ=*RWMC-C}SwvTATDxCCUK8Y~5CLDpH}P2e(+Wks+Y z{4;O`XxFgUvR-X~C&PX{yP(q=*6szmZo^9QQX5#un>>~8LEihp##X^IdHoml|4%!G z&|ewiZdH6|U#Ba30GnC=)e~QFy*#@98xvXoEof_PO*Exj+L9fmi?t(cY2uDoc70fv z*pgO((KX`|j6i#8ik58^Nv@s!g4&Yuk}`-l$rYNFbFPzYYHMyuu2uM0ZVyUV zCK{UAm_o`!HXn_XO5C!MGu6tr=B>u(YfTiDw>NOMO_=hR{-QDtW7}z`POMEWv`4S} zZTosEpnSCd5Q>C_eQv*D5J(%$Uf<8tgH&NicjP>A|1Dm~Ol`W*t%Oe(G>_@7Y+jXMf(N zX1ab`?fgNso;=5GAG>QFZiwwb^Zc@lP2#`tfi5s_!d5c2BnP?`;CqnrUq4gmb zu=0=})*Wu<7kt_PY;KnE$daFaht#`5>5WgH#e24L))8d{oLJ$(#+k5Qf9r5wpM1mqn&3oj`G)Ye%_U@ z6JgI8!dT)z@_NVKa_$BYOZIjf@@b@1Iv>~D8)oS2EeLcU!A((SJ*&Qq%G>SKkXZ{y zW$xm{(gYtDj@1_Xk+Fz1Nrrfif8yK89Nv}=@o_1wnn+S2>wE8Lpx1!WFBVZr<|PsV@Y$`9&NTNw`d!`{@low|mkS6Uxm z{X&~XAZhoDi>9tr zQ)Ub+57~V*&IYqZS|NL_grPrJnjpN6U zbbp8nynyak6X(BNUriv5x-*()V{(16ZFAC2Usb7;zCRwz`15O>8Z`h~V!`~f*NE># zxyEj4(+#P#);B%4e-g86eLu$izN}sffF848epyS$`_ehtGOFw9YOFohQKxC7QG6dq zeJNW(FJ0QBbh({$2jMRfFYfY|{#9T$UDh8fueXLAuXxo%~*;Db3rVoBax>ne(O=D)As=Q>=^?HD&<3=^sb(cf? z3Fa|#ZiT-KOL(6Jjt6Ih)4&R_f3TiCMhcz^Pl9#6WcM8^vmUl^+Xzk(N@y@AyG69Ph~3~|tW7etVHy>*>x)=sf1>?KI^7Vt^%X7DLc?SBSDKjF8)4d8dcB=`c@2HJLio_6X?^9opfr@J@erEnE7y-uz{ zC)43d_zHM2tTRz*+sC=YynCIcQHY)MW0|!Bd+cDH(^-l-=#e=tls#+&acKrM?$ie9 zSmB%*2b;iRa5E?yms~c4ZG`0@dNDdvIQ^mfaG`AZR*?P(ZUgC$;EUiY@OF@XG5Mo! zlOK5-l)Z)g{|D|}y57e7b`akceg#Ap{xNtLcn?UN@L`ZR;bY(*fmX-k(aUhO%ZP#4 z-x)m>X|zH*uNV>hu6Z7TbR>EfDqQ*(@c`)qSAG%b$Q#!9NAniU+_&AngsYX`?f> z;G4Y5ULOIm#o$p;cB?+Y27||W#|C8&A^jTsIY_?**ltK&0&F+@HuyC7T@V`%cZ1k) z_yZ7G`1jynfFFX-gZ~5m75FKLjfVqh7&acB3%&$S244m%z#X9NlX>XPpXpcdJQ^Mc zZ-O-*s>#jk+1hpXeJ;Ab3YN}S!FpGkA@JpJBfJpSIGW>F-vZ@_tv{(JGdq9BGV^+z zFxjie^{VNmfNarh{>mvGxI`Qt5c1-t~Fgw&6j%NQrC2^$8>TGe00 zu+qqX4KZQ*@p_l;>>M5=t)&8>%sqcVxzfkaLFwrqGxbO3JKzW5U9k49`{BYuzU#oV;Z<-qq-sGn0$Cdx>QK;q(!+`R z6-Tn@@^KKMvcVEqdXf%hdv$Of4KAi_I zglpi{u;vBL8R`J}DfzG`;OAj|2hhLw9MyluC-po_&&$Y@$KVxygg+-t_z*f3Zi9ut zJcN!mHf-8!lge&-WwuUO|T_{VOj1NEd&J zlQ+10KXUT--20tQ{)UTxp$q@Adv9>^2VD4tuAIMf;n%zO>Fzz|()D%W30GcUm;S$< z9G`CL%UHHLAU+~b#s0x#ELZM>b1;%VCo@IrGJQ0G^4DNH3=zHC7+vOX^CD-pu{el# zo4VUVP1U_c4%PwpymiG@)d>SirX=Y{1()W#6kawXlQkIpw zbhEQ%-S5&x|8a;f%gS7u3f0@zPwg#q2jV)(8 zK3!a(@O83sSEq(-I?e4iUF4!cq;6L3(lut=qPg9svmgF_IX2wIZ?b=LOKt6nI*tG4 zY}*T&2m9o;-G;fmX}i~x+E$Ps*M!-)utXt{q>1l!tilz zxQ$!Z+y7=xJDvK!d~Vif==|B)iaC__Hekb@Z5`wMuifKWuvT*v$Iji}8#^1+x=RWk z2A=~DhqYfg7d{Wxeo6c2QSb%uXjnVcG4MrjF?=yR79IzWhfClI@I<(mI%_~aesllw z7%nZK54H~tCcat38OvV$a4SAx8sUR@_N2a0A8@*`%K$(2uft{kc94I!@_~Wo1w-Vg ztae{^p}OBt=c^WWuJ0(#`7;y2+=Z9SoH@S&>$Bv`Q2iC+->r0Tu+EjK`9fuW_}R!F zl-cQTO$3#dl~uFnEt+rh&6d-3xkG}zGH7TgMy_%XeD#7JmaF;QwmqnrTQ;|H{%ock zL%wZYmpLdHie5$gVU=0)`lue1$+y0|&&!J{=FFQjx3WrkO@FmipBD@<&2}Qm6wY~Y zCz9-0*i|b>F4=SNgE^u0MKbO8yGy6La|2yE#r34;>-f=`iYQ;!co>=Pu*tWG^3&;V zntYBZU#9O$rB;+vU&Yh+ANd?nv@McJsq$~4e3`z*OtGR)GJPj`u^XAb2RzY@Oy|}5 zzAefxPiLh|tf-Sr=bMjpBhy)*{IaN1p2(`Lh`A(7s)Fuu%dd-~vOeT8*wis*_MDRI z-=X$%nP=@@f0vR<(;I!rL3g0_pNMIUuX5&0yN7>qCC9(?{13HsauG+CG&{J8$M$K3T_-njyrD6th%O{BOZp z4vA#oS_Ux!PCRKGuY&#G|N9Ts3Mygj719F9qFjc2D2*BleuyJGpW14T&<=W|o5Z^s z!?w;eLT9`3l`~-Z=)ti3fEq5PNLgC@9qW3pggnN>^1Tyb)kFStGCUPlJ-zScv6s+5 NS95!>V$K{5{6Aclsek|g literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Servers/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Framework/Servers/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..d14e5180b4da730426e3cabbd70fab6b56e5dc7d GIT binary patch literal 11772 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Services/IAssetServicesCoreFunctions.cs b/OpenSim/Framework/Services/IAssetServicesCoreFunctions.cs new file mode 100644 index 0000000000..f4e6fde188 --- /dev/null +++ b/OpenSim/Framework/Services/IAssetServicesCoreFunctions.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Services +{ + public interface IAssetServicesCoreFunctions + { + + } +} diff --git a/OpenSim/Framework/Services/IGridServicesCoreFunctions.cs b/OpenSim/Framework/Services/IGridServicesCoreFunctions.cs new file mode 100644 index 0000000000..496fbdfc6c --- /dev/null +++ b/OpenSim/Framework/Services/IGridServicesCoreFunctions.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Services +{ + public interface IGridServicesCoreFunctions + { + } +} diff --git a/OpenSim/Framework/Services/IUserServicesCoreFunctions.cs b/OpenSim/Framework/Services/IUserServicesCoreFunctions.cs new file mode 100644 index 0000000000..515a6d5524 --- /dev/null +++ b/OpenSim/Framework/Services/IUserServicesCoreFunctions.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Services +{ + public interface IUserServicesCoreFunctions + { + } +} diff --git a/OpenSim/Framework/Services/OpenSim.Framework.Services.csproj b/OpenSim/Framework/Services/OpenSim.Framework.Services.csproj new file mode 100644 index 0000000000..e4fe4fb27f --- /dev/null +++ b/OpenSim/Framework/Services/OpenSim.Framework.Services.csproj @@ -0,0 +1,90 @@ + + + Local + 8.0.50727 + 2.0 + {6251A10E-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.Services + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.Services + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/Services/OpenSim.Framework.Services.csproj.user b/OpenSim/Framework/Services/OpenSim.Framework.Services.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/Services/OpenSim.Framework.Services.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/Services/obj/Debug/OpenSim.Framework.Services.dll b/OpenSim/Framework/Services/obj/Debug/OpenSim.Framework.Services.dll new file mode 100644 index 0000000000000000000000000000000000000000..84c3455680c366c290ecf9961a3be01e7d83be9f GIT binary patch literal 16384 zcmeI2Piz!*6vw~QZlMKfARv)o?9^hS!Av%_24jeB+oiZrDCxF9%qFmZ#_h=L%sMkm z3kTDS37*7=dQ-W3Fhm0(G2vw5fy9__;?g4rqZ~YG0)F3b|8+xyiSY#QHNQXa{oeb{ z`+a`9hd0|}?_NeffE3%qhrkVvA{o;^zFXz;@W{zshQj|oQRLjwoWq4-icg4 zq@(1Dvuxs*W?Ls2U}~MJQzf7TlzYToik4dR{J4{LUQZtwKOmb8z-Pb4Huj;^{j96m#_~zz1=W~lT;j8( zZXR3A<1*(`#*Q6c%w;)#Lw#2CDL*W66rsu5ybBl-~7{RWwo^aR+IBI&$OjA zZo)Nujm`LpE1U2)?y}!&-KEy{lyh9A_6p?bZS72tcCn)k;SRQ75Bu#HW&bQ3Y^CmC zCthT~7yFS~G!d%@A@?OoE;d>Q#IgHLZc{e)mmEG8> z_&#!nBd^l7Oox#>(+J9m7Y6ZTB9U8+-Du;e++-ZP$;NB7xEw~lS3>?moVYb7>lLd( z7$;siM%FDgs?}o2cPA6xX{nL8EgSEbhjC*#MwgSbCOC`_uk_+8cA=qylj_HrC|2jJ|dF0bO_vU`SHohN&*Dn@M?wMHo zc)+%-9YZPhgY>lqEo?R)5KfveZeEZZU+CL?Dk|2GhrywhvRjvg7M7xLIc|QKI`6II z4wu+Y^ZRsqCorGS=0Di_?a{?cpGlRwKTIk$rp-sFH zmfkNIm~E$xuD)I=;a=-)!wUI25Ku4_I-67%pS#_xDE zS}jUI2`B+2pahhF5>Nt4KnXl~1T0f;KL@P#o~>EY^XKG8?BXZy4o+u)E9(l`D}58R zox%xwzz8%5%=-p(g#L1x#P|lx-6yXiYSck$ zb&dfu_h@mLg`85>mU+Gi=V;5D$n*3lbHGP!%Ph1eAahPy$Lo2`B+2pahh_(@Vf^{?GV!Dc4n$fD%vwNiNhc2h9dGce%gl5z=V00Jg3V&DfdJwSXQ;Du15m^JPL+i2w*G!K@}o$`48fQe2z{J zzt9+YKKl3m-+Ore9?j$MO=pj~dNc$^Lx2h)004edSI7VW literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/Services/obj/OpenSim.Framework.Services.csproj.FileList.txt b/OpenSim/Framework/Services/obj/OpenSim.Framework.Services.csproj.FileList.txt new file mode 100644 index 0000000000..4db4c58527 --- /dev/null +++ b/OpenSim/Framework/Services/obj/OpenSim.Framework.Services.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.Services.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.Services.dll +..\..\..\bin\OpenSim.Framework.Services.pdb +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.Services.dll +obj\Debug\OpenSim.Framework.Services.pdb diff --git a/OpenSim/Framework/Services/obj/Release/OpenSim.Framework.Services.dll b/OpenSim/Framework/Services/obj/Release/OpenSim.Framework.Services.dll new file mode 100644 index 0000000000000000000000000000000000000000..bdb905b7538de05ac02445f92cbbaac9f26d2c40 GIT binary patch literal 16384 zcmeI2O=u)l5Xb+WovcaLjT=^$6=b*Ltf(N(kR4eMqLa^cB-w;a5=De$KH5o>p6;Q$ zCm(x|Tm=t;iw6BV+43hPn1VOPsR z5GHoTwWC&Gdx1T(Sh5>o&2`S7AGy{Jy)+BVTW9dxgOBDqyFJ9{_&I9`xIl}YTAgfr zTrm2Wv2$MX7U}fZry}bpJQvMWjNa+H)5hnAXMjZ+6@Xs`jH$ob03PqR{5{PEc!I7B zQGdOw0Z!uXCe-r+pK~V1cHY#C*uaJp#Zi@-$*sVF_}F}oNP*cqk?V(aG`VhYQv7m! zjz|HRI-=@O2`B+2pahhF5>Nt4KnW-TC7=XO5rGTY^srK!4qy;VHt+%KVCx?;m@2(7 zWwlpJExJA7u9i^XSjyP! z&DG)z`z7kHh(6_q74{-DS&uyl42$x+bsd+|+-Wy=0@BMP=Sj~r((cdVYkY>Y_=&AZ zIxD$xkY%k(zWcInZPb8Y;(Gd$DcZNLFLRf40 z?yFdAx`{e#4hVI^eXYHx{!}l|` zWew5G8nW6qD_7+8tPEUwGb%T4g~9A@)on@^E1OZc6I;l%f43#@6&c$yIxd~Rfplh_ zU}t=Pq3i`P3|!a1m)XN-8Ds2t1hpsuC7=Y9fD%vwN z(95H}enO;gjZcoB(bJziD&~{=i_FOC`p@zX{j-W z+`ItKo80GVubarzT-C&$$-a(F?g~>TZ<;(7+jb!&d30!t_V47AH++`3Psl7=%sAnj z?Wfe^BdmBwWY$dbWHCJ(d@DXrVE^ShIlqb$Py$Lo2`B+2pahhF5>Nt4;M5YZ)BhRI jT|c!1^x#TB2`B+2pahhF5>Nt4KnW-TC7=ZU_XPd~h36}) literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/UserManager/LoginResponse.cs b/OpenSim/Framework/UserManager/LoginResponse.cs new file mode 100644 index 0000000000..abcbd483df --- /dev/null +++ b/OpenSim/Framework/UserManager/LoginResponse.cs @@ -0,0 +1,643 @@ +using System; +using System.Collections; +using libsecondlife; +using Nwc.XmlRpc; +using OpenSim.Framework.Console; + +namespace OpenSim.Framework.UserManagement +{ + + /// + /// A temp class to handle login response. + /// Should make use of UserProfileManager where possible. + /// + + public class LoginResponse + { + private Hashtable loginFlagsHash; + private Hashtable globalTexturesHash; + private Hashtable loginError; + private Hashtable eventCategoriesHash; + private Hashtable uiConfigHash; + private Hashtable classifiedCategoriesHash; + + private ArrayList loginFlags; + private ArrayList globalTextures; + private ArrayList eventCategories; + private ArrayList uiConfig; + private ArrayList classifiedCategories; + private ArrayList inventoryRoot; + private ArrayList initialOutfit; + private ArrayList agentInventory; + + private UserInfo userProfile; + + private LLUUID agentID; + private LLUUID sessionID; + private LLUUID secureSessionID; + + // Login Flags + private string dst; + private string stipendSinceLogin; + private string gendered; + private string everLoggedIn; + private string login; + private int simPort; + private string simAddress; + private string agentAccess; + private Int32 circuitCode; + private uint regionX; + private uint regionY; + + // Login + private string firstname; + private string lastname; + + // Global Textures + private string sunTexture; + private string cloudTexture; + private string moonTexture; + + // Error Flags + private string errorReason; + private string errorMessage; + + // Response + private XmlRpcResponse xmlRpcResponse; + private XmlRpcResponse defaultXmlRpcResponse; + + private string welcomeMessage; + private string startLocation; + private string allowFirstLife; + private string home; + private string seedCapability; + private string lookAt; + + public LoginResponse() + { + this.loginFlags = new ArrayList(); + this.globalTextures = new ArrayList(); + this.eventCategories = new ArrayList(); + this.uiConfig = new ArrayList(); + this.classifiedCategories = new ArrayList(); + + this.loginError = new Hashtable(); + this.eventCategoriesHash = new Hashtable(); + this.classifiedCategoriesHash = new Hashtable(); + this.uiConfigHash = new Hashtable(); + + this.defaultXmlRpcResponse = new XmlRpcResponse(); + this.userProfile = new UserInfo(); + this.inventoryRoot = new ArrayList(); + this.initialOutfit = new ArrayList(); + this.agentInventory = new ArrayList(); + + this.xmlRpcResponse = new XmlRpcResponse(); + this.defaultXmlRpcResponse = new XmlRpcResponse(); + + this.SetDefaultValues(); + } // LoginServer + + public void SetDefaultValues() + { + this.DST = "N"; + this.StipendSinceLogin = "N"; + this.Gendered = "Y"; + this.EverLoggedIn = "Y"; + this.login = "false"; + this.firstname = "Test"; + this.lastname = "User"; + this.agentAccess = "M"; + this.startLocation = "last"; + this.allowFirstLife = "Y"; + + this.SunTexture = "cce0f112-878f-4586-a2e2-a8f104bba271"; + this.CloudTexture = "fc4b9f0b-d008-45c6-96a4-01dd947ac621"; + this.MoonTexture = "fc4b9f0b-d008-45c6-96a4-01dd947ac621"; + + this.ErrorMessage = "You have entered an invalid name/password combination. Check Caps/lock."; + this.ErrorReason = "key"; + this.welcomeMessage = "Welcome to OpenSim!"; + this.seedCapability = ""; + this.home = "{'region_handle':[r" + (1000 * 256).ToString() + ",r" + (1000 * 256).ToString() + "], 'position':[r" + this.userProfile.homepos.X.ToString() + ",r" + this.userProfile.homepos.Y.ToString() + ",r" + this.userProfile.homepos.Z.ToString() + "], 'look_at':[r" + this.userProfile.homelookat.X.ToString() + ",r" + this.userProfile.homelookat.Y.ToString() + ",r" + this.userProfile.homelookat.Z.ToString() + "]}"; + this.lookAt = "[r0.99949799999999999756,r0.03166859999999999814,r0]"; + this.RegionX = (uint)255232; + this.RegionY = (uint)254976; + + // Classifieds; + this.AddClassifiedCategory((Int32)1, "Shopping"); + this.AddClassifiedCategory((Int32)2, "Land Rental"); + this.AddClassifiedCategory((Int32)3, "Property Rental"); + this.AddClassifiedCategory((Int32)4, "Special Attraction"); + this.AddClassifiedCategory((Int32)5, "New Products"); + this.AddClassifiedCategory((Int32)6, "Employment"); + this.AddClassifiedCategory((Int32)7, "Wanted"); + this.AddClassifiedCategory((Int32)8, "Service"); + this.AddClassifiedCategory((Int32)9, "Personal"); + + + this.SessionID = LLUUID.Random(); + this.SecureSessionID = LLUUID.Random(); + this.AgentID = LLUUID.Random(); + + Hashtable InitialOutfitHash = new Hashtable(); + InitialOutfitHash["folder_name"] = "Nightclub Female"; + InitialOutfitHash["gender"] = "female"; + this.initialOutfit.Add(InitialOutfitHash); + + + } // SetDefaultValues + + #region Login Failure Methods + public XmlRpcResponse GenerateFailureResponse(string reason, string message, string login) + { + // Overwrite any default values; + this.xmlRpcResponse = new XmlRpcResponse(); + + // Ensure Login Failed message/reason; + this.ErrorMessage = message; + this.ErrorReason = reason; + + this.loginError["reason"] = this.ErrorReason; + this.loginError["message"] = this.ErrorMessage; + this.loginError["login"] = login; + this.xmlRpcResponse.Value = this.loginError; + return (this.xmlRpcResponse); + } // GenerateResponse + + public XmlRpcResponse CreateFailedResponse() + { + return (this.CreateLoginFailedResponse()); + } // CreateErrorConnectingToGridResponse() + + public XmlRpcResponse CreateLoginFailedResponse() + { + return (this.GenerateFailureResponse("key", "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist.", "false")); + } // LoginFailedResponse + + public XmlRpcResponse CreateAlreadyLoggedInResponse() + { + return (this.GenerateFailureResponse("presence", "You appear to be already logged in, if this is not the case please wait for your session to timeout, if this takes longer than a few minutes please contact the grid owner", "false")); + } // CreateAlreadyLoggedInResponse() + + public XmlRpcResponse CreateDeadRegionResponse() + { + return (this.GenerateFailureResponse("key", "The region you are attempting to log into is not responding. Please select another region and try again.", "false")); + } + + public XmlRpcResponse CreateGridErrorResponse() + { + return (this.GenerateFailureResponse("key", "Error connecting to grid. Could not percieve credentials from login XML.", "false")); + } + + #endregion + + public XmlRpcResponse ToXmlRpcResponse() + { + try + { + + Hashtable responseData = new Hashtable(); + + this.loginFlagsHash = new Hashtable(); + this.loginFlagsHash["daylight_savings"] = this.DST; + this.loginFlagsHash["stipend_since_login"] = this.StipendSinceLogin; + this.loginFlagsHash["gendered"] = this.Gendered; + this.loginFlagsHash["ever_logged_in"] = this.EverLoggedIn; + this.loginFlags.Add(this.loginFlagsHash); + + responseData["first_name"] = this.Firstname; + responseData["last_name"] = this.Lastname; + responseData["agent_access"] = this.agentAccess; + + this.globalTexturesHash = new Hashtable(); + this.globalTexturesHash["sun_texture_id"] = this.SunTexture; + this.globalTexturesHash["cloud_texture_id"] = this.CloudTexture; + this.globalTexturesHash["moon_texture_id"] = this.MoonTexture; + this.globalTextures.Add(this.globalTexturesHash); + this.eventCategories.Add(this.eventCategoriesHash); + + this.AddToUIConfig("allow_first_life", this.allowFirstLife); + this.uiConfig.Add(this.uiConfigHash); + + responseData["sim_port"] =(Int32) this.SimPort; + responseData["sim_ip"] = this.SimAddress; + + MainLog.Instance.Warn("SIM IP: " + responseData["sim_ip"] + "; SIM PORT: " + responseData["sim_port"]); + + responseData["agent_id"] = this.AgentID.ToStringHyphenated(); + responseData["session_id"] = this.SessionID.ToStringHyphenated(); + responseData["secure_session_id"] = this.SecureSessionID.ToStringHyphenated(); + responseData["circuit_code"] = this.CircuitCode; + responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + responseData["login-flags"] = this.loginFlags; + responseData["global-textures"] = this.globalTextures; + responseData["seed_capability"] = this.seedCapability; + + responseData["event_categories"] = this.eventCategories; + responseData["event_notifications"] = new ArrayList(); // todo + responseData["classified_categories"] = this.classifiedCategories; + responseData["ui-config"] = this.uiConfig; + + responseData["inventory-skeleton"] = this.agentInventory; + responseData["inventory-skel-lib"] = new ArrayList(); // todo + responseData["inventory-root"] = this.inventoryRoot; + responseData["gestures"] = new ArrayList(); // todo + responseData["inventory-lib-owner"] = new ArrayList(); // todo + responseData["initial-outfit"] = this.initialOutfit; + responseData["start_location"] = this.startLocation; + responseData["seed_capability"] = this.seedCapability; + responseData["home"] = this.home; + responseData["look_at"] = this.lookAt; + responseData["message"] = this.welcomeMessage; + responseData["region_x"] = (Int32)this.RegionX * 256; + responseData["region_y"] = (Int32)this.RegionY * 256; + + //responseData["inventory-lib-root"] = new ArrayList(); // todo + //responseData["buddy-list"] = new ArrayList(); // todo + + responseData["login"] = "true"; + this.xmlRpcResponse.Value = responseData; + + return (this.xmlRpcResponse); + } + catch (Exception e) + { + MainLog.Instance.WriteLine( + LogPriority.LOW, + "LoginResponse: Error creating XML-RPC Response: " + e.Message + ); + return (this.GenerateFailureResponse("Internal Error", "Error generating Login Response", "false")); + + } + + } // ToXmlRpcResponse + + public void SetEventCategories(string category, string value) + { + this.eventCategoriesHash[category] = value; + } // SetEventCategories + + public void AddToUIConfig(string itemName, string item) + { + this.uiConfigHash[itemName] = item; + } // SetUIConfig + + public void AddClassifiedCategory(Int32 ID, string categoryName) + { + this.classifiedCategoriesHash["category_name"] = categoryName; + this.classifiedCategoriesHash["category_id"] = ID; + this.classifiedCategories.Add(this.classifiedCategoriesHash); + // this.classifiedCategoriesHash.Clear(); + } // SetClassifiedCategory + + #region Properties + public string Login + { + get + { + return this.login; + } + set + { + this.login = value; + } + } // Login + + public string DST + { + get + { + return this.dst; + } + set + { + this.dst = value; + } + } // DST + + public string StipendSinceLogin + { + get + { + return this.stipendSinceLogin; + } + set + { + this.stipendSinceLogin = value; + } + } // StipendSinceLogin + + public string Gendered + { + get + { + return this.gendered; + } + set + { + this.gendered = value; + } + } // Gendered + + public string EverLoggedIn + { + get + { + return this.everLoggedIn; + } + set + { + this.everLoggedIn = value; + } + } // EverLoggedIn + + public int SimPort + { + get + { + return this.simPort; + } + set + { + this.simPort = value; + } + } // SimPort + + public string SimAddress + { + get + { + return this.simAddress; + } + set + { + this.simAddress = value; + } + } // SimAddress + + public LLUUID AgentID + { + get + { + return this.agentID; + } + set + { + this.agentID = value; + } + } // AgentID + + public LLUUID SessionID + { + get + { + return this.sessionID; + } + set + { + this.sessionID = value; + } + } // SessionID + + public LLUUID SecureSessionID + { + get + { + return this.secureSessionID; + } + set + { + this.secureSessionID = value; + } + } // SecureSessionID + + public Int32 CircuitCode + { + get + { + return this.circuitCode; + } + set + { + this.circuitCode = value; + } + } // CircuitCode + + public uint RegionX + { + get + { + return this.regionX; + } + set + { + this.regionX = value; + } + } // RegionX + + public uint RegionY + { + get + { + return this.regionY; + } + set + { + this.regionY = value; + } + } // RegionY + + public string SunTexture + { + get + { + return this.sunTexture; + } + set + { + this.sunTexture = value; + } + } // SunTexture + + public string CloudTexture + { + get + { + return this.cloudTexture; + } + set + { + this.cloudTexture = value; + } + } // CloudTexture + + public string MoonTexture + { + get + { + return this.moonTexture; + } + set + { + this.moonTexture = value; + } + } // MoonTexture + + public string Firstname + { + get + { + return this.firstname; + } + set + { + this.firstname = value; + } + } // Firstname + + public string Lastname + { + get + { + return this.lastname; + } + set + { + this.lastname = value; + } + } // Lastname + + public string AgentAccess + { + get + { + return this.agentAccess; + } + set + { + this.agentAccess = value; + } + } + + public string StartLocation + { + get + { + return this.startLocation; + } + set + { + this.startLocation = value; + } + } // StartLocation + + public string LookAt + { + get + { + return this.lookAt; + } + set + { + this.lookAt = value; + } + } + + public string SeedCapability + { + get + { + return this.seedCapability; + } + set + { + this.seedCapability = value; + } + } // SeedCapability + + public string ErrorReason + { + get + { + return this.errorReason; + } + set + { + this.errorReason = value; + } + } // ErrorReason + + public string ErrorMessage + { + get + { + return this.errorMessage; + } + set + { + this.errorMessage = value; + } + } // ErrorMessage + + public ArrayList InventoryRoot + { + get + { + return this.inventoryRoot; + } + set + { + this.inventoryRoot = value; + } + } + + public ArrayList InventorySkeleton + { + get + { + return this.agentInventory; + } + set + { + this.agentInventory = value; + } + } + + public string Home + { + get + { + return this.home; + } + set + { + this.home = value; + } + } + + public string Message + { + get + { + return this.welcomeMessage; + } + set + { + this.welcomeMessage = value; + } + } + #endregion + + + public class UserInfo + { + public string firstname; + public string lastname; + public ulong homeregionhandle; + public LLVector3 homepos; + public LLVector3 homelookat; + } + } +} + diff --git a/OpenSim/Framework/UserManager/OpenSim.Framework.UserManagement.csproj b/OpenSim/Framework/UserManager/OpenSim.Framework.UserManagement.csproj new file mode 100644 index 0000000000..8911255b25 --- /dev/null +++ b/OpenSim/Framework/UserManager/OpenSim.Framework.UserManagement.csproj @@ -0,0 +1,131 @@ + + + Local + 8.0.50727 + 2.0 + {586E2916-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Framework.UserManagement + JScript + Grid + IE50 + false + Library + + OpenSim.Framework.UserManagement + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\bin\libsecondlife.dll + False + + + OpenSim.Framework.GenericConfig.Xml.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Xml.dll + False + + + ..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Data + {36B72A9B-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Framework/UserManager/OpenSim.Framework.UserManagement.csproj.user b/OpenSim/Framework/UserManager/OpenSim.Framework.UserManagement.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Framework/UserManager/OpenSim.Framework.UserManagement.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Framework/UserManager/UserManagerBase.cs b/OpenSim/Framework/UserManager/UserManagerBase.cs new file mode 100644 index 0000000000..df6fbb281c --- /dev/null +++ b/OpenSim/Framework/UserManager/UserManagerBase.cs @@ -0,0 +1,630 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Security.Cryptography; +using libsecondlife; +using Nwc.XmlRpc; +using OpenSim.Framework.Console; +using OpenSim.Framework.Data; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Inventory; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Framework.UserManagement +{ + public abstract class UserManagerBase + { + public UserConfig _config; + Dictionary _plugins = new Dictionary(); + + /// + /// Adds a new user server plugin - user servers will be requested in the order they were loaded. + /// + /// The filename to the user server plugin DLL + public void AddPlugin(string FileName) + { + MainLog.Instance.Verbose( "Userstorage: Attempting to load " + FileName); + Assembly pluginAssembly = Assembly.LoadFrom(FileName); + + MainLog.Instance.Verbose( "Userstorage: Found " + pluginAssembly.GetTypes().Length + " interfaces."); + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IUserData", true); + + if (typeInterface != null) + { + IUserData plug = (IUserData)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + plug.Initialise(); + this._plugins.Add(plug.getName(), plug); + MainLog.Instance.Verbose( "Userstorage: Added IUserData Interface"); + } + + typeInterface = null; + } + } + + pluginAssembly = null; + } + + #region Get UserProfile + /// + /// Loads a user profile from a database by UUID + /// + /// The target UUID + /// A user profile + public UserProfileData getUserProfile(LLUUID uuid) + { + foreach (KeyValuePair plugin in _plugins) + { + try + { + UserProfileData profile = plugin.Value.getUserByUUID(uuid); + profile.currentAgent = getUserAgent(profile.UUID); + return profile; + } + catch (Exception e) + { + MainLog.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")"); + } + } + + return null; + } + + + /// + /// Loads a user profile by name + /// + /// The target name + /// A user profile + public UserProfileData getUserProfile(string name) + { + foreach (KeyValuePair plugin in _plugins) + { + try + { + UserProfileData profile = plugin.Value.getUserByName(name); + profile.currentAgent = getUserAgent(profile.UUID); + return profile; + } + catch (Exception e) + { + MainLog.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")"); + } + } + + return null; + } + + /// + /// Loads a user profile by name + /// + /// First name + /// Last name + /// A user profile + public UserProfileData getUserProfile(string fname, string lname) + { + foreach (KeyValuePair plugin in _plugins) + { + try + { + UserProfileData profile = plugin.Value.getUserByName(fname,lname); + + profile.currentAgent = getUserAgent(profile.UUID); + + return profile; + } + catch (Exception e) + { + MainLog.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")"); + } + } + + return null; + } + #endregion + + #region Get UserAgent + /// + /// Loads a user agent by uuid (not called directly) + /// + /// The agents UUID + /// Agent profiles + public UserAgentData getUserAgent(LLUUID uuid) + { + foreach (KeyValuePair plugin in _plugins) + { + try + { + return plugin.Value.getAgentByUUID(uuid); + } + catch (Exception e) + { + MainLog.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")"); + } + } + + return null; + } + + /// + /// Loads a user agent by name (not called directly) + /// + /// The agents name + /// A user agent + public UserAgentData getUserAgent(string name) + { + foreach (KeyValuePair plugin in _plugins) + { + try + { + return plugin.Value.getAgentByName(name); + } + catch (Exception e) + { + MainLog.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")"); + } + } + + return null; + } + + /// + /// Loads a user agent by name (not called directly) + /// + /// The agents firstname + /// The agents lastname + /// A user agent + public UserAgentData getUserAgent(string fname, string lname) + { + foreach (KeyValuePair plugin in _plugins) + { + try + { + return plugin.Value.getAgentByName(fname,lname); + } + catch (Exception e) + { + MainLog.Instance.Verbose( "Unable to find user via " + plugin.Key + "(" + e.ToString() + ")"); + } + } + + return null; + } + + #endregion + + #region CreateAgent + /// + /// Creates and initialises a new user agent - make sure to use CommitAgent when done to submit to the DB + /// + /// The users profile + /// The users loginrequest + public void CreateAgent(UserProfileData profile, XmlRpcRequest request) + { + Hashtable requestData = (Hashtable)request.Params[0]; + + UserAgentData agent = new UserAgentData(); + + // User connection + agent.agentOnline = true; + + // Generate sessions + RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider(); + byte[] randDataS = new byte[16]; + byte[] randDataSS = new byte[16]; + rand.GetBytes(randDataS); + rand.GetBytes(randDataSS); + + agent.secureSessionID = new LLUUID(randDataSS, 0); + agent.sessionID = new LLUUID(randDataS, 0); + + // Profile UUID + agent.UUID = profile.UUID; + + // Current position (from Home) + agent.currentHandle = profile.homeRegion; + agent.currentPos = profile.homeLocation; + + // If user specified additional start, use that + if (requestData.ContainsKey("start")) + { + string startLoc = ((string)requestData["start"]).Trim(); + if (!(startLoc == "last" || startLoc == "home")) + { + // Format: uri:Ahern&162&213&34 + try + { + string[] parts = startLoc.Remove(0, 4).Split('&'); + string region = parts[0]; + + //////////////////////////////////////////////////// + //SimProfile SimInfo = new SimProfile(); + //SimInfo = SimInfo.LoadFromGrid(theUser.currentAgent.currentHandle, _config.GridServerURL, _config.GridSendKey, _config.GridRecvKey); + } + catch (Exception) + { + + } + } + } + + // What time did the user login? + agent.loginTime = Util.UnixTimeSinceEpoch(); + agent.logoutTime = 0; + + // Current location + agent.regionID = new LLUUID(); // Fill in later + agent.currentRegion = new LLUUID(); // Fill in later + + profile.currentAgent = agent; + } + + /// + /// Saves a target agent to the database + /// + /// The users profile + /// Successful? + public bool CommitAgent(ref UserProfileData profile) + { + // Saves the agent to database + return true; + } + + #endregion + + /// + /// Checks a user against it's password hash + /// + /// The users profile + /// The supplied password + /// Authenticated? + public virtual bool AuthenticateUser(UserProfileData profile, string password) + { + MainLog.Instance.Verbose( + "Authenticating " + profile.username + " " + profile.surname); + + password = password.Remove(0, 3); //remove $1$ + + string s = Util.Md5Hash(password + ":" + profile.passwordSalt); + + return profile.passwordHash.Equals(s.ToString(), StringComparison.InvariantCultureIgnoreCase); + } + + #region Xml Response + + /// + /// + /// + /// + /// + /// + public virtual UserProfileData GetTheUser(string firstname, string lastname) + { + return getUserProfile(firstname, lastname); + } + + /// + /// + /// + /// + public virtual string GetMessage() + { + return _config.DefaultStartupMsg; + } + + /// + /// Customises the login response and fills in missing values. + /// + /// The existing response + /// The user profile + public abstract void CustomiseResponse( LoginResponse response, UserProfileData theUser); + + /// + /// Main user login function + /// + /// The XMLRPC request + /// The response to send + public XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request) + { + + System.Console.WriteLine("Attempting login now..."); + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + + bool GoodXML = (requestData.Contains("first") && requestData.Contains("last") && requestData.Contains("passwd")); + bool GoodLogin = false; + string firstname = ""; + string lastname = ""; + string passwd = ""; + + UserProfileData userProfile; + LoginResponse logResponse = new LoginResponse(); + + if (GoodXML) + { + firstname = (string)requestData["first"]; + lastname = (string)requestData["last"]; + passwd = (string)requestData["passwd"]; + + userProfile = GetTheUser(firstname, lastname); + if (userProfile == null) + return logResponse.CreateLoginFailedResponse(); + + GoodLogin = AuthenticateUser(userProfile, passwd); + } + else + { + return logResponse.CreateGridErrorResponse(); + } + + if (!GoodLogin) + { + return logResponse.CreateLoginFailedResponse(); + } + else + { + // If we already have a session... + if (userProfile.currentAgent != null && userProfile.currentAgent.agentOnline) + { + // Reject the login + return logResponse.CreateAlreadyLoggedInResponse(); + } + // Otherwise... + // Create a new agent session + CreateAgent( userProfile, request); + + try + { + + LLUUID AgentID = userProfile.UUID; + + // Inventory Library Section + ArrayList AgentInventoryArray = new ArrayList(); + Hashtable TempHash; + + AgentInventory Library = new AgentInventory(); + Library.CreateRootFolder(AgentID, true); + + foreach (InventoryFolder InvFolder in Library.InventoryFolders.Values) + { + TempHash = new Hashtable(); + TempHash["name"] = InvFolder.FolderName; + TempHash["parent_id"] = InvFolder.ParentID.ToStringHyphenated(); + TempHash["version"] = (Int32)InvFolder.Version; + TempHash["type_default"] = (Int32)InvFolder.DefaultType; + TempHash["folder_id"] = InvFolder.FolderID.ToStringHyphenated(); + AgentInventoryArray.Add(TempHash); + } + + Hashtable InventoryRootHash = new Hashtable(); + InventoryRootHash["folder_id"] = Library.InventoryRoot.FolderID.ToStringHyphenated(); + ArrayList InventoryRoot = new ArrayList(); + InventoryRoot.Add(InventoryRootHash); + + // Circuit Code + uint circode = (uint)(Util.RandomClass.Next()); + + logResponse.Lastname = userProfile.surname; + logResponse.Firstname = userProfile.username; + logResponse.AgentID = AgentID.ToStringHyphenated(); + logResponse.SessionID = userProfile.currentAgent.sessionID.ToStringHyphenated(); + logResponse.SecureSessionID = userProfile.currentAgent.secureSessionID.ToStringHyphenated(); + logResponse.InventoryRoot = InventoryRoot; + logResponse.InventorySkeleton = AgentInventoryArray; + logResponse.CircuitCode = (Int32)circode; + //logResponse.RegionX = 0; //overwritten + //logResponse.RegionY = 0; //overwritten + logResponse.Home = "!!null temporary value {home}!!"; // Overwritten + //logResponse.LookAt = "\n[r" + TheUser.homeLookAt.X.ToString() + ",r" + TheUser.homeLookAt.Y.ToString() + ",r" + TheUser.homeLookAt.Z.ToString() + "]\n"; + //logResponse.SimAddress = "127.0.0.1"; //overwritten + //logResponse.SimPort = 0; //overwritten + logResponse.Message = this.GetMessage(); + + try + { + this.CustomiseResponse( logResponse, userProfile); + } + catch (Exception e) + { + System.Console.WriteLine(e.ToString()); + return logResponse.CreateDeadRegionResponse(); + //return logResponse.ToXmlRpcResponse(); + } + CommitAgent(ref userProfile); + return logResponse.ToXmlRpcResponse(); + + } + + catch (Exception E) + { + System.Console.WriteLine(E.ToString()); + } + //} + } + return response; + + } + + #endregion + + /// + /// Deletes an active agent session + /// + /// The request + /// The path (eg /bork/narf/test) + /// Parameters sent + /// Success "OK" else error + public string RestDeleteUserSessionMethod(string request, string path, string param) + { + // TODO! Important! + + return "OK"; + } + + /// + /// + /// + /// + public void AddUserProfile(string firstName, string lastName, string pass, uint regX, uint regY) + { + UserProfileData user = new UserProfileData(); + user.homeLocation = new LLVector3(128, 128, 100); + user.UUID = LLUUID.Random(); + user.username = firstName; + user.surname = lastName; + user.passwordHash = pass; + user.passwordSalt = ""; + user.created = Util.UnixTimeSinceEpoch(); + user.homeLookAt = new LLVector3(100, 100, 100); + user.homeRegion = Util.UIntsToLong((regX * 256), (regY * 256)); + + foreach (KeyValuePair plugin in _plugins) + { + try + { + plugin.Value.addNewUserProfile(user); + + } + catch (Exception e) + { + MainLog.Instance.Verbose("Unable to add user via " + plugin.Key + "(" + e.ToString() + ")"); + } + } + } + + /// + /// Returns an error message that the user could not be found in the database + /// + /// XML string consisting of a error element containing individual error(s) + public XmlRpcResponse CreateUnknownUserErrorResponse() + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + responseData["error_type"] = "unknown_user"; + responseData["error_desc"] = "The user requested is not in the database"; + + response.Value = responseData; + return response; + } + + /// + /// Converts a user profile to an XML element which can be returned + /// + /// The user profile + /// A string containing an XML Document of the user profile + public XmlRpcResponse ProfileToXmlRPCResponse(UserProfileData profile) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + + // Account information + responseData["firstname"] = profile.username; + responseData["lastname"] = profile.surname; + responseData["uuid"] = profile.UUID.ToStringHyphenated(); + // Server Information + responseData["server_inventory"] = profile.userInventoryURI; + responseData["server_asset"] = profile.userAssetURI; + // Profile Information + responseData["profile_about"] = profile.profileAboutText; + responseData["profile_firstlife_about"] = profile.profileFirstText; + responseData["profile_firstlife_image"] = profile.profileFirstImage.ToStringHyphenated(); + responseData["profile_can_do"] = profile.profileCanDoMask.ToString(); + responseData["profile_want_do"] = profile.profileWantDoMask.ToString(); + responseData["profile_image"] = profile.profileImage.ToStringHyphenated(); + responseData["profile_created"] = profile.created.ToString(); + responseData["profile_lastlogin"] = profile.lastLogin.ToString(); + // Home region information + responseData["home_coordinates_x"] = profile.homeLocation.X.ToString(); + responseData["home_coordinates_y"] = profile.homeLocation.Y.ToString(); + responseData["home_coordinates_z"] = profile.homeLocation.Z.ToString(); + + responseData["home_region"] = profile.homeRegion.ToString(); + + responseData["home_look_x"] = profile.homeLookAt.X.ToString(); + responseData["home_look_y"] = profile.homeLookAt.Y.ToString(); + responseData["home_look_z"] = profile.homeLookAt.Z.ToString(); + response.Value = responseData; + return response; + } + + #region XMLRPC User Methods + //should most likely move out of here and into the grid's userserver sub class + public XmlRpcResponse XmlRPCGetUserMethodName(XmlRpcRequest request) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + UserProfileData userProfile; + + if (requestData.Contains("avatar_name")) + { + userProfile = getUserProfile((string)requestData["avatar_name"]); + if (userProfile == null) + { + return CreateUnknownUserErrorResponse(); + } + } + else + { + return CreateUnknownUserErrorResponse(); + } + + + return ProfileToXmlRPCResponse(userProfile); + } + + public XmlRpcResponse XmlRPCGetUserMethodUUID(XmlRpcRequest request) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + UserProfileData userProfile; + if (requestData.Contains("avatar_uuid")) + { + userProfile = getUserProfile((LLUUID)requestData["avatar_uuid"]); + if (userProfile == null) + { + return CreateUnknownUserErrorResponse(); + } + } + else + { + return CreateUnknownUserErrorResponse(); + } + + + return ProfileToXmlRPCResponse(userProfile); + } + #endregion + + } +} diff --git a/OpenSim/Framework/UserManager/obj/Debug/OpenSim.Framework.UserManagement.dll b/OpenSim/Framework/UserManager/obj/Debug/OpenSim.Framework.UserManagement.dll new file mode 100644 index 0000000000000000000000000000000000000000..b33597dea647fdb8b916a144a1b2f414a7252f9e GIT binary patch literal 36864 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 EU)-S+?*IS* literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/UserManager/obj/Debug/OpenSim.Framework.UserManagement.pdb b/OpenSim/Framework/UserManager/obj/Debug/OpenSim.Framework.UserManagement.pdb new file mode 100644 index 0000000000000000000000000000000000000000..f212f179165a2b281155c18d9ae17650d449e0ae GIT binary patch literal 52736 zcmeI551dw2o&WFPID&$Kf}&E5hzbhBfXF{l7>2((2=Yf!$6%OwfRSNloEa2atcSv) z!VNcTweYu;ShTriiJKM{8mSfj)(VSuaigNLRt;M;D${*`&iS7E+&esv5-`2WIPjUz zbMHCdbH3+${@io#J?GqM^|dWctxXHtN-GCfo_~Jnv{{o%N0gP9cRT*{39}+xC-*;E z#Lp*+bRvpsJsth~Ca^&E?$?gGzheuGoSUn}d;gB@@b{Ya6TUs9Xr!t@cLQ`{^xA91 z@G)8b9CdGM3+!KT#n{J=`+kpgv!boj@9y-;Z4)oM^H;z4UXOKS{qYHRz3-YH3%}pv z;q#(sf9I(W&;NAexc{hoPu0Kg9lv8$%V+LXwUN93j~8^h>AUZK-+$cnxzqpk!evtz zaPAmT0v9b<3S~u049P-U^18jrh-esWuOX71DAv8;0iDU%mf;L%?5M8mEbC% z?)qwQ4d?<6*BzIGvVQe!`17k{9ncb`TBod3zPl7j-^d| z{>x~1G?k9Dz>#YI?fZZAvj=+(IFYcbZ^we8*MPt5HQ-2<|Iz-R%KJC$253Nq3+#`M z{(ZAs;ML!}`Wrpg`>irsIl6k*vPJa`^=+Bz>CKtOS@lb+C$-cp&D_+~vZQ)WYo=vd zO=HcXOiS|j_?p&CS#2wi1xHu62I(fGTajKEOD{uusYxe(FEHtYPr9mUQGMggOlxyf zqfhwY(`}GwOF~q49?E?fy|3i=mqBp4BE7kt?jg2eg6=@~Herm{m*aam*8PScONIM6 z-M1yL*}8Viis61l_d&Y;pYhZ3qMnV7JtQyxVC4+IgOjyG*m+;Nt4d*23JNQ~WLOT5 zx+83X6Npdc-0#VsUNYwEj~8|NGvinIzf}46jr#SNGiya_TV`q5tW52)mio38WtA-} zn%kNdwbV2(UV$zrDNIBCg4RrJQ)692{X#0xi8^=rO|@lnmp067uH{()$JW1<#r<1Z zB^^pr1L054??0iYt%m0cd1a?Iwq;rt*3@R`2MdR}G1J)A)FL$tg_+Z)-nZUGgPx^5 z%(i+Yf-8EXJlU5`gl?2gDUl0prhrlu~FIIZ2MRL zGBi5R^&j1Jfyce*$^E78P#5B^-%&+f-HZl?c#V10BEcGPP~>^s&DGwSGKtzHD-)G1F3Co06NES!i6jORJo9Z4rZZva?q-a}AYTDKgtZ9pPF`PS+exrR3U>h#L@o zlATMSC%{yWKWMV2BdaRfK21(BO`#-(;Zbq%x5obZvHP$7!PG5hcj@%i&uyNsaMO4q zuWMg1k*MzL{eoDoD^NVctvzfpk4K%a|AR^;s_)8sv?$Z2o1z&lO$+N8I7siFD7XeW z$%JsSmGnl|Y~}j#A<65wl4|FFVe&ez>wG)^@^Bpw*ZFq-?mDk`7}Bc>1y+;D$2per z(qHz}VNNcTzn9sAOcgR`6XwK(jATuA)Z{hl^sl( z6-~cM>r24W~^neAIv^mwRzvKsGaOvT-y)NNvMYH{axQNg!7VD>N$DF ztC<^?Wm?nY>P^3>vT5nk`nFVg*O7-EKr$g*C@*Y~Ebn+ct$z66 z#*!zwF+a9(W69Ar?%!^DW`dG1-BC$%(6eG$+hU5pzLwgl8vy)OR$Y<114u4}m9DZq zqIq>yzlL|hKZ;Zyhnk0QFW=l~jzXAV zXKbHW_ruk(r^RaI)TFwX{4Am4v`lL&ZOylR^xF*-K7|RPu%d{KG|4;h!sxQ1FbmcJ{i_gZm zr<1|q1P=WnGATLN`AnU_*u1m{Z9b1*qdmp1Xlbcg;dG;2rNYh5ENz}r)4G_`E??B? zlz&zIf|eRy11Jr(x1`=vL-aG7n%XQ9Ju^|4R4|;Sqb8pWQ(NCs+f?V<&YqK)D@p!8 zOPHmWf7wm*FOxE)KdGsq&h=?(->S=!oq_CWgzbw_WIOd+s>DfIm9u1moNT@ZIq5z# zAxCs6xrqt6gX_2bvl{ep{q`j5x0kDN;8Y&Lk#2R)Av_X2!Ah_NtkkzQQcBMl$1%VL>g*<6*k)A5nI^3If@jI|CgPBMkojB4 zcXylLv@B#A=2~3xZ8|__3ZGp@MJjLKCtU6?T`u3d$@4BcK*rX>nnV<>wxTMYK9!th@(JExK zIdiyp;#609V)O3AA^9NlX0=(FwXaQPGmZ0t>xIoW2b-1EG6g{E4G!Y{MA4UuDciVQ ze#`GRXLy|}ir>3w{lj8Ae_<45^>a9^^CRGX@F@5Scr>iOR(uWo!f#&9&a-3nu@`ZE zAqq8*!S1*hAx?{K2Iqqca2SK64?Gutl@0dKz74(>mbTTf<~>~p zV@Iu%$zsQ7KCDJn1K$oWfIkW=-hVc}1Fq%#ov_mXl%4;I@mFEWH~V!v-U?IBX3L(@ zIJYuI_8VjNlig;3$)F#$5p=HAG2+h2UKhKSFX33DM2+uqHuLXR^4qKl9b~g+xRY_x zW;!pM-2lsG)In#nHdr=W2FqqQ!sFrPuxz#hmd)M?%Vz%o=d;;L&dX*>C!fvU#rdSo z-p#SEe;sQx|Bj=`z3)IhxArO2vo+`-n|%P5&BRHY=~ygWof4oc5=4*7z|uJQ~gqXldY(8*^k3Y=WaW%`X&D@Fk!M=?f4Oxuy0_q zs}8%K^~50lT|-g)+`JcQcb1`W8__{O?}24Av0A!x?rz7u;ZJk^GfOJ=)Sc+_@XfH|p>8f=Lr*iiR0I=SC<@e z8ZTz$QqWIZ=vfg}`v}GHvUCuV*q-}I8+i*>Dws{(sZGHgD zCOcu-1{U*9$p z54qkvN5=g#_M-S1{kf#MTL!`XnzZ%vf8dkh=V7&-y>Kb~zwkNmKDZ2i2_6Bz43C9> z2Qv{{gOr{{%O|QBjor2NC>!xEQAIae4m)d@RT7;S%_M_&6B5Ie+Z0w(rIi zC%}|L)D_+jcY|MrPl8{AWlPeCPUg51Onb>51D^turt>Ea$D|RR%6auGz2PqK8L-+| zADG|K+u?KJQuqS6FFYDP3-)C-o@?v~a1N*fgFu-bp9_x#BY}Po2N!~&XsYpu#x_$y zg**1wWQ}Pq14HRYPjTma5w{=L_+y<^Sjl%|G}w*VpWPS(bz{YAH^x5F>$ij%1N?LL zqWC%eF`O$0a_5r=vZCh>*<<0dI8Ud=am?qufBsz*&)+WL+-x8>%HqH#tJEeg=2-P& zEPOd!0jnO2hrPX~qoeF2TP=yxk*@w(brHGpE~)D@yWt6*JY=f-iA#c?by4$pXt;^)NGgstYh+#-vk9+n>0!zaN@;C}E@cpBUYPluae zwTEW-I`{^-4sL^&z&FA-z^b>);F~zU5nc{6Hi%ZhABW!w-wUsVAB1m)>7$+8WAM8; z-T`BzEd5Bd3f>JX-k-wn<@jgtYWPL?{V;9W`KukR;h44?eE?RwSPQFN{3Coetat{% zALjTx_%?VX{85;)jqZRe;g7>r@LljMcmsS5{7Ed6@zXK13x5H!LC*jGk!cBph50t$E{w`b%V~gxN;2*&A z;2**b@J@IsEV(A*X81oje*^qq@Qrr1=q*ph^OIc~yq9-tefJ9 z`{-X$E>!dAIafYhmmTY#IoC(8C4hf!TogZdemgQw5Z-5TyaXS|@yqa;@b6%aXZFJv zz`uuOtv|pO@E_qS_!amn_)oCjJCqIUeo;E8GdjUEvcr-wjqer`Y-PjR(SACFh$K{$uEnb7x(*e(|5M#o@2w3z&uIxoHeVXM>x+@R5{_FXPuK#b1uVXWa z+&|MTik}akj{F2AiaU#V^s^tV^v{Nset%eXX8=3|J`dKoZXm3dHwac92E!Wjmc#4d zA@FD5q43vW`ds%+h(0&_9LE>J$B^J~_;h$AJRBYc&xA+ATr;CF@GbBqFxQM|EKHvo zje~y#SHM4k$HPB|D`8*O!5%7e*<>=f6sRB5?<>F}Fbm89bAkLX2eT8jil)M{>!q-I%W1HBM%Cp(@Z}t996cSL2+x2uUXuSz_zI3^ z!82ivKW4)kKgfR`d?m;8;j7?!_*%FXu7-2=P~I=(Z0M_JQg?m-?E6>s<;nh8b{iGf zA?4LS>&>6nd8DPh&WDxP8d!O)g_C)$<5+pkz{=}FIGNW)94oJjVda(Ua4N429M9+c zQdoJt0ajjH;3Jh+jfwqp-6FSF4Tp3ue$N^GM*r*yuc7y$(w3zk=H2*s@siwYRSxct>K` zaeTP%N>6cJe+fOZU!yV`-Q>D@a(}5mCG+TVmA<{Zlg634gu;3su?byEk(X=;-%@?cAw^S;I}A^O}`m>cGO9Wesgt)-*6RkPxziJhuR?a|vNpK9b?um}~>?J-gbt z{0W}de+cK#u{M;G=i1Q7ve24_>C4&{)`xi^2mgN0zY7j+Db&r4QUa&;8(eSlJUi4) zw;+o-ZU@o+gUpevn<}TE^BcAQCxg!Z-F^F}CEl?amuA}r0wr*1c$0haV z&avbzC#S9r6VQ65o7&p$`mhas#}S9*gG@*3++PpIa7mrH+bcOQt@GrT`nvQa6lB!@ zEJxpcrgM<#D4j!Jxk&>z+(lMT^qc#Sl8HfQKY66Nww-;o&ZrGp$%U}eRoxKXY_hLR z&6&|9zny<-&XUx~=Refx<>yN0^S=Op*-&f8w6^AtBs9tL(AWCloLp{hMshArkZ)GL zh;KX>4fXw}ATLhJXE;`$eenIZpT89Pz+iu^uaWES$^GU2t0Ze_M_j8WYL;RpefOfK z7Huc+=gc<<>4o`etMjB+N_y);ddyFo-85$^8z?NSU!?KG!Ov|7X@&lMzoixKf0em2 zNozwQtx6`2w$?AK&(v84xqux?nqjW=`Yz6dsWD|=(tIYQ$vV$@u7~#ZXjEt^N zAxvm(bV#2K1 z@>AXKO!zjS@F7e`+oHQ}s&GkLoQ;mJ1|4M!)A3Mj5$fVrODAcIb4cen21#n$S`##H zR$D!L9o5aMZ>-HE>PSyy*8<6g@Ev8Bps&{N$R+J^F8ZDv^p#!m=zAzO3Vp*aOEYPs z{-oI_q$wLQj$}r0rViayXS6nH6Oc>@*HN|!dQQ=UDqPYw1JJX7&{MWa=y@nM3H|dv zODk!U^GIt*NJ}=MgKh~!C-jnCs*u|XBp1SVlwE?ZT3;iVw9EPEdU4QIc4?>Uq1Yyr zgVxB%C2cd1^d^P$T$`$2I-{wjP2t@26&-g1$%JshE?fhTXnz~@TyA&_-C(eF7RnGi16iG9 zJrBhu;hI;+cwH`OlVPOw@sO6c37dswY`sTre)5CpS&qD9L->xeP0)9z>6^3-PuojA z9rX3KIY8e-u~F#bSL-1dE@`9Tr1^!ArfgKnVxeXAZIxOugj3zwg|1rnBe@VZ*oUTe zMB7u)b)V^)w9g21{c6xv_GzcH3$Po`+(S&{o4*qNGhOA+2LhOWYq-HZ(1( z3s&)UWf;0>4UyzR*p9MG(6tJk_}8y1ITPt?S{~X1}GEw9Pou>mAZleVNwO z6jvB@Q#+c0|281G5VoUjvsf?raY@@$pliRNt8CLw*F&*Q=*zSwNG@rc@uW8>q$k@< z$}Jw2T^i7F7m!Q{*HLx}dag7*lXj^@&rv~7*(IUp;n<`f531#oHem=?GCrgwn^ff% zOv@%&^xF$06T)@0P1c#7Nt;YW&&z|JvPnYEL$OI{vtxJ=E|;{)B+|Mnq$QiUv2{f) zJFm7Xtn6|-I(9}@av^L-*(KCH6@wE6G~XOo@iS5@leLfDS7NzipK>B%K+G7Vin6?Ap=B(3Y=*k(O1 z7UYuk$R%wv9bLa1bd_z|>3TS} zdC<~J+GYmnZ4K$gwh245c-wSGZZ(ix2;0%N>CcN0xuk8bK-cX-*Vr~WT@S}LJ1o7V zZDx|*(;+?CCbf}=x6MH0HUPHRvSm$J>QCEAT6T$`pKyA?<_gzqT(1br9t;z%xOpE>CJa?m$rpPasj zVx!RacjYCLT+&8YlICk6P1$HlliN4PjeXH^Cs6nhCfMaj-$w==+f2u#U9LjM6BvUR zNqO1DbUYMWgfVs>UQo#;Z84X0w0D3@N4Cf{TX$_*j&9Ea$%JqnWsjie8q+grkE_wM zH0UXNB=kHKoBWpiXb!udPgmsT*2y+{B=(Aa;Hn}&Zuk^mA(mGq>#mFbrsIo8}1XoYu5y{_qf>HEudL)S&S4*ZH$u zJhI1g*u&4OD{^z}IOV?MxZ70@zlL2u7mfit1rC?d#zo@Dg|o+yFB!kCwvN zM*HfydBaUGvThx?ZX{YbemBf-w+^!nmK|<{?}l%JzW^_XzXGp-zX`t+)|~TyfcL;F zVa+YP8P?p~EdN=n5Uqllw;#O+W?p^tURZN>SHl;>x4_H;kKP9}Upsm~thu~vVCFDK zAA;WnQ%2bj!neX7gFg&wuJ1bd-{9NeufhKWe+T|3tTO5mm4Y&GHW&cTG42lwgTVRV zQcwjh1I+S2S>Rnjxp|t>77ohcqs<-L2k$&D_QQTi0LpYRxQQ$$&%Wbnb9)or2 z3Ai)-ZTMvPJMek%cDMq566X35{ePG?9sLKq3jQwq5%_yBWn{}^5f?}nGdKZPHK_rTA75xHc{Z8~t z_&oSonDrOYuVB_FxV6;phX04-+u-NnyWtmL&D;MC{1}XG*`4rj;a|i53;z+`2X~_) zy##B`;LEVq1pW@LfcL|*;NQa;_z$qw@cj|~0Q?I43HVR2)&aZEOf%0-PSVm3J*fF%f;gLURv#nC5@qdeAQHs}3(x!gLkV>vek$Z37L^eBbZhR%f5 zhWf(lpZdYR%(SLS*W*j$xaIHXyyfo$S?BBGrmeU>khOJLZ!fI}JuzNm?&qx)5wCYi zJC#`+gJHGx@;HuusW|+6v;2CnPR!{s0#;u` z^5W-r<=11p#Zd`Mj|p)c8vEqp@N=~C>oLjVm<&sgDRCTHyPu20&!x(*$K@6WeU{T> zMjVIMHs<2+^P%$V!J0c~Q`TrZJ!Z#oXq{v(4nKD(zaH0E9M{6KM|B*>d8s)3{GZ(9LM4JkD`C2cVPV7+mA!?)zj-OjwP`4 zXo%xT+tkm`$*)I?#nB2&57u;Ll?RQ%l6moSZ1UUVMvLPnSbA_BvN$xR$=SotiOH|W zyDW}(!_oueSR844_<1e)^>~lP@m^SZtd8SI+r!U8$*;!;EshVt(qnBLN4k#rxg`1Z z_(zN5!?5&N7srvdsh{(aUyqMj9RCbUk2~TxbU%}`sh_uzUyqMl9G`%t$ND%9T}N_p z__-DN_4t&H6X459HV5D;CFBVd=3Yjw7vyp97FzkFQxAUx%f~);Nx| z9{!zuemx$uI39@t`JK{Lf zW$WK_=hx#07RL`^>9I48Bi*0+_tE+F_-~8j$FTI+9mkQ*i+`t_Uyq+!96y7l$DTNj zbYA@X-~4*~+T!>hSb97c$C2(o{5#zIdc0t9{05dDd*e9LW$WL$=GWt8i{p2&^w=NA zk*;I@y=i_u{$O$Z5tbgW#Brqa;@@%R*P|2boi)}w29_Shu=*a|^C$Zt|DH0x9xRk} zacIv4>CrikBV8{3ePVt+PP91Q0!xqXaUAJ7=HChC*W)CML;D~|57s$bUIwP}vg$N{ z&DOI4x#ZYVdm_jl+7m%~^oir>mx{x`hs&?W+boW^!_uQPjw9U%`S)h|?QxF9aV{)9 z`p0pk^Wxuq<=2DzNSBxMVdacJ)b=`pTA9R8h7em%xp9F?&2m=MR2u4De)OMX2r zwKy(=rAJkPIDTSvEZ?|L`!pyo+NVK!%!uPim#u%tkzWt()u1@ESA+DJTObbqo+7_J zuCX|@&x7=+j^jwz5C2Xfza9%Lj#^lH)Wvb6?}7Y#f&6+bv^cb9gY;M&$C17#^w0A1 z>(OX&G{Mq?eFv37`S22KRv{z+TX~g!@)71!#R?7U)}HTfk1R7xX-iIKTu@4YW3LE!YUQ zfF0mD&>f}vgDOx5r2HLVGuRHE1I1Lteqaok3z~tx3AGVy1G~U0peM#F2U9>DSPAX` z_krzT59oXXc?T0fHCPF52b;lm@GQ^+&^|zGj%I+xU^Q3|wtyXAAL!bRJc0?J4y*+F zHqBj( zSP9mH&0q(34s`8-t-u6O4OW8N!Dg@>>;;{9{yY#&0M(!ktOXmvRJbW5r6SSi~l<6 zfR4|mPKiHi$9GbHbbJeCFYZFQiJzxz#5bG%AKYe{;x>@dL)sn4O+BJ6&h>^g2uDNlUkjo&TbxH_g&{z~b*^dfsZ`ZnJQYm|f1a z;~{2;8%)0;ruW5me2>}XRy&?!`hCE-i>3FH+35y5pE3PkG<|vA?d))u*=d>SHO=%0 z-;A1Q=byH8ziH`Cv~<2`<#MydKgjHMvz>py&fjBt+-mXst+)SQS^lSm`e*s>X8c*J zACH**&b079H@kex?EFm&H^}P!16FU|YUOu}#lOtLt+4v>lEus3SFRk7wQ_mV~oyO+4e-!+fs5I(2 z&fB0g8};s98g=5(Ir&RMwvn|;J9YONa_6%AWiE9&L5ibs?m#iF^1s60qVC<(iQ-Xe zK&luK9Wqdex?*zo^Y#98j_r`}Y3TJrq9Q6a`U<%NCo%x^vEC;K>IC0 zQ}irD&k>y6xPR8YtL__h&!+n&-K)5L#~7o#y~ozTw}TDfUhp8;2A%@Dz_VZ<(2aUm z&>Qpv+Mi7OnQ9MH?fW$!XrI#MU^Q3=)`Lx8GuR5YgPmXx*bCgd%3|^kO2I&&_mdOA z44^%F7lSsS{c7$28t3cV-x}-h0K36+U_U6PU+50{fN`J-%msCz8LR|r!0liIxEDMH zc7bPs_G*dfi@Ji|pdZkE!Wf`?h1p;}(D#m)gVkUiSPwRV&0s6o4s;)}2k2hn70{V$ zlI|%=f$l3t0^M880J^_e40Ml?1-j3;1L$7kKA`)JCxGrbb_3ma><7hEU)_K70lEhn z29CNnj|KQ%3RgDD85BjV+@8^}Y*Bq9^XvvB&X*4_mm8veeth_zw5_7>QQYvsA>s&f z-rwYg=H#}L(Cf*0f0Mf)C#UxCdUD?1kjV`eAvh$<;MIQz?oj=ROom*ihHJpUEu9 z$+S_SoJ?XaY>@GOCR3ZMpS|g6ilPHQq#ESBzsY6TU)b9Aww{t>ld;$NsAGu3hqX8s z=F--86kWfk&%Wj9$GpFn8&a-)rhLDm@Bh&b-3O`*ekd?uFCX6Gp&vcR;?ei?ilV|F z-3$8ra3)WG8szm|I&Zrfm6X&0AFm7YKAg$ZuLgPl%r(!)@9aZvLEeWmdHUCrO#dlo zD1E;%Xb9`iSy=kj5LVZiPVK__a~78VG+bYZl(4f7*mN_b;r&gHJ~iZLpOY)Rab=MA z;Y^XxEcf}Y%zR>21 zAr2qb;-LKn9kwOn$hXm9koVzCp0*g|wVzXEhLEeWm`MO-W4dgoADLQZiz#!-S zO^&u4?0zp}O;_ISH?B*xAs@zMX~W?fud!(-ja?F((1rB8pO+a*`wi)>2{L&$lMAvw zjLFhw!&piCzjbn(fB6l+LU@1P!qY}W_zhe$I=KZC>G1x%g{Mu1@Y++&$L}{W3-SB& z7M?a3!r$w{YXL$!ygzT@X@?>2+MCSBf8b_dAuS)qWNDW{cAJw`T7_kO7?VwmceL-9 zPdB&GR!GnLnM`85v)joiy#r;upUEV~JK9Ifr<2~eDx~H8O^)^#`kehvPHE+r^Zq86 zxaKWpOlJ0sH-rjlc|Vh(orOBvoolPF6SEGG@qQ+gXj|IzDNZMBvXp2a-rwYCTOnWl zxF*MG<&pFLCYNYe+E2-+=SHV)hSb`wDadG#BFk62 zDNsnq`l0+WpUKd!LfzGVKOvp=8|(yGAI4;9V?lQD$+`3j$@(xR zOM46U*FHKv-SoyaAx-aZa*1o8zMbuDnP1NPn_QxuX@44@UT#B}ke2r|nM6C=z&OaK zb)by*Ga1@hCJl1%67L|ycLCPNzwGWuq9GM%K1_cIyVSFoSFa=Z8-(y~##M z&-;71VYIbimsgye@|R!E`&ZCJ=j}il?`JZ!w@}vF zpTeh;+Yln8>GC{Y{QG7UZhgXTaMqznu3sxluWrXnz8;qu&r9QTM%{$t2oY z^V>sORR_p;Ka-)Ig+5Me{w-hWMfQpGd>E6Ztp(ZDr6Ijp1!a90lTEa@eNI*jJ<|)= zgFU^!$tBv`hBHH&`Q^O7$tBvG)~Ne@I=T2xHKgbLz1)R~_O`{zx$%L%2Y-N^_cuA( zTPSy}`}XOj7g~q(yuZoO=7QW#C#UrC%Xxp3OI+u)j=EiX@xtYhrVnGXiR;{cC!0$1 z09hZ#WNC+C9NKVpNY^h64r%%G7M}JO!goJM;gwc8ygzT@6W2AZ`}O&XO;23@Ii>eA znZ$Li^xTlffim9DWN2@}74f5*vEZ_BBEj-RqM(=)!Cx(q4e7DbOK*L01}eN1Z} z_i?PbLj&QpE(ZUH%Xh?O2lv8ONBnv1HUCR-=~p=RXS+oAni4yD=~)5q5w1UjJ1Fm_ zvw1Qj;Ic_AHA^!$HMJ}$bB{1;8fzA1ma>I;;;?0WO=~6^cEQ9^!z(H(Og^NQKkehA zwUobH*sFZ^mOmqHce@sEVn1SN`J~Dr!z-gfUnzSr*!o2ued@3LbpFxQS$`lu=D!#8 zTSguDMgh5z$M8+V0)G0wZy`T@-*!_0Iep*tqL7(H7@gAGiQ^LI!cX}%<40F~fRmrT z$w^f|z{yYF+N3%k;N-Utzju<4_D+8K-W~Px04G0v$8L~*v~xP8@2Oqf?z|4=r*ED8 zvVfev*Hx(f>-$!P{PaDjLhWDc`X4b}lF90~*0>jH|5^)OsQqg_a-sIGIR%Bk?6a$0{@ zNKWg@3dw1`SRpyB11lt_^<9PJv~H`AoYrF%lG8e?LULL^RY*?jq6*1ry;C7Mtz#-A zr}asNN6_V3Bp+a(6|5Hd#>v{^wX}wM%IjzGfB&YQ?h2*qurjVT0!xWO! zI+sFnTE9|APU}(%$!WbwAvvuhDI}-$A%*0$?xT>L)^ik+(>jepa$0{;NKWf23dw1` zL?Jn?gD51Y^$msOv~Ho0oYo^0lG8eaLULL^P)JVio(jp87Le=2or3$`E4_ah8xA0B zXB%UOb7F2)DB+EC$usx3mTegm-rJ4`P^db;M&pEt-)wb4D4I$ zmsT$f1N-V_ykTAH2KFt<-wVuWF5*8oo`xnStME~T=B7q(dWN$R!$DV)tUGZ|<4uN^ z&M_2r{tDL@XncD;2sb1b@SEFV_XSjLRoMxGc~oE&7!580V}R<&C15NV2P(jLPzff0 ziC_|#45omo;8JiIr~=c#bZ|MC0j>Zu!7MNv%mG(|tH4|k+6F(5sAIU}^wo?;<@4({ z$nMMWy&NlTq2EyQNhXJ3+<_c-Wvmw}WFhWPI7L?jWdCbHHMkDE1Iz>Sfy#^Fwkr#j z14Cgq9#pw8Om*Ywo-ntM-0!n*2IvjwPIzwU$D=#~c#@( ZkGi84IBJ2T7C35wqZT-7fxj;c{2$0$c@+Qv literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/UserManager/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Framework/UserManager/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..8178ee177777a873a0fe6307eb4ddce381f0b7ee GIT binary patch literal 38671 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/UserManager/obj/OpenSim.Framework.UserManagement.csproj.FileList.txt b/OpenSim/Framework/UserManager/obj/OpenSim.Framework.UserManagement.csproj.FileList.txt new file mode 100644 index 0000000000..379ce0e963 --- /dev/null +++ b/OpenSim/Framework/UserManager/obj/OpenSim.Framework.UserManagement.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Framework.UserManagement.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Framework.UserManagement.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Framework.UserManagement.dll +obj\Debug\OpenSim.Framework.UserManagement.pdb +..\..\..\bin\OpenSim.Framework.UserManagement.pdb diff --git a/OpenSim/Framework/UserManager/obj/Release/OpenSim.Framework.UserManagement.dll b/OpenSim/Framework/UserManager/obj/Release/OpenSim.Framework.UserManagement.dll new file mode 100644 index 0000000000000000000000000000000000000000..36b533d3af4de341a4f591119fc77a323034d419 GIT binary patch literal 36864 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 bK+OX+57azR^FYl5H4oH0Q1igQNDurkpDUvY literal 0 HcmV?d00001 diff --git a/OpenSim/Framework/UserManager/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Framework/UserManager/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..3f5db4acafabad94d23893495911062359142021 GIT binary patch literal 39830 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/AssetServer/AssetServerMain.cs b/OpenSim/Grid/AssetServer/AssetServerMain.cs new file mode 100644 index 0000000000..9c6deb75e7 --- /dev/null +++ b/OpenSim/Grid/AssetServer/AssetServerMain.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Configuration; +using OpenSim.Grid.Services.Asset; +namespace OpenSim.Grid.AssetServer +{ + public class AssetServerMain + { + [STAThread] + public static void Main(string[] args) + { + ConfigurationManager configManager = new ConfigurationManager(); + AssetServices assetServices = new AssetServices(); + + configManager.addConfigurationMember((ConfigurationMember)assetServices); + configManager.gatherConfiguration(); + } + } +} diff --git a/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj b/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj new file mode 100644 index 0000000000..d58e754779 --- /dev/null +++ b/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj @@ -0,0 +1,96 @@ + + + Local + 8.0.50727 + 2.0 + {E5F1A03B-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Grid.AssetServer + JScript + Grid + IE50 + false + Exe + + OpenSim.Grid.AssetServer + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Configuration + {A45242A2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.Asset + {F22B4FF8-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + + + + + + + + diff --git a/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj.user b/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Grid/AssetServer/obj/Debug/OpenSim.Grid.AssetServer.pdb b/OpenSim/Grid/AssetServer/obj/Debug/OpenSim.Grid.AssetServer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2036a5ca4de4da602f0c9b5443ef445d2bf797e8 GIT binary patch literal 11776 zcmeHMQD_`R7@oUClS^`~7d5TbmThQlP3qo7Y;E(BHkYP`=7@4Nv~ti~@Al%7%U;>N z+VsiO2l26>7Gm*11%2>EP<*frL@N<}P%tV!N)SPj)`~)(8ozJ$CN3foO_1x|{K>!n z%s=zb&U~};&p&f1JLi_XQlV@lhM@=cX9+|IBmbf0gxzM&pg> z#;L~#7Frf#=hI?-?2YhiA0IwC`{NH^#?BA;`Sw?ze==5BjLr23aieu)ZsJYn;1~Jl zM&JKs@T+Itw`LhOkh*@puv9Q+H$O9eDR=RNwd8B{^HxD%Yqg_F-YWgp{ahOYH?Q5i z#=YHTGs*r;`pl$Vw98gz?6l>i?di-B*Uo1Sd7f2HTkg}A8%(FNwqxczA#(j0PZ^eA z=)rK3hFKbVzF{CeT{Yw`a{%1Ww}aRd9g#{X{-?*iONmeg?|LV4HM;4_C!v2E=dnJn z2<6NvTh8WgFxy`2%zt~lTCQf=LS9pCAix!9ik=vIlc`Q%a1Vg$c9zK^u6LxnL{p4* z29&BU%iF|`*c0h;K@b`)4=1&KHT6p)wHzSvKM#7iges2OrA|-~zLy*mAfOzm;oRV}K zn6|${PJl@v{3*N$>M^P1eT%5D9~&TBAU8rn$BtL-hU|pA5AsgP2vCmV%~3G`9tZac z>V89cE12z&m^Q!x|<%u#mSyvW>k}39)7}R%t=?ca=VEc95uYb<**+`!}_q7S}Lc7?t&>?yR zT)!~Dd%#0rMO{eTBQsa$mCnB%4&D!|63U2}sD3mv$T9h7%hnZKRk$z1cp1I>*9?9n z@2BOilRR`_cyMqp{Dw&!vyzO-)mQyr zuRqisO7)d&+9$rqr&jq=Kdnk@Laz4v56|iGQQMgsaSA07cW@x{MBH<8@u#e8-f~YB zOSvguQLu}a7hlUY5D!EIP+bKv!k`Wxr94bQNJrHT$wQK+bwPmV%+26AFjtf(KVl&+ zAYB0;2k!=d5B(mjpM&60DLjZRQ Qnlu6$0gZr0paBv1192#OZU6uP literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/AssetServer/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Grid/AssetServer/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..fdbb61f2ec0322001af8855819facc4488837b78 GIT binary patch literal 23369 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 U7Wap0Ut`n>)`rn1thUMj2fK7XC;$Ke literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/AssetServer/obj/OpenSim.Grid.AssetServer.csproj.FileList.txt b/OpenSim/Grid/AssetServer/obj/OpenSim.Grid.AssetServer.csproj.FileList.txt new file mode 100644 index 0000000000..804658b3f5 --- /dev/null +++ b/OpenSim/Grid/AssetServer/obj/OpenSim.Grid.AssetServer.csproj.FileList.txt @@ -0,0 +1,7 @@ +obj\Release\ResolveAssemblyReference.cache +..\..\..\bin\OpenSim.Grid.AssetServer.exe +obj\Release\OpenSim.Grid.AssetServer.exe +..\..\..\bin\OpenSim.Grid.AssetServer.pdb +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Grid.AssetServer.exe +obj\Debug\OpenSim.Grid.AssetServer.pdb diff --git a/OpenSim/Grid/AssetServer/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Grid/AssetServer/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..c4db5741908bb77cd95e4cea1a4547e5f5693f79 GIT binary patch literal 23369 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 + + Local + 8.0.50727 + 2.0 + {60FCC3A6-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Grid.GridServer + JScript + Grid + IE50 + false + Exe + + OpenSim.Grid.GridServer + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Configuration + {A45242A2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.Grid + {C14E4DD8-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + + + + + + + + diff --git a/OpenSim/Grid/GridServer/OpenSim.Grid.GridServer.csproj.user b/OpenSim/Grid/GridServer/OpenSim.Grid.GridServer.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Grid/GridServer/OpenSim.Grid.GridServer.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Grid/GridServer/obj/Debug/OpenSim.Grid.GridServer.pdb b/OpenSim/Grid/GridServer/obj/Debug/OpenSim.Grid.GridServer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..3f66230a20ff8f7521877b448844ea24276c9298 GIT binary patch literal 11776 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/GridServer/obj/OpenSim.Grid.GridServer.csproj.FileList.txt b/OpenSim/Grid/GridServer/obj/OpenSim.Grid.GridServer.csproj.FileList.txt new file mode 100644 index 0000000000..8edf68e698 --- /dev/null +++ b/OpenSim/Grid/GridServer/obj/OpenSim.Grid.GridServer.csproj.FileList.txt @@ -0,0 +1,7 @@ +obj\Release\ResolveAssemblyReference.cache +..\..\..\bin\OpenSim.Grid.GridServer.exe +obj\Release\OpenSim.Grid.GridServer.exe +..\..\..\bin\OpenSim.Grid.GridServer.pdb +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Grid.GridServer.exe +obj\Debug\OpenSim.Grid.GridServer.pdb diff --git a/OpenSim/Grid/GridServer/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Grid/GridServer/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..60d0f068623c0dc3ebc041332813e5b913897889 GIT binary patch literal 23365 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Old/AssetServer/Main.cs b/OpenSim/Grid/Old/AssetServer/Main.cs new file mode 100644 index 0000000000..3e302d81a1 --- /dev/null +++ b/OpenSim/Grid/Old/AssetServer/Main.cs @@ -0,0 +1,406 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using System.IO; +using System.Text; +using Db4objects.Db4o; +using libsecondlife; +using OpenSim.Framework.Console; +using OpenSim.Framework.Types; +using OpenSim.Framework.Servers; + +namespace OpenSim.Grid.AssetServer +{ + /// + /// An asset server + /// + public class OpenAsset_Main : conscmd_callback + { + private IObjectContainer db; + + public static OpenAsset_Main assetserver; + + private LogBase m_console; + + [STAThread] + public static void Main(string[] args) + { + Console.WriteLine("Starting...\n"); + + assetserver = new OpenAsset_Main(); + assetserver.Startup(); + + assetserver.Work(); + } + + private void Work() + { + m_console.Notice("Enter help for a list of commands"); + + while (true) + { + m_console.MainLogPrompt(); + } + } + + private OpenAsset_Main() + { + m_console = new LogBase("opengrid-AssetServer-console.log", "OpenAsset", this, false); + MainLog.Instance = m_console; + } + + public void Startup() + { + m_console.Verbose("Main.cs:Startup() - Setting up asset DB"); + setupDB(); + + m_console.Verbose("Main.cs:Startup() - Starting HTTP process"); + BaseHttpServer httpServer = new BaseHttpServer(8003); + + httpServer.AddStreamHandler( new GetAssetStreamHandler(this)); + httpServer.AddStreamHandler(new PostAssetStreamHandler( this )); + + //httpServer.AddRestHandler("GET", "/assets/", this.assetGetMethod); + //httpServer.AddRestHandler("POST", "/assets/", this.assetPostMethod); + + httpServer.Start(); + + } + + //public string AssetPostMethod(string requestBody, string path, string param) + //{ + // AssetBase asset = new AssetBase(); + // asset.Name = ""; + // asset.FullID = new LLUUID(param); + // Encoding Windows1252Encoding = Encoding.GetEncoding(1252); + // byte[] buffer = Windows1252Encoding.GetBytes(requestBody); + // asset.Data = buffer; + // AssetStorage store = new AssetStorage(); + // store.Data = asset.Data; + // store.Name = asset.Name; + // store.UUID = asset.FullID; + // db.Set(store); + // db.Commit(); + // return ""; + //} + + //public string AssetGetMethod(string request, string path, string param) + //{ + // Console.WriteLine("got a request " + param); + // byte[] assetdata = GetAssetData(new LLUUID(param), false); + // if (assetdata != null) + // { + // Encoding Windows1252Encoding = Encoding.GetEncoding(1252); + // string ret = Windows1252Encoding.GetString(assetdata); + // //string ret = System.Text.Encoding.Unicode.GetString(assetdata); + + // return ret; + + // } + // else + // { + // return ""; + // } + + //} + + public byte[] GetAssetData(LLUUID assetID, bool isTexture) + { + bool found = false; + AssetStorage foundAsset = null; + + IObjectSet result = db.Get(new AssetStorage(assetID)); + if (result.Count > 0) + { + foundAsset = (AssetStorage)result.Next(); + found = true; + } + + if (found) + { + return foundAsset.Data; + } + else + { + return null; + } + } + + public void setupDB() + { + bool yapfile = File.Exists("assets.yap"); + try + { + db = Db4oFactory.OpenFile("assets.yap"); + MainLog.Instance.Verbose("Main.cs:setupDB() - creation"); + } + catch (Exception e) + { + db.Close(); + MainLog.Instance.Warn("Main.cs:setupDB() - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + if (!yapfile) + { + this.LoadDB(); + } + } + + public void LoadDB() + { + try + { + + Console.WriteLine("setting up Asset database"); + + AssetBase Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000001"); + Image.Name = "Bricks"; + this.LoadAsset(Image, true, "bricks.jp2"); + AssetStorage store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002"); + Image.Name = "Plywood"; + this.LoadAsset(Image, true, "plywood.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000003"); + Image.Name = "Rocks"; + this.LoadAsset(Image, true, "rocks.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000004"); + Image.Name = "Granite"; + this.LoadAsset(Image, true, "granite.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000005"); + Image.Name = "Hardwood"; + this.LoadAsset(Image, true, "hardwood.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005"); + Image.Name = "Prim Base Texture"; + this.LoadAsset(Image, true, "plywood.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73"); + Image.Name = "Shape"; + this.LoadAsset(Image, false, "base_shape.dat"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + + private void LoadAsset(AssetBase info, bool image, string filename) + { + + + string dataPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "assets"); //+ folder; + string fileName = Path.Combine(dataPath, filename); + FileInfo fInfo = new FileInfo(fileName); + long numBytes = fInfo.Length; + FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); + byte[] idata = new byte[numBytes]; + BinaryReader br = new BinaryReader(fStream); + idata = br.ReadBytes((int)numBytes); + br.Close(); + fStream.Close(); + info.Data = idata; + //info.loaded=true; + } + + /*private GridConfig LoadConfigDll(string dllName) + { + Assembly pluginAssembly = Assembly.LoadFrom(dllName); + GridConfig config = null; + + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (pluginType.IsPublic) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IGridConfig", true); + + if (typeInterface != null) + { + IGridConfig plug = (IGridConfig)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + config = plug.GetConfigObject(); + break; + } + + typeInterface = null; + } + } + } + pluginAssembly = null; + return config; + }*/ + + public void CreateAsset(LLUUID assetId, byte[] assetData) + { + AssetBase asset = new AssetBase(); + asset.Name = ""; + asset.FullID = assetId; + asset.Data = assetData; + + AssetStorage store = new AssetStorage(); + store.Data = asset.Data; + store.Name = asset.Name; + store.UUID = asset.FullID; + db.Set(store); + db.Commit(); + } + + public void RunCmd(string cmd, string[] cmdparams) + { + switch (cmd) + { + case "help": + m_console.Notice("shutdown - shutdown this asset server (USE CAUTION!)"); + break; + + case "shutdown": + m_console.Close(); + Environment.Exit(0); + break; + } + } + + public void Show(string ShowWhat) + { + } + } + + public class GetAssetStreamHandler : BaseStreamHandler + { + OpenAsset_Main m_assetManager; + + override public byte[] Handle(string path, Stream request) + { + string param = GetParam(path); + + byte[] assetdata = m_assetManager.GetAssetData(new LLUUID(param), false); + if (assetdata != null) + { + return assetdata; + } + else + { + return new byte[]{}; + } + } + + public GetAssetStreamHandler(OpenAsset_Main assetManager):base( "/assets/", "GET") + { + m_assetManager = assetManager; + } + } + + public class PostAssetStreamHandler : BaseStreamHandler + { + OpenAsset_Main m_assetManager; + + override public byte[] Handle(string path, Stream request) + { + string param = GetParam(path); + LLUUID assetId = new LLUUID(param); + byte[] txBuffer = new byte[4096]; + + using( BinaryReader binReader = new BinaryReader( request ) ) + { + using (MemoryStream memoryStream = new MemoryStream(4096)) + { + int count; + while ((count = binReader.Read(txBuffer, 0, 4096)) > 0) + { + memoryStream.Write(txBuffer, 0, count); + } + + byte[] assetData = memoryStream.ToArray(); + + m_assetManager.CreateAsset(assetId, assetData); + } + } + + return new byte[]{}; + } + + public PostAssetStreamHandler( OpenAsset_Main assetManager ) + : base("/assets/", "POST") + { + m_assetManager = assetManager; + } + } +} diff --git a/OpenSim/Grid/Old/AssetServer/Properties/AssemblyInfo.cs b/OpenSim/Grid/Old/AssetServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..dc39ce21b9 --- /dev/null +++ b/OpenSim/Grid/Old/AssetServer/Properties/AssemblyInfo.cs @@ -0,0 +1,58 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OGS-AssetServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OGS-AssetServer")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b541b244-3d1d-4625-9003-bc2a3a6a39a4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Grid/Old/AssetServer/obj/Debug/OpenSim.Grid.AssetServer.pdb b/OpenSim/Grid/Old/AssetServer/obj/Debug/OpenSim.Grid.AssetServer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2ab796b66dec94702ccf529a35efa6754ee433d9 GIT binary patch literal 19968 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 m{qSIse~=HDiVWlj + /// Used to pass messages to the gridserver + /// + /// Pass this argument + public delegate void GridManagerCallback(string param); + + /// + /// Serverside listener for grid commands + /// + public class GridManagementAgent + { + /// + /// Passes grid server messages + /// + private GridManagerCallback thecallback; + + /// + /// Security keys + /// + private string sendkey; + private string recvkey; + + /// + /// Our component type + /// + private string component_type; + + /// + /// List of active sessions + /// + private static ArrayList Sessions; + + /// + /// Initialises a new GridManagementAgent + /// + /// HTTP Daemon for this server + /// What component type are we? + /// Security send key + /// Security recieve key + /// Message callback + public GridManagementAgent(BaseHttpServer app_httpd, string component_type, string sendkey, string recvkey, GridManagerCallback thecallback) + { + this.sendkey = sendkey; + this.recvkey = recvkey; + this.component_type = component_type; + this.thecallback = thecallback; + Sessions = new ArrayList(); + + app_httpd.AddXmlRPCHandler("manager_login", XmlRpcLoginMethod); + + switch (component_type) + { + case "gridserver": + GridServerManager.sendkey = this.sendkey; + GridServerManager.recvkey = this.recvkey; + GridServerManager.thecallback = thecallback; + app_httpd.AddXmlRPCHandler("shutdown", GridServerManager.XmlRpcShutdownMethod); + break; + } + } + + /// + /// Checks if a session exists + /// + /// The session ID + /// Exists? + public static bool SessionExists(LLUUID sessionID) + { + return Sessions.Contains(sessionID); + } + + /// + /// Logs a new session to the grid manager + /// + /// the XMLRPC request + /// An XMLRPC reply + public static XmlRpcResponse XmlRpcLoginMethod(XmlRpcRequest request) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + Hashtable responseData = new Hashtable(); + + // TODO: Switch this over to using OpenSim.Framework.Data + if (requestData["username"].Equals("admin") && requestData["password"].Equals("supersecret")) + { + response.IsFault = false; + LLUUID new_session = LLUUID.Random(); + Sessions.Add(new_session); + responseData["session_id"] = new_session.ToString(); + responseData["msg"] = "Login OK"; + } + else + { + response.IsFault = true; + responseData["error"] = "Invalid username or password"; + } + + response.Value = responseData; + return response; + + } + + } +} diff --git a/OpenSim/Grid/Old/Framework.Manager/GridServerManager.cs b/OpenSim/Grid/Old/Framework.Manager/GridServerManager.cs new file mode 100644 index 0000000000..67cd35dc30 --- /dev/null +++ b/OpenSim/Grid/Old/Framework.Manager/GridServerManager.cs @@ -0,0 +1,93 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using System.Collections; +using System.Threading; +using libsecondlife; +using Nwc.XmlRpc; + +namespace OpenSim.Framework.Manager { + + /// + /// A remote management system for the grid server + /// + public class GridServerManager + { + /// + /// Triggers events from the grid manager + /// + public static GridManagerCallback thecallback; + + /// + /// Security keys + /// + public static string sendkey; + public static string recvkey; + + /// + /// Disconnects the grid server and shuts it down + /// + /// XmlRpc Request + /// An XmlRpc response containing either a "msg" or an "error" + public static XmlRpcResponse XmlRpcShutdownMethod(XmlRpcRequest request) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + Hashtable responseData = new Hashtable(); + + if(requestData.ContainsKey("session_id")) { + if(GridManagementAgent.SessionExists(new LLUUID((string)requestData["session_id"]))) { + responseData["msg"]="Shutdown command accepted"; + (new Thread(new ThreadStart(ShutdownServer))).Start(); + } else { + response.IsFault=true; + responseData["error"]="bad session ID"; + } + } else { + response.IsFault=true; + responseData["error"]="no session ID"; + } + + response.Value = responseData; + return response; + } + + /// + /// Shuts down the grid server + /// + public static void ShutdownServer() + { + Console.WriteLine("Shutting down the grid server - recieved a grid manager request"); + Console.WriteLine("Terminating in three seconds..."); + Thread.Sleep(3000); + thecallback("shutdown"); + } + } +} + diff --git a/OpenSim/Grid/Old/Framework.Manager/obj/Debug/OpenSim.Grid.Framework.Manager.dll b/OpenSim/Grid/Old/Framework.Manager/obj/Debug/OpenSim.Grid.Framework.Manager.dll new file mode 100644 index 0000000000000000000000000000000000000000..c8eab37e2b4eefbf32eaf3ce28795c272b8a8553 GIT binary patch literal 16384 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 F{{hNfZMFaa literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Old/Framework.Manager/obj/Debug/OpenSim.Grid.Framework.Manager.pdb b/OpenSim/Grid/Old/Framework.Manager/obj/Debug/OpenSim.Grid.Framework.Manager.pdb new file mode 100644 index 0000000000000000000000000000000000000000..764471849733bd262f716eacfe4c6d2abf610e88 GIT binary patch literal 15872 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Old/Framework.Manager/obj/OpenSim.Grid.Framework.Manager.csproj.FileList.txt b/OpenSim/Grid/Old/Framework.Manager/obj/OpenSim.Grid.Framework.Manager.csproj.FileList.txt new file mode 100644 index 0000000000..eaba21049a --- /dev/null +++ b/OpenSim/Grid/Old/Framework.Manager/obj/OpenSim.Grid.Framework.Manager.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Grid.Framework.Manager.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Grid.Framework.Manager.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Grid.Framework.Manager.dll +obj\Debug\OpenSim.Grid.Framework.Manager.pdb +..\..\..\bin\OpenSim.Grid.Framework.Manager.pdb diff --git a/OpenSim/Grid/Old/Framework.Manager/obj/Release/OpenSim.Grid.Framework.Manager.dll b/OpenSim/Grid/Old/Framework.Manager/obj/Release/OpenSim.Grid.Framework.Manager.dll new file mode 100644 index 0000000000000000000000000000000000000000..365c87aea7601cc1d936eaa05b4e2dfc0d49c975 GIT binary patch literal 16384 zcmeHNU2Ggz6+U-%z22;oh26wXOx$Kney|*8<>p5vs7?GIFSTRib)2L?o$>C?dhzVc zW@groX&sCZprDAhsuUFo1P`S`5u!Y_B@}@WNO?fyg-TGwOOQZFfJ7x!At90QojWt@ zpA-rbPh{?D&YW}Zx#ynqo!NWmu08(ba}*<@IIes5h;HJ}txwT^Pgc>L-t$J9UfpuL z^QIWP-8ns9arK&GmmQ<37Y)m@J$+8flbYB2H*3^K){JP<)vZcZUNT?lIZD5Iy+(L>|tv}mfCSQp`pWV0q^3xo9cqs z)WP1w&J_$zC7lAB&xYm)cW&%h2|E%=`+cxabid(z1-dSrm{U%>2sr&F{C8!byMj35 z&Utij4vFrEwXQ7G-L$>8iJn!sQO4J4O)D^oYw7q3a*S*76{H8TX$2U>-R&5*iX7uH zX94bz2=Ym|JD|2(K@PZtZFIxQdM9+SBZG6{yD3O{*MLOoatM z5Z3$Y9=XEPXxD(CumK;UCBz$}S8<1f_pHs=I9)D>^9pmj!1c^FJ3nZsZ#UGVi8cj% zS38WhsfoAv6Mq1T14&iqZ0v5E3T8KSs*FKdf6sonteflfx3Hs8r-8yp2So5>^6wmr zhjYETW4(_aeiQ;h#wMo;s5s z!u)mOha0Uko+gr|s*7Tc?zY1jt!MoR_J zCg^$k5+&$G&=kEzw?Y2^nxF%M^+yz478gaDUKZCxmVPQ;6A4Obe+2DT)YdM7zpCih zH6Hb2?G-ISKUefm(4^^+*fpL!n3b^-$np@K1UgDW?|DdD5MNyNRaIXczg4x-4Mf#O zuftCp{RmVjjZhj9XwD+S41G>~geG;K={mgwSx~&wmr`OEa5$o*FYIa;9SRl3g(bZq z-4c7mfdHi#-4gxcAY$ak(zrN^h#qTrIf00O70mE6kwia1w5PzYYDLOJa{&Cy+B_|T*XgsM7U-KAd-%2Hf&NxoqO0^*?eoz81C`sN z{2W*Gc{Qq^PQ;$2OEeL?PRB{co`Q`9nx}f~8_+xx`zAE2u^W`57WzKucKQiDLtmxu zP<)j(wNYThPiNQ!=Dok&x?e^9^F)|yt-S`!RC{dPF4awWf+lLxDpabuQ%;fUa^r?&l%^pK{|`l3ABwt_t`7kz-rJi%{imEuufN%me*efp{iT79kVh= zg=N>1RhpRllq`BQUN^l;(Qv&XY09$UN%H1pF?8fgtF$1O$&tlHzMmT(o0=S?(@VwN zxvDu;E0TYkl5WkmT-gvW)urnNQenRCmFy*JTzd0%i9*p&ka9)Ob|`Nx+6$8M{qC|= zgf~P*if`mJAj=giFdMc?0avuEm>BuZddoE#O%usg5EAt}j~cVoHZyR*KRkUtw@`Q_?gpE6(lru=dW?fqyWN&CoShF)QBkT5lNpyFWcBl#hH~ zWn7lt?4*H5%q3>?T=!AKo%f76Qz8({Gb)z*1Pbe~{N#pK{zHf}LZ(-Qi1DuS!xV?ZiFHlQiOM-5hz$F@jv@Ud~x zLv!e7tBtehSdWIV`B|{~7k!@zXZ8@0g;?};F?fhdLQ}>Z9Ix-gp+#sNNQZDa;EU*$ zO6y0ueuSTa0U!Ptw!eg284Zub$!Vpps@V-_!YKHzL!MVNa1@*yqr!N&SW)?dH>FL; z(e8~i&f>kp#_a5mTEk4(SC|K7>dLnR3j>HtV9RLwF;S)lEmv+yVGZPWx`@A~Joqtj zPWWq4W~?!jP80lhtK)h2T*P=2^D{P^XVR5V9o{z0fk);y@4Ve25C5Y7`i>{PncZ)m zq~!NL{fU|Oqj#>x64|X3D*?be>mX0;EmXz0I2ck)*n&bY6%>JYZ{?_&|zvN77ZD$>$cG|XvFBfHv7bSet z?Il+r=Uu^hhrcp8=5^-oZ{fL!Xm-$chD>uD%Zk6@NU1h79&>L$#^a0-wFrU#2L$-E zfbR&=>c(vNYo-32e4n1}Msc0%BYJ7wE9OhuQD|qVfSqWDhG`019&6TV$a&Ba@Z5eF z|I1x|-`?C#1`2%VH@vyBdI*<*R|6~T2-ZClt0S+27qQlH+o#SI)9B^B%|*Yz?(@p- zx9`T|h*cma4_3T#m*2(H9fT$DNA&P>l;+f*)O!$-XxI;7b{G2w`{BLQ-+y@?9ak?_ zrZwA{U`=1M>BSzib`kcPy|CwOco+6}3=?<-`vy?seZfNH73?25I;G|IEyl(z;2`Buc>$@0zD(e)*hhe|UN;hPO(x)HMvt1 + /// A grid configuration interface for returning the DB4o Config Provider + /// + public class Db40ConfigPlugin: IGridConfig + { + /// + /// Loads and returns a configuration objeect + /// + /// A grid configuration object + public GridConfig GetConfigObject() + { + MainLog.Instance.Verbose("Loading Db40Config dll"); + return ( new DbGridConfig()); + } + } + + /// + /// A DB4o based Gridserver configuration object + /// + public class DbGridConfig : GridConfig + { + /// + /// The DB4o Database + /// + private IObjectContainer db; + + /// + /// User configuration for the Grid Config interfaces + /// + public void LoadDefaults() { + MainLog.Instance.Notice("Config.cs:LoadDefaults() - Please press enter to retain default or enter new settings"); + + // About the grid options + this.GridOwner = MainLog.Instance.CmdPrompt("Grid owner", "OGS development team"); + + // Asset Options + this.DefaultAssetServer = MainLog.Instance.CmdPrompt("Default asset server","http://127.0.0.1:8003/"); + this.AssetSendKey = MainLog.Instance.CmdPrompt("Key to send to asset server","null"); + this.AssetRecvKey = MainLog.Instance.CmdPrompt("Key to expect from asset server","null"); + + // User Server Options + this.DefaultUserServer = MainLog.Instance.CmdPrompt("Default user server","http://127.0.0.1:8002/"); + this.UserSendKey = MainLog.Instance.CmdPrompt("Key to send to user server","null"); + this.UserRecvKey = MainLog.Instance.CmdPrompt("Key to expect from user server","null"); + + // Region Server Options + this.SimSendKey = MainLog.Instance.CmdPrompt("Key to send to sims","null"); + this.SimRecvKey = MainLog.Instance.CmdPrompt("Key to expect from sims","null"); + } + + /// + /// Initialises a new configuration object + /// + public override void InitConfig() { + try { + // Perform Db4o initialisation + db = Db4oFactory.OpenFile("opengrid.yap"); + + // Locate the grid configuration object + IObjectSet result = db.Get(typeof(DbGridConfig)); + // Found? + if(result.Count==1) { + MainLog.Instance.Verbose("Config.cs:InitConfig() - Found a GridConfig object in the local database, loading"); + foreach (DbGridConfig cfg in result) { + // Import each setting into this class + // Grid Settings + this.GridOwner=cfg.GridOwner; + // Asset Settings + this.DefaultAssetServer=cfg.DefaultAssetServer; + this.AssetSendKey=cfg.AssetSendKey; + this.AssetRecvKey=cfg.AssetRecvKey; + // User Settings + this.DefaultUserServer=cfg.DefaultUserServer; + this.UserSendKey=cfg.UserSendKey; + this.UserRecvKey=cfg.UserRecvKey; + // Region Settings + this.SimSendKey=cfg.SimSendKey; + this.SimRecvKey=cfg.SimRecvKey; + } + // Create a new configuration object from this class + } else { + MainLog.Instance.Verbose("Config.cs:InitConfig() - Could not find object in database, loading precompiled defaults"); + + // Load default settings into this class + LoadDefaults(); + + // Saves to the database file... + MainLog.Instance.Verbose( "Writing out default settings to local database"); + db.Set(this); + + // Closes file locks + db.Close(); + } + } catch(Exception e) { + MainLog.Instance.Warn("Config.cs:InitConfig() - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + + // Grid Settings + MainLog.Instance.Verbose("Grid settings loaded:"); + MainLog.Instance.Verbose("Grid owner: " + this.GridOwner); + + // Asset Settings + MainLog.Instance.Verbose("Default asset server: " + this.DefaultAssetServer); + MainLog.Instance.Verbose("Key to send to asset server: " + this.AssetSendKey); + MainLog.Instance.Verbose("Key to expect from asset server: " + this.AssetRecvKey); + + // User Settings + MainLog.Instance.Verbose("Default user server: " + this.DefaultUserServer); + MainLog.Instance.Verbose("Key to send to user server: " + this.UserSendKey); + MainLog.Instance.Verbose("Key to expect from user server: " + this.UserRecvKey); + + // Region Settings + MainLog.Instance.Verbose("Key to send to sims: " + this.SimSendKey); + MainLog.Instance.Verbose("Key to expect from sims: " + this.SimRecvKey); + } + + /// + /// Closes down the database and releases filesystem locks + /// + public void Shutdown() { + db.Close(); + } + } + +} diff --git a/OpenSim/Grid/Old/GridServer.Config/obj/Debug/OpenSim.Grid.GridServer.Config.dll b/OpenSim/Grid/Old/GridServer.Config/obj/Debug/OpenSim.Grid.GridServer.Config.dll new file mode 100644 index 0000000000000000000000000000000000000000..85810286805164c5b79f31de51a791afd1fb3fd5 GIT binary patch literal 20480 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 AqW}N^ literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Old/GridServer/GridManager.cs b/OpenSim/Grid/Old/GridServer/GridManager.cs new file mode 100644 index 0000000000..06e83f82bc --- /dev/null +++ b/OpenSim/Grid/Old/GridServer/GridManager.cs @@ -0,0 +1,691 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Xml; +using libsecondlife; +using Nwc.XmlRpc; +using OpenSim.Framework.Console; +using OpenSim.Framework.Data; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Grid.GridServer +{ + class GridManager + { + Dictionary _plugins = new Dictionary(); + Dictionary _logplugins = new Dictionary(); + + public GridConfig config; + + /// + /// Adds a new grid server plugin - grid servers will be requested in the order they were loaded. + /// + /// The filename to the grid server plugin DLL + public void AddPlugin(string FileName) + { + MainLog.Instance.Verbose("Storage: Attempting to load " + FileName); + Assembly pluginAssembly = Assembly.LoadFrom(FileName); + + MainLog.Instance.Verbose("Storage: Found " + pluginAssembly.GetTypes().Length + " interfaces."); + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (!pluginType.IsAbstract) + { + // Regions go here + Type typeInterface = pluginType.GetInterface("IGridData", true); + + if (typeInterface != null) + { + IGridData plug = (IGridData)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + plug.Initialise(); + this._plugins.Add(plug.getName(), plug); + MainLog.Instance.Verbose("Storage: Added IGridData Interface"); + } + + typeInterface = null; + + // Logs go here + typeInterface = pluginType.GetInterface("ILogData", true); + + if (typeInterface != null) + { + ILogData plug = (ILogData)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + plug.Initialise(); + this._logplugins.Add(plug.getName(), plug); + MainLog.Instance.Verbose( "Storage: Added ILogData Interface"); + } + + typeInterface = null; + } + } + + pluginAssembly = null; + } + + /// + /// Logs a piece of information to the database + /// + /// What you were operating on (in grid server, this will likely be the region UUIDs) + /// Which method is being called? + /// What arguments are being passed? + /// How high priority is this? 1 = Max, 6 = Verbose + /// The message to log + private void logToDB(string target, string method, string args, int priority, string message) + { + foreach (KeyValuePair kvp in _logplugins) + { + try + { + kvp.Value.saveLog("Gridserver", target, method, args, priority, message); + } + catch (Exception) + { + MainLog.Instance.Warn("Storage: unable to write log via " + kvp.Key); + } + } + } + + /// + /// Returns a region by argument + /// + /// A UUID key of the region to return + /// A SimProfileData for the region + public SimProfileData getRegion(LLUUID uuid) + { + foreach(KeyValuePair kvp in _plugins) { + try + { + return kvp.Value.GetProfileByLLUUID(uuid); + } + catch (Exception e) + { + MainLog.Instance.Warn("Message from Storage: " + e.Message); + } + } + return null; + } + + /// + /// Returns a region by argument + /// + /// A regionHandle of the region to return + /// A SimProfileData for the region + public SimProfileData getRegion(ulong handle) + { + foreach (KeyValuePair kvp in _plugins) + { + try + { + return kvp.Value.GetProfileByHandle(handle); + } + catch + { + MainLog.Instance.Warn("Storage: Unable to find region " + handle.ToString() + " via " + kvp.Key); + } + } + return null; + } + + public Dictionary getRegions(uint xmin, uint ymin, uint xmax, uint ymax) + { + Dictionary regions = new Dictionary(); + + SimProfileData[] neighbours; + + foreach (KeyValuePair kvp in _plugins) + { + try + { + neighbours = kvp.Value.GetProfilesInRange(xmin, ymin, xmax, ymax); + foreach (SimProfileData neighbour in neighbours) + { + regions[neighbour.regionHandle] = neighbour; + } + } + catch + { + MainLog.Instance.Warn("Storage: Unable to query regionblock via " + kvp.Key); + } + } + + return regions; + } + + + + /// + /// Returns a XML String containing a list of the neighbouring regions + /// + /// The regionhandle for the center sim + /// An XML string containing neighbour entities + public string GetXMLNeighbours(ulong reqhandle) + { + string response = ""; + SimProfileData central_region = getRegion(reqhandle); + SimProfileData neighbour; + for (int x = -1; x < 2; x++) for (int y = -1; y < 2; y++) + { + if (getRegion(Util.UIntsToLong((uint)((central_region.regionLocX + x) * 256), (uint)(central_region.regionLocY + y) * 256)) != null) + { + neighbour = getRegion(Util.UIntsToLong((uint)((central_region.regionLocX + x) * 256), (uint)(central_region.regionLocY + y) * 256)); + response += ""; + response += "" + neighbour.serverIP + ""; + response += "" + neighbour.serverPort.ToString() + ""; + response += "" + neighbour.regionLocX.ToString() + ""; + response += "" + neighbour.regionLocY.ToString() + ""; + response += "" + neighbour.regionHandle.ToString() + ""; + response += ""; + + } + } + return response; + } + + /// + /// Performed when a region connects to the grid server initially. + /// + /// The XMLRPC Request + /// Startup parameters + public XmlRpcResponse XmlRpcSimulatorLoginMethod(XmlRpcRequest request) + { + + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + response.Value = responseData; + + SimProfileData TheSim = null; + Hashtable requestData = (Hashtable)request.Params[0]; + + if (requestData.ContainsKey("UUID")) + { + TheSim = getRegion(new LLUUID((string)requestData["UUID"])); + + logToDB((new LLUUID((string)requestData["UUID"])).ToStringHyphenated(),"XmlRpcSimulatorLoginMethod","", 5,"Region attempting login with UUID."); + } + else if (requestData.ContainsKey("region_handle")) + { + + TheSim = getRegion((ulong)Convert.ToUInt64(requestData["region_handle"])); + logToDB((string)requestData["region_handle"], "XmlRpcSimulatorLoginMethod", "", 5, "Region attempting login with regionHandle."); + } + else + { + responseData["error"] = "No UUID or region_handle passed to grid server - unable to connect you"; + return response; + } + + if (TheSim == null) // Shouldnt this be in the REST Simulator Set method? + { + //NEW REGION + TheSim = new SimProfileData(); + + TheSim.regionRecvKey = config.SimRecvKey; + TheSim.regionSendKey = config.SimSendKey; + TheSim.regionSecret = config.SimRecvKey; + TheSim.regionDataURI = ""; + TheSim.regionAssetURI = config.DefaultAssetServer; + TheSim.regionAssetRecvKey = config.AssetRecvKey; + TheSim.regionAssetSendKey = config.AssetSendKey; + TheSim.regionUserURI = config.DefaultUserServer; + TheSim.regionUserSendKey = config.UserSendKey; + TheSim.regionUserRecvKey = config.UserRecvKey; + + TheSim.serverIP = (string)requestData["sim_ip"]; + TheSim.serverPort = Convert.ToUInt32((string)requestData["sim_port"]); + TheSim.regionLocX = Convert.ToUInt32((string)requestData["region_locx"]); + TheSim.regionLocY = Convert.ToUInt32((string)requestData["region_locy"]); + TheSim.regionLocZ = 0; + + TheSim.regionHandle = Helpers.UIntsToLong((TheSim.regionLocX * 256), (TheSim.regionLocY * 256)); + TheSim.serverURI = "http://" + TheSim.serverIP + ":" + TheSim.serverPort + "/"; + + Console.WriteLine("NEW SIM: " + TheSim.serverURI); + TheSim.regionName = (string)requestData["sim_name"]; + TheSim.UUID = new LLUUID((string)requestData["UUID"]); + + foreach (KeyValuePair kvp in _plugins) + { + try + { + DataResponse insertResponse = kvp.Value.AddProfile(TheSim); + switch(insertResponse) + { + case DataResponse.RESPONSE_OK: + OpenSim.Framework.Console.MainLog.Instance.Verbose("New sim creation successful: " + TheSim.regionName); + break; + case DataResponse.RESPONSE_ERROR: + OpenSim.Framework.Console.MainLog.Instance.Warn("New sim creation failed (Error): " + TheSim.regionName); + break; + case DataResponse.RESPONSE_INVALIDCREDENTIALS: + OpenSim.Framework.Console.MainLog.Instance.Warn("New sim creation failed (Invalid Credentials): " + TheSim.regionName); + break; + case DataResponse.RESPONSE_AUTHREQUIRED: + OpenSim.Framework.Console.MainLog.Instance.Warn("New sim creation failed (Authentication Required): " + TheSim.regionName); + break; + } + + } + catch (Exception e) + { + OpenSim.Framework.Console.MainLog.Instance.Warn("Storage: Unable to add region " + TheSim.UUID.ToStringHyphenated() + " via " + kvp.Key); + } + } + + + if (getRegion(TheSim.regionHandle) == null) + { + responseData["error"] = "Unable to add new region"; + return response; + } + } + + + ArrayList SimNeighboursData = new ArrayList(); + + SimProfileData neighbour; + Hashtable NeighbourBlock; + + bool fastMode = false; // Only compatible with MySQL right now + + if (fastMode) + { + Dictionary neighbours = getRegions(TheSim.regionLocX - 1, TheSim.regionLocY - 1, TheSim.regionLocX + 1, TheSim.regionLocY + 1); + + foreach (KeyValuePair aSim in neighbours) + { + NeighbourBlock = new Hashtable(); + NeighbourBlock["sim_ip"] = aSim.Value.serverIP.ToString(); + NeighbourBlock["sim_port"] = aSim.Value.serverPort.ToString(); + NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString(); + NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString(); + NeighbourBlock["UUID"] = aSim.Value.UUID.ToString(); + + if (aSim.Value.UUID != TheSim.UUID) + SimNeighboursData.Add(NeighbourBlock); + } + } + else + { + for (int x = -1; x < 2; x++) for (int y = -1; y < 2; y++) + { + if (getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256)) != null) + { + neighbour = getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256)); + + NeighbourBlock = new Hashtable(); + NeighbourBlock["sim_ip"] = neighbour.serverIP; + NeighbourBlock["sim_port"] = neighbour.serverPort.ToString(); + NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString(); + NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString(); + NeighbourBlock["UUID"] = neighbour.UUID.ToString(); + + if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock); + } + } + } + + responseData["UUID"] = TheSim.UUID.ToString(); + responseData["region_locx"] = TheSim.regionLocX.ToString(); + responseData["region_locy"] = TheSim.regionLocY.ToString(); + responseData["regionname"] = TheSim.regionName; + responseData["estate_id"] = "1"; + responseData["neighbours"] = SimNeighboursData; + + responseData["sim_ip"] = TheSim.serverIP; + responseData["sim_port"] = TheSim.serverPort.ToString(); + responseData["asset_url"] = TheSim.regionAssetURI; + responseData["asset_sendkey"] = TheSim.regionAssetSendKey; + responseData["asset_recvkey"] = TheSim.regionAssetRecvKey; + responseData["user_url"] = TheSim.regionUserURI; + responseData["user_sendkey"] = TheSim.regionUserSendKey; + responseData["user_recvkey"] = TheSim.regionUserRecvKey; + responseData["authkey"] = TheSim.regionSecret; + + // New! If set, use as URL to local sim storage (ie http://remotehost/region.yap) + responseData["data_uri"] = TheSim.regionDataURI; + + + return response; + } + + public XmlRpcResponse XmlRpcSimulatorDataRequestMethod(XmlRpcRequest request) + { + Hashtable requestData = (Hashtable)request.Params[0]; + Hashtable responseData = new Hashtable(); + SimProfileData simData = null; + if (requestData.ContainsKey("region_UUID")) + { + simData = getRegion(new LLUUID((string)requestData["region_UUID"])); + } + else if (requestData.ContainsKey("region_handle")) + { + simData = getRegion(Convert.ToUInt64((string)requestData["region_handle"])); + } + + if (simData == null) + { + //Sim does not exist + responseData["error"] = "Sim does not exist"; + } + else + { + responseData["sim_ip"] = simData.serverIP; + responseData["sim_port"] = simData.serverPort.ToString(); + responseData["region_locx"] = simData.regionLocX.ToString() ; + responseData["region_locy"] = simData.regionLocY.ToString(); + responseData["region_UUID"] = simData.UUID.UUID.ToString(); + responseData["region_name"] = simData.regionName; + } + + XmlRpcResponse response = new XmlRpcResponse(); + response.Value = responseData; + return response; + } + + public XmlRpcResponse XmlRpcMapBlockMethod(XmlRpcRequest request) + { + int xmin=980, ymin=980, xmax=1020, ymax=1020; + + Hashtable requestData = (Hashtable)request.Params[0]; + if (requestData.ContainsKey("xmin")) + { + xmin = (Int32)requestData["xmin"]; + } + if (requestData.ContainsKey("ymin")) + { + ymin = (Int32)requestData["ymin"]; + } + if (requestData.ContainsKey("xmax")) + { + xmax = (Int32)requestData["xmax"]; + } + if (requestData.ContainsKey("ymax")) + { + ymax = (Int32)requestData["ymax"]; + } + + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + response.Value = responseData; + IList simProfileList = new ArrayList(); + + bool fastMode = true; // MySQL Only + + if (fastMode) + { + Dictionary neighbours = getRegions((uint)xmin, (uint)ymin, (uint)xmax, (uint)ymax); + + foreach (KeyValuePair aSim in neighbours) + { + Hashtable simProfileBlock = new Hashtable(); + simProfileBlock["x"] = aSim.Value.regionLocX.ToString(); + simProfileBlock["y"] = aSim.Value.regionLocY.ToString(); + simProfileBlock["name"] = aSim.Value.regionName; + simProfileBlock["access"] = 21; + simProfileBlock["region-flags"] = 512; + simProfileBlock["water-height"] = 0; + simProfileBlock["agents"] = 1; + simProfileBlock["map-image-id"] = aSim.Value.regionMapTextureID.ToString(); + + // For Sugilite compatibility + simProfileBlock["regionhandle"] = aSim.Value.regionHandle.ToString(); + simProfileBlock["sim_ip"] = aSim.Value.serverIP.ToString(); + simProfileBlock["sim_port"] = aSim.Value.serverPort.ToString(); + simProfileBlock["sim_uri"] = aSim.Value.serverURI.ToString(); + simProfileBlock["uuid"] = aSim.Value.UUID.ToStringHyphenated(); + + simProfileList.Add(simProfileBlock); + } + MainLog.Instance.Verbose("World map request processed, returned " + simProfileList.Count.ToString() + " region(s) in range via FastMode"); + } + else + { + SimProfileData simProfile; + for (int x = xmin; x < xmax; x++) + { + for (int y = ymin; y < ymax; y++) + { + simProfile = getRegion(Helpers.UIntsToLong((uint)(x * 256), (uint)(y * 256))); + if (simProfile != null) + { + Hashtable simProfileBlock = new Hashtable(); + simProfileBlock["x"] = x; + simProfileBlock["y"] = y; + simProfileBlock["name"] = simProfile.regionName; + simProfileBlock["access"] = 0; + simProfileBlock["region-flags"] = 0; + simProfileBlock["water-height"] = 20; + simProfileBlock["agents"] = 1; + simProfileBlock["map-image-id"] = simProfile.regionMapTextureID.ToString(); + + // For Sugilite compatibility + simProfileBlock["regionhandle"] = simProfile.regionHandle.ToString(); + simProfileBlock["sim_ip"] = simProfile.serverIP.ToString(); + simProfileBlock["sim_port"] = simProfile.serverPort.ToString(); + simProfileBlock["sim_uri"] = simProfile.serverURI.ToString(); + simProfileBlock["uuid"] = simProfile.UUID.ToStringHyphenated(); + + simProfileList.Add(simProfileBlock); + } + } + } + MainLog.Instance.Verbose("World map request processed, returned " + simProfileList.Count.ToString() + " region(s) in range via Standard Mode"); + } + + responseData["sim-profiles"] = simProfileList; + + return response; + } + + + + /// + /// Performs a REST Get Operation + /// + /// + /// + /// + /// + public string RestGetRegionMethod(string request, string path, string param) + { + return RestGetSimMethod("", "/sims/", param); + } + + /// + /// Performs a REST Set Operation + /// + /// + /// + /// + /// + public string RestSetRegionMethod(string request, string path, string param) + { + return RestSetSimMethod("", "/sims/", param); + } + + /// + /// Returns information about a sim via a REST Request + /// + /// + /// + /// + /// Information about the sim in XML + public string RestGetSimMethod(string request, string path, string param) + { + string respstring = String.Empty; + + SimProfileData TheSim; + LLUUID UUID = new LLUUID(param); + TheSim = getRegion(UUID); + + if (!(TheSim == null)) + { + respstring = ""; + respstring += "" + TheSim.regionSendKey + ""; + respstring += ""; + respstring += "" + TheSim.UUID.ToString() + ""; + respstring += "" + TheSim.regionName + ""; + respstring += "" + TheSim.serverIP + ""; + respstring += "" + TheSim.serverPort.ToString() + ""; + respstring += "" + TheSim.regionLocX.ToString() + ""; + respstring += "" + TheSim.regionLocY.ToString() + ""; + respstring += "1"; + respstring += ""; + respstring += ""; + } + + return respstring; + } + + /// + /// Creates or updates a sim via a REST Method Request + /// BROKEN with SQL Update + /// + /// + /// + /// + /// "OK" or an error + public string RestSetSimMethod(string request, string path, string param) + { + Console.WriteLine("Processing region update via REST method"); + SimProfileData TheSim; + TheSim = getRegion(new LLUUID(param)); + if ((TheSim) == null) + { + TheSim = new SimProfileData(); + LLUUID UUID = new LLUUID(param); + TheSim.UUID = UUID; + TheSim.regionRecvKey = config.SimRecvKey; + } + + XmlDocument doc = new XmlDocument(); + doc.LoadXml(request); + XmlNode rootnode = doc.FirstChild; + XmlNode authkeynode = rootnode.ChildNodes[0]; + if (authkeynode.Name != "authkey") + { + return "ERROR! bad XML - expected authkey tag"; + } + + XmlNode simnode = rootnode.ChildNodes[1]; + if (simnode.Name != "sim") + { + return "ERROR! bad XML - expected sim tag"; + } + + //TheSim.regionSendKey = Cfg; + TheSim.regionRecvKey = config.SimRecvKey; + TheSim.regionSendKey = config.SimSendKey; + TheSim.regionSecret = config.SimRecvKey; + TheSim.regionDataURI = ""; + TheSim.regionAssetURI = config.DefaultAssetServer; + TheSim.regionAssetRecvKey = config.AssetRecvKey; + TheSim.regionAssetSendKey = config.AssetSendKey; + TheSim.regionUserURI = config.DefaultUserServer; + TheSim.regionUserSendKey = config.UserSendKey; + TheSim.regionUserRecvKey = config.UserRecvKey; + + + for (int i = 0; i < simnode.ChildNodes.Count; i++) + { + switch (simnode.ChildNodes[i].Name) + { + case "regionname": + TheSim.regionName = simnode.ChildNodes[i].InnerText; + break; + + case "sim_ip": + TheSim.serverIP = simnode.ChildNodes[i].InnerText; + break; + + case "sim_port": + TheSim.serverPort = Convert.ToUInt32(simnode.ChildNodes[i].InnerText); + break; + + case "region_locx": + TheSim.regionLocX = Convert.ToUInt32((string)simnode.ChildNodes[i].InnerText); + TheSim.regionHandle = Helpers.UIntsToLong((TheSim.regionLocX * 256), (TheSim.regionLocY * 256)); + break; + + case "region_locy": + TheSim.regionLocY = Convert.ToUInt32((string)simnode.ChildNodes[i].InnerText); + TheSim.regionHandle = Helpers.UIntsToLong((TheSim.regionLocX * 256), (TheSim.regionLocY * 256)); + break; + } + } + + TheSim.serverURI = "http://" + TheSim.serverIP + ":" + TheSim.serverPort + "/"; + + bool requirePublic = false; + + if (requirePublic && (TheSim.serverIP.StartsWith("172.16") || TheSim.serverIP.StartsWith("192.168") || TheSim.serverIP.StartsWith("10.") || TheSim.serverIP.StartsWith("0.") || TheSim.serverIP.StartsWith("255."))) + { + return "ERROR! Servers must register with public addresses."; + } + + + try + { + MainLog.Instance.Verbose("Updating / adding via " + _plugins.Count + " storage provider(s) registered."); + foreach (KeyValuePair kvp in _plugins) + { + try + { + //Check reservations + ReservationData reserveData = kvp.Value.GetReservationAtPoint(TheSim.regionLocX, TheSim.regionLocY); + if ((reserveData != null && reserveData.gridRecvKey == TheSim.regionRecvKey) || (reserveData == null && authkeynode.InnerText != TheSim.regionRecvKey)) + { + kvp.Value.AddProfile(TheSim); + MainLog.Instance.Verbose("New sim added to grid (" + TheSim.regionName + ")"); + logToDB(TheSim.UUID.ToStringHyphenated(), "RestSetSimMethod", "", 5, "Region successfully updated and connected to grid."); + } + else + { + MainLog.Instance.Warn("Unable to update region (RestSetSimMethod): Incorrect reservation auth key.");// Wanted: " + reserveData.gridRecvKey + ", Got: " + TheSim.regionRecvKey + "."); + return "Unable to update region (RestSetSimMethod): Incorrect auth key."; + } + } + catch (Exception e) + { + MainLog.Instance.Verbose("getRegionPlugin Handle " + kvp.Key + " unable to add new sim: " + e.ToString()); + } + } + return "OK"; + } + catch (Exception e) + { + return "ERROR! Could not save to database! (" + e.ToString() + ")"; + } + } + + } +} diff --git a/OpenSim/Grid/Old/GridServer/Main.cs b/OpenSim/Grid/Old/GridServer/Main.cs new file mode 100644 index 0000000000..dc5e4fa783 --- /dev/null +++ b/OpenSim/Grid/Old/GridServer/Main.cs @@ -0,0 +1,258 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using System.Reflection; +using System.Threading; +using System.Timers; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Servers; +using OpenSim.GenericConfig; +using Timer=System.Timers.Timer; + +namespace OpenSim.Grid.GridServer +{ + /// + /// + public class OpenGrid_Main : conscmd_callback + { + private string ConfigDll = "OpenSim.Grid.GridServer.Config.dll"; + private string GridDll = "OpenSim.Framework.Data.MySQL.dll"; + public GridConfig Cfg; + + public static OpenGrid_Main thegrid; + protected IGenericConfig localXMLConfig; + + public static bool setuponly; + + //public LLUUID highestUUID; + + // private SimProfileManager m_simProfileManager; + + private GridManager m_gridManager; + + private LogBase m_console; + + [STAThread] + public static void Main(string[] args) + { + if (args.Length > 0) + { + if (args[0] == "-setuponly") setuponly = true; + } + Console.WriteLine("Starting...\n"); + + thegrid = new OpenGrid_Main(); + thegrid.Startup(); + + thegrid.Work(); + } + + private void Work() + { + m_console.Notice("Enter help for a list of commands\n"); + + while (true) + { + m_console.MainLogPrompt(); + } + } + + private OpenGrid_Main() + { + m_console = new LogBase("opengrid-gridserver-console.log", "OpenGrid", this, false); + MainLog.Instance = m_console; + + + } + + public void managercallback(string cmd) + { + switch (cmd) + { + case "shutdown": + RunCmd("shutdown", new string[0]); + break; + } + } + + + public void Startup() + { + this.localXMLConfig = new XmlConfig("GridServerConfig.xml"); + this.localXMLConfig.LoadData(); + this.ConfigDB(this.localXMLConfig); + this.localXMLConfig.Close(); + + m_console.Verbose( "Main.cs:Startup() - Loading configuration"); + Cfg = this.LoadConfigDll(this.ConfigDll); + Cfg.InitConfig(); + if (setuponly) Environment.Exit(0); + + m_console.Verbose( "Main.cs:Startup() - Connecting to Storage Server"); + m_gridManager = new GridManager(); + m_gridManager.AddPlugin(GridDll); // Made of win + m_gridManager.config = Cfg; + + m_console.Verbose( "Main.cs:Startup() - Starting HTTP process"); + BaseHttpServer httpServer = new BaseHttpServer(8001); + //GridManagementAgent GridManagerAgent = new GridManagementAgent(httpServer, "gridserver", Cfg.SimSendKey, Cfg.SimRecvKey, managercallback); + + httpServer.AddXmlRPCHandler("simulator_login", m_gridManager.XmlRpcSimulatorLoginMethod); + httpServer.AddXmlRPCHandler("simulator_data_request", m_gridManager.XmlRpcSimulatorDataRequestMethod); + httpServer.AddXmlRPCHandler("map_block", m_gridManager.XmlRpcMapBlockMethod); + + httpServer.AddStreamHandler(new RestStreamHandler("GET", "/sims/", m_gridManager.RestGetSimMethod )); + httpServer.AddStreamHandler(new RestStreamHandler("POST", "/sims/", m_gridManager.RestSetSimMethod )); + + httpServer.AddStreamHandler( new RestStreamHandler("GET", "/regions/", m_gridManager.RestGetRegionMethod )); + httpServer.AddStreamHandler( new RestStreamHandler("POST","/regions/", m_gridManager.RestSetRegionMethod )); + + //httpServer.AddRestHandler("GET", "/sims/", m_gridManager.RestGetSimMethod); + //httpServer.AddRestHandler("POST", "/sims/", m_gridManager.RestSetSimMethod); + //httpServer.AddRestHandler("GET", "/regions/", m_gridManager.RestGetRegionMethod); + //httpServer.AddRestHandler("POST", "/regions/", m_gridManager.RestSetRegionMethod); + + httpServer.Start(); + + m_console.Verbose( "Main.cs:Startup() - Starting sim status checker"); + + Timer simCheckTimer = new Timer(3600000 * 3); // 3 Hours between updates. + simCheckTimer.Elapsed += new ElapsedEventHandler(CheckSims); + simCheckTimer.Enabled = true; + } + + private GridConfig LoadConfigDll(string dllName) + { + Assembly pluginAssembly = Assembly.LoadFrom(dllName); + GridConfig config = null; + + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (pluginType.IsPublic) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IGridConfig", true); + + if (typeInterface != null) + { + IGridConfig plug = (IGridConfig)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + config = plug.GetConfigObject(); + break; + } + + typeInterface = null; + } + } + } + pluginAssembly = null; + return config; + } + + public void CheckSims(object sender, ElapsedEventArgs e) + { + /* + foreach (SimProfileBase sim in m_simProfileManager.SimProfiles.Values) + { + string SimResponse = ""; + try + { + WebRequest CheckSim = WebRequest.Create("http://" + sim.sim_ip + ":" + sim.sim_port.ToString() + "/checkstatus/"); + CheckSim.Method = "GET"; + CheckSim.ContentType = "text/plaintext"; + CheckSim.ContentLength = 0; + + StreamWriter stOut = new StreamWriter(CheckSim.GetRequestStream(), System.Text.Encoding.ASCII); + stOut.Write(""); + stOut.Close(); + + StreamReader stIn = new StreamReader(CheckSim.GetResponse().GetResponseStream()); + SimResponse = stIn.ReadToEnd(); + stIn.Close(); + } + catch + { + } + + if (SimResponse == "OK") + { + m_simProfileManager.SimProfiles[sim.UUID].online = true; + } + else + { + m_simProfileManager.SimProfiles[sim.UUID].online = false; + } + } + */ + } + + public void RunCmd(string cmd, string[] cmdparams) + { + switch (cmd) + { + case "help": + m_console.Notice("shutdown - shutdown the grid (USE CAUTION!)"); + break; + + case "shutdown": + m_console.Close(); + Environment.Exit(0); + break; + } + } + + public void Show(string ShowWhat) + { + } + + private void ConfigDB(IGenericConfig configData) + { + try + { + string attri = ""; + attri = configData.GetAttribute("DataBaseProvider"); + if (attri == "") + { + GridDll = "OpenSim.Framework.Data.DB4o.dll"; + configData.SetAttribute("DataBaseProvider", "OpenSim.Framework.Data.DB4o.dll"); + } + else + { + GridDll = attri; + } + configData.Commit(); + } + catch + { + + } + } + } +} diff --git a/OpenSim/Grid/Old/GridServer/Properties/AssemblyInfo.cs b/OpenSim/Grid/Old/GridServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..62a68a8d8e --- /dev/null +++ b/OpenSim/Grid/Old/GridServer/Properties/AssemblyInfo.cs @@ -0,0 +1,58 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OGS-GridServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OGS-GridServer")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b541b244-3d1d-4625-9003-bc2a3a6a39a4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Grid/Old/GridServer/obj/Debug/OpenSim.Grid.GridServer.pdb b/OpenSim/Grid/Old/GridServer/obj/Debug/OpenSim.Grid.GridServer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..a5be6ba57d744a3b037a420d1a296bf826ac6bf0 GIT binary patch literal 34304 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 QHEOC*lLeYAaJUxuAD~1t-2eap literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Old/GridServer/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Grid/Old/GridServer/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..d271dc35b7e7951ab2f8d6e13a6ad1c07bfedc68 GIT binary patch literal 25104 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 V4NQZ`+UeTBu%~9-afqzF{twHZji~?t literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Old/InventoryServer/InventoryManager.cs b/OpenSim/Grid/Old/InventoryServer/InventoryManager.cs new file mode 100644 index 0000000000..9ca9b5e749 --- /dev/null +++ b/OpenSim/Grid/Old/InventoryServer/InventoryManager.cs @@ -0,0 +1,125 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using OpenGrid.Framework.Data; +using libsecondlife; +using System.Reflection; + +using System.Xml; +using Nwc.XmlRpc; +using OpenSim.Framework.Sims; +using OpenSim.Framework.Inventory; +using OpenSim.Framework.Utilities; + +using System.Security.Cryptography; + +namespace OpenGridServices.InventoryServer +{ + class InventoryManager + { + Dictionary _plugins = new Dictionary(); + + /// + /// Adds a new inventory server plugin - user servers will be requested in the order they were loaded. + /// + /// The filename to the inventory server plugin DLL + public void AddPlugin(string FileName) + { + OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Invenstorage: Attempting to load " + FileName); + Assembly pluginAssembly = Assembly.LoadFrom(FileName); + + OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Invenstorage: Found " + pluginAssembly.GetTypes().Length + " interfaces."); + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IInventoryData", true); + + if (typeInterface != null) + { + IInventoryData plug = (IInventoryData)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + plug.Initialise(); + this._plugins.Add(plug.getName(), plug); + OpenSim.Framework.Console.MainConsole.Instance.Verbose( "Invenstorage: Added IUserData Interface"); + } + + typeInterface = null; + } + } + + pluginAssembly = null; + } + + public List getRootFolders(LLUUID user) + { + foreach (KeyValuePair kvp in _plugins) + { + try + { + return kvp.Value.getUserRootFolders(user); + } + catch (Exception e) + { + OpenSim.Framework.Console.MainConsole.Instance.Notice("Unable to get root folders via " + kvp.Key + " (" + e.ToString() + ")"); + } + } + return null; + } + + public XmlRpcResponse XmlRpcInventoryRequest(XmlRpcRequest request) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + + Hashtable responseData = new Hashtable(); + + // Stuff happens here + + if (requestData.ContainsKey("Access-type")) + { + if (requestData["access-type"] == "rootfolders") + { +// responseData["rootfolders"] = + } + } + else + { + responseData["error"] = "No access-type specified."; + } + + + // Stuff stops happening here + + response.Value = responseData; + return response; + } + } +} diff --git a/OpenSim/Grid/Old/InventoryServer/Main.cs b/OpenSim/Grid/Old/InventoryServer/Main.cs new file mode 100644 index 0000000000..f479a79b7c --- /dev/null +++ b/OpenSim/Grid/Old/InventoryServer/Main.cs @@ -0,0 +1,87 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.IO; +using System.Text; +using libsecondlife; +using OpenSim.Framework.User; +using OpenSim.Framework.Sims; +using OpenSim.Framework.Inventory; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Console; +using OpenSim.Servers; +using OpenSim.Framework.Utilities; + +namespace OpenGridServices.InventoryServer +{ + public class OpenInventory_Main : BaseServer, conscmd_callback + { + ConsoleBase m_console; + InventoryManager m_inventoryManager; + + public static void Main(string[] args) + { + } + + public OpenInventory_Main() + { + m_console = new ConsoleBase("opengrid-inventory-console.log", "OpenInventory", this, false); + MainConsole.Instance = m_console; + } + + public void Startup() + { + MainConsole.Instance.Notice("Initialising inventory manager..."); + m_inventoryManager = new InventoryManager(); + + MainConsole.Instance.Notice("Starting HTTP server"); + BaseHttpServer httpServer = new BaseHttpServer(8004); + + httpServer.AddXmlRPCHandler("rootfolders", m_inventoryManager.XmlRpcInventoryRequest); + //httpServer.AddRestHandler("GET","/rootfolders/",Rest + } + + public void RunCmd(string cmd, string[] cmdparams) + { + switch (cmd) + { + case "shutdown": + m_console.Close(); + Environment.Exit(0); + break; + } + } + + public void Show(string ShowWhat) + { + } + } +} diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.mds b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.mds new file mode 100644 index 0000000000..ed7bc24f3a --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.mds @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.userprefs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.userprefs new file mode 100644 index 0000000000..f221509426 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.userprefs @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.usertasks b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.usertasks new file mode 100644 index 0000000000..d887d0ef8d --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager.usertasks @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/AssemblyInfo.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/AssemblyInfo.cs new file mode 100644 index 0000000000..af4e2756b6 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/BlockingQueue.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/BlockingQueue.cs new file mode 100644 index 0000000000..83685fc3c9 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/BlockingQueue.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading; +using System.Collections.Generic; +using System.Text; + +namespace OpenGridServices.Manager +{ + public class BlockingQueue + { + private Queue _queue = new Queue(); + private object _queueSync = new object(); + + public void Enqueue(T value) + { + lock (_queueSync) + { + _queue.Enqueue(value); + Monitor.Pulse(_queueSync); + } + } + + public T Dequeue() + { + lock (_queueSync) + { + if (_queue.Count < 1) + Monitor.Wait(_queueSync); + + return _queue.Dequeue(); + } + } + } +} diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Connect to grid server.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Connect to grid server.cs new file mode 100644 index 0000000000..0d509ef11e --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Connect to grid server.cs @@ -0,0 +1,16 @@ + +using System; + +namespace OpenGridServices.Manager +{ + + + public partial class Connect to grid server : Gtk.Dialog + { + + public Connect to grid server() + { + this.Build(); + } + } +} diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/ConnectToGridServerDialog.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/ConnectToGridServerDialog.cs new file mode 100644 index 0000000000..8a80b1db2c --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/ConnectToGridServerDialog.cs @@ -0,0 +1,29 @@ +using Gtk; +using System; + +namespace OpenGridServices.Manager { + public partial class ConnectToGridServerDialog : Gtk.Dialog + { + + public ConnectToGridServerDialog() + { + this.Build(); + } + + protected virtual void OnResponse(object o, Gtk.ResponseArgs args) + { + switch(args.ResponseId) { + case Gtk.ResponseType.Ok: + MainClass.PendingOperations.Enqueue("connect_to_gridserver " + this.entry1.Text + " " + this.entry2.Text + " " + this.entry3.Text); + break; + + case Gtk.ResponseType.Cancel: + break; + } + this.Hide(); + + } + + } + +} \ No newline at end of file diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/GridServerConnectionManager.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/GridServerConnectionManager.cs new file mode 100644 index 0000000000..6b632d69e5 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/GridServerConnectionManager.cs @@ -0,0 +1,106 @@ +using Nwc.XmlRpc; +using System; +using System.Net; +using System.IO; +using System.Xml; +using System.Collections; +using System.Collections.Generic; +using libsecondlife; + +namespace OpenGridServices.Manager +{ + public class GridServerConnectionManager + { + private string ServerURL; + public LLUUID SessionID; + public bool connected=false; + + public RegionBlock[][] WorldMap; + + public bool Connect(string GridServerURL, string username, string password) + { + try { + this.ServerURL=GridServerURL; + Hashtable LoginParamsHT = new Hashtable(); + LoginParamsHT["username"]=username; + LoginParamsHT["password"]=password; + ArrayList LoginParams = new ArrayList(); + LoginParams.Add(LoginParamsHT); + XmlRpcRequest GridLoginReq = new XmlRpcRequest("manager_login",LoginParams); + XmlRpcResponse GridResp = GridLoginReq.Send(ServerURL,3000); + if(GridResp.IsFault) { + connected=false; + return false; + } else { + Hashtable gridrespData = (Hashtable)GridResp.Value; + this.SessionID = new LLUUID((string)gridrespData["session_id"]); + connected=true; + return true; + } + } catch(Exception e) { + Console.WriteLine(e.ToString()); + connected=false; + return false; + } + } + + public void DownloadMap() + { + System.Net.WebClient mapdownloader = new WebClient(); + Stream regionliststream = mapdownloader.OpenRead(ServerURL + "/regionlist"); + + RegionBlock TempRegionData; + + XmlDocument doc = new XmlDocument(); + doc.Load(regionliststream); + regionliststream.Close(); + XmlNode rootnode = doc.FirstChild; + if (rootnode.Name != "regions") + { + // TODO - ERROR! + } + + for(int i=0; i<=rootnode.ChildNodes.Count; i++) + { + if(rootnode.ChildNodes.Item(i).Name != "region") { + // TODO - ERROR! + } else { + TempRegionData = new RegionBlock(); + + + } + } + } + + public bool RestartServer() + { + return true; + } + + public bool ShutdownServer() + { + try { + Hashtable ShutdownParamsHT = new Hashtable(); + ArrayList ShutdownParams = new ArrayList(); + ShutdownParamsHT["session_id"]=this.SessionID.ToString(); + ShutdownParams.Add(ShutdownParamsHT); + XmlRpcRequest GridShutdownReq = new XmlRpcRequest("shutdown",ShutdownParams); + XmlRpcResponse GridResp = GridShutdownReq.Send(this.ServerURL,3000); + if(GridResp.IsFault) { + return false; + } else { + connected=false; + return true; + } + } catch(Exception e) { + Console.WriteLine(e.ToString()); + return false; + } + } + + public void DisconnectServer() + { + this.connected=false; + } + } +} diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Main.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Main.cs new file mode 100644 index 0000000000..42e09e0990 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/Main.cs @@ -0,0 +1,96 @@ +// project created on 5/14/2007 at 2:04 PM +using System; +using System.Threading; +using Gtk; + +namespace OpenGridServices.Manager +{ + class MainClass + { + + public static bool QuitReq=false; + public static BlockingQueue PendingOperations = new BlockingQueue(); + + private static Thread OperationsRunner; + + private static GridServerConnectionManager gridserverConn; + + private static MainWindow win; + + public static void DoMainLoop() + { + while(!QuitReq) + { + Application.RunIteration(); + } + } + + public static void RunOperations() + { + string operation; + string cmd; + char[] sep = new char[1]; + sep[0]=' '; + while(!QuitReq) + { + operation=PendingOperations.Dequeue(); + Console.WriteLine(operation); + cmd = operation.Split(sep)[0]; + switch(cmd) { + case "connect_to_gridserver": + win.SetStatus("Connecting to grid server..."); + if(gridserverConn.Connect(operation.Split(sep)[1],operation.Split(sep)[2],operation.Split(sep)[3])) { + win.SetStatus("Connected OK with session ID:" + gridserverConn.SessionID); + win.SetGridServerConnected(true); + Thread.Sleep(3000); + win.SetStatus("Downloading region maps..."); + gridserverConn.DownloadMap(); + } else { + win.SetStatus("Could not connect"); + } + break; + + case "restart_gridserver": + win.SetStatus("Restarting grid server..."); + if(gridserverConn.RestartServer()) { + win.SetStatus("Restarted server OK"); + Thread.Sleep(3000); + win.SetStatus(""); + } else { + win.SetStatus("Error restarting grid server!!!"); + } + break; + + case "shutdown_gridserver": + win.SetStatus("Shutting down grid server..."); + if(gridserverConn.ShutdownServer()) { + win.SetStatus("Grid server shutdown"); + win.SetGridServerConnected(false); + Thread.Sleep(3000); + win.SetStatus(""); + } else { + win.SetStatus("Could not shutdown grid server!!!"); + } + break; + + case "disconnect_gridserver": + gridserverConn.DisconnectServer(); + win.SetGridServerConnected(false); + break; + } + } + } + + public static void Main (string[] args) + { + gridserverConn = new GridServerConnectionManager(); + Application.Init (); + win = new MainWindow (); + win.Show (); + OperationsRunner = new Thread(new ThreadStart(RunOperations)); + OperationsRunner.IsBackground=true; + OperationsRunner.Start(); + DoMainLoop(); + } + } +} \ No newline at end of file diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/MainWindow.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/MainWindow.cs new file mode 100644 index 0000000000..1db38f05c6 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/MainWindow.cs @@ -0,0 +1,76 @@ +using System; +using Gtk; + +namespace OpenGridServices.Manager { + public partial class MainWindow: Gtk.Window + { + public MainWindow (): base (Gtk.WindowType.Toplevel) + { + Build (); + } + + public void SetStatus(string statustext) + { + this.statusbar1.Pop(0); + this.statusbar1.Push(0,statustext); + } + + public void DrawGrid(RegionBlock[][] regions) + { + for(int x=0; x<=regions.GetUpperBound(0); x++) { + for(int y=0; y<=regions.GetUpperBound(1); y++) { + Gdk.Image themap = new Gdk.Image(Gdk.ImageType.Fastest,Gdk.Visual.System,256,256); + this.drawingarea1.GdkWindow.DrawImage(new Gdk.GC(this.drawingarea1.GdkWindow),themap,0,0,x*256,y*256,256,256); + } + } + } + + public void SetGridServerConnected(bool connected) + { + if(connected) { + this.ConnectToGridserver.Visible=false; + this.DisconnectFromGridServer.Visible=true; + } else { + this.ConnectToGridserver.Visible=true; + this.DisconnectFromGridServer.Visible=false; + } + } + + protected void OnDeleteEvent (object sender, DeleteEventArgs a) + { + Application.Quit (); + MainClass.QuitReq=true; + a.RetVal = true; + } + + protected virtual void QuitMenu(object sender, System.EventArgs e) + { + MainClass.QuitReq=true; + Application.Quit(); + } + + protected virtual void ConnectToGridServerMenu(object sender, System.EventArgs e) + { + ConnectToGridServerDialog griddialog = new ConnectToGridServerDialog (); + griddialog.Show(); + } + + protected virtual void RestartGridserverMenu(object sender, System.EventArgs e) + { + MainClass.PendingOperations.Enqueue("restart_gridserver"); + } + + protected virtual void ShutdownGridserverMenu(object sender, System.EventArgs e) + { + MainClass.PendingOperations.Enqueue("shutdown_gridserver"); + } + + protected virtual void DisconnectGridServerMenu(object sender, System.EventArgs e) + { + MainClass.PendingOperations.Enqueue("disconnect_gridserver"); + } + + } +} + + \ No newline at end of file diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/OpenGridServices.Manager.mdp b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/OpenGridServices.Manager.mdp new file mode 100644 index 0000000000..cfdc085eb8 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/OpenGridServices.Manager.mdp @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/OpenGridServices.Manager.pidb b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/OpenGridServices.Manager.pidb new file mode 100644 index 0000000000000000000000000000000000000000..44e7a619a3168cd0949fe56768cbac1002c4f6bc GIT binary patch literal 12308 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 1) - (min >> 2) + (min >> 4)); + //} + + public static string FieldToString(byte[] bytes) + { + return FieldToString(bytes, String.Empty); + } + + /// + /// Convert a variable length field (byte array) to a string, with a + /// field name prepended to each line of the output + /// + /// If the byte array has unprintable characters in it, a + /// hex dump will be put in the string instead + /// The byte array to convert to a string + /// A field name to prepend to each line of output + /// An ASCII string or a string containing a hex dump, minus + /// the null terminator + public static string FieldToString(byte[] bytes, string fieldName) + { + // Check for a common case + if (bytes.Length == 0) return String.Empty; + + StringBuilder output = new StringBuilder(); + bool printable = true; + + for (int i = 0; i < bytes.Length; ++i) + { + // Check if there are any unprintable characters in the array + if ((bytes[i] < 0x20 || bytes[i] > 0x7E) && bytes[i] != 0x09 + && bytes[i] != 0x0D && bytes[i] != 0x0A && bytes[i] != 0x00) + { + printable = false; + break; + } + } + + if (printable) + { + if (fieldName.Length > 0) + { + output.Append(fieldName); + output.Append(": "); + } + + if (bytes[bytes.Length - 1] == 0x00) + output.Append(UTF8Encoding.UTF8.GetString(bytes, 0, bytes.Length - 1)); + else + output.Append(UTF8Encoding.UTF8.GetString(bytes)); + } + else + { + for (int i = 0; i < bytes.Length; i += 16) + { + if (i != 0) + output.Append(Environment.NewLine); + if (fieldName.Length > 0) + { + output.Append(fieldName); + output.Append(": "); + } + + for (int j = 0; j < 16; j++) + { + if ((i + j) < bytes.Length) + output.Append(String.Format("{0:X2} ", bytes[i + j])); + else + output.Append(" "); + } + + for (int j = 0; j < 16 && (i + j) < bytes.Length; j++) + { + if (bytes[i + j] >= 0x20 && bytes[i + j] < 0x7E) + output.Append((char)bytes[i + j]); + else + output.Append("."); + } + } + } + + return output.ToString(); + } + public Util() + { + + } + } +} diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/OpenGridServices.Manager.ConnectToGridServerDialog.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/OpenGridServices.Manager.ConnectToGridServerDialog.cs new file mode 100644 index 0000000000..da6739e42e --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/OpenGridServices.Manager.ConnectToGridServerDialog.cs @@ -0,0 +1,226 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Mono Runtime Version: 2.0.50727.42 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ + +namespace OpenGridServices.Manager { + + + public partial class ConnectToGridServerDialog { + + private Gtk.VBox vbox2; + + private Gtk.VBox vbox3; + + private Gtk.HBox hbox1; + + private Gtk.Label label1; + + private Gtk.Entry entry1; + + private Gtk.HBox hbox2; + + private Gtk.Label label2; + + private Gtk.Entry entry2; + + private Gtk.HBox hbox3; + + private Gtk.Label label3; + + private Gtk.Entry entry3; + + private Gtk.Button button2; + + private Gtk.Button button8; + + protected virtual void Build() { + Stetic.Gui.Initialize(); + // Widget OpenGridServices.Manager.ConnectToGridServerDialog + this.Events = ((Gdk.EventMask)(256)); + this.Name = "OpenGridServices.Manager.ConnectToGridServerDialog"; + this.Title = Mono.Unix.Catalog.GetString("Connect to Grid server"); + this.WindowPosition = ((Gtk.WindowPosition)(4)); + this.HasSeparator = false; + // Internal child OpenGridServices.Manager.ConnectToGridServerDialog.VBox + Gtk.VBox w1 = this.VBox; + w1.Events = ((Gdk.EventMask)(256)); + w1.Name = "dialog_VBox"; + w1.BorderWidth = ((uint)(2)); + // Container child dialog_VBox.Gtk.Box+BoxChild + this.vbox2 = new Gtk.VBox(); + this.vbox2.Name = "vbox2"; + // Container child vbox2.Gtk.Box+BoxChild + this.vbox3 = new Gtk.VBox(); + this.vbox3.Name = "vbox3"; + // Container child vbox3.Gtk.Box+BoxChild + this.hbox1 = new Gtk.HBox(); + this.hbox1.Name = "hbox1"; + // Container child hbox1.Gtk.Box+BoxChild + this.label1 = new Gtk.Label(); + this.label1.Name = "label1"; + this.label1.Xalign = 1F; + this.label1.LabelProp = Mono.Unix.Catalog.GetString("Grid server URL: "); + this.label1.Justify = ((Gtk.Justification)(1)); + this.hbox1.Add(this.label1); + Gtk.Box.BoxChild w2 = ((Gtk.Box.BoxChild)(this.hbox1[this.label1])); + w2.Position = 0; + // Container child hbox1.Gtk.Box+BoxChild + this.entry1 = new Gtk.Entry(); + this.entry1.CanFocus = true; + this.entry1.Name = "entry1"; + this.entry1.Text = Mono.Unix.Catalog.GetString("http://gridserver:8001"); + this.entry1.IsEditable = true; + this.entry1.MaxLength = 255; + this.entry1.InvisibleChar = '•'; + this.hbox1.Add(this.entry1); + Gtk.Box.BoxChild w3 = ((Gtk.Box.BoxChild)(this.hbox1[this.entry1])); + w3.Position = 1; + this.vbox3.Add(this.hbox1); + Gtk.Box.BoxChild w4 = ((Gtk.Box.BoxChild)(this.vbox3[this.hbox1])); + w4.Position = 0; + w4.Expand = false; + w4.Fill = false; + // Container child vbox3.Gtk.Box+BoxChild + this.hbox2 = new Gtk.HBox(); + this.hbox2.Name = "hbox2"; + // Container child hbox2.Gtk.Box+BoxChild + this.label2 = new Gtk.Label(); + this.label2.Name = "label2"; + this.label2.Xalign = 1F; + this.label2.LabelProp = Mono.Unix.Catalog.GetString("Username:"); + this.label2.Justify = ((Gtk.Justification)(1)); + this.hbox2.Add(this.label2); + Gtk.Box.BoxChild w5 = ((Gtk.Box.BoxChild)(this.hbox2[this.label2])); + w5.Position = 0; + // Container child hbox2.Gtk.Box+BoxChild + this.entry2 = new Gtk.Entry(); + this.entry2.CanFocus = true; + this.entry2.Name = "entry2"; + this.entry2.IsEditable = true; + this.entry2.InvisibleChar = '•'; + this.hbox2.Add(this.entry2); + Gtk.Box.BoxChild w6 = ((Gtk.Box.BoxChild)(this.hbox2[this.entry2])); + w6.Position = 1; + this.vbox3.Add(this.hbox2); + Gtk.Box.BoxChild w7 = ((Gtk.Box.BoxChild)(this.vbox3[this.hbox2])); + w7.Position = 1; + w7.Expand = false; + w7.Fill = false; + // Container child vbox3.Gtk.Box+BoxChild + this.hbox3 = new Gtk.HBox(); + this.hbox3.Name = "hbox3"; + // Container child hbox3.Gtk.Box+BoxChild + this.label3 = new Gtk.Label(); + this.label3.Name = "label3"; + this.label3.Xalign = 1F; + this.label3.LabelProp = Mono.Unix.Catalog.GetString("Password:"); + this.label3.Justify = ((Gtk.Justification)(1)); + this.hbox3.Add(this.label3); + Gtk.Box.BoxChild w8 = ((Gtk.Box.BoxChild)(this.hbox3[this.label3])); + w8.Position = 0; + // Container child hbox3.Gtk.Box+BoxChild + this.entry3 = new Gtk.Entry(); + this.entry3.CanFocus = true; + this.entry3.Name = "entry3"; + this.entry3.IsEditable = true; + this.entry3.InvisibleChar = '•'; + this.hbox3.Add(this.entry3); + Gtk.Box.BoxChild w9 = ((Gtk.Box.BoxChild)(this.hbox3[this.entry3])); + w9.Position = 1; + this.vbox3.Add(this.hbox3); + Gtk.Box.BoxChild w10 = ((Gtk.Box.BoxChild)(this.vbox3[this.hbox3])); + w10.Position = 2; + w10.Expand = false; + w10.Fill = false; + this.vbox2.Add(this.vbox3); + Gtk.Box.BoxChild w11 = ((Gtk.Box.BoxChild)(this.vbox2[this.vbox3])); + w11.Position = 2; + w11.Expand = false; + w11.Fill = false; + w1.Add(this.vbox2); + Gtk.Box.BoxChild w12 = ((Gtk.Box.BoxChild)(w1[this.vbox2])); + w12.Position = 0; + // Internal child OpenGridServices.Manager.ConnectToGridServerDialog.ActionArea + Gtk.HButtonBox w13 = this.ActionArea; + w13.Events = ((Gdk.EventMask)(256)); + w13.Name = "OpenGridServices.Manager.ConnectToGridServerDialog_ActionArea"; + w13.Spacing = 6; + w13.BorderWidth = ((uint)(5)); + w13.LayoutStyle = ((Gtk.ButtonBoxStyle)(4)); + // Container child OpenGridServices.Manager.ConnectToGridServerDialog_ActionArea.Gtk.ButtonBox+ButtonBoxChild + this.button2 = new Gtk.Button(); + this.button2.CanDefault = true; + this.button2.CanFocus = true; + this.button2.Name = "button2"; + this.button2.UseUnderline = true; + // Container child button2.Gtk.Container+ContainerChild + Gtk.Alignment w14 = new Gtk.Alignment(0.5F, 0.5F, 0F, 0F); + w14.Name = "GtkAlignment"; + // Container child GtkAlignment.Gtk.Container+ContainerChild + Gtk.HBox w15 = new Gtk.HBox(); + w15.Name = "GtkHBox"; + w15.Spacing = 2; + // Container child GtkHBox.Gtk.Container+ContainerChild + Gtk.Image w16 = new Gtk.Image(); + w16.Name = "image1"; + w16.Pixbuf = Gtk.IconTheme.Default.LoadIcon("gtk-apply", 16, 0); + w15.Add(w16); + // Container child GtkHBox.Gtk.Container+ContainerChild + Gtk.Label w18 = new Gtk.Label(); + w18.Name = "GtkLabel"; + w18.LabelProp = Mono.Unix.Catalog.GetString("Connect"); + w18.UseUnderline = true; + w15.Add(w18); + w14.Add(w15); + this.button2.Add(w14); + this.AddActionWidget(this.button2, -5); + Gtk.ButtonBox.ButtonBoxChild w22 = ((Gtk.ButtonBox.ButtonBoxChild)(w13[this.button2])); + w22.Expand = false; + w22.Fill = false; + // Container child OpenGridServices.Manager.ConnectToGridServerDialog_ActionArea.Gtk.ButtonBox+ButtonBoxChild + this.button8 = new Gtk.Button(); + this.button8.CanDefault = true; + this.button8.CanFocus = true; + this.button8.Name = "button8"; + this.button8.UseUnderline = true; + // Container child button8.Gtk.Container+ContainerChild + Gtk.Alignment w23 = new Gtk.Alignment(0.5F, 0.5F, 0F, 0F); + w23.Name = "GtkAlignment1"; + // Container child GtkAlignment1.Gtk.Container+ContainerChild + Gtk.HBox w24 = new Gtk.HBox(); + w24.Name = "GtkHBox1"; + w24.Spacing = 2; + // Container child GtkHBox1.Gtk.Container+ContainerChild + Gtk.Image w25 = new Gtk.Image(); + w25.Name = "image2"; + w25.Pixbuf = Gtk.IconTheme.Default.LoadIcon("gtk-cancel", 16, 0); + w24.Add(w25); + // Container child GtkHBox1.Gtk.Container+ContainerChild + Gtk.Label w27 = new Gtk.Label(); + w27.Name = "GtkLabel1"; + w27.LabelProp = Mono.Unix.Catalog.GetString("Cancel"); + w27.UseUnderline = true; + w24.Add(w27); + w23.Add(w24); + this.button8.Add(w23); + this.AddActionWidget(this.button8, -6); + Gtk.ButtonBox.ButtonBoxChild w31 = ((Gtk.ButtonBox.ButtonBoxChild)(w13[this.button8])); + w31.Position = 1; + w31.Expand = false; + w31.Fill = false; + if ((this.Child != null)) { + this.Child.ShowAll(); + } + this.DefaultWidth = 476; + this.DefaultHeight = 137; + this.Show(); + this.Response += new Gtk.ResponseHandler(this.OnResponse); + } + } +} diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/OpenGridServices.Manager.MainWindow.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/OpenGridServices.Manager.MainWindow.cs new file mode 100644 index 0000000000..8798dac97b --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/OpenGridServices.Manager.MainWindow.cs @@ -0,0 +1,256 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Mono Runtime Version: 2.0.50727.42 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ + +namespace OpenGridServices.Manager { + + + public partial class MainWindow { + + private Gtk.Action Grid; + + private Gtk.Action User; + + private Gtk.Action Asset; + + private Gtk.Action Region; + + private Gtk.Action Services; + + private Gtk.Action ConnectToGridserver; + + private Gtk.Action RestartWholeGrid; + + private Gtk.Action ShutdownWholeGrid; + + private Gtk.Action ExitGridManager; + + private Gtk.Action ConnectToUserserver; + + private Gtk.Action AccountManagment; + + private Gtk.Action GlobalNotice; + + private Gtk.Action DisableAllLogins; + + private Gtk.Action DisableNonGodUsersOnly; + + private Gtk.Action ShutdownUserServer; + + private Gtk.Action ShutdownGridserverOnly; + + private Gtk.Action RestartGridserverOnly; + + private Gtk.Action DefaultLocalGridUserserver; + + private Gtk.Action CustomUserserver; + + private Gtk.Action RemoteGridDefaultUserserver; + + private Gtk.Action DisconnectFromGridServer; + + private Gtk.Action UploadAsset; + + private Gtk.Action AssetManagement; + + private Gtk.Action ConnectToAssetServer; + + private Gtk.Action ConnectToDefaultAssetServerForGrid; + + private Gtk.Action DefaultForLocalGrid; + + private Gtk.Action DefaultForRemoteGrid; + + private Gtk.Action CustomAssetServer; + + private Gtk.VBox vbox1; + + private Gtk.MenuBar menubar2; + + private Gtk.HBox hbox1; + + private Gtk.ScrolledWindow scrolledwindow1; + + private Gtk.DrawingArea drawingarea1; + + private Gtk.TreeView treeview1; + + private Gtk.Statusbar statusbar1; + + protected virtual void Build() { + Stetic.Gui.Initialize(); + // Widget OpenGridServices.Manager.MainWindow + Gtk.UIManager w1 = new Gtk.UIManager(); + Gtk.ActionGroup w2 = new Gtk.ActionGroup("Default"); + this.Grid = new Gtk.Action("Grid", Mono.Unix.Catalog.GetString("Grid"), null, null); + this.Grid.HideIfEmpty = false; + this.Grid.ShortLabel = Mono.Unix.Catalog.GetString("Grid"); + w2.Add(this.Grid, "g"); + this.User = new Gtk.Action("User", Mono.Unix.Catalog.GetString("User"), null, null); + this.User.HideIfEmpty = false; + this.User.ShortLabel = Mono.Unix.Catalog.GetString("User"); + w2.Add(this.User, null); + this.Asset = new Gtk.Action("Asset", Mono.Unix.Catalog.GetString("Asset"), null, null); + this.Asset.HideIfEmpty = false; + this.Asset.ShortLabel = Mono.Unix.Catalog.GetString("Asset"); + w2.Add(this.Asset, null); + this.Region = new Gtk.Action("Region", Mono.Unix.Catalog.GetString("Region"), null, null); + this.Region.ShortLabel = Mono.Unix.Catalog.GetString("Region"); + w2.Add(this.Region, null); + this.Services = new Gtk.Action("Services", Mono.Unix.Catalog.GetString("Services"), null, null); + this.Services.ShortLabel = Mono.Unix.Catalog.GetString("Services"); + w2.Add(this.Services, null); + this.ConnectToGridserver = new Gtk.Action("ConnectToGridserver", Mono.Unix.Catalog.GetString("Connect to gridserver..."), null, "gtk-connect"); + this.ConnectToGridserver.HideIfEmpty = false; + this.ConnectToGridserver.ShortLabel = Mono.Unix.Catalog.GetString("Connect to gridserver"); + w2.Add(this.ConnectToGridserver, null); + this.RestartWholeGrid = new Gtk.Action("RestartWholeGrid", Mono.Unix.Catalog.GetString("Restart whole grid"), null, "gtk-refresh"); + this.RestartWholeGrid.ShortLabel = Mono.Unix.Catalog.GetString("Restart whole grid"); + w2.Add(this.RestartWholeGrid, null); + this.ShutdownWholeGrid = new Gtk.Action("ShutdownWholeGrid", Mono.Unix.Catalog.GetString("Shutdown whole grid"), null, "gtk-stop"); + this.ShutdownWholeGrid.ShortLabel = Mono.Unix.Catalog.GetString("Shutdown whole grid"); + w2.Add(this.ShutdownWholeGrid, null); + this.ExitGridManager = new Gtk.Action("ExitGridManager", Mono.Unix.Catalog.GetString("Exit grid manager"), null, "gtk-close"); + this.ExitGridManager.ShortLabel = Mono.Unix.Catalog.GetString("Exit grid manager"); + w2.Add(this.ExitGridManager, null); + this.ConnectToUserserver = new Gtk.Action("ConnectToUserserver", Mono.Unix.Catalog.GetString("Connect to userserver"), null, "gtk-connect"); + this.ConnectToUserserver.ShortLabel = Mono.Unix.Catalog.GetString("Connect to userserver"); + w2.Add(this.ConnectToUserserver, null); + this.AccountManagment = new Gtk.Action("AccountManagment", Mono.Unix.Catalog.GetString("Account managment"), null, "gtk-properties"); + this.AccountManagment.ShortLabel = Mono.Unix.Catalog.GetString("Account managment"); + w2.Add(this.AccountManagment, null); + this.GlobalNotice = new Gtk.Action("GlobalNotice", Mono.Unix.Catalog.GetString("Global notice"), null, "gtk-network"); + this.GlobalNotice.ShortLabel = Mono.Unix.Catalog.GetString("Global notice"); + w2.Add(this.GlobalNotice, null); + this.DisableAllLogins = new Gtk.Action("DisableAllLogins", Mono.Unix.Catalog.GetString("Disable all logins"), null, "gtk-no"); + this.DisableAllLogins.ShortLabel = Mono.Unix.Catalog.GetString("Disable all logins"); + w2.Add(this.DisableAllLogins, null); + this.DisableNonGodUsersOnly = new Gtk.Action("DisableNonGodUsersOnly", Mono.Unix.Catalog.GetString("Disable non-god users only"), null, "gtk-no"); + this.DisableNonGodUsersOnly.ShortLabel = Mono.Unix.Catalog.GetString("Disable non-god users only"); + w2.Add(this.DisableNonGodUsersOnly, null); + this.ShutdownUserServer = new Gtk.Action("ShutdownUserServer", Mono.Unix.Catalog.GetString("Shutdown user server"), null, "gtk-stop"); + this.ShutdownUserServer.ShortLabel = Mono.Unix.Catalog.GetString("Shutdown user server"); + w2.Add(this.ShutdownUserServer, null); + this.ShutdownGridserverOnly = new Gtk.Action("ShutdownGridserverOnly", Mono.Unix.Catalog.GetString("Shutdown gridserver only"), null, "gtk-stop"); + this.ShutdownGridserverOnly.ShortLabel = Mono.Unix.Catalog.GetString("Shutdown gridserver only"); + w2.Add(this.ShutdownGridserverOnly, null); + this.RestartGridserverOnly = new Gtk.Action("RestartGridserverOnly", Mono.Unix.Catalog.GetString("Restart gridserver only"), null, "gtk-refresh"); + this.RestartGridserverOnly.ShortLabel = Mono.Unix.Catalog.GetString("Restart gridserver only"); + w2.Add(this.RestartGridserverOnly, null); + this.DefaultLocalGridUserserver = new Gtk.Action("DefaultLocalGridUserserver", Mono.Unix.Catalog.GetString("Default local grid userserver"), null, null); + this.DefaultLocalGridUserserver.ShortLabel = Mono.Unix.Catalog.GetString("Default local grid userserver"); + w2.Add(this.DefaultLocalGridUserserver, null); + this.CustomUserserver = new Gtk.Action("CustomUserserver", Mono.Unix.Catalog.GetString("Custom userserver..."), null, null); + this.CustomUserserver.ShortLabel = Mono.Unix.Catalog.GetString("Custom userserver"); + w2.Add(this.CustomUserserver, null); + this.RemoteGridDefaultUserserver = new Gtk.Action("RemoteGridDefaultUserserver", Mono.Unix.Catalog.GetString("Remote grid default userserver..."), null, null); + this.RemoteGridDefaultUserserver.ShortLabel = Mono.Unix.Catalog.GetString("Remote grid default userserver"); + w2.Add(this.RemoteGridDefaultUserserver, null); + this.DisconnectFromGridServer = new Gtk.Action("DisconnectFromGridServer", Mono.Unix.Catalog.GetString("Disconnect from grid server"), null, "gtk-disconnect"); + this.DisconnectFromGridServer.ShortLabel = Mono.Unix.Catalog.GetString("Disconnect from grid server"); + this.DisconnectFromGridServer.Visible = false; + w2.Add(this.DisconnectFromGridServer, null); + this.UploadAsset = new Gtk.Action("UploadAsset", Mono.Unix.Catalog.GetString("Upload asset"), null, null); + this.UploadAsset.ShortLabel = Mono.Unix.Catalog.GetString("Upload asset"); + w2.Add(this.UploadAsset, null); + this.AssetManagement = new Gtk.Action("AssetManagement", Mono.Unix.Catalog.GetString("Asset management"), null, null); + this.AssetManagement.ShortLabel = Mono.Unix.Catalog.GetString("Asset management"); + w2.Add(this.AssetManagement, null); + this.ConnectToAssetServer = new Gtk.Action("ConnectToAssetServer", Mono.Unix.Catalog.GetString("Connect to asset server"), null, null); + this.ConnectToAssetServer.ShortLabel = Mono.Unix.Catalog.GetString("Connect to asset server"); + w2.Add(this.ConnectToAssetServer, null); + this.ConnectToDefaultAssetServerForGrid = new Gtk.Action("ConnectToDefaultAssetServerForGrid", Mono.Unix.Catalog.GetString("Connect to default asset server for grid"), null, null); + this.ConnectToDefaultAssetServerForGrid.ShortLabel = Mono.Unix.Catalog.GetString("Connect to default asset server for grid"); + w2.Add(this.ConnectToDefaultAssetServerForGrid, null); + this.DefaultForLocalGrid = new Gtk.Action("DefaultForLocalGrid", Mono.Unix.Catalog.GetString("Default for local grid"), null, null); + this.DefaultForLocalGrid.ShortLabel = Mono.Unix.Catalog.GetString("Default for local grid"); + w2.Add(this.DefaultForLocalGrid, null); + this.DefaultForRemoteGrid = new Gtk.Action("DefaultForRemoteGrid", Mono.Unix.Catalog.GetString("Default for remote grid..."), null, null); + this.DefaultForRemoteGrid.ShortLabel = Mono.Unix.Catalog.GetString("Default for remote grid..."); + w2.Add(this.DefaultForRemoteGrid, null); + this.CustomAssetServer = new Gtk.Action("CustomAssetServer", Mono.Unix.Catalog.GetString("Custom asset server..."), null, null); + this.CustomAssetServer.ShortLabel = Mono.Unix.Catalog.GetString("Custom asset server..."); + w2.Add(this.CustomAssetServer, null); + w1.InsertActionGroup(w2, 0); + this.AddAccelGroup(w1.AccelGroup); + this.WidthRequest = 800; + this.HeightRequest = 600; + this.Name = "OpenGridServices.Manager.MainWindow"; + this.Title = Mono.Unix.Catalog.GetString("Open Grid Services Manager"); + this.Icon = Gtk.IconTheme.Default.LoadIcon("gtk-network", 48, 0); + // Container child OpenGridServices.Manager.MainWindow.Gtk.Container+ContainerChild + this.vbox1 = new Gtk.VBox(); + this.vbox1.Name = "vbox1"; + // Container child vbox1.Gtk.Box+BoxChild + w1.AddUiFromString(""); + this.menubar2 = ((Gtk.MenuBar)(w1.GetWidget("/menubar2"))); + this.menubar2.HeightRequest = 25; + this.menubar2.Name = "menubar2"; + this.vbox1.Add(this.menubar2); + Gtk.Box.BoxChild w3 = ((Gtk.Box.BoxChild)(this.vbox1[this.menubar2])); + w3.Position = 0; + w3.Expand = false; + w3.Fill = false; + // Container child vbox1.Gtk.Box+BoxChild + this.hbox1 = new Gtk.HBox(); + this.hbox1.Name = "hbox1"; + // Container child hbox1.Gtk.Box+BoxChild + this.scrolledwindow1 = new Gtk.ScrolledWindow(); + this.scrolledwindow1.CanFocus = true; + this.scrolledwindow1.Name = "scrolledwindow1"; + this.scrolledwindow1.VscrollbarPolicy = ((Gtk.PolicyType)(1)); + this.scrolledwindow1.HscrollbarPolicy = ((Gtk.PolicyType)(1)); + // Container child scrolledwindow1.Gtk.Container+ContainerChild + Gtk.Viewport w4 = new Gtk.Viewport(); + w4.Name = "GtkViewport"; + w4.ShadowType = ((Gtk.ShadowType)(0)); + // Container child GtkViewport.Gtk.Container+ContainerChild + this.drawingarea1 = new Gtk.DrawingArea(); + this.drawingarea1.Name = "drawingarea1"; + w4.Add(this.drawingarea1); + this.scrolledwindow1.Add(w4); + this.hbox1.Add(this.scrolledwindow1); + Gtk.Box.BoxChild w7 = ((Gtk.Box.BoxChild)(this.hbox1[this.scrolledwindow1])); + w7.Position = 1; + // Container child hbox1.Gtk.Box+BoxChild + this.treeview1 = new Gtk.TreeView(); + this.treeview1.CanFocus = true; + this.treeview1.Name = "treeview1"; + this.hbox1.Add(this.treeview1); + Gtk.Box.BoxChild w8 = ((Gtk.Box.BoxChild)(this.hbox1[this.treeview1])); + w8.Position = 2; + this.vbox1.Add(this.hbox1); + Gtk.Box.BoxChild w9 = ((Gtk.Box.BoxChild)(this.vbox1[this.hbox1])); + w9.Position = 1; + // Container child vbox1.Gtk.Box+BoxChild + this.statusbar1 = new Gtk.Statusbar(); + this.statusbar1.Name = "statusbar1"; + this.statusbar1.Spacing = 5; + this.vbox1.Add(this.statusbar1); + Gtk.Box.BoxChild w10 = ((Gtk.Box.BoxChild)(this.vbox1[this.statusbar1])); + w10.PackType = ((Gtk.PackType)(1)); + w10.Position = 2; + w10.Expand = false; + w10.Fill = false; + this.Add(this.vbox1); + if ((this.Child != null)) { + this.Child.ShowAll(); + } + this.DefaultWidth = 800; + this.DefaultHeight = 800; + this.Show(); + this.DeleteEvent += new Gtk.DeleteEventHandler(this.OnDeleteEvent); + this.ConnectToGridserver.Activated += new System.EventHandler(this.ConnectToGridServerMenu); + this.ExitGridManager.Activated += new System.EventHandler(this.QuitMenu); + this.ShutdownGridserverOnly.Activated += new System.EventHandler(this.ShutdownGridserverMenu); + this.RestartGridserverOnly.Activated += new System.EventHandler(this.RestartGridserverMenu); + this.DisconnectFromGridServer.Activated += new System.EventHandler(this.DisconnectGridServerMenu); + } + } +} diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/generated.cs b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/generated.cs new file mode 100644 index 0000000000..dd4abddae9 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/generated.cs @@ -0,0 +1,35 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Mono Runtime Version: 2.0.50727.42 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ + +namespace Stetic { + + + internal class Gui { + + private static bool initialized; + + internal static void Initialize() { + if ((Stetic.Gui.initialized == false)) { + Stetic.Gui.initialized = true; + } + } + } + + internal class ActionGroups { + + public static Gtk.ActionGroup GetActionGroup(System.Type type) { + return Stetic.ActionGroups.GetActionGroup(type.FullName); + } + + public static Gtk.ActionGroup GetActionGroup(string name) { + return null; + } + } +} diff --git a/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/gui.stetic b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/gui.stetic new file mode 100644 index 0000000000..c883f08b63 --- /dev/null +++ b/OpenSim/Grid/Old/Manager/OpenGridServices.Manager/gtk-gui/gui.stetic @@ -0,0 +1,502 @@ + + + + + + Action + <Alt><Mod2>g + False + Grid + Grid + + + Action + False + User + User + + + Action + False + Asset + Asset + + + Action + Region + Region + + + Action + Services + Services + + + Action + False + Connect to gridserver... + Connect to gridserver + gtk-connect + + + + Action + Restart whole grid + Restart whole grid + gtk-refresh + + + Action + Shutdown whole grid + Shutdown whole grid + gtk-stop + + + Action + Exit grid manager + Exit grid manager + gtk-close + + + + Action + Connect to userserver + Connect to userserver + gtk-connect + + + Action + Account managment + Account managment + gtk-properties + + + Action + Global notice + Global notice + gtk-network + + + Action + Disable all logins + Disable all logins + gtk-no + + + Action + Disable non-god users only + Disable non-god users only + gtk-no + + + Action + Shutdown user server + Shutdown user server + gtk-stop + + + Action + Shutdown gridserver only + Shutdown gridserver only + gtk-stop + + + + Action + Restart gridserver only + Restart gridserver only + gtk-refresh + + + + Action + Default local grid userserver + Default local grid userserver + + + Action + Custom userserver... + Custom userserver + + + Action + Remote grid default userserver... + Remote grid default userserver + + + Action + Disconnect from grid server + Disconnect from grid server + gtk-disconnect + False + + + + Action + Upload asset + Upload asset + + + Action + Asset management + Asset management + + + Action + Connect to asset server + Connect to asset server + + + Action + Connect to default asset server for grid + Connect to default asset server for grid + + + Action + Default for local grid + Default for local grid + + + Action + Default for remote grid... + Default for remote grid... + + + Action + Custom asset server... + Custom asset server... + + + + 800 + 600 + Open Grid Services Manager + stock:gtk-network Dialog + + + + + + + + 25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + False + False + False + + + + + + + + + + + + True + Automatic + Automatic + + + + None + + + + + + + + + + 1 + True + + + + + + True + + + 2 + True + + + + + 1 + True + + + + + statusBar1 + 5 + + + + + + + + + End + 2 + False + False + False + + + + + + + + ButtonPressMask + Connect to Grid server + CenterOnParent + 2 + False + False + + + + + ButtonPressMask + 2 + + + + + + + + + + + + + + + + + + + 1 + Grid server URL: + Right + + + 0 + False + + + + + + True + http://gridserver:8001 + True + 255 + • + + + 1 + False + + + + + + + + 0 + True + False + False + + + + + + + + + 1 + Username: + Right + + + 0 + False + + + + + + True + True + • + + + 1 + True + + + + + + + + 1 + False + False + False + + + + + + + + + 1 + Password: + Right + + + 0 + False + + + + + + True + True + • + + + 1 + True + + + + + + + + 2 + True + False + False + + + + + 2 + True + False + False + + + + + 0 + True + + + + + + + + ButtonPressMask + 6 + 5 + 2 + End + + + + True + True + TextAndIcon + stock:gtk-apply Menu + Connect + True + True + -5 + + + False + False + + + + + + True + True + TextAndIcon + stock:gtk-cancel Menu + Cancel + True + True + -6 + + + 1 + False + False + + + + + + \ No newline at end of file diff --git a/OpenSim/Grid/Old/UserServer.Config/AssemblyInfo.cs b/OpenSim/Grid/Old/UserServer.Config/AssemblyInfo.cs new file mode 100644 index 0000000000..15298e84f1 --- /dev/null +++ b/OpenSim/Grid/Old/UserServer.Config/AssemblyInfo.cs @@ -0,0 +1,56 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("UserConfig")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UserConfig")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] diff --git a/OpenSim/Grid/Old/UserServer.Config/DbUserConfig.cs b/OpenSim/Grid/Old/UserServer.Config/DbUserConfig.cs new file mode 100644 index 0000000000..c7f82551b4 --- /dev/null +++ b/OpenSim/Grid/Old/UserServer.Config/DbUserConfig.cs @@ -0,0 +1,95 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using Db4objects.Db4o; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; + +namespace OpenUser.Config.UserConfigDb4o +{ + public class Db4oConfigPlugin: IUserConfig + { + public UserConfig GetConfigObject() + { + MainLog.Instance.Verbose("Loading Db40Config dll"); + return ( new DbUserConfig()); + } + } + + public class DbUserConfig : UserConfig + { + private IObjectContainer db; + + public void LoadDefaults() { + MainLog.Instance.Notice("Config.cs:LoadDefaults() - Please press enter to retain default or enter new settings"); + + this.DefaultStartupMsg = MainLog.Instance.CmdPrompt("Default startup message", "Welcome to OGS"); + + this.GridServerURL = MainLog.Instance.CmdPrompt("Grid server URL","http://127.0.0.1:8001/"); + this.GridSendKey = MainLog.Instance.CmdPrompt("Key to send to grid server","null"); + this.GridRecvKey = MainLog.Instance.CmdPrompt("Key to expect from grid server","null"); + } + + public override void InitConfig() { + try { + db = Db4oFactory.OpenFile("openuser.yap"); + IObjectSet result = db.Get(typeof(DbUserConfig)); + if(result.Count==1) { + MainLog.Instance.Verbose("Config.cs:InitConfig() - Found a UserConfig object in the local database, loading"); + foreach (DbUserConfig cfg in result) { + this.GridServerURL=cfg.GridServerURL; + this.GridSendKey=cfg.GridSendKey; + this.GridRecvKey=cfg.GridRecvKey; + this.DefaultStartupMsg=cfg.DefaultStartupMsg; + } + } else { + MainLog.Instance.Verbose("Config.cs:InitConfig() - Could not find object in database, loading precompiled defaults"); + LoadDefaults(); + MainLog.Instance.Verbose("Writing out default settings to local database"); + db.Set(this); + db.Close(); + } + } catch(Exception e) { + MainLog.Instance.Warn("Config.cs:InitConfig() - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + + MainLog.Instance.Verbose("User settings loaded:"); + MainLog.Instance.Verbose("Default startup message: " + this.DefaultStartupMsg); + MainLog.Instance.Verbose("Grid server URL: " + this.GridServerURL); + MainLog.Instance.Verbose("Key to send to grid: " + this.GridSendKey); + MainLog.Instance.Verbose("Key to expect from grid: " + this.GridRecvKey); + } + + + public void Shutdown() { + db.Close(); + } + } + +} diff --git a/OpenSim/Grid/Old/UserServer.Config/obj/Debug/OpenSim.Grid.UserServer.Config.dll b/OpenSim/Grid/Old/UserServer.Config/obj/Debug/OpenSim.Grid.UserServer.Config.dll new file mode 100644 index 0000000000000000000000000000000000000000..c6c9ebf460737f8e6e46a20b063adfe840adaf78 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Old/UserServer.Config/obj/Debug/OpenSim.Grid.UserServer.Config.pdb b/OpenSim/Grid/Old/UserServer.Config/obj/Debug/OpenSim.Grid.UserServer.Config.pdb new file mode 100644 index 0000000000000000000000000000000000000000..673462619164a54ed2d41367eed6e0e6d6d2183c GIT binary patch literal 13824 zcmeHNTWnNS6g@M&EiI+O@F+59X|d%g(`ji7Raz=tssFG|2+{_b$-D zCav*Gk4?i?1K!IY4%@NY1Mlfc|E9n(pX=Bd$$$*e)1v{C4E)%1S8L!>^RlwTBTl%s z_(XU8$Ih;Ui)yz1cKWz$OPLi<|KN>PuD}V`{#im?O0C}CxHDA#eaq{$U!Grh^0mk( zTj@5WtHqK1-_AaD=5lTM{oidqUOob8so-?*C~yY&9`I-|WyXSCV4D&{1MlLTM^b3T z`hIx^wCV2CK!58$_r>`2pK*@-dc6CzG5kh!yVn2Vr^!2W#FKyZIt+CERNkMvMsy!> z$ZcTIgW z7}Fc-*Xto)a9zXVNU)`0MO2UY^vLsi#8VLt1%j;&mCa1EA|8KK2!ClqRLO=R8-;8u zWjjy~|0wIXWLuhQTLv~=+*I=#`{0yQ>f2E z+17cpLLtsbWRvJiN|#kui0V*KI-BWZ>yf?>Wm#U8q3yX(VEu`=eUY*~^DR4GlV8mI z0?08x`9^s!^XV7#?H$04XfqSM9btfQOP}j&SBQung;p#X&Laa{i?UawOeSO~8!zJz zw31G65oaz831998f**pFz3!(AZ=3&tO1q)Io^4|SAlq| zG_u4Lp@|N#4sOJoQZqPU&M&rEg#LE{*{1TZIf&1Y<1IxUZ1Z6tlQ55su|S+V49s2e zC=l(7v*)fFC}YMs*UOOpB(NOlllUx<C&P-#;$HNS-wxgI+88)PJirwaG#d7tEgpnlkY`9PLYWaF8@qs_WTcQrK{iFa z1fBq11|A1?p^X%w;g^(x_SjZ3wBv#|sdVOP+z~Je4Vu)DuR%jxo9R2Wv*rJe-g%LP zH0~v&Rl@Qe*xlfpW&_ZTucI19(ck*cQNw4cD|0Sv0)7PE15O0un~pmz|3W!Blj{^> z9S|m@O-;;^_@>0KB(e;-OX5Qk0XI^4UlL`8LPM1wsO^F3A1HsI`pbI@^o4qp5-l+1 z-*<@n4Shcs%(=sPh4spu2LPKAL<3nO&pbP6=#N9(c)-sTGvo5TB|KL1@Z^q@bBb#Z zhVe2^A!V?!E1C6Z%Nc*bLtM#Nc~Yi`=~n+PV&XaD4kW6)l`hM3)3)iBG;p&iuJ#61 zp+niyw!c!z9gnneXIg>z?mH4kpL8+(@F+3Myr<$igAp%hSvR{0!K3UuVSJV(;9l`Ni;jA?AGTxgdws`yQa` zBr-1tY=B9stO|D_pzbBt=ke^R?ql(JPON?zW`d*lI~>2&rpocrj;x=^vTT)qiiYyE ztKNuZ^Qua#F*exKbC21u74FNoLkX{eRP@jQcY}FPp$P$E8`uD^1oLdbI}mSQoIF@3 za5EF4xjpP}6Zz4IKR*y`*Q5DE{06}K>0?=75)U3sn+j%oY*#HD?2}DH*T4i+!E<^y znD+O{^(5Z@Gm!ok4D&LSA45L(gdf243Chz(bSPdXAzt{SO-8+HaGs0b2vZQv-hk DNx;Hu literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Old/UserServer.Config/obj/OpenSim.Grid.UserServer.Config.csproj.FileList.txt b/OpenSim/Grid/Old/UserServer.Config/obj/OpenSim.Grid.UserServer.Config.csproj.FileList.txt new file mode 100644 index 0000000000..5ae21fcf0b --- /dev/null +++ b/OpenSim/Grid/Old/UserServer.Config/obj/OpenSim.Grid.UserServer.Config.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Grid.UserServer.Config.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Grid.UserServer.Config.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Grid.UserServer.Config.dll +obj\Debug\OpenSim.Grid.UserServer.Config.pdb +..\..\..\bin\OpenSim.Grid.UserServer.Config.pdb diff --git a/OpenSim/Grid/Old/UserServer.Config/obj/Release/OpenSim.Grid.UserServer.Config.dll b/OpenSim/Grid/Old/UserServer.Config/obj/Release/OpenSim.Grid.UserServer.Config.dll new file mode 100644 index 0000000000000000000000000000000000000000..2c7b1ddeedad544ca4c211ff3fca9bfeac5b53af GIT binary patch literal 20480 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 VCy)5cr=&;Ga5r9|HgY literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/Asset/AssetServices.cs b/OpenSim/Grid/Services/Asset/AssetServices.cs new file mode 100644 index 0000000000..05d58c9aae --- /dev/null +++ b/OpenSim/Grid/Services/Asset/AssetServices.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Configuration; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Services; +using OpenSim.Grid.Services.CoreFunctions.Local; +using OpenSim.Grid.Services.CoreFunctions.Remote; + + +namespace OpenSim.Grid.Services.Asset +{ + public class AssetServices : ConfigurationMember + { + private IUserServicesCoreFunctions userCoreFunctions = new UserServicesCoreFunctionsRemote(); + private IGridServicesCoreFunctions gridCoreFunctions = new GridServicesCoreFunctionsRemote(); + private IAssetServicesCoreFunctions assetCoreFunctions = new AssetServicesCoreFunctionsLocal(); + + private BaseHttpServer httpServer; + + public AssetServices() + { + httpServer = new BaseHttpServer(8003); + this.setConfigurationDescription("ASSET SERVICES"); + this.setConfigurationFilename("asset_services.xml"); + } + + public override void handleConfigurationItem(string configuration_key, string configuration_value) + { + } + } +} diff --git a/OpenSim/Grid/Services/Asset/OpenSim.Grid.Services.Asset.csproj b/OpenSim/Grid/Services/Asset/OpenSim.Grid.Services.Asset.csproj new file mode 100644 index 0000000000..3a22994fc0 --- /dev/null +++ b/OpenSim/Grid/Services/Asset/OpenSim.Grid.Services.Asset.csproj @@ -0,0 +1,114 @@ + + + Local + 8.0.50727 + 2.0 + {F22B4FF8-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Grid.Services.Asset + JScript + Grid + IE50 + false + Library + + OpenSim.Grid.Services.Asset + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Configuration + {A45242A2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Services + {6251A10E-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.CoreFunctions.Local + {FE7B9CD5-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.CoreFunctions.Remote + {E5E729AD-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + + + + + + + + diff --git a/OpenSim/Grid/Services/Asset/OpenSim.Grid.Services.Asset.csproj.user b/OpenSim/Grid/Services/Asset/OpenSim.Grid.Services.Asset.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Grid/Services/Asset/OpenSim.Grid.Services.Asset.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Grid/Services/Asset/obj/Debug/OpenSim.Grid.Services.Asset.dll b/OpenSim/Grid/Services/Asset/obj/Debug/OpenSim.Grid.Services.Asset.dll new file mode 100644 index 0000000000000000000000000000000000000000..4f3283209d7dcaf8268567ec625bee7d0ffac7b3 GIT binary patch literal 16384 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 X3xPYA)^yZt6aoqXg@8g}kr4P3C#A=V literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/Asset/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Grid/Services/Asset/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..783add1087764082cb82be985305528e38067ecf GIT binary patch literal 19044 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 UafO5)IU26b@MyS3qeh$Yf04Y8PXGV_ literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/Asset/obj/OpenSim.Grid.Services.Asset.csproj.FileList.txt b/OpenSim/Grid/Services/Asset/obj/OpenSim.Grid.Services.Asset.csproj.FileList.txt new file mode 100644 index 0000000000..0b3998235f --- /dev/null +++ b/OpenSim/Grid/Services/Asset/obj/OpenSim.Grid.Services.Asset.csproj.FileList.txt @@ -0,0 +1,7 @@ +obj\Release\ResolveAssemblyReference.cache +..\..\..\..\bin\OpenSim.Grid.Services.Asset.dll +obj\Release\OpenSim.Grid.Services.Asset.dll +..\..\..\..\bin\OpenSim.Grid.Services.Asset.pdb +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Grid.Services.Asset.dll +obj\Debug\OpenSim.Grid.Services.Asset.pdb diff --git a/OpenSim/Grid/Services/Asset/obj/Release/OpenSim.Grid.Services.Asset.dll b/OpenSim/Grid/Services/Asset/obj/Release/OpenSim.Grid.Services.Asset.dll new file mode 100644 index 0000000000000000000000000000000000000000..ac03fe9972ff9017d97c42c529a7d6a0f4f4b9ec GIT binary patch literal 16384 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 PxHiMR;TnzVZO;Dz&B2d_ literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/CoreFunctions/Local/AssetServicesCoreFunctionsLocal.cs b/OpenSim/Grid/Services/CoreFunctions/Local/AssetServicesCoreFunctionsLocal.cs new file mode 100644 index 0000000000..8992ca4a9d --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Local/AssetServicesCoreFunctionsLocal.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Services; + +namespace OpenSim.Grid.Services.CoreFunctions.Local +{ + public class AssetServicesCoreFunctionsLocal : IAssetServicesCoreFunctions + { + } +} diff --git a/OpenSim/Grid/Services/CoreFunctions/Local/GridServicesCoreFunctionsLocal.cs b/OpenSim/Grid/Services/CoreFunctions/Local/GridServicesCoreFunctionsLocal.cs new file mode 100644 index 0000000000..903a64dfa8 --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Local/GridServicesCoreFunctionsLocal.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Services; + +namespace OpenSim.Grid.Services.CoreFunctions.Local +{ + public class GridServicesCoreFunctionsLocal : IGridServicesCoreFunctions + { + } +} diff --git a/OpenSim/Grid/Services/CoreFunctions/Local/OpenSim.Grid.Services.CoreFunctions.Local.csproj b/OpenSim/Grid/Services/CoreFunctions/Local/OpenSim.Grid.Services.CoreFunctions.Local.csproj new file mode 100644 index 0000000000..cdd75599c1 --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Local/OpenSim.Grid.Services.CoreFunctions.Local.csproj @@ -0,0 +1,96 @@ + + + Local + 8.0.50727 + 2.0 + {FE7B9CD5-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Grid.Services.CoreFunctions.Local + JScript + Grid + IE50 + false + Library + + OpenSim.Grid.Services.CoreFunctions.Local + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Services + {6251A10E-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Grid/Services/CoreFunctions/Local/OpenSim.Grid.Services.CoreFunctions.Local.csproj.user b/OpenSim/Grid/Services/CoreFunctions/Local/OpenSim.Grid.Services.CoreFunctions.Local.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Local/OpenSim.Grid.Services.CoreFunctions.Local.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Grid/Services/CoreFunctions/Local/UserServicesCoreFunctionsLocal.cs b/OpenSim/Grid/Services/CoreFunctions/Local/UserServicesCoreFunctionsLocal.cs new file mode 100644 index 0000000000..6a3a3bd94a --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Local/UserServicesCoreFunctionsLocal.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Services; + +namespace OpenSim.Grid.Services.CoreFunctions.Local +{ + public class UserServicesCoreFunctionsLocal : IUserServicesCoreFunctions + { + } +} diff --git a/OpenSim/Grid/Services/CoreFunctions/Local/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Local.dll b/OpenSim/Grid/Services/CoreFunctions/Local/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Local.dll new file mode 100644 index 0000000000000000000000000000000000000000..f217290defd2f7ce8edf42584b730d651a699a8c GIT binary patch literal 16384 zcmeHN-)kII6#i!O!!&JTgQd18b!t;cwG5$6sfy?(-6U>FnvhLvkkw{)cHB&zomppQ z+eSo!)Piq<4;4{R@Wr=M3N58VUzHYo5Q=a84+_2reXxG#?(A-M+lC?t7VlZ+-1GaM z`_0{uJF~Oze1R?i-MsGK2d;7yN-MrGTcdmMg=>Sjyy@2NtH#W&-HR)3WLCqV92P33 zUGV)NHj9oK)_l|T&CFcRtOO;;8W`vwPD;;D0y9PzF5LKXsxjLg4DQ}+^Z{FGG3(a% z_9k*#=|jp+zw|BC7_ml0@yZ@!maUyqg!bqyh8TIr5Yt%Y4dicO$nWYCF`8+4x^9gXB;~kN6ap?Nx zNFu)B*<8-kdyePu17$hh?wLNG&2YR-eMa;NFDP;pN^uF(+ks7@+%pb>vaCsJutD|A zgK14!e9R&BCtdd9SNu%v58NgnG=%RX@5Q^uQR7*B$dq1uXRH~$xIr$tijm7_D_+48 zSJu!zO|+EqeV=Gum^UT!{EmzvGcUDi%WYbUtLef3dmh3*WQ;+)O1=%_({bg!Xq@ePlDpKC%&5b{vFB16IZ@l>H!zT{}X?Db~v6 zLeX=^V{Z3iEp`$cw?1)qqDIz2&5zxRL%1td*J}ZSx}hNOFF0P|tdgQuxg=4-=qkFN z8?Uy!yv<#vy4U*-{`sS4Jw5r^g{e!wUs}C~zAGQ)PwX7K^Em^I9@8*}c6O8Z^%;0d zZFLIrg#vcTE?-P-e>*Hxj|KkZS=*^fKZ`42a3-pMEt=2xWbd8lb#9o~Heex_$!(py zKKu2=FWGMgMlRm{?b=t8a^$squ2zJ!pW*Bg zY*nY)Hjl~4MtMML#hzen$mmutqdcXzF5qM8hFVRmVtw}R5w8L&)aADdRgOM8cWJRO zt>!IJ%BlF%wA+*-T8?nVA>}F5m|-`26Wx=wUkxC+ML^BB1o~_C$-;|&OD}S(giNhc2h9dGce%gl5z=V00Jg3V&DfdJwSXQ;Du156GVOUX2a!uk4xu(+iRV;ZZRBLI7L&52_H6%YP6b`aR~sFr=>XcKaMz$k9rs!0-*RW=QLylWqo!Ah7Jw}^<$h2 zT3|U)9RR~%0Vp8}rr#X^QM$YI;Av;HECC11kRm|cK3rh5Y`_&V!$%xn`(Fv@O?{ut zyll_Bw0s8ryu{qpVg~)$>ejDo=y0-zX@0OBGb28{!y0x<|c%6Q1IkPbu$9MjxDHYjE}ff!g{FmM1d$c#}i VG(&)AXgYh;)uSOW8Uj=Z0RTHoSu_9u literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/CoreFunctions/Local/obj/OpenSim.Grid.Services.CoreFunctions.Local.csproj.FileList.txt b/OpenSim/Grid/Services/CoreFunctions/Local/obj/OpenSim.Grid.Services.CoreFunctions.Local.csproj.FileList.txt new file mode 100644 index 0000000000..a54e47ced7 --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Local/obj/OpenSim.Grid.Services.CoreFunctions.Local.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\..\bin\OpenSim.Grid.Services.CoreFunctions.Local.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Grid.Services.CoreFunctions.Local.dll +..\..\..\..\..\bin\OpenSim.Grid.Services.CoreFunctions.Local.pdb +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Grid.Services.CoreFunctions.Local.dll +obj\Debug\OpenSim.Grid.Services.CoreFunctions.Local.pdb diff --git a/OpenSim/Grid/Services/CoreFunctions/Local/obj/Release/OpenSim.Grid.Services.CoreFunctions.Local.dll b/OpenSim/Grid/Services/CoreFunctions/Local/obj/Release/OpenSim.Grid.Services.CoreFunctions.Local.dll new file mode 100644 index 0000000000000000000000000000000000000000..92f4e9271f1e498ec60245aca1ed770723387cab GIT binary patch literal 16384 zcmeHNPiP!v6#va84cpX&mO`l@bwVOEwhU{Hw1=YGbd#8}`9n5|LBwWvc1)(u&MY&t zZ6hL~h@dC22M;1Bc<|^!um}~eLJQt{EqL@Gc=TZWy>I^|TN8>P_~*Sa?|c8g_r3R< zVd2eW?$r;`2cVzV&JJ*gt5DwXgV{FS!%u%ZjIR&hAGu={?~g2R`iWhSqm8&+v)ytS zMyXx#?6?uyerOjKN_H)(dd|?$;8-j5;uKJ{`Y?X?_H_HShZr6?Vr7A&wAfAS>#{-Q zJTKswk?EJZh1x5&smMMO`=XhO(c5dsZDO)xKuM%La9V)qrFGzmUfbj7Hoy)#l%@W1 zM+2PHyO~n2O5yaG8e4T!Gh_qnPMpLpHB(!jg2dRoc2S9KoL*`6ahs*5%?b=kmvj>B(rG-hp=e_pK%Vh#P}EJR7NJ% z!DoBd$*VL*7s-`cF>0*)_e@(C|JXIj(m_-;SP@AIQelrh5l{y&>Hn-Pfdq~?|ULdebBXC zoQtZBzPKPX6eG7BIMpD)r6lpvcGR9A z6Z81lu#$N30g0rX1KhR5jpD$sptO~wUJVPCYo42Sj-TdBDep!UzuD;sv-_8h*?o(_ z?7oG-anmSn72qs2!ql&M1g=*1gKleR8p;CXk{6V38Y#Jy@_DZ`QV*?-5=K|W5Bzki z>qVb!?%Bsb|Fn4KyEFMuKU)4|==Q)ZWWRaqwbdsl9=^{2tKYV)Y}RVMg*qjVtCc`77g z=NaZX){Rw35l{pa0YyL&Py`eKML-cy1pYY)$OH?V1h)6qB*TOGocxGg;^f`IS{}H! zYuLP(nV@x*-`1~^PhpADEEX_NeU^Nhve4cBUw&`T(8kbWFSS;g)pw;e)&jZ3tYyT^ zfT&H~%J3 zF`v}WvLdS!U*PEpT$881=Ny}dnQl@O8?yF*c$HD3 z4x(1)8nSYq76&ut+$yD#iN8*}ODUn{GCPhbPou#dZl^Z!73p(LZU9KoL*`6ahs*5l{pa0YyL&Pz3&y2>bz2IeaYu literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/CoreFunctions/Remote/AssetServicesCoreFunctionsRemote.cs b/OpenSim/Grid/Services/CoreFunctions/Remote/AssetServicesCoreFunctionsRemote.cs new file mode 100644 index 0000000000..2a02741a17 --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Remote/AssetServicesCoreFunctionsRemote.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Services; + +namespace OpenSim.Grid.Services.CoreFunctions.Remote +{ + public class AssetServicesCoreFunctionsRemote : IAssetServicesCoreFunctions + { + } +} diff --git a/OpenSim/Grid/Services/CoreFunctions/Remote/GridServicesCoreFunctionsRemote.cs b/OpenSim/Grid/Services/CoreFunctions/Remote/GridServicesCoreFunctionsRemote.cs new file mode 100644 index 0000000000..7e81e925bc --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Remote/GridServicesCoreFunctionsRemote.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Services; + +namespace OpenSim.Grid.Services.CoreFunctions.Remote +{ + public class GridServicesCoreFunctionsRemote : IGridServicesCoreFunctions + { + } +} diff --git a/OpenSim/Grid/Services/CoreFunctions/Remote/OpenSim.Grid.Services.CoreFunctions.Remote.csproj b/OpenSim/Grid/Services/CoreFunctions/Remote/OpenSim.Grid.Services.CoreFunctions.Remote.csproj new file mode 100644 index 0000000000..6efd111c20 --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Remote/OpenSim.Grid.Services.CoreFunctions.Remote.csproj @@ -0,0 +1,96 @@ + + + Local + 8.0.50727 + 2.0 + {E5E729AD-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Grid.Services.CoreFunctions.Remote + JScript + Grid + IE50 + false + Library + + OpenSim.Grid.Services.CoreFunctions.Remote + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Services + {6251A10E-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Grid/Services/CoreFunctions/Remote/OpenSim.Grid.Services.CoreFunctions.Remote.csproj.user b/OpenSim/Grid/Services/CoreFunctions/Remote/OpenSim.Grid.Services.CoreFunctions.Remote.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Remote/OpenSim.Grid.Services.CoreFunctions.Remote.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Grid/Services/CoreFunctions/Remote/UserServicesCoreFunctionsRemote.cs b/OpenSim/Grid/Services/CoreFunctions/Remote/UserServicesCoreFunctionsRemote.cs new file mode 100644 index 0000000000..acfbdbcf95 --- /dev/null +++ b/OpenSim/Grid/Services/CoreFunctions/Remote/UserServicesCoreFunctionsRemote.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Services; + +namespace OpenSim.Grid.Services.CoreFunctions.Remote +{ + public class UserServicesCoreFunctionsRemote : IUserServicesCoreFunctions + { + } +} diff --git a/OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Remote.dll b/OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Remote.dll new file mode 100644 index 0000000000000000000000000000000000000000..3bcf6b208d6c650f9f946785a906650e405935e8 GIT binary patch literal 16384 zcmeHNPiz!b82`=okEKY{22vps9HbcNx)1`j4C96XtLA@S(JC?T47;fNRUV8Vfe7f*OnMC%ZvrtCyt=S6QeNWuz!)M!W?Z0kJ-r7IA=tgEO3@Tx< zYL<$=AH=5Zm|@*FUEj=3<;`kPcB~ycdWVvwr%wQrMh8Cp`s#Rdx4Y=uzuo8o`e`v6 z);A6&az^O`%1*!3E!3Q`LPhdOJQvMWl-`_MZWYtdbzc)H1Ed9rjkEwfN}D$X?A_?w zN;d(XphZ2@Pqs9`ik*uw^>P;(eX7Q!Zfc55V8IHbutZJOmZ2aqCdV4euzD+WynumH zD;78;F3quqGQj8>Rf`${jetf#BcKt`2xtT}0vZ90fJQ(g@IOKzBYibVdeaoTuxPSr zX4h)FEc~9^N>Q=3gB(l2xTgT{>c=t)uBN!DP2 z@@znjrYt_@kb09UyYU^qq4o>zknc2vTjbrajVa?XEHR}U*Nn?XH*S(ku43f!>cRz_clu@9xeSvh&$>+QK?5#nW_P2kRfeQ^*;8+#zS|!U%aUeZnnl z#~$*Xc#`~aJdMs3Y@m7Sjk7i!25xSM5cN*m_R^`KT=$%pF;#Q?yj!&!KP#e`7t!mRl_~7dhcp{%TYTLeI64 zUyfp@iYfcNQ;J&^jPr?=b0G-dY8?x?`{{-KOnprb-KX$7QF|XEKuYF`R3`KblW*o10QAtsIxg=4- z=(1hUjhEYAei%&ket$l9>F|;F_fB5Po*(T0{^xJe^TpeRGkb>bzQ+Kg%QTFEJ)Pt| zJq8|8*PViVsDOQP(`QqIuZP9j>A*j6vEovS&@{n7Yq4%MXGfQ$?Yo$_J!tqU08Ro3XO|Z2<-C(1!^hc50Z`Gsxo{`3cNW z%3%tpsprVYDGPnodGGgT->eJ?dnK8rKVP$~vS!H*u3ALMbzD9>aJZ(AHxVfRkm~Sf z=`GS4(O*Q&xPV%NKJ6Ulq6TY<8RgPm`ID9URZN;cqc>i|u+>lM&#)q+6`$qq5lU*E z+PZyAZkA?q)Q&yF*pSifTGH&&+e3hVmhp0$SjGCR-6LK_RH=ig)j0dC+@;0Bgxa@E zDX-#}XfIKUXc^;)L(1c*Go#e1O?)%7SLv5sER?y2Jb?iYsk2SeT2VX88Z|7dT`E{) zJXA|`Mb$Z#*abnUv-xg__V3g?tni&?9RW{KSEt;FavNX48aS?UMu<_QP_S9~GEeoO zJi$kkMnEH=5zq)|1T+E~0gZr0KqH_LcxVwY8~-!DaP*-)fi7Glpb^jrXaqC@8Uc-f UMnEH=5zq)|1T+E~fd?S)2cfvr1ONa4 literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Remote.pdb b/OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/OpenSim.Grid.Services.CoreFunctions.Remote.pdb new file mode 100644 index 0000000000000000000000000000000000000000..1d890b87f50f24dea3167081fd1c908800d62672 GIT binary patch literal 7680 zcmeaxOfJeV&QB{*aMpL$)>iNhc2h9dGce%gl5z=V00Jg3V&DfdJwSXQ;Du15+qk0Z|GqaFr_04V;;ISm;>S)ZMOp@V}#{TL^M z7FZ5c2f#2`07^)L>30V}lVLE}KFKnwzqG9EH4qyrHG$22#P4T@P#AO_YK3>-iVGGi1B V%@E)jn$8||^=Jr;h5!{p000#(Ti5^q literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Grid/Services/CoreFunctions/Remote/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..2df54065bbd25f44ff719744f6c33dcea3763e70 GIT binary patch literal 2540 zcmeHI+iuf95VaG>vE8(3k+=$>B6w@%6iNYARH%)JsG!g`s6wL1+QjR0>Bft8*M;x` zkMPJ(@C$qce}Tm1h08C%jB(ne7uv!bVj|D(#yj^pW5YBI;|CC~NTnRG`wOfog%XkW z=Mu(4{~l56YJ7BsO2tGxbJ3r`-}q=X;X09YCZ>s&gpZFdCJoM-w`k{{Sf}w!V`4Iz zimpT#E`(DPWReun%-LPF`}K~}v|ZOkQ@rIyjMMa#KmF^KUlp9wrUnm`f0L*+O&Xk{ zziu9wh3vOii*UiaEl5}+O)X?G3&*L7_G2Qc97d&85z<8|HdsidgMZZ7GipIZ%3dKn zp~^7wd81GmaCWmb-_><~7oX>M=>NKO^*RRNc>};*3t0i!Fzzr5whhd$POsLJ7UN9Q z)dq`K?>?q+owfa%ByIXc$aTL??4fa zKa9YGhbV%NQRZ(-uiw3N9oV}rG7ne*kB9bQh^Suw9HQ!4vbdEu&tz3xrcu^;eUYFi zE>_Mi0bAO;EL+e?fpZY(#0lp`3@j}rmeV?PVD2D@jbLJsEcA4rh%k;qfQ9ygO)QtU zwkfPjL5BPJI1+Avh?ygbIza}gp#U3wmbZjtdaZq;|5y{UDq<}KKN3KmMchJj0I)^E zo^Z@8(d-xEz$x$R{`h&Yox`!VBW(Z#%zCC)=I)8g~am|bEMij0_<+@!h z2SJ$F71xfMf$atMbg^XD!;`IBMqfOWq>w5t~$G9fkLznTpZdW5;b`hR1=|WR?T60%EtU0FUgp{Sn;;c!Q4g zQ-7tS0Z!sxPpH=Xeo4DmCi*gp+k%$ex-wC5Ie>&;B$I9eW4(jN=WNmy*Z}R%3}+j?G>yOmp<9pAmh^4=Wr+GQ7gd(bGcI=o0QyK(rJt}J{g&N znq?pE;(Ka8VT=8UCB4JG5201G`tT8Zi8md4`5VTISmtfo+Iy*%F}}}Jtq1eAtbG4? z!IIN1?a)?sXc^w12ZPM{D4s&W8p3nz2WXYv!4ZtGAHiej-NY_grrx?!%VFWWT@j*g zb!}%ZgteyczJy}K4N6|!nT@=fQ*xtquj(aHNCGQjG!EvvuZO5aAE zkdNkK=Gf~|xiJ?8GuNwbLo!%gi^6NMh12Qxfowb{b6aM6rTx7DT;&6w_WcWGFMxsX zwmuZH=HZiEe{}C^wI~54pahhF5>Nt4KnW-TCGgJ^kO~$!4s7nsMT!RVbMhX$#L2sZ zOF7`qwqo;6W|Gz=lyH^(3>G*mpolr@1@?K)MQ-)}_@G@w8$;T?oQ_hfZ`;;br`cQF zwTy`Sczk!@a?b#7AT<7QQ{gYtTc$Opzl?-&A+?s==$+)I7IR7%<^R5fVOiE)-Pk3@MvU&}l4bSYZ36yT#>;II6B{sh zpS;SbQwOOvI0nqzqs76jIk(1H$;7YIUga#N?LtuUY(EXr{+@g%4c~d@5%LyIbIaY7 zyL^Q;-!qvtXUQlw6e`SogSYyNt4KnW-TCGf8$V7LBfd_~H2 f6(yhqlz zgz?Z{B5F;Ik1kWGn22XC`V;sYAFU)@Cz8&@G|`gq@zKSk&ROF&Z7+#68qd@xE=5z( z)o5}uoSGn)NCC~9+f%z=Yb#A#HBB_dTW-WSO;7nVKVJD2!8vVc@Id*uh+5U8&MErq z=7CwretWeD7rZ-ygjLeeLKd@doQi0z6G`PDDy@i+E=sY%LMk2nqsBI=1raHGnec=v z!^r22LZQ#u%hr5H*M&WNp5LW^`~I~X7=Y*X0e3BA1z>}?!z|b~FuyXrQcIeQGfh|O zEMB>{PU9MD`Bh0;^r?_*evQfv)}YD{IUhs~X$mpm0=)lh8}G8_7{T`F!q(=^6D!pQx@ z2t0a>BKR0vLvOs-?_RnN>|Ga`2dsd{L;KKARJVT)Q8g`D+{~M2vnoEIQPz1qk)S6o zR?aQ~yT5-~cA%32=OECD6V8hmSXxRfr*-JS++!ei920|Np{IX{2;(ROSZFW!iRFQv zZ3^pBkl}tlj)WT^V&;gVPLKhrKfp$xy}STCT#zko7S2yYC}+J@a}$Dff1BWqIWC`&T9^!_G`UldyKE?>qIZItc&( literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/Grid/GridServices.cs b/OpenSim/Grid/Services/Grid/GridServices.cs new file mode 100644 index 0000000000..3c1e04dc3a --- /dev/null +++ b/OpenSim/Grid/Services/Grid/GridServices.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Configuration; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Services; +using OpenSim.Grid.Services.CoreFunctions.Local; +using OpenSim.Grid.Services.CoreFunctions.Remote; + +namespace OpenSim.Grid.Services.Grid +{ + public class GridServices : ConfigurationMember + { + private IUserServicesCoreFunctions userCoreFunctions = new UserServicesCoreFunctionsRemote(); + private IGridServicesCoreFunctions gridCoreFunctions = new GridServicesCoreFunctionsLocal(); + private IAssetServicesCoreFunctions assetCoreFunctions = new AssetServicesCoreFunctionsRemote(); + + private BaseHttpServer httpServer; + + public GridServices() + { + httpServer = new BaseHttpServer(8001); + this.setConfigurationDescription("GRID SERVICES"); + this.setConfigurationFilename("grid_services.xml"); + } + public override void handleConfigurationItem(string configuration_key, string configuration_value) + { + } + } +} diff --git a/OpenSim/Grid/Services/Grid/OpenSim.Grid.Services.Grid.csproj b/OpenSim/Grid/Services/Grid/OpenSim.Grid.Services.Grid.csproj new file mode 100644 index 0000000000..7017ea3f6c --- /dev/null +++ b/OpenSim/Grid/Services/Grid/OpenSim.Grid.Services.Grid.csproj @@ -0,0 +1,114 @@ + + + Local + 8.0.50727 + 2.0 + {C14E4DD8-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Grid.Services.Grid + JScript + Grid + IE50 + false + Library + + OpenSim.Grid.Services.Grid + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Configuration + {A45242A2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Services + {6251A10E-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.CoreFunctions.Local + {FE7B9CD5-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.CoreFunctions.Remote + {E5E729AD-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + + + + + + + + diff --git a/OpenSim/Grid/Services/Grid/OpenSim.Grid.Services.Grid.csproj.user b/OpenSim/Grid/Services/Grid/OpenSim.Grid.Services.Grid.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Grid/Services/Grid/OpenSim.Grid.Services.Grid.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Grid/Services/Grid/obj/Debug/OpenSim.Grid.Services.Grid.dll b/OpenSim/Grid/Services/Grid/obj/Debug/OpenSim.Grid.Services.Grid.dll new file mode 100644 index 0000000000000000000000000000000000000000..2f8b96172cb6ce4d6daeccb284cd2a60e341d040 GIT binary patch literal 16384 zcmeHNU1%It6h1Ra+9Wlhi8e%I?UYnaf~>K|R>YtDY?H1eO`A zna5fR@MEfTO)1o1&c4D?x0`XmYk6$GIV*6-Zi$?i0174^y9+s>Ku zch5cdn>(}j%w+7jH>ie)YH?h)p7hS`4jpTUR$a`6lXliQQRStb{AJM2*LvMZl=5RFHWoq8JMXM*; z3XM_Het3VG@0W6m)WgnsbBoTj41xQhVO~%}kaBchGfSUI#68ShKhZC`RK>|0(QVLN zx{v7YxaH=OL4+BswR*_=*Ce7uC>BG=E1N-JlR1|2h9sLoG?(xL--0A_>j%R=29B!M zkL(k^a6CA2t~7^({d#d!wSJ<(Dp9ct0fm4R7WcY>fB948Y}-ntLd$wbh)1%p!{w;g;2G6P{%9^Y_JI5c#4a2y$jWEBL+4G zb`S-qmm5!^ORessPob-Ujk>>`d3fP}Pb2l9h)q8|sFgG1dUs)WqBrqK@7~>edEh#7 zK)*qR&Xvz#>x}~?#2jDp-oFruwwo*6k!K|6r=u=65lyaNa z0BJ&NqJswepJ_j$wLtTcl)fZO+XjiF=}1|pJ8B-HBib$+0PUd^XbUoC`mCg;qz#gG zgZ2QCRsBKGpFk6|h5A5mrzb!=Xqal35j@uR#3U9DtL+ll;z~h#twR+1VhZZ zgilOGR@CkBF)v$m#FI2$5N_JeCq{fbn@9_P!L~$DlCq9Ntd6ud@m(_w<8_xf;rYiB zL!Nuo&J}$#v^|$%(wN9+gug+bwUJU&f$$?~$n(W;(X}{GKt)*MnpAa?aZ?WI$2F;e zAQ0ikp-nc$-6MD^^Wv_;4`|Q~#QrcWlw_K(un8;le401itRrIcPK6>*`M~mg$IeiC zDS(_v+Gfu6g3z`CN{UP|moqbt7zlBbW{ROG>u|&3iisfVHBod!J1>B8zF<2QtN=7C zB*J&0^rznUzMrZ=}f07J5%lCnw zhBO2YPxj6n`D9a;W+@;6egTpNF2G&CNO}46#dG)9JK0zZOuO^_r8{lQ;3aYV6a~7Tr0lQa>pE0 z<z& z?2@^U!Z#-)4*`_|Ey*Z3?3Vd&5;*U9na6lpZ(~HxBSM>{|0bV4iO)fd{ih~&#f7uURRZ|Ek1QY@a0fm4hapb+>!Bk(6|$5vCWN}FRN04aH+PduHhat6 zjcrA6l_G**1BOBnAGDyLZz?|276MADc@b>!S$rtygSAqyPmSL<_fE3a7^@8--Q1I$ zIWuSezqvE#%xu4vcI>>JDTL$E_^w^y{zOlBPb3x#);4t|1XQ8^Wiz73m34bz6g+pTSq`0kdH<(dWhD*>Ai5|!`!~_hFqQQ7S{M zHwdLJ%lul|7CMwTnJ<`QvUMRIiQCz%nJ!p%E+08y=1j**OG8Qipn0OeJ|3mcJ9i>I zPHN0NZabr>p37Ln<4%e#u$*f9@8x(TnGTMlCGvTQVZJ5(@Gy(apJs8}F?+^y-eCLe zbSg`HZnOMz=9pbDu^+0XRjR7K?f7Npvlo8oJ-hrAwZGtO8)fkZoJnb4Q0(+@aZM^pvdj?Z@j&}-fgRzWBwiSQ>+X! z@Tb={fbklm2?Lmq@|f(%GT z0%C$K@K$gw-khEUcYyb)G{+JHyK^Z;RfGOBVJsS1ke!vR&DJ+9E?-1K%h+OLVc;7^#K!*)2PXO=`$L8y{WYE$7vz z(er85A)xK!Vgu8*VX-`4R~`s(jgJRf)V;4(GGz(-(Z5cm`3)VquT literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/Grid/obj/OpenSim.Grid.Services.Grid.csproj.FileList.txt b/OpenSim/Grid/Services/Grid/obj/OpenSim.Grid.Services.Grid.csproj.FileList.txt new file mode 100644 index 0000000000..8c93e4e4c8 --- /dev/null +++ b/OpenSim/Grid/Services/Grid/obj/OpenSim.Grid.Services.Grid.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Grid.Services.Grid.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Grid.Services.Grid.dll +..\..\..\..\bin\OpenSim.Grid.Services.Grid.pdb +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Grid.Services.Grid.dll +obj\Debug\OpenSim.Grid.Services.Grid.pdb diff --git a/OpenSim/Grid/Services/Grid/obj/Release/OpenSim.Grid.Services.Grid.dll b/OpenSim/Grid/Services/Grid/obj/Release/OpenSim.Grid.Services.Grid.dll new file mode 100644 index 0000000000000000000000000000000000000000..64023b97aa5b21f5c78101ce507d6e20d099a5b4 GIT binary patch literal 16384 zcmeHNPiz!b82`=mkL^M?6hlRbGNjee1|}5?Xkv8xhnCfrmToD=NZRS{V>@AXW}TTW zt)`|2HR_2(5^u(XCu0l;5{ZVJ;YRf6k$Cc8;-8q9a1ej*?QVC+0utg$-q+0czJKp~ z-}~+C?)zpt_1Zz_4H}=mhyOC86gJS5E zti0psw>fIja;Dgx%GZ>Z_%mISx!3Ef~1=(Rh8en@I29W^@2MXtAo+ zFQ2Z-8KrkCJN>e5N%avMROCDo_eC=mrPs$zw~AS0-dCiQ0e&@=DajUr?Mci1X%@g8 zY*GjH6Pp@f$6__6ex;p^K2>9_Zfc4wV9^evFi%a@mZ2bHEM85NVfA(>ynunK)2SkrZE2CP?kTc5b z?4DC*_=FTYDGsy`jO1P(F=~~`K6mA?J!l^pJa+h)T(Auu`4!IXeVZ*Zm-?AkZ!Qj9 zzZl7g?Ob?_WAEu4W+=-Rxp(4pR@xS+&q;m63zj%a;&kK8E`ZAew~S}eQ^h4!^{HnL zjFE9FMvf9U+0wJ(TBYrH1E;8cig(FxD1M7PjZvfD*on`KcgVjb??IROqp=5P%tK}m zRw&Cnijm8|9q7kV?zF0XqsE_<-eYu9n>D&HW64?X?LKRC)AG5}t|M>kq9(IlXPG8` zFrUF$qYuxMcVk%btm3B>?^L{>ypMbP*z702Om1Tv4w65LBWT@V!UP>nXi_<~#RBeq zEA^{wN(Ae)7jIR!UN@+*ib=wRL-lDdOa+CCCtk#KS@=1(WKV={!On?r#m$STsuesB z(p;^s(+LS0QiSQ0{Hdo4?jzn13MuSj{SNyz8 z6rn;-(vod1GU+O^{G=s297Q6&b81JrlHqlD8vBw{MHpekiNuLGE?0FdH$*!h2O*Xn zzu<|)zO%6?p%mqV&~ulNTZ^dMvlTyfOM-Zn%C6VgH6fD*1>dajoK+=7!!h5bOO;rl zHc^Jrwd8tkyw>p63s1hTiOt!wq7*REU9qnD?yNZ(fqy&Dup5F7=vG2w|%uM|`7ymwhmiC>Uyt;UG^V-#7!DzEgBc1N} z>dn{ZA0N8;L91mL9cFvF!>B#pd{TZE&6z!CLZ^H(@Q<(Nh1%WRau{5QjQ4BbFY+Dx ziIgoVZKeA65U@au$2@P!asBFTC4?>Cw32Q=#rfS^XKRZ_KqH_L&@>jjbRfZaSsW$R~fa;$PK8kn9^u3B1W|W zc}#A^&a2aS)KtqLPvnh@&mpjn@p3n@iuGB$N4y-K+Ii|HYGsZ-D|czJF`?EiP|B(J z=97NIS746n3HpGleUh<7m3fq?l(D9=6tT=z!6P;($vUQMc9$#4I_hXk?Z2sKNZ~WX zbprM)6?Q2xUs>6+G*D{bBe4RWQ*(wHA-kIrUlor#u>N%(r)ts&XaqC@8Uc-fMnEH= z5zq)|1T+E|OtaIW-7HzJCT*#$O?8tHMaR|9MapDpuP8>o89F$}0$T{R#Cmcyh zoX(UKXb0NDKq>8XhTBUE?MyEZrG0?Dw0(ijw7^UYJe1_2z(WI_mgJ$pwEe!-(a|1D zjxTxBXqo)}f9=1k|KI)2?x#IVNQ6S6|Do_NOLG|Fc&|0&IyonkPwp;Qb~<^~$eqr$ zEjeboIm^jzUzc3V|Js&x73_S$HMeKYLf$p(wk3UqLE9R-!yG;8oHn!D2iLC8Y|L!V zbabRQt~J&hjr^LWReMkNkLL2`NPphQoAlB$mTgL_VPUZ<+2z=_Ih02Px#WH$cPeiT z+9u=G8XzJR*L7`zgMPp<(%r^T-f^3}bYfl3$Qi>m-4=G*<)qC%*EwsYO*h65`mGCQ z1R3R`#|*n*=0c%{hEQYUj99hr>M8ZLyh_YH75!g1yk*BsMy1b%)FKp(5G~YV_!o^r ztnca^=r0Ugwv{&r2CeMCp)+Q--x^7FyT*ul&T&s;XtEh=xZoNbon+d!qfB<`*oL+> zm@|i*Y}&RmrgY<%tQqT8*?+(3p2g(LCK{S77~AA{?|~zIU9w)ET$czr=h($4W}wOT zv0av;*ymd5Bm=O9%p5Xx&F(_hgTVo3$gt(NHlvH%r_;p|bHvFP!{AgT$Lpg!*nTV+ z=N3*E2T_|v5vORONKo8F@db)6Qp|>Eq+jcVk3eg83I2pavu)(^y-wQ7SZ2D}$mPtD zL3{KdX1_UY0t{(0J7k%;=G>5x&zmmW=0cH3bY|PwFX}%9q^Fa+lrHw3&zo63*L;+c zQ)zI|2{z%s(40qZjz0O?BibD3ngsJaXoBOxghQ|Xa7OE6sGkpATR?F$gy2xg`hWiE zUyW?PkX5%(EMh%JQP#gc^X}d!P`{W}ODL8?2o7+d{jIE8MzNgr9D7;c({WYyzk*dO zDZa#dPD`Nv%dA>Ov6}Uqu|Rz*tJ)~mKr}MlDUb0iBd3mk%*gfUT`N1>AQpM6#t}2) zt#pBz;z(;rh-f>+vC;!lMrL3cD6iLYwVup+oh{gQ6K5~PC0MSiQ_fCXi>6u!#X5)t zalj%t^%5TIp+q-8>b%1PFJT0N0XfB(M$5wA(1QQ`}Cm10umkh(++Jky-4765R!{ zy|`dcH{>Pg;zlsC8_l&YiaihsKFchEkFN}LFO+CE#9fuc?d=@p*gJrhb(=SAPOe+K zWz(jKX^9+lE)p^YK2_5g^?hij?T1KkrC||VTx9e;P@-RfI9ZB*!cDB4&D5S&u4OU} zKC#nC;|?@Sa4lpJT>fMR2cSfIA&kjnP~1bOn*x{H8%g0HnkTqivk0!xGKE7>qJ0pD zODU8W%F-4--H^Eh+(^iW(LBK&geAfyeS)Q*^rkVz9bZrRBs*SKCEspNd4#+tn{l)h zsqAheXU0+<)18$f1Knj0JFb;KH8L+~b~`Sfti0>kH>I#4IoV-;9hh&QVY#zQeMo|v zw+6{ZN2953+ZfKpWk==qqNyn)8f0k-hhww6UCoPPqfd=h&g$)mU@`ud7YKHGt(H}8 zs1>Q*HraT*_yZ$QbP0|o)4oH*qLz1WyP-X@wh_2m>&*U7WpsX5i z4g!tjh@XVJcpfQmkRlghJm(pxK!nf2;;1ot@eCBETMVB3LxyKc&rKyWBTaG=SvxFE zvJ+{Zk|tS+%*BE-zY-cAGtssCP%ra34Q1nad5znF%+W?u@f70rbNsGnpaMBQ3Cqv% z2^i%ZNl|3j_e)Qb6=}NCByEvqPMRbz(#%V9N69Qmb0?%s`7D%Zk;drSIT$j(^H6Rb zFTe7yRBaS~;+twR-v}i0u$s(6fn-QtWPD$Pq6^X(Y4ZDZK|&+Vi_#>Kk>P$FN|hP% z$c(N%h>Y1jCf%XT@^N$}?pL!s6Ufq0v&;svB-@c`Jq1M<2Owoy z--EJxGEo$nj;=k81~RYjL+QSeyvpYf+7Hl|IHe{w97rsqCT0c_JBX$-v1g#@g4{WF#P;u!|p#!&cIEfMYvwZ^f+ zb&dsw>T#?eV}fHNxgp2J?yPGs!X&PB?IlQYmx4!eOfhtErwY!a9yrkkJcsS(vLmg-}4767;!OEugD$L^Q z^jm0Rw*n=xOEGk@Q^nN|7-U>%gH4UUE9;=CVbJ^z6C5pWYP$A&7)8kZ0h-tb7?jR& zM5kitVk<14q;G*yh78Xh>X4~n$h?LL4)CDYec1ewu-Tv>MXXm0U93}K(-D9TCK zsbSc>fe9}CM&IKa=kO9+*WUD@^A@4AMnQ{cQw&|Ss?b@jLMP7iN|vzTsbh)!$d5b` z;Zb58T{VoZw=uyA`FRIsaVL8hnpmkoNvu!|T`X5|wM@lTga^)b(9|$!-opg@Ls*ao*M$Q#Xu>T73BOfv!6EX<}C89+!bP-n}Gb;d@LLD-t`yaJ=;`|9F z_Rrbtx*Y&ljhS#P~F~JIZ{tRYu zL;D<>Xi%Ue!iu2_q2h}Fb4ZyAv4c8jY8W&E_mh0~9EMSZOanCW`G1w8!_O2$7oWoN z+4Fy3lp%Am4w>5C&|<(w;OJ2EVWSf^*A%3PtBRqEPgL0aTZK)Wx1m_Vf_Iv@gP|{3 zUeQCL2XSj8!i!4v#i)iCqd2Bq*}+-c$@-yrJUi&jDQV zMlJ7EhktWn;Mn{Pmmd|pSxbC{@lP#r-l7b;@-}5v*O$G9VZp0%bU}o&l!$(ux1NH% z@%B^I-gw(3=*n9!Rb6?*A?V7R4pm+GMq9f6a!2Zc#9#DI!8hAgUHOtS*ehRFR&~8p z;d*&ISH6v42@AfBU~eqyRlqn;pIO3!r_Uu9`H?5$JX&N4i))Z{sTgXW5(UHOX%Ss3 z=9s4gL06sA$q%}c>{oRqxeL0IzFpOoOK{MYOL0|K OK2 + + Local + 8.0.50727 + 2.0 + {DCF71AE6-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Grid.Services.User + JScript + Grid + IE50 + false + Library + + OpenSim.Grid.Services.User + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Configuration + {A45242A2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Services + {6251A10E-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.CoreFunctions.Local + {FE7B9CD5-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.CoreFunctions.Remote + {E5E729AD-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + + + + + + + + diff --git a/OpenSim/Grid/Services/User/OpenSim.Grid.Services.User.csproj.user b/OpenSim/Grid/Services/User/OpenSim.Grid.Services.User.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Grid/Services/User/OpenSim.Grid.Services.User.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Grid/Services/User/UserServices.cs b/OpenSim/Grid/Services/User/UserServices.cs new file mode 100644 index 0000000000..90b8a68295 --- /dev/null +++ b/OpenSim/Grid/Services/User/UserServices.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Configuration; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Services; +using OpenSim.Grid.Services.CoreFunctions.Local; +using OpenSim.Grid.Services.CoreFunctions.Remote; + +namespace OpenSim.Grid.Services.User +{ + public class UserServices : ConfigurationMember + { + private IUserServicesCoreFunctions userCoreFunctions = new UserServicesCoreFunctionsLocal(); + private IGridServicesCoreFunctions gridCoreFunctions = new GridServicesCoreFunctionsRemote(); + private IAssetServicesCoreFunctions assetCoreFunctions = new AssetServicesCoreFunctionsRemote(); + + private BaseHttpServer httpServer; + + public UserServices() + { + httpServer = new BaseHttpServer(8002); + this.setConfigurationDescription("USER SERVICES"); + this.setConfigurationFilename("user_services.xml"); + } + + public override void handleConfigurationItem(string configuration_key, string configuration_value) + { + } + } +} diff --git a/OpenSim/Grid/Services/User/obj/Debug/OpenSim.Grid.Services.User.dll b/OpenSim/Grid/Services/User/obj/Debug/OpenSim.Grid.Services.User.dll new file mode 100644 index 0000000000000000000000000000000000000000..f923f1839da18b942fc7aaec3f35cd541f440ecf GIT binary patch literal 16384 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 T%KD?bqY=;uXaqC@D}%tFoYlX! literal 0 HcmV?d00001 diff --git a/OpenSim/Grid/Services/User/obj/OpenSim.Grid.Services.User.csproj.FileList.txt b/OpenSim/Grid/Services/User/obj/OpenSim.Grid.Services.User.csproj.FileList.txt new file mode 100644 index 0000000000..3e2cffeacb --- /dev/null +++ b/OpenSim/Grid/Services/User/obj/OpenSim.Grid.Services.User.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Grid.Services.User.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Grid.Services.User.dll +..\..\..\..\bin\OpenSim.Grid.Services.User.pdb +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Grid.Services.User.dll +obj\Debug\OpenSim.Grid.Services.User.pdb diff --git a/OpenSim/Grid/Services/User/obj/Release/OpenSim.Grid.Services.User.dll b/OpenSim/Grid/Services/User/obj/Release/OpenSim.Grid.Services.User.dll new file mode 100644 index 0000000000000000000000000000000000000000..45cda64ed4295aece0cf3afa9a561f9ef039990a GIT binary patch literal 16384 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 + + Local + 8.0.50727 + 2.0 + {2FC96F92-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Grid.UserServer + JScript + Grid + IE50 + false + Exe + + OpenSim.Grid.UserServer + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework.Configuration + {A45242A2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Grid.Services.User + {DCF71AE6-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + + + + + + + + diff --git a/OpenSim/Grid/UserServer/OpenSim.Grid.UserServer.csproj.user b/OpenSim/Grid/UserServer/OpenSim.Grid.UserServer.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Grid/UserServer/OpenSim.Grid.UserServer.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Grid/UserServer/UserServerMain.cs b/OpenSim/Grid/UserServer/UserServerMain.cs new file mode 100644 index 0000000000..248b942ce6 --- /dev/null +++ b/OpenSim/Grid/UserServer/UserServerMain.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Configuration; +using OpenSim.Grid.Services.User; + +namespace OpenSim.Grid.UserServer +{ + public class UserServerMain + { + [STAThread] + public static void Main(string[] args) + { + ConfigurationManager configManager = new ConfigurationManager(); + UserServices userServices = new UserServices(); + + configManager.addConfigurationMember((ConfigurationMember)userServices); + configManager.gatherConfiguration(); + } + } +} diff --git a/OpenSim/Grid/UserServer/obj/Debug/OpenSim.Grid.UserServer.pdb b/OpenSim/Grid/UserServer/obj/Debug/OpenSim.Grid.UserServer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..65f6108c7392e74f1a16e1b313b1dbb77fd9f241 GIT binary patch literal 11776 zcmeHNO>7%Q6n=IBjgz?4p-pHhk*NqRNm<*_G^Ii$B0nV}R)X9}0aS2<(%~wLJZrpL^2}iNHSEu}v;Rgk@!=9O19#{{89H{EU$|ih6qVux_S|x%2_cm`;z|x|Pzc*LABbnamibmbFE)`_s0k zR)CrfwHd0-Lk(Z5ttRJOHJ&g%>=ncjFbeU#QKIpG(!;;R10{4gw&hH??d-Y0fA#ZN zA6JBG1wCD^-%!5L4eP_4Vg_e_#IU<)4SY=?DcEKL2`>Wl0&3ry%Rm0I}emI3?*m zFm?ZeoCK2s_;^?m(1R*hWTQxl<9Gma10?*ZQW&xYatq{xklP{AeklZm!{|9I&w|In z31QyfC~p9>9TL+~@E-8(h(7(cQ0yxGxMpnRM|Ab^ zPW8VYQLOiF@BrAORwTBnhd-9QJm+?}{C?Ogp$tjdeQA#3iOCCZZ@r1@KiqhF?{vU* zOF8mRQk^;7@xiBi5{W(XZHBWijiym{fC#hu@S?Z9X4|XiJ1tC-cHukEXnbxhT zd?7pQWaNyzZpYSt5yX&)5VpI((7#~b4lu(ayqYSkg1Du*V!lu7K!CC4L*NB4?`8_> zMHYDv=@NJXybF98`Ma@)`oJT2=1m=9RJBN4tPq%s#Kq#~ZUQrAVEc?M5#KV_^{K)T T!2No`_liCR$1TwoS=mdswq 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs new file mode 100644 index 0000000000..0428f5a41c --- /dev/null +++ b/OpenSim/Region/Application/Application.cs @@ -0,0 +1,120 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using OpenSim.Framework.Console; +using OpenSim.Region.Environment.Scenes; + +namespace OpenSim +{ + public class Application + { + //could move our main function into OpenSimMain and kill this class + [STAThread] + public static void Main(string[] args) + { + Console.WriteLine("OpenSim " + VersionInfo.Version + "\n"); + Console.WriteLine("Starting...\n"); + + bool sandBoxMode = false; + bool startLoginServer = false; + string physicsEngine = "basicphysics"; + bool allowFlying = false; + bool userAccounts = false; + bool gridLocalAsset = false; + bool useConfigFile = false; + bool silent = false; + string configFile = "simconfig.xml"; + + for (int i = 0; i < args.Length; i++) + { + if (args[i] == "-sandbox") + { + sandBoxMode = true; + startLoginServer = true; + } + /* + if (args[i] == "-loginserver") + { + startLoginServer = true; + }*/ + if (args[i] == "-accounts") + { + userAccounts = true; + } + if (args[i] == "-realphysx") + { + physicsEngine = "RealPhysX"; + allowFlying = true; + } + if (args[i] == "-ode") + { + physicsEngine = "OpenDynamicsEngine"; + allowFlying = true; + } + if (args[i] == "-localasset") + { + gridLocalAsset = true; + } + if (args[i] == "-configfile") + { + useConfigFile = true; + } + if (args[i] == "-noverbose") + { + silent = true; + } + if (args[i] == "-config") + { + try + { + i++; + configFile = args[i]; + } + catch (Exception e) + { + Console.WriteLine("-config: Please specify a config file. (" + e.ToString() + ")"); + } + } + } + + OpenSimMain sim = new OpenSimMain(sandBoxMode, startLoginServer, physicsEngine, useConfigFile, silent, configFile); + // OpenSimRoot.Instance.Application = sim; + sim.m_sandbox = sandBoxMode; + sim.user_accounts = userAccounts; + sim.gridLocalAsset = gridLocalAsset; + ScenePresence.PhysicsEngineFlying = allowFlying; + + sim.StartUp(); + + while (true) + { + MainLog.Instance.MainLogPrompt(); + } + } + } +} diff --git a/OpenSim/Region/Application/OpenSim.csproj b/OpenSim/Region/Application/OpenSim.csproj new file mode 100644 index 0000000000..ecd01c96c2 --- /dev/null +++ b/OpenSim/Region/Application/OpenSim.csproj @@ -0,0 +1,190 @@ + + + Local + 8.0.50727 + 2.0 + {438A9556-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim + JScript + Grid + IE50 + false + Exe + + OpenSim + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\Axiom.MathLib.dll + False + + + ..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + ..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Communications + {CB52B7E7-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Configuration + {A45242A2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Data + {36B72A9B-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.UserManagement + {586E2916-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Caches + {61FCCDB3-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.ClientStack + {DC3698B2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Communications.Local + {BFB5D807-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Communications.OGS1 + {4806E378-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Environment + {DCBA491C-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Physics.Manager + {F4FF31EB-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Terrain.BasicTerrain + {C9E0F891-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Application/OpenSim.csproj.user b/OpenSim/Region/Application/OpenSim.csproj.user new file mode 100644 index 0000000000..3f1b0407f7 --- /dev/null +++ b/OpenSim/Region/Application/OpenSim.csproj.user @@ -0,0 +1,13 @@ + + + Debug + AnyCPU + -loginserver -sandbox -accounts + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs new file mode 100644 index 0000000000..d28b684cde --- /dev/null +++ b/OpenSim/Region/Application/OpenSimMain.cs @@ -0,0 +1,471 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using System.IO; +using libsecondlife; +using OpenSim.Assets; +using OpenSim.Framework; +using OpenSim.Framework.Configuration; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Console; +using OpenSim.Framework.Data; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; +using OpenSim.GenericConfig; +using OpenSim.Physics.Manager; +using OpenSim.Region.Caches; +using OpenSim.Region.ClientStack; +using OpenSim.Region.Communications.Local; +using OpenSim.Region.Communications.OGS1; +using OpenSim.Region.Environment.Scenes; +using System.Text; + +namespace OpenSim +{ + + public class OpenSimMain : RegionApplicationBase, conscmd_callback + { + protected CommunicationsManager commsManager; + protected ConfigurationManager configManager; + + private bool m_silent; + private string m_logFilename = "region-console-" + Guid.NewGuid().ToString() + ".log"; + + public OpenSimMain(bool sandBoxMode, bool startLoginServer, string physicsEngine, bool useConfigFile, bool silent, string configFile) + { + this.configFileSetup = useConfigFile; + m_sandbox = sandBoxMode; + m_loginserver = startLoginServer; + m_physicsEngine = physicsEngine; + m_config = configFile; + m_silent = silent; + } + + /// + /// Performs initialisation of the world, such as loading configuration from disk. + /// + public override void StartUp() + { + m_log = new LogBase(m_logFilename, "Region", this, m_silent); + MainLog.Instance = m_log; + + + configManager = new ConfigurationManager(); + + this.serversData = new NetworkServersInfo(); + configManager.addConfigurationMember((ConfigurationMember)this.serversData); + configManager.gatherConfiguration(); + configManager.clearConfigurationMembers(); + + ScenePresence.LoadTextureFile("avatar-texture.dat"); + + ClientView.TerrainManager = new TerrainManager(new SecondLife()); + + if (m_sandbox) + { + this.SetupLocalGridServers(); + // this.checkServer = new CheckSumServer(12036); + // this.checkServer.ServerListener(); + this.commsManager = new CommunicationsLocal(this.serversData); + } + else + { + this.SetupRemoteGridServers(); + this.commsManager = new CommunicationsOGS1(this.serversData); + } + + startuptime = DateTime.Now; + + this.physManager = new PhysicsManager(); + this.physManager.LoadPlugins(); + + this.SetupHttpListener(); + + this.SetupWorld(); + + m_log.Verbose("Main.cs:Startup() - Initialising HTTP server"); + + + + if (m_sandbox) + { + httpServer.AddXmlRPCHandler("login_to_simulator", ((CommunicationsLocal)this.commsManager).UserServices.XmlRpcLoginMethod); + } + + //Start http server + m_log.Verbose("Main.cs:Startup() - Starting HTTP server"); + httpServer.Start(); + + // Start UDP servers + for (int i = 0; i < m_udpServer.Count; i++) + { + this.m_udpServer[i].ServerListener(); + } + + } + + # region Setup methods + protected override void SetupLocalGridServers() + { + try + { + AssetCache = new AssetCache("OpenSim.Region.GridInterfaces.Local.dll", this.serversData.AssetURL, this.serversData.AssetSendKey); + InventoryCache = new InventoryCache(); + } + catch (Exception e) + { + m_log.Error(e.Message + "\nSorry, could not setup local cache"); + Environment.Exit(1); + } + + } + + protected override void SetupRemoteGridServers() + { + try + { + AssetCache = new AssetCache("OpenSim.Region.GridInterfaces.Remote.dll", this.serversData.AssetURL, this.serversData.AssetSendKey); + InventoryCache = new InventoryCache(); + } + catch (Exception e) + { + m_log.Error(e.Message + "\nSorry, could not setup remote cache"); + Environment.Exit(1); + } + } + + protected override void SetupWorld() + { + Scene LocalWorld; + UDPServer udpServer; + RegionInfo regionDat = new RegionInfo(); + AuthenticateSessionsBase authenBase; + + string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Regions"); + string[] configFiles = Directory.GetFiles(path, "*.xml"); + + if (configFiles.Length == 0) + { + string path2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Regions"); + string path3 = Path.Combine(path2, "default.xml"); + Console.WriteLine("Creating default region config file"); + //TODO create default region + IGenericConfig defaultConfig = new XmlConfig(path3); + defaultConfig.LoadData(); + defaultConfig.Commit(); + defaultConfig.Close(); + defaultConfig = null; + configFiles = Directory.GetFiles(path, "*.xml"); + } + + for (int i = 0; i < configFiles.Length; i++) + { + AuthenticateSessionsBase authen = new AuthenticateSessionsBase(); + this.AuthenticateSessionsHandler.Add(authen); + authenBase = authen; + + + regionDat = new RegionInfo(); + regionDat.setConfigurationFilename(configFiles[i]); + configManager.addConfigurationMember((ConfigurationMember)regionDat); + configManager.gatherConfiguration(); + configManager.clearConfigurationMembers(); + + + udpServer = new UDPServer(regionDat.InternalEndPoint.Port, this.AssetCache, this.InventoryCache, this.m_log, authenBase); + + m_udpServer.Add(udpServer); + this.regionData.Add(regionDat); + + LocalWorld = new Scene(udpServer.PacketServer.ClientAPIs, regionDat, authenBase, commsManager, this.AssetCache, httpServer); + this.m_localWorld.Add(LocalWorld); + //LocalWorld.InventoryCache = InventoryCache; + //LocalWorld.AssetCache = AssetCache; + + udpServer.LocalWorld = LocalWorld; + + LocalWorld.LoadStorageDLL("OpenSim.Region.Storage.LocalStorageDb4o.dll"); //all these dll names shouldn't be hard coded. + LocalWorld.LoadWorldMap(); + + m_log.Verbose("Main.cs:Startup() - Starting up messaging system"); + LocalWorld.PhysScene = this.physManager.GetPhysicsScene(this.m_physicsEngine); + LocalWorld.PhysScene.SetTerrain(LocalWorld.Terrain.getHeights1D()); + LocalWorld.LoadPrimsFromStorage(); + + //Master Avatar Setup + UserProfileData masterAvatar = commsManager.UserServer.SetupMasterUser(LocalWorld.RegionInfo.MasterAvatarFirstName, LocalWorld.RegionInfo.MasterAvatarLastName, LocalWorld.RegionInfo.MasterAvatarSandboxPassword); + if (masterAvatar != null) + { + LocalWorld.RegionInfo.MasterAvatarAssignedUUID = masterAvatar.UUID; + LocalWorld.localStorage.LoadParcels((ILocalStorageParcelReceiver)LocalWorld.parcelManager); + } + + + LocalWorld.StartTimer(); + } + } + + private class SimStatusHandler : IStreamHandler + { + public byte[] Handle(string path, Stream request) + { + return Encoding.UTF8.GetBytes("OK"); + } + + public string ContentType + { + get { return "text/plain"; } + } + + public string HttpMethod + { + get { return "GET"; } + } + + public string Path + { + get { return "/simstatus/"; } + } + } + + protected override void SetupHttpListener() + { + httpServer = new BaseHttpServer(this.serversData.HttpListenerPort); //regionData[0].IPListenPort); + + if (!this.m_sandbox) + { + httpServer.AddStreamHandler( new SimStatusHandler() ); + } + } + + protected override void ConnectToRemoteGridServer() + { + + } + + #endregion + + private void SetupFromConfigFile(IGenericConfig configData) + { + // Log filename + string attri = ""; + attri = configData.GetAttribute("LogFilename"); + if (String.IsNullOrEmpty(attri)) + { + } + else + { + m_logFilename = attri; + } + + // SandBoxMode + attri = ""; + attri = configData.GetAttribute("SandBox"); + if ((attri == "") || ((attri != "false") && (attri != "true"))) + { + this.m_sandbox = false; + configData.SetAttribute("SandBox", "false"); + } + else + { + this.m_sandbox = Convert.ToBoolean(attri); + } + + // LoginServer + attri = ""; + attri = configData.GetAttribute("LoginServer"); + if ((attri == "") || ((attri != "false") && (attri != "true"))) + { + this.m_loginserver = false; + configData.SetAttribute("LoginServer", "false"); + } + else + { + this.m_loginserver = Convert.ToBoolean(attri); + } + + // Sandbox User accounts + attri = ""; + attri = configData.GetAttribute("UserAccount"); + if ((attri == "") || ((attri != "false") && (attri != "true"))) + { + this.user_accounts = false; + configData.SetAttribute("UserAccounts", "false"); + } + else if (attri == "true") + { + this.user_accounts = Convert.ToBoolean(attri); + } + + // Grid mode hack to use local asset server + attri = ""; + attri = configData.GetAttribute("LocalAssets"); + if ((attri == "") || ((attri != "false") && (attri != "true"))) + { + this.gridLocalAsset = false; + configData.SetAttribute("LocalAssets", "false"); + } + else if (attri == "true") + { + this.gridLocalAsset = Convert.ToBoolean(attri); + } + + + attri = ""; + attri = configData.GetAttribute("PhysicsEngine"); + switch (attri) + { + default: + m_log.Warn("Main.cs: SetupFromConfig() - Invalid value for PhysicsEngine attribute, terminating"); + Environment.Exit(1); + break; + + case "": + this.m_physicsEngine = "basicphysics"; + configData.SetAttribute("PhysicsEngine", "basicphysics"); + ScenePresence.PhysicsEngineFlying = false; + break; + + case "basicphysics": + this.m_physicsEngine = "basicphysics"; + configData.SetAttribute("PhysicsEngine", "basicphysics"); + ScenePresence.PhysicsEngineFlying = false; + break; + + case "RealPhysX": + this.m_physicsEngine = "RealPhysX"; + ScenePresence.PhysicsEngineFlying = true; + break; + + case "OpenDynamicsEngine": + this.m_physicsEngine = "OpenDynamicsEngine"; + ScenePresence.PhysicsEngineFlying = true; + break; + } + + configData.Commit(); + + } + + /// + /// Performs any last-minute sanity checking and shuts down the region server + /// + public virtual void Shutdown() + { + m_log.Verbose("Main.cs:Shutdown() - Closing all threads"); + m_log.Verbose("Main.cs:Shutdown() - Killing listener thread"); + m_log.Verbose("Main.cs:Shutdown() - Killing clients"); + // IMPLEMENT THIS + m_log.Verbose("Main.cs:Shutdown() - Closing console and terminating"); + for (int i = 0; i < m_localWorld.Count; i++) + { + ((Scene)m_localWorld[i]).Close(); + } + m_log.Close(); + Environment.Exit(0); + } + + #region Console Commands + /// + /// Runs commands issued by the server console from the operator + /// + /// The first argument of the parameter (the command) + /// Additional arguments passed to the command + public void RunCmd(string command, string[] cmdparams) + { + switch (command) + { + case "help": + m_log.Error("show users - show info about connected users"); + m_log.Error("shutdown - disconnect all clients and shutdown"); + break; + + case "show": + if (cmdparams.Length > 0) + { + Show(cmdparams[0]); + } + break; + + case "terrain": + string result = ""; + for (int i = 0; i < m_localWorld.Count; i++) + { + if (!((Scene)m_localWorld[i]).Terrain.RunTerrainCmd(cmdparams, ref result, m_localWorld[i].RegionInfo.RegionName)) + { + m_log.Error(result); + } + } + break; + + case "shutdown": + Shutdown(); + break; + + default: + m_log.Error("Unknown command"); + break; + } + } + + /// + /// Outputs to the console information about the region + /// + /// What information to display (valid arguments are "uptime", "users") + public void Show(string ShowWhat) + { + switch (ShowWhat) + { + case "uptime": + m_log.Error("OpenSim has been running since " + startuptime.ToString()); + m_log.Error("That is " + (DateTime.Now - startuptime).ToString()); + break; + case "users": + ScenePresence TempAv; + m_log.Error(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}{6,-16}", "Firstname", "Lastname", "Agent ID", "Session ID", "Circuit", "IP", "World")); + for (int i = 0; i < m_localWorld.Count; i++) + { + foreach (libsecondlife.LLUUID UUID in ((Scene)m_localWorld[i]).Entities.Keys) + { + if (((Scene)m_localWorld[i]).Entities[UUID].ToString() == "OpenSim.world.Avatar") + { + TempAv = (ScenePresence)((Scene)m_localWorld[i]).Entities[UUID]; + m_log.Error(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}{6,-16}", TempAv.firstname, TempAv.lastname, UUID, TempAv.ControllingClient.AgentId, "Unknown", "Unknown"), ((Scene)m_localWorld[i]).RegionInfo.RegionName); + } + } + } + break; + } + } + #endregion + } + + +} diff --git a/OpenSim/Region/Application/VersionInfo.cs b/OpenSim/Region/Application/VersionInfo.cs new file mode 100644 index 0000000000..2c720a3304 --- /dev/null +++ b/OpenSim/Region/Application/VersionInfo.cs @@ -0,0 +1,36 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim +{ + /// + /// + public class VersionInfo + { + public static string Version = "0.3, SVN build "; + } +} diff --git a/OpenSim/Region/Application/obj/Debug/OpenSim.pdb b/OpenSim/Region/Application/obj/Debug/OpenSim.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e0888d0395c34c23df5d9fd378807496dbcf3ea6 GIT binary patch literal 28160 zcmeI43xL&CoyY%|8AcusFbJq1GAM8GG6N%^B99qBP>{!f5@K+fxiBL$_f9i+M6BGu zMm|alEltf5S1nE3EX_*ID9zVemZ*`do4H!nQa-|>mDT-x&*RR2h6@Y@Tgn{x&F7wT ze&_xCpYy+WUTsxlx+%RnQ(Q5&V)W?Zd6lz@C&o)k3cK~6Q5j%5ng78=J{}R1LlBI& z==l2qsDUu?UWYk|Yhcnf>cnpx#5Hhm7rpxvrLjrs0==AoqTs#v@?l=cpAPeZu7Mq^ z7EXQSkS#?UD}&ARZ|-!{!!u92?sva=x@hB6Yw!N0iUHWiGACa(`iV)sD~~z*d*vI7D|S59c2tc(XB?7;6d-YAEK-7W zM-GG7K4x zC@&+CG013yq6NnxJ&=RV?63Bpvvc`9i(byV{fIC3EPVB`x5^H-dVIf@H`n~Hu^XNL zWmoyy^8H%oj(oS&!2TNldz=5&clNdh^dwvAcb$<#k&ZQhN;tq~f3<(d{C|KO>HtOG zjd=TTt}_qObAX@YFUGzV`_hPLf9CgZ+OxGCuUpnXJAc5LufEf>@z#xacbNA<4Rj@s z`(ywA=8Ic~b+rHcpuyW@@!i+oeVw5m%+jBV6PH&uuc@u8%_Nu4Z%C#pYwMRUO0KC* zr!Ch4knq$|Iuu4>ThUfK1<0_mz| zr7ORvE>0b$9W`*E+TSLfA5>HhDIHRR!J!i;Kk*v@RKrj~v89&1GnX{sTZ9FU(uQkccii&h9lT2k6 zuWvBjp+uqyf1UxeeKjY(@5FG)GHs z@xb0!9=iF_n4Smr#r(6jf5-UW^PK9(zi1|^g;q_EZZJnHoN7kFtZsrzgvkdhTNR><$Xzvl_>d&Ur- znL4+&F`cSs`yQ{XN~V&WEvRoX{iwf1=ae%4OyT=pi+>O_F-?`H&zqO7PLfV>k&4sG zKa*(8%uTPUO;sivd3wj2yW-*^6+f!iP_w?NwyJ4n3QavsC@uB9s7|7;F1>D6-TK

bZN?YXGUHWD}nr(w1 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 HYT*9>OY4f_ literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Application/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Region/Application/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..0d687f7c682e7d5026d0ee6b587462eaa68d8f37 GIT binary patch literal 83427 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 G<^Kcrs+uMM literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Application/obj/OpenSim.csproj.FileList.txt b/OpenSim/Region/Application/obj/OpenSim.csproj.FileList.txt new file mode 100644 index 0000000000..42432b3330 --- /dev/null +++ b/OpenSim/Region/Application/obj/OpenSim.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.exe +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.exe +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.exe +obj\Debug\OpenSim.pdb +..\..\..\bin\OpenSim.pdb diff --git a/OpenSim/Region/Application/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Application/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..726734ac1a11ebd802ac25ad1cfce06d25cacdd7 GIT binary patch literal 83335 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 J(+dik{137;fxrL& literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Caches/AssetCache.cs b/OpenSim/Region/Caches/AssetCache.cs new file mode 100644 index 0000000000..453edbe4c6 --- /dev/null +++ b/OpenSim/Region/Caches/AssetCache.cs @@ -0,0 +1,669 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Threading; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Caches +{ + public delegate void DownloadComplete(AssetCache.TextureSender sender); + + ///

+ /// Manages local cache of assets and their sending to viewers. + /// + public class AssetCache : IAssetReceiver + { + public Dictionary Assets; + public Dictionary Textures; + + public List AssetRequests = new List(); //assets ready to be sent to viewers + public List TextureRequests = new List(); //textures ready to be sent + + public Dictionary RequestedAssets = new Dictionary(); //Assets requested from the asset server + public Dictionary RequestedTextures = new Dictionary(); //Textures requested from the asset server + + public Dictionary SendingTextures = new Dictionary(); + private IAssetServer _assetServer; + private Thread _assetCacheThread; + private LLUUID[] textureList = new LLUUID[5]; + + /// + /// + /// + public AssetCache(IAssetServer assetServer) + { + Console.WriteLine("Creating Asset cache"); + _assetServer = assetServer; + _assetServer.SetReceiver(this); + Assets = new Dictionary(); + Textures = new Dictionary(); + this._assetCacheThread = new Thread(new ThreadStart(RunAssetManager)); + this._assetCacheThread.IsBackground = true; + this._assetCacheThread.Start(); + + } + + public AssetCache(string assetServerDLLName, string assetServerURL, string assetServerKey) + { + Console.WriteLine("Creating Asset cache"); + _assetServer = this.LoadAssetDll(assetServerDLLName); + _assetServer.SetServerInfo(assetServerURL, assetServerKey); + _assetServer.SetReceiver(this); + Assets = new Dictionary(); + Textures = new Dictionary(); + this._assetCacheThread = new Thread(new ThreadStart(RunAssetManager)); + this._assetCacheThread.IsBackground = true; + this._assetCacheThread.Start(); + + } + + /// + /// + /// + public void RunAssetManager() + { + while (true) + { + try + { + //Console.WriteLine("Asset cache loop"); + this.ProcessAssetQueue(); + this.ProcessTextureQueue(); + Thread.Sleep(500); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + } + + public void LoadDefaultTextureSet() + { + //hack: so we can give each user a set of textures + textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001"); + textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002"); + textureList[2] = new LLUUID("00000000-0000-0000-9999-000000000003"); + textureList[3] = new LLUUID("00000000-0000-0000-9999-000000000004"); + textureList[4] = new LLUUID("00000000-0000-0000-9999-000000000005"); + + for (int i = 0; i < textureList.Length; i++) + { + this._assetServer.RequestAsset(textureList[i], true); + } + + } + + public AssetBase[] CreateNewInventorySet(LLUUID agentID) + { + AssetBase[] inventorySet = new AssetBase[this.textureList.Length]; + for (int i = 0; i < textureList.Length; i++) + { + if (this.Textures.ContainsKey(textureList[i])) + { + inventorySet[i] = this.CloneImage(agentID, this.Textures[textureList[i]]); + TextureImage image = new TextureImage(inventorySet[i]); + this.Textures.Add(image.FullID, image); + this._assetServer.UploadNewAsset(image); //save the asset to the asset server + } + } + return inventorySet; + } + + public AssetBase GetAsset(LLUUID assetID) + { + AssetBase asset = null; + if (this.Textures.ContainsKey(assetID)) + { + asset = this.Textures[assetID]; + } + else if (this.Assets.ContainsKey(assetID)) + { + asset = this.Assets[assetID]; + } + return asset; + } + + public void AddAsset(AssetBase asset) + { + // Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated()); + if (asset.Type == 0) + { + //Console.WriteLine("which is a texture"); + if (!this.Textures.ContainsKey(asset.FullID)) + { //texture + TextureImage textur = new TextureImage(asset); + this.Textures.Add(textur.FullID, textur); + this._assetServer.UploadNewAsset(asset); + } + } + else + { + if (!this.Assets.ContainsKey(asset.FullID)) + { + AssetInfo assetInf = new AssetInfo(asset); + this.Assets.Add(assetInf.FullID, assetInf); + this._assetServer.UploadNewAsset(asset); + } + } + } + + /// + /// + /// + private void ProcessTextureQueue() + { + if (this.TextureRequests.Count == 0) + { + //no requests waiting + return; + } + int num; + num = this.TextureRequests.Count; + + AssetRequest req; + for (int i = 0; i < num; i++) + { + req = (AssetRequest)this.TextureRequests[i]; + if (!this.SendingTextures.ContainsKey(req.ImageInfo.FullID)) + { + TextureSender sender = new TextureSender(req); + sender.OnComplete += this.TextureSent; + lock (this.SendingTextures) + { + this.SendingTextures.Add(req.ImageInfo.FullID, sender); + } + } + + } + + this.TextureRequests.Clear(); + } + + /// + /// Event handler, called by a TextureSender object to say that texture has been sent + /// + /// + public void TextureSent(TextureSender sender) + { + if (this.SendingTextures.ContainsKey(sender.request.ImageInfo.FullID)) + { + lock (this.SendingTextures) + { + this.SendingTextures.Remove(sender.request.ImageInfo.FullID); + } + } + } + + public void AssetReceived(AssetBase asset, bool IsTexture) + { + if (asset.FullID != LLUUID.Zero) // if it is set to zero then the asset wasn't found by the server + { + //check if it is a texture or not + //then add to the correct cache list + //then check for waiting requests for this asset/texture (in the Requested lists) + //and move those requests into the Requests list. + if (IsTexture) + { + TextureImage image = new TextureImage(asset); + this.Textures.Add(image.FullID, image); + if (this.RequestedTextures.ContainsKey(image.FullID)) + { + AssetRequest req = this.RequestedTextures[image.FullID]; + req.ImageInfo = image; + if (image.Data.LongLength > 600) + { + //over 600 bytes so split up file + req.NumPackets = 1 + (int)(image.Data.Length - 600 + 999) / 1000; + } + else + { + req.NumPackets = 1; + } + this.RequestedTextures.Remove(image.FullID); + this.TextureRequests.Add(req); + } + } + else + { + AssetInfo assetInf = new AssetInfo(asset); + this.Assets.Add(assetInf.FullID, assetInf); + if (this.RequestedAssets.ContainsKey(assetInf.FullID)) + { + AssetRequest req = this.RequestedAssets[assetInf.FullID]; + req.AssetInf = assetInf; + if (assetInf.Data.LongLength > 600) + { + //over 600 bytes so split up file + req.NumPackets = 1 + (int)(assetInf.Data.Length - 600 + 999) / 1000; + } + else + { + req.NumPackets = 1; + } + this.RequestedAssets.Remove(assetInf.FullID); + this.AssetRequests.Add(req); + } + } + } + } + + public void AssetNotFound(AssetBase asset) + { + //the asset server had no knowledge of requested asset + + } + + #region Assets + /// + /// + /// + /// + /// + public void AddAssetRequest(IClientAPI userInfo, TransferRequestPacket transferRequest) + { + LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0); + //check to see if asset is in local cache, if not we need to request it from asset server. + + if (!this.Assets.ContainsKey(requestID)) + { + //not found asset + // so request from asset server + if (!this.RequestedAssets.ContainsKey(requestID)) + { + AssetRequest request = new AssetRequest(); + request.RequestUser = userInfo; + request.RequestAssetID = requestID; + request.TransferRequestID = transferRequest.TransferInfo.TransferID; + this.RequestedAssets.Add(requestID, request); + this._assetServer.RequestAsset(requestID, false); + } + return; + } + //it is in our cache + AssetInfo asset = this.Assets[requestID]; + + //work out how many packets it should be sent in + // and add to the AssetRequests list + AssetRequest req = new AssetRequest(); + req.RequestUser = userInfo; + req.RequestAssetID = requestID; + req.TransferRequestID = transferRequest.TransferInfo.TransferID; + req.AssetInf = asset; + + if (asset.Data.LongLength > 600) + { + //over 600 bytes so split up file + req.NumPackets = 1 + (int)(asset.Data.Length - 600 + 999) / 1000; + } + else + { + req.NumPackets = 1; + } + + this.AssetRequests.Add(req); + } + + /// + /// + /// + private void ProcessAssetQueue() + { + if (this.AssetRequests.Count == 0) + { + //no requests waiting + return; + } + int num; + + if (this.AssetRequests.Count < 5) + { + //lower than 5 so do all of them + num = this.AssetRequests.Count; + } + else + { + num = 5; + } + AssetRequest req; + for (int i = 0; i < num; i++) + { + req = (AssetRequest)this.AssetRequests[i]; + + TransferInfoPacket Transfer = new TransferInfoPacket(); + Transfer.TransferInfo.ChannelType = 2; + Transfer.TransferInfo.Status = 0; + Transfer.TransferInfo.TargetType = 0; + Transfer.TransferInfo.Params = req.RequestAssetID.GetBytes(); + Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length; + Transfer.TransferInfo.TransferID = req.TransferRequestID; + req.RequestUser.OutPacket(Transfer); + + if (req.NumPackets == 1) + { + TransferPacketPacket TransferPacket = new TransferPacketPacket(); + TransferPacket.TransferData.Packet = 0; + TransferPacket.TransferData.ChannelType = 2; + TransferPacket.TransferData.TransferID = req.TransferRequestID; + TransferPacket.TransferData.Data = req.AssetInf.Data; + TransferPacket.TransferData.Status = 1; + req.RequestUser.OutPacket(TransferPacket); + } + else + { + //more than one packet so split file up , for now it can't be bigger than 2000 bytes + TransferPacketPacket TransferPacket = new TransferPacketPacket(); + TransferPacket.TransferData.Packet = 0; + TransferPacket.TransferData.ChannelType = 2; + TransferPacket.TransferData.TransferID = req.TransferRequestID; + byte[] chunk = new byte[1000]; + Array.Copy(req.AssetInf.Data, chunk, 1000); + TransferPacket.TransferData.Data = chunk; + TransferPacket.TransferData.Status = 0; + req.RequestUser.OutPacket(TransferPacket); + + TransferPacket = new TransferPacketPacket(); + TransferPacket.TransferData.Packet = 1; + TransferPacket.TransferData.ChannelType = 2; + TransferPacket.TransferData.TransferID = req.TransferRequestID; + byte[] chunk1 = new byte[(req.AssetInf.Data.Length - 1000)]; + Array.Copy(req.AssetInf.Data, 1000, chunk1, 0, chunk1.Length); + TransferPacket.TransferData.Data = chunk1; + TransferPacket.TransferData.Status = 1; + req.RequestUser.OutPacket(TransferPacket); + } + + } + + //remove requests that have been completed + for (int i = 0; i < num; i++) + { + this.AssetRequests.RemoveAt(0); + } + + } + + public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset) + { + AssetInfo newAsset = new AssetInfo(); + newAsset.Data = new byte[sourceAsset.Data.Length]; + Array.Copy(sourceAsset.Data, newAsset.Data, sourceAsset.Data.Length); + newAsset.FullID = LLUUID.Random(); + newAsset.Type = sourceAsset.Type; + newAsset.InvType = sourceAsset.InvType; + return (newAsset); + } + #endregion + + #region Textures + /// + /// + /// + /// + /// + public void AddTextureRequest(IClientAPI userInfo, LLUUID imageID) + { + //Console.WriteLine("texture request for " + imageID.ToStringHyphenated()); + //check to see if texture is in local cache, if not request from asset server + if (!this.Textures.ContainsKey(imageID)) + { + if (!this.RequestedTextures.ContainsKey(imageID)) + { + //not is cache so request from asset server + AssetRequest request = new AssetRequest(); + request.RequestUser = userInfo; + request.RequestAssetID = imageID; + request.IsTextureRequest = true; + this.RequestedTextures.Add(imageID, request); + this._assetServer.RequestAsset(imageID, true); + } + return; + } + + //Console.WriteLine("texture already in cache"); + TextureImage imag = this.Textures[imageID]; + AssetRequest req = new AssetRequest(); + req.RequestUser = userInfo; + req.RequestAssetID = imageID; + req.IsTextureRequest = true; + req.ImageInfo = imag; + + if (imag.Data.LongLength > 600) + { + //over 600 bytes so split up file + req.NumPackets = 1 + (int)(imag.Data.Length - 600 + 999) / 1000; + } + else + { + req.NumPackets = 1; + } + this.TextureRequests.Add(req); + } + + public TextureImage CloneImage(LLUUID newOwner, TextureImage source) + { + TextureImage newImage = new TextureImage(); + newImage.Data = new byte[source.Data.Length]; + Array.Copy(source.Data, newImage.Data, source.Data.Length); + //newImage.filename = source.filename; + newImage.FullID = LLUUID.Random(); + newImage.Name = source.Name; + return (newImage); + } + #endregion + + private IAssetServer LoadAssetDll(string dllName) + { + Assembly pluginAssembly = Assembly.LoadFrom(dllName); + IAssetServer server = null; + + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (pluginType.IsPublic) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IAssetPlugin", true); + + if (typeInterface != null) + { + IAssetPlugin plug = (IAssetPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + server = plug.GetAssetServer(); + break; + } + + typeInterface = null; + } + } + } + pluginAssembly = null; + return server; + } + + public class AssetRequest + { + public IClientAPI RequestUser; + public LLUUID RequestAssetID; + public AssetInfo AssetInf; + public TextureImage ImageInfo; + public LLUUID TransferRequestID; + public long DataPointer = 0; + public int NumPackets = 0; + public int PacketCounter = 0; + public bool IsTextureRequest; + //public bool AssetInCache; + //public int TimeRequested; + + public AssetRequest() + { + + } + } + + public class AssetInfo : AssetBase + { + public AssetInfo() + { + + } + + public AssetInfo(AssetBase aBase) + { + Data = aBase.Data; + FullID = aBase.FullID; + Type = aBase.Type; + InvType = aBase.InvType; + Name = aBase.Name; + Description = aBase.Description; + } + } + + public class TextureImage : AssetBase + { + public TextureImage() + { + + } + + public TextureImage(AssetBase aBase) + { + Data = aBase.Data; + FullID = aBase.FullID; + Type = aBase.Type; + InvType = aBase.InvType; + Name = aBase.Name; + Description = aBase.Description; + } + } + + public class TextureSender + { + public AssetRequest request; + public event DownloadComplete OnComplete; + Thread m_thread; + public TextureSender(AssetRequest req) + { + request = req; + //Console.WriteLine("creating worker thread for texture " + req.ImageInfo.FullID.ToStringHyphenated()); + //Console.WriteLine("texture data length is " + req.ImageInfo.Data.Length); + // Console.WriteLine("in " + req.NumPackets + " packets"); + //ThreadPool.QueueUserWorkItem(new WaitCallback(SendTexture), new object()); + + //need some sort of custom threadpool here, as using the .net one, overloads it and stops the handling of incoming packets etc + //but don't really want to create a thread for every texture download + m_thread = new Thread(new ThreadStart(SendTexture)); + m_thread.IsBackground = true; + m_thread.Start(); + } + + public void SendTexture() + { + //Console.WriteLine("starting to send sending texture " + request.ImageInfo.FullID.ToStringHyphenated()); + while (request.PacketCounter != request.NumPackets) + { + SendPacket(); + Thread.Sleep(500); + } + + //Console.WriteLine("finished sending texture " + request.ImageInfo.FullID.ToStringHyphenated()); + if (OnComplete != null) + { + OnComplete(this); + } + } + + public void SendPacket() + { + AssetRequest req = request; + // Console.WriteLine("sending " + req.ImageInfo.FullID); + + // if (req.ImageInfo.FullID == new LLUUID("00000000-0000-0000-5005-000000000005")) + if (req.PacketCounter == 0) + { + //first time for this request so send imagedata packet + if (req.NumPackets == 1) + { + //only one packet so send whole file + ImageDataPacket im = new ImageDataPacket(); + im.ImageID.Packets = 1; + im.ImageID.ID = req.ImageInfo.FullID; + im.ImageID.Size = (uint)req.ImageInfo.Data.Length; + im.ImageData.Data = req.ImageInfo.Data; + im.ImageID.Codec = 2; + req.RequestUser.OutPacket(im); + req.PacketCounter++; + //req.ImageInfo.l= time; + //System.Console.WriteLine("sent texture: " + req.ImageInfo.FullID); + // Console.WriteLine("sending packet 1 for " + req.ImageInfo.FullID.ToStringHyphenated()); + } + else + { + //more than one packet so split file up + ImageDataPacket im = new ImageDataPacket(); + im.ImageID.Packets = (ushort)req.NumPackets; + im.ImageID.ID = req.ImageInfo.FullID; + im.ImageID.Size = (uint)req.ImageInfo.Data.Length; + im.ImageData.Data = new byte[600]; + Array.Copy(req.ImageInfo.Data, 0, im.ImageData.Data, 0, 600); + im.ImageID.Codec = 2; + req.RequestUser.OutPacket(im); + req.PacketCounter++; + //req.ImageInfo.last_used = time; + //System.Console.WriteLine("sent first packet of texture: + // Console.WriteLine("sending packet 1 for " + req.ImageInfo.FullID.ToStringHyphenated()); + } + } + else + { + //Console.WriteLine("sending packet" + req.PacketCounter + "for " + req.ImageInfo.FullID.ToStringHyphenated()); + //send imagepacket + //more than one packet so split file up + ImagePacketPacket im = new ImagePacketPacket(); + im.ImageID.Packet = (ushort)req.PacketCounter; + im.ImageID.ID = req.ImageInfo.FullID; + int size = req.ImageInfo.Data.Length - 600 - 1000 * (req.PacketCounter - 1); + if (size > 1000) size = 1000; + im.ImageData.Data = new byte[size]; + Array.Copy(req.ImageInfo.Data, 600 + 1000 * (req.PacketCounter - 1), im.ImageData.Data, 0, size); + req.RequestUser.OutPacket(im); + req.PacketCounter++; + //req.ImageInfo.last_used = time; + //System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID); + } + + } + } + } +} + diff --git a/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj b/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj new file mode 100644 index 0000000000..4a73d08dac --- /dev/null +++ b/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj @@ -0,0 +1,97 @@ + + + Local + 8.0.50727 + 2.0 + {61FCCDB3-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Caches + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Caches + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj.user b/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Caches/OpenSim.Region.Caches.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Caches/Properties/AssemblyInfo.cs b/OpenSim/Region/Caches/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..8389415957 --- /dev/null +++ b/OpenSim/Region/Caches/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Region.Caches")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Region.Caches")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2b15ddbf-0341-49a6-85c0-cece268a4518")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Region/Caches/obj/Debug/OpenSim.Region.Caches.dll b/OpenSim/Region/Caches/obj/Debug/OpenSim.Region.Caches.dll new file mode 100644 index 0000000000000000000000000000000000000000..a4e57ffd25b7dd65a4a4cdea310b7ecd4cdfad65 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Caches/obj/Debug/OpenSim.Region.Caches.pdb b/OpenSim/Region/Caches/obj/Debug/OpenSim.Region.Caches.pdb new file mode 100644 index 0000000000000000000000000000000000000000..046d6e82c7de95cdae94dc58b1cd3e8b01890fd7 GIT binary patch literal 28160 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Caches/obj/OpenSim.Region.Caches.csproj.FileList.txt b/OpenSim/Region/Caches/obj/OpenSim.Region.Caches.csproj.FileList.txt new file mode 100644 index 0000000000..2fe1f4eac6 --- /dev/null +++ b/OpenSim/Region/Caches/obj/OpenSim.Region.Caches.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Region.Caches.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Caches.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Caches.dll +obj\Debug\OpenSim.Region.Caches.pdb +..\..\..\bin\OpenSim.Region.Caches.pdb diff --git a/OpenSim/Region/Caches/obj/Release/OpenSim.Region.Caches.dll b/OpenSim/Region/Caches/obj/Release/OpenSim.Region.Caches.dll new file mode 100644 index 0000000000000000000000000000000000000000..85580b855949eadcae0fded8eb7bbcf7e772edd1 GIT binary patch literal 24576 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

|-Rn$d z++6QqYT}sV^`^5~8gftNvTiCp=uYLcj_W$CqXr-RqnvI-akI;oMP|_TjgD z#ey?Dm6~+Q#F&#yI|Z8ZCfq_cGfrdEp6^W2&SKWjOr$)2$jLgBDeiRqR%gPm^t}x~ zopesQh2sl3y~8=*DI85rI35j)S9_faCvy_rlm}U9-Meo(4>i%+lJXqto$%cP4d+g} z#~p4xotxO}c<=@~zz0*=?09P8IBh|ga)H{`TspwC_q~H|HVbDFN3VCglXD802^z`> zBUP9_GC&xq=S;Y{bT)I;p^=gOd^!{-ymDYX8p(M6k$%k%f?1JP=m2rjLF)<~1luEy zFpj1bT8CuJDR4jzr+C%^BJh6Sv4WH0CZw@INv1a7@UJp4lk6ewE#{=}ov9q=wLl|C zl_BS73NZ`%9CLgcgiYVs<(xvKoE&02&D`ydFKuaaS`UCm3oho(3tH|eI>qW#39>1e z&$N!sF4y1Y7ISGD9?WK7d-Le<`~dfkV#XXF!7HS4-chFz1WB_ieFxmK3*wk|U@+_E zoQk7?Z)J56>YV1Gi`o#%CXny<5R(8GS$U>W5+u!ZZOnHKN<%3>HR@(KmuXjVsyqh$ zK8OLcV7MHqvNwgG>UQTU<(f*T4_A=|XUaY4RCA^d`!eN{D#7Rk4+0eA#a`!Vkku0R zsqyUewoKMJ;1oP$`eq+Dpz$Iql}E|K1%k32xSpAEbeXz&PQDD+>h@wLJ!b{(AINx_ z@vJk)D_b5!ZXx{^3NXQGXDU@VzECvi=BEpp$z%RP5pphFoOlfZhcK0!Uf5#L%^l55 z77Hn^@rB|c$D1f*@~Ndf=xjs>T98Gc6&x~iX z8NbS5SFf5=j(^NelcyKkiSi;=&?{T2Y7M~1JU8pm4TX%4`p!8>1i!L=>hd4+Qw1N! z{KLcE7L?XxLCR0FtBehejO@ZHO;xP@dq=9t>z!$~uh$=`gR!jR-NqZ^%qOK$$~a1QmB;+RXl(&j=TrTrLjbCV-Z zZqh$SMJxd_IDdYTSJopI;sXI}E9DhR)Ok3gDQt9eD;GSkRtXAp@EHCNfs>WdU>5u$ z8l(znE}ZR-zh&A-f$@w5_Qo=|I~26uUGxL2Y+92SFnK+i?<8}?s36=2W+OixL~FB8 zIp@^wQ`r8#ttbIVM2_^(sH4gBK7%@Nq&Jn$xe+ zkdO}Ie}U-H2`NqI%?;7YL40nF5+k27l%q*X^7$M89B`5}0m%d%14YAqH2+^ug|5an zlKwZxo8PLR)Ei`J;0?31<_)v7_6@VNj#T?_)m)6?bHgI$hi8fCMdK56-CzHF_v!S( z_}NYGUr+XWJB^T~xId!_Uk9ir)kN%i z6E!K@3SqoQx z&BS2#&aBkax6hz%K{RgvArEm(-@ojuFiAB<55_-XvvbrfOL z=9k@UMa7TVI}@|-$KTQj%!TohVki6GjM2a>x;0E0ew#^X`#^(<&J(i_!8@KrU=0RO zFy5iifp>V9Sh?7;pqy9ug$xZ;#VPxe;9)268=E%fcwapX448s}HQPJB+c zhSefai$E;`wFuNAP>aBCe*_dht;cV`iDu`Il}{t`U(^@yS#Jkk2an+Q0KrG^%xes- z1w4T75e@@xrM;`uhOxfgk;TttJTP!g=2fFnb6u1*<9C z5Vzspk;N@=7`Kn3gkMnLSuU;iL7D>BgIwPtUAdvK#wWvhgKdoAE?EffmkTY8h|b(C zaV?GGW=XUU--@eB&qL_l!(Ei^2Yrq~GDW?J0X~xf&T{^?rF?_sA6N9@ z;5TRU05tL8LZHhY_oGE$<;6Z+41FH8FSeA}#O zM7(5cgYYzuZ#8*jlela9&{@b!(!)43Ch@Bdjuiit0=HU#9-&K8{H2 zM`7EA-$lgTuNw8QGj5`_67%`CE{yzzao-?q%AZ6`AtSPgP!icVf5t9shp^P1S_Enl zs70U_fm#G=5vWC=7J*s>Y7wYK;QuxPoAht)8}YS8?Wske7J*s>Y7wYKpca8z1Zoke VMW7aeS_Enls70U_f#1#u{1-wvH%b5i literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Caches/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Caches/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..1b042da16efea3ae43629100fdef2ea77143dda6 GIT binary patch literal 9405 zcmeHM&2tn*6yM&=e#|6f6BGqS3<4@7Y!V=)Mk0n_BtjHfib9FC&hGXmLuO~<%xpp^ zg;_G`E~H);KxDqfCtg5;>GW~SF1c&h_a@eajkWe7zRgIB?w%gWogL>Ap zotW=Ve84VD=ni*U(CL7k<9i%?(#UZqjteQ{2v^7>H@aUpi`)%`8X7{8NMpR(vxdrj zt*v77(47ANdi3sXjj&3CR27H_i5ArGiAG6m9OxZM6-N!z@c2l^utpx4;8w~gBnKV6 zz^80yoQB47ZIdT+rWu8s>#p1cs&P_Xl}wJ5{?WB*WL%!Lt(pOiYokSLTw3&2(GnXG5+m?<=CU6CR2C4VLNB!4W4V#U6&U!=JdnldQ*Mlw~?A{c;0k9xE2$`Og{Zpw2EYqWu_@+Z+=p7$qyAa<}oU5+Qm zFz6wq4O~+eZGyUjnyELDXhq~u7=k4NdNWm`D@p8}L;Ts4*uBt{XcbK}1`Y^w#XMiU zxwlYrbrr;|5N#w{K`9gl774>wQzd#Ei5-DiJ!^DV@}7m|abYxwc`Zh-q2}sZh;cpR+-dvwEDR_;Tje9y=rKTk)~gQh;} zCPYWG?O7}qVhy6i!r^$cPi)_cp2}ij<&DvzqhpOLQ=L*I|q6@%L`#AtyZ0v z?Enj*+D=WC-)M7lbt8pz5}U-DpH7G3$_%meSLzHM(j6k{FI2mxp$a|$NcoxiT*wFp zn<8mx3`tDPp)LWD&IIfh5NQn4D!Pe8>zt9()Xj8V4EYwSY+U$|W2k$m3H!kx9c6~V zMIX=&GVOap7%rI2zM~5KELn|QCd}*=n#gJb-YX#Tn}AydY%9Y)0aue0KHW!^C4nrb zsoUt9@aKN2tiPN;fkuKh{iM#mCHoL*Wrn~vKA;=q%LPIeU%nkCqxuy#;rBH0P} zpnynw0`3$L2~fZx0g?EGFAq^=zNxW`?hC(mQ{^hB#xONyU;1t-GX%Z}_;^nC@pIY7 z1ZE~mSi$_dB$Hu1i>8P5L$*U-hJ`Qj3ZbU=@<{_5EwqhO0Tocr(-!D?ov07i)>_UF z*KemnoCLI)@TwShbME%BcufQ4}mi zbyn3dtDd9)OR0#KAD>qlsm7y#LfG zQ^S-gQh?`s3!JR5XbLPkArXhYC;^SVAhYPW%%a3LYKjtO{Uos!LQzX!LMnKZtrM+= ziS{%FSlS9bL$I{PK1wzAtVAU?BLR&aBUCvDIZ6QMAk>E5%5dIMCru5L<~a&*WkGwM zK#4NPsm6{F4a$e4Y+3>uJ4~oTnJEIZl);%;oia5{nU^TQn*YPXfr6>2rz*5L4cfR8 zQ%HoWZvQEQ}n~IroL98&RI~$l-R6eY}X8ZMs$;YhlL-u4nWqKrf3t0N=(S8Vy?B*Rf9RPj5rToO2%3aa9Ws;VkZ z8-l7hb*QR3MmJEx46m0^L6J9T3A|1Od&6r*)!wjYL`6?g6C$Rhnd&4%M nYHvvUK~<#xs;Z~vsA9@jRYhn;ujjUJDcBrE literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Capabilities/Caps.cs b/OpenSim/Region/Capabilities/Caps.cs new file mode 100644 index 0000000000..fdc21cf6a2 --- /dev/null +++ b/OpenSim/Region/Capabilities/Caps.cs @@ -0,0 +1,336 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; +using OpenSim.Region.Caches; + +namespace OpenSim.Region.Capabilities +{ + public delegate void UpLoadedTexture(LLUUID assetID, LLUUID inventoryItem, byte[] data); + + public class Caps + { + private string m_httpListenerHostName; + private int m_httpListenPort; + private string m_capsObjectPath = "00001-"; + private string m_requestPath = "0000/"; + private string m_mapLayerPath = "0001/"; + private string m_newInventory = "0002/"; + private string m_requestTexture = "0003/"; + private string eventQueue = "0100/"; + private BaseHttpServer httpListener; + private LLUUID agentID; + private AssetCache assetCache; + private int eventQueueCount = 1; + private Queue CapsEventQueue = new Queue(); + + public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, int httpPort, string capsPath, LLUUID agent) + { + assetCache = assetCach; + m_capsObjectPath = capsPath; + httpListener = httpServer; + m_httpListenerHostName = httpListen; + m_httpListenPort = httpPort; + agentID = agent; + } + + ///

+ /// + /// + public void RegisterHandlers() + { + Console.WriteLine("registering CAPS handlers"); + string capsBase = "/CAPS/" + m_capsObjectPath; + + + AddLegacyCapsHandler( httpListener, m_mapLayerPath, MapLayer); + + //httpListener.AddStreamHandler( + // new LLSDStreamhandler("POST", capsBase + m_mapLayerPath, this.GetMapLayer )); + + AddLegacyCapsHandler(httpListener, m_requestPath, CapsRequest); + AddLegacyCapsHandler(httpListener, m_newInventory, NewAgentInventory); + AddLegacyCapsHandler( httpListener, eventQueue, ProcessEventQueue); + AddLegacyCapsHandler( httpListener, m_requestTexture, RequestTexture); + + } + + public LLSDMapLayerResponse GetMapLayer(LLSDMapRequest mapReq) + { + LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse(); + mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse()); + return mapResponse; + } + + [Obsolete("Use BaseHttpServer.AddStreamHandler(new LLSDStreamHandler( LLSDMethod delegate )) instead.")] + private void AddLegacyCapsHandler(BaseHttpServer httpListener, string path, RestMethod restMethod) + { + string capsBase = "/CAPS/" + m_capsObjectPath; + httpListener.AddStreamHandler(new RestStreamHandler("POST", capsBase + path, restMethod)); + } + + /// + /// + /// + /// + /// + /// + /// + public string CapsRequest(string request, string path, string param) + { + // Console.WriteLine("Caps Request " + request); + string result = ""; + result = LLSDHelpers.SerialiseLLSDReply(this.GetCapabilities()); + return result; + } + + /// + /// + /// + /// + protected LLSDCapsDetails GetCapabilities() + { + LLSDCapsDetails caps = new LLSDCapsDetails(); + string capsBaseUrl = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" + m_capsObjectPath; + + caps.MapLayer = capsBaseUrl + m_mapLayerPath; + // caps.NewFileAgentInventory = capsBaseUrl + m_newInventory; + + return caps; + } + + /// + /// + /// + /// + /// + /// + /// + public string MapLayer(string request, string path, string param) + { + Encoding _enc = Encoding.UTF8; + Hashtable hash = (Hashtable)LLSD.LLSDDeserialize(_enc.GetBytes(request)); + LLSDMapRequest mapReq = new LLSDMapRequest(); + LLSDHelpers.DeserialiseLLSDMap(hash, mapReq); + + LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse(); + mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse()); + string res = LLSDHelpers.SerialiseLLSDReply(mapResponse); + + return res; + } + + + /// + /// + /// + /// + protected LLSDMapLayer BuildLLSDMapLayerResponse() + { + LLSDMapLayer mapLayer = new LLSDMapLayer(); + mapLayer.Right = 5000; + mapLayer.Top = 5000; + mapLayer.ImageID = new LLUUID("00000000-0000-0000-9999-000000000006"); + + return mapLayer; + } + + /// + /// + /// + /// + /// + /// + /// + public string RequestTexture(string request, string path, string param) + { + // Needs implementing (added to remove compiler warning) + return ""; + } + + /// + /// + /// + /// + /// + /// + /// + public string ProcessEventQueue(string request, string path, string param) + { + string res = ""; + + if (this.CapsEventQueue.Count > 0) + { + lock (this.CapsEventQueue) + { + string item = CapsEventQueue.Dequeue(); + res = item; + } + } + else + { + res = this.CreateEmptyEventResponse(); + } + return res; + } + + /// + /// + /// + /// + /// + /// + public string CreateEstablishAgentComms(string caps, string ipAddressPort) + { + LLSDCapEvent eventItem = new LLSDCapEvent(); + eventItem.id = eventQueueCount; + //should be creating a EstablishAgentComms item, but there isn't a class for it yet + eventItem.events.Array.Add(new LLSDEmpty()); + string res = LLSDHelpers.SerialiseLLSDReply(eventItem); + eventQueueCount++; + + this.CapsEventQueue.Enqueue(res); + return res; + } + + /// + /// + /// + /// + public string CreateEmptyEventResponse() + { + LLSDCapEvent eventItem = new LLSDCapEvent(); + eventItem.id = eventQueueCount; + eventItem.events.Array.Add(new LLSDEmpty()); + string res = LLSDHelpers.SerialiseLLSDReply(eventItem); + eventQueueCount++; + return res; + } + + /// + /// + /// + /// + /// + /// + /// + public string NewAgentInventory(string request, string path, string param) + { + //Console.WriteLine("received upload request:"+ request); + string res = ""; + LLUUID newAsset = LLUUID.Random(); + LLUUID newInvItem = LLUUID.Random(); + string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000"); + AssetUploader uploader = new AssetUploader(newAsset, newInvItem, uploaderPath, this.httpListener); + + AddLegacyCapsHandler( httpListener, uploaderPath, uploader.uploaderCaps); + + string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" + uploaderPath; + //Console.WriteLine("uploader url is " + uploaderURL); + res += ""; + res += "uploader" + uploaderURL + ""; + //res += "successtrue"; + res += "stateupload"; + res += ""; + uploader.OnUpLoad += this.UploadHandler; + return res; + } + + /// + /// + /// + /// + /// + /// + public void UploadHandler(LLUUID assetID, LLUUID inventoryItem, byte[] data) + { + // Console.WriteLine("upload handler called"); + AssetBase asset; + asset = new AssetBase(); + asset.FullID = assetID; + asset.Type = 0; + asset.InvType = 0; + asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000"); + asset.Data = data; + this.assetCache.AddAsset(asset); + } + + public class AssetUploader + { + public event UpLoadedTexture OnUpLoad; + + private string uploaderPath = ""; + private LLUUID newAssetID; + private LLUUID inventoryItemID; + private BaseHttpServer httpListener; + public AssetUploader(LLUUID assetID, LLUUID inventoryItem, string path, BaseHttpServer httpServer) + { + newAssetID = assetID; + inventoryItemID = inventoryItem; + uploaderPath = path; + httpListener = httpServer; + + } + + public string uploaderCaps(string request, string path, string param) + { + Encoding _enc = Encoding.UTF8; + byte[] data = _enc.GetBytes(request); + //Console.WriteLine("recieved upload " + Util.FieldToString(data)); + LLUUID inv = this.inventoryItemID; + string res = ""; + res += ""; + res += "new_asset" + newAssetID.ToStringHyphenated() + ""; + res += "new_inventory_item" + inv.ToStringHyphenated() + ""; + res += "statecomplete"; + res += ""; + + // Console.WriteLine("asset " + newAssetID.ToStringHyphenated() + " , inventory item " + inv.ToStringHyphenated()); + httpListener.RemoveStreamHandler("POST", "/CAPS/" + uploaderPath); + + if (OnUpLoad != null) + { + OnUpLoad(newAssetID, inv, data); + } + + /*FileStream fs = File.Create("upload.jp2"); + BinaryWriter bw = new BinaryWriter(fs); + bw.Write(data); + bw.Close(); + fs.Close();*/ + return res; + } + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDArray.cs b/OpenSim/Region/Capabilities/LLSDArray.cs new file mode 100644 index 0000000000..e04849f372 --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDArray.cs @@ -0,0 +1,42 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections; + +namespace OpenSim.Region.Capabilities +{ + [LLSDType("ARRAY")] + public class LLSDArray + { + public ArrayList Array = new ArrayList(); + + public LLSDArray() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDCapEvent.cs b/OpenSim/Region/Capabilities/LLSDCapEvent.cs new file mode 100644 index 0000000000..51b4fe079c --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDCapEvent.cs @@ -0,0 +1,41 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Region.Capabilities +{ + [LLSDType("MAP")] + public class LLSDCapEvent + { + public int id = 0; + public LLSDArray events = new LLSDArray(); + + public LLSDCapEvent() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDCapsDetails.cs b/OpenSim/Region/Capabilities/LLSDCapsDetails.cs new file mode 100644 index 0000000000..1f8b24293d --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDCapsDetails.cs @@ -0,0 +1,15 @@ +namespace OpenSim.Region.Capabilities +{ + [LLSDType("MAP")] + public class LLSDCapsDetails + { + public string MapLayer = ""; + //public string NewFileAgentInventory = ""; + //public string EventQueueGet = ""; + + public LLSDCapsDetails() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDEmpty.cs b/OpenSim/Region/Capabilities/LLSDEmpty.cs new file mode 100644 index 0000000000..d79c09e813 --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDEmpty.cs @@ -0,0 +1,38 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Region.Capabilities +{ + [LLSDType("MAP")] + public class LLSDEmpty + { + public LLSDEmpty() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDHelpers.cs b/OpenSim/Region/Capabilities/LLSDHelpers.cs new file mode 100644 index 0000000000..19ef0c9910 --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDHelpers.cs @@ -0,0 +1,164 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.IO; +using System.Reflection; +using System.Xml; +using libsecondlife; + +namespace OpenSim.Region.Capabilities +{ + public class LLSDHelpers + { + public static string SerialiseLLSDReply(object obj) + { + StringWriter sw = new StringWriter(); + XmlTextWriter writer = new XmlTextWriter(sw); + writer.Formatting = Formatting.None; + writer.WriteStartElement(String.Empty, "llsd", String.Empty); + SerializeLLSDType(writer, obj); + writer.WriteEndElement(); + writer.Close(); + return sw.ToString(); + } + + public static void SerializeLLSDType(XmlTextWriter writer, object obj) + { + Type myType = obj.GetType(); + LLSDType[] llsdattributes = (LLSDType[])myType.GetCustomAttributes(typeof(LLSDType), false); + if (llsdattributes.Length > 0) + { + switch (llsdattributes[0].ObjectType) + { + case "MAP": + writer.WriteStartElement(String.Empty, "map", String.Empty); + FieldInfo[] fields = myType.GetFields(); + for (int i = 0; i < fields.Length; i++) + { + object fieldValue = fields[i].GetValue(obj); + LLSDType[] fieldAttributes = (LLSDType[])fieldValue.GetType().GetCustomAttributes(typeof(LLSDType), false); + if (fieldAttributes.Length > 0) + { + writer.WriteStartElement(String.Empty, "key", String.Empty); + writer.WriteString(fields[i].Name); + writer.WriteEndElement(); + SerializeLLSDType(writer, fieldValue); + } + else + { + writer.WriteStartElement(String.Empty, "key", String.Empty); + writer.WriteString(fields[i].Name); + writer.WriteEndElement(); + LLSD.LLSDWriteOne(writer, fieldValue); + } + } + writer.WriteEndElement(); + break; + case "ARRAY": + // LLSDArray arrayObject = obj as LLSDArray; + // ArrayList a = arrayObject.Array; + ArrayList a = (ArrayList)obj.GetType().GetField("Array").GetValue(obj); + if (a != null) + { + writer.WriteStartElement(String.Empty, "array", String.Empty); + foreach (object item in a) + { + SerializeLLSDType(writer, item); + } + writer.WriteEndElement(); + } + break; + } + } + else + { + LLSD.LLSDWriteOne(writer, obj); + } + } + + public static object DeserialiseLLSDMap(Hashtable llsd, object obj) + { + Type myType = obj.GetType(); + LLSDType[] llsdattributes = (LLSDType[])myType.GetCustomAttributes(typeof(LLSDType), false); + if (llsdattributes.Length > 0) + { + switch (llsdattributes[0].ObjectType) + { + case "MAP": + IDictionaryEnumerator enumerator = llsd.GetEnumerator(); + while (enumerator.MoveNext()) + { + FieldInfo field = myType.GetField((string)enumerator.Key); + if (field != null) + { + if (enumerator.Value is Hashtable) + { + object fieldValue = field.GetValue(obj); + DeserialiseLLSDMap((Hashtable) enumerator.Value, fieldValue); + } + else if (enumerator.Value is ArrayList) + { + object fieldValue = field.GetValue(obj); + fieldValue.GetType().GetField("Array").SetValue(fieldValue, enumerator.Value); + //TODO + // the LLSD map/array types in the array need to be deserialised + // but first we need to know the right class to deserialise them into. + } + else + { + field.SetValue(obj, enumerator.Value); + } + } + } + break; + } + } + return obj; + } + } + + + + + + + + + + + + + + + + + + + +} diff --git a/OpenSim/Region/Capabilities/LLSDMapLayer.cs b/OpenSim/Region/Capabilities/LLSDMapLayer.cs new file mode 100644 index 0000000000..566d0e9085 --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDMapLayer.cs @@ -0,0 +1,46 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Region.Capabilities +{ + [LLSDType("MAP")] + public class LLSDMapLayer + { + public int Left = 0; + public int Right = 0; + public int Top = 0; + public int Bottom = 0; + public LLUUID ImageID = LLUUID.Zero; + + public LLSDMapLayer() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDMapLayerResponse.cs b/OpenSim/Region/Capabilities/LLSDMapLayerResponse.cs new file mode 100644 index 0000000000..ce746ae82e --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDMapLayerResponse.cs @@ -0,0 +1,41 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Region.Capabilities +{ + [LLSDType("MAP")] + public class LLSDMapLayerResponse + { + public LLSDMapRequest AgentData = new LLSDMapRequest(); + public LLSDArray LayerData = new LLSDArray(); + + public LLSDMapLayerResponse() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDMapRequest.cs b/OpenSim/Region/Capabilities/LLSDMapRequest.cs new file mode 100644 index 0000000000..fb739cd04e --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDMapRequest.cs @@ -0,0 +1,13 @@ +namespace OpenSim.Region.Capabilities +{ + [LLSDType("MAP")] + public class LLSDMapRequest + { + public int Flags = 0; + + public LLSDMapRequest() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDMethod.cs b/OpenSim/Region/Capabilities/LLSDMethod.cs new file mode 100644 index 0000000000..5f42f446cc --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDMethod.cs @@ -0,0 +1,8 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Region.Capabilities +{ + public delegate TResponse LLSDMethod(TRequest request); +} diff --git a/OpenSim/Region/Capabilities/LLSDStreamHandler.cs b/OpenSim/Region/Capabilities/LLSDStreamHandler.cs new file mode 100644 index 0000000000..ff63353cd8 --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDStreamHandler.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Framework.Servers; +using System.IO; +using System.Collections; +using libsecondlife; + +namespace OpenSim.Region.Capabilities +{ + public class LLSDStreamhandler : BaseStreamHandler + where TRequest : new() + { + private LLSDMethod m_method; + + public LLSDStreamhandler(string httpMethod, string path, LLSDMethod method) + : base(httpMethod, path) + { + m_method = method; + } + + public override byte[] Handle(string path, Stream request) + { + Encoding encoding = Encoding.UTF8; + StreamReader streamReader = new StreamReader(request, encoding); + + string requestBody = streamReader.ReadToEnd(); + streamReader.Close(); + + Hashtable hash = (Hashtable)LLSD.LLSDDeserialize(encoding.GetBytes(requestBody)); + TRequest llsdRequest = new TRequest(); + LLSDHelpers.DeserialiseLLSDMap(hash, llsdRequest); + + TResponse response = m_method(llsdRequest); + + return encoding.GetBytes( LLSDHelpers.SerialiseLLSDReply(response) ); + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDTest.cs b/OpenSim/Region/Capabilities/LLSDTest.cs new file mode 100644 index 0000000000..f23e327b8d --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDTest.cs @@ -0,0 +1,41 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Region.Capabilities +{ + [LLSDType("MAP")] + public class LLSDTest + { + public int Test1 = 20; + public int Test2 = 10; + + public LLSDTest() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDType.cs b/OpenSim/Region/Capabilities/LLSDType.cs new file mode 100644 index 0000000000..c58a9376bd --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDType.cs @@ -0,0 +1,59 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; + +namespace OpenSim.Region.Capabilities +{ + [AttributeUsage(AttributeTargets.Class)] + public class LLSDType : Attribute + { + protected string myType; + + public LLSDType(string type) + { + myType = type; + + } + + public string ObjectType + { + get + { + return myType; + } + } + } + + [AttributeUsage(AttributeTargets.Class)] + public class LLSDMap : LLSDType + { + public LLSDMap() : base( "MAP" ) + { + } + } +} diff --git a/OpenSim/Region/Capabilities/LLSDUploadReply.cs b/OpenSim/Region/Capabilities/LLSDUploadReply.cs new file mode 100644 index 0000000000..023a056b8f --- /dev/null +++ b/OpenSim/Region/Capabilities/LLSDUploadReply.cs @@ -0,0 +1,44 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; + +namespace OpenSim.Region.Capabilities +{ + [LLSDType("MAP")] + public class LLSDUploadReply + { + public string new_asset = ""; + public LLUUID new_inventory_item = LLUUID.Zero; + public string state = ""; + + public LLSDUploadReply() + { + + } + } +} diff --git a/OpenSim/Region/Capabilities/OpenSim.Region.Capabilities.csproj b/OpenSim/Region/Capabilities/OpenSim.Region.Capabilities.csproj new file mode 100644 index 0000000000..1571ee7472 --- /dev/null +++ b/OpenSim/Region/Capabilities/OpenSim.Region.Capabilities.csproj @@ -0,0 +1,149 @@ + + + Local + 8.0.50727 + 2.0 + {39038E85-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Capabilities + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Capabilities + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + ..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Caches + {61FCCDB3-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Capabilities/OpenSim.Region.Capabilities.csproj.user b/OpenSim/Region/Capabilities/OpenSim.Region.Capabilities.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Capabilities/OpenSim.Region.Capabilities.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Capabilities/obj/Debug/OpenSim.Region.Capabilities.dll b/OpenSim/Region/Capabilities/obj/Debug/OpenSim.Region.Capabilities.dll new file mode 100644 index 0000000000000000000000000000000000000000..5ce87743a0865e80b0548b1583ac7bd970dca2b0 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Capabilities/obj/Debug/OpenSim.Region.Capabilities.pdb b/OpenSim/Region/Capabilities/obj/Debug/OpenSim.Region.Capabilities.pdb new file mode 100644 index 0000000000000000000000000000000000000000..93529034b014b15c2f4fa287ace45b9d4a3ff10f GIT binary patch literal 50688 zcmeI53w%}8z32Dg5qU)nDo=p`34&lqc;gH506{^Kha#dTBnOfjl9&XQ7JHA@RvGIp z&gfKU>r7;)B6?i4Q-{xxdmDn45RZ`+w8h3UW>i{`!Pq;7`k9bH)B+ z903!9k3a4M_D=AVbD!!KXlQO)S6kCkv%aCRp}isAwyv?Ut*)lEwPs66ZCfy{t+jUA zhK9y?+qBwK*0pWks8I2B%`Ne!wuVjXTH_nj#wWq}74fF_Lr7wCOJj3QU2D9h@em8r zRu^xtX=rRagtD}6X^9^~^!TQh_MTRPmNX?-?>qsL2KL6_KNv-9`tpnKlD1JIQt2AG`IyE1lBKyNR#3<=|j&5cv%O zbM8~n0_nzo&4SVKU-znNDt-#8|5smy_t&2{|LLP%DA>L-caJb-y>}~Kyr%W;+cmJreZTi3?|$&e zHwGW~(1>qtiajxRCWFKsj83oMx7Sf029TGJ4}xd7-v^z*fFoQCK1=vg@O=btD$j0V zq>{W%;<_5b+YCk;;53M>hR%mBfYv}4LTjOmpmh-01Vf==&~QlUOoonwMnM`(M?+(v zu}~p24jKn?Drh0J2s#s53@w4qg3gA{fzE}_gO)=pAg$3?K_@~zaoOVkDQl*# z{rhh}viF6fcmHnmoL}wiNm+7n{`@VV{_rgQZa)1^^6JO<^>niB^jGz*Oi9W|YJbgU zeDhBDd!IS&?cWZ3DNDu6C3BctAY1&; zjsJ(4QHLq{Z1MlWOZ%*D>O23*FZ7x8{>F=s`PN}7ZZ6p@w?MY|zqa<)-~9af*?&Cs z^_^e5^_HWwpO|x>fELIW{~s@S@c9A1Ub^$`rY~*3yI1W^pMa|8ibxA&i~pNyFW*2mWYAO|Ef287+`4{pl`>oW-}P+6 z@9rB@aOK(?Cr-NPpC)LFKj%IHEs!n#r=I_O0;--XA}z50o&E2y{U3Zs2Wyq5tXt`A zJkG_&VC%-|tKx0Oz9Y!QFr?i@$|R%3@y3>TtFeN}B&+&lv`lha zR@1VyW=p(P_8ysJx2dM3(Z|aqzm@H+@tRGGYntjBGtacmM6ORp&Ln4F(-rZymgc55 zW8u=18n;H`XPEzr_~o0OL}ZwAYcgggd6s*_rcAO6t)Vi>iT<+Cn?Plf83sS0=~O29 ztv2>jE4;l_CRwJKT4jxXjgKac;*T+7lT=Z@qS$d>;1-EZx>d)sMS zp8Dm@Kbt!L_=z7%I!FDwG*(}`?E~2lNOB|{lAd^^LGI+*haLH&7uG4Pq*-C*7Y!?k z^p^r7EOQdso{g_U14ta^hF z`|*Y~uPdy2iNeY+8dg2QhduMjzpqzV^%jMdUo@eg{Gws;%DF#d3uKG`srFxpx3RSode^7d=hw=>81c*Ng%#iLxt8tP z`2>pbuaIlGzR+TGWo+^iGIAat1PR&m6@jwbD+Xn|huvGEf3N_9=Go9hXn>)8`1OM% z>vFo5lf6^UC0ig{{7<$2=o5Rmk9ds+V0b+{I7v3-!7Yv-Pb7;VyUM&x1FVJ;SZy@k zDz%6(LxbK0^B>5^a%E9jQ7Mk+@|PT?_|KHTY&J*Y4@CTf z;L>)JIm2{^IIN6#eKHSw(LQ~CGXGzn{_ce@ zEqS=Of3F|hyQ`X@!7?m9Wjor3%=*NJ7~^~2Ug{fHL8qE_iJ5TR8aZy%1+F+2n7%O? z9K!ucpk4%+0*(Zyg5$uG!AT%53?$SxrC>g#$`6{eHvXrc|EsUgB_G+@&U5*n0#d%idwdgpBfKuDY;J6f*S7Q8P#dkCe7*$3=4iMT@eMAVUQS7d zTeGPVu5sVku)Zx`+swX6!-lx+@9LLyrL^OL`mOku^bdlzE0cXa`uxgPUUF*Hd(U}6 z#liY6nQ9!;ydsptbT&wx>rQdwpX}V_J|IKyc$Bx18}n#oytSdGvEj3Ev&qIv*NuUA z-bO&h^IXXbn2+XTx?d`1%>o>Cz zXzR6;K(|n@2f^D3uQ(ciiPs_ShK6`!orzOep!SWXTf@EP3F(qrkv_%!n~>5H-+9y_ ze1m!3yWknZufp?Q?ls;jyq{O1>6^UIuW8&2FI2C-gzMyAo~)SUM&!#RJ$?dl`Vz_4 zPd3ugG?2JWJTmco{O-*g_N6V-GV`pLv)5Ee9CJhHkk7noSB9V}-X=-Q7XMT2KbVWd zxmIne`qB)Y%XP)1pT^`%sszTH+og59Ka`#c^w+Z{7T^*G#mmT89n>KHX zx7M^b)4#=^Cy93t@xD#CCtN(0hx|IkGcv$4#rcpp^~90>`Nv3JJnkIF$&Hr>#obBV zlL%WzCQ+G-)-ft`ULHL5L@p%X+ac)%(zTa?a@pd4s{M!b@O-qEeBOS^=Pj9h-eSpT zCe3H=%{O!Hc%!GQTzhFlJEq0LaZ&Heydvh|W}@S(omjIbG~Tg`mC!poyknD4J4#Q` zcs7@N$rJC~BotrIl`hwbt3lqqNn8i={!QXb&i_V`cX1M51{Z)|1mRy7WW^6XM@L6k)>b}2oDnIYI?6HF%x78 zOw0n8gR?=E6P?K*I+00l33wjQmxC+7)!_MHD|i981ysIQgRHX?p9e1lrFX9dZ*}-T zK!wW||5MNZf9KMF8>}N=9Wuqie+M^!?}P9rVdZ2pGSL7{p_TN~s&qNHj2pq5UL)Yh z7_)<*`;ol2wFJ5W5|{NJ*BG?Di=is$6zELz>_C1>=QKD!*}R>lbf-gOp=#(vldjF{ zBGM{C_H213BFi?va)Z;&TVEzP_p^yR(xjt0$l1D-8dO~+C#t(0hhyRRJc;LOGr7;u zF1ox7l)R(w8+m7f=pgS++)Lh@LA8YVi7W)I++XbO*MsP+iCS}+$dbgT?``5kL`pU+!}D%(EN5>Mf=al`r5*mFPh473+w zcn&l^{5f2<_@8S3(TBoEbz;?}PcOSCK-I$iAIa@B=0nX%0~83?8y+f)0%atgz`GSK*#a|dsMZ1F#J|2IAVJMaH3rifP%Sp0X&VW7BnWJgdO z|KV#wBP#2e#9(kB*q^@EKPc=Z3))+jlPuID2U~NpVA>j!>hs5dMc^>77}R*l>_bCQqO#uPEU(GFP{a3fU?_ep+$Y>aA2U${CQ(LbTG)DAfd_#ZfG`{&gyQ!}8 z>5Rj>6Bt{b>}&ZDs0{3=w>on{RYYUlbudY5O2zYGJCAWeAj_eOnl{54KgRj~pZH+Z zpkY7yam@B$pZme_lhFSgkBz-6`TR@Tf84!o)>@U}NVETl_R}Mw|L4wsle)xJ$jjkA z|CL%$;?Aa&pIo8&wLj=8c@HrtXdVch{@0UnPtjBLI=>dM>Bqu+8SXl)1*Dp4Eie=; z0!M?zp!VPGS|Bs~k3&8G#n#){h?BjU2QtwW{rSGvX-|+6h;!<6q|CWX~ZSHKO zH5YDfjhpfQD*X0BisQp|9`C!S(?OP_8zv@F?|EzO;a~aRPqn>%%qcL92HlfYfCYW~(%y^_U^esQd^I@ZV z0a3e-oc)Jw*(1gNLwg2ESvGUVEZN9S=efpE%`qwdrShM_b3cYA{X3uANBz>B+wVkf za`qoV@RzdxXl$^(nYY1AUw#fdXcG z%*^LgK}g>~P0R$f_joF(y~herdyi*>WuQHW&Dnn(>GmHxVE9`2^}oQ2z;A);!0&?C z5F~av|3^TbzwdGQDtHP0d%;V=H^6G}O>jM!v;R=fIr8m4uBD7u!mlrYtTz(>6%?QU z8@Pr0{|=fW0<^1snN9U1x>{ZFbL8UxPp zfA+y_;t8yDbuK9M?k{ov@9jTw=f9QEN66-|o&VeRi222k=>s~)mn&v&ly05L z`M)i9_Rjyc2YV0n7_?o^Rh2`w#Z_Ojz$9<$qUuKIUB3o$p5W zf=bSeH}N_`tv&0_o&Sa$INayI(f+UfW;v}1y<@$X*N;sgBN~T1|EIVAwCQKh{!?e+ zgV?(`(EF8VxHGSvY%IuWUF#j^N_lrO>zO*2*VQeJZ>*`^q8C!#!8-vp2EI=oEyPz` zAHMV0lK$L1)AvFB7+5cc;YL_6zhf!yZeLy%)14W~Q{}veGR`EP;`neXr|K8wf4csU zE|6DrkpA!ebNzo;HBFk7JLE&{8`Xm{wg1rg`@enrcfz8B8pD3>>wxS~jqq<0Dum>xkzVYo<27Dp-&fcV?8;PUvK8)(eW9&uK*WcGK>EHRBJL*?o(^jv7D4yCi>Sy}h<+fea zrk(ukhveXuJ)4jE_vBj$UiK?od$mh(#_8Ah*+aN#gvfX>sU{3x%azZrjeZ2#fw&3yFkyv=dFD=nEVr1KOJSMhvUl~uBZTA8-2@|S$2 z_;)x@(!84DKi!{O`gi@4{$}hl^6-v1FmD27G5x%fZ$P%k7q+$6tmizgzI-EpJGHWT)224thU-*b(olRK$G0K- z8eO)b@=E$MZt8=COYDp0Y9r+x_0L8hEu|6Vsw|k_V(QwSQdfOi&&W!$iyHncrk)={ zitpnbX?6AU*vmAY+~!H&N`iwm37r9qZLsQ~ars6(oHRL47sq z?@hRt*Rt^Q<3Z?;v5hODve*6XDbM=vSuytu`Oe3>SCe z(JSz$o_LDm!}+%2WGC9^3=cT_40Va5KYvWuHDpi6U!B{&2H7=MEZmz>0bYjWbPlU- zr*l}@UFjTl99RZU1>t{U4#>P`&S|+$Ea84GxC%T4ya+rMTnDmOW!@J)9lVVDGr(4G zK8Oeh3&3l@a&Q}10ruxT=>Fu~pIj}?08fS{LsifhA$=2|2-5rBCqnuzfUZXyKh^a* z$gW{x#-5#9{H!gUt{0P+ct-gX>V9W|=c!xALLfUXFXeGA zR2bG%Y1lPGEZlogAEE7yTTfiovlbiz)`3$%rd5}w%Dyp7Pi3{beJtD?h?ce4rFS`~ zaRh#vZ$&Z1n0M>iLEA2cq`M4CzJpXvc&l&6!uL8fRw+-p&kc9h_8J97F0f80kx+=JoA41%^>|c z_%Gne;4NSkcq_OR{3?ii1h;{<9I|yh-<3mU@qAjuwS8av_k?eRtiBivbx-AA4aw~w zJ(cTDP|xoI#j~%2lFgl<%JWT-J{jB%+WhB|&je^3B>7AB1IdBa?PAhPjO)#>#u>T4 zBMs&GU6WQ2>2+=~zY2(AR51tmkf!8PFj0d2dC zrY#uFaMnI`3Indb)pZ(FXs(T?^G}AGW5P#ycO9NqXNnp9NnxYo$^Ru!wIgGxX@h?T z)kePnCxfqmYV%)$jDx|iK-FarcrN%VXv;j0y!Cw(VHKovUwvaODMwck-s&_lqu+3= zwWX0SUGF6=mE{dk{P7Jv2cEm^7nZ1P@RT@s?!MY zXmBKWJU9xJtYg1wWOX#Socl50#o$=bwr#P?U*CxnZ!dPJIWGBK2mjr;7UCB5VvdED zLoLt^&`#)KXb+_QG7nIyF#?bcCA3A>1)4$8AzEeussvy-v>B~(Z z-axPz)Hpm5l>ANt`=br@cXL~mZ~ES^oYK63^zML?Zmjt}hwiH(wMD;ky5H93tMkE( zvRSic&YMRip%9fuj7+ru~P;f17?R%vVjn*cD(LJX6KTJ6;xnBe)lDS!cWVf26BO z-_-XYI?76+1Pmv>cC`N(rSC@?x07F8_IrD5x7*mfU_N7Bd0F|)S>-mFwC(G>fYCv{ zyHTB$-=w=v?sk6cXa$vJ^QtPUX3uiT93;Qtp$z%_-rZZ=DZeQH?{f)jT=b59ly`j! z|Fu3+ygEo>y?<9{zFPbAL}t`RskQ(bMXcK^5Qm(DVUu3(&GY7fG? z4^mk-Lf)=F78DnlK>WzBn(;+8)p8EP>ut!W^g=l|44La#u((F=#%b)5>m6La*A(MC(@)RK zJo>rDa@GN6Ea%#c<;)L>{)__s(VbKKyxy^u6MuHWn`fY&%Ah(-sto$}y5BL&^T6eq zC%%~WvO5ZP&xZ$k4_;xtzxETTUyx)+=d&-9f5f&G&)E8;bE`ogL0H@-gi=mE~lqOK`lp5!yif8YPBU0Cm*?z^l#ZFl9D+V1N6 zl2MyqEG(z^ta(yy0&<}?D*~nG6@!vz=>VG7P6Q#eiXc$}o&-(>`b+)&1W4bO zk#5(${!iLwtu)4^Hx^t;x`kj3I36@QA^0WkRUXN$);V^)t@XTg-AkYu(0oYi!xfYv zsb6{or=0eLM_N><(?9Vnu{+g2c110Jzp8tFo+BiSn=!Uk<`U z^ndSvB=mokLBm*d3~_&4siL`Vi`mnpIvxD|8KL4zexh;pZjLuUkv~Ik2Y=2O%wL=0 zu^E%Qx0bNq*^w-Yk6s6`au*BdN0r6v0Q8S*;03Z^zl(#MCNu~h2ikceasd3nBvYq=>F%rEVix0^tUVG_@=NV^;(K+NUo0#qRSowdC%_N! zt;q33HqK@-c2?|7rhr4D#?Y^mo)%ZT~eV zH&;73y4=ajd$fuCrHBgioovM2^Ece{n;c&5($V`x3jYn4&dDxbzPtY?7oR;P6Ygqv z-{A7kclfGH?;jj)b9k}CGKa-3UFqY>SKqxAHaO&O4w(CsT{-0^(sy%(=Q;d|OK+Y_ z?-5t7au@!Kt{(5XaLb(kh0g!C&i^Ow{#NJj`{M^LUEfdnn+_)bS3NraO)i~}9G>jb zS?KaT-raxO`9JRBk8|zj$Ai@V|C9^A(BV8E-sKzPc`rIZAJX$qkNovD9sRjW;}qXN z4rAH}>C*Q>LADTablNaJ<9fv3w3RwRk7{8fJTF^r2;BMfKi7v6QcAa>7PN_9IW z)T>Xhpwq*&52W!GruB(F?5Z82Vcd1PrbrXaK2rNJ_i0=;`*oUU7em@xsD`9}OE%qvy1)K z>#XU}3}_}a3)23&wg~4!?0=fCQ=bZ|y-$a<@4o<=50yg|P$kq;H^l8zNN)PL34UlW zSxsR2RG*-9Hn01amQtu_*rU^gJ=%qxUZb;cyZ=#7I!C8`)XArB{cQTv*Q+gU9F?V4 zkmh3(Joj;J7*{qLag5Ioxe4P&{)mQ;S8x1XJR08TsrTM{`9F#feJMVYrw!xc!mwz2 zV1;U4j`R7be0jd@Xpd;vSemdg9~PmAh8>tD>_8W`jPm<>?H^C{|6s{|6!ckBrhy)KUw_etgjRQ^F5#F)X}y(l4M0~ zeL!BqmuT4!SWo2K%j0$QGxjbzeX!8?59{ybF(NOey%evb@wks;{al=gyyzS)KS*z= z?c>@oE^b{?KJ{)ye!z)Iu%#(|?5H$h zkMd#ZE75fOrwNN4mYK85Qs$E0X~OpQ>86ZPeba>P>%*d)c$wzgU)UVGjjo7n+2^(# zr6@AdG7m_T_5fdIDMUHUQ{u=Y{s0ja#xQ7=RGdi#hfeGhsvtH zkKHw-+j)E26aIEzytR6IP&U1E#;h5Y6(&J`4xIO}u-?^#HEq2+qk8-8>3J2i=FKUa zrPbHL@*LC2{^R`%x?kVS?LS6`b@aSlGiq$N+cy*Y4^w&bGd9e#ntQeDj+GhZ*;W;A zuW4v(3o2*KSy)y%OUqZ|4$RN-Vc*gIf%3g!MfdZyv$p*f;q;kR6_sv^c;-E0vTq7|uyHVR`;Sq<4sC4U9zYLNyFT#799IzO%ByiX;b1vf$snE$!HXJ@)$atR1Z#RDaOo=5z=;WtwWfZt4+LQB6e){gkAon2EPj-af zhEV4{-YK5mmAKJ8@bPskKfPPAO}^)KqePqz9~yYQ3Uz14}5#4NVSW;EBu6um+GhQL3n;^U)H-`?9l1&!>MJx?x(+3)6eN5{+V#Fk&YNK zdb5w&7g;`vV*;J_4n(G8Rj#ifcKuJeNZ-5++5>$ZDkSf<&{v>d;1n zh7}uiPW%&2`o`wk%X(_4z+V72178pA9O~nZE&QP$31$yd*yM~Z4k3w8f&E8AbJM!o$TqgI zYpH2%t=V!2?Lva)UGqaoVzYTAw>93`L86JK%5L8;t2J|6<++^3)gCR2x9(0n+pwf;p;;a-oVY=_}% zc$O*cBhE~O*3Q3T)b~+!r08$w*gtYd#2wDeeJ*xfcVbE~sBxnkx&e0E2=TQfd(5u?s{zJko zfmf%}dS7chmFZ-t1Ugjv4cTrifXbl?s1nlJYaz43qhM*eNqW|bmW(gijIPgiVlj73XF)1f{u!gii+oZcK7An>`R-Z z=pS$1ZF6$Z-gDoc`|ju6d)|HbC8lDr*gKT)8>zt}v1NUxJD)4$dW*?bgBhG!GfM8t?5PST71okfk#hv4i$>-KxZ*sbYbQ6W;~a*n&V1E$@ZM*x!pzbppaaX zE^I5NyF3^EIyEG0h=ZEek%3;9OZTi!cNcT{x^i>s+j9fgr1NgR5eIG0^|&4R-1bb5 zo3FbTpw-Aff)Wm9Qr_=|1*V@XlP6_aNZPoGL*l^~GQ{a`JLDI1y zYDqM5jxzB$i4)t~wssEoWxPz$-P)DOZuK%<1-Cnw?eQ|bZnDSo;%M6Z(PkH4<7PWE z1Ig9-^nkk~m+wz@y7}$Yhg_wes?10xx0e3nuv^xz+t|_0g$@-SGx~UZt&8D;`&@qrZ?mEG^7g! zcc9A~x`?{0p~s~j>~XW*8Mn|-=uQ`lZXR_DG24z$Z65tao!f}wp5#h#i1V*4x>;Pa zxJ;50sc`ufsDhu^(|1pqck8n^I!9C9nF(miK zwdkM;Q!y=Fki^ud3!TM$Cfiq|W|haVjc#vw+%?#O2hIW#@r5MLGp_29xuP|B*7)X% z?4ak>fvy;ae_R>%gxlgQqH4}!h$RqbkZ1y|ND6#1!%Ha>Ka)g9^&n6lB4q={IoWXo zfIl|?1IQ#Aa28c_+91w`SO&42L=!G4B!#PpTX7C$;wwljFAdC-bs1MAyUerb#LxM; zRNYw#v5G{~Y!XNcmoq!sPMP?5Bo5P23=N0l==oILSq#bs*lWO(Dk7DgTxsF_PuGhlW)7_F`?eH|L}f zn6F9~-1<~GZl9JyJiXHE%jGl0Z39P}>grscAS&i_-VrI9&~n*6d>zH{9qCMddgT}# zt`{?1h^>d>snuS(uaMvajnr3lbum@Lsm`+MroCn;{L zWQPoACs*s_>Iu23Y0JjzPuYLt3&_2Pm`F7d$+ch zmX`LmmdcGw3*BL~7?p6N;dGI?eSmI2CwE2=D%5SqeOW3MtG9=V^n2-GI3Sh8w7s8l zhjmKKZ-8dsL&qG?nKG+3!XJeIg|EXtRuQVOx{Xx?Ev#l(Mfk$%)vO|H;drZ`GBYc~ zPSxF=c04NQ&KRJ~lCe5t%mZ-8WT~p!S3Z~aFe!V>3KdX8ZYK>V7mZZ6Q3hwF)JDWG z>~?`I5zVk#WEF7@tAnf}!eMngtB7@2-N7ni9B%Tpl!=$(9PJE|!tL8hnUlt9-^lH% zvy1H14dfueu!l*xzN}CIHD(WKeq(l%GSZlH$$%XiX3LcobvLVsc(`;AtB7>i-Rmji zyL$sE?CyssGah$8Om=Fh?4dnO%C&~OJEXhY4R;aautPUfMk_=+tlq*Z;vQCSWfk!b zyL%gDnyPrv&h7L$d%l-4^T#^TRTUYaeN;tdWg`ZRMtHIj{YE1Y^st+EP(~|+Kdj!# z>bi=07pn+~xb$vT5ejje?xD=+QEESZ#_hS6G7}i34v@L(l5I&FZMjOeB}K{zKOIz+ z-Mf!6T5YJPpJWyB5trW2Dk3FTA7B*`61U|+$^=~Sr<4Ozy&W>Je*Hc zRkgX?EPI%gOUeorkms97^RJOkqm77@*zJee5)l)tpJ#OoNp8g>l$l$vAd5`Mk@qQtUkdi!YEdsWEJ5PH|8nI z9IQ*8rgCo3S12>dF8L}|RV!tq&NUjff;7KN&LPFeE^!rAMY3$nu%luY+>69h>(f`~ z^7Jc{#V=myby6GM?HQ~Wp>91T{B|J9$;P}Dw&>1^qC1L>%hBC4)WP)wh3;IQqBZS& zlT>i5oo|s;Z2~}bmQb`hQ_{G!Oe58yC=Ag}1P!n3hVz!-IqKke>CQtt-zBAl%=aj# z770q!LZN82KqAv>AcF`vLMFt>JWn00%QvfA20ZQj$j9c#z@}M{qUH%jtJ5Vma}8{8 zrxalmVr*Wd4z7eV=jGEo=t+fke&(a|bD%Rv(4tNeidH8}bWW1!Bs{8$WGO^H2%APH z8#lBOT_L9HCF)=i{JczRX(oGxa%z@9NgXc~t&Wpi9V@xAvFs5+6JlsyqYn0ipWph( zybfe$2ujpZLeXlvMCM2X87z%O$b=Y~H>rb1FHZfzC+CkKr%}M75<<~xnj~kcK@L_? zBXUAa&Rf*M{>t)SePsRyWE??>suzk@brPAlfecpKBVhF>(dv^p)WeY(#mku3b!;hY6h$$m81<1T5C{ceAidKJ?$o$Db zW>17nxRGfjHjJgiCLfz4fX$nN6!nHswEDfo=64dC1Rm2PSqjhJ17|QiRF7t`5YJ#U z2p=(n9qn^96I{I}P*T4UidL^mu6`}KvTuo?3HNX`i`ejIuoHY_W&@d*1SRTMLec7% z5}98Z$Y6U;G|q&0oS8#x7&F+ZJ~pQTn->Ks>Zd}{>L(JL7bG?bY}Z1v)IO4!!RS~< zvazEoA}hpXHB*<18En4KRT5l1FHllH6pB_qkX(IVa%E%RT?9>tp;<(1j9!jj?31$u z*yDMeU&IX#tLUN+?=ADJgnFQk2+F6d_p(d$%h$^Ttlr`=}rSEySR$ zA$&wAwASb90&w*ufs*>7P_%kXa`mX>%Eq?+2$~Q>b1|{uPiP%JG8=%*!-5j^IiYCv zS&7VN3}ok=aaa7&r5m`q*p%HV+9>)Pq9N>H&$({RTF81t`KM#MoRxY*g)J zz0yY~1#~_kXi*;*idG+!=p2yfB=9;IlBMucms|&WO4A#N^nR9&H?<^?{y+s3U6r2p@=^wVLwhHqAJ8xUyEjA9axQ>^A7ZyW9~yA*N@T*ckmlW4BMv9+2}v z0gL*8P_)`5$=NB%N#M19BunAtd^w+0LhA(Hn8tha)|Yo~-8^&g%Qq>!ISo^beq>7E zObj;EbeqCkae<~US4@3hUm433FSeKtygrsG z-ef?s6y9XO7bD5V*93O1BUuVN*DEIcQCTFgEg8vD*p>_v>NZaPsm2ad($I+d* z{K*787JGKt6Kd$$Wn)uWKUMVHgI*?|n#dFiZYj0jNqOZ$DqBeP509qu?xfSz(h~0o zMeiOU8d5r~{K|*6Rc8AkC6+a*C{Z_BQbFqj+e3Vx&`D{Z7wF9`tiN0*0nyGE>_RgL zp)2=lxA3fo+?yENNAwF#n&yJzM9p(s-WZi4f(6wp3VKJCBI+tRM@yg|dNTm}#MV%6 zP;#Z9RhQ>`6QD%5eL$FJ3qEz%7PNGEPR<3R=z1KT%(ok#x@!y3);h9*HayVqK*IwK z4>UZ`@Ib=@4G%Ot(C|RR0}T)S33;H%=W1MhHq|IXL#v2>wuDGY>;E3SL%V$bECw6e z$EiFXH~k21P1Zu!#NE2X0`$;b6wJlpIc~{d({f`> zxN$(!Z3671C6M(rvc&%-2`9>{Y#px2eJ#VWz<@D!ktfKu4s*J zJOnx!^&qR5z67jmY*4KgYSS~&v{MUIx_pjGri+7hym?{EhL3_L8atu8Ni?(?Nkg=F zT^(8@$q2OQSr>}LnZM3T4N_biLR=^i*Th&YX|UhSRXzW!Auulv0}pv`!MyGQ@B~Vi;8xXYCe793;Vf^Rqgc{(7lOGpwkny7xr-RJw4^19q2W?A ztofJkFG$A9?JOvsjIXwmad$D=UkoSK^fc?#NeXV$D5I9XTR{P$)^43%!W~Awk@fo$ zSZnKNZhQoE(yXoD#uI4J+{-Xm^M<>Dn^6~094}!qB__ATRu`gf8`{c=J zYl&Oob;PE5#j3uLl|8h2WrY>XD2rTkWHJ&ky6`}JRZC2-BctM>O&*p(?_3(@!S&i5 zOTjveXs@KkVa-Qmo3n^`L-P@m<}9YI^lsI3BaIl0YmwO$Zk>Ve?u3m{HJM(9wzy&X zZ^FIFa+l-QY`Gn{!38UDOJ4yX*0tE?xdm|elB9Vb-&Qx51!=C1_LEK;$e`t_kT$i-Tdhk{d_Mb1^4PH90C z0>lWNgN!o5R^&y6ag&x_g&8z`7I|V|;u*QG)q*epVRn+TEL@LOSjadYi zffYiqqt%#2*x_!@A}owfz1yU}6pe_y4?%W%4a9k01E$TecIhtAS7_RdNSP7U&Y76b z^pUdhG^Ci-Ua{eviTPizS8O?FV$EN#S8O_GB1m4ZSByVrB9iKQCEhfG8?ZZ|c3bF; zn=>4tGr?LT0!_D@Er9=9yCZ}lgltM)XklFUz6qPnz}|?z7GvCX05XRnI4>Bt9b9pZ zqu!KAi<{U#blQi0OrP`-A7;Gme$MUY=tA!YU_TXIq|LDRPem{Fel87*wRiC{q}OAH zQ_;&rn^Vyxfy+-t(^sOs$+R@_w=98#CC{bNF3g354D-v>FG!^(N!eyA8l;JMr6u=gzhYo*$7ei*)Y9-hY|i&&{1lI*?F0y3Hx>l^y|ev z&OQ!&#c67|SEFrVPlqI}v7$M>0dzpP8-X@i@$V<1=}kai)Y7O8n4IMWwRsuM>tXi> z_2q52qZB25tTEWM8P0=Q?5&15!}%<0&uLLvdNHy|TOo{#ZVvKB)Uw>SVn&N&L#ONh z7;;6HNxy%7X zIPhe|`v^B}37Q_M>;7#OPa4`e^UbUiiiOFg*pzkST-ysDU{#Vn0s=zy*{!&n3upU+ zTR-2tMH;4Hmn=&COb^}BWGnA#Zf9=<(LcbC-w!Y)3uzI7E)G8*bj-eT|*qXRfN*5|6!Z64SgC2z~h^@If*QCwxh-L}& zmRQY$z^{Y;+Phe8`g$l(b0zww(PwKx``@sg>|(S(&p59D@T!Yjv>Dbz%2QaiSU=%& zkqYn!8@#$TxN9>!XVl_nA~ROq0=JG{zg2}#&WKAoytb>m>&ot{*CH>udgcH>5GPuG z2hnS|PclAQ^0I}4K6C6tx#I0*`JPd_7n=ZfL|VRm&mb0&J_>p__ifF&`j>eYfWkV$zDY2NkfFrmIiH!0Kg?7Afmp7)(#8dV`;71o+l6M1wQ7}$ z(*ZT4OgakOr1t?P=&R}s@c&dVDVsKEotjAnZ4&S`ws`^os~fj+;EoB9rl3fSYtc;K$7OnI?S=(57FT zJnwvqXY8|>XRqL2u})hieZyjzFA9uDxp$Mm5rJP4_yfQ=y%rq;OvG5L^)cq$6YGyH zrN54SGG@~I(Xy0&8T$_Kj`%8eROlUEcZC(}q;**73Nv@qe6X9`kKV|^XQ~d&8WxB`8lClQ27+*|01Xsx&$BY`>OO^LP?=s5NaM`f%{$p zm84euG4%?l_1JM2h?HM}Y5}!S`XUIW2&l`T_dJSYmIy7QwDesneODl^OnL~OGU^RL{GPy-XriM0#EBF!TFTl0r;~1Nx)yq*cHZSfG>&s1h6;4 zl6OUz=N5rHYIlm)_MS^mD)#J@P#>mGDfa9WA@xs)WsQ!aQV@NZl-3SCr%)Lx<4h{f zq3)hTeWFTjg2j&sb(YH74#YukM@>o-4bGwV&Y_r37d^*#zZUAO`j~br?+PLHl$Mda zXU?C^t9=&In*Ons!TRL8BkG6KZe-(+iG76D84GQS16wSF2q&PcUC>6 z-A5>1xPsYFP&++WmGXI7N|Riu=pI^cv``0iToF(M#+O0u7V1vgYdnp5c5m2syYUR- z@iRib2hUFbOsi-Q=w3)66sUA?*(2bxV6VdYu zT}$@{6lEjN;0ySEJY58REi?d3(F+lVBPLh$0Kdtq;SUP_aX_6;0V-l#qt6PyJj!^` z9<(sjs1xlvaj&9v0w)C4^G~4#yCI-XcS!GrEr!U6%#m}qjJjV&eH0MyVE`la7l0;x z0T31mJgu|*K=W6nCD1Ks>B1wh5-Tb^Z@i_5u^N?skAw@YP_#78a|N)zmo+hnZMjgB zJL#nQFM2Ov3-XcS2L-MKG}TJ_ZKPR!mR~{8XNKr0TY&cg#%Rzy2KWv$rOwb% zbA|dkecD_N{x6vu(DJ-_t$LomYxbl4C2*dmSIjbfo6eaF=?pblgKCgc*0A~!by;J8 zo2;AFztXVPf@n=yCG{$KXn&QC0X|Rfv8L5Vy5H(RR-aT4sQFT1e@$ntk1M54s#7Ya zUbdi*V%>gCuUel|-=^PKkE*1aA3dWwh^xh*ShpDb|E87+zFy!;^>ozGK13I2 zr@{07*f+FW)ZfKk&@$?qvG0h4AIe-m)v}P>LRs}%tOM{C^EI^SafVHC4=wZJ=d~;? zi0k_8YE3)|cqQOQ+8jSd85)j1pt?{G->i3`N_Fdfbb@|IcME)2;7ID5nEeHG^ zO$fYO;KOQE{YpJ8uutROlluGBVr{Y7tKO}iQ}eZZwFk8m+NZQL+Sj#Lw7A}`^Ui>? zS!A>9#Y7ABJFuIl5vTKLC7^~KRj2jpA@#WWs(MzPQ^s)&m~*WIg{QjerRYs8^nzaBG`0C>94qL z^G7|@WX|#St*tPQIJcL1GM=^9^D@(dL8*bm zP9bRC>6E72$#4jI{C=mD$>xHI_Y`w(W^%+S=7N!9)5TyuXheI8L+ErS$M9ROvgZ&F zre5E7O2M#D-+_FwG);Mb!u4|5{WLo5mz+Ee?|-K=QKGSmhCo7dDjwX1U(q>7T<=iV zsN)@GS8UDrPGIPcz);#*&Xuwg8Nbx;3vgXUOVpLS&YsZwTt&Y^zCuNThl z8FCJkXe4`Z3Rb#B+Uk}{Zl2%*-y^+jfhY*SFB0jCfWl{aQ`$e@ETRFXEdg*_wNi2!LFE;u}gjHJPVLOJhv8Lqr&tfN>` zU)l564LcDAyZFbzgZ)`-0De$S1$8Kw^C!7O%5BD*zCgy?oN3W2&~MZ!1<0)qzS!Ud z4-*KBi#ie%(Xg0QLWh@>1_~4IBpbte?HSv)AuO;X4t6&WJIK*ei1KaB#iFr6Tc=Bi zG0wAU@jr(B2f7{>n}duQEFhT*6AmGqc*C2h6kRW@#FhPOkDoc{RM(}pkBwzK=;c$1 zw_Yhg7p4VG@{UohO=9{*Wlmb9#7-b}B+W1%7N8FsnTu^i7H}ww6-3KK2BkPtM7`kh zgUy;*N_FZ%`$~O6B`5_uQYGaF=aP^xx1pH9){cFtv~I2Vd`<-&n?ene<=E*KvK%}E z1>TVRc^g0&4jj$07m@ziA|yi*U(6aP1pOn}6|v7&YI*f3;^LOBJ*Du;j2IJDg3*0B zc#|Y7FOt*6=@;$_{6Iq6%DEht1ocmnR8mBCZfGZEj1EiwR3A}LZ}zjFN2CT;Q+~&E zamp#6{7!~FbDf4SO>%gL>eD2?2HJ^lKz8FRie4JQUoYK)wmhEvi?|;mho+^^BM)ti zXMlycqLyy_+@Ak>Xbq{R3We|5LcE7+_}V&rU5NL{Xz;A_FxNrKLaP!moJ^u1D)%*^=H1Y| z*0vGvBlxe@R_P1wSCNWUT4>Q`=o0wxTD-XkyoPT`uHH<6=dPtPw8)VQ&G8Tgt2RTQ zO5bL&wPGp8wQ?`pU)MHVlf^w5e4IZhrGCcOk++1~Dw;B0vw$w&Ge_G=_|l=Hn6V6v z9K=IlIc==zR6zR?8i!s!{v7bK%-?I__KQdIIv>W!0>-+SXByJ7VrBjUS!L*vg&*Om zOL&$#dbB3@jd^JTbLGWa);aL#1)j%IZ1vSYj=$~6M|+?A#gC5uX!w)=NYO7I+k4~U z^*?;CW=8cCDT7p^%_L3P3;5P%FK*M#WV>$KxZA0ixxh|qcvGxeQo2ecDwLJd+9L^j z8F*GiQkrVJ6fZbhRV&3(y1lZM>@{uDV6W87gppDzfyokj8n4qKC)u8CZ;!O3BKFDv z1$zWc_Daa>!RJa7^KMj$=9H=IEA5^{G?8qFKzqL37KH$`*w>gTJ%P(ek-eJ1JSYMh z!#9ht&GD2WQzh&kRv{Wyr0?uSsgUlS43jrN3hYYY%U^rYUchp0!%KPlwq%BFY_o6E z^mcoFgfz&Gq^RA_LRK5AYiDKd+hJK7KH4Iy$-WJ|V2QTjZm(!d*tgqdmN_j>YD-v_ zu-Mafwyh2FG|U}cU|%XOHi+z5%&P2V_ADlVha;rg+9T+V%)?77GU9MC_=6?UT9s`@ z?OFTyoe6s}FA~4f$4mN1@5o3m${;+ZlE*&?yCE7^M4W06mIDTf?^LwSu;5pG19|Hn z-$`*5uN@7#F5IrtcpOdfHb18xr==-)!bnYqr_a>NmH3}tc&N`z;#(+7+{}xHWj_81 z-C`9~q8%R5?bWz9SrJ&W*lx4uCs?C-aA}lPZG-<1R~8mq)Q4kWX9Vljk$_pr_6Xc| z{4{(SjYhFHiG)Q4Y{O-7*d*H%c7Gz;p3qD~H`^nD24CO>KmLVi6XA9y_!qMbd$v7- z0q_`J1marCU*C*r3vco=#a(V;;OK-?9@Ib=@4G%Ot(C|RR1OHbZ;9rIie_MZi z?u`6EB>zSIqITxnfzQqR@PFAgrh@As4L`f28*#E72OPi|eH7mu4&!%~FMfut6Dw`~fC^IiOur3hD?V8d;v{werz5^PWYidX`Q+`RpU~sfO7s{G z+xfK1+!dRd`s3)cUi`Bg^SIEl3_q5zvU9yu^AG!qXoHODgUZ`@Ib=@4G%Ot(C|RR1An?6*dqUjjy@p&N9j-34Gqg19%y)=;emz+ d8XjnPpy7dr2O1t|c%b2dh6frR`2XyI{|2}~9-;sM literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Capabilities/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Capabilities/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..0eb7f2baeda2936ab1f683f5fffa5cf1bc262404 GIT binary patch literal 22900 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

HY0&^I+Y z-_Yp9@WwRWn-4#+yKCz)iw|5!cyrptH~i5lwx2cI6mQH{G{xJIwkh6{tZ0h2;l%Ve zXC?MD{l%;xycJi`^sSPq@9Tksnc~G3+X1}bQt_yGlL0AAc#{DpNcx`a{O{-{%jS<@v8zdD?aTSad zCR_!>r1*t=3lYQR4pNwKxdRg + /// Description of InventoryManager. + /// + public class InventoryCache + { + private Dictionary _agentsInventory; + private List _serverRequests; //list of requests made to user server. + private Encoding _enc = Encoding.ASCII; + private const uint FULL_MASK_PERMISSIONS = 2147483647; + + public InventoryCache() + { + _agentsInventory = new Dictionary(); + _serverRequests = new List(); + } + + public void AddNewAgentsInventory(AgentInventory agentInventory) + { + if (!this._agentsInventory.ContainsKey(agentInventory.AgentID)) + { + this._agentsInventory.Add(agentInventory.AgentID, agentInventory); + } + } + + public AgentInventory FetchAgentsInventory(LLUUID agentID, IUserServer userserver) + { + AgentInventory res = null; + if (!this._agentsInventory.ContainsKey(agentID)) + { + res = userserver.RequestAgentsInventory(agentID); + this._agentsInventory.Add(agentID,res); + } + return res; + } + + public AgentInventory GetAgentsInventory(LLUUID agentID) + { + if (this._agentsInventory.ContainsKey(agentID)) + { + return this._agentsInventory[agentID]; + } + + return null; + } + + public void ClientLeaving(LLUUID clientID, IUserServer userserver) + { + if (this._agentsInventory.ContainsKey(clientID)) + { + if (userserver != null) + { + userserver.UpdateAgentsInventory(clientID, this._agentsInventory[clientID]); + } + this._agentsInventory.Remove(clientID); + } + } + + public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID) + { + return this.CreateNewInventoryFolder(remoteClient, folderID, 0); + } + + public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID, ushort type) + { + bool res = false; + if (folderID != LLUUID.Zero) //don't create a folder with a zero id + { + if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) + { + res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID, type); + } + } + return res; + } + + public bool CreateNewInventoryFolder(ClientView remoteClient, LLUUID folderID, ushort type, string folderName, LLUUID parent) + { + bool res = false; + if (folderID != LLUUID.Zero) //don't create a folder with a zero id + { + if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) + { + res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID, type, folderName, parent); + } + } + return res; + } + + public LLUUID AddNewInventoryItem(ClientView remoteClient, LLUUID folderID, AssetBase asset) + { + LLUUID newItem = null; + if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) + { + newItem = this._agentsInventory[remoteClient.AgentID].AddToInventory(folderID, asset); + if (newItem != null) + { + InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[newItem]; + this.SendItemUpdateCreate(remoteClient, Item); + } + } + + return newItem; + } + public bool DeleteInventoryItem(ClientView remoteClient, LLUUID itemID) + { + bool res = false; + if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) + { + res = this._agentsInventory[remoteClient.AgentID].DeleteFromInventory(itemID); + if (res) + { + RemoveInventoryItemPacket remove = new RemoveInventoryItemPacket(); + remove.AgentData.AgentID = remoteClient.AgentID; + remove.AgentData.SessionID = remoteClient.SessionID; + remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1]; + remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock(); + remove.InventoryData[0].ItemID = itemID; + remoteClient.OutPacket(remove); + } + } + + return res; + } + + public bool UpdateInventoryItemAsset(ClientView remoteClient, LLUUID itemID, AssetBase asset) + { + if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) + { + bool res = _agentsInventory[remoteClient.AgentID].UpdateItemAsset(itemID, asset); + if (res) + { + InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[itemID]; + this.SendItemUpdateCreate(remoteClient, Item); + } + return res; + } + + return false; + } + + public bool UpdateInventoryItemDetails(ClientView remoteClient, LLUUID itemID, UpdateInventoryItemPacket.InventoryDataBlock packet) + { + if (this._agentsInventory.ContainsKey(remoteClient.AgentID)) + { + bool res = _agentsInventory[remoteClient.AgentID].UpdateItemDetails(itemID, packet); + if (res) + { + InventoryItem Item = this._agentsInventory[remoteClient.AgentID].InventoryItems[itemID]; + this.SendItemUpdateCreate(remoteClient, Item); + } + return res; + } + + return false; + } + + public void FetchInventoryDescendents(ClientView userInfo, FetchInventoryDescendentsPacket FetchDescend) + { + if (this._agentsInventory.ContainsKey(userInfo.AgentID)) + { + AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID]; + if (FetchDescend.InventoryData.FetchItems) + { + if (agentInventory.InventoryFolders.ContainsKey(FetchDescend.InventoryData.FolderID)) + { + InventoryFolder Folder = agentInventory.InventoryFolders[FetchDescend.InventoryData.FolderID]; + InventoryDescendentsPacket Descend = new InventoryDescendentsPacket(); + Descend.AgentData.AgentID = userInfo.AgentID; + Descend.AgentData.OwnerID = Folder.OwnerID; + Descend.AgentData.FolderID = FetchDescend.InventoryData.FolderID; + Descend.AgentData.Descendents = Folder.Items.Count; + Descend.AgentData.Version = Folder.Items.Count; + + + Descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[Folder.Items.Count]; + for (int i = 0; i < Folder.Items.Count; i++) + { + + InventoryItem Item = Folder.Items[i]; + Descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock(); + Descend.ItemData[i].ItemID = Item.ItemID; + Descend.ItemData[i].AssetID = Item.AssetID; + Descend.ItemData[i].CreatorID = Item.CreatorID; + Descend.ItemData[i].BaseMask = FULL_MASK_PERMISSIONS; + Descend.ItemData[i].CreationDate = 1000; + Descend.ItemData[i].Description = _enc.GetBytes(Item.Description + "\0"); + Descend.ItemData[i].EveryoneMask = FULL_MASK_PERMISSIONS; + Descend.ItemData[i].Flags = 1; + Descend.ItemData[i].FolderID = Item.FolderID; + Descend.ItemData[i].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000"); + Descend.ItemData[i].GroupMask = FULL_MASK_PERMISSIONS; + Descend.ItemData[i].InvType = Item.InvType; + Descend.ItemData[i].Name = _enc.GetBytes(Item.Name + "\0"); + Descend.ItemData[i].NextOwnerMask = FULL_MASK_PERMISSIONS; + Descend.ItemData[i].OwnerID = Item.OwnerID; + Descend.ItemData[i].OwnerMask = FULL_MASK_PERMISSIONS; + Descend.ItemData[i].SalePrice = 100; + Descend.ItemData[i].SaleType = 0; + Descend.ItemData[i].Type = Item.Type; + Descend.ItemData[i].CRC = Helpers.InventoryCRC(1000, 0, Descend.ItemData[i].InvType, Descend.ItemData[i].Type, Descend.ItemData[i].AssetID, Descend.ItemData[i].GroupID, 100, Descend.ItemData[i].OwnerID, Descend.ItemData[i].CreatorID, Descend.ItemData[i].ItemID, Descend.ItemData[i].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS); + } + + userInfo.OutPacket(Descend); + + } + } + else + { + Console.WriteLine("fetch subfolders"); + } + } + } + + public void FetchInventory(ClientView userInfo, FetchInventoryPacket FetchItems) + { + if (this._agentsInventory.ContainsKey(userInfo.AgentID)) + { + AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID]; + + for (int i = 0; i < FetchItems.InventoryData.Length; i++) + { + if (agentInventory.InventoryItems.ContainsKey(FetchItems.InventoryData[i].ItemID)) + { + InventoryItem Item = agentInventory.InventoryItems[FetchItems.InventoryData[i].ItemID]; + FetchInventoryReplyPacket InventoryReply = new FetchInventoryReplyPacket(); + InventoryReply.AgentData.AgentID = userInfo.AgentID; + InventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1]; + InventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock(); + InventoryReply.InventoryData[0].ItemID = Item.ItemID; + InventoryReply.InventoryData[0].AssetID = Item.AssetID; + InventoryReply.InventoryData[0].CreatorID = Item.CreatorID; + InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].CreationDate = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + InventoryReply.InventoryData[0].Description = _enc.GetBytes(Item.Description + "\0"); + InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].Flags = 0; + InventoryReply.InventoryData[0].FolderID = Item.FolderID; + InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000"); + InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].InvType = Item.InvType; + InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name + "\0"); + InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].OwnerID = Item.OwnerID; + InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].SalePrice = 100; + InventoryReply.InventoryData[0].SaleType = 0; + InventoryReply.InventoryData[0].Type = Item.Type; + InventoryReply.InventoryData[0].CRC = Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType, InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID, InventoryReply.InventoryData[0].GroupID, 100, InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID, InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS); + userInfo.OutPacket(InventoryReply); + } + } + } + } + + private void SendItemUpdateCreate(ClientView remoteClient, InventoryItem Item) + { + + UpdateCreateInventoryItemPacket InventoryReply = new UpdateCreateInventoryItemPacket(); + InventoryReply.AgentData.AgentID = remoteClient.AgentID; + InventoryReply.AgentData.SimApproved = true; + InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1]; + InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock(); + InventoryReply.InventoryData[0].ItemID = Item.ItemID; + InventoryReply.InventoryData[0].AssetID = Item.AssetID; + InventoryReply.InventoryData[0].CreatorID = Item.CreatorID; + InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].CreationDate = 1000; + InventoryReply.InventoryData[0].Description = _enc.GetBytes(Item.Description + "\0"); + InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].Flags = 0; + InventoryReply.InventoryData[0].FolderID = Item.FolderID; + InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000"); + InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].InvType = Item.InvType; + InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name + "\0"); + InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].OwnerID = Item.OwnerID; + InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS; + InventoryReply.InventoryData[0].SalePrice = 100; + InventoryReply.InventoryData[0].SaleType = 0; + InventoryReply.InventoryData[0].Type = Item.Type; + InventoryReply.InventoryData[0].CRC = Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType, InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID, InventoryReply.InventoryData[0].GroupID, 100, InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID, InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS); + + remoteClient.OutPacket(InventoryReply); + } + } + + + + public class UserServerRequest + { + public UserServerRequest() + { + + } + } +} diff --git a/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs b/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs new file mode 100644 index 0000000000..f4e537cca7 --- /dev/null +++ b/OpenSim/Region/ClientStack/ClientStackNetworkHandler.cs @@ -0,0 +1,40 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Net.Sockets; + +namespace OpenSim.Region.ClientStack +{ + + public interface ClientStackNetworkHandler + { + void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode);// EndPoint packetSender); + void RemoveClientCircuit(uint circuitcode); + void RegisterPacketServer(PacketServer server); + } + +} diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs new file mode 100644 index 0000000000..5866b451fe --- /dev/null +++ b/OpenSim/Region/ClientStack/ClientView.API.cs @@ -0,0 +1,1090 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; +using Axiom.Math; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.ClientStack +{ + partial class ClientView + { + public event ImprovedInstantMessage OnInstantMessage; + public event ChatFromViewer OnChatFromViewer; + public event RezObject OnRezObject; + public event GenericCall4 OnDeRezObject; + public event ModifyTerrain OnModifyTerrain; + public event GenericCall OnRegionHandShakeReply; + public event GenericCall OnRequestWearables; + public event SetAppearance OnSetAppearance; + public event GenericCall2 OnCompleteMovementToRegion; + public event UpdateAgent OnAgentUpdate; + public event StartAnim OnStartAnim; + public event GenericCall OnRequestAvatarsData; + public event LinkObjects OnLinkObjects; + public event UpdateVector OnGrapObject; + public event ObjectSelect OnDeGrapObject; + public event ObjectDuplicate OnObjectDuplicate; + public event MoveObject OnGrapUpdate; + public event GenericCall4 OnAddPrim; + public event UpdateShape OnUpdatePrimShape; + public event ObjectSelect OnObjectSelect; + public event GenericCall7 OnObjectDescription; + public event GenericCall7 OnObjectName; + public event UpdatePrimFlags OnUpdatePrimFlags; + public event UpdatePrimTexture OnUpdatePrimTexture; + public event UpdateVector OnUpdatePrimGroupPosition; + public event UpdateVector OnUpdatePrimSinglePosition; + public event UpdatePrimRotation OnUpdatePrimGroupRotation; + public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation; + public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation; + public event UpdateVector OnUpdatePrimScale; + public event StatusChange OnChildAgentStatus; + public event GenericCall2 OnStopMovement; + public event NewAvatar OnNewAvatar; + public event GenericCall6 OnRemoveAvatar; + public event RequestMapBlocks OnRequestMapBlocks; + public event TeleportLocationRequest OnTeleportLocationRequest; + + public event UUIDNameRequest OnNameFromUUIDRequest; + + public event ParcelPropertiesRequest OnParcelPropertiesRequest; + public event ParcelDivideRequest OnParcelDivideRequest; + public event ParcelJoinRequest OnParcelJoinRequest; + public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest; + + public event EstateOwnerMessageRequest OnEstateOwnerMessage; + ///

+ /// + /// + public LLVector3 StartPos + { + get + { + return startpos; + } + set + { + startpos = value; + } + } + + /// + /// + /// + public LLUUID AgentId + { + get + { + return this.AgentID; + } + } + + /// + /// + /// + public string FirstName + { + get + { + return this.firstName; + } + + } + + /// + /// + /// + public string LastName + { + get + { + return this.lastName; + } + } + + #region World/Avatar to Client + + /// + /// + /// + /// + public void SendRegionHandshake(RegionInfo regionInfo) + { + Encoding _enc = Encoding.ASCII; + RegionHandshakePacket handshake = new RegionHandshakePacket(); + + handshake.RegionInfo.BillableFactor = regionInfo.estateSettings.billableFactor; + handshake.RegionInfo.IsEstateManager = false; + handshake.RegionInfo.TerrainHeightRange00 = regionInfo.estateSettings.terrainHeightRange0; + handshake.RegionInfo.TerrainHeightRange01 = regionInfo.estateSettings.terrainHeightRange1; + handshake.RegionInfo.TerrainHeightRange10 = regionInfo.estateSettings.terrainHeightRange2; + handshake.RegionInfo.TerrainHeightRange11 = regionInfo.estateSettings.terrainHeightRange3; + handshake.RegionInfo.TerrainStartHeight00 = regionInfo.estateSettings.terrainStartHeight0; + handshake.RegionInfo.TerrainStartHeight01 = regionInfo.estateSettings.terrainStartHeight1; + handshake.RegionInfo.TerrainStartHeight10 = regionInfo.estateSettings.terrainStartHeight2; + handshake.RegionInfo.TerrainStartHeight11 = regionInfo.estateSettings.terrainStartHeight3; + handshake.RegionInfo.SimAccess = (byte)regionInfo.estateSettings.simAccess; + handshake.RegionInfo.WaterHeight = regionInfo.estateSettings.waterHeight; + + + handshake.RegionInfo.RegionFlags = (uint)regionInfo.estateSettings.regionFlags; + + handshake.RegionInfo.SimName = _enc.GetBytes(regionInfo.RegionName + "\0"); + handshake.RegionInfo.SimOwner = regionInfo.MasterAvatarAssignedUUID; + handshake.RegionInfo.TerrainBase0 = regionInfo.estateSettings.terrainBase0; + handshake.RegionInfo.TerrainBase1 = regionInfo.estateSettings.terrainBase1; + handshake.RegionInfo.TerrainBase2 = regionInfo.estateSettings.terrainBase2; + handshake.RegionInfo.TerrainBase3 = regionInfo.estateSettings.terrainBase3; + handshake.RegionInfo.TerrainDetail0 = regionInfo.estateSettings.terrainDetail0; + handshake.RegionInfo.TerrainDetail1 = regionInfo.estateSettings.terrainDetail1; + handshake.RegionInfo.TerrainDetail2 = regionInfo.estateSettings.terrainDetail2; + handshake.RegionInfo.TerrainDetail3 = regionInfo.estateSettings.terrainDetail3; + handshake.RegionInfo.CacheID = LLUUID.Random(); //I guess this is for the client to remember an old setting? + + this.OutPacket(handshake); + } + + /// + /// + /// + /// + public void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos, LLVector3 look) + { + AgentMovementCompletePacket mov = new AgentMovementCompletePacket(); + mov.AgentData.SessionID = this.SessionID; + mov.AgentData.AgentID = this.AgentID; + mov.Data.RegionHandle = regInfo.RegionHandle; + mov.Data.Timestamp = 1172750370; // TODO - dynamicalise this + + if ((pos.X == 0) && (pos.Y == 0) && (pos.Z == 0)) + { + mov.Data.Position = this.startpos; + } + else + { + mov.Data.Position = pos; + } + mov.Data.LookAt = look; + + OutPacket(mov); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public void SendChatMessage(string message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID) + { + SendChatMessage(Helpers.StringToField(message), type, fromPos, fromName, fromAgentID); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public void SendChatMessage(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID) + { + Encoding enc = Encoding.ASCII; + ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket(); + reply.ChatData.Audible = 1; + reply.ChatData.Message = message; + reply.ChatData.ChatType = type; + reply.ChatData.SourceType = 1; + reply.ChatData.Position = fromPos; + reply.ChatData.FromName = enc.GetBytes(fromName + "\0"); + reply.ChatData.OwnerID = fromAgentID; + reply.ChatData.SourceID = fromAgentID; + + this.OutPacket(reply); + } + + /// + /// + /// + /// TODO + /// + /// + public void SendInstantMessage(string message, LLUUID target) + { + ImprovedInstantMessagePacket msg = new ImprovedInstantMessagePacket(); + msg.AgentData.AgentID = this.AgentID; + msg.AgentData.SessionID = this.SessionID; + + msg.MessageBlock.Dialog = 0; + msg.MessageBlock.FromGroup = false; + msg.MessageBlock.ID = target.Combine(this.AgentID); + msg.MessageBlock.Offline = 0; + msg.MessageBlock.ParentEstateID = 0; + msg.MessageBlock.Position = new LLVector3(); + msg.MessageBlock.RegionID = new LLUUID(); + msg.MessageBlock.Timestamp = 0; + msg.MessageBlock.ToAgentID = target; + + this.OutPacket(msg); + } + + /// + /// Send the region heightmap to the client + /// + /// heightmap + public virtual void SendLayerData(float[] map) + { + try + { + int[] patches = new int[4]; + + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x = x + 4) + { + patches[0] = x + 0 + y * 16; + patches[1] = x + 1 + y * 16; + patches[2] = x + 2 + y * 16; + patches[3] = x + 3 + y * 16; + + Packet layerpack = TerrainManager.CreateLandPacket(map, patches); + OutPacket(layerpack); + } + } + } + catch (Exception e) + { + MainLog.Instance.Warn("ClientView API.cs: SendLayerData() - Failed with exception " + e.ToString()); + } + } + + /// + /// Sends a specified patch to a client + /// + /// Patch coordinate (x) 0..16 + /// Patch coordinate (y) 0..16 + /// heightmap + public void SendLayerData(int px, int py, float[] map) + { + try + { + int[] patches = new int[1]; + int patchx, patchy; + patchx = px / 16; + patchy = py / 16; + + patches[0] = patchx + 0 + patchy * 16; + + Packet layerpack = TerrainManager.CreateLandPacket(map, patches); + OutPacket(layerpack); + } + catch (Exception e) + { + MainLog.Instance.Warn("ClientView API .cs: SendLayerData() - Failed with exception " + e.ToString()); + } + } + + /// + /// + /// + /// + /// + /// + public void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourEndPoint ) + { + IPAddress neighbourIP = neighbourEndPoint.Address; + ushort neighbourPort = (ushort) neighbourEndPoint.Port; + + EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket(); + enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock(); + enablesimpacket.SimulatorInfo.Handle = neighbourHandle; + + byte[] byteIP = neighbourIP.GetAddressBytes(); + enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24; + enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16; + enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8; + enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0]; + enablesimpacket.SimulatorInfo.Port = neighbourPort; + OutPacket(enablesimpacket); + } + + /// + /// + /// + /// + public AgentCircuitData RequestClientInfo() + { + AgentCircuitData agentData = new AgentCircuitData(); + agentData.AgentID = this.AgentId; + agentData.SessionID = this.SessionID; + agentData.SecureSessionID = this.SecureSessionID; + agentData.circuitcode = this.CircuitCode; + agentData.child = false; + agentData.firstname = this.firstName; + agentData.lastname = this.lastName; + + return agentData; + } + + public void CrossRegion(ulong newRegionHandle, LLVector3 pos, LLVector3 lookAt, IPEndPoint externalIPEndPoint) + { + LLVector3 look = new LLVector3(lookAt.X * 10, lookAt.Y * 10, lookAt.Z * 10); + + CrossedRegionPacket newSimPack = new CrossedRegionPacket(); + newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock(); + newSimPack.AgentData.AgentID = this.AgentID; + newSimPack.AgentData.SessionID = this.SessionID; + newSimPack.Info = new CrossedRegionPacket.InfoBlock(); + newSimPack.Info.Position = pos; + newSimPack.Info.LookAt = look; // new LLVector3(0.0f, 0.0f, 0.0f); // copied from Avatar.cs - SHOULD BE DYNAMIC!!!!!!!!!! + newSimPack.RegionData = new CrossedRegionPacket.RegionDataBlock(); + newSimPack.RegionData.RegionHandle = newRegionHandle; + byte[] byteIP = externalIPEndPoint.Address.GetAddressBytes(); + newSimPack.RegionData.SimIP = (uint)byteIP[3] << 24; + newSimPack.RegionData.SimIP += (uint)byteIP[2] << 16; + newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8; + newSimPack.RegionData.SimIP += (uint)byteIP[0]; + newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port; + newSimPack.RegionData.SeedCapability = new byte[0]; + + this.OutPacket(newSimPack); + //this.DowngradeClient(); + } + + public void SendMapBlock(List mapBlocks) + { + Encoding _enc = Encoding.ASCII; + + MapBlockReplyPacket mapReply = new MapBlockReplyPacket(); + mapReply.AgentData.AgentID = this.AgentID; + mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks.Count]; + mapReply.AgentData.Flags = 0; + + for (int i = 0; i < mapBlocks.Count; i++) + { + mapReply.Data[i] = new MapBlockReplyPacket.DataBlock(); + mapReply.Data[i].MapImageID = mapBlocks[i].MapImageId; + mapReply.Data[i].X = mapBlocks[i].X; + mapReply.Data[i].Y = mapBlocks[i].Y; + mapReply.Data[i].WaterHeight = mapBlocks[i].WaterHeight; + mapReply.Data[i].Name = _enc.GetBytes(mapBlocks[i].Name); + mapReply.Data[i].RegionFlags = mapBlocks[i].RegionFlags; + mapReply.Data[i].Access = mapBlocks[i].Access; + mapReply.Data[i].Agents = mapBlocks[i].Agents; + } + this.OutPacket(mapReply); + } + + public void SendLocalTeleport(LLVector3 position, LLVector3 lookAt, uint flags) + { + TeleportLocalPacket tpLocal = new TeleportLocalPacket(); + tpLocal.Info.AgentID = this.AgentID; + tpLocal.Info.TeleportFlags = flags; + tpLocal.Info.LocationID = 2; + tpLocal.Info.LookAt = lookAt; + tpLocal.Info.Position = position; + OutPacket(tpLocal); + } + + public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID, uint flags) + { + TeleportFinishPacket teleport = new TeleportFinishPacket(); + teleport.Info.AgentID = this.AgentID; + teleport.Info.RegionHandle = regionHandle; + teleport.Info.SimAccess = simAccess; + teleport.Info.SeedCapability = new byte[0]; + + IPAddress oIP = newRegionEndPoint.Address; + byte[] byteIP = oIP.GetAddressBytes(); + uint ip = (uint)byteIP[3] << 24; + ip += (uint)byteIP[2] << 16; + ip += (uint)byteIP[1] << 8; + ip += (uint)byteIP[0]; + + teleport.Info.SimIP = ip; + teleport.Info.SimPort = (ushort)newRegionEndPoint.Port; + teleport.Info.LocationID = 4; + teleport.Info.TeleportFlags = 1 << 4; + OutPacket(teleport); + } + + /// + /// + /// + public void SendTeleportCancel() + { + TeleportCancelPacket tpCancel = new TeleportCancelPacket(); + tpCancel.Info.SessionID = this.SessionID; + tpCancel.Info.AgentID = this.AgentID; + + OutPacket(tpCancel); + } + + /// + /// + /// + public void SendTeleportLocationStart() + { + TeleportStartPacket tpStart = new TeleportStartPacket(); + tpStart.Info.TeleportFlags = 16; // Teleport via location + OutPacket(tpStart); + } + + public void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance) + { + MoneyBalanceReplyPacket money = new MoneyBalanceReplyPacket(); + money.MoneyData.AgentID = this.AgentID; + money.MoneyData.TransactionID = transaction; + money.MoneyData.TransactionSuccess = success; + money.MoneyData.Description = description; + money.MoneyData.MoneyBalance = balance; + OutPacket(money); + } + + #region Appearance/ Wearables Methods + + /// + /// + /// + /// + public void SendWearables(AvatarWearable[] wearables) + { + AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket(); + aw.AgentData.AgentID = this.AgentID; + aw.AgentData.SerialNum = 0; + aw.AgentData.SessionID = this.SessionID; + + aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13]; + AgentWearablesUpdatePacket.WearableDataBlock awb; + for (int i = 0; i < wearables.Length; i++) + { + awb = new AgentWearablesUpdatePacket.WearableDataBlock(); + awb.WearableType = (byte)i; + awb.AssetID = wearables[i].AssetID; + awb.ItemID = wearables[i].ItemID; + aw.WearableData[i] = awb; + } + + this.OutPacket(aw); + } + + /// + /// + /// + /// + /// + /// + public void SendAppearance(LLUUID agentID, byte[] visualParams, byte[] textureEntry) + { + AvatarAppearancePacket avp = new AvatarAppearancePacket(); + avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218]; + avp.ObjectData.TextureEntry = textureEntry; + + AvatarAppearancePacket.VisualParamBlock avblock = null; + for (int i = 0; i < visualParams.Length; i++) + { + avblock = new AvatarAppearancePacket.VisualParamBlock(); + avblock.ParamValue = visualParams[i]; + avp.VisualParam[i] = avblock; + } + + avp.Sender.IsTrial = false; + avp.Sender.ID = agentID; + OutPacket(avp); + } + + #endregion + + #region Avatar Packet/data sending Methods + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void SendAvatarData(ulong regionHandle, string firstName, string lastName, LLUUID avatarID, uint avatarLocalID, LLVector3 Pos, byte[] textureEntry) + { + Encoding _enc = Encoding.ASCII; + //send a objectupdate packet with information about the clients avatar + + ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); + objupdate.RegionData.RegionHandle = regionHandle; + objupdate.RegionData.TimeDilation = 64096; + objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; + objupdate.ObjectData[0] = this.CreateDefaultAvatarPacket(textureEntry); + //give this avatar object a local id and assign the user a name + + objupdate.ObjectData[0].ID = avatarLocalID; + objupdate.ObjectData[0].FullID = avatarID; + objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstName + "\nLastName STRING RW SV " + lastName + " \0"); + LLVector3 pos2 = new LLVector3((float)Pos.X, (float)Pos.Y, (float)Pos.Z); + byte[] pb = pos2.GetBytes(); + Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length); + + OutPacket(objupdate); + + } + + /// + /// + /// + /// + /// + /// + /// + /// + public void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLVector3 velocity) + { + ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = this.CreateAvatarImprovedBlock(localID, position, velocity); + ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); + terse.RegionData.RegionHandle = regionHandle; + terse.RegionData.TimeDilation = timeDilation; + terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; + terse.ObjectData[0] = terseBlock; + + this.OutPacket(terse); + } + + #endregion + + #region Primitive Packet/data Sending Methods + + /// + /// + /// + /// + /// + /// + public void AttachObject(uint localID, LLQuaternion rotation, byte attachPoint) + { + ObjectAttachPacket attach = new ObjectAttachPacket(); + attach.AgentData.AgentID = this.AgentID; + attach.AgentData.SessionID = this.SessionID; + attach.AgentData.AttachmentPoint = attachPoint; + attach.ObjectData = new ObjectAttachPacket.ObjectDataBlock[1]; + attach.ObjectData[0] = new ObjectAttachPacket.ObjectDataBlock(); + attach.ObjectData[0].ObjectLocalID = localID; + attach.ObjectData[0].Rotation = rotation; + + this.OutPacket(attach); + } + + /// + /// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive + /// or big changes to a existing primitive. + /// + /// + /// + /// + /// + /// + /// + /// + public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags) + { + ObjectUpdatePacket outPacket = new ObjectUpdatePacket(); + outPacket.RegionData.RegionHandle = regionHandle; + outPacket.RegionData.TimeDilation = timeDilation; + outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; + outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags); + outPacket.ObjectData[0].ID = localID; + outPacket.ObjectData[0].FullID = primData.FullID; + byte[] pb = pos.GetBytes(); + Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length); + byte[] rot = rotation.GetBytes(); + Array.Copy(rot, 0, outPacket.ObjectData[0].ObjectData, 48, rot.Length); + OutPacket(outPacket); + } + + /// + /// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive + /// or big changes to a existing primitive. + /// Uses default rotation + /// + /// + /// + public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLUUID textureID , uint flags) + { + ObjectUpdatePacket outPacket = new ObjectUpdatePacket(); + outPacket.RegionData.RegionHandle = regionHandle; + outPacket.RegionData.TimeDilation = timeDilation; + outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; + outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags); + outPacket.ObjectData[0].ID = localID; + outPacket.ObjectData[0].FullID = primData.FullID; + byte[] pb = pos.GetBytes(); + Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length); + + OutPacket(outPacket); + } + + + public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID) + { + ObjectUpdatePacket outPacket = new ObjectUpdatePacket(); + outPacket.RegionData.RegionHandle = regionHandle; + outPacket.RegionData.TimeDilation = timeDilation; + outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; + outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primShape, textureID, flags); + outPacket.ObjectData[0].ID = localID; + outPacket.ObjectData[0].FullID = objectID; + outPacket.ObjectData[0].OwnerID = ownerID; + outPacket.ObjectData[0].Text = enc.GetBytes(text); + outPacket.ObjectData[0].ParentID = parentID; + byte[] pb = pos.GetBytes(); + Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length); + byte[] rot = rotation.GetBytes(); + Array.Copy(rot, 0, outPacket.ObjectData[0].ObjectData, 36, rot.Length); + OutPacket(outPacket); + } + + public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLUUID textureID, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID) + { + ObjectUpdatePacket outPacket = new ObjectUpdatePacket(); + outPacket.RegionData.RegionHandle = regionHandle; + outPacket.RegionData.TimeDilation = timeDilation; + outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; + outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primShape, textureID, flags); + outPacket.ObjectData[0].ID = localID; + outPacket.ObjectData[0].FullID = objectID; + outPacket.ObjectData[0].OwnerID = ownerID; + outPacket.ObjectData[0].Text = enc.GetBytes(text); + outPacket.ObjectData[0].ParentID = parentID; + byte[] pb = pos.GetBytes(); + Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length); + + OutPacket(outPacket); + } + /// + /// + /// + /// + /// + /// + /// + /// + public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLQuaternion rotation) + { + ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); + terse.RegionData.RegionHandle = regionHandle; + terse.RegionData.TimeDilation = timeDilation; + terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; + terse.ObjectData[0] = this.CreatePrimImprovedBlock(localID, position, rotation); + + this.OutPacket(terse); + } + + #endregion + + #endregion + + #region Helper Methods + + protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateAvatarImprovedBlock(uint localID, LLVector3 pos, LLVector3 velocity) + { + byte[] bytes = new byte[60]; + int i = 0; + ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); + + dat.TextureEntry = new byte[0];// AvatarTemplate.TextureEntry; + + uint ID = localID; + + bytes[i++] = (byte)(ID % 256); + bytes[i++] = (byte)((ID >> 8) % 256); + bytes[i++] = (byte)((ID >> 16) % 256); + bytes[i++] = (byte)((ID >> 24) % 256); + bytes[i++] = 0; + bytes[i++] = 1; + i += 14; + bytes[i++] = 128; + bytes[i++] = 63; + + byte[] pb = pos.GetBytes(); + Array.Copy(pb, 0, bytes, i, pb.Length); + i += 12; + ushort InternVelocityX; + ushort InternVelocityY; + ushort InternVelocityZ; + Vector3 internDirec = new Vector3(0, 0, 0); + + internDirec = new Vector3(velocity.X, velocity.Y, velocity.Z); + + internDirec = internDirec / 128.0f; + internDirec.x += 1; + internDirec.y += 1; + internDirec.z += 1; + + InternVelocityX = (ushort)(32768 * internDirec.x); + InternVelocityY = (ushort)(32768 * internDirec.y); + InternVelocityZ = (ushort)(32768 * internDirec.z); + + ushort ac = 32767; + bytes[i++] = (byte)(InternVelocityX % 256); + bytes[i++] = (byte)((InternVelocityX >> 8) % 256); + bytes[i++] = (byte)(InternVelocityY % 256); + bytes[i++] = (byte)((InternVelocityY >> 8) % 256); + bytes[i++] = (byte)(InternVelocityZ % 256); + bytes[i++] = (byte)((InternVelocityZ >> 8) % 256); + + //accel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + //rot + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + //rotation vel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + dat.Data = bytes; + return (dat); + } + + /// + /// + /// + /// + /// + /// + /// + protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreatePrimImprovedBlock(uint localID, LLVector3 position, LLQuaternion rotation) + { + uint ID = localID; + byte[] bytes = new byte[60]; + + int i = 0; + ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); + dat.TextureEntry = new byte[0]; + bytes[i++] = (byte)(ID % 256); + bytes[i++] = (byte)((ID >> 8) % 256); + bytes[i++] = (byte)((ID >> 16) % 256); + bytes[i++] = (byte)((ID >> 24) % 256); + bytes[i++] = 0; + bytes[i++] = 0; + + byte[] pb = position.GetBytes(); + Array.Copy(pb, 0, bytes, i, pb.Length); + i += 12; + ushort ac = 32767; + + //vel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + //accel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + ushort rw, rx, ry, rz; + rw = (ushort)(32768 * (rotation.W + 1)); + rx = (ushort)(32768 * (rotation.X + 1)); + ry = (ushort)(32768 * (rotation.Y + 1)); + rz = (ushort)(32768 * (rotation.Z + 1)); + + //rot + bytes[i++] = (byte)(rx % 256); + bytes[i++] = (byte)((rx >> 8) % 256); + bytes[i++] = (byte)(ry % 256); + bytes[i++] = (byte)((ry >> 8) % 256); + bytes[i++] = (byte)(rz % 256); + bytes[i++] = (byte)((rz >> 8) % 256); + bytes[i++] = (byte)(rw % 256); + bytes[i++] = (byte)((rw >> 8) % 256); + + //rotation vel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + dat.Data = bytes; + return dat; + } + + + /// + /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive) + /// + /// + /// + protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimData primData, LLUUID textureID, uint flags) + { + ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock(); + this.SetDefaultPrimPacketValues(objupdate); + objupdate.UpdateFlags = flags; + this.SetPrimPacketShapeData(objupdate, primData, textureID); + + return objupdate; + } + + /// + /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive) + /// + /// + /// + protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimitiveBaseShape primShape, LLUUID textureID, uint flags) + { + ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock(); + this.SetDefaultPrimPacketValues(objupdate); + objupdate.UpdateFlags = flags; + this.SetPrimPacketShapeData(objupdate, primShape, textureID); + + return objupdate; + } + + + /// + /// Copy the data from a PrimData object to a ObjectUpdatePacket + /// + /// + /// + protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimData primData, LLUUID textureID) + { + LLObject.TextureEntry ntex = new LLObject.TextureEntry(textureID); + objectData.TextureEntry = ntex.ToBytes(); + objectData.OwnerID = primData.OwnerID; + objectData.ParentID = primData.ParentID; + objectData.PCode = primData.PCode; + objectData.PathBegin = primData.PathBegin; + objectData.PathEnd = primData.PathEnd; + objectData.PathScaleX = primData.PathScaleX; + objectData.PathScaleY = primData.PathScaleY; + objectData.PathShearX = primData.PathShearX; + objectData.PathShearY = primData.PathShearY; + objectData.PathSkew = primData.PathSkew; + objectData.ProfileBegin = primData.ProfileBegin; + objectData.ProfileEnd = primData.ProfileEnd; + objectData.Scale = primData.Scale; + objectData.PathCurve = primData.PathCurve; + objectData.ProfileCurve = primData.ProfileCurve; + objectData.ProfileHollow = primData.ProfileHollow; + objectData.PathRadiusOffset = primData.PathRadiusOffset; + objectData.PathRevolutions = primData.PathRevolutions; + objectData.PathTaperX = primData.PathTaperX; + objectData.PathTaperY = primData.PathTaperY; + objectData.PathTwist = primData.PathTwist; + objectData.PathTwistBegin = primData.PathTwistBegin; + } + + protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimitiveBaseShape primData, LLUUID textureID) + { + LLObject.TextureEntry ntex = new LLObject.TextureEntry(textureID); + objectData.TextureEntry = ntex.ToBytes(); + objectData.PCode = primData.PCode; + objectData.PathBegin = primData.PathBegin; + objectData.PathEnd = primData.PathEnd; + objectData.PathScaleX = primData.PathScaleX; + objectData.PathScaleY = primData.PathScaleY; + objectData.PathShearX = primData.PathShearX; + objectData.PathShearY = primData.PathShearY; + objectData.PathSkew = primData.PathSkew; + objectData.ProfileBegin = primData.ProfileBegin; + objectData.ProfileEnd = primData.ProfileEnd; + objectData.Scale = primData.Scale; + objectData.PathCurve = primData.PathCurve; + objectData.ProfileCurve = primData.ProfileCurve; + objectData.ProfileHollow = primData.ProfileHollow; + objectData.PathRadiusOffset = primData.PathRadiusOffset; + objectData.PathRevolutions = primData.PathRevolutions; + objectData.PathTaperX = primData.PathTaperX; + objectData.PathTaperY = primData.PathTaperY; + objectData.PathTwist = primData.PathTwist; + objectData.PathTwistBegin = primData.PathTwistBegin; + } + + /// + /// Set some default values in a ObjectUpdatePacket + /// + /// + protected void SetDefaultPrimPacketValues(ObjectUpdatePacket.ObjectDataBlock objdata) + { + objdata.PSBlock = new byte[0]; + objdata.ExtraParams = new byte[1]; + objdata.MediaURL = new byte[0]; + objdata.NameValue = new byte[0]; + objdata.Text = new byte[0]; + objdata.TextColor = new byte[4]; + objdata.JointAxisOrAnchor = new LLVector3(0, 0, 0); + objdata.JointPivot = new LLVector3(0, 0, 0); + objdata.Material = 3; + objdata.TextureAnim = new byte[0]; + objdata.Sound = LLUUID.Zero; + objdata.State = 0; + objdata.Data = new byte[0]; + + objdata.ObjectData = new byte[60]; + objdata.ObjectData[46] = 128; + objdata.ObjectData[47] = 63; + } + + + /// + /// + /// + /// + protected ObjectUpdatePacket.ObjectDataBlock CreateDefaultAvatarPacket(byte[] textureEntry) + { + ObjectUpdatePacket.ObjectDataBlock objdata = new ObjectUpdatePacket.ObjectDataBlock(); // new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i); + + SetDefaultAvatarPacketValues(ref objdata); + objdata.UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24); + objdata.PathCurve = 16; + objdata.ProfileCurve = 1; + objdata.PathScaleX = 100; + objdata.PathScaleY = 100; + objdata.ParentID = 0; + objdata.OwnerID = LLUUID.Zero; + objdata.Scale = new LLVector3(1, 1, 1); + objdata.PCode = 47; + if (textureEntry != null) + { + objdata.TextureEntry = textureEntry; + } + Encoding enc = Encoding.ASCII; + LLVector3 pos = new LLVector3(objdata.ObjectData, 16); + pos.X = 100f; + objdata.ID = 8880000; + objdata.NameValue = enc.GetBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User \0"); + LLVector3 pos2 = new LLVector3(100f, 100f, 23f); + //objdata.FullID=user.AgentID; + byte[] pb = pos.GetBytes(); + Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length); + + return objdata; + } + + /// + /// + /// + /// + protected void SetDefaultAvatarPacketValues(ref ObjectUpdatePacket.ObjectDataBlock objdata) + { + objdata.PSBlock = new byte[0]; + objdata.ExtraParams = new byte[1]; + objdata.MediaURL = new byte[0]; + objdata.NameValue = new byte[0]; + objdata.Text = new byte[0]; + objdata.TextColor = new byte[4]; + objdata.JointAxisOrAnchor = new LLVector3(0, 0, 0); + objdata.JointPivot = new LLVector3(0, 0, 0); + objdata.Material = 4; + objdata.TextureAnim = new byte[0]; + objdata.Sound = LLUUID.Zero; + LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005")); + objdata.TextureEntry = ntex.ToBytes(); + objdata.State = 0; + objdata.Data = new byte[0]; + + objdata.ObjectData = new byte[76]; + objdata.ObjectData[15] = 128; + objdata.ObjectData[16] = 63; + objdata.ObjectData[56] = 128; + objdata.ObjectData[61] = 102; + objdata.ObjectData[62] = 40; + objdata.ObjectData[63] = 61; + objdata.ObjectData[64] = 189; + } + + /// + /// + /// + /// + /// + protected PrimData CreatePrimFromObjectAdd(ObjectAddPacket addPacket) + { + PrimData PData = new PrimData(); + PData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + PData.PCode = addPacket.ObjectData.PCode; + PData.PathBegin = addPacket.ObjectData.PathBegin; + PData.PathEnd = addPacket.ObjectData.PathEnd; + PData.PathScaleX = addPacket.ObjectData.PathScaleX; + PData.PathScaleY = addPacket.ObjectData.PathScaleY; + PData.PathShearX = addPacket.ObjectData.PathShearX; + PData.PathShearY = addPacket.ObjectData.PathShearY; + PData.PathSkew = addPacket.ObjectData.PathSkew; + PData.ProfileBegin = addPacket.ObjectData.ProfileBegin; + PData.ProfileEnd = addPacket.ObjectData.ProfileEnd; + PData.Scale = addPacket.ObjectData.Scale; + PData.PathCurve = addPacket.ObjectData.PathCurve; + PData.ProfileCurve = addPacket.ObjectData.ProfileCurve; + PData.ParentID = 0; + PData.ProfileHollow = addPacket.ObjectData.ProfileHollow; + PData.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset; + PData.PathRevolutions = addPacket.ObjectData.PathRevolutions; + PData.PathTaperX = addPacket.ObjectData.PathTaperX; + PData.PathTaperY = addPacket.ObjectData.PathTaperY; + PData.PathTwist = addPacket.ObjectData.PathTwist; + PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin; + + return PData; + } + #endregion + + } +} diff --git a/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs b/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs new file mode 100644 index 0000000000..60cd33a5e2 --- /dev/null +++ b/OpenSim/Region/ClientStack/ClientView.AgentAssetUpload.cs @@ -0,0 +1,357 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Assets; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; +using OpenSim.Region.Caches; + +namespace OpenSim.Region.ClientStack +{ + partial class ClientView + { + public class AgentAssetUpload + { + private Dictionary transactions = new Dictionary(); + private ClientView ourClient; + private AssetCache m_assetCache; + private InventoryCache m_inventoryCache; + + public AgentAssetUpload(ClientView client, AssetCache assetCache, InventoryCache inventoryCache) + { + this.ourClient = client; + m_assetCache = assetCache; + m_inventoryCache = inventoryCache; + } + + public void AddUpload(LLUUID transactionID, AssetBase asset) + { + AssetTransaction upload = new AssetTransaction(); + lock (this.transactions) + { + upload.Asset = asset; + upload.TransactionID = transactionID; + this.transactions.Add(transactionID, upload); + } + if (upload.Asset.Data.Length > 2) + { + //is complete + upload.UploadComplete = true; + AssetUploadCompletePacket response = new AssetUploadCompletePacket(); + response.AssetBlock.Type = asset.Type; + response.AssetBlock.Success = true; + response.AssetBlock.UUID = transactionID.Combine(this.ourClient.SecureSessionID); + this.ourClient.OutPacket(response); + m_assetCache.AddAsset(asset); + } + else + { + upload.UploadComplete = false; + upload.XferID = Util.GetNextXferID(); + RequestXferPacket xfer = new RequestXferPacket(); + xfer.XferID.ID = upload.XferID; + xfer.XferID.VFileType = upload.Asset.Type; + xfer.XferID.VFileID = transactionID.Combine(this.ourClient.SecureSessionID); + xfer.XferID.FilePath = 0; + xfer.XferID.Filename = new byte[0]; + this.ourClient.OutPacket(xfer); + } + + } + + public AssetBase GetUpload(LLUUID transactionID) + { + if (this.transactions.ContainsKey(transactionID)) + { + return this.transactions[transactionID].Asset; + } + + return null; + } + + public void HandleUploadPacket(AssetUploadRequestPacket pack, LLUUID assetID) + { + // Console.Write("asset upload request , type = " + pack.AssetBlock.Type.ToString()); + AssetBase asset = null; + if (pack.AssetBlock.Type == 0) + { + + //first packet for transaction + asset = new AssetBase(); + asset.FullID = assetID; + asset.Type = pack.AssetBlock.Type; + asset.InvType = asset.Type; + asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000"); + asset.Data = pack.AssetBlock.AssetData; + + + } + else if (pack.AssetBlock.Type == 13 | pack.AssetBlock.Type == 5 | pack.AssetBlock.Type == 7) + { + + asset = new AssetBase(); + asset.FullID = assetID; + // Console.WriteLine("skin asset id is " + assetID.ToStringHyphenated()); + asset.Type = pack.AssetBlock.Type; + asset.InvType = asset.Type; + asset.Name = "NewClothing" + Util.RandomClass.Next(1, 1000).ToString("000"); + asset.Data = pack.AssetBlock.AssetData; + + + } + + if (asset != null) + { + this.AddUpload(pack.AssetBlock.TransactionID, asset); + } + else + { + + //currently we don't support this asset type + //so lets just tell the client that the upload is complete + AssetUploadCompletePacket response = new AssetUploadCompletePacket(); + response.AssetBlock.Type = pack.AssetBlock.Type; + response.AssetBlock.Success = true; + response.AssetBlock.UUID = pack.AssetBlock.TransactionID.Combine(this.ourClient.SecureSessionID); + this.ourClient.OutPacket(response); + } + + } + + #region Xfer packet system for larger uploads + + public void HandleXferPacket(SendXferPacketPacket xferPacket) + { + lock (this.transactions) + { + foreach (AssetTransaction trans in this.transactions.Values) + { + if (trans.XferID == xferPacket.XferID.ID) + { + if (trans.Asset.Data.Length > 1) + { + byte[] newArray = new byte[trans.Asset.Data.Length + xferPacket.DataPacket.Data.Length]; + Array.Copy(trans.Asset.Data, 0, newArray, 0, trans.Asset.Data.Length); + Array.Copy(xferPacket.DataPacket.Data, 0, newArray, trans.Asset.Data.Length, xferPacket.DataPacket.Data.Length); + trans.Asset.Data = newArray; + } + else + { + byte[] newArray = new byte[xferPacket.DataPacket.Data.Length - 4]; + Array.Copy(xferPacket.DataPacket.Data, 4, newArray, 0, xferPacket.DataPacket.Data.Length - 4); + trans.Asset.Data = newArray; + } + + if ((xferPacket.XferID.Packet & 2147483648) != 0) + { + //end of transfer + trans.UploadComplete = true; + AssetUploadCompletePacket response = new AssetUploadCompletePacket(); + response.AssetBlock.Type = trans.Asset.Type; + response.AssetBlock.Success = true; + response.AssetBlock.UUID = trans.TransactionID.Combine(this.ourClient.SecureSessionID); + this.ourClient.OutPacket(response); + + m_assetCache.AddAsset(trans.Asset); + //check if we should add it to inventory + if (trans.AddToInventory) + { + // m_assetCache.AddAsset(trans.Asset); + m_inventoryCache.AddNewInventoryItem(this.ourClient, trans.InventFolder, trans.Asset); + } + + + } + break; + } + + } + } + + ConfirmXferPacketPacket confirmXfer = new ConfirmXferPacketPacket(); + confirmXfer.XferID.ID = xferPacket.XferID.ID; + confirmXfer.XferID.Packet = xferPacket.XferID.Packet; + this.ourClient.OutPacket(confirmXfer); + } + + #endregion + + public AssetBase AddUploadToAssetCache(LLUUID transactionID) + { + AssetBase asset = null; + if (this.transactions.ContainsKey(transactionID)) + { + AssetTransaction trans = this.transactions[transactionID]; + if (trans.UploadComplete) + { + m_assetCache.AddAsset(trans.Asset); + asset = trans.Asset; + } + } + + return asset; + } + + public void CreateInventoryItem(CreateInventoryItemPacket packet) + { + if (this.transactions.ContainsKey(packet.InventoryBlock.TransactionID)) + { + AssetTransaction trans = this.transactions[packet.InventoryBlock.TransactionID]; + trans.Asset.Description = Util.FieldToString(packet.InventoryBlock.Description); + trans.Asset.Name = Util.FieldToString(packet.InventoryBlock.Name); + trans.Asset.Type = packet.InventoryBlock.Type; + trans.Asset.InvType = packet.InventoryBlock.InvType; + if (trans.UploadComplete) + { + //already complete so we can add it to the inventory + //m_assetCache.AddAsset(trans.Asset); + m_inventoryCache.AddNewInventoryItem(this.ourClient, packet.InventoryBlock.FolderID, trans.Asset); + } + else + { + trans.AddToInventory = true; + trans.InventFolder = packet.InventoryBlock.FolderID; + } + } + } + + private class AssetTransaction + { + public uint XferID; + public AssetBase Asset; + public bool AddToInventory; + public LLUUID InventFolder = LLUUID.Zero; + public bool UploadComplete = false; + public LLUUID TransactionID = LLUUID.Zero; + + public AssetTransaction() + { + + } + } + + //new class , not currently used. + public class AssetXferUploader + { + private IClientAPI ourClient; + + public bool UploadComplete = false; + + public bool AddToInventory; + public LLUUID InventFolder = LLUUID.Zero; + + public uint XferID; + public AssetBase Asset; + public LLUUID TransactionID = LLUUID.Zero; + + + public AssetXferUploader(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data) + { + ourClient = remoteClient; + Asset = new AssetBase(); + Asset.FullID = assetID; + Asset.InvType = type; + Asset.Type = type; + Asset.Data = data; + Asset.Name = "blank"; + Asset.Description = "empty"; + TransactionID = transaction; + + if (Asset.Data.Length > 2) + { + //data block should only have data in it, if there is no more data to be uploaded + this.SendCompleteMessage(); + } + else + { + this.ReqestStartXfer(); + } + } + + protected void SendCompleteMessage() + { + UploadComplete = true; + AssetUploadCompletePacket response = new AssetUploadCompletePacket(); + response.AssetBlock.Type = Asset.Type; + response.AssetBlock.Success = true; + response.AssetBlock.UUID = Asset.FullID; + this.ourClient.OutPacket(response); + + //TODO trigger event + } + + protected void ReqestStartXfer() + { + UploadComplete = false; + XferID = Util.GetNextXferID(); + RequestXferPacket xfer = new RequestXferPacket(); + xfer.XferID.ID = XferID; + xfer.XferID.VFileType = Asset.Type; + xfer.XferID.VFileID = Asset.FullID; + xfer.XferID.FilePath = 0; + xfer.XferID.Filename = new byte[0]; + this.ourClient.OutPacket(xfer); + } + + public void HandleXferPacket(uint xferID, uint packetID, byte[] data) + { + if (XferID == xferID) + { + if (Asset.Data.Length > 1) + { + byte[] newArray = new byte[Asset.Data.Length + data.Length]; + Array.Copy(Asset.Data, 0, newArray, 0, Asset.Data.Length); + Array.Copy(data, 0, newArray, Asset.Data.Length, data.Length); + Asset.Data = newArray; + } + else + { + byte[] newArray = new byte[data.Length - 4]; + Array.Copy(data, 4, newArray, 0, data.Length - 4); + Asset.Data = newArray; + } + + ConfirmXferPacketPacket confirmXfer = new ConfirmXferPacketPacket(); + confirmXfer.XferID.ID = xferID; + confirmXfer.XferID.Packet = packetID; + this.ourClient.OutPacket(confirmXfer); + + if ((packetID & 2147483648) != 0) + { + this.SendCompleteMessage(); + } + } + } + } + } + } +} diff --git a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs new file mode 100644 index 0000000000..31ea3eb74d --- /dev/null +++ b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs @@ -0,0 +1,257 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Console; + +namespace OpenSim.Region.ClientStack +{ + public partial class ClientView + { + protected virtual void RegisterLocalPacketHandlers() + { + this.AddLocalPacketHandler(PacketType.LogoutRequest, this.Logout); + this.AddLocalPacketHandler(PacketType.AgentCachedTexture, this.AgentTextureCached); + this.AddLocalPacketHandler(PacketType.MultipleObjectUpdate, this.MultipleObjUpdate); + } + + protected virtual bool Logout(ClientView simClient, Packet packet) + { + MainLog.Instance.Verbose( "OpenSimClient.cs:ProcessInPacket() - Got a logout request"); + //send reply to let the client logout + LogoutReplyPacket logReply = new LogoutReplyPacket(); + logReply.AgentData.AgentID = this.AgentID; + logReply.AgentData.SessionID = this.SessionID; + logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1]; + logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock(); + logReply.InventoryData[0].ItemID = LLUUID.Zero; + OutPacket(logReply); + //tell all clients to kill our object + KillObjectPacket kill = new KillObjectPacket(); + kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; + kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); + // kill.ObjectData[0].ID = this.ClientAvatar.localid; + foreach (ClientView client in m_clientThreads.Values) + { + client.OutPacket(kill); + } + + this.m_inventoryCache.ClientLeaving(this.AgentID, null); + + + // m_gridServer.LogoutSession(this.SessionID, this.AgentID, this.CircuitCode); + /*lock (m_world.Entities) + { + m_world.Entities.Remove(this.AgentID); + }*/ + // m_world.RemoveViewerAgent(this); + //need to do other cleaning up here too + m_clientThreads.Remove(this.CircuitCode); + m_networkServer.RemoveClientCircuit(this.CircuitCode); + this.ClientThread.Abort(); + return true; + } + + protected bool AgentTextureCached(ClientView simclient, Packet packet) + { + // Console.WriteLine(packet.ToString()); + AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet; + AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket(); + cachedresp.AgentData.AgentID = this.AgentID; + cachedresp.AgentData.SessionID = this.SessionID; + cachedresp.AgentData.SerialNum = this.cachedtextureserial; + this.cachedtextureserial++; + cachedresp.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[chechedtex.WearableData.Length]; + for (int i = 0; i < chechedtex.WearableData.Length; i++) + { + cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); + cachedresp.WearableData[i].TextureIndex = chechedtex.WearableData[i].TextureIndex; + cachedresp.WearableData[i].TextureID = LLUUID.Zero; + cachedresp.WearableData[i].HostName = new byte[0]; + } + this.OutPacket(cachedresp); + return true; + } + + protected bool MultipleObjUpdate(ClientView simClient, Packet packet) + { + MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet; + //System.Console.WriteLine("new multi update packet " + multipleupdate.ToString()); + for (int i = 0; i < multipleupdate.ObjectData.Length; i++) + { + #region position + if (multipleupdate.ObjectData[i].Type == 9) //change position + { + if (OnUpdatePrimGroupPosition != null) + { + LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0); + OnUpdatePrimGroupPosition(multipleupdate.ObjectData[i].ObjectLocalID, pos, this); + } + + } + else if (multipleupdate.ObjectData[i].Type == 1) //single item of group change position + { + if (OnUpdatePrimSinglePosition != null) + { + libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0); + // System.Console.WriteLine("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z); + OnUpdatePrimSinglePosition(multipleupdate.ObjectData[i].ObjectLocalID, pos, this); + } + } + #endregion position + #region rotation + else if (multipleupdate.ObjectData[i].Type == 2)// single item of group rotation from tab + { + if (OnUpdatePrimSingleRotation != null) + { + LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true); + // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W); + OnUpdatePrimSingleRotation(multipleupdate.ObjectData[i].ObjectLocalID, rot, this); + } + } + else if (multipleupdate.ObjectData[i].Type == 3)// single item of group rotation from mouse + { + if (OnUpdatePrimSingleRotation != null) + { + libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 12, true); + // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W); + OnUpdatePrimSingleRotation(multipleupdate.ObjectData[i].ObjectLocalID, rot, this); + } + } + else if (multipleupdate.ObjectData[i].Type == 10)//group rotation from object tab + { + if (OnUpdatePrimGroupRotation != null) + { + libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true); + // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W); + OnUpdatePrimGroupRotation(multipleupdate.ObjectData[i].ObjectLocalID, rot, this); + } + } + else if (multipleupdate.ObjectData[i].Type == 11)//group rotation from mouse + { + if (OnUpdatePrimGroupMouseRotation != null) + { + libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0); + libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 12, true); + //Console.WriteLine("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z); + // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W); + OnUpdatePrimGroupMouseRotation(multipleupdate.ObjectData[i].ObjectLocalID, pos, rot, this); + } + } + #endregion + #region scale + else if (multipleupdate.ObjectData[i].Type == 13)//group scale from object tab + { + if (OnUpdatePrimScale != null) + { + LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12); + //Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); + OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this); + } + } + else if (multipleupdate.ObjectData[i].Type == 29)//group scale from mouse + { + if (OnUpdatePrimScale != null) + { + libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 0); + // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z ); + // OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this); + } + } + else if (multipleupdate.ObjectData[i].Type == 5)//single prim scale from object tab + { + if (OnUpdatePrimScale != null) + { + libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12); + // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); + OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this); + } + } + else if (multipleupdate.ObjectData[i].Type == 21)//single prim scale from mouse + { + if (OnUpdatePrimScale != null) + { + libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12); + // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); + OnUpdatePrimScale(multipleupdate.ObjectData[i].ObjectLocalID, scale, this); + } + } + #endregion + } + return true; + } + + public void RequestMapLayer() + { + //should be getting the map layer from the grid server + //send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area) + MapLayerReplyPacket mapReply = new MapLayerReplyPacket(); + mapReply.AgentData.AgentID = this.AgentID; + mapReply.AgentData.Flags = 0; + mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1]; + mapReply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock(); + mapReply.LayerData[0].Bottom = 0; + mapReply.LayerData[0].Left = 0; + mapReply.LayerData[0].Top = 30000; + mapReply.LayerData[0].Right = 30000; + mapReply.LayerData[0].ImageID = new LLUUID("00000000-0000-0000-9999-000000000006"); + this.OutPacket(mapReply); + } + + public void RequestMapBlocks(int minX, int minY, int maxX, int maxY) + { + /* + IList simMapProfiles = m_gridServer.RequestMapBlocks(minX, minY, maxX, maxY); + MapBlockReplyPacket mbReply = new MapBlockReplyPacket(); + mbReply.AgentData.AgentID = this.AgentID; + int len; + if (simMapProfiles == null) + len = 0; + else + len = simMapProfiles.Count; + + mbReply.Data = new MapBlockReplyPacket.DataBlock[len]; + int iii; + for (iii = 0; iii < len; iii++) + { + Hashtable mp = (Hashtable)simMapProfiles[iii]; + mbReply.Data[iii] = new MapBlockReplyPacket.DataBlock(); + mbReply.Data[iii].Name = System.Text.Encoding.UTF8.GetBytes((string)mp["name"]); + mbReply.Data[iii].Access = System.Convert.ToByte(mp["access"]); + mbReply.Data[iii].Agents = System.Convert.ToByte(mp["agents"]); + mbReply.Data[iii].MapImageID = new LLUUID((string)mp["map-image-id"]); + mbReply.Data[iii].RegionFlags = System.Convert.ToUInt32(mp["region-flags"]); + mbReply.Data[iii].WaterHeight = System.Convert.ToByte(mp["water-height"]); + mbReply.Data[iii].X = System.Convert.ToUInt16(mp["x"]); + mbReply.Data[iii].Y = System.Convert.ToUInt16(mp["y"]); + } + this.OutPacket(mbReply); + */ + } + } +} diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs new file mode 100644 index 0000000000..982ae5071b --- /dev/null +++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs @@ -0,0 +1,597 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Inventory; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Region.ClientStack +{ + public partial class ClientView + { + protected override void ProcessInPacket(Packet Pack) + { + ack_pack(Pack); + debug = true; + if (debug) + { + if (Pack.Type != PacketType.AgentUpdate) + { + Console.WriteLine("IN: " + Pack.Type.ToString()); + } + } + + if (this.ProcessPacketMethod(Pack)) + { + //there is a handler registered that handled this packet type + return; + } + else + { + Encoding _enc = Encoding.ASCII; + + switch (Pack.Type) + { + case PacketType.ViewerEffect: + ViewerEffectPacket viewer = (ViewerEffectPacket)Pack; + foreach (ClientView client in m_clientThreads.Values) + { + if (client.AgentID != this.AgentID) + { + viewer.AgentData.AgentID = client.AgentID; + viewer.AgentData.SessionID = client.SessionID; + client.OutPacket(viewer); + } + } + break; + + #region World/Avatar + case PacketType.ChatFromViewer: + ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack; + if (Util.FieldToString(inchatpack.ChatData.Message) == "") + { + //empty message so don't bother with it + break; + } + string fromName = ""; //ClientAvatar.firstname + " " + ClientAvatar.lastname; + byte[] message = inchatpack.ChatData.Message; + byte type = inchatpack.ChatData.Type; + LLVector3 fromPos = new LLVector3(); // ClientAvatar.Pos; + LLUUID fromAgentID = AgentID; + if (OnChatFromViewer != null) + { + this.OnChatFromViewer(message, type, fromPos, fromName, fromAgentID); + } + break; + case PacketType.ImprovedInstantMessage: + ImprovedInstantMessagePacket msgpack = (ImprovedInstantMessagePacket)Pack; + + string IMfromName = Util.FieldToString(msgpack.MessageBlock.FromAgentName); + string IMmessage = Util.FieldToString(msgpack.MessageBlock.Message); + + if (OnInstantMessage != null) + { + this.OnInstantMessage(msgpack.AgentData.AgentID, msgpack.MessageBlock.ToAgentID, + msgpack.MessageBlock.Timestamp, IMfromName, IMmessage); + } + + break; + + case PacketType.RezObject: + RezObjectPacket rezPacket = (RezObjectPacket)Pack; + AgentInventory inven = this.m_inventoryCache.GetAgentsInventory(this.AgentID); + if (inven != null) + { + if (inven.InventoryItems.ContainsKey(rezPacket.InventoryData.ItemID)) + { + AssetBase asset = this.m_assetCache.GetAsset(inven.InventoryItems[rezPacket.InventoryData.ItemID].AssetID); + if (asset != null) + { + if (OnRezObject != null) + { + this.OnRezObject(asset, rezPacket.RezData.RayEnd); + this.m_inventoryCache.DeleteInventoryItem(this, rezPacket.InventoryData.ItemID); + } + } + } + } + break; + case PacketType.DeRezObject: + if (OnDeRezObject != null) + { + OnDeRezObject(Pack, this); + } + break; + case PacketType.ModifyLand: + ModifyLandPacket modify = (ModifyLandPacket)Pack; + if (modify.ParcelData.Length > 0) + { + if (OnModifyTerrain != null) + { + OnModifyTerrain(modify.ModifyBlock.Height, modify.ModifyBlock.Seconds, modify.ModifyBlock.BrushSize, + modify.ModifyBlock.Action, modify.ParcelData[0].North, modify.ParcelData[0].West); + } + } + break; + case PacketType.RegionHandshakeReply: + if (OnRegionHandShakeReply != null) + { + OnRegionHandShakeReply(this); + } + break; + case PacketType.AgentWearablesRequest: + if (OnRequestWearables != null) + { + OnRequestWearables(this); + } + if (OnRequestAvatarsData != null) + { + OnRequestAvatarsData(this); + } + break; + case PacketType.AgentSetAppearance: + AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack; + if (OnSetAppearance != null) + { + OnSetAppearance(appear.ObjectData.TextureEntry, appear.VisualParam); + } + break; + case PacketType.CompleteAgentMovement: + if (OnCompleteMovementToRegion != null) + { + OnCompleteMovementToRegion(); + } + break; + case PacketType.AgentUpdate: + if (OnAgentUpdate != null) + { + AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack; + OnAgentUpdate(this, agenUpdate.AgentData.ControlFlags, agenUpdate.AgentData.BodyRotation); + } + break; + case PacketType.AgentAnimation: + if (!m_child) + { + AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack; + for (int i = 0; i < AgentAni.AnimationList.Length; i++) + { + if (AgentAni.AnimationList[i].StartAnim) + { + if (OnStartAnim != null) + { + OnStartAnim(AgentAni.AnimationList[i].AnimID, 1); + } + } + } + } + break; + + #endregion + + #region Objects/Prims + case PacketType.ObjectLink: + // OpenSim.Framework.Console.MainLog.Instance.Verbose( Pack.ToString()); + ObjectLinkPacket link = (ObjectLinkPacket)Pack; + uint parentprimid = 0; + List childrenprims = new List(); + if (link.ObjectData.Length > 1) + { + parentprimid = link.ObjectData[0].ObjectLocalID; + + for (int i = 1; i < link.ObjectData.Length; i++) + { + childrenprims.Add(link.ObjectData[i].ObjectLocalID); + } + } + if (OnLinkObjects != null) + { + OnLinkObjects(parentprimid, childrenprims); + } + break; + case PacketType.ObjectAdd: + if (OnAddPrim != null) + { + OnAddPrim(Pack, this); + } + break; + case PacketType.ObjectShape: + ObjectShapePacket shape = (ObjectShapePacket)Pack; + for (int i = 0; i < shape.ObjectData.Length; i++) + { + if (OnUpdatePrimShape != null) + { + OnUpdatePrimShape(shape.ObjectData[i].ObjectLocalID, shape.ObjectData[i]); + } + } + break; + case PacketType.ObjectDuplicate: + ObjectDuplicatePacket dupe = (ObjectDuplicatePacket)Pack; + for (int i = 0; i < dupe.ObjectData.Length; i++) + { + if (OnObjectDuplicate != null) + { + OnObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset, dupe.SharedData.DuplicateFlags); + } + } + + break; + + case PacketType.ObjectSelect: + ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack; + for (int i = 0; i < incomingselect.ObjectData.Length; i++) + { + if (OnObjectSelect != null) + { + OnObjectSelect(incomingselect.ObjectData[i].ObjectLocalID, this); + } + } + break; + case PacketType.ObjectFlagUpdate: + ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack; + if (OnUpdatePrimFlags != null) + { + OnUpdatePrimFlags(flags.AgentData.ObjectLocalID, Pack, this); + } + break; + case PacketType.ObjectImage: + ObjectImagePacket imagePack = (ObjectImagePacket)Pack; + for (int i = 0; i < imagePack.ObjectData.Length; i++) + { + if (OnUpdatePrimTexture != null) + { + OnUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID, imagePack.ObjectData[i].TextureEntry, this); + } + } + break; + case PacketType.ObjectGrab: + ObjectGrabPacket grap = (ObjectGrabPacket)Pack; + if (OnGrapObject != null) + { + OnGrapObject(grap.ObjectData.LocalID, grap.ObjectData.GrabOffset, this); + } + break; + case PacketType.ObjectGrabUpdate: + ObjectGrabUpdatePacket grapUpdate = (ObjectGrabUpdatePacket)Pack; + if (OnGrapUpdate != null) + { + OnGrapUpdate(grapUpdate.ObjectData.ObjectID, grapUpdate.ObjectData.GrabOffsetInitial, grapUpdate.ObjectData.GrabPosition, this); + } + break; + case PacketType.ObjectDeGrab: + ObjectDeGrabPacket deGrap = (ObjectDeGrabPacket)Pack; + if (OnDeGrapObject != null) + { + OnDeGrapObject(deGrap.ObjectData.LocalID, this); + } + break; + case PacketType.ObjectDescription: + ObjectDescriptionPacket objDes = (ObjectDescriptionPacket)Pack; + for (int i = 0; i < objDes.ObjectData.Length; i++) + { + if (OnObjectDescription != null) + { + OnObjectDescription(objDes.ObjectData[i].LocalID, enc.GetString(objDes.ObjectData[i].Description)); + } + } + break; + case PacketType.ObjectName: + ObjectNamePacket objName = (ObjectNamePacket)Pack; + for (int i = 0; i < objName.ObjectData.Length; i++) + { + if (OnObjectName != null) + { + OnObjectName(objName.ObjectData[i].LocalID, enc.GetString(objName.ObjectData[i].Name)); + } + } + break; + case PacketType.ObjectPermissions: + //Console.WriteLine("permissions set " + Pack.ToString()); + break; + #endregion + + #region Inventory/Asset/Other related packets + case PacketType.RequestImage: + RequestImagePacket imageRequest = (RequestImagePacket)Pack; + for (int i = 0; i < imageRequest.RequestImage.Length; i++) + { + m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image); + } + break; + case PacketType.TransferRequest: + //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request"); + TransferRequestPacket transfer = (TransferRequestPacket)Pack; + m_assetCache.AddAssetRequest(this, transfer); + break; + case PacketType.AssetUploadRequest: + AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; + this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID)); + break; + case PacketType.RequestXfer: + //Console.WriteLine(Pack.ToString()); + break; + case PacketType.SendXferPacket: + this.UploadAssets.HandleXferPacket((SendXferPacketPacket)Pack); + break; + case PacketType.CreateInventoryFolder: + CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack; + m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID); + //Console.WriteLine(Pack.ToString()); + break; + case PacketType.CreateInventoryItem: + //Console.WriteLine(Pack.ToString()); + CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack; + if (createItem.InventoryBlock.TransactionID != LLUUID.Zero) + { + this.UploadAssets.CreateInventoryItem(createItem); + } + else + { + // Console.Write(Pack.ToString()); + this.CreateInventoryItem(createItem); + } + break; + case PacketType.FetchInventory: + //Console.WriteLine("fetch item packet"); + FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack; + m_inventoryCache.FetchInventory(this, FetchInventory); + break; + case PacketType.FetchInventoryDescendents: + FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack; + m_inventoryCache.FetchInventoryDescendents(this, Fetch); + break; + case PacketType.UpdateInventoryItem: + UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)Pack; + //Console.WriteLine(Pack.ToString()); + for (int i = 0; i < update.InventoryData.Length; i++) + { + if (update.InventoryData[i].TransactionID != LLUUID.Zero) + { + AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionID)); + if (asset != null) + { + // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToStringHyphenated() + " already in cache"); + m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset); + } + else + { + asset = this.UploadAssets.AddUploadToAssetCache(update.InventoryData[i].TransactionID); + if (asset != null) + { + //Console.WriteLine("updating inventory item, adding asset" + asset.FullID.ToStringHyphenated() + " to cache"); + m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset); + } + else + { + //Console.WriteLine("trying to update inventory item, but asset is null"); + } + } + } + else + { + m_inventoryCache.UpdateInventoryItemDetails(this, update.InventoryData[i].ItemID, update.InventoryData[i]); ; + } + } + break; + case PacketType.RequestTaskInventory: + // Console.WriteLine(Pack.ToString()); + RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack; + ReplyTaskInventoryPacket replytask = new ReplyTaskInventoryPacket(); + //bool foundent = false; + /* foreach (Entity ent in m_world.Entities.Values) + { + if (ent.localid == requesttask.InventoryData.LocalID) + { + replytask.InventoryData.TaskID = ent.uuid; + replytask.InventoryData.Serial = 0; + replytask.InventoryData.Filename = new byte[0]; + foundent = true; + } + } + if (foundent) + { + this.OutPacket(replytask); + }*/ + break; + case PacketType.UpdateTaskInventory: + // Console.WriteLine(Pack.ToString()); + UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack; + AgentInventory myinventory = this.m_inventoryCache.GetAgentsInventory(this.AgentID); + /*if (myinventory != null) + { + if (updatetask.UpdateData.Key == 0) + { + if (myinventory.InventoryItems[updatetask.InventoryData.ItemID] != null) + { + if (myinventory.InventoryItems[updatetask.InventoryData.ItemID].Type == 7) + { + LLUUID noteaid = myinventory.InventoryItems[updatetask.InventoryData.ItemID].AssetID; + AssetBase assBase = this.m_assetCache.GetAsset(noteaid); + if (assBase != null) + { + foreach (Entity ent in m_world.Entities.Values) + { + if (ent.localid == updatetask.UpdateData.LocalID) + { + if (ent is OpenSim.world.Primitive) + { + this.m_world.AddScript(ent, Util.FieldToString(assBase.Data)); + } + } + } + } + } + } + } + }*/ + break; + case PacketType.MapLayerRequest: + this.RequestMapLayer(); + break; + case PacketType.MapBlockRequest: + MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack; + if (OnRequestMapBlocks != null) + { + OnRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY); + } + break; + case PacketType.TeleportLandmarkRequest: + TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack; + + TeleportStartPacket tpStart = new TeleportStartPacket(); + tpStart.Info.TeleportFlags = 8; // tp via lm + this.OutPacket(tpStart); + + TeleportProgressPacket tpProgress = new TeleportProgressPacket(); + tpProgress.Info.Message = (new ASCIIEncoding()).GetBytes("sending_landmark"); + tpProgress.Info.TeleportFlags = 8; + tpProgress.AgentData.AgentID = tpReq.Info.AgentID; + this.OutPacket(tpProgress); + + // Fetch landmark + LLUUID lmid = tpReq.Info.LandmarkID; + AssetBase lma = this.m_assetCache.GetAsset(lmid); + if (lma != null) + { + AssetLandmark lm = new AssetLandmark(lma); + + if (lm.RegionID == m_world.RegionInfo.SimUUID) + { + TeleportLocalPacket tpLocal = new TeleportLocalPacket(); + + tpLocal.Info.AgentID = tpReq.Info.AgentID; + tpLocal.Info.TeleportFlags = 8; // Teleport via landmark + tpLocal.Info.LocationID = 2; + tpLocal.Info.Position = lm.Position; + OutPacket(tpLocal); + } + else + { + TeleportCancelPacket tpCancel = new TeleportCancelPacket(); + tpCancel.Info.AgentID = tpReq.Info.AgentID; + tpCancel.Info.SessionID = tpReq.Info.SessionID; + OutPacket(tpCancel); + } + } + else + { + Console.WriteLine("Cancelling Teleport - fetch asset not yet implemented"); + + TeleportCancelPacket tpCancel = new TeleportCancelPacket(); + tpCancel.Info.AgentID = tpReq.Info.AgentID; + tpCancel.Info.SessionID = tpReq.Info.SessionID; + OutPacket(tpCancel); + } + break; + case PacketType.TeleportLocationRequest: + TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack; + // Console.WriteLine(tpLocReq.ToString()); + + if (OnTeleportLocationRequest != null) + { + OnTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position, tpLocReq.Info.LookAt, 16); + } + else + { + //no event handler so cancel request + TeleportCancelPacket tpCancel = new TeleportCancelPacket(); + tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID; + tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID; + OutPacket(tpCancel); + } + break; + #endregion + + case PacketType.MoneyBalanceRequest: + this.SendMoneyBalance(LLUUID.Zero, true, new byte[0], 1000); + break; + case PacketType.UUIDNameRequest: + UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack; + foreach (UUIDNameRequestPacket.UUIDNameBlockBlock UUIDBlock in incoming.UUIDNameBlock) + { + OnNameFromUUIDRequest(UUIDBlock.ID, this); + } + break; + #region Parcel related packets + case PacketType.ParcelPropertiesRequest: + ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack; + if (OnParcelPropertiesRequest != null) + { + OnParcelPropertiesRequest((int)Math.Round(propertiesRequest.ParcelData.West), (int)Math.Round(propertiesRequest.ParcelData.South), (int)Math.Round(propertiesRequest.ParcelData.East), (int)Math.Round(propertiesRequest.ParcelData.North), propertiesRequest.ParcelData.SequenceID, propertiesRequest.ParcelData.SnapSelection, this); + } + break; + case PacketType.ParcelDivide: + ParcelDividePacket parcelDivide = (ParcelDividePacket)Pack; + if (OnParcelDivideRequest != null) + { + OnParcelDivideRequest((int)Math.Round(parcelDivide.ParcelData.West), (int)Math.Round(parcelDivide.ParcelData.South), (int)Math.Round(parcelDivide.ParcelData.East), (int)Math.Round(parcelDivide.ParcelData.North), this); + } + break; + case PacketType.ParcelJoin: + ParcelJoinPacket parcelJoin = (ParcelJoinPacket)Pack; + if (OnParcelJoinRequest != null) + { + OnParcelJoinRequest((int)Math.Round(parcelJoin.ParcelData.West), (int)Math.Round(parcelJoin.ParcelData.South), (int)Math.Round(parcelJoin.ParcelData.East), (int)Math.Round(parcelJoin.ParcelData.North), this); + } + break; + case PacketType.ParcelPropertiesUpdate: + ParcelPropertiesUpdatePacket updatePacket = (ParcelPropertiesUpdatePacket)Pack; + if (OnParcelPropertiesUpdateRequest != null) + { + OnParcelPropertiesUpdateRequest(updatePacket, this); + } + break; + #endregion + + #region Estate Packets + case PacketType.EstateOwnerMessage: + EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack; + if (OnEstateOwnerMessage != null) + { + OnEstateOwnerMessage(messagePacket, this); + } + break; + #endregion + + #region unimplemented handlers + case PacketType.AgentIsNowWearing: + // AgentIsNowWearingPacket wear = (AgentIsNowWearingPacket)Pack; + //Console.WriteLine(Pack.ToString()); + break; + case PacketType.ObjectScale: + //OpenSim.Framework.Console.MainLog.Instance.Verbose( Pack.ToString()); + break; + #endregion + } + } + } + } +} diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs new file mode 100644 index 0000000000..52749a1071 --- /dev/null +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -0,0 +1,271 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Threading; +using System.Timers; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Assets; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Inventory; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; +using OpenSim.Region.Caches; +using Timer=System.Timers.Timer; + +namespace OpenSim.Region.ClientStack +{ + public delegate bool PacketMethod(ClientView simClient, Packet packet); + + /// + /// Handles new client connections + /// Constructor takes a single Packet and authenticates everything + /// + public partial class ClientView : ClientViewBase, IClientAPI + { + public static TerrainManager TerrainManager; + + protected static Dictionary PacketHandlers = new Dictionary(); //Global/static handlers for all clients + protected Dictionary m_packetHandlers = new Dictionary(); //local handlers for this instance + + public LLUUID AgentID; + public LLUUID SessionID; + public LLUUID SecureSessionID = LLUUID.Zero; + public string firstName; + public string lastName; + public bool m_child = false; + private UseCircuitCodePacket cirpack; + public Thread ClientThread; + public LLVector3 startpos; + + private AgentAssetUpload UploadAssets; + private LLUUID newAssetFolder = LLUUID.Zero; + private bool debug = false; + protected IWorld m_world; + private Dictionary m_clientThreads; + private AssetCache m_assetCache; + private InventoryCache m_inventoryCache; + private int cachedtextureserial = 0; + protected AuthenticateSessionsBase m_authenticateSessionsHandler; + private Encoding enc = Encoding.ASCII; + + public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions ) + { + m_world = world; + m_clientThreads = clientThreads; + m_assetCache = assetCache; + + m_networkServer = packServer; + m_inventoryCache = inventoryCache; + m_authenticateSessionsHandler = authenSessions; + + MainLog.Instance.Verbose( "OpenSimClient.cs - Started up new client thread to handle incoming request"); + cirpack = initialcirpack; + userEP = remoteEP; + + this.startpos = m_authenticateSessionsHandler.GetPosition(initialcirpack.CircuitCode.Code); + + PacketQueue = new BlockingQueue(); + + this.UploadAssets = new AgentAssetUpload(this, m_assetCache, m_inventoryCache); + AckTimer = new Timer(500); + AckTimer.Elapsed += new ElapsedEventHandler(AckTimer_Elapsed); + AckTimer.Start(); + + this.RegisterLocalPacketHandlers(); + + ClientThread = new Thread(new ThreadStart(AuthUser)); + ClientThread.IsBackground = true; + ClientThread.Start(); + } + + # region Client Methods + + public void KillClient() + { + KillObjectPacket kill = new KillObjectPacket(); + kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; + kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); + //kill.ObjectData[0].ID = this.ClientAvatar.localid; + foreach (ClientView client in m_clientThreads.Values) + { + client.OutPacket(kill); + } + + this.m_inventoryCache.ClientLeaving(this.AgentID, null); + m_world.RemoveClient(this.AgentId); + + m_clientThreads.Remove(this.CircuitCode); + m_networkServer.RemoveClientCircuit(this.CircuitCode); + this.ClientThread.Abort(); + } + #endregion + + # region Packet Handling + public static bool AddPacketHandler(PacketType packetType, PacketMethod handler) + { + bool result = false; + lock (PacketHandlers) + { + if (!PacketHandlers.ContainsKey(packetType)) + { + PacketHandlers.Add(packetType, handler); + result = true; + } + } + return result; + } + + public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler) + { + bool result = false; + lock (m_packetHandlers) + { + if (!m_packetHandlers.ContainsKey(packetType)) + { + m_packetHandlers.Add(packetType, handler); + result = true; + } + } + return result; + } + + protected virtual bool ProcessPacketMethod(Packet packet) + { + bool result = false; + bool found = false; + PacketMethod method; + if (m_packetHandlers.TryGetValue(packet.Type, out method)) + { + //there is a local handler for this packet type + result = method(this, packet); + } + else + { + //there is not a local handler so see if there is a Global handler + lock (PacketHandlers) + { + found = PacketHandlers.TryGetValue(packet.Type, out method); + } + if (found) + { + result = method(this, packet); + } + } + return result; + } + + protected virtual void ClientLoop() + { + MainLog.Instance.Verbose( "OpenSimClient.cs:ClientLoop() - Entered loop"); + while (true) + { + QueItem nextPacket = PacketQueue.Dequeue(); + if (nextPacket.Incoming) + { + //is a incoming packet + ProcessInPacket(nextPacket.Packet); + } + else + { + //is a out going packet + ProcessOutPacket(nextPacket.Packet); + } + } + } + # endregion + + # region Setup + + protected virtual void InitNewClient() + { + MainLog.Instance.Verbose( "OpenSimClient.cs:InitNewClient() - Adding viewer agent to world"); + this.m_world.AddNewClient(this, false); + } + + protected virtual void AuthUser() + { + // AuthenticateResponse sessionInfo = m_gridServer.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code); + AuthenticateResponse sessionInfo = this.m_authenticateSessionsHandler.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code); + if (!sessionInfo.Authorised) + { + //session/circuit not authorised + MainLog.Instance.Notice("OpenSimClient.cs:AuthUser() - New user request denied to " + userEP.ToString()); + ClientThread.Abort(); + } + else + { + MainLog.Instance.Notice("OpenSimClient.cs:AuthUser() - Got authenticated connection from " + userEP.ToString()); + //session is authorised + this.AgentID = cirpack.CircuitCode.ID; + this.SessionID = cirpack.CircuitCode.SessionID; + this.CircuitCode = cirpack.CircuitCode.Code; + this.firstName = sessionInfo.LoginInfo.First; + this.lastName = sessionInfo.LoginInfo.Last; + + if (sessionInfo.LoginInfo.SecureSession != LLUUID.Zero) + { + this.SecureSessionID = sessionInfo.LoginInfo.SecureSession; + } + InitNewClient(); + + ClientLoop(); + } + } + # endregion + + + protected override void KillThread() + { + this.ClientThread.Abort(); + } + + #region Inventory Creation + private void SetupInventory(AuthenticateResponse sessionInfo) + { + + } + private AgentInventory CreateInventory(LLUUID baseFolder) + { + AgentInventory inventory = null; + + return inventory; + } + + private void CreateInventoryItem(CreateInventoryItemPacket packet) + { + + } + #endregion + + } +} diff --git a/OpenSim/Region/ClientStack/ClientViewBase.cs b/OpenSim/Region/ClientStack/ClientViewBase.cs new file mode 100644 index 0000000000..24c6911df1 --- /dev/null +++ b/OpenSim/Region/ClientStack/ClientViewBase.cs @@ -0,0 +1,326 @@ + +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Timers; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Console; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Region.ClientStack +{ + public class ClientViewBase + { + protected BlockingQueue PacketQueue; + protected Dictionary PendingAcks = new Dictionary(); + protected Dictionary NeedAck = new Dictionary(); + + protected Timer AckTimer; + protected uint Sequence = 0; + protected object SequenceLock = new object(); + protected const int MAX_APPENDED_ACKS = 10; + protected const int RESEND_TIMEOUT = 4000; + protected const int MAX_SEQUENCE = 0xFFFFFF; + + public uint CircuitCode; + public EndPoint userEP; + + protected PacketServer m_networkServer; + + public ClientViewBase() + { + + } + + protected virtual void ProcessInPacket(Packet Pack) + { + + } + + protected virtual void ProcessOutPacket(Packet Pack) + { + // Keep track of when this packet was sent out + Pack.TickCount = Environment.TickCount; + + Console.WriteLine("OUT: " + Pack.Type.ToString()); + + if (!Pack.Header.Resent) + { + // Set the sequence number + lock (SequenceLock) + { + if (Sequence >= MAX_SEQUENCE) + Sequence = 1; + else + Sequence++; + Pack.Header.Sequence = Sequence; + } + + if (Pack.Header.Reliable) //DIRTY HACK + { + lock (NeedAck) + { + if (!NeedAck.ContainsKey(Pack.Header.Sequence)) + { + try + { + NeedAck.Add(Pack.Header.Sequence, Pack); + } + catch (Exception e) // HACKY + { + e.ToString(); + // Ignore + // Seems to throw a exception here occasionally + // of 'duplicate key' despite being locked. + // !?!?!? + } + } + else + { + // Client.Log("Attempted to add a duplicate sequence number (" + + // packet.Header.Sequence + ") to the NeedAck dictionary for packet type " + + // packet.Type.ToString(), Helpers.LogLevel.Warning); + } + } + + // Don't append ACKs to resent packets, in case that's what was causing the + // delivery to fail + if (!Pack.Header.Resent) + { + // Append any ACKs that need to be sent out to this packet + lock (PendingAcks) + { + if (PendingAcks.Count > 0 && PendingAcks.Count < MAX_APPENDED_ACKS && + Pack.Type != PacketType.PacketAck && + Pack.Type != PacketType.LogoutRequest) + { + Pack.Header.AckList = new uint[PendingAcks.Count]; + int i = 0; + + foreach (uint ack in PendingAcks.Values) + { + Pack.Header.AckList[i] = ack; + i++; + } + + PendingAcks.Clear(); + Pack.Header.AppendedAcks = true; + } + } + } + } + } + + byte[] ZeroOutBuffer = new byte[4096]; + byte[] sendbuffer; + sendbuffer = Pack.ToBytes(); + + try + { + if (Pack.Header.Zerocoded) + { + int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer); + m_networkServer.SendPacketTo(ZeroOutBuffer, packetsize, SocketFlags.None, CircuitCode);//userEP); + } + else + { + m_networkServer.SendPacketTo(sendbuffer, sendbuffer.Length, SocketFlags.None, CircuitCode); //userEP); + } + } + catch (Exception) + { + MainLog.Instance.Warn("OpenSimClient.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection " + userEP.ToString() + " - killing thread"); + this.KillThread(); + } + + } + + public virtual void InPacket(Packet NewPack) + { + // Handle appended ACKs + if (NewPack.Header.AppendedAcks) + { + lock (NeedAck) + { + foreach (uint ack in NewPack.Header.AckList) + { + NeedAck.Remove(ack); + } + } + } + + // Handle PacketAck packets + if (NewPack.Type == PacketType.PacketAck) + { + PacketAckPacket ackPacket = (PacketAckPacket)NewPack; + + lock (NeedAck) + { + foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets) + { + NeedAck.Remove(block.ID); + } + } + } + else if ((NewPack.Type == PacketType.StartPingCheck)) + { + //reply to pingcheck + StartPingCheckPacket startPing = (StartPingCheckPacket)NewPack; + CompletePingCheckPacket endPing = new CompletePingCheckPacket(); + endPing.PingID.PingID = startPing.PingID.PingID; + OutPacket(endPing); + } + else + { + QueItem item = new QueItem(); + item.Packet = NewPack; + item.Incoming = true; + this.PacketQueue.Enqueue(item); + } + + } + + public virtual void OutPacket(Packet NewPack) + { + QueItem item = new QueItem(); + item.Packet = NewPack; + item.Incoming = false; + this.PacketQueue.Enqueue(item); + } + + # region Low Level Packet Methods + + protected void ack_pack(Packet Pack) + { + if (Pack.Header.Reliable) + { + PacketAckPacket ack_it = new PacketAckPacket(); + ack_it.Packets = new PacketAckPacket.PacketsBlock[1]; + ack_it.Packets[0] = new PacketAckPacket.PacketsBlock(); + ack_it.Packets[0].ID = Pack.Header.Sequence; + ack_it.Header.Reliable = false; + + OutPacket(ack_it); + + } + /* + if (Pack.Header.Reliable) + { + lock (PendingAcks) + { + uint sequence = (uint)Pack.Header.Sequence; + if (!PendingAcks.ContainsKey(sequence)) { PendingAcks[sequence] = sequence; } + } + }*/ + } + + protected void ResendUnacked() + { + int now = Environment.TickCount; + + lock (NeedAck) + { + foreach (Packet packet in NeedAck.Values) + { + if ((now - packet.TickCount > RESEND_TIMEOUT) && (!packet.Header.Resent)) + { + MainLog.Instance.Verbose( "Resending " + packet.Type.ToString() + " packet, " + + (now - packet.TickCount) + "ms have passed"); + + packet.Header.Resent = true; + OutPacket(packet); + } + } + } + } + + protected void SendAcks() + { + lock (PendingAcks) + { + if (PendingAcks.Count > 0) + { + if (PendingAcks.Count > 250) + { + // FIXME: Handle the odd case where we have too many pending ACKs queued up + MainLog.Instance.Verbose( "Too many ACKs queued up!"); + return; + } + + //OpenSim.Framework.Console.MainLog.Instance.WriteLine("Sending PacketAck"); + + + int i = 0; + PacketAckPacket acks = new PacketAckPacket(); + acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count]; + + foreach (uint ack in PendingAcks.Values) + { + acks.Packets[i] = new PacketAckPacket.PacketsBlock(); + acks.Packets[i].ID = ack; + i++; + } + + acks.Header.Reliable = false; + OutPacket(acks); + + PendingAcks.Clear(); + } + } + } + + protected void AckTimer_Elapsed(object sender, ElapsedEventArgs ea) + { + SendAcks(); + ResendUnacked(); + } + #endregion + + protected virtual void KillThread() + { + + } + + #region Nested Classes + + public class QueItem + { + public QueItem() + { + } + + public Packet Packet; + public bool Incoming; + } + #endregion + } +} diff --git a/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj b/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj new file mode 100644 index 0000000000..93793cfa5a --- /dev/null +++ b/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj @@ -0,0 +1,166 @@ + + + Local + 8.0.50727 + 2.0 + {DC3698B2-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.ClientStack + JScript + Grid + IE50 + false + Library + + OpenSim.Region.ClientStack + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\Axiom.MathLib.dll + False + + + ..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + ..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Caches + {61FCCDB3-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Physics.Manager + {F4FF31EB-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Terrain.BasicTerrain + {C9E0F891-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj.user b/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/ClientStack/OpenSim.Region.ClientStack.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/ClientStack/PacketServer.cs b/OpenSim/Region/ClientStack/PacketServer.cs new file mode 100644 index 0000000000..b5f0a02e14 --- /dev/null +++ b/OpenSim/Region/ClientStack/PacketServer.cs @@ -0,0 +1,179 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using libsecondlife.Packets; +using OpenSim.Assets; +using OpenSim.Framework; +using OpenSim.Framework.Interfaces; +using OpenSim.Region.Caches; + +namespace OpenSim.Region.ClientStack +{ + public class PacketServer + { + private ClientStackNetworkHandler _networkHandler; + private IWorld _localWorld; + public Dictionary ClientThreads = new Dictionary(); + public Dictionary ClientAPIs = new Dictionary(); + + public PacketServer(ClientStackNetworkHandler networkHandler) + { + _networkHandler = networkHandler; + _networkHandler.RegisterPacketServer(this); + } + + public IWorld LocalWorld + { + set + { + this._localWorld = value; + } + } + + /// + /// + /// + /// + /// + public virtual void ClientInPacket(uint circuitCode, Packet packet) + { + if (this.ClientThreads.ContainsKey(circuitCode)) + { + ClientThreads[circuitCode].InPacket(packet); + } + } + + /// + /// + /// + /// + /// + public virtual bool AddNewCircuitCodeClient(uint circuitCode) + { + return false; + } + + /// + /// + /// + /// + public virtual void SendPacketToAllClients(Packet packet) + { + + } + + /// + /// + /// + /// + /// + public virtual void SendPacketToAllExcept(Packet packet, ClientView simClient) + { + + } + + /// + /// + /// + /// + /// + public virtual void AddClientPacketHandler(PacketType packetType, PacketMethod handler) + { + + } + + /// + /// + /// + public virtual void RegisterClientPacketHandlers() + { + + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + protected virtual ClientView CreateNewClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions) + { + return new ClientView(remoteEP, initialcirpack, clientThreads, world, assetCache, packServer, inventoryCache, authenSessions ); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public virtual bool AddNewClient(EndPoint epSender, UseCircuitCodePacket useCircuit, AssetCache assetCache, InventoryCache inventoryCache, AuthenticateSessionsBase authenticateSessionsClass) + { + ClientView newuser = + CreateNewClient(epSender, useCircuit, ClientThreads, _localWorld, assetCache, this, inventoryCache, + authenticateSessionsClass); + + this.ClientThreads.Add(useCircuit.CircuitCode.Code, newuser); + this.ClientAPIs.Add(useCircuit.CircuitCode.Code, (IClientAPI)newuser); + + return true; + } + + /// + /// + /// + /// + /// + /// + /// + public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode) + { + this._networkHandler.SendPacketTo(buffer, size, flags, circuitcode); + } + + /// + /// + /// + /// + public virtual void RemoveClientCircuit(uint circuitcode) + { + this._networkHandler.RemoveClientCircuit(circuitcode); + } + } +} diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs new file mode 100644 index 0000000000..1e99c7141f --- /dev/null +++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs @@ -0,0 +1,117 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Net; +using OpenSim.Assets; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; +using OpenSim.Physics.Manager; +using OpenSim.Region.Caches; + +namespace OpenSim.Region.ClientStack +{ + public class RegionApplicationBase + { + protected IGenericConfig localConfig; + protected PhysicsManager physManager; + protected AssetCache AssetCache; + protected InventoryCache InventoryCache; + protected Dictionary clientCircuits = new Dictionary(); + protected DateTime startuptime; + protected NetworkServersInfo serversData; + + public string m_physicsEngine; + public bool m_sandbox = false; + public bool m_loginserver; + public bool user_accounts = false; + public bool gridLocalAsset = false; + protected bool configFileSetup = false; + public string m_config; + + protected List m_udpServer = new List(); + protected List regionData = new List(); + protected List m_localWorld = new List(); + protected BaseHttpServer httpServer; + protected List AuthenticateSessionsHandler = new List(); + + protected LogBase m_log; + + public RegionApplicationBase() + { + + } + + public RegionApplicationBase(bool sandBoxMode, bool startLoginServer, string physicsEngine, bool useConfigFile, bool silent, string configFile) + { + this.configFileSetup = useConfigFile; + m_sandbox = sandBoxMode; + m_loginserver = startLoginServer; + m_physicsEngine = physicsEngine; + m_config = configFile; + } + + /*protected World m_localWorld; + public World LocalWorld + { + get { return m_localWorld; } + }*/ + + /// + /// Performs initialisation of the world, such as loading configuration from disk. + /// + public virtual void StartUp() + { + } + + protected virtual void SetupLocalGridServers() + { + } + + protected virtual void SetupRemoteGridServers() + { + + } + + protected virtual void SetupWorld() + { + } + + protected virtual void SetupHttpListener() + { + } + + protected virtual void ConnectToRemoteGridServer() + { + + } + } +} diff --git a/OpenSim/Region/ClientStack/UDPServer.cs b/OpenSim/Region/ClientStack/UDPServer.cs new file mode 100644 index 0000000000..6eea5243be --- /dev/null +++ b/OpenSim/Region/ClientStack/UDPServer.cs @@ -0,0 +1,196 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using libsecondlife.Packets; +using OpenSim.Assets; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Region.Caches; + +namespace OpenSim.Region.ClientStack +{ + + public class UDPServer : ClientStackNetworkHandler + { + protected Dictionary clientCircuits = new Dictionary(); + public Socket Server; + protected IPEndPoint ServerIncoming; + protected byte[] RecvBuffer = new byte[4096]; + protected byte[] ZeroBuffer = new byte[8192]; + protected IPEndPoint ipeSender; + protected EndPoint epSender; + protected AsyncCallback ReceivedData; + protected PacketServer _packetServer; + + protected int listenPort; + protected IWorld m_localWorld; + protected AssetCache m_assetCache; + protected InventoryCache m_inventoryCache; + protected LogBase m_log; + protected AuthenticateSessionsBase m_authenticateSessionsClass; + + public PacketServer PacketServer + { + get + { + return _packetServer; + } + set + { + _packetServer = value; + } + } + + public IWorld LocalWorld + { + set + { + this.m_localWorld = value; + this._packetServer.LocalWorld = this.m_localWorld; + } + } + + public UDPServer() + { + } + + public UDPServer(int port, AssetCache assetCache, InventoryCache inventoryCache, LogBase console, AuthenticateSessionsBase authenticateClass) + { + listenPort = port; + this.m_assetCache = assetCache; + this.m_inventoryCache = inventoryCache; + this.m_log = console; + this.m_authenticateSessionsClass = authenticateClass; + this.CreatePacketServer(); + + } + + protected virtual void CreatePacketServer() + { + PacketServer packetServer = new PacketServer(this); + } + + protected virtual void OnReceivedData(IAsyncResult result) + { + ipeSender = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0); + epSender = (EndPoint)ipeSender; + Packet packet = null; + int numBytes = Server.EndReceiveFrom(result, ref epSender); + int packetEnd = numBytes - 1; + + packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer); + + // do we already have a circuit for this endpoint + if (this.clientCircuits.ContainsKey(epSender)) + { + //if so then send packet to the packetserver + this._packetServer.ClientInPacket(this.clientCircuits[epSender], packet); + } + else if (packet.Type == PacketType.UseCircuitCode) + { + // new client + this.AddNewClient(packet); + } + else + { // invalid client + m_log.Warn("UDPServer.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString()); + } + + Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); + } + + protected virtual void AddNewClient(Packet packet) + { + UseCircuitCodePacket useCircuit = (UseCircuitCodePacket)packet; + this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code); + + this.PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_inventoryCache, m_authenticateSessionsClass); + } + + public void ServerListener() + { + m_log.Status("UDPServer.cs:ServerListener() - Opening UDP socket on " + listenPort); + + ServerIncoming = new IPEndPoint(IPAddress.Parse("0.0.0.0"), listenPort); + Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + Server.Bind(ServerIncoming); + + m_log.Verbose("UDPServer.cs:ServerListener() - UDP socket bound, getting ready to listen"); + + ipeSender = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0); + epSender = (EndPoint)ipeSender; + ReceivedData = new AsyncCallback(this.OnReceivedData); + Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); + + m_log.Verbose("UDPServer.cs:ServerListener() - Listening..."); + + } + + public virtual void RegisterPacketServer(PacketServer server) + { + this._packetServer = server; + } + + public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)//EndPoint packetSender) + { + // find the endpoint for this circuit + EndPoint sendto = null; + foreach (KeyValuePair p in this.clientCircuits) + { + if (p.Value == circuitcode) + { + sendto = p.Key; + break; + } + } + if (sendto != null) + { + //we found the endpoint so send the packet to it + this.Server.SendTo(buffer, size, flags, sendto); + } + } + + public virtual void RemoveClientCircuit(uint circuitcode) + { + foreach (KeyValuePair p in this.clientCircuits) + { + if (p.Value == circuitcode) + { + this.clientCircuits.Remove(p.Key); + break; + } + } + } + + + } +} \ No newline at end of file diff --git a/OpenSim/Region/ClientStack/obj/Debug/OpenSim.Region.ClientStack.dll b/OpenSim/Region/ClientStack/obj/Debug/OpenSim.Region.ClientStack.dll new file mode 100644 index 0000000000000000000000000000000000000000..1f4191a1698ec6a70f6548c82909e728be749e1e GIT binary patch literal 81920 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

Z5pY43>#9qOW}rvFVmBJGrI@bbRM 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/ClientStack/obj/OpenSim.Region.ClientStack.csproj.FileList.txt b/OpenSim/Region/ClientStack/obj/OpenSim.Region.ClientStack.csproj.FileList.txt new file mode 100644 index 0000000000..534f1476ed --- /dev/null +++ b/OpenSim/Region/ClientStack/obj/OpenSim.Region.ClientStack.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Region.ClientStack.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.ClientStack.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.ClientStack.dll +obj\Debug\OpenSim.Region.ClientStack.pdb +..\..\..\bin\OpenSim.Region.ClientStack.pdb diff --git a/OpenSim/Region/ClientStack/obj/Release/OpenSim.Region.ClientStack.dll b/OpenSim/Region/ClientStack/obj/Release/OpenSim.Region.ClientStack.dll new file mode 100644 index 0000000000000000000000000000000000000000..2d619aa46afabcc05c78782b553c3cb7150e1768 GIT binary patch literal 77824 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs new file mode 100644 index 0000000000..5d6ede851d --- /dev/null +++ b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs @@ -0,0 +1,53 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using OpenSim.Framework.Communications; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Communications.Local +{ + public class CommunicationsLocal : CommunicationsManager + { + public LocalBackEndServices SandBoxServices = new LocalBackEndServices(); + public LocalUserServices UserServices; + + public CommunicationsLocal(NetworkServersInfo serversInfo) + : base(serversInfo) + { + UserServices = new LocalUserServices(this, serversInfo); + UserServices.AddPlugin("OpenSim.Framework.Data.DB4o.dll"); + UserServer = UserServices; + GridServer = SandBoxServices; + InterRegion = SandBoxServices; + } + + internal void InformRegionOfLogin(ulong regionHandle, Login login) + { + this.SandBoxServices.AddNewSession(regionHandle, login); + } + } +} diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs new file mode 100644 index 0000000000..d0cd991b3f --- /dev/null +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs @@ -0,0 +1,206 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using libsecondlife; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Communications.Local +{ + + public class LocalBackEndServices : IGridServices, IInterRegionCommunications + { + protected Dictionary regions = new Dictionary(); + protected Dictionary regionHosts = new Dictionary(); + + public LocalBackEndServices() + { + + } + + ///

+ /// Register a region method with the BackEnd Services. + /// + /// + /// + public RegionCommsListener RegisterRegion(RegionInfo regionInfo) + { + //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering"); + if (!this.regions.ContainsKey((uint)regionInfo.RegionHandle)) + { + //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle ); + this.regions.Add(regionInfo.RegionHandle, regionInfo); + RegionCommsListener regionHost = new RegionCommsListener(); + this.regionHosts.Add(regionInfo.RegionHandle, regionHost); + + return regionHost; + } + + //already in our list of regions so for now lets return null + return null; + } + + /// + /// + /// + /// + public List RequestNeighbours(RegionInfo regionInfo) + { + // Console.WriteLine("Finding Neighbours to " + regionInfo.RegionHandle); + List neighbours = new List(); + + foreach (RegionInfo reg in this.regions.Values) + { + // Console.WriteLine("CommsManager- RequestNeighbours() checking region " + reg.RegionLocX + " , "+ reg.RegionLocY); + if (reg.RegionHandle != regionInfo.RegionHandle) + { + //Console.WriteLine("CommsManager- RequestNeighbours() - found a different region in list, checking location"); + if ((reg.RegionLocX > (regionInfo.RegionLocX - 2)) && (reg.RegionLocX < (regionInfo.RegionLocX + 2))) + { + if ((reg.RegionLocY > (regionInfo.RegionLocY - 2)) && (reg.RegionLocY < (regionInfo.RegionLocY + 2))) + { + neighbours.Add(reg); + } + } + } + } + return neighbours; + } + + /// + /// + /// + /// + /// + public RegionInfo RequestNeighbourInfo(ulong regionHandle) + { + if (this.regions.ContainsKey(regionHandle)) + { + return this.regions[regionHandle]; + } + return null; + } + + /// + /// + /// + /// + /// + /// + /// + /// + public List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) + { + List mapBlocks = new List(); + foreach(RegionInfo regInfo in this.regions.Values) + { + if (((regInfo.RegionLocX >= minX) && (regInfo.RegionLocX <= maxX)) && ((regInfo.RegionLocY >= minY) && (regInfo.RegionLocY <= maxY))) + { + MapBlockData map = new MapBlockData(); + map.Name = regInfo.RegionName; + map.X = (ushort)regInfo.RegionLocX; + map.Y = (ushort)regInfo.RegionLocY; + map.WaterHeight =(byte) regInfo.estateSettings.waterHeight; + map.MapImageId = regInfo.estateSettings.terrainImageID; //new LLUUID("00000000-0000-0000-9999-000000000007"); + map.Agents = 1; + map.RegionFlags = 72458694; + map.Access = 13; + mapBlocks.Add(map); + } + } + return mapBlocks; + } + + /// + /// + /// + /// + /// + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) //should change from agentCircuitData + { + //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent"); + if (this.regionHosts.ContainsKey(regionHandle)) + { + // Console.WriteLine("CommsManager- Informing a region to expect child agent"); + this.regionHosts[regionHandle].TriggerExpectUser(regionHandle, agentData); + return true; + } + return false; + } + + /// + /// + /// + /// + /// + /// + /// + public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position) + { + if (this.regionHosts.ContainsKey(regionHandle)) + { + // Console.WriteLine("CommsManager- Informing a region to expect avatar crossing"); + this.regionHosts[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position); + return true; + } + return false; + } + + /// + /// Is a Sandbox mode method, used by the local Login server to inform a region of a connection user/session + /// + /// + /// + /// + public bool AddNewSession(ulong regionHandle, Login loginData) + { + AgentCircuitData agent = new AgentCircuitData(); + agent.AgentID = loginData.Agent; + agent.firstname = loginData.First; + agent.lastname = loginData.Last; + agent.SessionID = loginData.Session; + agent.SecureSessionID = loginData.SecureSession; + agent.circuitcode = loginData.CircuitCode; + agent.BaseFolder = loginData.BaseFolder; + agent.InventoryFolder = loginData.InventoryFolder; + agent.startpos = new LLVector3(128, 128, 70); + agent.CapsPath = loginData.CapsPath; + + if (this.regionHosts.ContainsKey(regionHandle)) + { + this.regionHosts[regionHandle].TriggerExpectUser(regionHandle, agent); + return true; + } + + // region not found + return false; + } + } +} + diff --git a/OpenSim/Region/Communications/Local/LocalUserServices.cs b/OpenSim/Region/Communications/Local/LocalUserServices.cs new file mode 100644 index 0000000000..592b36ca68 --- /dev/null +++ b/OpenSim/Region/Communications/Local/LocalUserServices.cs @@ -0,0 +1,142 @@ +using System; +using libsecondlife; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Data; +using OpenSim.Framework.Types; +using OpenSim.Framework.UserManagement; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Region.Communications.Local +{ + public class LocalUserServices : UserManagerBase, IUserServices + { + private CommunicationsLocal m_Parent; + + private NetworkServersInfo serversInfo; + private uint defaultHomeX ; + private uint defaultHomeY; + public LocalUserServices(CommunicationsLocal parent, NetworkServersInfo serversData) + { + m_Parent = parent; + this.serversInfo = serversData; + defaultHomeX = this.serversInfo.DefaultHomeLocX; + defaultHomeY = this.serversInfo.DefaultHomeLocY; + } + + public UserProfileData GetUserProfile(string firstName, string lastName) + { + return GetUserProfile(firstName + " " + lastName); + } + + public UserProfileData GetUserProfile(string name) + { + return this.getUserProfile(name); + } + + public UserProfileData GetUserProfile(LLUUID avatarID) + { + return this.getUserProfile(avatarID); + } + + /// + /// + /// + /// + public override string GetMessage() + { + return "Welcome to OpenSim"; + } + + public override UserProfileData GetTheUser(string firstname, string lastname) + { + UserProfileData profile = getUserProfile(firstname, lastname); + if (profile != null) + { + + return profile; + } + + //no current user account so make one + Console.WriteLine("No User account found so creating a new one "); + this.AddUserProfile(firstname, lastname, "test", defaultHomeX, defaultHomeY); + + profile = getUserProfile(firstname, lastname); + + return profile; + } + + public override bool AuthenticateUser(UserProfileData profile, string password) + { + //for now we will accept any password in sandbox mode + Console.WriteLine("authorising user"); + return true; + } + + public override void CustomiseResponse(LoginResponse response, UserProfileData theUser) + { + ulong currentRegion = theUser.currentAgent.currentHandle; + RegionInfo reg = m_Parent.GridServer.RequestNeighbourInfo(currentRegion); + + if (reg != null) + { + response.Home = "{'region_handle':[r" + (reg.RegionLocX * 256).ToString() + ",r" + (reg.RegionLocY * 256).ToString() + "], " + + "'position':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "], " + + "'look_at':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "]}"; + string capsPath = Util.GetRandomCapsPath(); + response.SimAddress = reg.ExternalEndPoint.Address.ToString(); + response.SimPort = (Int32)reg.ExternalEndPoint.Port; + response.RegionX = reg.RegionLocX ; + response.RegionY = reg.RegionLocY ; + + //following port needs changing as we don't want a http listener for every region (or do we?) + response.SeedCapability = "http://" + reg.ExternalHostName + ":" + this.serversInfo.HttpListenerPort.ToString() + "/CAPS/" + capsPath + "0000/"; + theUser.currentAgent.currentRegion = reg.SimUUID; + theUser.currentAgent.currentHandle = reg.RegionHandle; + + Login _login = new Login(); + //copy data to login object + _login.First = response.Firstname; + _login.Last = response.Lastname; + _login.Agent = response.AgentID; + _login.Session = response.SessionID; + _login.SecureSession = response.SecureSessionID; + _login.CircuitCode = (uint)response.CircuitCode; + _login.CapsPath = capsPath; + + m_Parent.InformRegionOfLogin(currentRegion, _login); + } + else + { + Console.WriteLine("not found region " + currentRegion); + } + + } + + public UserProfileData SetupMasterUser(string firstName, string lastName) + { + return SetupMasterUser(firstName, lastName, ""); + } + + public UserProfileData SetupMasterUser(string firstName, string lastName, string password) + { + UserProfileData profile = getUserProfile(firstName, lastName); + if (profile != null) + { + + return profile; + } + + Console.WriteLine("Unknown Master User. Sandbox Mode: Creating Account"); + this.AddUserProfile(firstName, lastName, password, defaultHomeX, defaultHomeY); + + profile = getUserProfile(firstName, lastName); + + if (profile == null) + { + Console.WriteLine("Unknown Master User after creation attempt. No clue what to do here."); + } + + return profile; + } + } +} diff --git a/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj b/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj new file mode 100644 index 0000000000..f9f6b7d824 --- /dev/null +++ b/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj @@ -0,0 +1,121 @@ + + + Local + 8.0.50727 + 2.0 + {BFB5D807-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Communications.Local + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Communications.Local + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Communications + {CB52B7E7-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Data + {36B72A9B-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.UserManagement + {586E2916-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj.user b/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..9afb75ee22 --- /dev/null +++ b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Region.Communications.Local")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Region.Communications.Local")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fb173926-bd0a-4cd0-bb45-185b2f72ddfb")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Region/Communications/Local/obj/Debug/OpenSim.Region.Communications.Local.dll b/OpenSim/Region/Communications/Local/obj/Debug/OpenSim.Region.Communications.Local.dll new file mode 100644 index 0000000000000000000000000000000000000000..3c69ffdf122bf46bbb72794437d6caf065574949 GIT binary patch literal 24576 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 Y2zUs12zUs12zUs12zUtm-$CF%0XxScga7~l literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Communications/Local/obj/Debug/OpenSim.Region.Communications.Local.pdb b/OpenSim/Region/Communications/Local/obj/Debug/OpenSim.Region.Communications.Local.pdb new file mode 100644 index 0000000000000000000000000000000000000000..60993b2b8b31067781970e9c993632f4420dd551 GIT binary patch literal 24064 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 Ufu&*CE0>00uUcC9SXqwxFCIs45&!@I literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Communications/Local/obj/OpenSim.Region.Communications.Local.csproj.FileList.txt b/OpenSim/Region/Communications/Local/obj/OpenSim.Region.Communications.Local.csproj.FileList.txt new file mode 100644 index 0000000000..2191267a1d --- /dev/null +++ b/OpenSim/Region/Communications/Local/obj/OpenSim.Region.Communications.Local.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Region.Communications.Local.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Communications.Local.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Communications.Local.dll +obj\Debug\OpenSim.Region.Communications.Local.pdb +..\..\..\..\bin\OpenSim.Region.Communications.Local.pdb diff --git a/OpenSim/Region/Communications/Local/obj/Release/OpenSim.Region.Communications.Local.dll b/OpenSim/Region/Communications/Local/obj/Release/OpenSim.Region.Communications.Local.dll new file mode 100644 index 0000000000000000000000000000000000000000..0c7744e05bbc71c2b4c4b183c7afa88ef7f6e123 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Communications/Local/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Communications/Local/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..eef0190097d3cb20e9aa69756c1f4e5e3a8458fb GIT binary patch literal 24929 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 C7g7uW literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs new file mode 100644 index 0000000000..1118726bf3 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/CommunicationsOGS1.cs @@ -0,0 +1,17 @@ +using OpenSim.Framework.Communications; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Communications.OGS1 +{ + public class CommunicationsOGS1 : CommunicationsManager + { + + public CommunicationsOGS1(NetworkServersInfo serversInfo) :base(serversInfo) + { + OGS1GridServices gridInterComms = new OGS1GridServices(serversInfo); + GridServer = gridInterComms; + InterRegion = gridInterComms; + UserServer = new OGS1UserServices(this); + } + } +} diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs new file mode 100644 index 0000000000..b7d62edb80 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -0,0 +1,267 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Net; +using System.Runtime.Remoting; +using System.Runtime.Remoting.Channels; +using System.Runtime.Remoting.Channels.Tcp; +using libsecondlife; +using Nwc.XmlRpc; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Console; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Communications.OGS1 +{ + public class OGS1GridServices : IGridServices, IInterRegionCommunications + { + public Dictionary listeners = new Dictionary(); + public BaseHttpServer httpListener; + public NetworkServersInfo serversInfo; + + public OGS1GridServices(NetworkServersInfo servers_info) + { + serversInfo = servers_info; + } + + public RegionCommsListener RegisterRegion(RegionInfo regionInfo) + { + Hashtable GridParams = new Hashtable(); + + + // Login / Authentication + + GridParams["authkey"] = serversInfo.GridSendKey; + GridParams["UUID"] = regionInfo.SimUUID.ToStringHyphenated(); + GridParams["sim_ip"] = regionInfo.ExternalHostName; + GridParams["sim_port"] = regionInfo.InternalEndPoint.Port.ToString(); + GridParams["region_locx"] = regionInfo.RegionLocX.ToString(); + GridParams["region_locy"] = regionInfo.RegionLocY.ToString(); + GridParams["sim_name"] = regionInfo.RegionName; + + // Package into an XMLRPC Request + ArrayList SendParams = new ArrayList(); + SendParams.Add(GridParams); + + + + // Send Request + XmlRpcRequest GridReq = new XmlRpcRequest("simulator_login", SendParams); + XmlRpcResponse GridResp = GridReq.Send(serversInfo.GridURL, 3000); + Hashtable GridRespData = (Hashtable)GridResp.Value; + + Hashtable griddatahash = GridRespData; + + // Process Response + if (GridRespData.ContainsKey("error")) + { + string errorstring = (string)GridRespData["error"]; + MainLog.Instance.Error("Unable to connect to grid: " + errorstring); + return null; + } + + if (!this.listeners.ContainsKey(regionInfo.RegionHandle)) + { + MainLog.Instance.Verbose("OGS1 - Registering new HTTP listener on port " + regionInfo.InternalEndPoint.Port.ToString()); + // initialised = true; + httpListener = new BaseHttpServer( regionInfo.InternalEndPoint.Port ); + httpListener.AddXmlRPCHandler("expect_user", this.ExpectUser); + httpListener.Start(); + } + + // Initialise the background listeners + listeners[regionInfo.RegionHandle] = new RegionCommsListener(); + + return listeners[regionInfo.RegionHandle]; + } + + public List RequestNeighbours(RegionInfo regionInfo) + { + Hashtable respData = MapBlockQuery((int)regionInfo.RegionLocX - 1, (int)regionInfo.RegionLocY - 1, (int)regionInfo.RegionLocX + 1, (int)regionInfo.RegionLocY + 1); + + List neighbours = new List(); + + foreach (ArrayList a in respData.Values) + { + foreach (Hashtable n in a) + { + string internalIpStr = (string)n["sim_ip"]; + int port = (int)n["sim_port"]; + string externalUri = (string)n["sim_uri"]; + + IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), port); + string neighbourExternalUri = externalUri; + + RegionInfo neighbour = new RegionInfo((uint)n["x"], (uint)n["y"], neighbourInternalEndPoint, neighbourExternalUri); + + //OGS1 + //neighbour.RegionHandle = (ulong)n["regionhandle"]; is now calculated locally + + neighbour.RegionName = (string)n["name"]; + + //OGS1+ + neighbour.SimUUID = (string)n["uuid"]; + + neighbours.Add(neighbour); + } + } + + return neighbours; + } + + public RegionInfo RequestNeighbourInfo(ulong regionHandle) + { + MainLog.Instance.Warn("Unimplemented - RequestNeighbourInfo()"); + return null; + } + + public List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) + { + Hashtable respData = MapBlockQuery(minX, minY, maxX, maxY); + + List neighbours = new List(); + + foreach (Hashtable n in (Hashtable)respData.Values) + { + MapBlockData neighbour = new MapBlockData(); + + neighbour.X = (ushort)n["x"]; + neighbour.Y = (ushort)n["y"]; + + neighbour.Name = (string)n["name"]; + neighbour.Access = (byte)n["access"]; + neighbour.RegionFlags = (uint)n["region-flags"]; + neighbour.WaterHeight = (byte)n["water-height"]; + neighbour.MapImageId = (string)n["map-image-id"]; + + neighbours.Add(neighbour); + } + + return neighbours; + } + + /// + /// Performs a XML-RPC query against the grid server returning mapblock information in the specified coordinates + /// + /// REDUNDANT - OGS1 is to be phased out in favour of OGS2 + /// Minimum X value + /// Minimum Y value + /// Maximum X value + /// Maximum Y value + /// Hashtable of hashtables containing map data elements + private Hashtable MapBlockQuery(int minX, int minY, int maxX, int maxY) + { + Hashtable param = new Hashtable(); + param["xmin"] = minX; + param["ymin"] = minY; + param["xmax"] = maxX; + param["ymax"] = maxY; + IList parameters = new ArrayList(); + parameters.Add(param); + XmlRpcRequest req = new XmlRpcRequest("map_block", parameters); + XmlRpcResponse resp = req.Send(serversInfo.GridURL, 3000); + Hashtable respData = (Hashtable)resp.Value; + return respData; + } + + // Grid Request Processing + public XmlRpcResponse ExpectUser(XmlRpcRequest request) + { + Console.WriteLine("Expecting User..."); + Hashtable requestData = (Hashtable)request.Params[0]; + AgentCircuitData agentData = new AgentCircuitData(); + agentData.SessionID = new LLUUID((string)requestData["session_id"]); + agentData.SecureSessionID = new LLUUID((string)requestData["secure_session_id"]); + agentData.firstname = (string)requestData["firstname"]; + agentData.lastname = (string)requestData["lastname"]; + agentData.AgentID = new LLUUID((string)requestData["agent_id"]); + agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]); + if (requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1")) + { + agentData.child = true; + } + else + { + agentData.startpos = new LLVector3(Convert.ToUInt32(requestData["startpos_x"]), Convert.ToUInt32(requestData["startpos_y"]), Convert.ToUInt32(requestData["startpos_z"])); + agentData.child = false; + + } + + if (listeners.ContainsKey(Convert.ToUInt64((string)requestData["regionhandle"]))) + { + this.listeners[Convert.ToUInt64((string)requestData["regionhandle"])].TriggerExpectUser(Convert.ToUInt64((string)requestData["regionhandle"]), agentData); + } + else + { + MainLog.Instance.Error("ExpectUser() - Unknown region " + ((ulong)requestData["regionhandle"]).ToString()); + } + + MainLog.Instance.Verbose("ExpectUser() - Welcoming new user..."); + + return new XmlRpcResponse(); + } + + #region InterRegion Comms + private void StartRemoting() + { + TcpChannel ch = new TcpChannel(8895); + ChannelServices.RegisterChannel(ch, true); + + WellKnownServiceTypeEntry wellType = new WellKnownServiceTypeEntry( Type.GetType("OGS1InterRegionRemoting"), "InterRegions", WellKnownObjectMode.Singleton); + RemotingConfiguration.RegisterWellKnownServiceType(wellType); + InterRegionSingleton.Instance.OnArrival += this.IncomingArrival; + InterRegionSingleton.Instance.OnChildAgent += this.IncomingChildAgent; + } + + #region Methods called by regions in this instance + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + if (this.listeners.ContainsKey(regionHandle)) + { + this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData); + return true; + } + //TODO need to see if we know about where this region is and use .net remoting + // to inform it. + return false; + } + + public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position) + { + if (this.listeners.ContainsKey(regionHandle)) + { + this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position); + return true; + } + //TODO need to see if we know about where this region is and use .net remoting + // to inform it. + return false; + } + #endregion + + #region Methods triggered by calls from external instances + public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + if (this.listeners.ContainsKey(regionHandle)) + { + this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData); + return true; + } + return false; + } + + public bool IncomingArrival(ulong regionHandle, LLUUID agentID, LLVector3 position) + { + if (this.listeners.ContainsKey(regionHandle)) + { + this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position); + return true; + } + return false; + } + #endregion + #endregion + } +} diff --git a/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs new file mode 100644 index 0000000000..f514a29730 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs @@ -0,0 +1,69 @@ +using System; +using libsecondlife; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Communications.OGS1 +{ + public delegate bool InformRegionChild(ulong regionHandle, AgentCircuitData agentData); + public delegate bool ExpectArrival(ulong regionHandle, LLUUID agentID, LLVector3 position); + + public sealed class InterRegionSingleton + { + static readonly InterRegionSingleton instance = new InterRegionSingleton(); + + public event InformRegionChild OnChildAgent; + public event ExpectArrival OnArrival; + + static InterRegionSingleton() + { + } + + InterRegionSingleton() + { + } + + public static InterRegionSingleton Instance + { + get + { + return instance; + } + } + + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + if (OnChildAgent != null) + { + return OnChildAgent(regionHandle, agentData); + } + return false; + } + + public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position) + { + if (OnArrival != null) + { + return OnArrival(regionHandle, agentID, position); + } + return false; + } + } + + public class OGS1InterRegionRemoting : MarshalByRefObject + { + + public OGS1InterRegionRemoting() + { + } + + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + return InterRegionSingleton.Instance.InformRegionOfChildAgent(regionHandle, agentData); + } + + public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position) + { + return InterRegionSingleton.Instance.ExpectAvatarCrossing(regionHandle, agentID, position); + } + } +} diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs new file mode 100644 index 0000000000..3a3bccbe6c --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OGS1UserServices.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections; +using libsecondlife; +using Nwc.XmlRpc; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Data; + +namespace OpenSim.Region.Communications.OGS1 +{ + public class OGS1UserServices :IUserServices + { + CommunicationsOGS1 m_parent; + public OGS1UserServices(CommunicationsOGS1 parent) + { + m_parent = parent; + } + + public UserProfileData ConvertXMLRPCDataToUserProfile(Hashtable data) + { + if (data.Contains("error_type")) + { + Console.WriteLine("Error sent by user server when trying to get user profile: (" + data["error_type"] + "): " + data["error_desc"]); + return null; + } + + UserProfileData userData = new UserProfileData(); + userData.username = (string)data["firstname"]; + userData.surname = (string)data["lastname"]; + userData.UUID = new LLUUID((string)data["uuid"]); + userData.userInventoryURI = (string)data["server_inventory"]; + userData.userAssetURI = (string)data["server_asset"]; + userData.profileFirstText = (string)data["profile_firstlife_about"]; + userData.profileFirstImage = new LLUUID((string)data["profile_firstlife_image"]); + userData.profileCanDoMask = Convert.ToUInt32((string)data["profile_can_do"]); + userData.profileWantDoMask = Convert.ToUInt32(data["profile_want_do"]); + userData.profileImage = new LLUUID((string)data["profile_image"]); + userData.lastLogin = Convert.ToInt32((string)data["profile_lastlogin"]); + userData.homeRegion = Convert.ToUInt64((string)data["home_region"]); + userData.homeLocation = new LLVector3((float)Convert.ToDecimal((string)data["home_coordinates_x"]), (float)Convert.ToDecimal((string)data["home_coordinates_y"]), (float)Convert.ToDecimal((string)data["home_coordinates_z"])); + userData.homeLookAt = new LLVector3((float)Convert.ToDecimal((string)data["home_look_x"]), (float)Convert.ToDecimal((string)data["home_look_y"]), (float)Convert.ToDecimal((string)data["home_look_z"])); + + return userData; + } + public UserProfileData GetUserProfile(string firstName, string lastName) + { + return GetUserProfile(firstName + " " + lastName); + } + public UserProfileData GetUserProfile(string name) + { + + //try + //{ + Hashtable param = new Hashtable(); + param["avatar_name"] = name; + IList parameters = new ArrayList(); + parameters.Add(param); + XmlRpcRequest req = new XmlRpcRequest("get_user_by_name", parameters); + XmlRpcResponse resp = req.Send(m_parent.ServersInfo.UserURL, 3000); + Hashtable respData = (Hashtable)resp.Value; + + return ConvertXMLRPCDataToUserProfile(respData); + //} + //catch (Exception e) + //{ + // Console.WriteLine("Error when trying to fetch profile data by name from remote user server: " + e.Message); + //} + //return null; + } + public UserProfileData GetUserProfile(LLUUID avatarID) + { + try + { + + Hashtable param = new Hashtable(); + param["avatar_uuid"] = avatarID.ToString(); + IList parameters = new ArrayList(); + parameters.Add(param); + XmlRpcRequest req = new XmlRpcRequest("get_user_by_uuid", parameters); + XmlRpcResponse resp = req.Send(m_parent.ServersInfo.UserURL, 3000); + Hashtable respData = (Hashtable)resp.Value; + + return ConvertXMLRPCDataToUserProfile(respData); + } + catch (Exception e) + { + Console.WriteLine("Error when trying to fetch profile data by uuid from remote user server: " + e.Message); + } + return null; + } + + public UserProfileData SetupMasterUser(string firstName, string lastName) + { + return SetupMasterUser(firstName, lastName, ""); + } + + public UserProfileData SetupMasterUser(string firstName, string lastName, string password) + { + UserProfileData profile = GetUserProfile(firstName, lastName); + if (profile == null) + { + Console.WriteLine("Unknown Master User. Grid Mode: No clue what I should do. Probably would choose the grid owner UUID when that is implemented"); + } + return null; + } + } +} diff --git a/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj b/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj new file mode 100644 index 0000000000..10df8c236b --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj @@ -0,0 +1,142 @@ + + + Local + 8.0.50727 + 2.0 + {4806E378-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Communications.OGS1 + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Communications.OGS1 + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Runtime.Remoting.dll + False + + + System.Xml.dll + False + + + ..\..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Communications + {CB52B7E7-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Data + {36B72A9B-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj.user b/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..41f811a1aa --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenGrid.Framework.Communications.OGS1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenGrid.Framework.Communications.OGS1")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a8b2b39b-c83b-41e2-b0b5-7ccfc1fddae7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Region/Communications/OGS1/obj/Debug/OpenSim.Region.Communications.OGS1.dll b/OpenSim/Region/Communications/OGS1/obj/Debug/OpenSim.Region.Communications.OGS1.dll new file mode 100644 index 0000000000000000000000000000000000000000..dbc5a324fb7e8ebd16baaade2551c3cdc750d363 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Communications/OGS1/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Region/Communications/OGS1/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..df5728806b5f6fd75bb2fbdadcfe07ecb331b31c GIT binary patch literal 26628 zcmeI4d303O9mnT4yiD>gfg$d=2A3+^u!|ylAb=7?0!Se`z9cVUU^0UR$sdQ^%xszX?A5**1&E-?s z%#4YN@%V2{ZCz)&(3x{*WZcd|&Pk7{UE0~4PPJU-ZeE^U?`CE+kDt^wrEO~4gbA%v z#ygXo3Vh56-_jF}oAU*?qp{!=Tv*v{skE!LL8lj!5_Q>h+HEOt4f2VFPJV5{X->PS zuRVx`1#wu@N;Xi7vrcQh(^AOhDof3&s>^n4aB^;L7z(Y+wz^Am*{)Qpo2$Zw#?%(q z;uhs&E1h(wn~y{W4T@A$46gF~tVQLr&h@GDqCVxnf5k2wTD8{6CL@(pgLG1ZZ%&p93L z#%ykVqS4KD@fhkXRVX=;X!8E|FWF|ZQ#~7wz-(2+;$=(gbTO#q)y=e|+Upr*hmr4dQebgq}fzBk}Zu)w?+T4367p zLY&2d&}llooWB-HBOvhQA@rw_eh!k(g*XrC=xUul{hs~0{Er~%e25E>j#1F*uMAn; za0h?>NF#rckWPQ^fYKA&_NmP}SZ!F|enf5_+W@)lq=C+k4c!NE( zz`l@0Y$}U+#_ZR#D2-2C+`mOB)0s|Jg1!jW8GLiBqi&0R5ofb6hL{F%35y!Qj6mR5 zGd`Uou^B9u_MMDMbFpkdKUY=V0DL`k12D@BpaC;En>`C+HpCo=xh!h%l|!If7P=L6 z9Er_i@!@nmzPQKI_47HqT@SGUVj+tf%mWC7ufDGIB96o^Wig|;qzts5F^%Zj!o3(k zKVQb#?8OibENU~<5xRS;LRsKL^LK$x?2#giO~UBkkc6z$rW4VXA}^3=q{iIc`(cw|={ zq!5+?{ZS4+s+mPYpFT>!B{Dy!UwZ+KB9@qA>8KXYZnr|X5N#}Kuwo$)7Aal(c8 zviM(hR3(-|-43ix1DF+3oXuXxq6X_Jf`tX{2n!)R;)*0ZI+gTxTJfH!-gH$bOS`f~ znYOH*#C~S3lXt66jQCw=GcWTvzHKJB#UHV!wss2U}_4R?9b6a+ zAS7N7@a3umS6rM|SfS=m-nIDs2-6Km*PG?H%Q z2zsU1MtEep+Ngt~S!K0btFz1M4O*R3R&Uhm+_HL;R_j>mCU4_NZ|1i1HQmgcIdT-t z-NNRyiK`1ttZr5|mK09l3U{&QHLa7Co~F%b1KqUSv?ZK3t?tk&+&Hc7)G8c0t=_Ix zIC8ozcW@+Dbmo-3ixu67J2`Upp~kA`Zi2m=?I>NUu+`1VdZYI1WbIQ%?cu`d3Vo6z ziWZmEJz9lZr&IT874Dp_?mmvx_JzfC>6Cppo9Tw!!;$HSYRHkw(d>PSOCU!!@fxFv zN!Gjpx|)@q0b0sgbt4|&h$1+9TK%+E;r40uGg^fMsMQCx3dc{kct1zH0eXlP-L8i@ z(w_l(gzacWslrw_E6Ym?Cvcq_W$l+4wO`2wxOE`a8J)l*%fm(fBt8o8xbwA6I znm!$?>?ioTuKDLUGPeICf_eE#&O(>UMl3QKu~0T*fzb%~fV!H`a6}QjL9ITkRrrNk zJ*ZW9h+2J4t4Wr+P0w@0XNoJ`l~VQ#oUYsU1&$oW6en(L*)MWdnkm~j!)W7l*~UwZ zHaeVD*YhQgoYbf9wQH&DuW+KS!K$RrdE-1?9^AK1&)Q@T6Ly zC_0NZZ(%x<6)a4ghaFKkcp)_UR(>#dML*^Njukgw%6^ZPA~HYW7@f)(l=mbwTqt}8 zn>7!alUeCO2AhBonE)g6OCDfV+OMzbNGtnS9yad-o8tv3bevEW)ktiH8Q64%*pzR& z1aqeOJr8i%otc+&Hu6tT%Kn3g&L4qJwV;It3q_HV=-3jSIBpyuL}?34?Ez`MM_8EE z!bvH>lhWUKfQ9q(cUFrl**`c&6#^x)graDWu`dH&P1T|4M7WiT_}pa zCee9Cq7&c6=paOCH_Ni~qc4?&g;OUXT>++RD&r%ZpNl-ME(TXG36$u|LQ(W3$<-Gn zR~F7Dh0p{TnwiXo=lsm_keLl+UJ#Vf^FmSdoJ8iJfy~|znP59V^O+69`KkA?SpaN4 zFG!)Mg`(&wiOrJ|n>Y?IB18%253z!ASw^sMs4$$20z4Tl<{=j=ScAva5^(jnK#2|r zMbTrDt4AeQ7LJ~V&;%HoMrOnB{Oxj&o)w_y5djQ6EEGi#NqY7h^x&j&NKb(2SX&xI`(Bt99V&69Of=ODKwVORnyeTv>RYC4?rx z&}5knZ&Sa)L*`l_vr|w)JA|U>Hi^uw1~Pc&DMTi~$aFCq#-@Iwhs`EnbBiE_ZWfB7 z?Gl@95}WuFj15AR@I;&Mrv4dD2+0aCS=TW>VgJ})`R-q`mUUGGvh zU7=?czuACaHW0@H>j+W8ljqVzUuI#w$|7Vjz%1@z!i2Z9*F$d~&}$X6QHxL%HB0my ziJpa*4usGI7@B*Tjo#kUeI7aYgPf}bEYu_vMQbEEs||ASeu|Ks0F$$y+3>ujhdg8+ z1~MxJCA2~)ik3@c8VzLd4wDd>03-7#kSV`E>oE_R13>0-K?yApilPRI%wma5{0&A1 zAxd}~jr4oUu95XNCxlc5n5rikAK~{r<#F{ixLPPsq6I=xR4=)jFS)YtBBBtQ07G+- z+3;4c=R9Pd2QqU6B{W+o{7OWL%uI<)94{NfE2pAQZ)sXNeDb>=C%kkBQxe|LDnlGE znK4cAvKe1fyja9E#S2D!P4OZLZF*oo$!#B zZ=LW^j%kXAb9_zlAckp*2Qqw3aqwQ7dR>hJ_`aq%OKp~lGu6JPI74fi&OVeW&P|%8 zI6vuIDvrXLrZ^JkYl?GE2vNehCzzBj=&KNM9B@I15)Qb)1i=_%9AH3*5)Lrz;Hm{d(uOs;;WgZ~THmUm+S literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Communications/OGS1/obj/OpenSim.Region.Communications.OGS1.csproj.FileList.txt b/OpenSim/Region/Communications/OGS1/obj/OpenSim.Region.Communications.OGS1.csproj.FileList.txt new file mode 100644 index 0000000000..e537991382 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/obj/OpenSim.Region.Communications.OGS1.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Region.Communications.OGS1.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Communications.OGS1.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Communications.OGS1.dll +obj\Debug\OpenSim.Region.Communications.OGS1.pdb +..\..\..\..\bin\OpenSim.Region.Communications.OGS1.pdb diff --git a/OpenSim/Region/Communications/OGS1/obj/Release/OpenSim.Region.Communications.OGS1.dll b/OpenSim/Region/Communications/OGS1/obj/Release/OpenSim.Region.Communications.OGS1.dll new file mode 100644 index 0000000000000000000000000000000000000000..5c89a1970ff2f823583f39cbca3909dc97a42391 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Environment/EstateManager.cs b/OpenSim/Region/Environment/EstateManager.cs new file mode 100644 index 0000000000..b5a74ad9d2 --- /dev/null +++ b/OpenSim/Region/Environment/EstateManager.cs @@ -0,0 +1,300 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Region.Environment.Scenes; +using Avatar = OpenSim.Region.Environment.Scenes.ScenePresence; + + +namespace OpenSim.Region.Environment +{ + + /// + /// Processes requests regarding estates. Refer to EstateSettings.cs in OpenSim.Framework. Types for all of the core settings + /// + public class EstateManager + { + private Scene m_world; + private RegionInfo m_regInfo; + + public EstateManager(Scene world,RegionInfo reginfo) + { + m_world = world; //Estate settings found at world.m_regInfo.estateSettings + m_regInfo = reginfo; + } + + private bool convertParamStringToBool(byte[] field) + { + string s = Helpers.FieldToUTF8String(field); + if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true") + { + return true; + } + return false; + } + + public void handleEstateOwnerMessage(EstateOwnerMessagePacket packet, IClientAPI remote_client) + { + if (remote_client.AgentId == m_regInfo.MasterAvatarAssignedUUID) + { + switch (Helpers.FieldToUTF8String(packet.MethodData.Method)) + { + case "getinfo": + Console.WriteLine("GETINFO Requested"); + this.sendRegionInfoPacketToAll(); + + break; + case "setregioninfo": + if (packet.ParamList.Length != 9) + { + MainLog.Instance.Error("EstateOwnerMessage: SetRegionInfo method has a ParamList of invalid length"); + } + else + { + m_regInfo.estateSettings.regionFlags = Simulator.RegionFlags.None; + + if (convertParamStringToBool(packet.ParamList[0].Parameter)) + { + m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.BlockTerraform; + } + + if (convertParamStringToBool(packet.ParamList[1].Parameter)) + { + m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.NoFly; + } + + if (convertParamStringToBool(packet.ParamList[2].Parameter)) + { + m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.AllowDamage; + } + + if (convertParamStringToBool(packet.ParamList[3].Parameter) == false) + { + m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.BlockLandResell; + } + + + int tempMaxAgents = Convert.ToInt16(Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[4].Parameter))); + m_regInfo.estateSettings.maxAgents = (byte)tempMaxAgents; + + float tempObjectBonusFactor = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[5].Parameter)); + m_regInfo.estateSettings.objectBonusFactor = tempObjectBonusFactor; + + int tempMatureLevel = Convert.ToInt16(Helpers.FieldToUTF8String(packet.ParamList[6].Parameter)); + m_regInfo.estateSettings.simAccess = (Simulator.SimAccess)tempMatureLevel; + + + if (convertParamStringToBool(packet.ParamList[7].Parameter)) + { + m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.RestrictPushObject; + } + + if (convertParamStringToBool(packet.ParamList[8].Parameter)) + { + m_regInfo.estateSettings.regionFlags = m_regInfo.estateSettings.regionFlags | Simulator.RegionFlags.AllowParcelChanges; + } + + sendRegionInfoPacketToAll(); + + } + break; + case "texturebase": + foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList) + { + string s = Helpers.FieldToUTF8String(block.Parameter); + string[] splitField = s.Split(' '); + if (splitField.Length == 2) + { + LLUUID tempUUID = new LLUUID(splitField[1]); + switch (Convert.ToInt16(splitField[0])) + { + case 0: + m_regInfo.estateSettings.terrainBase0 = tempUUID; + break; + case 1: + m_regInfo.estateSettings.terrainBase1 = tempUUID; + break; + case 2: + m_regInfo.estateSettings.terrainBase2 = tempUUID; + break; + case 3: + m_regInfo.estateSettings.terrainBase3 = tempUUID; + break; + } + } + } + break; + case "texturedetail": + foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList) + { + + string s = Helpers.FieldToUTF8String(block.Parameter); + string[] splitField = s.Split(' '); + if (splitField.Length == 2) + { + LLUUID tempUUID = new LLUUID(splitField[1]); + switch (Convert.ToInt16(splitField[0])) + { + case 0: + m_regInfo.estateSettings.terrainDetail0 = tempUUID; + break; + case 1: + m_regInfo.estateSettings.terrainDetail1 = tempUUID; + break; + case 2: + m_regInfo.estateSettings.terrainDetail2 = tempUUID; + break; + case 3: + m_regInfo.estateSettings.terrainDetail3 = tempUUID; + break; + } + } + } + break; + case "textureheights": + foreach (EstateOwnerMessagePacket.ParamListBlock block in packet.ParamList) + { + + string s = Helpers.FieldToUTF8String(block.Parameter); + string[] splitField = s.Split(' '); + if (splitField.Length == 3) + { + + float tempHeightLow = (float)Convert.ToDecimal(splitField[1]); + float tempHeightHigh = (float)Convert.ToDecimal(splitField[2]); + + switch (Convert.ToInt16(splitField[0])) + { + case 0: + m_regInfo.estateSettings.terrainStartHeight0 = tempHeightLow; + m_regInfo.estateSettings.terrainHeightRange0 = tempHeightHigh; + break; + case 1: + m_regInfo.estateSettings.terrainStartHeight1 = tempHeightLow; + m_regInfo.estateSettings.terrainHeightRange1 = tempHeightHigh; + break; + case 2: + m_regInfo.estateSettings.terrainStartHeight2 = tempHeightLow; + m_regInfo.estateSettings.terrainHeightRange2 = tempHeightHigh; + break; + case 3: + m_regInfo.estateSettings.terrainStartHeight3 = tempHeightLow; + m_regInfo.estateSettings.terrainHeightRange3 = tempHeightHigh; + break; + } + } + } + break; + case "texturecommit": + sendRegionHandshakeToAll(); + break; + case "setregionterrain": + if (packet.ParamList.Length != 9) + { + MainLog.Instance.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length"); + } + else + { + m_regInfo.estateSettings.waterHeight = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[0].Parameter)); + m_regInfo.estateSettings.terrainRaiseLimit = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[1].Parameter)); + m_regInfo.estateSettings.terrainLowerLimit = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[2].Parameter)); + m_regInfo.estateSettings.useFixedSun = this.convertParamStringToBool(packet.ParamList[4].Parameter); + m_regInfo.estateSettings.sunHour = (float)Convert.ToDecimal(Helpers.FieldToUTF8String(packet.ParamList[5].Parameter)); + + sendRegionInfoPacketToAll(); + } + break; + default: + MainLog.Instance.Error("EstateOwnerMessage: Unknown method requested\n" + packet.ToString()); + break; + } + } + } + + public void sendRegionInfoPacketToAll() + { + List avatars = m_world.RequestAvatarList(); + + for (int i = 0; i < avatars.Count; i++) + { + this.sendRegionInfoPacket(avatars[i].ControllingClient); + } + } + + public void sendRegionHandshakeToAll() + { + List avatars = m_world.RequestAvatarList(); + + for (int i = 0; i < avatars.Count; i++) + { + this.sendRegionHandshake(avatars[i].ControllingClient); + } + } + + public void sendRegionInfoPacket(IClientAPI remote_client) + { + Encoding _enc = Encoding.ASCII; + + AgentCircuitData circuitData = remote_client.RequestClientInfo(); + + RegionInfoPacket regionInfoPacket = new RegionInfoPacket(); + regionInfoPacket.AgentData.AgentID = circuitData.AgentID; + regionInfoPacket.AgentData.SessionID = circuitData.SessionID; + regionInfoPacket.RegionInfo.BillableFactor = m_regInfo.estateSettings.billableFactor; + regionInfoPacket.RegionInfo.EstateID = m_regInfo.estateSettings.estateID; + regionInfoPacket.RegionInfo.MaxAgents = m_regInfo.estateSettings.maxAgents; + regionInfoPacket.RegionInfo.ObjectBonusFactor = m_regInfo.estateSettings.objectBonusFactor; + regionInfoPacket.RegionInfo.ParentEstateID = m_regInfo.estateSettings.parentEstateID; + regionInfoPacket.RegionInfo.PricePerMeter = m_regInfo.estateSettings.pricePerMeter; + regionInfoPacket.RegionInfo.RedirectGridX = m_regInfo.estateSettings.redirectGridX; + regionInfoPacket.RegionInfo.RedirectGridY = m_regInfo.estateSettings.redirectGridY; + regionInfoPacket.RegionInfo.RegionFlags = (uint)m_regInfo.estateSettings.regionFlags; + regionInfoPacket.RegionInfo.SimAccess = (byte)m_regInfo.estateSettings.simAccess; + regionInfoPacket.RegionInfo.SimName = _enc.GetBytes( m_regInfo.RegionName); + regionInfoPacket.RegionInfo.SunHour = m_regInfo.estateSettings.sunHour; + regionInfoPacket.RegionInfo.TerrainLowerLimit = m_regInfo.estateSettings.terrainLowerLimit; + regionInfoPacket.RegionInfo.TerrainRaiseLimit = m_regInfo.estateSettings.terrainRaiseLimit; + regionInfoPacket.RegionInfo.UseEstateSun = !m_regInfo.estateSettings.useFixedSun; + regionInfoPacket.RegionInfo.WaterHeight = m_regInfo.estateSettings.waterHeight; + + remote_client.OutPacket(regionInfoPacket); + } + + public void sendRegionHandshake(IClientAPI remoteClient) + { + remoteClient.SendRegionHandshake(m_regInfo); + } + + } +} diff --git a/OpenSim/Region/Environment/OpenSim.Region.Environment.csproj b/OpenSim/Region/Environment/OpenSim.Region.Environment.csproj new file mode 100644 index 0000000000..361d7fead4 --- /dev/null +++ b/OpenSim/Region/Environment/OpenSim.Region.Environment.csproj @@ -0,0 +1,285 @@ + + + Local + 8.0.50727 + 2.0 + {DCBA491C-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Environment + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Environment + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\Axiom.MathLib.dll + False + + + ..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\bin\libsecondlife.dll + False + + + Microsoft.JScript.dll + False + + + OpenSim.Framework.GenericConfig.Xml.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + ..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Communications + {CB52B7E7-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Caches + {61FCCDB3-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Capabilities + {39038E85-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Physics.Manager + {F4FF31EB-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Terrain.BasicTerrain + {C9E0F891-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Environment/OpenSim.Region.Environment.csproj.user b/OpenSim/Region/Environment/OpenSim.Region.Environment.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Environment/OpenSim.Region.Environment.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Environment/ParcelManager.cs b/OpenSim/Region/Environment/ParcelManager.cs new file mode 100644 index 0000000000..2059b3f437 --- /dev/null +++ b/OpenSim/Region/Environment/ParcelManager.cs @@ -0,0 +1,891 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Region.Environment.Scenes; +using Avatar = OpenSim.Region.Environment.Scenes.ScenePresence; + +namespace OpenSim.Region.Environment +{ + + + #region ParcelManager Class + /// + /// Handles Parcel objects and operations requiring information from other Parcel objects (divide, join, etc) + /// + public class ParcelManager : ILocalStorageParcelReceiver + { + + #region Constants + //Parcel types set with flags in ParcelOverlay. + //Only one of these can be used. + public const byte PARCEL_TYPE_PUBLIC = (byte)0; //Equals 00000000 + public const byte PARCEL_TYPE_OWNED_BY_OTHER = (byte)1; //Equals 00000001 + public const byte PARCEL_TYPE_OWNED_BY_GROUP = (byte)2; //Equals 00000010 + public const byte PARCEL_TYPE_OWNED_BY_REQUESTER = (byte)3; //Equals 00000011 + public const byte PARCEL_TYPE_IS_FOR_SALE = (byte)4; //Equals 00000100 + public const byte PARCEL_TYPE_IS_BEING_AUCTIONED = (byte)5; //Equals 00000101 + + + //Flags that when set, a border on the given side will be placed + //NOTE: North and East is assumable by the west and south sides (if parcel to east has a west border, then I have an east border; etc) + //This took forever to figure out -- jeesh. /blame LL for even having to send these + public const byte PARCEL_FLAG_PROPERTY_BORDER_WEST = (byte)64; //Equals 01000000 + public const byte PARCEL_FLAG_PROPERTY_BORDER_SOUTH = (byte)128; //Equals 10000000 + + //RequestResults (I think these are right, they seem to work): + public const int PARCEL_RESULT_ONE_PARCEL = 0; // The request they made contained only one parcel + public const int PARCEL_RESULT_MULTIPLE_PARCELS = 1; // The request they made contained more than one parcel + + //These are other constants. Yay! + public const int START_PARCEL_LOCAL_ID = 1; + #endregion + + #region Member Variables + public Dictionary parcelList = new Dictionary(); + private int lastParcelLocalID = START_PARCEL_LOCAL_ID - 1; + private int[,] parcelIDList = new int[64, 64]; + + private Scene m_world; + private RegionInfo m_regInfo; + + #endregion + + #region Constructors + public ParcelManager(Scene world, RegionInfo reginfo) + { + + m_world = world; + m_regInfo = reginfo; + parcelIDList.Initialize(); + + } + #endregion + + #region Member Functions + + #region Parcel From Storage Functions + public void ParcelFromStorage(ParcelData data) + { + Parcel new_parcel = new Parcel(data.ownerID, data.isGroupOwned, m_world); + new_parcel.parcelData = data.Copy(); + new_parcel.setParcelBitmapFromByteArray(); + addParcel(new_parcel); + + } + + public void NoParcelDataFromStorage() + { + resetSimParcels(); + } + #endregion + + #region Parcel Add/Remove/Get/Create + /// + /// Creates a basic Parcel object without an owner (a zeroed key) + /// + /// + public Parcel createBaseParcel() + { + return new Parcel(new LLUUID(), false, m_world); + } + + /// + /// Adds a parcel to the stored list and adds them to the parcelIDList to what they own + /// + /// The parcel being added + public void addParcel(Parcel new_parcel) + { + lastParcelLocalID++; + new_parcel.parcelData.localID = lastParcelLocalID; + parcelList.Add(lastParcelLocalID, new_parcel.Copy()); + + + bool[,] parcelBitmap = new_parcel.getParcelBitmap(); + int x, y; + for (x = 0; x < 64; x++) + { + for (y = 0; y < 64; y++) + { + if (parcelBitmap[x, y]) + { + parcelIDList[x, y] = lastParcelLocalID; + } + } + } + parcelList[lastParcelLocalID].forceUpdateParcelInfo(); + + + } + /// + /// Removes a parcel from the list. Will not remove if local_id is still owning an area in parcelIDList + /// + /// Parcel.localID of the parcel to remove. + public void removeParcel(int local_id) + { + int x, y; + for (x = 0; x < 64; x++) + { + for (y = 0; y < 64; y++) + { + if (parcelIDList[x, y] == local_id) + { + throw new Exception("Could not remove parcel. Still being used at " + x + ", " + y); + } + } + } + m_world.localStorage.RemoveParcel(parcelList[local_id].parcelData); + parcelList.Remove(local_id); + } + + private void performFinalParcelJoin(Parcel master, Parcel slave) + { + int x, y; + bool[,] parcelBitmapSlave = slave.getParcelBitmap(); + for (x = 0; x < 64; x++) + { + for (y = 0; y < 64; y++) + { + if (parcelBitmapSlave[x, y]) + { + parcelIDList[x, y] = master.parcelData.localID; + } + } + } + removeParcel(slave.parcelData.localID); + } + /// + /// Get the parcel at the specified point + /// + /// Value between 0 - 256 on the x axis of the point + /// Value between 0 - 256 on the y axis of the point + /// Parcel at the point supplied + public Parcel getParcel(int x, int y) + { + if (x > 256 || y > 256 || x < 0 || y < 0) + { + throw new Exception("Error: Parcel not found at point " + x + ", " + y); + } + else + { + return parcelList[parcelIDList[x / 4, y / 4]]; + } + + } + #endregion + + #region Parcel Modification + /// + /// Subdivides a parcel + /// + /// West Point + /// South Point + /// East Point + /// North Point + /// LLUUID of user who is trying to subdivide + /// Returns true if successful + private bool subdivide(int start_x, int start_y, int end_x, int end_y, LLUUID attempting_user_id) + { + //First, lets loop through the points and make sure they are all in the same parcel + //Get the parcel at start + Parcel startParcel = getParcel(start_x, start_y); + if (startParcel == null) return false; //No such parcel at the beginning + + //Loop through the points + try + { + int totalX = end_x - start_x; + int totalY = end_y - start_y; + int x, y; + for (y = 0; y < totalY; y++) + { + for (x = 0; x < totalX; x++) + { + Parcel tempParcel = getParcel(start_x + x, start_y + y); + if (tempParcel == null) return false; //No such parcel at that point + if (tempParcel != startParcel) return false; //Subdividing over 2 parcels; no-no + } + } + } + catch (Exception) + { + return false; //Exception. For now, lets skip subdivision + } + + //If we are still here, then they are subdividing within one parcel + //Check owner + if (startParcel.parcelData.ownerID != attempting_user_id) + { + return false; //They cant do this! + } + + //Lets create a new parcel with bitmap activated at that point (keeping the old parcels info) + Parcel newParcel = startParcel.Copy(); + newParcel.parcelData.parcelName = "Subdivision of " + newParcel.parcelData.parcelName; + newParcel.parcelData.globalID = LLUUID.Random(); + + newParcel.setParcelBitmap(Parcel.getSquareParcelBitmap(start_x, start_y, end_x, end_y)); + + //Now, lets set the subdivision area of the original to false + int startParcelIndex = startParcel.parcelData.localID; + parcelList[startParcelIndex].setParcelBitmap(Parcel.modifyParcelBitmapSquare(startParcel.getParcelBitmap(), start_x, start_y, end_x, end_y, false)); + parcelList[startParcelIndex].forceUpdateParcelInfo(); + + + //Now add the new parcel + addParcel(newParcel); + + + + + + return true; + } + /// + /// Join 2 parcels together + /// + /// x value in first parcel + /// y value in first parcel + /// x value in second parcel + /// y value in second parcel + /// LLUUID of the avatar trying to join the parcels + /// Returns true if successful + private bool join(int start_x, int start_y, int end_x, int end_y, LLUUID attempting_user_id) + { + end_x -= 4; + end_y -= 4; + + //NOTE: The following only connects the parcels in each corner and not all the parcels that are within the selection box! + //This should be fixed later -- somewhat "incomplete code" --Ming + Parcel startParcel, endParcel; + + try + { + startParcel = getParcel(start_x, start_y); + endParcel = getParcel(end_x, end_y); + } + catch (Exception) + { + return false; //Error occured when trying to get the start and end parcels + } + if (startParcel == endParcel) + { + return false; //Subdivision of the same parcel is not allowed + } + + //Check the parcel owners: + if (startParcel.parcelData.ownerID != endParcel.parcelData.ownerID) + { + return false; + } + if (startParcel.parcelData.ownerID != attempting_user_id) + { + //TODO: Group editing stuff. Avatar owner support for now + return false; + } + + //Same owners! Lets join them + //Merge them to startParcel + parcelList[startParcel.parcelData.localID].setParcelBitmap(Parcel.mergeParcelBitmaps(startParcel.getParcelBitmap(), endParcel.getParcelBitmap())); + performFinalParcelJoin(startParcel, endParcel); + + return true; + + + + } + #endregion + + #region Parcel Updating + /// + /// Where we send the ParcelOverlay packet to the client + /// + /// The object representing the client + public void sendParcelOverlay(IClientAPI remote_client) + { + const int PARCEL_BLOCKS_PER_PACKET = 1024; + int x, y = 0; + byte[] byteArray = new byte[PARCEL_BLOCKS_PER_PACKET]; + int byteArrayCount = 0; + int sequenceID = 0; + ParcelOverlayPacket packet; + + for (y = 0; y < 64; y++) + { + for (x = 0; x < 64; x++) + { + byte tempByte = (byte)0; //This represents the byte for the current 4x4 + Parcel currentParcelBlock = getParcel(x * 4, y * 4); + + if (currentParcelBlock.parcelData.ownerID == remote_client.AgentId) + { + //Owner Flag + tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_OWNED_BY_REQUESTER); + } + else if (currentParcelBlock.parcelData.salePrice > 0 && (currentParcelBlock.parcelData.authBuyerID == LLUUID.Zero || currentParcelBlock.parcelData.authBuyerID == remote_client.AgentId)) + { + //Sale Flag + tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_IS_FOR_SALE); + } + else if (currentParcelBlock.parcelData.ownerID == LLUUID.Zero) + { + //Public Flag + tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_PUBLIC); + } + else + { + //Other Flag + tempByte = Convert.ToByte(tempByte | PARCEL_TYPE_OWNED_BY_OTHER); + } + + + //Now for border control + if (x == 0) + { + tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_WEST); + } + else if (getParcel((x - 1) * 4, y * 4) != currentParcelBlock) + { + tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_WEST); + } + + if (y == 0) + { + tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_SOUTH); + } + else if (getParcel(x * 4, (y - 1) * 4) != currentParcelBlock) + { + tempByte = Convert.ToByte(tempByte | PARCEL_FLAG_PROPERTY_BORDER_SOUTH); + } + + byteArray[byteArrayCount] = tempByte; + byteArrayCount++; + if (byteArrayCount >= PARCEL_BLOCKS_PER_PACKET) + { + byteArrayCount = 0; + packet = new ParcelOverlayPacket(); + packet.ParcelData.Data = byteArray; + packet.ParcelData.SequenceID = sequenceID; + remote_client.OutPacket((Packet)packet); + sequenceID++; + byteArray = new byte[PARCEL_BLOCKS_PER_PACKET]; + } + } + } + + packet = new ParcelOverlayPacket(); + packet.ParcelData.Data = byteArray; + packet.ParcelData.SequenceID = sequenceID; //Eh? + remote_client.OutPacket((Packet)packet); + } + + public void handleParcelPropertiesRequest(int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client) + { + //Get the parcels within the bounds + List temp = new List(); + int x, y, i; + int inc_x = end_x - start_x; + int inc_y = end_y - start_y; + for (x = 0; x < inc_x; x++) + { + for (y = 0; y < inc_y; y++) + { + Parcel currentParcel = getParcel(start_x + x, start_y + y); + if (!temp.Contains(currentParcel)) + { + currentParcel.forceUpdateParcelInfo(); + temp.Add(currentParcel); + } + } + } + + int requestResult = PARCEL_RESULT_ONE_PARCEL; + if (temp.Count > 1) + { + requestResult = PARCEL_RESULT_MULTIPLE_PARCELS; + } + + for (i = 0; i < temp.Count; i++) + { + temp[i].sendParcelProperties(sequence_id, snap_selection, requestResult, remote_client); + } + + + sendParcelOverlay(remote_client); + } + + public void handleParcelPropertiesUpdateRequest(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client) + { + if (parcelList.ContainsKey(packet.ParcelData.LocalID)) + { + parcelList[packet.ParcelData.LocalID].updateParcelProperties(packet, remote_client); + } + } + public void handleParcelDivideRequest(int west, int south, int east, int north, IClientAPI remote_client) + { + subdivide(west, south, east, north, remote_client.AgentId); + } + public void handleParcelJoinRequest(int west, int south, int east, int north, IClientAPI remote_client) + { + join(west, south, east, north, remote_client.AgentId); + + } + #endregion + + /// + /// Resets the sim to the default parcel (full sim parcel owned by the default user) + /// + public void resetSimParcels() + { + //Remove all the parcels in the sim and add a blank, full sim parcel set to public + parcelList.Clear(); + lastParcelLocalID = START_PARCEL_LOCAL_ID - 1; + parcelIDList.Initialize(); + + Parcel fullSimParcel = new Parcel(LLUUID.Zero, false, m_world); + + fullSimParcel.setParcelBitmap(Parcel.getSquareParcelBitmap(0, 0, 256, 256)); + fullSimParcel.parcelData.parcelName = "Your Sim Parcel"; + fullSimParcel.parcelData.parcelDesc = ""; + + fullSimParcel.parcelData.ownerID = m_regInfo.MasterAvatarAssignedUUID; + fullSimParcel.parcelData.salePrice = 1; + fullSimParcel.parcelData.parcelFlags = libsecondlife.Parcel.ParcelFlags.ForSale; + fullSimParcel.parcelData.parcelStatus = libsecondlife.Parcel.ParcelStatus.Leased; + + addParcel(fullSimParcel); + + } + #endregion + } + #endregion + + + #region Parcel Class + /// + /// Keeps track of a specific parcel's information + /// + public class Parcel + { + #region Member Variables + public ParcelData parcelData = new ParcelData(); + public Scene m_world; + + private bool[,] parcelBitmap = new bool[64, 64]; + + #endregion + + + #region Constructors + public Parcel(LLUUID owner_id, bool is_group_owned, Scene world) + { + m_world = world; + parcelData.ownerID = owner_id; + parcelData.isGroupOwned = is_group_owned; + + } + #endregion + + + #region Member Functions + + #region General Functions + /// + /// Checks to see if this parcel contains a point + /// + /// + /// + /// Returns true if the parcel contains the specified point + public bool containsPoint(int x, int y) + { + if (x >= 0 && y >= 0 && x <= 256 && x <= 256) + { + return (parcelBitmap[x / 4, y / 4] == true); + } + else + { + return false; + } + } + + public Parcel Copy() + { + Parcel newParcel = new Parcel(this.parcelData.ownerID, this.parcelData.isGroupOwned, m_world); + + //Place all new variables here! + newParcel.parcelBitmap = (bool[,])(this.parcelBitmap.Clone()); + newParcel.parcelData = parcelData.Copy(); + + return newParcel; + } + + #endregion + + + #region Packet Request Handling + /// + /// Sends parcel properties as requested + /// + /// ID sent by client for them to keep track of + /// Bool sent by client for them to use + /// Object representing the client + public void sendParcelProperties(int sequence_id, bool snap_selection, int request_result, IClientAPI remote_client) + { + + ParcelPropertiesPacket updatePacket = new ParcelPropertiesPacket(); + updatePacket.ParcelData.AABBMax = parcelData.AABBMax; + updatePacket.ParcelData.AABBMin = parcelData.AABBMin; + updatePacket.ParcelData.Area = parcelData.area; + updatePacket.ParcelData.AuctionID = parcelData.auctionID; + updatePacket.ParcelData.AuthBuyerID = parcelData.authBuyerID; //unemplemented + + updatePacket.ParcelData.Bitmap = parcelData.parcelBitmapByteArray; + + updatePacket.ParcelData.Desc = Helpers.StringToField(parcelData.parcelDesc); + updatePacket.ParcelData.Category = (byte)parcelData.category; + updatePacket.ParcelData.ClaimDate = parcelData.claimDate; + updatePacket.ParcelData.ClaimPrice = parcelData.claimPrice; + updatePacket.ParcelData.GroupID = parcelData.groupID; + updatePacket.ParcelData.GroupPrims = parcelData.groupPrims; + updatePacket.ParcelData.IsGroupOwned = parcelData.isGroupOwned; + updatePacket.ParcelData.LandingType = (byte)parcelData.landingType; + updatePacket.ParcelData.LocalID = parcelData.localID; + updatePacket.ParcelData.MaxPrims = 1000; //unemplemented + updatePacket.ParcelData.MediaAutoScale = parcelData.mediaAutoScale; + updatePacket.ParcelData.MediaID = parcelData.mediaID; + updatePacket.ParcelData.MediaURL = Helpers.StringToField(parcelData.mediaURL); + updatePacket.ParcelData.MusicURL = Helpers.StringToField(parcelData.musicURL); + updatePacket.ParcelData.Name = Helpers.StringToField(parcelData.parcelName); + updatePacket.ParcelData.OtherCleanTime = 0; //unemplemented + updatePacket.ParcelData.OtherCount = 0; //unemplemented + updatePacket.ParcelData.OtherPrims = 0; //unemplented + updatePacket.ParcelData.OwnerID = parcelData.ownerID; + updatePacket.ParcelData.OwnerPrims = 0; //unemplemented + updatePacket.ParcelData.ParcelFlags = (uint)parcelData.parcelFlags; //unemplemented + updatePacket.ParcelData.ParcelPrimBonus = (float)1.0; //unemplemented + updatePacket.ParcelData.PassHours = parcelData.passHours; + updatePacket.ParcelData.PassPrice = parcelData.passPrice; + updatePacket.ParcelData.PublicCount = 0; //unemplemented + updatePacket.ParcelData.RegionDenyAnonymous = false; //unemplemented + updatePacket.ParcelData.RegionDenyIdentified = false; //unemplemented + updatePacket.ParcelData.RegionDenyTransacted = false; //unemplemented + updatePacket.ParcelData.RegionPushOverride = true; //unemplemented + updatePacket.ParcelData.RentPrice = 0; //?? + updatePacket.ParcelData.RequestResult = request_result; + updatePacket.ParcelData.SalePrice = parcelData.salePrice; //unemplemented + updatePacket.ParcelData.SelectedPrims = 0; //unemeplemented + updatePacket.ParcelData.SelfCount = 0;//unemplemented + updatePacket.ParcelData.SequenceID = sequence_id; + updatePacket.ParcelData.SimWideMaxPrims = 15000; //unemplemented + updatePacket.ParcelData.SimWideTotalPrims = 0; //unemplemented + updatePacket.ParcelData.SnapSelection = snap_selection; + updatePacket.ParcelData.SnapshotID = parcelData.snapshotID; + updatePacket.ParcelData.Status = (byte)parcelData.parcelStatus; + updatePacket.ParcelData.TotalPrims = 0; //unemplemented + updatePacket.ParcelData.UserLocation = parcelData.userLocation; + updatePacket.ParcelData.UserLookAt = parcelData.userLookAt; + remote_client.OutPacket((Packet)updatePacket); + } + + public void updateParcelProperties(ParcelPropertiesUpdatePacket packet, IClientAPI remote_client) + { + if (remote_client.AgentId == parcelData.ownerID) + { + //Needs later group support + parcelData.authBuyerID = packet.ParcelData.AuthBuyerID; + parcelData.category = (libsecondlife.Parcel.ParcelCategory)packet.ParcelData.Category; + parcelData.parcelDesc = Helpers.FieldToUTF8String(packet.ParcelData.Desc); + parcelData.groupID = packet.ParcelData.GroupID; + parcelData.landingType = packet.ParcelData.LandingType; + parcelData.mediaAutoScale = packet.ParcelData.MediaAutoScale; + parcelData.mediaID = packet.ParcelData.MediaID; + parcelData.mediaURL = Helpers.FieldToUTF8String(packet.ParcelData.MediaURL); + parcelData.musicURL = Helpers.FieldToUTF8String(packet.ParcelData.MusicURL); + parcelData.parcelName = Helpers.FieldToUTF8String(packet.ParcelData.Name); + parcelData.parcelFlags = (libsecondlife.Parcel.ParcelFlags)packet.ParcelData.ParcelFlags; + parcelData.passHours = packet.ParcelData.PassHours; + parcelData.passPrice = packet.ParcelData.PassPrice; + parcelData.salePrice = packet.ParcelData.SalePrice; + parcelData.snapshotID = packet.ParcelData.SnapshotID; + parcelData.userLocation = packet.ParcelData.UserLocation; + parcelData.userLookAt = packet.ParcelData.UserLookAt; + + List avatars = m_world.RequestAvatarList(); + + for (int i = 0; i < avatars.Count; i++) + { + Parcel over = m_world.parcelManager.getParcel((int)Math.Round(avatars[i].Pos.X), (int)Math.Round(avatars[i].Pos.Y)); + if (over == this) + { + sendParcelProperties(0, false, 0, avatars[i].ControllingClient); + } + } + + } + } + #endregion + + + #region Update Functions + /// + /// Updates the AABBMin and AABBMax values after area/shape modification of parcel + /// + private void updateAABBAndAreaValues() + { + int min_x = 64; + int min_y = 64; + int max_x = 0; + int max_y = 0; + int tempArea = 0; + int x, y; + for (x = 0; x < 64; x++) + { + for (y = 0; y < 64; y++) + { + if (parcelBitmap[x, y] == true) + { + if (min_x > x) min_x = x; + if (min_y > y) min_y = y; + if (max_x < x) max_x = x; + if (max_y < y) max_y = y; + tempArea += 16; //16sqm parcel + } + } + } + parcelData.AABBMin = new LLVector3((float)(min_x * 4), (float)(min_y * 4), (float)m_world.Terrain.get((min_x * 4), (min_y * 4))); + parcelData.AABBMax = new LLVector3((float)(max_x * 4), (float)(max_y * 4), (float)m_world.Terrain.get((max_x * 4), (max_y * 4))); + parcelData.area = tempArea; + } + + public void updateParcelBitmapByteArray() + { + parcelData.parcelBitmapByteArray = convertParcelBitmapToBytes(); + } + + /// + /// Update all settings in parcel such as area, bitmap byte array, etc + /// + public void forceUpdateParcelInfo() + { + this.updateAABBAndAreaValues(); + this.updateParcelBitmapByteArray(); + } + + public void setParcelBitmapFromByteArray() + { + parcelBitmap = convertBytesToParcelBitmap(); + } + #endregion + + + #region Parcel Bitmap Functions + /// + /// Sets the parcel's bitmap manually + /// + /// 64x64 block representing where this parcel is on a map + public void setParcelBitmap(bool[,] bitmap) + { + if (bitmap.GetLength(0) != 64 || bitmap.GetLength(1) != 64 || bitmap.Rank != 2) + { + //Throw an exception - The bitmap is not 64x64 + throw new Exception("Error: Invalid Parcel Bitmap"); + } + else + { + //Valid: Lets set it + parcelBitmap = bitmap; + forceUpdateParcelInfo(); + + } + } + /// + /// Gets the parcels bitmap manually + /// + /// + public bool[,] getParcelBitmap() + { + return parcelBitmap; + } + /// + /// Converts the parcel bitmap to a packet friendly byte array + /// + /// + private byte[] convertParcelBitmapToBytes() + { + byte[] tempConvertArr = new byte[512]; + byte tempByte = 0; + int x, y, i, byteNum = 0; + i = 0; + for (y = 0; y < 64; y++) + { + for (x = 0; x < 64; x++) + { + tempByte = Convert.ToByte(tempByte | Convert.ToByte(parcelBitmap[x, y]) << (i++ % 8)); + if (i % 8 == 0) + { + tempConvertArr[byteNum] = tempByte; + tempByte = (byte)0; + i = 0; + byteNum++; + } + } + } + return tempConvertArr; + } + + private bool[,] convertBytesToParcelBitmap() + { + bool[,] tempConvertMap = new bool[64, 64]; + tempConvertMap.Initialize(); + byte tempByte = 0; + int x = 0, y = 0, i = 0, bitNum = 0; + for (i = 0; i < 512; i++) + { + tempByte = parcelData.parcelBitmapByteArray[i]; + for (bitNum = 0; bitNum < 8; bitNum++) + { + bool bit = Convert.ToBoolean(Convert.ToByte(tempByte >> bitNum) & (byte)1); + tempConvertMap[x, y] = bit; + x++; + if (x > 63) + { + x = 0; + y++; + } + + } + + } + return tempConvertMap; + } + /// + /// Full sim parcel creation + /// + /// + public static bool[,] basicFullRegionParcelBitmap() + { + return getSquareParcelBitmap(0, 0, 256, 256); + } + + /// + /// Used to modify the bitmap between the x and y points. Points use 64 scale + /// + /// + /// + /// + /// + /// + public static bool[,] getSquareParcelBitmap(int start_x, int start_y, int end_x, int end_y) + { + + bool[,] tempBitmap = new bool[64, 64]; + tempBitmap.Initialize(); + + tempBitmap = modifyParcelBitmapSquare(tempBitmap, start_x, start_y, end_x, end_y, true); + return tempBitmap; + } + + /// + /// Change a parcel's bitmap at within a square and set those points to a specific value + /// + /// + /// + /// + /// + /// + /// + /// + public static bool[,] modifyParcelBitmapSquare(bool[,] parcel_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value) + { + if (parcel_bitmap.GetLength(0) != 64 || parcel_bitmap.GetLength(1) != 64 || parcel_bitmap.Rank != 2) + { + //Throw an exception - The bitmap is not 64x64 + throw new Exception("Error: Invalid Parcel Bitmap in modifyParcelBitmapSquare()"); + } + + int x, y; + for (y = 0; y < 64; y++) + { + for (x = 0; x < 64; x++) + { + if (x >= start_x / 4 && x < end_x / 4 + && y >= start_y / 4 && y < end_y / 4) + { + parcel_bitmap[x, y] = set_value; + } + } + } + return parcel_bitmap; + } + /// + /// Join the true values of 2 bitmaps together + /// + /// + /// + /// + public static bool[,] mergeParcelBitmaps(bool[,] bitmap_base, bool[,] bitmap_add) + { + if (bitmap_base.GetLength(0) != 64 || bitmap_base.GetLength(1) != 64 || bitmap_base.Rank != 2) + { + //Throw an exception - The bitmap is not 64x64 + throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_base in mergeParcelBitmaps"); + } + if (bitmap_add.GetLength(0) != 64 || bitmap_add.GetLength(1) != 64 || bitmap_add.Rank != 2) + { + //Throw an exception - The bitmap is not 64x64 + throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_add in mergeParcelBitmaps"); + + } + + int x, y; + for (y = 0; y < 64; y++) + { + for (x = 0; x < 64; x++) + { + if (bitmap_add[x, y]) + { + bitmap_base[x, y] = true; + } + } + } + return bitmap_base; + } + #endregion + + #endregion + + + } + #endregion + + +} diff --git a/OpenSim/Region/Environment/RegionManager.cs b/OpenSim/Region/Environment/RegionManager.cs new file mode 100644 index 0000000000..cd67e97839 --- /dev/null +++ b/OpenSim/Region/Environment/RegionManager.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Servers; +using OpenSim.Region.Capabilities; +using OpenSim.Region.Environment.Scenes; + +namespace OpenSim.Region.Environment +{ + public class RegionManager //needs renaming , but first we need to rename the namespace + { + protected AuthenticateSessionsBase authenticateHandler; + protected RegionCommsListener regionCommsHost; + protected CommunicationsManager commsManager; + protected List capsHandlers = new List(); + protected BaseHttpServer httpListener; + + protected Scene m_Scene; + + public ParcelManager parcelManager; + public EstateManager estateManager; + + public RegionManager() + { + + } + + } +} diff --git a/OpenSim/Region/Environment/Scenes/Entity.cs b/OpenSim/Region/Environment/Scenes/Entity.cs new file mode 100644 index 0000000000..084c9abc04 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/Entity.cs @@ -0,0 +1,115 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using libsecondlife; +using OpenSim.Physics.Manager; + +namespace OpenSim.Region.Environment.Scenes +{ + public abstract class Entity :EntityBase //this class (Entity) will be phased out + { + protected PhysicsActor _physActor; + + /// + /// + /// + public override LLVector3 Pos + { + get + { + if (this._physActor != null) + { + m_pos.X = _physActor.Position.X; + m_pos.Y = _physActor.Position.Y; + m_pos.Z = _physActor.Position.Z; + } + + return m_pos; + } + set + { + if (this._physActor != null) + { + try + { + lock (this.m_world.SyncRoot) + { + + this._physActor.Position = new PhysicsVector(value.X, value.Y, value.Z); + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + + m_pos = value; + } + } + + + /// + /// + /// + public override LLVector3 Velocity + { + get + { + if (this._physActor != null) + { + m_velocity.X = _physActor.Velocity.X; + m_velocity.Y = _physActor.Velocity.Y; + m_velocity.Z = _physActor.Velocity.Z; + } + + return m_velocity; + } + set + { + if (this._physActor != null) + { + try + { + lock (this.m_world.SyncRoot) + { + + this._physActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z); + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + + m_velocity = value; + } + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/EntityBase.cs b/OpenSim/Region/Environment/Scenes/EntityBase.cs new file mode 100644 index 0000000000..6360ae10a9 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/EntityBase.cs @@ -0,0 +1,142 @@ +using System.Collections.Generic; +using Axiom.Math; +using libsecondlife; + +namespace OpenSim.Region.Environment.Scenes +{ + public abstract class EntityBase + { + public LLUUID uuid; + + protected List children; + + protected Scene m_world; + protected string m_name; + + /// + /// + /// + public virtual string Name + { + get { return m_name; } + set { m_name = value; } + } + + protected LLVector3 m_pos; + /// + /// + /// + public virtual LLVector3 Pos + { + get + { + return m_pos; + } + set + { + m_pos = value; + } + } + + public LLVector3 m_velocity; + + /// + /// + /// + public virtual LLVector3 Velocity + { + get + { + return m_velocity; + } + set + { + m_velocity = value; + } + } + + protected Quaternion m_rotation = new Quaternion(0,0,1,0); + + public virtual Quaternion rotation + { + get + { + return m_rotation; + } + set + { + m_rotation = value; + } + } + + protected uint m_localId; + + public uint LocalId + { + get { return m_localId; } + set { m_localId = value; } + } + + /// + /// Creates a new Entity (should not occur on it's own) + /// + public EntityBase() + { + uuid = new LLUUID(); + + m_pos = new LLVector3(); + m_velocity = new LLVector3(); + rotation = new Quaternion(); + m_name = "(basic entity)"; + children = new List(); + } + + /// + /// + /// + public virtual void updateMovement() + { + foreach (EntityBase child in children) + { + child.updateMovement(); + } + } + + /// + /// Performs any updates that need to be done at each frame. This function is overridable from it's children. + /// + public virtual void update() + { + // Do any per-frame updates needed that are applicable to every type of entity + foreach (EntityBase child in children) + { + child.update(); + } + } + + /// + /// Called at a set interval to inform entities that they should back themsleves up to the DB + /// + public virtual void BackUp() + { + + } + + /// + /// Copies the entity + /// + /// + public virtual EntityBase Copy() + { + return (EntityBase)this.MemberwiseClone(); + } + + /// + /// Infoms the entity that the land (heightmap) has changed + /// + public virtual void LandRenegerated() + { + + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs b/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs new file mode 100644 index 0000000000..7c3a0339fe --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/IScenePresenceBody.cs @@ -0,0 +1,14 @@ +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; + +namespace OpenSim.Region.Environment.Scenes +{ + public interface IScenePresenceBody + { + void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation); + void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam); + void SendOurAppearance(IClientAPI OurClient); + void SendAppearanceToOtherAgent(ScenePresence avatarInfo); + } +} diff --git a/OpenSim/Region/Environment/Scenes/Primitive.cs b/OpenSim/Region/Environment/Scenes/Primitive.cs new file mode 100644 index 0000000000..05bb1f9dce --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/Primitive.cs @@ -0,0 +1,594 @@ +using System; +using System.Collections.Generic; +using Axiom.Math; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Inventory; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Environment.Scenes +{ + public class Primitive : EntityBase + { + private const uint FULL_MASK_PERMISSIONS = 2147483647; + + private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); + private ulong m_regionHandle; + private byte updateFlag = 0; + private uint m_flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128; + + private Dictionary inventoryItems; + + private string m_description = ""; + + public string SitName = ""; + public string TouchName = ""; + public string Text = ""; + + public LLUUID CreatorID; + public LLUUID OwnerID; + public LLUUID LastOwnerID; + public Int32 CreationDate; + + public uint ParentID = 0; + + public uint OwnerMask = FULL_MASK_PERMISSIONS; + public uint NextOwnerMask = FULL_MASK_PERMISSIONS; + public uint GroupMask = FULL_MASK_PERMISSIONS; + public uint EveryoneMask = FULL_MASK_PERMISSIONS; + public uint BaseMask = FULL_MASK_PERMISSIONS; + + private PrimitiveBaseShape m_Shape; + + public SceneObject m_RootParent; + public bool m_isRootPrim; + public EntityBase m_Parent; + + #region Properties + /// + /// If rootprim, will return world position + /// otherwise will return local offset from rootprim + /// + public override LLVector3 Pos + { + get + { + if (m_isRootPrim) + { + //if we are rootprim then our offset should be zero + return this.m_pos + m_Parent.Pos; + } + else + { + return this.m_pos; + } + } + set + { + if (m_isRootPrim) + { + m_Parent.Pos = value; + } + this.m_pos = value - m_Parent.Pos; + } + + } + + public LLVector3 WorldPos + { + get + { + if (!this.m_isRootPrim) + { + Primitive parentPrim = (Primitive)this.m_Parent; + Axiom.Math.Vector3 offsetPos = new Vector3(this.m_pos.X, this.m_pos.Y, this.m_pos.Z); + offsetPos = parentPrim.rotation * offsetPos; + return parentPrim.WorldPos + new LLVector3(offsetPos.x, offsetPos.y, offsetPos.z); + } + else + { + return this.Pos; + } + } + } + + public string Description + { + get + { + return this.m_description; + } + set + { + this.m_description = value; + } + } + + public LLVector3 Scale + { + set + { + this.m_Shape.Scale = value; + } + get + { + return this.m_Shape.Scale; + } + } + #endregion + + #region Constructors + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID, bool isRoot, EntityBase parent, SceneObject rootObject) + { + m_regionHandle = regionHandle; + m_world = world; + inventoryItems = new Dictionary(); + this.m_Parent = parent; + this.m_isRootPrim = isRoot; + this.m_RootParent = rootObject; + this.CreateFromPacket(addPacket, ownerID, localID); + this.rotation = Axiom.Math.Quaternion.Identity; + } + + /// + /// + /// + /// Empty constructor for duplication + public Primitive() + { + + } + + #endregion + + #region Duplication + + public Primitive Copy(EntityBase parent, SceneObject rootParent) + { + Primitive dupe = (Primitive)this.MemberwiseClone(); + // TODO: Copy this properly. + dupe.inventoryItems = this.inventoryItems; + dupe.m_Parent = parent; + dupe.m_RootParent = rootParent; + // TODO: Copy this properly. + dupe.m_Shape = this.m_Shape; + + uint newLocalID = this.m_world.PrimIDAllocate(); + dupe.LocalId = newLocalID; + + dupe.Scale = new LLVector3(this.Scale.X, this.Scale.Y, this.Scale.Z); + dupe.rotation = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z); + dupe.Pos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z); + + return dupe; + } + + #endregion + + + #region Override from EntityBase + /// + /// + /// + public override void update() + { + if (this.updateFlag == 1) // is a new prim just been created/reloaded or has major changes + { + this.SendFullUpdateToAllClients(); + this.updateFlag = 0; + } + if (this.updateFlag == 2) //some change has been made so update the clients + { + this.SendTerseUpdateToALLClients(); + this.updateFlag = 0; + } + + foreach (EntityBase child in children) + { + child.update(); + } + } + #endregion + + #region Setup + /// + /// + /// + /// + /// + /// + public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID) + { + this.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + this.OwnerID = ownerID; + this.CreatorID = this.OwnerID; + this.LastOwnerID = LLUUID.Zero; + this.Pos = addPacket.ObjectData.RayEnd; + this.uuid = LLUUID.Random(); + this.m_localId = (uint)(localID); + + PrimitiveBaseShape pShape = new PrimitiveBaseShape(); + this.m_Shape = pShape; + + pShape.PCode = addPacket.ObjectData.PCode; + pShape.PathBegin = addPacket.ObjectData.PathBegin; + pShape.PathEnd = addPacket.ObjectData.PathEnd; + pShape.PathScaleX = addPacket.ObjectData.PathScaleX; + pShape.PathScaleY = addPacket.ObjectData.PathScaleY; + pShape.PathShearX = addPacket.ObjectData.PathShearX; + pShape.PathShearY = addPacket.ObjectData.PathShearY; + pShape.PathSkew = addPacket.ObjectData.PathSkew; + pShape.ProfileBegin = addPacket.ObjectData.ProfileBegin; + pShape.ProfileEnd = addPacket.ObjectData.ProfileEnd; + pShape.Scale = addPacket.ObjectData.Scale; + pShape.PathCurve = addPacket.ObjectData.PathCurve; + pShape.ProfileCurve = addPacket.ObjectData.ProfileCurve; + pShape.ProfileHollow = addPacket.ObjectData.ProfileHollow; + pShape.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset; + pShape.PathRevolutions = addPacket.ObjectData.PathRevolutions; + pShape.PathTaperX = addPacket.ObjectData.PathTaperX; + pShape.PathTaperY = addPacket.ObjectData.PathTaperY; + pShape.PathTwist = addPacket.ObjectData.PathTwist; + pShape.PathTwistBegin = addPacket.ObjectData.PathTwistBegin; + + this.updateFlag = 1; + } + #endregion + + #region Linking / unlinking + /// + /// + /// + /// + public void AddNewChildren(SceneObject linkObject) + { + // Console.WriteLine("linking new prims " + linkObject.rootLocalID + " to me (" + this.LocalId + ")"); + //TODO check permissions + this.children.Add(linkObject.rootPrimitive); + linkObject.rootPrimitive.SetNewParent(this, this.m_RootParent); + + this.m_world.DeleteEntity(linkObject.rootUUID); + linkObject.DeleteAllChildren(); + } + + /// + /// + /// + /// + /// + public void SetNewParent(Primitive newParent, SceneObject rootParent) + { + LLVector3 oldPos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z); + this.m_isRootPrim = false; + this.m_Parent = newParent; + this.ParentID = newParent.LocalId; + this.m_RootParent = rootParent; + this.m_RootParent.AddChildToList(this); + this.Pos = oldPos; + Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z); + axPos = this.m_Parent.rotation.Inverse() * axPos; + this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z); + Axiom.Math.Quaternion oldRot = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z); + this.rotation = this.m_Parent.rotation.Inverse() * this.rotation; + this.updateFlag = 1; + + foreach (Primitive child in children) + { + child.SetRootParent(rootParent, newParent, oldPos, oldRot); + } + children.Clear(); + + + } + + /// + /// + /// + /// + public void SetRootParent(SceneObject newRoot , Primitive newParent, LLVector3 oldParentPosition, Axiom.Math.Quaternion oldParentRotation) + { + LLVector3 oldPos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z); + Axiom.Math.Vector3 axOldPos = new Vector3(oldPos.X, oldPos.Y, oldPos.Z); + axOldPos = oldParentRotation * axOldPos; + oldPos = new LLVector3(axOldPos.x, axOldPos.y, axOldPos.z); + oldPos += oldParentPosition; + Axiom.Math.Quaternion oldRot = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z); + this.m_isRootPrim = false; + this.m_Parent = newParent; + this.ParentID = newParent.LocalId; + newParent.AddToChildrenList(this); + this.m_RootParent = newRoot; + this.m_RootParent.AddChildToList(this); + this.Pos = oldPos; + Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z); + axPos = this.m_Parent.rotation.Inverse() * axPos; + this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z); + this.rotation = oldParentRotation * this.rotation; + this.rotation = this.m_Parent.rotation.Inverse()* this.rotation ; + this.updateFlag = 1; + foreach (Primitive child in children) + { + child.SetRootParent(newRoot, newParent, oldPos, oldRot); + } + children.Clear(); + } + + /// + /// + /// + /// + public void AddOffsetToChildren(LLVector3 offset) + { + foreach (Primitive prim in this.children) + { + prim.m_pos += offset; + prim.updateFlag = 2; + } + } + + /// + /// + /// + /// + public void AddToChildrenList(Primitive prim) + { + this.children.Add(prim); + } + #endregion + + #region Resizing/Scale + /// + /// + /// + /// + public void ResizeGoup(LLVector3 scale) + { + LLVector3 offset = (scale - this.m_Shape.Scale); + offset.X /= 2; + offset.Y /= 2; + offset.Z /= 2; + if (this.m_isRootPrim) + { + this.m_Parent.Pos += offset; + } + else + { + this.m_pos += offset; + } + + this.AddOffsetToChildren(new LLVector3(-offset.X, -offset.Y, -offset.Z)); + this.m_Shape.Scale = scale; + + this.updateFlag = 1; + } + #endregion + + #region Position + /// + /// + /// + /// + public void UpdateGroupPosition(LLVector3 pos) + { + LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z); + + this.Pos = newPos; + this.updateFlag = 2; + } + + /// + /// + /// + /// + public void UpdateSinglePosition(LLVector3 pos) + { + // Console.WriteLine("updating single prim position"); + if (this.m_isRootPrim) + { + LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z); + LLVector3 oldPos = new LLVector3(Pos.X, Pos.Y, Pos.Z); + LLVector3 diff = oldPos - newPos; + Axiom.Math.Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z); + axDiff = this.rotation.Inverse() * axDiff; + diff.X = axDiff.x; + diff.Y = axDiff.y; + diff.Z = axDiff.z; + this.Pos = newPos; + + foreach (Primitive prim in this.children) + { + prim.m_pos += diff; + prim.updateFlag = 2; + } + this.updateFlag = 2; + } + else + { + LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z); + this.m_pos = newPos; + this.updateFlag = 2; + } + } + + #endregion + + #region Rotation + /// + /// + /// + /// + public void UpdateGroupRotation(LLQuaternion rot) + { + this.rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z); + this.updateFlag = 2; + + } + + /// + /// + /// + /// + /// + public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot) + { + this.rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z); + this.Pos = pos; + this.updateFlag = 2; + } + + /// + /// + /// + /// + public void UpdateSingleRotation(LLQuaternion rot) + { + //Console.WriteLine("updating single prim rotation"); + Axiom.Math.Quaternion axRot = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z); + Axiom.Math.Quaternion oldParentRot = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z); + this.rotation = axRot; + foreach (Primitive prim in this.children) + { + Axiom.Math.Vector3 axPos = new Vector3(prim.m_pos.X, prim.m_pos.Y, prim.m_pos.Z); + axPos = oldParentRot * axPos; + axPos = axRot.Inverse() * axPos; + prim.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z); + prim.rotation = oldParentRot * prim.rotation ; + prim.rotation = axRot.Inverse()* prim.rotation; + prim.updateFlag = 2; + } + this.updateFlag = 2; + } + #endregion + + #region Shape + /// + /// + /// + /// + public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock) + { + this.m_Shape.PathBegin = shapeBlock.PathBegin; + this.m_Shape.PathEnd = shapeBlock.PathEnd; + this.m_Shape.PathScaleX = shapeBlock.PathScaleX; + this.m_Shape.PathScaleY = shapeBlock.PathScaleY; + this.m_Shape.PathShearX = shapeBlock.PathShearX; + this.m_Shape.PathShearY = shapeBlock.PathShearY; + this.m_Shape.PathSkew = shapeBlock.PathSkew; + this.m_Shape.ProfileBegin = shapeBlock.ProfileBegin; + this.m_Shape.ProfileEnd = shapeBlock.ProfileEnd; + this.m_Shape.PathCurve = shapeBlock.PathCurve; + this.m_Shape.ProfileCurve = shapeBlock.ProfileCurve; + this.m_Shape.ProfileHollow = shapeBlock.ProfileHollow; + this.m_Shape.PathRadiusOffset = shapeBlock.PathRadiusOffset; + this.m_Shape.PathRevolutions = shapeBlock.PathRevolutions; + this.m_Shape.PathTaperX = shapeBlock.PathTaperX; + this.m_Shape.PathTaperY = shapeBlock.PathTaperY; + this.m_Shape.PathTwist = shapeBlock.PathTwist; + this.m_Shape.PathTwistBegin = shapeBlock.PathTwistBegin; + this.updateFlag = 1; + } + #endregion + + #region Client Update Methods + + /// + /// + /// + /// + public void SendFullUpdateForAllChildren(IClientAPI remoteClient) + { + this.SendFullUpdateToClient(remoteClient); + for (int i = 0; i < this.children.Count; i++) + { + if (this.children[i] is Primitive) + { + ((Primitive)this.children[i]).SendFullUpdateForAllChildren(remoteClient); + } + } + } + + /// + /// + /// + /// + public void SendFullUpdateToClient(IClientAPI remoteClient) + { + LLVector3 lPos; + lPos = this.Pos; + LLQuaternion lRot; + lRot = new LLQuaternion(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w); + + remoteClient.SendPrimitiveToClient(this.m_regionHandle, 64096, this.LocalId, this.m_Shape, lPos, lRot, new LLUUID("00000000-0000-0000-9999-000000000005"), this.m_flags, this.uuid, this.OwnerID, this.Text, this.ParentID); + } + + /// + /// + /// + public void SendFullUpdateToAllClients() + { + List avatars = this.m_world.RequestAvatarList(); + for (int i = 0; i < avatars.Count; i++) + { + this.SendFullUpdateToClient(avatars[i].ControllingClient); + } + } + + /// + /// + /// + /// + public void SendTerseUpdateForAllChildren(IClientAPI remoteClient) + { + this.SendTerseUpdateToClient(remoteClient); + for (int i = 0; i < this.children.Count; i++) + { + if (this.children[i] is Primitive) + { + ((Primitive)this.children[i]).SendTerseUpdateForAllChildren(remoteClient); + } + } + } + + /// + /// + /// + /// + public void SendTerseUpdateToClient(IClientAPI RemoteClient) + { + LLVector3 lPos; + Quaternion lRot; + + lPos = this.Pos; + lRot = this.rotation; + + LLQuaternion mRot = new LLQuaternion(lRot.x, lRot.y, lRot.z, lRot.w); + RemoteClient.SendPrimTerseUpdate(this.m_regionHandle, 64096, this.LocalId, lPos, mRot); + } + + /// + /// + /// + public void SendTerseUpdateToALLClients() + { + List avatars = this.m_world.RequestAvatarList(); + for (int i = 0; i < avatars.Count; i++) + { + this.SendTerseUpdateToClient(avatars[i].ControllingClient); + } + } + + #endregion + } +} diff --git a/OpenSim/Region/Environment/Scenes/PrimitiveOld.cs b/OpenSim/Region/Environment/Scenes/PrimitiveOld.cs new file mode 100644 index 0000000000..247ff8789e --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/PrimitiveOld.cs @@ -0,0 +1,583 @@ + +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using Axiom.Math; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Inventory; +using OpenSim.Framework.Types; +using OpenSim.Physics.Manager; + +namespace OpenSim.Region.Environment.Scenes +{ + public class PrimitiveOld : Entity + { + internal PrimData primData; + private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); + // private Dictionary m_clientThreads; + private ulong m_regionHandle; + private const uint FULL_MASK_PERMISSIONS = 2147483647; + private bool physicsEnabled = false; + private byte updateFlag = 0; + private uint flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128; + + private Dictionary inventoryItems; + + #region Properties + + public LLVector3 Scale + { + set + { + this.primData.Scale = value; + //this.dirtyFlag = true; + } + get + { + return this.primData.Scale; + } + } + + public PhysicsActor PhysActor + { + set + { + this._physActor = value; + } + } + + public override LLVector3 Pos + { + get + { + return base.Pos; + } + set + { + base.Pos = value; + } + } + #endregion + + /// + /// + /// + /// + /// + /// + public PrimitiveOld( ulong regionHandle, Scene world) + { + // m_clientThreads = clientThreads; + m_regionHandle = regionHandle; + m_world = world; + inventoryItems = new Dictionary(); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public PrimitiveOld(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID) + { + // m_clientThreads = clientThreads; + m_regionHandle = regionHandle; + m_world = world; + inventoryItems = new Dictionary(); + this.CreateFromPacket(addPacket, ownerID, localID); + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public PrimitiveOld( ulong regionHandle, Scene world, LLUUID owner, LLUUID fullID, uint localID) + { + // m_clientThreads = clientThreads; + m_regionHandle = regionHandle; + m_world = world; + inventoryItems = new Dictionary(); + this.primData = new PrimData(); + this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + this.primData.OwnerID = owner; + this.primData.FullID = this.uuid = fullID; + this.primData.LocalID = m_localId = localID; + } + + /// + /// Constructor to create a default cube + /// + /// + /// + /// + /// + /// + /// + public PrimitiveOld( ulong regionHandle, Scene world, LLUUID owner, uint localID, LLVector3 position) + { + //m_clientThreads = clientThreads; + m_regionHandle = regionHandle; + m_world = world; + inventoryItems = new Dictionary(); + this.primData = PrimData.DefaultCube(); + this.primData.OwnerID = owner; + this.primData.LocalID = m_localId = localID; + this.Pos = this.primData.Position = position; + + this.updateFlag = 1; + } + + /// + /// + /// + /// + public byte[] GetByteArray() + { + byte[] result = null; + List dataArrays = new List(); + dataArrays.Add(primData.ToBytes()); + foreach (Entity child in children) + { + if (child is PrimitiveOld) + { + dataArrays.Add(((PrimitiveOld)child).GetByteArray()); + } + } + byte[] primstart = Helpers.StringToField(""); + byte[] primend = Helpers.StringToField(""); + int totalLength = primstart.Length + primend.Length; + for (int i = 0; i < dataArrays.Count; i++) + { + totalLength += dataArrays[i].Length; + } + + result = new byte[totalLength]; + int arraypos = 0; + Array.Copy(primstart, 0, result, 0, primstart.Length); + arraypos += primstart.Length; + for (int i = 0; i < dataArrays.Count; i++) + { + Array.Copy(dataArrays[i], 0, result, arraypos, dataArrays[i].Length); + arraypos += dataArrays[i].Length; + } + Array.Copy(primend, 0, result, arraypos, primend.Length); + + return result; + } + + #region Overridden Methods + + /// + /// + /// + public override void update() + { + if (this.updateFlag == 1) // is a new prim just been created/reloaded + { + this.SendFullUpdateToAllClients(); + this.updateFlag = 0; + } + if (this.updateFlag == 2) //some change has been made so update the clients + { + this.SendTerseUpdateToALLClients(); + this.updateFlag = 0; + } + } + + /// + /// + /// + public override void BackUp() + { + + } + + #endregion + + #region Packet handlers + + /// + /// + /// + /// + public void UpdatePosition(LLVector3 pos) + { + this.Pos = new LLVector3(pos.X, pos.Y, pos.Z); + this.updateFlag = 2; + } + + /// + /// + /// + /// + public void UpdateShape(ObjectShapePacket.ObjectDataBlock updatePacket) + { + this.primData.PathBegin = updatePacket.PathBegin; + this.primData.PathEnd = updatePacket.PathEnd; + this.primData.PathScaleX = updatePacket.PathScaleX; + this.primData.PathScaleY = updatePacket.PathScaleY; + this.primData.PathShearX = updatePacket.PathShearX; + this.primData.PathShearY = updatePacket.PathShearY; + this.primData.PathSkew = updatePacket.PathSkew; + this.primData.ProfileBegin = updatePacket.ProfileBegin; + this.primData.ProfileEnd = updatePacket.ProfileEnd; + this.primData.PathCurve = updatePacket.PathCurve; + this.primData.ProfileCurve = updatePacket.ProfileCurve; + this.primData.ProfileHollow = updatePacket.ProfileHollow; + this.primData.PathRadiusOffset = updatePacket.PathRadiusOffset; + this.primData.PathRevolutions = updatePacket.PathRevolutions; + this.primData.PathTaperX = updatePacket.PathTaperX; + this.primData.PathTaperY = updatePacket.PathTaperY; + this.primData.PathTwist = updatePacket.PathTwist; + this.primData.PathTwistBegin = updatePacket.PathTwistBegin; + } + + /// + /// + /// + /// + public void UpdateTexture(byte[] tex) + { + this.primData.TextureEntry = tex; + } + + /// + /// + /// + /// + public void UpdateObjectFlags(ObjectFlagUpdatePacket pack) + { + + } + + /// + /// + /// + /// + public void AssignToParent(PrimitiveOld prim) + { + + } + + #endregion + + # region Inventory Methods + /// + /// + /// + /// + /// + public bool AddToInventory(InventoryItem item) + { + return false; + } + + /// + /// + /// + /// + /// + public InventoryItem RemoveFromInventory(LLUUID itemID) + { + return null; + } + + /// + /// + /// + /// + /// + public void RequestInventoryInfo(IClientAPI simClient, RequestTaskInventoryPacket packet) + { + + } + + /// + /// + /// + /// + /// + public void RequestXferInventory(IClientAPI simClient, ulong xferID) + { + //will only currently work if the total size of the inventory data array is under about 1000 bytes + SendXferPacketPacket send = new SendXferPacketPacket(); + + send.XferID.ID = xferID; + send.XferID.Packet = 1 + 2147483648; + send.DataPacket.Data = this.ConvertInventoryToBytes(); + + simClient.OutPacket(send); + } + + /// + /// + /// + /// + public byte[] ConvertInventoryToBytes() + { + Encoding enc = Encoding.ASCII; + byte[] result = new byte[0]; + List inventoryData = new List(); + int totallength = 0; + foreach (InventoryItem invItem in inventoryItems.Values) + { + byte[] data = enc.GetBytes(invItem.ExportString()); + inventoryData.Add(data); + totallength += data.Length; + } + //TODO: copy arrays into the single result array + + return result; + } + + /// + /// + /// + /// + public void CreateInventoryFromBytes(byte[] data) + { + + } + + #endregion + + #region Update viewers Methods + + /// + /// + /// + /// + public void SendFullUpdateForAllChildren(IClientAPI remoteClient) + { + this.SendFullUpdateToClient(remoteClient); + for (int i = 0; i < this.children.Count; i++) + { + if (this.children[i] is PrimitiveOld) + { + ((PrimitiveOld)this.children[i]).SendFullUpdateForAllChildren(remoteClient); + } + } + } + + /// + /// + /// + /// + public void SendFullUpdateToClient(IClientAPI remoteClient) + { + LLVector3 lPos; + if (this._physActor != null && this.physicsEnabled) + { + PhysicsVector pPos = this._physActor.Position; + lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z); + } + else + { + lPos = this.Pos; + } + + remoteClient.SendPrimitiveToClient(this.m_regionHandle, 64096, this.LocalId, this.primData, lPos, new LLUUID("00000000-0000-0000-9999-000000000005"), this.flags); + } + + /// + /// + /// + public void SendFullUpdateToAllClients() + { + List avatars = this.m_world.RequestAvatarList(); + for (int i = 0; i < avatars.Count; i++) + { + this.SendFullUpdateToClient(avatars[i].ControllingClient); + } + } + + /// + /// + /// + /// + public void SendTerseUpdateToClient(IClientAPI RemoteClient) + { + LLVector3 lPos; + Quaternion lRot; + if (this._physActor != null && this.physicsEnabled) //is this needed ? doesn't the property fields do this for us? + { + PhysicsVector pPos = this._physActor.Position; + lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z); + lRot = this._physActor.Orientation; + } + else + { + lPos = this.Pos; + lRot = this.rotation; + } + LLQuaternion mRot = new LLQuaternion(lRot.x, lRot.y, lRot.z, lRot.w); + RemoteClient.SendPrimTerseUpdate(this.m_regionHandle, 64096, this.LocalId, lPos, mRot); + } + + /// + /// + /// + public void SendTerseUpdateToALLClients() + { + List avatars = this.m_world.RequestAvatarList(); + for (int i = 0; i < avatars.Count; i++) + { + this.SendTerseUpdateToClient(avatars[i].ControllingClient); + } + } + + #endregion + + #region Create Methods + + /// + /// + /// + /// + /// + /// + public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID) + { + PrimData PData = new PrimData(); + this.primData = PData; + this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; + + PData.OwnerID = ownerID; + PData.PCode = addPacket.ObjectData.PCode; + PData.PathBegin = addPacket.ObjectData.PathBegin; + PData.PathEnd = addPacket.ObjectData.PathEnd; + PData.PathScaleX = addPacket.ObjectData.PathScaleX; + PData.PathScaleY = addPacket.ObjectData.PathScaleY; + PData.PathShearX = addPacket.ObjectData.PathShearX; + PData.PathShearY = addPacket.ObjectData.PathShearY; + PData.PathSkew = addPacket.ObjectData.PathSkew; + PData.ProfileBegin = addPacket.ObjectData.ProfileBegin; + PData.ProfileEnd = addPacket.ObjectData.ProfileEnd; + PData.Scale = addPacket.ObjectData.Scale; + PData.PathCurve = addPacket.ObjectData.PathCurve; + PData.ProfileCurve = addPacket.ObjectData.ProfileCurve; + PData.ParentID = 0; + PData.ProfileHollow = addPacket.ObjectData.ProfileHollow; + PData.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset; + PData.PathRevolutions = addPacket.ObjectData.PathRevolutions; + PData.PathTaperX = addPacket.ObjectData.PathTaperX; + PData.PathTaperY = addPacket.ObjectData.PathTaperY; + PData.PathTwist = addPacket.ObjectData.PathTwist; + PData.PathTwistBegin = addPacket.ObjectData.PathTwistBegin; + LLVector3 pos1 = addPacket.ObjectData.RayEnd; + this.primData.FullID = this.uuid = LLUUID.Random(); + this.primData.LocalID = m_localId = (uint)(localID); + this.primData.Position = this.Pos = pos1; + + this.updateFlag = 1; + } + + /// + /// + /// + /// + public void CreateFromBytes(byte[] data) + { + + } + + /// + /// + /// + /// + public void CreateFromPrimData(PrimData primData) + { + this.CreateFromPrimData(primData, primData.Position, primData.LocalID, false); + } + + /// + /// + /// + /// + /// + /// + /// + public void CreateFromPrimData(PrimData primData, LLVector3 posi, uint localID, bool newprim) + { + + } + + public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient) + { + // Console.WriteLine("moving prim to new location " + pos.X + " , " + pos.Y + " , " + pos.Z); + this.Pos = pos; + this.SendTerseUpdateToALLClients(); + } + + public void GetProperites(IClientAPI client) + { + //needs changing + ObjectPropertiesPacket proper = new ObjectPropertiesPacket(); + proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1]; + proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock(); + proper.ObjectData[0].ItemID = LLUUID.Zero; + proper.ObjectData[0].CreationDate = (ulong)primData.CreationDate; + proper.ObjectData[0].CreatorID = primData.OwnerID; + proper.ObjectData[0].FolderID = LLUUID.Zero; + proper.ObjectData[0].FromTaskID = LLUUID.Zero; + proper.ObjectData[0].GroupID = LLUUID.Zero; + proper.ObjectData[0].InventorySerial = 0; + proper.ObjectData[0].LastOwnerID = LLUUID.Zero; + proper.ObjectData[0].ObjectID = this.uuid; + proper.ObjectData[0].OwnerID = primData.OwnerID; + proper.ObjectData[0].TouchName = new byte[0]; + proper.ObjectData[0].TextureID = new byte[0]; + proper.ObjectData[0].SitName = new byte[0]; + proper.ObjectData[0].Name = new byte[0]; + proper.ObjectData[0].Description = new byte[0]; + proper.ObjectData[0].OwnerMask = primData.OwnerMask; + proper.ObjectData[0].NextOwnerMask = primData.NextOwnerMask; + proper.ObjectData[0].GroupMask = primData.GroupMask; + proper.ObjectData[0].EveryoneMask = primData.EveryoneMask; + proper.ObjectData[0].BaseMask = primData.BaseMask; + + client.OutPacket(proper); + + } + + #endregion + + } +} diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs new file mode 100644 index 0000000000..6dc996804e --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs @@ -0,0 +1,568 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Environment.Scenes +{ + public partial class Scene + { + /// + /// Modifies terrain using the specified information + /// + /// The height at which the user started modifying the terrain + /// The number of seconds the modify button was pressed + /// The size of the brush used + /// The action to be performed + /// Distance from the north border where the cursor is located + /// Distance from the west border where the cursor is located + public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west) + { + // Shiny. + double size = (double)(1 << brushsize); + + switch (action) + { + case 0: + // flatten terrain + Terrain.flatten(north, west, size, (double)seconds / 100.0); + RegenerateTerrain(true, (int)north, (int)west); + break; + case 1: + // raise terrain + Terrain.raise(north, west, size, (double)seconds / 100.0); + RegenerateTerrain(true, (int)north, (int)west); + break; + case 2: + //lower terrain + Terrain.lower(north, west, size, (double)seconds / 100.0); + RegenerateTerrain(true, (int)north, (int)west); + break; + case 3: + // smooth terrain + Terrain.smooth(north, west, size, (double)seconds / 100.0); + RegenerateTerrain(true, (int)north, (int)west); + break; + case 4: + // noise + Terrain.noise(north, west, size, (double)seconds / 100.0); + RegenerateTerrain(true, (int)north, (int)west); + break; + case 5: + // revert + Terrain.revert(north, west, size, (double)seconds / 100.0); + RegenerateTerrain(true, (int)north, (int)west); + break; + + // CLIENT EXTENSIONS GO HERE + case 128: + // erode-thermal + break; + case 129: + // erode-aerobic + break; + case 130: + // erode-hydraulic + break; + } + return; + } + + /// + /// + /// + /// Inefficient. TODO: Fixme + /// + /// + /// + /// + /// + public void InstantMessage(LLUUID fromAgentID, LLUUID toAgentID, uint timestamp, string fromAgentName, string message) + { + if (this.Avatars.ContainsKey(toAgentID)) + { + if (this.Avatars.ContainsKey(fromAgentID)) + { + // Local sim message + ScenePresence avatar = this.Avatars[fromAgentID]; + avatar.ControllingClient.SendInstantMessage(message, toAgentID); + } + else + { + // Message came from a user outside the sim, ignore? + } + } + else + { + // Grid message + } + } + + /// + /// + /// + /// + /// + /// + /// + /// + public void SimChat(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID) + { + // Console.WriteLine("Chat message"); + ScenePresence avatar = null; + foreach (IClientAPI client in m_clientThreads.Values) + { + int dis = -1000; + if (this.Avatars.ContainsKey(client.AgentId)) + { + + avatar = this.Avatars[client.AgentId]; + // int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); + dis= (int)avatar.Pos.GetDistanceTo(fromPos); + //Console.WriteLine("found avatar at " +dis); + + } + + switch (type) + { + case 0: // Whisper + if ((dis < 10) && (dis > -10)) + { + //should change so the message is sent through the avatar rather than direct to the ClientView + client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); + } + break; + case 1: // Say + if ((dis < 30) && (dis > -30)) + { + Console.WriteLine("sending chat"); + client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); + } + break; + case 2: // Shout + if ((dis < 100) && (dis > -100)) + { + client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); + } + break; + + case 0xff: // Broadcast + client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); + break; + } + + } + } + + /// + /// + /// + /// + /// + public void RezObject(AssetBase primAsset, LLVector3 pos) + { + + } + + /// + /// + /// + /// + /// + public void DeRezObject(Packet packet, IClientAPI simClient) + { + + } + + /// + /// + /// + /// + public void SendAvatarsToClient(IClientAPI remoteClient) + { + + } + + /// + /// + /// + /// + /// + /// + public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags) + { + SceneObject originPrim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + if (((SceneObject)ent).rootLocalID == originalPrim) + { + originPrim = (SceneObject)ent; + break; + } + } + } + + if (originPrim != null) + { + //SceneObject copy = originPrim.Copy(); + + } + else + { + OpenSim.Framework.Console.MainLog.Instance.Warn("Attempted to duplicate nonexistant prim"); + } + + } + + /// + /// + /// + /// + /// + public void LinkObjects(uint parentPrim, List childPrims) + { + SceneObject parenPrim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + if (((SceneObject)ent).rootLocalID == parentPrim) + { + parenPrim = (SceneObject)ent; + break; + } + } + } + + List children = new List(); + if (parenPrim != null) + { + for (int i = 0; i < childPrims.Count; i++) + { + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + if (((SceneObject)ent).rootLocalID == childPrims[i]) + { + children.Add((SceneObject)ent); + } + } + } + } + } + + foreach (SceneObject sceneObj in children) + { + parenPrim.AddNewChildPrims(sceneObj); + } + } + + /// + /// + /// + /// + /// + public void UpdatePrimShape(uint primLocalID, ObjectShapePacket.ObjectDataBlock shapeBlock) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(primLocalID); + if (prim != null) + { + prim.UpdateShape(shapeBlock); + break; + } + } + } + } + + /// + /// + /// + /// + /// + public void SelectPrim(uint primLocalID, IClientAPI remoteClient) + { + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + if (((SceneObject)ent).rootLocalID == primLocalID) + { + ((SceneObject)ent).GetProperites(remoteClient); + break; + } + } + } + } + + /// + /// + /// + /// + /// + public void PrimDescription(uint primLocalID, string description) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(primLocalID); + if (prim != null) + { + prim.Description = description; + break; + } + } + } + } + + /// + /// + /// + /// + /// + public void PrimName(uint primLocalID, string name) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(primLocalID); + if (prim != null) + { + prim.Name = name; + break; + } + } + } + } + + public void MoveObject(LLUUID objectID, LLVector3 offset, LLVector3 pos, IClientAPI remoteClient) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(objectID); + if (prim != null) + { + ((SceneObject)ent).GrapMovement(offset, pos, remoteClient); + break; + } + } + } + /* + if (this.Entities.ContainsKey(objectID)) + { + if (this.Entities[objectID] is SceneObject) + { + ((SceneObject)this.Entities[objectID]).GrapMovement(offset, pos, remoteClient); + } + }*/ + } + + /// + /// + /// + /// + /// + /// + public void UpdatePrimFlags(uint localID, Packet packet, IClientAPI remoteClient) + { + + } + + /// + /// + /// + /// + /// + /// + public void UpdatePrimTexture(uint localID, byte[] texture, IClientAPI remoteClient) + { + + } + + /// + /// + /// + /// + /// + /// + public void UpdatePrimPosition(uint localID, LLVector3 pos, IClientAPI remoteClient) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(localID); + if (prim != null) + { + prim.UpdateGroupPosition(pos); + break; + } + } + } + } + + public void UpdatePrimSinglePosition(uint localID, LLVector3 pos, IClientAPI remoteClient) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(localID); + if (prim != null) + { + prim.UpdateSinglePosition(pos); + break; + } + } + } + } + + /// + /// + /// + /// + /// + /// + /// + public void UpdatePrimRotation(uint localID, LLVector3 pos, LLQuaternion rot, IClientAPI remoteClient) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(localID); + if (prim != null) + { + prim.UpdateGroupMouseRotation( pos, rot); + break; + } + } + } + } + + /// + /// + /// + /// + /// + /// + public void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(localID); + if (prim != null) + { + prim.UpdateGroupRotation(rot); + break; + } + } + } + } + + /// + /// + /// + /// + /// + /// + public void UpdatePrimSingleRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient) + { + //Console.WriteLine("trying to update single prim rotation"); + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(localID); + if (prim != null) + { + prim.UpdateSingleRotation(rot); + break; + } + } + } + } + + /// + /// + /// + /// + /// + /// + public void UpdatePrimScale(uint localID, LLVector3 scale, IClientAPI remoteClient) + { + Primitive prim = null; + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + prim = ((SceneObject)ent).HasChildPrim(localID); + if (prim != null) + { + prim.ResizeGoup(scale); + break; + } + } + } + } + + /// + /// Sends prims to a client + /// + /// Client to send to + public void GetInitialPrims(IClientAPI RemoteClient) + { + + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs new file mode 100644 index 0000000000..5e08d535ae --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -0,0 +1,787 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Timers; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; +using OpenSim.Physics.Manager; +using OpenSim.Region.Caches; +using OpenSim.Region.Environment.Scripting; +using OpenSim.Region.Terrain; +using Caps=OpenSim.Region.Capabilities.Caps; +using Timer=System.Timers.Timer; + +namespace OpenSim.Region.Environment.Scenes +{ + public delegate bool FilterAvatarList(ScenePresence avatar); + + public partial class Scene : SceneBase, ILocalStorageReceiver + { + protected Timer m_heartbeatTimer = new Timer(); + protected Dictionary Avatars; + protected Dictionary Prims; + private PhysicsScene phyScene; + private float timeStep = 0.1f; + private Random Rand = new Random(); + private uint _primCount = 702000; + private System.Threading.Mutex _primAllocateMutex = new Mutex(false); + private int storageCount; + private Mutex updateLock; + + protected AuthenticateSessionsBase authenticateHandler; + protected RegionCommsListener regionCommsHost; + protected CommunicationsManager commsManager; + + protected Dictionary capsHandlers = new Dictionary(); + protected BaseHttpServer httpListener; + + public ParcelManager parcelManager; + public EstateManager estateManager; + public EventManager eventManager; + public ScriptManager scriptManager; + + #region Properties + /// + /// + /// + public PhysicsScene PhysScene + { + set + { + this.phyScene = value; + } + get + { + return (this.phyScene); + } + } + + #endregion + + #region Constructors + /// + /// Creates a new World class, and a region to go with it. + /// + /// Dictionary to contain client threads + /// Region Handle for this region + /// Region Name for this region + public Scene(Dictionary clientThreads, RegionInfo regInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach, BaseHttpServer httpServer) + { + updateLock = new Mutex(false); + this.authenticateHandler = authen; + this.commsManager = commsMan; + this.assetCache = assetCach; + m_clientThreads = clientThreads; + m_regInfo = regInfo; + m_regionHandle = m_regInfo.RegionHandle; + m_regionName = m_regInfo.RegionName; + this.m_datastore = m_regInfo.DataStore; + this.RegisterRegionWithComms(); + + parcelManager = new ParcelManager(this, this.m_regInfo); + estateManager = new EstateManager(this, this.m_regInfo); + scriptManager = new ScriptManager(this); + eventManager = new EventManager(); + + MainLog.Instance.Verbose("World.cs - creating new entitities instance"); + Entities = new Dictionary(); + Avatars = new Dictionary(); + Prims = new Dictionary(); + + MainLog.Instance.Verbose("World.cs - creating LandMap"); + Terrain = new TerrainEngine(); + + ScenePresence.LoadAnims(); + this.httpListener = httpServer; + } + #endregion + + /// + /// + /// + public void StartTimer() + { + m_heartbeatTimer.Enabled = true; + m_heartbeatTimer.Interval = 100; + m_heartbeatTimer.Elapsed += new ElapsedEventHandler(this.Heartbeat); + } + + + #region Update Methods + + + /// + /// Performs per-frame updates regularly + /// + /// + /// + void Heartbeat(object sender, EventArgs e) + { + this.Update(); + } + + /// + /// Performs per-frame updates on the world, this should be the central world loop + /// + public override void Update() + { + updateLock.WaitOne(); + try + { + if (this.phyScene.IsThreaded) + { + this.phyScene.GetResults(); + + } + + foreach (LLUUID UUID in Entities.Keys) + { + Entities[UUID].updateMovement(); + } + + lock (this.m_syncRoot) + { + this.phyScene.Simulate(timeStep); + } + + foreach (LLUUID UUID in Entities.Keys) + { + Entities[UUID].update(); + } + + // General purpose event manager + eventManager.TriggerOnFrame(); + + //backup world data + this.storageCount++; + if (storageCount > 1200) //set to how often you want to backup + { + this.Backup(); + storageCount = 0; + } + } + catch (Exception e) + { + MainLog.Instance.Warn("World.cs: Update() - Failed with exception " + e.ToString()); + } + updateLock.ReleaseMutex(); + + } + + /// + /// + /// + /// + public bool Backup() + { + + return true; + } + #endregion + + #region Regenerate Terrain + + /// + /// Rebuilds the terrain using a procedural algorithm + /// + public void RegenerateTerrain() + { + try + { + Terrain.hills(); + + lock (this.m_syncRoot) + { + this.phyScene.SetTerrain(Terrain.getHeights1D()); + } + this.localStorage.SaveMap(this.Terrain.getHeights1D()); + + foreach (IClientAPI client in m_clientThreads.Values) + { + this.SendLayerData(client); + } + + foreach (LLUUID UUID in Entities.Keys) + { + Entities[UUID].LandRenegerated(); + } + } + catch (Exception e) + { + MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString()); + } + } + + /// + /// Rebuilds the terrain using a 2D float array + /// + /// 256,256 float array containing heights + public void RegenerateTerrain(float[,] newMap) + { + try + { + this.Terrain.setHeights2D(newMap); + lock (this.m_syncRoot) + { + this.phyScene.SetTerrain(this.Terrain.getHeights1D()); + } + this.localStorage.SaveMap(this.Terrain.getHeights1D()); + + foreach (IClientAPI client in m_clientThreads.Values) + { + this.SendLayerData(client); + } + + foreach (LLUUID UUID in Entities.Keys) + { + Entities[UUID].LandRenegerated(); + } + } + catch (Exception e) + { + MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString()); + } + } + + /// + /// Rebuilds the terrain assuming changes occured at a specified point[?] + /// + /// ??? + /// ??? + /// ??? + public void RegenerateTerrain(bool changes, int pointx, int pointy) + { + try + { + if (changes) + { + /* Dont save here, rely on tainting system instead */ + + foreach (IClientAPI client in m_clientThreads.Values) + { + this.SendLayerData(pointx, pointy, client); + } + } + } + catch (Exception e) + { + MainLog.Instance.Warn("World.cs: RegenerateTerrain() - Failed with exception " + e.ToString()); + } + } + + #endregion + + #region Load Terrain + /// + /// Loads the World heightmap + /// + /// + public override void LoadWorldMap() + { + try + { + float[] map = this.localStorage.LoadWorld(); + if (map == null) + { + if (string.IsNullOrEmpty(this.m_regInfo.estateSettings.terrainFile)) + { + Console.WriteLine("No default terrain, procedurally generating..."); + this.Terrain.hills(); + + this.localStorage.SaveMap(this.Terrain.getHeights1D()); + } + else + { + try + { + this.Terrain.loadFromFileF32(this.m_regInfo.estateSettings.terrainFile); + this.Terrain *= this.m_regInfo.estateSettings.terrainMultiplier; + } + catch + { + Console.WriteLine("Unable to load default terrain, procedurally generating instead..."); + Terrain.hills(); + } + this.localStorage.SaveMap(this.Terrain.getHeights1D()); + } + } + else + { + this.Terrain.setHeights1D(map); + } + + CreateTerrainTexture(); + + } + catch (Exception e) + { + MainLog.Instance.Warn("World.cs: LoadWorldMap() - Failed with exception " + e.ToString()); + } + } + + /// + /// + /// + private void CreateTerrainTexture() + { + //create a texture asset of the terrain + byte[] data = this.Terrain.exportJpegImage("defaultstripe.png"); + this.m_regInfo.estateSettings.terrainImageID = LLUUID.Random(); + AssetBase asset = new AssetBase(); + asset.FullID = this.m_regInfo.estateSettings.terrainImageID; + asset.Data = data; + asset.Name = "terrainImage"; + asset.Type = 0; + this.assetCache.AddAsset(asset); + } + #endregion + + #region Primitives Methods + + + /// + /// Loads the World's objects + /// + public void LoadPrimsFromStorage() + { + try + { + MainLog.Instance.Verbose("World.cs: LoadPrimsFromStorage() - Loading primitives"); + this.localStorage.LoadPrimitives(this); + } + catch (Exception e) + { + MainLog.Instance.Warn("World.cs: LoadPrimsFromStorage() - Failed with exception " + e.ToString()); + } + } + + /// + /// Loads a specific object from storage + /// + /// The object to load + public void PrimFromStorage(PrimData prim) + { + + } + + /// + /// Returns a new unallocated primitive ID + /// + /// A brand new primitive ID + public uint PrimIDAllocate() + { + uint myID; + + _primAllocateMutex.WaitOne(); + ++_primCount; + myID = _primCount; + _primAllocateMutex.ReleaseMutex(); + + return myID; + } + + /// + /// + /// + /// + /// + public void AddNewPrim(Packet addPacket, IClientAPI agentClient) + { + AddNewPrim((ObjectAddPacket)addPacket, agentClient.AgentId); + } + + /// + /// + /// + /// + /// + public void AddNewPrim(ObjectAddPacket addPacket, LLUUID ownerID) + { + try + { + SceneObject sceneOb = new SceneObject(m_regionHandle, this, addPacket, ownerID, this.PrimIDAllocate()); + this.Entities.Add(sceneOb.rootUUID, sceneOb); + + // Trigger event for listeners + // eventManager.TriggerOnNewPrimitive(prim); + } + catch (Exception e) + { + MainLog.Instance.Warn("World.cs: AddNewPrim() - Failed with exception " + e.ToString()); + } + } + + public override uint AddNewPrim(LLUUID ownerId, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID texture, int flags) + { + uint id = NextLocalId; + + throw new NotImplementedException("Not implemented yet."); + } + + #endregion + + #region Add/Remove Avatar Methods + + /// + /// + /// + /// + /// + public override void AddNewClient(IClientAPI client, bool child) + { + client.OnRegionHandShakeReply += this.SendLayerData; + //remoteClient.OnRequestWearables += new GenericCall(this.GetInitialPrims); + client.OnChatFromViewer += this.SimChat; + client.OnInstantMessage += this.InstantMessage; + client.OnRequestWearables += this.InformClientOfNeighbours; + client.OnAddPrim += this.AddNewPrim; + client.OnUpdatePrimGroupPosition += this.UpdatePrimPosition; + client.OnUpdatePrimSinglePosition += this.UpdatePrimSinglePosition; + client.OnUpdatePrimGroupRotation += this.UpdatePrimRotation; + client.OnUpdatePrimGroupMouseRotation += this.UpdatePrimRotation; + client.OnUpdatePrimSingleRotation += this.UpdatePrimSingleRotation; + client.OnUpdatePrimScale += this.UpdatePrimScale; + client.OnUpdatePrimShape += this.UpdatePrimShape; + client.OnRequestMapBlocks += this.RequestMapBlocks; + client.OnTeleportLocationRequest += this.RequestTeleportLocation; + client.OnObjectSelect += this.SelectPrim; + client.OnGrapUpdate += this.MoveObject; + client.OnNameFromUUIDRequest += this.commsManager.HandleUUIDNameRequest; + client.OnObjectDescription += this.PrimDescription; + client.OnObjectName += this.PrimName; + client.OnLinkObjects += this.LinkObjects; + client.OnObjectDuplicate += this.DuplicateObject; + + /* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest); + remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest); + remoteClient.OnParcelJoinRequest += new ParcelJoinRequest(parcelManager.handleParcelJoinRequest); + remoteClient.OnParcelPropertiesUpdateRequest += new ParcelPropertiesUpdateRequest(parcelManager.handleParcelPropertiesUpdateRequest); + remoteClient.OnEstateOwnerMessage += new EstateOwnerMessageRequest(estateManager.handleEstateOwnerMessage); + */ + this.estateManager.sendRegionHandshake(client); + + CreateAndAddScenePresence(client); + return; + } + + protected void CreateAndAddScenePresence(IClientAPI client) + { + ScenePresence newAvatar = null; + + MainLog.Instance.Verbose("World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent"); + newAvatar = new ScenePresence(client, this, this.m_regInfo); + MainLog.Instance.Verbose("World.cs:AddViewerAgent() - Adding new avatar to world"); + MainLog.Instance.Verbose("World.cs:AddViewerAgent() - Starting RegionHandshake "); + + PhysicsVector pVec = new PhysicsVector(newAvatar.Pos.X, newAvatar.Pos.Y, newAvatar.Pos.Z); + lock (this.m_syncRoot) + { + newAvatar.PhysActor = this.phyScene.AddAvatar(pVec); + } + + lock (Entities) + { + if (!Entities.ContainsKey(client.AgentId)) + { + this.Entities.Add(client.AgentId, newAvatar); + } + else + { + Entities[client.AgentId] = newAvatar; + } + } + lock (Avatars) + { + if (Avatars.ContainsKey(client.AgentId)) + { + Avatars[client.AgentId] = newAvatar; + } + else + { + this.Avatars.Add(client.AgentId, newAvatar); + } + } + } + + + /// + /// + /// + /// + public override void RemoveClient(LLUUID agentID) + { + eventManager.TriggerOnRemovePresence(agentID); + + return; + } + #endregion + + #region Request Avatars List Methods + //The idea is to have a group of method that return a list of avatars meeting some requirement + // ie it could be all Avatars within a certain range of the calling prim/avatar. + + /// + /// Request a List of all Avatars in this World + /// + /// + public List RequestAvatarList() + { + List result = new List(); + + foreach (ScenePresence avatar in Avatars.Values) + { + result.Add(avatar); + } + + return result; + } + + /// + /// Request a filtered list of Avatars in this World + /// + /// + public List RequestAvatarList(FilterAvatarList filter) + { + List result = new List(); + + foreach (ScenePresence avatar in Avatars.Values) + { + if (filter(avatar)) + { + result.Add(avatar); + } + } + + return result; + } + + /// + /// Request a Avatar by UUID + /// + /// + /// + public ScenePresence RequestAvatar(LLUUID avatarID) + { + if (this.Avatars.ContainsKey(avatarID)) + { + return Avatars[avatarID]; + } + return null; + } + #endregion + + + /// + /// + /// + /// + /// + public bool DeleteEntity(LLUUID entID) + { + if (this.Entities.ContainsKey(entID)) + { + this.Entities.Remove(entID); + return true; + } + return false; + } + + public void SendAllSceneObjectsToClient(IClientAPI client) + { + foreach (EntityBase ent in Entities.Values) + { + if (ent is SceneObject) + { + ((SceneObject)ent).SendAllChildPrimsToClient(client); + } + } + } + + #region RegionCommsHost + + /// + /// + /// + public void RegisterRegionWithComms() + { + + this.regionCommsHost = this.commsManager.GridServer.RegisterRegion(this.m_regInfo); + if (this.regionCommsHost != null) + { + this.regionCommsHost.OnExpectUser += this.NewUserConnection; + this.regionCommsHost.OnAvatarCrossingIntoRegion += this.AgentCrossing; + } + } + + /// + /// + /// + /// + /// + public void NewUserConnection(ulong regionHandle, AgentCircuitData agent) + { + // Console.WriteLine("World.cs - add new user connection"); + //should just check that its meant for this region + if (regionHandle == this.m_regInfo.RegionHandle) + { + if (agent.CapsPath != "") + { + //Console.WriteLine("new user, so creating caps handler for it"); + Caps cap = new Caps(this.assetCache, httpListener, this.m_regInfo.ExternalHostName, this.m_regInfo.ExternalEndPoint.Port, agent.CapsPath, agent.AgentID); + cap.RegisterHandlers(); + this.capsHandlers.Add(agent.AgentID, cap); + } + this.authenticateHandler.AddNewCircuit(agent.circuitcode, agent); + } + } + + public void AgentCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position) + { + if (regionHandle == this.m_regInfo.RegionHandle) + { + if (this.Avatars.ContainsKey(agentID)) + { + this.Avatars[agentID].MakeAvatar(position); + } + } + } + + /// + /// + /// + public void InformClientOfNeighbours(IClientAPI remoteClient) + { + // Console.WriteLine("informing client of neighbouring regions"); + List neighbours = this.commsManager.GridServer.RequestNeighbours(this.m_regInfo); + + //Console.WriteLine("we have " + neighbours.Count + " neighbouring regions"); + if (neighbours != null) + { + for (int i = 0; i < neighbours.Count; i++) + { + // Console.WriteLine("sending neighbours data"); + AgentCircuitData agent = remoteClient.RequestClientInfo(); + agent.BaseFolder = LLUUID.Zero; + agent.InventoryFolder = LLUUID.Zero; + agent.startpos = new LLVector3(128, 128, 70); + agent.child = true; + this.commsManager.InterRegion.InformRegionOfChildAgent(neighbours[i].RegionHandle, agent); + remoteClient.InformClientOfNeighbour(neighbours[i].RegionHandle, neighbours[i].ExternalEndPoint); + //this.capsHandlers[remoteClient.AgentId].CreateEstablishAgentComms("", System.Net.IPAddress.Parse(neighbours[i].CommsIPListenAddr) + ":" + neighbours[i].CommsIPListenPort); + } + } + } + + /// + /// + /// + /// + /// + public RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle) + { + return this.commsManager.GridServer.RequestNeighbourInfo(regionHandle); + } + + /// + /// + /// + /// + /// + /// + /// + public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY) + { + List mapBlocks; + mapBlocks = this.commsManager.GridServer.RequestNeighbourMapBlocks(minX, minY, maxX, maxY); + remoteClient.SendMapBlock(mapBlocks); + } + + /// + /// + /// + /// + /// + /// + /// + /// + public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, LLVector3 position, LLVector3 lookAt, uint flags) + { + if (regionHandle == this.m_regionHandle) + { + if (this.Avatars.ContainsKey(remoteClient.AgentId)) + { + remoteClient.SendTeleportLocationStart(); + remoteClient.SendLocalTeleport(position, lookAt, flags); + this.Avatars[remoteClient.AgentId].Teleport(position); + } + } + else + { + RegionInfo reg = this.RequestNeighbouringRegionInfo(regionHandle); + if (reg != null) + { + remoteClient.SendTeleportLocationStart(); + AgentCircuitData agent = remoteClient.RequestClientInfo(); + agent.BaseFolder = LLUUID.Zero; + agent.InventoryFolder = LLUUID.Zero; + agent.startpos = new LLVector3(128, 128, 70); + agent.child = true; + this.commsManager.InterRegion.InformRegionOfChildAgent(regionHandle, agent); + this.commsManager.InterRegion.ExpectAvatarCrossing(regionHandle, remoteClient.AgentId, position); + + remoteClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4)); + + } + //remoteClient.SendTeleportCancel(); + } + } + + /// + /// + /// + /// + /// + /// + public bool InformNeighbourOfCrossing(ulong regionhandle, LLUUID agentID, LLVector3 position) + { + return this.commsManager.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position); + } + + #endregion + + } +} diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs new file mode 100644 index 0000000000..4036743b0d --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs @@ -0,0 +1,197 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Reflection; +using libsecondlife; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Region.Caches; +using OpenSim.Region.Terrain; + +namespace OpenSim.Region.Environment.Scenes +{ + public abstract class SceneBase : IWorld + { + public Dictionary Entities; + protected Dictionary m_clientThreads; + protected ulong m_regionHandle; + protected string m_regionName; + protected RegionInfo m_regInfo; + + public TerrainEngine Terrain; + + public string m_datastore; + public ILocalStorage localStorage; + + protected object m_syncRoot = new object(); + private uint m_nextLocalId = 8880000; + protected AssetCache assetCache; + + #region Update Methods + /// + /// Normally called once every frame/tick to let the world preform anything required (like running the physics simulation) + /// + public abstract void Update(); + + #endregion + + #region Terrain Methods + + /// + /// Loads the World heightmap + /// + public abstract void LoadWorldMap(); + + /// + /// Loads a new storage subsystem from a named library + /// + /// Storage Library + /// Successful or not + public bool LoadStorageDLL(string dllName) + { + try + { + Assembly pluginAssembly = Assembly.LoadFrom(dllName); + ILocalStorage store = null; + + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (pluginType.IsPublic) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("ILocalStorage", true); + + if (typeInterface != null) + { + ILocalStorage plug = (ILocalStorage)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + store = plug; + + store.Initialise(this.m_datastore); + break; + } + + typeInterface = null; + } + } + } + pluginAssembly = null; + this.localStorage = store; + return (store == null); + } + catch (Exception e) + { + MainLog.Instance.Warn("World.cs: LoadStorageDLL() - Failed with exception " + e.ToString()); + return false; + } + } + + + /// + /// Send the region heightmap to the client + /// + /// Client to send to + public virtual void SendLayerData(IClientAPI RemoteClient) + { + RemoteClient.SendLayerData(Terrain.getHeights1D()); + } + + /// + /// Sends a specified patch to a client + /// + /// Patch coordinate (x) 0..16 + /// Patch coordinate (y) 0..16 + /// The client to send to + public virtual void SendLayerData(int px, int py, IClientAPI RemoteClient) + { + RemoteClient.SendLayerData(px, py, Terrain.getHeights1D()); + } + + #endregion + + #region Add/Remove Agent/Avatar + /// + /// + /// + /// + /// + /// + public abstract void AddNewClient(IClientAPI client, bool child); + + public abstract uint AddNewPrim(LLUUID ownerId, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID texture, int flags); + + /// + /// + /// + /// + public abstract void RemoveClient(LLUUID agentID); + + #endregion + + /// + /// + /// + /// + public virtual RegionInfo RegionInfo + { + get { return this.m_regInfo; } + } + + public object SyncRoot + { + get { return m_syncRoot; } + } + + public uint NextLocalId + { + get { return m_nextLocalId++; } + } + + #region Shutdown + /// + /// Tidy before shutdown + /// + public virtual void Close() + { + try + { + this.localStorage.ShutDown(); + } + catch (Exception e) + { + MainLog.Instance.WriteLine(LogPriority.HIGH, "World.cs: Close() - Failed with exception " + e.ToString()); + } + } + + #endregion + + + } +} diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs new file mode 100644 index 0000000000..9e383c6e5b --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs @@ -0,0 +1,50 @@ +using libsecondlife; + +namespace OpenSim.Region.Environment.Scenes +{ + /// + /// A class for triggering remote scene events. + /// + public class EventManager + { + public delegate void OnFrameDelegate(); + public event OnFrameDelegate OnFrame; + + public delegate void OnNewPresenceDelegate(ScenePresence presence); + public event OnNewPresenceDelegate OnNewPresence; + + public delegate void OnNewPrimitiveDelegate(PrimitiveOld prim); + public event OnNewPrimitiveDelegate OnNewPrimitive; + + public delegate void OnRemovePresenceDelegate(LLUUID uuid); + public event OnRemovePresenceDelegate OnRemovePresence; + + public void TriggerOnFrame() + { + if (OnFrame != null) + { + OnFrame(); + } + } + + public void TriggerOnNewPrimitive(PrimitiveOld prim) + { + if (OnNewPrimitive != null) + OnNewPrimitive(prim); + } + + public void TriggerOnNewPresence(ScenePresence presence) + { + if (OnNewPresence != null) + OnNewPresence(presence); + } + + public void TriggerOnRemovePresence(LLUUID uuid) + { + if (OnRemovePresence != null) + { + OnRemovePresence(uuid); + } + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/SceneObject.cs b/OpenSim/Region/Environment/Scenes/SceneObject.cs new file mode 100644 index 0000000000..ecd2deebe4 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/SceneObject.cs @@ -0,0 +1,246 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; +using OpenSim.Physics.Manager; + +namespace OpenSim.Region.Environment.Scenes +{ + public class SceneObject : EntityBase + { + private Encoding enc = Encoding.ASCII; + private Dictionary ChildPrimitives = new Dictionary(); //list of all primitive id's that are part of this group + public Primitive rootPrimitive; + private new Scene m_world; + protected ulong m_regionHandle; + + private bool physicsEnabled = false; + private PhysicsScene m_PhysScene; + private PhysicsActor m_PhysActor; + + public LLUUID rootUUID + { + get + { + this.uuid = this.rootPrimitive.uuid; + return this.uuid; + } + } + + public uint rootLocalID + { + get + { + this.m_localId = this.rootPrimitive.LocalId; + return this.LocalId; + } + } + + /// + /// + /// + public SceneObject(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID) + { + m_regionHandle = regionHandle; + m_world = world; + this.Pos = addPacket.ObjectData.RayEnd; + this.CreateRootFromPacket(addPacket, ownerID, localID); + } + + /// + /// + /// + /// Need a null constructor for duplication + public SceneObject() + { + + } + + /// + /// + /// + /// + /// + /// + public void CreateRootFromPacket(ObjectAddPacket addPacket, LLUUID agentID, uint localID) + { + this.rootPrimitive = new Primitive( this.m_regionHandle, this.m_world, addPacket, agentID, localID, true, this, this); + this.children.Add(rootPrimitive); + this.ChildPrimitives.Add(this.rootUUID, this.rootPrimitive); + } + + /// + /// + /// + /// + public void CreateFromBytes(byte[] data) + { + + } + + /// + /// + /// + /// A complete copy of the object + public SceneObject Copy() + { + SceneObject dupe = new SceneObject(); + + Primitive newRoot = this.rootPrimitive.Copy((EntityBase)dupe, dupe); + + foreach (EntityBase child in this.children) + { + EntityBase newChild = child.Copy(); + dupe.children.Add(newChild); + } + + return dupe; + } + + /// + /// + /// + public void DeleteAllChildren() + { + this.children.Clear(); + this.ChildPrimitives.Clear(); + this.rootPrimitive = null; + } + + /// + /// + /// + /// + public void AddNewChildPrims(SceneObject primObject) + { + this.rootPrimitive.AddNewChildren(primObject); + } + + public void AddChildToList(Primitive prim) + { + if (!this.ChildPrimitives.ContainsKey(prim.uuid)) + { + this.ChildPrimitives.Add(prim.uuid, prim); + } + } + /// + /// + /// + /// + /// + public Primitive HasChildPrim(LLUUID primID) + { + if (this.ChildPrimitives.ContainsKey(primID)) + { + return this.ChildPrimitives[primID]; + } + + return null; + } + + /// + /// + /// + /// + /// + public Primitive HasChildPrim(uint localID) + { + Primitive returnPrim = null; + foreach (Primitive prim in this.ChildPrimitives.Values) + { + if (prim.LocalId == localID) + { + returnPrim = prim; + break; + } + } + return returnPrim; + } + + public void SendAllChildPrimsToClient(IClientAPI client) + { + this.rootPrimitive.SendFullUpdateForAllChildren(client); + } + + /// + /// + /// + public override void BackUp() + { + + } + + /// + /// + /// + /// + /// + /// + public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient) + { + this.rootPrimitive.Pos = pos ; + this.rootPrimitive.SendTerseUpdateForAllChildren(remoteClient); + } + + /// + /// + /// + /// + public void GetProperites(IClientAPI client) + { + ObjectPropertiesPacket proper = new ObjectPropertiesPacket(); + proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1]; + proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock(); + proper.ObjectData[0].ItemID = LLUUID.Zero; + proper.ObjectData[0].CreationDate = (ulong)this.rootPrimitive.CreationDate; + proper.ObjectData[0].CreatorID = this.rootPrimitive.CreatorID; + proper.ObjectData[0].FolderID = LLUUID.Zero; + proper.ObjectData[0].FromTaskID = LLUUID.Zero; + proper.ObjectData[0].GroupID = LLUUID.Zero; + proper.ObjectData[0].InventorySerial = 0; + proper.ObjectData[0].LastOwnerID = this.rootPrimitive.LastOwnerID; + proper.ObjectData[0].ObjectID = this.rootUUID; + proper.ObjectData[0].OwnerID = this.rootPrimitive.OwnerID; + proper.ObjectData[0].TouchName = enc.GetBytes(this.rootPrimitive.TouchName + "\0"); + proper.ObjectData[0].TextureID = new byte[0]; + proper.ObjectData[0].SitName = enc.GetBytes(this.rootPrimitive.SitName +"\0") ; + proper.ObjectData[0].Name = enc.GetBytes(this.rootPrimitive.Name +"\0"); + proper.ObjectData[0].Description = enc.GetBytes(this.rootPrimitive.Description +"\0"); + proper.ObjectData[0].OwnerMask = this.rootPrimitive.OwnerMask; + proper.ObjectData[0].NextOwnerMask = this.rootPrimitive.NextOwnerMask; + proper.ObjectData[0].GroupMask = this.rootPrimitive.GroupMask; + proper.ObjectData[0].EveryoneMask = this.rootPrimitive.EveryoneMask; + proper.ObjectData[0].BaseMask = this.rootPrimitive.BaseMask; + + client.OutPacket(proper); + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs new file mode 100644 index 0000000000..d1f75ed4d1 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.Animations.cs @@ -0,0 +1,74 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using System.Xml; +using libsecondlife; + +namespace OpenSim.Region.Environment.Scenes +{ + partial class ScenePresence + { + public class AvatarAnimations + { + + public Dictionary AnimsLLUUID = new Dictionary(); + public Dictionary AnimsNames = new Dictionary(); + + public AvatarAnimations() + { + } + + public void LoadAnims() + { + //OpenSim.Framework.Console.MainLog.Instance.Verbose("Avatar.cs:LoadAnims() - Loading avatar animations"); + XmlTextReader reader = new XmlTextReader("data/avataranimations.xml"); + + XmlDocument doc = new XmlDocument(); + doc.Load(reader); + foreach (XmlNode nod in doc.DocumentElement.ChildNodes) + { + + if (nod.Attributes["name"] != null) + { + AnimsLLUUID.Add(nod.Attributes["name"].Value, nod.InnerText); + } + + } + + reader.Close(); + + // OpenSim.Framework.Console.MainLog.Instance.Verbose("Loaded " + AnimsLLUUID.Count.ToString() + " animation(s)"); + + foreach (KeyValuePair kp in Animations.AnimsLLUUID) + { + AnimsNames.Add(kp.Value, kp.Key); + } + } + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs new file mode 100644 index 0000000000..dbb5d3f51b --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.Body.cs @@ -0,0 +1,85 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Interfaces; + +namespace OpenSim.Region.Environment.Scenes +{ + partial class ScenePresence + { + public class Avatar : IScenePresenceBody + { + public Avatar() + { + + } + + public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation) + { + } + + public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam) + { + } + + public void SendOurAppearance(IClientAPI OurClient) + { + } + + public void SendAppearanceToOtherAgent(ScenePresence avatarInfo) + { + } + } + + public class ChildAgent : IScenePresenceBody //is a ghost + { + public ChildAgent() + { + + } + + public void processMovement(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation) + { + } + + public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam) + { + } + + public void SendOurAppearance(IClientAPI OurClient) + { + } + + public void SendAppearanceToOtherAgent(ScenePresence avatarInfo) + { + } + } + } + +} diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs new file mode 100644 index 0000000000..d335699986 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -0,0 +1,549 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.IO; +using Axiom.Math; +using libsecondlife; +using libsecondlife.Packets; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Physics.Manager; + +namespace OpenSim.Region.Environment.Scenes +{ + public partial class ScenePresence : Entity + { + public static bool PhysicsEngineFlying = false; + public static AvatarAnimations Animations; + public static byte[] DefaultTexture; + public string firstname; + public string lastname; + public IClientAPI ControllingClient; + public LLUUID current_anim; + public int anim_seq; + private bool updateflag = false; + private byte movementflag = 0; + private List forcesList = new List(); + private short _updateCount = 0; + private Quaternion bodyRot; + private LLObject.TextureEntry avatarAppearanceTexture = null; + private byte[] visualParams; + private AvatarWearable[] Wearables; + private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); + private ulong m_regionHandle; + private bool childAgent = false; + private bool newForce = false; + private bool newAvatar = false; + private IScenePresenceBody m_body; + + protected RegionInfo m_regionInfo; + + private Vector3[] Dir_Vectors = new Vector3[6]; + private enum Dir_ControlFlags + { + DIR_CONTROL_FLAG_FOWARD = MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS, + DIR_CONTROL_FLAG_BACK = MainAvatar.ControlFlags.AGENT_CONTROL_AT_NEG, + DIR_CONTROL_FLAG_LEFT = MainAvatar.ControlFlags.AGENT_CONTROL_LEFT_POS, + DIR_CONTROL_FLAG_RIGHT = MainAvatar.ControlFlags.AGENT_CONTROL_LEFT_NEG, + DIR_CONTROL_FLAG_UP = MainAvatar.ControlFlags.AGENT_CONTROL_UP_POS, + DIR_CONTROL_FLAG_DOWN = MainAvatar.ControlFlags.AGENT_CONTROL_UP_NEG + } + + #region Properties + /// + /// + /// + public PhysicsActor PhysActor + { + set + { + this._physActor = value; + } + get + { + return _physActor; + } + } + #endregion + + #region Constructor(s) + /// + /// + /// + /// + /// + /// + /// + public ScenePresence(IClientAPI theClient, Scene world, RegionInfo reginfo) + { + + m_world = world; + this.uuid = theClient.AgentId; + + m_regionInfo = reginfo; + m_regionHandle = reginfo.RegionHandle; + MainLog.Instance.Verbose("Avatar.cs "); + ControllingClient = theClient; + this.firstname = ControllingClient.FirstName; + this.lastname = ControllingClient.LastName; + m_localId = m_world.NextLocalId; + Pos = ControllingClient.StartPos; + visualParams = new byte[218]; + for (int i = 0; i < 218; i++) + { + visualParams[i] = 100; + } + + Wearables = AvatarWearable.DefaultWearables; + + this.avatarAppearanceTexture = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005")); + + //register for events + ControllingClient.OnRequestWearables += this.SendOurAppearance; + //ControllingClient.OnSetAppearance += new SetAppearance(this.SetAppearance); + ControllingClient.OnCompleteMovementToRegion += this.CompleteMovement; + ControllingClient.OnCompleteMovementToRegion += this.SendInitialData; + ControllingClient.OnAgentUpdate += this.HandleAgentUpdate; + // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack); + // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); + //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); + + Dir_Vectors[0] = new Vector3(1, 0, 0); //FOWARD + Dir_Vectors[1] = new Vector3(-1, 0, 0); //BACK + Dir_Vectors[2] = new Vector3(0, 1, 0); //LEFT + Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT + Dir_Vectors[4] = new Vector3(0, 0, 1); //UP + Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN + + } + #endregion + + #region Status Methods + /// + /// Not Used, most likely can be deleted + /// + /// + public void ChildStatusChange(bool status) + { + this.childAgent = status; + + if (this.childAgent == true) + { + this.Velocity = new LLVector3(0, 0, 0); + this.Pos = new LLVector3(128, 128, 70); + + } + } + + /// + /// + /// + /// + public void MakeAvatar(LLVector3 pos) + { + //this.childAvatar = false; + this.Pos = pos; + this.newAvatar = true; + this.childAgent = false; + } + + protected void MakeChildAgent() + { + this.Velocity = new LLVector3(0, 0, 0); + this.Pos = new LLVector3(128, 128, 70); + this.childAgent = true; + } + + /// + /// + /// + /// + public void Teleport(LLVector3 pos) + { + this.Pos = pos; + this.SendTerseUpdateToALLClients(); + } + + /// + /// + /// + public void StopMovement() + { + + } + #endregion + + #region Event Handlers + /// + /// + /// + /// + /// + public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam) + { + + } + + /// + /// Complete Avatar's movement into the region + /// + public void CompleteMovement() + { + LLVector3 look = this.Velocity; + if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) + { + look = new LLVector3(0.99f, 0.042f, 0); + } + this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos, look); + if (this.childAgent) + { + this.childAgent = false; + } + } + + /// + /// + /// + /// + public void HandleAgentUpdate(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation) + { + int i = 0; + bool update_movementflag = false; + bool update_rotation = false; + bool DCFlagKeyPressed = false; + Vector3 agent_control_v3 = new Vector3(0, 0, 0); + Quaternion q = new Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z); + + this.PhysActor.Flying = ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_FLY) != 0); + + if (q != this.bodyRot) + { + this.bodyRot = q; + update_rotation = true; + } + foreach (Dir_ControlFlags DCF in Enum.GetValues(typeof(Dir_ControlFlags))) + { + if ((flags & (uint)DCF) != 0) + { + DCFlagKeyPressed = true; + agent_control_v3 += Dir_Vectors[i]; + if ((movementflag & (uint)DCF) == 0) + { + movementflag += (byte)(uint)DCF; + update_movementflag = true; + } + } + else + { + if ((movementflag & (uint)DCF) != 0) + { + movementflag -= (byte)(uint)DCF; + update_movementflag = true; + } + } + i++; + } + if ((update_movementflag) || (update_rotation && DCFlagKeyPressed)) + { + this.AddNewMovement(agent_control_v3, q); + } + + } + + protected void AddNewMovement(Vector3 vec, Quaternion rotation) + { + NewForce newVelocity = new NewForce(); + Vector3 direc = rotation * vec; + direc.Normalize(); + + direc = direc * ((0.03f) * 128f); + if (this._physActor.Flying) + direc *= 4; + + newVelocity.X = direc.x; + newVelocity.Y = direc.y; + newVelocity.Z = direc.z; + this.forcesList.Add(newVelocity); + } + + #endregion + + #region Overridden Methods + /// + /// + /// + public override void LandRenegerated() + { + + } + + /// + /// + /// + public override void update() + { + if (this.childAgent == false) + { + if (this.newForce) + { + this.SendTerseUpdateToALLClients(); + _updateCount = 0; + } + else if (movementflag != 0) + { + _updateCount++; + if (_updateCount > 3) + { + this.SendTerseUpdateToALLClients(); + _updateCount = 0; + } + } + + this.CheckForBorderCrossing(); + } + } + #endregion + + #region Update Client(s) + /// + /// + /// + /// + public void SendTerseUpdateToClient(IClientAPI RemoteClient) + { + LLVector3 pos = this.Pos; + LLVector3 vel = this.Velocity; + RemoteClient.SendAvatarTerseUpdate(this.m_regionHandle, 64096, this.LocalId, new LLVector3(pos.X, pos.Y, pos.Z), new LLVector3(vel.X, vel.Y, vel.Z)); + } + + /// + /// + /// + public void SendTerseUpdateToALLClients() + { + List avatars = this.m_world.RequestAvatarList(); + for (int i = 0; i < avatars.Count; i++) + { + this.SendTerseUpdateToClient(avatars[i].ControllingClient); + } + } + + /// + /// + /// + /// + public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar) + { + remoteAvatar.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture); + } + + /// + /// + /// + public void SendInitialData() + { + this.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos, DefaultTexture); + if (this.newAvatar) + { + this.m_world.InformClientOfNeighbours(this.ControllingClient); + this.newAvatar = false; + } + } + + /// + /// + /// + /// + public void SendOurAppearance(IClientAPI OurClient) + { + this.ControllingClient.SendWearables(this.Wearables); + this.m_world.SendAllSceneObjectsToClient(this.ControllingClient); + } + + /// + /// + /// + /// + public void SendAppearanceToOtherAgent(ScenePresence avatarInfo) + { + + } + + /// + /// + /// + /// + /// + public void SendAnimPack(LLUUID animID, int seq) + { + + + } + + /// + /// + /// + public void SendAnimPack() + { + + } + #endregion + + #region Border Crossing Methods + /// + /// + /// + protected void CheckForBorderCrossing() + { + LLVector3 pos2 = this.Pos; + LLVector3 vel = this.Velocity; + + float timeStep = 0.2f; + pos2.X = pos2.X + (vel.X * timeStep); + pos2.Y = pos2.Y + (vel.Y * timeStep); + pos2.Z = pos2.Z + (vel.Z * timeStep); + + if ((pos2.X < 0) || (pos2.X > 256)) + { + this.CrossToNewRegion(); + } + + if ((pos2.Y < 0) || (pos2.Y > 256)) + { + this.CrossToNewRegion(); + } + } + + /// + /// + /// + protected void CrossToNewRegion() + { + LLVector3 pos = this.Pos; + LLVector3 newpos = new LLVector3(pos.X, pos.Y, pos.Z); + uint neighbourx = this.m_regionInfo.RegionLocX; + uint neighboury = this.m_regionInfo.RegionLocY; + + if (pos.X < 2) + { + neighbourx -= 1; + newpos.X = 254; + } + if (pos.X > 253) + { + neighbourx += 1; + newpos.X = 1; + } + if (pos.Y < 2) + { + neighboury -= 1; + newpos.Y = 254; + } + if (pos.Y > 253) + { + neighboury += 1; + newpos.Y = 1; + } + + LLVector3 vel = this.m_velocity; + ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * 256), (uint)(neighboury * 256)); + RegionInfo neighbourRegion = this.m_world.RequestNeighbouringRegionInfo(neighbourHandle); + if (neighbourRegion != null) + { + bool res = this.m_world.InformNeighbourOfCrossing(neighbourHandle, this.ControllingClient.AgentId, newpos); + if (res) + { + this.MakeChildAgent(); + this.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.InternalEndPoint ); + } + } + } + #endregion + + /// + /// + /// + public static void LoadAnims() + { + + } + + /// + /// + /// + public override void updateMovement() + { + newForce = false; + lock (this.forcesList) + { + if (this.forcesList.Count > 0) + { + for (int i = 0; i < this.forcesList.Count; i++) + { + NewForce force = this.forcesList[i]; + + this.updateflag = true; + this.Velocity = new LLVector3(force.X, force.Y, force.Z); + this.newForce = true; + } + for (int i = 0; i < this.forcesList.Count; i++) + { + this.forcesList.RemoveAt(0); + } + } + } + } + + public static void LoadTextureFile(string name) + { + FileInfo fInfo = new FileInfo(name); + long numBytes = fInfo.Length; + FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read); + BinaryReader br = new BinaryReader(fStream); + byte[] data1 = br.ReadBytes((int)numBytes); + br.Close(); + fStream.Close(); + DefaultTexture = data1; + } + + public class NewForce + { + public float X; + public float Y; + public float Z; + + public NewForce() + { + + } + } + } + +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpEngine/CSharpScriptEngine.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpEngine/CSharpScriptEngine.cs new file mode 100644 index 0000000000..9cb881a9ea --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/CSharpEngine/CSharpScriptEngine.cs @@ -0,0 +1,102 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using Microsoft.CSharp; +using OpenSim.Framework.Console; + +namespace OpenSim.Region.Environment.Scripting +{ + public class CSharpScriptEngine : IScriptCompiler + { + public string FileExt() + { + return ".cs"; + } + + private Dictionary LoadDotNetScript(CodeDomProvider compiler, string filename) + { + CompilerParameters compilerParams = new CompilerParameters(); + CompilerResults compilerResults; + compilerParams.GenerateExecutable = false; + compilerParams.GenerateInMemory = true; + compilerParams.IncludeDebugInformation = false; + compilerParams.ReferencedAssemblies.Add("OpenSim.Region.dll"); + compilerParams.ReferencedAssemblies.Add("OpenSim.Region.Enviroment.dll"); + compilerParams.ReferencedAssemblies.Add("OpenSim.Framework.dll"); + compilerParams.ReferencedAssemblies.Add("libsecondlife.dll"); + compilerParams.ReferencedAssemblies.Add("System.dll"); + + compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename); + + if (compilerResults.Errors.Count > 0) + { + MainLog.Instance.Error("Compile errors"); + foreach (CompilerError error in compilerResults.Errors) + { + MainLog.Instance.Error(error.Line.ToString() + ": " + error.ErrorText.ToString()); + } + } + else + { + Dictionary scripts = new Dictionary(); + + foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes()) + { + Type testInterface = pluginType.GetInterface("IScript", true); + + if (testInterface != null) + { + IScript script = (IScript)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString()); + + string scriptName = "C#/" + script.getName(); + Console.WriteLine("Script: " + scriptName + " loaded."); + + if (!scripts.ContainsKey(scriptName)) + { + scripts.Add(scriptName, script); + } + else + { + scripts[scriptName] = script; + } + } + } + return scripts; + } + return null; + } + + public Dictionary compile(string filename) + { + CSharpCodeProvider csharpProvider = new CSharpCodeProvider(); + return LoadDotNetScript(csharpProvider, filename); + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine/JScriptEngine.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine/JScriptEngine.cs new file mode 100644 index 0000000000..be1fe56c18 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JScriptEngine/JScriptEngine.cs @@ -0,0 +1,102 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using Microsoft.JScript; +using OpenSim.Framework.Console; + +namespace OpenSim.Region.Environment.Scripting +{ + public class JScriptEngine : IScriptCompiler + { + public string FileExt() + { + return ".js"; + } + + private Dictionary LoadDotNetScript(CodeDomProvider compiler, string filename) + { + CompilerParameters compilerParams = new CompilerParameters(); + CompilerResults compilerResults; + compilerParams.GenerateExecutable = false; + compilerParams.GenerateInMemory = true; + compilerParams.IncludeDebugInformation = false; + compilerParams.ReferencedAssemblies.Add("OpenSim.Region.dll"); + compilerParams.ReferencedAssemblies.Add("OpenSim.Region.Enviroment.dll"); + compilerParams.ReferencedAssemblies.Add("OpenSim.Framework.dll"); + compilerParams.ReferencedAssemblies.Add("libsecondlife.dll"); + compilerParams.ReferencedAssemblies.Add("System.dll"); + + compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename); + + if (compilerResults.Errors.Count > 0) + { + MainLog.Instance.Error("Compile errors"); + foreach (CompilerError error in compilerResults.Errors) + { + MainLog.Instance.Error(error.Line.ToString() + ": " + error.ErrorText.ToString()); + } + } + else + { + Dictionary scripts = new Dictionary(); + + foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes()) + { + Type testInterface = pluginType.GetInterface("IScript", true); + + if (testInterface != null) + { + IScript script = (IScript)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString()); + + string scriptName = "JS.NET/" + script.getName(); + Console.WriteLine("Script: " + scriptName + " loaded."); + + if (!scripts.ContainsKey(scriptName)) + { + scripts.Add(scriptName, script); + } + else + { + scripts[scriptName] = script; + } + } + } + return scripts; + } + return null; + } + + public Dictionary compile(string filename) + { + JScriptCodeProvider jscriptProvider = new JScriptCodeProvider(); + return LoadDotNetScript(jscriptProvider, filename); + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassInstance.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassInstance.cs new file mode 100644 index 0000000000..1d93197a31 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassInstance.cs @@ -0,0 +1,45 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Scripting.EmbeddedJVM.Types; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class ClassInstance : Object + { + public int size; + public Dictionary Fields = new Dictionary(); + + public ClassInstance() + { + + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassRecord.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassRecord.cs new file mode 100644 index 0000000000..f4ab1a2f0f --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/ClassRecord.cs @@ -0,0 +1,503 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; +using OpenSim.Scripting.EmbeddedJVM.Types; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class ClassRecord + { + private ushort _majorVersion; + private ushort _minorVersion; + private ushort _constantPoolCount; + private ushort _accessFlags; + private ushort _thisClass; + private ushort _supperClass; + private ushort _interfaceCount; + private ushort _fieldCount; + private ushort _methodCount; + //private ushort _attributeCount; + //private string _name; + public Dictionary StaticFields = new Dictionary(); + public PoolClass mClass; + + public List _constantsPool = new List(); + private List _methodsList = new List(); + private List _fieldList = new List(); + + public ClassRecord() + { + + } + + public ClassInstance CreateNewInstance() + { + return new ClassInstance(); + } + + public void LoadClassFromFile(string fileName) + { + Console.WriteLine("loading script " + fileName); + FileStream fs = File.OpenRead(fileName); + this.LoadClassFromBytes(ReadFully(fs)); + fs.Close(); + } + + public void LoadClassFromBytes(byte[] data) + { + int i = 0; + i += 4; + _minorVersion = (ushort)((data[i++] << 8) + data[i++] ); + _majorVersion = (ushort)((data[i++] << 8) + data[i++] ); + _constantPoolCount = (ushort)((data[i++] << 8) + data[i++] ); + // Console.WriteLine("there should be " + _constantPoolCount + " items in the pool"); + for (int count = 0; count < _constantPoolCount -1 ; count++) + { + //read in the constant pool + byte pooltype = data[i++]; + //Console.WriteLine("#" +count +": new constant type = " +pooltype); + //Console.WriteLine("start position is: " + i); + switch (pooltype) + { + case 1: //Utf8 + ushort uLength = (ushort)((data[i++] << 8) + data[i++] ); + + // Console.WriteLine("new utf8 type, length is " + uLength); + PoolUtf8 utf8 = new PoolUtf8(); + utf8.readValue(data, ref i, uLength); + this._constantsPool.Add(utf8); + break; + case 3: //Int + break; + case 7: //Class + PoolClass pClass = new PoolClass(this); + pClass.readValue(data, ref i); + this._constantsPool.Add(pClass); + break; + case 10: //Method + PoolMethodRef pMeth = new PoolMethodRef(this); + pMeth.readValue(data, ref i); + this._constantsPool.Add(pMeth); + break; + case 12: //NamedType + PoolNamedType pNamed = new PoolNamedType(this); + pNamed.readValue(data, ref i); + this._constantsPool.Add(pNamed); + break; + } + } + + _accessFlags = (ushort)((data[i++] << 8) + data[i++] ); + _thisClass = (ushort)((data[i++] << 8) + data[i++] ); + _supperClass = (ushort)((data[i++] << 8) + data[i++] ); + + if (this._constantsPool[this._thisClass - 1] is PoolClass) + { + this.mClass = ((PoolClass)this._constantsPool[this._thisClass - 1]); + } + + _interfaceCount = (ushort)((data[i++] << 8) + data[i++]); + //should now read in the info for each interface + _fieldCount = (ushort)((data[i++] << 8) + data[i++]); + //should now read in the info for each field + _methodCount = (ushort)((data[i++] << 8) + data[i++]); + for (int count = 0; count < _methodCount; count++) + { + MethodInfo methInf = new MethodInfo(this); + methInf.ReadData(data, ref i); + this._methodsList.Add(methInf); + } + } + + public void AddMethodsToMemory(MethodMemory memory) + { + for (int count = 0; count < _methodCount; count++) + { + this._methodsList[count].AddMethodCode(memory); + } + } + + public bool StartMethod(Thread thread, string methodName) + { + for (int count = 0; count < _methodCount; count++) + { + if (this._constantsPool[this._methodsList[count].NameIndex-1] is PoolUtf8) + { + if (((PoolUtf8)this._constantsPool[this._methodsList[count].NameIndex-1]).Value == methodName) + { + //Console.WriteLine("found method: " + ((PoolUtf8)this._constantsPool[this._methodsList[count].NameIndex - 1]).Value); + thread.SetPC(this._methodsList[count].CodePointer); + return true; + } + } + } + return false; + } + + public void PrintToConsole() + { + Console.WriteLine("Class File:"); + Console.WriteLine("Major version: " + _majorVersion); + Console.WriteLine("Minor version: " + _minorVersion); + Console.WriteLine("Pool size: " + _constantPoolCount); + + for (int i = 0; i < _constantsPool.Count; i++) + { + this._constantsPool[i].Print(); + } + + Console.WriteLine("Access flags: " + _accessFlags); + Console.WriteLine("This class: " + _thisClass ); + Console.WriteLine("Super class: " + _supperClass); + + for (int count = 0; count < _methodCount; count++) + { + Console.WriteLine(); + this._methodsList[count].Print(); + } + + Console.WriteLine("class name is " + this.mClass.Name.Value); + } + + public static byte[] ReadFully(Stream stream) + { + byte[] buffer = new byte[1024]; + using (MemoryStream ms = new MemoryStream()) + { + while (true) + { + int read = stream.Read(buffer, 0, buffer.Length); + if (read <= 0) + return ms.ToArray(); + ms.Write(buffer, 0, read); + } + } + } + + #region nested classes + public class PoolItem + { + public virtual void Print() + { + + } + } + + public class PoolUtf8 : PoolItem + { + public string Value = ""; + + public void readValue(byte[] data,ref int pointer , int length) + { + for (int i = 0; i < length; i++) + { + int a =(int) data[pointer++]; + if ((a & 0x80) == 0) + { + Value = Value + (char)a; + } + else if ((a & 0x20) == 0) + { + int b = (int) data[pointer++]; + Value = Value + (char)(((a & 0x1f) << 6) + (b & 0x3f)); + } + else + { + int b = (int)data[pointer++]; + int c = (int)data[pointer++]; + Value = Value + (char)(((a & 0xf) << 12) + ((b & 0x3f) << 6) + (c & 0x3f)); + } + } + } + + public override void Print() + { + Console.WriteLine("Utf8 type: " + Value); + } + } + + private class PoolInt : PoolItem + { + + } + + public class PoolClass : PoolItem + { + //public string name = ""; + public ushort namePointer = 0; + private ClassRecord parent; + public PoolUtf8 Name; + + public PoolClass(ClassRecord paren) + { + parent = paren; + } + + public void readValue(byte[] data, ref int pointer) + { + namePointer = (ushort)((data[pointer++] << 8) + data[pointer++] ); + } + + public override void Print() + { + this.Name = ((PoolUtf8)this.parent._constantsPool[namePointer - 1]); + Console.Write("Class type: " + namePointer); + Console.WriteLine(" // " + ((PoolUtf8)this.parent._constantsPool[namePointer - 1]).Value); + + } + } + + public class PoolMethodRef : PoolItem + { + public ushort classPointer = 0; + public ushort nameTypePointer = 0; + public PoolNamedType mNameType; + public PoolClass mClass; + private ClassRecord parent; + + public PoolMethodRef(ClassRecord paren) + { + parent = paren; + } + + public void readValue(byte[] data, ref int pointer) + { + classPointer = (ushort)((data[pointer++] << 8) + data[pointer++]); + nameTypePointer = (ushort)((data[pointer++] << 8) + data[pointer++]); + } + + public override void Print() + { + this.mNameType = ((PoolNamedType)this.parent._constantsPool[nameTypePointer - 1]); + this.mClass = ((PoolClass)this.parent._constantsPool[classPointer - 1]); + Console.WriteLine("MethodRef type: " + classPointer + " , " + nameTypePointer); + } + } + + public class PoolNamedType : PoolItem + { + public ushort namePointer = 0; + public ushort typePointer = 0; + private ClassRecord parent; + public PoolUtf8 Name; + public PoolUtf8 Type; + + public PoolNamedType(ClassRecord paren) + { + parent = paren; + } + + public void readValue(byte[] data, ref int pointer) + { + namePointer = (ushort)((data[pointer++] << 8) + data[pointer++] ); + typePointer = (ushort)((data[pointer++] << 8) + data[pointer++] ); + } + + public override void Print() + { + Name = ((PoolUtf8)this.parent._constantsPool[namePointer-1]); + Type = ((PoolUtf8)this.parent._constantsPool[typePointer-1]); + Console.Write("Named type: " + namePointer + " , " + typePointer ); + Console.WriteLine(" // "+ ((PoolUtf8)this.parent._constantsPool[namePointer-1]).Value); + } + } + + //*********************** + public class MethodInfo + { + public ushort AccessFlags = 0; + public ushort NameIndex = 0; + public string Name = ""; + public ushort DescriptorIndex = 0; + public ushort AttributeCount = 0; + public List Attributes = new List(); + private ClassRecord parent; + public int CodePointer = 0; + + public MethodInfo(ClassRecord paren) + { + parent = paren; + } + + public void AddMethodCode(MethodMemory memory) + { + Array.Copy(this.Attributes[0].Code, 0, memory.MethodBuffer, memory.NextMethodPC, this.Attributes[0].Code.Length); + memory.Methodcount++; + this.CodePointer = memory.NextMethodPC; + memory.NextMethodPC += this.Attributes[0].Code.Length; + } + + public void ReadData(byte[] data, ref int pointer) + { + AccessFlags = (ushort)((data[pointer++] << 8) + data[pointer++]); + NameIndex = (ushort)((data[pointer++] << 8) + data[pointer++]); + DescriptorIndex = (ushort)((data[pointer++] << 8) + data[pointer++]); + AttributeCount = (ushort)((data[pointer++] << 8) + data[pointer++]); + for(int i =0; i< AttributeCount; i++) + { + MethodAttribute attri = new MethodAttribute(this.parent); + attri.ReadData(data, ref pointer); + this.Attributes.Add(attri); + } + } + + public void Print() + { + Console.WriteLine("Method Info Struct: "); + Console.WriteLine("AccessFlags: " + AccessFlags); + Console.WriteLine("NameIndex: " + NameIndex +" // "+ ((PoolUtf8)this.parent._constantsPool[NameIndex-1]).Value); + Console.WriteLine("DescriptorIndex: " + DescriptorIndex + " // "+ ((PoolUtf8)this.parent._constantsPool[DescriptorIndex-1]).Value); + Console.WriteLine("Attribute Count:" + AttributeCount); + for (int i = 0; i < AttributeCount; i++) + { + this.Attributes[i].Print(); + } + } + + public class MethodAttribute + { + public ushort NameIndex = 0; + public string Name = ""; + public Int32 Length = 0; + //for now only support code attribute + public ushort MaxStack = 0; + public ushort MaxLocals = 0; + public Int32 CodeLength = 0; + public byte[] Code; + public ushort ExceptionTableLength = 0; + public ushort SubAttributeCount = 0; + public List SubAttributes = new List(); + private ClassRecord parent; + + public MethodAttribute(ClassRecord paren) + { + parent = paren; + } + + public void ReadData(byte[] data, ref int pointer) + { + NameIndex = (ushort)((data[pointer++] << 8) + data[pointer++]); + Length = (Int32)((data[pointer++] << 24) + (data[pointer++] << 16) + (data[pointer++] << 8) + data[pointer++]); + MaxStack = (ushort)((data[pointer++] << 8) + data[pointer++]); + MaxLocals = (ushort)((data[pointer++] << 8) + data[pointer++]); + CodeLength = (Int32)((data[pointer++] << 24) + (data[pointer++] << 16) + (data[pointer++] << 8) + data[pointer++]); + Code = new byte[CodeLength]; + for (int i = 0; i < CodeLength; i++) + { + Code[i] = data[pointer++]; + } + ExceptionTableLength = (ushort)((data[pointer++] << 8) + data[pointer++]); + SubAttributeCount = (ushort)((data[pointer++] << 8) + data[pointer++]); + for (int i = 0; i < SubAttributeCount; i++) + { + SubAttribute subAttri = new SubAttribute(this.parent); + subAttri.ReadData(data, ref pointer); + this.SubAttributes.Add(subAttri); + } + } + + public void Print() + { + Console.WriteLine("Method Attribute: "); + Console.WriteLine("Name Index: " + NameIndex + " // "+ ((PoolUtf8)this.parent._constantsPool[NameIndex-1]).Value); + Console.WriteLine("Length: " + Length); + Console.WriteLine("MaxStack: " + MaxStack); + Console.WriteLine("MaxLocals: " + MaxLocals); + Console.WriteLine("CodeLength: " + CodeLength); + for (int i = 0; i < Code.Length; i++) + { + Console.WriteLine("OpCode #" + i + " is: " + Code[i]); + } + Console.WriteLine("SubAttributes: " + SubAttributeCount); + for (int i = 0; i < SubAttributeCount; i++) + { + this.SubAttributes[i].Print(); + } + } + + public class SubAttribute + { + public ushort NameIndex = 0; + public string Name = ""; + public Int32 Length = 0; + public byte[] Data; + private ClassRecord parent; + + public SubAttribute(ClassRecord paren) + { + parent = paren; + } + + public void ReadData(byte[] data, ref int pointer) + { + NameIndex = (ushort)((data[pointer++] << 8) + data[pointer++]); + Length = (Int32)((data[pointer++] << 24) + (data[pointer++] << 16) + (data[pointer++] << 8) + data[pointer++]); + Data = new byte[Length]; + for (int i = 0; i < Length; i++) + { + Data[i] = data[pointer++]; + } + } + + public void Print() + { + Console.WriteLine("SubAttribute: NameIndex: " + NameIndex + " // " + ((PoolUtf8)this.parent._constantsPool[NameIndex - 1]).Value); + } + + } + } + + } + private class InterfaceInfo + { + public void ReadData(byte[] data, ref int i) + { + + } + } + private class FieldInfo + { + public void ReadData(byte[] data, ref int i) + { + + } + } + private class AttributeInfo + { + public void ReadData(byte[] data, ref int i) + { + + } + } + #endregion + + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Heap.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Heap.cs new file mode 100644 index 0000000000..f213c367c4 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Heap.cs @@ -0,0 +1,43 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class Heap + { + public List ClassObjects = new List(); + + public Heap() + { + + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Interpreter.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Interpreter.cs new file mode 100644 index 0000000000..c5995b28fe --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Interpreter.cs @@ -0,0 +1,135 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Scripting.EmbeddedJVM.Types; +using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + partial class Thread + { + private partial class Interpreter + { + private Thread _mThread; + + public Interpreter(Thread parentThread) + { + _mThread = parentThread; + } + + public bool Excute() + { + bool run = true; + byte currentOpCode = GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC++]; + // Console.WriteLine("opCode is: " + currentOpCode); + bool handled = false; + + handled = this.IsLogicOpCode(currentOpCode); + if (!handled) + { + handled = this.IsMethodOpCode(currentOpCode); + } + if (!handled) + { + if (currentOpCode == 172) + { + if (this._mThread.stack.StackFrames.Count > 1) + { + Console.WriteLine("returning int from function"); + int retPC1 = this._mThread.currentFrame.ReturnPC; + BaseType bas1 = this._mThread.currentFrame.OpStack.Pop(); + this._mThread.stack.StackFrames.Pop(); + this._mThread.currentFrame = this._mThread.stack.StackFrames.Peek(); + this._mThread.PC = retPC1; + if (bas1 is Int) + { + this._mThread.currentFrame.OpStack.Push((Int)bas1); + } + } + else + { + // Console.WriteLine("No parent function so ending program"); + this._mThread.stack.StackFrames.Pop(); + run = false; + } + handled = true; + } + if (currentOpCode == 174) + { + if (this._mThread.stack.StackFrames.Count > 1) + { + Console.WriteLine("returning float from function"); + int retPC1 = this._mThread.currentFrame.ReturnPC; + BaseType bas1 = this._mThread.currentFrame.OpStack.Pop(); + this._mThread.stack.StackFrames.Pop(); + this._mThread.currentFrame = this._mThread.stack.StackFrames.Peek(); + this._mThread.PC = retPC1; + if (bas1 is Float) + { + this._mThread.currentFrame.OpStack.Push((Float)bas1); + } + } + else + { + // Console.WriteLine("No parent function so ending program"); + this._mThread.stack.StackFrames.Pop(); + run = false; + } + handled = true; + } + if (currentOpCode == 177) + { + if (this._mThread.stack.StackFrames.Count > 1) + { + Console.WriteLine("returning from function"); + int retPC = this._mThread.currentFrame.ReturnPC; + this._mThread.stack.StackFrames.Pop(); + this._mThread.currentFrame = this._mThread.stack.StackFrames.Peek(); + this._mThread.PC = retPC; + } + else + { + // Console.WriteLine("No parent function so ending program"); + this._mThread.stack.StackFrames.Pop(); + run = false; + } + handled = true; + } + } + if (!handled) + { + Console.WriteLine("opcode " + currentOpCode + " not been handled "); + } + return run; + + } + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterLogic.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterLogic.cs new file mode 100644 index 0000000000..2a11afd72e --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterLogic.cs @@ -0,0 +1,427 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Scripting.EmbeddedJVM.Types; +using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + partial class Thread + { + private partial class Interpreter + { + private bool IsLogicOpCode(byte opcode) + { + bool result = false; + switch (opcode) + { + case 2: + Int m_int= new Int(); + m_int.mValue = -1; + this._mThread.currentFrame.OpStack.Push(m_int); + result = true; + break; + case 3: + m_int= new Int(); + m_int.mValue = 0; + this._mThread.currentFrame.OpStack.Push(m_int); + result = true; + break; + case 4: + m_int = new Int(); + m_int.mValue = 1; + this._mThread.currentFrame.OpStack.Push(m_int); + result = true; + break; + case 5: + m_int = new Int(); + m_int.mValue = 2; + this._mThread.currentFrame.OpStack.Push(m_int); + result = true; + break; + case 6: + m_int = new Int(); + m_int.mValue = 3; + this._mThread.currentFrame.OpStack.Push(m_int); + break; + case 7: + m_int = new Int(); + m_int.mValue = 4; + this._mThread.currentFrame.OpStack.Push(m_int); + result = true; + break; + case 8: + m_int = new Int(); + m_int.mValue = 5; + this._mThread.currentFrame.OpStack.Push(m_int); + result = true; + break; + case 11: + Float m_float = new Float(); + m_float.mValue = 0.0f; + this._mThread.currentFrame.OpStack.Push(m_float); + result = true; + break; + case 12: + m_float = new Float(); + m_float.mValue = 1.0f; + this._mThread.currentFrame.OpStack.Push(m_float); + result = true; + break; + case 13: + m_float = new Float(); + m_float.mValue = 2.0f; + this._mThread.currentFrame.OpStack.Push(m_float); + result = true; + break; + case 16: + int pushvalue = (int)GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]; + Int pushInt = new Int(); + pushInt.mValue = pushvalue; + this._mThread.currentFrame.OpStack.Push(pushInt); + this._mThread.PC++; + result = true; + break; + case 17: + short pushvalue2 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]); + Int pushInt2 = new Int(); + pushInt2.mValue = pushvalue2; + this._mThread.currentFrame.OpStack.Push(pushInt2); + this._mThread.PC += 2; + result = true; + break; + case 23: + short findex1 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC])); + Float fload = new Float(); + if (this._mThread.currentFrame.LocalVariables[findex1] != null) + { + if (this._mThread.currentFrame.LocalVariables[findex1] is Float) + { + fload.mValue = ((Float)this._mThread.currentFrame.LocalVariables[findex1]).mValue; + this._mThread.currentFrame.OpStack.Push(fload); + } + } + this._mThread.PC++; + result = true; + break; + case 26: + if (this._mThread.currentFrame.LocalVariables[0] != null) + { + if (this._mThread.currentFrame.LocalVariables[0] is Int) + { + Int newInt = new Int(); + newInt.mValue = ((Int)this._mThread.currentFrame.LocalVariables[0]).mValue; + this._mThread.currentFrame.OpStack.Push(newInt); + } + } + result = true; + break; + case 27: + if (this._mThread.currentFrame.LocalVariables[1] != null) + { + if (this._mThread.currentFrame.LocalVariables[1] is Int) + { + Int newInt = new Int(); + newInt.mValue = ((Int)this._mThread.currentFrame.LocalVariables[1]).mValue; + this._mThread.currentFrame.OpStack.Push(newInt); + } + } + result = true; + break; + case 34: + if (this._mThread.currentFrame.LocalVariables[0] != null) + { + if (this._mThread.currentFrame.LocalVariables[0] is Float) + { + Float newfloat = new Float(); + newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[0]).mValue; + this._mThread.currentFrame.OpStack.Push(newfloat); + } + } + result = true; + break; + case 35: + if (this._mThread.currentFrame.LocalVariables[1] != null) + { + if (this._mThread.currentFrame.LocalVariables[1] is Float) + { + Float newfloat = new Float(); + newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[1]).mValue; + this._mThread.currentFrame.OpStack.Push(newfloat); + } + } + result = true; + break; + case 36: + if (this._mThread.currentFrame.LocalVariables[2] != null) + { + if (this._mThread.currentFrame.LocalVariables[2] is Float) + { + Float newfloat = new Float(); + newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[2]).mValue; + this._mThread.currentFrame.OpStack.Push(newfloat); + } + } + result = true; + break; + case 37: + if (this._mThread.currentFrame.LocalVariables[3] != null) + { + if (this._mThread.currentFrame.LocalVariables[3] is Float) + { + Float newfloat = new Float(); + newfloat.mValue = ((Float)this._mThread.currentFrame.LocalVariables[3]).mValue; + this._mThread.currentFrame.OpStack.Push(newfloat); + } + } + result = true; + break; + case 56: + short findex = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] )); + BaseType fstor = this._mThread.currentFrame.OpStack.Pop(); + if (fstor is Float) + { + this._mThread.currentFrame.LocalVariables[findex] = (Float)fstor; + } + this._mThread.PC++; + result = true; + break; + case 59: + BaseType baset = this._mThread.currentFrame.OpStack.Pop(); + if (baset is Int) + { + this._mThread.currentFrame.LocalVariables[0] = (Int)baset; + } + result = true; + break; + case 60: + baset = this._mThread.currentFrame.OpStack.Pop(); + if (baset is Int) + { + this._mThread.currentFrame.LocalVariables[1] = (Int)baset; + } + result = true; + break; + case 67: + baset = this._mThread.currentFrame.OpStack.Pop(); + if (baset is Float) + { + this._mThread.currentFrame.LocalVariables[0] = (Float)baset; + } + result = true; + break; + case 68: + baset = this._mThread.currentFrame.OpStack.Pop(); + if (baset is Float) + { + this._mThread.currentFrame.LocalVariables[1] = (Float)baset; + } + result = true; + break; + case 69: + baset = this._mThread.currentFrame.OpStack.Pop(); + if (baset is Float) + { + this._mThread.currentFrame.LocalVariables[2] = (Float)baset; + } + result = true; + break; + case 70: + baset = this._mThread.currentFrame.OpStack.Pop(); + if (baset is Float) + { + this._mThread.currentFrame.LocalVariables[3] = (Float)baset; + } + result = true; + break; + case 87: + this._mThread.currentFrame.OpStack.Pop(); + result = true; + break; + case 98: + BaseType bf2 = this._mThread.currentFrame.OpStack.Pop(); + BaseType bf1 = this._mThread.currentFrame.OpStack.Pop(); + if (bf1 is Float && bf2 is Float) + { + Float nflt = new Float(); + nflt.mValue = ((Float)bf1).mValue + ((Float)bf2).mValue; + this._mThread.currentFrame.OpStack.Push(nflt); + } + result = true; + break; + case 102: + BaseType bsf2 = this._mThread.currentFrame.OpStack.Pop(); + BaseType bsf1 = this._mThread.currentFrame.OpStack.Pop(); + if (bsf1 is Float && bsf2 is Float) + { + Float resf = new Float(); + resf.mValue = ((Float)bsf1).mValue - ((Float)bsf2).mValue; + this._mThread.currentFrame.OpStack.Push(resf); + } + result = true; + break; + case 104: //check the order of the two values off the stack is correct + BaseType bs2 = this._mThread.currentFrame.OpStack.Pop(); + BaseType bs1 = this._mThread.currentFrame.OpStack.Pop(); + if (bs1 is Int && bs2 is Int) + { + Int nInt = new Int(); + nInt.mValue = ((Int)bs1).mValue * ((Int)bs2).mValue; + this._mThread.currentFrame.OpStack.Push(nInt); + } + result = true; + break; + case 132: + if (this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]] != null) + { + if (this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]] is Int) + { + ((Int)this._mThread.currentFrame.LocalVariables[GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC]]).mValue += (sbyte) GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]; + } + } + this._mThread.PC += 2; + result = true; + break; + case 139: + BaseType conv1 = this._mThread.currentFrame.OpStack.Pop(); + if (conv1 is Float) + { + Int newconv = new Int(); + newconv.mValue = (int)((Float)conv1).mValue; + this._mThread.currentFrame.OpStack.Push(newconv); + } + result = true; + break; + case 149: + BaseType flcom2 = this._mThread.currentFrame.OpStack.Pop(); + BaseType flcom1 = this._mThread.currentFrame.OpStack.Pop(); + if (flcom1 is Float && flcom2 is Float) + { + Int compres = new Int(); + if (((Float)flcom1).mValue < ((Float)flcom2).mValue) + { + compres.mValue = -1; + } + else if (((Float)flcom1).mValue > ((Float)flcom2).mValue) + { + compres.mValue = 1; + } + else + { + compres.mValue = 0; + } + this._mThread.currentFrame.OpStack.Push(compres); + } + result = true; + break; + case 158: + short compareoffset1 = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]); + BaseType comp1 = this._mThread.currentFrame.OpStack.Pop(); + if (comp1 is Int) + { + if (((Int)comp1).mValue <= 0) + { + this._mThread.PC += -1 + compareoffset1; + } + else + { + this._mThread.PC += 2; + } + } + else + { + this._mThread.PC += 2; + } + result = true; + break; + case 162: + short compareoffset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]); + BaseType bc2 = this._mThread.currentFrame.OpStack.Pop(); + BaseType bc1 = this._mThread.currentFrame.OpStack.Pop(); + if (bc1 is Int && bc2 is Int) + { + //Console.WriteLine("comparing " + ((Int)bc1).mValue + " and " + ((Int)bc2).mValue); + if (((Int)bc1).mValue >= ((Int)bc2).mValue) + { + // Console.WriteLine("branch compare true , offset is " +compareoffset); + // Console.WriteLine("current PC is " + this._mThread.PC); + this._mThread.PC += -1 + compareoffset; + //Console.WriteLine("new PC is " + this._mThread.PC); + } + else + { + //Console.WriteLine("branch compare false"); + this._mThread.PC += 2; + } + } + else + { + this._mThread.PC += 2; + } + result = true; + break; + case 164: + short compareloffset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC + 1]); + BaseType bcl2 = this._mThread.currentFrame.OpStack.Pop(); + BaseType bcl1 = this._mThread.currentFrame.OpStack.Pop(); + if (bcl1 is Int && bcl2 is Int) + { + //Console.WriteLine("comparing " + ((Int)bcl1).mValue + " and " + ((Int)bcl2).mValue); + if (((Int)bcl1).mValue <= ((Int)bcl2).mValue) + { + // Console.WriteLine("branch compare true , offset is " + compareloffset); + // Console.WriteLine("current PC is " + this._mThread.PC); + this._mThread.PC += -1 + compareloffset; + // Console.WriteLine("new PC is " + this._mThread.PC); + } + else + { + //Console.WriteLine("branch compare false"); + this._mThread.PC += 2; + } + } + else + { + this._mThread.PC += 2; + } + result = true; + break; + case 167: + short offset = (short)((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC+1]); + this._mThread.PC += -1 + offset; + result = true; + break; + } + + return result; + } + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterMethods.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterMethods.cs new file mode 100644 index 0000000000..4d60559f01 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterMethods.cs @@ -0,0 +1,96 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Scripting.EmbeddedJVM.Types; +using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework; +using OpenSim.Framework.Types; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + partial class Thread + { + private partial class Interpreter + { + private bool IsMethodOpCode(byte opcode) + { + bool result = false; + switch (opcode) + { + case 184: + short refIndex = (short) ((GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC] << 8) + GlobalMemory.MethodArea.MethodBuffer[this._mThread.PC+1]); + if (this._mThread.currentClass._constantsPool[refIndex - 1] is ClassRecord.PoolMethodRef) + { + string typ = ((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mNameType.Type.Value; + string typeparam = ""; + string typereturn = ""; + int firstbrak = 0; + int secondbrak = 0; + firstbrak = typ.LastIndexOf('('); + secondbrak = typ.LastIndexOf(')'); + typeparam = typ.Substring(firstbrak + 1, secondbrak - firstbrak - 1); + typereturn = typ.Substring(secondbrak + 1, typ.Length - secondbrak - 1); + if (((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mClass.Name.Value == this._mThread.currentClass.mClass.Name.Value) + { + //calling a method in this class + if (typeparam.Length == 0) + { + this._mThread.JumpToStaticVoidMethod(((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mNameType.Name.Value, (this._mThread.PC + 2)); + } + else + { + this._mThread.JumpToStaticParamMethod(((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mNameType.Name.Value, typeparam, (this._mThread.PC + 2)); + } + } + else + { + //calling a method of a different class + + // OpenSimAPI Class + if (((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mClass.Name.Value == "OpenSimAPI") + { + this._mThread.scriptInfo.api.CallMethod(((ClassRecord.PoolMethodRef)this._mThread.currentClass._constantsPool[refIndex - 1]).mNameType.Name.Value, null); + } + } + } + else + { + this._mThread.PC += 2; + } + result = true; + break; + } + + return result; + } + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterReturn.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterReturn.cs new file mode 100644 index 0000000000..cbedb71485 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/InterpreterReturn.cs @@ -0,0 +1,40 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + partial class Thread + { + private partial class Interpreter + { + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/JavaEngine.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/JavaEngine.cs new file mode 100644 index 0000000000..1773156f40 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/JavaEngine.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Region.Environment.Scripting; +using OpenSim.Scripting.EmbeddedJVM; + +namespace OpenSim.Region.Environment.Scripting +{ + public class JavaEngine : IScriptCompiler + { + public string FileExt() + { + return ".java"; + } + + public Dictionary compile(string filename) + { + JVMScript script = new JVMScript(); + Dictionary returns = new Dictionary(); + + script.LoadScript(filename); + + returns.Add(filename, script); + + return returns; + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MainMemory.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MainMemory.cs new file mode 100644 index 0000000000..97d9fb6e10 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MainMemory.cs @@ -0,0 +1,45 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class MainMemory + { + public Heap HeapArea; + public MethodMemory MethodArea; + + public MainMemory() + { + MethodArea = new MethodMemory(); + HeapArea = new Heap(); + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MethodMemory.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MethodMemory.cs new file mode 100644 index 0000000000..7e938b4899 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/MethodMemory.cs @@ -0,0 +1,46 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class MethodMemory + { + public byte[] MethodBuffer; + public List Classes = new List(); + public int NextMethodPC = 0; + public int Methodcount = 0; + + public MethodMemory() + { + MethodBuffer = new byte[20000]; + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Object.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Object.cs new file mode 100644 index 0000000000..2c3beddfa4 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Object.cs @@ -0,0 +1,37 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class Object + { + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/OpenSimJVM.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/OpenSimJVM.cs new file mode 100644 index 0000000000..3e083cc8e2 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/OpenSimJVM.cs @@ -0,0 +1,171 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Threading; +using OpenSim.Framework; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Utilities; +using OpenSim.Region.Environment.Scripting; +using OpenSim.Region.Environment.Scenes; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class JVMScript : IScript + { + private List _threads = new List(); + private BlockingQueue CompileScripts = new BlockingQueue(); + private MainMemory _mainMemory; + private System.Threading.Thread compileThread; + + ScriptInfo scriptInfo; + + public void Initialise(ScriptInfo info) + { + scriptInfo = info; + + _mainMemory = new MainMemory(); + Thread.GlobalMemory = this._mainMemory; + Thread.World = info.world; + CompileScript(); + + scriptInfo.events.OnFrame += new EventManager.OnFrameDelegate(events_OnFrame); + scriptInfo.events.OnNewPresence += new EventManager.OnNewPresenceDelegate(events_OnNewPresence); + } + + void events_OnNewPresence(ScenePresence presence) + { + for (int i = 0; i < this._threads.Count; i++) + { + if (!this._threads[i].running) + { + this._threads[i].StartMethod("OnNewPresence"); + bool run = true; + while (run) + { + run = this._threads[i].Excute(); + } + } + } + } + + void events_OnFrame() + { + for (int i = 0; i < this._threads.Count; i++) + { + if (!this._threads[i].running) + { + this._threads[i].StartMethod("OnFrame"); + bool run = true; + while (run) + { + run = this._threads[i].Excute(); + } + } + } + } + + public string getName() + { + return "JVM Scripting Engine"; + } + + public void LoadScript(string script) + { + Console.WriteLine("OpenSimJVM - loading new script: " + script); + CompileInfo comp = new CompileInfo(); + comp.script = script; + comp.scriptName = script; + this.CompileScripts.Enqueue(comp); + } + + public void CompileScript() + { + CompileInfo comp = this.CompileScripts.Dequeue(); + string script = comp.script; + string scriptName = comp.scriptName; + try + { + //need to compile the script into a java class file + + //first save it to a java source file + TextWriter tw = new StreamWriter(scriptName + ".java"); + tw.WriteLine(script); + tw.Close(); + + //now compile + System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("javac.exe", "*.java"); + // psi.RedirectStandardOutput = true; + psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; + psi.UseShellExecute = false; + + System.Diagnostics.Process javacomp; + javacomp = System.Diagnostics.Process.Start(psi); + javacomp.WaitForExit(); + + + //now load in class file + ClassRecord class1 = new ClassRecord(); + class1.LoadClassFromFile(scriptName + ".class"); + class1.PrintToConsole(); + //Console.WriteLine(); + this._mainMemory.MethodArea.Classes.Add(class1); + class1.AddMethodsToMemory(this._mainMemory.MethodArea); + + Thread newThread = new Thread(); + this._threads.Add(newThread); + newThread.currentClass = class1; + newThread.scriptInfo = scriptInfo; + + //now delete the created files + System.IO.File.Delete(scriptName + ".java"); + System.IO.File.Delete(scriptName + ".class"); + //this.OnFrame(); + } + catch (Exception e) + { + Console.WriteLine("exception"); + Console.WriteLine(e.StackTrace); + Console.WriteLine(e.Message); + } + } + + private class CompileInfo + { + public string script; + public string scriptName; + + public CompileInfo() + { + + } + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Stack.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Stack.cs new file mode 100644 index 0000000000..69a274c02a --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Stack.cs @@ -0,0 +1,42 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class Stack + { + public Stack StackFrames = new Stack(); + + public Stack() + { + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/StackFrame.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/StackFrame.cs new file mode 100644 index 0000000000..3a2b58a4c8 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/StackFrame.cs @@ -0,0 +1,49 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Scripting.EmbeddedJVM.Types; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public class StackFrame + { + public BaseType[] LocalVariables; + public Stack OpStack = new Stack(); + + public int ReturnPC = 0; + public ClassRecord CallingClass = null; + + public StackFrame() + { + LocalVariables = new BaseType[20]; + } + + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Thread.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Thread.cs new file mode 100644 index 0000000000..3993436c5d --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Thread.cs @@ -0,0 +1,119 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Scripting.EmbeddedJVM.Types; +using OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes; +using OpenSim.Framework; +using OpenSim.Framework.Interfaces; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Scripting; + +namespace OpenSim.Scripting.EmbeddedJVM +{ + public partial class Thread + { + // Is this smart? + public static MainMemory GlobalMemory; + public static Scene World; + private int PC = 0; + private Stack stack; + private Interpreter mInterpreter; + public ClassRecord currentClass; + public ClassInstance currentInstance; + private StackFrame currentFrame; + public int excutionCounter = 0; + public bool running = false; + + public ScriptInfo scriptInfo; + + public Thread() + { + this.mInterpreter = new Interpreter(this); + this.stack = new Stack(); + } + + public void SetPC(int methodpointer) + { + //Console.WriteLine("Thread PC has been set to " + methodpointer); + PC = methodpointer; + } + + public void StartMethod(ClassRecord rec, string methName) + { + currentFrame = new StackFrame(); + this.stack.StackFrames.Push(currentFrame); + this.currentClass = rec; + currentClass.StartMethod(this, methName); + } + + public void StartMethod( string methName) + { + currentFrame = new StackFrame(); + this.stack.StackFrames.Push(currentFrame); + currentClass.StartMethod(this, methName); + } + + public void JumpToStaticVoidMethod(string methName, int returnPC) + { + currentFrame = new StackFrame(); + currentFrame.ReturnPC = returnPC; + this.stack.StackFrames.Push(currentFrame); + currentClass.StartMethod(this, methName); + } + + public void JumpToStaticParamMethod(string methName, string param, int returnPC) + { + if (param == "I") + { + BaseType bs1 = currentFrame.OpStack.Pop(); + currentFrame = new StackFrame(); + currentFrame.ReturnPC = returnPC; + this.stack.StackFrames.Push(currentFrame); + currentFrame.LocalVariables[0] = ((Int)bs1); + currentClass.StartMethod(this, methName); + } + if (param == "F") + { + + } + } + + public void JumpToClassStaticVoidMethod(string className, string methName, int returnPC) + { + + } + + public bool Excute() + { + excutionCounter++; + return this.mInterpreter.Excute(); + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ArrayReference.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ArrayReference.cs new file mode 100644 index 0000000000..2854eabd3a --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ArrayReference.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM.Types +{ + public class ArrayReference :BaseType + { + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/BaseType.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/BaseType.cs new file mode 100644 index 0000000000..270aa7be7c --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/BaseType.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM.Types +{ + public class BaseType : Object + { + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ObjectReference.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ObjectReference.cs new file mode 100644 index 0000000000..da28eaa8b5 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/ObjectReference.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM.Types +{ + public class ObjectReference : BaseType + { + public ushort Reference; + + public ObjectReference() + { + + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Byte.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Byte.cs new file mode 100644 index 0000000000..1a3ecfff7d --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Byte.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes +{ + public class Byte : BaseType + { + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Char.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Char.cs new file mode 100644 index 0000000000..19002d44fc --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Char.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes +{ + public class Char : BaseType + { + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Float.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Float.cs new file mode 100644 index 0000000000..91f1679293 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Float.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes +{ + public class Float : BaseType + { + public float mValue = 0; + + public Float() + { + + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Int.cs b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Int.cs new file mode 100644 index 0000000000..4ecd325fff --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Engines/JVMEngine/Types/PrimitiveTypes/Int.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Scripting.EmbeddedJVM.Types.PrimitiveTypes +{ + public class Int : BaseType + { + public int mValue = 0; + + public Int() + { + + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/Script.cs b/OpenSim/Region/Environment/Scenes/scripting/Script.cs new file mode 100644 index 0000000000..139bdf1e24 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/Script.cs @@ -0,0 +1,64 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using OpenSim.Region.Environment.Scenes; + +namespace OpenSim.Region.Environment.Scripting +{ + public interface IScript + { + void Initialise(ScriptInfo scriptInfo); + string getName(); + } + + public class TestScript : IScript + { + ScriptInfo script; + + public string getName() + { + return "TestScript 0.1"; + } + + public void Initialise(ScriptInfo scriptInfo) + { + script = scriptInfo; + script.events.OnFrame += new EventManager.OnFrameDelegate(events_OnFrame); + script.events.OnNewPresence += new EventManager.OnNewPresenceDelegate(events_OnNewPresence); + } + + void events_OnNewPresence(ScenePresence presence) + { + script.logger.Verbose("Hello " + presence.firstname.ToString() + "!"); + } + + void events_OnFrame() + { + //script.logger.Verbose("Hello World!"); + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptAPI.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptAPI.cs new file mode 100644 index 0000000000..fd601cb556 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptAPI.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Region.Environment.Scenes; + +namespace OpenSim.Region.Environment.Scripting +{ + // This class is to be used for engines which may not be able to access the Scene directly. + // Scene access is preffered, but obviously not possible on some non-.NET languages. + public class ScriptAPI + { + Scene scene; + + public ScriptAPI(Scene world) + { + scene = world; + } + + public Object CallMethod(String method, Object[] args) + { + return null; + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs new file mode 100644 index 0000000000..ed6f033b98 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptInfo.cs @@ -0,0 +1,58 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using OpenSim.Framework.Console; +using OpenSim.Region.Environment.Scenes; + +namespace OpenSim.Region.Environment.Scripting +{ + /// + /// Class which provides access to the world + /// + public class ScriptInfo + { + // Reference to world.eventsManager provided for convenience + public EventManager events; + + // The main world + public Scene world; + + // The console + public LogBase logger; + + // API Access + public ScriptAPI api; + + public ScriptInfo(Scene scene) + { + world = scene; + events = world.eventManager; + logger = MainLog.Instance; + api = new ScriptAPI(scene); + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs new file mode 100644 index 0000000000..153f4d777d --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptManager.cs @@ -0,0 +1,99 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using OpenSim.Framework.Console; +using OpenSim.Region.Environment.Scenes; + +namespace OpenSim.Region.Environment.Scripting +{ + public class ScriptManager + { + List scripts = new List(); + Scene scene; + Dictionary compilers = new Dictionary(); + + private void LoadFromCompiler(Dictionary compiledscripts) + { + foreach (KeyValuePair script in compiledscripts) + { + ScriptInfo scriptInfo = new ScriptInfo(scene); // Since each script could potentially corrupt their access with a stray assignment, making a new one for each script. + MainLog.Instance.Verbose("Loading " + script.Key); + script.Value.Initialise(scriptInfo); + scripts.Add(script.Value); + } + MainLog.Instance.Verbose("Finished loading " + compiledscripts.Count.ToString() + " script(s)"); + } + + public ScriptManager(Scene world) + { + scene = world; + + // Default Engines + CSharpScriptEngine csharpCompiler = new CSharpScriptEngine(); + compilers.Add(csharpCompiler.FileExt(),csharpCompiler); + + JScriptEngine jscriptCompiler = new JScriptEngine(); + compilers.Add(jscriptCompiler.FileExt(), jscriptCompiler); + + JavaEngine javaCompiler = new JavaEngine(); + compilers.Add(javaCompiler.FileExt(), javaCompiler); + } + + public void Compile(string filename) + { + foreach (KeyValuePair compiler in compilers) + { + if (filename.EndsWith(compiler.Key)) + { + LoadFromCompiler(compiler.Value.compile(filename)); + break; + } + } + } + + public void RunScriptCmd(string[] args) + { + switch (args[0]) + { + case "load": + Compile(args[1]); + break; + + default: + MainLog.Instance.Error("Unknown script command"); + break; + } + } + } + + interface IScriptCompiler + { + Dictionary compile(string filename); + string FileExt(); + } +} diff --git a/OpenSim/Region/Environment/obj/Debug/OpenSim.Region.Environment.dll b/OpenSim/Region/Environment/obj/Debug/OpenSim.Region.Environment.dll new file mode 100644 index 0000000000000000000000000000000000000000..11f7884ae701e2c84e09a0c0fec4fc667a911269 GIT binary patch literal 106496 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
!hsi-ik)9jqwU{R;6zB7sz&dJHmDGtuaF9_xp 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 ShwBewkcki=3^LtHYxN(LG5;t4 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Environment/obj/OpenSim.Region.Environment.csproj.FileList.txt b/OpenSim/Region/Environment/obj/OpenSim.Region.Environment.csproj.FileList.txt new file mode 100644 index 0000000000..29c0e2c8af --- /dev/null +++ b/OpenSim/Region/Environment/obj/OpenSim.Region.Environment.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\bin\OpenSim.Region.Environment.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Environment.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Environment.dll +obj\Debug\OpenSim.Region.Environment.pdb +..\..\..\bin\OpenSim.Region.Environment.pdb diff --git a/OpenSim/Region/Environment/obj/Release/OpenSim.Region.Environment.dll b/OpenSim/Region/Environment/obj/Release/OpenSim.Region.Environment.dll new file mode 100644 index 0000000000000000000000000000000000000000..94ba21ddb5213caca543b883da483206a54d27ac GIT binary patch literal 98304 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 z

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 D1izUc literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Environment/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Environment/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..e556cd8b4b4cca545516861a486f37193dc3737f GIT binary patch literal 51798 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 OnMeV`Ak(e2*8c&XSlz$? literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Examples/SimpleApp/LlsdMethodEntry.cs b/OpenSim/Region/Examples/SimpleApp/LlsdMethodEntry.cs new file mode 100644 index 0000000000..d0ef2affe3 --- /dev/null +++ b/OpenSim/Region/Examples/SimpleApp/LlsdMethodEntry.cs @@ -0,0 +1,10 @@ +using System.Collections; +using System.Text; +using libsecondlife; +using OpenSim.Region.Capabilities; +using System.IO; + +namespace OpenSim.Framework.Servers +{ + +} diff --git a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs new file mode 100644 index 0000000000..da1b43d17f --- /dev/null +++ b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs @@ -0,0 +1,93 @@ +using System.Collections.Generic; +using libsecondlife; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; +using OpenSim.Region.Caches; +using OpenSim.Region.Environment.Scenes; +using Avatar=OpenSim.Region.Environment.Scenes.ScenePresence; + +namespace SimpleApp +{ + public class MyWorld : Scene + { + private List m_avatars; + + public MyWorld(Dictionary clientThreads, RegionInfo regionInfo, AuthenticateSessionsBase authen, CommunicationsManager commsMan, AssetCache assetCach, BaseHttpServer httpServer) + : base(clientThreads, regionInfo, authen, commsMan, assetCach, httpServer) + { + m_avatars = new List(); + } + + public override void SendLayerData(IClientAPI remoteClient) + { + float[] map = new float[65536]; + + for (int i = 0; i < 65536; i++) + { + int x = i % 256; + int y = i / 256; + + map[i] = (float)(x + y / 2); + } + + remoteClient.SendLayerData(map); + } + + #region IWorld Members + + override public void AddNewClient(IClientAPI client, bool child) + + { + LLVector3 pos = new LLVector3(128, 128, 128); + + client.OnRegionHandShakeReply += SendLayerData; + client.OnChatFromViewer += + delegate(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID) + { + // Echo it (so you know what you typed) + client.SendChatMessage(message, type, fromPos, fromName, fromAgentID); + client.SendChatMessage("Ready.", 1, pos, "System", LLUUID.Zero ); + }; + + client.OnRequestWearables += SendWearables; + client.OnAddPrim += AddNewPrim; + client.OnUpdatePrimGroupPosition += this.UpdatePrimPosition; + client.OnRequestMapBlocks += this.RequestMapBlocks; + client.OnTeleportLocationRequest += this.RequestTeleportLocation; + client.OnGrapUpdate += this.MoveObject; + client.OnNameFromUUIDRequest += this.commsManager.HandleUUIDNameRequest; + + client.OnCompleteMovementToRegion += delegate() + { + client.MoveAgentIntoRegion(m_regInfo, pos, LLVector3.Zero ); + }; + + client.OnCompleteMovementToRegion += delegate() + { + client.SendAvatarData(m_regInfo.RegionHandle, client.FirstName, + client.LastName, client.AgentId, 0, + pos, null); + + client.SendChatMessage("Welcome to My World.", 1, pos, "System", LLUUID.Zero ); + + + + }; + + client.SendRegionHandshake(m_regInfo); + + CreateAndAddScenePresence(client); + + } + + private void SendWearables( IClientAPI client ) + { + client.SendWearables( AvatarWearable.DefaultWearables ); + } + + #endregion + } +} diff --git a/OpenSim/Region/Examples/SimpleApp/Program.cs b/OpenSim/Region/Examples/SimpleApp/Program.cs new file mode 100644 index 0000000000..4567d7e9e6 --- /dev/null +++ b/OpenSim/Region/Examples/SimpleApp/Program.cs @@ -0,0 +1,130 @@ +using System; +using System.Net; +using libsecondlife; +using OpenSim.Assets; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Servers; +using OpenSim.Framework.Types; +using OpenSim.Physics.Manager; +using OpenSim.Region.Caches; +using OpenSim.Region.Capabilities; +using OpenSim.Region.ClientStack; +using OpenSim.Region.Communications.Local; +using OpenSim.Region.GridInterfaces.Local; + +namespace SimpleApp +{ + class Program : IAssetReceiver, conscmd_callback + { + private LogBase m_log; + AuthenticateSessionsBase m_circuitManager; + uint m_localId; + + private void Run() + { + m_log = new LogBase(null, "SimpleApp", this, false); + MainLog.Instance = m_log; + + // CheckSumServer checksumServer = new CheckSumServer(12036); + // checksumServer.ServerListener(); + + IPEndPoint internalEndPoint = new IPEndPoint( IPAddress.Parse( "127.0.0.1" ), 9000 ); + + m_circuitManager = new AuthenticateSessionsBase(); + + InventoryCache inventoryCache = new InventoryCache(); + + LocalAssetServer assetServer = new LocalAssetServer(); + assetServer.SetServerInfo("http://127.0.0.1:8003/", ""); + assetServer.SetReceiver(this); + + AssetCache assetCache = new AssetCache(assetServer); + + UDPServer udpServer = new UDPServer( internalEndPoint.Port, assetCache, inventoryCache, m_log, m_circuitManager ); + PacketServer packetServer = new PacketServer(udpServer); + udpServer.ServerListener(); + + ClientView.TerrainManager = new TerrainManager(new SecondLife()); + + NetworkServersInfo serverInfo = new NetworkServersInfo(); + CommunicationsLocal communicationsManager = new CommunicationsLocal(serverInfo); + + RegionInfo regionInfo = new RegionInfo( 1000, 1000, internalEndPoint, "127.0.0.1" ); + + BaseHttpServer httpServer = new BaseHttpServer( internalEndPoint.Port ); + MyWorld world = new MyWorld(packetServer.ClientAPIs, regionInfo, m_circuitManager, communicationsManager, assetCache, httpServer); + world.PhysScene = PhysicsScene.Null; + udpServer.LocalWorld = world; + + httpServer.AddXmlRPCHandler("login_to_simulator", communicationsManager.UserServices.XmlRpcLoginMethod ); + + httpServer.Start(); + + m_log.WriteLine( LogPriority.NORMAL, "Press enter to quit."); + m_log.ReadLine(); + + PrimData primData = new PrimData(); + primData.Scale = new LLVector3(1, 1, 1); + + m_localId = world.AddNewPrim( LLUUID.Zero, primData, LLVector3.Zero, new LLQuaternion(0, 0, 0, 0), LLUUID.Zero, 0); + + } + + private bool AddNewSessionHandler(ulong regionHandle, Login loginData) + { + m_log.WriteLine(LogPriority.NORMAL, "Region [{0}] recieved Login from [{1}] [{2}]", regionHandle, loginData.First, loginData.Last); + + AgentCircuitData agent = new AgentCircuitData(); + agent.AgentID = loginData.Agent; + agent.firstname = loginData.First; + agent.lastname = loginData.Last; + agent.SessionID = loginData.Session; + agent.SecureSessionID = loginData.SecureSession; + agent.circuitcode = loginData.CircuitCode; + agent.BaseFolder = loginData.BaseFolder; + agent.InventoryFolder = loginData.InventoryFolder; + agent.startpos = new LLVector3(128, 128, 70); + + m_circuitManager.AddNewCircuit(agent.circuitcode, agent); + + return true; + } + + #region IAssetReceiver Members + + public void AssetReceived( AssetBase asset, bool IsTexture) + { + throw new Exception("The method or operation is not implemented."); + } + + public void AssetNotFound( AssetBase asset) + { + throw new Exception("The method or operation is not implemented."); + } + + #endregion + + #region conscmd_callback Members + + public void RunCmd(string cmd, string[] cmdparams) + { + throw new Exception("The method or operation is not implemented."); + } + + public void Show(string ShowWhat) + { + throw new Exception("The method or operation is not implemented."); + } + + #endregion + + static void Main(string[] args) + { + Program app = new Program(); + + app.Run(); + } + } +} diff --git a/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs b/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..3b0de8a3e2 --- /dev/null +++ b/OpenSim/Region/Examples/SimpleApp/Properties/AssemblyInfo.cs @@ -0,0 +1,31 @@ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SimpleApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Playahead AB")] +[assembly: AssemblyProduct("SimpleApp")] +[assembly: AssemblyCopyright("Copyright © Playahead AB 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a5cfa45f-5acf-4b2e-9c50-1dd1fd7608ee")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj b/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj new file mode 100644 index 0000000000..1536f3f1bc --- /dev/null +++ b/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj @@ -0,0 +1,177 @@ + + + Local + 8.0.50727 + 2.0 + {24B12448-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + SimpleApp + JScript + Grid + IE50 + false + Exe + + SimpleApp + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + ..\..\..\..\bin\System.Data.dll + False + + + System.Xml.dll + False + + + ..\..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Communications + {CB52B7E7-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.UserManagement + {586E2916-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Caches + {61FCCDB3-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Capabilities + {39038E85-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.ClientStack + {DC3698B2-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Communications.Local + {BFB5D807-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Environment + {DCBA491C-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.GridInterfaces.Local + {241A8CDD-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Region.Physics.Manager + {F4FF31EB-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj.user b/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj.user new file mode 100644 index 0000000000..bd364c1fc1 --- /dev/null +++ b/OpenSim/Region/Examples/SimpleApp/SimpleApp.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\;C:\Sugilite\bin\Physics\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Examples/SimpleApp/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Region/Examples/SimpleApp/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..b64a7ee77b4a4b3795cb8aca994203b5a5da6226 GIT binary patch literal 74819 zcmeI5d3+Q_`v3C`!$23u5RX+s0R=CVa0sF(qFjQ4AOUm*jgw@6fsnyT0C88r1H4dC z@c_Ipz!Ps>1zm6PST9!bc6HZVcU?tY55CW*rmOPQq$45zUcW#3)vY|KPuEk`Rn_mV zuCDIsE~28MqD{QuFP7FZHb;-jROGTX*~zsfgJxx_Doe(tYNprh-FZSfSCh$B59nRe z6aVeqdGM^N+F7~ufa>(D+FYt?@6Kapl~-jd4o}Y=mz|!j9#GzMpUHhE_nX|SS7qOx zseMw-v6-C%b1x~KTT`2!QCgd-O~cEZoT*A{)ojOnRLS6MRaLs8mP=4mGCWl?wKi2= zl}35JW^CdxzvUl>0C>! zD9xOdj&qG_5))EYv(hz1Ma`NOHE-UkWze=pn7q0MlzBwG{J%JIzk!t~mFmIPi^DW$ z(+;8S_+KKyX4k>}CzZ~clBvqnrYDtWswa(}nXWF)%qSU_OU+2n$>ye)R900bP`xgN zu0zWEWXq>2=NWA|>h6O|hiJdn?ANc*ub{Mt<}#Hd zs%z7^$*Br1^~h{Rs!Atr!-;!rCh_3Z%v3oVH{(~hEhp-|nM7lz&aKH*)NqZeQ&ZA8 zy|E;x>t0ea$^IX_uLd)}*{ZZo(ykGeW29!xs?JoT^5oZ5u9y>-Y^Iz;t7m6&+3FeT z>RP?QtvF4+ox`nOldi~CS5{>v=gYNqBg*CPsFFb`ZV4j*;x?SPePOwd9yN08n8CUX z+j4xL!g#Ys>wqe#H*)?1a<HC8H^KJov~yu5^_yS^ zcI#f4SN&3!rgO8oThtY6-?$_afDW9b5p6NPCY{TpX7}WdoN{w}e{fZXcRcr^6}pRP zhrR`Ev(-me{nB8D@huH&WPnd2nd%^4t(;cP+Mt5XA5$Xlg z8)hFi&9TY7Hrw^@HOzGT=mJ|;rD|$NWh*n2GwI6KshXPfjPk0vM{uv#x-!kXwK82@ z!AEWD8a_Dq=ttU`qIf*fX79ocl}_azzOv*Hk;TvxYtz*@pWzfzvLy*79*ZRSSM3+b>5{1xzL4ad0~EX+%winSyv6 zw@&<2L}g&6As&acjyLT#9Z^*d{nnh)yN~hWvZsMHkYZM(u_L#LrkVIlNVdJFS8kT{jiNYgaVxUs3tgAPy^xf%a$LXl77WZvm8 zXRs+oSBixOu+imSz=6a&6=xz&5qu=$U`dem#?uduPF%4Ra2gVs!La=wLRw z^yhLwwLmYgx1~ASa)uUh^5Q|rgclmjMrVE=2ULq8dL^4CLUTSR^)6sjjPnc@!l^}X zVKE017qUs2#`mEK8os-GqIbVO{YrZG-lyk&o4@GP2O3Ugx{;dm-zJcB5hwF5hFJo0 z3CyKzig9|xLO3JpYF);G#N}+p7F0`KSkzTVUphDD;#t?@FwR%kqXqwMLOqspGH)5o za+oV%u7tS?=4v*@IH6-9oWpgEuHiu9S~m7d)8A1AS3Px=LN93dQNKp+BMcXG-I{o` zU&qP4>tSwSQ;dNJ7Qz`_*W*SGByM7Jl-V324-Bg~xpy!@DPBupt z)J$Aj)>UZB=pM(}>I${xzfGX~E>7m%4Ra67y)gH|+z;~r%!4q0fq4k#VVE^AYhfN? zQ#_sx7Mj3D*ZENnB>u`~h;v;itGR#UX2A4*JBoAC)okKf|1nPPJr45(%#&=2k7k2~ z{>Vlb`Y8@1o@P^spt&}e7wUCY*|Gu5F`U1yN`n73VUIn-$-HM_*1Fqc z!9tVR=t{lFfyCd~49H*R*OhzANIRCZ(B*DoU-J?t_g;p1g-!8sY_L!n8(q*>Igogb zO<-RmXK?DOuw_kuJZJuUC|b|Sy}!e}4)X?^;uIS!RL(}%V*>{gZ?gHF4PL=n{GJAX zi<5hA!@R?$xRMPPO0&@geU}5O#bmvbO%ul}?{QM^eKy5Y*kGZlZ1fgB;6UOZZ2sT$ z0vXQf_w2t9Il1={%s*lN#in=~8!R-PjV|=Z97ue^W{l~s>&|)pTvZ)_TXqapajv=o z&G~N=j{Q$LnfDpY=P+Nue95MG1{*9?%|_SaD-I;SW)pZc>G{*TS~!D`MxMD_WI1zP znI?ksZ%*$0hfVQJ^CO$$8a7y{mW{5_|2UBNiA~`kK+G^UwJx(bTU{5A|26@upE;TL3(T)Dn_!Ti zM=&v%W-xI!#j`mUOMDKS%}fHcW|!t=m~B*L_QqDSE~xKuwJ!5-f{m!2ob}3Z`-so8 z>6T^w-KDl=xa)IB)s$>5Q#*CW_O2Y3&GA6AHkYm1s*I;5vei?tIlkL8CY8x;Yx2-H zm1;BkCdJ%D*|4hAl$xZ@s4hLVXi-GX^wJ_0YuVPH-|$P(*WQk*o}8I7E2r-zm>Cb; z_b}5WPGOsts!RQ;m3mb>u(9Rw%kQ*6zy?h5(R#XhVhP-9EUwoFDlft7=kcCRwBSH@ z+-2S1oN_28QdJ?bUI1i#mklf=LOb21wM?}}|WuvbI7q9Cc>5!-SC`pj>;_& z`c9mT-sciw&&PR_^qwzx>s+RHS=rLR!vdwx?~&8kK^M0x=b`9yBX`yE3?p~basf+S zncZ3b!IYBi}3yr%X3-k+U>)#jdO!pd3|`Du2f$R?AcJIoJ6`V z`?5PdE9>%%Q5C^(7R6aMAF5p1+ zr$=Q0A8`t}Ru*uLQ^5000f%rNiY_p6sFsUOd55v=Vqp1=89L=1%AUFs!#Oapp-MC& zD_ye@oC)10Yj&?wvwLLC?sjT+k*UfNoQI-|jU27z5+lcGd5MunYI&)VW3{}DrKYNs zWru>Y%Naf8jbjg8{qY>=*U0M2EOfOeaAH~|tG&{x_6k|;o1AJdHASDuc_>E(N*h zrb%;pS|*!jsnax<%ci-^X`1Uy1*UNximo?ux|TN>S*7KTrg}42?qI4{*VFlPh03eu zcwMtB2l{TVX7w`Am72*(=>l1)^PNhaCo8qcsniNn&RLvC;UQY^xP*R8M0vAKiRW;j zv4?0-R=VsbqU>kNvM+SXzCf1!45#d?Op~9?c__Ns$Wyeu#mISD-fHB0EpIdOR4s2e z@-!{)F!FRQSF_Ztp24!c*_nPnCgv=aw}2h=-dxCmeK)r^>*t`GiTs?b^6q7!D}Embc4_EHs(Vn&yPy4NxUAcuPThvd zx(#*e_L3>k!<>gA%*krh*J$~Qk!!Vl)fD#;mYq#!AUkF`GpoEu*-cmEuN*kAp^9uS zAHDk?;~Z#!tm1)A6%UYA?C(@@y{W|0oQI;n8~KcuuN(QSmYB!Y4X{qj4J`EzdXA;t zLC>?$^?HE=joCpjvLE%5rSIvKzK1M*iBtNwOo3kIJQTfceYOcv|d&$YxPv98M(ECU8S{zS3zzT|jaudg_;1p^-ORHXMcC#80>j!CDE zZDk$XICcEg6#HAwLlNeVbuGTr60^u!Zq)J%Bfr=3OCx{K5;MxW%0IFUsInd7{g2~y zm4D*E7F5~KKtuR5C#7bx$}y+PB&%HHRQcbg*u)dliZH{h>loAW8&ivBECc#8cXnBM zady*{Y0iNy=+E4Ibe$5M1O51mn6&u87hEPT>G!PcRsKd6byxY{no6|dJQRIrBz|n5 zXrqyBwEW)4wpwCVS~oya%O8zwrzPg4^u=b`8qBin2FtC1bF++^gAS{5-*x(#;Hl8o%AWz5J< zS~fGXvzBoqcZN(RSYnCATXLvimN?E4iLz0tY1thA$yDQy{sD+rHa0ywgJ)%twk0oq zHjsLWx8XHmn@^8L^XYZ->ANsLEoanJWOF=3S6&yEIG&W(l|%HFI1cDdArx(p2gMuy zK>=t~yln)Hx$_dvn=pGa8--(~ZkC+AK+bCd7J5|(MXyM5UUtYyM&yK>oSw`^B7c`q zdA%$$y@AXNf)aXO2u06HWY#&zw2P1lH!}U0jo%vC?`J969~3<$z@aCFQ1pbP=y6F= zax13j8a{c&in{X6)%it5OIToR3_Z5=kY0GSpZLGe*M2ZOd&#wn&+7KrHI;h|`})!q z>zn14kN)Sv?Y4jXs~azy`|ihYRnUXQ4_#e;Lf;MBzL;Bh>nl@s?R3qOR?Qc8e5viT zEjAqU{l_15FY4I-&4uc@qYkPlZu?Hxb(^+7=g57kZoBfo&s;U;+t%mq`N1>GR-gRt zrw_dM^_yKE`{<(~8^@fo?7F9yJoQbp_mW$4Nn3KcVyUGsjPBfj<>$05*6=?(G=hbL zdWqv!Xf$}!zb*^sdH5g(R1Dq*+9Tm$90`vI_-U;Wiq^;@;bD0s#5+XLgu6c-%52zE z@Gy(ap+M#VK?&V2grfT-GWSYkk~{f5PK-Kn2wjoC!taQt2+fsv|0#7cSx>omt4hnji3p4S5(Su1U<|*&eAg;^xQ0fp;baCS}EyS;n1^N zL{GTsIfmINoQ0TZ$(aOlt{1S-bwVh*R+4j#BqzCtfBK3Mo`DNIpY@2~3O8IS#z&mb z$}LwF;OYv25-k^kAJ>vxEtOowdq&WN8=9%iMq!VXvE)nxIhP1nXo(Q~e4`}iB8MD2 zDH{!+Lp*%WG8^`yY^Fu#1R!(1poGp7LeV0L%()ISy(478-Pz0rGUidOITo1{fy|kL z5?UyPq6HF}GbA#}K8y^O812iUz;Vw35mn))>SV@8jC)S8T+IVl^94#YPY6Y)NUlzH zxEf%&8rTq5Ln5xi&D9w$R|_mx3&GV~ffAi4grYf;tJ#vP_|OQNa6@x0vtb@)8j?%R z;dgu~Z;?gkJfM>kw9pAcD4HqJ$x3vR_>EKkREOUu$y41!itqUy#Z%TtM0AClu8SBS zajLu6an4V4cfhoj~G$kXSuo`Tn!f}(V;>p8Ya0KD!Gc|tq0M0EyU-whnbCl z-pT%0agC*DEhsuffI|lhp=h9_=pcupVf-Ss@qY$*TrV@J=ZQr;65n&HjXUTaULtnP>5x+vkrVC?=VfN2 zp*P9BVhMT`1nn)Lp}mAq)J+n!r$f;35kcW5=nZDWKJ&4`BJ(DY*;PB8MIy6{ zgG?$yCfvxp$7}@6KEH42`2h5E6u{6<8B5R>yQvk@@&W8d2Jouz0aDDnh2)KUmVEhI$=Nl~(zDaxPM zW^$0zF>} zVCV}W6n!q~`OKl`)QFyN)3Y73QFvcudrQs^Am?8K7W$_U{MK4Y&W8>;r$yw1o1Bi! zMuQ)v>0}Y=420ej)X=*^D0)XC^tOZ0=@CNVMrc=N!`>L#%_6fqkaX$T*dKC zj|iF&L$eRF5j2YKW9jJ&de#YG=vg5YJtOIP+M(zCh@Nnt$oexI_C$7oMdm;t^SGdd z9uq>*UnMe+I>=lQAro$74q-L|=70((6bD(D1_P#t1wZtV5Q_dHVS3PkX>kNoxM3R3 zZ2b1e4o6sy4g*K`3UufmA^1CHlB2sEj_`G|XcQFUQP5~+Bj7fzeMEnZrRYddbh`kD zZWBV$t&*Z!9EvWAC<=FPG=bSDoKrl?l5;f3Ss`Gdn}kqwqa^1Bha7zWFzSCo-2WWQ zY&7m$jmKG@%D~e#0wKCu2t`*(p00FwS`zUT?w+WU*=Xq5{j?=$G6-5KprOl!P;{9j z=u(HEOCo~8P0(~^qwtZ(Dof4`kaLlMg)S6A(PBx?1r9lvM&yK>oE)>U*>A1aSd?mk z(z${jI!6daXG@gMa!|sjougq$UGW+!GNtU8Nfub`6ICQ!YicXUho$648 zFM>xDg_xrG%trC3OhqnRlbu{!a#(3aE;F-Md8b->P6ItB3t;HaLMZx^q~|1u9(+JP zq9?@koXKoBzq>!nVskdInJq}6SwbkPmDtosY?8|voBaLyD>-ED*L(Su+QzSo$O`vB z>3qgV+^@gDaflSafa# zI>!iF=#N4uI$EN0ltd@Fg3-Yeqg5OV{4wI~5nbV?>t@DB41R90T-^$;N(D+ZRtQB$ zO0LF8uHtt@(1aVBJDH8PRhjZ}>0BG>Pz=_!Dr9zrN8k@R$z^d#?Pdh(ZD_jAb1Ip^2qZT#T~uy6zR z8sj4_yVhH-{tmA86e!UiLMYl@a^egB8SbDwzJ#7Rq)LIBd ztt36lq379%o^aFiJ+o2xyPh8`IX{A&gn)&b3!x}3$!X@0vo0bh+~oYqY&7_;piLH` zqBtY8=_m2d#9xI_^b0Hd&cvTteEaLBO&AENp!S0l>8O<8lsM+}J) zEax#2%4-3xeh?_p_d+PzD7pGhaut6qf+pP1v}QK!MSUBKOj{uHA3+KITL?v8OJu%s zkXaug6K-U-W;UFQ`fV&W+X9=<1S#~X5Q;vL*nBLpNxsh5V2RNN4h5dU-i^o#H(Bi& zA8`ijV7b~6Tzx1|qJIdX=mW{s`;x2pdl59@hGu7Gqu%}bT`W3XfX>^37J5qvMQ=)U zHb``mAJ{JGL(wHUzs~q1qAT2V?ZNnnE@@B8RX1?8UZ6y;38Cm!$<-^8tN5o8G~tG( z2eV-Z)jcgTy@1S%f)aW`2u06JWS(=7`7A;v+{o<9Y&e7JeiobkfX&l_6naVsMNdj> zo^Y`FJi;d2*bHDc>J5Glvgiy1I*$rk=n)|lt(EAkk?179WOVY^V_$P9@Otdqh^}zc zHH7gIgP)<6t6|{kL4guIAcUg(C0F-JuHxTC(1aVB!2%8#CZ<`72D{)(c9R8bMW#TqC6+-CI3pb)<@XbR&aM$c0%R~c}1sX&P?5kk=t z$<@V@t9UGeCfvPKHM3zy&smGiOdxZCpoGpBLeY5=nMD$rWSo)7cSQ*f1zyOvil_=V zRkIi$(G|_MT+IPjX9<+(Od%94lw2*4T*X^Q(1aVBKQkLaPfMR{={W`ToGO5!`9dg~ zC+RuGp{GqmPq^tho!Mycnb$KcLJNSu?gxW?3g&U!Bn2o||p>r)c zi$G3|fQ52GC^|usGt(g_8IcoiaxP>x?6lBD7MY8IOqHO7rVF8HnnWh!Ak!{FCfvwe z&TRbFw9ryZ(K1k!7T{2&5Q-`!MdgyB=YprZe$)}HX8cq+{2cjH6Un^fQAkcLeasJpn(oS9V3FmP0(Y^#%4bq_P9mq z37~XTnsh8VKL^!#f z;Jf;1>vEgpuZhu#zKf0X1Ibem;p8^YclFcS6v+kkTo*Rvy2!Y$9#}T7c)jXR=QZSd zv2nGHv!o%{WgLMeM$3JddVAwqlUr)(3!^*tU->y*=es8IY3-ww$(1&@RlW;6oE>+E zby@AZm<^f-F_ZTp0%fwrzu$ND)B2lbQr7ruVzkzGv2lJN`2-@I+@ADZ{j@ek@;QG^ zjGp&h5a$&C73=bgDz^BAnbl@m>A2 zb-8`zuZhvuzDvE_zOybH3tVjL|BMJ{gTMH$e%iVXHsd#CVTnMB2Zk*)$YD)y_$8e=UUQ`Yafol5~IGp zOTAV=qavNb?4)a~|1*o&hG1leChFp%aE=LO&r%8{qE@i$;y_(^p z^;lwrkJbkgfUlG1UGR1CKo@*Y1*@Yj@PU4foc^73;;T)8uJ}3+mKfpdJaDPEZ}Bx2H#dBhB``O9eZwsyzQPgciVrU2 zH;fN1z@>0W;;s5_Zg{&sT(MRzNxUfCEhAo-9=Kt=Alr4ti?Rb<@ls^h6)#5)bj5pa zU01yCHqaF>HN_Gmywnsfg_Td@?Ui{KyuA`GSe%0rZzseOBfOn3Fc-XN&MgyOI2TwZ zykN|A#f!!QUGY*W*A*|93UtMLf?QX;FDTFz?}gE>mTtTsCeRhH`fzi_D?b8V@rno6 z6|Z^-bj8p5U03|PKhPCF<95r6pK}Mg;+MH@uK0y+peufn>AK>VnSrkO30{8R<0p7< z!Q$Y7pIl*y5q@%IT=MJkHi_TUV2KfaPXiajp&bL@rx9+M@Dqu^GU1VU*A}b4dQ%mxIrv)%dh8};Z9)Q1$P2XnVe$d z&X2o6+yM&QAg1{9xnYVwaD$k-&AVXgR=U{pFXrX)E|`}yWy-J1+axAku*3+HE`_=1 UQ#7uw^Del$mM;1A{B@rH1LZW5qyPW_ literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Examples/SimpleApp/obj/Debug/SimpleApp.pdb b/OpenSim/Region/Examples/SimpleApp/obj/Debug/SimpleApp.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8f8190166ef9d8c31d24acae1c7841e4f54d2280 GIT binary patch literal 19968 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 _assetRequests; + private IObjectContainer db; + private Thread _localAssetServerThread; + + public LocalAssetServer() + { + bool yapfile; + this._assetRequests = new BlockingQueue(); + yapfile = File.Exists("assets.yap"); + + MainLog.Instance.Verbose( "Local Asset Server class created"); + try + { + db = Db4oFactory.OpenFile("assets.yap"); + MainLog.Instance.Verbose( "Db4 Asset database creation"); + } + catch (Exception e) + { + db.Close(); + MainLog.Instance.WriteLine(LogPriority.MEDIUM, "Db4 Asset server :Constructor - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + if (!yapfile) + { + this.SetUpAssetDatabase(); + } + this._localAssetServerThread = new Thread(new ThreadStart(RunRequests)); + this._localAssetServerThread.IsBackground = true; + this._localAssetServerThread.Start(); + + } + + public void SetReceiver(IAssetReceiver receiver) + { + this._receiver = receiver; + } + + public void RequestAsset(LLUUID assetID, bool isTexture) + { + ARequest req = new ARequest(); + req.AssetID = assetID; + req.IsTexture = isTexture; + this._assetRequests.Enqueue(req); + } + + public void UpdateAsset(AssetBase asset) + { + + } + + public void UploadNewAsset(AssetBase asset) + { + AssetStorage store = new AssetStorage(); + store.Data = asset.Data; + store.Name = asset.Name; + store.UUID = asset.FullID; + db.Set(store); + db.Commit(); + } + + public void SetServerInfo(string ServerUrl, string ServerKey) + { + + } + public void Close() + { + if (db != null) + { + MainLog.Instance.Verbose( "Closing local asset server database"); + db.Close(); + } + } + + private void RunRequests() + { + while (true) + { + byte[] idata = null; + bool found = false; + AssetStorage foundAsset = null; + ARequest req = this._assetRequests.Dequeue(); + IObjectSet result = db.Query(new AssetUUIDQuery(req.AssetID)); + if (result.Count > 0) + { + foundAsset = (AssetStorage)result.Next(); + found = true; + } + + AssetBase asset = new AssetBase(); + if (found) + { + asset.FullID = foundAsset.UUID; + asset.Type = foundAsset.Type; + asset.InvType = foundAsset.Type; + asset.Name = foundAsset.Name; + idata = foundAsset.Data; + } + else + { + asset.FullID = LLUUID.Zero; + } + asset.Data = idata; + _receiver.AssetReceived(asset, req.IsTexture); + } + + } + + private void SetUpAssetDatabase() + { + try + { + + MainLog.Instance.Verbose( "Setting up asset database"); + + AssetBase Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000001"); + Image.Name = "Bricks"; + this.LoadAsset(Image, true, "bricks.jp2"); + AssetStorage store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002"); + Image.Name = "Plywood"; + this.LoadAsset(Image, true, "plywood.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000003"); + Image.Name = "Rocks"; + this.LoadAsset(Image, true, "rocks.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000004"); + Image.Name = "Granite"; + this.LoadAsset(Image, true, "granite.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000005"); + Image.Name = "Hardwood"; + this.LoadAsset(Image, true, "hardwood.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005"); + Image.Name = "Prim Base Texture"; + this.LoadAsset(Image, true, "plywood.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000006"); + Image.Name = "Map Base Texture"; + this.LoadAsset(Image, true, "map_base.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000007"); + Image.Name = "Map Texture"; + this.LoadAsset(Image, true, "map1.jp2"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + + Image = new AssetBase(); + Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73"); + Image.Name = "Shape"; + this.LoadAsset(Image, false, "base_shape.dat"); + store = new AssetStorage(); + store.Data = Image.Data; + store.Name = Image.Name; + store.UUID = Image.FullID; + db.Set(store); + db.Commit(); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + + } + + private void LoadAsset(AssetBase info, bool image, string filename) + { + //should request Asset from storage manager + //but for now read from file + + string dataPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "assets"); //+ folder; + string fileName = Path.Combine(dataPath, filename); + FileInfo fInfo = new FileInfo(fileName); + long numBytes = fInfo.Length; + FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); + byte[] idata = new byte[numBytes]; + BinaryReader br = new BinaryReader(fStream); + idata = br.ReadBytes((int)numBytes); + br.Close(); + fStream.Close(); + info.Data = idata; + //info.loaded=true; + } + } + public class AssetUUIDQuery : Predicate + { + private LLUUID _findID; + + public AssetUUIDQuery(LLUUID find) + { + _findID = find; + } + public bool Match(AssetStorage asset) + { + return (asset.UUID == _findID); + } + } + +} diff --git a/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj b/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj new file mode 100644 index 0000000000..484a2057e2 --- /dev/null +++ b/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj @@ -0,0 +1,107 @@ + + + Local + 8.0.50727 + 2.0 + {241A8CDD-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.GridInterfaces.Local + JScript + Grid + IE50 + false + Library + + OpenSim.Region.GridInterfaces.Local + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj.user b/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/GridInterfaces/Local/OpenSim.Region.GridInterfaces.Local.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/GridInterfaces/Local/obj/Debug/OpenSim.Region.GridInterfaces.Local.dll b/OpenSim/Region/GridInterfaces/Local/obj/Debug/OpenSim.Region.GridInterfaces.Local.dll new file mode 100644 index 0000000000000000000000000000000000000000..5a587fcc039314b3bb041ecc8a96865eebb196c5 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/GridInterfaces/Local/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Region/GridInterfaces/Local/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..f7ed16d13a3dd73e30de9803e592bf0d3adbeda3 GIT binary patch literal 11467 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 IC{?xkzZWscJpcdz literal 0 HcmV?d00001 diff --git a/OpenSim/Region/GridInterfaces/Local/obj/OpenSim.Region.GridInterfaces.Local.csproj.FileList.txt b/OpenSim/Region/GridInterfaces/Local/obj/OpenSim.Region.GridInterfaces.Local.csproj.FileList.txt new file mode 100644 index 0000000000..f1b30e11b6 --- /dev/null +++ b/OpenSim/Region/GridInterfaces/Local/obj/OpenSim.Region.GridInterfaces.Local.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Region.GridInterfaces.Local.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.GridInterfaces.Local.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.GridInterfaces.Local.dll +obj\Debug\OpenSim.Region.GridInterfaces.Local.pdb +..\..\..\..\bin\OpenSim.Region.GridInterfaces.Local.pdb diff --git a/OpenSim/Region/GridInterfaces/Local/obj/Release/OpenSim.Region.GridInterfaces.Local.dll b/OpenSim/Region/GridInterfaces/Local/obj/Release/OpenSim.Region.GridInterfaces.Local.dll new file mode 100644 index 0000000000000000000000000000000000000000..630a0657eb4db4327f90429295875f0093a8b172 GIT binary patch literal 20480 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 TQ3j$6L>Y)O5M|(hGXwtu!EL-h literal 0 HcmV?d00001 diff --git a/OpenSim/Region/GridInterfaces/Local/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/GridInterfaces/Local/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..d29a2e25df7748a6aa8bfa8b29feb20d90013fd2 GIT binary patch literal 10901 zcmeHNYitx%8=kYB?(R%WmsL^lf<-{ZmhFWWXcZM&D@1|PMMS9C%BdEawpkeDP%e^J3VN_Bw5=Cwx3wj3+t##ZGFGacKgIoqB3+D*Fc7*=*g zbF2}6^|c*2)6LoXimaYDESViB^f* z%q!Y^EI#D8`as;(TphKPjA7~=Ra`iBDb`_`rk--i0w=awbNXE^Y3i_7sURUk{A1M+ zRZwrVv~-u2axFWQcPHFo4eZct-JXd~JFK+cZCiszTDQaaA#U8J%jA(0+@zT~-I1h< z3aPTPDqQSdYYKfWC}Q)PN&Wx2Vfi&OtWv8;Do~Y55;LLU6AY4A+|k|}&-EFm;p)9f zBip-vhn|fa1F-GMjiD@JqJ!NInrjZ$|7N%+o zr|%g(DpYm8*BvS7u`}6XCAZOhI5DWW^-S2#olr?pxKGv4W{{}FZ*|koeO*^!-qBID zsX6XiD{W*9JzcFijy{kyht`qX)oGnZA+2XqhVE25Db00t8*Lp)mV-0uC*CODPg9(Z ztrWVrZnvvvL1=I&b~+8V-ijvpNO%3Gx$fWxcPcfcD-np9Bp7^$!_pgvtN8UO>B?CU zXOmzU7Jj|Z{v2GI1#vE}W5j&z&%>qJ5OYXW;&!L)V~ysB{)aUu?%GDSuY%3Z)3ry> zLlr1&B`pKckvfW*yH@^3suG*N(PUe?kaYi?;<+A@8l$mUElgyEC0_;Ek^wB1uK zq-M%RB%+uD6oz5vQ!|&8;Kd|5eM@27;>K9psRcD|DrS?n_5fFm3a`CK+Go* z1u;+1&6Ud_E{9k|A_~T$Fp!iReg!GP zIubn-!o;}QOUY<5eR^svZE9;vrCT!1jY~9bxtZ!T1m_!sy2}K6Cr&$A7 zv6Tsg9yQ^mxyZQ6GhTHfpAy$(GnSG-GFhcLdN`5KH8lz3fR$#SWgBk)z-&M4vTO?E zu5FoTC1_<@**@Hka!2NhK7cY_J%^@ZJ?ajFl7hGeo7NHl|QA;)V~`k1isK9 z_85tT6qbjH4;r2D+LwqGwXYb@kMII*bb{^0LGU)^%3=_;{Z;=B3 z#;mQSpSXF~lA^MC1-Oz!L}7k)6^Dq&9CmPsILv+NBqchD1*&o#{m%XAB4zPZ{!D7f zeY&2Suvf`W%(OgA;FUa}3uNibggl>KA~5a~f-yJqMqU$PnZvalB0zJvjzffM4%c&t z5Y2t+CM7Zos94If-25Y}Y zivavBwdfxxM}Nwl`RKoeCOACcq%504imGfS2yUxNFG==mD04h5sa&E+2VQJ`3g-Y!_Ia?oIM^Jf3I3<|L`OUp9R-Wh0&!SM04ht0 zEYd_4MK(~=QThZVda)o6OA;6v43Hq)6JObc|3ty)@0T}!SZzIc?7lm%I5C>OyzBRe zp8BG~KDz$Lk@IH1{o9id4}JU7*D3Z|^!3M+J6pe;^{GAb{O5fOFCINqRe9gs&uTsh zeYxfTKb>4G%{~9C5%r^+uTDj4zFF|$U$gJtu*7`f(LdgQtozUE1B-rm|HzAbzWw>t z?|%Pk!HJV6JO9_c_sH@04!!%|itiYnLieR(02@In}+2^O|$#|VyX z)sB1)xdc-rQ#x^t?k zc*5eZiYF~ad&P;GSAFrC#J=bkYCFT?Dq0nXB!90sEETPaT`@|4VONYQDB}Bt2zEjK q-jI8W_J&l45@1Mms8Wdjg%_t0L=2dwNn;u%cMis=om%R2g;v literal 0 HcmV?d00001 diff --git a/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs b/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs new file mode 100644 index 0000000000..1e15c5ea9f --- /dev/null +++ b/OpenSim/Region/GridInterfaces/Remote/AssemblyInfo.cs @@ -0,0 +1,56 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("RemoteGridServers")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("RemoteGridServers")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] diff --git a/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj b/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj new file mode 100644 index 0000000000..793fde2570 --- /dev/null +++ b/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj @@ -0,0 +1,107 @@ + + + Local + 8.0.50727 + 2.0 + {98C7B681-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.GridInterfaces.Remote + JScript + Grid + IE50 + false + Library + + OpenSim.Region.GridInterfaces.Remote + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + ..\..\..\..\bin\XMLRPC.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj.user b/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/GridInterfaces/Remote/OpenSim.Region.GridInterfaces.Remote.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs b/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs new file mode 100644 index 0000000000..8643736277 --- /dev/null +++ b/OpenSim/Region/GridInterfaces/Remote/RemoteAssetServer.cs @@ -0,0 +1,133 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.IO; +using System.Net; +using System.Text; +using System.Threading; +using libsecondlife; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Region.GridInterfaces.Remote +{ + public class RemoteAssetServer : IAssetServer + { + private IAssetReceiver _receiver; + private BlockingQueue _assetRequests; + private Thread _remoteAssetServerThread; + private string AssetServerUrl; + private string AssetSendKey; + + public RemoteAssetServer() + { + this._assetRequests = new BlockingQueue(); + this._remoteAssetServerThread = new Thread(new ThreadStart(RunRequests)); + this._remoteAssetServerThread.IsBackground = true; + this._remoteAssetServerThread.Start(); + MainLog.Instance.Verbose("Remote Asset Server class created"); + } + + public void SetReceiver(IAssetReceiver receiver) + { + this._receiver = receiver; + } + + public void RequestAsset(LLUUID assetID, bool isTexture) + { + ARequest req = new ARequest(); + req.AssetID = assetID; + req.IsTexture = isTexture; + this._assetRequests.Enqueue(req); + } + + public void UpdateAsset(AssetBase asset) + { + + } + + public void UploadNewAsset(AssetBase asset) + { + Encoding Windows1252Encoding = Encoding.GetEncoding(1252); + string ret = Windows1252Encoding.GetString(asset.Data); + byte[] buffer = Windows1252Encoding.GetBytes(ret); + WebClient client = new WebClient(); + client.UploadData(this.AssetServerUrl + "assets/" + asset.FullID, buffer); + + } + + public void SetServerInfo(string ServerUrl, string ServerKey) + { + this.AssetServerUrl = ServerUrl; + this.AssetSendKey = ServerKey; + } + + private void RunRequests() + { + while (true) + { + //we need to add support for the asset server not knowing about a requested asset + // 404... THE MAGIC FILE NOT FOUND ERROR, very useful for telling you things such as a file (or asset ;) ) not being found!!!!!!!!!!! it's 2:22AM + ARequest req = this._assetRequests.Dequeue(); + LLUUID assetID = req.AssetID; + // OpenSim.Framework.Console.MainLog.Instance.Verbose(" RemoteAssetServer- Got a AssetServer request, processing it - " + this.AssetServerUrl + "assets/" + assetID); + WebRequest AssetLoad = WebRequest.Create(this.AssetServerUrl + "assets/" + assetID); + WebResponse AssetResponse = AssetLoad.GetResponse(); + byte[] idata = new byte[(int)AssetResponse.ContentLength]; + BinaryReader br = new BinaryReader(AssetResponse.GetResponseStream()); + idata = br.ReadBytes((int)AssetResponse.ContentLength); + br.Close(); + + AssetBase asset = new AssetBase(); + asset.FullID = assetID; + asset.Data = idata; + _receiver.AssetReceived(asset, req.IsTexture); + } + } + + public void Close() + { + + } + } + + public class RemoteAssetPlugin : IAssetPlugin + { + public RemoteAssetPlugin() + { + + } + + public IAssetServer GetAssetServer() + { + return (new RemoteAssetServer()); + } + } + +} diff --git a/OpenSim/Region/GridInterfaces/Remote/obj/Debug/OpenSim.Region.GridInterfaces.Remote.dll b/OpenSim/Region/GridInterfaces/Remote/obj/Debug/OpenSim.Region.GridInterfaces.Remote.dll new file mode 100644 index 0000000000000000000000000000000000000000..4414094ce5892cda811e39ccc5ed2a97101ced09 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/GridInterfaces/Remote/obj/Debug/OpenSim.Region.GridInterfaces.Remote.pdb b/OpenSim/Region/GridInterfaces/Remote/obj/Debug/OpenSim.Region.GridInterfaces.Remote.pdb new file mode 100644 index 0000000000000000000000000000000000000000..10e009638a040bdd1b91fc47e1d763be15fd2d94 GIT binary patch literal 15872 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 HE(`n*Ybx?o literal 0 HcmV?d00001 diff --git a/OpenSim/Region/GridInterfaces/Remote/obj/OpenSim.Region.GridInterfaces.Remote.csproj.FileList.txt b/OpenSim/Region/GridInterfaces/Remote/obj/OpenSim.Region.GridInterfaces.Remote.csproj.FileList.txt new file mode 100644 index 0000000000..a76325369b --- /dev/null +++ b/OpenSim/Region/GridInterfaces/Remote/obj/OpenSim.Region.GridInterfaces.Remote.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Region.GridInterfaces.Remote.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.GridInterfaces.Remote.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.GridInterfaces.Remote.dll +obj\Debug\OpenSim.Region.GridInterfaces.Remote.pdb +..\..\..\..\bin\OpenSim.Region.GridInterfaces.Remote.pdb diff --git a/OpenSim/Region/GridInterfaces/Remote/obj/Release/OpenSim.Region.GridInterfaces.Remote.dll b/OpenSim/Region/GridInterfaces/Remote/obj/Release/OpenSim.Region.GridInterfaces.Remote.dll new file mode 100644 index 0000000000000000000000000000000000000000..2f6deae433d912bd42aa8aea11a339bbfc4638ff GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs new file mode 100644 index 0000000000..ce567a9a29 --- /dev/null +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/AssemblyInfo.cs @@ -0,0 +1,56 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("PhysXplugin")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PhysXplugin")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs new file mode 100644 index 0000000000..f13304581f --- /dev/null +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs @@ -0,0 +1,301 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Collections.Generic; +using Axiom.Math; +using OpenSim.Physics.Manager; + +namespace OpenSim.Region.Physics.BasicPhysicsPlugin +{ + ///

+ /// Will be the PhysX plugin but for now will be a very basic physics engine + /// + public class BasicPhysicsPlugin : IPhysicsPlugin + { + private BasicScene _mScene; + + public BasicPhysicsPlugin() + { + + } + + public bool Init() + { + return true; + } + + public PhysicsScene GetScene() + { + return new BasicScene(); + } + + public string GetName() + { + return("basicphysics"); + } + + public void Dispose() + { + + } + } + + public class BasicScene :PhysicsScene + { + private List _actors = new List(); + private float[] _heightMap; + + public BasicScene() + { + + } + + public override PhysicsActor AddAvatar(PhysicsVector position) + { + BasicActor act = new BasicActor(); + act.Position = position; + _actors.Add(act); + return act; + } + + public override void RemoveAvatar(PhysicsActor actor) + { + BasicActor act = (BasicActor)actor; + if(_actors.Contains(act)) + { + _actors.Remove(act); + } + + } + + public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size) + { + return null; + } + + public override void Simulate(float timeStep) + { + foreach (BasicActor actor in _actors) + { + if ((actor.Position.Y > 0 && actor.Position.Y < 256) && (actor.Position.X > 0 && actor.Position.X < 256)) + { + float height = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X] + 1.2f; + actor.Position.X = actor.Position.X + (actor.Velocity.X * timeStep); + actor.Position.Y = actor.Position.Y + (actor.Velocity.Y * timeStep); + if (actor.Flying) + { + if (actor.Position.Z + (actor.Velocity.Z * timeStep) < + _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X] + 2) + { + actor.Position.Z = height; + actor.Velocity.Z = 0; + } + else + { + actor.Position.Z = actor.Position.Z + (actor.Velocity.Z * timeStep); + } + } + else + { + actor.Position.Z = height; + actor.Velocity.Z = 0; + } + } + else + { + if (actor.Position.Y < 0) + { + actor.Position.Y = 0; + } + else if (actor.Position.Y > 256) + { + actor.Position.Y = 256; + } + + if (actor.Position.X < 0) + { + actor.Position.X = 0; + } + if (actor.Position.X > 256) + { + actor.Position.X = 256; + } + } + //} + + + + // This code needs sorting out - border crossings etc +/* if(actor.Position.X<0) + { + ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); + actor.Position.X = 0; + actor.Velocity.X = 0; + } + if(actor.Position.Y < 0) + { + ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); + actor.Position.Y = 0; + actor.Velocity.Y = 0; + } + if(actor.Position.X > 255) + { + ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); + actor.Position.X = 255; + actor.Velocity.X = 0; + } + if(actor.Position.Y > 255) + { + ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); + actor.Position.Y = 255; + actor.Velocity.X = 0; + }*/ + } + } + + public override void GetResults() + { + + } + + public override bool IsThreaded + { + get + { + return(false); // for now we won't be multithreaded + } + } + + public override void SetTerrain(float[] heightMap) + { + this._heightMap = heightMap; + } + + public override void DeleteTerrain() + { + + } + } + + public class BasicActor : PhysicsActor + { + private PhysicsVector _position; + private PhysicsVector _velocity; + private PhysicsVector _acceleration; + private bool flying; + public BasicActor() + { + _velocity = new PhysicsVector(); + _position = new PhysicsVector(); + _acceleration = new PhysicsVector(); + } + + public override bool Flying + { + get + { + return flying; + } + set + { + flying= value; + } + } + + public override PhysicsVector Position + { + get + { + return _position; + } + set + { + _position = value; + } + } + + public override PhysicsVector Velocity + { + get + { + return _velocity; + } + set + { + _velocity = value; + } + } + + public override Quaternion Orientation + { + get + { + return Quaternion.Identity; + } + set + { + + } + } + + public override PhysicsVector Acceleration + { + get + { + return _acceleration; + } + + } + + public override bool Kinematic + { + get + { + return true; + } + set + { + + } + } + public void SetAcceleration (PhysicsVector accel) + { + this._acceleration = accel; + } + + public override void AddForce(PhysicsVector force) + { + + } + + public override void SetMomentum(PhysicsVector momentum) + { + + } + } + +} diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj b/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj new file mode 100644 index 0000000000..7dad533cea --- /dev/null +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj @@ -0,0 +1,93 @@ + + + Local + 8.0.50727 + 2.0 + {15B4FEF3-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Physics.BasicPhysicsPlugin + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Physics.BasicPhysicsPlugin + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\Physics\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\Physics\ + False + False + False + 4 + + + + + ..\..\..\..\bin\Axiom.MathLib.dll + False + + + System.dll + False + + + + + OpenSim.Region.Physics.Manager + {F4FF31EB-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.user b/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/OpenSim.Region.Physics.BasicPhysicsPlugin.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/obj/Debug/OpenSim.Region.Physics.BasicPhysicsPlugin.dll b/OpenSim/Region/Physics/BasicPhysicsPlugin/obj/Debug/OpenSim.Region.Physics.BasicPhysicsPlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..b2a02a214b4deb36159f66bf0702dabb1164092e GIT binary patch literal 20480 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 + + Local + 8.0.50727 + 2.0 + {F4FF31EB-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Physics.Manager + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Physics.Manager + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\Axiom.MathLib.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj.user b/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Physics/Manager/OpenSim.Region.Physics.Manager.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs new file mode 100644 index 0000000000..da3b56095f --- /dev/null +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs @@ -0,0 +1,167 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using Axiom.Math; + +namespace OpenSim.Physics.Manager +{ + public delegate void PositionUpdate(PhysicsVector position); + public delegate void VelocityUpdate(PhysicsVector velocity); + public delegate void OrientationUpdate(Quaternion orientation); + + public abstract class PhysicsActor + { + public event PositionUpdate OnPositionUpdate; + public event VelocityUpdate OnVelocityUpdate; + public event OrientationUpdate OnOrientationUpdate; + + public static PhysicsActor Null + { + get + { + return new NullPhysicsActor(); + } + } + + public abstract PhysicsVector Position + { + get; + set; + } + + public abstract PhysicsVector Velocity + { + get; + set; + } + + public abstract PhysicsVector Acceleration + { + get; + } + + public abstract Quaternion Orientation + { + get; + set; + } + + public abstract bool Flying + { + get; + set; + } + + public abstract bool Kinematic + { + get; + set; + } + + public abstract void AddForce(PhysicsVector force); + + public abstract void SetMomentum(PhysicsVector momentum); + } + + public class NullPhysicsActor : PhysicsActor + { + public override PhysicsVector Position + { + get + { + return PhysicsVector.Zero; + } + set + { + return; + } + } + + public override PhysicsVector Velocity + { + get + { + return PhysicsVector.Zero; + } + set + { + return; + } + } + + public override Quaternion Orientation + { + get + { + return Quaternion.Identity; + } + set + { + + } + } + + public override PhysicsVector Acceleration + { + get { return PhysicsVector.Zero; } + } + + public override bool Flying + { + get + { + return false; + } + set + { + return; + } + } + + public override bool Kinematic + { + get + { + return true; + } + set + { + return; + } + } + + public override void AddForce(PhysicsVector force) + { + return; + } + + public override void SetMomentum(PhysicsVector momentum) + { + return; + } + } +} diff --git a/OpenSim/Region/Physics/Manager/PhysicsManager.cs b/OpenSim/Region/Physics/Manager/PhysicsManager.cs new file mode 100644 index 0000000000..265bce6dc8 --- /dev/null +++ b/OpenSim/Region/Physics/Manager/PhysicsManager.cs @@ -0,0 +1,115 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using OpenSim.Framework.Console; + +namespace OpenSim.Physics.Manager +{ + /// + /// Description of MyClass. + /// + public class PhysicsManager + { + private Dictionary _plugins=new Dictionary(); + + public PhysicsManager() + { + + } + + public PhysicsScene GetPhysicsScene(string engineName) + { + if (String.IsNullOrEmpty(engineName)) + { + return PhysicsScene.Null; + } + + if(_plugins.ContainsKey(engineName)) + { + MainLog.Instance.WriteLine(LogPriority.LOW,"creating "+engineName); + return _plugins[engineName].GetScene(); + } + else + { + MainLog.Instance.WriteLine(LogPriority.MEDIUM,"couldn't find physicsEngine: {0}",engineName); + throw new ArgumentException(String.Format("couldn't find physicsEngine: {0}",engineName)); + } + } + + public void LoadPlugins() + { + string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory ,"Physics"); + string[] pluginFiles = Directory.GetFiles(path, "*.dll"); + + + for(int i= 0; i"; + } + } +} diff --git a/OpenSim/Region/Physics/Manager/obj/Debug/OpenSim.Region.Physics.Manager.dll b/OpenSim/Region/Physics/Manager/obj/Debug/OpenSim.Region.Physics.Manager.dll new file mode 100644 index 0000000000000000000000000000000000000000..a986fa4000e04ca27092a4ceffbbfb03888b40e8 GIT binary patch literal 20480 zcmeHOe{dZ2b${R8ySIvx+Q@!rIQ)8bV6t7kZCdvQ<7nvX3{2MCe5Uo zj@{3DyLUQC6v(uh{?YxKefxbszwf>8&;6d*clYN>C!z?Rt5=D>j5n9<0zVj>13R(e z;1<@C_VSh{2v%xrsm>*~Pt z=uV=&N~dRD`_*0b*50AS$^|M;lm>+#lq*{S(s;JxAxcWU!}psB?7x(AfS_|hTp$Ax zy#8*mMdpuScZ6%(i5}%d%q{m3wSks~T=!hw2jOWVM9?U4;Gb+@L|M-~=>d=Q0DxDI z2en2?6Wy0}Tqh5T__iGtj%7Wbrm`L0XC1R>Ly&!?`|z;bc05gGJJF6NG^~ah2s037 zAk09RfiMGM2Eq)483;2FW+2SK|Dz1N!{5~?{B5dHlrq;5{d6&r66((n4r*?KsPzo= zBU|FF zX^`6D3j?7|WW?;1Ala(`GQ9vE+R@ru>?qt>X8I5h%I)W zgsT^0UD|2ZdJHbBi?Jon(?VUUon|8eby+~YRy)l$18TQ(L1cOOwYK(?(RV-MBbos& z0x`}Z#z^0UrkzIOBYI{HhYy-|hVdrG_466XNL>TM+8M@0!)J)bYzFRc>Kc&I&M+<- zK0`ES7(9*?Er8Q-C`s;Z@K+*P?kBac!AC1eI?JI5KSll2SJ(X@9@@hA%+xc~>i37= z<{Uj~3-Wvim88Y9+iB3dX6WLC0Jysru45qAeQJ?-_Px#_R-9=~NNu=wp6|MK4<67TD(CQ6}D#5}a z?TPPEx(;oiKkB|&kn(+NH5ThnSdU?Fsf&j1Vjn!?cpJI#bB1K>lw|A}yM2cWRz;pp zCpKo+XE(3kvT+L#^mq~QDI}uzEGlSpH4@)D<~de*64Mws7O%g=($#zC7`=nli?8Q; zci%ZYg!hkt$1!nwcNFaj7DfT84lVkNmKId#XKE7#Yw{|fJjM_|p-1ReJcwCnOh*&E z?#O*8w~@xfv^t&NoO%Ck(7(}TEMh+vxKbI)px;zXc@D6ZE~|e6Wn&~AG3frt9>B9w z|22VsD)0?~mjzxGxID`8w+S?(2co;FhQV&oA4DIG8uYgUJB-VepgqP0BSB*VZ9s#b z2Hl`93H)c{>!AFrz<7*pE{ieuu)t3V{F=b!@yimI9~JkLLWbAUR`d+lp9Oau80VEK z9h4WIhCC`LJpil)mfHn87hp-jJ{Mq%=sfhE6+MHNij^0DrJ

-d_o?1yG0N*U(x9 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 X=p2yyo~YSOZU>EHyXl-8#5M50pmkhL literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/Manager/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Region/Physics/Manager/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..3be2bb797621149e16bb4eef17dc4acf69b4a852 GIT binary patch literal 11518 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 EFG*{%H2?qr literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/Manager/obj/OpenSim.Region.Physics.Manager.csproj.FileList.txt b/OpenSim/Region/Physics/Manager/obj/OpenSim.Region.Physics.Manager.csproj.FileList.txt new file mode 100644 index 0000000000..bc84e5a353 --- /dev/null +++ b/OpenSim/Region/Physics/Manager/obj/OpenSim.Region.Physics.Manager.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Region.Physics.Manager.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Physics.Manager.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Physics.Manager.dll +obj\Debug\OpenSim.Region.Physics.Manager.pdb +..\..\..\..\bin\OpenSim.Region.Physics.Manager.pdb diff --git a/OpenSim/Region/Physics/Manager/obj/Release/OpenSim.Region.Physics.Manager.dll b/OpenSim/Region/Physics/Manager/obj/Release/OpenSim.Region.Physics.Manager.dll new file mode 100644 index 0000000000000000000000000000000000000000..ec3d1a8c9e69a5bccd9c09f3a64b83d5700db06f GIT binary patch literal 20480 zcmeHOe{dA{b${R8yS9lc^%$S*s$NnQt({bBL z(<%MDw|l3P>$x$rBmjm-yW*9_By53FH=b(6BK?>zIG3QiKh<_QJd742Yxew{g-kH5Ogkx3uGXI z*WPuu$P{6BlxuxNALm3YE)Ns6ET+8|+$2H-^^yesp*lvC^{op&@NcXI0IwDgYV~3g zJ)CttHxG*V)`tqm(u1d=^uhbAYZV;`imwlY$#P&c7N7?j@u(hUAj&|LfhYq}2BHi^ z8Hh3vWgyBxlz}J%|9>*@41ZUn@VBW(aaw^7^AoFxlu&4Cs9{UJE}Fw6{tG~ z>x%ShcO|4dM6TIbr9W$kv{3a7c+DPyX?_$w=(Ja2q_#{48(9tDJ_zm18q}H%cbes%1;7mPkIG!S#WW>^RYqOnlPr{XsYM+0HE9xGF#_w~MCJiC24UReOBPFSo_o z;!iJ2I9(uZy)WV1f%mop3D;vcopr!kl3RO>gkz%WtOv+!0PtZ?Yi)AkXmC>yYm<`z z(&TIedqqoIyyHZBye-}qgC|d~Xzsov%&r@}HGNj&l*eXaDW=6|;d%@Xv%e?cFA~|- zRZEk51>QVsbZ8e@=Lz_zo;6mxpBCyG?IN29scS>(?b=1Q7*adkYa*M$Xld?#1Q8I; z1Fsp5UqUFc?kP>Xh~A3nnL9a3(6m{`8yK6GG7xx81H#%YI^t59$50N_8QejDqr^^P=}L9XM39+h0n z=yZRdd%c!*9-JAN&0rL;8Iea?8su+6eszOmwfMQJ)zE3*Wo9)T&?%C73 zhbeI?0v6H78y_S3Hs1e?%x)a_UAsJuVNUc-%-uhO`o?49^f)FgUqx*^bZmGK?@s~$ z2J;RSohcSZ!5~x*uKZ$C6Dsr{YA1#3j|p@c9)wEBH1Se}_y|qPoh5sSp(=NO+=hvV zX*D{(Svq(d^aFZ>40>DOdSxhseorywI$$%sp}qr3Z_JDt^hoS}z{jNiI|Bb$;0=Lq z2)rfmjyTKj6X?c|#tr%{f&UnPgHp88_(?oPT>|$48Z>Eei)RI1H$Gz+^hJT+GT6@d zg}yPtGD8Bd3VaigOArb7jY3wp(SGy>*FOv11TfAeQxJnWxyMPWL7o9`en5p@Ye+XI^f;( zF|`-mA1NDfyXFCwv{_u7?r7 zu_9$Io>v>B_ZgjwpH`b1u(N7Q12zLII(=EJ1nuecN*(J3?{&fE=n3c5>Z%^^{@km80+!K4S1}F zy-qOp^IpPa5sdXt^0WxC7u6(T6ALlcTT7Gh+N6&rHLXOq(}fW00M%t^qUYUx5)_O}?OgOjb6==2~CUo@l`SQX6Q%{sBBu63Op_ zH;?@YJYJKy%(ZIzl?E)WpKQQ3=o<)IiJs>x-pbqKsV7N5`u2y4BR zx%fwb-9`T?4m>X7EJHDIU@plqWN2B4aSR!14Ka>kGpz_Qj$t#c3NiM&o4P`bz3!%U zA;$4-p-myiF>ImDA;vLmp)DcCF>Ix5h;a;CsVBgQW7tN$A;vLeX_sKZ*xgS11>;_M zp0?MceNO+A2J8j>EA^iV=HjpDFVl{?2T;Lx4xTZLX2C#n|>w4xb;2s`4HpQ_tMuwj9b5lz8zxR`aP78uAd`r zeIGRiSdv@cM=gQ{nZPEFwc>B$3}406RMf|NJRJbkX%JA+git;#^{G14=nU$*a25GN zZ1AV`dX2tgYy*7D z*r{&PzZe_nCfyR4O6*llvW~w-wp z)OC72aZzQl_Wmm1MuA%d?xc@{vQO#*0`C_%F7yxM{E)>?`#H5zZBi2|iSb6*?ReGR zuHpLvyIm)C35DpBIANr4n&H*n)_)hUtUm*IUf?BxPwJlo<(mE+;4=anWdd#>*(hV{ ze+T(^jI|ghv3F}|XDy(H6`l9$PMndF*cD>%Wj#&^8rJqWC|%gmmSYbvK-oYEa5n;K zSZ$jC?}Wb!>nTI5j-cEna5Hu=g>~;XP_o#~v9|+apGF21))|I7X(cGV0(W7r(y%)4 znc{BoZV!A>^nO4MrwQKG2jQtkBk=Af#V+y8CHiV}@fcnxU%(vKf~r78-wWRjM7qIB zq2`%T^C!^cQzV}mY5#~*s1~gc&}hXfkK3i}QES?E%Gt5gGoGFIvLm^2ZrXCQg<_FH zT1cvEEE1*RkT6!PPTS?0)^RKEJ1&hmp6#Q7W0gYAx9B+kL~HvqAv)^XR@u)r2!yu! zMfpgzSX@8|k@37$wy1#{5K3O&af|j8jn8<#Rie?UN8kjFRExfy&w2i!RkWtri-4aU zaEe6;z&kH{2o_yCPlL7)a_-E-y);>okUYwYJBKWPfdhw~Tp9M8gs=t+8r9pP>Wj zq;e>Buv`dh{TFPfgdX!xA4bsg7(Gx$lx`V;(P(*559A7k$t6VBDmmw@rS#GAq7DnR z7ZK~)i|C`}rTrTiSW2(kSjw8V{7LR>;z}(V@){B5)EXB~9bry?K98PvWtfSPhBidH z5od*=;tW3IgcVkqdcR$^N-&Za#yp0uA9CD0hLz=yI3*0|YDorXeelJ%#nkvp5w_Fbcs^7;)?o@St5*@9UeY<33 zhszjpPG#J3&)Ip)qXDOM-1h9LqBXBlvo(MbUUlDrG2z0&QqDc|4mwU{#07CT$G1#yo%^ zWACU{%w3S0H*Yq~pSbGVQ+5%n<2?7LuhL|du`XD$z|__fkEhD0d$3gTXV3{)UG1`W zzco`|zK8G+lPvCatbb+CDOxlFk;Be3;W?1Q8YRP}?D@Ge1~r5*G?<5R=eY2W9t5-w zqv1f3ms(5!ObzOHr>i^x4qnJxl0NFMR0f?A4@tHFR`he>)<;NUZPTN3xndRZ)i$PJs?#Z1PD-`4M7%CQhm#M#;hJYZY7x)7 zao?)YX^SVuNUnl~#+~AA24U^&<^8@rPcB)MBcE(SC*ahBMTi`#;ts0-%3a`?bV|4d z)L;!Udcd*H(LvE+O$%QoCSAk{XO`4$V+*8cSvO8W1z5zrSl2Ku*mnNLRnJ@MVgJHz@9yf^)E(VqZx@t2dF)S@wg`QVgb6Bgu-mz5e3B z=ik2i@9CYtQKsaJkN(o}HM?H_MABH9Zq-uh7TqKjH&r^5ikV8KfNC+5(iv1zn$cpI zx@u`@(T()-xT&em)sR)`DvjVk1XEkbpbZ3kx zZE`Ei0ovAZ!&)rKv<%ZSpy?U-0kMn$-%M^C&6-J5V}$jTYGGPe3oB+cBgv#>B8)0V zN=t#Swe!7Z`WO!DsZ=V7VA@Wmx;kOB9iLM|?TjT!nSi}pA&h*&?($P-sDwQzOrSw_+wLp-y(14B;bdt36EdRlSwl%Q8jJT31 zr6?7i18YZPN-BIxaJhr;A}6#}54yR^5vN>V2(kG(=RNhQ@V6!weV*$k*Or!N8svy3 z2OM{>Smbq@802Y|0}q&QB*wk zRb0~q?+=ECumdf)`C;-P9tEp>8XCg6p@?(CFwRV;aI)j_KHfR;dl;WF$~aFHbygeE(IGA4KaOPHk+b0(Ba5&E<9Y@fm^e?@o+hf+d3tY^U29YbUDO& z1h530|6fA|?=qs~b6-|YZhR7D``Jb3&MfZUI9oOU>L*&*!GQ+t9EPoFX<+~sDmW)| z#MAJ?hm47*BL0kqbj~XKQ_B-$|GRz#`Qvk~gEMj!ec(4lPm3a47$4llIO2X>sK2-u z-mMRUvCxkZ;2}RHjF2KSV`6l2kIeVxyV+rXq7r2w%0QHXC<9Rjq6|bCh%yjmAj&|L zfnR6_@Il*x23}rp=lTn6F)|)yAj&|LfhYq}2BHi^8Hh3vWgyBxlz}J%Q3j$6{2yoF FzX6NR{UiVY literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/Manager/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Physics/Manager/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..817fce40674fc5d4bd6e62041677d4f0df2e5894 GIT binary patch literal 11518 zcmeHNTXP)672Y0=Ry%FkD?zw80U`&SKrF8;$-+k9!m^BFgJldd!c~@8W_M?$v1WJ7 z%&f6YQWlp2JE>FwNmW7u2`^kyl@Lx<-69=5jS zJ$uefchA?SzwUFU*9nnGB)&%BH%qSpactVn2Y%=mqs+dF>lHFb?Qk(19GG>2(DloE zMlw72H#jg^@uEuL>?u2yD6qZ3fg_ci=jI=BmX7+1PI*sm$7pe^xT`okTo~J7kJ{aQ z%$AnDXJ(ed$SKW4cI2>@RdhW^SzWhOZ)GNZ&vWt-5QLcncDNAPInN!yD(+vBR}Y=4JS3}mrmJ%6ZEmuNx$G63H;M;!3k2lFyo$eOpGW@&e~qZ2@{E~ zu0(hDhE%I(9jy0tM+?jcoBIFnBfIbKB`UcA(lRN!A^NB#`Jvc8IX*X2nRh)ma^`Yw zdG6s;PI<;HWu^kVGdg69_1koxEodcvZ!tc?_#DAE*t z6#Wq0yu0m+?AkU}XBNHO>)By6?HAml>lAwJFmy^eZ|N``+gotp=YmttyH3~}=ItnQ z0=5kkrkUJ0xcWge3m{P;Gof|yz?sM?bIFjUnYA=Heu7Q-Nt{3a&+N-zp0}=pZe36D zEeJs`aKMRAU)!+l=eU0Zbn8Znn;^RBp#P6E3}fxiP$S#=(O1Jnelws-DL9*IMD-DG z#s%x!6yJdmoaoqyZ{e+5DQ@F^av*m9ySz0(u?3==4qWrBZL&jsMpJe;69sO0zDwLz zTjGy8#oD$Mn|qGX`W{5`c8JHDmq~5Su57Er*i=V$?YuiPvU_y*=#_WZa>es{NQeYC zOg_(C^YE-Y(9GHj(N9*f2ogz=?fX!YKY-XDTe)$>R}}~pRB}^6CERsDy%Wv)$!!)v z(kPU7L6L%7QRWY!B)35vXma^_fs=v?I5&)S03Sp%Ydb}TVhEz2jAjueu>!sWN^%(D zf8%Ygi)-=r2%7hEU9ku*C53VnitHJHycUn_M00D5;%HaD%# zdJ-e8dvO08KFM*2F(!iJLqkK8<3sfqa(Aqea`6MGE-u!*VlKn@d(FTNK>8ajx`}Yb$51%FDq3#k z3f_aNCbw_}?;$9cW5yxeS5T*+tdkjs(Nz2eP&k?9GK}|Y25tcMpJ6p%zXxLlHe-vz zIRmA?iGb2Nit7sBV^FqV%9TwGl{;tAMEs!!#axE*ZVcBuI31u?us4-=stft13xTeNqLs=o^w*X~h?A1V8F0LtfC!t&tUaXOF^&+Z^U+VCF5rg-t4)2v1JVq`B?-Ud% z7{iqLlrkC3lo=?KaZQ;a%{2El7Q^K3v?>lTw@7BE?UR0hFSpDu_4aLLA9YTVj7)@iF~6LF(XWHsubq^0A!X{1txhft<#X=f<|6(UNfY4 zNoVqlH727CA{Zk>hcxPazdh5eXE4FZYBndWAH%3p<|oj^a~ey;vzj5rvQC+EFc|;P z1{)YN1r|dv_Hz@fZ$-SyVltq2Sk=a?dJYq;ZAH(+tn%swXyO@grJf{)V!YyM8jB%#K1N=#Sk*5jO&)r6c-6+d`XeS-SE zqOA>1lNBz+aK6Z<3D0a z>+=S6z94n()7T>J)eI@db?V%sQzy-zR8sgDAD^9@-MsTZ7X*J=VG?BEqn9*~(&JTm zq~5YBPero1 LxF9Q9Ro(Cn_BXYM literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs new file mode 100644 index 0000000000..ee10430c16 --- /dev/null +++ b/OpenSim/Region/Physics/OdePlugin/AssemblyInfo.cs @@ -0,0 +1,56 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("RealPhysXplugin")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("RealPhysXplugin")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs new file mode 100644 index 0000000000..2780188a8a --- /dev/null +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs @@ -0,0 +1,457 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using Axiom.Math; +using Ode.NET; +using OpenSim.Physics.Manager; + +namespace OpenSim.Region.Physics.OdePlugin +{ + ///

+ /// ODE plugin + /// + public class OdePlugin : IPhysicsPlugin + { + private OdeScene _mScene; + + public OdePlugin() + { + + } + + public bool Init() + { + return true; + } + + public PhysicsScene GetScene() + { + if (_mScene == null) + { + _mScene = new OdeScene(); + } + return (_mScene); + } + + public string GetName() + { + return ("OpenDynamicsEngine"); + } + + public void Dispose() + { + + } + } + + public class OdeScene : PhysicsScene + { + static public IntPtr world; + static public IntPtr space; + static private IntPtr contactgroup; + static private IntPtr LandGeom; + //static private IntPtr Land; + private double[] _heightmap; + static private d.NearCallback nearCallback = near; + private List _characters = new List(); + private static d.ContactGeom[] contacts = new d.ContactGeom[30]; + private static d.Contact contact; + + public OdeScene() + { + contact.surface.mode = d.ContactFlags.Bounce | d.ContactFlags.SoftCFM; + contact.surface.mu = d.Infinity; + contact.surface.mu2 = 0.0f; + contact.surface.bounce = 0.1f; + contact.surface.bounce_vel = 0.1f; + contact.surface.soft_cfm = 0.01f; + + world = d.WorldCreate(); + space = d.HashSpaceCreate(IntPtr.Zero); + contactgroup = d.JointGroupCreate(0); + d.WorldSetGravity(world, 0.0f, 0.0f, -0.5f); + //d.WorldSetCFM(world, 1e-5f); + d.WorldSetAutoDisableFlag(world, false); + d.WorldSetContactSurfaceLayer(world, 0.001f); + // d.CreatePlane(space, 0, 0, 1, 0); + this._heightmap = new double[65536]; + } + + // This function blatantly ripped off from BoxStack.cs + static private void near(IntPtr space, IntPtr g1, IntPtr g2) + { + IntPtr b1 = d.GeomGetBody(g1); + IntPtr b2 = d.GeomGetBody(g2); + if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) + return; + + int count = d.Collide(g1, g2, 500, contacts, d.ContactGeom.SizeOf); + for (int i = 0; i < count; ++i) + { + contact.geom = contacts[i]; + IntPtr joint = d.JointCreateContact(world, contactgroup, ref contact); + d.JointAttach(joint, b1, b2); + } + + } + + public override PhysicsActor AddAvatar(PhysicsVector position) + { + PhysicsVector pos = new PhysicsVector(); + pos.X = position.X; + pos.Y = position.Y; + pos.Z = position.Z + 20; + OdeCharacter newAv = new OdeCharacter(this, pos); + this._characters.Add(newAv); + return newAv; + } + + public override void RemoveAvatar(PhysicsActor actor) + { + + } + + public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size) + { + PhysicsVector pos = new PhysicsVector(); + pos.X = position.X; + pos.Y = position.Y; + pos.Z = position.Z; + PhysicsVector siz = new PhysicsVector(); + siz.X = size.X; + siz.Y = size.Y; + siz.Z = size.Z; + return new OdePrim(); + } + + public override void Simulate(float timeStep) + { + foreach (OdeCharacter actor in _characters) + { + actor.Move(timeStep * 5f); + } + d.SpaceCollide(space, IntPtr.Zero, nearCallback); + d.WorldQuickStep(world, timeStep * 5f); + d.JointGroupEmpty(contactgroup); + foreach (OdeCharacter actor in _characters) + { + actor.UpdatePosition(); + } + + } + + public override void GetResults() + { + + } + + public override bool IsThreaded + { + get + { + return (false); // for now we won't be multithreaded + } + } + + public override void SetTerrain(float[] heightMap) + { + for (int i = 0; i < 65536; i++) + { + // this._heightmap[i] = (double)heightMap[i]; + // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...) + int x = i & 0xff; + int y = i >> 8; + this._heightmap[i] = (double)heightMap[x * 256 + y]; + } + IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); + d.GeomHeightfieldDataBuildDouble(HeightmapData, _heightmap, 0, 256, 256, 256, 256, 1.0f, 0.0f, 2.0f, 0); + d.GeomHeightfieldDataSetBounds(HeightmapData, 256, 256); + LandGeom = d.CreateHeightfield(space, HeightmapData, 1); + d.Matrix3 R = new d.Matrix3(); + + Quaternion q1 =Quaternion.FromAngleAxis(1.5707f, new Vector3(1,0,0)); + Quaternion q2 =Quaternion.FromAngleAxis(1.5707f, new Vector3(0,1,0)); + //Axiom.Math.Quaternion q3 = Axiom.Math.Quaternion.FromAngleAxis(3.14f, new Axiom.Math.Vector3(0, 0, 1)); + + q1 = q1 * q2; + //q1 = q1 * q3; + Vector3 v3 = new Vector3(); + float angle = 0; + q1.ToAngleAxis(ref angle, ref v3); + + d.RFromAxisAndAngle(out R, v3.x, v3.y, v3.z, angle); + d.GeomSetRotation(LandGeom, ref R); + d.GeomSetPosition(LandGeom, 128, 128, 0); + } + + public override void DeleteTerrain() + { + + } + } + + public class OdeCharacter : PhysicsActor + { + private PhysicsVector _position; + private PhysicsVector _velocity; + private PhysicsVector _acceleration; + private bool flying; + //private float gravityAccel; + private IntPtr BoundingCapsule; + IntPtr capsule_geom; + d.Mass capsule_mass; + + public OdeCharacter(OdeScene parent_scene, PhysicsVector pos) + { + _velocity = new PhysicsVector(); + _position = pos; + _acceleration = new PhysicsVector(); + d.MassSetCapsule(out capsule_mass, 5.0f, 3, 0.5f, 2f); + capsule_geom = d.CreateCapsule(OdeScene.space, 0.5f, 2f); + this.BoundingCapsule = d.BodyCreate(OdeScene.world); + d.BodySetMass(BoundingCapsule, ref capsule_mass); + d.BodySetPosition(BoundingCapsule, pos.X, pos.Y, pos.Z); + d.GeomSetBody(capsule_geom, BoundingCapsule); + } + + public override bool Flying + { + get + { + return flying; + } + set + { + flying = value; + } + } + + public override PhysicsVector Position + { + get + { + return _position; + } + set + { + _position = value; + } + } + + public override PhysicsVector Velocity + { + get + { + return _velocity; + } + set + { + _velocity = value; + } + } + + public override bool Kinematic + { + get + { + return false; + } + set + { + + } + } + + public override Quaternion Orientation + { + get + { + return Quaternion.Identity; + } + set + { + + } + } + + public override PhysicsVector Acceleration + { + get + { + return _acceleration; + } + + } + public void SetAcceleration(PhysicsVector accel) + { + this._acceleration = accel; + } + + public override void AddForce(PhysicsVector force) + { + + } + + public override void SetMomentum(PhysicsVector momentum) + { + + } + + public void Move(float timeStep) + { + PhysicsVector vec = new PhysicsVector(); + vec.X = this._velocity.X * timeStep; + vec.Y = this._velocity.Y * timeStep; + if (flying) + { + vec.Z = (this._velocity.Z + 0.5f) * timeStep; + } + d.BodySetLinearVel(this.BoundingCapsule, vec.X, vec.Y, vec.Z); + } + + public void UpdatePosition() + { + d.Vector3 vec = d.BodyGetPosition(BoundingCapsule); + this._position.X = vec.X; + this._position.Y = vec.Y; + this._position.Z = vec.Z+1.0f; + } + } + + public class OdePrim : PhysicsActor + { + private PhysicsVector _position; + private PhysicsVector _velocity; + private PhysicsVector _acceleration; + + public OdePrim() + { + _velocity = new PhysicsVector(); + _position = new PhysicsVector(); + _acceleration = new PhysicsVector(); + } + public override bool Flying + { + get + { + return false; //no flying prims for you + } + set + { + + } + } + public override PhysicsVector Position + { + get + { + PhysicsVector pos = new PhysicsVector(); + // PhysicsVector vec = this._prim.Position; + //pos.X = vec.X; + //pos.Y = vec.Y; + //pos.Z = vec.Z; + return pos; + + } + set + { + /*PhysicsVector vec = value; + PhysicsVector pos = new PhysicsVector(); + pos.X = vec.X; + pos.Y = vec.Y; + pos.Z = vec.Z; + this._prim.Position = pos;*/ + } + } + + public override PhysicsVector Velocity + { + get + { + return _velocity; + } + set + { + _velocity = value; + } + } + + public override bool Kinematic + { + get + { + return false; + //return this._prim.Kinematic; + } + set + { + //this._prim.Kinematic = value; + } + } + + public override Quaternion Orientation + { + get + { + Quaternion res = new Quaternion(); + return res; + } + set + { + + } + } + + public override PhysicsVector Acceleration + { + get + { + return _acceleration; + } + + } + public void SetAcceleration(PhysicsVector accel) + { + this._acceleration = accel; + } + + public override void AddForce(PhysicsVector force) + { + + } + + public override void SetMomentum(PhysicsVector momentum) + { + + } + + + } + +} diff --git a/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj b/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj new file mode 100644 index 0000000000..490c681895 --- /dev/null +++ b/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj @@ -0,0 +1,97 @@ + + + Local + 8.0.50727 + 2.0 + {90620634-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Physics.OdePlugin + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Physics.OdePlugin + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\Physics\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\Physics\ + False + False + False + 4 + + + + + ..\..\..\..\bin\Axiom.MathLib.dll + False + + + ..\..\..\..\bin\Ode.NET.dll + False + + + System.dll + False + + + + + OpenSim.Region.Physics.Manager + {F4FF31EB-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj.user b/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Physics/OdePlugin/OpenSim.Region.Physics.OdePlugin.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Physics/OdePlugin/obj/Debug/OpenSim.Region.Physics.OdePlugin.dll b/OpenSim/Region/Physics/OdePlugin/obj/Debug/OpenSim.Region.Physics.OdePlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..a34d986e46c5ae197f4d95438ea12e14cd57fe59 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/OdePlugin/obj/Debug/OpenSim.Region.Physics.OdePlugin.pdb b/OpenSim/Region/Physics/OdePlugin/obj/Debug/OpenSim.Region.Physics.OdePlugin.pdb new file mode 100644 index 0000000000000000000000000000000000000000..32cf279bb55009384cc816c82da1985a2b9b2bd6 GIT binary patch literal 30208 zcmeI5517?ena6*37%zVWWDpgQY{Wr9VPF6eNLP^IpQ4grVU14=GgoGEn8BHgf7;r{ zvXhdCxiT`SUyXdVXtDXGd4ZW%=p_Qx}|eTJ`xW7FC~7J8jyqA!F-T zB!r6aU-C9Sj?O3|N#;h<|MyK`fi1uPBjIfQ=?{mY1x7QzlVr!9!?5c8RmK8G{-7>1 zTU}s;A&@`*u@X9GO>KcaYu$D6U0MzbBfGkM+YWLrzKKoDQ zulF|o52gQC-4DkwMvYBy8lQ@P-^lG>)UyB6{#xMpUrft%BeZhhOD#YD*7q`DJGdX2 zxbF}Z6wU-%Ybo#X4}JWbtN5%mogpbL2l~Ss!ve3q`09&ln=7Txg1HSVHmq%JYt82x zE?l2$U(vd*;iBBy){gdu?m;7w$0}}>UeB)p4 zSuNi4llnya{z{lDGoL(4Yehb0D_BiVw=xD z1FBkJdIE^wc}_^GgTC+ws#WWP6*YA=(+KdXynWMgWXQKv$MvS8&L})^CXsD-9lMG; z?prxG^svP&vqe06jdk;KIQPh2<>km0%R9PS^LStwWRE<$?EnVGr^gI}wOg0CU?jM{1Wk2C%$tLf}wRJSL=C3iEY(&33Kr+tvdfQ~P z>6x|(=TzCvuBU90((_vZGDw>(PvJY*&3yl$IA?OWV7yG+;gI2wnp-*H`62rPl zS!RPM-4>i7XI1y$_UAV@FY4%Q%3*^8X#@9}_mwG!bBgSbyd3Ive#bhx=Z1A^s{<*^ z=k4`6P$%Rg34b{c&pzg5o!@b#>Z3M(0KLwHU%Z~KHdfsk6Y2gx)92G;ZN4q0vtP(H z9q>HsHX31#es0h>{;5Xqdiq3Yi;LGcH|BGNnI+7B=>8OtjPtpE^jp*a;Pm?~dEWuz zx+jzPdPw8qHlXlql60$y{{xCT$#YP>v-lNM?M;N+Jy-% zRGVzNJ>wjgDa@1UvQIX-Q=l4(6HUH~H!Yrr%8v6?`La*7JSLm0%c(!cIi$S(r<>di zsO&$}JuS$$%(uj64i{@LSh$j`qP(3!*4p7Cob8QkbDc`p z9)H%poI}8?J}2KA!x6S_iDw=+g^KmuThV2*s#i!_+TNPyv+B&8nXD#KFe=Z|QDa17Lj2C-Iuc!0M_>Pyq=)ri9r+yW zdCDtR2l+t{^q;K!o7drj#&xPfsDsAxBS8Gl<8`3!W$SRTIyReMFjb|B`b>5qH0W60 z+O@u;E9iJ2Yjs~=Dc=nLeB7v5%{2_4wdVeO}VM8v9=P^#twJ zEq$j$(O-9P%twz2`ACnefs80UykE&zw*iG&mIw1t_i&yy7m0s1&m*C8pt^TM+jQ&Q zEAvzLDNuB?vQFg5=buxV6Ey#vP$*w@i0xW_U2-=0s1EZ&ehDjH&o|C3s)KA6+ot^d zTyJ?SGFjPA{!R5%-U<^zo(9+mwt#!UqhJ?!1&pGTP6qYh%^FlS_y5gSN%~G7_4dp!K<;WI=-EZ`bc`E%1kc{)W|0b@iJ$!#$OivPg*#Y}?*Z(%t zKW(Q8=>KEaUv^6Ae=xSHXFMtljU@a%nX-Q3Wyw~l^H$A;TTo1EKgl?s_npCg*y=#% z5x2>9)06xQ0pFN?+Vzx8QhFYYO;(v-N{=OcTJ~8lOEyWJx5_5+aW%+E#`)YPhk87@ zO?H}|>3+hzll_hBDVwD9JP@1sdE!P*dW54Q34c$etQWm3*`(yGRd#s<9akbNIp_6p z#T>ZTaaBxDlFrWpBvfJOO-WHt(BUfI@e?m9@cs}C}TId z3_6(G*m3`_b4sDE#~Lrr*X7r#??qmH>vE{NdmA*KSM)shigRxHHD0^r!F(NLC9gUz z0da23pi>NTL0WezY%sYip{na&L$%lVfaO!g3b%^e<({9`nsH7mug3>1zmJ-{%c;CL z@033S`-I6|57nCf29vMi275Y>ICqpk1KVVId&v$Vd&bZfw?Nev zw-)l~*%r}Xm$$)ZERWBbtn06~i2gKF@X6`6xZUKw0M(fOVvy&&)AFfe2UFS>(GQl_ z<4cy`ohI*kgtiZ3seD^})#UDmsx3HY3Vo{dJTm&3@@;XS<#9h$ZSi$z93MT;Bctyq zum6LV$G1$@_kHSv(HE4Ld&uN=rsPWZJKFa(VEpx9BiIHW08fIKz)%`r??&eVy;@z7`4hnsuo`rO&EP)p7~|$B)5A3P`XFs@6row=+|`NemfJ>sY9yF}Ghn%mRyO&uHB^TbJq&Cu)6;Q}Z=Ht49lw9HS-v>HF} zZ-O(Gzq#4?RR+90_}|;n8p_aq!?AB`xC^h+dW)=k+^f>Lx5BbW!e4w)_8HS5VVyGn z%Er8mt9tDqel;@UcOKbR*Bx%oGHD7m14|YG5*nY~Y zM~>mUW7)|>sLbS|+&bQFd({r;J-Xiwc*4qhkMgy^T#&8xvasRu&enBGk_{{2-vY$% zJZ?kA&0cL-OpiA7{+W*NYJJ}U+t2GXNP~rNZzSO_Yn|-%UMKGOZfN5zJ1MHulho%4 zI;;4dM|F~|8K>zwo$mJoyv`-*h4W+OtGh^>!36TT)yh`C;W3pj>(BU#A=KOD9z#y& zj2d*(f}4#iMC#1?*M`tXH!- z>j-^Y`>v&3D_c5qjm^2{&_0@zcLB*bpX{#;kV&^sVchP!J<8vQe99E$on;}g=gpqy zda^fJnd|IqY;6xZj-y_8AR~U~k&as5;gixj7X0>j(#bBBj(o0lZA*S#S`GE+?~X2yzad zEVH`1PfX|KbHPM-w}A2RFHiByjA?$Y%ao7$TRL9%8+~rr_crX=r@gN&QN==jk?JpJ z9obJ~(9o>)+y=|%ycrLuU;7+?rw)!a_GT}uwkeGAeVgxko+JO340nOWK<_Vn zt)fo#Bv7DFg#Fw*pd)#HCscdbRnQvfB~Z2DyP%r?-VI$1ZGdXtzZAL=ieK-(5xN?> z6-poMz7x6z`Y^N^`co+Vqx%=owb0)}TcCr(`}VP6KRhg1!G2ErOUIo1wdNuU#p_2PYqg$YQH?$4#AIaIA6~x13H6>Av5&j;Cj+nA%uvq#*x+9wBgd zD%AULpbW9(gHW|`H~+mAdMy+ekbDR#JA4?r2ui-)=R!XMjrz*w)dsbP?n_JpvF+5J z^xY(`H_Gq5=qo{&k6WHzhue^g>w-*JBk&mBX>QU7!u2M115|bRBvf@EJ=Eb-P|p35 z8=WwahevWkYyDd=qaIzIj zUrYW8sx}r?ACTNf?HM~IpC=wWCEK9tkGDgqci<<_z<;;Vd!Sz=J=$axz3vQR0Uu_%Dyq1%3oNF^--i3`GOup8RU$Z>!gAO2Gc2!>Y^PGh~09Cs_2ptLi zCR8KxTTr#9+9)^Ac`aS5+p+A5= z3w;#&0`!N_-$8!_&7kvR&}!&Upi`hfg>rW)c^oRc_4Fs>Y0GM$JCQy8$*|-c;x+)K z32O6;3}c~cPu;PUPuAVaX<$}ie5g(199h0ie}+D&rMah9o5uMr6V|Sco&I07mmAAqw&^8ceuo>J5b^@)T8^Jd4 z0MMP;-9UG4CxUv=0P>(e9KIINZ#s+}JoROD&UxTopgwm6eMR&GK=jgzNN=x<^xABs zzcl{ajsGjgf3xxbyYc(G`yU$rB;y}U-&Ov18UHa}p7CvQ@m*^9ZLoBu3BR-S zk6HYD%YUh*Pq6&2F!`mX|94I9+c-nz!~2bxpFMLX9-gl?zJ;a__c25K1lQB}FE+j@ zR?Z~j_r2>~mVT|t|Fg**WBe~0Wo{4oKW+7xV0_=V_+J|RuGMRprN3HB+=n{RR_nqG5^K5gj_TKT^-`UjIg%jl(+|I;RSua)z(<$H_ibC%_&4VLuz zjq%-La#hCX@98%ff1|}8Vb9lFzI7%)$Ys22mLx~yo)MK1v>!D`S3t_GXHZQu@|dm}r5 z&IextgJ`E}FdHlfEg%p2!(WyKMkW)q3=KnhfL-uDHkp))n>I^dtFB`Zj5XdC_y>eb zA$AFlXP1d-CR10G8A=}>km%w{Z<&~8GSiDP8XK{k;w3UKC#IRqjG~OjM=YneOiVMG znME0mn^;cqVwRT^(@chqkJ~`wCYIA%CZ?IptfGv@QY@!<*~!a^X(q!q)yt`8OvQ3~ z%fvL3nXNPO*p}OaOz(?MURF$xa(y~L+O)7XbFsfJXN?)kNnN0FnV4oWIsNuzEJNRu9gxH?&N^?5Gv3RJ^~etrZ^@Tc880pu z)1%yU{HT|q=`vHs=Vp?~I}QKoyn6y~{4$E?8{>=@zv=ebjNi=YC6#?K#Q9^q@#8a{ zzXAUj`0Yy=&L88AAAjlmR2Kf?7b2WL#v4Dr(sfroE6dcg(&{-qHBZR5RPJSNDafSe z3C$msdzo7bGO2k&^G7VF_dF5PVm+p(<_WF2VmZBKVw%aM<_WFEVmZC%iI`?Gsd++c zu~<%TnV4oWsd+-{vsg~=c_OBn4D*Ehaoq)q<@A<`X(p5M5sw6!zUP*hZgMFfp?gHJ ztn$7krkh;KN9c}etXFy864Ol%AK||24tzxAUVKYTH@W6w-yY4luheA;`w;-|+cDnw z@e^)CoyUc8%J`O;W-|DT^mwQ!Gaf2@+|w7FSL30A+Z6HMMqHQ0xR~!W`hbti9rWpn z)I|^1J;obq! zej)h@`cgf1os3eeQ;HqS=P}{=g&iIpe;qdc`>>uOIwWbK4=CJ3p8S_Q`Gt{KBnJPA zXZ)GD!Z$q&KQmWb_>`PeH)rPbbI!nt6ZT%_&}6%nu!lBQnR{AB?^l^|>YP)*V9|`z z=gbd9zDAjYlTn<7DXhe9Ds%g=G5b~Kf|kZk?!WK_*BOgu%$`+u#-fnjYm|Fr@;rSq z1bnl~9rTS8_N&}5l{cgojmUsgT}Ln7(%S80m(V$+FA)8=tfI?_HXZ7w*n zkF$t?!EEk(~B^jYu6Z?}ljv}cG|)<>G&>3Vska(Zw3o<8LCzVzNc()9kX zuRQgR&uvy(p5ER0{hHD=y?^Q}PrYOEdlsc~`u&nGo1QMONAazpj}Gl4O}_zRUAa)M z%jvg0`jXRccJw8u`MobW{l-RLa$8Aro0Zl<_mVx%sq3lVz3_fknx@~g@HnR~r{ApT zOHch4MPGV8x|cllI}%=wQ!h`y6_M8ip)^gu(Qs}|>XoMNaQItmbFYC@ZL4=JZnM&~ z9i(|VrD^)k1am+LrD^*9Ltk<_vv-@7%IUicZnM%feJ7zWJ@s9KzRJ`036APRPklF_ zFF6&~m!7)U-X9Ooc_6(-v8-MZvib7M$s|2=MnBTsuQTv-1|wo!74zv z)z&^?XoY!S<3v4n4Zp&8c`~)DvuWyOt!=rksR#EXz{*}-R7(T}EhD^0ykrO}c07ZIYi+-L zY5Qdz$<%g!qNOVi_ZD49@9ZD{Z`4-ZcfF2=RqwX*{ZwfEo-V|RHeYVOUVEGsHe4W`%57~tT-co7Uv*&F0={bG+ z>#xs%!W2dMj~c$wT4N+mPFQ)*_1$7%?5$XK!8m66r~Tfpf?pWL!MSlFaX;-+fC{0aDb8}0w-m?x?=h|8) z=7Wpo|L5qA-72EeTS#h9wPq3>(C~@JNo+KX>Du3%Cx#- zrDWMwz^BE4Gu+8oWntb zHrQz9DPE#|FeYbaeJk&ipJSG|2fq$1K&(V3MH35ag|>!7Gk)v2Apm;DtDBFBT5Z!0 zCftHmw0NP_^nG5=*|UdfX{`lLD=ly*Z*jlX&znKOJ^1>Hs>av!Ui+ZT4DEBl*dtA` z|6ITwpc+6jmgDfmlW@UD`R@Iep4YBi(Ar4X+95hfFsvO5R<>RGZ2~v z7SUhzza3rcAnrgvGA8=}?NzVB|4wwRhuA=(8IN1`8rw`?UVqZ`Gl6G0r6#sH#OxF= zhUYAjDRI*7qDRIzlGqi3aDf&2jgh6Xf>W{W1hS;ypyQ)1dllLya_dBv(HIgdl7BZT z@y#So9BFh079t*?cn3#@293doQ#*!kOlKl+Y@Y}k`M8O|?;$s>i$o_dfX1-xBKmGp z;`fr+7dej6h?m5?B2*yhR&uNKY)jopvt~(vz+|NY?Z8iT9A$f~sP)udgpX+E=|X z`{?@Xlde>)mj&ZqQ7NHoDe4!Q9U^78VP+fgFp33jm|WSfVS3a# zGOmOMbx>@-kcE69ZuT=NSm=D%AW{+bs2JH*H6IaXH%YOIousUZ(5bGC(QhL1U8HPp z6nVr+M7x`Yv!5seY^FL##*d*v9Te>kWYwbmo{WWP!KEVFePSdyRD`#ml+D#7*XL1P z8>c}c-bYCpZ4~eIXAuiHK>qA<7_&M@#-+#tzLgj7O=JO}Q?Y;vQgjAl73N`Kf?|bv z1ZF!99a>DqVY-HrP}9Y;6Xw&dM_-nMFY%tCWvBRA3&j|Glhp8y3b)!+Ky;;%cWjls z>FNu~dy+OdS@!d;XInX4J4z;yuWM5z+1CLi)-xO$v4_PGQl_L*ep>{A(6pUAjUanr1V zW(9-hDca!pe8H+~*&1X{k;XojP{KZv44r*QR;>*9fDDuY@1$^$LNc9WE;Nc>Df zMS-x2suheXP8%#yQIX7fDx!->Ved&$V(&_Z&fX!bhO4*9Silu3M6?(~i6`UgGF@?h zr3qK4+g5S4f^lWj21~dqlR1wol+)}j2}&vF1wEPc^_M=7s literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/OdePlugin/obj/OpenSim.Region.Physics.OdePlugin.csproj.FileList.txt b/OpenSim/Region/Physics/OdePlugin/obj/OpenSim.Region.Physics.OdePlugin.csproj.FileList.txt new file mode 100644 index 0000000000..d07a072985 --- /dev/null +++ b/OpenSim/Region/Physics/OdePlugin/obj/OpenSim.Region.Physics.OdePlugin.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\Physics\OpenSim.Region.Physics.OdePlugin.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Physics.OdePlugin.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Physics.OdePlugin.dll +obj\Debug\OpenSim.Region.Physics.OdePlugin.pdb +..\..\..\..\bin\Physics\OpenSim.Region.Physics.OdePlugin.pdb diff --git a/OpenSim/Region/Physics/OdePlugin/obj/Release/OpenSim.Region.Physics.OdePlugin.dll b/OpenSim/Region/Physics/OdePlugin/obj/Release/OpenSim.Region.Physics.OdePlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..822873bf0c2c0f011f3a1dbd2bb34c8de00f61a1 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/OdePlugin/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Physics/OdePlugin/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..cb5c6886df9358449fe7c8f5da0fa019d435228c GIT binary patch literal 9678 zcmeHMTXP#l7FNq+Su=6sn9D995S&eR7l;`Y6ldoBfgU# zb7mqx=!ln-9ra6Roj?YgIq9gMmlJ_M=jLUQNee~c7JMVcJ zF6xfak*Uc_(e>O&PAP@6vOMXQ?6JTp$*29`418A(eNU<(eB#y>L$oTp? zFWKWxG<(FIR`Xa?s~ZM}k6x+9r41~f?O1H#aaqKE+7q+$p*s^|`m$4$0jJ+gM{xOO zC&@;VO(b0;n@PGs+S$A7ijdkhR)Z5=+vz!BH16l!f-Cc#P8iD4v^Reg&g#rdSeBRN z8CQm#;fxbSGT_)SWf+-_y~`goISb_E?fu#m2cL;#ndgMiwAV7=(Z@K1pVT++Y}obJ z9~RAPz?;{STn8fP1ui(X_~`e!*U^7Hc=J~zzXlO>km|3Ezkyv_NN!|5eV6Fp%C4J8 zZe~B-n&{ugu3JcYKmB!# z(Q#RbPkzGF^pv?1B=cL4Kg7pkDNgmu}w(O1Lsw zDCNIIaDtAW{w5H z0VkB%TwE_~$}x}c_lkbtMzf_GlH!;jAlF8L?_HBa81u_TJ`VN6gyRO+*XB@VLgY>} zWzT1FW1dqCyVOKW<3&eDO0=ogkxpkf#j!B9VyIqVlnZXL5;&}jYS9t7tH#bJjJ>*1 zJ649_6-&Ekwf4mJCp^&L0eVJI?n!6v!tQm%LEbV)ApH@a%-tY6SS^n9_4SR8^wlb% zK9nPUTB&5-14ZLI6uVdF1*V0LIo5!=Tq@vst^kkl%UfLTJrI3#8BQ824Q!!am| zf8nXzKw|;IKVtzMu<&z8bqha(uw)@~kuvFo(qs-&COrgZV}qIR|K=I2Fu2o$1-Q3r0jLUj9ki{m!C!X_eqQw z7xV?Zl~}-=`U2iaEPx3}Ex-q338o??o>d}~k`kYy*u^l#mNpoEmIZMGKV@>`&XazC zFSpDu^~P=Hj>|chFA*G@MdLT$^=i%Fp>DQxmu{sy6bo^>3$Vf2QaIxWo;z)sAw(kI zG9ys&XAQ05Pnuwf^Ez}FW9VWG(8$ovmKF@qL?i<++t*eq^&`+`FzU8&rEUb8vy7U@ z25Y!F2eFE)XTgb=H7JRfG{F)t>bQDA$Cbg{+yYG#gJuC6oT--hmiYpNDr8;+C!W_( zBA(L(OFXMX=9~_hE>>)8X~9a2p@=P!;#gj_P}Rh!dIcM-g`!1>Ra~71C+0LLiHasz zBGPdcCUC`qn=LI^LhC6`{S0ETE^gtfiE;HRHdw>eYY?lrdL5kbH7JR)CRn1Rr1~Y*;}CdBg)z8|Q_;P;$ z__U6qe-K5J8gRsMO|Zm+I*KNA6m{{wino^OFV0P!+_LAV^MdzQ%y0ZNwcfgT1(8(c zRYXHozIrBA`3l-lb#a9%-zplavOrAE%0jWBDsz5PmASv6D#LhEmEpXhD$gxjTJYRb YrFJjJU)j32DQs!MP0>|qS9cr!2hHp&Y5)KL literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs new file mode 100644 index 0000000000..ee10430c16 --- /dev/null +++ b/OpenSim/Region/Physics/PhysXPlugin/AssemblyInfo.cs @@ -0,0 +1,56 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("RealPhysXplugin")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("RealPhysXplugin")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] diff --git a/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj b/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj new file mode 100644 index 0000000000..77da9080af --- /dev/null +++ b/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj @@ -0,0 +1,97 @@ + + + Local + 8.0.50727 + 2.0 + {A6D191D8-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Physics.PhysXPlugin + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Physics.PhysXPlugin + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\Physics\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\Physics\ + False + False + False + 4 + + + + + ..\..\..\..\bin\Axiom.MathLib.dll + False + + + ..\..\..\..\bin\PhysX_Wrapper_Dotnet.dll + False + + + System.dll + False + + + + + OpenSim.Region.Physics.Manager + {F4FF31EB-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj.user b/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Physics/PhysXPlugin/OpenSim.Region.Physics.PhysXPlugin.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs new file mode 100644 index 0000000000..4c82549e51 --- /dev/null +++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs @@ -0,0 +1,425 @@ +/*/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using OpenSim.Physics.Manager; +using PhysXWrapper; +using Quaternion=Axiom.Math.Quaternion; + +namespace OpenSim.Region.Physics.PhysXPlugin +{ + /// + /// Will be the PhysX plugin but for now will be a very basic physics engine + /// + public class PhysXPlugin : IPhysicsPlugin + { + private PhysXScene _mScene; + + public PhysXPlugin() + { + + } + + public bool Init() + { + return true; + } + + public PhysicsScene GetScene() + { + if(_mScene == null) + { + _mScene = new PhysXScene(); + } + return(_mScene); + } + + public string GetName() + { + return("RealPhysX"); + } + + public void Dispose() + { + + } + } + + public class PhysXScene :PhysicsScene + { + private List _characters = new List(); + private List _prims = new List(); + private float[] _heightMap = null; + private NxPhysicsSDK mySdk; + private NxScene scene; + + public PhysXScene() + { + mySdk = NxPhysicsSDK.CreateSDK(); + Console.WriteLine("Sdk created - now creating scene"); + scene = mySdk.CreateScene(); + + } + + public override PhysicsActor AddAvatar(PhysicsVector position) + { + Vec3 pos = new Vec3(); + pos.X = position.X; + pos.Y = position.Y; + pos.Z = position.Z; + PhysXCharacter act = new PhysXCharacter( scene.AddCharacter(pos)); + act.Position = position; + _characters.Add(act); + return act; + } + + public override void RemoveAvatar(PhysicsActor actor) + { + + } + + public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size) + { + Vec3 pos = new Vec3(); + pos.X = position.X; + pos.Y = position.Y; + pos.Z = position.Z; + Vec3 siz = new Vec3(); + siz.X = size.X; + siz.Y = size.Y; + siz.Z = size.Z; + PhysXPrim act = new PhysXPrim( scene.AddNewBox(pos, siz)); + _prims.Add(act); + return act; + } + public override void Simulate(float timeStep) + { + try + { + foreach (PhysXCharacter actor in _characters) + { + actor.Move(timeStep); + } + scene.Simulate(timeStep); + scene.FetchResults(); + scene.UpdateControllers(); + + foreach (PhysXCharacter actor in _characters) + { + actor.UpdatePosition(); + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + + } + + public override void GetResults() + { + + } + + public override bool IsThreaded + { + get + { + return(false); // for now we won't be multithreaded + } + } + + public override void SetTerrain(float[] heightMap) + { + if (this._heightMap != null) + { + Console.WriteLine("PhysX - deleting old terrain"); + this.scene.DeleteTerrain(); + } + this._heightMap = heightMap; + this.scene.AddTerrain(heightMap); + } + + public override void DeleteTerrain() + { + this.scene.DeleteTerrain(); + } + } + + public class PhysXCharacter : PhysicsActor + { + private PhysicsVector _position; + private PhysicsVector _velocity; + private PhysicsVector _acceleration; + private NxCharacter _character; + private bool flying; + private float gravityAccel; + + public PhysXCharacter(NxCharacter character) + { + _velocity = new PhysicsVector(); + _position = new PhysicsVector(); + _acceleration = new PhysicsVector(); + _character = character; + } + + public override bool Flying + { + get + { + return flying; + } + set + { + flying = value; + } + } + + public override PhysicsVector Position + { + get + { + return _position; + } + set + { + _position = value; + Vec3 ps = new Vec3(); + ps.X = value.X; + ps.Y = value.Y; + ps.Z = value.Z; + this._character.Position = ps; + } + } + + public override PhysicsVector Velocity + { + get + { + return _velocity; + } + set + { + _velocity = value; + } + } + + public override bool Kinematic + { + get + { + return false; + } + set + { + + } + } + + public override Quaternion Orientation + { + get + { + return Quaternion.Identity; + } + set + { + + } + } + + public override PhysicsVector Acceleration + { + get + { + return _acceleration; + } + + } + public void SetAcceleration (PhysicsVector accel) + { + this._acceleration = accel; + } + + public override void AddForce(PhysicsVector force) + { + + } + + public override void SetMomentum(PhysicsVector momentum) + { + + } + + public void Move(float timeStep) + { + Vec3 vec = new Vec3(); + vec.X = this._velocity.X * timeStep; + vec.Y = this._velocity.Y * timeStep; + if(flying) + { + vec.Z = ( this._velocity.Z) * timeStep; + } + else + { + gravityAccel+= -9.8f; + vec.Z = (gravityAccel + this._velocity.Z) * timeStep; + } + int res = this._character.Move(vec); + if(res == 1) + { + gravityAccel = 0; + } + } + + public void UpdatePosition() + { + Vec3 vec = this._character.Position; + this._position.X = vec.X; + this._position.Y = vec.Y; + this._position.Z = vec.Z; + } + } + + public class PhysXPrim : PhysicsActor + { + private PhysicsVector _position; + private PhysicsVector _velocity; + private PhysicsVector _acceleration; + private NxActor _prim; + + public PhysXPrim(NxActor prim) + { + _velocity = new PhysicsVector(); + _position = new PhysicsVector(); + _acceleration = new PhysicsVector(); + _prim = prim; + } + public override bool Flying + { + get + { + return false; //no flying prims for you + } + set + { + + } + } + public override PhysicsVector Position + { + get + { + PhysicsVector pos = new PhysicsVector(); + Vec3 vec = this._prim.Position; + pos.X = vec.X; + pos.Y = vec.Y; + pos.Z = vec.Z; + return pos; + + } + set + { + PhysicsVector vec = value; + Vec3 pos = new Vec3(); + pos.X = vec.X; + pos.Y = vec.Y; + pos.Z = vec.Z; + this._prim.Position = pos; + } + } + + public override PhysicsVector Velocity + { + get + { + return _velocity; + } + set + { + _velocity = value; + } + } + + public override bool Kinematic + { + get + { + return this._prim.Kinematic; + } + set + { + this._prim.Kinematic = value; + } + } + + public override Quaternion Orientation + { + get + { + Quaternion res = new Quaternion(); + PhysXWrapper.Quaternion quat = this._prim.GetOrientation(); + res.w = quat.W; + res.x = quat.X; + res.y = quat.Y; + res.z = quat.Z; + return res; + } + set + { + + } + } + + public override PhysicsVector Acceleration + { + get + { + return _acceleration; + } + + } + public void SetAcceleration (PhysicsVector accel) + { + this._acceleration = accel; + } + + public override void AddForce(PhysicsVector force) + { + + } + + public override void SetMomentum(PhysicsVector momentum) + { + + } + + + } + +} diff --git a/OpenSim/Region/Physics/PhysXPlugin/obj/Debug/OpenSim.Region.Physics.PhysXPlugin.dll b/OpenSim/Region/Physics/PhysXPlugin/obj/Debug/OpenSim.Region.Physics.PhysXPlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..6cc433aa4d3164cc5fa602b0638974e38b0ad4b3 GIT binary patch literal 20480 zcmeHOeQX@pai872+dCaUq&rfg6#3(5i8f`HXG-!%CB+FTQnDC{6vdNC*0{N}wkZ)V=Sx9|2&BM(1K1`$PYz56cFCEU663%xOU z9M!G2zT8T`wc+*7OWLv5J5SErUb^Bsb8fDb&gaTy$4}2%X?LNVw#(_E2;z5L~_2s-?~6q4zj*{Y0PRKwMj9h?*gbquou{*4+rF(Wjw44t%5mXMAhX2mawU z5Y$!u0aq(&qM3~Axp_#$wtg_|OCPR=(huu1u2pof7S3~J1I@kb1HjF?R zfiMDL1i}b}5eOp?Mj(tp7=bVXVFdmkMc_O9xf+E(o9Yy$Pu)SZk|feZ`u@qCdUq>P z0v+$9wmyww;Gio>9f=+?S*Fu2$aI$J%czR9U)8o;)tX|xEu?!Uk-5rJRT=am(ba^0 z_=uh)7Y!;>lfW=!K<6mxxai(S48IEX5#7UQ;KV9=MD+Gmya|Zt-S7;y>D?)=i9+OV zhN|v17VG*lOPqGDgB=mp&Gvo_deJ>eDZ09OJN!wJv5bC+)h!?lIv8wK0H5d+s~-T- zmsyMHpi6?yGMi$CgO>;xYMBj;IX5$iHTO{bPI%JRXV6b$ELicr$4Y6+G%eC#8bIAN zfNM>QIk&KFY1r1RFLR{g&aG@yyrqXWz<wdB>w{!IFrGk+<`ZjG&Tz;P*h#!uGN?>nX05Yzby zaR|Du8H;_W+rvoNgRz461u>O%%YAuG!^I?Z_d=y~t<^R7z)`5{WyA{x|9H)O6*^#6 zb$auBt%N#LmKF#sotytZv1+Nmc;3Z5wcah$;3`-)nz5Yix zedE+Bv)q#J4ed`=JLtnip-^}{vyLl4ob~94Bd@%cwgBn|of_Tx{J(<4DJ$?7>!GQc! zD1!bQvSY_%LB^{2Kv^$!Nnsh?wQuHZ|^;~pC z>!3fC+PL`?+Ux~w#po+C0Ycyj|81h(bUz|eMKeHH&*;N-XMmE}Yc~oyC#Z$eK>seW z7}jnD|DbjU=#+LB=r1AEcX^!@j zTMa}Jng#u>wgC~;sG?A-wgu>-LLJ(6px;&KR_S+HP*qF1lTf}zm$UOObL80G<&L(

cMqqEZ(6mDA?G`F1#NKw$ilD&T4tg@E6K}WD z1%=q#U|;y?xb&j<}PJblAnfzGvkb>u{j z4DE|#gZlId;g^J-7kWYH&k21-=&uTWLFjLQUZih;{yO~uXe;zFZ5G-tbequK=vL5oqbd43;1n`w(%aJVcx!57950bJ{!fCG!lOpkD)hN4z*e7lmgpPS96` zXD?3Bi{LZJ$OSD!JB0QK-Al`m91wm`=ux3rk$;q)Ms1#+0X;)s(0-G?Mz7NM=|Aaa ztw+08>(`EIliG|{#J9p4o+_8g4iGgp&jB8jkOgpes=vX66w_^2c$a~)XKY-P)BjQO&ZUfa3gEsIx zh2De-rXJh6W`XgtSFL|cHFzEM~8!4aphP_#Zo$17GjYnL+P)|~B>Gh_2ho}KsP zerl|^FlU!Dg<_FduJHe$OVB)yX5&+iH^@c zV&(n+PWwo%oSQ@cs=ZZ1tMXwb2yB*N;78pAfPuX4xHMe~gc(7@W!t9*EI*Ke8O@a} z8nV5L<5|kG%%D>&!ZgIk%RB&|Tsu$4Y|o$BP1E_RXC6&g;1+K4mOVG`kK`(Wv(uAq zu2Qkw=^@82TYex^G8$b}c4vo6+ba8k z6Re>TbG_JH^)hSuYcRrm*m3j73(FsIN>H>=q7h63JyO<1l6uLgXa{AU+1=fN_{j4zaZyJTgC%kbN&WG(ls zowqz1bV?JpXU`U`dY7uML1fB;d!34tE|R8{bI)9-k5gH4Inmcwjk(xd^4F<=4V7GZ zX?>4Dr+nI;TL`jief5y##HL9pzsh4F@|NhlUPYety2XYXk`mYkikDKi8u}i+M|CK-STS z<$2hTslM02mg-hg+Y{+*uDDqf&JdNv^}*##J#%kJ2J7(K&u} zwT+X7(;OZ|G!L1F;Lt#p3OGBYaf)!I)(0&B_u?v(gZ_vr*%lNt>s_1*JgrSQg^A9>>7{@DGqM+PYVwR2Mw+wOkrf?=kb zjWlVv^hlagEnr$>=H}F9EwxGA+YR&PW;EP}>t-{prIM-6Xj;QPp4J(pIwOG1EJMR? zys0x&ow&MmQ`b$Ar@FX_3=#B27fSBpF3DYyZi0$#V07vg)xF%jRjNP6Y}|-xdNih| zT6A!&%D~{(9>HteZ4p8Tc0o++N|v~D8^vQrvXt5s*xH*cB}<7|gm0;KmeJ|%~>k0(ne>yNWzxW$ZACp34OFcb_6SJ{AF z$yK!HnV@!!HjZ1lqMTAHa%#alHGJ(LwP5(TeMFu(XJ4CtmIB+(k5=9m+oU7aLALa&l(mmBVkp+W-8ycMQ}I?w`uyoP-r`O{vq# zRB)P_QqOj|tJBkzGyBMtY(CY-H#&M%3bS+><5$ZS=F?TQ_FnxCCy-7LI_^-hIKmHl zIcZsz9OSt6-7e_h*JEJ`BM?R)j6fKHFaiw`;P=^tw;c3%gAgn~KILcU>*U<-2(DB8 zME(3wRHfg*wr+gD}QqF8;ocfAr$>%x;ZG!Sr5U9ay~pzkFm`bu^sgVENil5^LvUNaka0|7&OE zz2@YI=ommmJ&aaD#uO2uG_sXHMbu~az4RcAVF@D;Mj(tp7=bVXVFbbmgb@fM5Jn)3 zz>hZqeZg-H|GD8^^N)9cP+J&*Falu&!U%*B2qO?iAdEm5fiMDL1i}b}5eOsje;tAU E0#Ig%z5oCK literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/PhysXPlugin/obj/Debug/OpenSim.Region.Physics.PhysXPlugin.pdb b/OpenSim/Region/Physics/PhysXPlugin/obj/Debug/OpenSim.Region.Physics.PhysXPlugin.pdb new file mode 100644 index 0000000000000000000000000000000000000000..63116a03dd10a710a1f5e4d8dbc7f029a545f818 GIT binary patch literal 28160 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 IuTu;BA4zj})&Kwi literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/PhysXPlugin/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Region/Physics/PhysXPlugin/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..845ddc36a9c7149d25c40c8d55d29323d88a4bf0 GIT binary patch literal 7673 zcmeHMTXPge6rSEpHanA$O%N0mF%eKOadJDZF@lQh8GJ*(!g46OQn-Nd(QMZ-KS4~ zeNIoJFhx=RqlRy^rWlb^6L!Y;0xuUD`-`@dHI7@snV_@n1os2mb4PlOZv1q%jTW7- z=<^Ym7en82I@>0TX~)hy&gYJMXSh3(?(WMC!QO@=$0eNV~nFN({93owL1y zF=2%>hwZdb(@3qimLF3*Pn%+34m%T&oonT}54#quMl4GwMiZ-S0=JGxJ)U*k6b&6? zWh7vrCdUfG2`_8sY@Thhf`Av&&fF0SL{pYiT(aEF*gR+oGFBLJAGU#_s_}K5*H4t1 zp-s;k`=lWbo(s7Phyzu|N(`QS3MTj{J1+m$^V-!5S~Kxl5~PI)!`iW6<-7MAJJ8=s zytW?X4k8R;iS%zk*G7;#(T|9U{(n2wYp}lyU7J8Q6RF2^D_&!>70ByPSV1cEZ8u-X zww3@q#dD=Y7m1WOc6Za1@q37ztcl3Qq|rkuqj#vk*XSMW+ueWj+~F1-rvc$pkPa}P zy5i+&TgXhimq;u20F5E+Vr#Y%6TgqhRJFr#o#TV#c+c*k{=sEBj(ru5!}(iqyp7CS zfeSPSCp#VJBl0qdKXGq+#GYPe2^3aE!wk&28Gp$))0#&noB3U5=BF^5L)wZQcWy#X^EZ3is|B(n(nLy5OB0RD9F511#HB*+ZJw*L4&?nwOWB?bD z;jXT((c!Lg74D)U*;R7@6h5t!Ow~W>W_4?kLfU9JiwlQoDhYL-fc^&!h5@NZ(ba3j z-BzfgGl(?xJB_)V2u4kjS#^d?D-M5;5Rr3**egWjT2U?fh}lpr-|AXFb&04C5Yt^N z>eXyTzz4~ST`k2(ohRYfl0Y5g;4dU0XmFnWObk}L;CmZA63#v%G~0;^XZH}ZE|O?< zZG@f)FCQglS1m6iM#8JPALR1nMC7ejush-uEOdx`!+)+&dsNkzIv* z2Z`BQMq%{~t7~JVB>a7hnBiLf-gp$TfJ0=@u9SRM=SjF6S-`jQ0=|hX0Et#CV1gK( zA>|73h!Bx{g?JQV5{C~hrs4=)m#lCDjGGhIGoDXhwu>+EilUiQ{H%?u8*CHQu+M0h z>C)7ar^5(fuC}xuTTAOy6iaD+k~TO|2r{1U*lArmMk0`}Yg0to*AiOUSCXK!FJoDN04d>XdktFEsLy{`jfDcH( zHGpiWFyiKc7Gryf%D57biKw_Btl?@E8AVCF|0U=XyK;W|#OD6LFEYFbqP~fL)6jRhC2{YM zs^b1%Rn=Ugdb*Y>s&jNyROzatBH>0=k$9`B;)J2a7)}^e%C8rAik3w9&|(bXlU4A? KkXI~4Y5X4~roAly literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/PhysXPlugin/obj/OpenSim.Region.Physics.PhysXPlugin.csproj.FileList.txt b/OpenSim/Region/Physics/PhysXPlugin/obj/OpenSim.Region.Physics.PhysXPlugin.csproj.FileList.txt new file mode 100644 index 0000000000..3aa0d53c96 --- /dev/null +++ b/OpenSim/Region/Physics/PhysXPlugin/obj/OpenSim.Region.Physics.PhysXPlugin.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\Physics\OpenSim.Region.Physics.PhysXPlugin.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Physics.PhysXPlugin.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Physics.PhysXPlugin.dll +obj\Debug\OpenSim.Region.Physics.PhysXPlugin.pdb +..\..\..\..\bin\Physics\OpenSim.Region.Physics.PhysXPlugin.pdb diff --git a/OpenSim/Region/Physics/PhysXPlugin/obj/Release/OpenSim.Region.Physics.PhysXPlugin.dll b/OpenSim/Region/Physics/PhysXPlugin/obj/Release/OpenSim.Region.Physics.PhysXPlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..8beee50921665d661f3b556a091f0931e5537a08 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Physics/PhysXPlugin/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Physics/PhysXPlugin/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..de7f789a839634d85aaffb68b5e53c358b87754e GIT binary patch literal 9796 zcmeHMTXP)672aNrRy$+avIrzN0V4;(B^IN*EfidoEu)GH3xwp@P7n+uZSQLE?2Ixq z>mWl4aj8O1xD|v@6qgqusR|_U0t6}#xx9p55q?1aL-KvS7xhRhTe9J0YuoJ6In$T< z`t;X*P7fK8$z=YA!oMutS%|aK-eMHSVKK3fRXo37pK{}Kaev=w8O2^092vF;`LDlk zvf?L|NFE7fC5c?Wzi+0p;CqYr$(2*#IT;*T7#t~%6%QAOh6-bY?ugsT*Bod%x;?iN zC$c=3xQS#dv*`I!Ssgc2tL(|p_vK;&1hM^7H(pBI1z!@c*#TitT(W5w8dxVow=m@{ zCSlZ7n@)Z*EHAr}jP`QS$*>@2qVT*|kWrow=DZ8iz>MPDY1gmFIFsq<$aHq@$~Sx0 ziTYT#G{Jmg)A;{=aQvP;QCYhnO@pEnVlTBEe-w94PR!3$N}lf}a(=-J<{wy=!JJpN zry{p3e-%dO;F=%~eQ6hbKgVg_Zrk&X|JY?_X(c}EoQd4!Wf?ig!z7T2YR%Ul*!Y5@ zk9%R+o_3R^liq@AW^&Mt&9)rW;-HQ9Lm`CCgL2Zt8wagVZdR7C(l+1WEye&7xFs18 z%wD>PjxoC_c2n%3=%Lt4(F@VZ+Jl!R+rg;8ejrsts}PV-=Vk`LeLAGaOQ7s?mGA)>aT-tewX5V5P}X$)nCu5eH7nkJ$;v| z{{gFRptzCsbZe@9KdWw{=z|dSxT^p3g|8I81FZTX#mx|%gu7!O?Qvt>e|a~aOCm2Q zb%_17{WU9#wKE~*X?n`M1tRw&h%wBf^}hwS0;k@1nsA8kR!_q*u+ z3{NY*&)D(w%v;gTybYq4YsezFY-(w5hmyMkVz${f+W`E~=&(IB4*1&yPF^VB1b+p< ze~fOuh0=zS8-VyWJj)$( zHJAs{y_Y+VMR1cT%tKIe!w}z$XSr{$2IUC4_x5oR6v3^oP>w>$jX^X*RP$3jO^C*} z8{H;*d8#P%D(>%m+Z{r8^DxCYL@&=L7J~=IWeye|ah(q1f#o!kot|}7Nfi3mI5_UYpv2c91DSEX=(_qC zD$z*11!e^+IcLguOL31HXuZGa>dJ@?Rl2g-{GQsGSwk__NKt~KSE@uVGpqV3iWpZ{ zS5jcFtk=z(kLyiSyL-EMYWPzgXz~I*awzv?b9Z6&_H7vqEOP?&PvMvQ3B(vP(20S8 zfys%1diphhL}p;i0hpYaccZKEFQn90<|!V?UFVr;I!-2Utb*wO#9$l{H5tqJ2ehkl zRr(Do0Q?&bna5G3ynZi~!L7XB ztgmwT6ncp-YCbYnVf?jbpaK9thef9my!Z?XXIsV2Fs8uXr&=<6DX=G@>`sL+%bdnD zh4OwVcWi|+)k(p70L{fGcqNz6ScUO%%|Hd<{RLJ7-k)Kt!(;qX@J^|gj9Uuc&!BAK z%hRY*D9=FIxi8P6m-u51pRo$#4=J!8=wRPZfo0%QU>}BJ2?i_$_7Nx>ed*wtLis3^ z9r)5kbMdYY@0}F9w{>`LrQk7QDR@OFmSCh(@Jdkj*LQUDXl0p8Xr%CZP$sro`%90a z$nY5Yi`VrD{4OCDRW9xo{Dn@8cEVfhj_y8qy*!A;(3Au`(zkw`FVAu_@O=gaY8 z82R3UWyUbce9KHA#cwsXir;94B`)gJU8_+SeGsx33fiPmpAuR#uUf$Z=c?(OWnO?$ zrOXr1#B&-;#Iu@ViDz`mJgrlv=Qz5uWCg=J53%}DG>fBX;slN&#_Tq$T9{R0Ks)xx}b2@9<8>SdT!UcCZMgc_AZ zpc$4Z>%8()ymHW$B`aJ=omc8Hgux38n1p2v&ySCpot}oN}{A0mMH4H zk||#CM$3{Fyprm?;#Kc!UiEm-Z1bvxdG$6HSmV_@FsrWlrcZul(D~QQy$~# lraaD@Hs!u$$qMdUHmQGP;Zv3#E(%Lla8dLo^-sdP{ttv;Uq=7{ literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Scripting/Properties/AssemblyInfo.cs b/OpenSim/Region/Scripting/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5da4c08ce --- /dev/null +++ b/OpenSim/Region/Scripting/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Scripting")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Scripting")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("61eae1ad-82aa-4c77-8bc5-b5a8c9522b18")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Region/Scripting/Script.cs b/OpenSim/Region/Scripting/Script.cs new file mode 100644 index 0000000000..0f4af00f63 --- /dev/null +++ b/OpenSim/Region/Scripting/Script.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Console; +using OpenSim.Framework; +using OpenSim.Region; +using OpenSim.Region.Scenes; + +namespace OpenSim.Scripting +{ + public interface IScript + { + void Initialise(ScriptInfo scriptInfo); + } + + public class TestScript : IScript + { + ScriptInfo script; + + public void Initialise(ScriptInfo scriptInfo) + { + script = scriptInfo; + script.events.OnFrame += new OpenSim.Region.Scenes.EventManager.OnFrameDelegate(events_OnFrame); + } + + void events_OnFrame() + { + script.logger.Verbose("Hello World!"); + } + } +} diff --git a/OpenSim/Region/Scripting/ScriptAccess.cs b/OpenSim/Region/Scripting/ScriptAccess.cs new file mode 100644 index 0000000000..a9fede5739 --- /dev/null +++ b/OpenSim/Region/Scripting/ScriptAccess.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Region.Scenes; +using OpenSim.Framework.Console; + +namespace OpenSim.Scripting +{ + ///

+ /// Class which provides access to the world + /// + public class ScriptInfo + { + // Reference to world.eventsManager provided for convenience + public EventManager events; + + // The main world + public Scene world; + + // The console + public LogBase logger; + + public ScriptInfo(Scene scene) + { + world = scene; + events = world.eventManager; + logger = OpenSim.Framework.Console.MainLog.Instance; + } + } +} diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs new file mode 100644 index 0000000000..39ba6e4e0c --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/BDBLocalStorage.cs @@ -0,0 +1,112 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +// BDB Support +// Apparently broken on Mono + +using BerkeleyDb; +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Storage.LocalStorageBDB +{ + public class BDBLocalStorage : ILocalStorage + { + const string simDbName = "localsim.db"; + + DbHash sim; + Db DB; + //BEFormatter formatter; + + public BDBLocalStorage() + { + DB = new Db(DbCreateFlags.None); + sim = (DbHash)DB.Open(null, simDbName, null, DbType.Hash, Db.OpenFlags.Create, 0); + //vendorDb = (DbBTree)db.Open(null, VendorDbName, null, DbType.BTree, Db.OpenFlags.Create, 0); + } + + public void Initialise(string file) + { + // Blank + } + + public void StorePrim(PrimData prim) + { + DbEntry key = new DbEntry(); + DbEntry data = new DbEntry(); + lock (sim) + { + sim.PutUnique(null, ref key, ref data, DbFile.WriteFlags.AutoCommit); + } + } + public void RemovePrim(LLUUID primID) + { + + } + public void LoadPrimitives(ILocalStorageReceiver receiver) + { + + } + public float[] LoadWorld() + { + return new float[65536]; + } + public void SaveMap(float[] heightmap) + { + + } + + public void SaveParcels(ParcelData[] parcel_data) + { + } + + public void SaveParcel(ParcelData parcel) + { + } + + public void RemoveParcel(ParcelData parcel) + { + } + + public void RemoveAllParcels() + { + } + + public void LoadParcels(ILocalStorageParcelReceiver recv) + { + recv.NoParcelDataFromStorage(); + } + + public void ShutDown() + { + sim.GetDb().Close(); + DB.Close(); + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj new file mode 100644 index 0000000000..b956c9b721 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj @@ -0,0 +1,112 @@ + + + Local + 8.0.50727 + 2.0 + {A4691E59-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Storage.LocalStorageBerkeleyDB + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Storage.LocalStorageBerkeleyDB + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\Kds.Serialization.dll + False + + + ..\..\..\..\bin\libdb_dotNET43.dll + False + + + ..\..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.user b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/OpenSim.Region.Storage.LocalStorageBerkeleyDB.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/OpenSim.Region.Storage.LocalStorageBerkeleyDB.dll b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/OpenSim.Region.Storage.LocalStorageBerkeleyDB.dll new file mode 100644 index 0000000000000000000000000000000000000000..997449a2024ce9a710a43bcf0821283a9ef976f4 GIT binary patch literal 16384 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 GA@DDbk>33P literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/OpenSim.Region.Storage.LocalStorageBerkeleyDB.pdb b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/OpenSim.Region.Storage.LocalStorageBerkeleyDB.pdb new file mode 100644 index 0000000000000000000000000000000000000000..f364458f86d73540fc0beabd93f796e877a97e61 GIT binary patch literal 15872 zcmeHNZ){Y@5#MLK7u$frlo(1d4`jZJ9Otj z+$PEurBy$)jgwLZBqF6mX(E+=D(Z(OQ5}^KwW`!8sj5o-&^D!iKLDxnfmRgv_uHMl zdv`noXNV!m8Nbha8bqq!~cH9x}?3~ry-WOGX zI{jbWh{rLO0iQ4=`27%g;JLFCXD0&q$a-LbqyF-d9egnGi5b7@az4#CHb)R-rka>& z0Ie_LCx8#N2hJq!TX+1rw_C@eYJAi4bw4<^;huy4{M%ctW9v+L#oG+ zb*8cZ)$KpbuK!JH-@s2#_x$$j`497dQ|2ap3j90IrS)-mm$;I-?1!*6IPj_|Id}8~<5myVbN-TY>zw>w(v# zYnE2`bf8|T6{y^ge30v48J-scQLRG2HsE|<6Ogf=>!+6Z|1ro1F#R4__)e!&gxQlv z?@a&U=WjTe-kQLHG<7Vc@+P2OA832#?9UHv6aKxzb3p^RHau|d)VWifyF=_w@7h@O z;T`Erdc=)w+U;he>0Pn=-5u#%HWnSp<>Nct*g!5B&q$%i%@4a7ceJl3*3;MH<%E+3 zrIKr71>0H+Q=j6DHdo(Jsyf3tmA z%lu!w;neC=yYDS!Z-V`Qd2=$I+T2%RwVWxLIxU7*3njt4@_5(#O@))#w><0XTd8*x zXk|J7Eow>Y7fL}PfgBIzOgd3;leugvlO96gU(7m*E#Zy%_%3&EEIkC!&CxjK(W8x`X^Amb9kCh7Cg*Fb4g-S6(o?J)zpG&`04TP^d{AVJA% z2Xh*F%-R{q#Zz=2W@`_Y$W(0Exq3-#+4mY81~x$Gaj&hdxqK#N=Bg3$BS6Yq8O{~; z&|mLdb=kSPT))rZ!Zz)j2mD@#K0XPm{T_|)aR=kO$()KWtluB?v4gvP=qazA&GCHF z&2ZaJ$(Hr|2_IX?B|_gj-`14u*fDLEVBlR#&9L)*Ye&|s9@P}bv{u&bxQ{L5M4@LY zZQYg0l%04v^R+@pYLkP(ga*W;&_O)ub)omkm6@;oVvFAeE#N(0=r9Uq4eoq+q%XHO zi}F;)^l#{Gk%k?#XwMnC^lqt-C{@I|SBQW5ePb6W<2~YkaTO@A*raYkPTGujkSl=? z>1VbL9o;6|wrhcO36O9HbUBVSx{cpz|i zXpiIhoV4rJGjY^kuV3`;snWwZCEhtY_OUYzo%AbVQ1ozTFSekJJE4qcX~~zAH8IQI z_I=VuRCK+4HZjOw?*Y-<>Z51kiND^1qW2{qJrf`N^}Zr{5Bcbsz3#7<5WQrT9(`-} ztOH*e@cMR0^mc&qUCU0kz@7%~HNF#~t?j@^fZQKPfX9F*fMO z*vLwP7k*d|c1MMXX_x`22EaWC(afChJa-re8Mn3ow*wIeb^Lk)lriiO@Fn0;;5hKt zz~2K;08axM*Ba3i#nxQi~Q|n8>_JJ9B%^Yv0-?kvx@HvOur6kovLKeqi6V{ z_o;Ha4%!!MPYalCttW-|85i=-^^$ zb&6Fw7)Hs*h9^3>pjw@OXr0Og#@aDF(TSIRHir%Sz%9sK?b%@2)=n`0c0Ns#ZGHSf zoc}FIsO&!TCZcvshA-|-wbdu$L(}|oB`=FEL5;g?T{WGgH|6F$v$6!d2gwRB!j1t~IxJuTd+17JkV%%>;QW6nGo?{V<_;wsx@zB`#7@4%Dsn72;GV{SSbkNM|h zJm#1-zrUsic&Nj_Sroud=Gx)YYrsY^V(Unmds2>YWj`${WxrcWSF{cN zL&FAIbO+6InIAk=cz_%6+rYPg+zWIUh`#d{LAL?eB*`#NCSJa7|31*P^$+PK!IrI|L?Mo$5B@Va{iYA zpM%T2e*?tzKt0X|&xH9v#uCm9XM$^_mcRdjcmP+y1N*~W&U<%%XCvoxLumBrm$!a* z;F)I+FMcudjhnxUy2wB}JKUcg%Be^eA8QL{yYF=4DK{VN|En-zSJ>oiw8wWL7ux^T vd*2+X=5GKQ1KNRpaexuJmKYF3a5!w5Vc|5}3(N%`2s{vYAn?Go;er1HIj6S9 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/ResolveAssemblyReference.cache b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Debug/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..2de9757341e492c30720a4845ee954e5d4d86256 GIT binary patch literal 12725 zcmeHNdvH|M8Q-&PHhV9DO)OLq)F9vk!X_abLL!fWK!hR>6Xa1sw>P_Y!!0+vxOamj zIOQcXK+$SNRHh0lIJ81*RY0(~Q0s`TE$vV`bjEgCro(jl@V}02q1xZ?WOH+uEQH6@ zKX&%u`SShtJnnbS`JMB9_gr1V<#K(F#J@~MZivNmjBp}u#iPljs@`*dTdflMOCyqS`)3T zj8s=>RayZbGdyeWfu;^Cskb#HwWQ8kO4KlQiTVxeDhkxcO;ZmiVSyExsaeaDT8pXE zUZo#|hvJG=3sFIRAg)Ckv~V(>C`=E>S08U%sU`G8F*~h~NA&rL_$ni!Cw%;&$>`KQ z7?I^&sG04$<#P4w=PD@Z@5}bAS>1h&%wqGbUj6_5!3k5mv`Xy{sdy*~Ad0E6z)LZ< zzOK2cz11*{q~6?O#G2==)MHIXTc9DKwds$<6Du$^F)MEBfrx2(In1$vK(qZ{-%WgI zGOF*Vuy+Mjhud94Veh8VV(H;{EMgkbE+bS_yE99*NJ}UZPtKjOAXp`h<+w*(T5op5 z3N+~nLof2i*BsH8p({62+yWuEnzH=I&-Wk0@*ym`m0~E%xzHKq!&r11#qBI72Qtd zaEJm<;5Dz>K+STls86$+k_jW$+E3h`-sg>aG<`N@tUYHyxf8-W0%Fl+H*U|_T8Wc& zTupFXVBGks3BkUP*jT%17LpJyo|=4~=bDG7j6^eK6hsMG#U!{~l5BTD@!k#b|FT|? z0rFAz@KN_d%l!gbOc*`NC zXPksRMpp!Cug+siqsjIgF}ecHl}d_n6jcx<+&oNz`$ZZZgyOA+cnC&2&gD$2D?!A{ zs@lGZSP`v=RM$+X7$4SKBH@Y&h1`=jLdx-IuGB!3aAPwG?qzBF1SsBGh{e5ph12{A z0cn1)@+!=)(Z>gawUL_ImT0u4Dp**G-lh56SJ%OuIy5Wck;CNS8PLaB!BeXsM5m*M z>^REbqsow~D3p%5X2qg$CB$fDnr7*~P&$|y7-Eny)ohI?jO6mRTQXroJb_3dnTVS= zg>Zt!W37A~f}8o8kr>?Fhm2v8MhgRu4sWQz)LJdS?5L-`C@ge|eliuh-M)e8V=!$+ zwH^J$qDE_bqRWY=k5D*L`;5#m_WD|l=zRkB8rsCGwI^+V#tdY6fYTYs>2Z7S!|Dy` zb!>G9W~wp~lOU=Y+}4$sm)F;ocSm;R2&Bp{+W{jWWipz2P9R#pzL_GC3s*6S z4TW4j&pOciI67m8C~>Kt6to+fs>~188U?+Yv~v!W zl3pvUDs%C>v~M1iu~$zGQer-uh#%rvwp~9+0~Eln13)QcY1e)zJ$BKx$?1GZ)})h@ zaG`{BcM>j=kd9Bn#S+rt$uTW~G9bh0smfRJn;g$lDED4&JQ8yaF5TvAmoH zD8N`=0!ksvvFwJ@GZuP0X`Uu)()UT&BH_4h7?zO!P?km{q#u-H(V+~?^o2?kzbUN{ zazM+WjK0Ev99~q8$UuFu1D4t&dL|7}fDvs6N+HV;Jq?8;Vg#!SdOvAoOhWoW3F8vd z|4ExyLMiFx1C@vIvyy<2W?N7$%d1|ErR7O95#NF}w&h#X00l5_3s4GKTD}=dkL7fH z($o&t^z-0ja(j4uUE(Mhm3c#Rv~R={_+!NQM_xH7p+DR0Jexm)eO1_O)5zcmkVJRn`EK&Z_b#q}T}3k(|(7VuJ&yVm(j_S(0-d z6q1wmR1aN8o;31)BRAu)^;lqUSGcDt8vwc}vk{tj6g03Yv&I2b(Fv47mXzs$VpGP? z@PWxK7zFSTyYwjX(}Od)1^uzJiu@VELnoUjUJes)GZxr!T5SRBqTW_$q8*g7sh4yB zRaihNWJ$dQ6q|Y;hGKcrLriRPi;S6tZN|GAK5S{CxRmatprBGZbRtSHte)(V*ptmcvBbg9Ubk zLVE$bLZMfoi6!8R&8x)@po&F6DP+m3g-~o>d3ckPCru8M<~1y^?a=nylsQ1kG=d5? zWgc_@Rm=xUAxp~4gVIA8-uC4wlf#sG0}HICKkY1TGgakHn>KHeHnTwon>Jr@09DKa zN+Cq46$e}7nZR)&3>P!bEZ0giIfGVZ|rI00c zrb4l)bGfzyc-;`djZIT4T^{s}e`k*EUAOGC`ya~TL33J*muzeZ zzq4u4=WEYyn!ZMNT^!W9^P~9(eFN9jJ(H|m^zOy)pC7+{^T}OR|6O(D_rV8#`kVSc zzwR9|_}F8UPro;8uxOq6w~u{--zuEp8izL&1M=_&KEEGw zct0G+0z1OB6M$Xe+E1W~Nnp6W6DB%(cJ?NVapA8-P#QN`U zo4xacXP??r@bvk=bWVBuTto3brRHqoZ%hAW9*=Lk`^{gx-?8;T#p>Hf|MPpZ&waeJ z@+ISK|B^o?|2?B(->aYfOzqt7=Z95!cov?Y{z6CULQwE?Y4_pD5)SV+9-jOLn%@UG zybpef1$G>srvSSS&tE|krM`_YAagY;W7q1$q=`++bon4u`W)o!>|%rEtcUNoR?=?zG*HZW3Vz82<1u$y>B}he5%H{ZfJ^3qO%1*@T<^NZNm^a z#>BOShEaXNmyU-(RqI(eIc@;g78)ihZc(+U5zq)|1T+E~0gZr0KqH_L&B`Q*_$s4si5NUxM6W7|(LE(?`zc&Yp+5y-v77 z*u*6Rjzh^qM0*B0=`jq4m|UK2?aD#Si>Ni8<*)-?{YlQOl%09X3zOqL6r29Yo7+$Fwfu+FuTR+pPy2@iOXu814S~GW`rP zAIqW)Ct@wArAEfVN*ev}Da+2OOt|9Vm$Vcg2*pu|(#6`qZfd~^<#++X}=mbpw zJ(f?c{aV%fH~KiVf6}8gV{+t|dT!DXEYBXmLh(G`GQ;6FB2 z=^J$2xJv9v5Bx#;A$^NF)=*L#eHL}$ zZ-WHJV2W0zW&Ua`Y=?c%Iad1U4;!{vKyz%f+lfi9w&cjiX}T%hvfU`m%DU~jg>vZm zR$Ue*ysG8IN>Tdfr6X5M#X`+-s8}j)_1;&8Qjr=#)$<*@Lgm#Ulnt7$d`?!wjoxGU z4pLt5{PTBP3gd1l{c~1T1~lF_bYM41l__*2B(7D?)Vy$NbZ+nnZIoQ0QspTtSR{l( zBotDpVvaQK+M#VZb|CLD;M{5xW6k(TZ-o{y4w5w+uN zFGi^{>W2PmYcg|-NK?a8oF+XiF4h=spugbTp)7}1xD-Tklx$`xoOkWdFG(6*u|t&+ zYw5Svtc*k$Xi?hr#jt@jYAOuR)cA&oWDZ`YDK7$?S8vSs8u6PZo=DNc4fdoAaqEpZ z9%Rr%4tZ213!g**+0?-MzeW}HHhm%Am45x;Z%VJd(*37B>(7l->L*|L%<0{OZ+*o` zX1nj*FZH3!!kTkqJ(Wo2Gq`dIlSGFpM79$wzl(Wpx03gEn6$Tx#l2lg=J{S_kN5%Z zlv3f3X3S)MD1SVg%{`Vond%@R9?qH_xyk(T9l25b@tK(e=_yP2GznZFI*@I}zO}$NG-(7TO#PdszGiljw^hl9X zJ(W1{_5tL=Rz#CVKqH_L&beup^fto@@*|68|k*P<;4B%(<=rxEv75}9E zF;pZr;!7Ak!0wClG~3285j%ig%x3Iq#QJKF)~aOyd$rAr=y^Jfc%DtDVqLYXn*wh@ zC!p3ui~Tl6<9*&Nw0bx!y%I<_;4yaR2m2y6enngOgks!1cD5zq)|1T+E~0gZr0KqH_L&c5GM~xZ) literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Storage/LocalStorageBerkeleyDB/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..4cb2abf4006448929aa5d6c421dfc118e2ecbc66 GIT binary patch literal 18157 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 + /// + /// + public class Db4LocalStorage : ILocalStorage + { + private IObjectContainer db; + private string datastore; + + public Db4LocalStorage() + { + + } + + public void Initialise(string dfile) + { + MainLog.Instance.Warn("Db4LocalStorage Opening " + dfile); + datastore = dfile; + try + { + db = Db4oFactory.OpenFile(datastore); + MainLog.Instance.Verbose("Db4LocalStorage creation"); + } + catch (Exception e) + { + db.Close(); + MainLog.Instance.Warn("Db4LocalStorage :Constructor - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + } + + public void StorePrim(PrimData prim) + { + IObjectSet result = db.Query(new UUIDPrimQuery(prim.FullID)); + if (result.Count > 0) + { + //prim already in storage + //so update it + PrimData found = (PrimData)result.Next(); + found.PathBegin = prim.PathBegin; + found.PathCurve = prim.PathCurve; + found.PathEnd = prim.PathEnd; + found.PathRadiusOffset = prim.PathRadiusOffset; + found.PathRevolutions = prim.PathRevolutions; + found.PathScaleX = prim.PathScaleX; + found.PathScaleY = prim.PathScaleY; + found.PathShearX = prim.PathShearX; + found.PathShearY = prim.PathShearY; + found.PathSkew = prim.PathSkew; + found.PathTaperX = prim.PathTaperX; + found.PathTaperY = prim.PathTaperY; + found.PathTwist = prim.PathTwist; + found.PathTwistBegin = prim.PathTwistBegin; + found.PCode = prim.PCode; + found.ProfileBegin = prim.ProfileBegin; + found.ProfileCurve = prim.ProfileCurve; + found.ProfileEnd = prim.ProfileEnd; + found.ProfileHollow = prim.ProfileHollow; + found.Position = prim.Position; + found.Rotation = prim.Rotation; + found.TextureEntry = prim.TextureEntry; + db.Set(found); + db.Commit(); + } + else + { + //not in storage + db.Set(prim); + db.Commit(); + } + } + + public void RemovePrim(LLUUID primID) + { + IObjectSet result = db.Query(new UUIDPrimQuery(primID)); + if (result.Count > 0) + { + PrimData found = (PrimData)result.Next(); + db.Delete(found); + } + } + + + public void LoadPrimitives(ILocalStorageReceiver receiver) + { + IObjectSet result = db.Get(typeof(PrimData)); + MainLog.Instance.Verbose("Db4LocalStorage.cs: LoadPrimitives() - number of prims in storages is " + result.Count); + foreach (PrimData prim in result) + { + receiver.PrimFromStorage(prim); + } + } + + public float[] LoadWorld() + { + MainLog.Instance.Verbose("LoadWorld() - Loading world...."); + float[] heightmap = null; + MainLog.Instance.Verbose("LoadWorld() - Looking for a heightmap in local DB"); + IObjectSet world_result = db.Get(typeof(MapStorage)); + if (world_result.Count > 0) + { + MainLog.Instance.Verbose("LoadWorld() - Found a heightmap in local database, loading"); + MapStorage map = (MapStorage)world_result.Next(); + //blank.LandMap = map.Map; + heightmap = map.Map; + } + return heightmap; + } + + public void SaveMap(float[] heightmap) + { + IObjectSet world_result = db.Get(typeof(MapStorage)); + if (world_result.Count > 0) + { + MainLog.Instance.Verbose("SaveWorld() - updating saved copy of heightmap in local database"); + MapStorage map = (MapStorage)world_result.Next(); + db.Delete(map); + } + MapStorage map1 = new MapStorage(); + map1.Map = heightmap; //OpenSim_Main.local_world.LandMap; + db.Set(map1); + db.Commit(); + } + + public void SaveParcel(ParcelData parcel) + { + IObjectSet result = db.Query(new UUIDParcelQuery(parcel.globalID)); + if (result.Count > 0) + { + //Old Parcel + ParcelData updateParcel = (ParcelData)result.Next(); + updateParcel.AABBMax = parcel.AABBMax; + updateParcel.AABBMin = parcel.AABBMin; + updateParcel.area = parcel.area; + updateParcel.auctionID = parcel.auctionID; + updateParcel.authBuyerID = parcel.authBuyerID; + updateParcel.category = parcel.category; + updateParcel.claimDate = parcel.claimDate; + updateParcel.claimPrice = parcel.claimPrice; + updateParcel.groupID = parcel.groupID; + updateParcel.groupPrims = parcel.groupPrims; + updateParcel.isGroupOwned = parcel.isGroupOwned; + updateParcel.landingType = parcel.landingType; + updateParcel.mediaAutoScale = parcel.mediaAutoScale; + updateParcel.mediaID = parcel.mediaID; + updateParcel.mediaURL = parcel.mediaURL; + updateParcel.musicURL = parcel.musicURL; + updateParcel.localID = parcel.localID; + updateParcel.ownerID = parcel.ownerID; + updateParcel.passHours = parcel.passHours; + updateParcel.passPrice = parcel.passPrice; + updateParcel.parcelBitmapByteArray = (byte[])parcel.parcelBitmapByteArray.Clone(); + updateParcel.parcelDesc = parcel.parcelDesc; + updateParcel.parcelFlags = parcel.parcelFlags; + updateParcel.parcelName = parcel.parcelName; + updateParcel.parcelStatus = parcel.parcelStatus; + updateParcel.salePrice = parcel.salePrice; + updateParcel.snapshotID = parcel.snapshotID; + updateParcel.userLocation = parcel.userLocation; + updateParcel.userLookAt = parcel.userLookAt; + + db.Set(updateParcel); + } + else + { + db.Set(parcel); + } + db.Commit(); + } + + public void SaveParcels(ParcelData[] parcel_data) + { + MainLog.Instance.Notice("Parcel Backup: Saving Parcels..."); + int i; + for (i = 0; i < parcel_data.GetLength(0); i++) + { + + SaveParcel(parcel_data[i]); + + } + MainLog.Instance.Notice("Parcel Backup: Parcel Save Complete"); + } + + public void RemoveParcel(ParcelData parcel) + { + IObjectSet result = db.Query(new UUIDParcelQuery(parcel.globalID)); + if (result.Count > 0) + { + db.Delete(result[0]); + } + db.Commit(); + } + public void RemoveAllParcels() + { + MainLog.Instance.Notice("Parcel Backup: Removing all parcels..."); + IObjectSet result = db.Get(typeof(ParcelData)); + if (result.Count > 0) + { + foreach (ParcelData parcelData in result) + { + RemoveParcel(parcelData); + } + } + } + + public void LoadParcels(ILocalStorageParcelReceiver recv) + { + MainLog.Instance.Notice("Parcel Backup: Loading Parcels..."); + IObjectSet result = db.Get(typeof(ParcelData)); + if (result.Count > 0) + { + MainLog.Instance.Notice("Parcel Backup: Parcels exist in database."); + foreach (ParcelData parcelData in result) + { + + recv.ParcelFromStorage(parcelData); + } + } + else + { + MainLog.Instance.Notice("Parcel Backup: No parcels exist. Creating basic parcel."); + recv.NoParcelDataFromStorage(); + } + MainLog.Instance.Notice("Parcel Backup: Parcels Restored"); + } + public void ShutDown() + { + db.Commit(); + db.Close(); + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs b/OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs new file mode 100644 index 0000000000..ec82d02d57 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageDb4o/MapStorage.cs @@ -0,0 +1,39 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +namespace OpenSim.Region.Storage.LocalStorageDb4o +{ + public class MapStorage + { + public float[] Map; + + public MapStorage() + { + + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj b/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj new file mode 100644 index 0000000000..716fd5761b --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj @@ -0,0 +1,116 @@ + + + Local + 8.0.50727 + 2.0 + {43DB702D-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Storage.LocalStorageDb4o + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Storage.LocalStorageDb4o + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj.user b/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageDb4o/OpenSim.Region.Storage.LocalStorageDb4o.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs new file mode 100644 index 0000000000..6e6768c939 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDParcelQuery.cs @@ -0,0 +1,47 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using Db4objects.Db4o.Query; +using libsecondlife; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Storage.LocalStorageDb4o +{ + public class UUIDParcelQuery : Predicate + { + private LLUUID globalIDSearch; + + public UUIDParcelQuery(LLUUID find) + { + globalIDSearch = find; + } + public bool Match(ParcelData parcel) + { + return (parcel.globalID == globalIDSearch); + } + } +} diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs new file mode 100644 index 0000000000..eb309cb857 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageDb4o/UUIDPrimQuery.cs @@ -0,0 +1,47 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using Db4objects.Db4o.Query; +using libsecondlife; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Storage.LocalStorageDb4o +{ + public class UUIDPrimQuery : Predicate + { + private LLUUID _findID; + + public UUIDPrimQuery(LLUUID find) + { + _findID = find; + } + public bool Match(PrimData prim) + { + return (prim.FullID == _findID); + } + } +} diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/obj/Debug/OpenSim.Region.Storage.LocalStorageDb4o.dll b/OpenSim/Region/Storage/LocalStorageDb4o/obj/Debug/OpenSim.Region.Storage.LocalStorageDb4o.dll new file mode 100644 index 0000000000000000000000000000000000000000..324a4799a8fd6c8280720baa2490d6f5d7804f5d GIT binary patch literal 24576 zcmeHP4Qw38b$+{d+&fYfWu7D|GNtHbkupVEXX?k1Eyp(hCB_s<^C-!VSxd{~^0@Zh z?Rj^P5-TvK(wG z6gO;oqk;ak_T9~|X+!UB9-pzjWYKl9u9;6}%tFEOlap4`Eftb>A=x*QPUf8{E46ZE zT}z;Pw4Z25i_r6LJ~L2m?R{$4yh4i;bs{IJa_{R3_)$qWO8zy^|l70 zI@E3-(A!oC)g$vdzlygbcXg*u>u`nsMv9!kTWXztf=k;PLF+omXs=K~)Z7`NryviJ zMruny#zoa)q-`~5)7QZ@XALN!5xne2N!L&CwQVgj=kY=xRh4$3QXr1r!M=01qs|Ey za9~f}RwZUFiHTOpHJr~uqOvhMhyIbq@7UBr9V2u*_6D@ou=O}Bg3`u7cjUx+RQ1p| z!?_l$&TyJp*G0YQqE;W@y944VLhU*~1{Et}krNw{m}db0JaY!{P0Sg2Jjo0Gk|Yr z&H$cb&H#QRa|ZBE<_zFFm@|OyWX_<5Cgxz=7RPBfbLwa=`}Q)0?K}q9s;L@-Pj&zH z<|^Np+q_BIX_wf047w0cQejnOq1HDtvbqt0zC^$VFl9CJGL zQ;SWAC!S9cdIHy)rTKA4s}A)wftBA{man>d7Bfp<>d}f=MS!vu+dG13_wlmoF%`93 zy*_>daU889V`T@`${0KZn~Vy-Rku<#4baIQK^sNA+Vo&%aOD-%qvN4Lqdp#)=Y~~L z{L*-67ytYOG8nh=7^+prgVM{-$wwewjtjU|=H%@dfq4eRD8j35o&mgzIRkh%a|ZAp z<_zGy%o)J@m@|O)GiLxFV9o%(k2wQ4mgTy62Jk`V4B%g4&H#QVa|ZAs<_zEmm@|M6 zGiLxFVa@ZG7i9vC#}>^r~oe2S3GfEQLqJF`w1) zj!i)WnPm+`oTH*hjqP7AD{WWn=LEGZsQ%tx6Fj}|;Z)x(#wJ5!yhn>zRG#4UqY>Kw2Ii{qBB5Iv3S%Lw8vY2URAS&t>UR^b^8 zI=385)A$;-mA_@*!9lDWG==obn3G$2a?T_Rw3fM7}R zgmE4kz9#qryr+Wf4RQOP-Xn8Z1u+HEXMpw^wThKB9F1AJ=XK9@3j>G|8?MLeUAay|-#>)EIR#o*CCd! zX;Wq0`n?=k+f?cR%Ic|EQry2yNOh_ddSnLi*a9zWv`w&I@EyS&m>C+~A^3AaC6mVJ zl;s~1t~9(8jY8vHvWntiX1XPMjDAd|=p*!3bTaw`y-iO?zd?UTFGimQ|6}kS^n>X0sQX&<1-gaKqSg-j zAbOhqg<>^-LLX6M%`3=ns(BTdta$_2E_`Rr8Sq}oNekX5Xbbv+4~fhZg3kzkNAR@Z zt0HqowEaZ*&xC&<_;Jmf(0`5b=fL&G+pub@@h-64SO>fryjDA6{2cs2;~%7VAJJy* z8RM6CZR{0D zo)gJm#kQkVi*w!e@txpXLSUBI(kX+xaQJvE}*jB2fS58R14Py zE!>HDB*zyII8&vZbvum|twP$)r^c+T?G#dJ-*L^Xl^Sv~W-dtdP40G5Q@I=+FpELf zXRSsDagQ1`-HesHt7N%z1YMP?Rk>^DRcYSKIBw3Kr1YHUTX`Cpyx+?BT*(pUrI;>H zr&Q%p*P603rf)48H-O(9SjQaqflG5zg9YDmr_GGz(O{KD=p>~wa09^*&&oK3shmA+ z(a;e0g|fKGnz_Ngw1r;HTt@NuToF1|pZiSTgx7os4ywNNItAaf3zkb$lQe~54=q_V zSg?KD%-Nnrqwt2*V^>?8qA@G)%qm)C>zI|X>{;jdRWS?iV;9$xGy2qWhE zO{|s{?X!GN4Y*EzDF=(3ziTHA_7_Td%jLjc=ecdk$bR zl<^wuv%R9@i7G`cnz49#=dtE>clY!hFpsM%#?*8zlT1u;bQoPROBn3ZoaKV6#Vxq> z!Yf&hLB5wLk~3vZwkX34_8@?>u2U+au3Xtfk8E!rXO0{zSW}dPD=<^VLwVep%|j#9;qr;@?qQ`1CcZWpj4I#5+0&iwdobiqBrCCFs9cCds=7z|m3tdG0j5J$5t0DNCZ{LGe3s~Ff}M-2qu{wfC?Pb@q7 zXp(l*5IK0RGV#8gCLi1d&yqz+8lfVt1+sBwk-mD33~F1b@1u@`T4Y|WjlI+>k{;@~ zRDvbSh9qrAi~V#QIq?3X#-v!Afh4yyMcTsGuiOMbG@1{Q-F9ymKAi5iuzQu&P99pzRIqb{Cz(B6{na#`7-#};K$ zcqHaOEmM~HwE7Mnf6Mi!rG65skp0D<$R5d4V(=l7Xrs&4H-_ z`D~qCZj{zN3Z1S*R1Ug&kjlWF+%^Y@vaj5JrK}eW5ACbWy;MVWX}P~iiSayI$)Wc? zPC8I6x!jU5$mG%2*~Ove`N=jHD|)bKRqvIxm52L^JxgC%M`bAox`ml(%QPrYiRIo- z5jmB$F7?(hdbqqtm6}s1?ZtSNR}{4hsSvXLA-dScRd*NwPt)UxUqbpxq-9r}^_BZlv(M%LY`^fT5K9cV45>s^zb-6xS#wr6AaW!tr_D5ggZ>4!dS?*eNVNu#V5T&M{A9Y4JDiIx2h> z=cD+D^e8@vj-~t34?WrU*yQ#z!{2{>?svZZ?~{KJL3!`qiF7H;59-!L@a8_D-rOgG zr=y9=msx&Wp1`Z~guFPEYh3kRzle8J{M5b+5FEo@Aju%H?9$b>EQ5~pI&NPs$It&H zuk@BB`v)xdNh|a;F0T=$Ll1-=2t5#bAoM`!fzSh?2SN{o9tb@UdLZ;b=z;%D5Ag4n zi12Iog=#B!cSHU;{w4V=w;$)-NAb_idD9{|MkDyuBOSud%cC^y?g~bRBBRvQl z0O#XO^p_Xa?;SL1J^VxbBu!nhH6jN#nW}yz!I^zH@!KicZydm0AMafbVq=&$o%v|N zFQACVu|H=b*F$;5zQ0Jk9DNy^Fq(W<;4OFFzq?e^lOoee<-gt7MD9fW{qT~uDBmZ0 zb^Lw7#vbV6_XWsZdHbKJi&jzT=ub)Cm%gc_KJ{yh>V<>)_{@br!e;~i zz1xsz;}-cl3Gack2h=t{$@bBL*f$d7vzJ-A>}O8>&)V4~f_TV z<5OLK`6yj&jP{F;Zj38`eBjSFIr&=fU)3W69zy7W&;y|dLJx!<2t5#bAoM`!fzSh? z2mU)A=u-b@+);k94Ufq2Y2vy`B z*!TaPv(Gu-KKtx_&i>AKZ|2rjH#RgiENw2FUOfGra|-8H%q$#V6pi-mKA^lJAmy0< z!5A+0DNl-8$bNnVG?1A3_k-DV{A!@=792cy@Ay@~aX#`M&z3~Ww2t+51oRCK9?S!C z6MSUTM_L01sxF-TWS5uv+*%QApZCq2dw(|LlXt%M$}jrdI@#uXe0|;GK1*Nfvu$J$ z9Oyc0+vWGwPkEu{x;c-$Ic>+ajo-RcW~20zvS+_?NBrg=^!nrP$BsyBsLZGAEa+@# zICKKk6Y2$Zfx1H7pzcr)=tM|;^?~|ACqez7lc7_fQ=tN=KQsV34H^iY4h@3NfC`~A zp~28lXb3b6%BDkWptI)xnrlw2eEkpW9^EtcPyi zGN z?LB^v;xe1kG|*Y|pI!gc6nl(h<$rsjmm)!+=K#OPujR2YkFrZB3zK3u@7wR^&s58% zV?YCn!8;@V|4n4g{u?((&o7vC%j0hi9DemNF!Zd5XrQy!|0iyH=jGQQu3Gcu*Iwwp z`N4~B%qsWT(7=0dy!Qsnd@xGKfYT=~saUzJE?(ChTQYA&tiGad`I3ub%jz2HmsB)2 zG*&K)Et%6$T^VcVAe)W!13 z6)vkTIwHivg|o`%S2kA1;uo%rHLg}S9T8;Z%DS2rrkl_CZaN|jdI_tkqtc+8u&Rzo zH;r}6k6bf!lGKZ0_;t{$7|*59H=ya{+e+nBkiGTe<9Sf~Pd0sU8aP_(zn;5JdpR0; z{+(|RQ2Z!ck$q^+V~|g>2VeJhPxO9Sb!8u_D_*#+Y|Yo*_)5W8)%A8KUbwDo(${_U z)(c)zUD=%a6)#+uqT@Do*8Hc(e|czB=eHjVX*P!wfw##|a%B-_TIat?xlq(xne*F( zo->97L82=-4D7~fZ#Qa-_EV;ErqLu_E9rjO)IJRyt@*ERZYolIP-M0po#_wlvoKy) z)fB64sIQ6FEyV!`sm#S0MKc>Km&aB$G+tS>VD*X^k%Yc?kRMD7^75XU{HG_sx9GoS zZ5`Gv=f@9hxm>)ttPZ2WJUyp^Ep08A@-Hsd^C>oxuYQVxk=n9?wa#etKEWq!FJJEy z3~O#>b9JrWIpp@)OWAx1RoC+e1%;*`iVf=S(<_FS42_bgXYbX9%rwr6^fl*Uh;QVR zUt9pmALJLVb2B#YFPvu?zu;`k_{DHg?@dO4-8f~FZ}h}#gx=4r+z~Sdsb}iCwLf9@Ayk{02qUgz!Ny zt}UOGeN(-qPg>vbcB$@;-umA@|L=qCCAJ6N*=FjhqaX0ZkCQ}xl(DH75;~4ONomq5l zERjzv@o-)^mKg0~iM?jQ2!f4LkW0k7`P#1yYgT<-b6sV;t|?~XiBbx;K&tQSD9)&* z>>=pml;7mqp5o#R_G2Fkm}eHn7l$8X%v&Y7nPaoYc)54GP5x@`8J_<=)KyB}kZZ*! zHYOqC=3g?a-CeG(=MPXkr=YLuidZ)Od!Lw9djF8be~6;@vk86AhIh2Yk%}S9%wFQ3 zv-Iq)r1z-Q4W>YPo{mGrzGHpttG!YC2e#o%$i&8_;+Ie^zU(HA9~FNzU!<6i5BMi4$!9f*8#!rsaSLU15F9_DFLzg(S%J0HJb>Co4 zLuJjU8ye#^R>lGrfPu78eP74x1y)!u$!7+ymo$D0z3Emdeh}2g>Xy|ub8<@gV5fsH zpC_q!&1b##tZZ|rP=IX2{lR5Ue)N`H|MzgM6!w3v^KDE5;}HJu`NyjNAJ6e$X8%98 zh5ze}O-cU07PKa>8HH`y*ld(?@5?EEOJ6R;fA5Ei>H8h(>lWUZ!)=x}tgNqr z*BSfXPC8baY{7gIZs$*TYe{fXY3R$1lgGXM>$ra&IUoN;-8_fmKlu4tn++??|Mya^x}M)%`+vpi zrskOR*E$xUYJ1LsrZ?0#HN<0D-!h&P&8lyXH7>2JHitz=?<`62-^LRaN1=ljanwg4 z{?nW&u`T332by`-3q9)w#t-&UxEWhfyy)v3sUKwh|HI+`X1*1}Xw~Cs#~#-r)eFZ;>cxJY!N?a!wo=-tzOUnb5mrXM`1mWu zZyA5x10zbG*V5+%cVGV;5pJ_`MNMUM%n5_2M`9N~9vSXl`p>sRH=pdU`8$bI(#CJz z18I)p$hsd=8(&X4P<@Is>cF3&r1(KlNBzTpCbZvKMm=WV_ww&^^3OJs+mD{q8IG|S z`CS}ozDWXG@{gj;qmbJ8dR~5tGs^GhFvU;J;o*0jTI#AxD>rlqMh3K zdLOj@;>c8nOw!*%oL@G4H1+4tA$L0c>Gxbd^+tcsI~jtC+Lg`a4Xf&579Gwzr-+Ty zy{*4ZJDs!I=abCeHPD$Cx1)diPBjX4<5y%l2lMYy_qcxazRI8V%FuU0N@Hjvot1+6 zJ=$1sC^#M*29|;2zzN_Sa3VMt{PP>{CFX&g`zExmA#377@I3G{;Q62ohv(14KZ8@i z8$q?Z+2JkVRLbqS-6uG^I|J&4BaVY+nro_ng|2)c<(EQZlRWYLSa&dx=g4cUiuaW? zhNs7w6bPz)RDnA1{JvpEDeuI)_es0$yi#^AP zB+o!t&V#EZBxyOaGlT$tOPmBYfQ6vOJ_KArekk}kFbXz;*lK`{Ca~3jd30l+kzwqE zjeK5~?bNr=6_Mn*L@&y=KuXADWLXXB`xl=Fb+0dgx|a|eG_qlHCXcNI*HDhF1pfre z&b|mT=Z0ScYAj!JD18uXI+-UT-x{bNza2Ukj`q7DMrP?*Ivr|$QDj(2f7wpfp7TbM zXT;%gTu1-XDfcwv;GPNnhV^=|7+eQx95;ZHU-Dto>MMaw2OB`64!$G ze}cY)TR{5Iy5z<&3t7*CE`_E+!{K@xti>j#LBlBT1r2I34jXevlJR$fsC9tF5>mYL#+znd) zNteCe$!^!No@P#DQv;y>$#D$K@iB5F8DDE%>P@-Qz4Whfd;=^1zX=WlH4fF=M1B-_ zA6N!{3oHlk2U(+ne+Ok(-v(>J2SDsT*bFAX{{Wez;5#5=4;}>RQ|F~-{rWDrmHflt z)8O~O9pDylH~4*UANUA(0Q>={_3Kek>(>uKtzSO^wSN5=JRhXb#B6XIcro}BunK$( ztOvJ)p9dcY*Ma{D-Uj{@yc>K1d;okB+zd(|-vN;^@gVpNxD|XB+y*`eJ_G(7wDUEe zc^Hhu-qvO?U*jE>fFFk@LlfNfd7${hsgQWSjp~Sed$ko+L#nU3zMabbwNSP%%k^@2 zdr8>{bLpNTBHDLMI)P7Y(WDm`6GIDL1ZC^L0OhmN$!XwA z=}WS_0&0Y>f?7@Yf)hdMME8D;{Q2OYz{w70I{pPNzW{t4{z4F+FzfjLfR{Ob3{-#8 zkMMdS{B__PpdHgZbUP`{HVcT^G&6eVP>jv=mEiw@ zP2js=v*UjORDIS|gI@#x4*xEfzZ*PA{@=hL5+uGa0JnlU;5IN9#GZK{?e(R&C0$<^ zqnk`RQ|!@NXLM(D*C(ifZ}-lge7n)>QuAwL{0REDDG!+BuJe&aYV88{1iOOLb+@F9 z{pr8J^oO3!cY*u4d8j473zD7EE*J_;f)+q=Xgzcfv>n!Sl7e9oiK$k%BwV_ZHlI$AS)sXD*R_HG1erOA{9b&CC&kTD&$@eZK86|rm zGzyYE$=2pWiZ^Sa1auR02eb+5%%tCY4(L|=mhQinF;1m(-C`lv!Y5pQxx)>vd=cXp z|F^DOzNfrwUg+s$cYUU7cc;t$(&c-)ewbU+W}(9ou6%>bzvbF(bM1z?^1rzJa+g2P z;Z)cDUYCE|;ad*7xpwTw=Dv#@-s{SL?dmOe`3Vjq7%G>COyakdTC{JGK^FDTy=_Wk z62`REf3m6XA`RPY|Nip7FSoG8y{0JFY5=VYTC~Z~AjxlQWNr2AI+_9&x@!xz9s#>avCUx_jw2C$L|t_5Ip1S9eURu4Kr|&~KjW zwiz{s|TG0m_uy@K5EmkmPqusqjhyw2h5J@h^<*L>M1^r9}*&hlNmvXpH4K9X%`Us8G5 zY2rwRMf2S+oH4ZFP(j?i`BXn(fhw*8AdqQd)dIx9c#=e;I z+aGNi2v?cD!+w$ej%Q~!3$VD!M(MC?!crbWk>PAi?k-g)kiiWF9x)ZJki z#8bHmDnMUXb#$#W6+JU6rSsUvOsdxAou_l&^_JC&r?b;Fhv4a*y?@uA-lyJW&p$*vo%zf@1W#u$HynbebBY~@;OV*B zKXa$cqVMtgInsLIlhml+5&1a^^K#HcPow9E*?!bUzai5zwNlD2^*7}diA89U%cuRP zI@6#H(2Gz<{@y}rZ8)O8kzn@v#NS)_NnjwaP{q9{cF{I)y!-0oVxleXVoul2#V|Zfo@Y!+|*cI zTpO#bi8WU7=P9nV1xxGVv8LjV{LKx%h|}a2eMV|}?|5e!{(#33_E^*Uk8m7ek48pj zH~FVD@GNs+EiZc1o?Hhfk}5 zD|Z*21#u>5c;b7Kk4}LnnnWP51;bH{umZHEcktkF@)D*9l91;>s-v?ZZG}41I|FwWa`4tfBQvd&EHKbZ8KC22=>02}wyqprOz(=q%`LXapo#MnZj| aY-+86;?_mklB@=@8pvuOtAXP{1OE@$fQtA4 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/obj/OpenSim.Region.Storage.LocalStorageDb4o.csproj.FileList.txt b/OpenSim/Region/Storage/LocalStorageDb4o/obj/OpenSim.Region.Storage.LocalStorageDb4o.csproj.FileList.txt new file mode 100644 index 0000000000..2d59046de0 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageDb4o/obj/OpenSim.Region.Storage.LocalStorageDb4o.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Region.Storage.LocalStorageDb4o.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Storage.LocalStorageDb4o.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Storage.LocalStorageDb4o.dll +obj\Debug\OpenSim.Region.Storage.LocalStorageDb4o.pdb +..\..\..\..\bin\OpenSim.Region.Storage.LocalStorageDb4o.pdb diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/obj/Release/OpenSim.Region.Storage.LocalStorageDb4o.dll b/OpenSim/Region/Storage/LocalStorageDb4o/obj/Release/OpenSim.Region.Storage.LocalStorageDb4o.dll new file mode 100644 index 0000000000000000000000000000000000000000..2cfe030a899698f73bbb085e6e4e58a8c4dc32a5 GIT binary patch literal 20480 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 + + Local + 8.0.50727 + 2.0 + {477B9270-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Storage.LocalStorageSQLite + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Storage.LocalStorageSQLite + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Data.dll + False + + + ..\..\..\..\bin\System.Data.SQLite.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj.user b/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageSQLite/OpenSim.Region.Storage.LocalStorageSQLite.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs b/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..ea9cda85a9 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageSQLite/Properties/AssemblyInfo.cs @@ -0,0 +1,60 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Region.Storage.LocalStorageSQLite")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Region.Storage.LocalStorageSQLite")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ecd6e0c1-7909-413e-9e3f-659678ac3bc3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.*")] +[assembly: AssemblyFileVersion("1.0.0.*")] diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs b/OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs new file mode 100644 index 0000000000..9900a98c3b --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageSQLite/SQLiteLocalStorage.cs @@ -0,0 +1,198 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +// SQLite Support +// A bad idea, but the IRC people told me to! + +using System; +using System.Data; +using System.Data.SQLite; +using libsecondlife; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; + +namespace OpenSim.Region.Storage.LocalStorageSQLite +{ + public class SQLiteLocalStorage : ILocalStorage + { + IDbConnection db; + + public SQLiteLocalStorage() + { + try + { + string connectionstring = "URI=file:localsim.sdb"; + db = (IDbConnection)new SQLiteConnection(connectionstring); + db.Open(); + } + catch (Exception e) + { + db.Close(); + MainLog.Instance.Warn("SQLiteLocalStorage :Constructor - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + } + + public void Initialise(string file) + { + // Blank + } + + public void StorePrim(PrimData prim) + { + IDbCommand cmd = db.CreateCommand(); + + //SECURITY WARNING: + // These parameters wont produce SQL injections since they are all integer based, however. + // if inserting strings such as name or description, you will need to use appropriate + // measures to prevent SQL injection (although the value of SQL injection in this is limited). + + string sql = "REPLACE INTO prim (OwnerID,PCode,PathBegin,PathEnd,PathScaleX,PathScaleY,PathShearX,PathShearY,PathSkew,ProfileBegin,ProfileEnd,Scale,PathCurve,ProfileCurve,ParentID,ProfileHollow,PathRadiusOffset,PathRevolutions,PathTaperX,PathTaperY,PathTwist,PathTwistBegin,Texture,CreationDate,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,Position,Rotation,LocalID,FullID) "; + sql += "VALUES ("; + sql += "\"" + prim.OwnerID.ToStringHyphenated() + "\","; // KILL ME NOW! + sql += "\"" + prim.PCode.ToString() + "\","; + sql += "\"" + prim.PathBegin.ToString() + "\","; + sql += "\"" + prim.PathEnd.ToString() + "\","; + sql += "\"" + prim.PathScaleX.ToString() + "\","; + sql += "\"" + prim.PathScaleY.ToString() + "\","; + sql += "\"" + prim.PathShearX.ToString() + "\","; + sql += "\"" + prim.PathShearY.ToString() + "\","; + sql += "\"" + prim.PathSkew.ToString() + "\","; + sql += "\"" + prim.ProfileBegin.ToString() + "\","; + sql += "\"" + prim.ProfileEnd.ToString() + "\","; + sql += "\"" + prim.Scale.ToString() + "\","; + sql += "\"" + prim.PathCurve.ToString() + "\","; + sql += "\"" + prim.ProfileCurve.ToString() + "\","; + sql += "\"" + prim.ParentID.ToString() + "\","; + sql += "\"" + prim.ProfileHollow.ToString() + "\","; + sql += "\"" + prim.PathRadiusOffset.ToString() + "\","; + sql += "\"" + prim.PathRevolutions.ToString() + "\","; + sql += "\"" + prim.PathTaperX.ToString() + "\","; + sql += "\"" + prim.PathTaperY.ToString() + "\","; + sql += "\"" + prim.PathTwist.ToString() + "\","; + sql += "\"" + prim.PathTwistBegin.ToString() + "\","; + sql += "\"" + prim.TextureEntry.ToString() + "\","; + sql += "\"" + prim.CreationDate.ToString() + "\","; + sql += "\"" + prim.OwnerMask.ToString() + "\","; + sql += "\"" + prim.NextOwnerMask.ToString() + "\","; + sql += "\"" + prim.GroupMask.ToString() + "\","; + sql += "\"" + prim.EveryoneMask.ToString() + "\","; + sql += "\"" + prim.BaseMask.ToString() + "\","; + sql += "\"" + prim.Position.ToString() + "\","; + sql += "\"" + prim.Rotation.ToString() + "\","; + sql += "\"" + prim.LocalID.ToString() + "\","; + sql += "\"" + prim.FullID.ToString() + "\")"; + + cmd.CommandText = sql; + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + MainLog.Instance.Warn("SQLiteLocalStorage :StorePrim - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + + cmd.Dispose(); + cmd = null; + } + + public void RemovePrim(LLUUID primID) + { + IDbCommand cmd = db.CreateCommand(); + + //SECURITY WARNING: + // These parameters wont produce SQL injections since they are all integer based, however. + // if inserting strings such as name or description, you will need to use appropriate + // measures to prevent SQL injection (although the value of SQL injection in this is limited). + + string sql = "DELETE FROM prim WHERE FullID = \"" + primID.ToStringHyphenated() + "\""; + + cmd.CommandText = sql; + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + MainLog.Instance.Warn("SQLiteLocalStorage :RemovePrim - Exception occured"); + MainLog.Instance.Warn(e.ToString()); + } + + cmd.Dispose(); + cmd = null; + } + + public void LoadPrimitives(ILocalStorageReceiver receiver) + { + + } + + public float[] LoadWorld() + { + return new float[65536]; + } + + public void SaveMap(float[] heightmap) + { + + } + + public void SaveParcels(ParcelData[] parcel_manager) + { + + } + + public void SaveParcel(ParcelData parcel) + { + } + + public void RemoveParcel(ParcelData parcel) + { + } + + public void RemoveAllParcels() + { + } + + public void LoadParcels(ILocalStorageParcelReceiver recv) + { + recv.NoParcelDataFromStorage(); + } + + public void ShutDown() + { + db.Close(); + db = null; + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/obj/Debug/OpenSim.Region.Storage.LocalStorageSQLite.dll b/OpenSim/Region/Storage/LocalStorageSQLite/obj/Debug/OpenSim.Region.Storage.LocalStorageSQLite.dll new file mode 100644 index 0000000000000000000000000000000000000000..c32fa3b0b55e77bdb7b2c34bf333cb06aaf4f770 GIT binary patch literal 20480 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 L;78yS8G-)-0~$M! literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/obj/Debug/OpenSim.Region.Storage.LocalStorageSQLite.pdb b/OpenSim/Region/Storage/LocalStorageSQLite/obj/Debug/OpenSim.Region.Storage.LocalStorageSQLite.pdb new file mode 100644 index 0000000000000000000000000000000000000000..47ed3157ace443fd4b7461e208319bb4c4d9b6d3 GIT binary patch literal 15872 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 W6u!pW6h5b5)3+Bi1=k8St^6-BM10Qx literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/obj/OpenSim.Region.Storage.LocalStorageSQLite.csproj.FileList.txt b/OpenSim/Region/Storage/LocalStorageSQLite/obj/OpenSim.Region.Storage.LocalStorageSQLite.csproj.FileList.txt new file mode 100644 index 0000000000..40e6ab41a7 --- /dev/null +++ b/OpenSim/Region/Storage/LocalStorageSQLite/obj/OpenSim.Region.Storage.LocalStorageSQLite.csproj.FileList.txt @@ -0,0 +1,7 @@ +..\..\..\..\bin\OpenSim.Region.Storage.LocalStorageSQLite.dll +obj\Release\ResolveAssemblyReference.cache +obj\Release\OpenSim.Region.Storage.LocalStorageSQLite.dll +obj\Debug\ResolveAssemblyReference.cache +obj\Debug\OpenSim.Region.Storage.LocalStorageSQLite.dll +obj\Debug\OpenSim.Region.Storage.LocalStorageSQLite.pdb +..\..\..\..\bin\OpenSim.Region.Storage.LocalStorageSQLite.pdb diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/obj/Release/OpenSim.Region.Storage.LocalStorageSQLite.dll b/OpenSim/Region/Storage/LocalStorageSQLite/obj/Release/OpenSim.Region.Storage.LocalStorageSQLite.dll new file mode 100644 index 0000000000000000000000000000000000000000..6fecaada4d591bb03c8fe2352fe2ccbacb1d2af2 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Storage/LocalStorageSQLite/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Storage/LocalStorageSQLite/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..d1b3e0bb5ea259afdd950b363b059612596891fa GIT binary patch literal 18251 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 + + Local + 8.0.50727 + 2.0 + {C9E0F891-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + OpenSim.Region.Terrain.BasicTerrain + JScript + Grid + IE50 + false + Library + + OpenSim.Region.Terrain.BasicTerrain + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + False + 285212672 + False + + + TRACE + + False + 4096 + True + ..\..\..\bin\ + False + False + False + 4 + + + + + ..\..\..\bin\libTerrain-BSD.dll + False + + + Microsoft.JScript.dll + False + + + ..\..\..\bin\openjpegnet.dll + False + + + System.dll + False + + + System.Data.dll + False + + + System.Drawing.dll + False + + + System.Xml.dll + False + + + + + + + Code + + + Code + + + Code + + + + + + + + + + diff --git a/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj.user b/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj.user new file mode 100644 index 0000000000..bc25d4fed8 --- /dev/null +++ b/OpenSim/Region/Terrain.BasicTerrain/OpenSim.Region.Terrain.BasicTerrain.csproj.user @@ -0,0 +1,12 @@ + + + Debug + AnyCPU + C:\Sugilite\bin\ + 8.0.50727 + ProjectFiles + 0 + + + + diff --git a/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs b/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..9c721d16fb --- /dev/null +++ b/OpenSim/Region/Terrain.BasicTerrain/Properties/AssemblyInfo.cs @@ -0,0 +1,60 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System.Reflection; +using System.Runtime.InteropServices; +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Region.Terrain.BasicTerrain")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Region.Terrain.BasicTerrain")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3263f5b5-0a41-4ed5-91a2-9baaaeecc849")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs new file mode 100644 index 0000000000..6c9ec268fd --- /dev/null +++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs @@ -0,0 +1,928 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using libTerrain; +using OpenJPEGNet; + +namespace OpenSim.Region.Terrain +{ + public class TerrainCommand + { + public virtual bool run(string[] cmdargs, ref string output) + { + return false; + } + + public string args; + public string help; + } + + public class TerrainEngine + { + /// + /// Plugin library for scripts + /// + public FilterHost customFilters = new FilterHost(); + + /// + /// A [normally] 256x256 heightmap + /// + public Channel heightmap; + + /// + /// A copy of heightmap at the last save point (for reverting) + /// + public Channel revertmap; + + /// + /// Water heightmap (needs clientside mods to work) + /// + public Channel watermap; + + /// + /// Whether or not the terrain has been modified since it was last saved and sent to the Physics engine. + /// Counts the number of modifications since the last save. (0 = Untainted) + /// + public int tainted; + + int w, h; + + /// + /// Generate a new TerrainEngine instance and creates a new heightmap + /// + public TerrainEngine() + { + w = 256; + h = 256; + heightmap = new Channel(w, h); + + tainted++; + } + + /// + /// Converts the heightmap to a 65536 value 1D floating point array + /// + /// A float[65536] array containing the heightmap + public float[] getHeights1D() + { + float[] heights = new float[w * h]; + int i; + + for (i = 0; i < w * h; i++) + { + heights[i] = (float)heightmap.map[i / w, i % w]; + } + + return heights; + } + + /// + /// Converts the heightmap to a 256x256 value 2D floating point array. + /// + /// An array of 256,256 values containing the heightmap + public float[,] getHeights2D() + { + float[,] heights = new float[w, h]; + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + heights[x, y] = (float)heightmap.map[x, y]; + } + } + return heights; + } + + /// + /// Imports a 1D floating point array into the 2D heightmap array + /// + /// The array to import (must have 65536 members) + public void setHeights1D(float[] heights) + { + int i; + for (i = 0; i < w * h; i++) + { + heightmap.map[i / w, i % w] = heights[i]; + } + + tainted++; + } + + /// + /// Loads a 2D array of values into the heightmap + /// + /// An array of 256,256 float values + public void setHeights2D(float[,] heights) + { + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + heightmap.set(x, y, (double)heights[x, y]); + } + } + tainted++; + } + + /// + /// Swaps the two heightmap buffers (the 'revert map' and the heightmap) + /// + public void swapRevertMaps() + { + Channel backup = heightmap.copy(); + heightmap = revertmap; + revertmap = backup; + } + + /// + /// Saves the current heightmap into the revertmap + /// + public void saveRevertMap() + { + revertmap = heightmap.copy(); + } + + /// + /// Processes a terrain-specific command + /// + /// Commandline arguments (space seperated) + /// Reference that returns error or help text if returning false + /// If the operation was successful (if not, the error is placed into resultText) + public bool RunTerrainCmd(string[] args, ref string resultText, string simName) + { + string command = args[0]; + + try + { + + switch (command) + { + case "help": + resultText += "terrain regenerate - rebuilds the sims terrain using a default algorithm\n"; + resultText += "terrain voronoi - generates a worley fractal with X points per block"; + resultText += "terrain seed - sets the random seed value to \n"; + resultText += "terrain load - loads a terrain from disk, type can be 'F32', 'F64', 'RAW' or 'IMG'\n"; + resultText += "terrain save - saves a terrain to disk, type can be 'F32', 'F64', 'PNG', 'RAW' or 'HIRAW'\n"; + resultText += "terrain save grdmap - creates a PNG snapshot of the region using a named gradient map\n"; + resultText += "terrain rescale - rescales a terrain to be between and meters high\n"; + resultText += "terrain erode aerobic \n"; + resultText += "terrain erode thermal \n"; + resultText += "terrain multiply - multiplies a terrain by \n"; + resultText += "terrain revert - reverts the terrain to the stored original\n"; + resultText += "terrain bake - saves the current terrain into the revert map\n"; + resultText += "terrain csfilter - loads a new filter from the specified .cs file\n"; + resultText += "terrain jsfilter - loads a new filter from the specified .js file\n"; + foreach (KeyValuePair filter in customFilters.filters) + { + resultText += filter.Value.Help(); + } + + return false; + + case "revert": + swapRevertMaps(); + saveRevertMap(); + break; + + case "bake": + saveRevertMap(); + break; + + case "seed": + setSeed(Convert.ToInt32(args[1])); + break; + + case "erode": + return consoleErosion(args, ref resultText); + + case "voronoi": + double[] c = new double[2]; + c[0] = -1; + c[1] = 1; + heightmap.voronoiDiagram(Convert.ToInt32(args[1]), Convert.ToInt32(args[2]), c); + break; + + case "hills": + return consoleHills(args, ref resultText); + + case "regenerate": + hills(); + break; + + case "rescale": + setRange(Convert.ToSingle(args[1]), Convert.ToSingle(args[2])); + break; + + case "multiply": + heightmap *= Convert.ToDouble(args[1]); + break; + + case "load": + args[2].Replace("%name%", simName); + switch (args[1].ToLower()) + { + case "f32": + loadFromFileF32(args[2]); + break; + + case "f64": + loadFromFileF64(args[2]); + break; + + case "raw": + loadFromFileSLRAW(args[2]); + break; + + case "img": + heightmap.loadImage(args[2]); + return false; + + default: + resultText = "Unknown image or data format"; + return false; + } + break; + + case "save": + args[2].Replace("%name%", simName); + switch (args[1].ToLower()) + { + case "f32": + writeToFileF32(args[2]); + break; + + case "f64": + writeToFileF64(args[2]); + break; + + case "grdmap": + exportImage(args[2], args[3]); + break; + + case "png": + heightmap.saveImage(args[2]); + break; + + case "raw": + writeToFileRAW(args[2]); + break; + + case "hiraw": + writeToFileHiRAW(args[2]); + break; + + default: + resultText = "Unknown image or data format"; + return false; + } + break; + + case "csfilter": + customFilters.LoadFilterCSharp(args[1]); + break; + case "jsfilter": + customFilters.LoadFilterJScript(args[1]); + break; + + default: + // Run any custom registered filters + if (customFilters.filters.ContainsKey(command)) + { + customFilters.filters[command].Filter(heightmap, args); + break; + } + else + { + resultText = "Unknown terrain command"; + return false; + } + } + return true; + } + catch (Exception e) + { + resultText = "Error running terrain command: " + e.ToString(); + return false; + } + } + + private bool consoleErosion(string[] args, ref string resultText) + { + switch (args[1].ToLower()) + { + case "aerobic": + // WindSpeed, PickupMinimum,DropMinimum,Carry,Rounds,Lowest + heightmap.AerobicErosion(Convert.ToDouble(args[2]), Convert.ToDouble(args[3]), Convert.ToDouble(args[4]), Convert.ToDouble(args[5]), Convert.ToInt32(args[6]), Convert.ToBoolean(args[7])); + break; + case "thermal": + heightmap.thermalWeathering(Convert.ToDouble(args[2]), Convert.ToInt32(args[3]), Convert.ToDouble(args[4])); + break; + default: + resultText = "Unknown erosion type"; + return false; + } + return true; + } + + private bool consoleHills(string[] args, ref string resultText) + { + int count; + double sizeMin; + double sizeRange; + bool island; + bool additive; + bool noisy; + + if (args.GetLength(0) > 2) + { + count = Convert.ToInt32(args[2]); + sizeMin = Convert.ToDouble(args[3]); + sizeRange = Convert.ToDouble(args[4]); + island = Convert.ToBoolean(args[5]); + additive = Convert.ToBoolean(args[6]); + noisy = Convert.ToBoolean(args[7]); + } + else + { + count = 200; + sizeMin = 20; + sizeRange = 40; + island = true; + additive = true; + noisy = false; + } + + switch (args[1].ToLower()) + { + case "blocks": + heightmap.hillsBlocks(count, sizeMin, sizeRange, island, additive, noisy); + break; + case "cones": + heightmap.hillsCones(count, sizeMin, sizeRange, island, additive, noisy); + break; + case "spheres": + heightmap.hillsSpheres(count, sizeMin, sizeRange, island, additive, noisy); + break; + case "squared": + heightmap.hillsSquared(count, sizeMin, sizeRange, island, additive, noisy); + break; + default: + resultText = "Unknown hills type"; + return false; + } + return true; + } + + /// + /// Renormalises the array between min and max + /// + /// Minimum value of the new array + /// Maximum value of the new array + public void setRange(float min, float max) + { + heightmap.normalise((double)min, (double)max); + tainted++; + } + + /// + /// Loads a file consisting of 256x256 doubles and imports it as an array into the map. + /// + /// TODO: Move this to libTerrain itself + /// The filename of the double array to import + public void loadFromFileF64(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + heightmap.map[x, y] = bs.ReadDouble(); + } + } + + bs.Close(); + s.Close(); + + tainted++; + } + + /// + /// Loads a file consisting of 256x256 floats and imports it as an array into the map. + /// + /// TODO: Move this to libTerrain itself + /// The filename of the float array to import + public void loadFromFileF32(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + heightmap.map[x, y] = (double)bs.ReadSingle(); + } + } + + bs.Close(); + s.Close(); + + tainted++; + } + + /// + /// Loads a file formatted in the SL .RAW Format used on the main grid + /// + /// This file format stinks and is best avoided. + /// A path to the .RAW format + public void loadFromFileSLRAW(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.Open, FileAccess.Read); + BinaryReader bs = new BinaryReader(s); + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + heightmap.map[x, y] = (double)bs.ReadByte() * ((double)bs.ReadByte() / 127.0); + bs.ReadBytes(11); // Advance the stream to next bytes. + } + } + + bs.Close(); + s.Close(); + + tainted++; + } + + /// + /// Writes the current terrain heightmap to disk, in the format of a 65536 entry double[] array. + /// + /// The desired output filename + public void writeToFileF64(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); + BinaryWriter bs = new BinaryWriter(s); + + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + bs.Write(heightmap.get(x, y)); + } + } + + bs.Close(); + s.Close(); + } + + /// + /// Writes the current terrain heightmap to disk, in the format of a 65536 entry float[] array + /// + /// The desired output filename + public void writeToFileF32(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); + BinaryWriter bs = new BinaryWriter(s); + + int x, y; + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + bs.Write((float)heightmap.get(x, y)); + } + } + + bs.Close(); + s.Close(); + } + + /// + /// A very fast LL-RAW file output mechanism - lower precision mechanism but wont take 5 minutes to run either. + /// (is also editable in an image application) + /// + /// Filename to write to + public void writeToFileRAW(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); + BinaryWriter bs = new BinaryWriter(s); + + int x, y; + + // Used for the 'green' channel. + byte avgMultiplier = (byte)heightmap.avg(); + byte backupMultiplier = (byte)revertmap.avg(); + + // Limit the multiplier so it can represent points >64m. + if (avgMultiplier > 196) + avgMultiplier = 196; + if(backupMultiplier > 196) + backupMultiplier = 196; + // Make sure it's at least one to prevent a div by zero + if (avgMultiplier < 1) + avgMultiplier = 1; + if(backupMultiplier < 1) + backupMultiplier = 1; + + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + byte red = (byte)(heightmap.get(x, y) / ((double)avgMultiplier / 128.0)); + byte green = avgMultiplier; + byte blue = (byte)watermap.get(x, y); + byte alpha1 = 0; // Land Parcels + byte alpha2 = 0; // For Sale Land + byte alpha3 = 0; // Public Edit Object + byte alpha4 = 0; // Public Edit Land + byte alpha5 = 255; // Safe Land + byte alpha6 = 255; // Flying Allowed + byte alpha7 = 255; // Create Landmark + byte alpha8 = 255; // Outside Scripts + byte alpha9 = (byte)(revertmap.get(x, y) / ((double)backupMultiplier / 128.0)); + byte alpha10 = backupMultiplier; + + bs.Write(red); + bs.Write(green); + bs.Write(blue); + bs.Write(alpha1); + bs.Write(alpha2); + bs.Write(alpha3); + bs.Write(alpha4); + bs.Write(alpha5); + bs.Write(alpha6); + bs.Write(alpha7); + bs.Write(alpha8); + bs.Write(alpha9); + bs.Write(alpha10); + } + } + bs.Close(); + s.Close(); + } + + /// + /// Outputs to a LL compatible RAW in the most efficient manner possible + /// + /// Does not calculate the revert map + /// The filename to output to + public void writeToFileHiRAW(string filename) + { + FileInfo file = new FileInfo(filename); + FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write); + BinaryWriter bs = new BinaryWriter(s); + + // Generate a smegging big lookup table to speed the operation up (it needs it) + double[] lookupTable = new double[65536]; + int i, j, x, y; + for (i = 0; i < 256; i++) + { + for (j = 0; j < 256; j++) + { + lookupTable[i + (j * 256)] = ((double)i * ((double)j / 127.0)); + } + } + + // Output the calculated raw + for (x = 0; x < w; x++) + { + for (y = 0; y < h; y++) + { + double t = heightmap.get(x, y); + double min = double.MaxValue; + int index = 0; + + for (i = 0; i < 65536; i++) + { + if (Math.Abs(t - lookupTable[i]) < min) + { + min = Math.Abs(t - lookupTable[i]); + index = i; + } + } + + byte red = (byte)(index & 0xFF); + byte green = (byte)((index >> 8) & 0xFF); + byte blue = (byte)watermap.get(x, y); + byte alpha1 = 0; // Land Parcels + byte alpha2 = 0; // For Sale Land + byte alpha3 = 0; // Public Edit Object + byte alpha4 = 0; // Public Edit Land + byte alpha5 = 255; // Safe Land + byte alpha6 = 255; // Flying Allowed + byte alpha7 = 255; // Create Landmark + byte alpha8 = 255; // Outside Scripts + byte alpha9 = red; + byte alpha10 = green; + + bs.Write(red); + bs.Write(green); + bs.Write(blue); + bs.Write(alpha1); + bs.Write(alpha2); + bs.Write(alpha3); + bs.Write(alpha4); + bs.Write(alpha5); + bs.Write(alpha6); + bs.Write(alpha7); + bs.Write(alpha8); + bs.Write(alpha9); + bs.Write(alpha10); + } + } + + bs.Close(); + s.Close(); + } + + /// + /// Sets the random seed to be used by procedural functions which involve random numbers. + /// + /// The desired seed + public void setSeed(int val) + { + heightmap.seed = val; + } + + /// + /// Raises land in a sphere around the specified coordinates + /// + /// Center of the sphere on the X axis + /// Center of the sphere on the Y axis + /// The radius of the sphere + /// Scale the height of the sphere by this amount (recommended 0..2) + public void raise(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + heightmap.raise(rx, ry, size, amount); + } + + tainted++; + } + + /// + /// Lowers the land in a sphere around the specified coordinates + /// + /// The center of the sphere at the X axis + /// The center of the sphere at the Y axis + /// The radius of the sphere in meters + /// Scale the height of the sphere by this amount (recommended 0..2) + public void lower(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + heightmap.lower(rx, ry, size, amount); + } + + tainted++; + } + + /// + /// Flattens the land under the brush of specified coordinates (spherical mask) + /// + /// Center of sphere + /// Center of sphere + /// Radius of the sphere + /// Thickness of the mask (0..2 recommended) + public void flatten(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + heightmap.flatten(rx, ry, size, amount); + } + + tainted++; + } + + /// + /// Creates noise within the specified bounds + /// + /// Center of the bounding sphere + /// Center of the bounding sphere + /// The radius of the sphere + /// Strength of the mask (0..2) recommended + public void noise(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + Channel smoothed = new Channel(); + smoothed.noise(); + + Channel mask = new Channel(); + mask.raise(rx, ry, size, amount); + + heightmap.blend(smoothed, mask); + } + + tainted++; + } + + /// + /// Reverts land within the specified bounds + /// + /// Center of the bounding sphere + /// Center of the bounding sphere + /// The radius of the sphere + /// Strength of the mask (0..2) recommended + public void revert(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + Channel mask = new Channel(); + mask.raise(rx, ry, size, amount); + + heightmap.blend(revertmap, mask); + } + + tainted++; + } + + /// + /// Smooths land under the brush of specified coordinates (spherical mask) + /// + /// Center of the sphere + /// Center of the sphere + /// Radius of the sphere + /// Thickness of the mask (0..2 recommended) + public void smooth(double rx, double ry, double size, double amount) + { + lock (heightmap) + { + Channel smoothed = heightmap.copy(); + smoothed.smooth(amount); + + Channel mask = new Channel(); + mask.raise(rx,ry,size,amount); + + heightmap.blend(smoothed, mask); + } + + tainted++; + } + + /// + /// Generates a simple set of hills in the shape of an island + /// + public void hills() + { + lock (heightmap) + { + heightmap.hillsSpheres(200, 20, 40, true, true, false); + heightmap.normalise(); + heightmap *= 60.0; // Raise to 60m + } + + tainted++; + } + + /// + /// Wrapper to heightmap.get() + /// + /// X coord + /// Y coord + /// Height at specified coordinates + public double get(int x, int y) + { + return heightmap.get(x, y); + } + + /// + /// Multiplies the heightfield by val + /// + /// The heightfield + /// The multiplier + /// + public static TerrainEngine operator *(TerrainEngine meep, Double val) + { + meep.heightmap *= val; + meep.tainted++; + return meep; + } + + /// + /// Exports the current heightmap to a PNG file + /// + /// The destination filename for the image + /// A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal. + public void exportImage(string filename, string gradientmap) + { + try + { + Bitmap gradientmapLd = new Bitmap(gradientmap); + + int pallete = gradientmapLd.Height; + + Bitmap bmp = new Bitmap(heightmap.w, heightmap.h); + Color[] colours = new Color[pallete]; + + for (int i = 0; i < pallete; i++) + { + colours[i] = gradientmapLd.GetPixel(0, i); + } + + Channel copy = heightmap.copy(); + for (int x = 0; x < copy.w; x++) + { + for (int y = 0; y < copy.h; y++) + { + // 512 is the largest possible height before colours clamp + int colorindex = (int)(Math.Max(Math.Min(1.0, copy.get(x, y) / 512.0), 0.0) * pallete); + bmp.SetPixel(x, y, colours[colorindex]); + } + } + + bmp.Save(filename, ImageFormat.Png); + } + catch (Exception e) + { + Console.WriteLine("Failed generating terrain map: " + e.ToString()); + } + } + + /// + /// Exports the current heightmap in Jpeg2000 format to a byte[] + /// + /// A 1x*height* image which contains the colour gradient to export with. Must be at least 1x2 pixels, 1x256 or more is ideal. + public byte[] exportJpegImage(string gradientmap) + { + byte[] imageData = null; + try + { + Bitmap gradientmapLd = new Bitmap(gradientmap); + + int pallete = gradientmapLd.Height; + + Bitmap bmp = new Bitmap(heightmap.w, heightmap.h); + Color[] colours = new Color[pallete]; + + for (int i = 0; i < pallete; i++) + { + colours[i] = gradientmapLd.GetPixel(0, i); + } + + Channel copy = heightmap.copy(); + for (int x = 0; x < copy.w; x++) + { + for (int y = 0; y < copy.h; y++) + { + // 512 is the largest possible height before colours clamp + int colorindex = (int)(Math.Max(Math.Min(1.0, copy.get(copy.h - y, x) / 512.0), 0.0) * pallete); + bmp.SetPixel(x, y, colours[colorindex]); + } + } + + //bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Png); + imageData = OpenJPEG.EncodeFromImage(bmp, "map"); + + } + catch (Exception e) + { + Console.WriteLine("Failed generating terrain map: " + e.ToString()); + } + + return imageData; + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs new file mode 100644 index 0000000000..a38be0799a --- /dev/null +++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainFilter.cs @@ -0,0 +1,126 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using libTerrain; +using Microsoft.CSharp; +using Microsoft.JScript; + +namespace OpenSim.Region.Terrain +{ + public interface ITerrainFilter + { + void Filter(Channel heightmap, string[] args); + string Register(); + string Help(); + } + + public class TestFilter : ITerrainFilter + { + public void Filter(Channel heightmap, string[] args) + { + Console.WriteLine("Hello world"); + } + + public string Register() + { + return "demofilter"; + } + + public string Help() + { + return "demofilter - Does nothing"; + } + } + + public class FilterHost + { + public Dictionary filters = new Dictionary(); + + private void LoadFilter(CodeDomProvider compiler, string filename) + { + CompilerParameters compilerParams = new CompilerParameters(); + CompilerResults compilerResults; + compilerParams.GenerateExecutable = false; + compilerParams.GenerateInMemory = true; + compilerParams.IncludeDebugInformation = false; + compilerParams.ReferencedAssemblies.Add("libTerrain-BSD.dll"); + compilerParams.ReferencedAssemblies.Add("OpenSim.Terrain.BasicTerrain.dll"); + compilerParams.ReferencedAssemblies.Add("System.dll"); + + compilerResults = compiler.CompileAssemblyFromFile(compilerParams, filename); + + if (compilerResults.Errors.Count > 0) + { + Console.WriteLine("Compile errors:"); + foreach (CompilerError error in compilerResults.Errors) + { + Console.WriteLine(error.Line.ToString() + ": " + error.ErrorText.ToString()); + } + } + else + { + foreach (Type pluginType in compilerResults.CompiledAssembly.GetExportedTypes()) + { + Type testInterface = pluginType.GetInterface("ITerrainFilter",true); + + if (testInterface != null) + { + ITerrainFilter filter = (ITerrainFilter)compilerResults.CompiledAssembly.CreateInstance(pluginType.ToString()); + + string filterName = filter.Register(); + Console.WriteLine("Plugin: " + filterName + " loaded."); + + if (!filters.ContainsKey(filterName)) + { + filters.Add(filterName, filter); + } + else + { + filters[filterName] = filter; + } + } + } + } + + } + + public void LoadFilterCSharp(string filename) + { + CSharpCodeProvider compiler = new CSharpCodeProvider(); + LoadFilter(compiler, filename); + } + + public void LoadFilterJScript(string filename) + { + JScriptCodeProvider compiler = new JScriptCodeProvider(); + LoadFilter(compiler, filename); + } + } +} diff --git a/OpenSim/Region/Terrain.BasicTerrain/obj/Debug/OpenSim.Region.Terrain.BasicTerrain.dll b/OpenSim/Region/Terrain.BasicTerrain/obj/Debug/OpenSim.Region.Terrain.BasicTerrain.dll new file mode 100644 index 0000000000000000000000000000000000000000..9271d9f8bf3b3abc077afbbb33e0737acdc14c6a GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Terrain.BasicTerrain/obj/Debug/OpenSim.Region.Terrain.BasicTerrain.pdb b/OpenSim/Region/Terrain.BasicTerrain/obj/Debug/OpenSim.Region.Terrain.BasicTerrain.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e0dabe522e51b391a6aff68483799a55b6141c5d GIT binary patch literal 38400 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
e7$}R~k~Zgx2yJ_9tY??! zl`Avn0okADX<&f|F=sbVBKr85vZvw}j{7c&gfb__X%~h~eWPVMk;x;jb5K7;?j#)f zv`v|UgXrWNJ#xf_T1IG>Q_Qg=ZQ+;&kaHEngkx(zMUzyp?GjpsO*)z zbIP&qy;WNo!$;E6W;Ty8~$`1e^d9;x>|fF4j&;LaQHh^ z)J5(DZkO;TIXp@kItGryWl)>O@B;%bbC82{#tGz@E8@O%^UPZXnn13Cb|s{E0UXXlSB85+pBZ5bSy{9>EOfIL7wwKVN~Z3UMch>m zou*LjasyJ-;gyV{V>WgSic&CuAxI&gqk<>lj;6Iuh_WJvltK?F0l;D8r1>n%qm1Fm z32g;_)i?F!Mx*KxOW}P^Nnlq*qcYtH#W&C>R5`%tnCS8}3}ZPP-iRlg&c>V+9W$bn z;0_D3v(U&!aj7&Zh4%!hy8f8sVWw*OR8BV9?9V;h=I4Ejm}kqUA!NvkfX4xl45;** z6lRjGnE=mq9ne~B4A%3F9s91pRVx@88!I7_&cM!D=<*`avOOGu9ZcW&#Tms6K%+)Ed(zRER6MN^QIREyr=NY z$T-7O&2z?xpyxA}ZZCH<8MggFNQcb=3a%;Pk(&Lswpb6Bnb>%6xUz{{%lC}m ztck3-&cx_aF`K-km*Si9VX@ncy=AyN+ne-A`L!UUZd3~&E)P4E%@+7c6jv2IZi|`}at1H%gQTQgG zk>0)S2GpP#_3?;i$jS9rJ}qywM@BC`qsi#*p9v^hdt{=PtSILdOf%R~_-w~MEcxTG zlp~fn&Ms~2WBLfoW02*Y!#mg_`}RF`>b-3|?WK<49*e`o`e zv-vn(fV9@_Y0Z_Sa$OIgu8dIZ35=VxLRp$eZj?q)I(>TWz@KCc(*Qnsj)~rtzC9w| z??n9!(BfU9u|#U1*~7qwqZ8Zh>!pSLu%-ar604MF1$#)DHsGteK%;H2 zLF-mgpLOxkeh4;B08t*1sBcY&3C6#ZA6b_EtFKN4PJVFnm)bwJYDfO~y<|Lg`h)wf zS^L`EdP-H>Vl!i^77L_E325;-xWlSu1XI)&38!dQMCGpop_HPuMNCjnV59<~Wh|6Z zl}IFrk{A<1PX(1IF36*Xf$vN4NIb%v5<^|3EfhniN<7@gJ;n@ec08)a;xjcCT0(`& zl?}ttW<^Ecx|fD@wJl=ko&j1afJzbkV$!$BkfLZnR}83#7)DT6K~fYC2X%BAQ~-u9 zd-OVnxvG+&gkk`R1kFs~o3I*-#dOasGextlTTzlwbk4w1A-dfc-OeI(kx(!kHAsqq z@v&uXQ81AhNHoSM;73i20(7GXB)}pbW(rMON=d+qd3sB1wk0&SMdJlEW_Vr3Vg~f6 zv2aQg*cvMOfIfrA%9t4j7a7s0s;XgKmzfwaMWtvM$)t7GnmUJml=#%$ur%7DhvF0Q z$@tWV3I`g@Bi$Oc&q704j=@;Lu!smTUxRsQ!X|(da^bj#u7>xi?@&eKk~4 z<^yR4BOW$%jDi2*4_^g;apS=|t?!u|U<=QSHFW{qkP2slw_%JBgz(F#sXyXLiy>uw zvDvyApL)>1-Nr4T*D&G*gVeSVWU*GgMPwQ)gy0ra|BwqZUXeNxb8 zV8(p>PzN(6#s5Xanut$*550rNRJ5HRTck(PP&9uIQvN?P)&}FAG2$7nZG_-@Q-3Y! zD-nhC)%Xz>{t-T{(vmgZ>(?A!H@dE)E3cS5k(h4npFYmF*Q20-ja4o>E9%w{O-r{CTyPab7ohaVt zIVa1?@8L(D{`DU?pYpl-^n6Xd>5_x}jysUg@4`D+`8m$EJNcU*U+*l1E^E4OGuK4m z*Fk`P$0q((aH?Jl`#0ftN_3f=>utxq{}2iT%*ksifCD7$qhb6N(mvXPXZT?}$?w6_ z{z0U>@j7FVsQ6^?r*F%z?_y0tCR6+^n7D$Vs+aeZ0b~?t<%5*mzVS618#W&~`C3BU zY6PWxSj4wzr2LkT4{q|h7<>&%71)Gt*{nrEU{n*2}8#Vpy6Gs*QAj;!ejblky^=A9hsLzPVV~u=Z z+YJ=>pie-aUuI1o!2Zwdsvf*B|8exUQ;d!u4f!Be!V!%T;dcXg0JwrIg&@aENn7~|C;GuqRzbU*3k5oL5_5C!?X5(D; zh&FxjFn*g^5bsL)J?pP(2RNHo6M-fIO$3?d^Z!2bp+#|G#C literal 0 HcmV?d00001 diff --git a/OpenSim/Region/Terrain.BasicTerrain/obj/Release/ResolveAssemblyReference.cache b/OpenSim/Region/Terrain.BasicTerrain/obj/Release/ResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..ded6c6b9000cd31a4d8ebb963d5b775acee11fa9 GIT binary patch literal 8142 zcmeHMTXPge6yDy$jDPl|(A`!6yo1#==jkCMGn}NwpYGyVN zN+Fh_P$l}{rOMlbmj^E|-l}{Mee?F@rOJ1Ifd4_y*E_rENmfY+Pg~nz&z#eJy61HF z*I#!J5f+I={-J~?QYuQ~@ndGebv&o!XGSWfRm@Bn-WjjA`y_Wg)3FElW_IJRw>w+0 z{EEv5ZC>$R!|LrGujDPWaFowYIA^#$nBTpx)L%MK+OwzFzuVYn#PFIe4O`FT<~*NI z=X}HG@KQ^r#f8;qM!|R7 zM9`gN)|s9$T<&(F(X3PCOlGqBFK^nD&J4Ft&+xL%{Y=ra;^@`p zkcVaFC%EexroC$n%>1P%1zNk7Bj&`F4EPt5Vw$E7?x1^tteUtaU04pVxjWeQM4Xn1Bn=3x8go_7@pk!q~Ya!*R;!R zY*PTr6TB2Gq|iu-rE~|qGJYqC5oy{NmcCf{%USw%#j+9@sR&jxnpRfa6Llk1Q|}_t zh2chG7-2CBn@EXoCUH271Kb!^{tthG8V zFUKz9b+k>48>YLi)`r*(d@~Quor~+EmQnW7qM?QQERl$?Hjxt1XtE<%qd^q?^?k%H zndORWVEe1BTH?f-Iu{D|#%gU_N)JoAc5u1z1o4MPpur1drV_&wjqjw{YnRAJQ+p`q zBK_jMBzE9nFwoc6mmTPl{03OcuhiypMk!oX#KSI-cnq{D%zeTHT?%gBkNhxYYHB}a ziV?n_l%4-I!r@wCkPnbQ`#BgFWuA z4hj>LDdK$)`QbNf>JVj$cpoBVCGifEKl`3yz&tARWPBGGR6s#pBdZ?ow`45D3(^$v zjtWoEr!XHDCTLT{dxVrQe8(t91p5dn%ZBe!a%Nu#!71}(d=-lHOF7anf=H6Cb&j2hg{<<-9$9?Ny@B3=M_Q+j>@spv zu(h<%)x_v}nkHDHB!kQcO^q(@5s1%TgH`w14s)rO$?ecP4E&*nyN#` z1a#h%(8Au342``mL+3RaI_V**iWFryXf~uIoE}@~YGQQZfGkmxLuQqdW=LbNN>F02 zNQTC)%D8%2#+8CQMhi4e44Mi}@DfUztwZN5pmSM53wud2H1?tlol7!w(ztyhMHz0C zprpk~!8Ngkt|ms;Gc>^xB|S@Km69%y#-5X)#O5VKV;9M)e-61o20n*S9s2x*j|nZ% zG%;wNrwLv{NiR@l6*`wlW9JDDwJ)M(6aR+GVinCt0Rh;=6x?=kdw~B4N gp)2S*+$w0hp(|EkxK*sghOQX#aH|;kMy~Du0{c=_O8@`> literal 0 HcmV?d00001 diff --git a/Prebuild/Prebuild.sln b/Prebuild/Prebuild.sln new file mode 100644 index 0000000000..449896b4ee --- /dev/null +++ b/Prebuild/Prebuild.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Prebuild", "src\Prebuild.csproj", "{92E80C1C-0000-0000-0000-000000000000}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {92E80C1C-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92E80C1C-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92E80C1C-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92E80C1C-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Prebuild/README b/Prebuild/README new file mode 100644 index 0000000000..eca6be17e2 --- /dev/null +++ b/Prebuild/README @@ -0,0 +1,230 @@ +Prebuild Instructions + +Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, SharpDevelop2, MonoDevelop, and NAnt. + +_________________________________________________________________________________ +Overview + +Prebuild can be either be run from the command line to generate the project and make files or you can execute the included batch (*.bat) and Unix Shell script (*.sh) files. +The Prebuild file + +_________________________________________________________________________________ +The currently supported developement tools and their associated batch and shell script files. + +Visual Studio .NET 2005 (VS2005.bat) +Visual Studio .NET 2003 (VS2003.bat) +Visual Studio .NET 2002 (VS2002.bat) +SharpDevelop (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ +SharpDevelop2 (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ +MonoDevelop (MonoDevelop.sh) - http://www.monodevelop.com/ +NAnt (nant.sh and nant.bat) - http://nant.sourceforge.net/ +Autotools (autotools.bat and autotools.sh) http://www.gnu.org. Only partial support + +Notes: +A Unix Shell script is provided for MonoDevelop, as this is more appropriate than a windows batch file. +Visual Studio .NET 2005 and the Visual Express IDE's can import solutions from older versions of Visual Studio .NET. +Makefiles are not currently supported. + +_________________________________________________________________________________ +Command Line Syntax: + +Example: +>Prebuild /target vs2003 + +This will generate the project files for Visual Studio.NET 2003 and place the redirect the log to a file named PrebuildLog.txt in the parent directory + + +The syntax structure is as below, where commandParameter is optional depending on the command and you can provide several option-value pairs. +Note: The '>' signified the command line, do not actually enter this manually + +>Prebuild /