Beispiel #1
0
 /// <summary>
 ///     Validate the given SporeModel
 /// </summary>
 /// <param name="model"></param>
 /// <returns></returns>
 private bool ValidateSporeModel(SporeModel model)
 {
     try
     {
         SporeModel.Validate(model);
         return(true);
     }
     catch (Exception e)
     {
         _logger.LogError($"ValidateSporeModel: Failed To Validate SporeModel: {e}");
         return(false);
     }
 }
Beispiel #2
0
 /// <summary>
 ///     Deserialize SporeModel to xml
 /// </summary>
 /// <param name="model"></param>
 /// <param name="xml"></param>
 /// <returns></returns>
 private bool DeserializeSporeModel(SporeModel model, out string xml)
 {
     try
     {
         xml = SporeModel.DeserializeToxml(model);
         return(true);
     }
     catch (Exception e)
     {
         xml = null;
         _logger.LogError($"DeserializeSporeModel: Failed To Deserialize SporeModel: {e}");
         return(false);
     }
 }
Beispiel #3
0
 /// <summary>
 ///     Loads a SporeModel
 /// </summary>
 /// <param name="stream"></param>
 /// <returns></returns>
 private bool LoadSporeModel(Stream stream, out SporeModel model)
 {
     try
     {
         model = SporeModel.SerializeFromXml(stream);
         return(true);
     }
     catch (Exception e)
     {
         model = null;
         _logger.LogError($"LoadSporeModel: Failed To Serialize SporeModel: {e}");
         return(false);
     }
 }
Beispiel #4
0
        public async Task <bool> AddAsync(AssetUploadForm form, SporeServerAsset asset, SporeServerAsset parentAsset, bool slurped, SporeAssetType type)
        {
            try
            {
                var files = GetAssetFiles(form.AssetId);

                // load, validate & deserialize SporeModel
                SporeModel model    = null;
                string     modelXml = null;
                using (Stream modelStream = OpenFormFileStream(form.ModelData))
                {
                    if (!LoadSporeModel(modelStream, out model))
                    {
                        throw new Exception("LoadSporeModel Failed");
                    }
                    if (!ValidateSporeModel(model))
                    {
                        throw new Exception("ValidateSporeModel Failed");
                    }
                    if (!DeserializeSporeModel(model, out modelXml))
                    {
                        throw new Exception("DeserializeSporeModel Failed");
                    }
                }

                // save files
                File.WriteAllText(files.ModelFile, modelXml);
                await SaveFormFile(form.ThumbnailData, files.ThumbFile);

                if (form.ImageData != null)
                {
                    await SaveFormFile(form.ImageData, files.ImageFile);
                }
                if (form.ImageData_2 != null)
                {
                    await SaveFormFile(form.ImageData_2, files.ImageFile2);
                }
                if (form.ImageData_3 != null)
                {
                    await SaveFormFile(form.ImageData_3, files.ImageFile3);
                }
                if (form.ImageData_4 != null)
                {
                    await SaveFormFile(form.ImageData_4, files.ImageFile4);
                }

                // update database
                asset.Used            = true;
                asset.Timestamp       = DateTime.Now;
                asset.OriginalAssetId = 0;
                asset.ParentAssetId   = 0;
                if (parentAsset != null)
                {
                    // when original asset id of parent is 0,
                    // the parent id is the original asset id
                    // else follow the original asset id specified
                    if (parentAsset.OriginalAssetId == 0)
                    {
                        asset.OriginalAssetId = parentAsset.AssetId;
                    }
                    else
                    {
                        asset.OriginalAssetId = parentAsset.OriginalAssetId;
                    }
                    asset.ParentAssetId = parentAsset.AssetId;
                }
                asset.Name = form.ModelData.FileName;

                var tags = new List <SporeServerAssetTag>();
                if (form.Tags != null)
                {
                    foreach (string tagString in form.Tags.Split(","))
                    {
                        string trimmedTagString = tagString.TrimStart().TrimEnd();

                        tags.Add(new SporeServerAssetTag()
                        {
                            Asset = asset,
                            Tag   = trimmedTagString
                        });
                    }
                }
                asset.Tags = tags;

                var traits = new List <SporeServerAssetTrait>();
                if (form.TraitGuids != null)
                {
                    foreach (string traitString in form.TraitGuids.Split(","))
                    {
                        string trimmedTraitString = traitString.TrimStart()
                                                    .TrimStart('0', 'x')
                                                    .TrimEnd();

                        Int64 traitType = Int64.Parse(trimmedTraitString, NumberStyles.HexNumber);

                        // make sure the trait id is valid
                        if (!Enum.IsDefined(typeof(SporeAssetTraitType), traitType))
                        {
                            throw new Exception($"Invalid Trait Id: {traitType}");
                        }

                        traits.Add(new SporeServerAssetTrait()
                        {
                            Asset     = asset,
                            TraitType = (SporeAssetTraitType)traitType
                        });
                    }
                }
                asset.Traits = traits;

                asset.Description = form.Description;
                asset.Size        = form.ThumbnailData.Length;
                asset.Slurped     = slurped;
                // TODO, put this in a struct or whatever?
                asset.ModelFileUrl  = GetRelativeUrlFromPath(files.ModelFile);
                asset.ThumbFileUrl  = GetRelativeUrlFromPath(files.ThumbFile);
                asset.ImageFileUrl  = GetRelativeUrlFromPath(files.ImageFile);
                asset.ImageFile2Url = GetRelativeUrlFromPath(files.ImageFile2);
                asset.ImageFile3Url = GetRelativeUrlFromPath(files.ImageFile3);
                asset.ImageFile4Url = GetRelativeUrlFromPath(files.ImageFile4);
                asset.ModelType     = (SporeModelType)model.Properties.ModelType;
                asset.Type          = type;
                _context.Assets.Update(asset);
                await _context.SaveChangesAsync();

                _logger.LogInformation($"AddAsync: Added Asset {asset.AssetId}");
                return(true);
            }
            catch (Exception e)
            {
                _logger.LogError($"AddAsync: Failed To Add Asset {asset.AssetId}: {e}");
                return(false);
            }
        }