Esempio n. 1
0
        public override void StepIn(IonType type)
        {
            IonContainer c;

            switch (type)
            {
            case IonType.List:
                c = new IonList();
                break;

            case IonType.Sexp:
                c = new IonSexp();
                break;

            case IonType.Struct:
                c = new IonStruct();
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }

            _containers.Push(c);
            AppendValue(c);
            _currentContainer = c;
        }
Esempio n. 2
0
        /// <summary>
        /// 设置属性
        /// </summary>
        protected override void SetAttributes()
        {
            IonList control = this.ControlHost.Content as IonList;

            if (control.ShowStyle == EIonListStyle.Inset)
            {
                this.HtmlWriter.AddAttribute("inset", null);
            }
            else if (control.ShowStyle == EIonListStyle.NoBorder)
            {
                this.HtmlWriter.AddAttribute("no-border", null);
            }
            else if (control.ShowStyle == EIonListStyle.NoLines)
            {
                this.HtmlWriter.AddAttribute("no-lines", null);
            }
            if (!this.IsPreview)
            {
                if (this.ControlHost.AttachObject != null)
                {
                    IonSegmentContentAttach attachObject = this.ControlHost.AttachObject as IonSegmentContentAttach;
                    if (!string.IsNullOrEmpty(attachObject.SegmentName))
                    {
                        this.HtmlWriter.AddAttribute("*ngSwitchCase", "'" + attachObject.SegmentName + "'", false);
                    }
                }
            }

            base.SetAttributes();
        }
Esempio n. 3
0
        /// <summary>
        /// 设置子元素
        /// </summary>
        protected override void SetChildElements()
        {
            IonList control = this.ControlHost.Content as IonList;

            if (control.IsHeader)
            {
                this.HtmlWriter.RenderBeginTag("wm-list-header");
                this.HtmlWriter.WriteEncodedText(this.ControlHost.Title);
                this.HtmlWriter.RenderEndTag();
            }
            foreach (var c in this.ControlHost.Children)
            {
                var builder = c.GetBuilder(this.IsPreview, this.ScreenDefinition, this.Compile, this.ProjectDocument, this.PermissionData, this.HtmlWriter);
                builder.Parent = this;
                builder.Build();
            }
        }
Esempio n. 4
0
        public KfxContainer(Stream fs)
        {
            var catalog = new SimpleCatalog();

            catalog.PutTable(YjSymbolTable);

            var loader = IonLoader.WithReaderOptions(new ReaderOptions
            {
                Encoding = Encoding.UTF8,
                Format   = ReaderFormat.Detect,
                Catalog  = catalog
            });

            var header            = new KfxHeader(fs);
            var containerInfoData = new MemoryStream(fs.ReadBytes((int)header.ContainerInfoOffset, (int)header.ContainerInfoLength, SeekOrigin.Begin));

            var containerInfo = loader.LoadSingle <IonStruct>(containerInfoData);

            if (containerInfo == null)
            {
                throw new Exception("Bad container or something");
            }

            var containerId = containerInfo.GetById <IonString>(409).StringValue;

            var compressionType = containerInfo.GetById <IonInt>(410).IntValue;

            if (compressionType != DefaultCompressionType)
            {
                throw new Exception($"Unexpected bcComprType ({compressionType})");
            }

            var drmScheme = containerInfo.GetById <IonInt>(411).IntValue;

            if (drmScheme != DefaultDrmScheme)
            {
                throw new Exception($"Unexpected bcDRMScheme ({drmScheme})");
            }

            var          docSymbolOffset = containerInfo.GetById <IonInt>(415);
            var          docSymbolLength = containerInfo.GetById <IonInt>(416);
            ISymbolTable docSymbols      = null;

            if (docSymbolLength.LongValue > 0)
            {
                var docSymbolData = new MemoryStream(fs.ReadBytes(docSymbolOffset.IntValue, docSymbolLength.IntValue, SeekOrigin.Begin));
                loader.Load(docSymbolData, out docSymbols);
            }

            var chunkSize = containerInfo.GetById <IonInt>(412).IntValue;

            if (chunkSize != DefaultChunkSize)
            {
                throw new Exception($"Unexpected bcChunkSize in container {containerId} info ({chunkSize})");
            }

            if (header.Version > 1)
            {
                var formatCapabilitiesOffset = containerInfo.GetById <IonInt>(594).IntValue;
                var formatCapabilitiesLength = containerInfo.GetById <IonInt>(595).IntValue;
                if (formatCapabilitiesLength > 0)
                {
                    var formatCapabilitiesData = new MemoryStream(fs.ReadBytes(formatCapabilitiesOffset, formatCapabilitiesLength, SeekOrigin.Begin));
                    FormatCapabilities = loader.Load(formatCapabilitiesData).Single() as IonList;
                }
            }

            var indexTableOffset = containerInfo.GetById <IonInt>(413).IntValue;
            var indexTableLength = containerInfo.GetById <IonInt>(414).IntValue;

            // Python checks for extra info in container

            fs.Seek(header.Length, SeekOrigin.Begin);
            var payloadSha1 = fs.ReadToEnd().Sha1().ToHexString().ToLowerInvariant();

            fs.Seek(header.ContainerInfoOffset + header.ContainerInfoLength, SeekOrigin.Begin);
            var kfxGenInfoData = Encoding.UTF8.GetString(fs.ReadBytes((int)(header.Length - header.ContainerInfoOffset - header.ContainerInfoLength)));
            var kfxGenInfo     = JsonConvert.DeserializeObject <KeyValuePair <string, string>[]>(kfxGenInfoData)
                                 .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

            if (kfxGenInfo.GetOrDefault("kfxgen_payload_sha1") != payloadSha1)
            {
                throw new Exception($"Incorrect kfxgen_payload_sha1 in container {containerId}");
            }
            if (kfxGenInfo.GetOrDefault("kfxgen_acr") != containerId)
            {
                throw new Exception($"Unexpected kfxgen_acr in container {containerId}");
            }

            var typeNums = new HashSet <int>();

            if (indexTableLength > 0)
            {
                var entityTable = fs.ReadBytes(indexTableOffset, indexTableLength, SeekOrigin.Begin);
                using var reader = new BinaryReader(new MemoryStream(entityTable), Encoding.UTF8, true);
                while (reader.BaseStream.Position < reader.BaseStream.Length)
                {
                    var id           = reader.ReadInt32();
                    var type         = reader.ReadInt32();
                    var entityOffset = (int)reader.ReadInt64();
                    var entityLength = (int)reader.ReadInt64();

                    typeNums.Add(type);

                    var entityStart = (int)header.Length + entityOffset;
                    if (entityStart + entityLength > fs.Length)
                    {
                        throw new Exception($"Container {containerId} is not large enough for entity end (offset {entityStart + entityLength})");
                    }

                    var entityData = new MemoryStream(fs.ReadBytes(entityStart, entityLength, SeekOrigin.Begin));
                    Entities.Add(new Entity(entityData, id, type, docSymbols, loader));
                }
            }

            ContainerFormat containerFormat;

            if (typeNums.Intersect(KfxMainContainerFragmentIdNums).Any())
            {
                containerFormat = ContainerFormat.KfxMain;
            }
            else if (typeNums.Intersect(KfxMetadataContainerFragmentIdNums).Any())
            {
                containerFormat = ContainerFormat.KfxMetadata;
            }
            else if (typeNums.Intersect(KfxAttachableContainerFragmentIdNums).Any())
            {
                containerFormat = ContainerFormat.KfxAttachable;
            }
            else
            {
                containerFormat = ContainerFormat.KfxUnknown;
            }

            var kfxAppVersion     = kfxGenInfo.GetOrDefault("appVersion") ?? kfxGenInfo.GetOrDefault("kfxgen_application_version");
            var kfxPackageVersion = kfxGenInfo.GetOrDefault("buildVersion") ?? kfxGenInfo.GetOrDefault("kfxgen_package_version");

            ContainerInfo = new KfxContainerInfo
            {
                Header                   = header,
                ContainerId              = containerId,
                ChunkSize                = chunkSize,
                CompressionType          = compressionType,
                DrmScheme                = drmScheme,
                KfxGenApplicationVersion = kfxAppVersion,
                KfxGenPackageVersion     = kfxPackageVersion,
                ContainerFormat          = containerFormat
            };

            SetMetadata();
        }
Esempio n. 5
0
        public override void WriteNull(IonType type)
        {
            IonValue v;

            switch (type)
            {
            case IonType.Null:
                v = new IonNull();
                break;

            case IonType.Bool:
                v = IonBool.NewNull();
                break;

            case IonType.Int:
                v = IonInt.NewNull();
                break;

            case IonType.Float:
                v = IonFloat.NewNull();
                break;

            case IonType.Decimal:
                v = IonDecimal.NewNull();
                break;

            case IonType.Timestamp:
                v = IonTimestamp.NewNull();
                break;

            case IonType.Symbol:
                v = IonSymbol.NewNull();
                break;

            case IonType.String:
                v = new IonString(null);
                break;

            case IonType.Clob:
                v = IonClob.NewNull();
                break;

            case IonType.Blob:
                v = IonBlob.NewNull();
                break;

            case IonType.List:
                v = IonList.NewNull();
                break;

            case IonType.Sexp:
                v = IonSexp.NewNull();
                break;

            case IonType.Struct:
                v = IonStruct.NewNull();
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }

            AppendValue(v);
        }
Esempio n. 6
0
 protected override IonContainer MakeNullValue()
 {
     return(IonList.NewNull());
 }
Esempio n. 7
0
 internal override IonContainer MakeNullValue()
 {
     return(IonList.NewNull());
 }