Exemplo n.º 1
0
        public Tag(byte[] image, int offset)
        {
            this.header = new TagHeader(image, offset);
            BinarySubstr data = this.header.content;

#if DEBUG
            __dll__.log.Lock();
            __dll__.log.WriteLine("[ID3v2.3.0 Tag]");
            __dll__.log.AddIndent();
            __dll__.log.WriteVar("IsExperimentalTag", this.header.experimental.ToString());
            __dll__.log.WriteVar("Unsynchronization", this.header.unsynchronization.ToString());
            __dll__.log.WriteVar("HasExtendedHeader", this.header.hasExtHeader.ToString());
#endif
            if (this.header.hasExtHeader)
            {
                this.extheader = new ExtendedHeader(data);
#if DEBUG
                __dll__.log.WriteVar("PaddingSize", this.extheader.paddingSize.ToString());
                __dll__.log.WriteVar("HasCRC32", this.extheader.hasCrc32.ToString());
#endif
                if (this.extheader.hasCrc32)
                {
                    uint crc32 = data.CalculateCRC32();
                    __dll__.log.WriteLine("    CRC32 Check: 実 {0:X8} --><-- {1:X8} 理", crc32, this.extheader.crc32);
                    if (crc32 != this.extheader.crc32)
                    {
                        throw new System.ApplicationException("Crc 値が一致しません。");
                    }
                }
            }
            afh.Collections.DictionaryP <string, FrameHeader> headers = FrameHeader.GetFrameHeaders(data);
            this.frames = headers.Map <Frame>(Frame.CreateFrame);
#if DEBUG
            __dll__.log.RemoveIndent();
            foreach (Gen::KeyValuePair <string, Frame> pair in this.frames)
            {
                __dll__.log.WriteLine("Frame---");
                __dll__.log.AddIndent();
                __dll__.log.WriteVar("FrameID", pair.Key);
                __dll__.log.WriteVar("FrameType", pair.Value.GetType().FullName);
                //__dll__.log.WriteVar("Discards on TagChange",pair.Value.discardOnAlteringTag.ToString());
                //__dll__.log.WriteVar("Discards on FileChange",pair.Value.discardOnAlteringFile.ToString());
                //__dll__.log.WriteVar("ReadOnly",pair.Value.readOnly.ToString());
                //__dll__.log.WriteVar("Compressed",pair.Value.compression.ToString());
                //__dll__.log.WriteVar("Encrypted",pair.Value.encryption.ToString());
                //__dll__.log.WriteVar("Grouping",pair.Value.grouping.ToString());
                if (pair.Value is ID3v2_3_.TextInformationFrame)
                {
                    __dll__.log.WriteVar("TextContent", ((ID3v2_3_.TextInformationFrame)pair.Value).Text);
                }
                __dll__.log.RemoveIndent();
            }
            __dll__.log.Unlock();
#endif
        }
Exemplo n.º 2
0
        public static void type分岐3_準備(afh.Application.Log log)
        {
            afh.Collections.DictionaryP <int, System.Type> dic = null;
            afh.Collections.DictionaryP <int, System.Type> dic0;
            int minwrap  = int.MaxValue;
            int minshift = 0;

            for (int shift = 0; shift <= 28; shift++)
            {
                int wrap = type分岐3_準備1(shift, out dic0);
                if (wrap < minwrap)
                {
                    dic      = dic0;
                    minwrap  = wrap;
                    minshift = shift;
                }
            }

            log.Lock();
            if (minshift == 0)
            {
                log.WriteLine("switch(t.Name.GetHashCode()&0xf){");
            }
            else
            {
                log.WriteLine("switch((t.Name.GetHashCode()>>{0})&0xf){{", minshift);
            }
            log.AddIndent();
            int c = 1;

            for (int i = 0; i <= 0xf; i++)
            {
                // case i:
                System.Text.StringBuilder build = new System.Text.StringBuilder();
                build.AppendFormat("case {0}:", i);
                bool _else = false;
                foreach (System.Type type in dic[i])
                {
                    if (_else)
                    {
                        build.Append("else ");
                    }
                    build.AppendFormat("if(t==typeof({0})){{\r\n", afh.Types.CSharpName(type));
                    build.AppendFormat("        c+={0};\r\n", c++);
                    build.Append("    }");
                    _else = true;
                }
                build.Append("break;");
                log.WriteLine(build.ToString());
            }
            log.RemoveIndent();
            log.WriteLine("}");
            log.Unlock();            //*/
        }
Exemplo n.º 3
0
        /// <summary>
        /// Frame 情報が並んだデータを持つ BinarySubstr から FrameHeader の集合を読み取ります。
        /// </summary>
        /// <param name="data">Frame 情報が並んだデータを参照する BinarySubstr を指定します。</param>
        /// <returns>読み取った FrameHeader の集合を返します。</returns>
        public static afh.Collections.DictionaryP <string, FrameHeader> GetFrameHeaders(BinarySubstr data)
        {
            FrameHeader fheader;

            afh.Collections.DictionaryP <string, FrameHeader> dic = new afh.Collections.DictionaryP <string, FrameHeader>();
            while (null != (fheader = ReadFrameHeader(data)))
            {
                dic.Add(fheader.frameId, fheader);
            }
            return(dic);
        }
Exemplo n.º 4
0
        private static int type分岐3_準備1(int shift, out afh.Collections.DictionaryP <int, System.Type> dic)
        {
            dic = new afh.Collections.DictionaryP <int, System.Type>();
            int wrap = 0;

            foreach (System.Type t in types)
            {
                int key = (t.Name.GetHashCode() >> shift) & 0xf;
                if (dic.ContainsKey(key))
                {
                    wrap++;
                }
                dic.Add(key, t);
            }
            return(wrap);
        }