aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Communications/Capabilities/Caps.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/Communications/Capabilities/Caps.cs')
-rw-r--r--OpenSim/Framework/Communications/Capabilities/Caps.cs359
1 files changed, 359 insertions, 0 deletions
diff --git a/OpenSim/Framework/Communications/Capabilities/Caps.cs b/OpenSim/Framework/Communications/Capabilities/Caps.cs
new file mode 100644
index 0000000..3b1cc6a
--- /dev/null
+++ b/OpenSim/Framework/Communications/Capabilities/Caps.cs
@@ -0,0 +1,359 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Text;
32using System.IO;
33using libsecondlife;
34using OpenSim.Framework.Servers;
35using OpenSim.Framework.Types;
36using OpenSim.Framework.Utilities;
37using OpenSim.Framework.Communications.Caches;
38
39namespace OpenSim.Region.Capabilities
40{
41 public delegate void UpLoadedTexture(string assetName, LLUUID assetID, LLUUID inventoryItem, byte[] data);
42
43 public class Caps
44 {
45 private string m_httpListenerHostName;
46 private int m_httpListenPort;
47 private string m_capsObjectPath = "00001-";
48 private string m_requestPath = "0000/";
49 private string m_mapLayerPath = "0001/";
50 private string m_newInventory = "0002/";
51 // private string m_requestTexture = "0003/";
52 private string m_notecardUpdatePath = "0004/";
53 //private string eventQueue = "0100/";
54 private BaseHttpServer httpListener;
55 private LLUUID agentID;
56 private AssetCache assetCache;
57 private int eventQueueCount = 1;
58 private Queue<string> CapsEventQueue = new Queue<string>();
59
60 public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, int httpPort, string capsPath, LLUUID agent)
61 {
62 assetCache = assetCach;
63 m_capsObjectPath = capsPath;
64 httpListener = httpServer;
65 m_httpListenerHostName = httpListen;
66 m_httpListenPort = httpPort;
67 agentID = agent;
68 }
69
70 /// <summary>
71 ///
72 /// </summary>
73 public void RegisterHandlers()
74 {
75 Console.WriteLine("registering CAPS handlers");
76 string capsBase = "/CAPS/" + m_capsObjectPath;
77
78 httpListener.AddStreamHandler(new LLSDStreamhandler<LLSDMapRequest, LLSDMapLayerResponse>("POST", capsBase + m_mapLayerPath, this.GetMapLayer ));
79 httpListener.AddStreamHandler( new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>("POST", capsBase + m_newInventory, this.NewAgentInventoryRequest));
80
81 AddLegacyCapsHandler(httpListener, m_requestPath, CapsRequest);
82 AddLegacyCapsHandler(httpListener, m_notecardUpdatePath, NoteCardAgentInventory);
83 }
84
85 [Obsolete("Use BaseHttpServer.AddStreamHandler(new LLSDStreamHandler( LLSDMethod delegate )) instead.")]
86 private void AddLegacyCapsHandler(BaseHttpServer httpListener, string path, RestMethod restMethod)
87 {
88 string capsBase = "/CAPS/" + m_capsObjectPath;
89 httpListener.AddStreamHandler(new RestStreamHandler("POST", capsBase + path, restMethod));
90 }
91
92 /// <summary>
93 ///
94 /// </summary>
95 /// <param name="request"></param>
96 /// <param name="path"></param>
97 /// <param name="param"></param>
98 /// <returns></returns>
99 public string CapsRequest(string request, string path, string param)
100 {
101 //Console.WriteLine("caps request " + request);
102 string result = LLSDHelpers.SerialiseLLSDReply(this.GetCapabilities());
103 return result;
104 }
105
106 /// <summary>
107 ///
108 /// </summary>
109 /// <returns></returns>
110 protected LLSDCapsDetails GetCapabilities()
111 {
112 LLSDCapsDetails caps = new LLSDCapsDetails();
113 string capsBaseUrl = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" + m_capsObjectPath;
114 caps.MapLayer = capsBaseUrl + m_mapLayerPath;
115 caps.NewFileAgentInventory = capsBaseUrl + m_newInventory;
116 //caps.RequestTextureDownload = capsBaseUrl + m_requestTexture;
117 caps.UpdateNotecardAgentInventory = capsBaseUrl + m_notecardUpdatePath;
118 return caps;
119 }
120
121 /// <summary>
122 ///
123 /// </summary>
124 /// <param name="mapReq"></param>
125 /// <returns></returns>
126 public LLSDMapLayerResponse GetMapLayer(LLSDMapRequest mapReq)
127 {
128 LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
129 mapResponse.LayerData.Array.Add(this.GetLLSDMapLayerResponse());
130 return mapResponse;
131 }
132
133 /// <summary>
134 ///
135 /// </summary>
136 /// <returns></returns>
137 protected LLSDMapLayer GetLLSDMapLayerResponse()
138 {
139 LLSDMapLayer mapLayer = new LLSDMapLayer();
140 mapLayer.Right = 5000;
141 mapLayer.Top = 5000;
142 mapLayer.ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
143 return mapLayer;
144 }
145
146 /// <summary>
147 ///
148 /// </summary>
149 /// <param name="request"></param>
150 /// <param name="path"></param>
151 /// <param name="param"></param>
152 /// <returns></returns>
153 public string RequestTexture(string request, string path, string param)
154 {
155 Console.WriteLine("texture request " + request);
156 // Needs implementing (added to remove compiler warning)
157 return "";
158 }
159
160 #region EventQueue (Currently not enabled)
161 /// <summary>
162 ///
163 /// </summary>
164 /// <param name="request"></param>
165 /// <param name="path"></param>
166 /// <param name="param"></param>
167 /// <returns></returns>
168 public string ProcessEventQueue(string request, string path, string param)
169 {
170 string res = "";
171
172 if (this.CapsEventQueue.Count > 0)
173 {
174 lock (this.CapsEventQueue)
175 {
176 string item = CapsEventQueue.Dequeue();
177 res = item;
178 }
179 }
180 else
181 {
182 res = this.CreateEmptyEventResponse();
183 }
184 return res;
185 }
186
187 /// <summary>
188 ///
189 /// </summary>
190 /// <param name="caps"></param>
191 /// <param name="ipAddressPort"></param>
192 /// <returns></returns>
193 public string CreateEstablishAgentComms(string caps, string ipAddressPort)
194 {
195 LLSDCapEvent eventItem = new LLSDCapEvent();
196 eventItem.id = eventQueueCount;
197 //should be creating a EstablishAgentComms item, but there isn't a class for it yet
198 eventItem.events.Array.Add(new LLSDEmpty());
199 string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
200 eventQueueCount++;
201
202 this.CapsEventQueue.Enqueue(res);
203 return res;
204 }
205
206 /// <summary>
207 ///
208 /// </summary>
209 /// <returns></returns>
210 public string CreateEmptyEventResponse()
211 {
212 LLSDCapEvent eventItem = new LLSDCapEvent();
213 eventItem.id = eventQueueCount;
214 eventItem.events.Array.Add(new LLSDEmpty());
215 string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
216 eventQueueCount++;
217 return res;
218 }
219 #endregion
220
221 /// <summary>
222 ///
223 /// </summary>
224 /// <param name="request"></param>
225 /// <param name="path"></param>
226 /// <param name="param"></param>
227 /// <returns></returns>
228 public string NoteCardAgentInventory(string request, string path, string param)
229 {
230 Console.WriteLine("notecard update request " + request);
231 string assetName = "notecardupdate";
232 string capsBase = "/CAPS/" + m_capsObjectPath;
233 LLUUID newAsset = LLUUID.Random();
234 LLUUID newInvItem = LLUUID.Random();
235 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
236
237 AssetUploader uploader = new AssetUploader(assetName, newAsset, newInvItem, capsBase + uploaderPath, this.httpListener);
238 httpListener.AddStreamHandler(new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
239 string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase + uploaderPath;
240
241 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
242 uploadResponse.uploader = uploaderURL;
243 uploadResponse.state = "upload";
244 // uploader.OnUpLoad += this.UploadCompleteHandler;
245 return LLSDHelpers.SerialiseLLSDReply(uploadResponse);
246 }
247
248 /// <summary>
249 ///
250 /// </summary>
251 /// <param name="llsdRequest"></param>
252 /// <returns></returns>
253 public LLSDAssetUploadResponse NewAgentInventoryRequest(LLSDAssetUploadRequest llsdRequest)
254 {
255 // Console.WriteLine("asset upload request via CAPS");
256 string assetName = llsdRequest.name;
257 string capsBase = "/CAPS/" + m_capsObjectPath;
258 LLUUID newAsset = LLUUID.Random();
259 LLUUID newInvItem = LLUUID.Random();
260 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
261
262 AssetUploader uploader = new AssetUploader(assetName, newAsset, newInvItem, capsBase + uploaderPath, this.httpListener);
263 httpListener.AddStreamHandler(new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
264 string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase + uploaderPath;
265
266 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
267 uploadResponse.uploader = uploaderURL;
268 uploadResponse.state = "upload";
269 uploader.OnUpLoad += this.UploadCompleteHandler;
270 return uploadResponse;
271 }
272
273 /// <summary>
274 ///
275 /// </summary>
276 /// <param name="assetID"></param>
277 /// <param name="inventoryItem"></param>
278 /// <param name="data"></param>
279 public void UploadCompleteHandler(string assetName, LLUUID assetID, LLUUID inventoryItem, byte[] data)
280 {
281 AssetBase asset;
282 asset = new AssetBase();
283 asset.FullID = assetID;
284 asset.Type = 0;
285 asset.InvType = 0;
286 asset.Name = assetName;
287 asset.Data = data;
288 this.assetCache.AddAsset(asset);
289 }
290
291 public class AssetUploader
292 {
293 public event UpLoadedTexture OnUpLoad;
294
295 private string uploaderPath = "";
296 private LLUUID newAssetID;
297 private LLUUID inventoryItemID;
298 private BaseHttpServer httpListener;
299 private bool SaveImages = true;
300 private string m_assetName = "";
301
302 /// <summary>
303 ///
304 /// </summary>
305 /// <param name="assetID"></param>
306 /// <param name="inventoryItem"></param>
307 /// <param name="path"></param>
308 /// <param name="httpServer"></param>
309 public AssetUploader(string assetName, LLUUID assetID, LLUUID inventoryItem, string path, BaseHttpServer httpServer)
310 {
311 m_assetName = assetName;
312 newAssetID = assetID;
313 inventoryItemID = inventoryItem;
314 uploaderPath = path;
315 httpListener = httpServer;
316 }
317
318 /// <summary>
319 ///
320 /// </summary>
321 /// <param name="data"></param>
322 /// <param name="path"></param>
323 /// <param name="param"></param>
324 /// <returns></returns>
325 public string uploaderCaps(byte[] data, string path, string param)
326 {
327 LLUUID inv = this.inventoryItemID;
328 string res = "";
329 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
330 uploadComplete.new_asset = newAssetID.ToStringHyphenated();
331 uploadComplete.new_inventory_item = inv;
332 uploadComplete.state = "complete";
333
334 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
335
336 httpListener.RemoveStreamHandler("POST", uploaderPath);
337
338 if(this.SaveImages)
339 this.SaveImageToFile(m_assetName + ".jp2", data);
340
341 if (OnUpLoad != null)
342 {
343 OnUpLoad(m_assetName, newAssetID, inv, data);
344 }
345
346 return res;
347 }
348
349 private void SaveImageToFile(string filename, byte[] data)
350 {
351 FileStream fs = File.Create(filename);
352 BinaryWriter bw = new BinaryWriter(fs);
353 bw.Write(data);
354 bw.Close();
355 fs.Close();
356 }
357 }
358 }
359}