private static InventoryFolderWithChildren BuildInventoryHierarchy(ref InventoryCollection inventory) { m_log.DebugFormat("[INVENTORYARCHIVE]: Building inventory hierarchy"); InventoryFolderWithChildren rootFolder = null; foreach (InventoryFolderWithChildren parentFolder in inventory.Folders.Values) { // Grab the root folder, it has no parents. if (UUID.Zero == parentFolder.ParentID) { rootFolder = parentFolder; } foreach (InventoryFolderWithChildren folder in inventory.Folders.Values) { if (parentFolder.ID == folder.ParentID) { parentFolder.Children.Add(folder.ID, folder); } } foreach (InventoryItemBase item in inventory.Items.Values) { if (parentFolder.ID == item.Folder) { parentFolder.Children.Add(item.ID, item); } } } return(rootFolder); }
public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) { UUID agentID, sessionID; InventoryFolderWithChildren folder = DeserializeFolder(httpRequest.InputStream, out agentID, out sessionID); if (folder != null) { Uri owner = Utils.GetOpenSimUri(folder.Owner); // Some calls that are moving or updating a folder instead // of creating a new one will pass in an InventoryFolder // without the name set and type set to 0. If this is the // case we need to look up the name first and preserver // it's type. if (String.IsNullOrEmpty(folder.Name)) { InventoryFolderWithChildren oldFolder; if (m_server.InventoryProvider.TryFetchFolder(owner, folder.ID, out oldFolder) == BackendResponse.Success) { folder.Name = oldFolder.Name; folder.Type = oldFolder.Type; } } BackendResponse storageResponse = m_server.InventoryProvider.TryCreateFolder(owner, folder); if (storageResponse == BackendResponse.Success) { return SerializeBool(true); } } return SerializeBool(false); }
public BackendResponse TryPurgeFolder(Uri owner, UUID folderID) { BackendResponse ret; InventoryCollection collection; InventoryFolderWithChildren folder; if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) { // Delete all of the folder children foreach (InventoryNodeBase obj in new List <InventoryNodeBase>(folder.Children.Values)) { if (obj is InventoryItemBase) { TryDeleteItem(owner, (obj as InventoryItemBase).ID); } else { InventoryFolderWithChildren childFolder = obj as InventoryFolderWithChildren; TryPurgeFolder(owner, childFolder.ID); TryDeleteFolder(owner, childFolder.ID); } } ret = BackendResponse.Success; } else { ret = BackendResponse.NotFound; } server.MetricsProvider.LogInventoryPurgeFolder(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); return(ret); }
public BackendResponse TryFetchFolderList(Uri owner, out List <InventoryFolderWithChildren> folders) { folders = new List <InventoryFolderWithChildren>(); BackendResponse ret; UUID ownerID; if (Utils.TryGetOpenSimUUID(owner, out ownerID)) { List <InventoryFolderBase> baseFolders = m_inventoryService.GetInventorySkeleton(ownerID); foreach (InventoryFolderBase baseFolder in baseFolders) { InventoryFolderWithChildren folder = new InventoryFolderWithChildren(baseFolder); //folder.Children = null; // This call does not create a folder hierarchy folders.Add(folder); } ret = BackendResponse.Success; } else { folders = null; ret = BackendResponse.NotFound; } m_server.MetricsProvider.LogInventoryFetchFolderList(EXTENSION_NAME, ret, owner, DateTime.Now); return(ret); }
public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) { UUID ownerID = DeserializeUUID(httpRequest.InputStream); if (ownerID != UUID.Zero) { Uri owner = Utils.GetOpenSimUri(ownerID); m_log.DebugFormat("[OPENSIMINVENTORYFRONTEND]: Created URI {0} for inventory creation", owner); InventoryFolderWithChildren rootFolder = new InventoryFolderWithChildren("My Inventory", ownerID, UUID.Zero, (short)AssetType.Folder); BackendResponse storageResponse = m_server.InventoryProvider.TryCreateInventory(owner, rootFolder); if (storageResponse == BackendResponse.Success) { // TODO: The CreateFolder calls need to be executed in SimpleStorage. //CreateFolder("Animations", ownerID, rootFolder.ID, AssetType.Animation); //CreateFolder("Body Parts", ownerID, rootFolder.ID, AssetType.Bodypart); //CreateFolder("Calling Cards", ownerID, rootFolder.ID, AssetType.CallingCard); //CreateFolder("Clothing", ownerID, rootFolder.ID, AssetType.Clothing); //CreateFolder("Gestures", ownerID, rootFolder.ID, AssetType.Gesture); //CreateFolder("Landmarks", ownerID, rootFolder.ID, AssetType.Landmark); //CreateFolder("Lost and Found", ownerID, rootFolder.ID, AssetType.LostAndFoundFolder); //CreateFolder("Notecards", ownerID, rootFolder.ID, AssetType.Notecard); //CreateFolder("Objects", ownerID, rootFolder.ID, AssetType.Object); //CreateFolder("Photo Album", ownerID, rootFolder.ID, AssetType.SnapshotFolder); //CreateFolder("Scripts", ownerID, rootFolder.ID, AssetType.LSLText); //CreateFolder("Sounds", ownerID, rootFolder.ID, AssetType.Sound); //CreateFolder("Textures", ownerID, rootFolder.ID, AssetType.Texture); //CreateFolder("Trash", ownerID, rootFolder.ID, AssetType.TrashFolder); return SerializeBool(true); } } return SerializeBool(false); }
public BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder) { BackendResponse ret; // TODO: implement some logic for "folder not found" folder = m_inventoryService.GetInventoryFolder(folderID); ret = BackendResponse.Success; m_server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); return(ret); }
void SaveFolder(InventoryFolderWithChildren folder) { string filename = String.Format("{0}-{1}.folder", SanitizeFilename(folder.Name), folder.ID); string path = Path.Combine(DEFAULT_INVENTORY_DIR, folder.Owner.ToString()); path = Path.Combine(path, filename); using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write)) { folderSerializer.Serialize(stream, folder); stream.Flush(); } }
public BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder) { folder = null; BackendResponse ret; InventoryCollection collection; if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) ret = BackendResponse.Success; else ret = BackendResponse.NotFound; server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); return ret; }
public BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder) { BackendResponse ret; lock (inventories) { if (!inventories.ContainsKey(owner)) { InventoryCollection collection = new InventoryCollection(); collection.UserID = rootFolder.Owner; collection.Folders = new Dictionary <UUID, InventoryFolderWithChildren>(); collection.Folders.Add(rootFolder.ID, rootFolder); collection.Items = new Dictionary <UUID, InventoryItemBase>(); inventories.Add(owner, collection); ret = BackendResponse.Success; } else { ret = BackendResponse.Failure; } } if (ret == BackendResponse.Success) { string path = Path.Combine(DEFAULT_INVENTORY_DIR, rootFolder.Owner.ToString()); try { // Create the directory for this agent Directory.CreateDirectory(path); // Create an index.txt containing the UUID and URI for this agent string[] index = new string[] { rootFolder.Owner.ToString(), owner.ToString() }; File.WriteAllLines(Path.Combine(path, "index.txt"), index); // Create the root folder file SaveFolder(rootFolder); } catch (Exception ex) { m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); ret = BackendResponse.Failure; } } server.MetricsProvider.LogInventoryCreateInventory(EXTENSION_NAME, ret, DateTime.Now); return(ret); }
private static InventoryFolderWithChildren DeserializeFolder(Stream stream, out UUID agentID, out UUID sessionID) { InventoryFolderWithChildren folder = new InventoryFolderWithChildren(); try { using (XmlReader reader = XmlReader.Create(stream)) { reader.MoveToContent(); reader.ReadStartElement("RestSessionObjectOfInventoryFolderBase"); UUID.TryParse(reader.ReadElementContentAsString("SessionID", String.Empty), out sessionID); UUID.TryParse(reader.ReadElementContentAsString("AvatarID", String.Empty), out agentID); reader.ReadStartElement("Body"); if (reader.Name == "Name") folder.Name = reader.ReadElementContentAsString("Name", String.Empty); else folder.Name = String.Empty; UUID dummyUUID; ReadUUID(reader, "ID", out dummyUUID); folder.ID = dummyUUID; ReadUUID(reader, "Owner", out dummyUUID); folder.Owner = dummyUUID; ReadUUID(reader, "ParentID", out dummyUUID); folder.ParentID = dummyUUID; short dummyType; Int16.TryParse(reader.ReadElementContentAsString("Type", String.Empty), out dummyType); folder.Type = dummyType; ushort dummyVersion; UInt16.TryParse(reader.ReadElementContentAsString("Version", String.Empty), out dummyVersion); folder.Version = dummyVersion; reader.ReadEndElement(); reader.ReadEndElement(); } } catch (Exception ex) { m_log.Warn("[OPENSIMINVENTORYFRONTEND]: Failed to parse POST data (expecting InventoryFolderBase): " + ex.Message); agentID = UUID.Zero; sessionID = UUID.Zero; return null; } return folder; }
public BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder) { BackendResponse ret; if (m_inventoryService.AddFolder(folder)) { ret = BackendResponse.Success; } else { ret = BackendResponse.Failure; } m_server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, true, DateTime.Now); return(ret); }
public BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder) { BackendResponse ret; InventoryCollection collection; if (inventories.TryGetValue(owner, out collection)) { // Delete this folder first if it already exists InventoryFolderWithChildren oldFolder; if (collection.Folders.TryGetValue(folder.ID, out oldFolder)) { TryDeleteFolder(owner, folder.ID); } try { // Create the file SaveFolder(folder); // Add the folder to the collection lock (collection) collection.Folders[folder.ID] = folder; // Add the folder to its parent folder InventoryFolderWithChildren parent; if (collection.Folders.TryGetValue(folder.ParentID, out parent)) { lock (parent.Children) parent.Children.Add(folder.ID, folder); } ret = BackendResponse.Success; } catch (Exception ex) { m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); ret = BackendResponse.Failure; } } else { ret = BackendResponse.NotFound; } server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, true, DateTime.Now); return(ret); }
public InventoryFolderWithChildren GetInventoryFolder(UUID folderID) { InventoryFolderBase baseFolder = null; InventoryFolderWithChildren folder = null; foreach (IInventoryDataPlugin plugin in m_plugins) { baseFolder = plugin.getInventoryFolder(folderID); } if (null != baseFolder) { folder = new InventoryFolderWithChildren(baseFolder); folder.Children = null; // This call only returns data for the folder itself, no children data } return folder; }
public InventoryFolderWithChildren GetInventoryFolder(UUID folderID) { InventoryFolderBase baseFolder = null; InventoryFolderWithChildren folder = null; foreach (IInventoryDataPlugin plugin in m_plugins) { baseFolder = plugin.getInventoryFolder(folderID); } if (null != baseFolder) { folder = new InventoryFolderWithChildren(baseFolder); folder.Children = null; // This call only returns data for the folder itself, no children data } return(folder); }
private static void WriteInventoryFolderToArchive( TarArchiveWriter archive, InventoryFolderWithChildren folder, string path) { path += string.Format("{0}{1}{2}/", folder.Name, ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, folder.ID); archive.WriteDir(path); foreach (InventoryNodeBase inventoryNode in folder.Children.Values) { if (inventoryNode is InventoryFolderWithChildren) { WriteInventoryFolderToArchive(archive, (InventoryFolderWithChildren)inventoryNode, path); } else if (inventoryNode is InventoryItemBase) { WriteInventoryItemToArchive(archive, (InventoryItemBase)inventoryNode, path); } } }
public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) { UUID agentID, sessionID; InventoryFolderWithChildren folder = DeserializeFolder(httpRequest.InputStream, out agentID, out sessionID); if (folder != null) { Uri owner = Utils.GetOpenSimUri(folder.Owner); BackendResponse storageResponse = m_server.InventoryProvider.TryPurgeFolder(owner, folder.ID); if (storageResponse == BackendResponse.Success) { return SerializeBool(true); } } return SerializeBool(false); }
public BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder) { folder = null; BackendResponse ret; InventoryCollection collection; if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) { ret = BackendResponse.Success; } else { ret = BackendResponse.NotFound; } server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); return(ret); }
public BackendResponse TryFetchFolderContents(Uri owner, UUID folderID, out InventoryCollection contents) { contents = null; BackendResponse ret; InventoryCollection collection; InventoryFolderWithChildren folder; if (inventories.TryGetValue(owner, out collection) && collection.Folders.TryGetValue(folderID, out folder)) { contents = new InventoryCollection(); contents.UserID = collection.UserID; contents.Folders = new Dictionary <UUID, InventoryFolderWithChildren>(); contents.Items = new Dictionary <UUID, InventoryItemBase>(); foreach (InventoryNodeBase invBase in folder.Children.Values) { if (invBase is InventoryItemBase) { InventoryItemBase invItem = invBase as InventoryItemBase; contents.Items.Add(invItem.ID, invItem); } else { InventoryFolderWithChildren invFolder = invBase as InventoryFolderWithChildren; contents.Folders.Add(invFolder.ID, invFolder); } } ret = BackendResponse.Success; } else { ret = BackendResponse.NotFound; } server.MetricsProvider.LogInventoryFetchFolderContents(EXTENSION_NAME, ret, owner, folderID, DateTime.Now); return(ret); }
public BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder) { BackendResponse ret; UUID ownerID; if (Utils.TryGetOpenSimUUID(owner, out ownerID)) { if (m_inventoryService.CreateNewUserInventory(ownerID)) { ret = BackendResponse.Success; } else { ret = BackendResponse.Failure; } } else { ret = BackendResponse.Failure; } return(ret); }
private static byte[] ArchiveInventoryCollection(InventoryCollection inventory) { byte[] buffer = new byte[] {}; // Fill in each folder's Children dictionary. InventoryFolderWithChildren rootFolder = BuildInventoryHierarchy(ref inventory); // TODO: It's probably a bad idea to tar to memory for large // inventories. MemoryStream ms = new MemoryStream(); GZipStream gzs = new GZipStream(ms, CompressionMode.Compress, true); TarArchiveWriter archive = new TarArchiveWriter(gzs); WriteInventoryFolderToArchive(archive, rootFolder, ArchiveConstants.INVENTORY_PATH); archive.Close(); ms.Seek(0, SeekOrigin.Begin); buffer = ms.GetBuffer(); Array.Resize <byte>(ref buffer, (int)ms.Length); ms.Close(); return(buffer); }
public BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder) { BackendResponse ret; UUID ownerID; if (Utils.TryGetOpenSimUUID(owner, out ownerID)) { if (m_inventoryService.CreateNewUserInventory(ownerID)) { ret = BackendResponse.Success; } else { ret = BackendResponse.Failure; } } else { ret = BackendResponse.Failure; } return ret; }
public BackendResponse TryCreateInventory(Uri owner, InventoryFolderWithChildren rootFolder) { BackendResponse ret; lock (inventories) { if (!inventories.ContainsKey(owner)) { InventoryCollection collection = new InventoryCollection(); collection.UserID = rootFolder.Owner; collection.Folders = new Dictionary<UUID, InventoryFolderWithChildren>(); collection.Folders.Add(rootFolder.ID, rootFolder); collection.Items = new Dictionary<UUID, InventoryItemBase>(); inventories.Add(owner, collection); ret = BackendResponse.Success; } else { ret = BackendResponse.Failure; } } if (ret == BackendResponse.Success) { string path = Path.Combine(DEFAULT_INVENTORY_DIR, rootFolder.Owner.ToString()); try { // Create the directory for this agent Directory.CreateDirectory(path); // Create an index.txt containing the UUID and URI for this agent string[] index = new string[] { rootFolder.Owner.ToString(), owner.ToString() }; File.WriteAllLines(Path.Combine(path, "index.txt"), index); // Create the root folder file SaveFolder(rootFolder); } catch (Exception ex) { m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); ret = BackendResponse.Failure; } } server.MetricsProvider.LogInventoryCreateInventory(EXTENSION_NAME, ret, DateTime.Now); return ret; }
public BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder) { BackendResponse ret; if (m_inventoryService.AddFolder(folder)) { ret = BackendResponse.Success; } else { ret = BackendResponse.Failure; } m_server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, true, DateTime.Now); return ret; }
public BackendResponse TryCreateFolder(Uri owner, InventoryFolderWithChildren folder) { BackendResponse ret; InventoryCollection collection; if (inventories.TryGetValue(owner, out collection)) { // Delete this folder first if it already exists InventoryFolderWithChildren oldFolder; if (collection.Folders.TryGetValue(folder.ID, out oldFolder)) TryDeleteFolder(owner, folder.ID); try { // Create the file SaveFolder(folder); // Add the folder to the collection lock (collection) collection.Folders[folder.ID] = folder; // Add the folder to its parent folder InventoryFolderWithChildren parent; if (collection.Folders.TryGetValue(folder.ParentID, out parent)) lock (parent.Children) parent.Children.Add(folder.ID, folder); ret = BackendResponse.Success; } catch (Exception ex) { m_log.Error("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); ret = BackendResponse.Failure; } } else { ret = BackendResponse.NotFound; } server.MetricsProvider.LogInventoryCreate(EXTENSION_NAME, ret, owner, true, DateTime.Now); return ret; }
public BackendResponse TryFetchFolderList(Uri owner, out List<InventoryFolderWithChildren> folders) { folders = new List<InventoryFolderWithChildren>(); BackendResponse ret; UUID ownerID; if (Utils.TryGetOpenSimUUID(owner, out ownerID)) { List<InventoryFolderBase> baseFolders = m_inventoryService.GetInventorySkeleton(ownerID); foreach (InventoryFolderBase baseFolder in baseFolders) { InventoryFolderWithChildren folder = new InventoryFolderWithChildren(baseFolder); //folder.Children = null; // This call does not create a folder hierarchy folders.Add(folder); } ret = BackendResponse.Success; } else { folders = null; ret = BackendResponse.NotFound; } m_server.MetricsProvider.LogInventoryFetchFolderList(EXTENSION_NAME, ret, owner, DateTime.Now); return ret; }
void LoadFiles(string folder) { // Try to create the directory if it doesn't already exist if (!Directory.Exists(folder)) { try { Directory.CreateDirectory(folder); } catch (Exception ex) { m_log.Warn("[SIMPLEINVENTORYSTORAGE]: " + ex.Message); return; } } try { string[] agentFolders = Directory.GetDirectories(DEFAULT_INVENTORY_DIR); for (int i = 0; i < agentFolders.Length; i++) { string foldername = agentFolders[i]; string indexPath = Path.Combine(foldername, "index.txt"); UUID ownerID = UUID.Zero; Uri owner = null; try { string[] index = File.ReadAllLines(indexPath); ownerID = UUID.Parse(index[0]); owner = new Uri(index[1]); } catch (Exception ex) { m_log.WarnFormat("[SIMPLEINVENTORYSTORAGE]: Failed loading the index file {0}: {1}", indexPath, ex.Message); } if (ownerID != UUID.Zero && owner != null) { // Initialize the active gestures list for this agent activeGestures.Add(owner, new List <InventoryItemBase>()); InventoryCollection collection = new InventoryCollection(); collection.UserID = ownerID; // Load all of the folders for this agent string[] folders = Directory.GetFiles(foldername, "*.folder", SearchOption.TopDirectoryOnly); collection.Folders = new Dictionary <UUID, InventoryFolderWithChildren>(folders.Length); for (int j = 0; j < folders.Length; j++) { InventoryFolderWithChildren invFolder = (InventoryFolderWithChildren)folderSerializer.Deserialize( new FileStream(folders[j], FileMode.Open, FileAccess.Read)); collection.Folders[invFolder.ID] = invFolder; } // Iterate over the folders collection, adding children to their parents foreach (InventoryFolderWithChildren invFolder in collection.Folders.Values) { InventoryFolderWithChildren parent; if (collection.Folders.TryGetValue(invFolder.ParentID, out parent)) { parent.Children[invFolder.ID] = invFolder; } } // Load all of the items for this agent string[] files = Directory.GetFiles(foldername, "*.item", SearchOption.TopDirectoryOnly); collection.Items = new Dictionary <UUID, InventoryItemBase>(files.Length); for (int j = 0; j < files.Length; j++) { InventoryItemBase invItem = (InventoryItemBase)itemSerializer.Deserialize( new FileStream(files[j], FileMode.Open, FileAccess.Read)); collection.Items[invItem.ID] = invItem; // Add items to their parent folders InventoryFolderWithChildren parent; if (collection.Folders.TryGetValue(invItem.Folder, out parent)) { parent.Children[invItem.ID] = invItem; } // Add active gestures to our list if (invItem.InvType == (int)InventoryType.Gesture && invItem.Flags != 0) { activeGestures[owner].Add(invItem); } } inventories.Add(owner, collection); } } } catch (Exception ex) { m_log.ErrorFormat("[SIMPLEINVENTORYSTORAGE]: Failed loading inventory from {0}: {1}", folder, ex.Message); } }
public BackendResponse TryFetchFolder(Uri owner, UUID folderID, out InventoryFolderWithChildren folder) { BackendResponse ret; // TODO: implement some logic for "folder not found" folder = m_inventoryService.GetInventoryFolder(folderID); ret = BackendResponse.Success; m_server.MetricsProvider.LogInventoryFetch(EXTENSION_NAME, ret, owner, folderID, true, DateTime.Now); return ret; }
private static void WriteInventoryFolderToArchive( TarArchiveWriter archive, InventoryFolderWithChildren folder, string path) { path += string.Format("{0}{1}{2}/", folder.Name, ArchiveConstants.INVENTORY_NODE_NAME_COMPONENT_SEPARATOR, folder.ID); archive.WriteDir(path); foreach (InventoryNodeBase inventoryNode in folder.Children.Values) { if (inventoryNode is InventoryFolderWithChildren) { WriteInventoryFolderToArchive(archive, (InventoryFolderWithChildren) inventoryNode, path); } else if (inventoryNode is InventoryItemBase) { WriteInventoryItemToArchive(archive, (InventoryItemBase) inventoryNode, path); } } }
void WriteObject_InventoryFolder(InventoryFolderWithChildren ob, string element, string namesp, bool isNullable, bool needType, bool writeWrappingElem) { if (((object)ob) == null) { if (isNullable) WriteNullTagLiteral(element, namesp); return; } System.Type type = ob.GetType(); if (type == typeof(InventoryFolderWithChildren)) { } else { throw CreateUnknownTypeException(ob); } if (writeWrappingElem) { WriteStartElement(element, namesp, ob); } if (needType) WriteXsiType("InventoryFolderBase", ""); WriteElementString("Name", "", ob.@Name); WriteObject_UUID(ob.@Owner, "Owner", "", false, false, true); WriteObject_UUID(ob.@ParentID, "ParentID", "", false, false, true); WriteObject_UUID(ob.@ID, "ID", "", false, false, true); WriteElementString("Type", "", [email protected](CultureInfo.InvariantCulture)); WriteElementString("Version", "", [email protected](CultureInfo.InvariantCulture)); if (writeWrappingElem) WriteEndElement(ob); }