Clean up a bit and added missing files

physics-inventorytesting
MW 2007-03-15 18:10:57 +00:00
parent 0b99f56f2b
commit 740a21330e
26 changed files with 3033 additions and 2047 deletions

View File

@ -35,419 +35,420 @@ using OpenSim.GridServers;
namespace OpenSim.Assets namespace OpenSim.Assets
{ {
/// <summary> /// <summary>
/// Manages local cache of assets and their sending to viewers. /// Manages local cache of assets and their sending to viewers.
/// </summary> /// </summary>
public class AssetCache : IAssetReceiver public class AssetCache : IAssetReceiver
{ {
public Dictionary<libsecondlife.LLUUID, AssetInfo> Assets; public Dictionary<libsecondlife.LLUUID, AssetInfo> Assets;
public Dictionary<libsecondlife.LLUUID, TextureImage> Textures; public Dictionary<libsecondlife.LLUUID, TextureImage> Textures;
public List<AssetRequest> AssetRequests = new List<AssetRequest>(); //assets ready to be sent to viewers public List<AssetRequest> AssetRequests = new List<AssetRequest>(); //assets ready to be sent to viewers
public List<AssetRequest> TextureRequests = new List<AssetRequest>(); //textures ready to be sent public List<AssetRequest> TextureRequests = new List<AssetRequest>(); //textures ready to be sent
public Dictionary<LLUUID, AssetRequest> RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); //Assets requested from the asset server public Dictionary<LLUUID, AssetRequest> RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); //Assets requested from the asset server
public Dictionary<LLUUID, AssetRequest> RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); //Textures requested from the asset server public Dictionary<LLUUID, AssetRequest> RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); //Textures requested from the asset server
private Dictionary<libsecondlife.LLUUID, AssetBase> IncomingAssets; private Dictionary<libsecondlife.LLUUID, AssetBase> IncomingAssets;
private IAssetServer _assetServer; private IAssetServer _assetServer;
private Thread _assetCacheThread; private Thread _assetCacheThread;
private LLUUID[] textureList = new LLUUID[2]; private LLUUID[] textureList = new LLUUID[2];
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public AssetCache( IAssetServer assetServer) public AssetCache(IAssetServer assetServer)
{ {
Console.WriteLine("Creating Asset cache"); Console.WriteLine("Creating Asset cache");
_assetServer = assetServer; _assetServer = assetServer;
_assetServer.SetReceiver(this); _assetServer.SetReceiver(this);
Assets = new Dictionary<libsecondlife.LLUUID, AssetInfo> (); Assets = new Dictionary<libsecondlife.LLUUID, AssetInfo>();
Textures = new Dictionary<libsecondlife.LLUUID, TextureImage> (); Textures = new Dictionary<libsecondlife.LLUUID, TextureImage>();
IncomingAssets = new Dictionary<libsecondlife.LLUUID, AssetBase>(); IncomingAssets = new Dictionary<libsecondlife.LLUUID, AssetBase>();
this._assetCacheThread = new Thread( new ThreadStart(RunAssetManager)); this._assetCacheThread = new Thread(new ThreadStart(RunAssetManager));
this._assetCacheThread.IsBackground = true; this._assetCacheThread.IsBackground = true;
this._assetCacheThread.Start(); this._assetCacheThread.Start();
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public void RunAssetManager() public void RunAssetManager()
{ {
while(true) while (true)
{ {
try{ try
this.ProcessAssetQueue(); {
this.ProcessTextureQueue(); this.ProcessAssetQueue();
Thread.Sleep(100); this.ProcessTextureQueue();
} Thread.Sleep(100);
catch(Exception e) }
{ catch (Exception e)
Console.WriteLine(e.Message); {
} Console.WriteLine(e.Message);
} }
} }
}
public void LoadDefaultTextureSet()
{ public void LoadDefaultTextureSet()
//hack: so we can give each user a set of textures {
textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001"); //hack: so we can give each user a set of textures
textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002"); textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001");
for(int i = 0; i< textureList.Length; i++) textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002");
{ for (int i = 0; i < textureList.Length; i++)
this._assetServer.RequestAsset(textureList[i], true); {
} this._assetServer.RequestAsset(textureList[i], true);
}
}
}
public AssetBase[] CreateNewInventorySet(LLUUID agentID)
{ public AssetBase[] CreateNewInventorySet(LLUUID agentID)
AssetBase[] inventorySet = new AssetBase[this.textureList.Length]; {
for(int i = 0; i< textureList.Length; i++) AssetBase[] inventorySet = new AssetBase[this.textureList.Length];
{ for (int i = 0; i < textureList.Length; i++)
if(this.Textures.ContainsKey(textureList[i])) {
{ if (this.Textures.ContainsKey(textureList[i]))
inventorySet[i] = this.CloneImage(agentID, this.Textures[textureList[i]]); {
TextureImage image = new TextureImage(inventorySet[i]); inventorySet[i] = this.CloneImage(agentID, this.Textures[textureList[i]]);
this.Textures.Add(image.FullID, image); TextureImage image = new TextureImage(inventorySet[i]);
} this.Textures.Add(image.FullID, image);
} }
return inventorySet; }
} return inventorySet;
}
/// <summary>
/// /// <summary>
/// </summary> ///
private void ProcessTextureQueue() /// </summary>
{ private void ProcessTextureQueue()
if(this.TextureRequests.Count == 0) {
{ if (this.TextureRequests.Count == 0)
//no requests waiting {
return; //no requests waiting
} return;
int num; }
int num;
if(this.TextureRequests.Count < 5)
{ if (this.TextureRequests.Count < 5)
//lower than 5 so do all of them {
num = this.TextureRequests.Count; //lower than 5 so do all of them
} num = this.TextureRequests.Count;
else }
{ else
num=5; {
} num = 5;
AssetRequest req; }
for(int i = 0; i < num; i++) AssetRequest req;
{ for (int i = 0; i < num; i++)
req=(AssetRequest)this.TextureRequests[i]; {
req = (AssetRequest)this.TextureRequests[i];
if(req.PacketCounter == 0)
{ if (req.PacketCounter == 0)
//first time for this request so send imagedata packet {
if(req.NumPackets == 1) //first time for this request so send imagedata packet
{ if (req.NumPackets == 1)
//only one packet so send whole file {
ImageDataPacket im = new ImageDataPacket(); //only one packet so send whole file
im.ImageID.Packets = 1; ImageDataPacket im = new ImageDataPacket();
im.ImageID.ID = req.ImageInfo.FullID; im.ImageID.Packets = 1;
im.ImageID.Size = (uint)req.ImageInfo.Data.Length; im.ImageID.ID = req.ImageInfo.FullID;
im.ImageData.Data = req.ImageInfo.Data; im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
im.ImageID.Codec = 2; im.ImageData.Data = req.ImageInfo.Data;
req.RequestUser.OutPacket(im); im.ImageID.Codec = 2;
req.PacketCounter++; req.RequestUser.OutPacket(im);
//req.ImageInfo.l= time; req.PacketCounter++;
//System.Console.WriteLine("sent texture: "+req.image_info.FullID); //req.ImageInfo.l= time;
} //System.Console.WriteLine("sent texture: "+req.image_info.FullID);
else }
{ else
//more than one packet so split file up {
ImageDataPacket im = new ImageDataPacket(); //more than one packet so split file up
im.ImageID.Packets = (ushort)req.NumPackets; ImageDataPacket im = new ImageDataPacket();
im.ImageID.ID = req.ImageInfo.FullID; im.ImageID.Packets = (ushort)req.NumPackets;
im.ImageID.Size = (uint)req.ImageInfo.Data.Length; im.ImageID.ID = req.ImageInfo.FullID;
im.ImageData.Data = new byte[600]; im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
Array.Copy(req.ImageInfo.Data, 0, im.ImageData.Data, 0, 600); im.ImageData.Data = new byte[600];
im.ImageID.Codec = 2; Array.Copy(req.ImageInfo.Data, 0, im.ImageData.Data, 0, 600);
req.RequestUser.OutPacket(im); im.ImageID.Codec = 2;
req.PacketCounter++; req.RequestUser.OutPacket(im);
//req.ImageInfo.last_used = time; req.PacketCounter++;
//System.Console.WriteLine("sent first packet of texture: //req.ImageInfo.last_used = time;
} //System.Console.WriteLine("sent first packet of texture:
} }
else }
{ else
//send imagepacket {
//more than one packet so split file up //send imagepacket
ImagePacketPacket im = new ImagePacketPacket(); //more than one packet so split file up
im.ImageID.Packet = (ushort)req.PacketCounter; ImagePacketPacket im = new ImagePacketPacket();
im.ImageID.ID = req.ImageInfo.FullID; im.ImageID.Packet = (ushort)req.PacketCounter;
int size = req.ImageInfo.Data.Length - 600 - 1000*(req.PacketCounter - 1); im.ImageID.ID = req.ImageInfo.FullID;
if(size > 1000) size = 1000; int size = req.ImageInfo.Data.Length - 600 - 1000 * (req.PacketCounter - 1);
im.ImageData.Data = new byte[size]; if (size > 1000) size = 1000;
Array.Copy(req.ImageInfo.Data, 600 + 1000*(req.PacketCounter - 1), im.ImageData.Data, 0, size); im.ImageData.Data = new byte[size];
req.RequestUser.OutPacket(im); Array.Copy(req.ImageInfo.Data, 600 + 1000 * (req.PacketCounter - 1), im.ImageData.Data, 0, size);
req.PacketCounter++; req.RequestUser.OutPacket(im);
//req.ImageInfo.last_used = time; req.PacketCounter++;
//System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID); //req.ImageInfo.last_used = time;
} //System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID);
} }
}
//remove requests that have been completed
int count = 0; //remove requests that have been completed
for(int i = 0; i < num; i++) int count = 0;
{ for (int i = 0; i < num; i++)
req=(AssetRequest)this.TextureRequests[count]; {
if(req.PacketCounter == req.NumPackets) req = (AssetRequest)this.TextureRequests[count];
{ if (req.PacketCounter == req.NumPackets)
this.TextureRequests.Remove(req); {
} this.TextureRequests.Remove(req);
else }
{ else
count++; {
} count++;
} }
}
}
public void AssetReceived(AssetBase asset, bool IsTexture) }
{ 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
{ 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 //check if it is a texture or not
//then check for waiting requests for this asset/texture (in the Requested lists) //then add to the correct cache list
//and move those requests into the Requests list. //then check for waiting requests for this asset/texture (in the Requested lists)
if(IsTexture) //and move those requests into the Requests list.
{ if (IsTexture)
TextureImage image = new TextureImage(asset); {
this.Textures.Add(image.FullID, image); TextureImage image = new TextureImage(asset);
if(this.RequestedTextures.ContainsKey(image.FullID)) this.Textures.Add(image.FullID, image);
{ if (this.RequestedTextures.ContainsKey(image.FullID))
AssetRequest req = this.RequestedTextures[image.FullID]; {
req.ImageInfo = image; AssetRequest req = this.RequestedTextures[image.FullID];
this.RequestedTextures.Remove(image.FullID); req.ImageInfo = image;
this.TextureRequests.Add(req); this.RequestedTextures.Remove(image.FullID);
} this.TextureRequests.Add(req);
} }
else }
{ else
AssetInfo assetInf = new AssetInfo(asset); {
this.Assets.Add(assetInf.FullID, assetInf); AssetInfo assetInf = new AssetInfo(asset);
if(this.RequestedAssets.ContainsKey(assetInf.FullID)) this.Assets.Add(assetInf.FullID, assetInf);
{ if (this.RequestedAssets.ContainsKey(assetInf.FullID))
AssetRequest req = this.RequestedAssets[assetInf.FullID]; {
req.AssetInf = assetInf; AssetRequest req = this.RequestedAssets[assetInf.FullID];
this.RequestedAssets.Remove(assetInf.FullID); req.AssetInf = assetInf;
this.AssetRequests.Add(req); this.RequestedAssets.Remove(assetInf.FullID);
} this.AssetRequests.Add(req);
} }
} }
} }
}
public void AssetNotFound(AssetBase asset)
{ public void AssetNotFound(AssetBase asset)
//the asset server had no knowledge of requested asset {
//the asset server had no knowledge of requested asset
}
}
#region Assets
/// <summary> #region Assets
/// /// <summary>
/// </summary> ///
/// <param name="userInfo"></param> /// </summary>
/// <param name="transferRequest"></param> /// <param name="userInfo"></param>
public void AddAssetRequest(OpenSimClient userInfo, TransferRequestPacket transferRequest) /// <param name="transferRequest"></param>
{ public void AddAssetRequest(OpenSimClient 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. LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0);
if(!this.Assets.ContainsKey(requestID)) //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 //not found asset
AssetRequest request = new AssetRequest(); // so request from asset server
request.RequestUser = userInfo; AssetRequest request = new AssetRequest();
request.RequestAssetID = requestID; request.RequestUser = userInfo;
request.TransferRequestID = transferRequest.TransferInfo.TransferID; request.RequestAssetID = requestID;
this.RequestedAssets.Add(requestID,request); request.TransferRequestID = transferRequest.TransferInfo.TransferID;
this._assetServer.RequestAsset(requestID, false); this.RequestedAssets.Add(requestID, request);
return; this._assetServer.RequestAsset(requestID, false);
} return;
//it is in our cache }
AssetInfo asset = this.Assets[requestID]; //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 //work out how many packets it should be sent in
AssetRequest req = new AssetRequest(); // and add to the AssetRequests list
req.RequestUser = userInfo; AssetRequest req = new AssetRequest();
req.RequestAssetID = requestID; req.RequestUser = userInfo;
req.TransferRequestID = transferRequest.TransferInfo.TransferID; req.RequestAssetID = requestID;
req.AssetInf = asset; req.TransferRequestID = transferRequest.TransferInfo.TransferID;
req.AssetInf = asset;
if(asset.Data.LongLength>600)
{ if (asset.Data.LongLength > 600)
//over 600 bytes so split up file {
req.NumPackets = 1 + (int)(asset.Data.Length-600+999)/1000; //over 600 bytes so split up file
} req.NumPackets = 1 + (int)(asset.Data.Length - 600 + 999) / 1000;
else }
{ else
req.NumPackets = 1; {
} req.NumPackets = 1;
}
this.AssetRequests.Add(req);
} this.AssetRequests.Add(req);
}
/// <summary>
/// /// <summary>
/// </summary> ///
private void ProcessAssetQueue() /// </summary>
{ private void ProcessAssetQueue()
if(this.AssetRequests.Count == 0) {
{ if (this.AssetRequests.Count == 0)
//no requests waiting {
return; //no requests waiting
} return;
int num; }
int num;
if(this.AssetRequests.Count < 5)
{ if (this.AssetRequests.Count < 5)
//lower than 5 so do all of them {
num = this.AssetRequests.Count; //lower than 5 so do all of them
} num = this.AssetRequests.Count;
else }
{ else
num=5; {
} num = 5;
AssetRequest req; }
for(int i = 0; i < num; i++) AssetRequest req;
{ for (int i = 0; i < num; i++)
req=(AssetRequest)this.AssetRequests[i]; {
req = (AssetRequest)this.AssetRequests[i];
TransferInfoPacket Transfer = new TransferInfoPacket();
Transfer.TransferInfo.ChannelType = 2; TransferInfoPacket Transfer = new TransferInfoPacket();
Transfer.TransferInfo.Status = 0; Transfer.TransferInfo.ChannelType = 2;
Transfer.TransferInfo.TargetType = 0; Transfer.TransferInfo.Status = 0;
Transfer.TransferInfo.Params = req.RequestAssetID.GetBytes(); Transfer.TransferInfo.TargetType = 0;
Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length; Transfer.TransferInfo.Params = req.RequestAssetID.GetBytes();
Transfer.TransferInfo.TransferID = req.TransferRequestID; Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length;
req.RequestUser.OutPacket(Transfer); Transfer.TransferInfo.TransferID = req.TransferRequestID;
req.RequestUser.OutPacket(Transfer);
if(req.NumPackets == 1)
{ if (req.NumPackets == 1)
TransferPacketPacket TransferPacket = new TransferPacketPacket(); {
TransferPacket.TransferData.Packet = 0; TransferPacketPacket TransferPacket = new TransferPacketPacket();
TransferPacket.TransferData.ChannelType = 2; TransferPacket.TransferData.Packet = 0;
TransferPacket.TransferData.TransferID=req.TransferRequestID; TransferPacket.TransferData.ChannelType = 2;
TransferPacket.TransferData.Data = req.AssetInf.Data; TransferPacket.TransferData.TransferID = req.TransferRequestID;
TransferPacket.TransferData.Status = 1; TransferPacket.TransferData.Data = req.AssetInf.Data;
req.RequestUser.OutPacket(TransferPacket); TransferPacket.TransferData.Status = 1;
} req.RequestUser.OutPacket(TransferPacket);
else }
{ else
//more than one packet so split file up , for now it can't be bigger than 2000 bytes {
TransferPacketPacket TransferPacket = new TransferPacketPacket(); //more than one packet so split file up , for now it can't be bigger than 2000 bytes
TransferPacket.TransferData.Packet = 0; TransferPacketPacket TransferPacket = new TransferPacketPacket();
TransferPacket.TransferData.ChannelType = 2; TransferPacket.TransferData.Packet = 0;
TransferPacket.TransferData.TransferID=req.TransferRequestID; TransferPacket.TransferData.ChannelType = 2;
byte[] chunk = new byte[1000]; TransferPacket.TransferData.TransferID = req.TransferRequestID;
Array.Copy(req.AssetInf.Data,chunk,1000); byte[] chunk = new byte[1000];
TransferPacket.TransferData.Data = chunk; Array.Copy(req.AssetInf.Data, chunk, 1000);
TransferPacket.TransferData.Status = 0; TransferPacket.TransferData.Data = chunk;
req.RequestUser.OutPacket(TransferPacket); TransferPacket.TransferData.Status = 0;
req.RequestUser.OutPacket(TransferPacket);
TransferPacket = new TransferPacketPacket();
TransferPacket.TransferData.Packet = 1; TransferPacket = new TransferPacketPacket();
TransferPacket.TransferData.ChannelType = 2; TransferPacket.TransferData.Packet = 1;
TransferPacket.TransferData.TransferID = req.TransferRequestID; TransferPacket.TransferData.ChannelType = 2;
byte[] chunk1 = new byte[(req.AssetInf.Data.Length-1000)]; TransferPacket.TransferData.TransferID = req.TransferRequestID;
Array.Copy(req.AssetInf.Data, 1000, chunk1, 0, chunk1.Length); byte[] chunk1 = new byte[(req.AssetInf.Data.Length - 1000)];
TransferPacket.TransferData.Data = chunk1; Array.Copy(req.AssetInf.Data, 1000, chunk1, 0, chunk1.Length);
TransferPacket.TransferData.Status = 1; TransferPacket.TransferData.Data = chunk1;
req.RequestUser.OutPacket(TransferPacket); TransferPacket.TransferData.Status = 1;
} req.RequestUser.OutPacket(TransferPacket);
}
}
}
//remove requests that have been completed
for(int i = 0; i < num; i++) //remove requests that have been completed
{ for (int i = 0; i < num; i++)
this.AssetRequests.RemoveAt(0); {
} this.AssetRequests.RemoveAt(0);
}
}
}
public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset)
{ public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset)
AssetInfo newAsset = new AssetInfo(); {
newAsset.Data = new byte[sourceAsset.Data.Length]; AssetInfo newAsset = new AssetInfo();
Array.Copy(sourceAsset.Data, newAsset.Data, sourceAsset.Data.Length); newAsset.Data = new byte[sourceAsset.Data.Length];
newAsset.FullID = LLUUID.Random(); Array.Copy(sourceAsset.Data, newAsset.Data, sourceAsset.Data.Length);
newAsset.Type = sourceAsset.Type; newAsset.FullID = LLUUID.Random();
newAsset.InvType = sourceAsset.InvType; newAsset.Type = sourceAsset.Type;
return(newAsset); newAsset.InvType = sourceAsset.InvType;
} return (newAsset);
#endregion }
#endregion
#region Textures
/// <summary> #region Textures
/// /// <summary>
/// </summary> ///
/// <param name="userInfo"></param> /// </summary>
/// <param name="imageID"></param> /// <param name="userInfo"></param>
public void AddTextureRequest(OpenSimClient userInfo, LLUUID imageID) /// <param name="imageID"></param>
{ public void AddTextureRequest(OpenSimClient userInfo, LLUUID imageID)
//check to see if texture is in local cache, if not request from asset server {
if(!this.Textures.ContainsKey(imageID)) //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)) {
{ if (!this.RequestedTextures.ContainsKey(imageID))
//not is cache so request from asset server {
AssetRequest request = new AssetRequest(); //not is cache so request from asset server
request.RequestUser = userInfo; AssetRequest request = new AssetRequest();
request.RequestAssetID = imageID; request.RequestUser = userInfo;
request.IsTextureRequest = true; request.RequestAssetID = imageID;
this.RequestedTextures.Add(imageID, request); request.IsTextureRequest = true;
this._assetServer.RequestAsset(imageID, true); this.RequestedTextures.Add(imageID, request);
} this._assetServer.RequestAsset(imageID, true);
return; }
} return;
}
TextureImage imag = this.Textures[imageID];
AssetRequest req = new AssetRequest(); TextureImage imag = this.Textures[imageID];
req.RequestUser = userInfo; AssetRequest req = new AssetRequest();
req.RequestAssetID = imageID; req.RequestUser = userInfo;
req.IsTextureRequest = true; req.RequestAssetID = imageID;
req.ImageInfo = imag; req.IsTextureRequest = true;
req.ImageInfo = imag;
if(imag.Data.LongLength>600)
{ if (imag.Data.LongLength > 600)
//over 600 bytes so split up file {
req.NumPackets = 1 + (int)(imag.Data.Length-600+999)/1000; //over 600 bytes so split up file
} req.NumPackets = 1 + (int)(imag.Data.Length - 600 + 999) / 1000;
else }
{ else
req.NumPackets = 1; {
} req.NumPackets = 1;
}
this.TextureRequests.Add(req);
} this.TextureRequests.Add(req);
}
public TextureImage CloneImage(LLUUID newOwner, TextureImage source)
{ public TextureImage CloneImage(LLUUID newOwner, TextureImage source)
TextureImage newImage = new TextureImage(); {
newImage.Data = new byte[source.Data.Length]; TextureImage newImage = new TextureImage();
Array.Copy(source.Data,newImage.Data,source.Data.Length); newImage.Data = new byte[source.Data.Length];
//newImage.filename = source.filename; Array.Copy(source.Data, newImage.Data, source.Data.Length);
newImage.FullID = LLUUID.Random(); //newImage.filename = source.filename;
newImage.Name = source.Name; newImage.FullID = LLUUID.Random();
return(newImage); newImage.Name = source.Name;
} return (newImage);
#endregion }
#endregion
#region viewer asset uploading
/* public AssetBase UploadPacket(AssetUploadRequestPacket pack) #region viewer asset uploading
/* public AssetBase UploadPacket(AssetUploadRequestPacket pack)
{ {
AssetBase asset = null; AssetBase asset = null;
if(this.IncomingAssets.ContainsKey(pack.AssetBlock.TransactionID)) if(this.IncomingAssets.ContainsKey(pack.AssetBlock.TransactionID))
@ -491,65 +492,65 @@ namespace OpenSim.Assets
} }
return asset; return asset;
}*/ }*/
#endregion
}
public class AssetRequest #endregion
{
public OpenSimClient RequestUser; }
public LLUUID RequestAssetID;
public AssetInfo AssetInf; public class AssetRequest
public TextureImage ImageInfo; {
public LLUUID TransferRequestID; public OpenSimClient RequestUser;
public long DataPointer = 0; public LLUUID RequestAssetID;
public int NumPackets = 0; public AssetInfo AssetInf;
public int PacketCounter = 0; public TextureImage ImageInfo;
public bool IsTextureRequest; public LLUUID TransferRequestID;
//public bool AssetInCache; public long DataPointer = 0;
//public int TimeRequested; public int NumPackets = 0;
public int PacketCounter = 0;
public AssetRequest() public bool IsTextureRequest;
{ //public bool AssetInCache;
//public int TimeRequested;
}
} public AssetRequest()
{
public class AssetInfo : AssetBase
{ }
public AssetInfo() }
{
public class AssetInfo : AssetBase
} {
public AssetInfo()
public AssetInfo(AssetBase aBase) {
{
Data= aBase.Data; }
FullID = aBase.FullID;
Type = aBase.Type; public AssetInfo(AssetBase aBase)
InvType = aBase.InvType; {
Name= aBase.Name; Data = aBase.Data;
Description = aBase.Description; FullID = aBase.FullID;
} Type = aBase.Type;
} InvType = aBase.InvType;
Name = aBase.Name;
public class TextureImage : AssetBase Description = aBase.Description;
{ }
public TextureImage() }
{
public class TextureImage : AssetBase
} {
public TextureImage()
public TextureImage(AssetBase aBase) {
{
Data= aBase.Data; }
FullID = aBase.FullID;
Type = aBase.Type; public TextureImage(AssetBase aBase)
InvType = aBase.InvType; {
Name= aBase.Name; Data = aBase.Data;
Description = aBase.Description; FullID = aBase.FullID;
} Type = aBase.Type;
} InvType = aBase.InvType;
Name = aBase.Name;
Description = aBase.Description;
}
}
} }

View File

@ -34,266 +34,266 @@ using OpenSim.GridServers;
namespace OpenSim.Assets namespace OpenSim.Assets
{ {
/// <summary> /// <summary>
/// Description of InventoryManager. /// Description of InventoryManager.
/// </summary> /// </summary>
public class InventoryManager public class InventoryManager
{ {
private Dictionary<LLUUID, AgentInventory> _agentsInventory; private Dictionary<LLUUID, AgentInventory> _agentsInventory;
private List<UserServerRequest> _serverRequests; //list of requests made to user server. private List<UserServerRequest> _serverRequests; //list of requests made to user server.
private System.Text.Encoding _enc = System.Text.Encoding.ASCII; private System.Text.Encoding _enc = System.Text.Encoding.ASCII;
private const uint FULL_MASK_PERMISSIONS = 2147483647; private const uint FULL_MASK_PERMISSIONS = 2147483647;
public InventoryManager() public InventoryManager()
{ {
_agentsInventory = new Dictionary<LLUUID,AgentInventory>(); _agentsInventory = new Dictionary<LLUUID, AgentInventory>();
_serverRequests = new List<UserServerRequest>(); _serverRequests = new List<UserServerRequest>();
} }
public void AddNewAgentsInventory(AgentInventory agentInventory) public void AddNewAgentsInventory(AgentInventory agentInventory)
{ {
this._agentsInventory.Add(agentInventory.AgentID, agentInventory); this._agentsInventory.Add(agentInventory.AgentID, agentInventory);
} }
public void ClientLeaving(LLUUID clientID) public void ClientLeaving(LLUUID clientID)
{ {
if(this._agentsInventory.ContainsKey(clientID)) if (this._agentsInventory.ContainsKey(clientID))
{ {
this._agentsInventory.Remove(clientID); this._agentsInventory.Remove(clientID);
} }
} }
public bool CreateNewInventoryFolder(OpenSimClient remoteClient, LLUUID folderID) public bool CreateNewInventoryFolder(OpenSimClient remoteClient, LLUUID folderID)
{ {
bool res = false; bool res = false;
if(folderID != LLUUID.Zero) //don't create a folder with a zero id if (folderID != LLUUID.Zero) //don't create a folder with a zero id
{ {
if(this._agentsInventory.ContainsKey(remoteClient.AgentID)) if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
{ {
res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID); res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID);
} }
} }
return res; return res;
} }
public LLUUID AddNewInventoryItem(OpenSimClient remoteClient, LLUUID folderID, AssetBase asset) public LLUUID AddNewInventoryItem(OpenSimClient remoteClient, LLUUID folderID, AssetBase asset)
{ {
LLUUID newItem = null; LLUUID newItem = null;
if(this._agentsInventory.ContainsKey(remoteClient.AgentID)) if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
{ {
newItem = this._agentsInventory[remoteClient.AgentID].AddToInventory(folderID, asset); newItem = this._agentsInventory[remoteClient.AgentID].AddToInventory(folderID, asset);
} }
return newItem; return newItem;
} }
public void FetchInventoryDescendents(OpenSimClient userInfo, FetchInventoryDescendentsPacket FetchDescend) public void FetchInventoryDescendents(OpenSimClient userInfo, FetchInventoryDescendentsPacket FetchDescend)
{ {
if(this._agentsInventory.ContainsKey(userInfo.AgentID)) if (this._agentsInventory.ContainsKey(userInfo.AgentID))
{ {
AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID]; AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
if(FetchDescend.InventoryData.FetchItems) if (FetchDescend.InventoryData.FetchItems)
{ {
if(agentInventory.Folders.ContainsKey(FetchDescend.InventoryData.FolderID)) if (agentInventory.Folders.ContainsKey(FetchDescend.InventoryData.FolderID))
{ {
InventoryFolder Folder = agentInventory.Folders[FetchDescend.InventoryData.FolderID]; InventoryFolder Folder = agentInventory.Folders[FetchDescend.InventoryData.FolderID];
InventoryDescendentsPacket Descend = new InventoryDescendentsPacket(); InventoryDescendentsPacket Descend = new InventoryDescendentsPacket();
Descend.AgentData.AgentID = userInfo.AgentID; Descend.AgentData.AgentID = userInfo.AgentID;
Descend.AgentData.OwnerID = Folder.OwnerID; Descend.AgentData.OwnerID = Folder.OwnerID;
Descend.AgentData.FolderID = FetchDescend.InventoryData.FolderID; Descend.AgentData.FolderID = FetchDescend.InventoryData.FolderID;
Descend.AgentData.Descendents = Folder.Items.Count; Descend.AgentData.Descendents = Folder.Items.Count;
Descend.AgentData.Version = Folder.Items.Count; Descend.AgentData.Version = Folder.Items.Count;
Descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[Folder.Items.Count]; Descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[Folder.Items.Count];
for(int i = 0; i < Folder.Items.Count ; i++) for (int i = 0; i < Folder.Items.Count; i++)
{ {
InventoryItem Item=Folder.Items[i]; InventoryItem Item = Folder.Items[i];
Descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock(); Descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock();
Descend.ItemData[i].ItemID = Item.ItemID; Descend.ItemData[i].ItemID = Item.ItemID;
Descend.ItemData[i].AssetID = Item.AssetID; Descend.ItemData[i].AssetID = Item.AssetID;
Descend.ItemData[i].CreatorID = Item.CreatorID; Descend.ItemData[i].CreatorID = Item.CreatorID;
Descend.ItemData[i].BaseMask = FULL_MASK_PERMISSIONS; Descend.ItemData[i].BaseMask = FULL_MASK_PERMISSIONS;
Descend.ItemData[i].CreationDate = 1000; Descend.ItemData[i].CreationDate = 1000;
Descend.ItemData[i].Description = _enc.GetBytes(Item.Description+"\0"); Descend.ItemData[i].Description = _enc.GetBytes(Item.Description + "\0");
Descend.ItemData[i].EveryoneMask = FULL_MASK_PERMISSIONS; Descend.ItemData[i].EveryoneMask = FULL_MASK_PERMISSIONS;
Descend.ItemData[i].Flags = 1; Descend.ItemData[i].Flags = 1;
Descend.ItemData[i].FolderID = Item.FolderID; Descend.ItemData[i].FolderID = Item.FolderID;
Descend.ItemData[i].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000"); Descend.ItemData[i].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
Descend.ItemData[i].GroupMask = FULL_MASK_PERMISSIONS; Descend.ItemData[i].GroupMask = FULL_MASK_PERMISSIONS;
Descend.ItemData[i].InvType = Item.InvType; Descend.ItemData[i].InvType = Item.InvType;
Descend.ItemData[i].Name = _enc.GetBytes(Item.Name+"\0"); Descend.ItemData[i].Name = _enc.GetBytes(Item.Name + "\0");
Descend.ItemData[i].NextOwnerMask = FULL_MASK_PERMISSIONS; Descend.ItemData[i].NextOwnerMask = FULL_MASK_PERMISSIONS;
Descend.ItemData[i].OwnerID = Item.OwnerID; Descend.ItemData[i].OwnerID = Item.OwnerID;
Descend.ItemData[i].OwnerMask = FULL_MASK_PERMISSIONS; Descend.ItemData[i].OwnerMask = FULL_MASK_PERMISSIONS;
Descend.ItemData[i].SalePrice = 100; Descend.ItemData[i].SalePrice = 100;
Descend.ItemData[i].SaleType = 0; Descend.ItemData[i].SaleType = 0;
Descend.ItemData[i].Type = Item.Type; Descend.ItemData[i].Type = Item.Type;
Descend.ItemData[i].CRC=libsecondlife.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); Descend.ItemData[i].CRC = libsecondlife.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); userInfo.OutPacket(Descend);
} }
} }
else else
{ {
Console.WriteLine("fetch subfolders"); Console.WriteLine("fetch subfolders");
} }
} }
} }
public void FetchInventory(OpenSimClient userInfo, FetchInventoryPacket FetchItems) public void FetchInventory(OpenSimClient userInfo, FetchInventoryPacket FetchItems)
{ {
if(this._agentsInventory.ContainsKey(userInfo.AgentID)) if (this._agentsInventory.ContainsKey(userInfo.AgentID))
{ {
AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID]; AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
for(int i = 0; i < FetchItems.InventoryData.Length; i++) for (int i = 0; i < FetchItems.InventoryData.Length; i++)
{ {
if(agentInventory.Items.ContainsKey(FetchItems.InventoryData[i].ItemID)) if (agentInventory.Items.ContainsKey(FetchItems.InventoryData[i].ItemID))
{ {
InventoryItem Item = agentInventory.Items[FetchItems.InventoryData[i].ItemID]; InventoryItem Item = agentInventory.Items[FetchItems.InventoryData[i].ItemID];
FetchInventoryReplyPacket InventoryReply = new FetchInventoryReplyPacket(); FetchInventoryReplyPacket InventoryReply = new FetchInventoryReplyPacket();
InventoryReply.AgentData.AgentID = userInfo.AgentID; InventoryReply.AgentData.AgentID = userInfo.AgentID;
InventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1]; InventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
InventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock(); InventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
InventoryReply.InventoryData[0].ItemID = Item.ItemID; InventoryReply.InventoryData[0].ItemID = Item.ItemID;
InventoryReply.InventoryData[0].AssetID = Item.AssetID; InventoryReply.InventoryData[0].AssetID = Item.AssetID;
InventoryReply.InventoryData[0].CreatorID = Item.CreatorID; InventoryReply.InventoryData[0].CreatorID = Item.CreatorID;
InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS; InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS;
InventoryReply.InventoryData[0].CreationDate = 1000; InventoryReply.InventoryData[0].CreationDate = 1000;
InventoryReply.InventoryData[0].Description = _enc.GetBytes( Item.Description+"\0"); InventoryReply.InventoryData[0].Description = _enc.GetBytes(Item.Description + "\0");
InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS; InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS;
InventoryReply.InventoryData[0].Flags = 1; InventoryReply.InventoryData[0].Flags = 1;
InventoryReply.InventoryData[0].FolderID = Item.FolderID; InventoryReply.InventoryData[0].FolderID = Item.FolderID;
InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000"); InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS; InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS;
InventoryReply.InventoryData[0].InvType = Item.InvType; InventoryReply.InventoryData[0].InvType = Item.InvType;
InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name+"\0"); InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name + "\0");
InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS; InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS;
InventoryReply.InventoryData[0].OwnerID = Item.OwnerID; InventoryReply.InventoryData[0].OwnerID = Item.OwnerID;
InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS; InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS;
InventoryReply.InventoryData[0].SalePrice = 100; InventoryReply.InventoryData[0].SalePrice = 100;
InventoryReply.InventoryData[0].SaleType = 0; InventoryReply.InventoryData[0].SaleType = 0;
InventoryReply.InventoryData[0].Type = Item.Type; InventoryReply.InventoryData[0].Type = Item.Type;
InventoryReply.InventoryData[0].CRC = libsecondlife.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); InventoryReply.InventoryData[0].CRC = libsecondlife.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); userInfo.OutPacket(InventoryReply);
} }
} }
} }
} }
} }
public class AgentInventory public class AgentInventory
{ {
//Holds the local copy of Inventory info for a agent //Holds the local copy of Inventory info for a agent
public Dictionary<LLUUID, InventoryFolder> Folders; public Dictionary<LLUUID, InventoryFolder> Folders;
public Dictionary<LLUUID, InventoryItem> Items; public Dictionary<LLUUID, InventoryItem> Items;
public int LastCached; //time this was last stored/compared to user server public int LastCached; //time this was last stored/compared to user server
public LLUUID AgentID; public LLUUID AgentID;
public AvatarWearable[] Wearables; public AvatarWearable[] Wearables;
public AgentInventory() public AgentInventory()
{ {
Folders = new Dictionary<LLUUID, InventoryFolder>(); Folders = new Dictionary<LLUUID, InventoryFolder>();
Items = new Dictionary<LLUUID, InventoryItem>(); Items = new Dictionary<LLUUID, InventoryItem>();
Wearables = new AvatarWearable[2]; Wearables = new AvatarWearable[2];
for(int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
Wearables[i] = new AvatarWearable(); Wearables[i] = new AvatarWearable();
} }
} }
public bool CreateNewFolder(LLUUID folderID) public bool CreateNewFolder(LLUUID folderID)
{ {
InventoryFolder Folder = new InventoryFolder(); InventoryFolder Folder = new InventoryFolder();
Folder.FolderID = folderID; Folder.FolderID = folderID;
Folder.OwnerID = this.AgentID; Folder.OwnerID = this.AgentID;
this.Folders.Add(Folder.FolderID, Folder); this.Folders.Add(Folder.FolderID, Folder);
return(true); return (true);
} }
public LLUUID AddToInventory( LLUUID folderID, AssetBase asset) public LLUUID AddToInventory(LLUUID folderID, AssetBase asset)
{ {
if(this.Folders.ContainsKey(folderID)) if (this.Folders.ContainsKey(folderID))
{ {
LLUUID NewItemID = LLUUID.Random(); LLUUID NewItemID = LLUUID.Random();
InventoryItem Item = new InventoryItem(); InventoryItem Item = new InventoryItem();
Item.FolderID = folderID; Item.FolderID = folderID;
Item.OwnerID = AgentID; Item.OwnerID = AgentID;
Item.AssetID = asset.FullID; Item.AssetID = asset.FullID;
Item.ItemID = NewItemID; Item.ItemID = NewItemID;
Item.Type = asset.Type; Item.Type = asset.Type;
Item.Name = asset.Name; Item.Name = asset.Name;
Item.Description = asset.Description; Item.Description = asset.Description;
Item.InvType = asset.InvType; Item.InvType = asset.InvType;
this.Items.Add(Item.ItemID, Item); this.Items.Add(Item.ItemID, Item);
InventoryFolder Folder = Folders[Item.FolderID]; InventoryFolder Folder = Folders[Item.FolderID];
Folder.Items.Add(Item); Folder.Items.Add(Item);
return(Item.ItemID); return (Item.ItemID);
} }
else else
{ {
return(null); return (null);
} }
} }
} }
public class InventoryFolder public class InventoryFolder
{ {
public List<InventoryItem> Items; public List<InventoryItem> Items;
//public List<InventoryFolder> Subfolders; //public List<InventoryFolder> Subfolders;
public LLUUID FolderID; public LLUUID FolderID;
public LLUUID OwnerID; public LLUUID OwnerID;
public LLUUID ParentID; public LLUUID ParentID;
public string Name; public string Name;
public byte Type; public byte Type;
public InventoryFolder() public InventoryFolder()
{ {
Items = new List<InventoryItem>(); Items = new List<InventoryItem>();
//Subfolders = new List<InventoryFolder>(); //Subfolders = new List<InventoryFolder>();
} }
} }
public class InventoryItem public class InventoryItem
{ {
public LLUUID FolderID; public LLUUID FolderID;
public LLUUID OwnerID; public LLUUID OwnerID;
public LLUUID ItemID; public LLUUID ItemID;
public LLUUID AssetID; public LLUUID AssetID;
public LLUUID CreatorID; public LLUUID CreatorID;
public sbyte InvType; public sbyte InvType;
public sbyte Type; public sbyte Type;
public string Name; public string Name;
public string Description; public string Description;
public InventoryItem() public InventoryItem()
{ {
this.CreatorID = LLUUID.Zero; this.CreatorID = LLUUID.Zero;
} }
} }
public class UserServerRequest public class UserServerRequest
{ {
public UserServerRequest() public UserServerRequest()
{ {
} }
} }
public class AvatarWearable public class AvatarWearable
{ {
public LLUUID AssetID = new LLUUID("00000000-0000-0000-0000-000000000000"); public LLUUID AssetID = new LLUUID("00000000-0000-0000-0000-000000000000");
public LLUUID ItemID = new LLUUID("00000000-0000-0000-0000-000000000000"); public LLUUID ItemID = new LLUUID("00000000-0000-0000-0000-000000000000");
public AvatarWearable() public AvatarWearable()
{ {
} }
} }
} }

175
src/CAPS/SimHttp.cs Normal file
View File

@ -0,0 +1,175 @@
/*
Copyright (c) OpenSimCAPS project, http://osgrid.org/
* 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.Text;
using Nwc.XmlRpc;
using System.Threading;
using System.Text.RegularExpressions;
using System.Net;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using libsecondlife;
using ServerConsole;
using OpenSim.GridServers;
namespace OpenSim
{
// Dummy HTTP server, does nothing useful for now
public class SimCAPSHTTPServer
{
public Thread HTTPD;
public HttpListener Listener;
public SimCAPSHTTPServer()
{
ServerConsole.MainConsole.Instance.WriteLine("Starting up HTTP Server");
HTTPD = new Thread(new ThreadStart(StartHTTP));
HTTPD.Start();
}
public void StartHTTP()
{
try
{
ServerConsole.MainConsole.Instance.WriteLine("SimHttp.cs:StartHTTP() - Spawned main thread OK");
Listener = new HttpListener();
Listener.Prefixes.Add("http://+:" + OpenSim_Main.cfg.IPListenPort + "/");
Listener.Start();
HttpListenerContext context;
while (true)
{
context = Listener.GetContext();
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), context);
}
}
catch (Exception e)
{
ServerConsole.MainConsole.Instance.WriteLine(e.Message);
}
}
static string ParseXMLRPC(string requestBody)
{
try
{
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
Hashtable requestData = (Hashtable)request.Params[0];
switch (request.MethodName)
{
case "expect_user":
GridServers.agentcircuitdata agent_data = new GridServers.agentcircuitdata();
agent_data.SessionID = new LLUUID((string)requestData["session_id"]);
agent_data.SecureSessionID = new LLUUID((string)requestData["secure_session_id"]);
agent_data.firstname = (string)requestData["firstname"];
agent_data.lastname = (string)requestData["lastname"];
agent_data.AgentID = new LLUUID((string)requestData["agent_id"]);
agent_data.circuitcode = Convert.ToUInt32(requestData["circuit_code"]);
if (OpenSim_Main.gridServers.GridServer.GetName() == "Remote")
{
((RemoteGridBase)OpenSim_Main.gridServers.GridServer).agentcircuits.Add((uint)agent_data.circuitcode, agent_data);
}
return "<?xml version=\"1.0\"?><methodResponse><params /></methodResponse>";
break;
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
return "";
}
static string ParseREST(string requestBody, string requestURL)
{
return "";
}
static string ParseLLSDXML(string requestBody)
{
// dummy function for now - IMPLEMENT ME!
return "";
}
static void HandleRequest(Object stateinfo)
{
HttpListenerContext context = (HttpListenerContext)stateinfo;
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
response.KeepAlive = false;
response.SendChunked = false;
System.IO.Stream body = request.InputStream;
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
string requestBody = reader.ReadToEnd();
body.Close();
reader.Close();
string responseString = "";
switch (request.ContentType)
{
case "text/xml":
// must be XML-RPC, so pass to the XML-RPC parser
responseString = ParseXMLRPC(requestBody);
response.AddHeader("Content-type", "text/xml");
break;
case "application/xml":
// probably LLSD we hope, otherwise it should be ignored by the parser
responseString = ParseLLSDXML(requestBody);
response.AddHeader("Content-type", "application/xml");
break;
case null:
// must be REST or invalid crap, so pass to the REST parser
responseString = ParseREST(request.Url.OriginalString, requestBody);
break;
}
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
System.IO.Stream output = response.OutputStream;
response.SendChunked = false;
response.ContentLength64 = buffer.Length;
output.Write(buffer, 0, buffer.Length);
output.Close();
}
}
}

View File

@ -35,40 +35,40 @@ using OpenSim.world;
namespace OpenSim namespace OpenSim
{ {
/// <summary> /// <summary>
/// This class handles connection to the underlying database used for configuration of the region. /// This class handles connection to the underlying database used for configuration of the region.
/// Region content is also stored by this class. The main entry point is InitConfig() which attempts to locate /// Region content is also stored by this class. The main entry point is InitConfig() which attempts to locate
/// opensim.yap in the current working directory. If opensim.yap can not be found, default settings are loaded from /// opensim.yap in the current working directory. If opensim.yap can not be found, default settings are loaded from
/// what is hardcoded here and then saved into opensim.yap for future startups. /// what is hardcoded here and then saved into opensim.yap for future startups.
/// </summary> /// </summary>
public abstract class SimConfig public abstract class SimConfig
{ {
public string RegionName; public string RegionName;
public uint RegionLocX; public uint RegionLocX;
public uint RegionLocY; public uint RegionLocY;
public ulong RegionHandle; public ulong RegionHandle;
public int IPListenPort; public int IPListenPort;
public string IPListenAddr; public string IPListenAddr;
public string AssetURL; public string AssetURL;
public string AssetSendKey; public string AssetSendKey;
public string GridURL; public string GridURL;
public string GridSendKey; public string GridSendKey;
public abstract void InitConfig(); public abstract void InitConfig();
public abstract void LoadFromGrid(); public abstract void LoadFromGrid();
public abstract World LoadWorld(); public abstract World LoadWorld();
public abstract void SaveMap(); public abstract void SaveMap();
} }
public interface ISimConfig public interface ISimConfig
{ {
SimConfig GetConfigObject(); SimConfig GetConfigObject();
} }
} }

View File

@ -8,7 +8,7 @@
<ProjectGuid>{B063760D-DB8D-4F64-B6FE-335FAD1E650A}</ProjectGuid> <ProjectGuid>{B063760D-DB8D-4F64-B6FE-335FAD1E650A}</ProjectGuid>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>bin\Debug\</OutputPath> <OutputPath>..\..\..\bin\</OutputPath>
<Optimize>False</Optimize> <Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugSymbols>True</DebugSymbols> <DebugSymbols>True</DebugSymbols>
@ -16,7 +16,7 @@
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow> <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath> <OutputPath>..\..\..\bin\</OutputPath>
<Optimize>True</Optimize> <Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<DebugSymbols>False</DebugSymbols> <DebugSymbols>False</DebugSymbols>

View File

@ -34,50 +34,50 @@ using libsecondlife;
namespace OpenSim.GridServers namespace OpenSim.GridServers
{ {
/// <summary> /// <summary>
/// Description of IAssetServer. /// Description of IAssetServer.
/// </summary> /// </summary>
public interface IAssetServer public interface IAssetServer
{ {
void SetReceiver(IAssetReceiver receiver); void SetReceiver(IAssetReceiver receiver);
void RequestAsset(LLUUID assetID, bool isTexture); void RequestAsset(LLUUID assetID, bool isTexture);
void UpdateAsset(AssetBase asset); void UpdateAsset(AssetBase asset);
void UploadNewAsset(AssetBase asset); void UploadNewAsset(AssetBase asset);
void SetServerInfo(string ServerUrl, string ServerKey); void SetServerInfo(string ServerUrl, string ServerKey);
void Close(); void Close();
} }
// could change to delegate? // could change to delegate?
public interface IAssetReceiver public interface IAssetReceiver
{ {
void AssetReceived(AssetBase asset, bool IsTexture); void AssetReceived(AssetBase asset, bool IsTexture);
void AssetNotFound(AssetBase asset); void AssetNotFound(AssetBase asset);
} }
public struct ARequest public struct ARequest
{ {
public LLUUID AssetID; public LLUUID AssetID;
public bool IsTexture; public bool IsTexture;
} }
public class AssetBase public class AssetBase
{ {
public byte[] Data; public byte[] Data;
public LLUUID FullID; public LLUUID FullID;
public sbyte Type; public sbyte Type;
public sbyte InvType; public sbyte InvType;
public string Name; public string Name;
public string Description; public string Description;
public AssetBase() public AssetBase()
{ {
} }
} }
public interface IAssetPlugin public interface IAssetPlugin
{ {
IAssetServer GetAssetServer(); IAssetServer GetAssetServer();
} }
} }

View File

@ -32,64 +32,105 @@ using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.IO; using System.IO;
using libsecondlife; using libsecondlife;
using OpenSim;
namespace OpenSim.GridServers namespace OpenSim.GridServers
{ {
/// <summary> /// <summary>
/// Handles connection to Grid Servers. /// Handles connection to Grid Servers.
/// also Sim to Sim connections? /// also Sim to Sim connections?
/// </summary> /// </summary>
public interface IGridServer
public interface IGridServer
{
bool RequestConnection();
UUIDBlock RequestUUIDBlock();
void RequestNeighbours(); //should return a array of neighbouring regions
AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
void SetServerInfo(string ServerUrl, string ServerKey);
void Close();
void AddNewSession(Login session); // only used by local version of grid server
// and didn't use to be part of this interface until we put this in a dll
}
public struct UUIDBlock
{
public LLUUID BlockStart;
public LLUUID BlockEnd;
}
public class AuthenticateResponse
{
public bool Authorised;
public Login LoginInfo;
public AuthenticateResponse()
{
}
}
public class Login
{ {
public string First = "Test"; UUIDBlock RequestUUIDBlock();
public string Last = "User"; void RequestNeighbours(); //should return a array of neighbouring regions
public LLUUID Agent; AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
public LLUUID Session; bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
public LLUUID InventoryFolder; string GetName();
public LLUUID BaseFolder; bool RequestConnection();
public Login() void SetServerInfo(string ServerUrl, string ServerKey);
{ void Close();
}
} }
public interface IGridPlugin public abstract class RemoteGridBase : IGridServer
{ {
IGridServer GetGridServer(); public abstract Dictionary<uint, agentcircuitdata> agentcircuits
} {
get;
set;
}
public abstract UUIDBlock RequestUUIDBlock();
public abstract void RequestNeighbours();
public abstract AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
public abstract bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
public abstract string GetName();
public abstract bool RequestConnection();
public abstract void SetServerInfo(string ServerUrl, string ServerKey);
public abstract void Close();
}
public abstract class LocalGridBase : IGridServer
{
public abstract UUIDBlock RequestUUIDBlock();
public abstract void RequestNeighbours();
public abstract AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
public abstract bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
public abstract string GetName();
public abstract bool RequestConnection();
public abstract void SetServerInfo(string ServerUrl, string ServerKey);
public abstract void AddNewSession(Login session);
public abstract void Close();
}
public struct UUIDBlock
{
public LLUUID BlockStart;
public LLUUID BlockEnd;
}
public class AuthenticateResponse
{
public bool Authorised;
public Login LoginInfo;
public AuthenticateResponse()
{
}
}
public class Login
{
public string First = "Test";
public string Last = "User";
public LLUUID Agent;
public LLUUID Session;
public LLUUID InventoryFolder;
public LLUUID BaseFolder;
public Login()
{
}
}
public interface IGridPlugin
{
IGridServer GetGridServer();
}
public class agentcircuitdata
{
public agentcircuitdata() { }
public LLUUID AgentID;
public LLUUID SessionID;
public LLUUID SecureSessionID;
public string firstname;
public string lastname;
public uint circuitcode;
}
} }

View File

@ -30,57 +30,57 @@ using libsecondlife;
namespace GridInterfaces namespace GridInterfaces
{ {
/// <summary> /// <summary>
/// ILocalStorage. Really hacked together right now needs cleaning up /// ILocalStorage. Really hacked together right now needs cleaning up
/// </summary> /// </summary>
public interface ILocalStorage public interface ILocalStorage
{ {
void StorePrim(PrimData prim); void StorePrim(PrimData prim);
void RemovePrim(LLUUID primID); void RemovePrim(LLUUID primID);
void LoadPrimitives(ILocalStorageReceiver receiver); void LoadPrimitives(ILocalStorageReceiver receiver);
void ShutDown(); void ShutDown();
} }
public interface ILocalStorageReceiver public interface ILocalStorageReceiver
{ {
void PrimFromStorage(PrimData prim); void PrimFromStorage(PrimData prim);
} }
public class PrimData public class PrimData
{ {
public LLUUID OwnerID; public LLUUID OwnerID;
public byte PCode; public byte PCode;
public byte PathBegin; public byte PathBegin;
public byte PathEnd; public byte PathEnd;
public byte PathScaleX; public byte PathScaleX;
public byte PathScaleY; public byte PathScaleY;
public byte PathShearX; public byte PathShearX;
public byte PathShearY; public byte PathShearY;
public sbyte PathSkew; public sbyte PathSkew;
public byte ProfileBegin; public byte ProfileBegin;
public byte ProfileEnd; public byte ProfileEnd;
public LLVector3 Scale; public LLVector3 Scale;
public byte PathCurve; public byte PathCurve;
public byte ProfileCurve; public byte ProfileCurve;
public uint ParentID=0; public uint ParentID = 0;
public byte ProfileHollow; public byte ProfileHollow;
public sbyte PathRadiusOffset; public sbyte PathRadiusOffset;
public byte PathRevolutions; public byte PathRevolutions;
public sbyte PathTaperX; public sbyte PathTaperX;
public sbyte PathTaperY; public sbyte PathTaperY;
public sbyte PathTwist; public sbyte PathTwist;
public sbyte PathTwistBegin; public sbyte PathTwistBegin;
//following only used during prim storage //following only used during prim storage
public LLVector3 Position; public LLVector3 Position;
public LLQuaternion Rotation; public LLQuaternion Rotation;
public uint LocalID; public uint LocalID;
public LLUUID FullID; public LLUUID FullID;
public PrimData() public PrimData()
{ {
} }
} }
} }

View File

@ -140,7 +140,6 @@ namespace OpenSim.GridServers
// ProxyLogin: proxy a login request // ProxyLogin: proxy a login request
private void LoginRequest(StreamReader reader, StreamWriter writer) private void LoginRequest(StreamReader reader, StreamWriter writer)
{ {
Console.WriteLine("LoginServer - new Login attempt");
lock(this) lock(this)
{ {
string line; string line;
@ -217,6 +216,21 @@ namespace OpenSim.GridServers
int SessionRand = this.RandomClass.Next(1,999); int SessionRand = this.RandomClass.Next(1,999);
Session = new LLUUID("aaaabbbb-0200-"+SessionRand.ToString("0000")+"-8664-58f53e442797"); Session = new LLUUID("aaaabbbb-0200-"+SessionRand.ToString("0000")+"-8664-58f53e442797");
//create some login info
Hashtable LoginFlagsHash = new Hashtable();
LoginFlagsHash["daylight_savings"]="N";
LoginFlagsHash["stipend_since_login"]="N";
LoginFlagsHash["gendered"]="Y";
LoginFlagsHash["ever_logged_in"]="Y";
ArrayList LoginFlags=new ArrayList();
LoginFlags.Add(LoginFlagsHash);
Hashtable GlobalT = new Hashtable();
GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
GlobalT["cloud_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
GlobalT["moon_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
ArrayList GlobalTextures = new ArrayList();
GlobalTextures.Add(GlobalT);
XmlRpcResponse response =(XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse); XmlRpcResponse response =(XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse);
Hashtable responseData = (Hashtable)response.Value; Hashtable responseData = (Hashtable)response.Value;
@ -225,6 +239,11 @@ namespace OpenSim.GridServers
responseData["sim_ip"] = OpenSim_Main.cfg.IPListenAddr; responseData["sim_ip"] = OpenSim_Main.cfg.IPListenAddr;
responseData["agent_id"] = Agent.ToStringHyphenated(); responseData["agent_id"] = Agent.ToStringHyphenated();
responseData["session_id"] = Session.ToStringHyphenated(); responseData["session_id"] = Session.ToStringHyphenated();
responseData["seconds_since_epoch"]=(Int32)(DateTime.UtcNow - new DateTime(1970,1,1)).TotalSeconds;
responseData["login-flags"]=LoginFlags;
responseData["global-textures"]=GlobalTextures;
//inventory
ArrayList InventoryList = (ArrayList) responseData["inventory-skeleton"]; ArrayList InventoryList = (ArrayList) responseData["inventory-skeleton"];
Hashtable Inventory1 = (Hashtable)InventoryList[0]; Hashtable Inventory1 = (Hashtable)InventoryList[0];
Hashtable Inventory2 = (Hashtable)InventoryList[1]; Hashtable Inventory2 = (Hashtable)InventoryList[1];
@ -232,7 +251,7 @@ namespace OpenSim.GridServers
LLUUID InventoryFolderID = LLUUID.Random(); LLUUID InventoryFolderID = LLUUID.Random();
Inventory2["name"] = "Base"; Inventory2["name"] = "Base";
Inventory2["folder_id"] = BaseFolderID.ToStringHyphenated(); Inventory2["folder_id"] = BaseFolderID.ToStringHyphenated();
Inventory2["type_default"] =0; Inventory2["type_default"] =6;
Inventory1["folder_id"] = InventoryFolderID.ToStringHyphenated(); Inventory1["folder_id"] = InventoryFolderID.ToStringHyphenated();
ArrayList InventoryRoot = (ArrayList) responseData["inventory-root"]; ArrayList InventoryRoot = (ArrayList) responseData["inventory-root"];
@ -250,8 +269,11 @@ namespace OpenSim.GridServers
_login.BaseFolder = BaseFolderID; _login.BaseFolder = BaseFolderID;
_login.InventoryFolder = InventoryFolderID; _login.InventoryFolder = InventoryFolderID;
//working on local computer so lets add to the gridserver's list of sessions //working on local computer if so lets add to the gridserver's list of sessions?
this._gridServer.AddNewSession(_login); if(OpenSim_Main.gridServers.GridServer.GetName() == "Local")
{
((LocalGridBase)this._gridServer).AddNewSession(_login);
}
// forward the XML-RPC response to the client // forward the XML-RPC response to the client
writer.WriteLine("HTTP/1.0 200 OK"); writer.WriteLine("HTTP/1.0 200 OK");

View File

@ -240,7 +240,7 @@ namespace LocalGridServers
} }
} }
public class LocalGridServer :IGridServer public class LocalGridServer : LocalGridBase
{ {
public List<Login> Sessions = new List<Login>(); public List<Login> Sessions = new List<Login>();
@ -250,11 +250,17 @@ namespace LocalGridServers
ServerConsole.MainConsole.Instance.WriteLine("Local Grid Server class created"); ServerConsole.MainConsole.Instance.WriteLine("Local Grid Server class created");
} }
public bool RequestConnection() public override bool RequestConnection()
{ {
return true; return true;
} }
public AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
public override string GetName()
{
return "Local";
}
public override AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
{ {
//we are running local //we are running local
AuthenticateResponse user = new AuthenticateResponse(); AuthenticateResponse user = new AuthenticateResponse();
@ -274,36 +280,37 @@ namespace LocalGridServers
return(user); return(user);
} }
public bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode) public override bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
{ {
return(true); return(true);
} }
public UUIDBlock RequestUUIDBlock() public override UUIDBlock RequestUUIDBlock()
{ {
UUIDBlock uuidBlock = new UUIDBlock(); UUIDBlock uuidBlock = new UUIDBlock();
return(uuidBlock); return(uuidBlock);
} }
public void RequestNeighbours() public override void RequestNeighbours()
{ {
return; return;
} }
public void SetServerInfo(string ServerUrl, string ServerKey) public override void SetServerInfo(string ServerUrl, string ServerKey)
{ {
} }
public void Close() public override void Close()
{ {
} }
/// <summary> /// <summary>
/// used by the local login server to inform us of new sessions /// used by the local login server to inform us of new sessions
/// </summary> /// </summary>
/// <param name="session"></param> /// <param name="session"></param>
public void AddNewSession(Login session) public override void AddNewSession(Login session)
{ {
lock(this.Sessions) lock(this.Sessions)
{ {

View File

@ -47,295 +47,316 @@ using PhysicsSystem;
namespace OpenSim namespace OpenSim
{ {
/// <summary> /// <summary>
/// Description of MainForm. /// Description of MainForm.
/// </summary> /// </summary>
public class OpenSim_Main public class OpenSim_Main
{ {
public static OpenSim_Main sim; public static OpenSim_Main sim;
public static SimConfig cfg; public static SimConfig cfg;
public static World local_world; public static World local_world;
public static Grid gridServers; public static Grid gridServers;
public static Socket Server;
private static IPEndPoint ServerIncoming;
private static byte[] RecvBuffer = new byte[4096];
private byte[] ZeroBuffer = new byte[8192];
private static IPEndPoint ipeSender;
private static EndPoint epSender;
private static AsyncCallback ReceivedData;
public AssetCache assetCache; public SimCAPSHTTPServer http_server;
public InventoryManager inventoryManager; public Socket Server;
public DateTime startuptime; private IPEndPoint ServerIncoming;
public Dictionary<EndPoint, OpenSimClient> ClientThreads = new Dictionary<EndPoint, OpenSimClient>(); private byte[] RecvBuffer = new byte[4096];
private PhysicsManager physManager; private byte[] ZeroBuffer = new byte[8192];
private System.Timers.Timer timer1 = new System.Timers.Timer(); private IPEndPoint ipeSender;
private string ConfigDll = "SimConfig.dll"; private EndPoint epSender;
private string _physicsEngine = "PhysX"; private AsyncCallback ReceivedData;
public bool sandbox = false;
public bool loginserver = false;
[STAThread]
public static void Main( string[] args )
{
Console.WriteLine("OpenSim " + VersionInfo.Version + "\n");
Console.WriteLine("Starting...\n");
ServerConsole.MainConsole.Instance = new MServerConsole(ServerConsole.ConsoleBase.ConsoleType.Local,"",0);
sim = new OpenSim_Main();
for (int i = 0; i < args.Length; i++)
{
if(args[i] == "-sandbox")
{
sim.sandbox = true;
}
if(args[i] == "-loginserver")
{
sim.loginserver = true;
}
if(args[i] == "-realphysx")
{
sim._physicsEngine = "RealPhysX";
OpenSim.world.Avatar.PhysicsEngineFlying = true;
}
}
//sim.SetUpAssetDatabase();
OpenSim_Main.gridServers = new Grid();
if(sim.sandbox)
{
OpenSim_Main.gridServers.AssetDll = "LocalGridServers.dll";
OpenSim_Main.gridServers.GridDll = "LocalGridServers.dll";
OpenSim_Main.gridServers.LoadPlugins();
ServerConsole.MainConsole.Instance.WriteLine("Starting in Sandbox mode");
}
else
{
OpenSim_Main.gridServers.AssetDll = "RemoteGridServers.dll";
OpenSim_Main.gridServers.GridDll = "RemoteGridServers.dll";
OpenSim_Main.gridServers.LoadPlugins();
ServerConsole.MainConsole.Instance.WriteLine("Starting in Grid mode");
}
if(sim.loginserver && sim.sandbox)
{
LoginServer loginServer = new LoginServer(OpenSim_Main.gridServers.GridServer);
loginServer.Startup();
}
sim.assetCache = new AssetCache(OpenSim_Main.gridServers.AssetServer);
sim.inventoryManager = new InventoryManager();
sim.Startup();
while(true) {
ServerConsole.MainConsole.Instance.MainConsolePrompt();
}
}
private OpenSim_Main() { public AssetCache assetCache;
} public InventoryManager inventoryManager;
public DateTime startuptime;
private void Startup() { public Dictionary<EndPoint, OpenSimClient> ClientThreads = new Dictionary<EndPoint, OpenSimClient>();
startuptime=DateTime.Now; private PhysicsManager physManager;
private System.Timers.Timer timer1 = new System.Timers.Timer();
// We check our local database first, then the grid for config options private string ConfigDll = "SimConfig.dll";
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Loading configuration"); private string _physicsEngine = "PhysX";
cfg = this.LoadConfigDll(this.ConfigDll); public bool sandbox = false;
cfg.InitConfig(); public bool loginserver = false;
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Contacting gridserver");
cfg.LoadFromGrid();
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - We are " + cfg.RegionName + " at " + cfg.RegionLocX.ToString() + "," + cfg.RegionLocY.ToString()); [STAThread]
ServerConsole.MainConsole.Instance.WriteLine("Initialising world"); public static void Main(string[] args)
local_world = cfg.LoadWorld(); {
Console.WriteLine("OpenSim " + VersionInfo.Version + "\n");
this.physManager = new PhysicsSystem.PhysicsManager(); Console.WriteLine("Starting...\n");
this.physManager.LoadPlugins(); ServerConsole.MainConsole.Instance = new MServerConsole(ServerConsole.ConsoleBase.ConsoleType.Local, "", 0);
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting up messaging system");
local_world.PhysScene = this.physManager.GetPhysicsScene(this._physicsEngine); //should be reading from the config file what physics engine to use
local_world.PhysScene.SetTerrain(local_world.LandMap);
OpenSim_Main.gridServers.AssetServer.SetServerInfo(OpenSim_Main.cfg.AssetURL, OpenSim_Main.cfg.AssetSendKey);
OpenSim_Main.gridServers.GridServer.SetServerInfo(OpenSim_Main.cfg.GridURL, OpenSim_Main.cfg.GridSendKey);
local_world.LoadStorageDLL("Db4LocalStorage.dll"); //all these dll names shouldn't be hard coded.
local_world.LoadPrimsFromStorage();
this.assetCache.LoadDefaultTextureSet();
MainServerListener();
timer1.Enabled = true;
timer1.Interval = 100;
timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick );
} sim = new OpenSim_Main();
private SimConfig LoadConfigDll(string dllName)
{
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
SimConfig config = null;
foreach (Type pluginType in pluginAssembly.GetTypes())
{
if (pluginType.IsPublic)
{
if (!pluginType.IsAbstract)
{
Type typeInterface = pluginType.GetInterface("ISimConfig", true);
if (typeInterface != null)
{
ISimConfig plug = (ISimConfig)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
config = plug.GetConfigObject();
break;
}
typeInterface = null;
}
}
}
pluginAssembly = null;
return config;
}
private void OnReceivedData(IAsyncResult result) { sim.sandbox = false;
ipeSender = new IPEndPoint(IPAddress.Any, 0); sim.loginserver = false;
epSender = (EndPoint)ipeSender; sim._physicsEngine = "PhysX";
Packet packet = null;
int numBytes = Server.EndReceiveFrom(result, ref epSender);
int packetEnd = numBytes - 1;
packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
// This is either a new client or a packet to send to an old one
if(ClientThreads.ContainsKey(epSender)) {
ClientThreads[epSender].InPacket(packet);
} else if( packet.Type == PacketType.UseCircuitCode ) { // new client
OpenSimClient newuser = new OpenSimClient(epSender,(UseCircuitCodePacket)packet);
ClientThreads.Add(epSender, newuser);
} else { // invalid client
Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString());
}
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
}
private void MainServerListener() { for (int i = 0; i < args.Length; i++)
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - New thread started"); {
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Opening UDP socket on " + cfg.IPListenAddr + ":" + cfg.IPListenPort); if (args[i] == "-sandbox")
{
sim.sandbox = true;
}
ServerIncoming = new IPEndPoint(IPAddress.Any, cfg.IPListenPort); if (args[i] == "-loginserver")
Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); {
Server.Bind(ServerIncoming); sim.loginserver = true;
}
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - UDP socket bound, getting ready to listen"); if (args[i] == "-realphysx")
{
sim._physicsEngine = "RealPhysX";
OpenSim.world.Avatar.PhysicsEngineFlying = true;
}
}
ipeSender = new IPEndPoint(IPAddress.Any, 0); OpenSim_Main.gridServers = new Grid();
epSender = (EndPoint) ipeSender; if (sim.sandbox)
ReceivedData = new AsyncCallback(this.OnReceivedData); {
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); OpenSim_Main.gridServers.AssetDll = "LocalGridServers.dll";
OpenSim_Main.gridServers.GridDll = "LocalGridServers.dll";
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Listening..."); OpenSim_Main.gridServers.LoadPlugins();
ServerConsole.MainConsole.Instance.WriteLine("Starting in Sandbox mode");
} }
else
public static void Shutdown() { {
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing all threads"); OpenSim_Main.gridServers.AssetDll = "RemoteGridServers.dll";
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing listener thread"); OpenSim_Main.gridServers.GridDll = "RemoteGridServers.dll";
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing clients"); OpenSim_Main.gridServers.LoadPlugins();
// IMPLEMENT THIS ServerConsole.MainConsole.Instance.WriteLine("Starting in Grid mode");
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing console and terminating"); }
OpenSim_Main.local_world.Close();
OpenSim_Main.gridServers.Close(); if (sim.loginserver && sim.sandbox)
ServerConsole.MainConsole.Instance.Close(); {
Environment.Exit(0); LoginServer loginServer = new LoginServer(OpenSim_Main.gridServers.GridServer);
} loginServer.Startup();
}
void Timer1Tick( object sender, System.EventArgs e ) sim.assetCache = new AssetCache(OpenSim_Main.gridServers.AssetServer);
{ sim.inventoryManager = new InventoryManager();
local_world.Update(); sim.Startup();
}
} while (true)
{
public class Grid ServerConsole.MainConsole.Instance.MainConsolePrompt();
{ }
public IAssetServer AssetServer; }
public IGridServer GridServer;
public string AssetDll = ""; private OpenSim_Main()
public string GridDll = ""; {
}
public Grid()
{ private void Startup()
} {
startuptime = DateTime.Now;
public void LoadPlugins()
{ // We check our local database first, then the grid for config options
this.AssetServer = this.LoadAssetDll(this.AssetDll); ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Loading configuration");
this.GridServer = this.LoadGridDll(this.GridDll); cfg = this.LoadConfigDll(this.ConfigDll);
} cfg.InitConfig();
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Contacting gridserver");
public void Close() cfg.LoadFromGrid();
{
this.AssetServer.Close(); ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - We are " + cfg.RegionName + " at " + cfg.RegionLocX.ToString() + "," + cfg.RegionLocY.ToString());
this.GridServer.Close(); ServerConsole.MainConsole.Instance.WriteLine("Initialising world");
} local_world = cfg.LoadWorld();
private IAssetServer LoadAssetDll(string dllName)
{ this.physManager = new PhysicsSystem.PhysicsManager();
Assembly pluginAssembly = Assembly.LoadFrom(dllName); this.physManager.LoadPlugins();
IAssetServer server = null; ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting up messaging system");
local_world.PhysScene = this.physManager.GetPhysicsScene(this._physicsEngine); //should be reading from the config file what physics engine to use
foreach (Type pluginType in pluginAssembly.GetTypes()) local_world.PhysScene.SetTerrain(local_world.LandMap);
{
if (pluginType.IsPublic) OpenSim_Main.gridServers.AssetServer.SetServerInfo(OpenSim_Main.cfg.AssetURL, OpenSim_Main.cfg.AssetSendKey);
{ OpenSim_Main.gridServers.GridServer.SetServerInfo(OpenSim_Main.cfg.GridURL, OpenSim_Main.cfg.GridSendKey);
if (!pluginType.IsAbstract)
{ local_world.LoadStorageDLL("Db4LocalStorage.dll"); //all these dll names shouldn't be hard coded.
Type typeInterface = pluginType.GetInterface("IAssetPlugin", true); local_world.LoadPrimsFromStorage();
if (typeInterface != null) if (this.sandbox)
{ {
IAssetPlugin plug = (IAssetPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); this.assetCache.LoadDefaultTextureSet();
server = plug.GetAssetServer(); }
break;
} ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting CAPS HTTP server");
http_server = new SimCAPSHTTPServer();
typeInterface = null;
} timer1.Enabled = true;
} timer1.Interval = 100;
} timer1.Elapsed += new ElapsedEventHandler(this.Timer1Tick);
pluginAssembly = null;
return server; MainServerListener();
}
}
private IGridServer LoadGridDll(string dllName)
{ private SimConfig LoadConfigDll(string dllName)
Assembly pluginAssembly = Assembly.LoadFrom(dllName); {
IGridServer server = null; Assembly pluginAssembly = Assembly.LoadFrom(dllName);
SimConfig config = null;
foreach (Type pluginType in pluginAssembly.GetTypes())
{ foreach (Type pluginType in pluginAssembly.GetTypes())
if (pluginType.IsPublic) {
{ if (pluginType.IsPublic)
if (!pluginType.IsAbstract) {
{ if (!pluginType.IsAbstract)
Type typeInterface = pluginType.GetInterface("IGridPlugin", true); {
Type typeInterface = pluginType.GetInterface("ISimConfig", true);
if (typeInterface != null)
{ if (typeInterface != null)
IGridPlugin plug = (IGridPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); {
server = plug.GetGridServer(); ISimConfig plug = (ISimConfig)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
break; config = plug.GetConfigObject();
} break;
}
typeInterface = null;
} typeInterface = null;
} }
} }
pluginAssembly = null; }
return server; pluginAssembly = null;
} return config;
} }
private 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);
// This is either a new client or a packet to send to an old one
if (ClientThreads.ContainsKey(epSender))
{
ClientThreads[epSender].InPacket(packet);
}
else if (packet.Type == PacketType.UseCircuitCode)
{ // new client
OpenSimClient newuser = new OpenSimClient(epSender, (UseCircuitCodePacket)packet);
ClientThreads.Add(epSender, newuser);
}
else
{ // invalid client
Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString());
}
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
}
private void MainServerListener()
{
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - New thread started");
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Opening UDP socket on " + cfg.IPListenAddr + ":" + cfg.IPListenPort);
ServerIncoming = new IPEndPoint(IPAddress.Any, cfg.IPListenPort);
Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Server.Bind(ServerIncoming);
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - UDP socket bound, getting ready to listen");
ipeSender = new IPEndPoint(IPAddress.Any, 0);
epSender = (EndPoint)ipeSender;
ReceivedData = new AsyncCallback(this.OnReceivedData);
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Listening...");
}
public static void Shutdown()
{
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing all threads");
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing listener thread");
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing clients");
// IMPLEMENT THIS
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing console and terminating");
OpenSim_Main.local_world.Close();
OpenSim_Main.gridServers.Close();
ServerConsole.MainConsole.Instance.Close();
Environment.Exit(0);
}
void Timer1Tick(object sender, System.EventArgs e)
{
local_world.Update();
}
}
public class Grid
{
public IAssetServer AssetServer;
public IGridServer GridServer;
public string AssetDll = "";
public string GridDll = "";
public Grid()
{
}
public void LoadPlugins()
{
this.AssetServer = this.LoadAssetDll(this.AssetDll);
this.GridServer = this.LoadGridDll(this.GridDll);
}
public void Close()
{
this.AssetServer.Close();
this.GridServer.Close();
}
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;
}
private IGridServer LoadGridDll(string dllName)
{
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
IGridServer server = null;
foreach (Type pluginType in pluginAssembly.GetTypes())
{
if (pluginType.IsPublic)
{
if (!pluginType.IsAbstract)
{
Type typeInterface = pluginType.GetInterface("IGridPlugin", true);
if (typeInterface != null)
{
IGridPlugin plug = (IGridPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
server = plug.GetGridServer();
break;
}
typeInterface = null;
}
}
}
pluginAssembly = null;
return server;
}
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -61,6 +61,7 @@ namespace OpenSim
ConsType = constype; ConsType = constype;
switch(constype) { switch(constype) {
case ConsoleType.Local: case ConsoleType.Local:
Console.WriteLine("ServerConsole.cs - creating new local console"); Console.WriteLine("ServerConsole.cs - creating new local console");
Console.WriteLine("Logs will be saved to current directory in opensim-console.log"); Console.WriteLine("Logs will be saved to current directory in opensim-console.log");
Log=File.AppendText("opensim-console.log"); Log=File.AppendText("opensim-console.log");
@ -75,22 +76,30 @@ namespace OpenSim
default: default:
Console.WriteLine("ServerConsole.cs - what are you smoking? that isn't a valid console type!"); Console.WriteLine("ServerConsole.cs - what are you smoking? that isn't a valid console type!");
break; break;
} }
} }
public override void Close() { public override void Close() {
Log.WriteLine("OpenSim shutdown at " + DateTime.Now.ToString()); Log.WriteLine("OpenSim shutdown at " + DateTime.Now.ToString());
Log.Close(); Log.Close();
} }
// You know what ReadLine() and WriteLine() do, right? And Read() and Write()? Right, you do actually know C#, right? Are you actually a programmer? Do you know english? Do you find my sense of humour in comments irritating? Good, glad you're still here public override void Write(string format, params object[] args)
public override void WriteLine(string Line) { {
Log.WriteLine(Line); Log.Write(format, args);
Console.WriteLine(Line); Console.Write(format, args);
return; return;
} }
public override string ReadLine() { public override void WriteLine(string format, params object[] args)
{
Log.WriteLine(format, args);
Console.WriteLine(format, args);
return;
}
public override string ReadLine()
{
string TempStr=Console.ReadLine(); string TempStr=Console.ReadLine();
Log.WriteLine(TempStr); Log.WriteLine(TempStr);
return TempStr; return TempStr;
@ -102,12 +111,6 @@ namespace OpenSim
return TempInt; return TempInt;
} }
public override void Write(string Line) {
Console.Write(Line);
Log.Write(Line);
return;
}
// Displays a command prompt and waits for the user to enter a string, then returns that string // Displays a command prompt and waits for the user to enter a string, then returns that string
public override string CmdPrompt(string prompt) { public override string CmdPrompt(string prompt) {
this.Write(prompt); this.Write(prompt);
@ -172,7 +175,7 @@ namespace OpenSim
break; break;
case "users": case "users":
OpenSim.world.Avatar TempAv; OpenSim.world.Avatar TempAv;
this.WriteLine(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}","Firstname", "Lastname","Agent ID", "Session ID", "Circuit", "IP")); this.WriteLine(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}","Firstname", "Lastname","Agent ID", "Session ID", "Circuit", "IP"));
foreach (libsecondlife.LLUUID UUID in OpenSim_Main.local_world.Entities.Keys) { foreach (libsecondlife.LLUUID UUID in OpenSim_Main.local_world.Entities.Keys) {
if(OpenSim_Main.local_world.Entities[UUID].ToString()== "OpenSim.world.Avatar") if(OpenSim_Main.local_world.Entities[UUID].ToString()== "OpenSim.world.Avatar")
{ {
@ -196,7 +199,13 @@ namespace OpenSim
string[] cmdparams=(string[])tempstrarray; string[] cmdparams=(string[])tempstrarray;
RunCmd(cmd,cmdparams); RunCmd(cmd,cmdparams);
} }
}
public override void SetStatus(string status)
{
Console.Write( status + "\r" );
}
}
} }

View File

@ -35,216 +35,234 @@ using OpenSim.GridServers;
namespace RemoteGridServers namespace RemoteGridServers
{ {
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
/// ///
public class RemoteGridPlugin : IGridPlugin
{
public RemoteGridPlugin()
{
}
public IGridServer GetGridServer()
{
return(new RemoteGridServer());
}
}
public class RemoteAssetPlugin : IAssetPlugin
{
public RemoteAssetPlugin()
{
}
public IAssetServer GetAssetServer()
{
return(new RemoteAssetServer());
}
}
public class RemoteGridServer :IGridServer
{
private string GridServerUrl;
private string GridSendKey;
public RemoteGridServer()
{
ServerConsole.MainConsole.Instance.WriteLine("Remote Grid Server class created");
}
public bool RequestConnection()
{
return true;
}
public AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
{
AuthenticateResponse user = new AuthenticateResponse();
WebRequest CheckSession = WebRequest.Create(GridServerUrl + "/usersessions/" + GridSendKey + "/" + agentID.ToString() + "/" + circuitCode.ToString() + "/exists");
WebResponse GridResponse = CheckSession.GetResponse();
StreamReader sr = new StreamReader(GridResponse.GetResponseStream());
String grTest = sr.ReadLine();
sr.Close();
GridResponse.Close();
if(String.IsNullOrEmpty(grTest) || grTest.Equals("1"))
{
// YAY! Valid login
user.Authorised = true;
user.LoginInfo = new Login();
user.LoginInfo.Agent = agentID;
user.LoginInfo.Session = sessionID;
user.LoginInfo.First = "";
user.LoginInfo.Last = "";
}
else
{
// Invalid
user.Authorised = false;
}
return(user);
}
public bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
{
WebRequest DeleteSession = WebRequest.Create(GridServerUrl + "/usersessions/" + GridSendKey + "/" + agentID.ToString() + "/" + circuitCode.ToString() + "/delete");
WebResponse GridResponse = DeleteSession.GetResponse();
StreamReader sr = new StreamReader(GridResponse.GetResponseStream());
String grTest = sr.ReadLine();
sr.Close();
GridResponse.Close();
ServerConsole.MainConsole.Instance.WriteLine("DEBUG: " + grTest);
return(true);
}
public UUIDBlock RequestUUIDBlock()
{
UUIDBlock uuidBlock = new UUIDBlock();
return(uuidBlock);
}
public void RequestNeighbours()
{
return;
}
public void SetServerInfo(string ServerUrl, string ServerKey)
{
this.GridServerUrl = ServerUrl;
this.GridSendKey = ServerKey;
}
public void Close()
{
}
public void AddNewSession(Login session)
{
}
}
public class RemoteAssetServer : IAssetServer
{
private IAssetReceiver _receiver;
private BlockingQueue<ARequest> _assetRequests;
private Thread _remoteAssetServerThread;
private string AssetServerUrl;
private string AssetSendKey;
public RemoteAssetServer()
{
this._assetRequests = new BlockingQueue<ARequest>();
this._remoteAssetServerThread = new Thread(new ThreadStart(RunRequests));
this._remoteAssetServerThread.IsBackground = true;
this._remoteAssetServerThread.Start();
ServerConsole.MainConsole.Instance.WriteLine("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)
{
}
public void SetServerInfo(string ServerUrl, string ServerKey)
{
this.AssetServerUrl = ServerUrl;
this.AssetSendKey = ServerKey;
}
public void Close()
{
}
private void RunRequests()
{
while(true)
{
//we need to add support for the asset server not knowing about a requested asset
ARequest req = this._assetRequests.Dequeue();
LLUUID assetID = req.AssetID;
ServerConsole.MainConsole.Instance.WriteLine(" RemoteAssetServer- Got a AssetServer request, processing it");
WebRequest AssetLoad = WebRequest.Create(this.AssetServerUrl + "getasset/" + AssetSendKey + "/" + assetID + "/data");
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 class BlockingQueue< T > {
private Queue< T > _queue = new Queue< T >();
private object _queueSync = new object();
public void Enqueue(T value) public class RemoteGridPlugin : IGridPlugin
{ {
lock(_queueSync) public RemoteGridPlugin()
{ {
_queue.Enqueue(value);
Monitor.Pulse(_queueSync);
}
}
public T Dequeue() }
{
lock(_queueSync)
{
if( _queue.Count < 1)
Monitor.Wait(_queueSync);
return _queue.Dequeue(); public IGridServer GetGridServer()
} {
} return (new RemoteGridServer());
} }
}
public class RemoteAssetPlugin : IAssetPlugin
{
public RemoteAssetPlugin()
{
}
public IAssetServer GetAssetServer()
{
return (new RemoteAssetServer());
}
}
public class RemoteGridServer : RemoteGridBase
{
private string GridServerUrl;
private string GridSendKey;
private Dictionary<uint, agentcircuitdata> AgentCircuits = new Dictionary<uint, agentcircuitdata>();
public override Dictionary<uint, agentcircuitdata> agentcircuits
{
get { return AgentCircuits; }
set { AgentCircuits = value; }
}
public RemoteGridServer()
{
ServerConsole.MainConsole.Instance.WriteLine("Remote Grid Server class created");
}
public override bool RequestConnection()
{
return true;
}
public override 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))
{
// YAY! Valid login
user.Authorised = true;
user.LoginInfo = new Login();
user.LoginInfo.Agent = agentID;
user.LoginInfo.Session = sessionID;
user.LoginInfo.First = validcircuit.firstname;
user.LoginInfo.Last = validcircuit.lastname;
}
else
{
// Invalid
user.Authorised = false;
}
return (user);
}
public override bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
{
WebRequest DeleteSession = WebRequest.Create(GridServerUrl + "/usersessions/" + sessionID.ToString());
DeleteSession.Method = "DELETE";
DeleteSession.ContentType = "text/plaintext";
DeleteSession.ContentLength = 0;
StreamWriter stOut = new StreamWriter(DeleteSession.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write("");
stOut.Close();
StreamReader stIn = new StreamReader(DeleteSession.GetResponse().GetResponseStream());
string GridResponse = stIn.ReadToEnd();
stIn.Close();
return (true);
}
public override UUIDBlock RequestUUIDBlock()
{
UUIDBlock uuidBlock = new UUIDBlock();
return (uuidBlock);
}
public override void RequestNeighbours()
{
return;
}
public override void SetServerInfo(string ServerUrl, string ServerKey)
{
this.GridServerUrl = ServerUrl;
this.GridSendKey = ServerKey;
}
public override string GetName()
{
return "Remote";
}
public override void Close()
{
}
}
public class RemoteAssetServer : IAssetServer
{
private IAssetReceiver _receiver;
private BlockingQueue<ARequest> _assetRequests;
private Thread _remoteAssetServerThread;
private string AssetServerUrl;
private string AssetSendKey;
public RemoteAssetServer()
{
this._assetRequests = new BlockingQueue<ARequest>();
this._remoteAssetServerThread = new Thread(new ThreadStart(RunRequests));
this._remoteAssetServerThread.IsBackground = true;
this._remoteAssetServerThread.Start();
ServerConsole.MainConsole.Instance.WriteLine("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)
{
}
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
ARequest req = this._assetRequests.Dequeue();
LLUUID assetID = req.AssetID;
ServerConsole.MainConsole.Instance.WriteLine(" RemoteAssetServer- Got a AssetServer request, processing it");
WebRequest AssetLoad = WebRequest.Create(this.AssetServerUrl + "getasset/" + AssetSendKey + "/" + assetID + "/data");
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 BlockingQueue<T>
{
private Queue<T> _queue = new Queue<T>();
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();
}
}
}
} }

View File

@ -35,6 +35,9 @@
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
<FileAlignment>4096</FileAlignment> <FileAlignment>4096</FileAlignment>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>..\bin\</OutputPath>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
@ -53,6 +56,7 @@
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Assets\InventoryManager.cs" />
<Compile Include="Config.cs" /> <Compile Include="Config.cs" />
<Compile Include="Main.cs" /> <Compile Include="Main.cs" />
<Compile Include="OpenSimClient.cs" /> <Compile Include="OpenSimClient.cs" />
@ -71,19 +75,30 @@
<Compile Include="OpenSimConsole.cs" /> <Compile Include="OpenSimConsole.cs" />
<Compile Include="HeightMapGenHills.cs" /> <Compile Include="HeightMapGenHills.cs" />
<Compile Include="VersionInfo.cs" /> <Compile Include="VersionInfo.cs" />
<Compile Include="Assets\InventoryManager.cs" /> <Compile Include="CAPS\SimHttp.cs">
</Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="GridServers" />
<Folder Include="Assets" />
<ProjectReference Include="GridInterfaces\GridInterfaces.csproj"> <ProjectReference Include="GridInterfaces\GridInterfaces.csproj">
<Project>{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}</Project> <Project>{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}</Project>
<Name>GridInterfaces</Name> <Name>GridInterfaces</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="LocalServers\LocalGridServers\LocalGridServers.csproj">
<Project>{D7F0395B-FADC-4936-80A0-D95AACE92F62}</Project>
<Name>LocalGridServers</Name>
</ProjectReference>
<ProjectReference Include="LocalStorage\Db4LocalStorage\Db4LocalStorage.csproj">
<Project>{74784F23-B0FD-484C-82C1-96C0215733DC}</Project>
<Name>Db4LocalStorage</Name>
</ProjectReference>
<ProjectReference Include="physics\PhysicsManager.csproj"> <ProjectReference Include="physics\PhysicsManager.csproj">
<Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project> <Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project>
<Name>PhysicsManager</Name> <Name>PhysicsManager</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="RemoteServers\RemoteGridServers\RemoteGridServers.csproj">
<Project>{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}</Project>
<Name>RemoteGridServers</Name>
</ProjectReference>
<ProjectReference Include="ServerConsole\ServerConsole\ServerConsole.csproj"> <ProjectReference Include="ServerConsole\ServerConsole\ServerConsole.csproj">
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project> <Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
<Name>ServerConsole</Name> <Name>ServerConsole</Name>

View File

@ -0,0 +1,87 @@
/*
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
*
* 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;
namespace ServerConsole
{
public class MainConsole {
private static ConsoleBase instance;
public static ConsoleBase Instance
{
get
{
return instance;
}
set
{
instance = value;
}
}
}
public abstract class ConsoleBase
{
public enum ConsoleType {
Local, // Use stdio
TCP, // Use TCP/telnet
SimChat // Use in-world chat (for gods)
}
public abstract void Close();
public abstract void Write(string format, params object[] args);
public abstract void WriteLine(string format, params object[] args);
public abstract string ReadLine();
public abstract int Read() ;
// Displays a command prompt and waits for the user to enter a string, then returns that string
public abstract string CmdPrompt(string prompt) ;
// Displays a command prompt and returns a default value if the user simply presses enter
public abstract string CmdPrompt(string prompt, string defaultresponse);
// Displays a command prompt and returns a default value, user may only enter 1 of 2 options
public abstract string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB) ;
// Runs a command with a number of parameters
public abstract Object RunCmd(string Cmd, string[] cmdparams) ;
// Shows data about something
public abstract void ShowCommands(string ShowWhat) ;
// Displays a prompt to the user and then runs the command they entered
public abstract void MainConsolePrompt() ;
public abstract void SetStatus( string status );
}
}

View File

@ -0,0 +1,35 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>ServerConsole</RootNamespace>
<AssemblyName>ServerConsole</AssemblyName>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</ProjectGuid>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>bin\Debug\</OutputPath>
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugSymbols>True</DebugSymbols>
<DebugType>Full</DebugType>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>bin\Release\</OutputPath>
<Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants>
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ServerConsole.cs" />
<Compile Include="AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

101
src/Util.cs Normal file
View File

@ -0,0 +1,101 @@
/*
Copyright (c) OpenSim project, http://osgrid.org/
* 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 System.Threading;
using libsecondlife;
using libsecondlife.Packets;
namespace OpenSim
{
/// <summary>
/// </summary>
///
public class Util
{
public static ulong UIntsToLong(uint X, uint Y)
{
return Helpers.UIntsToLong(X, Y);
}
public Util()
{
}
}
public class QueItem
{
public QueItem()
{
}
public Packet Packet;
public bool Incoming;
}
/* this is in IGridServer.cs, so there should be no reason for it to be here as well
public class agentcircuitdata
{
public agentcircuitdata() { }
public LLUUID AgentID;
public LLUUID SessionID;
public LLUUID SecureSessionID;
public string firstname;
public string lastname;
public uint circuitcode;
}
*/
public class BlockingQueue<T>
{
private Queue<T> _queue = new Queue<T>();
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();
}
}
}
}

37
src/VersionInfo.cs Normal file
View File

@ -0,0 +1,37 @@
/*
Copyright (c) OpenSim project, http://osgrid.org/
*
* 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;
namespace OpenSim
{
/// <summary>
/// </summary>
public class VersionInfo
{
public static string Version = "0.1, Build 1173843165, Revision 193:206M";
}
}

74
src/opensim.sln Normal file
View File

@ -0,0 +1,74 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual C# Express 2005
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Second-server", "Second-server.csproj", "{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GridInterfaces", "GridInterfaces\GridInterfaces.csproj", "{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhysicsManager", "physics\PhysicsManager.csproj", "{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerConsole", "ServerConsole\ServerConsole\ServerConsole.csproj", "{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalGridServers", "LocalServers\LocalGridServers\LocalGridServers.csproj", "{D7F0395B-FADC-4936-80A0-D95AACE92F62}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteGridServers", "RemoteServers\RemoteGridServers\RemoteGridServers.csproj", "{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimConfig", "Config\SimConfig\SimConfig.csproj", "{B063760D-DB8D-4F64-B6FE-335FAD1E650A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4LocalStorage", "LocalStorage\Db4LocalStorage\Db4LocalStorage.csproj", "{74784F23-B0FD-484C-82C1-96C0215733DC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BasicPhysicsplugin", "physics\plugins\BasicPhysicsplugin.csproj", "{52BCCE7B-69EA-4AC3-9DBC-D571B96C2EA1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RealPhysXplugin", "physics\RealPhysX\RealPhysXplugin\RealPhysXplugin.csproj", "{56C1D214-F389-4228-921A-0A3A0712C159}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|Any CPU.Build.0 = Release|Any CPU
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Release|Any CPU.Build.0 = Release|Any CPU
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Release|Any CPU.Build.0 = Release|Any CPU
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Release|Any CPU.Build.0 = Release|Any CPU
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Release|Any CPU.Build.0 = Release|Any CPU
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Release|Any CPU.Build.0 = Release|Any CPU
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Release|Any CPU.Build.0 = Release|Any CPU
{74784F23-B0FD-484C-82C1-96C0215733DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74784F23-B0FD-484C-82C1-96C0215733DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{74784F23-B0FD-484C-82C1-96C0215733DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74784F23-B0FD-484C-82C1-96C0215733DC}.Release|Any CPU.Build.0 = Release|Any CPU
{52BCCE7B-69EA-4AC3-9DBC-D571B96C2EA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{52BCCE7B-69EA-4AC3-9DBC-D571B96C2EA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{52BCCE7B-69EA-4AC3-9DBC-D571B96C2EA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{52BCCE7B-69EA-4AC3-9DBC-D571B96C2EA1}.Release|Any CPU.Build.0 = Release|Any CPU
{56C1D214-F389-4228-921A-0A3A0712C159}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{56C1D214-F389-4228-921A-0A3A0712C159}.Debug|Any CPU.Build.0 = Debug|Any CPU
{56C1D214-F389-4228-921A-0A3A0712C159}.Release|Any CPU.ActiveCfg = Release|Any CPU
{56C1D214-F389-4228-921A-0A3A0712C159}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

161
src/physics/PhysicsActor.cs Normal file
View File

@ -0,0 +1,161 @@
/*
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
*
* 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 System.Text;
namespace PhysicsSystem
{
public abstract class PhysicsActor
{
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 Axiom.MathLib.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 Axiom.MathLib.Quaternion Orientation
{
get
{
return Axiom.MathLib.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;
}
}
}

View File

@ -47,15 +47,21 @@ namespace PhysicsSystem
public PhysicsScene GetPhysicsScene(string engineName) public PhysicsScene GetPhysicsScene(string engineName)
{ {
if (String.IsNullOrEmpty(engineName))
{
return new NullPhysicsScene();
}
if(_plugins.ContainsKey(engineName)) if(_plugins.ContainsKey(engineName))
{ {
ServerConsole.MainConsole.Instance.WriteLine("creating "+engineName); ServerConsole.MainConsole.Instance.WriteLine("creating "+engineName);
return _plugins[engineName].GetScene(); return _plugins[engineName].GetScene();
} }
else else
{ {
ServerConsole.MainConsole.Instance.WriteLine("couldn't find physicsEngine: "+ engineName); string error = String.Format("couldn't find physicsEngine: {0}", engineName);
return null; ServerConsole.MainConsole.Instance.WriteLine(error);
throw new ArgumentException(error);
} }
} }
@ -99,6 +105,7 @@ namespace PhysicsSystem
pluginAssembly = null; pluginAssembly = null;
} }
} }
public interface IPhysicsPlugin public interface IPhysicsPlugin
{ {
bool Init(); bool Init();
@ -106,83 +113,4 @@ namespace PhysicsSystem
string GetName(); string GetName();
void Dispose(); void Dispose();
} }
public abstract class PhysicsScene
{
public abstract PhysicsActor AddAvatar(PhysicsVector position);
public abstract PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size);
public abstract void Simulate(float timeStep);
public abstract void GetResults();
public abstract void SetTerrain(float[] heightMap);
public abstract bool IsThreaded
{
get;
}
}
public abstract class PhysicsActor
{
public abstract PhysicsVector Position
{
get;
set;
}
public abstract PhysicsVector Velocity
{
get;
set;
}
public abstract PhysicsVector Acceleration
{
get;
}
public abstract Axiom.MathLib.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 PhysicsVector
{
public float X;
public float Y;
public float Z;
public PhysicsVector()
{
}
public PhysicsVector(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
}
} }

View File

@ -25,6 +25,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Axiom.MathLib"> <Reference Include="Axiom.MathLib">
<HintPath>..\..\bin\Axiom.MathLib.dll</HintPath> <HintPath>..\..\bin\Axiom.MathLib.dll</HintPath>
@ -32,8 +33,11 @@
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="PhysicsActor.cs" />
<Compile Include="PhysicsManager.cs" /> <Compile Include="PhysicsManager.cs" />
<Compile Include="AssemblyInfo.cs" /> <Compile Include="AssemblyInfo.cs" />
<Compile Include="PhysicsScene.cs" />
<Compile Include="PhysicsVector.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ServerConsole\ServerConsole\ServerConsole.csproj"> <ProjectReference Include="..\ServerConsole\ServerConsole\ServerConsole.csproj">

View File

@ -0,0 +1,98 @@
/*
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
*
* 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 System.Text;
namespace PhysicsSystem
{
public abstract class PhysicsScene
{
public static PhysicsScene Null
{
get
{
return new NullPhysicsScene();
}
}
public abstract PhysicsActor AddAvatar(PhysicsVector position);
public abstract PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size);
public abstract void Simulate(float timeStep);
public abstract void GetResults();
public abstract void SetTerrain(float[] heightMap);
public abstract bool IsThreaded
{
get;
}
}
public class NullPhysicsScene : PhysicsScene
{
private static int m_workIndicator;
public override PhysicsActor AddAvatar(PhysicsVector position)
{
ServerConsole.MainConsole.Instance.WriteLine("NullPhysicsScene : AddAvatar({0})", position);
return PhysicsActor.Null;
}
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
{
ServerConsole.MainConsole.Instance.WriteLine("NullPhysicsScene : AddPrim({0},{1})", position, size);
return PhysicsActor.Null;
}
public override void Simulate(float timeStep)
{
m_workIndicator = (m_workIndicator + 1) % 10;
ServerConsole.MainConsole.Instance.SetStatus(m_workIndicator.ToString());
}
public override void GetResults()
{
ServerConsole.MainConsole.Instance.WriteLine("NullPhysicsScene : GetResults()");
}
public override void SetTerrain(float[] heightMap)
{
ServerConsole.MainConsole.Instance.WriteLine("NullPhysicsScene : SetTerrain({0} items)", heightMap.Length);
}
public override bool IsThreaded
{
get { return false; }
}
}
}

View File

@ -0,0 +1,54 @@
/*
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
*
* 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 System.Text;
namespace PhysicsSystem
{
public class PhysicsVector
{
public float X;
public float Y;
public float Z;
public PhysicsVector()
{
}
public PhysicsVector(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
public static readonly PhysicsVector Zero = new PhysicsVector(0f, 0f, 0f);
}
}

View File

@ -0,0 +1,59 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{52BCCE7B-69EA-4AC3-9DBC-D571B96C2EA1}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>BasicPhysicsplugin</RootNamespace>
<AssemblyName>BasicPhysicsplugin</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\..\bin\Physics\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\..\bin\Physics\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Axiom.MathLib, Version=0.7.0.25497, Culture=neutral">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\bin\Axiom.MathLib.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="PhysXplugin.cs" />
<Compile Include="AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PhysicsManager.csproj">
<Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project>
<Name>PhysicsManager</Name>
<Private>False</Private>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>