aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Capabilities
diff options
context:
space:
mode:
authordiva2009-06-18 00:48:39 +0000
committerdiva2009-06-18 00:48:39 +0000
commit913bc3bdb380cebebd11b657966486448962ab47 (patch)
treef41837093cd692b9fe42a21c9cb1473ef81dd0f1 /OpenSim/Framework/Capabilities
parentFix an uninitialized data block. Thanks, jhurliman (diff)
downloadopensim-SC-913bc3bdb380cebebd11b657966486448962ab47.zip
opensim-SC-913bc3bdb380cebebd11b657966486448962ab47.tar.gz
opensim-SC-913bc3bdb380cebebd11b657966486448962ab47.tar.bz2
opensim-SC-913bc3bdb380cebebd11b657966486448962ab47.tar.xz
Moved OpenSim/Framework/Communications/Capabilities up to OpenSim/Framework/Capabilities. Didn't change the namespace because VC# is not helping, and this would imply manually changing more than 50 files. So the namespace is still OpenSim.Framework.Communications.Capabilities, to be cleaned up later by someone with more energy.
Diffstat (limited to 'OpenSim/Framework/Capabilities')
-rw-r--r--OpenSim/Framework/Capabilities/Caps.cs1212
-rw-r--r--OpenSim/Framework/Capabilities/CapsHandlers.cs171
-rw-r--r--OpenSim/Framework/Capabilities/CapsUtil.cs62
-rw-r--r--OpenSim/Framework/Capabilities/LLSD.cs679
-rw-r--r--OpenSim/Framework/Capabilities/LLSDArray.cs41
-rw-r--r--OpenSim/Framework/Capabilities/LLSDAssetUploadComplete.cs45
-rw-r--r--OpenSim/Framework/Capabilities/LLSDAssetUploadRequest.cs46
-rw-r--r--OpenSim/Framework/Capabilities/LLSDAssetUploadResponse.cs42
-rw-r--r--OpenSim/Framework/Capabilities/LLSDCapEvent.cs40
-rw-r--r--OpenSim/Framework/Capabilities/LLSDEmpty.cs37
-rw-r--r--OpenSim/Framework/Capabilities/LLSDHelpers.cs172
-rw-r--r--OpenSim/Framework/Capabilities/LLSDInventoryItem.cs97
-rw-r--r--OpenSim/Framework/Capabilities/LLSDItemUpdate.cs41
-rw-r--r--OpenSim/Framework/Capabilities/LLSDMapLayer.cs45
-rw-r--r--OpenSim/Framework/Capabilities/LLSDMapLayerResponse.cs40
-rw-r--r--OpenSim/Framework/Capabilities/LLSDMapRequest.cs39
-rw-r--r--OpenSim/Framework/Capabilities/LLSDMethod.cs31
-rw-r--r--OpenSim/Framework/Capabilities/LLSDMethodString.cs31
-rw-r--r--OpenSim/Framework/Capabilities/LLSDParcelVoiceInfoResponse.cs51
-rw-r--r--OpenSim/Framework/Capabilities/LLSDRemoteParcelResponse.cs42
-rw-r--r--OpenSim/Framework/Capabilities/LLSDStreamHandler.cs70
-rw-r--r--OpenSim/Framework/Capabilities/LLSDTaskInventoryUploadComplete.cs50
-rw-r--r--OpenSim/Framework/Capabilities/LLSDTaskScriptUpdate.cs50
-rw-r--r--OpenSim/Framework/Capabilities/LLSDTest.cs40
-rw-r--r--OpenSim/Framework/Capabilities/LLSDType.cs55
-rw-r--r--OpenSim/Framework/Capabilities/LLSDVoiceAccountResponse.cs57
26 files changed, 3286 insertions, 0 deletions
diff --git a/OpenSim/Framework/Capabilities/Caps.cs b/OpenSim/Framework/Capabilities/Caps.cs
new file mode 100644
index 0000000..bd38b50
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/Caps.cs
@@ -0,0 +1,1212 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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.IO;
32using System.Reflection;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework.Servers;
36using OpenSim.Framework.Servers.HttpServer;
37using OpenSim.Services.Interfaces;
38
39// using OpenSim.Region.Framework.Interfaces;
40
41namespace OpenSim.Framework.Communications.Capabilities
42{
43 public delegate void UpLoadedAsset(
44 string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder,
45 byte[] data, string inventoryType, string assetType);
46
47 public delegate UUID UpdateItem(UUID itemID, byte[] data);
48
49 public delegate void UpdateTaskScript(UUID itemID, UUID primID, bool isScriptRunning, byte[] data);
50
51 public delegate void NewInventoryItem(UUID userID, InventoryItemBase item);
52
53 public delegate void NewAsset(AssetBase asset);
54
55 public delegate UUID ItemUpdatedCallback(UUID userID, UUID itemID, byte[] data);
56
57 public delegate void TaskScriptUpdatedCallback(UUID userID, UUID itemID, UUID primID,
58 bool isScriptRunning, byte[] data);
59
60 public delegate List<InventoryItemBase> FetchInventoryDescendentsCAPS(UUID agentID, UUID folderID, UUID ownerID,
61 bool fetchFolders, bool fetchItems, int sortOrder);
62
63 /// <summary>
64 /// XXX Probably not a particularly nice way of allow us to get the scene presence from the scene (chiefly so that
65 /// we can popup a message on the user's client if the inventory service has permanently failed). But I didn't want
66 /// to just pass the whole Scene into CAPS.
67 /// </summary>
68 public delegate IClientAPI GetClientDelegate(UUID agentID);
69
70 public class Caps
71 {
72 private static readonly ILog m_log =
73 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
74
75 private string m_httpListenerHostName;
76 private uint m_httpListenPort;
77
78 /// <summary>
79 /// This is the uuid portion of every CAPS path. It is used to make capability urls private to the requester.
80 /// </summary>
81 private string m_capsObjectPath;
82 public string CapsObjectPath { get { return m_capsObjectPath; } }
83
84 private CapsHandlers m_capsHandlers;
85
86 private static readonly string m_requestPath = "0000/";
87 // private static readonly string m_mapLayerPath = "0001/";
88 private static readonly string m_newInventory = "0002/";
89 //private static readonly string m_requestTexture = "0003/";
90 private static readonly string m_notecardUpdatePath = "0004/";
91 private static readonly string m_notecardTaskUpdatePath = "0005/";
92 // private static readonly string m_fetchInventoryPath = "0006/";
93
94 // The following entries are in a module, however, they are also here so that we don't re-assign
95 // the path to another cap by mistake.
96 // private static readonly string m_parcelVoiceInfoRequestPath = "0007/"; // This is in a module.
97 // private static readonly string m_provisionVoiceAccountRequestPath = "0008/";// This is in a module.
98
99 // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule.
100
101 //private string eventQueue = "0100/";
102 private IHttpServer m_httpListener;
103 private UUID m_agentID;
104 private IAssetService m_assetCache;
105 private int m_eventQueueCount = 1;
106 private Queue<string> m_capsEventQueue = new Queue<string>();
107 private bool m_dumpAssetsToFile;
108 private string m_regionName;
109
110 public bool SSLCaps
111 {
112 get { return m_httpListener.UseSSL; }
113 }
114 public string SSLCommonName
115 {
116 get { return m_httpListener.SSLCommonName; }
117 }
118 public CapsHandlers CapsHandlers
119 {
120 get { return m_capsHandlers; }
121 }
122
123 // These are callbacks which will be setup by the scene so that we can update scene data when we
124 // receive capability calls
125 public NewInventoryItem AddNewInventoryItem = null;
126 public NewAsset AddNewAsset = null;
127 public ItemUpdatedCallback ItemUpdatedCall = null;
128 public TaskScriptUpdatedCallback TaskScriptUpdatedCall = null;
129 public FetchInventoryDescendentsCAPS CAPSFetchInventoryDescendents = null;
130 public GetClientDelegate GetClient = null;
131
132 public Caps(IAssetService assetCache, IHttpServer httpServer, string httpListen, uint httpPort, string capsPath,
133 UUID agent, bool dumpAssetsToFile, string regionName)
134 {
135 m_assetCache = assetCache;
136 m_capsObjectPath = capsPath;
137 m_httpListener = httpServer;
138 m_httpListenerHostName = httpListen;
139
140 m_httpListenPort = httpPort;
141
142 if (httpServer.UseSSL)
143 {
144 m_httpListenPort = httpServer.SSLPort;
145 httpListen = httpServer.SSLCommonName;
146 httpPort = httpServer.SSLPort;
147 }
148
149 m_agentID = agent;
150 m_dumpAssetsToFile = dumpAssetsToFile;
151 m_capsHandlers = new CapsHandlers(httpServer, httpListen, httpPort, httpServer.UseSSL);
152 m_regionName = regionName;
153 }
154
155 /// <summary>
156 /// Register all CAPS http service handlers
157 /// </summary>
158 public void RegisterHandlers()
159 {
160 DeregisterHandlers();
161
162 string capsBase = "/CAPS/" + m_capsObjectPath;
163
164 RegisterRegionServiceHandlers(capsBase);
165 RegisterInventoryServiceHandlers(capsBase);
166
167 }
168
169 public void RegisterRegionServiceHandlers(string capsBase)
170 {
171 try
172 {
173 // the root of all evil
174 m_capsHandlers["SEED"] = new RestStreamHandler("POST", capsBase + m_requestPath, CapsRequest);
175 m_log.DebugFormat(
176 "[CAPS]: Registered seed capability {0} for {1}", capsBase + m_requestPath, m_agentID);
177
178 //m_capsHandlers["MapLayer"] =
179 // new LLSDStreamhandler<OSDMapRequest, OSDMapLayerResponse>("POST",
180 // capsBase + m_mapLayerPath,
181 // GetMapLayer);
182 m_capsHandlers["UpdateScriptTaskInventory"] =
183 new RestStreamHandler("POST", capsBase + m_notecardTaskUpdatePath, ScriptTaskInventory);
184 m_capsHandlers["UpdateScriptTask"] = m_capsHandlers["UpdateScriptTaskInventory"];
185
186 }
187 catch (Exception e)
188 {
189 m_log.Error("[CAPS]: " + e.ToString());
190 }
191 }
192
193 public void RegisterInventoryServiceHandlers(string capsBase)
194 {
195 try
196 {
197 // I don't think this one works...
198 m_capsHandlers["NewFileAgentInventory"] =
199 new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>("POST",
200 capsBase + m_newInventory,
201 NewAgentInventoryRequest);
202 m_capsHandlers["UpdateNotecardAgentInventory"] =
203 new RestStreamHandler("POST", capsBase + m_notecardUpdatePath, NoteCardAgentInventory);
204 m_capsHandlers["UpdateScriptAgentInventory"] = m_capsHandlers["UpdateNotecardAgentInventory"];
205 m_capsHandlers["UpdateScriptAgent"] = m_capsHandlers["UpdateScriptAgentInventory"];
206
207 // As of RC 1.22.9 of the Linden client this is
208 // supported
209
210 // m_capsHandlers["WebFetchInventoryDescendents"] =new RestStreamHandler("POST", capsBase + m_fetchInventoryPath, FetchInventoryDescendentsRequest);
211
212 // justincc: I've disabled the CAPS service for now to fix problems with selecting textures, and
213 // subsequent inventory breakage, in the edit object pane (such as mantis 1085). This requires
214 // enhancements (probably filling out the folder part of the LLSD reply) to our CAPS service,
215 // but when I went on the Linden grid, the
216 // simulators I visited (version 1.21) were, surprisingly, no longer supplying this capability. Instead,
217 // the 1.19.1.4 client appeared to be happily flowing inventory data over UDP
218 //
219 // This is very probably just a temporary measure - once the CAPS service appears again on the Linden grid
220 // we will be
221 // able to get the data we need to implement the necessary part of the protocol to fix the issue above.
222 // m_capsHandlers["FetchInventoryDescendents"] =
223 // new RestStreamHandler("POST", capsBase + m_fetchInventoryPath, FetchInventoryRequest);
224
225 // m_capsHandlers["FetchInventoryDescendents"] =
226 // new LLSDStreamhandler<LLSDFetchInventoryDescendents, LLSDInventoryDescendents>("POST",
227 // capsBase + m_fetchInventory,
228 // FetchInventory));
229 // m_capsHandlers["RequestTextureDownload"] = new RestStreamHandler("POST",
230 // capsBase + m_requestTexture,
231 // RequestTexture);
232 }
233 catch (Exception e)
234 {
235 m_log.Error("[CAPS]: " + e.ToString());
236 }
237 }
238
239 /// <summary>
240 /// Register a handler. This allows modules to register handlers.
241 /// </summary>
242 /// <param name="capName"></param>
243 /// <param name="handler"></param>
244 public void RegisterHandler(string capName, IRequestHandler handler)
245 {
246 m_capsHandlers[capName] = handler;
247 //m_log.DebugFormat("[CAPS]: Registering handler for \"{0}\": path {1}", capName, handler.Path);
248 }
249
250 /// <summary>
251 /// Remove all CAPS service handlers.
252 ///
253 /// </summary>
254 /// <param name="httpListener"></param>
255 /// <param name="path"></param>
256 /// <param name="restMethod"></param>
257 public void DeregisterHandlers()
258 {
259 if (m_capsHandlers != null)
260 {
261 foreach (string capsName in m_capsHandlers.Caps)
262 {
263 m_capsHandlers.Remove(capsName);
264 }
265 }
266 }
267
268 /// <summary>
269 /// Construct a client response detailing all the capabilities this server can provide.
270 /// </summary>
271 /// <param name="request"></param>
272 /// <param name="path"></param>
273 /// <param name="param"></param>
274 /// <param name="httpRequest">HTTP request header object</param>
275 /// <param name="httpResponse">HTTP response header object</param>
276 /// <returns></returns>
277 public string CapsRequest(string request, string path, string param,
278 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
279 {
280 //m_log.Debug("[CAPS]: Seed Caps Request in region: " + m_regionName);
281
282 string result = LLSDHelpers.SerialiseLLSDReply(m_capsHandlers.CapsDetails);
283
284 //m_log.DebugFormat("[CAPS] CapsRequest {0}", result);
285
286 return result;
287 }
288
289 // FIXME: these all should probably go into the respective region
290 // modules
291
292 /// <summary>
293 /// Processes a fetch inventory request and sends the reply
294
295 /// </summary>
296 /// <param name="request"></param>
297 /// <param name="path"></param>
298 /// <param name="param"></param>
299 /// <returns></returns>
300 // Request is like:
301 //<llsd>
302 // <map><key>folders</key>
303 // <array>
304 // <map>
305 // <key>fetch-folders</key><boolean>1</boolean><key>fetch-items</key><boolean>1</boolean><key>folder-id</key><uuid>8e1e3a30-b9bf-11dc-95ff-0800200c9a66</uuid><key>owner-id</key><uuid>11111111-1111-0000-0000-000100bba000</uuid><key>sort-order</key><integer>1</integer>
306 // </map>
307 // </array>
308 // </map>
309 //</llsd>
310 //
311 // multiple fetch-folder maps are allowed within the larger folders map.
312 public string FetchInventoryRequest(string request, string path, string param)
313 {
314 // string unmodifiedRequest = request.ToString();
315
316 //m_log.DebugFormat("[AGENT INVENTORY]: Received CAPS fetch inventory request {0}", unmodifiedRequest);
317 m_log.Debug("[CAPS]: Inventory Request in region: " + m_regionName);
318
319 Hashtable hash = new Hashtable();
320 try
321 {
322 hash = (Hashtable)LLSD.LLSDDeserialize(Utils.StringToBytes(request));
323 }
324 catch (LLSD.LLSDParseException pe)
325 {
326 m_log.Error("[AGENT INVENTORY]: Fetch error: " + pe.Message);
327 m_log.Error("Request: " + request.ToString());
328 }
329
330 ArrayList foldersrequested = (ArrayList)hash["folders"];
331
332 string response = "";
333
334 for (int i = 0; i < foldersrequested.Count; i++)
335 {
336 string inventoryitemstr = "";
337 Hashtable inventoryhash = (Hashtable)foldersrequested[i];
338
339 LLSDFetchInventoryDescendents llsdRequest = new LLSDFetchInventoryDescendents();
340 LLSDHelpers.DeserialiseOSDMap(inventoryhash, llsdRequest);
341 LLSDInventoryDescendents reply = FetchInventoryReply(llsdRequest);
342
343 inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(reply);
344 inventoryitemstr = inventoryitemstr.Replace("<llsd><map><key>folders</key><array>", "");
345 inventoryitemstr = inventoryitemstr.Replace("</array></map></llsd>", "");
346
347 response += inventoryitemstr;
348 }
349
350 if (response.Length == 0)
351 {
352 // Ter-guess: If requests fail a lot, the client seems to stop requesting descendants.
353 // Therefore, I'm concluding that the client only has so many threads available to do requests
354 // and when a thread stalls.. is stays stalled.
355 // Therefore we need to return something valid
356 response = "<llsd><map><key>folders</key><array /></map></llsd>";
357 }
358 else
359 {
360 response = "<llsd><map><key>folders</key><array>" + response + "</array></map></llsd>";
361 }
362
363 //m_log.DebugFormat("[AGENT INVENTORY]: Replying to CAPS fetch inventory request with following xml");
364 //m_log.Debug(Util.GetFormattedXml(response));
365
366 return response;
367 }
368
369 public string FetchInventoryDescendentsRequest(string request, string path, string param,OSHttpRequest httpRequest, OSHttpResponse httpResponse)
370 {
371 // m_log.Debug("[CAPS]: FetchInventoryDescendentsRequest in region: " + m_regionName + "request is "+request);
372
373 // nasty temporary hack here, the linden client falsely identifies the uuid 00000000-0000-0000-0000-000000000000 as a string which breaks us
374 // correctly mark it as a uuid
375 request = request.Replace("<string>00000000-0000-0000-0000-000000000000</string>", "<uuid>00000000-0000-0000-0000-000000000000</uuid>");
376
377 // another hack <integer>1</integer> results in a System.ArgumentException: Object type System.Int32 cannot be converted to target type: System.Boolean
378 request = request.Replace("<key>fetch_folders</key><integer>0</integer>", "<key>fetch_folders</key><boolean>0</boolean>");
379 request = request.Replace("<key>fetch_folders</key><integer>1</integer>", "<key>fetch_folders</key><boolean>1</boolean>");
380 Hashtable hash = new Hashtable();
381 try
382 {
383 hash = (Hashtable)LLSD.LLSDDeserialize(Utils.StringToBytes(request));
384 }
385 catch (LLSD.LLSDParseException pe)
386 {
387 m_log.Error("[AGENT INVENTORY]: Fetch error: " + pe.Message);
388 m_log.Error("Request: " + request.ToString());
389 }
390
391 ArrayList foldersrequested = (ArrayList)hash["folders"];
392
393 string response = "";
394 for (int i = 0; i < foldersrequested.Count; i++)
395 {
396 string inventoryitemstr = "";
397 Hashtable inventoryhash = (Hashtable)foldersrequested[i];
398
399 LLSDFetchInventoryDescendents llsdRequest = new LLSDFetchInventoryDescendents();
400
401 try{
402 LLSDHelpers.DeserialiseOSDMap(inventoryhash, llsdRequest);
403 }
404 catch(Exception e)
405 {
406 m_log.Debug("[CAPS]: caught exception doing OSD deserialize" + e);
407 }
408 LLSDInventoryDescendents reply = FetchInventoryReply(llsdRequest);
409
410 inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(reply);
411 inventoryitemstr = inventoryitemstr.Replace("<llsd><map><key>folders</key><array>", "");
412 inventoryitemstr = inventoryitemstr.Replace("</array></map></llsd>", "");
413
414 response += inventoryitemstr;
415 }
416
417
418 if (response.Length == 0)
419 {
420 // Ter-guess: If requests fail a lot, the client seems to stop requesting descendants.
421 // Therefore, I'm concluding that the client only has so many threads available to do requests
422 // and when a thread stalls.. is stays stalled.
423 // Therefore we need to return something valid
424 response = "<llsd><map><key>folders</key><array /></map></llsd>";
425 }
426 else
427 {
428 response = "<llsd><map><key>folders</key><array>" + response + "</array></map></llsd>";
429 }
430
431 //m_log.DebugFormat("[CAPS]: Replying to CAPS fetch inventory request with following xml");
432 //m_log.Debug("[CAPS] "+response);
433
434 return response;
435 }
436
437
438
439 /// <summary>
440 /// Construct an LLSD reply packet to a CAPS inventory request
441 /// </summary>
442 /// <param name="invFetch"></param>
443 /// <returns></returns>
444 private LLSDInventoryDescendents FetchInventoryReply(LLSDFetchInventoryDescendents invFetch)
445 {
446 LLSDInventoryDescendents reply = new LLSDInventoryDescendents();
447 LLSDInventoryFolderContents contents = new LLSDInventoryFolderContents();
448 contents.agent_id = m_agentID;
449 contents.owner_id = invFetch.owner_id;
450 contents.folder_id = invFetch.folder_id;
451
452 // The version number being sent back was originally 1.
453 // Unfortunately, on 1.19.1.4, this means that we see a problem where on subsequent logins
454 // without clearing client cache, objects in the root folder disappear until the cache is cleared,
455 // at which point they reappear.
456 //
457 // Seeing the version to something other than 0 may be the right thing to do, but there is
458 // a greater subtlety of the second life protocol that needs to be understood first.
459 contents.version = 0;
460
461 contents.descendents = 0;
462 reply.folders.Array.Add(contents);
463 List<InventoryItemBase> itemList = null;
464 if (CAPSFetchInventoryDescendents != null)
465 {
466 itemList = CAPSFetchInventoryDescendents(m_agentID, invFetch.folder_id, invFetch.owner_id, invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order);
467 }
468
469 if (itemList != null)
470 {
471 foreach (InventoryItemBase invItem in itemList)
472 {
473 contents.items.Array.Add(ConvertInventoryItem(invItem));
474 }
475 }
476 /* The following block is removed as it ALWAYS sends the error to the client because the RC 1.22.9 client tries to
477 find items that have become dissasociated with a paret folder and have parent of 00000000-0000-00000....
478 else
479 {
480 IClientAPI client = GetClient(m_agentID);
481
482 // We're going to both notify the client of inventory service failure and send back a 'no folder contents' response.
483 // If we don't send back the response,
484 // the client becomes unhappy (see Teravus' comment in FetchInventoryRequest())
485 if (client != null)
486 {
487 client.SendAgentAlertMessage(
488 "AGIN0001E: The inventory service has either failed or is not responding. Your inventory will not function properly for the rest of this session. Please clear your cache and relog.",
489 true);
490 }
491 else
492 {
493 m_log.ErrorFormat(
494 "[AGENT INVENTORY]: Could not lookup controlling client for {0} in order to notify them of the inventory service failure",
495 m_agentID);
496 }
497 }*/
498
499 contents.descendents = contents.items.Array.Count;
500 return reply;
501 }
502
503 /// <summary>
504 /// Convert an internal inventory item object into an LLSD object.
505 /// </summary>
506 /// <param name="invItem"></param>
507 /// <returns></returns>
508 private LLSDInventoryItem ConvertInventoryItem(InventoryItemBase invItem)
509 {
510 LLSDInventoryItem llsdItem = new LLSDInventoryItem();
511 llsdItem.asset_id = invItem.AssetID;
512 llsdItem.created_at = invItem.CreationDate;
513 llsdItem.desc = invItem.Description;
514 llsdItem.flags = 0;
515 llsdItem.item_id = invItem.ID;
516 llsdItem.name = invItem.Name;
517 llsdItem.parent_id = invItem.Folder;
518 try
519 {
520 // TODO reevaluate after upgrade to libomv >= r2566. Probably should use UtilsConversions.
521 llsdItem.type = TaskInventoryItem.Types[invItem.AssetType];
522 llsdItem.inv_type = TaskInventoryItem.InvTypes[invItem.InvType];
523 }
524 catch (Exception e)
525 {
526 m_log.Error("[CAPS]: Problem setting asset/inventory type while converting inventory item " + invItem.Name + " to LLSD:", e);
527 }
528 llsdItem.permissions = new LLSDPermissions();
529 llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid;
530 llsdItem.permissions.base_mask = (int)invItem.CurrentPermissions;
531 llsdItem.permissions.everyone_mask = (int)invItem.EveryOnePermissions;
532 llsdItem.permissions.group_id = UUID.Zero;
533 llsdItem.permissions.group_mask = 0;
534 llsdItem.permissions.is_owner_group = false;
535 llsdItem.permissions.next_owner_mask = (int)invItem.NextPermissions;
536 llsdItem.permissions.owner_id = m_agentID; // FixMe
537 llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions;
538 llsdItem.sale_info = new LLSDSaleInfo();
539 llsdItem.sale_info.sale_price = 10;
540 llsdItem.sale_info.sale_type = "not";
541
542 return llsdItem;
543 }
544
545 /// <summary>
546 ///
547 /// </summary>
548 /// <param name="mapReq"></param>
549 /// <returns></returns>
550 public LLSDMapLayerResponse GetMapLayer(LLSDMapRequest mapReq)
551 {
552 m_log.Debug("[CAPS]: MapLayer Request in region: " + m_regionName);
553 LLSDMapLayerResponse mapResponse = new LLSDMapLayerResponse();
554 mapResponse.LayerData.Array.Add(GetOSDMapLayerResponse());
555 return mapResponse;
556 }
557
558 /// <summary>
559 ///
560 /// </summary>
561 /// <returns></returns>
562 protected static OSDMapLayer GetOSDMapLayerResponse()
563 {
564 OSDMapLayer mapLayer = new OSDMapLayer();
565 mapLayer.Right = 5000;
566 mapLayer.Top = 5000;
567 mapLayer.ImageID = new UUID("00000000-0000-1111-9999-000000000006");
568
569 return mapLayer;
570 }
571
572 /// <summary>
573 ///
574 /// </summary>
575 /// <param name="request"></param>
576 /// <param name="path"></param>
577 /// <param name="param"></param>
578 /// <returns></returns>
579 public string RequestTexture(string request, string path, string param)
580 {
581 m_log.Debug("texture request " + request);
582 // Needs implementing (added to remove compiler warning)
583 return String.Empty;
584 }
585
586 #region EventQueue (Currently not enabled)
587
588 /// <summary>
589 ///
590 /// </summary>
591 /// <param name="request"></param>
592 /// <param name="path"></param>
593 /// <param name="param"></param>
594 /// <returns></returns>
595 public string ProcessEventQueue(string request, string path, string param)
596 {
597 string res = String.Empty;
598
599 if (m_capsEventQueue.Count > 0)
600 {
601 lock (m_capsEventQueue)
602 {
603 string item = m_capsEventQueue.Dequeue();
604 res = item;
605 }
606 }
607 else
608 {
609 res = CreateEmptyEventResponse();
610 }
611 return res;
612 }
613
614 /// <summary>
615 ///
616 /// </summary>
617 /// <param name="caps"></param>
618 /// <param name="ipAddressPort"></param>
619 /// <returns></returns>
620 public string CreateEstablishAgentComms(string caps, string ipAddressPort)
621 {
622 LLSDCapEvent eventItem = new LLSDCapEvent();
623 eventItem.id = m_eventQueueCount;
624 //should be creating a EstablishAgentComms item, but there isn't a class for it yet
625 eventItem.events.Array.Add(new LLSDEmpty());
626 string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
627 m_eventQueueCount++;
628
629 m_capsEventQueue.Enqueue(res);
630 return res;
631 }
632
633 /// <summary>
634 ///
635 /// </summary>
636 /// <returns></returns>
637 public string CreateEmptyEventResponse()
638 {
639 LLSDCapEvent eventItem = new LLSDCapEvent();
640 eventItem.id = m_eventQueueCount;
641 eventItem.events.Array.Add(new LLSDEmpty());
642 string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
643 m_eventQueueCount++;
644 return res;
645 }
646
647 #endregion
648
649 /// <summary>
650 /// Called by the script task update handler. Provides a URL to which the client can upload a new asset.
651 /// </summary>
652 /// <param name="request"></param>
653 /// <param name="path"></param>
654 /// <param name="param"></param>
655 /// <param name="httpRequest">HTTP request header object</param>
656 /// <param name="httpResponse">HTTP response header object</param>
657 /// <returns></returns>
658 public string ScriptTaskInventory(string request, string path, string param,
659 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
660 {
661 try
662 {
663 m_log.Debug("[CAPS]: ScriptTaskInventory Request in region: " + m_regionName);
664 //m_log.DebugFormat("[CAPS]: request: {0}, path: {1}, param: {2}", request, path, param);
665
666 Hashtable hash = (Hashtable) LLSD.LLSDDeserialize(Utils.StringToBytes(request));
667 LLSDTaskScriptUpdate llsdUpdateRequest = new LLSDTaskScriptUpdate();
668 LLSDHelpers.DeserialiseOSDMap(hash, llsdUpdateRequest);
669
670 string capsBase = "/CAPS/" + m_capsObjectPath;
671 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
672
673 TaskInventoryScriptUpdater uploader =
674 new TaskInventoryScriptUpdater(
675 llsdUpdateRequest.item_id,
676 llsdUpdateRequest.task_id,
677 llsdUpdateRequest.is_script_running,
678 capsBase + uploaderPath,
679 m_httpListener,
680 m_dumpAssetsToFile);
681 uploader.OnUpLoad += TaskScriptUpdated;
682
683 m_httpListener.AddStreamHandler(
684 new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
685
686 string protocol = "http://";
687
688 if (m_httpListener.UseSSL)
689 protocol = "https://";
690
691 string uploaderURL = protocol + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase +
692 uploaderPath;
693
694 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
695 uploadResponse.uploader = uploaderURL;
696 uploadResponse.state = "upload";
697
698// m_log.InfoFormat("[CAPS]: " +
699// "ScriptTaskInventory response: {0}",
700// LLSDHelpers.SerialiseLLSDReply(uploadResponse)));
701
702 return LLSDHelpers.SerialiseLLSDReply(uploadResponse);
703 }
704 catch (Exception e)
705 {
706 m_log.Error("[CAPS]: " + e.ToString());
707 }
708
709 return null;
710 }
711
712 /// <summary>
713 /// Called by the notecard update handler. Provides a URL to which the client can upload a new asset.
714 /// </summary>
715 /// <param name="request"></param>
716 /// <param name="path"></param>
717 /// <param name="param"></param>
718 /// <returns></returns>
719 public string NoteCardAgentInventory(string request, string path, string param,
720 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
721 {
722 //m_log.Debug("[CAPS]: NoteCardAgentInventory Request in region: " + m_regionName + "\n" + request);
723 //m_log.Debug("[CAPS]: NoteCardAgentInventory Request is: " + request);
724
725 //OpenMetaverse.StructuredData.OSDMap hash = (OpenMetaverse.StructuredData.OSDMap)OpenMetaverse.StructuredData.LLSDParser.DeserializeBinary(Utils.StringToBytes(request));
726 Hashtable hash = (Hashtable) LLSD.LLSDDeserialize(Utils.StringToBytes(request));
727 LLSDItemUpdate llsdRequest = new LLSDItemUpdate();
728 LLSDHelpers.DeserialiseOSDMap(hash, llsdRequest);
729
730 string capsBase = "/CAPS/" + m_capsObjectPath;
731 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
732
733 ItemUpdater uploader =
734 new ItemUpdater(llsdRequest.item_id, capsBase + uploaderPath, m_httpListener, m_dumpAssetsToFile);
735 uploader.OnUpLoad += ItemUpdated;
736
737 m_httpListener.AddStreamHandler(
738 new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
739
740 string protocol = "http://";
741
742 if (m_httpListener.UseSSL)
743 protocol = "https://";
744
745 string uploaderURL = protocol + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase +
746 uploaderPath;
747
748 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
749 uploadResponse.uploader = uploaderURL;
750 uploadResponse.state = "upload";
751
752// m_log.InfoFormat("[CAPS]: " +
753// "NoteCardAgentInventory response: {0}",
754// LLSDHelpers.SerialiseLLSDReply(uploadResponse)));
755
756 return LLSDHelpers.SerialiseLLSDReply(uploadResponse);
757 }
758
759 /// <summary>
760 ///
761 /// </summary>
762 /// <param name="llsdRequest"></param>
763 /// <returns></returns>
764 public LLSDAssetUploadResponse NewAgentInventoryRequest(LLSDAssetUploadRequest llsdRequest)
765 {
766 //m_log.Debug("[CAPS]: NewAgentInventoryRequest Request is: " + llsdRequest.ToString());
767 //m_log.Debug("asset upload request via CAPS" + llsdRequest.inventory_type + " , " + llsdRequest.asset_type);
768
769 if (llsdRequest.asset_type == "texture" ||
770 llsdRequest.asset_type == "animation" ||
771 llsdRequest.asset_type == "sound")
772 {
773 IClientAPI client = null;
774 IScene scene = null;
775 if (GetClient != null)
776 {
777 client = GetClient(m_agentID);
778 scene = client.Scene;
779
780 IMoneyModule mm = scene.RequestModuleInterface<IMoneyModule>();
781
782 if (mm != null)
783 {
784 if (!mm.UploadCovered(client))
785 {
786 if (client != null)
787 client.SendAgentAlertMessage("Unable to upload asset. Insufficient funds.", false);
788
789 LLSDAssetUploadResponse errorResponse = new LLSDAssetUploadResponse();
790 errorResponse.uploader = "";
791 errorResponse.state = "error";
792 return errorResponse;
793 }
794 }
795 }
796 }
797
798
799 string assetName = llsdRequest.name;
800 string assetDes = llsdRequest.description;
801 string capsBase = "/CAPS/" + m_capsObjectPath;
802 UUID newAsset = UUID.Random();
803 UUID newInvItem = UUID.Random();
804 UUID parentFolder = llsdRequest.folder_id;
805 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
806
807 AssetUploader uploader =
808 new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type,
809 llsdRequest.asset_type, capsBase + uploaderPath, m_httpListener, m_dumpAssetsToFile);
810 m_httpListener.AddStreamHandler(
811 new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
812
813 string protocol = "http://";
814
815 if (m_httpListener.UseSSL)
816 protocol = "https://";
817
818 string uploaderURL = protocol + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase +
819 uploaderPath;
820
821 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse();
822 uploadResponse.uploader = uploaderURL;
823 uploadResponse.state = "upload";
824 uploader.OnUpLoad += UploadCompleteHandler;
825 return uploadResponse;
826 }
827
828 /// <summary>
829 ///
830 /// </summary>
831 /// <param name="assetID"></param>
832 /// <param name="inventoryItem"></param>
833 /// <param name="data"></param>
834 public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
835 UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
836 string assetType)
837 {
838 sbyte assType = 0;
839 sbyte inType = 0;
840
841 if (inventoryType == "sound")
842 {
843 inType = 1;
844 assType = 1;
845 }
846 else if (inventoryType == "animation")
847 {
848 inType = 19;
849 assType = 20;
850 }
851 else if (inventoryType == "wearable")
852 {
853 inType = 18;
854 switch (assetType)
855 {
856 case "bodypart":
857 assType = 13;
858 break;
859 case "clothing":
860 assType = 5;
861 break;
862 }
863 }
864
865 AssetBase asset;
866 asset = new AssetBase();
867 asset.FullID = assetID;
868 asset.Type = assType;
869 asset.Name = assetName;
870 asset.Data = data;
871 if (AddNewAsset != null)
872 AddNewAsset(asset);
873 else if (m_assetCache != null)
874 m_assetCache.Store(asset);
875
876 InventoryItemBase item = new InventoryItemBase();
877 item.Owner = m_agentID;
878 item.CreatorId = m_agentID.ToString();
879 item.ID = inventoryItem;
880 item.AssetID = asset.FullID;
881 item.Description = assetDescription;
882 item.Name = assetName;
883 item.AssetType = assType;
884 item.InvType = inType;
885 item.Folder = parentFolder;
886 item.CurrentPermissions = 2147483647;
887 item.BasePermissions = 2147483647;
888 item.EveryOnePermissions = 0;
889 item.NextPermissions = 2147483647;
890 item.CreationDate = Util.UnixTimeSinceEpoch();
891
892 if (AddNewInventoryItem != null)
893 {
894 AddNewInventoryItem(m_agentID, item);
895 }
896 }
897
898 /// <summary>
899 /// Called when new asset data for an agent inventory item update has been uploaded.
900 /// </summary>
901 /// <param name="itemID">Item to update</param>
902 /// <param name="data">New asset data</param>
903 /// <returns></returns>
904 public UUID ItemUpdated(UUID itemID, byte[] data)
905 {
906 if (ItemUpdatedCall != null)
907 {
908 return ItemUpdatedCall(m_agentID, itemID, data);
909 }
910
911 return UUID.Zero;
912 }
913
914 /// <summary>
915 /// Called when new asset data for an agent inventory item update has been uploaded.
916 /// </summary>
917 /// <param name="itemID">Item to update</param>
918 /// <param name="primID">Prim containing item to update</param>
919 /// <param name="isScriptRunning">Signals whether the script to update is currently running</param>
920 /// <param name="data">New asset data</param>
921 public void TaskScriptUpdated(UUID itemID, UUID primID, bool isScriptRunning, byte[] data)
922 {
923 if (TaskScriptUpdatedCall != null)
924 {
925 TaskScriptUpdatedCall(m_agentID, itemID, primID, isScriptRunning, data);
926 }
927 }
928
929 public class AssetUploader
930 {
931 public event UpLoadedAsset OnUpLoad;
932 private UpLoadedAsset handlerUpLoad = null;
933
934 private string uploaderPath = String.Empty;
935 private UUID newAssetID;
936 private UUID inventoryItemID;
937 private UUID parentFolder;
938 private IHttpServer httpListener;
939 private bool m_dumpAssetsToFile;
940 private string m_assetName = String.Empty;
941 private string m_assetDes = String.Empty;
942
943 private string m_invType = String.Empty;
944 private string m_assetType = String.Empty;
945
946 public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem,
947 UUID parentFolderID, string invType, string assetType, string path,
948 IHttpServer httpServer, bool dumpAssetsToFile)
949 {
950 m_assetName = assetName;
951 m_assetDes = description;
952 newAssetID = assetID;
953 inventoryItemID = inventoryItem;
954 uploaderPath = path;
955 httpListener = httpServer;
956 parentFolder = parentFolderID;
957 m_assetType = assetType;
958 m_invType = invType;
959 m_dumpAssetsToFile = dumpAssetsToFile;
960 }
961
962 /// <summary>
963 ///
964 /// </summary>
965 /// <param name="data"></param>
966 /// <param name="path"></param>
967 /// <param name="param"></param>
968 /// <returns></returns>
969 public string uploaderCaps(byte[] data, string path, string param)
970 {
971 UUID inv = inventoryItemID;
972 string res = String.Empty;
973 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
974 uploadComplete.new_asset = newAssetID.ToString();
975 uploadComplete.new_inventory_item = inv;
976 uploadComplete.state = "complete";
977
978 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
979
980 httpListener.RemoveStreamHandler("POST", uploaderPath);
981
982 // TODO: probably make this a better set of extensions here
983 string extension = ".jp2";
984 if (m_invType != "image")
985 {
986 extension = ".dat";
987 }
988
989 if (m_dumpAssetsToFile)
990 {
991 SaveAssetToFile(m_assetName + extension, data);
992 }
993 handlerUpLoad = OnUpLoad;
994 if (handlerUpLoad != null)
995 {
996 handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType);
997 }
998
999 return res;
1000 }
1001 ///Left this in and commented in case there are unforseen issues
1002 //private void SaveAssetToFile(string filename, byte[] data)
1003 //{
1004 // FileStream fs = File.Create(filename);
1005 // BinaryWriter bw = new BinaryWriter(fs);
1006 // bw.Write(data);
1007 // bw.Close();
1008 // fs.Close();
1009 //}
1010 private static void SaveAssetToFile(string filename, byte[] data)
1011 {
1012 string assetPath = "UserAssets";
1013 if (!Directory.Exists(assetPath))
1014 {
1015 Directory.CreateDirectory(assetPath);
1016 }
1017 FileStream fs = File.Create(Path.Combine(assetPath, Util.safeFileName(filename)));
1018 BinaryWriter bw = new BinaryWriter(fs);
1019 bw.Write(data);
1020 bw.Close();
1021 fs.Close();
1022 }
1023 }
1024
1025 /// <summary>
1026 /// This class is a callback invoked when a client sends asset data to
1027 /// an agent inventory notecard update url
1028 /// </summary>
1029 public class ItemUpdater
1030 {
1031 public event UpdateItem OnUpLoad;
1032
1033 private UpdateItem handlerUpdateItem = null;
1034
1035 private string uploaderPath = String.Empty;
1036 private UUID inventoryItemID;
1037 private IHttpServer httpListener;
1038 private bool m_dumpAssetToFile;
1039
1040 public ItemUpdater(UUID inventoryItem, string path, IHttpServer httpServer, bool dumpAssetToFile)
1041 {
1042 m_dumpAssetToFile = dumpAssetToFile;
1043
1044 inventoryItemID = inventoryItem;
1045 uploaderPath = path;
1046 httpListener = httpServer;
1047 }
1048
1049 /// <summary>
1050 ///
1051 /// </summary>
1052 /// <param name="data"></param>
1053 /// <param name="path"></param>
1054 /// <param name="param"></param>
1055 /// <returns></returns>
1056 public string uploaderCaps(byte[] data, string path, string param)
1057 {
1058 UUID inv = inventoryItemID;
1059 string res = String.Empty;
1060 LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
1061 UUID assetID = UUID.Zero;
1062 handlerUpdateItem = OnUpLoad;
1063 if (handlerUpdateItem != null)
1064 {
1065 assetID = handlerUpdateItem(inv, data);
1066 }
1067
1068 uploadComplete.new_asset = assetID.ToString();
1069 uploadComplete.new_inventory_item = inv;
1070 uploadComplete.state = "complete";
1071
1072 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
1073
1074 httpListener.RemoveStreamHandler("POST", uploaderPath);
1075
1076 if (m_dumpAssetToFile)
1077 {
1078 SaveAssetToFile("updateditem" + Util.RandomClass.Next(1, 1000) + ".dat", data);
1079 }
1080
1081 return res;
1082 }
1083 ///Left this in and commented in case there are unforseen issues
1084 //private void SaveAssetToFile(string filename, byte[] data)
1085 //{
1086 // FileStream fs = File.Create(filename);
1087 // BinaryWriter bw = new BinaryWriter(fs);
1088 // bw.Write(data);
1089 // bw.Close();
1090 // fs.Close();
1091 //}
1092 private static void SaveAssetToFile(string filename, byte[] data)
1093 {
1094 string assetPath = "UserAssets";
1095 if (!Directory.Exists(assetPath))
1096 {
1097 Directory.CreateDirectory(assetPath);
1098 }
1099 FileStream fs = File.Create(Path.Combine(assetPath, filename));
1100 BinaryWriter bw = new BinaryWriter(fs);
1101 bw.Write(data);
1102 bw.Close();
1103 fs.Close();
1104 }
1105 }
1106
1107 /// <summary>
1108 /// This class is a callback invoked when a client sends asset data to
1109 /// a task inventory script update url
1110 /// </summary>
1111 public class TaskInventoryScriptUpdater
1112 {
1113 public event UpdateTaskScript OnUpLoad;
1114
1115 private UpdateTaskScript handlerUpdateTaskScript = null;
1116
1117 private string uploaderPath = String.Empty;
1118 private UUID inventoryItemID;
1119 private UUID primID;
1120 private bool isScriptRunning;
1121 private IHttpServer httpListener;
1122 private bool m_dumpAssetToFile;
1123
1124 public TaskInventoryScriptUpdater(UUID inventoryItemID, UUID primID, int isScriptRunning,
1125 string path, IHttpServer httpServer, bool dumpAssetToFile)
1126 {
1127 m_dumpAssetToFile = dumpAssetToFile;
1128
1129 this.inventoryItemID = inventoryItemID;
1130 this.primID = primID;
1131
1132 // This comes in over the packet as an integer, but actually appears to be treated as a bool
1133 this.isScriptRunning = (0 == isScriptRunning ? false : true);
1134
1135 uploaderPath = path;
1136 httpListener = httpServer;
1137 }
1138
1139 /// <summary>
1140 ///
1141 /// </summary>
1142 /// <param name="data"></param>
1143 /// <param name="path"></param>
1144 /// <param name="param"></param>
1145 /// <returns></returns>
1146 public string uploaderCaps(byte[] data, string path, string param)
1147 {
1148 try
1149 {
1150// m_log.InfoFormat("[CAPS]: " +
1151// "TaskInventoryScriptUpdater received data: {0}, path: {1}, param: {2}",
1152// data, path, param));
1153
1154 string res = String.Empty;
1155 LLSDTaskInventoryUploadComplete uploadComplete = new LLSDTaskInventoryUploadComplete();
1156
1157 handlerUpdateTaskScript = OnUpLoad;
1158 if (handlerUpdateTaskScript != null)
1159 {
1160 handlerUpdateTaskScript(inventoryItemID, primID, isScriptRunning, data);
1161 }
1162
1163 uploadComplete.item_id = inventoryItemID;
1164 uploadComplete.task_id = primID;
1165 uploadComplete.state = "complete";
1166
1167 res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
1168
1169 httpListener.RemoveStreamHandler("POST", uploaderPath);
1170
1171 if (m_dumpAssetToFile)
1172 {
1173 SaveAssetToFile("updatedtaskscript" + Util.RandomClass.Next(1, 1000) + ".dat", data);
1174 }
1175
1176// m_log.InfoFormat("[CAPS]: TaskInventoryScriptUpdater.uploaderCaps res: {0}", res);
1177
1178 return res;
1179 }
1180 catch (Exception e)
1181 {
1182 m_log.Error("[CAPS]: " + e.ToString());
1183 }
1184
1185 // XXX Maybe this should be some meaningful error packet
1186 return null;
1187 }
1188 ///Left this in and commented in case there are unforseen issues
1189 //private void SaveAssetToFile(string filename, byte[] data)
1190 //{
1191 // FileStream fs = File.Create(filename);
1192 // BinaryWriter bw = new BinaryWriter(fs);
1193 // bw.Write(data);
1194 // bw.Close();
1195 // fs.Close();
1196 //}
1197 private static void SaveAssetToFile(string filename, byte[] data)
1198 {
1199 string assetPath = "UserAssets";
1200 if (!Directory.Exists(assetPath))
1201 {
1202 Directory.CreateDirectory(assetPath);
1203 }
1204 FileStream fs = File.Create(Path.Combine(assetPath, filename));
1205 BinaryWriter bw = new BinaryWriter(fs);
1206 bw.Write(data);
1207 bw.Close();
1208 fs.Close();
1209 }
1210 }
1211 }
1212}
diff --git a/OpenSim/Framework/Capabilities/CapsHandlers.cs b/OpenSim/Framework/Capabilities/CapsHandlers.cs
new file mode 100644
index 0000000..d977639
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/CapsHandlers.cs
@@ -0,0 +1,171 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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.Collections;
29using System.Collections.Generic;
30using OpenSim.Framework.Servers;
31using OpenSim.Framework.Servers.HttpServer;
32
33namespace OpenSim.Framework.Communications.Capabilities
34{
35 /// <summary>
36 /// CapsHandlers is a cap handler container but also takes
37 /// care of adding and removing cap handlers to and from the
38 /// supplied BaseHttpServer.
39 /// </summary>
40 public class CapsHandlers
41 {
42 private Dictionary <string, IRequestHandler> m_capsHandlers = new Dictionary<string, IRequestHandler>();
43 private IHttpServer m_httpListener;
44 private string m_httpListenerHostName;
45 private uint m_httpListenerPort;
46 private bool m_useSSL = false;
47
48 /// <summary></summary>
49 /// CapsHandlers is a cap handler container but also takes
50 /// care of adding and removing cap handlers to and from the
51 /// supplied BaseHttpServer.
52 /// </summary>
53 /// <param name="httpListener">base HTTP server</param>
54 /// <param name="httpListenerHostname">host name of the HTTP
55 /// server</param>
56 /// <param name="httpListenerPort">HTTP port</param>
57 public CapsHandlers(BaseHttpServer httpListener, string httpListenerHostname, uint httpListenerPort)
58 : this (httpListener,httpListenerHostname,httpListenerPort, false)
59 {
60 }
61
62 /// <summary></summary>
63 /// CapsHandlers is a cap handler container but also takes
64 /// care of adding and removing cap handlers to and from the
65 /// supplied BaseHttpServer.
66 /// </summary>
67 /// <param name="httpListener">base HTTP server</param>
68 /// <param name="httpListenerHostname">host name of the HTTP
69 /// server</param>
70 /// <param name="httpListenerPort">HTTP port</param>
71 public CapsHandlers(IHttpServer httpListener, string httpListenerHostname, uint httpListenerPort, bool https)
72 {
73 m_httpListener = httpListener;
74 m_httpListenerHostName = httpListenerHostname;
75 m_httpListenerPort = httpListenerPort;
76 m_useSSL = https;
77 if (m_useSSL)
78 {
79 m_httpListenerHostName = httpListener.SSLCommonName;
80 m_httpListenerPort = httpListener.SSLPort;
81 }
82 }
83
84 /// <summary>
85 /// Remove the cap handler for a capability.
86 /// </summary>
87 /// <param name="capsName">name of the capability of the cap
88 /// handler to be removed</param>
89 public void Remove(string capsName)
90 {
91 // This line must be here, or caps will break!
92 m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[capsName].Path);
93 m_capsHandlers.Remove(capsName);
94 }
95
96 public bool ContainsCap(string cap)
97 {
98 return m_capsHandlers.ContainsKey(cap);
99 }
100
101 /// <summary>
102 /// The indexer allows us to treat the CapsHandlers object
103 /// in an intuitive dictionary like way.
104 /// </summary>
105 /// <Remarks>
106 /// The indexer will throw an exception when you try to
107 /// retrieve a cap handler for a cap that is not contained in
108 /// CapsHandlers.
109 /// </Remarks>
110 public IRequestHandler this[string idx]
111 {
112 get
113 {
114 return m_capsHandlers[idx];
115 }
116
117 set
118 {
119 if (m_capsHandlers.ContainsKey(idx))
120 {
121 m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[idx].Path);
122 m_capsHandlers.Remove(idx);
123 }
124
125 if (null == value) return;
126
127 m_capsHandlers[idx] = value;
128 m_httpListener.AddStreamHandler(value);
129 }
130 }
131
132 /// <summary>
133 /// Return the list of cap names for which this CapsHandlers
134 /// object contains cap handlers.
135 /// </summary>
136 public string[] Caps
137 {
138 get
139 {
140 string[] __keys = new string[m_capsHandlers.Keys.Count];
141 m_capsHandlers.Keys.CopyTo(__keys, 0);
142 return __keys;
143 }
144 }
145
146 /// <summary>
147 /// Return an LLSD-serializable Hashtable describing the
148 /// capabilities and their handler details.
149 /// </summary>
150 public Hashtable CapsDetails
151 {
152 get
153 {
154 Hashtable caps = new Hashtable();
155 string protocol = "http://";
156
157 if (m_useSSL)
158 protocol = "https://";
159
160 string baseUrl = protocol + m_httpListenerHostName + ":" + m_httpListenerPort.ToString();
161 foreach (string capsName in m_capsHandlers.Keys)
162 {
163 // skip SEED cap
164 if ("SEED" == capsName) continue;
165 caps[capsName] = baseUrl + m_capsHandlers[capsName].Path;
166 }
167 return caps;
168 }
169 }
170 }
171}
diff --git a/OpenSim/Framework/Capabilities/CapsUtil.cs b/OpenSim/Framework/Capabilities/CapsUtil.cs
new file mode 100644
index 0000000..fb8a58e
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/CapsUtil.cs
@@ -0,0 +1,62 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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 OpenMetaverse;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 /// <summary>
33 /// Capabilities utility methods
34 /// </summary>
35 public class CapsUtil
36 {
37 /// <summary>
38 /// Generate a CAPS seed path using a previously generated CAPS object path component
39 /// </summary>
40 /// <param name="capsKey"></param>
41 /// <returns></returns>
42 public static string GetCapsSeedPath(string capsObjectPath)
43 {
44 return "/CAPS/" + capsObjectPath + "0000/";
45 }
46
47 /// <summary>
48 /// Get a random CAPS object path component that will be used as the identifying part of all future CAPS requests
49 /// </summary>
50 /// <returns></returns>
51 public static string GetRandomCapsObjectPath()
52 {
53 UUID caps = UUID.Random();
54 string capsPath = caps.ToString();
55 // I'm commenting this, rather than delete, to keep as historical record.
56 // The caps seed is now a full UUID string that gets added four more digits
57 // for producing certain CAPs URLs in OpenSim
58 //capsPath = capsPath.Remove(capsPath.Length - 4, 4);
59 return capsPath;
60 }
61 }
62}
diff --git a/OpenSim/Framework/Capabilities/LLSD.cs b/OpenSim/Framework/Capabilities/LLSD.cs
new file mode 100644
index 0000000..73556fc
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSD.cs
@@ -0,0 +1,679 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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.Globalization;
31using System.IO;
32using System.Security.Cryptography;
33using System.Text;
34using System.Xml;
35using OpenMetaverse;
36
37namespace OpenSim.Framework.Communications.Capabilities
38{
39 /// <summary>
40 /// Borrowed from (a older version of) libsl for now, as their new llsd code doesn't work we our decoding code.
41 /// </summary>
42 public static class LLSD
43 {
44 /// <summary>
45 ///
46 /// </summary>
47 public class LLSDParseException : Exception
48 {
49 public LLSDParseException(string message) : base(message)
50 {
51 }
52 }
53
54 /// <summary>
55 ///
56 /// </summary>
57 public class LLSDSerializeException : Exception
58 {
59 public LLSDSerializeException(string message) : base(message)
60 {
61 }
62 }
63
64 /// <summary>
65 ///
66 /// </summary>
67 /// <param name="b"></param>
68 /// <returns></returns>
69 public static object LLSDDeserialize(byte[] b)
70 {
71 return LLSDDeserialize(new MemoryStream(b, false));
72 }
73
74 /// <summary>
75 ///
76 /// </summary>
77 /// <param name="st"></param>
78 /// <returns></returns>
79 public static object LLSDDeserialize(Stream st)
80 {
81 XmlTextReader reader = new XmlTextReader(st);
82 reader.Read();
83 SkipWS(reader);
84
85 if (reader.NodeType != XmlNodeType.Element || reader.LocalName != "llsd")
86 throw new LLSDParseException("Expected <llsd>");
87
88 reader.Read();
89 object ret = LLSDParseOne(reader);
90 SkipWS(reader);
91
92 if (reader.NodeType != XmlNodeType.EndElement || reader.LocalName != "llsd")
93 throw new LLSDParseException("Expected </llsd>");
94
95 return ret;
96 }
97
98 /// <summary>
99 ///
100 /// </summary>
101 /// <param name="obj"></param>
102 /// <returns></returns>
103 public static byte[] LLSDSerialize(object obj)
104 {
105 StringWriter sw = new StringWriter();
106 XmlTextWriter writer = new XmlTextWriter(sw);
107 writer.Formatting = Formatting.None;
108
109 writer.WriteStartElement(String.Empty, "llsd", String.Empty);
110 LLSDWriteOne(writer, obj);
111 writer.WriteEndElement();
112
113 writer.Close();
114
115 return Encoding.UTF8.GetBytes(sw.ToString());
116 }
117
118 /// <summary>
119 ///
120 /// </summary>
121 /// <param name="writer"></param>
122 /// <param name="obj"></param>
123 public static void LLSDWriteOne(XmlTextWriter writer, object obj)
124 {
125 if (obj == null)
126 {
127 writer.WriteStartElement(String.Empty, "undef", String.Empty);
128 writer.WriteEndElement();
129 return;
130 }
131
132 if (obj is string)
133 {
134 writer.WriteStartElement(String.Empty, "string", String.Empty);
135 writer.WriteString((string) obj);
136 writer.WriteEndElement();
137 }
138 else if (obj is int)
139 {
140 writer.WriteStartElement(String.Empty, "integer", String.Empty);
141 writer.WriteString(obj.ToString());
142 writer.WriteEndElement();
143 }
144 else if (obj is double)
145 {
146 writer.WriteStartElement(String.Empty, "real", String.Empty);
147 writer.WriteString(obj.ToString());
148 writer.WriteEndElement();
149 }
150 else if (obj is bool)
151 {
152 bool b = (bool) obj;
153 writer.WriteStartElement(String.Empty, "boolean", String.Empty);
154 writer.WriteString(b ? "1" : "0");
155 writer.WriteEndElement();
156 }
157 else if (obj is ulong)
158 {
159 throw new Exception("ulong in LLSD is currently not implemented, fix me!");
160 }
161 else if (obj is UUID)
162 {
163 UUID u = (UUID) obj;
164 writer.WriteStartElement(String.Empty, "uuid", String.Empty);
165 writer.WriteString(u.ToString());
166 writer.WriteEndElement();
167 }
168 else if (obj is Hashtable)
169 {
170 Hashtable h = obj as Hashtable;
171 writer.WriteStartElement(String.Empty, "map", String.Empty);
172 foreach (string key in h.Keys)
173 {
174 writer.WriteStartElement(String.Empty, "key", String.Empty);
175 writer.WriteString(key);
176 writer.WriteEndElement();
177 LLSDWriteOne(writer, h[key]);
178 }
179 writer.WriteEndElement();
180 }
181 else if (obj is ArrayList)
182 {
183 ArrayList a = obj as ArrayList;
184 writer.WriteStartElement(String.Empty, "array", String.Empty);
185 foreach (object item in a)
186 {
187 LLSDWriteOne(writer, item);
188 }
189 writer.WriteEndElement();
190 }
191 else if (obj is byte[])
192 {
193 byte[] b = obj as byte[];
194 writer.WriteStartElement(String.Empty, "binary", String.Empty);
195
196 writer.WriteStartAttribute(String.Empty, "encoding", String.Empty);
197 writer.WriteString("base64");
198 writer.WriteEndAttribute();
199
200 //// Calculate the length of the base64 output
201 //long length = (long)(4.0d * b.Length / 3.0d);
202 //if (length % 4 != 0) length += 4 - (length % 4);
203
204 //// Create the char[] for base64 output and fill it
205 //char[] tmp = new char[length];
206 //int i = Convert.ToBase64CharArray(b, 0, b.Length, tmp, 0);
207
208 //writer.WriteString(new String(tmp));
209
210 writer.WriteString(Convert.ToBase64String(b));
211 writer.WriteEndElement();
212 }
213 else
214 {
215 throw new LLSDSerializeException("Unknown type " + obj.GetType().Name);
216 }
217 }
218
219 /// <summary>
220 ///
221 /// </summary>
222 /// <param name="reader"></param>
223 /// <returns></returns>
224 public static object LLSDParseOne(XmlTextReader reader)
225 {
226 SkipWS(reader);
227 if (reader.NodeType != XmlNodeType.Element)
228 throw new LLSDParseException("Expected an element");
229
230 string dtype = reader.LocalName;
231 object ret = null;
232
233 switch (dtype)
234 {
235 case "undef":
236 {
237 if (reader.IsEmptyElement)
238 {
239 reader.Read();
240 return null;
241 }
242
243 reader.Read();
244 SkipWS(reader);
245 ret = null;
246 break;
247 }
248 case "boolean":
249 {
250 if (reader.IsEmptyElement)
251 {
252 reader.Read();
253 return false;
254 }
255
256 reader.Read();
257 string s = reader.ReadString().Trim();
258
259 if (s == String.Empty || s == "false" || s == "0")
260 ret = false;
261 else if (s == "true" || s == "1")
262 ret = true;
263 else
264 throw new LLSDParseException("Bad boolean value " + s);
265
266 break;
267 }
268 case "integer":
269 {
270 if (reader.IsEmptyElement)
271 {
272 reader.Read();
273 return 0;
274 }
275
276 reader.Read();
277 ret = Convert.ToInt32(reader.ReadString().Trim());
278 break;
279 }
280 case "real":
281 {
282 if (reader.IsEmptyElement)
283 {
284 reader.Read();
285 return 0.0f;
286 }
287
288 reader.Read();
289 ret = Convert.ToDouble(reader.ReadString().Trim());
290 break;
291 }
292 case "uuid":
293 {
294 if (reader.IsEmptyElement)
295 {
296 reader.Read();
297 return UUID.Zero;
298 }
299
300 reader.Read();
301 ret = new UUID(reader.ReadString().Trim());
302 break;
303 }
304 case "string":
305 {
306 if (reader.IsEmptyElement)
307 {
308 reader.Read();
309 return String.Empty;
310 }
311
312 reader.Read();
313 ret = reader.ReadString();
314 break;
315 }
316 case "binary":
317 {
318 if (reader.IsEmptyElement)
319 {
320 reader.Read();
321 return new byte[0];
322 }
323
324 if (reader.GetAttribute("encoding") != null &&
325 reader.GetAttribute("encoding") != "base64")
326 {
327 throw new LLSDParseException("Unknown encoding: " + reader.GetAttribute("encoding"));
328 }
329
330 reader.Read();
331 FromBase64Transform b64 = new FromBase64Transform(FromBase64TransformMode.IgnoreWhiteSpaces);
332 byte[] inp = Encoding.UTF8.GetBytes(reader.ReadString());
333 ret = b64.TransformFinalBlock(inp, 0, inp.Length);
334 break;
335 }
336 case "date":
337 {
338 reader.Read();
339 throw new Exception("LLSD TODO: date");
340 }
341 case "map":
342 {
343 return LLSDParseMap(reader);
344 }
345 case "array":
346 {
347 return LLSDParseArray(reader);
348 }
349 default:
350 throw new LLSDParseException("Unknown element <" + dtype + ">");
351 }
352
353 if (reader.NodeType != XmlNodeType.EndElement || reader.LocalName != dtype)
354 {
355 throw new LLSDParseException("Expected </" + dtype + ">");
356 }
357
358 reader.Read();
359 return ret;
360 }
361
362 /// <summary>
363 ///
364 /// </summary>
365 /// <param name="reader"></param>
366 /// <returns></returns>
367 public static Hashtable LLSDParseMap(XmlTextReader reader)
368 {
369 Hashtable ret = new Hashtable();
370
371 if (reader.NodeType != XmlNodeType.Element || reader.LocalName != "map")
372 throw new LLSDParseException("Expected <map>");
373
374 if (reader.IsEmptyElement)
375 {
376 reader.Read();
377 return ret;
378 }
379
380 reader.Read();
381
382 while (true)
383 {
384 SkipWS(reader);
385 if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "map")
386 {
387 reader.Read();
388 break;
389 }
390
391 if (reader.NodeType != XmlNodeType.Element || reader.LocalName != "key")
392 throw new LLSDParseException("Expected <key>");
393
394 string key = reader.ReadString();
395
396 if (reader.NodeType != XmlNodeType.EndElement || reader.LocalName != "key")
397 throw new LLSDParseException("Expected </key>");
398
399 reader.Read();
400 object val = LLSDParseOne(reader);
401 ret[key] = val;
402 }
403
404 return ret; // TODO
405 }
406
407 /// <summary>
408 ///
409 /// </summary>
410 /// <param name="reader"></param>
411 /// <returns></returns>
412 public static ArrayList LLSDParseArray(XmlTextReader reader)
413 {
414 ArrayList ret = new ArrayList();
415
416 if (reader.NodeType != XmlNodeType.Element || reader.LocalName != "array")
417 throw new LLSDParseException("Expected <array>");
418
419 if (reader.IsEmptyElement)
420 {
421 reader.Read();
422 return ret;
423 }
424
425 reader.Read();
426
427 while (true)
428 {
429 SkipWS(reader);
430
431 if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "array")
432 {
433 reader.Read();
434 break;
435 }
436
437 ret.Insert(ret.Count, LLSDParseOne(reader));
438 }
439
440 return ret; // TODO
441 }
442
443 /// <summary>
444 ///
445 /// </summary>
446 /// <param name="count"></param>
447 /// <returns></returns>
448 private static string GetSpaces(int count)
449 {
450 StringBuilder b = new StringBuilder();
451 for (int i = 0; i < count; i++) b.Append(" ");
452 return b.ToString();
453 }
454
455 /// <summary>
456 ///
457 /// </summary>
458 /// <param name="obj"></param>
459 /// <param name="indent"></param>
460 /// <returns></returns>
461 public static String LLSDDump(object obj, int indent)
462 {
463 if (obj == null)
464 {
465 return GetSpaces(indent) + "- undef\n";
466 }
467 else if (obj is string)
468 {
469 return GetSpaces(indent) + "- string \"" + (string) obj + "\"\n";
470 }
471 else if (obj is int)
472 {
473 return GetSpaces(indent) + "- integer " + obj.ToString() + "\n";
474 }
475 else if (obj is double)
476 {
477 return GetSpaces(indent) + "- float " + obj.ToString() + "\n";
478 }
479 else if (obj is UUID)
480 {
481 return GetSpaces(indent) + "- uuid " + ((UUID) obj).ToString() + Environment.NewLine;
482 }
483 else if (obj is Hashtable)
484 {
485 StringBuilder ret = new StringBuilder();
486 ret.Append(GetSpaces(indent) + "- map" + Environment.NewLine);
487 Hashtable map = (Hashtable) obj;
488
489 foreach (string key in map.Keys)
490 {
491 ret.Append(GetSpaces(indent + 2) + "- key \"" + key + "\"" + Environment.NewLine);
492 ret.Append(LLSDDump(map[key], indent + 3));
493 }
494
495 return ret.ToString();
496 }
497 else if (obj is ArrayList)
498 {
499 StringBuilder ret = new StringBuilder();
500 ret.Append(GetSpaces(indent) + "- array\n");
501 ArrayList list = (ArrayList) obj;
502
503 foreach (object item in list)
504 {
505 ret.Append(LLSDDump(item, indent + 2));
506 }
507
508 return ret.ToString();
509 }
510 else if (obj is byte[])
511 {
512 return GetSpaces(indent) + "- binary\n" + Utils.BytesToHexString((byte[]) obj, GetSpaces(indent)) +
513 Environment.NewLine;
514 }
515 else
516 {
517 return GetSpaces(indent) + "- unknown type " + obj.GetType().Name + Environment.NewLine;
518 }
519 }
520
521 public static object ParseTerseLLSD(string llsd)
522 {
523 int notused;
524 return ParseTerseLLSD(llsd, out notused);
525 }
526
527 public static object ParseTerseLLSD(string llsd, out int endPos)
528 {
529 if (llsd.Length == 0)
530 {
531 endPos = 0;
532 return null;
533 }
534
535 // Identify what type of object this is
536 switch (llsd[0])
537 {
538 case '!':
539 throw new LLSDParseException("Undefined value type encountered");
540 case '1':
541 endPos = 1;
542 return true;
543 case '0':
544 endPos = 1;
545 return false;
546 case 'i':
547 {
548 if (llsd.Length < 2) throw new LLSDParseException("Integer value type with no value");
549 int value;
550 endPos = FindEnd(llsd, 1);
551
552 if (Int32.TryParse(llsd.Substring(1, endPos - 1), out value))
553 return value;
554 else
555 throw new LLSDParseException("Failed to parse integer value type");
556 }
557 case 'r':
558 {
559 if (llsd.Length < 2) throw new LLSDParseException("Real value type with no value");
560 double value;
561 endPos = FindEnd(llsd, 1);
562
563 if (Double.TryParse(llsd.Substring(1, endPos - 1), NumberStyles.Float,
564 Utils.EnUsCulture.NumberFormat, out value))
565 return value;
566 else
567 throw new LLSDParseException("Failed to parse double value type");
568 }
569 case 'u':
570 {
571 if (llsd.Length < 17) throw new LLSDParseException("UUID value type with no value");
572 UUID value;
573 endPos = FindEnd(llsd, 1);
574
575 if (UUID.TryParse(llsd.Substring(1, endPos - 1), out value))
576 return value;
577 else
578 throw new LLSDParseException("Failed to parse UUID value type");
579 }
580 case 'b':
581 //byte[] value = new byte[llsd.Length - 1];
582 // This isn't the actual binary LLSD format, just the terse format sent
583 // at login so I don't even know if there is a binary type
584 throw new LLSDParseException("Binary value type is unimplemented");
585 case 's':
586 case 'l':
587 if (llsd.Length < 2) throw new LLSDParseException("String value type with no value");
588 endPos = FindEnd(llsd, 1);
589 return llsd.Substring(1, endPos - 1);
590 case 'd':
591 // Never seen one before, don't know what the format is
592 throw new LLSDParseException("Date value type is unimplemented");
593 case '[':
594 {
595 if (llsd.IndexOf(']') == -1) throw new LLSDParseException("Invalid array");
596
597 int pos = 0;
598 ArrayList array = new ArrayList();
599
600 while (llsd[pos] != ']')
601 {
602 ++pos;
603
604 // Advance past comma if need be
605 if (llsd[pos] == ',') ++pos;
606
607 // Allow a single whitespace character
608 if (pos < llsd.Length && llsd[pos] == ' ') ++pos;
609
610 int end;
611 array.Add(ParseTerseLLSD(llsd.Substring(pos), out end));
612 pos += end;
613 }
614
615 endPos = pos + 1;
616 return array;
617 }
618 case '{':
619 {
620 if (llsd.IndexOf('}') == -1) throw new LLSDParseException("Invalid map");
621
622 int pos = 0;
623 Hashtable hashtable = new Hashtable();
624
625 while (llsd[pos] != '}')
626 {
627 ++pos;
628
629 // Advance past comma if need be
630 if (llsd[pos] == ',') ++pos;
631
632 // Allow a single whitespace character
633 if (pos < llsd.Length && llsd[pos] == ' ') ++pos;
634
635 if (llsd[pos] != '\'') throw new LLSDParseException("Expected a map key");
636 int endquote = llsd.IndexOf('\'', pos + 1);
637 if (endquote == -1 || (endquote + 1) >= llsd.Length || llsd[endquote + 1] != ':')
638 throw new LLSDParseException("Invalid map format");
639 string key = llsd.Substring(pos, endquote - pos);
640 key = key.Replace("'", String.Empty);
641 pos += (endquote - pos) + 2;
642
643 int end;
644 hashtable.Add(key, ParseTerseLLSD(llsd.Substring(pos), out end));
645 pos += end;
646 }
647
648 endPos = pos + 1;
649 return hashtable;
650 }
651 default:
652 throw new Exception("Unknown value type");
653 }
654 }
655
656 private static int FindEnd(string llsd, int start)
657 {
658 int end = llsd.IndexOfAny(new char[] {',', ']', '}'});
659 if (end == -1) end = llsd.Length - 1;
660 return end;
661 }
662
663 /// <summary>
664 ///
665 /// </summary>
666 /// <param name="reader"></param>
667 private static void SkipWS(XmlTextReader reader)
668 {
669 while (
670 reader.NodeType == XmlNodeType.Comment ||
671 reader.NodeType == XmlNodeType.Whitespace ||
672 reader.NodeType == XmlNodeType.SignificantWhitespace ||
673 reader.NodeType == XmlNodeType.XmlDeclaration)
674 {
675 reader.Read();
676 }
677 }
678 }
679}
diff --git a/OpenSim/Framework/Capabilities/LLSDArray.cs b/OpenSim/Framework/Capabilities/LLSDArray.cs
new file mode 100644
index 0000000..b24e029
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDArray.cs
@@ -0,0 +1,41 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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.Collections;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 [LLSDType("ARRAY")]
33 public class OSDArray
34 {
35 public ArrayList Array = new ArrayList();
36
37 public OSDArray()
38 {
39 }
40 }
41} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDAssetUploadComplete.cs b/OpenSim/Framework/Capabilities/LLSDAssetUploadComplete.cs
new file mode 100644
index 0000000..dd54fa9
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDAssetUploadComplete.cs
@@ -0,0 +1,45 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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 OpenMetaverse;
30
31namespace OpenSim.Framework.Communications.Capabilities
32{
33 [LLSDType("MAP")]
34 public class LLSDAssetUploadComplete
35 {
36 public string new_asset = String.Empty;
37 public UUID new_inventory_item = UUID.Zero;
38 public string state = String.Empty;
39 //public bool success = false;
40
41 public LLSDAssetUploadComplete()
42 {
43 }
44 }
45}
diff --git a/OpenSim/Framework/Capabilities/LLSDAssetUploadRequest.cs b/OpenSim/Framework/Capabilities/LLSDAssetUploadRequest.cs
new file mode 100644
index 0000000..883f512
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDAssetUploadRequest.cs
@@ -0,0 +1,46 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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 OpenMetaverse;
30
31namespace OpenSim.Framework.Communications.Capabilities
32{
33 [OSDMap]
34 public class LLSDAssetUploadRequest
35 {
36 public string asset_type = String.Empty;
37 public string description = String.Empty;
38 public UUID folder_id = UUID.Zero;
39 public string inventory_type = String.Empty;
40 public string name = String.Empty;
41
42 public LLSDAssetUploadRequest()
43 {
44 }
45 }
46}
diff --git a/OpenSim/Framework/Capabilities/LLSDAssetUploadResponse.cs b/OpenSim/Framework/Capabilities/LLSDAssetUploadResponse.cs
new file mode 100644
index 0000000..e4cd9d2
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDAssetUploadResponse.cs
@@ -0,0 +1,42 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 [OSDMap]
33 public class LLSDAssetUploadResponse
34 {
35 public string uploader = String.Empty;
36 public string state = String.Empty;
37
38 public LLSDAssetUploadResponse()
39 {
40 }
41 }
42} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDCapEvent.cs b/OpenSim/Framework/Capabilities/LLSDCapEvent.cs
new file mode 100644
index 0000000..c91e570
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDCapEvent.cs
@@ -0,0 +1,40 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28namespace OpenSim.Framework.Communications.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDCapEvent
32 {
33 public int id = 0;
34 public OSDArray events = new OSDArray();
35
36 public LLSDCapEvent()
37 {
38 }
39 }
40} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDEmpty.cs b/OpenSim/Framework/Capabilities/LLSDEmpty.cs
new file mode 100644
index 0000000..1c7c25d
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDEmpty.cs
@@ -0,0 +1,37 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28namespace OpenSim.Framework.Communications.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDEmpty
32 {
33 public LLSDEmpty()
34 {
35 }
36 }
37} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDHelpers.cs b/OpenSim/Framework/Capabilities/LLSDHelpers.cs
new file mode 100644
index 0000000..596dfc3
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDHelpers.cs
@@ -0,0 +1,172 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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.IO;
31using System.Reflection;
32using System.Xml;
33
34namespace OpenSim.Framework.Communications.Capabilities
35{
36 public class LLSDHelpers
37 {
38// private static readonly log4net.ILog m_log
39// = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
40
41 public static string SerialiseLLSDReply(object obj)
42 {
43 StringWriter sw = new StringWriter();
44 XmlTextWriter writer = new XmlTextWriter(sw);
45 writer.Formatting = Formatting.None;
46 writer.WriteStartElement(String.Empty, "llsd", String.Empty);
47 SerializeOSDType(writer, obj);
48 writer.WriteEndElement();
49 writer.Close();
50
51 //m_log.DebugFormat("[LLSD Helpers]: Generated serialized LLSD reply {0}", sw.ToString());
52
53 return sw.ToString();
54 }
55
56 private static void SerializeOSDType(XmlTextWriter writer, object obj)
57 {
58 Type myType = obj.GetType();
59 LLSDType[] llsdattributes = (LLSDType[]) myType.GetCustomAttributes(typeof (LLSDType), false);
60 if (llsdattributes.Length > 0)
61 {
62 switch (llsdattributes[0].ObjectType)
63 {
64 case "MAP":
65 writer.WriteStartElement(String.Empty, "map", String.Empty);
66 FieldInfo[] fields = myType.GetFields();
67 for (int i = 0; i < fields.Length; i++)
68 {
69 if (fields[i] != null && fields[i].GetValue(obj) != null)
70 {
71 object fieldValue = fields[i].GetValue(obj);
72 LLSDType[] fieldAttributes =
73 (LLSDType[]) fieldValue.GetType().GetCustomAttributes(typeof (LLSDType), false);
74 if (fieldAttributes.Length > 0)
75 {
76 writer.WriteStartElement(String.Empty, "key", String.Empty);
77 string fieldName = fields[i].Name;
78 fieldName = fieldName.Replace("___", "-");
79 writer.WriteString(fieldName);
80 writer.WriteEndElement();
81 SerializeOSDType(writer, fieldValue);
82 }
83 else
84 {
85 writer.WriteStartElement(String.Empty, "key", String.Empty);
86 string fieldName = fields[i].Name;
87 fieldName = fieldName.Replace("___", "-");
88 writer.WriteString(fieldName);
89 writer.WriteEndElement();
90 LLSD.LLSDWriteOne(writer, fieldValue);
91 // OpenMetaverse.StructuredData.LLSDParser.SerializeXmlElement(
92 // writer, OpenMetaverse.StructuredData.OSD.FromObject(fieldValue));
93 }
94 }
95 else
96 {
97 // TODO from ADAM: There is a nullref being caused by fields[i] being null
98 // on some computers. Unsure what is causing this, but would appreciate
99 // if sdague could take a look at this.
100 }
101 }
102 writer.WriteEndElement();
103 break;
104 case "ARRAY":
105 // OSDArray arrayObject = obj as OSDArray;
106 // ArrayList a = arrayObject.Array;
107 ArrayList a = (ArrayList) obj.GetType().GetField("Array").GetValue(obj);
108 if (a != null)
109 {
110 writer.WriteStartElement(String.Empty, "array", String.Empty);
111 foreach (object item in a)
112 {
113 SerializeOSDType(writer, item);
114 }
115 writer.WriteEndElement();
116 }
117 break;
118 }
119 }
120 else
121 {
122 LLSD.LLSDWriteOne(writer, obj);
123 //OpenMetaverse.StructuredData.LLSDParser.SerializeXmlElement(
124 // writer, OpenMetaverse.StructuredData.OSD.FromObject(obj));
125 }
126 }
127
128 public static object DeserialiseOSDMap(Hashtable llsd, object obj)
129 {
130 Type myType = obj.GetType();
131 LLSDType[] llsdattributes = (LLSDType[]) myType.GetCustomAttributes(typeof (LLSDType), false);
132 if (llsdattributes.Length > 0)
133 {
134 switch (llsdattributes[0].ObjectType)
135 {
136 case "MAP":
137 IDictionaryEnumerator enumerator = llsd.GetEnumerator();
138 while (enumerator.MoveNext())
139 {
140 string keyName = (string)enumerator.Key;
141 keyName = keyName.Replace("-","_");
142 FieldInfo field = myType.GetField(keyName);
143 if (field != null)
144 {
145 // if (enumerator.Value is OpenMetaverse.StructuredData.OSDMap)
146 if (enumerator.Value is Hashtable)
147 {
148 object fieldValue = field.GetValue(obj);
149 DeserialiseOSDMap((Hashtable) enumerator.Value, fieldValue);
150 // DeserialiseOSDMap((OpenMetaverse.StructuredData.OSDMap) enumerator.Value, fieldValue);
151 }
152 else if (enumerator.Value is ArrayList)
153 {
154 object fieldValue = field.GetValue(obj);
155 fieldValue.GetType().GetField("Array").SetValue(fieldValue, enumerator.Value);
156 //TODO
157 // the LLSD map/array types in the array need to be deserialised
158 // but first we need to know the right class to deserialise them into.
159 }
160 else
161 {
162 field.SetValue(obj, enumerator.Value);
163 }
164 }
165 }
166 break;
167 }
168 }
169 return obj;
170 }
171 }
172}
diff --git a/OpenSim/Framework/Capabilities/LLSDInventoryItem.cs b/OpenSim/Framework/Capabilities/LLSDInventoryItem.cs
new file mode 100644
index 0000000..5fa6d67
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDInventoryItem.cs
@@ -0,0 +1,97 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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 OpenMetaverse;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 [OSDMap]
33 public class LLSDInventoryItem
34 {
35 public UUID parent_id;
36
37 public UUID asset_id;
38 public UUID item_id;
39 public LLSDPermissions permissions;
40 public string type;
41 public string inv_type;
42 public int flags;
43
44 public LLSDSaleInfo sale_info;
45 public string name;
46 public string desc;
47 public int created_at;
48 }
49
50 [OSDMap]
51 public class LLSDPermissions
52 {
53 public UUID creator_id;
54 public UUID owner_id;
55 public UUID group_id;
56 public int base_mask;
57 public int owner_mask;
58 public int group_mask;
59 public int everyone_mask;
60 public int next_owner_mask;
61 public bool is_owner_group;
62 }
63
64 [OSDMap]
65 public class LLSDSaleInfo
66 {
67 public int sale_price;
68 public string sale_type;
69 }
70
71 [OSDMap]
72 public class LLSDInventoryDescendents
73 {
74 public OSDArray folders = new OSDArray();
75 }
76
77 [OSDMap]
78 public class LLSDFetchInventoryDescendents
79 {
80 public UUID folder_id;
81 public UUID owner_id;
82 public int sort_order;
83 public bool fetch_folders;
84 public bool fetch_items;
85 }
86
87 [OSDMap]
88 public class LLSDInventoryFolderContents
89 {
90 public UUID agent_id;
91 public int descendents;
92 public UUID folder_id;
93 public OSDArray items = new OSDArray();
94 public UUID owner_id;
95 public int version;
96 }
97}
diff --git a/OpenSim/Framework/Capabilities/LLSDItemUpdate.cs b/OpenSim/Framework/Capabilities/LLSDItemUpdate.cs
new file mode 100644
index 0000000..1e2600e
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDItemUpdate.cs
@@ -0,0 +1,41 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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 OpenMetaverse;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 [OSDMap]
33 public class LLSDItemUpdate
34 {
35 public UUID item_id;
36
37 public LLSDItemUpdate()
38 {
39 }
40 }
41}
diff --git a/OpenSim/Framework/Capabilities/LLSDMapLayer.cs b/OpenSim/Framework/Capabilities/LLSDMapLayer.cs
new file mode 100644
index 0000000..1c1de3c
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDMapLayer.cs
@@ -0,0 +1,45 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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 OpenMetaverse;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 [LLSDType("MAP")]
33 public class OSDMapLayer
34 {
35 public int Left = 0;
36 public int Right = 0;
37 public int Top = 0;
38 public int Bottom = 0;
39 public UUID ImageID = UUID.Zero;
40
41 public OSDMapLayer()
42 {
43 }
44 }
45}
diff --git a/OpenSim/Framework/Capabilities/LLSDMapLayerResponse.cs b/OpenSim/Framework/Capabilities/LLSDMapLayerResponse.cs
new file mode 100644
index 0000000..a2bf9d4
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDMapLayerResponse.cs
@@ -0,0 +1,40 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28namespace OpenSim.Framework.Communications.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDMapLayerResponse
32 {
33 public LLSDMapRequest AgentData = new LLSDMapRequest();
34 public OSDArray LayerData = new OSDArray();
35
36 public LLSDMapLayerResponse()
37 {
38 }
39 }
40} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDMapRequest.cs b/OpenSim/Framework/Capabilities/LLSDMapRequest.cs
new file mode 100644
index 0000000..3442474
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDMapRequest.cs
@@ -0,0 +1,39 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28namespace OpenSim.Framework.Communications.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDMapRequest
32 {
33 public int Flags = 0;
34
35 public LLSDMapRequest()
36 {
37 }
38 }
39} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDMethod.cs b/OpenSim/Framework/Capabilities/LLSDMethod.cs
new file mode 100644
index 0000000..d832aa3
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDMethod.cs
@@ -0,0 +1,31 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28namespace OpenSim.Framework.Communications.Capabilities
29{
30 public delegate TResponse LLSDMethod<TRequest, TResponse>(TRequest request);
31} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDMethodString.cs b/OpenSim/Framework/Capabilities/LLSDMethodString.cs
new file mode 100644
index 0000000..d03bdb1
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDMethodString.cs
@@ -0,0 +1,31 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28namespace OpenSim.Framework.Communications.Capabilities
29{
30 public delegate TResponse LLSDMethodString<TRequest, TResponse>(TRequest request, string path);
31}
diff --git a/OpenSim/Framework/Capabilities/LLSDParcelVoiceInfoResponse.cs b/OpenSim/Framework/Capabilities/LLSDParcelVoiceInfoResponse.cs
new file mode 100644
index 0000000..855836f
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDParcelVoiceInfoResponse.cs
@@ -0,0 +1,51 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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*/
28
29using System.Collections;
30
31namespace OpenSim.Framework.Communications.Capabilities
32{
33 [OSDMap]
34 public class LLSDParcelVoiceInfoResponse
35 {
36 public int parcel_local_id;
37 public string region_name;
38 public Hashtable voice_credentials;
39
40 public LLSDParcelVoiceInfoResponse()
41 {
42 }
43
44 public LLSDParcelVoiceInfoResponse(string region, int localID, Hashtable creds)
45 {
46 region_name = region;
47 parcel_local_id = localID;
48 voice_credentials = creds;
49 }
50 }
51} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDRemoteParcelResponse.cs b/OpenSim/Framework/Capabilities/LLSDRemoteParcelResponse.cs
new file mode 100644
index 0000000..6a95acd
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDRemoteParcelResponse.cs
@@ -0,0 +1,42 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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*/
28
29using OpenMetaverse;
30
31namespace OpenSim.Framework.Communications.Capabilities
32{
33 [LLSDType("MAP")]
34 public class LLSDRemoteParcelResponse
35 {
36 public UUID parcel_id;
37
38 public LLSDRemoteParcelResponse()
39 {
40 }
41 }
42}
diff --git a/OpenSim/Framework/Capabilities/LLSDStreamHandler.cs b/OpenSim/Framework/Capabilities/LLSDStreamHandler.cs
new file mode 100644
index 0000000..18f0a2a
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDStreamHandler.cs
@@ -0,0 +1,70 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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.Collections;
29using System.IO;
30using System.Text;
31using OpenSim.Framework.Servers;
32using OpenSim.Framework.Servers.HttpServer;
33
34namespace OpenSim.Framework.Communications.Capabilities
35{
36 public class LLSDStreamhandler<TRequest, TResponse> : BaseStreamHandler
37 where TRequest : new()
38 {
39 private LLSDMethod<TRequest, TResponse> m_method;
40
41 public LLSDStreamhandler(string httpMethod, string path, LLSDMethod<TRequest, TResponse> method)
42 : base(httpMethod, path)
43 {
44 m_method = method;
45 }
46
47 public override byte[] Handle(string path, Stream request,
48 OSHttpRequest httpRequest, OSHttpResponse httpResponse)
49 {
50 //Encoding encoding = Encoding.UTF8;
51 //StreamReader streamReader = new StreamReader(request, false);
52
53 //string requestBody = streamReader.ReadToEnd();
54 //streamReader.Close();
55
56 // OpenMetaverse.StructuredData.OSDMap hash = (OpenMetaverse.StructuredData.OSDMap)
57 // OpenMetaverse.StructuredData.LLSDParser.DeserializeXml(new XmlTextReader(request));
58
59 Hashtable hash = (Hashtable) LLSD.LLSDDeserialize(request);
60 TRequest llsdRequest = new TRequest();
61 LLSDHelpers.DeserialiseOSDMap(hash, llsdRequest);
62
63 TResponse response = m_method(llsdRequest);
64
65 Encoding encoding = new UTF8Encoding(false);
66
67 return encoding.GetBytes(LLSDHelpers.SerialiseLLSDReply(response));
68 }
69 }
70}
diff --git a/OpenSim/Framework/Capabilities/LLSDTaskInventoryUploadComplete.cs b/OpenSim/Framework/Capabilities/LLSDTaskInventoryUploadComplete.cs
new file mode 100644
index 0000000..ef8bd20
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDTaskInventoryUploadComplete.cs
@@ -0,0 +1,50 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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 OpenMetaverse;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 [OSDMap]
33 public class LLSDTaskInventoryUploadComplete
34 {
35 /// <summary>
36 /// The task inventory item that was updated
37 /// </summary>
38 public UUID item_id;
39
40 /// <summary>
41 /// The task that was updated
42 /// </summary>
43 public UUID task_id;
44
45 /// <summary>
46 /// State of the upload. So far have only even seen this set to "complete"
47 /// </summary>
48 public string state;
49 }
50}
diff --git a/OpenSim/Framework/Capabilities/LLSDTaskScriptUpdate.cs b/OpenSim/Framework/Capabilities/LLSDTaskScriptUpdate.cs
new file mode 100644
index 0000000..6136188
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDTaskScriptUpdate.cs
@@ -0,0 +1,50 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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 OpenMetaverse;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 [OSDMap]
33 public class LLSDTaskScriptUpdate
34 {
35 /// <summary>
36 /// The item containing the script to update
37 /// </summary>
38 public UUID item_id;
39
40 /// <summary>
41 /// The task containing the script
42 /// </summary>
43 public UUID task_id;
44
45 /// <summary>
46 /// Signals whether the script is currently active
47 /// </summary>
48 public int is_script_running;
49 }
50}
diff --git a/OpenSim/Framework/Capabilities/LLSDTest.cs b/OpenSim/Framework/Capabilities/LLSDTest.cs
new file mode 100644
index 0000000..bbe46a0
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDTest.cs
@@ -0,0 +1,40 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28namespace OpenSim.Framework.Communications.Capabilities
29{
30 [LLSDType("MAP")]
31 public class LLSDTest
32 {
33 public int Test1 = 20;
34 public int Test2 = 10;
35
36 public LLSDTest()
37 {
38 }
39 }
40} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDType.cs b/OpenSim/Framework/Capabilities/LLSDType.cs
new file mode 100644
index 0000000..06896e1
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDType.cs
@@ -0,0 +1,55 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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;
29
30namespace OpenSim.Framework.Communications.Capabilities
31{
32 [AttributeUsage(AttributeTargets.Class)]
33 public class LLSDType : Attribute
34 {
35 protected string myType;
36
37 public LLSDType(string type)
38 {
39 myType = type;
40 }
41
42 public string ObjectType
43 {
44 get { return myType; }
45 }
46 }
47
48 [AttributeUsage(AttributeTargets.Class)]
49 public class OSDMap : LLSDType
50 {
51 public OSDMap() : base("MAP")
52 {
53 }
54 }
55} \ No newline at end of file
diff --git a/OpenSim/Framework/Capabilities/LLSDVoiceAccountResponse.cs b/OpenSim/Framework/Capabilities/LLSDVoiceAccountResponse.cs
new file mode 100644
index 0000000..ff98a73
--- /dev/null
+++ b/OpenSim/Framework/Capabilities/LLSDVoiceAccountResponse.cs
@@ -0,0 +1,57 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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*/
28
29namespace OpenSim.Framework.Communications.Capabilities
30{
31 [OSDMap]
32 public class LLSDVoiceAccountResponse
33 {
34 public string username;
35 public string password;
36 public string voice_sip_uri_hostname;
37 public string voice_account_server_name;
38
39 public LLSDVoiceAccountResponse()
40 {
41 }
42
43 public LLSDVoiceAccountResponse(string user, string pass)
44 {
45 username = user;
46 password = pass;
47 }
48
49 public LLSDVoiceAccountResponse(string user, string pass, string sipUriHost, string accountServer)
50 {
51 username = user;
52 password = pass;
53 voice_sip_uri_hostname = sipUriHost;
54 voice_account_server_name = accountServer;
55 }
56 }
57} \ No newline at end of file