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