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); }
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); }
/// <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; }
/// <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; }
////////////////////////////////////////////////////////////////////////// // 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="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); }
protected void SetData (ByteVector data, int offset, byte version, bool readHeader) { if (readHeader) header = new FrameHeader (data, version); ParseFields (FieldData (data, offset, version), version); }
////////////////////////////////////////////////////////////////////////// // 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); }
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); }