using System; using System.Collections.Generic; using System.Text; using System.IO; using OpenSim.Servers; using OpenSim.Framework.Utilities; using OpenSim.Framework.Types; using OpenSim.Caches; using libsecondlife; namespace OpenSim.Region { public delegate void UpLoadedTexture(LLUUID assetID, LLUUID inventoryItem, byte[] data); public class Caps { private string httpListenerAddress; private uint httpListenPort; private string capsObjectPath = "00001-"; private string requestPath = "0000/"; private string mapLayerPath = "0001/"; private string newInventory = "0002/"; private string requestTexture = "0003/"; private string eventQueue = "0100/"; private BaseHttpServer httpListener; private LLUUID agentID; private AssetCache assetCache; private int eventQueueCount = 1; private Queue CapsEventQueue = new Queue(); public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, uint httpPort, string capsPath, LLUUID agent) { assetCache = assetCach; capsObjectPath = capsPath; httpListener = httpServer; httpListenerAddress = httpListen; httpListenPort = httpPort; agentID = agent; } /// /// /// public void RegisterHandlers() { Console.WriteLine("registering CAPS handlers"); httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + requestPath, CapsRequest); httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + mapLayerPath, MapLayer); httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + newInventory, NewAgentInventory); httpListener.AddRestHandler("POST", "/CAPS/" + capsObjectPath + eventQueue, ProcessEventQueue); } /// /// /// /// /// /// /// public string CapsRequest(string request, string path, string param) { Console.WriteLine("Caps Request " + request); string result = ""; result += this.GetCapabilities(); result += ""; return result; } /// /// /// /// protected string GetCapabilities() { string capURLS = ""; capURLS += "MapLayerhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + mapLayerPath + ""; capURLS += "NewFileAgentInventoryhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + newInventory + ""; //capURLS += "RequestTextureDownloadhttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + requestTexture + ""; //capURLS += "EventQueueGethttp://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + capsObjectPath + eventQueue + ""; return capURLS; } /// /// /// /// /// /// /// public string MapLayer(string request, string path, string param) { string res = "AgentDataFlags0LayerData"; res += this.BuildLLSDMapLayerResponse(); res += ""; return res; } /// /// /// /// protected string BuildLLSDMapLayerResponse() { string res = ""; int left; int right; int top; int bottom; LLUUID image = null; left = 0; bottom = 0; top = 5000; right = 5000; image = new LLUUID("00000000-0000-0000-9999-000000000006"); res += "Left" + left + "Bottom" + bottom + "Top" + top + "Right" + right + "ImageID" + image.ToStringHyphenated() + ""; return res; } public string ProcessEventQueue(string request, string path, string param) { // Console.WriteLine("event queue request " + request); string res = ""; int timer = 0; /*while ((timer < 200) || (this.CapsEventQueue.Count < 1)) { timer++; }*/ if (this.CapsEventQueue.Count > 0) { lock (this.CapsEventQueue) { string item = CapsEventQueue.Dequeue(); res = item; } } else { res = this.CreateEmptyEventResponse(); } return res; } public string CreateEstablishAgentComms(string caps, string ipAddressPort) { string res = "id" + eventQueueCount + ""; res += "events"; res += "messageEstablishAgentCommunication"; res += "body"; res += "sim-ip-and-port"+ipAddressPort +""; res += "seed-capability"+caps+""; res += "agent-id"+this.agentID.ToStringHyphenated()+""; res += ""; res += ""; res += ""; eventQueueCount++; this.CapsEventQueue.Enqueue(res); return res; } public string CreateEmptyEventResponse() { string res = "id" + eventQueueCount + ""; res += "events"; res += ""; res += ""; eventQueueCount++; return res; } public string NewAgentInventory(string request, string path, string param) { //Console.WriteLine("received upload request:"+ request); string res = ""; LLUUID newAsset = LLUUID.Random(); LLUUID newInvItem = LLUUID.Random(); string uploaderPath = capsObjectPath + Util.RandomClass.Next(5000, 8000).ToString("0000"); AssetUploader uploader = new AssetUploader(newAsset, newInvItem, uploaderPath, this.httpListener); httpListener.AddRestHandler("POST", "/CAPS/" + uploaderPath, uploader.uploaderCaps); string uploaderURL = "http://" + httpListenerAddress + ":" + httpListenPort.ToString() + "/CAPS/" + uploaderPath; Console.WriteLine("uploader url is " + uploaderURL); res += ""; res += "uploader" + uploaderURL + ""; //res += "successtrue"; res += "stateupload"; res += ""; uploader.OnUpLoad += this.UploadHandler; return res; } public void UploadHandler(LLUUID assetID, LLUUID inventoryItem, byte[] data) { // Console.WriteLine("upload handler called"); AssetBase asset; asset = new AssetBase(); asset.FullID = assetID; asset.Type = 0; asset.InvType = 0; asset.Name = "UploadedTexture" + Util.RandomClass.Next(1, 1000).ToString("000"); asset.Data = data; this.assetCache.AddAsset(asset); } public class AssetUploader { public event UpLoadedTexture OnUpLoad; private string uploaderPath = ""; private LLUUID newAssetID; private LLUUID inventoryItemID; private BaseHttpServer httpListener; public AssetUploader(LLUUID assetID, LLUUID inventoryItem, string path, BaseHttpServer httpServer) { newAssetID = assetID; inventoryItemID = inventoryItem; uploaderPath = path; httpListener = httpServer; } public string uploaderCaps(string request, string path, string param) { Encoding _enc = System.Text.Encoding.UTF8; byte[] data = _enc.GetBytes(request); //Console.WriteLine("recieved upload " + Util.FieldToString(data)); LLUUID inv = this.inventoryItemID; string res = ""; res += ""; res += "new_asset" + newAssetID.ToStringHyphenated() + ""; res += "new_inventory_item" + inv.ToStringHyphenated() + ""; res += "statecomplete"; res += ""; Console.WriteLine("asset " + newAssetID.ToStringHyphenated() + " , inventory item " + inv.ToStringHyphenated()); httpListener.RemoveRestHandler("POST", "/CAPS/" + uploaderPath); if (OnUpLoad != null) { OnUpLoad(newAssetID, inv, data); } /*FileStream fs = File.Create("upload.jp2"); BinaryWriter bw = new BinaryWriter(fs); bw.Write(data); bw.Close(); fs.Close();*/ return res; } } } }