Example #1
0
        public void SetCacheInstance(Type cacheContextType)
        {
            if (cacheContextType == null)
            {
                throw new ArgumentNullException("cacheContextType");
            }

            if (!typeof(CacheContext).IsAssignableFrom(cacheContextType))
            {
                throw new ArgumentException(
                    string.Format(CultureInfo.CurrentCulture, "该类型 {0} 必须继承自抽象类CacheContext", cacheContextType),
                    "cacheContextType");
            }

            try
            {
                CacheContext = Activator.CreateInstance(cacheContextType) as CacheContext;
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(
                        String.Format(
                            CultureInfo.CurrentCulture,
                            "创建抽象类 CacheContext 的实例 {0} 失败",
                            cacheContextType),
                        ex);
            }
        }
 protected BaseController(IDbConnection db, IMetricTracker metrics, ICacheClient cache)
 {
     Db = db;
     Metrics = metrics;
     Log = LogManager.GetLogger(GetType());
     Cache = cache;
     CacheContext = new CacheContext(Cache);
 }
Example #3
0
        /// <summary>
        /// 动态设置缓存对象的新实例
        /// </summary>
        /// <param name="cacheContext">缓存实例对象</param>
        public void SetCacheInstance(CacheContext cacheContext)
        {
            //先释放现有的缓存组件
            if (CacheContext != null)
            {
                CacheContext = null;
            }

            //初始化缓存组件新的实例
            CacheContext = cacheContext;
        }
Example #4
0
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var cacheProvider       = new CacheContext();
            IList <LoginRoleDto> mt = cacheProvider.GetCache <IList <LoginRoleDto> >("nav" + GetLoginUserId.ToString());
            string url = Request.Path.Value.ToLower();

            if (url.Split('/').Length == 2)
            {
                url = url + "/index";
            }
            if (string.IsNullOrEmpty(url.Split('/')[2]))
            {
                url = url + "index";
            }
            if (url.Split('/').Length > 3)
            {
                url = url.Split('/')[0] + "/" + url.Split('/')[1] + "/" + url.Split('/')[2];
            }
            var first = mt.YDBSFirst(s => s.modules.URL.ToLower().Equals(url));

            ViewBag.CurrentNav = first == null ? null : first.modules.Id.ToString();
            base.OnActionExecuting(context);
        }
        public void ScopesCanBeEnteredAndExited()
        {
            var scopeA = new CacheContext("a");
            var scopeB = new CacheContext("b");
            var scopeC = new CacheContext("c");
            var scopeD = new CacheContext("d");

            var sut = new CacheScopeManager();

            sut.EnterScope(scopeA);
            sut.EnterScope(scopeB);

            sut.ExitScope();

            sut.EnterScope(scopeC);

            sut.ExitScope();
            sut.ExitScope();

            sut.EnterScope(scopeD);

            sut.ExitScope();
        }
Example #6
0
        private async Task SetCachedValueAsync(string cacheKey, string value, CacheContext context)
        {
            var bytes = Encoding.UTF8.GetBytes(value);

            var options = new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = context.ExpiresOn,
                SlidingExpiration  = context.ExpiresSliding,
                AbsoluteExpirationRelativeToNow = context.ExpiresAfter
            };

            // Default duration is sliding expiration (permanent as long as it's used)
            if (!options.AbsoluteExpiration.HasValue && !options.SlidingExpiration.HasValue && !options.AbsoluteExpirationRelativeToNow.HasValue)
            {
                options.SlidingExpiration = new TimeSpan(0, 1, 0);
            }

            await _dynamicCache.SetAsync(cacheKey, bytes, options);

            // Lazy load to prevent cyclic dependency
            var tagCache = _serviceProvider.GetRequiredService <ITagCache>();
            await tagCache.TagAsync(cacheKey, context.Tags.ToArray());
        }
        public override object Execute(List <string> args)
        {
            foreach (var property in Definition.ShaderProperties)
            {
                RenderMethodTemplate template = null;

                using (var cacheStream = CacheContext.OpenTagCacheRead())
                    template = CacheContext.Deserialize <RenderMethodTemplate>(cacheStream, property.Template);

                for (var i = 0; i < template.VectorArguments.Count; i++)
                {
                    Console.WriteLine("");

                    var argumentName  = CacheContext.GetString(template.VectorArguments[i].Name);
                    var argumentValue = new RealQuaternion(property.Arguments[i].Values);

                    Console.WriteLine(string.Format("{0}:", argumentName));

                    if (argumentName.EndsWith("_map"))
                    {
                        Console.WriteLine(string.Format("\tX Scale: {0}", argumentValue.I));
                        Console.WriteLine(string.Format("\tY Scale: {0}", argumentValue.J));
                        Console.WriteLine(string.Format("\tX Offset: {0}", argumentValue.K));
                        Console.WriteLine(string.Format("\tY Offset: {0}", argumentValue.W));
                    }
                    else
                    {
                        Console.WriteLine(string.Format("\tX: {0}", argumentValue.I));
                        Console.WriteLine(string.Format("\tY: {0}", argumentValue.J));
                        Console.WriteLine(string.Format("\tZ: {0}", argumentValue.K));
                        Console.WriteLine(string.Format("\tW: {0}", argumentValue.W));
                    }
                }
            }

            return(true);
        }
Example #8
0
        public LancamentoViewModel(IContextProvider repositorio)
        {
            _context = repositorio.CacheContext;
            Batidas  = new ObservableCollection <Batida>();

            if (IsInDesignMode)
            {
                // Code runs in Blend --> create design time data.

                Batidas.Add(new Batida {
                    Horario = new DateTime(2012, 1, 1, 08, 0, 0), NaturezaBatida = NaturezaBatida.Entrada
                });
                Batidas.Add(new Batida {
                    Horario = new DateTime(2012, 1, 1, 12, 0, 0), NaturezaBatida = NaturezaBatida.Saida
                });
                Batidas.Add(new Batida {
                    Horario = new DateTime(2012, 1, 1, 13, 0, 0), NaturezaBatida = NaturezaBatida.Entrada
                });
                Batidas.Add(new Batida {
                    Horario = new DateTime(2012, 1, 1, 18, 0, 0), NaturezaBatida = NaturezaBatida.Saida
                });
            }
            else
            {
                // Code runs "for real"
                _configuracao = _context.Configuracoes.FirstOrDefault();

                AdicionarBatida = new RelayCommand(AddBatida);
                RemoverBatida   = new RelayCommand <Batida>(RemoveBatida);

                Batidas.CollectionChanged += (sender, args) =>
                {
                    RaisePropertyChanged("HorarioTrabalhado");
                    RaisePropertyChanged("Resumo");
                };
            }
        }
Example #9
0
        public void GetFieldValue(object owner, object value = null, object definition = null)
        {
            if (value == null)
            {
                value = Field.GetValue(owner);
            }

            Owner   = owner;
            Loading = true;

            if (value == null)
            {
                textBox.Text = "";
                return;
            }

            var tag = (CachedTagInstance)value;

            var tagName = tag.Name ?? $"0x{tag.Index:X4}";

            textBox.Text = $"{tagName}.{CacheContext.GetString(tag.Group.Name)}";

            Loading = false;
        }
Example #10
0
        private void SyncRedisCache(DateTime date)
        {
            var siteDomains = DbContext.Domain.Select(p => p.SiteDomain).ToList();

            foreach (var domain in siteDomains)
            {
                var redisKey  = string.Format("visitor:loyalty:{0}:{1}", date.ToString("yyyyMMdd"), domain);
                var redisBody = CacheContext.Get <List <VisitorLoyaltyByDayCacheItem> >(redisKey);
                if (redisBody != null)
                {
                    var lockDomain = domain;
                    var query      = from p in DbContext.VisitorLoyalty
                                     where p.SiteDomain == lockDomain && p.TotalDate == date
                                     select p.Id;

                    var queryCount = query.Count();
                    if (queryCount > 0)
                    {
                        DbContext.VisitorLoyalty.Delete(p => p.SiteDomain == lockDomain && p.TotalDate == date);
                    }

                    foreach (var m in redisBody)
                    {
                        DbContext.VisitorLoyalty.Add(new VisitorLoyalty
                        {
                            SiteDomain     = m.SiteDomain,
                            TotalDate      = m.TotalDate,
                            FrequencyCount = m.FrequencyCount,
                            UniqueUser     = m.UniqueUser,
                            PageView       = m.PageView
                        });
                    }
                    DbContext.SaveChanges();
                }
            }
        }
Example #11
0
        public void Test_OnFieldChange()
        {
            CacheInvalidator <int, string> cacheInvalidator;
            ICache <int, string>           cache;

            long[]            testFieldTypes;
            const int         numFieldTypes = 10;
            Func <long, bool> fieldTypesToRemove;

            cache = new DictionaryCache <int, string>();
            for (int i = 0; i < numFieldTypes; i++)
            {
                cache.Add(i, i.ToString());
            }

            fieldTypesToRemove = e => e % 2 == 0; // All even numbered relationship types.
            testFieldTypes     = Enumerable.Range(0, numFieldTypes)
                                 .Where(i => fieldTypesToRemove(i))
                                 .Select(i => (long)i)
                                 .ToArray();

            cacheInvalidator = new CacheInvalidator <int, string>(cache, "a");

            for (int i = 0; i < numFieldTypes; i++)
            {
                using (CacheContext cacheContext = new CacheContext())
                {
                    cacheContext.FieldTypes.Add(i);
                    cacheInvalidator.AddInvalidations(cacheContext, i);
                }
            }

            cacheInvalidator.OnFieldChange(testFieldTypes);

            Assert.That(cache.Where(ce => fieldTypesToRemove(ce.Key)), Is.Empty);
        }
Example #12
0
        public void Test_DetachedContext()
        {
            long testEntityRef;
            long testRelationshipTypeRef;
            long testFieldTypeRef;

            testEntityRef           = 1;
            testRelationshipTypeRef = 2;
            testFieldTypeRef        = 3;
            using (CacheContext outerCacheContext = new CacheContext())
            {
                using (CacheContext detachedCacheContext = new CacheContext(ContextType.Detached))
                {
                    detachedCacheContext.Entities.Add(testEntityRef);
                    detachedCacheContext.RelationshipTypes.Add(testRelationshipTypeRef);
                    detachedCacheContext.FieldTypes.Add(testFieldTypeRef);

                    Assert.That(outerCacheContext, Has.Property("Entities").Count.EqualTo(0));
                    Assert.That(outerCacheContext, Has.Property("RelationshipTypes").Count.EqualTo(0));
                    Assert.That(outerCacheContext, Has.Property("FieldTypes").Count.EqualTo(0));
                    Assert.That(outerCacheContext, Has.Property("EntityInvalidatingRelationshipTypes").Count.EqualTo(0));
                }
            }
        }
Example #13
0
        public override object Execute(List <string> args)
        {
            if (args.Count != 1)
            {
                return(false);
            }

            if (!CacheContext.TryGetTag(args[0], out var tag))
            {
                return(false);
            }

            using (var stream = CacheContext.OpenTagCacheReadWrite())
            {
                var tagName = tag.Name ?? "<unnamed>";

                Console.Write($"Nulling {tagName}.{CacheContext.GetString(tag.Group.Name)}...");
                CacheContext.TagCache.Index[tag.Index] = null;
                CacheContext.TagCache.SetTagDataRaw(stream, tag, new byte[] { });
                Console.WriteLine("done.");
            }

            return(true);
        }
Example #14
0
        private string GetLabel(IList elements, int index)
        {
            if (index < 0 || index >= elements.Count)
            {
                return(null);
            }

            foreach (var info in TagStructure.GetTagFieldEnumerable(elements.GetType().GetGenericArguments()[0], CacheContext.Version))
            {
                if (info.Attribute == null || !info.Attribute.Flags.HasFlag(TagFieldFlags.Label))
                {
                    continue;
                }

                var value = info.FieldInfo.GetValue(elements[index]);

                if (info.FieldType == typeof(string))
                {
                    return((string)value);
                }
                else if (info.FieldType == typeof(StringId))
                {
                    return(CacheContext.GetString((StringId)value));
                }
                else if (info.FieldType.IsPrimitive && Tag.IsInGroup <Scenario>())
                {
                    return(GetLabel((IList)typeof(Scenario).GetField(nameof(Scenario.ObjectNames)).GetValue(Owner), Convert.ToInt32(value)));
                }
                else
                {
                    return(value.ToString());
                }
            }

            return(null);
        }
Example #15
0
        public override object Execute(List <string> args)
        {
            if (args.Count != 0)
            {
                return(false);
            }

            foreach (var property in Definition.ShaderProperties)
            {
                RenderMethodTemplate template = null;

                using (var cacheStream = CacheContext.OpenTagCacheRead())
                    template = CacheContext.Deserialize <RenderMethodTemplate>(cacheStream, property.Template);

                for (var i = 0; i < template.SamplerArguments.Count; i++)
                {
                    var mapTemplate = template.SamplerArguments[i];

                    Console.WriteLine($"Bitmap {i} ({CacheContext.GetString(mapTemplate.Name)}): {property.ShaderMaps[i].Bitmap.Group.Tag} 0x{property.ShaderMaps[i].Bitmap.Index:X4}");
                }
            }

            return(true);
        }
Example #16
0
        private static void CacheMonitorTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (s_cache)
            {
                foreach (string username in s_cache.Keys.ToList())
                {
                    CacheContext cacheContext = s_cache[username];

                    if (DateTime.UtcNow.Subtract(cacheContext.LastAccessTime).TotalMinutes > s_userCacheTimeout)
                    {
                        s_cache.Remove(username);
                    }
                    else
                    {
                        cacheContext.Refresh();
                    }
                }
            }

            lock (s_autoRefreshProviders)
            {
                for (int i = s_autoRefreshProviders.Count - 1; i >= 0; i--)
                {
                    CacheContext cacheContext = s_autoRefreshProviders[i];

                    if (DateTime.UtcNow.Subtract(cacheContext.LastRefreshTime).TotalMinutes > s_userCacheTimeout)
                    {
                        if (!cacheContext.Refresh())
                        {
                            s_autoRefreshProviders[i] = s_autoRefreshProviders[s_autoRefreshProviders.Count - 1];
                            s_autoRefreshProviders.RemoveAt(s_autoRefreshProviders.Count - 1);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Build and return the console navigation tree. This will be isolated by tenant and rule-set.
        /// </summary>
        /// <returns>
        /// A <see cref="EntityData"/> containing the tree structure.
        /// </returns>
        /// <exception cref="InvalidOperationException">
        /// The <see cref="ReadiNow.IO.RequestContext"/> is not set.
        /// </exception>
        public EntityData GetTree()
        {
            if (!ReadiNow.IO.RequestContext.IsSet)
            {
                throw new InvalidOperationException("Request context not set");
            }

            EntityData result;
            var        key = ReadiNow.IO.RequestContext.GetContext().Identity.Id;

            _securedResultCache.TryGetOrAdd(key, out result, innerKey =>
            {
                // Add invalidation
                using (CacheContext cacheContext = new CacheContext())
                {
                    cacheContext.RelationshipTypes.Add(WellKnownAliases.CurrentTenant.AllowDisplay);
                    _cacheInvalidator.AddInvalidations(cacheContext, innerKey);
                }

                return(_innerRepository.GetTree());
            });

            return(result);
        }
Example #18
0
        private CacheEntry CreateEntry(object k, Func<CacheContext, object> acquire)
        {
            var entry = new CacheEntry();
            var context = new CacheContext(k, entry.AddCacheDependency);
            CacheContext parentContext = null;
            try
            {
                // Push context
                parentContext = _accessor.Current;
                _accessor.Current = context;

                entry.Result = acquire(context);
            }
            finally
            {
                // Pop context
                _accessor.Current = parentContext;
            }

            // Logger.TraceInformation("[{0}]: Cache miss for {1}", GetType().Name, k);

            entry.CompactCacheDependencies();
            return entry;
        }
        internal CacheContext ToCacheContext()
        {
            var cacheContext = new CacheContext(CacheId)
                               .AddContext(Contexts.ToArray())
                               .AddTag(Tags.ToArray());

            if (ExpiresOn.HasValue)
            {
                cacheContext.WithExpiryOn(ExpiresOn.Value);
            }


            if (ExpiresAfter.HasValue)
            {
                cacheContext.WithExpiryAfter(ExpiresAfter.Value);
            }

            if (ExpiresSliding.HasValue)
            {
                cacheContext.WithExpirySliding(ExpiresSliding.Value);
            }

            return(cacheContext);
        }
        public bool GetCache(string token)
        {
            var cache = Get(token);

            if (cache == null)
            {
                return(false);
            }

            if (cache.InvalidTime > DateTime.Now)
            {
                //延长
                cache.InvalidTime = DateTime.Now.AddMinutes(5);
                //设置缓存
                CacheContext.Set(cache.Token, cache);

                return(true);
            }

            //移除无效Session缓存
            Remove(token);

            return(false);
        }
Example #21
0
        public MainnetRules(CacheContext cacheContext)
        {
            this._cacheContext = cacheContext;

            this._highestTarget = UInt256.Parse("00000000FFFF0000000000000000000000000000000000000000000000000000", NumberStyles.HexNumber);

            this._genesisBlock =
                new Block
                (
                    header: new BlockHeader
                    (
                        version: 1,
                        previousBlock: 0,
                        merkleRoot: UInt256.Parse("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", NumberStyles.HexNumber),
                        time: 1231006505,
                        bits: 486604799,
                        nonce: 2083236893
                    ),
                    transactions: ImmutableArray.Create
                    (
                        new Transaction
                        (
                            version: 1,
                            inputs: ImmutableArray.Create
                            (
                                new TxInput
                                (
                                    previousTxOutputKey: new TxOutputKey
                                    (
                                        txHash: 0,
                                        txOutputIndex: 0xFFFFFFFF
                                    ),
                                    scriptSignature: ImmutableArray.Create <byte>
                                    (
                                        0x04, 0xFF, 0xFF, 0x00, 0x1D, 0x01, 0x04, 0x45, 0x54, 0x68, 0x65, 0x20, 0x54, 0x69, 0x6D, 0x65,
                                        0x73, 0x20, 0x30, 0x33, 0x2F, 0x4A, 0x61, 0x6E, 0x2F, 0x32, 0x30, 0x30, 0x39, 0x20, 0x43, 0x68,
                                        0x61, 0x6E, 0x63, 0x65, 0x6C, 0x6C, 0x6F, 0x72, 0x20, 0x6F, 0x6E, 0x20, 0x62, 0x72, 0x69, 0x6E,
                                        0x6B, 0x20, 0x6F, 0x66, 0x20, 0x73, 0x65, 0x63, 0x6F, 0x6E, 0x64, 0x20, 0x62, 0x61, 0x69, 0x6C,
                                        0x6F, 0x75, 0x74, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x62, 0x61, 0x6E, 0x6B, 0x73
                                    ),
                                    sequence: 0xFFFFFFFF
                                )
                            ),
                            outputs: ImmutableArray.Create
                            (
                                new TxOutput
                                (
                                    value: 50 * SATOSHI_PER_BTC,
                                    scriptPublicKey: ImmutableArray.Create <byte>
                                    (
                                        0x41, 0x04, 0x67, 0x8A, 0xFD, 0xB0, 0xFE, 0x55, 0x48, 0x27, 0x19, 0x67, 0xF1, 0xA6, 0x71, 0x30,
                                        0xB7, 0x10, 0x5C, 0xD6, 0xA8, 0x28, 0xE0, 0x39, 0x09, 0xA6, 0x79, 0x62, 0xE0, 0xEA, 0x1F, 0x61,
                                        0xDE, 0xB6, 0x49, 0xF6, 0xBC, 0x3F, 0x4C, 0xEF, 0x38, 0xC4, 0xF3, 0x55, 0x04, 0xE5, 0x1E, 0xC1,
                                        0x12, 0xDE, 0x5C, 0x38, 0x4D, 0xF7, 0xBA, 0x0B, 0x8D, 0x57, 0x8A, 0x4C, 0x70, 0x2B, 0x6B, 0xF1,
                                        0x1D, 0x5F, 0xAC
                                    )
                                )
                            ),
                            lockTime: 0
                        )
                    )
                );

            this._genesisChainedBlock =
                new ChainedBlock
                (
                    blockHash: this._genesisBlock.Hash,
                    previousBlockHash: this._genesisBlock.Header.PreviousBlock,
                    height: 0,
                    totalWork: this._genesisBlock.Header.CalculateWork()
                );

            this._genesisBlockchain =
                new Data.Blockchain
                (
                    blockList: ImmutableList.Create(this._genesisChainedBlock),
                    blockListHashes: ImmutableHashSet.Create(this._genesisBlock.Hash),
                    utxo: ImmutableDictionary.Create <UInt256, UnspentTx>() // genesis block coinbase is not included in utxo, it is unspendable
                );
        }
Example #22
0
 public ApplicationCache(CacheContext cacheContext, CacheHelper cacheHelper, ILogger logger)
 {
     _logger       = logger;
     _cacheContext = cacheContext;
     _cache        = cacheHelper.GetCache();
 }
Example #23
0
        public void Render()
        {
            var variantName = Object.DefaultModelVariant != StringId.Invalid ?
                              CacheContext.GetString(Object.DefaultModelVariant) :
                              "default";

            var modelVariant = Model.Variants.FirstOrDefault(v => (CacheContext.GetString(v.Name) ?? v.Name.ToString()) == variantName);

            if (modelVariant == null && Model.Variants.Count > 0)
            {
                modelVariant = Model.Variants.First();
            }

            UpdateTransform();
            Device.Transform.World = World;

            foreach (var region in modelVariant.Regions)
            {
                if (region.RenderModelRegionIndex >= RenderModel.Regions.Count)
                {
                    continue;
                }

                var renderModelRegion = RenderModel.Regions[region.RenderModelRegionIndex];

                if (region.Permutations.Count == 0)
                {
                    continue;
                }

                var permutation = region.Permutations[0];

                if (permutation.RenderModelPermutationIndex < 0 || permutation.RenderModelPermutationIndex >= renderModelRegion.Permutations.Count)
                {
                    continue;
                }

                var renderModelPermutation = renderModelRegion.Permutations[permutation.RenderModelPermutationIndex];

                var meshIndex       = renderModelPermutation.MeshIndex;
                var meshCount       = renderModelPermutation.MeshCount;
                var regionName      = CacheContext.GetString(region.Name) ?? region.Name.ToString();
                var permutationName = CacheContext.GetString(permutation.Name) ?? permutation.Name.ToString();

                for (var currentMeshIndex = 0; currentMeshIndex < meshCount; currentMeshIndex++)
                {
                    var mesh = RenderModel.Geometry.Meshes[meshIndex + currentMeshIndex];

                    var renderVertex  = VertexDefinition.Get(mesh.Type);
                    var streamTypes   = renderVertex.GetStreamTypes();
                    var streamIndex   = streamTypes.First().Key;
                    var primitiveType = D3DPrimitiveType.TriangleList;

                    switch (mesh.IndexBufferType)
                    {
                    case TagPrimitiveType.PointList:
                        primitiveType = D3DPrimitiveType.PointList;
                        break;

                    case TagPrimitiveType.LineList:
                        primitiveType = D3DPrimitiveType.LineList;
                        break;

                    case TagPrimitiveType.LineStrip:
                        primitiveType = D3DPrimitiveType.LineStrip;
                        break;

                    case TagPrimitiveType.TriangleList:
                        primitiveType = D3DPrimitiveType.TriangleList;
                        break;

                    case TagPrimitiveType.TriangleFan:
                        primitiveType = D3DPrimitiveType.TriangleFan;
                        break;

                    case TagPrimitiveType.TriangleStrip:
                        primitiveType = D3DPrimitiveType.TriangleStrip;
                        break;
                    }

                    Device.VertexDeclaration = renderVertex.GetDeclaration(Device);
                    Device.SetStreamSource(streamTypes.First().Key, VertexBuffers[mesh.VertexBufferIndices[streamIndex]], 0);
                    Device.Indices = IndexBuffers[mesh.IndexBufferIndices.Where(index => index != ushort.MaxValue).First()];

                    foreach (var part in mesh.Parts)
                    {
                        if (part.MaterialIndex != -1)
                        {
                            var material = Materials[part.MaterialIndex];

                            Device.RenderState.AlphaBlendEnable = (part.TypeNew == TagTool.Geometry.Mesh.Part.PartTypeNew.Transparent);

                            foreach (var entry in material.Textures)
                            {
                                var name = entry.Key;

                                if (name.StartsWith("diffuse_map") || name.StartsWith("base_map") || name == "foam_texture")
                                {
                                    Device.SetTexture(0, entry.Value.Texture);
                                    break;
                                }
                            }

                            Device.TextureState[0].ColorOperation = TextureOperation.Modulate;
                            Device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
                            Device.TextureState[0].ColorArgument2 = TextureArgument.Current;
                            Device.RenderState.FillMode           = FillMode.Solid;
                        }

                        for (var currentSubPartIndex = 0; currentSubPartIndex < part.SubPartCount; currentSubPartIndex++)
                        {
                            var subPart = mesh.SubParts[part.FirstSubPartIndex + currentSubPartIndex];

                            Device.DrawIndexedPrimitives(primitiveType, 0, 0, subPart.VertexCount, subPart.FirstIndex, subPart.IndexCount - (primitiveType == D3DPrimitiveType.TriangleStrip ? 2 : 0));
                        }
                    }
                }
            }
        }
Example #24
0
        private Sound ConvertSound(Stream cacheStream, Dictionary <ResourceLocation, Stream> resourceStreams, Sound sound, string blamTag_Name)
        {
            if (BlamSoundGestalt == null)
            {
                BlamSoundGestalt = PortingContextFactory.LoadSoundGestalt(CacheContext, ref BlamCache);
            }

            if (!File.Exists(@"Tools\ffmpeg.exe") || !File.Exists(@"Tools\towav.exe"))
            {
                Console.WriteLine("Failed to locate sound conversion tools, please install ffmpeg and towav in the Tools folder");
                return(null);
            }

            //
            // Convert Sound Tag Data
            //

            var platformCodec      = BlamSoundGestalt.PlatformCodecs[sound.SoundReference.PlatformCodecIndex];
            var playbackParameters = BlamSoundGestalt.PlaybackParameters[sound.SoundReference.PlaybackParameterIndex];
            var scale          = BlamSoundGestalt.Scales[sound.SoundReference.ScaleIndex];
            var promotion      = sound.SoundReference.PromotionIndex != -1 ? BlamSoundGestalt.Promotions[sound.SoundReference.PromotionIndex] : new Promotion();
            var customPlayBack = sound.SoundReference.CustomPlaybackIndex != -1 ? new List <CustomPlayback> {
                BlamSoundGestalt.CustomPlaybacks[sound.SoundReference.CustomPlaybackIndex]
            } : new List <CustomPlayback>();
            var loop = sound.Flags.HasFlag(Sound.FlagsValue.LoopingSound);

            sound.PlaybackParameters = playbackParameters;
            sound.Scale           = scale;
            sound.PlatformCodec   = platformCodec.DeepClone();
            sound.Promotion       = promotion;
            sound.CustomPlayBacks = customPlayBack;

            //
            // Tag fixes
            //

            sound.SampleRate = platformCodec.SampleRate;
            sound.ImportType = ImportType.SingleLayer;
            // helps looping sound? there is another value, 10 for Unknown2 but I don't know when to activate it.
            if (sound.SoundReference.PitchRangeCount > 1)
            {
                sound.ImportType = ImportType.MultiLayer;
            }

            sound.PlatformCodec.LoadMode = 0;

            //
            // Process all the pitch ranges
            //

            var xmaFileSize = BlamSoundGestalt.GetFileSize(sound.SoundReference.PitchRangeIndex, sound.SoundReference.PitchRangeCount);

            if (xmaFileSize < 0)
            {
                return(null);
            }

            var xmaData = BlamCache.GetSoundRaw(sound.SoundReference.ZoneAssetHandle, xmaFileSize);

            if (xmaData == null)
            {
                return(null);
            }

            sound.PitchRanges = new List <PitchRange>(sound.SoundReference.PitchRangeCount);

            var soundDataAggregate     = new byte[0].AsEnumerable();
            var currentSoundDataOffset = 0;
            var totalSampleCount       = (uint)0;

            for (int pitchRangeIndex = sound.SoundReference.PitchRangeIndex; pitchRangeIndex < sound.SoundReference.PitchRangeIndex + sound.SoundReference.PitchRangeCount; pitchRangeIndex++)
            {
                totalSampleCount += BlamSoundGestalt.GetSamplesPerPitchRange(pitchRangeIndex);

                //
                // Convert Blam pitch range to ElDorado format
                //

                var pitchRange = BlamSoundGestalt.PitchRanges[pitchRangeIndex];
                pitchRange.ImportName           = ConvertStringId(BlamSoundGestalt.ImportNames[pitchRange.ImportNameIndex].Name);
                pitchRange.PitchRangeParameters = BlamSoundGestalt.PitchRangeParameters[pitchRange.PitchRangeParametersIndex];
                pitchRange.Unknown1             = 0;
                pitchRange.Unknown2             = 0;
                pitchRange.Unknown3             = 0;
                pitchRange.Unknown4             = 0;
                pitchRange.Unknown5             = -1;
                pitchRange.Unknown6             = -1;
                //I suspect this unknown7 to be a flag to tell if there is a Unknownblock in extrainfo. (See a sound in udlg for example)
                pitchRange.Unknown7         = 0;
                pitchRange.PermutationCount = (byte)BlamSoundGestalt.GetPermutationCount(pitchRangeIndex);
                pitchRange.Unknown8         = -1;

                // Add pitch range to ED sound
                sound.PitchRanges.Add(pitchRange);
                var newPitchRangeIndex = pitchRangeIndex - sound.SoundReference.PitchRangeIndex;
                sound.PitchRanges[newPitchRangeIndex].Permutations = new List <Permutation>();

                //
                // Determine the audio channel count
                //

                var channelCount = Encoding.GetChannelCount(sound.PlatformCodec.Encoding);

                //
                // Set compression format
                //

                sound.PlatformCodec.Compression = Compression.MP3;

                //
                // Convert Blam permutations to ElDorado format
                //

                var useCache = Sounds.UseAudioCacheCommand.AudioCacheDirectory != null;

                var basePermutationCacheName = Path.Combine(
                    useCache ? Sounds.UseAudioCacheCommand.AudioCacheDirectory.FullName : TempDirectory.FullName,
                    GetTagFileFriendlyName(blamTag_Name));

                var permutationCount        = BlamSoundGestalt.GetPermutationCount(pitchRangeIndex);
                var permutationOrder        = BlamSoundGestalt.GetPermutationOrder(pitchRangeIndex);
                var relativePitchRangeIndex = pitchRangeIndex - sound.SoundReference.PitchRangeIndex;

                for (int i = 0; i < permutationCount; i++)
                {
                    var permutationIndex  = pitchRange.FirstPermutationIndex + i;
                    var permutationSize   = BlamSoundGestalt.GetPermutationSize(permutationIndex);
                    var permutationOffset = BlamSoundGestalt.GetPermutationOffset(permutationIndex);

                    var permutation = BlamSoundGestalt.GetPermutation(permutationIndex).DeepClone();

                    permutation.ImportName            = ConvertStringId(BlamSoundGestalt.ImportNames[permutation.ImportNameIndex].Name);
                    permutation.SkipFraction          = new Bounds <float>(0.0f, permutation.Gain);
                    permutation.PermutationChunks     = new List <PermutationChunk>();
                    permutation.PermutationNumber     = (uint)permutationOrder[i];
                    permutation.IsNotFirstPermutation = (uint)(permutation.PermutationNumber == 0 ? 0 : 1);

                    string permutationName = $"{basePermutationCacheName}_{relativePitchRangeIndex}_{i}";

                    string extension = "mp3";

                    var cacheFileName = $"{permutationName}.{extension}";

                    bool exists = File.Exists(cacheFileName);

                    byte[] permutationData = null;

                    if (!exists || !useCache)
                    {
                        BlamSound blamSound = SoundConverter.ConvertGen3Sound(BlamCache, BlamSoundGestalt, sound, relativePitchRangeIndex, i, xmaData);
                        permutationData = blamSound.Data;
                        if (useCache)
                        {
                            using (EndianWriter output = new EndianWriter(new FileStream(cacheFileName, FileMode.Create, FileAccess.Write, FileShare.None), EndianFormat.BigEndian))
                            {
                                output.WriteBlock(blamSound.Data);
                            }
                        }
                    }
                    else
                    {
                        permutationData = File.ReadAllBytes(cacheFileName);
                    }

                    permutation.PermutationChunks.Add(new PermutationChunk(currentSoundDataOffset, permutationData.Length));
                    currentSoundDataOffset += permutationData.Length;
                    pitchRange.Permutations.Add(permutation);

                    soundDataAggregate = soundDataAggregate.Concat(permutationData);
                }
            }

            sound.Promotion.LongestPermutationDuration = (uint)sound.SoundReference.MaximumPlayTime;
            sound.Promotion.TotalSampleSize            = totalSampleCount;

            //
            // Convert Blam extra info to ElDorado format
            //

            var extraInfo = new ExtraInfo()
            {
                LanguagePermutations       = new List <ExtraInfo.LanguagePermutation>(),
                EncodedPermutationSections = new List <ExtraInfo.EncodedPermutationSection>()
            };

            for (int u = 0; u < sound.SoundReference.PitchRangeCount; u++)
            {
                var pitchRange = BlamSoundGestalt.PitchRanges[sound.SoundReference.PitchRangeIndex + u];

                for (int i = 0; i < pitchRange.PermutationCount; i++)
                {
                    var permutation      = BlamSoundGestalt.GetPermutation(pitchRange.FirstPermutationIndex + i);
                    var permutationChunk = BlamSoundGestalt.GetPermutationChunk(permutation.FirstPermutationChunkIndex);

                    extraInfo.LanguagePermutations.Add(new ExtraInfo.LanguagePermutation
                    {
                        RawInfo = new List <ExtraInfo.LanguagePermutation.RawInfoBlock>
                        {
                            new ExtraInfo.LanguagePermutation.RawInfoBlock
                            {
                                SkipFractionName = StringId.Invalid,
                                UnknownList      = new List <ExtraInfo.LanguagePermutation.RawInfoBlock.Unknown>
                                {
                                    new ExtraInfo.LanguagePermutation.RawInfoBlock.Unknown
                                    {
                                        Unknown1 = permutationChunk.UnknownA,
                                        Unknown2 = permutationChunk.UnknownSize,
                                        Unknown3 = 0,
                                        Unknown4 = permutation.SampleSize,
                                        Unknown5 = 0,
                                        Unknown6 = permutationChunk.EncodedSize & 0xFFFF
                                    }
                                },
                                Compression          = 8,
                                ResourceSampleSize   = pitchRange.Permutations[i].SampleSize,
                                ResourceSampleOffset = (uint)pitchRange.Permutations[i].PermutationChunks[0].Offset,
                                SampleCount          = (uint)pitchRange.Permutations[i].PermutationChunks[0].EncodedSize & 0x3FFFFFF,
                                //SampleCount = (uint)Math.Floor(pitchRange.Permutations[i].SampleSize * 128000.0 / (8 * sound.SampleRate.GetSampleRateHz())),
                                Unknown24 = 480
                            }
                        }
                    });
                }
            }

            if (sound.SoundReference.ExtraInfoIndex != -1)
            {
                foreach (var section in BlamSoundGestalt.ExtraInfo[sound.SoundReference.ExtraInfoIndex].EncodedPermutationSections)
                {
                    var newSection = section.DeepClone();

                    foreach (var info in newSection.SoundDialogueInfo)
                    {
                        for (var i = ((info.MouthDataLength % 2) == 0 ? 0 : 1); (i + 1) < info.MouthDataLength; i += 2)
                        {
                            Array.Reverse(newSection.EncodedData, (int)(info.MouthDataOffset + i), 2);
                        }

                        for (var i = ((info.LipsyncDataLength % 2) == 0 ? 0 : 1); (i + 1) < info.LipsyncDataLength; i += 2)
                        {
                            Array.Reverse(newSection.EncodedData, (int)(info.LipsyncDataOffset + i), 2);
                        }
                    }

                    extraInfo.EncodedPermutationSections.Add(newSection);
                }
            }

            sound.ExtraInfo = new List <ExtraInfo> {
                extraInfo
            };

            //
            // Convert Blam languages to ElDorado format
            //

            if (sound.SoundReference.LanguageIndex != -1)
            {
                sound.Languages = new List <LanguageBlock>();

                foreach (var language in BlamSoundGestalt.Languages)
                {
                    sound.Languages.Add(new LanguageBlock
                    {
                        Language             = language.Language,
                        PermutationDurations = new List <LanguageBlock.PermutationDurationBlock>(),
                        PitchRangeDurations  = new List <LanguageBlock.PitchRangeDurationBlock>(),
                    });

                    //Add all the  Pitch Range Duration block (pitch range count dependent)

                    var curLanguage = sound.Languages.Last();

                    for (int i = 0; i < sound.SoundReference.PitchRangeCount; i++)
                    {
                        curLanguage.PitchRangeDurations.Add(language.PitchRangeDurations[sound.SoundReference.LanguageIndex + i]);
                    }

                    //Add all the Permutation Duration Block and adjust offsets

                    for (int i = 0; i < curLanguage.PitchRangeDurations.Count; i++)
                    {
                        var curPRD = curLanguage.PitchRangeDurations[i];

                        //Get current block count for new index
                        short newPermutationIndex = (short)curLanguage.PermutationDurations.Count();

                        for (int j = curPRD.PermutationStartIndex; j < curPRD.PermutationStartIndex + curPRD.PermutationCount; j++)
                        {
                            curLanguage.PermutationDurations.Add(language.PermutationDurations[j]);
                        }

                        //apply new index
                        curPRD.PermutationStartIndex = newPermutationIndex;
                    }
                }
            }

            //
            // Prepare resource
            //

            sound.Unused    = new byte[] { 0, 0, 0, 0 };
            sound.Unknown12 = 0;

            sound.Resource = new PageableResource
            {
                Page = new RawPage
                {
                    Index = -1,
                },
                Resource = new TagResourceGen3
                {
                    ResourceType             = TagResourceTypeGen3.Sound,
                    DefinitionData           = new byte[20],
                    DefinitionAddress        = new CacheResourceAddress(CacheResourceAddressType.Definition, 536870912),
                    ResourceFixups           = new List <TagResourceGen3.ResourceFixup>(),
                    ResourceDefinitionFixups = new List <TagResourceGen3.ResourceDefinitionFixup>(),
                    Unknown2 = 1
                }
            };

            var data = soundDataAggregate.ToArray();

            var resourceContext = new ResourceSerializationContext(CacheContext, sound.Resource);

            CacheContext.Serializer.Serialize(resourceContext,
                                              new SoundResourceDefinition
            {
                Data = new TagData(data.Length, new CacheResourceAddress(CacheResourceAddressType.Resource, 0))
            });

            var definitionFixup = new TagResourceGen3.ResourceFixup()
            {
                BlockOffset = 12,
                Address     = new CacheResourceAddress(CacheResourceAddressType.Resource, 1073741824)
            };

            sound.Resource.Resource.ResourceFixups.Add(definitionFixup);

            sound.Resource.ChangeLocation(ResourceLocation.Audio);
            var resource = sound.Resource;

            if (resource == null)
            {
                throw new ArgumentNullException("resource");
            }

            var cache = CacheContext.GetResourceCache(ResourceLocation.Audio);

            if (!resourceStreams.ContainsKey(ResourceLocation.Audio))
            {
                resourceStreams[ResourceLocation.Audio] = FlagIsSet(PortingFlags.Memory) ?
                                                          new MemoryStream() :
                                                          (Stream)CacheContext.OpenResourceCacheReadWrite(ResourceLocation.Audio);

                if (FlagIsSet(PortingFlags.Memory))
                {
                    using (var resourceStream = CacheContext.OpenResourceCacheRead(ResourceLocation.Audio))
                        resourceStream.CopyTo(resourceStreams[ResourceLocation.Audio]);
                }
            }

            resource.Page.Index = cache.Add(resourceStreams[ResourceLocation.Audio], data, out uint compressedSize);
            resource.Page.CompressedBlockSize   = compressedSize;
            resource.Page.UncompressedBlockSize = (uint)data.Length;
            resource.DisableChecksum();

            for (int i = 0; i < 4; i++)
            {
                sound.Resource.Resource.DefinitionData[i] = (byte)(sound.Resource.Page.UncompressedBlockSize >> (i * 8));
            }

            return(sound);
        }
Example #25
0
        public static async ValueTask <Completion> WriteToAsync(List <FilterArgument> arguments, IReadOnlyList <Statement> statements, TextWriter writer, TextEncoder encoder, TemplateContext context)
        {
            var services = ((LiquidTemplateContext)context).Services;

            var dynamicCache      = services.GetService <IDynamicCacheService>();
            var cacheScopeManager = services.GetService <ICacheScopeManager>();
            var loggerFactory     = services.GetService <ILoggerFactory>();
            var logger            = loggerFactory.CreateLogger <CacheTag>();
            var cacheOptions      = services.GetRequiredService <IOptions <CacheOptions> >().Value;

            if (dynamicCache == null || cacheScopeManager == null)
            {
                logger.LogInformation(@"Liquid cache block entered without an available IDynamicCacheService or ICacheScopeManager.
                                        The contents of the cache block will not be cached.
                                        To enable caching, make sure that a feature that contains an implementation of IDynamicCacheService and ICacheScopeManager is enabled (for example, 'Dynamic Cache').");

                if (statements != null && statements.Count > 0)
                {
                    var completion = await statements.RenderStatementsAsync(writer, encoder, context);

                    if (completion != Completion.Normal)
                    {
                        return(completion);
                    }
                }

                return(Completion.Normal);
            }

            var filterArguments = new FilterArguments();

            foreach (var argument in arguments)
            {
                filterArguments.Add(argument.Name, await argument.Expression.EvaluateAsync(context));
            }

            var cacheKey              = filterArguments.At(0).ToStringValue();
            var contexts              = filterArguments["vary_by"].ToStringValue();
            var tags                  = filterArguments["dependencies"].ToStringValue();
            var durationString        = filterArguments["expires_after"].ToStringValue();
            var slidingDurationString = filterArguments["expires_sliding"].ToStringValue();

            var cacheContext = new CacheContext(cacheKey)
                               .AddContext(contexts.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries))
                               .AddTag(tags.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries));

            if (TimeSpan.TryParse(durationString, out var duration))
            {
                cacheContext.WithExpiryAfter(duration);
            }

            if (TimeSpan.TryParse(slidingDurationString, out var slidingDuration))
            {
                cacheContext.WithExpirySliding(slidingDuration);
            }

            var cacheResult = await dynamicCache.GetCachedValueAsync(cacheContext);

            if (cacheResult != null)
            {
                await writer.WriteAsync(cacheResult);

                return(Completion.Normal);
            }

            cacheScopeManager.EnterScope(cacheContext);

            var content = "";

            try
            {
                if (statements != null && statements.Count > 0)
                {
                    using var sb = StringBuilderPool.GetInstance();
                    using (var render = new StringWriter(sb.Builder))
                    {
                        foreach (var statement in statements)
                        {
                            await statement.WriteToAsync(render, encoder, context);
                        }

                        await render.FlushAsync();
                    }

                    content = sb.Builder.ToString();
                }
            }
            finally
            {
                cacheScopeManager.ExitScope();
            }

            if (cacheOptions.DebugMode)
            {
                // No need to optimize this code as it will be used for debugging purpose.
                var debugContent = new StringWriter();
                debugContent.WriteLine();
                debugContent.WriteLine($"<!-- CACHE BLOCK: {cacheContext.CacheId} ({Guid.NewGuid()})");
                debugContent.WriteLine($"         VARY BY: {String.Join(", ", cacheContext.Contexts)}");
                debugContent.WriteLine($"    DEPENDENCIES: {String.Join(", ", cacheContext.Tags)}");
                debugContent.WriteLine($"      EXPIRES ON: {cacheContext.ExpiresOn}");
                debugContent.WriteLine($"   EXPIRES AFTER: {cacheContext.ExpiresAfter}");
                debugContent.WriteLine($" EXPIRES SLIDING: {cacheContext.ExpiresSliding}");
                debugContent.WriteLine("-->");

                debugContent.WriteLine(content);

                debugContent.WriteLine();
                debugContent.WriteLine($"<!-- END CACHE BLOCK: {cacheContext.CacheId} -->");

                content = debugContent.ToString();
            }

            await dynamicCache.SetCachedValueAsync(cacheContext, content);

            await writer.WriteAsync(content);

            return(Completion.Normal);
        }
        /// <summary>
        /// Runs the report.
        /// </summary>
        /// <param name="report">The report.</param>
        /// <param name="reportSettings">The settings.</param>
        /// <param name="suppressPreload">Pass true if the report has already been preloaded.</param>
        /// <returns>ReportResult.</returns>
        /// <exception cref="System.ArgumentException">@The report identifier resource is not a report.;reportId</exception>
        public ReportCompletionData PrepareReport(Model.Report report, ReportSettings reportSettings, bool suppressPreload = false)
        {
            if (report == null)
            {
                throw new ArgumentNullException("report");
            }
            if (reportSettings == null)
            {
                reportSettings = new ReportSettings( );
            }

            StructuredQuery structuredQuery;
            PreparedQuery   preparedReport;
            PreparedQuery   preparedRollup;

            using (EDC.ReadiNow.Diagnostics.Profiler.Measure("Prepare report run"))
                using (MessageContext messageContext = new MessageContext("Reports"))
                    using (new SecurityBypassContext( ))
                    {
                        // Get the structured query
                        structuredQuery = GetStructuredQuery(report, reportSettings, suppressPreload);

                        // Handle metadata-only request
                        if (reportSettings.RequireSchemaMetadata)
                        {
                            ReportResult reportResult = new ReportResult(report, structuredQuery, null, null, null, reportSettings);
                            return(new ReportCompletionData(reportResult));
                        }

                        // Prepare query settings
                        preparedReport = PrepareReportRun(structuredQuery, reportSettings);
                        preparedReport.QuerySettings.Hint = "Rpt-" + report.Id.ToString( );

                        // Handle rollups
                        preparedRollup = PrepareReportRollupRun(report, preparedReport.StructuredQuery, reportSettings, preparedReport.QuerySettings);
                    }

            Func <ReportResult> resultCallback = () =>
            {
                ReportResult reportResult = null;
                QueryResult  queryResult  = null;
                QueryResult  rollupResult = null;

                using (new SecurityBypassContext( ))
                {
                    // Execute the query
                    queryResult = QueryRunner.ExecuteQuery(preparedReport.StructuredQuery, preparedReport.QuerySettings);

                    // Execute the rollup query
                    if (preparedRollup.StructuredQuery != null)
                    {
                        rollupResult = QueryRunner.ExecuteQuery(preparedRollup.StructuredQuery, preparedRollup.QuerySettings);
                    }

                    // Package up the result.
                    reportResult = new ReportResult(report,
                                                    preparedReport.StructuredQuery, queryResult,
                                                    preparedRollup.ClientAggregate, rollupResult,
                                                    reportSettings);
                }

                return(reportResult);
            };

            // Create cache key (null indicates report is not cacheable)
            IQueryRunnerCacheKey reportCacheKey       = null;
            IQueryRunnerCacheKey rollupCacheKey       = null;
            ReportResultCacheKey reportResultCacheKey = null;

            reportCacheKey = QueryRunnerCacheKeyProvider.CreateCacheKey(preparedReport.StructuredQuery, preparedReport.QuerySettings);
            if (reportCacheKey != null)
            {
                if (preparedRollup.StructuredQuery != null)
                {
                    rollupCacheKey = QueryRunnerCacheKeyProvider.CreateCacheKey(preparedRollup.StructuredQuery, preparedRollup.QuerySettings);
                }
                reportResultCacheKey = new ReportResultCacheKey(reportSettings, reportCacheKey, rollupCacheKey);
            }

            // Create completion result
            ReportCompletionData completionData = new ReportCompletionData( );

            completionData.ResultCallback = resultCallback;
            completionData.ResultCacheKey = reportResultCacheKey;
            completionData.CacheContextDuringPreparation = CacheContext.GetContext( );

            return(completionData);
        }
        public override object Execute(List <string> args)
        {
            if (args.Count < 1 || args.Count > 2)
            {
                return(false);
            }

            if (args.Count == 2 && (args[0].ToLower() != "raw"))
            {
                return(false);
            }

            var file = "";

            if (args.Count == 1)
            {
                file = args[0];
            }
            else
            {
                file = args[1];
            }

            var resourceContext = new ResourceSerializationContext(CacheContext, Geometry.Resource);
            var definition      = CacheContext.Deserializer.Deserialize <RenderGeometryApiResourceDefinition>(resourceContext);

            if (args.Count == 2)
            {
                using (var edResourceStream = new MemoryStream())
                    using (var edResourceReader = new EndianReader(edResourceStream, EndianFormat.LittleEndian))
                    {
                        var directory = args[1];
                        if (!Directory.Exists(directory))
                        {
                            Directory.CreateDirectory(directory);
                        }

                        var dataOutDir = directory;

                        for (var i = 0; i < definition.VertexBuffers.Count; i++)
                        {
                            edResourceStream.Position = definition.VertexBuffers[i].Definition.Data.Address.Offset;

                            var vertexBuffer = definition.VertexBuffers[i].Definition;

                            dataOutDir = Path.Combine(directory, $"{i}_{vertexBuffer.Format}_{vertexBuffer.Count}");

                            using (EndianWriter output = new EndianWriter(File.OpenWrite(dataOutDir), EndianFormat.LittleEndian))
                            {
                                byte[] data = edResourceReader.ReadBytes((int)vertexBuffer.Data.Size);
                                output.WriteBlock(data);
                            }
                        }
                    }
            }
            else
            {
                //
                // Convert Blam data to ElDorado data
                //

                using (var fileStream = File.Create(file))
                    using (var fileWriter = new StreamWriter(fileStream))
                    {
                        using (var edResourceStream = new MemoryStream())
                            using (var edResourceReader = new EndianReader(edResourceStream, EndianFormat.LittleEndian))
                            {
                                //
                                // Convert Blam vertex buffers
                                //

                                Console.Write("Converting vertex buffers...");
                                CacheContext.ExtractResource(Geometry.Resource, edResourceStream);

                                for (var i = 0; i < definition.VertexBuffers.Count; i++)
                                {
                                    edResourceStream.Position = definition.VertexBuffers[i].Definition.Data.Address.Offset;

                                    var vertexBuffer = definition.VertexBuffers[i].Definition;

                                    //fileWriter.WriteLine($"Offset = {vertexBuffer.Data.Address.Offset.ToString("X8")} Count = {vertexBuffer.Count} Size = {vertexBuffer.VertexSize}, Format = {vertexBuffer.Format.ToString()}");
                                    //fileWriter.WriteLine(Environment.NewLine);

                                    //fileWriter.WriteLine($"Vertex buffer index: {i}");

                                    switch (vertexBuffer.Format)
                                    {
                                    case VertexBufferFormat.TinyPosition:
                                        for (var j = 0; j < vertexBuffer.Count; j++)
                                        {
                                            fileWriter.WriteLine($"Position = ({edResourceReader.ReadUInt16().ToString("X4")},{edResourceReader.ReadUInt16().ToString("X4")},{edResourceReader.ReadUInt16().ToString("X4")},{edResourceReader.ReadUInt16().ToString("X4")})");
                                            fileWriter.WriteLine($"Normal   = ({edResourceReader.ReadByte().ToString("X2")},{edResourceReader.ReadByte().ToString("X2")},{edResourceReader.ReadByte().ToString("X2")},{edResourceReader.ReadByte().ToString("X2")})");
                                            fileWriter.WriteLine($"Color    = {edResourceReader.ReadUInt32().ToString("X8")}");
                                        }
                                        break;

                                    case VertexBufferFormat.StaticPerVertex:
                                        for (var j = 0; j < vertexBuffer.Count; j++)
                                        {
                                            fileWriter.WriteLine($"{vertexBuffer.Format} index: {j}:");
                                            fileWriter.WriteLine($"Texcoord = " + edResourceReader.ReadUInt32().ToString("X8"));
                                            fileWriter.WriteLine($"Texcoord = " + edResourceReader.ReadUInt32().ToString("X8"));
                                            fileWriter.WriteLine($"Texcoord = " + edResourceReader.ReadUInt32().ToString("X8"));
                                            fileWriter.WriteLine($"Texcoord = " + edResourceReader.ReadUInt32().ToString("X8"));
                                            fileWriter.WriteLine($"Texcoord = " + edResourceReader.ReadUInt32().ToString("X8"));
                                            fileWriter.WriteLine($"End of {vertexBuffer.Format} index: {j}");
                                            fileWriter.WriteLine(Environment.NewLine);
                                        }
                                        break;

                                    case VertexBufferFormat.Skinned:
                                        for (var j = 0; j < vertexBuffer.Count; j++)
                                        {
                                            fileWriter.WriteLine($"{j}:");
                                            fileWriter.WriteLine($"Position X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                            fileWriter.WriteLine($"Texcoord U = " + edResourceReader.ReadSingle() + " V = " + edResourceReader.ReadSingle());
                                            fileWriter.WriteLine($"Normal   X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                            fileWriter.WriteLine($"Tangent  X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                            fileWriter.WriteLine($"Binormal X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                            edResourceReader.ReadUInt32();
                                            edResourceReader.ReadUInt32();
                                        }
                                        break;

                                        /*
                                         * case VertexBufferFormat.Unknown1B:
                                         *  var goodCount = 0;
                                         *  for (var j = 0; j < vertexBuffer.Count; j++)
                                         *  {
                                         *      //fileWriter.WriteLine($"Index: {j}:");
                                         *      string values = $"({ edResourceReader.ReadSingle()},{ edResourceReader.ReadSingle()}," +
                                         *          $"{edResourceReader.ReadSingle()},{edResourceReader.ReadSingle()},{edResourceReader.ReadSingle()},{edResourceReader.ReadSingle()}" +
                                         *          $",{edResourceReader.ReadSingle()},{edResourceReader.ReadSingle()},{edResourceReader.ReadSingle()})";
                                         *      if(values != "(0,0,0,0,0,0,0,0,0)")
                                         *      {
                                         *          goodCount++;
                                         *          //fileWriter.WriteLine($"(1,2,3,4,5,6,7,8,9) = "+values);
                                         *      }
                                         *
                                         *
                                         *      /*
                                         *      fileWriter.WriteLine($"Unknown 1 = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Unknown 2 = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Unknown 3 = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Unknown 4 = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Unknown 5 = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Unknown 6 = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Unknown 7 = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Unknown 8 = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Unknown 9 = " + edResourceReader.ReadSingle());
                                         *
                                         *  }
                                         *  //fileWriter.WriteLine($"Valid Unknown1B count = {goodCount}");
                                         *  break;
                                         *
                                         * case VertexBufferFormat.Unknown1A:
                                         *  for (var j = 0; j < vertexBuffer.Count; j++)
                                         *  {
                                         *      //fileWriter.WriteLine($"Index: {j}:");
                                         *      //fileWriter.WriteLine($"Unknown 1 = " + edResourceReader.ReadUInt32().ToString("X8"));
                                         *      fileWriter.WriteLine($"(1,2,3) = ({edResourceReader.ReadUInt32().ToString("X8")},{edResourceReader.ReadUInt32().ToString("X8")},{edResourceReader.ReadUInt32().ToString("X8")})");
                                         *  }
                                         *  break;
                                         *
                                         * case VertexBufferFormat.Rigid:
                                         *  for (var j = 0; j < vertexBuffer.Count; j++)
                                         *  {
                                         *      fileWriter.WriteLine($"{j}:");
                                         *      fileWriter.WriteLine($"Position X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Texcoord U = " + edResourceReader.ReadSingle() + " V = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Normal   X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Tangent  X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Binormal X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *  }
                                         *  break;
                                         *
                                         * case VertexBufferFormat.StaticPerPixel:
                                         *  for (var j = 0; j < vertexBuffer.Count; j++)
                                         *  {
                                         *      fileWriter.WriteLine($"{j} U = " + edResourceReader.ReadSingle() + " V = " + edResourceReader.ReadSingle());
                                         *      //fileWriter.WriteLine(Environment.NewLine);
                                         *  }
                                         *  break;
                                         *
                                         * case VertexBufferFormat.AmbientPrt:
                                         *  for (var j = 0; j < vertexBuffer.Count; j++)
                                         *  {
                                         *      fileWriter.WriteLine($"{j} Blend weight = " + edResourceReader.ReadSingle());
                                         *      //fileWriter.WriteLine(Environment.NewLine);
                                         *  }
                                         *  break;
                                         *
                                         *
                                         * case VertexBufferFormat.World:
                                         *  for (var j = 0; j < vertexBuffer.Count; j++)
                                         *  {
                                         *      fileWriter.WriteLine($"{j}:");
                                         *      fileWriter.WriteLine($"Position X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Texcoord U = " + edResourceReader.ReadSingle() + " V = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Normal   X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Tangent  X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *      fileWriter.WriteLine($"Binormal X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *  }
                                         *  break;
                                         *
                                         *
                                         *
                                         */
                                        /*
                                         *  case VertexBufferFormat.QuadraticPrt:
                                         *      for (var j = 0; j < vertexBuffer.Count; j++)
                                         *      {
                                         *          fileWriter.WriteLine($"{vertexBuffer.Format} index: {j}:");
                                         *          fileWriter.WriteLine($"A X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"B X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"C X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"End of {vertexBuffer.Format} index: {j}");
                                         *          fileWriter.WriteLine(Environment.NewLine);
                                         *      }
                                         *      break;
                                         *
                                         *
                                         *
                                         *  case VertexBufferFormat.Unknown1B:
                                         *      for (var j = 0; j < vertexBuffer.Count; j++)
                                         *      {
                                         *          fileWriter.WriteLine($"{vertexBuffer.Format} index: {j}:");
                                         *          fileWriter.WriteLine($"Unknown 1 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Unknown 2 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Unknown 3 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Unknown 4 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Unknown 5 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Unknown 6 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Unknown 7 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Unknown 8 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Unknown 9 = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"End of {vertexBuffer.Format} index: {j}");
                                         *          fileWriter.WriteLine(Environment.NewLine);
                                         *      }
                                         *      break;
                                         *
                                         *  case VertexBufferFormat.Decorator:
                                         *      for (var j = 0; j < vertexBuffer.Count; j++)
                                         *      {
                                         *          fileWriter.WriteLine($"{vertexBuffer.Format} index: {j}:");
                                         *          fileWriter.WriteLine($"Position X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Texcoord U = " + edResourceReader.ReadSingle() + " V = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"Normal   X = " + edResourceReader.ReadSingle() + " Y = " + edResourceReader.ReadSingle() + " Z = " + edResourceReader.ReadSingle());
                                         *          fileWriter.WriteLine($"End of {vertexBuffer.Format} index: {j}");
                                         *          fileWriter.WriteLine(Environment.NewLine);
                                         *      }
                                         *      break;
                                         *
                                         *  case VertexBufferFormat.LinearPrt:
                                         *      for (var j = 0; j < vertexBuffer.Count; j++)
                                         *      {
                                         *          fileWriter.WriteLine($"{vertexBuffer.Format} index: {j}:");
                                         *          fileWriter.WriteLine($"Hex : " + edResourceReader.ReadUInt32().ToString("X8"));
                                         *          fileWriter.WriteLine($"End of {vertexBuffer.Format} index: {j}");
                                         *          fileWriter.WriteLine(Environment.NewLine);
                                         *      }
                                         *      break;
                                         */
                                    }

                                    //fileWriter.WriteLine($"End of Vertex Buffer index: {i}");

                                    //fileWriter.WriteLine(Environment.NewLine);
                                }
                            }
                    }
            }



            return(true);
        }
Example #28
0
        public override object Execute(List <string> args)
        {
            if (args.Count < 2)
            {
                return(false);
            }

            var fieldName      = args[0];
            var fieldNameLow   = fieldName.ToLower();
            var fieldNameSnake = fieldName.ToSnakeCase();

            var previousContext   = ContextStack.Context;
            var previousOwner     = Owner;
            var previousStructure = Structure;

            if (fieldName.Contains("."))
            {
                var lastIndex = fieldName.LastIndexOf('.');
                var blockName = fieldName.Substring(0, lastIndex);
                fieldName      = fieldName.Substring(lastIndex + 1, (fieldName.Length - lastIndex) - 1);
                fieldNameLow   = fieldName.ToLower();
                fieldNameSnake = fieldName.ToSnakeCase();

                var command = new EditBlockCommand(ContextStack, CacheContext, Tag, Owner);

                if (command.Execute(new List <string> {
                    blockName
                }).Equals(false))
                {
                    while (ContextStack.Context != previousContext)
                    {
                        ContextStack.Pop();
                    }
                    Owner     = previousOwner;
                    Structure = previousStructure;
                    return(false);
                }

                command = (ContextStack.Context.GetCommand("EditBlock") as EditBlockCommand);

                Owner     = command.Owner;
                Structure = command.Structure;

                if (Owner == null)
                {
                    while (ContextStack.Context != previousContext)
                    {
                        ContextStack.Pop();
                    }
                    Owner     = previousOwner;
                    Structure = previousStructure;
                    return(false);
                }
            }

            var field = TagStructure.GetTagFieldEnumerable(Structure)
                        .Find(f =>
                              f.Name == fieldName ||
                              f.Name.ToLower() == fieldNameLow ||
                              f.Name.ToSnakeCase() == fieldNameSnake);

            if (field == null)
            {
                Console.WriteLine("ERROR: {0} does not contain a field named \"{1}\".", Structure.Types[0].Name, fieldName);
                while (ContextStack.Context != previousContext)
                {
                    ContextStack.Pop();
                }
                Owner     = previousOwner;
                Structure = previousStructure;
                return(false);
            }

            var fieldType  = field.FieldType;
            var fieldAttrs = field.GetCustomAttributes(typeof(TagFieldAttribute), false);
            var fieldAttr  = fieldAttrs?.Length < 1 ? new TagFieldAttribute() : (TagFieldAttribute)fieldAttrs[0];
            var fieldInfo  = new TagFieldInfo(field, fieldAttr, uint.MaxValue, uint.MaxValue);
            var fieldValue = ParseArgs(field.FieldType, fieldInfo, args.Skip(1).ToList());

            if (fieldValue != null && fieldValue.Equals(false))
            {
                while (ContextStack.Context != previousContext)
                {
                    ContextStack.Pop();
                }
                Owner     = previousOwner;
                Structure = previousStructure;
                return(false);
            }

            if (field.FieldType == typeof(PageableResource))
            {
                var ownerValue = field.GetValue(Owner);

                if (fieldValue == null)
                {
                    field.SetValue(Owner, null);
                }
                else if (ownerValue is PageableResource pageable)
                {
                    var newLocation = ResourceLocation.None;

                    FileInfo resourceFile = null;

                    switch (fieldValue)
                    {
                    case FileInfo file:
                        if (!pageable.GetLocation(out newLocation))
                        {
                            newLocation = ResourceLocation.ResourcesB;
                        }
                        resourceFile = file;
                        break;

                    case ValueTuple <ResourceLocation, FileInfo> tuple:
                        newLocation  = tuple.Item1;
                        resourceFile = tuple.Item2;
                        break;

                    default:
                        throw new FormatException(fieldValue.ToString());
                    }

                    ResourceCache oldCache = null;

                    if (pageable.GetLocation(out var oldLocation))
                    {
                        oldCache = CacheContext.GetResourceCache(oldLocation);
                    }

                    var newCache = CacheContext.GetResourceCache(newLocation);

                    var data = File.ReadAllBytes(resourceFile.FullName);

                    pageable.Page.UncompressedBlockSize = (uint)data.Length;

                    if (oldLocation == newLocation && pageable.Page.Index != -1)
                    {
                        using (var stream = CacheContext.OpenResourceCacheReadWrite(oldLocation))
                        {
                            pageable.Page.CompressedBlockSize = oldCache.Compress(stream, pageable.Page.Index, data);
                        }
                    }
                    else
                    {
                        using (var destStream = CacheContext.OpenResourceCacheReadWrite(newLocation))
                        {
                            pageable.Page.Index = newCache.Add(destStream, data, out pageable.Page.CompressedBlockSize);
                        }

                        pageable.ChangeLocation(newLocation);
                    }

                    pageable.DisableChecksum();

                    field.SetValue(Owner, fieldValue = pageable);
                }
            }
            else
            {
                field.SetValue(Owner, fieldValue);
            }

            var typeString =
                fieldType.IsGenericType ?
                $"{fieldType.Name}<{fieldType.GenericTypeArguments[0].Name}>" :
                fieldType.Name;

            string valueString;

#if !DEBUG
            try
            {
#endif
            if (fieldValue == null)
            {
                valueString = "null";
            }
            else if (fieldType == typeof(StringId))
            {
                valueString = CacheContext.GetString((StringId)fieldValue);
            }
            else if (fieldType == typeof(CachedTagInstance))
            {
                var instance = (CachedTagInstance)fieldValue;

                var tagName = instance?.Name ?? $"0x{instance.Index:X4}";

                valueString = $"[0x{instance.Index:X4}] {tagName}.{CacheContext.GetString(instance.Group.Name)}";
            }
            else if (fieldType == typeof(TagFunction))
            {
                var function = (TagFunction)fieldValue;
                valueString = "";
                foreach (var datum in function.Data)
                {
                    valueString += datum.ToString("X2");
                }
            }
            else if (fieldType == typeof(PageableResource))
            {
                var pageable = (PageableResource)fieldValue;
                pageable.GetLocation(out var location);
                valueString = pageable == null ? "null" : $"{{ Location: {location}, Index: 0x{pageable.Page.Index:X4}, CompressedSize: 0x{pageable.Page.CompressedBlockSize:X8} }}";
            }
            else if (fieldInfo.FieldType.IsArray && fieldInfo.Attribute.Length != 0)
            {
                valueString = fieldValue == null ? "null" : $"[{fieldInfo.Attribute.Length}] {{ ";
                var valueArray = (Array)fieldValue;

                if (fieldValue != null)
                {
                    for (var i = 0; i < fieldInfo.Attribute.Length; i++)
                    {
                        valueString += $"{valueArray.GetValue(i)}{((i + 1) < fieldInfo.Attribute.Length ? "," : "")} ";
                    }

                    valueString += "}";
                }
            }
            else if (fieldType.GetInterface(typeof(IList).Name) != null)
            {
                valueString =
                    ((IList)fieldValue).Count != 0 ?
                    $"{{...}}[{((IList)fieldValue).Count}]" :
                    "null";
            }
            else
            {
                valueString = fieldValue.ToString();
            }
#if !DEBUG
        }

        catch (Exception e)
        {
            valueString = $"<ERROR MESSAGE=\"{e.Message}\" />";
        }
#endif

            var fieldFullName     = $"{field.DeclaringType.FullName}.{field.Name}".Replace("+", ".");
            var documentationNode = EditTagContextFactory.Documentation.SelectSingleNode($"//member[starts-with(@name, 'F:{fieldFullName}')]");

            Console.WriteLine("{0}: {1} = {2} {3}", field.Name, typeString, valueString,
                              documentationNode != null ?
                              $":: {documentationNode.FirstChild.InnerText.Replace("\r\n", "").TrimStart().TrimEnd()}" :
                              "");

            while (ContextStack.Context != previousContext)
            {
                ContextStack.Pop();
            }
            Owner     = previousOwner;
            Structure = previousStructure;

            return(true);
        }
Example #29
0
        public object ParseArgs(Type type, TagFieldInfo info, List <string> args)
        {
            var    input  = args[0];
            object output = null;

            if (type == typeof(byte))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!byte.TryParse(input, out byte value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(sbyte))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!sbyte.TryParse(input, out sbyte value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(short))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!short.TryParse(input, out short value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(ushort))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!ushort.TryParse(input, out ushort value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(int))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!int.TryParse(input, out int value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(uint))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!uint.TryParse(input, out uint value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(long))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!long.TryParse(input, out long value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(ulong))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!ulong.TryParse(input, out ulong value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(float))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!float.TryParse(input, out float value))
                {
                    return(false);
                }
                output = value;
            }
            else if (type == typeof(string))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                output = input;
            }
            else if (type == typeof(CachedTagInstance))
            {
                if (args.Count != 1 || !CacheContext.TryGetTag(input, out var tag))
                {
                    return(false);
                }
                output = tag;
            }
            else if (type == typeof(Tag))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!CacheContext.TryParseGroupTag(args[0], out var result))
                {
                    Console.WriteLine($"Invalid tag group specifier: {args[0]}");
                    return(false);
                }
                output = result;
            }
            else if (type == typeof(StringId))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                output = CacheContext.GetStringId(input);
            }
            else if (type == typeof(Angle))
            {
                if (args.Count != 1)
                {
                    return(false);
                }
                if (!float.TryParse(input, out float value))
                {
                    return(false);
                }
                output = Angle.FromDegrees(value);
            }
            else if (type == typeof(RealEulerAngles2d))
            {
                if (args.Count != 2)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float yaw) ||
                    !float.TryParse(args[1], out float pitch))
                {
                    return(false);
                }
                output = new RealEulerAngles2d(
                    Angle.FromDegrees(yaw),
                    Angle.FromDegrees(pitch));
            }
            else if (type == typeof(RealEulerAngles3d))
            {
                if (args.Count != 3)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float yaw) ||
                    !float.TryParse(args[1], out float pitch) ||
                    !float.TryParse(args[2], out float roll))
                {
                    return(false);
                }
                output = new RealEulerAngles3d(
                    Angle.FromDegrees(yaw),
                    Angle.FromDegrees(pitch),
                    Angle.FromDegrees(roll));
            }
            else if (type == typeof(RealPoint2d))
            {
                if (args.Count != 2)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float x) ||
                    !float.TryParse(args[1], out float y))
                {
                    return(false);
                }
                output = new RealPoint2d(x, y);
            }
            else if (type == typeof(RealPoint3d))
            {
                if (args.Count != 3)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float x) ||
                    !float.TryParse(args[1], out float y) ||
                    !float.TryParse(args[2], out float z))
                {
                    return(false);
                }
                output = new RealPoint3d(x, y, z);
            }
            else if (type == typeof(RealVector2d))
            {
                if (args.Count != 2)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float i) ||
                    !float.TryParse(args[1], out float j))
                {
                    return(false);
                }
                output = new RealVector2d(i, j);
            }
            else if (type == typeof(RealVector3d))
            {
                if (args.Count != 3)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float i) ||
                    !float.TryParse(args[1], out float j) ||
                    !float.TryParse(args[2], out float k))
                {
                    return(false);
                }
                output = new RealVector3d(i, j, k);
            }
            else if (type == typeof(RealQuaternion))
            {
                if (args.Count != 4)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float i) ||
                    !float.TryParse(args[1], out float j) ||
                    !float.TryParse(args[2], out float k) ||
                    !float.TryParse(args[3], out float w))
                {
                    return(false);
                }
                output = new RealQuaternion(i, j, k, w);
            }
            else if (type == typeof(RealPlane2d))
            {
                if (args.Count != 3)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float i) ||
                    !float.TryParse(args[1], out float j) ||
                    !float.TryParse(args[2], out float d))
                {
                    return(false);
                }
                output = new RealPlane2d(i, j, d);
            }
            else if (type == typeof(RealPlane3d))
            {
                if (args.Count != 4)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float i) ||
                    !float.TryParse(args[1], out float j) ||
                    !float.TryParse(args[2], out float k) ||
                    !float.TryParse(args[3], out float d))
                {
                    return(false);
                }
                output = new RealPlane3d(i, j, k, d);
            }
            else if (type.IsEnum)
            {
                if (args.Count != 1)
                {
                    return(false);
                }

                var query = args[0];

                object found;

                try
                {
                    found = Enum.Parse(type, query);
                }
                catch
                {
                    found = null;
                }

                var names = Enum.GetNames(type).ToList();

                if (found == null)
                {
                    var nameLow  = query.ToLower();
                    var namesLow = names.Select(i => i.ToLower()).ToList();

                    found = namesLow.Find(n => n == nameLow);

                    if (found == null)
                    {
                        var nameSnake  = query.ToSnakeCase();
                        var namesSnake = names.Select(i => i.ToSnakeCase()).ToList();
                        found = namesSnake.Find(n => n == nameSnake);

                        if (found == null)
                        {
                            Console.WriteLine("Invalid {0} enum option: {1}", type.Name, args[0]);
                            Console.WriteLine("");

                            Console.WriteLine("Valid options:");
                            foreach (var name in Enum.GetNames(type))
                            {
                                var fieldName         = $"{type.FullName}.{name}".Replace("+", ".");
                                var documentationNode = EditTagContextFactory.Documentation.SelectSingleNode($"//member[starts-with(@name, 'F:{fieldName}')]");

                                Console.WriteLine("\t{0} {1}", name,
                                                  documentationNode != null ?
                                                  $":: {documentationNode.FirstChild.InnerText.Replace("\r\n", "").TrimStart().TrimEnd()}" :
                                                  "");
                            }
                            Console.WriteLine();

                            return(false);
                        }
                        else
                        {
                            found = Enum.Parse(type, names[namesSnake.IndexOf((string)found)]);
                        }
                    }
                    else
                    {
                        found = Enum.Parse(type, names[namesLow.IndexOf((string)found)]);
                    }
                }

                output = found;
            }
            else if (type == typeof(Bounds <>))
            {
                var rangeType = type.GenericTypeArguments[0];
                var argCount  = RangeArgCount(rangeType);

                var min = ParseArgs(rangeType, null, args.Take(argCount).ToList());

                if (min.Equals(false))
                {
                    return(false);
                }

                var max = ParseArgs(rangeType, null, args.Skip(argCount).Take(argCount).ToList());

                if (max.Equals(false))
                {
                    return(false);
                }

                output = Activator.CreateInstance(type, new object[] { min, max });
            }
            else if (type.IsArray)
            {
                if (info?.FieldType == typeof(byte[]) && info?.Attribute.Length == 0)
                {   // tag_data field
                    if (args.Count != 1)
                    {
                        return(false);
                    }
                    if (input.Length % 2 != 0)
                    {
                        return(false);
                    }

                    List <byte> bytes = new List <byte>();

                    for (int i = 0; i < input.Length; i = i + 2)
                    {
                        bytes.Add(Convert.ToByte(input.Substring(i, 2), 16));
                    }

                    output = bytes.ToArray();
                }
                else
                {
                    if (info == null || args.Count != info.Attribute.Length)
                    {
                        return(false);
                    }

                    var elementType = info.FieldType.GetElementType();
                    var values      = Array.CreateInstance(elementType, info.Attribute.Length);

                    for (var i = 0; i < info.Attribute.Length; i++)
                    {
                        values.SetValue(Convert.ChangeType(ParseArgs(elementType, null, new List <string> {
                            args[i]
                        }), elementType), i);
                    }

                    return(values);
                }
            }
            else if (type == typeof(RealRgbColor))
            {
                if (args.Count != 3)
                {
                    return(false);
                }
                if (!float.TryParse(args[0], out float i) ||
                    !float.TryParse(args[1], out float j) ||
                    !float.TryParse(args[2], out float k))
                {
                    return(false);
                }
                output = new RealRgbColor(i, j, k);
            }
            else if (type == typeof(ArgbColor))
            {
                if (args.Count != 4)
                {
                    return(false);
                }
                if (!byte.TryParse(args[0], out byte i) ||
                    !byte.TryParse(args[1], out byte j) ||
                    !byte.TryParse(args[2], out byte k) ||
                    !byte.TryParse(args[3], out byte w))
                {
                    return(false);
                }
                output = new ArgbColor(i, j, k, w);
            }
            else if (type == typeof(Bounds <Angle>))
            {
                if (args.Count != 2)
                {
                    return(false);
                }

                if (!float.TryParse(args[0], out float i) ||
                    !float.TryParse(args[1], out float j))
                {
                    return(false);
                }

                output = new Bounds <Angle> {
                    Lower = Angle.FromDegrees(i), Upper = Angle.FromDegrees(j)
                };
            }
            else if (type == typeof(PageableResource))
            {
                if (args.Count < 1 || args.Count > 2)
                {
                    return(false);
                }

                if (args.Count == 1)
                {
                    switch (args[0].ToLower())
                    {
                    case "null":
                        output = null;
                        break;

                    default:
                        output = new FileInfo(args[0]);
                        if (!((FileInfo)output).Exists)
                        {
                            throw new FileNotFoundException(args[0]);
                        }
                        break;
                    }
                }
                else if (args.Count == 2)
                {
                    var resourceLocation = ResourceLocation.None;

                    switch (args[0].ToSnakeCase())
                    {
                    case "resources":
                        resourceLocation = ResourceLocation.Resources;
                        break;

                    case "textures":
                        resourceLocation = ResourceLocation.Textures;
                        break;

                    case "textures_b":
                        resourceLocation = ResourceLocation.TexturesB;
                        break;

                    case "audio":
                        resourceLocation = ResourceLocation.Audio;
                        break;

                    case "resources_b":
                        resourceLocation = ResourceLocation.ResourcesB;
                        break;

                    case "render_models" when CacheContext.Version >= CacheVersion.HaloOnline235640:
                        resourceLocation = ResourceLocation.RenderModels;
                        break;

                    case "lightmaps" when CacheContext.Version >= CacheVersion.HaloOnline235640:
                        resourceLocation = ResourceLocation.Lightmaps;
                        break;

                    default:
                        throw new FormatException($"Invalid resource location: {args[0]}");
                    }

                    var resourceFile = new FileInfo(args[1]);

                    if (!resourceFile.Exists)
                    {
                        throw new FileNotFoundException(args[1]);
                    }

                    output = (resourceLocation, resourceFile);
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            else
            {
                Console.WriteLine($"ERROR: Not Implemented.");
                return(false);
                // throw new NotImplementedException();
            }

            return(output);
        }
        /// <summary>
        /// Load the roles recursively for a user.
        /// </summary>
        /// <param name="subjectId">
        /// The user to load the roles for. This cannot be negative.
        /// </param>
        /// <returns>
        /// The roles the user is recursively a member of.
        /// </returns>
        /// <exception cref="ArgumentException">
        /// <paramref name="subjectId"/> cannot be negative.
        /// </exception>
        public ISet <long> GetUserRoles(long subjectId)
        {
            if (subjectId < 0)
            {
                throw new ArgumentException(@"Invalid user ID.", nameof(subjectId));
            }

            EntityRef userHasRoleEntityRef;

            userHasRoleEntityRef = new EntityRef(WellKnownAliases.CurrentTenant.UserHasRole);
            using (new SecurityBypassContext())
            {
                HashSet <long> roles = null;

                // Get the subject
                IEntity subject = Entity.Get(subjectId);

                if (Entity.Is <UserAccount>(subject))
                {
                    // Get the relationships of the 'userHasRole' type.
                    IChangeTracker <IMutableIdKey> relationshipMembers = Entity.GetRelationships(new EntityRef(subjectId), userHasRoleEntityRef, Direction.Forward);
                    if (relationshipMembers != null)
                    {
                        roles = new HashSet <long>(relationshipMembers.Select(pair => pair.Key));

                        GetParentRoles(roles);

                        roles.UnionWith(EveryoneRoles);
                    }
                    else
                    {
                        roles = new HashSet <long>( );
                    }

                    using (CacheContext cacheContext = CacheContext.GetContext( ))
                    {
                        cacheContext.Entities.Add(subjectId);
                        if (roles != null)
                        {
                            cacheContext.Entities.Add(roles);
                        }
                        cacheContext.EntityInvalidatingRelationshipTypes.Add(WellKnownAliases.CurrentTenant.UserHasRole);
                        cacheContext.EntityInvalidatingRelationshipTypes.Add(WellKnownAliases.CurrentTenant.IncludesRoles);
                    }
                }
                else if (Entity.Is <Role>(Entity.Get(subjectId)))
                {
                    // The subject is a role, so include just include itself, then fetch included roles.
                    roles = new HashSet <long>( );
                    roles.Add(subjectId);

                    GetParentRoles(roles);

                    roles.UnionWith(EveryoneRoles);

                    using (CacheContext cacheContext = CacheContext.GetContext( ))
                    {
                        cacheContext.Entities.Add(roles);
                        cacheContext.EntityInvalidatingRelationshipTypes.Add(WellKnownAliases.CurrentTenant.IncludesRoles);
                    }
                }
                else
                {
                    roles = new HashSet <long>( );
                }

                return(roles);
            }
        }
Example #31
0
        private void WriteValueExpression(HsSyntaxNode expr, BinaryReader stringReader, StreamWriter scriptWriter)
        {
            var valueType = (HsType.Halo3ODSTValue)Enum.Parse(typeof(HsType.Halo3ODSTValue), expr.ValueType.HaloOnline.ToString());

            switch (valueType)
            {
            case HsType.Halo3ODSTValue.FunctionName:
                scriptWriter.Write(expr.StringAddress == 0 ? OpcodeLookup(expr.Opcode) : ReadScriptString(stringReader, expr.StringAddress));
                break;     //Trust the string table, its faster than going through the dictionary with OpcodeLookup.

            case HsType.Halo3ODSTValue.Boolean:
                scriptWriter.Write(expr.Data[0] == 0 ? "false" : "true");
                break;

            case HsType.Halo3ODSTValue.Real:
                scriptWriter.Write(BitConverter.ToSingle(new[] { expr.Data[0], expr.Data[1], expr.Data[2], expr.Data[3] }, 0));
                break;

            case HsType.Halo3ODSTValue.Short:
                scriptWriter.Write(BitConverter.ToInt16(new[] { expr.Data[0], expr.Data[1], }, 0));
                break;

            case HsType.Halo3ODSTValue.Long:
                scriptWriter.Write(BitConverter.ToInt32(new[] { expr.Data[0], expr.Data[1], expr.Data[2], expr.Data[3] }, 0));
                break;

            case HsType.Halo3ODSTValue.String:
                scriptWriter.Write(expr.StringAddress == 0 ? "none" : $"\"{ReadScriptString(stringReader, expr.StringAddress)}\"");
                break;

            case HsType.Halo3ODSTValue.Script:
                scriptWriter.Write(Definition.Scripts[BitConverter.ToInt16(new[] { expr.Data[0], expr.Data[1] }, 0)].ScriptName);
                break;

            case HsType.Halo3ODSTValue.StringId:
                scriptWriter.Write(CacheContext.GetString(new StringId(BitConverter.ToUInt32(new[] { expr.Data[0], expr.Data[1], expr.Data[2], expr.Data[3] }, 0))));
                break;

            case HsType.Halo3ODSTValue.GameDifficulty:
                switch (BitConverter.ToInt16(new[] { expr.Data[0], expr.Data[1] }, 0))
                {
                case 0: scriptWriter.Write("easy"); break;

                case 1: scriptWriter.Write("normal"); break;

                case 2: scriptWriter.Write("heroic"); break;

                case 3: scriptWriter.Write("legendary"); break;

                default: throw new NotImplementedException();
                }
                break;

            case HsType.Halo3ODSTValue.Object:
            case HsType.Halo3ODSTValue.Device:
            case HsType.Halo3ODSTValue.CutsceneCameraPoint:
            case HsType.Halo3ODSTValue.TriggerVolume:
            case HsType.Halo3ODSTValue.UnitSeatMapping:
            case HsType.Halo3ODSTValue.Vehicle:
            case HsType.Halo3ODSTValue.VehicleName:
                scriptWriter.Write(expr.StringAddress == 0 ? "none" : $"\"{ReadScriptString(stringReader, expr.StringAddress)}\"");
                break;

            default:
                scriptWriter.Write($"<UNIMPLEMENTED VALUE: {expr.Flags.ToString()} {expr.ValueType.ToString()}>");
                break;
            }
        }
Example #32
0
 protected ControllerBase(ICacheClient cache)
     : this()
 {
     Cache = cache;
     CacheContext = new CacheContext(Cache);
 }
        /// <summary>
        ///
        /// KEY:referrer:category:[年月日]:[小时]:[域名]
        ///
        /// </summary>
        /// <param name="dateTime"></param>
        private void SyncRedisCache(DateTime dateTime)
        {
            var day  = DateTime.Parse(dateTime.ToString("yyyy-MM-dd"));
            var hour = dateTime.Hour;

            var siteDomains = DbContext.Domain.Select(p => p.SiteDomain).ToList();

            foreach (var domain in siteDomains)
            {
                //来源分类统计结果
                var redisKey  = string.Format("referrer:category:{0}:{1}:{2}", dateTime.ToString("yyyyMMdd"), dateTime.Hour, domain);
                var redisBody = CacheContext.Get <List <OriginCategoryByHourCacheItem> >(redisKey);
                if (redisBody != null && redisBody.Any())
                {
                    foreach (var item in redisBody)
                    {
                        var lockDomain = domain;
                        var cacheItem  = item;
                        var query      = from p in DbContext.OriginCategory
                                         where p.SiteDomain == lockDomain &&
                                         p.TotalDate == day &&
                                         p.TotalHour == hour &&
                                         p.OriginDomain == cacheItem.OriginDomain &&
                                         p.IndustryCode == cacheItem.IndustryCode
                                         select p.Id;

                        var queryCount = query.Count();
                        if (queryCount == 0)
                        {
                            #region Insert

                            DbContext.OriginCategory.Add(new OriginCategory
                            {
                                //时间维度
                                SiteDomain = domain,
                                TotalDate  = day,
                                TotalHour  = hour,

                                //来源分类指标
                                OriginDomain = cacheItem.OriginDomain,
                                IndustryCode = cacheItem.IndustryCode,
                                TotalNumber  = cacheItem.TotalNumber,

                                //通用指标
                                PageView                = cacheItem.PageView,
                                UniqueUser              = cacheItem.UniqueUser,
                                NewUniqueUser           = cacheItem.NewUniqueUser,
                                NewUniqueUserRate       = cacheItem.NewUniqueUserRate,
                                UniqueIp                = cacheItem.UniqueIp,
                                AccessNumber            = cacheItem.AccessNumber,
                                UserViewPageAverage     = cacheItem.UserViewPageAverage,
                                ViewPageDeptAverage     = cacheItem.ViewPageDeptAverage,
                                ViewPageTimeSpanAverage = cacheItem.ViewPageTimeSpanAverage,
                                BounceRate              = cacheItem.BounceRate
                            });
                            DbContext.SaveChanges();

                            #endregion
                        }
                        else
                        {
                            #region update

                            DbContext.OriginCategory.Update(
                                p => p.SiteDomain == lockDomain &&
                                p.TotalDate == day &&
                                p.TotalHour == hour &&
                                p.OriginDomain == cacheItem.OriginDomain &&
                                p.IndustryCode == cacheItem.IndustryCode,
                                m => new OriginCategory
                            {
                                //分类指标
                                TotalNumber = cacheItem.TotalNumber,

                                //通用指标
                                PageView                = cacheItem.PageView,
                                UniqueUser              = cacheItem.UniqueUser,
                                NewUniqueUser           = cacheItem.NewUniqueUser,
                                NewUniqueUserRate       = cacheItem.NewUniqueUserRate,
                                UniqueIp                = cacheItem.UniqueIp,
                                AccessNumber            = cacheItem.AccessNumber,
                                UserViewPageAverage     = cacheItem.UserViewPageAverage,
                                ViewPageDeptAverage     = cacheItem.ViewPageDeptAverage,
                                ViewPageTimeSpanAverage = cacheItem.ViewPageTimeSpanAverage,
                                BounceRate              = cacheItem.BounceRate
                            });

                            #endregion
                        }
                    }
                }
            }
        }
 public ContextProvider()
 {
     _cacheContext = _cacheContext ?? new CacheContext();
 }
        public override async ValueTask <Completion> WriteToAsync(TextWriter writer, TextEncoder encoder, TemplateContext context)
        {
            if (!context.AmbientValues.TryGetValue("Services", out var servicesObj))
            {
                throw new ArgumentException("Services missing while invoking 'cache' block");
            }

            var services = servicesObj as IServiceProvider;

            var dynamicCache      = services.GetService <IDynamicCacheService>();
            var cacheScopeManager = services.GetService <ICacheScopeManager>();
            var loggerFactory     = services.GetService <ILoggerFactory>();
            var logger            = loggerFactory.CreateLogger <CacheStatement>();
            var cacheOptions      = services.GetRequiredService <IOptions <CacheOptions> >().Value;

            if (dynamicCache == null || cacheScopeManager == null)
            {
                logger.LogInformation(@"Liquid cache block entered without an available IDynamicCacheService or ICacheScopeManager.
                                        The contents of the cache block will not be cached.
                                        To enable caching, make sure that a feature that contains an implementation of IDynamicCacheService and ICacheScopeManager is enabled (for example, 'Dynamic Cache').");

                await writer.WriteAsync(await EvaluateStatementsAsync(encoder, context));

                return(Completion.Normal);
            }

            var arguments             = (FilterArguments)(await _arguments.EvaluateAsync(context)).ToObjectValue();
            var cacheKey              = arguments.At(0).ToStringValue();
            var contexts              = arguments["vary_by"].ToStringValue();
            var tags                  = arguments["dependencies"].ToStringValue();
            var durationString        = arguments["expires_after"].ToStringValue();
            var slidingDurationString = arguments["expires_sliding"].ToStringValue();

            var cacheContext = new CacheContext(cacheKey)
                               .AddContext(contexts.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries))
                               .AddTag(tags.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries));

            if (TimeSpan.TryParse(durationString, out var duration))
            {
                cacheContext.WithExpiryAfter(duration);
            }

            if (TimeSpan.TryParse(slidingDurationString, out var slidingDuration))
            {
                cacheContext.WithExpirySliding(slidingDuration);
            }

            var cacheResult = await dynamicCache.GetCachedValueAsync(cacheContext);

            if (cacheResult != null)
            {
                await writer.WriteAsync(cacheResult);

                return(Completion.Normal);
            }

            cacheScopeManager.EnterScope(cacheContext);
            String content;

            try
            {
                content = await EvaluateStatementsAsync(encoder, context);
            }
            finally
            {
                cacheScopeManager.ExitScope();
            }

            if (cacheOptions.DebugMode)
            {
                // No need to optimize this code as it will be used for debugging purpose.
                var debugContent = new StringWriter();
                debugContent.WriteLine();
                debugContent.WriteLine($"<!-- CACHE BLOCK: {cacheContext.CacheId} ({Guid.NewGuid()})");
                debugContent.WriteLine($"         VARY BY: {String.Join(", ", cacheContext.Contexts)}");
                debugContent.WriteLine($"    DEPENDENCIES: {String.Join(", ", cacheContext.Tags)}");
                debugContent.WriteLine($"      EXPIRES ON: {cacheContext.ExpiresOn}");
                debugContent.WriteLine($"   EXPIRES AFTER: {cacheContext.ExpiresAfter}");
                debugContent.WriteLine($" EXPIRES SLIDING: {cacheContext.ExpiresSliding}");
                debugContent.WriteLine("-->");

                debugContent.WriteLine(content);

                debugContent.WriteLine();
                debugContent.WriteLine($"<!-- END CACHE BLOCK: {cacheContext.CacheId} -->");

                content = debugContent.ToString();
            }

            await dynamicCache.SetCachedValueAsync(cacheContext, content);

            await writer.WriteAsync(content);

            return(Completion.Normal);
        }
 public UberTripRepository(CacheContext context)
     : base(context)
 {
 }