From 46700d3b7d5bd71d880b3cc0dd0e2d6edd701195 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Fri, 19 Oct 2007 07:46:03 +0000 Subject: * Total refactoring of Asset Server for massive win * There is now a AssetServerBase * lolcat in ur assets --- .../Communications/Cache/AssetServerBase.cs | 180 +++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 OpenSim/Framework/Communications/Cache/AssetServerBase.cs (limited to 'OpenSim/Framework/Communications/Cache/AssetServerBase.cs') diff --git a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs new file mode 100644 index 0000000..7073000 --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +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.Cache +{ + public abstract class AssetServerBase : IAssetServer + { + protected IAssetReceiver _receiver; + protected BlockingQueue _assetRequests; + protected Thread _localAssetServerThread; + protected IAssetProvider m_assetProviderPlugin; + protected object syncLock = new object(); + + protected abstract void StoreAsset(AssetBase asset); + protected abstract void CommitAssets(); + + public void LoadDefaultAssets() + { + MainLog.Instance.Verbose("SQL ASSET SERVER", "Setting up asset database"); + + ForEachDefaultAsset( this, StoreAsset ); + ForEachXmlAsset( this, StoreAsset ); + + CommitAssets(); + } + + + public static AssetBase CreateAsset(IAssetServer assetServer, string assetIdStr, string name, string filename, bool isImage) + { + AssetBase asset = new AssetBase( + new LLUUID(assetIdStr), + name + ); + + if (!String.IsNullOrEmpty(filename)) + { + MainLog.Instance.Verbose("ASSETS", "Loading: [{0}][{1}]", name, filename ); + + assetServer.LoadAsset(asset, isImage, filename); + } + else + { + MainLog.Instance.Verbose("ASSETS", "Instantiated: [{0}]", name ); + } + + return asset; + } + + private static AssetBase CreateImageAsset(IAssetServer assetServer, string assetIdStr, string name, string filename) + { + return CreateAsset(assetServer, assetIdStr, name, filename, true); + } + + public static List GetDefaultAssets(IAssetServer assetServer) + { + List assets = new List(); + + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000001", "Bricks", "bricks.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000002", "Plywood", "plywood.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000003", "Rocks", "rocks.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000004", "Granite", "granite.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000005", "Hardwood", "hardwood.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-5005-000000000005", "Prim Base Texture", "plywood.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000006", "Map Base Texture", "map_base.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000007", "Map Texture", "map1.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000010", "Female Body Texture", "femalebody.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000011", "Female Bottom Texture", "femalebottom.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000012", "Female Face Texture", "femaleface.jp2")); + assets.Add(CreateImageAsset(assetServer, "00000000-0000-0000-9999-000000000001", "Bricks", "bricks.jp2")); + + assets.Add(CreateAsset(assetServer, "77c41e39-38f9-f75a-024e-585989bbabbb", "Skin", "base_skin.dat", false)); + assets.Add(CreateAsset(assetServer, "66c41e39-38f9-f75a-024e-585989bfab73", "Shape", "base_shape.dat", false)); + assets.Add(CreateAsset(assetServer, "00000000-38f9-1111-024e-222222111110", "Shirt", "newshirt.dat", false)); + assets.Add(CreateAsset(assetServer, "00000000-38f9-1111-024e-222222111120", "Shirt", "newpants.dat", false)); + + return assets; + } + + public static void ForEachDefaultAsset(IAssetServer assetServer, Action action) + { + List assets = GetDefaultAssets(assetServer); + assets.ForEach(action); + } + + public AssetServerBase() + { + System.Console.WriteLine("Starting Db4o asset storage system"); + this._assetRequests = new BlockingQueue(); + } + + public 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 static void ForEachXmlAsset(IAssetServer assetServer, Action action) + { + string filePath = Path.Combine(Util.configDir(), "OpenSimAssetSet.xml"); + if (File.Exists(filePath)) + { + XmlConfigSource source = new XmlConfigSource(filePath); + + for (int i = 0; i < source.Configs.Count; i++) + { + string assetIdStr = source.Configs[i].GetString("assetID", LLUUID.Random().ToStringHyphenated()); + string name = source.Configs[i].GetString("name", ""); + sbyte type = (sbyte)source.Configs[i].GetInt("assetType", 0); + sbyte invType = (sbyte)source.Configs[i].GetInt("inventoryType", 0); + string fileName = source.Configs[i].GetString("fileName", ""); + + AssetBase newAsset = CreateAsset(assetServer, assetIdStr, name, fileName, false); + + newAsset.Type = type; + newAsset.InvType = invType; + + } + } + } + + 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) + { + lock (syncLock) + { + m_assetProviderPlugin.UpdateAsset(asset); + m_assetProviderPlugin.CommitAssets(); + } + } + + public void StoreAndCommitAsset(AssetBase asset) + { + lock (syncLock) + { + StoreAsset(asset); + CommitAssets(); + } + } + + public void SetServerInfo(string ServerUrl, string ServerKey) + { + + } + + public abstract void Close(); + } +} \ No newline at end of file -- cgit v1.1