From c0beeb929e22509329781cdf85f7a5d90c4b0e36 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 12 Oct 2009 17:00:01 -0700 Subject: * Fixes http://opensimulator.org/mantis/view.php?id=4225 * Fixes http://opensimulator.org/mantis/view.php?id=3959 * Allows for viewing inventory textures outside home grid --- .../Framework/Scenes/Hypergrid/HGAssetMapper.cs | 98 ++++++++++------------ .../Scenes/Hypergrid/HGScene.Inventory.cs | 26 ++++++ OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 9 +- 3 files changed, 79 insertions(+), 54 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs index b6fa41d..244ac3b 100644 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs +++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs @@ -35,6 +35,7 @@ using OpenSim.Framework; using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Clients; using OpenSim.Region.Framework.Scenes.Serialization; +using OpenSim.Region.Framework.Interfaces; using OpenSim.Services.Interfaces; //using HyperGrid.Framework; @@ -52,13 +53,13 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid private Scene m_scene; - private IHyperlinkService m_hyper; - IHyperlinkService HyperlinkService + private IHyperAssetService m_hyper; + IHyperAssetService HyperlinkAssets { get { if (m_hyper == null) - m_hyper = m_scene.RequestModuleInterface(); + m_hyper = m_scene.RequestModuleInterface(); return m_hyper; } } @@ -99,7 +100,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid if (asset != null) { - m_log.Debug("[HGScene]: Asset made it to asset cache. " + asset.Name + " " + assetID); + m_log.DebugFormat("[HGScene]: Copied asset {0} from {1} to local asset server. ", asset.ID, url); return asset; } return null; @@ -129,6 +130,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid } m_scene.AssetService.Store(asset1); + m_log.DebugFormat("[HGScene]: Posted copy of asset {0} from local asset server to {1}", asset1.ID, url); } return true; } @@ -167,34 +169,32 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid public void Get(UUID assetID, UUID ownerID) { - if (!HyperlinkService.IsLocalUser(ownerID)) + // Get the item from the remote asset server onto the local AssetCache + // and place an entry in m_assetMap + + string userAssetURL = HyperlinkAssets.GetUserAssetServer(ownerID); + if ((userAssetURL != string.Empty) && (userAssetURL != HyperlinkAssets.GetSimAssetServer())) { - // Get the item from the remote asset server onto the local AssetCache - // and place an entry in m_assetMap + m_log.Debug("[HGScene]: Fetching object " + assetID + " from asset server " + userAssetURL); + AssetBase asset = FetchAsset(userAssetURL, assetID); - string userAssetURL = UserAssetURL(ownerID); - if (userAssetURL != null) + if (asset != null) { - m_log.Debug("[HGScene]: Fetching object " + assetID + " to asset server " + userAssetURL); - AssetBase asset = FetchAsset(userAssetURL, assetID); + // OK, now fetch the inside. + Dictionary ids = new Dictionary(); + HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, userAssetURL); + uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids); + foreach (UUID uuid in ids.Keys) + FetchAsset(userAssetURL, uuid); + + m_log.DebugFormat("[HGScene]: Successfully fetched asset {0} from asset server {1}", asset.ID, userAssetURL); - if (asset != null) - { - m_log.Debug("[HGScene]: Successfully fetched item from remote asset server " + userAssetURL); - - // OK, now fetch the inside. - Dictionary ids = new Dictionary(); - HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, userAssetURL); - uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids); - foreach (UUID uuid in ids.Keys) - FetchAsset(userAssetURL, uuid); - } - else - m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL); } else - m_log.Warn("[HGScene]: Unable to locate foreign user's asset server"); + m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL); } + else + m_log.Debug("[HGScene]: user's asset server is the local region's asset server"); } //public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo) @@ -225,44 +225,38 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid public void Post(UUID assetID, UUID ownerID) { - if (!HyperlinkService.IsLocalUser(ownerID)) - { // Post the item from the local AssetCache onto the remote asset server // and place an entry in m_assetMap - string userAssetURL = UserAssetURL(ownerID); - if (userAssetURL != null) + string userAssetURL = HyperlinkAssets.GetUserAssetServer(ownerID); + if ((userAssetURL != string.Empty) && (userAssetURL != HyperlinkAssets.GetSimAssetServer())) + { + m_log.Debug("[HGScene]: Posting object " + assetID + " to asset server " + userAssetURL); + AssetBase asset = m_scene.AssetService.Get(assetID.ToString()); + if (asset != null) { - m_log.Debug("[HGScene]: Posting object " + assetID + " to asset server " + userAssetURL); - AssetBase asset = m_scene.AssetService.Get(assetID.ToString()); - if (asset != null) + Dictionary ids = new Dictionary(); + HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, string.Empty); + uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids); + foreach (UUID uuid in ids.Keys) { - Dictionary ids = new Dictionary(); - HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, string.Empty); - uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids); - foreach (UUID uuid in ids.Keys) - { - asset = m_scene.AssetService.Get(uuid.ToString()); - if (asset != null) - m_log.DebugFormat("[HGScene]: Posting {0} {1}", asset.Type.ToString(), asset.Name); - else - m_log.DebugFormat("[HGScene]: Could not find asset {0}", uuid); + asset = m_scene.AssetService.Get(uuid.ToString()); + if (asset == null) + m_log.DebugFormat("[HGScene]: Could not find asset {0}", uuid); + else PostAsset(userAssetURL, asset); - } + } - if (ids.Count > 0) // maybe it succeeded... - m_log.DebugFormat("[HGScene]: Successfully posted item {0} to remote asset server {1}", assetID, userAssetURL); - else - m_log.WarnFormat("[HGScene]: Could not post asset {0} to remote asset server {1}", assetID, userAssetURL); + // maybe all pieces got there... + m_log.DebugFormat("[HGScene]: Successfully posted item {0} to asset server {1}", assetID, userAssetURL); - } - else - m_log.Debug("[HGScene]: Something wrong with asset, it could not be found"); } else - m_log.Warn("[HGScene]: Unable to locate foreign user's asset server"); - + m_log.DebugFormat("[HGScene]: Something wrong with asset {0}, it could not be found", assetID); } + else + m_log.Debug("[HGScene]: user's asset server is local region's asset server"); + } #endregion diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs index 8fe3565..6f7f34f 100644 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs @@ -32,6 +32,7 @@ using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Communications; using OpenSim.Framework.Communications.Cache; +using OpenSim.Region.Framework.Interfaces; namespace OpenSim.Region.Framework.Scenes.Hypergrid { @@ -41,6 +42,21 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private HGAssetMapper m_assMapper; + public HGAssetMapper AssetMapper + { + get { return m_assMapper; } + } + + private IHyperAssetService m_hyper; + private IHyperAssetService HyperAssets + { + get + { + if (m_hyper == null) + m_hyper = RequestModuleInterface(); + return m_hyper; + } + } #endregion @@ -140,6 +156,16 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid } + protected override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) + { + string userAssetServer = HyperAssets.GetUserAssetServer(sender); + if ((userAssetServer != string.Empty) && (userAssetServer != HyperAssets.GetSimAssetServer())) + m_assMapper.Get(item.AssetID, sender); + + userAssetServer = HyperAssets.GetUserAssetServer(receiver); + if ((userAssetServer != string.Empty) && (userAssetServer != HyperAssets.GetSimAssetServer())) + m_assMapper.Post(item.AssetID, receiver); + } #endregion diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 1917228..0cb5682 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -408,7 +408,7 @@ namespace OpenSim.Region.Framework.Scenes public virtual InventoryItemBase GiveInventoryItem( UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId) { - Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); + //Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); InventoryItemBase item = new InventoryItemBase(itemId, senderId); item = InventoryService.GetItem(item); @@ -472,7 +472,8 @@ namespace OpenSim.Region.Framework.Scenes itemCopy.SalePrice = item.SalePrice; itemCopy.SaleType = item.SaleType; - InventoryService.AddItem(itemCopy); + if (InventoryService.AddItem(itemCopy)) + TransferInventoryAssets(itemCopy, senderId, recipient); if (!Permissions.BypassPermissions()) { @@ -494,6 +495,10 @@ namespace OpenSim.Region.Framework.Scenes } + protected virtual void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) + { + } + /// /// Give an entire inventory folder from one user to another. The entire contents (including all descendent /// folders) is given. -- cgit v1.1