diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index d9472284e5..2dceb54c7a 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs @@ -144,14 +144,14 @@ namespace OpenSim.Framework.Communications.Caches AssetBase asset = GetAsset(assetID); if (asset == null) { - this._assetServer.RequestAsset(assetID, isTexture); + this._assetServer.FetchAsset(assetID, isTexture); } return asset; } public void AddAsset(AssetBase asset) { - System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated()); + // System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated()); if (asset.Type == 0) { //Console.WriteLine("which is a texture"); @@ -159,7 +159,7 @@ namespace OpenSim.Framework.Communications.Caches { //texture TextureImage textur = new TextureImage(asset); this.Textures.Add(textur.FullID, textur); - this._assetServer.UploadNewAsset(asset); + this._assetServer.CreateAsset(asset); } else { @@ -173,7 +173,7 @@ namespace OpenSim.Framework.Communications.Caches { AssetInfo assetInf = new AssetInfo(asset); this.Assets.Add(assetInf.FullID, assetInf); - this._assetServer.UploadNewAsset(asset); + this._assetServer.CreateAsset(asset); } } } @@ -384,7 +384,7 @@ namespace OpenSim.Framework.Communications.Caches request.AssetRequestSource = source; request.Params = transferRequest.TransferInfo.Params; this.RequestedAssets.Add(requestID, request); - this._assetServer.RequestAsset(requestID, false); + this._assetServer.FetchAsset(requestID, false); } return; } @@ -561,7 +561,7 @@ namespace OpenSim.Framework.Communications.Caches request.IsTextureRequest = true; request.DiscardLevel = discard; this.RequestedTextures.Add(imageID, request); - this._assetServer.RequestAsset(imageID, true); + this._assetServer.FetchAsset(imageID, true); } return; } diff --git a/OpenSim/Framework/Communications/Cache/AssetServer.cs b/OpenSim/Framework/Communications/Cache/AssetServer.cs index fd203f743c..4e2644c6f6 100644 --- a/OpenSim/Framework/Communications/Cache/AssetServer.cs +++ b/OpenSim/Framework/Communications/Cache/AssetServer.cs @@ -73,7 +73,7 @@ namespace OpenSim.Framework.Communications.Caches this._receiver = receiver; } - public void RequestAsset(LLUUID assetID, bool isTexture) + public void FetchAsset(LLUUID assetID, bool isTexture) { ARequest req = new ARequest(); req.AssetID = assetID; @@ -86,7 +86,7 @@ namespace OpenSim.Framework.Communications.Caches } - public void UploadNewAsset(AssetBase asset) + public void CreateAsset(AssetBase asset) { AssetStorage store = new AssetStorage(); store.Data = asset.Data; diff --git a/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs b/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs new file mode 100644 index 0000000000..50653d86ff --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs @@ -0,0 +1,297 @@ +/* +* 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.Threading; +using System.Reflection; +using libsecondlife; +using Nini.Config; +using OpenSim.Framework.Console; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Framework.Communications.Caches +{ + + public class SQLAssetServer : IAssetServer + { + private IAssetReceiver _receiver; + private BlockingQueue _assetRequests; + private Thread _localAssetServerThread; + protected IAssetProvider m_plugin; + + + public SQLAssetServer() + { + _assetRequests = new BlockingQueue(); + AddPlugin("OpenSim.Framework.Data.SQLite.dll"); + this.SetUpAssetDatabase(); + + this._localAssetServerThread = new Thread(new ThreadStart(RunRequests)); + this._localAssetServerThread.IsBackground = true; + this._localAssetServerThread.Start(); + + } + + public void AddPlugin(string FileName) + { + //MainLog.Instance.Verbose("SQLAssetServer", "AssetStorage: Attempting to load " + FileName); + Assembly pluginAssembly = Assembly.LoadFrom(FileName); + + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("IAssetProvider", true); + + if (typeInterface != null) + { + IAssetProvider plug = (IAssetProvider)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + m_plugin = plug; + m_plugin.Initialise("AssetStorage.db", ""); + + //MainLog.Instance.Verbose("AssetStorage: Added IAssetProvider Interface"); + } + + typeInterface = null; + } + } + + pluginAssembly = null; + } + + public void SetReceiver(IAssetReceiver receiver) + { + this._receiver = receiver; + } + + public void FetchAsset(LLUUID assetID, bool isTexture) + { + ARequest req = new ARequest(); + req.AssetID = assetID; + req.IsTexture = isTexture; + this._assetRequests.Enqueue(req); + } + + public void UpdateAsset(AssetBase asset) + { + m_plugin.UpdateAsset(asset); + m_plugin.CommitAssets(); + } + + public void CreateAsset(AssetBase asset) + { + m_plugin.CreateAsset(asset); + m_plugin.CommitAssets(); + } + + public void SetServerInfo(string ServerUrl, string ServerKey) + { + + } + public void Close() + { + m_plugin.CommitAssets(); + } + + private void RunRequests() + { + + while (true) + { + ARequest req = this._assetRequests.Dequeue(); + + m_plugin.FetchAsset(req.AssetID); + + AssetBase asset = m_plugin.FetchAsset(req.AssetID); + if (asset != null) + { + _receiver.AssetReceived(asset, req.IsTexture); + } + else + { + _receiver.AssetNotFound(req.AssetID); + } + + } + + } + + private void SetUpAssetDatabase() + { + 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"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002"); + Image.Name = "Plywood"; + this.LoadAsset(Image, true, "plywood.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000003"); + Image.Name = "Rocks"; + this.LoadAsset(Image, true, "rocks.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000004"); + Image.Name = "Granite"; + this.LoadAsset(Image, true, "granite.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000005"); + Image.Name = "Hardwood"; + this.LoadAsset(Image, true, "hardwood.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005"); + Image.Name = "Prim Base Texture"; + this.LoadAsset(Image, true, "plywood.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000006"); + Image.Name = "Map Base Texture"; + this.LoadAsset(Image, true, "map_base.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000007"); + Image.Name = "Map Texture"; + this.LoadAsset(Image, true, "map1.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000010"); + Image.Name = "Female Body Texture"; + this.LoadAsset(Image, true, "femalebody.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000011"); + Image.Name = "Female Bottom Texture"; + this.LoadAsset(Image, true, "femalebottom.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000012"); + Image.Name = "Female Face Texture"; + this.LoadAsset(Image, true, "femaleface.jp2"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("77c41e39-38f9-f75a-024e-585989bbabbb"); + Image.Name = "Skin"; + Image.Type = 13; + Image.InvType = 13; + this.LoadAsset(Image, false, "base_skin.dat"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73"); + Image.Name = "Shape"; + Image.Type = 13; + Image.InvType = 13; + this.LoadAsset(Image, false, "base_shape.dat"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-38f9-1111-024e-222222111110"); + Image.Name = "Shirt"; + Image.Type = 5; + Image.InvType = 18; + this.LoadAsset(Image, false, "newshirt.dat"); + m_plugin.CreateAsset(Image); + + Image = new AssetBase(); + Image.FullID = new LLUUID("00000000-38f9-1111-024e-222222111120"); + Image.Name = "Shirt"; + Image.Type = 5; + Image.InvType = 18; + this.LoadAsset(Image, false, "newpants.dat"); + m_plugin.CreateAsset(Image); + + string filePath = Path.Combine(Util.configDir(), "OpenSimAssetSet.xml"); + if (File.Exists(filePath)) + { + XmlConfigSource source = new XmlConfigSource(filePath); + ReadAssetDetails(source); + } + + m_plugin.CommitAssets(); + } + + protected void ReadAssetDetails(IConfigSource source) + { + AssetBase newAsset = null; + for (int i = 0; i < source.Configs.Count; i++) + { + newAsset = new AssetBase(); + newAsset.FullID = new LLUUID(source.Configs[i].GetString("assetID", LLUUID.Random().ToStringHyphenated())); + newAsset.Name = source.Configs[i].GetString("name", ""); + newAsset.Type = (sbyte)source.Configs[i].GetInt("assetType", 0); + newAsset.InvType = (sbyte)source.Configs[i].GetInt("inventoryType", 0); + string fileName = source.Configs[i].GetString("fileName", ""); + if (fileName != "") + { + this.LoadAsset(newAsset, false, fileName); + m_plugin.CreateAsset(newAsset); + } + } + } + + 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; + } + } + +} diff --git a/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs b/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs index 9138673681..b53076cfc2 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs @@ -34,13 +34,14 @@ using System.Data.SqlTypes; using Mono.Data.SqliteClient; using OpenSim.Framework.Console; using OpenSim.Framework.Types; +using OpenSim.Framework.Interfaces; namespace OpenSim.Framework.Data.SQLite { /// /// A User storage interface for the DB4o database system /// - public class SQLiteAssetData : SQLiteBase + public class SQLiteAssetData : SQLiteBase, IAssetProvider { /// /// The database manager @@ -64,7 +65,15 @@ namespace OpenSim.Framework.Data.SQLite ds.Tables.Add(createAssetsTable()); setupAssetCommands(da, conn); - da.Fill(ds.Tables["assets"]); + try + { + da.Fill(ds.Tables["assets"]); + } + catch (Exception) + { + MainLog.Instance.Verbose("AssetStorage", "Caught fill error on asset table"); + } + return; } @@ -172,7 +181,14 @@ namespace OpenSim.Framework.Data.SQLite { row["UUID"] = asset.FullID; row["Name"] = asset.Name; - row["Description"] = asset.Description; + if (asset.Description != null) + { + row["Description"] = asset.Description; + } + else + { + row["Description"] = " "; + } row["Type"] = asset.Type; row["InvType"] = asset.InvType; row["Local"] = asset.Local; diff --git a/OpenSim/Framework/General/Interfaces/IAssetProvider.cs b/OpenSim/Framework/General/Interfaces/IAssetProvider.cs new file mode 100644 index 0000000000..a2ef826462 --- /dev/null +++ b/OpenSim/Framework/General/Interfaces/IAssetProvider.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Framework.Types; +using libsecondlife; + +namespace OpenSim.Framework.Interfaces +{ + public interface IAssetProvider + { + void Initialise(string dbfile, string dbname); + AssetBase FetchAsset(LLUUID uuid); + void CreateAsset(AssetBase asset); + void UpdateAsset(AssetBase asset); + bool ExistsAsset(LLUUID uuid); + void CommitAssets(); // force a sync to the database + } +} \ No newline at end of file diff --git a/OpenSim/Framework/General/Interfaces/IAssetServer.cs b/OpenSim/Framework/General/Interfaces/IAssetServer.cs index cdce979787..da3f61a597 100644 --- a/OpenSim/Framework/General/Interfaces/IAssetServer.cs +++ b/OpenSim/Framework/General/Interfaces/IAssetServer.cs @@ -37,9 +37,9 @@ namespace OpenSim.Framework.Interfaces public interface IAssetServer { void SetReceiver(IAssetReceiver receiver); - void RequestAsset(LLUUID assetID, bool isTexture); + void FetchAsset(LLUUID assetID, bool isTexture); void UpdateAsset(AssetBase asset); - void UploadNewAsset(AssetBase asset); + void CreateAsset(AssetBase asset); void SetServerInfo(string ServerUrl, string ServerKey); void Close(); } diff --git a/OpenSim/Framework/General/Types/AssetBase.cs b/OpenSim/Framework/General/Types/AssetBase.cs index 71642a2f9c..7d5ee7b7f9 100644 --- a/OpenSim/Framework/General/Types/AssetBase.cs +++ b/OpenSim/Framework/General/Types/AssetBase.cs @@ -42,7 +42,8 @@ namespace OpenSim.Framework.Types public AssetBase() { - + Name = " "; + Description = " "; } } } diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs index 9e0bc09f47..8437933eb2 100644 --- a/OpenSim/Region/Application/OpenSimMain.cs +++ b/OpenSim/Region/Application/OpenSimMain.cs @@ -266,7 +266,8 @@ namespace OpenSim { m_httpServerPort = m_networkServersInfo.HttpListenerPort; - LocalAssetServer assetServer = new LocalAssetServer(); + // LocalAssetServer assetServer = new LocalAssetServer(); + SQLAssetServer assetServer = new SQLAssetServer(); assetServer.SetServerInfo(m_networkServersInfo.AssetURL, m_networkServersInfo.AssetSendKey); m_assetCache = new AssetCache(assetServer); // m_assetCache = new AssetCache("OpenSim.Region.GridInterfaces.Local.dll", m_networkServersInfo.AssetURL, m_networkServersInfo.AssetSendKey); diff --git a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs index 082eec2e90..e2617b3ab3 100644 --- a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs +++ b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.ClientStack protected bool AgentTextureCached(ClientView simclient, Packet packet) { - // Console.WriteLine(packet.ToString()); + //System.Console.WriteLine("texture cached: " + packet.ToString()); AgentCachedTexturePacket chechedtex = (AgentCachedTexturePacket)packet; AgentCachedTextureResponsePacket cachedresp = new AgentCachedTextureResponsePacket(); cachedresp.AgentData.AgentID = this.AgentID; diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs index a35666d1a0..4e2599f9b1 100644 --- a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs +++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs @@ -170,6 +170,7 @@ namespace OpenSim.Region.ClientStack } break; case PacketType.AgentSetAppearance: + //OpenSim.Framework.Console.MainLog.Instance.Verbose("set appear", Pack.ToString()); AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack; if (OnSetAppearance != null) { @@ -366,8 +367,9 @@ namespace OpenSim.Region.ClientStack m_assetCache.AddAssetRequest(this, transfer); break; case PacketType.AssetUploadRequest: - //Console.WriteLine("upload request " + Pack.ToString()); AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; + // Console.WriteLine("upload request " + Pack.ToString()); + // Console.WriteLine("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionID).ToStringHyphenated()); if (OnAssetUploadRequest != null) { OnAssetUploadRequest(this, request.AssetBlock.TransactionID.Combine(this.SecureSessionID), request.AssetBlock.TransactionID, request.AssetBlock.Type, request.AssetBlock.AssetData, request.AssetBlock.StoreLocal); diff --git a/OpenSim/Region/Environment/Interfaces/IXfer.cs b/OpenSim/Region/Environment/Interfaces/IXfer.cs new file mode 100644 index 0000000000..a19ba8dfd3 --- /dev/null +++ b/OpenSim/Region/Environment/Interfaces/IXfer.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Region.Environment.Interfaces +{ + public interface IXfer + { + bool AddNewFile(string fileName, byte[] data); + } +} diff --git a/OpenSim/Region/Environment/ModuleLoader.cs b/OpenSim/Region/Environment/ModuleLoader.cs index be3384b5eb..ea416cb535 100644 --- a/OpenSim/Region/Environment/ModuleLoader.cs +++ b/OpenSim/Region/Environment/ModuleLoader.cs @@ -28,27 +28,23 @@ namespace OpenSim.Region.Environment /// public void CreateDefaultModules(Scene scene, string exceptModules) { - XferModule xferManager = new XferModule(); - xferManager.Initialise(scene); - scene.AddModule(xferManager.GetName(), xferManager); - LoadedModules.Add(xferManager); + IRegionModule module = new XferModule(); + InitialiseModule(module, scene); - ChatModule chatModule = new ChatModule(); - chatModule.Initialise(scene); - scene.AddModule(chatModule.GetName(), chatModule); - LoadedModules.Add(chatModule); - - AvatarProfilesModule avatarProfiles = new AvatarProfilesModule(); - avatarProfiles.Initialise(scene); - scene.AddModule(avatarProfiles.GetName(), avatarProfiles); - LoadedModules.Add(avatarProfiles); + module = new ChatModule(); + InitialiseModule(module, scene); + + module = new AvatarProfilesModule(); + InitialiseModule(module, scene); this.LoadRegionModule("OpenSim.Region.ExtensionsScriptModule.dll", "ExtensionsScriptingModule", scene); string lslPath = System.IO.Path.Combine("ScriptEngines", "OpenSim.Region.ScriptEngine.DotNetEngine.dll"); this.LoadRegionModule(lslPath, "LSLScriptingModule", scene); + } + public void LoadDefaultSharedModules(string exceptModules) { DynamicTextureModule dynamicModule = new DynamicTextureModule(); @@ -64,6 +60,13 @@ namespace OpenSim.Region.Environment } } + private void InitialiseModule(IRegionModule module, Scene scene) + { + module.Initialise(scene); + scene.AddModule(module.GetName(), module); + LoadedModules.Add(module); + } + /// /// Loads/initialises a Module instance that can be used by mutliple Regions /// @@ -84,9 +87,7 @@ namespace OpenSim.Region.Environment IRegionModule module = this.LoadModule(dllName, moduleName); if (module != null) { - module.Initialise(scene); - scene.AddModule(module.GetName(), module); - LoadedModules.Add(module); + this.InitialiseModule(module, scene); } } diff --git a/OpenSim/Region/Environment/Modules/XferModule.cs b/OpenSim/Region/Environment/Modules/XferModule.cs index eec9f97b1d..44b4d7a759 100644 --- a/OpenSim/Region/Environment/Modules/XferModule.cs +++ b/OpenSim/Region/Environment/Modules/XferModule.cs @@ -10,7 +10,7 @@ using OpenSim.Region.Environment.Interfaces; namespace OpenSim.Region.Environment.Modules { - public class XferModule : IRegionModule + public class XferModule : IRegionModule, IXfer { public Dictionary NewFiles = new Dictionary(); public Dictionary Transfers = new Dictionary(); @@ -27,7 +27,7 @@ namespace OpenSim.Region.Environment.Modules m_scene = scene; m_scene.EventManager.OnNewClient += NewClient; - m_scene.RegisterAPIMethod("API_AddXferFile", new ModuleAPIMethod2(this.AddNewFile)); + m_scene.RegisterModuleInterface(this); } public void PostInitialise() diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index e5ab41ffef..70b34cfe90 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -201,9 +201,9 @@ namespace OpenSim.Region.Environment.Scenes bool fileChange = ((SceneObjectGroup)ent).GetPartInventoryFileName(remoteClient, primLocalID); if (fileChange) { - if (this.AddXferFile != null) + if (this.XferManager != null) { - ((SceneObjectGroup)ent).RequestInventoryFile(primLocalID, AddXferFile); + ((SceneObjectGroup)ent).RequestInventoryFile(primLocalID, XferManager); } } break; diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 1af41be924..d0edcdab46 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -91,10 +91,9 @@ namespace OpenSim.Region.Environment.Scenes public Dictionary ModuleInterfaces = new Dictionary(); protected Dictionary ModuleAPIMethods = new Dictionary(); - //API method Delegates and interfaces + //API module interfaces - // this most likely shouldn't be handled as a API method like this, but doing it for testing purposes - public ModuleAPIMethod2 AddXferFile = null; + public IXfer XferManager; private IHttpRequests m_httpRequestModule = null; private ISimChat m_simChatModule = null; @@ -206,8 +205,7 @@ namespace OpenSim.Region.Environment.Scenes m_simChatModule = this.RequestModuleInterface(); m_httpRequestModule = this.RequestModuleInterface(); - //should change so it uses the module interface functions - AddXferFile = (ModuleAPIMethod2)this.RequestAPIMethod("API_AddXferFile"); + XferManager = this.RequestModuleInterface(); } #region Script Handling Methods @@ -605,7 +603,7 @@ namespace OpenSim.Region.Environment.Scenes { if (!Entities.ContainsKey(sceneObject.UUID)) { - QuadTree.AddObject(sceneObject); + // QuadTree.AddObject(sceneObject); Entities.Add(sceneObject.UUID, sceneObject); } } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 45d975c1b6..eff622a061 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -11,6 +11,7 @@ using OpenSim.Framework.Interfaces; using OpenSim.Framework.Types; using OpenSim.Region.Physics.Manager; using OpenSim.Framework.Data; +using OpenSim.Region.Environment.Interfaces; namespace OpenSim.Region.Environment.Scenes { @@ -676,12 +677,12 @@ namespace OpenSim.Region.Environment.Scenes return false; } - public string RequestInventoryFile(uint localID, ModuleAPIMethod2 addXferFile) + public string RequestInventoryFile(uint localID, IXfer xferManager) { SceneObjectPart part = this.GetChildPart(localID); if (part != null) { - part.RequestInventoryFile(addXferFile); + part.RequestInventoryFile(xferManager); } return ""; } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 9e207c8758..2122a4f1b8 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -12,6 +12,7 @@ using OpenSim.Framework.Types; using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Framework.Utilities; using OpenSim.Region.Physics.Manager; +using OpenSim.Region.Environment.Interfaces; namespace OpenSim.Region.Environment.Scenes { @@ -494,7 +495,7 @@ namespace OpenSim.Region.Environment.Scenes return false; } - public string RequestInventoryFile(ModuleAPIMethod2 addXferFile) + public string RequestInventoryFile(IXfer xferManager) { byte[] fileData = new byte[0]; InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, this.UUID); @@ -528,7 +529,7 @@ namespace OpenSim.Region.Environment.Scenes fileData = Helpers.StringToField(invString.BuildString); if (fileData.Length > 2) { - addXferFile(m_inventoryFileName, fileData); + xferManager.AddNewFile(m_inventoryFileName, fileData); } return ""; } diff --git a/OpenSim/Region/Environment/Types/UpdateQueue.cs b/OpenSim/Region/Environment/Types/UpdateQueue.cs index d7eb6ee62b..dab4258cde 100644 --- a/OpenSim/Region/Environment/Types/UpdateQueue.cs +++ b/OpenSim/Region/Environment/Types/UpdateQueue.cs @@ -12,10 +12,43 @@ namespace OpenSim.Region.Environment.Types private List m_ids; + public int Count + { + get { return m_queue.Count; } + } + public UpdateQueue() { m_queue = new Queue(); m_ids = new List(); } + + public void Enqueue(SceneObjectPart part) + { + lock (m_ids) + { + if (!m_ids.Contains(part.UUID)) + { + m_ids.Add(part.UUID); + m_queue.Enqueue(part); + } + } + } + + public SceneObjectPart Dequeue() + { + SceneObjectPart part = null; + if (m_queue.Count > 0) + { + part = m_queue.Dequeue(); + lock (m_ids) + { + m_ids.Remove(part.UUID); + } + } + + return part; + } + } } diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs index 5f7360e73c..65b03ad6c6 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs @@ -187,6 +187,7 @@ namespace OpenSim.DataStore.MonoSqliteStorage return retvals; } + public void StoreTerrain(double[,] ter) {