Example #1
0
        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);
        }
Example #2
0
        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");
                }
            }
        }
Example #3
0
        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");
                }
            }
        }
Example #4
0
        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);
        }