Clean up a bit and added missing files
parent
0b99f56f2b
commit
740a21330e
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
587
src/Main.cs
587
src/Main.cs
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
1083
src/OpenSimClient.cs
1083
src/OpenSimClient.cs
File diff suppressed because it is too large
Load Diff
|
@ -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" );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 );
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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";
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
Loading…
Reference in New Issue