protected internal RelativeVolumeFrame (ByteVector data,
		                                        int offset,
		                                        FrameHeader header,
		                                        byte version)
			: base(header)
		{
			SetData (data, offset, version, false);
		}
		protected internal UniqueFileIdentifierFrame (ByteVector data,
		                                              int offset,
		                                              FrameHeader header,
		                                              byte version) :
			base(header)
		{
			SetData (data, offset, version, false);
		}
		protected internal GeneralEncapsulatedObjectFrame (ByteVector data,
		                                                   int offset,
		                                                   FrameHeader header,
		                                                   byte version)
			: base(header)
		{
			SetData (data, offset, version, false);
		}
示例#4
0
 protected internal UnknownFrame(ByteVector data, int offset, FrameHeader header, byte version) : base(header)
 {
     SetData(data, offset, version, false);
 }
		/// <summary>
		///    Constructs and initializes a new instance of <see
		///    cref="CommentsFrame" /> by reading its raw data in a
		///    specified ID3v2 version.
		/// </summary>
		/// <param name="data">
		///    A <see cref="ByteVector" /> object containing the raw
		///    representation of the new frame.
		/// </param>
		/// <param name="offset">
		///    A <see cref="int" /> indicating at what offset in
		///    <paramref name="data" /> the frame actually begins.
		/// </param>
		/// <param name="header">
		///    A <see cref="FrameHeader" /> containing the header of the
		///    frame found at <paramref name="offset" /> in the data.
		/// </param>
		/// <param name="version">
		///    A <see cref="byte" /> indicating the ID3v2 version the
		///    raw frame is encoded in.
		/// </param>
		protected internal CommentsFrame (ByteVector data, int offset,
		                                  FrameHeader header,
		                                  byte version) : base(header)
		{
			SetData (data, offset, version, false);
		}
 protected internal SynchronisedLyricsFrame(ByteVector data, int offset, FrameHeader header, byte version) : base(header)
 {
     SetData(data, offset, version, false);
 }
		protected internal UserTextInformationFrame (ByteVector data,
		                                             int offset,
		                                             FrameHeader header,
		                                             byte version)
			: base (data, offset, header, version)
		{
		}
		/// <summary>
		///    Constructs and initializes a new instance of <see
		///    cref="TextInformationFrame" /> by reading its raw
		///    contents from a specifed position in a <see
		///    cref="ByteVector" /> object in a specified ID3v2 version.
		/// </summary>
		/// <param name="data">
		///    A <see cref="ByteVector" /> object containing the frame
		///    to read.
		/// </param>
		/// <param name="offset">
		///    A <see cref="int" /> value specifying the offset in
		///    <paramref name="data" /> at which the frame begins.
		/// </param>
		/// <param name="header">
		///    A <see cref="FrameHeader" /> value containing the header
		///    that would be read in the frame.
		/// </param>
		/// <param name="version">
		///    A <see cref="byte" /> value containing the ID3v2 version
		///    in which <paramref name="data" /> is encoded.
		/// </param>
		protected internal TextInformationFrame (ByteVector data,
		                                         int offset,
		                                         FrameHeader header,
		                                         byte version)
			: base (header)
		{
			SetData (data, offset, version, false);
		}
 protected internal UnsynchronisedLyricsFrame(ByteVector data, int offset, FrameHeader header, byte version) : base(header)
 {
    SetData (data, offset, version, false);
 }
示例#10
0
		/// <summary>
		///    Constructs and initializes a new instance of <see
		///    cref="Frame" /> with a specified header.
		/// </summary>
		/// <param name="header">
		///    A <see cref="FrameHeader" /> value containing the header
		///    to use for the new instance.
		/// </param>
		protected Frame (FrameHeader header)
		{
			this.header = header;
		}
示例#11
0
 /// <summary>
 ///    Constructs and initializes a new instance of <see
 ///    cref="Frame" /> with a specified header.
 /// </summary>
 /// <param name="header">
 ///    A <see cref="FrameHeader" /> value containing the header
 ///    to use for the new instance.
 /// </param>
 protected Frame(FrameHeader header)
 {
     this.header = header;
 }
示例#12
0
      //////////////////////////////////////////////////////////////////////////
      // public members
      //////////////////////////////////////////////////////////////////////////
      public static Frame CreateFrame (ByteVector data, ref int offset, byte version)
      {
         int position = offset;
         
         FrameHeader header = new FrameHeader (data.Mid (position, (int) FrameHeader.Size (version)), version);
         
         offset += (int) (header.FrameSize + FrameHeader.Size (version));
         
         if (header.FrameId == null)
            throw new System.NotImplementedException ();
         
         foreach (byte b in header.FrameId)
         {
            char c = (char) b;
            if ((c < 'A' || c > 'Z') && (c < '1' || c > '9'))
               return null;
         }
         
         // Windows Media Player may create zero byte frames. Just send them
         // off as unknown and delete them.
         if (header.FrameSize == 0)
         {
            header.Flags |= FrameFlags.TagAlterPreservation;
            return new UnknownFrame (data, position, header, version);
         }
         
         // TODO: Support Compression.
         if ((header.Flags & FrameFlags.Compression) != 0)
            throw new System.NotImplementedException ();
         
         // TODO: Support Encryption.
         if ((header.Flags & FrameFlags.Encryption) != 0)
            throw new System.NotImplementedException ();
         
         foreach (FrameCreator creator in frame_creators)
         {
            Frame frame = creator (data, position, header, version);
            if (frame != null)
               return frame;
         }
         
         // This is where things get necissarily nasty.  Here we determine which
         // Frame subclass (or if none is found simply an Frame) based
         // on the frame ID.  Since there are a lot of possibilities, that means
         // a lot of if blocks.
         
         // Text Identification (frames 4.2)
         if (header.FrameId == FrameType.TXXX)
            return new UserTextInformationFrame (data, position, header, version);
      	 
         if (header.FrameId [0] == (byte) 'T')
            return new TextInformationFrame (data, position, header, version);
      	 
         // Unique File Identifier (frames 4.1)
         if (header.FrameId == FrameType.UFID)
            return new UniqueFileIdentifierFrame (data, position, header, version);
         
         // Music CD Identifier (frames 4.5)
         if (header.FrameId == FrameType.MCDI)
            return new MusicCdIdentifierFrame (data, position, header, version);

         // Unsynchronized Lyrics (frames 4.8)
         if (header.FrameId == FrameType.USLT)
            return new UnsynchronisedLyricsFrame (data, position, header, version);

         // Synchronized Lyrics (frames 4.9)
         if (header.FrameId == FrameType.SYLT)
            return new SynchronisedLyricsFrame (data, position, header, version);

         // Comments (frames 4.10)
         if (header.FrameId == FrameType.COMM)
            return new CommentsFrame (data, position, header, version);

         // Relative Volume Adjustment (frames 4.11)
         if (header.FrameId == FrameType.RVA2)
            return new RelativeVolumeFrame (data, position, header, version);

         // Attached Picture (frames 4.14)
         if (header.FrameId == FrameType.APIC)
            return new AttachedPictureFrame (data, position, header, version);

         // General Encapsulated Object (frames 4.15)
         if(header.FrameId == FrameType.GEOB)
            return new GeneralEncapsulatedObjectFrame (data, position, header, version);
         
         // Play Count (frames 4.16)
         if(header.FrameId == FrameType.PCNT)
            return new PlayCountFrame (data, position, header, version);
         
         // Play Count (frames 4.17)
         if(header.FrameId == FrameType.POPM)
            return new PopularimeterFrame (data, position, header, version);
         
         // Terms of Use (frames 4.22)
         if(header.FrameId == FrameType.USER)
            return new TermsOfUseFrame (data, position, header, version);
         
         // Private (frames 4.27)
         if (header.FrameId == FrameType.PRIV)
            return new PrivateFrame (data, position, header, version);
         
         return new UnknownFrame (data, position, header, version);
      }
示例#13
0
		/// <summary>
		///    Constructs and initializes a new instance of <see
		///    cref="Frame" /> by reading the raw header encoded in the
		///    specified ID3v2 version.
		/// </summary>
		/// <param name="data">
		///    A <see cref="ByteVector" /> object containing the
		///    identifier or header data to use for the new instance.
		/// </param>
		/// <param name="version">
		///    A <see cref="byte" /> value indicating the ID3v2 version
		///    which <paramref name="data" /> is encoded in.
		/// </param>
		/// <exception cref="ArgumentNullException">
		///    <paramref name="data" /> is <see langword="null" />.
		/// </exception>
		/// <exception cref="ArgumentException">
		///    <paramref name="data" /> does not contain a complete
		///    identifier.
		/// </exception>
		protected Frame (ByteVector data, byte version)
		{
			if (data == null)
				throw new ArgumentNullException ("data");
			
			if (data.Count < ((version < 3) ? 3 : 4))
				throw new ArgumentException (
					"Data contains an incomplete identifier.",
					"data");
			
			header = new FrameHeader (data, version);
		}
示例#14
0
 protected void SetData (ByteVector data, int offset, byte version, bool readHeader)
 {
    if (readHeader)
       header = new FrameHeader (data, version);
    ParseFields (FieldData (data, offset, version), version);
 }
示例#15
0
        //////////////////////////////////////////////////////////////////////////
        // public members
        //////////////////////////////////////////////////////////////////////////
        public static Frame CreateFrame(ByteVector data, ref int offset, byte version)
        {
            int position = offset;

            FrameHeader header = new FrameHeader(data.Mid(position, (int)FrameHeader.Size(version)), version);

            offset += (int)(header.FrameSize + FrameHeader.Size(version));

            if (header.FrameId == null)
            {
                throw new System.NotImplementedException();
            }

            foreach (byte b in header.FrameId)
            {
                char c = (char)b;
                if ((c < 'A' || c > 'Z') && (c < '1' || c > '9'))
                {
                    return(null);
                }
            }

            // Windows Media Player may create zero byte frames. Just send them
            // off as unknown and delete them.
            if (header.FrameSize == 0)
            {
                header.Flags |= FrameFlags.TagAlterPreservation;
                return(new UnknownFrame(data, position, header, version));
            }

            // TODO: Support Compression.
            if ((header.Flags & FrameFlags.Compression) != 0)
            {
                throw new System.NotImplementedException();
            }

            // TODO: Support Encryption.
            if ((header.Flags & FrameFlags.Encryption) != 0)
            {
                throw new System.NotImplementedException();
            }

            foreach (FrameCreator creator in frame_creators)
            {
                Frame frame = creator(data, position, header, version);
                if (frame != null)
                {
                    return(frame);
                }
            }

            // This is where things get necissarily nasty.  Here we determine which
            // Frame subclass (or if none is found simply an Frame) based
            // on the frame ID.  Since there are a lot of possibilities, that means
            // a lot of if blocks.

            // Text Identification (frames 4.2)
            if (header.FrameId == FrameType.TXXX)
            {
                return(new UserTextInformationFrame(data, position, header, version));
            }

            if (header.FrameId [0] == (byte)'T')
            {
                return(new TextInformationFrame(data, position, header, version));
            }

            // Unique File Identifier (frames 4.1)
            if (header.FrameId == FrameType.UFID)
            {
                return(new UniqueFileIdentifierFrame(data, position, header, version));
            }

            // Music CD Identifier (frames 4.5)
            if (header.FrameId == FrameType.MCDI)
            {
                return(new MusicCdIdentifierFrame(data, position, header, version));
            }

            // Unsynchronized Lyrics (frames 4.8)
            if (header.FrameId == FrameType.USLT)
            {
                return(new UnsynchronisedLyricsFrame(data, position, header, version));
            }

            // Synchronized Lyrics (frames 4.9)
            if (header.FrameId == FrameType.SYLT)
            {
                return(new SynchronisedLyricsFrame(data, position, header, version));
            }

            // Comments (frames 4.10)
            if (header.FrameId == FrameType.COMM)
            {
                return(new CommentsFrame(data, position, header, version));
            }

            // Relative Volume Adjustment (frames 4.11)
            if (header.FrameId == FrameType.RVA2)
            {
                return(new RelativeVolumeFrame(data, position, header, version));
            }

            // Attached Picture (frames 4.14)
            if (header.FrameId == FrameType.APIC)
            {
                return(new AttachedPictureFrame(data, position, header, version));
            }

            // General Encapsulated Object (frames 4.15)
            if (header.FrameId == FrameType.GEOB)
            {
                return(new GeneralEncapsulatedObjectFrame(data, position, header, version));
            }

            // Play Count (frames 4.16)
            if (header.FrameId == FrameType.PCNT)
            {
                return(new PlayCountFrame(data, position, header, version));
            }

            // Play Count (frames 4.17)
            if (header.FrameId == FrameType.POPM)
            {
                return(new PopularimeterFrame(data, position, header, version));
            }

            // Terms of Use (frames 4.22)
            if (header.FrameId == FrameType.USER)
            {
                return(new TermsOfUseFrame(data, position, header, version));
            }

            // Private (frames 4.27)
            if (header.FrameId == FrameType.PRIV)
            {
                return(new PrivateFrame(data, position, header, version));
            }

            return(new UnknownFrame(data, position, header, version));
        }
		/// <summary>
		///    Constructs and initializes a new instance of <see
		///    cref="AttachedPictureFrame" /> by reading its raw data
		///    in a specified ID3v2 version.
		/// </summary>
		/// <param name="data">
		///    A <see cref="ByteVector" /> object containing the raw
		///    representation of the new frame.
		/// </param>
		/// <param name="offset">
		///    A <see cref="int" /> indicating at what offset in
		///    <paramref name="data" /> the frame actually begins.
		/// </param>
		/// <param name="header">
		///    A <see cref="FrameHeader" /> containing the header of the
		///    frame found at <paramref name="offset" /> in the data.
		/// </param>
		/// <param name="version">
		///    A <see cref="byte" /> indicating the ID3v2 version the
		///    raw frame is encoded in.
		/// </param>
		protected internal AttachedPictureFrame (ByteVector data,
		                                         int offset,
		                                         FrameHeader header,
		                                         byte version)
			: base(header)
		{
			SetData (data, offset, version, false);
		}
示例#17
0
        protected ByteVector FieldData(ByteVector frameData, int offset, byte version)
        {
            if (frameData == null)
            {
                throw new ArgumentNullException("frameData");
            }

            int data_offset = offset + (int)FrameHeader.Size(version);
            int data_length = (int)Size;

            /*int uncompressed_data_length;*/

            if ((Flags & (FrameFlags.Compression | FrameFlags.DataLengthIndicator)) != 0)
            {
                /*uncompressed_data_length = (int) frame_data.Mid (data_offset, 4).ToUInt () + 4;*/
                data_offset += 4;
                data_offset -= 4;
            }

            if ((Flags & FrameFlags.GroupingIdentity) != 0)
            {
                group_id = frameData [data_offset++];
                data_length--;
            }

            if ((Flags & FrameFlags.Encryption) != 0)
            {
                encryption_id = frameData [data_offset++];
                data_length--;
            }

            if (data_length > frameData.Count - data_offset)
            {
                throw new CorruptFileException("Frame size exceeds bounds.");
            }
            if (data_length < 0)
            {
                throw new CorruptFileException("Frame size less than zero.");
            }

            ByteVector data = frameData.Mid(data_offset, data_length);

            if ((Flags & FrameFlags.Unsychronisation) != 0)
            {
                SynchData.ResynchByteVector(data);
            }

            // FIXME: Implement encryption.
            if ((Flags & FrameFlags.Encryption) != 0)
            {
                throw new NotImplementedException();
            }

            // FIXME: Implement compression.
            if ((Flags & FrameFlags.Compression) != 0)
            {
                throw new NotImplementedException();
            }

            /*
             * if(d->header->compression()) {
             *    ByteVector data(frameDataLength);
             *    uLongf uLongTmp = frameDataLength;
             *    ::uncompress((Bytef *) data.data(),
             *                (uLongf *) &uLongTmp,
             *                (Bytef *) frameData.data() + frameDataOffset,
             *                size());
             *    return data;
             * }
             */

            return(data);
        }