aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Capabilities/Caps.cs
diff options
context:
space:
mode:
authorMW2007-07-22 11:44:36 +0000
committerMW2007-07-22 11:44:36 +0000
commit70fa30204272e874b8e3acccdc2e22cd4e42b2b2 (patch)
tree2f6c3c0f3b3bd60d5972f8dea6b3abeae4dc9065 /OpenSim/Region/Capabilities/Caps.cs
parent* Aerobic erosion now uses Navier Stokes algorithms for wind calculations. (diff)
downloadopensim-SC-70fa30204272e874b8e3acccdc2e22cd4e42b2b2.zip
opensim-SC-70fa30204272e874b8e3acccdc2e22cd4e42b2b2.tar.gz
opensim-SC-70fa30204272e874b8e3acccdc2e22cd4e42b2b2.tar.bz2
opensim-SC-70fa30204272e874b8e3acccdc2e22cd4e42b2b2.tar.xz
* Some work in progress code: Inventory cache, start of inventory server/service, userprofile cache, inventory handling. (non of it is enabled yet (or at least it shouldn't be).
* Fixed some of the problems with crossing regions when flying: you should no longer sink to ground level when crossing (should keep roughly your right height). Should no longer sometimes get sent back to the centre of the current region when attempting to border cross. But instead sometimes you will find you avatar stop at the edge of region and you will need to start moving again to retry the crossing (which should then work). This code is partly based on Babblefrog's issue #212 patch. [I think I have some ideas of how to solve the stopping at edges problem, just want to get the inventory code done first] * Capabilities code has now been moved to the OpenSim.Framework.Communications project as some of the caps code will be tightly tied to inventory/asset handling and it was causing a two way reference problem when it was in its own project/dll. This is a Big commit as I was going to keep my inventory work local until I had it in a working state, in case it brakes anything, but its getting harder to keep in sync with svn.
Diffstat (limited to 'OpenSim/Region/Capabilities/Caps.cs')
-rw-r--r--OpenSim/Region/Capabilities/Caps.cs330
1 files changed, 0 insertions, 330 deletions
diff --git a/OpenSim/Region/Capabilities/Caps.cs b/OpenSim/Region/Capabilities/Caps.cs
deleted file mode 100644
index 06a4bd5..0000000
--- a/OpenSim/Region/Capabilities/Caps.cs
+++ /dev/null
@@ -1,330 +0,0 @@
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.Region.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 eventQueue = "0100/";
53 private BaseHttpServer httpListener;
54 private LLUUID agentID;
55 private AssetCache assetCache;
56 private int eventQueueCount = 1;
57 private Queue<string> CapsEventQueue = new Queue<string>();
58
59 public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, int httpPort, string capsPath, LLUUID agent)
60 {
61 assetCache = assetCach;
62 m_capsObjectPath = capsPath;
63 httpListener = httpServer;
64 m_httpListenerHostName = httpListen;
65 m_httpListenPort = httpPort;
66 agentID = agent;
67 }
68
69 /// <summary>
70 ///
71 /// </summary>
72 public void RegisterHandlers()
73 {
74 Console.WriteLine("registering CAPS handlers");
75 string capsBase = "/CAPS/" + m_capsObjectPath;
76
77 httpListener.AddStreamHandler(new LLSDStreamhandler<LLSDMapRequest, LLSDMapLayerResponse>("POST", capsBase + m_mapLayerPath, this.GetMapLayer ));
78 httpListener.AddStreamHandler( new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>("POST", capsBase + m_newInventory, this.NewAgentInventoryRequest));
79
80 AddLegacyCapsHandler(httpListener, m_requestPath, CapsRequest);
81 }
82
83 [Obsolete("Use BaseHttpServer.AddStreamHandler(new LLSDStreamHandler( LLSDMethod delegate )) instead.")]
84 private void AddLegacyCapsHandler(BaseHttpServer httpListener, string path, RestMethod restMethod)
85 {
86 string capsBase = "/CAPS/" + m_capsObjectPath;
87 httpListener.AddStreamHandler(new RestStreamHandler("POST", capsBase + path, restMethod));
88 }
89
90 /// <summary>
91 ///
92 /// </summary>
93 /// <param name="request"></param>
94 /// <param name="path"></param>
95 /// <param name="param"></param>
96 /// <returns></returns>
97 public string CapsRequest(string request, string path, string param)
98 {
99 // Console.WriteLine("caps request " + request);
100 string result = LLSDHelpers.SerialiseLLSDReply(this.GetCapabilities());
101 return result;
102 }
103
104 /// <summary>
105 ///
106 /// </summary>
107 /// <returns></returns>
108 protected LLSDCapsDetails GetCapabilities()
109 {
110 LLSDCapsDetails caps = new LLSDCapsDetails();
111 string capsBaseUrl = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + "/CAPS/" + m_capsObjectPath;
112 caps.MapLayer = capsBaseUrl + m_mapLayerPath;
113 caps.NewFileAgentInventory = capsBaseUrl + m_newInventory;
114 //caps.RequestTextureDownload = capsBaseUrl + m_requestTexture;
115 // caps.ChatSessionRequest = capsBaseUrl + m_requestTexture;
116 return caps;
117 }
118
119 /// <summary>
120 ///
121 /// </summary>
122 /// <param name="mapReq"></param>
123 /// <returns></returns>
124 public LLSDMapLayerResponse GetMapLayer(LLSDMapRequest mapReq)
125 {
126 LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
127 mapResponse.LayerData.Array.Add(this.GetLLSDMapLayerResponse());
128 return mapResponse;
129 }
130
131 /// <summary>
132 ///
133 /// </summary>
134 /// <returns></returns>
135 protected LLSDMapLayer GetLLSDMapLayerResponse()
136 {
137 LLSDMapLayer mapLayer = new LLSDMapLayer();
138 mapLayer.Right = 5000;
139 mapLayer.Top = 5000;
140 mapLayer.ImageID = new LLUUID("00000000-0000-0000-9999-000000000006");
141 return mapLayer;
142 }
143
144 /// <summary>
145 ///
146 /// </summary>
147 /// <param name="request"></param>
148 /// <param name="path"></param>
149 /// <param name="param"></param>
150 /// <returns></returns>
151 public string RequestTexture(string request, string path, string param)
152 {
153 Console.WriteLine("texture request " + request);
154 // Needs implementing (added to remove compiler warning)
155 return "";
156 }
157
158 #region EventQueue (Currently not enabled)
159 /// <summary>
160 ///
161 /// </summary>
162 /// <param name="request"></param>
163 /// <param name="path"></param>
164 /// <param name="param"></param>
165 /// <returns></returns>
166 public string ProcessEventQueue(string request, string path, string param)
167 {
168 string res = "";
169
170 if (this.CapsEventQueue.Count > 0)
171 {
172 lock (this.CapsEventQueue)
173 {
174 string item = CapsEventQueue.Dequeue();
175 res = item;
176 }
177 }
178 else
179 {
180 res = this.CreateEmptyEventResponse();
181 }
182 return res;
183 }
184
185 /// <summary>
186 ///
187 /// </summary>
188 /// <param name="caps"></param>
189 /// <param name="ipAddressPort"></param>
190 /// <returns></returns>
191 public string CreateEstablishAgentComms(string caps, string ipAddressPort)
192 {
193 LLSDCapEvent eventItem = new LLSDCapEvent();
194 eventItem.id = eventQueueCount;
195 //should be creating a EstablishAgentComms item, but there isn't a class for it yet
196 eventItem.events.Array.Add(new LLSDEmpty());
197 string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
198 eventQueueCount++;
199
200 this.CapsEventQueue.Enqueue(res);
201 return res;
202 }
203
204 /// <summary>
205 ///
206 /// </summary>
207 /// <returns></returns>
208 public string CreateEmptyEventResponse()
209 {
210 LLSDCapEvent eventItem = new LLSDCapEvent();
211 eventItem.id = eventQueueCount;
212 eventItem.events.Array.Add(new LLSDEmpty());
213 string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
214 eventQueueCount++;
215 return res;
216 }
217 #endregion
218
219 /// <summary>
220 ///
221 /// </summary>
222 /// <param name="llsdRequest"></param>
223 /// <returns></returns>
224 public LLSDAssetUploadResponse NewAgentInventoryRequest(LLSDAssetUploadRequest llsdRequest)
225 {
226 // Console.WriteLine("asset upload request via CAPS");
227 string assetName = llsdRequest.name;
228 string capsBase = "/CAPS/" + m_capsObjectPath;
229 LLUUID newAsset = LLUUID.Random();
230 LLUUID newInvItem = LLUUID.Random();
231 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
232
233 AssetUploader uploader = new AssetUploader(assetName, newAsset, newInvItem, capsBase + uploaderPath, this.httpListener);
234 httpListener.AddStreamHandler(new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
235 string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase + uploaderPath;
236
237 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
238 uploadResponse.uploader = uploaderURL;
239 uploadResponse.state = "upload";
240 uploader.OnUpLoad += this.UploadCompleteHandler;
241 return uploadResponse;
242 }
243
244 /// <summary>
245 ///
246 /// </summary>
247 /// <param name="assetID"></param>
248 /// <param name="inventoryItem"></param>
249 /// <param name="data"></param>
250 public void UploadCompleteHandler(string assetName, LLUUID assetID, LLUUID inventoryItem, byte[] data)
251 {
252 AssetBase asset;
253 asset = new AssetBase();
254 asset.FullID = assetID;
255 asset.Type = 0;
256 asset.InvType = 0;
257 asset.Name = assetName;
258 asset.Data = data;
259 this.assetCache.AddAsset(asset);
260 }
261
262 public class AssetUploader
263 {
264 public event UpLoadedTexture OnUpLoad;
265
266 private string uploaderPath = "";
267 private LLUUID newAssetID;
268 private LLUUID inventoryItemID;
269 private BaseHttpServer httpListener;
270 private bool SaveImages = false;
271 private string m_assetName = "";
272
273 /// <summary>
274 ///
275 /// </summary>
276 /// <param name="assetID"></param>
277 /// <param name="inventoryItem"></param>
278 /// <param name="path"></param>
279 /// <param name="httpServer"></param>
280 public AssetUploader(string assetName, LLUUID assetID, LLUUID inventoryItem, string path, BaseHttpServer httpServer)
281 {
282 m_assetName = assetName;
283 newAssetID = assetID;
284 inventoryItemID = inventoryItem;
285 uploaderPath = path;
286 httpListener = httpServer;
287 }
288
289 /// <summary>
290 ///
291 /// </summary>
292 /// <param name="data"></param>
293 /// <param name="path"></param>
294 /// <param name="param"></param>
295 /// <returns></returns>
296 public string uploaderCaps(byte[] data, string path, string param)
297 {
298 LLUUID inv = this.inventoryItemID;
299 string res = "";
300 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
301 uploadComplete.new_asset = newAssetID.ToStringHyphenated();
302 uploadComplete.new_inventory_item = inv;
303 uploadComplete.state = "complete";
304 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
305
306 httpListener.RemoveStreamHandler("POST", uploaderPath);
307
308 if(this.SaveImages)
309 this.SaveImageToFile(m_assetName + ".jp2", data);
310
311 if (OnUpLoad != null)
312 {
313 OnUpLoad(m_assetName, newAssetID, inv, data);
314 }
315
316 return res;
317 }
318
319 private void SaveImageToFile(string filename, byte[] data)
320 {
321
322 FileStream fs = File.Create(filename);
323 BinaryWriter bw = new BinaryWriter(fs);
324 bw.Write(data);
325 bw.Close();
326 fs.Close();
327 }
328 }
329 }
330}