237 lines
6.5 KiB
C#
237 lines
6.5 KiB
C#
/*
|
|
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 OpenSim
|
|
{
|
|
/// <summary>
|
|
/// Description of Texture_manager.
|
|
/// </summary>
|
|
public class TextureManager
|
|
{
|
|
public Dictionary<libsecondlife.LLUUID,TextureImage> textures;
|
|
public ArrayList requests=new ArrayList(); //should change to a generic
|
|
public ArrayList uploads=new ArrayList();
|
|
private Server server;
|
|
|
|
public TextureManager(Server serve)
|
|
{
|
|
server=serve;
|
|
textures=new Dictionary<libsecondlife.LLUUID,TextureImage> ();
|
|
this.initialise();
|
|
}
|
|
|
|
public void AddRequest(User_Agent_info user, LLUUID image_id)
|
|
{
|
|
|
|
if(!this.textures.ContainsKey(image_id))
|
|
{
|
|
//not found image so send back image not in data base message
|
|
ImageNotInDatabasePacket im_not=new ImageNotInDatabasePacket();
|
|
im_not.ImageID.ID=image_id;
|
|
server.SendPacket(im_not,true,user);
|
|
return;
|
|
}
|
|
TextureImage imag=this.textures[image_id];
|
|
TextureRequest req=new TextureRequest();
|
|
req.RequestUser=user;
|
|
req.RequestImage=image_id;
|
|
req.image_info=imag;
|
|
|
|
if(imag.data.LongLength>1000) //should be bigger or smaller?
|
|
{
|
|
//over 1000 bytes so split up file
|
|
req.num_packets=(int)imag.data.LongLength/1000;
|
|
req.num_packets++;
|
|
}
|
|
else
|
|
{
|
|
req.num_packets=1;
|
|
}
|
|
|
|
this.requests.Add(req);
|
|
|
|
}
|
|
|
|
public void AddTexture(LLUUID image_id, string name, byte[] data)
|
|
{
|
|
|
|
}
|
|
public void DoWork(ulong time)
|
|
{
|
|
if(this.requests.Count==0)
|
|
{
|
|
//no requests waiting
|
|
return;
|
|
}
|
|
int num;
|
|
//should be running in its own thread but for now is called by timer
|
|
if(this.requests.Count<5)
|
|
{
|
|
//lower than 5 so do all of them
|
|
num=this.requests.Count;
|
|
}
|
|
else
|
|
{
|
|
num=5;
|
|
}
|
|
TextureRequest req;
|
|
for(int i=0; i<num; i++)
|
|
{
|
|
req=(TextureRequest)this.requests[i];
|
|
|
|
if(req.packet_counter==0)
|
|
{
|
|
//first time for this request so send imagedata packet
|
|
if(req.num_packets==1)
|
|
{
|
|
//only one packet so send whole file
|
|
ImageDataPacket im=new ImageDataPacket();
|
|
im.ImageID.Packets=1;
|
|
im.ImageID.ID=req.image_info.Full_ID;
|
|
im.ImageID.Size=(uint)req.image_info.data.Length;
|
|
im.ImageData.Data=req.image_info.data;
|
|
im.ImageID.Codec=2;
|
|
server.SendPacket(im,true,req.RequestUser);
|
|
req.packet_counter++;
|
|
req.image_info.last_used=time;
|
|
System.Console.WriteLine("sent texture: "+req.image_info.Full_ID);
|
|
}
|
|
else
|
|
{
|
|
//more than one packet so split file up
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//send imagepacket
|
|
|
|
}
|
|
}
|
|
|
|
//remove requests that have been completed
|
|
for(int i=0; i<num; i++)
|
|
{
|
|
req=(TextureRequest)this.requests[i];
|
|
if(req.packet_counter==req.num_packets)
|
|
{
|
|
this.requests.Remove(req);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void RecieveTexture(Packet pack)
|
|
{
|
|
|
|
}
|
|
|
|
private void initialise()
|
|
{
|
|
//for now read in our test image
|
|
TextureImage im=new TextureImage();
|
|
im.filename="testpic2.jp2";
|
|
im.Full_ID=new LLUUID("00000000-0000-0000-5005-000000000005");
|
|
this.LoadImage(im);
|
|
this.textures.Add(im.Full_ID,im);
|
|
|
|
im=new TextureImage();
|
|
im.filename="map_base.jp2";
|
|
im.Full_ID=new LLUUID("00000000-0000-0000-7007-000000000006");
|
|
this.LoadImage(im);
|
|
this.textures.Add(im.Full_ID,im);
|
|
|
|
im=new TextureImage();
|
|
im.filename="map1.jp2";
|
|
im.Full_ID=new LLUUID("00000000-0000-0000-7009-000000000008");
|
|
this.LoadImage(im);
|
|
this.textures.Add(im.Full_ID,im);
|
|
|
|
}
|
|
private void LoadImage(TextureImage im)
|
|
{
|
|
//should request Image from StorageManager
|
|
//but for now read from file
|
|
|
|
string data_path=System.AppDomain.CurrentDomain.BaseDirectory + @"\textures\";
|
|
string filename=data_path+@im.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();
|
|
im.data=idata;
|
|
im.loaded=true;
|
|
}
|
|
|
|
}
|
|
|
|
public class TextureRequest
|
|
{
|
|
public User_Agent_info RequestUser;
|
|
public LLUUID RequestImage;
|
|
public TextureImage image_info;
|
|
public long data_pointer=0;
|
|
public int num_packets=0;
|
|
public int packet_counter=0;
|
|
|
|
public TextureRequest()
|
|
{
|
|
|
|
}
|
|
}
|
|
public class TextureImage
|
|
{
|
|
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 TextureImage()
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|