private bool PostAsset(GridAssetClient asscli, UUID assetID, bool isTexture) { AssetBase asset1; //m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset1); asset1 = m_scene.CommsManager.AssetCache.GetAsset(assetID, isTexture); if (asset1 != null) { // See long comment in AssetCache.AddAsset if (!asset1.Temporary || asset1.Local) { // The asset cache returns instances of subclasses of AssetBase: // TextureImage or AssetInfo. So in passing them to the remote // server we first need to convert this to instances of AssetBase, // which is the serializable class for assets. AssetBase asset = new AssetBase(); Copy(asset1, asset); asscli.StoreAsset(asset); } return(true); } else { m_log.Warn("[HGScene]: Tried to post asset to remote server, but asset not in local cache."); } return(false); }
public void Post(UUID assetID, UUID ownerID) { if (!IsLocalUser(ownerID)) { // Post the item from the local AssetCache ontp the remote asset server // and place an entry in m_assetMap GridAssetClient asscli = null; string userAssetURL = UserAssetURL(ownerID); if (userAssetURL != null) { m_assetServers.TryGetValue(userAssetURL, out asscli); if (asscli == null) { m_log.Debug("[HGScene]: Starting new GridAssetClient for " + userAssetURL); asscli = new GridAssetClient(userAssetURL); asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache! m_assetServers.Add(userAssetURL, asscli); } m_log.Debug("[HGScene]: Posting object " + assetID + " to asset server " + userAssetURL); AssetBase ass1 = null; m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out ass1); if (ass1 != null) { bool success = PostAsset(asscli, assetID, (ass1.Type == (sbyte)AssetType.Texture)); // Now the inside Dictionary <UUID, bool> ids = SniffUUIDs(assetID); Dump(ids); foreach (KeyValuePair <UUID, bool> kvp in ids) { PostAsset(asscli, kvp.Key, kvp.Value); } if (success) { m_log.Debug("[HGScene]: Successfully posted item to remote asset server " + userAssetURL); if (!m_assetMap.ContainsKey(assetID)) { m_assetMap.Add(assetID, asscli); } } else { m_log.Warn("[HGScene]: Could not post asset to remote asset server " + userAssetURL); } } else { m_log.Debug("[HGScene]: Something wrong with asset"); } } else { m_log.Warn("[HGScene]: Unable to locate foreign user's asset server"); } } }
public void Get(UUID assetID, UUID ownerID) { if (!IsInAssetMap(assetID) && !IsLocalUser(ownerID)) { // Get the item from the remote asset server onto the local AssetCache // and place an entry in m_assetMap GridAssetClient asscli = null; string userAssetURL = UserAssetURL(ownerID); if (userAssetURL != null) { m_assetServers.TryGetValue(userAssetURL, out asscli); if (asscli == null) { m_log.Debug("[HGScene]: Starting new GridAssetClient for " + userAssetURL); asscli = new GridAssetClient(userAssetURL); asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache! m_assetServers.Add(userAssetURL, asscli); asscli.Start(); } m_log.Debug("[HGScene]: Fetching object " + assetID + " to asset server " + userAssetURL); bool success = FetchAsset(asscli, assetID, false); // asscli.RequestAsset(item.ItemID, false); // OK, now fetch the inside. Dictionary <UUID, bool> ids = SniffUUIDs(assetID); Dump(ids); foreach (KeyValuePair <UUID, bool> kvp in ids) { FetchAsset(asscli, kvp.Key, kvp.Value); } if (success) { m_log.Debug("[HGScene]: Successfully fetched item from remote asset server " + userAssetURL); m_assetMap.Add(assetID, asscli); } 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"); } } }
private bool FetchAsset(GridAssetClient asscli, UUID assetID, bool isTexture) { // I'm not going over 3 seconds since this will be blocking processing of all the other inbound // packets from the client. int pollPeriod = 200; int maxPolls = 15; AssetBase asset; // Maybe it came late, and it's already here. Check first. if (m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset)) { m_log.Debug("[HGScene]: Asset already in asset cache. " + assetID); return(true); } asscli.RequestAsset(assetID, isTexture); do { Thread.Sleep(pollPeriod); if (m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset) && (asset != null)) { m_log.Debug("[HGScene]: Asset made it to asset cache. " + asset.Name + " " + assetID); // I think I need to store it in the asset DB too. // For now, let me just do it for textures and scripts if (((AssetType)asset.Type == AssetType.Texture) || ((AssetType)asset.Type == AssetType.LSLBytecode) || ((AssetType)asset.Type == AssetType.LSLText)) { AssetBase asset1 = new AssetBase(); Copy(asset, asset1); m_scene.CommsManager.AssetCache.AssetServer.StoreAsset(asset1); } return(true); } } while (--maxPolls > 0); m_log.WarnFormat("[HGScene]: {0} {1} was not received before the retrieval timeout was reached", isTexture ? "texture" : "asset", assetID.ToString()); return(false); }