예제 #1
0
 /// <summary>
 ///    Parses the file referenced by the current instance,
 ///    searching for box headers that will be useful in saving
 ///    the file.
 /// </summary>
 public void ParseBoxHeaders()
 {
     try {
         ResetFields();
         ParseBoxHeaders(first_header.TotalBoxSize, file.Length, null);
     } catch (CorruptFileException e) {
         file.MarkAsCorrupt(e.Message);
     }
 }
예제 #2
0
        private XmpNode ParseRDF(XmlNode rdf_node, TagLib.File file)
        {
            XmpNode top = new XmpNode(String.Empty, String.Empty);

            foreach (XmlNode node in rdf_node.ChildNodes)
            {
                if (node is XmlWhitespace)
                {
                    continue;
                }
                if (node.Is(RDF_NS, DESCRIPTION_URI))
                {
                    var attr = node.Attributes.GetNamedItem(RDF_NS, ABOUT_URI)
                               as XmlAttribute;
                    if (attr != null)
                    {
                        if (top.Name != String.Empty && top.Name != attr.InnerText)
                        {
                            throw new CorruptFileException("Multiple inconsistent rdf:about values!");
                        }
                        top.Name = attr.InnerText;
                    }
                    continue;
                }
                file.MarkAsCorrupt("Cannot have anything other than rdf:Description at the top level");
                return(top);
            }
            ParseNodeElementList(top, rdf_node);
            return(top);
        }
예제 #3
0
        public UserCommentIFDEntry(ushort tag, ByteVector data, TagLib.File file)
        {
            Tag = tag;
            if (data.StartsWith(COMMENT_ASCII_CODE))
            {
                Value = TrimNull(data.ToString(StringType.Latin1, COMMENT_ASCII_CODE.Count, data.Count - COMMENT_ASCII_CODE.Count));
                return;
            }
            if (data.StartsWith(COMMENT_UNICODE_CODE))
            {
                Value = TrimNull(data.ToString(StringType.UTF8, COMMENT_UNICODE_CODE.Count, data.Count - COMMENT_UNICODE_CODE.Count));
                return;
            }
            var trimmed = data.ToString().Trim();

            if (trimmed.Length == 0 || trimmed == "\0")
            {
                Value = String.Empty;
                return;
            }
            if (data.StartsWith((byte)0x00) && data.Count >= 8)
            {
                int term = data.Find("\0", 8);
                if (term != -1)
                {
                    Value = data.ToString(StringType.Latin1, 8, term - 8);
                }
                else
                {
                    Value = data.ToString(StringType.Latin1, 8, data.Count - 8);
                }
                return;
            }
            if (data.Data.Length == 0)
            {
                Value = String.Empty;
                return;
            }
            int offset = 0;
            int length = data.Count - offset;

            if (data.StartsWith(COMMENT_BAD_UNICODE_CODE))
            {
                offset = COMMENT_BAD_UNICODE_CODE.Count;
                length = data.Count - offset;
            }
            file.MarkAsCorrupt("UserComment with other encoding than Latin1 or Unicode");
            Value = TrimNull(data.ToString(StringType.UTF8, offset, length));
        }
예제 #4
0
        /// <summary>
        ///    Construcor.
        /// </summary>
        /// <param name="tag">
        ///    A <see cref="System.UInt16"/> with the tag ID of the entry this instance
        ///    represents
        /// </param>
        /// <param name="data">
        ///    A <see cref="ByteVector"/> to be stored
        /// </param>
        /// <param name="file">
        ///    The file that's currently being parsed, used for reporting corruptions.
        /// </param>
        public UserCommentIFDEntry(ushort tag, ByteVector data, TagLib.File file)
        {
            Tag = tag;

            if (data.StartsWith(COMMENT_ASCII_CODE))
            {
                Value = TrimNull(data.ToString(StringType.Latin1, COMMENT_ASCII_CODE.Count, data.Count - COMMENT_ASCII_CODE.Count));
                return;
            }

            if (data.StartsWith(COMMENT_UNICODE_CODE))
            {
                Value = TrimNull(data.ToString(StringType.UTF8, COMMENT_UNICODE_CODE.Count, data.Count - COMMENT_UNICODE_CODE.Count));
                return;
            }

            var trimmed = data.ToString().Trim();

            if (trimmed.Length == 0 || trimmed == "\0")
            {
                Value = String.Empty;
                return;
            }

            // Some programs like e.g. CanonZoomBrowser inserts just the first 0x00-byte
            // followed by 7-bytes of trash.
            if (data.StartsWith((byte)0x00) && data.Count >= 8)
            {
                // And CanonZoomBrowser fills some trailing bytes of the comment field
                // with '\0'. So we return only the characters before the first '\0'.
                int term = data.Find("\0", 8);
                if (term != -1)
                {
                    Value = data.ToString(StringType.Latin1, 8, term - 8);
                }
                else
                {
                    Value = data.ToString(StringType.Latin1, 8, data.Count - 8);
                }
                return;
            }

            if (data.Data.Length == 0)
            {
                Value = String.Empty;
                return;
            }

            // Try to parse anyway
            int offset = 0;
            int length = data.Count - offset;

            // Corruption that starts with a Unicode header and a count byte.
            if (data.StartsWith(COMMENT_BAD_UNICODE_CODE))
            {
                offset = COMMENT_BAD_UNICODE_CODE.Count;
                length = data.Count - offset;
            }

            file.MarkAsCorrupt("UserComment with other encoding than Latin1 or Unicode");
            Value = TrimNull(data.ToString(StringType.UTF8, offset, length));
        }