From a82950672860eedeaa23da75421c74e094b5c0a4 Mon Sep 17 00:00:00 2001 From: cw Date: Wed, 31 Jan 2007 22:09:20 +0000 Subject: Making trunk; applying appropriate license to each file --- Asset_manager.cs | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 Asset_manager.cs (limited to 'Asset_manager.cs') diff --git a/Asset_manager.cs b/Asset_manager.cs new file mode 100644 index 0000000..194d28f --- /dev/null +++ b/Asset_manager.cs @@ -0,0 +1,167 @@ +/* +Copyright (c) 2007 Michael Wright + +* Copyright (c) <year>, <copyright holder> +* All rights reserved. +* +* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 System.Collections; +using libsecondlife.Packets; +using libsecondlife.AssetSystem; +using System.IO; + +namespace Second_server +{ + /// <summary> + /// Description of Asset_manager. + /// </summary> + public class Asset_manager + { + public Dictionary<libsecondlife.LLUUID,Asset_info> Assets; + public ArrayList requests=new ArrayList(); //should change to a generic + // public ArrayList uploads=new ArrayList(); + private Server server; + + public Asset_manager(Server serve) + { + server=serve; + Assets=new Dictionary<libsecondlife.LLUUID,Asset_info> (); + this.initialise(); + } + + public void add_request(User_Agent_info user, LLUUID asset_id, TransferRequestPacket tran_req) + { + + if(!this.Assets.ContainsKey(asset_id)) + { + //not found asset + return; + } + Asset_info info=this.Assets[asset_id]; + System.Console.WriteLine("send asset : "+asset_id); + //for now as it will be only skin or shape request just send back the asset + TransferInfoPacket tran_i=new TransferInfoPacket(); + tran_i.TransferInfo.ChannelType=2; + tran_i.TransferInfo.Status=0; + tran_i.TransferInfo.TargetType=0; + tran_i.TransferInfo.Params=tran_req.TransferInfo.Params; + tran_i.TransferInfo.Size=info.data.Length; + tran_i.TransferInfo.TransferID=tran_req.TransferInfo.TransferID; + + server.SendPacket(tran_i,true,user); + + TransferPacketPacket tran_p=new TransferPacketPacket(); + tran_p.TransferData.Packet=0; + tran_p.TransferData.ChannelType=2; + tran_p.TransferData.TransferID=tran_req.TransferInfo.TransferID; + if(info.data.Length>1000) //but needs to be less than 2000 at the moment + { + byte[] chunk=new byte[1000]; + Array.Copy(info.data,chunk,1000); + tran_p.TransferData.Data=chunk; + tran_p.TransferData.Status=0; + server.SendPacket(tran_p,true,user); + + tran_p=new TransferPacketPacket(); + tran_p.TransferData.Packet=1; + tran_p.TransferData.ChannelType=2; + tran_p.TransferData.TransferID=tran_req.TransferInfo.TransferID; + byte[] chunk1=new byte[(info.data.Length-1000)]; + Array.Copy(info.data,1000,chunk1,0,chunk1.Length); + tran_p.TransferData.Data=chunk1; + tran_p.TransferData.Status=1; + server.SendPacket(tran_p,true,user); + } + else + { + tran_p.TransferData.Status=1; //last packet? so set to 1 + tran_p.TransferData.Data=info.data; + server.SendPacket(tran_p,true,user); + } + + + + } + + private void initialise() + { + //for now read in our test image + Asset_info im=new Asset_info(); + im.filename="base_shape.dat"; + im.Full_ID=new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73"); + this.load_asset(im); + this.Assets.Add(im.Full_ID,im); + } + private void load_asset(Asset_info info) + { + string data_path=System.Windows.Forms.Application.StartupPath + @"\assets\"; + string filename=data_path+@info.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 Asset_request + { + public User_Agent_info req_user; + public LLUUID req_image; + public Asset_info asset_inf; + public long data_pointer=0; + public int num_packets=0; + public int packet_counter=0; + + public Asset_request() + { + + } + } + public class Asset_info + { + public byte[] data; + public LLUUID Full_ID; + public string name; + public string filename; + public bool loaded; + public ulong last_used; //need to add a tick/time counter and keep record + // of how often images are requested to unload unused ones. + + public Asset_info() + { + + } + } +} -- cgit v1.1