コード例 #1
0
        public string Store(AssetBase asset)
        {
            if (asset.Temporary || asset.Local)
            {
                if (m_Cache != null)
                    m_Cache.Cache(asset);
                else
                    m_log.Warn("[CABLE BEACH ASSETS]: Cache is missing. A valid cache must be configured for proper operation");

                return asset.ID;
            }

            if (m_WorldServiceConnector != null)
            {
                // Cache the asset first
                if (m_Cache != null)
                    m_Cache.Cache(asset);

                // FIXME: OpenSim API needs to be fixed to pass this in wherever possible
                UUID userID = UUID.Zero;

                Uri createAssetUri = GetServiceCapability(userID, CableBeachServices.ASSET_CREATE_ASSET);
                if (createAssetUri != null)
                {
                    UUID assetID;
                    UUID.TryParse(asset.Metadata.ID, out assetID);

                    CreateAssetMessage create = new CreateAssetMessage();
                    create.Metadata = new MetadataDefault();

                    // Convert the OpenSim Type enum to a content-type if it is set, or try to use the OpenSim ContentType field
                    sbyte assetType = asset.Metadata.Type;
                    if (assetType != -1)
                    {
                        create.Metadata.ContentType = CableBeachUtils.SLAssetTypeToContentType(assetType);
                    }
                    else if (!String.IsNullOrEmpty(asset.Metadata.ContentType))
                    {
                        create.Metadata.ContentType = asset.Metadata.ContentType;
                    }
                    else
                    {
                        m_log.Warn("[CABLE BEACH ASSETS]: Storing asset " + assetID + " with a content-type of application/octet-stream");
                        create.Metadata.ContentType = "application/octet-stream";
                    }

                    create.Metadata.CreationDate = DateTime.Now;
                    create.Metadata.Description = asset.Metadata.Description;
                    create.Metadata.ID = assetID;
                    create.Metadata.Methods = new Dictionary<string, Uri>();
                    create.Metadata.Name = asset.Metadata.Name;
                    create.Metadata.SHA256 = OpenMetaverse.Utils.EmptyBytes;
                    create.Metadata.Temporary = asset.Metadata.Temporary;
                    create.Base64Data = Convert.ToBase64String(asset.Data);

                    CapsClient request = new CapsClient(createAssetUri);
                    OSDMap response = request.GetResponse(create.Serialize(), OSDFormat.Json, REQUEST_TIMEOUT) as OSDMap;

                    if (response != null)
                    {
                        // Parse the response
                        CreateAssetReplyMessage reply = new CreateAssetReplyMessage();
                        reply.Deserialize(response);

                        if (reply.AssetID != UUID.Zero)
                        {
                            asset.FullID = reply.AssetID;
                            asset.ID = reply.AssetID.ToString();
                            return asset.ID;
                        }
                    }
                    else
                    {
                        m_log.Error("[CABLE BEACH ASSETS]: Failed to store asset at " + createAssetUri);
                    }
                }
                else
                {
                    m_log.Warn("[CABLE BEACH ASSETS]: Failed to store remote asset " + asset.ID + ", could not find a create_asset capability");
                }
            }
            else
            {
                m_log.Error("[CABLE BEACH ASSETS]: Cannot upload asset, no reference to a world server connector");
            }

            return String.Empty;
        }