123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- /*
- * Copyright (c) Contributors, http://www.openmetaverse.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * 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 OpenSim Project 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 THE DEVELOPERS ``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 THE CONTRIBUTORS 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;
- using System.Collections.Generic;
- using System.Text;
- using libsecondlife;
- using OpenSim.Framework.Servers;
- using OpenSim.Framework.Types;
- using OpenSim.Framework.Utilities;
- using OpenSim.Region.Caches;
- namespace OpenSim.Region.Capabilities
- {
- public delegate void UpLoadedTexture(LLUUID assetID, LLUUID inventoryItem, byte[] data);
- public class Caps
- {
- private string m_httpListenerHostName;
- private int m_httpListenPort;
- private string m_capsObjectPath = "00001-";
- private string m_requestPath = "0000/";
- private string m_mapLayerPath = "0001/";
- private string m_newInventory = "0002/";
- private string m_requestTexture = "0003/";
- private string eventQueue = "0100/";
- private BaseHttpServer httpListener;
- private LLUUID agentID;
- private AssetCache assetCache;
- private int eventQueueCount = 1;
- private Queue<string> CapsEventQueue = new Queue<string>();
- public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, int httpPort, string capsPath, LLUUID agent)
- {
- assetCache = assetCach;
- m_capsObjectPath = capsPath;
- httpListener = httpServer;
- m_httpListenerHostName = httpListen;
- m_httpListenPort = httpPort;
- agentID = agent;
- }
- /// <summary>
- ///
- /// </summary>
- public void RegisterHandlers()
- {
- Console.WriteLine("registering CAPS handlers");
- string capsBase = "/CAPS/" + m_capsObjectPath;
- //AddLegacyCapsHandler( httpListener, m_mapLayerPath, MapLayer);
- httpListener.AddStreamHandler(
- new LLSDStreamhandler<LLSDMapRequest, LLSDMapLayerResponse>("POST", capsBase + m_mapLayerPath, this.GetMapLayer ));
- AddLegacyCapsHandler(httpListener, m_requestPath, CapsRequest);
- AddLegacyCapsHandler(httpListener, m_newInventory, NewAgentInventory);
- AddLegacyCapsHandler( httpListener, eventQueue, ProcessEventQueue);
- AddLegacyCapsHandler( httpListener, m_requestTexture, RequestTexture);
- }
- [Obsolete("Use BaseHttpServer.AddStreamHandler(new LLSDStreamHandler( LLSDMethod delegate )) instead.")]
- private void AddLegacyCapsHandler(BaseHttpServer httpListener, string path, RestMethod restMethod)
- {
- string capsBase = "/CAPS/" + m_capsObjectPath;
- httpListener.AddStreamHandler(new RestStreamHandler("POST", capsBase + path, restMethod));
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="request"></param>
- /// <param name="path"></param>
- /// <param name="param"></param>
- /// <returns></returns>
- public string CapsRequest(string request, string path, string param)
- {
- // Console.WriteLine("Caps Request " + request);
- string result = "";
- result = LLSDHelpers.SerialiseLLSDReply(this.GetCapabilities());
- return result;
- }
- /// <summary>
- ///
- /// </summary>
- /// <returns></returns>
- protected LLSDCapsDetails GetCapabilities()
- {
- LLSDCapsDetails caps = new LLSDCapsDetails();
- string capsBaseUrl = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" + m_capsObjectPath;
-
- caps.MapLayer = capsBaseUrl + m_mapLayerPath;
- // caps.NewFileAgentInventory = capsBaseUrl + m_newInventory;
-
- return caps;
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="request"></param>
- /// <param name="path"></param>
- /// <param name="param"></param>
- /// <returns></returns>
- public string MapLayer(string request, string path, string param)
- {
- Encoding _enc = Encoding.UTF8;
- Hashtable hash = (Hashtable)LLSD.LLSDDeserialize(_enc.GetBytes(request));
- LLSDMapRequest mapReq = new LLSDMapRequest();
- LLSDHelpers.DeserialiseLLSDMap(hash, mapReq);
- LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
- mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse());
- string res = LLSDHelpers.SerialiseLLSDReply(mapResponse);
- return res;
- }
- public LLSDMapLayerResponse GetMapLayer(LLSDMapRequest mapReq)
- {
- LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
- mapResponse.LayerData.Array.Add(this.BuildLLSDMapLayerResponse());
- return mapResponse;
- }
-
- /// <summary>
- ///
- /// </summary>
- /// <returns></returns>
- protected LLSDMapLayer BuildLLSDMapLayerResponse()
- {
- LLSDMapLayer mapLayer = new LLSDMapLayer();
- mapLayer.Right = 5000;
- mapLayer.Top = 5000;
- mapLayer.ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
- return mapLayer;
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="request"></param>
- /// <param name="path"></param>
- /// <param name="param"></param>
- /// <returns></returns>
- public string RequestTexture(string request, string path, string param)
- {
- // Needs implementing (added to remove compiler warning)
- return "";
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="request"></param>
- /// <param name="path"></param>
- /// <param name="param"></param>
- /// <returns></returns>
- public string ProcessEventQueue(string request, string path, string param)
- {
- string res = "";
-
- if (this.CapsEventQueue.Count > 0)
- {
- lock (this.CapsEventQueue)
- {
- string item = CapsEventQueue.Dequeue();
- res = item;
- }
- }
- else
- {
- res = this.CreateEmptyEventResponse();
- }
- return res;
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="caps"></param>
- /// <param name="ipAddressPort"></param>
- /// <returns></returns>
- public string CreateEstablishAgentComms(string caps, string ipAddressPort)
- {
- LLSDCapEvent eventItem = new LLSDCapEvent();
- eventItem.id = eventQueueCount;
- //should be creating a EstablishAgentComms item, but there isn't a class for it yet
- eventItem.events.Array.Add(new LLSDEmpty());
- string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
- eventQueueCount++;
-
- this.CapsEventQueue.Enqueue(res);
- return res;
- }
- /// <summary>
- ///
- /// </summary>
- /// <returns></returns>
- public string CreateEmptyEventResponse()
- {
- LLSDCapEvent eventItem = new LLSDCapEvent();
- eventItem.id = eventQueueCount;
- eventItem.events.Array.Add(new LLSDEmpty());
- string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
- eventQueueCount++;
- return res;
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="request"></param>
- /// <param name="path"></param>
- /// <param name="param"></param>
- /// <returns></returns>
- 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 = Util.RandomClass.Next(5000, 8000).ToString("0000");
- AssetUploader uploader = new AssetUploader(newAsset, newInvItem, uploaderPath, this.httpListener);
-
- AddLegacyCapsHandler( httpListener, uploaderPath, uploader.uploaderCaps);
-
- string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" + uploaderPath;
- //Console.WriteLine("uploader url is " + uploaderURL);
- res += "<llsd><map>";
- res += "<key>uploader</key><string>" + uploaderURL + "</string>";
- //res += "<key>success</key><boolean>true</boolean>";
- res += "<key>state</key><string>upload</string>";
- res += "</map></llsd>";
- uploader.OnUpLoad += this.UploadHandler;
- return res;
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="assetID"></param>
- /// <param name="inventoryItem"></param>
- /// <param name="data"></param>
- 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 = Encoding.UTF8;
- byte[] data = _enc.GetBytes(request);
- //Console.WriteLine("recieved upload " + Util.FieldToString(data));
- LLUUID inv = this.inventoryItemID;
- string res = "";
- res += "<llsd><map>";
- res += "<key>new_asset</key><string>" + newAssetID.ToStringHyphenated() + "</string>";
- res += "<key>new_inventory_item</key><uuid>" + inv.ToStringHyphenated() + "</uuid>";
- res += "<key>state</key><string>complete</string>";
- res += "</map></llsd>";
- // Console.WriteLine("asset " + newAssetID.ToStringHyphenated() + " , inventory item " + inv.ToStringHyphenated());
- httpListener.RemoveStreamHandler("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;
- }
- }
- }
- }
|