private static void FolderHandler_Post(Request req, string[] elements) { if (req.HttpRequest.ContentType != "application/llsd+xml") { ErrorResponse(req, HttpStatusCode.UnsupportedMediaType, AisErrorCode.UnsupportedMedia, "Unsupported media type"); return; } Map reqmap; try { using (Stream s = req.HttpRequest.Body) { reqmap = (Map)LlsdXml.Deserialize(s); } } catch { ErrorResponse(req, HttpStatusCode.BadRequest, AisErrorCode.InvalidRequest, "Bad request"); return; } InventoryFolder folder; var folderCache = new Dictionary <UUID, InventoryFolder>(); try { if (!TryFindFolder(req, elements[1], out folder, folderCache)) { ErrorResponse(req, HttpStatusCode.NotFound, AisErrorCode.NotFound, "Not Found"); return; } } catch (Exception e) { m_Log.Debug("Exception occured", e); ErrorResponse(req, HttpStatusCode.InternalServerError, AisErrorCode.InternalError, "Internal Server Error"); return; } Map resdata = folder.ToAisV3(req.FullPrefixUrl); resdata.Add("_embedded", reqmap); var created_categories = new AnArray(); var created_items = new AnArray(); var updated_categories = new AnArray(); resdata.Add("_created_categories", created_categories); resdata.Add("_updated_category_versions", updated_categories); resdata.Add("_created_items", created_items); var resfolders = new Map(); var stack = new List <Map> { resdata }; while (stack.Count > 0) { Map processFolder = stack[0]; stack.RemoveAt(0); Map embedded; UUID toParentFolderId = processFolder["category_id"].AsUUID; if (processFolder.TryGetValue("_embedded", out embedded)) { AnArray items; if (embedded.TryGetValue("items", out items)) { var newitems = new Map(); foreach (IValue itemiv in items) { var itemdata = itemiv as Map; if (itemdata == null) { continue; } try { InventoryItem item = itemdata.ItemFromAisV3(req.Agent, toParentFolderId, req.FullPrefixUrl); req.InventoryService.Item.Add(item); created_items.Add(item.ID); if (!updated_categories.Contains(toParentFolderId)) { updated_categories.Add(toParentFolderId); } newitems.Add(item.ID.ToString(), item.ToAisV3(req.FullPrefixUrl)); } catch { /* intentionally left empty */ } } embedded["items"] = newitems; } AnArray links; if (embedded.TryGetValue("links", out links)) { var newlinks = new Map(); foreach (IValue linkiv in links) { var linkdata = linkiv as Map; if (linkdata == null) { continue; } try { InventoryItem link = linkdata.ItemFromAisV3(req.Agent, toParentFolderId, req.FullPrefixUrl); req.InventoryService.Item.Add(link); created_items.Add(link.ID); if (!updated_categories.Contains(toParentFolderId)) { updated_categories.Add(toParentFolderId); } newlinks.Add(link.ID.ToString(), link.ToAisV3(req.FullPrefixUrl)); } catch { /* intentionally left empty */ } } embedded["links"] = newlinks; } AnArray categories; if (embedded.TryGetValue("categories", out categories)) { var newcategories = new Map(); foreach (IValue categoryiv in categories) { var categorydata = categoryiv as Map; if (categorydata == null) { continue; } try { InventoryFolder newfolder = categorydata.CategoryFromAisV3(req.Agent, toParentFolderId, req.FullPrefixUrl); req.InventoryService.Folder.Add(newfolder); created_categories.Add(newfolder.ID); stack.Add(categorydata); if (!updated_categories.Contains(toParentFolderId)) { updated_categories.Add(toParentFolderId); } newcategories.Add(newfolder.ID.ToString(), newfolder.ToAisV3(req.FullPrefixUrl)); } catch { /* intentionally left empty */ } } embedded["categories"] = newcategories; } } } SuccessResponse(req, HttpStatusCode.Created, resdata, req.FullPrefixUrl + "/category/" + folder.ID.ToString() + "/children"); }