Annotation of /trunk/AssetServer/Extensions/OpenSimInventoryFrontend.cs
Parent Directory
|
Revision Log
Revision 70 - (view) (download)
| 1 : | jhurliman | 49 | /* |
| 2 : | * Copyright (c) 2008 Intel Corporation | ||
| 3 : | * All rights reserved. | ||
| 4 : | * Redistribution and use in source and binary forms, with or without | ||
| 5 : | * modification, are permitted provided that the following conditions | ||
| 6 : | * are met: | ||
| 7 : | * | ||
| 8 : | * -- Redistributions of source code must retain the above copyright | ||
| 9 : | * notice, this list of conditions and the following disclaimer. | ||
| 10 : | * -- Redistributions in binary form must reproduce the above copyright | ||
| 11 : | * notice, this list of conditions and the following disclaimer in the | ||
| 12 : | * documentation and/or other materials provided with the distribution. | ||
| 13 : | * -- Neither the name of the Intel Corporation nor the names of its | ||
| 14 : | * contributors may be used to endorse or promote products derived from | ||
| 15 : | * this software without specific prior written permission. | ||
| 16 : | * | ||
| 17 : | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 18 : | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 19 : | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | ||
| 20 : | * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS | ||
| 21 : | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||
| 22 : | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
| 23 : | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||
| 24 : | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||
| 25 : | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||
| 26 : | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
| 27 : | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 28 : | */ | ||
| 29 : | |||
| 30 : | using System; | ||
| 31 : | using System.Collections.Generic; | ||
| 32 : | using System.Net; | ||
| 33 : | using System.IO; | ||
| 34 : | using System.Xml; | ||
| 35 : | using ExtensionLoader; | ||
| 36 : | using OpenMetaverse; | ||
| 37 : | jhurliman | 63 | using OpenMetaverse.StructuredData; |
| 38 : | jhurliman | 57 | using HttpServer; |
| 39 : | jhurliman | 49 | |
| 40 : | namespace AssetServer.Extensions | ||
| 41 : | { | ||
| 42 : | public class OpenSimInventoryFrontend : IExtension<AssetServer> | ||
| 43 : | { | ||
| 44 : | AssetServer server; | ||
| 45 : | Utils.InventoryItemSerializer itemSerializer = new Utils.InventoryItemSerializer(); | ||
| 46 : | Utils.InventoryFolderSerializer folderSerializer = new Utils.InventoryFolderSerializer(); | ||
| 47 : | Utils.InventoryCollectionSerializer collectionSerializer = new Utils.InventoryCollectionSerializer(); | ||
| 48 : | |||
| 49 : | public OpenSimInventoryFrontend() | ||
| 50 : | { | ||
| 51 : | } | ||
| 52 : | |||
| 53 : | public void Start(AssetServer server) | ||
| 54 : | { | ||
| 55 : | this.server = server; | ||
| 56 : | |||
| 57 : | server.HttpServer.AddHandler("post", null, @"^/GetInventory/", GetInventoryHandler); | ||
| 58 : | server.HttpServer.AddHandler("post", null, @"^/CreateInventory/", CreateInventoryHandler); | ||
| 59 : | server.HttpServer.AddHandler("post", null, @"^/NewFolder/", NewFolderHandler); | ||
| 60 : | server.HttpServer.AddHandler("post", null, @"^/UpdateFolder/", UpdateFolderHandler); | ||
| 61 : | server.HttpServer.AddHandler("post", null, @"^/MoveFolder/", MoveFolderHandler); | ||
| 62 : | server.HttpServer.AddHandler("post", null, @"^/PurgeFolder/", PurgeFolderHandler); | ||
| 63 : | server.HttpServer.AddHandler("post", null, @"^/NewItem/", NewItemHandler); | ||
| 64 : | server.HttpServer.AddHandler("post", null, @"^/DeleteItem/", DeleteItemHandler); | ||
| 65 : | server.HttpServer.AddHandler("post", null, @"^/RootFolders/", RootFoldersHandler); | ||
| 66 : | server.HttpServer.AddHandler("post", null, @"^/ActiveGestures/", ActiveGesturesHandler); | ||
| 67 : | } | ||
| 68 : | |||
| 69 : | public void Stop() | ||
| 70 : | { | ||
| 71 : | } | ||
| 72 : | |||
| 73 : | jhurliman | 57 | bool GetInventoryHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 74 : | jhurliman | 49 | { |
| 75 : | UUID sessionID, agentID; | ||
| 76 : | jhurliman | 57 | UUID ownerID = DeserializeUUID(request.Body, out agentID, out sessionID); |
| 77 : | jhurliman | 49 | |
| 78 : | jhurliman | 51 | if (ownerID != UUID.Zero) |
| 79 : | jhurliman | 49 | { |
| 80 : | Logger.Log.Warn("GetInventory is not scalable on some inventory backends, avoid calling it wherever possible"); | ||
| 81 : | |||
| 82 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(ownerID); |
| 83 : | InventoryCollection inventory; | ||
| 84 : | jhurliman | 70 | BackendResponse storageResponse = server.InventoryProvider.TryFetchInventory(owner, out inventory); |
| 85 : | jhurliman | 49 | |
| 86 : | jhurliman | 70 | if (storageResponse == BackendResponse.Success) |
| 87 : | jhurliman | 66 | { |
| 88 : | collectionSerializer.Serialize(response.Body, inventory); | ||
| 89 : | response.Body.Flush(); | ||
| 90 : | jhurliman | 49 | } |
| 91 : | jhurliman | 70 | else if (storageResponse == BackendResponse.NotFound) |
| 92 : | jhurliman | 66 | { |
| 93 : | // Return an empty inventory set to mimic OpenSim.Grid.InventoryServer.exe | ||
| 94 : | inventory = new InventoryCollection(); | ||
| 95 : | inventory.UserID = ownerID; | ||
| 96 : | inventory.Folders = new Dictionary<UUID, InventoryFolder>(); | ||
| 97 : | inventory.Items = new Dictionary<UUID, InventoryItem>(); | ||
| 98 : | collectionSerializer.Serialize(response.Body, inventory); | ||
| 99 : | response.Body.Flush(); | ||
| 100 : | } | ||
| 101 : | jhurliman | 49 | else |
| 102 : | { | ||
| 103 : | jhurliman | 66 | response.Status = HttpStatusCode.InternalServerError; |
| 104 : | jhurliman | 49 | } |
| 105 : | } | ||
| 106 : | else | ||
| 107 : | { | ||
| 108 : | jhurliman | 57 | response.Status = HttpStatusCode.BadRequest; |
| 109 : | jhurliman | 49 | } |
| 110 : | jhurliman | 57 | |
| 111 : | return true; | ||
| 112 : | jhurliman | 49 | } |
| 113 : | |||
| 114 : | jhurliman | 57 | bool CreateInventoryHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 115 : | jhurliman | 49 | { |
| 116 : | jhurliman | 57 | UUID ownerID = DeserializeUUID(request.Body); |
| 117 : | jhurliman | 49 | |
| 118 : | if (ownerID != UUID.Zero) | ||
| 119 : | { | ||
| 120 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(ownerID); |
| 121 : | jhurliman | 51 | Logger.Log.DebugFormat("Created URI {0} for inventory creation", owner); |
| 122 : | |||
| 123 : | jhurliman | 49 | InventoryFolder rootFolder = new InventoryFolder("My Inventory", ownerID, UUID.Zero, (short)AssetType.Folder); |
| 124 : | jhurliman | 70 | BackendResponse storageResponse = server.InventoryProvider.TryCreateInventory(owner, rootFolder); |
| 125 : | if (storageResponse == BackendResponse.Success) | ||
| 126 : | jhurliman | 49 | { |
| 127 : | jhurliman | 69 | CreateFolder("Animations", ownerID, rootFolder.ID, AssetType.Animation); |
| 128 : | CreateFolder("Body Parts", ownerID, rootFolder.ID, AssetType.Bodypart); | ||
| 129 : | CreateFolder("Calling Cards", ownerID, rootFolder.ID, AssetType.CallingCard); | ||
| 130 : | CreateFolder("Clothing", ownerID, rootFolder.ID, AssetType.Clothing); | ||
| 131 : | CreateFolder("Gestures", ownerID, rootFolder.ID, AssetType.Gesture); | ||
| 132 : | CreateFolder("Landmarks", ownerID, rootFolder.ID, AssetType.Landmark); | ||
| 133 : | CreateFolder("Lost and Found", ownerID, rootFolder.ID, AssetType.LostAndFoundFolder); | ||
| 134 : | CreateFolder("Notecards", ownerID, rootFolder.ID, AssetType.Notecard); | ||
| 135 : | CreateFolder("Objects", ownerID, rootFolder.ID, AssetType.Object); | ||
| 136 : | CreateFolder("Photo Album", ownerID, rootFolder.ID, AssetType.SnapshotFolder); | ||
| 137 : | CreateFolder("Scripts", ownerID, rootFolder.ID, AssetType.LSLText); | ||
| 138 : | CreateFolder("Sounds", ownerID, rootFolder.ID, AssetType.Sound); | ||
| 139 : | CreateFolder("Textures", ownerID, rootFolder.ID, AssetType.Texture); | ||
| 140 : | CreateFolder("Trash", ownerID, rootFolder.ID, AssetType.TrashFolder); | ||
| 141 : | jhurliman | 49 | |
| 142 : | jhurliman | 57 | SerializeBool(response.Body, true); |
| 143 : | return true; | ||
| 144 : | jhurliman | 49 | } |
| 145 : | } | ||
| 146 : | |||
| 147 : | jhurliman | 57 | SerializeBool(response.Body, false); |
| 148 : | return true; | ||
| 149 : | jhurliman | 49 | } |
| 150 : | |||
| 151 : | jhurliman | 57 | bool NewFolderHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 152 : | jhurliman | 49 | { |
| 153 : | UUID agentID, sessionID; | ||
| 154 : | jhurliman | 57 | InventoryFolder folder = DeserializeFolder(request.Body, out agentID, out sessionID); |
| 155 : | jhurliman | 49 | |
| 156 : | jhurliman | 66 | if (folder != null) |
| 157 : | jhurliman | 49 | { |
| 158 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(folder.Owner); |
| 159 : | |||
| 160 : | jhurliman | 49 | // Some calls that are moving or updating a folder instead of creating a new one |
| 161 : | // will pass in an InventoryFolder without the name set. If this is the case we | ||
| 162 : | // need to look up the name first | ||
| 163 : | if (String.IsNullOrEmpty(folder.Name)) | ||
| 164 : | { | ||
| 165 : | InventoryFolder oldFolder; | ||
| 166 : | jhurliman | 70 | if (server.InventoryProvider.TryFetchFolder(owner, folder.ID, out oldFolder) == BackendResponse.Success) |
| 167 : | jhurliman | 49 | folder.Name = oldFolder.Name; |
| 168 : | } | ||
| 169 : | |||
| 170 : | jhurliman | 70 | BackendResponse storageResponse = server.InventoryProvider.TryCreateFolder(owner, folder); |
| 171 : | jhurliman | 49 | |
| 172 : | jhurliman | 70 | if (storageResponse == BackendResponse.Success) |
| 173 : | jhurliman | 49 | { |
| 174 : | jhurliman | 57 | SerializeBool(response.Body, true); |
| 175 : | return true; | ||
| 176 : | jhurliman | 49 | } |
| 177 : | } | ||
| 178 : | |||
| 179 : | jhurliman | 57 | SerializeBool(response.Body, false); |
| 180 : | return true; | ||
| 181 : | jhurliman | 49 | } |
| 182 : | |||
| 183 : | jhurliman | 57 | bool UpdateFolderHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 184 : | jhurliman | 49 | { |
| 185 : | jhurliman | 57 | return NewFolderHandler(client, request, response); |
| 186 : | jhurliman | 49 | } |
| 187 : | |||
| 188 : | jhurliman | 57 | bool MoveFolderHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 189 : | jhurliman | 49 | { |
| 190 : | jhurliman | 57 | return NewFolderHandler(client, request, response); |
| 191 : | jhurliman | 49 | } |
| 192 : | |||
| 193 : | jhurliman | 57 | bool PurgeFolderHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 194 : | jhurliman | 49 | { |
| 195 : | UUID agentID, sessionID; | ||
| 196 : | jhurliman | 57 | InventoryFolder folder = DeserializeFolder(request.Body, out agentID, out sessionID); |
| 197 : | jhurliman | 49 | |
| 198 : | jhurliman | 66 | if (folder != null) |
| 199 : | jhurliman | 49 | { |
| 200 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(folder.Owner); |
| 201 : | jhurliman | 70 | BackendResponse storageResponse = server.InventoryProvider.TryPurgeFolder(owner, folder.ID); |
| 202 : | jhurliman | 49 | |
| 203 : | jhurliman | 70 | if (storageResponse == BackendResponse.Success) |
| 204 : | jhurliman | 49 | { |
| 205 : | jhurliman | 57 | SerializeBool(response.Body, true); |
| 206 : | return true; | ||
| 207 : | jhurliman | 49 | } |
| 208 : | } | ||
| 209 : | |||
| 210 : | jhurliman | 57 | SerializeBool(response.Body, false); |
| 211 : | return true; | ||
| 212 : | jhurliman | 49 | } |
| 213 : | |||
| 214 : | jhurliman | 57 | bool NewItemHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 215 : | jhurliman | 49 | { |
| 216 : | UUID agentID, sessionID; | ||
| 217 : | jhurliman | 57 | InventoryItem item = DeserializeItem(request.Body, out agentID, out sessionID); |
| 218 : | jhurliman | 49 | |
| 219 : | if (item != null) | ||
| 220 : | { | ||
| 221 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(agentID); |
| 222 : | jhurliman | 70 | BackendResponse storageResponse = server.InventoryProvider.TryCreateItem(owner, item); |
| 223 : | jhurliman | 49 | |
| 224 : | jhurliman | 70 | if (storageResponse == BackendResponse.Success) |
| 225 : | jhurliman | 49 | { |
| 226 : | jhurliman | 57 | SerializeBool(response.Body, true); |
| 227 : | return true; | ||
| 228 : | jhurliman | 49 | } |
| 229 : | } | ||
| 230 : | |||
| 231 : | jhurliman | 57 | SerializeBool(response.Body, false); |
| 232 : | return true; | ||
| 233 : | jhurliman | 49 | } |
| 234 : | |||
| 235 : | jhurliman | 57 | bool DeleteItemHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 236 : | jhurliman | 49 | { |
| 237 : | UUID agentID, sessionID; | ||
| 238 : | jhurliman | 57 | InventoryItem item = DeserializeItem(request.Body, out agentID, out sessionID); |
| 239 : | jhurliman | 49 | |
| 240 : | jhurliman | 66 | if (item != null) |
| 241 : | jhurliman | 49 | { |
| 242 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(item.Owner); |
| 243 : | jhurliman | 70 | BackendResponse storageResponse = server.InventoryProvider.TryDeleteItem(owner, item.ID); |
| 244 : | jhurliman | 49 | |
| 245 : | jhurliman | 70 | if (storageResponse == BackendResponse.Success) |
| 246 : | jhurliman | 49 | { |
| 247 : | jhurliman | 57 | SerializeBool(response.Body, true); |
| 248 : | return true; | ||
| 249 : | jhurliman | 49 | } |
| 250 : | } | ||
| 251 : | |||
| 252 : | jhurliman | 57 | SerializeBool(response.Body, false); |
| 253 : | return true; | ||
| 254 : | jhurliman | 49 | } |
| 255 : | |||
| 256 : | jhurliman | 57 | bool RootFoldersHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 257 : | jhurliman | 49 | { |
| 258 : | jhurliman | 57 | UUID ownerID = DeserializeUUID(request.Body); |
| 259 : | jhurliman | 49 | |
| 260 : | if (ownerID != UUID.Zero) | ||
| 261 : | { | ||
| 262 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(ownerID); |
| 263 : | List<InventoryFolder> skeleton; | ||
| 264 : | jhurliman | 70 | BackendResponse storageResponse = server.InventoryProvider.TryFetchFolderList(owner, out skeleton); |
| 265 : | jhurliman | 49 | |
| 266 : | jhurliman | 70 | if (storageResponse == BackendResponse.Success) |
| 267 : | jhurliman | 66 | { |
| 268 : | SerializeFolderList(response.Body, skeleton); | ||
| 269 : | jhurliman | 49 | } |
| 270 : | jhurliman | 70 | else if (storageResponse == BackendResponse.NotFound) |
| 271 : | jhurliman | 66 | { |
| 272 : | // Return an empty set of inventory so the requester knows that | ||
| 273 : | // an inventory needs to be created for this agent | ||
| 274 : | SerializeFolderList(response.Body, new List<InventoryFolder>(0)); | ||
| 275 : | } | ||
| 276 : | jhurliman | 49 | else |
| 277 : | { | ||
| 278 : | jhurliman | 66 | response.Status = HttpStatusCode.InternalServerError; |
| 279 : | jhurliman | 49 | } |
| 280 : | } | ||
| 281 : | else | ||
| 282 : | { | ||
| 283 : | jhurliman | 57 | response.Status = HttpStatusCode.BadRequest; |
| 284 : | jhurliman | 49 | } |
| 285 : | jhurliman | 57 | |
| 286 : | return true; | ||
| 287 : | jhurliman | 49 | } |
| 288 : | |||
| 289 : | jhurliman | 57 | bool ActiveGesturesHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 290 : | jhurliman | 49 | { |
| 291 : | jhurliman | 57 | UUID ownerID = DeserializeUUID(request.Body); |
| 292 : | jhurliman | 49 | |
| 293 : | jhurliman | 51 | if (ownerID != UUID.Zero) |
| 294 : | jhurliman | 49 | { |
| 295 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(ownerID); |
| 296 : | List<InventoryItem> gestures; | ||
| 297 : | jhurliman | 70 | BackendResponse storageResponse = server.InventoryProvider.TryFetchActiveGestures(owner, out gestures); |
| 298 : | jhurliman | 49 | |
| 299 : | jhurliman | 70 | if (storageResponse == BackendResponse.Success) |
| 300 : | jhurliman | 66 | { |
| 301 : | SerializeItemList(response.Body, gestures); | ||
| 302 : | jhurliman | 49 | } |
| 303 : | jhurliman | 70 | else if (storageResponse == BackendResponse.NotFound) |
| 304 : | jhurliman | 66 | { |
| 305 : | // Return an empty set of gestures to match OpenSim.Grid.InventoryServer.exe behavior | ||
| 306 : | SerializeItemList(response.Body, new List<InventoryItem>(0)); | ||
| 307 : | } | ||
| 308 : | jhurliman | 49 | else |
| 309 : | { | ||
| 310 : | jhurliman | 66 | response.Status = HttpStatusCode.InternalServerError; |
| 311 : | jhurliman | 49 | } |
| 312 : | } | ||
| 313 : | else | ||
| 314 : | { | ||
| 315 : | jhurliman | 57 | response.Status = HttpStatusCode.BadRequest; |
| 316 : | jhurliman | 49 | } |
| 317 : | jhurliman | 57 | |
| 318 : | return true; | ||
| 319 : | jhurliman | 49 | } |
| 320 : | |||
| 321 : | jhurliman | 70 | BackendResponse CreateFolder(string name, UUID ownerID, UUID parentID, AssetType assetType) |
| 322 : | jhurliman | 49 | { |
| 323 : | InventoryFolder folder = new InventoryFolder(name, ownerID, parentID, (short)assetType); | ||
| 324 : | jhurliman | 66 | Uri owner = Utils.GetOpenSimUri(ownerID); |
| 325 : | jhurliman | 69 | return server.InventoryProvider.TryCreateFolder(owner, folder); |
| 326 : | jhurliman | 49 | } |
| 327 : | |||
| 328 : | UUID DeserializeUUID(Stream stream) | ||
| 329 : | { | ||
| 330 : | UUID id = UUID.Zero; | ||
| 331 : | |||
| 332 : | try | ||
| 333 : | { | ||
| 334 : | using (XmlReader reader = XmlReader.Create(stream)) | ||
| 335 : | { | ||
| 336 : | reader.MoveToContent(); | ||
| 337 : | UUID.TryParse(reader.ReadElementContentAsString("guid", String.Empty), out id); | ||
| 338 : | } | ||
| 339 : | } | ||
| 340 : | catch (Exception ex) | ||
| 341 : | { | ||
| 342 : | Logger.Log.Warn("Failed to parse POST data (expecting guid): " + ex.Message); | ||
| 343 : | } | ||
| 344 : | |||
| 345 : | return id; | ||
| 346 : | } | ||
| 347 : | |||
| 348 : | UUID DeserializeUUID(Stream stream, out UUID agentID, out UUID sessionID) | ||
| 349 : | { | ||
| 350 : | UUID id; | ||
| 351 : | |||
| 352 : | try | ||
| 353 : | { | ||
| 354 : | using (XmlReader reader = XmlReader.Create(stream)) | ||
| 355 : | { | ||
| 356 : | reader.MoveToContent(); | ||
| 357 : | reader.ReadStartElement("RestSessionObjectOfGuid"); | ||
| 358 : | UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); | ||
| 359 : | UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); | ||
| 360 : | UUID.TryParse(reader.ReadElementContentAsString("Body", String.Empty), out id); | ||
| 361 : | reader.ReadEndElement(); | ||
| 362 : | } | ||
| 363 : | } | ||
| 364 : | catch (Exception ex) | ||
| 365 : | { | ||
| 366 : | Logger.Log.Warn("Failed to parse GetInventory POST data: " + ex.Message); | ||
| 367 : | agentID = UUID.Zero; | ||
| 368 : | sessionID = UUID.Zero; | ||
| 369 : | return UUID.Zero; | ||
| 370 : | } | ||
| 371 : | |||
| 372 : | return id; | ||
| 373 : | } | ||
| 374 : | |||
| 375 : | InventoryFolder DeserializeFolder(Stream stream, out UUID agentID, out UUID sessionID) | ||
| 376 : | { | ||
| 377 : | InventoryFolder folder = new InventoryFolder(); | ||
| 378 : | |||
| 379 : | try | ||
| 380 : | { | ||
| 381 : | using (XmlReader reader = XmlReader.Create(stream)) | ||
| 382 : | { | ||
| 383 : | reader.MoveToContent(); | ||
| 384 : | reader.ReadStartElement("RestSessionObjectOfInventoryFolderBase"); | ||
| 385 : | UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); | ||
| 386 : | UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); | ||
| 387 : | reader.ReadStartElement("Body"); | ||
| 388 : | if (reader.Name == "Name") | ||
| 389 : | folder.Name = reader.ReadElementContentAsString("Name", String.Empty); | ||
| 390 : | else | ||
| 391 : | folder.Name = String.Empty; | ||
| 392 : | ReadUUID(reader, "Owner", out folder.Owner); | ||
| 393 : | ReadUUID(reader, "ParentID", out folder.ParentID); | ||
| 394 : | ReadUUID(reader, "ID", out folder.ID); | ||
| 395 : | Int16.TryParse(reader.ReadElementContentAsString("Type", String.Empty), out folder.Type); | ||
| 396 : | UInt16.TryParse(reader.ReadElementContentAsString("Version", String.Empty), out folder.Version); | ||
| 397 : | reader.ReadEndElement(); | ||
| 398 : | reader.ReadEndElement(); | ||
| 399 : | } | ||
| 400 : | } | ||
| 401 : | catch (Exception ex) | ||
| 402 : | { | ||
| 403 : | Logger.Log.Warn("Failed to parse POST data (expecting InventoryFolderBase): " + ex.Message); | ||
| 404 : | agentID = UUID.Zero; | ||
| 405 : | sessionID = UUID.Zero; | ||
| 406 : | return null; | ||
| 407 : | } | ||
| 408 : | |||
| 409 : | return folder; | ||
| 410 : | } | ||
| 411 : | |||
| 412 : | InventoryItem DeserializeItem(Stream stream, out UUID agentID, out UUID sessionID) | ||
| 413 : | { | ||
| 414 : | InventoryItem item = new InventoryItem(); | ||
| 415 : | |||
| 416 : | try | ||
| 417 : | { | ||
| 418 : | using (XmlReader reader = XmlReader.Create(stream)) | ||
| 419 : | { | ||
| 420 : | reader.MoveToContent(); | ||
| 421 : | reader.ReadStartElement("RestSessionObjectOfInventoryItemBase"); | ||
| 422 : | UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); | ||
| 423 : | UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); | ||
| 424 : | reader.ReadStartElement("Body"); | ||
| 425 : | ReadUUID(reader, "ID", out item.ID); | ||
| 426 : | Int32.TryParse(reader.ReadElementContentAsString("InvType", String.Empty), out item.InvType); | ||
| 427 : | ReadUUID(reader, "Folder", out item.Folder); | ||
| 428 : | ReadUUID(reader, "Owner", out item.Owner); | ||
| 429 : | ReadUUID(reader, "Creator", out item.Creator); | ||
| 430 : | item.Name = reader.ReadElementContentAsString("Name", String.Empty); | ||
| 431 : | item.Description = reader.ReadElementContentAsString("Description", String.Empty); | ||
| 432 : | UInt32.TryParse(reader.ReadElementContentAsString("NextPermissions", String.Empty), out item.NextPermissions); | ||
| 433 : | UInt32.TryParse(reader.ReadElementContentAsString("CurrentPermissions", String.Empty), out item.CurrentPermissions); | ||
| 434 : | UInt32.TryParse(reader.ReadElementContentAsString("BasePermissions", String.Empty), out item.BasePermissions); | ||
| 435 : | UInt32.TryParse(reader.ReadElementContentAsString("EveryOnePermissions", String.Empty), out item.EveryOnePermissions); | ||
| 436 : | UInt32.TryParse(reader.ReadElementContentAsString("GroupPermissions", String.Empty), out item.GroupPermissions); | ||
| 437 : | Int32.TryParse(reader.ReadElementContentAsString("AssetType", String.Empty), out item.AssetType); | ||
| 438 : | ReadUUID(reader, "AssetID", out item.AssetID); | ||
| 439 : | ReadUUID(reader, "GroupID", out item.GroupID); | ||
| 440 : | Boolean.TryParse(reader.ReadElementContentAsString("GroupOwned", String.Empty), out item.GroupOwned); | ||
| 441 : | Int32.TryParse(reader.ReadElementContentAsString("SalePrice", String.Empty), out item.SalePrice); | ||
| 442 : | Byte.TryParse(reader.ReadElementContentAsString("SaleType", String.Empty), out item.SaleType); | ||
| 443 : | UInt32.TryParse(reader.ReadElementContentAsString("Flags", String.Empty), out item.Flags); | ||
| 444 : | Int32.TryParse(reader.ReadElementContentAsString("CreationDate", String.Empty), out item.CreationDate); | ||
| 445 : | reader.ReadEndElement(); | ||
| 446 : | reader.ReadEndElement(); | ||
| 447 : | } | ||
| 448 : | } | ||
| 449 : | catch (Exception ex) | ||
| 450 : | { | ||
| 451 : | Logger.Log.Warn("Failed to parse POST data (expecting InventoryItemBase): " + ex.Message); | ||
| 452 : | agentID = UUID.Zero; | ||
| 453 : | sessionID = UUID.Zero; | ||
| 454 : | return null; | ||
| 455 : | } | ||
| 456 : | |||
| 457 : | return item; | ||
| 458 : | } | ||
| 459 : | |||
| 460 : | void SerializeBool(Stream stream, bool value) | ||
| 461 : | { | ||
| 462 : | using (XmlWriter writer = XmlWriter.Create(stream)) | ||
| 463 : | { | ||
| 464 : | writer.WriteStartDocument(); | ||
| 465 : | writer.WriteStartElement("boolean"); | ||
| 466 : | writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); | ||
| 467 : | writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); | ||
| 468 : | writer.WriteString(value.ToString().ToLower()); | ||
| 469 : | writer.WriteEndElement(); | ||
| 470 : | writer.WriteEndDocument(); | ||
| 471 : | writer.Flush(); | ||
| 472 : | } | ||
| 473 : | |||
| 474 : | stream.Flush(); | ||
| 475 : | } | ||
| 476 : | |||
| 477 : | void SerializeFolderList(Stream stream, List<InventoryFolder> folders) | ||
| 478 : | { | ||
| 479 : | using (XmlWriter writer = XmlWriter.Create(stream)) | ||
| 480 : | { | ||
| 481 : | writer.WriteStartDocument(); | ||
| 482 : | writer.WriteStartElement("ArrayOfInventoryFolderBase"); | ||
| 483 : | writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); | ||
| 484 : | writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); | ||
| 485 : | foreach (InventoryFolder folder in folders) | ||
| 486 : | { | ||
| 487 : | writer.WriteStartElement("InventoryFolderBase"); | ||
| 488 : | writer.WriteElementString("Name", folder.Name); | ||
| 489 : | WriteUUID(writer, "Owner", folder.Owner); | ||
| 490 : | WriteUUID(writer, "ParentID", folder.ParentID); | ||
| 491 : | WriteUUID(writer, "ID", folder.ID); | ||
| 492 : | writer.WriteElementString("Type", XmlConvert.ToString(folder.Type)); | ||
| 493 : | writer.WriteElementString("Version", XmlConvert.ToString(folder.Version)); | ||
| 494 : | writer.WriteEndElement(); | ||
| 495 : | } | ||
| 496 : | writer.WriteEndElement(); | ||
| 497 : | writer.WriteEndDocument(); | ||
| 498 : | |||
| 499 : | writer.Flush(); | ||
| 500 : | } | ||
| 501 : | |||
| 502 : | stream.Flush(); | ||
| 503 : | } | ||
| 504 : | |||
| 505 : | void SerializeItemList(Stream stream, List<InventoryItem> items) | ||
| 506 : | { | ||
| 507 : | using (XmlWriter writer = XmlWriter.Create(stream)) | ||
| 508 : | { | ||
| 509 : | writer.WriteStartDocument(); | ||
| 510 : | writer.WriteStartElement("ArrayOfInventoryItemBase"); | ||
| 511 : | writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); | ||
| 512 : | writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); | ||
| 513 : | foreach (InventoryItem item in items) | ||
| 514 : | { | ||
| 515 : | writer.WriteStartElement("InventoryItemBase"); | ||
| 516 : | WriteUUID(writer, "ID", item.ID); | ||
| 517 : | writer.WriteElementString("InvType", XmlConvert.ToString(item.InvType)); | ||
| 518 : | WriteUUID(writer, "Folder", item.Folder); | ||
| 519 : | WriteUUID(writer, "Owner", item.Owner); | ||
| 520 : | WriteUUID(writer, "Creator", item.Creator); | ||
| 521 : | writer.WriteElementString("Name", item.Name); | ||
| 522 : | writer.WriteElementString("Description", item.Description); | ||
| 523 : | writer.WriteElementString("NextPermissions", XmlConvert.ToString(item.NextPermissions)); | ||
| 524 : | writer.WriteElementString("CurrentPermissions", XmlConvert.ToString(item.CurrentPermissions)); | ||
| 525 : | writer.WriteElementString("BasePermissions", XmlConvert.ToString(item.BasePermissions)); | ||
| 526 : | writer.WriteElementString("EveryOnePermissions", XmlConvert.ToString(item.EveryOnePermissions)); | ||
| 527 : | writer.WriteElementString("GroupPermissions", XmlConvert.ToString(item.GroupPermissions)); | ||
| 528 : | writer.WriteElementString("AssetType", XmlConvert.ToString(item.AssetType)); | ||
| 529 : | WriteUUID(writer, "AssetID", item.AssetID); | ||
| 530 : | WriteUUID(writer, "GroupID", item.GroupID); | ||
| 531 : | writer.WriteElementString("GroupOwned", XmlConvert.ToString(item.GroupOwned)); | ||
| 532 : | writer.WriteElementString("SalePrice", XmlConvert.ToString(item.SalePrice)); | ||
| 533 : | writer.WriteElementString("SaleType", XmlConvert.ToString(item.SaleType)); | ||
| 534 : | writer.WriteElementString("Flags", XmlConvert.ToString(item.Flags)); | ||
| 535 : | writer.WriteElementString("CreationDate", XmlConvert.ToString(item.CreationDate)); | ||
| 536 : | writer.WriteEndElement(); | ||
| 537 : | } | ||
| 538 : | writer.WriteEndElement(); | ||
| 539 : | writer.WriteEndDocument(); | ||
| 540 : | |||
| 541 : | writer.Flush(); | ||
| 542 : | } | ||
| 543 : | |||
| 544 : | stream.Flush(); | ||
| 545 : | } | ||
| 546 : | |||
| 547 : | void WriteUUID(XmlWriter writer, string name, UUID id) | ||
| 548 : | { | ||
| 549 : | writer.WriteStartElement(name); | ||
| 550 : | writer.WriteElementString("Guid", XmlConvert.ToString(id.Guid)); | ||
| 551 : | writer.WriteEndElement(); | ||
| 552 : | } | ||
| 553 : | |||
| 554 : | void ReadUUID(XmlReader reader, string name, out UUID id) | ||
| 555 : | { | ||
| 556 : | reader.ReadStartElement(name); | ||
| 557 : | UUID.TryParse(reader.ReadElementContentAsString("Guid", String.Empty), out id); | ||
| 558 : | reader.ReadEndElement(); | ||
| 559 : | } | ||
| 560 : | } | ||
| 561 : | |||
| 562 : | #region OpenSim AssetType | ||
| 563 : | |||
| 564 : | /// <summary> | ||
| 565 : | /// The different types of grid assets | ||
| 566 : | /// </summary> | ||
| 567 : | public enum AssetType : sbyte | ||
| 568 : | { | ||
| 569 : | /// <summary>Unknown asset type</summary> | ||
| 570 : | Unknown = -1, | ||
| 571 : | /// <summary>Texture asset, stores in JPEG2000 J2C stream format</summary> | ||
| 572 : | Texture = 0, | ||
| 573 : | /// <summary>Sound asset</summary> | ||
| 574 : | Sound = 1, | ||
| 575 : | /// <summary>Calling card for another avatar</summary> | ||
| 576 : | CallingCard = 2, | ||
| 577 : | /// <summary>Link to a location in world</summary> | ||
| 578 : | Landmark = 3, | ||
| 579 : | // <summary>Legacy script asset, you should never see one of these</summary> | ||
| 580 : | //[Obsolete] | ||
| 581 : | //Script = 4, | ||
| 582 : | /// <summary>Collection of textures and parameters that can be | ||
| 583 : | /// worn by an avatar</summary> | ||
| 584 : | Clothing = 5, | ||
| 585 : | /// <summary>Primitive that can contain textures, sounds, | ||
| 586 : | /// scripts and more</summary> | ||
| 587 : | Object = 6, | ||
| 588 : | /// <summary>Notecard asset</summary> | ||
| 589 : | Notecard = 7, | ||
| 590 : | /// <summary>Holds a collection of inventory items</summary> | ||
| 591 : | Folder = 8, | ||
| 592 : | /// <summary>Root inventory folder</summary> | ||
| 593 : | RootFolder = 9, | ||
| 594 : | /// <summary>Linden scripting language script</summary> | ||
| 595 : | LSLText = 10, | ||
| 596 : | /// <summary>LSO bytecode for a script</summary> | ||
| 597 : | LSLBytecode = 11, | ||
| 598 : | /// <summary>Uncompressed TGA texture</summary> | ||
| 599 : | TextureTGA = 12, | ||
| 600 : | /// <summary>Collection of textures and shape parameters that can | ||
| 601 : | /// be worn</summary> | ||
| 602 : | Bodypart = 13, | ||
| 603 : | /// <summary>Trash folder</summary> | ||
| 604 : | TrashFolder = 14, | ||
| 605 : | /// <summary>Snapshot folder</summary> | ||
| 606 : | SnapshotFolder = 15, | ||
| 607 : | /// <summary>Lost and found folder</summary> | ||
| 608 : | LostAndFoundFolder = 16, | ||
| 609 : | /// <summary>Uncompressed sound</summary> | ||
| 610 : | SoundWAV = 17, | ||
| 611 : | /// <summary>Uncompressed TGA non-square image, not to be used as a | ||
| 612 : | /// texture</summary> | ||
| 613 : | ImageTGA = 18, | ||
| 614 : | /// <summary>Compressed JPEG non-square image, not to be used as a | ||
| 615 : | /// texture</summary> | ||
| 616 : | ImageJPEG = 19, | ||
| 617 : | /// <summary>Animation</summary> | ||
| 618 : | Animation = 20, | ||
| 619 : | /// <summary>Sequence of animations, sounds, chat, and pauses</summary> | ||
| 620 : | Gesture = 21, | ||
| 621 : | /// <summary>Simstate file</summary> | ||
| 622 : | Simstate = 22, | ||
| 623 : | } | ||
| 624 : | |||
| 625 : | #endregion OpenSim AssetType | ||
| 626 : | } |
| ViewVC Help | |
| Powered by ViewVC 1.0.0 |

