diff --git a/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs index 427a310233..2a25d9c991 100644 --- a/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs @@ -64,7 +64,7 @@ namespace OpenSim.Capabilities.Handlers public string FetchInventoryDescendentsRequest(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) { //m_log.DebugFormat("[XXX]: FetchInventoryDescendentsRequest in {0}, {1}", (m_Scene == null) ? "none" : m_Scene.Name, request); - + Hashtable hash = new Hashtable(); try { @@ -77,12 +77,12 @@ namespace OpenSim.Capabilities.Handlers } ArrayList foldersrequested = (ArrayList)hash["folders"]; + hash.Clear(); List folders = new List(); for (int i = 0; i < foldersrequested.Count; i++) { Hashtable inventoryhash = (Hashtable)foldersrequested[i]; - LLSDFetchInventoryDescendents llsdRequest = new LLSDFetchInventoryDescendents(); try @@ -98,37 +98,90 @@ namespace OpenSim.Capabilities.Handlers folders.Add(llsdRequest); } + foldersrequested.Clear(); + if(folders.Count == 0) return "folders"; List bad_folders = new List(); - List invcollSet = Fetch(folders, bad_folders); + int total_folders = 0; + int total_items = 0; + List invcollSet = Fetch(folders, bad_folders, ref total_folders, ref total_items); //m_log.DebugFormat("[XXX]: Got {0} folders from a request of {1}", invcollSet.Count, folders.Count); - if (invcollSet == null) - { - m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Multiple folder fetch failed. Trying old protocol."); -#pragma warning disable 0612 - return FetchInventoryDescendentsRequest(foldersrequested, httpRequest, httpResponse); -#pragma warning restore 0612 - } + int invcollSetCount = invcollSet.Count; - StringBuilder lastresponse = new StringBuilder(1024); + int mem = 8192 + ((256 * invcollSetCount + + 384 * total_folders + + 1024 * total_items + + 128 * bad_folders.Count) & 0x7ffff000); + + StringBuilder lastresponse = new StringBuilder(mem); lastresponse.Append(""); - if(invcollSet.Count > 0) + if(invcollSetCount > 0) { lastresponse.Append("folders"); - foreach (InventoryCollectionWithDescendents icoll in invcollSet) + int i = 0; + InventoryCollection thiscoll; + for(i = 0; i < invcollSetCount; i++) { - LLSDInventoryFolderContents thiscontents = contentsToLLSD(icoll.Collection, icoll.Descendents); - lastresponse.Append(LLSDHelpers.SerialiseLLSDReplyNoHeader(thiscontents)); + thiscoll = invcollSet[i]; + invcollSet[i] = null; + + LLSDxmlEncode.AddMap(lastresponse); + LLSDxmlEncode.AddElem("agent_id", thiscoll.OwnerID, lastresponse); + LLSDxmlEncode.AddElem("descendents", thiscoll.Descendents, lastresponse); + LLSDxmlEncode.AddElem("folder_id", thiscoll.FolderID, lastresponse); + + if(thiscoll.Folders == null || thiscoll.Folders.Count == 0) + LLSDxmlEncode.AddEmptyArray("categories", lastresponse); + else + { + LLSDxmlEncode.AddArray("categories", lastresponse); + foreach (InventoryFolderBase invFolder in thiscoll.Folders) + { + LLSDxmlEncode.AddMap(lastresponse); + + LLSDxmlEncode.AddElem("folder_id", invFolder.ID, lastresponse); + LLSDxmlEncode.AddElem("parent_id", invFolder.ParentID, lastresponse); + LLSDxmlEncode.AddElem("name", invFolder.Name, lastresponse); + LLSDxmlEncode.AddElem("type", invFolder.Type, lastresponse); + LLSDxmlEncode.AddElem("preferred_type", (int)-1, lastresponse); + LLSDxmlEncode.AddElem("version", invFolder.Version, lastresponse); + + LLSDxmlEncode.AddEndMap(lastresponse); + } + LLSDxmlEncode.AddEndArray(lastresponse); + } + + if(thiscoll.Items == null || thiscoll.Items.Count == 0) + LLSDxmlEncode.AddEmptyArray("items", lastresponse); + else + { + LLSDxmlEncode.AddArray("items", lastresponse); + foreach (InventoryItemBase invItem in thiscoll.Items) + { + invItem.ToLLSDxml(lastresponse); + } + + LLSDxmlEncode.AddEndArray(lastresponse); + } + + LLSDxmlEncode.AddElem("owner_id", thiscoll.OwnerID, lastresponse); + LLSDxmlEncode.AddElem("version", thiscoll.Version, lastresponse); + + LLSDxmlEncode.AddEndMap(lastresponse); + invcollSet[i] = null; } lastresponse.Append(""); + thiscoll = null; } else + { lastresponse.Append("folders"); + } //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Bad folders {0}", string.Join(", ", bad_folders)); if(bad_folders.Count > 0) @@ -144,298 +197,47 @@ namespace OpenSim.Capabilities.Handlers } lastresponse.Append(""); - return lastresponse.ToString();; - } - - /// - /// Construct an LLSD reply packet to a CAPS inventory request - /// - /// - /// - private LLSDInventoryDescendents FetchInventoryReply(LLSDFetchInventoryDescendents invFetch) - { - LLSDInventoryDescendents reply = new LLSDInventoryDescendents(); - LLSDInventoryFolderContents contents = new LLSDInventoryFolderContents(); - contents.agent_id = invFetch.owner_id; - contents.owner_id = invFetch.owner_id; - contents.folder_id = invFetch.folder_id; - - reply.folders.Array.Add(contents); - InventoryCollection inv = new InventoryCollection(); - inv.Folders = new List(); - inv.Items = new List(); - int version = 0; - int descendents = 0; - -#pragma warning disable 0612 - inv = Fetch( - invFetch.owner_id, invFetch.folder_id, invFetch.owner_id, - invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order, out version, out descendents); -#pragma warning restore 0612 - - if (inv != null && inv.Folders != null) - { - foreach (InventoryFolderBase invFolder in inv.Folders) - { - contents.categories.Array.Add(ConvertInventoryFolder(invFolder)); - } - - descendents += inv.Folders.Count; - } - - if (inv != null && inv.Items != null) - { - foreach (InventoryItemBase invItem in inv.Items) - { - contents.items.Array.Add(ConvertInventoryItem(invItem)); - } - } - - contents.descendents = descendents; - contents.version = version; - - //m_log.DebugFormat( - // "[WEB FETCH INV DESC HANDLER]: Replying to request for folder {0} (fetch items {1}, fetch folders {2}) with {3} items and {4} folders for agent {5}", - // invFetch.folder_id, - // invFetch.fetch_items, - // invFetch.fetch_folders, - // contents.items.Array.Count, - // contents.categories.Array.Count, - // invFetch.owner_id); - - return reply; - } - - private LLSDInventoryFolderContents contentsToLLSD(InventoryCollection inv, int descendents) - { - LLSDInventoryFolderContents contents = new LLSDInventoryFolderContents(); - contents.agent_id = inv.OwnerID; - contents.owner_id = inv.OwnerID; - contents.folder_id = inv.FolderID; - - if (inv.Folders != null) - { - foreach (InventoryFolderBase invFolder in inv.Folders) - { - contents.categories.Array.Add(ConvertInventoryFolder(invFolder)); - } - } - - if (inv.Items != null) - { - foreach (InventoryItemBase invItem in inv.Items) - { - contents.items.Array.Add(ConvertInventoryItem(invItem)); - } - } - - contents.descendents = descendents; - contents.version = inv.Version; - - return contents; - } - /// - /// Old style. Soon to be deprecated. - /// - /// - /// - /// - /// - [Obsolete] - private string FetchInventoryDescendentsRequest(ArrayList foldersrequested, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Received request for {0} folders", foldersrequested.Count); - - StringBuilder tmpresponse = new StringBuilder(1024); - StringBuilder tmpbadfolders = new StringBuilder(1024); - - for (int i = 0; i < foldersrequested.Count; i++) - { - string inventoryitemstr = ""; - Hashtable inventoryhash = (Hashtable)foldersrequested[i]; - - LLSDFetchInventoryDescendents llsdRequest = new LLSDFetchInventoryDescendents(); - - try - { - LLSDHelpers.DeserialiseOSDMap(inventoryhash, llsdRequest); - } - catch (Exception e) - { - m_log.Debug("[WEB FETCH INV DESC HANDLER]: caught exception doing OSD deserialize" + e); - } - - LLSDInventoryDescendents reply = FetchInventoryReply(llsdRequest); - - if (null == reply) - { - tmpbadfolders.Append("folder_id"); - tmpbadfolders.Append(llsdRequest.folder_id.ToString()); - tmpbadfolders.Append("errorUnknown"); - } - else - { - inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(reply); - inventoryitemstr = inventoryitemstr.Replace("folders", ""); - inventoryitemstr = inventoryitemstr.Replace("", ""); - } - - tmpresponse.Append(inventoryitemstr); - } - - StringBuilder lastresponse = new StringBuilder(1024); - lastresponse.Append(""); - if(tmpresponse.Length > 0) - { - lastresponse.Append("folders"); - lastresponse.Append(tmpresponse.ToString()); - lastresponse.Append(""); - } - else - lastresponse.Append("folders"); - - if(tmpbadfolders.Length > 0) - { - lastresponse.Append("bad_folders"); - lastresponse.Append(tmpbadfolders.ToString()); - lastresponse.Append(""); - } - lastresponse.Append(""); - return lastresponse.ToString(); } - /// - /// Handle the caps inventory descendents fetch. - /// - /// - /// - /// - /// - /// - /// - /// - /// An empty InventoryCollection if the inventory look up failed - [Obsolete] - private InventoryCollection Fetch( - UUID agentID, UUID folderID, UUID ownerID, - bool fetchFolders, bool fetchItems, int sortOrder, out int version, out int descendents) - { - //m_log.DebugFormat( - // "[WEB FETCH INV DESC HANDLER]: Fetching folders ({0}), items ({1}) from {2} for agent {3}", - // fetchFolders, fetchItems, folderID, agentID); - - // FIXME MAYBE: We're not handling sortOrder! - - version = 0; - descendents = 0; - - InventoryFolderImpl fold; - if (m_LibraryService != null && m_LibraryService.LibraryRootFolder != null && agentID == m_LibraryService.LibraryRootFolder.Owner) - { - if ((fold = m_LibraryService.LibraryRootFolder.FindFolder(folderID)) != null) - { - InventoryCollection ret = new InventoryCollection(); - ret.Folders = new List(); - ret.Items = fold.RequestListOfItems(); - descendents = ret.Folders.Count + ret.Items.Count; - - return ret; - } - } - - InventoryCollection contents = new InventoryCollection(); - - if (folderID != UUID.Zero) - { - InventoryCollection fetchedContents = m_InventoryService.GetFolderContent(agentID, folderID); - - if (fetchedContents == null) - { - m_log.WarnFormat("[WEB FETCH INV DESC HANDLER]: Could not get contents of folder {0} for user {1}", folderID, agentID); - return contents; - } - contents = fetchedContents; - InventoryFolderBase containingFolder = m_InventoryService.GetFolder(agentID, folderID); - - if (containingFolder != null) - { - //m_log.DebugFormat( - // "[WEB FETCH INV DESC HANDLER]: Retrieved folder {0} {1} for agent id {2}", - // containingFolder.Name, containingFolder.ID, agentID); - - version = containingFolder.Version; - - if (fetchItems && containingFolder.Type != (short)FolderType.Trash) - { - List itemsToReturn = contents.Items; - List originalItems = new List(itemsToReturn); - - // descendents must only include the links, not the linked items we add - descendents = originalItems.Count; - - // Add target items for links in this folder before the links themselves. - foreach (InventoryItemBase item in originalItems) - { - if (item.AssetType == (int)AssetType.Link) - { - InventoryItemBase linkedItem = m_InventoryService.GetItem(agentID, item.AssetID); - - // Take care of genuinely broken links where the target doesn't exist - // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, - // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles - // rather than having to keep track of every folder requested in the recursion. - if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) - itemsToReturn.Insert(0, linkedItem); - } - } - } - } - } - else - { - // Lost items don't really need a version - version = 1; - } - - return contents; - - } - - private void AddLibraryFolders(List libFolders, List result) + private void AddLibraryFolders(List libFolders, List result, ref int total_folders, ref int total_items) { InventoryFolderImpl fold; + if (m_LibraryService == null || m_LibraryService.LibraryRootFolder == null) + return; + foreach (LLSDFetchInventoryDescendents f in libFolders) { if ((fold = m_LibraryService.LibraryRootFolder.FindFolder(f.folder_id)) != null) { - InventoryCollectionWithDescendents ret = new InventoryCollectionWithDescendents(); - ret.Collection = new InventoryCollection(); + InventoryCollection Collection = new InventoryCollection(); // ret.Collection.Folders = new List(); - ret.Collection.Folders = fold.RequestListOfFolders(); - ret.Collection.Items = fold.RequestListOfItems(); - ret.Collection.OwnerID = m_LibraryService.LibraryRootFolder.Owner; - ret.Collection.FolderID = f.folder_id; - ret.Collection.Version = fold.Version; + Collection.Folders = fold.RequestListOfFolders(); + Collection.Items = fold.RequestListOfItems(); + Collection.OwnerID = m_LibraryService.LibraryRootFolder.Owner; + Collection.FolderID = f.folder_id; + Collection.Version = fold.Version; - ret.Descendents = ret.Collection.Items.Count + ret.Collection.Folders.Count; - result.Add(ret); + Collection.Descendents = Collection.Items.Count + Collection.Folders.Count; + total_folders += Collection.Folders.Count; + total_items += Collection.Items.Count; + result.Add(Collection); //m_log.DebugFormat("[XXX]: Added libfolder {0} ({1}) {2}", ret.Collection.FolderID, ret.Collection.OwnerID); } } } - private List Fetch(List fetchFolders, List bad_folders) + private List Fetch(List fetchFolders, List bad_folders, ref int total_folders, ref int total_items) { //m_log.DebugFormat( // "[WEB FETCH INV DESC HANDLER]: Fetching {0} folders for owner {1}", fetchFolders.Count, fetchFolders[0].owner_id); // FIXME MAYBE: We're not handling sortOrder! - List result = new List(); - List libFolders = new List(); - List otherFolders = new List(); + List result = new List(32); + List libFolders = new List(32); + List otherFolders = new List(32); HashSet libIDs = new HashSet(); HashSet otherIDs = new HashSet(); @@ -455,13 +257,12 @@ namespace OpenSim.Capabilities.Handlers if(doneZeroID) continue; doneZeroID = true; - InventoryCollectionWithDescendents zeroColl = new InventoryCollectionWithDescendents(); - zeroColl.Collection = new InventoryCollection(); - zeroColl.Collection.OwnerID = f.owner_id; - zeroColl.Collection.Version = 0; - zeroColl.Collection.FolderID = f.folder_id; - zeroColl.Descendents = 0; - result.Add(zeroColl); + InventoryCollection Collection = new InventoryCollection(); + Collection.OwnerID = f.owner_id; + Collection.Version = 0; + Collection.FolderID = f.folder_id; + Collection.Descendents = 0; + result.Add(Collection); continue; } if(dolib && f.owner_id == libOwner) @@ -474,10 +275,13 @@ namespace OpenSim.Capabilities.Handlers } if(otherIDs.Contains(f.folder_id)) continue; + otherIDs.Add(f.folder_id); otherFolders.Add(f); } + fetchFolders.Clear(); + if(otherFolders.Count > 0) { int i = 0; @@ -501,25 +305,33 @@ namespace OpenSim.Capabilities.Handlers foreach (InventoryCollection contents in fetchedContents) { // Find the original request - LLSDFetchInventoryDescendents freq = otherFolders[i++]; - - InventoryCollectionWithDescendents coll = new InventoryCollectionWithDescendents(); - coll.Collection = contents; + LLSDFetchInventoryDescendents freq = otherFolders[i]; + otherFolders[i]=null; + i++; if (BadFolder(freq, contents, bad_folders)) continue; - // Next: link management - ProcessLinks(freq, coll); + if(!freq.fetch_folders) + contents.Folders.Clear(); + if(!freq.fetch_items) + contents.Items.Clear(); - result.Add(coll); + contents.Descendents = contents.Items.Count + contents.Folders.Count; + + // Next: link management + ProcessLinks(freq, contents); + + total_folders += contents.Folders.Count; + total_items += contents.Items.Count; + result.Add(contents); } } } if(dolib && libFolders.Count > 0) { - AddLibraryFolders(libFolders, result); + AddLibraryFolders(libFolders, result, ref total_folders, ref total_items); } return result; @@ -552,123 +364,48 @@ namespace OpenSim.Capabilities.Handlers return false; } - private void ProcessLinks(LLSDFetchInventoryDescendents freq, InventoryCollectionWithDescendents coll) + private void ProcessLinks(LLSDFetchInventoryDescendents freq, InventoryCollection contents) { - InventoryCollection contents = coll.Collection; + if (contents.Items == null || contents.Items.Count == 0) + return; - if (freq.fetch_items && contents.Items != null) + // viewers are lasy and want a copy of the linked item sent before the link to it + + // look for item links + List itemIDs = new List(); + foreach (InventoryItemBase item in contents.Items) { - // viewers are lasy and want a copy of the linked item sent before the link to it - - // descendents must only include the links, not the linked items we add - coll.Descendents = contents.Items.Count + contents.Folders.Count; + //m_log.DebugFormat("[XXX]: {0} {1}", item.Name, item.AssetType); + if (item.AssetType == (int)AssetType.Link) + itemIDs.Add(item.AssetID); + } - // look for item links - List itemIDs = new List(); - foreach (InventoryItemBase item in contents.Items) - { - //m_log.DebugFormat("[XXX]: {0} {1}", item.Name, item.AssetType); - if (item.AssetType == (int)AssetType.Link) - itemIDs.Add(item.AssetID); - } - - // get the linked if any - if (itemIDs.Count > 0) - { - InventoryItemBase[] linked = m_InventoryService.GetMultipleItems(freq.owner_id, itemIDs.ToArray()); - if (linked == null) - { - // OMG!!! One by one!!! This is fallback code, in case the backend isn't updated - m_log.WarnFormat("[WEB FETCH INV DESC HANDLER]: GetMultipleItems failed. Falling back to fetching inventory items one by one."); - linked = new InventoryItemBase[itemIDs.Count]; - int i = 0; - foreach (UUID id in itemIDs) - { - linked[i++] = m_InventoryService.GetItem(freq.owner_id, id); - } - } + // get the linked if any + if (itemIDs.Count > 0) + { + InventoryItemBase[] linked = m_InventoryService.GetMultipleItems(freq.owner_id, itemIDs.ToArray()); - if (linked != null) + if (linked != null) + { + List linkedItems = new List(); + // check for broken + foreach (InventoryItemBase linkedItem in linked) { - List linkedItems = new List(); - // check for broken - foreach (InventoryItemBase linkedItem in linked) + // Take care of genuinely broken links where the target doesn't exist + // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, + // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles + // rather than having to keep track of every folder requested in the recursion. + if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) { - // Take care of genuinely broken links where the target doesn't exist - // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, - // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles - // rather than having to keep track of every folder requested in the recursion. - if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) - { - linkedItems.Add(linkedItem); - //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Added {0} {1} {2}", linkedItem.Name, linkedItem.AssetType, linkedItem.Folder); - } + linkedItems.Add(linkedItem); + //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Added {0} {1} {2}", linkedItem.Name, linkedItem.AssetType, linkedItem.Folder); } - // insert them - if(linkedItems.Count > 0) - contents.Items.InsertRange(0,linkedItems); } + // insert them + if(linkedItems.Count > 0) + contents.Items.InsertRange(0, linkedItems); } } } - - /// - /// Convert an internal inventory folder object into an LLSD object. - /// - /// - /// - private LLSDInventoryFolder ConvertInventoryFolder(InventoryFolderBase invFolder) - { - LLSDInventoryFolder llsdFolder = new LLSDInventoryFolder(); - llsdFolder.folder_id = invFolder.ID; - llsdFolder.parent_id = invFolder.ParentID; - llsdFolder.name = invFolder.Name; - llsdFolder.type = invFolder.Type; - llsdFolder.version = invFolder.Version; - llsdFolder.preferred_type = -1; - - return llsdFolder; - } - - /// - /// Convert an internal inventory item object into an LLSD object. - /// - /// - /// - private LLSDInventoryItem ConvertInventoryItem(InventoryItemBase invItem) - { - LLSDInventoryItem llsdItem = new LLSDInventoryItem(); - llsdItem.asset_id = invItem.AssetID; - llsdItem.created_at = invItem.CreationDate; - llsdItem.desc = invItem.Description; - llsdItem.flags = (int)invItem.Flags; - llsdItem.item_id = invItem.ID; - llsdItem.name = invItem.Name; - llsdItem.parent_id = invItem.Folder; - llsdItem.type = invItem.AssetType; - llsdItem.inv_type = invItem.InvType; - - llsdItem.permissions = new LLSDPermissions(); - llsdItem.permissions.creator_id = invItem.CreatorIdAsUuid; - llsdItem.permissions.base_mask = (int)invItem.CurrentPermissions; - llsdItem.permissions.everyone_mask = (int)invItem.EveryOnePermissions; - llsdItem.permissions.group_id = invItem.GroupID; - llsdItem.permissions.group_mask = (int)invItem.GroupPermissions; - llsdItem.permissions.is_owner_group = invItem.GroupOwned; - llsdItem.permissions.next_owner_mask = (int)invItem.NextPermissions; - llsdItem.permissions.owner_id = invItem.Owner; - llsdItem.permissions.owner_mask = (int)invItem.CurrentPermissions; - llsdItem.sale_info = new LLSDSaleInfo(); - llsdItem.sale_info.sale_price = invItem.SalePrice; - llsdItem.sale_info.sale_type = invItem.SaleType; - - return llsdItem; - } - } - - class InventoryCollectionWithDescendents - { - public InventoryCollection Collection; - public int Descendents; } } diff --git a/OpenSim/Framework/Culture.cs b/OpenSim/Framework/Culture.cs index 1a4466047a..483f73500e 100644 --- a/OpenSim/Framework/Culture.cs +++ b/OpenSim/Framework/Culture.cs @@ -1,66 +1 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Globalization; -using System.Threading; - -namespace OpenSim.Framework -{ - public class Culture - { - private static readonly CultureInfo m_cultureInfo = new CultureInfo("en-US", false); - - public static NumberFormatInfo NumberFormatInfo - { - get { return m_cultureInfo.NumberFormat; } - } - - public static IFormatProvider FormatProvider - { - get { return m_cultureInfo; } - } - - /// - /// Set Culture to en-US to make string processing of numbers simpler. - /// - public static void SetCurrentCulture() - { - Thread.CurrentThread.CurrentCulture = m_cultureInfo; - } - - public static void SetDefaultCurrentCulture() - { - CultureInfo.DefaultThreadCurrentCulture = m_cultureInfo; - } - - public static CultureInfo GetDefaultCurrentCulture() - { - return CultureInfo.DefaultThreadCurrentCulture; - } - } -} \ No newline at end of file +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the OpenSimulator Project nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ using System; using System.Globalization; using System.Threading; namespace OpenSim.Framework { public class Culture { private static readonly CultureInfo m_cultureInfo = new CultureInfo("en-US", false); public static NumberFormatInfo NumberFormatInfo { get { return m_cultureInfo.NumberFormat; } } public static IFormatProvider FormatProvider { get { return m_cultureInfo; } } /// /// Set Culture to en-US to make string processing of numbers simpler. /// public static void SetCurrentCulture() { Thread.CurrentThread.CurrentCulture = m_cultureInfo; } public static void SetDefaultCurrentCulture() { CultureInfo.DefaultThreadCurrentCulture = m_cultureInfo; } public static CultureInfo GetDefaultCurrentCulture() { return CultureInfo.DefaultThreadCurrentCulture; } } } \ No newline at end of file diff --git a/OpenSim/Framework/InventoryCollection.cs b/OpenSim/Framework/InventoryCollection.cs index 59655eb3a7..a55a1cba15 100644 --- a/OpenSim/Framework/InventoryCollection.cs +++ b/OpenSim/Framework/InventoryCollection.cs @@ -40,5 +40,6 @@ namespace OpenSim.Framework public UUID OwnerID; public UUID FolderID; public int Version; + public int Descendents; } } diff --git a/OpenSim/Framework/LLSDxmlEncode.cs b/OpenSim/Framework/LLSDxmlEncode.cs index ed5c4db284..35fc964c1c 100644 --- a/OpenSim/Framework/LLSDxmlEncode.cs +++ b/OpenSim/Framework/LLSDxmlEncode.cs @@ -159,7 +159,7 @@ namespace OpenSim.Framework else { sb.Append(""); - sb.Append(e.ToString(CultureInfo.InvariantCulture)); + sb.Append(e.ToString(CultureInfo.InvariantCulture)); sb.Append(""); } } @@ -173,7 +173,7 @@ namespace OpenSim.Framework else { sb.Append(""); - sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); + sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); sb.Append("y"); } @@ -196,7 +196,7 @@ namespace OpenSim.Framework else { sb.Append(""); - sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); + sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); sb.Append("y"); } @@ -228,7 +228,7 @@ namespace OpenSim.Framework else { sb.Append(""); - sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); + sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); sb.Append("y"); } @@ -347,7 +347,7 @@ namespace OpenSim.Framework else format = "yyyy-MM-ddTHH:mm:ssZ"; sb.Append(""); - sb.Append(u.ToString(format,CultureInfo.InvariantCulture)); + sb.Append(u.ToString(format,CultureInfo.InvariantCulture)); sb.Append(""); } @@ -478,7 +478,7 @@ namespace OpenSim.Framework else { sb.Append(""); - sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); + sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); sb.Append("y"); } @@ -503,7 +503,7 @@ namespace OpenSim.Framework else { sb.Append(""); - sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); + sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); sb.Append("y"); } @@ -537,7 +537,7 @@ namespace OpenSim.Framework else { sb.Append(""); - sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); + sb.Append(e.X.ToString(CultureInfo.InvariantCulture)); sb.Append("y"); } @@ -680,7 +680,7 @@ namespace OpenSim.Framework else format = "yyyy-MM-ddTHH:mm:ssZ"; sb.Append(""); - sb.Append(u.ToString(format,CultureInfo.InvariantCulture)); + sb.Append(u.ToString(format,CultureInfo.InvariantCulture)); sb.Append(""); } diff --git a/OpenSim/Region/Framework/Scenes/SOPMaterial.cs b/OpenSim/Region/Framework/Scenes/SOPMaterial.cs index e4b9380271..27b7679c39 100644 --- a/OpenSim/Region/Framework/Scenes/SOPMaterial.cs +++ b/OpenSim/Region/Framework/Scenes/SOPMaterial.cs @@ -121,8 +121,8 @@ namespace OpenSim.Region.Framework.Scenes public byte SpecularLightColorB = 255; public byte SpecularLightColorA = 255; // data size 12 ints so far - public UUID NormalMapID = UUID.Zero; - public UUID SpecularMapID = UUID.Zero; + public UUID NormalMapID = UUID.Zero; + public UUID SpecularMapID = UUID.Zero; // other data public UUID ID; @@ -134,7 +134,7 @@ namespace OpenSim.Region.Framework.Scenes public FaceMaterial(FaceMaterial other) { - if(other == null) + if (other == null) return; DiffuseAlphaMode = other.DiffuseAlphaMode; @@ -160,32 +160,32 @@ namespace OpenSim.Region.Framework.Scenes public FaceMaterial(OSDMap mat) { - if(mat == null) + if (mat == null) return; const float scale = 0.0001f; NormalMapID = mat["NormMap"].AsUUID(); NormalOffsetX = scale * (float)mat["NormOffsetX"].AsReal(); - NormalOffsetY = scale * (float)mat["NormOffsetY"].AsReal(); - NormalRepeatX = scale * (float)mat["NormRepeatX"].AsReal(); - NormalRepeatY = scale * (float)mat["NormRepeatY"].AsReal(); - NormalRotation = scale * (float)mat["NormRotation"].AsReal(); + NormalOffsetY = scale * (float)mat["NormOffsetY"].AsReal(); + NormalRepeatX = scale * (float)mat["NormRepeatX"].AsReal(); + NormalRepeatY = scale * (float)mat["NormRepeatY"].AsReal(); + NormalRotation = scale * (float)mat["NormRotation"].AsReal(); + + SpecularMapID = mat["SpecMap"].AsUUID(); + SpecularOffsetX = scale * (float)mat["SpecOffsetX"].AsReal(); + SpecularOffsetY = scale * (float)mat["SpecOffsetY"].AsReal(); + SpecularRepeatX = scale * (float)mat["SpecRepeatX"].AsReal(); + SpecularRepeatY = scale * (float)mat["SpecRepeatY"].AsReal(); + SpecularRotation = scale * (float)mat["SpecRotation"].AsReal(); - SpecularMapID = mat["SpecMap"].AsUUID(); - SpecularOffsetX = scale * (float)mat["SpecOffsetX"].AsReal(); - SpecularOffsetY = scale * (float)mat["SpecOffsetY"].AsReal(); - SpecularRepeatX = scale * (float)mat["SpecRepeatX"].AsReal(); - SpecularRepeatY = scale * (float)mat["SpecRepeatY"].AsReal(); - SpecularRotation = scale * (float)mat["SpecRotation"].AsReal(); - Color4 SpecularLightColortmp = mat["SpecColor"].AsColor4(); // we can read as color4 SpecularLightColorR = (byte)(SpecularLightColortmp.R); SpecularLightColorG = (byte)(SpecularLightColortmp.G); SpecularLightColorB = (byte)(SpecularLightColortmp.B); - SpecularLightExponent = (Byte)mat["SpecExp"].AsUInteger(); - EnvironmentIntensity = (Byte)mat["EnvIntensity"].AsUInteger(); - DiffuseAlphaMode = (Byte)mat["DiffuseAlphaMode"].AsUInteger(); - AlphaMaskCutoff = (Byte)mat["AlphaMaskCutoff"].AsUInteger(); + SpecularLightExponent = (Byte)mat["SpecExp"].AsUInteger(); + EnvironmentIntensity = (Byte)mat["EnvIntensity"].AsUInteger(); + DiffuseAlphaMode = (Byte)mat["DiffuseAlphaMode"].AsUInteger(); + AlphaMaskCutoff = (Byte)mat["AlphaMaskCutoff"].AsUInteger(); } public void genID() @@ -198,29 +198,29 @@ namespace OpenSim.Region.Framework.Scenes public unsafe override int GetHashCode() { - if(!validinthash) + if (!validinthash) { unchecked { // if you don't like this, don't read... int* ptr; - fixed(byte* ptrbase = &DiffuseAlphaMode) + fixed (byte* ptrbase = &DiffuseAlphaMode) { ptr = (int*)ptrbase; inthash = *ptr; - for(int i = 0; i < 11; i++) + for (int i = 0; i < 11; i++) inthash ^= *ptr++; } - fixed(Guid* ptrbase = &NormalMapID.Guid) + fixed (Guid* ptrbase = &NormalMapID.Guid) { ptr = (int*)ptrbase; - for(int i = 0; i < 16; i++) + for (int i = 0; i < 16; i++) inthash ^= ptr[i]; } - fixed(Guid* ptrbase = &SpecularMapID.Guid) + fixed (Guid* ptrbase = &SpecularMapID.Guid) { ptr = (int*)ptrbase; - for(int i = 0; i < 16; i++) + for (int i = 0; i < 16; i++) inthash ^= ptr[i]; } } @@ -231,7 +231,7 @@ namespace OpenSim.Region.Framework.Scenes public override bool Equals(Object o) { - if(o == null || !(o is FaceMaterial)) + if (o == null || !(o is FaceMaterial)) return false; FaceMaterial other = (FaceMaterial)o; @@ -264,18 +264,18 @@ namespace OpenSim.Region.Framework.Scenes float scale = 10000f; mat["NormMap"] = NormalMapID; - mat["NormOffsetX"] = (int) (scale * NormalOffsetX); - mat["NormOffsetY"] = (int) (scale * NormalOffsetY); - mat["NormRepeatX"] = (int) (scale * NormalRepeatX); - mat["NormRepeatY"] = (int) (scale * NormalRepeatY); - mat["NormRotation"] = (int) (scale * NormalRotation); + mat["NormOffsetX"] = (int)(scale * NormalOffsetX); + mat["NormOffsetY"] = (int)(scale * NormalOffsetY); + mat["NormRepeatX"] = (int)(scale * NormalRepeatX); + mat["NormRepeatY"] = (int)(scale * NormalRepeatY); + mat["NormRotation"] = (int)(scale * NormalRotation); - mat["SpecMap"] = SpecularMapID; - mat["SpecOffsetX"] = (int) (scale * SpecularOffsetX); - mat["SpecOffsetY"] = (int) (scale * SpecularOffsetY); - mat["SpecRepeatX"] = (int) (scale * SpecularRepeatX); - mat["SpecRepeatY"] = (int) (scale * SpecularRepeatY); - mat["SpecRotation"] = (int) (scale * SpecularRotation); + mat["SpecMap"] = SpecularMapID; + mat["SpecOffsetX"] = (int)(scale * SpecularOffsetX); + mat["SpecOffsetY"] = (int)(scale * SpecularOffsetY); + mat["SpecRepeatX"] = (int)(scale * SpecularRepeatX); + mat["SpecRepeatY"] = (int)(scale * SpecularRepeatY); + mat["SpecRotation"] = (int)(scale * SpecularRotation); OSDArray carray = new OSDArray(4); carray.Add(SpecularLightColorR); @@ -283,10 +283,10 @@ namespace OpenSim.Region.Framework.Scenes carray.Add(SpecularLightColorB); carray.Add(255); // solid color mat["SpecColor"] = carray; - mat["SpecExp"] = SpecularLightExponent; - mat["EnvIntensity"] = EnvironmentIntensity; - mat["DiffuseAlphaMode"] = DiffuseAlphaMode; - mat["AlphaMaskCutoff"] = AlphaMaskCutoff; + mat["SpecExp"] = SpecularLightExponent; + mat["EnvIntensity"] = EnvironmentIntensity; + mat["DiffuseAlphaMode"] = DiffuseAlphaMode; + mat["AlphaMaskCutoff"] = AlphaMaskCutoff; return mat; } @@ -295,27 +295,27 @@ namespace OpenSim.Region.Framework.Scenes { const float scale = 10000f; bool fullLLSD = false; - if(sb == null) + if (sb == null) { - - sb = LLSDxmlEncode.Start(1024,false); + + sb = LLSDxmlEncode.Start(1024, false); fullLLSD = true; } - + LLSDxmlEncode.AddMap(sb); LLSDxmlEncode.AddElem("NormMap", NormalMapID, sb); - LLSDxmlEncode.AddElem("NormOffsetX", (int) (scale * NormalOffsetX + 0.5f), sb); - LLSDxmlEncode.AddElem("NormOffsetY", (int) (scale * NormalOffsetY + 0.5f), sb); - LLSDxmlEncode.AddElem("NormRepeatX", (int) (scale * NormalRepeatX + 0.5f), sb); - LLSDxmlEncode.AddElem("NormRepeatY", (int) (scale * NormalRepeatY + 0.5f), sb); - LLSDxmlEncode.AddElem("NormRotation", (int) (scale * NormalRotation + 0.5f), sb); + LLSDxmlEncode.AddElem("NormOffsetX", (int)(scale * NormalOffsetX + 0.5f), sb); + LLSDxmlEncode.AddElem("NormOffsetY", (int)(scale * NormalOffsetY + 0.5f), sb); + LLSDxmlEncode.AddElem("NormRepeatX", (int)(scale * NormalRepeatX + 0.5f), sb); + LLSDxmlEncode.AddElem("NormRepeatY", (int)(scale * NormalRepeatY + 0.5f), sb); + LLSDxmlEncode.AddElem("NormRotation", (int)(scale * NormalRotation + 0.5f), sb); - LLSDxmlEncode.AddElem("SpecMap", SpecularMapID, sb); - LLSDxmlEncode.AddElem("SpecOffsetX", (int) (scale * SpecularOffsetX + 0.5f), sb); - LLSDxmlEncode.AddElem("SpecOffsetY", (int) (scale * SpecularOffsetY + 0.5f), sb); - LLSDxmlEncode.AddElem("SpecRepeatX", (int) (scale * SpecularRepeatX + 0.5f), sb); - LLSDxmlEncode.AddElem("SpecRepeatY", (int) (scale * SpecularRepeatY + 0.5f), sb); - LLSDxmlEncode.AddElem("SpecRotation", (int) (scale * SpecularRotation + 0.5f), sb); + LLSDxmlEncode.AddElem("SpecMap", SpecularMapID, sb); + LLSDxmlEncode.AddElem("SpecOffsetX", (int)(scale * SpecularOffsetX + 0.5f), sb); + LLSDxmlEncode.AddElem("SpecOffsetY", (int)(scale * SpecularOffsetY + 0.5f), sb); + LLSDxmlEncode.AddElem("SpecRepeatX", (int)(scale * SpecularRepeatX + 0.5f), sb); + LLSDxmlEncode.AddElem("SpecRepeatY", (int)(scale * SpecularRepeatY + 0.5f), sb); + LLSDxmlEncode.AddElem("SpecRotation", (int)(scale * SpecularRotation + 0.5f), sb); LLSDxmlEncode.AddArray("SpecColor", sb); LLSDxmlEncode.AddElem(SpecularLightColorR, sb); @@ -324,14 +324,14 @@ namespace OpenSim.Region.Framework.Scenes LLSDxmlEncode.AddElem(255, sb); LLSDxmlEncode.AddEndArray(sb); - LLSDxmlEncode.AddElem("SpecExp", SpecularLightExponent, sb); - LLSDxmlEncode.AddElem("EnvIntensity", EnvironmentIntensity, sb); - LLSDxmlEncode.AddElem("DiffuseAlphaMode", DiffuseAlphaMode, sb); - LLSDxmlEncode.AddElem("AlphaMaskCutoff", AlphaMaskCutoff, sb); + LLSDxmlEncode.AddElem("SpecExp", SpecularLightExponent, sb); + LLSDxmlEncode.AddElem("EnvIntensity", EnvironmentIntensity, sb); + LLSDxmlEncode.AddElem("DiffuseAlphaMode", DiffuseAlphaMode, sb); + LLSDxmlEncode.AddElem("AlphaMaskCutoff", AlphaMaskCutoff, sb); LLSDxmlEncode.AddEndMap(sb); - if(fullLLSD) + if (fullLLSD) { return LLSDxmlEncode.End(sb); } diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index 6a4ef1e684..7397218d87 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs @@ -442,7 +442,6 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing while ((readLen = decompressionStream.Read(readBuffer, 0, readBuffer.Length)) > 0) outMs.Write(readBuffer, 0, readLen); - outMs.Flush(); outMs.Seek(0, SeekOrigin.Begin); byte[] decompressedBuf = outMs.GetBuffer();