public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { if(version==ID3v2MajorVersion.Version4) { return new Writers.TextFrameWriter(this, "TDTG", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding); } return null; }
public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { if(version==ID3v2MajorVersion.Version2) { return new Writers.MusicCDIdentifierFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "MCI", encoding); } else if(version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) { return new Writers.MusicCDIdentifierFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "MCDI", encoding); } return null; }
public override Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { switch(version) { case ID3v2MajorVersion.Version2: return new Writers.PrivateFrameWriter(this,Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version),"PRI",encoding); case ID3v2MajorVersion.Version3: case ID3v2MajorVersion.Version4: return new Writers.PrivateFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "PRIV", encoding); default: return null; } }
public override FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { switch(version) { case ID3v2MajorVersion.Version2: return new LastPlayedOnFrameWriter(this, FrameHeaderWriter.CreateFrameHeaderWriter(version), "XLP", encoding); case ID3v2MajorVersion.Version3: case ID3v2MajorVersion.Version4: return new LastPlayedOnFrameWriter(this, FrameHeaderWriter.CreateFrameHeaderWriter(version), "XLPO", encoding); default: return null; } }
protected FrameWriter(Frame frameToWriter, FrameHeaderWriter headerWriter, string frameID, EncodingScheme encoding) { if(frameToWriter==null) { throw new ArgumentNullException("The Frame object passed can not be null."); } if(headerWriter==null) { throw new ArgumentNullException("The FrameHeaderWriter object can not be null."); } this._frameID=frameID; this._frame=frameToWriter; this._headerWriter=headerWriter; this._encoding=encoding; }
public static TextField CreateTextField(string text,EncodingScheme encoding) { switch(encoding) { case EncodingScheme.Ascii: return new AsciiTextField(text); case EncodingScheme.UnicodeWithBOM: return new UnicodeTextField(text); case EncodingScheme.BigEndianUnicode: return new BigEndianUnicodeTextField(text); case EncodingScheme.UTF8: return new UTF8TextField(text); default: throw new FeatureNotSupportedException("The provided encoding scheme is not supported in this version."); } }
private void TestTextFrame(TextFrame frame, EncodingScheme encoding, ID3v2MajorVersion version) { string frameId; FrameParserFactory factory=new FrameParserFactory(); FrameWriter writer=frame.CreateWriter(version, encoding); if(writer==null) { return; } MemoryStream stream=new MemoryStream(); writer.WriteToStream(stream); stream.Seek(0, SeekOrigin.Begin); Frame writtenFrame=FrameParser.Parse(stream, version, factory, out frameId); Assert.IsInstanceOfType(writtenFrame.GetType(), frame); TextFrame textFrame=(TextFrame)writtenFrame; Assert.AreEqual(textFrame.Text, frame.Text); }
private void TestTextFrame(TextFrame frame, EncodingScheme encoding, ID3v2MajorVersion version) { string frameId; FrameParserFactory factory = new FrameParserFactory(); FrameWriter writer = frame.CreateWriter(version, encoding); if (writer == null) { return; } MemoryStream stream = new MemoryStream(); writer.WriteToStream(stream); stream.Seek(0, SeekOrigin.Begin); Frame writtenFrame = FrameParser.Parse(stream, version, factory, out frameId); Assert.IsInstanceOfType(frame, writtenFrame.GetType()); TextFrame textFrame = (TextFrame)writtenFrame; Assert.AreEqual(textFrame.Text, frame.Text); }
public UniqueFileIdentifierFrameWriter(UniqueFileIdentifierFrame frameToWrite, Writers.FrameHeaderWriter frameHeaderWriter, string frameID, EncodingScheme encoding) : base(frameToWrite, frameHeaderWriter, frameID, encoding) { }
public TextFrameWriter(TextFrame frameToWrite, string frameID, FrameHeaderWriter headerWriter, EncodingScheme encoding) : base(frameToWrite, headerWriter, frameID, encoding) { }
public GeneralEncapsulatedObjectFrameWriter(GeneralEncapsulatedObjectFrame frameToWrite, Writers.FrameHeaderWriter frameHeaderWriter, string frameID, EncodingScheme encoding) : base(frameToWrite, frameHeaderWriter, frameID, encoding) { }
public bool TryDecodeValue( Globalization.Charset defaultCharset, bool enableFallback, bool allowControlCharacters, bool enable2047, bool enableJisDetection, bool enableUtf8Detection, bool enableDbcsDetection, out string charsetName, out string cultureName, out EncodingScheme encodingScheme, out string value) { charsetName = null; cultureName = null; encodingScheme = EncodingScheme.None; value = null; var stringBuilder = Internal.ScratchPad.GetStringBuilder(System.Math.Min(1024, iterator.TotalLength)); char[] charBuffer = null; byte[] byteBuffer = null; var currentPosition1 = iterator.CurrentPosition; var whitespaceOnly = false; var flag1 = false; if (defaultCharset != null && (enableJisDetection || enableUtf8Detection || enableDbcsDetection && Globalization.FeInboundCharsetDetector.IsSupportedFarEastCharset(defaultCharset))) { defaultCharset = this.DetectValueCharset(defaultCharset, enableJisDetection, enableUtf8Detection, enableDbcsDetection, out encodingScheme); flag1 = true; } System.Text.Decoder decoder1 = null; string lastEncodedWordCharsetName = null; if (!enable2047) iterator.SkipToEof(); else { string lastEncodedWordLanguage = null; Globalization.Charset charset1 = null; System.Text.Decoder decoder2 = null; var flag2 = true; string encodedWordCharsetName; while (true) { this.ParseRawFragment(ref whitespaceOnly); if (!iterator.Eof) { var currentPosition2 = iterator.CurrentPosition; string encodedWordLanguage; byte bOrQ; ValuePosition encodedWordContentStart; ValuePosition encodedWordContentEnd; if (!this.ParseEncodedWord(lastEncodedWordCharsetName, lastEncodedWordLanguage, ref byteBuffer, out encodedWordCharsetName, out encodedWordLanguage, out bOrQ, out encodedWordContentStart, out encodedWordContentEnd)) whitespaceOnly = false; else { if (lastEncodedWordCharsetName == null) { encodingScheme = EncodingScheme.Rfc2047; charsetName = encodedWordCharsetName; cultureName = encodedWordLanguage; } lastEncodedWordCharsetName = encodedWordCharsetName; if (currentPosition1 != currentPosition2 && !whitespaceOnly) { if (!flag2) { this.FlushDecoder(decoder2, allowControlCharacters, ref byteBuffer, ref charBuffer, stringBuilder); flag2 = true; } if (decoder1 == null) { if (defaultCharset == null || !defaultCharset.IsAvailable) { if (!enableFallback) break; } else { decoder1 = defaultCharset.GetEncoding() .GetDecoder(); } } if (decoder1 != null) this.ConvertRawFragment(currentPosition1, currentPosition2, decoder1, allowControlCharacters, ref charBuffer, stringBuilder); else this.ZeroExpandFragment(currentPosition1, currentPosition2, allowControlCharacters, stringBuilder); } Globalization.Charset charset2; if (!Globalization.Charset.TryGetCharset(encodedWordCharsetName, out charset2)) { if (!flag2) { this.FlushDecoder(decoder2, allowControlCharacters, ref byteBuffer, ref charBuffer, stringBuilder); flag2 = true; } if (enableFallback) decoder2 = null; else goto label_25; } else if (charset2 != charset1) { if (!flag2) { this.FlushDecoder(decoder2, allowControlCharacters, ref byteBuffer, ref charBuffer, stringBuilder); flag2 = true; } if (!charset2.IsAvailable) { if (enableFallback) decoder2 = null; else goto label_32; } else { decoder2 = charset2.GetEncoding() .GetDecoder(); charset1 = charset2; } } if (decoder2 != null) { this.DecodeEncodedWord(bOrQ, decoder2, encodedWordContentStart, encodedWordContentEnd, allowControlCharacters, ref byteBuffer, ref charBuffer, stringBuilder); flag2 = false; } else this.ZeroExpandFragment(currentPosition2, iterator.CurrentPosition, allowControlCharacters, stringBuilder); currentPosition1 = iterator.CurrentPosition; whitespaceOnly = true; } } else goto label_39; } charsetName = defaultCharset == null ? null : defaultCharset.Name; return false; label_25: charsetName = encodedWordCharsetName; return false; label_32: charsetName = encodedWordCharsetName; return false; label_39: if (!flag2) this.FlushDecoder(decoder2, allowControlCharacters, ref byteBuffer, ref charBuffer, stringBuilder); } if (currentPosition1 != iterator.CurrentPosition) { if (lastEncodedWordCharsetName == null) { charsetName = !flag1 || encodingScheme != EncodingScheme.None || (defaultCharset == null || defaultCharset.IsSevenBit) || defaultCharset.AsciiSupport != Globalization.CodePageAsciiSupport.Complete ? (defaultCharset == null ? null : defaultCharset.Name) : Globalization.Charset.ASCII.Name; } if (decoder1 == null) { if (defaultCharset == null || !defaultCharset.IsAvailable) { if (!enableFallback) { charsetName = defaultCharset == null ? null : defaultCharset.Name; return false; } decoder1 = null; } else { decoder1 = defaultCharset.GetEncoding() .GetDecoder(); } } if (decoder1 != null) this.ConvertRawFragment(currentPosition1, iterator.CurrentPosition, decoder1, allowControlCharacters, ref charBuffer, stringBuilder); else this.ZeroExpandFragment(currentPosition1, iterator.CurrentPosition, allowControlCharacters, stringBuilder); } Internal.ScratchPad.ReleaseStringBuilder(); value = stringBuilder.ToString(); return true; }
private void WriteFrames(Stream stream, ID3v2MajorVersion version, EncodingScheme encoding) { foreach(Frame f in this.Frames) { try { WriteFrame(f,stream,version,encoding); } catch(NonFatalException exception) { RaiseWritingWarning(exception, f); } } }
public MusicCDIdentifierFrameWriter(MusicCDIdentifierFrame frameToWrite, Writers.FrameHeaderWriter frameHeaderWriter, string frameID, EncodingScheme encoding) : base(frameToWrite, frameHeaderWriter, frameID, encoding) { }
public virtual void WriteToFile(string fileName, ID3v2MajorVersion version, EncodingScheme encoding) { FileStream targetFileStream = null; try { // First write all frame data to a memory buffer // This way we catch all fatal exceptions before // touching the file, so there's not a even a slight // chance of corrupting the file. MemoryStream memoryBuffer = new MemoryStream(); WriteFrames(memoryBuffer, version, encoding); int newSize = (int)memoryBuffer.Length; if (newSize == 0) { throw new FatalException("No data to write in the tag."); } targetFileStream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); TagHeader oldHeader = TagHeader.FromStream(targetFileStream); bool useIntermediate = false; if (oldHeader == null) { // There is no attached tag in the file. We need to use an intermediate temporary file. useIntermediate = true; // Rewind the place in stream to the very beginning, so that when // we copy the data from the original file to the intermediate file, // we won't lose any data. targetFileStream.Seek(0, SeekOrigin.Begin); } else { // File already has an ID3 v2 tag attached. if (oldHeader.TagSize < newSize) { useIntermediate = true; // Allow for 4KB of padding. newSize += 4 * 1024; // Move to the correct place in stream so when we copy data to // the intermediate file, we won't lose any data. // The +10 is to go skip the tag header, since it's not included // in TagHeader.TagSize targetFileStream.Seek(oldHeader.TagSize + 10, SeekOrigin.Begin); } else { // We should write exactly the same number of bytes back to the file. // When writing the padding, compare memoryBuffer.Length to newSize to // calculate the number of padding bytes required to write. newSize = oldHeader.TagSize; // Seek the beginning of the file. The tag header and frame information // will be overwritten. targetFileStream.Seek(0, SeekOrigin.Begin); } } TagHeader newHeader = new TagHeader((byte)version, 0, TagHeaderFlags.None, newSize); if (useIntermediate) { string intermediateFileName = GetTempIntermediateFileName(fileName); FileStream intermediateStream = null; try { intermediateStream = File.Create(intermediateFileName); newHeader.WriteToStream(intermediateStream); // Write the frame data residing in memory buffer. intermediateStream.Write(memoryBuffer.GetBuffer(), 0, (int)memoryBuffer.Length); //Write any required paddings. for (int i = (int)memoryBuffer.Length; i < newSize; i++) { intermediateStream.WriteByte(0); } // Copy the data from the original file to the intermediate file. CopyFromStreamToStream(targetFileStream, intermediateStream); // Close the stream of original and intermediate file streams. targetFileStream.Close(); intermediateStream.Close(); // If control reaches this point, then everything went file, so // should normally delete the original file and rename the intermediate file. // But as a safety measure, for pre-release, alpha, and beta version, // instead of removing the file, I decided to rename the old file to // fileName+".old."+revisionNumber instead. The user can manually delete // the these files after ensuring the integrity of the new files. #if ACHAMENES_ID3_BACKUP_FILES_BEFORE_MODIFICATION File.Move(fileName, GetBackupFileName(fileName)); #else File.Delete(fileName); #endif File.Move(intermediateFileName, fileName); } finally { if (intermediateStream != null) { intermediateStream.Close(); } } } else // If using an intermediate file is not necessary. { // Similarly, we would normally just start writing to @stream here, // but instead, we close it, make a backup copy of it, and then // open it again, and write the tag information just to ensure nothing // will be lost. targetFileStream.Close(); #if ACHAMENES_ID3_BACKUP_FILES_BEFORE_MODIFICATION File.Copy(fileName, GetBackupFileName(fileName)); #endif targetFileStream = File.Open(fileName, FileMode.Open, FileAccess.Write, FileShare.Write); // Write the header. newHeader.WriteToStream(targetFileStream); // Write frame data from memory buffer. targetFileStream.Write(memoryBuffer.GetBuffer(), 0, (int)memoryBuffer.Length); // Write any required padding. for (int i = (int)memoryBuffer.Length; i < newSize; i++) { targetFileStream.WriteByte(0); } // And finally close the stream. targetFileStream.Close(); } } finally { if (targetFileStream != null) { targetFileStream.Close(); } } }
private void Test(EncodingScheme encoding) { TestVersion(encoding, ID3v2MajorVersion.Version2); TestVersion(encoding, ID3v2MajorVersion.Version3); TestVersion(encoding, ID3v2MajorVersion.Version4); }
private void TestVersion(EncodingScheme encoding, ID3v2MajorVersion version) { foreach (string testcase in _asciiTestCases) { TestTextFrame(new AlbumTextFrame(testcase), encoding, version); TestTextFrame(new ArtistTextFrame(testcase), encoding, version); TestTextFrame(new ComposerTextFrame(testcase), encoding, version); TestTextFrame(new CopyrightTextFrame(testcase), encoding, version); TestTextFrame(new CustomUserTextFrame(testcase), encoding, version); TestTextFrame(new DateTextFrame(testcase), encoding, version); TestTextFrame(new EncodedByTextFrame(testcase), encoding, version); TestTextFrame(new EncodingTimeTextFrame(testcase), encoding, version); TestTextFrame(new FileTypeTextFrame(testcase), encoding, version); TestTextFrame(new GenreTextFrame(testcase), encoding, version); TestTextFrame(new GroupingTextFrame(testcase), encoding, version); TestTextFrame(new InitialKeyTextFrame(testcase), encoding, version); TestTextFrame(new LanguageTextFrame(testcase), encoding, version); TestTextFrame(new LengthTextFrame(testcase), encoding, version); TestTextFrame(new MediaTypeTextFrame(testcase), encoding, version); TestTextFrame(new OrchestraTextFrame(testcase), encoding, version); TestTextFrame(new OriginalAlbumTextFrame(testcase), encoding, version); TestTextFrame(new OriginalArtistTextFrame(testcase), encoding, version); TestTextFrame(new OriginalReleaseTimeTextFrame(testcase), encoding, version); TestTextFrame(new OriginalReleaseYearTextFrame(testcase), encoding, version); TestTextFrame(new PublisherTextFrame(testcase), encoding, version); TestTextFrame(new RecordingTimeTextFrame(testcase), encoding, version); TestTextFrame(new ReleaseTimeTextFrame(testcase), encoding, version); TestTextFrame(new SoftwareSettingsTextFrame(testcase), encoding, version); TestTextFrame(new TaggingTimeTextFrame(testcase), encoding, version); TestTextFrame(new TitleTextFrame(testcase), encoding, version); } if (encoding != EncodingScheme.Ascii) { foreach (string testcase in _unicodeTestCases) { TestTextFrame(new AlbumTextFrame(testcase), encoding, version); TestTextFrame(new ArtistTextFrame(testcase), encoding, version); TestTextFrame(new ComposerTextFrame(testcase), encoding, version); TestTextFrame(new CopyrightTextFrame(testcase), encoding, version); TestTextFrame(new CustomUserTextFrame(testcase), encoding, version); TestTextFrame(new DateTextFrame(testcase), encoding, version); TestTextFrame(new EncodedByTextFrame(testcase), encoding, version); TestTextFrame(new EncodingTimeTextFrame(testcase), encoding, version); TestTextFrame(new FileTypeTextFrame(testcase), encoding, version); TestTextFrame(new GenreTextFrame(testcase), encoding, version); TestTextFrame(new GroupingTextFrame(testcase), encoding, version); TestTextFrame(new InitialKeyTextFrame(testcase), encoding, version); TestTextFrame(new LanguageTextFrame(testcase), encoding, version); TestTextFrame(new LengthTextFrame(testcase), encoding, version); TestTextFrame(new MediaTypeTextFrame(testcase), encoding, version); TestTextFrame(new OrchestraTextFrame(testcase), encoding, version); TestTextFrame(new OriginalAlbumTextFrame(testcase), encoding, version); TestTextFrame(new OriginalArtistTextFrame(testcase), encoding, version); TestTextFrame(new OriginalReleaseTimeTextFrame(testcase), encoding, version); TestTextFrame(new OriginalReleaseYearTextFrame(testcase), encoding, version); TestTextFrame(new PublisherTextFrame(testcase), encoding, version); TestTextFrame(new RecordingTimeTextFrame(testcase), encoding, version); TestTextFrame(new ReleaseTimeTextFrame(testcase), encoding, version); TestTextFrame(new SoftwareSettingsTextFrame(testcase), encoding, version); TestTextFrame(new TaggingTimeTextFrame(testcase), encoding, version); TestTextFrame(new TitleTextFrame(testcase), encoding, version); } } TestTextFrame(new PartOfSetTextFrame(4), encoding, version); TestTextFrame(new PartOfSetTextFrame(45, 123), encoding, version); TestTextFrame(new TrackTextFrame(415), encoding, version); TestTextFrame(new TrackTextFrame(15, 1234), encoding, version); TestTextFrame(new YearTextFrame(""), encoding, version); TestTextFrame(new YearTextFrame("14"), encoding, version); TestTextFrame(new YearTextFrame("144"), encoding, version); TestTextFrame(new YearTextFrame("1234"), encoding, version); TestTextFrame(new TimeTextFrame("134"), encoding, version); TestTextFrame(new BeatsPerMinuteTextFrame(134), encoding, version); }
public PictureFrameWriterM2(PictureFrame frameToWrite, string frameID, Writers.FrameHeaderWriter headerWriter, EncodingScheme encoding) : base(frameToWrite, headerWriter, frameID, encoding) { }
protected FrameWriter(Frame frameToWriter, FrameHeaderWriter headerWriter, string frameID, EncodingScheme encoding) { if (frameToWriter == null) { throw new ArgumentNullException("The Frame object passed can not be null."); } if (headerWriter == null) { throw new ArgumentNullException("The FrameHeaderWriter object can not be null."); } this._frameID = frameID; this._frame = frameToWriter; this._headerWriter = headerWriter; this._encoding = encoding; }
public PrivateFrameWriter(PrivateFrame frameToWrite, Writers.FrameHeaderWriter frameHeaderWriter, string frameID, EncodingScheme encoding) : base(frameToWrite, frameHeaderWriter, frameID, encoding) { }
public override ID3Utils.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { if (version == ID3v2MajorVersion.Version2) { return(new Writers.MusicCDIdentifierFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "MCI", encoding)); } else if (version == ID3v2MajorVersion.Version3 || version == ID3v2MajorVersion.Version4) { return(new Writers.MusicCDIdentifierFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "MCDI", encoding)); } return(null); }
public LastPlayedOnFrameWriter( LastPlayedOnFrame frameToWrite, FrameHeaderWriter frameHeaderWriter, string frameID, EncodingScheme encoding) : base(frameToWrite, frameHeaderWriter, frameID, encoding) { }
public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { if (version == ID3v2MajorVersion.Version2) { return(new Writers.UniqueFileIdentifierFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "UFI", encoding)); } else if (version == ID3v2MajorVersion.Version3 || version == ID3v2MajorVersion.Version4) { return(new Writers.UniqueFileIdentifierFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "UFID", encoding)); } return(null); }
public PictureFrameWriterM3And4(PictureFrame frameToWrite, string frameID, Writers.FrameHeaderWriter headerWriter, EncodingScheme encoding) : base(frameToWrite, headerWriter, frameID, encoding) { }
public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { switch(version) { case ID3v2MajorVersion.Version2: return new Writers.GeneralEncapsulatedObjectFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "GEO", encoding); case ID3v2MajorVersion.Version3: case ID3v2MajorVersion.Version4: return new Writers.GeneralEncapsulatedObjectFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "GEOB", encoding); default: return null; } }
public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { if (version == ID3v2MajorVersion.Version2) { return(new Writers.PictureFrameWriterM2(this, "PIC", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding)); } else if (version == ID3v2MajorVersion.Version3 || version == ID3v2MajorVersion.Version4) { return(new Writers.PictureFrameWriterM3And4(this, "APIC", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding)); } else { return(null); } }
public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { switch (version) { case ID3v2MajorVersion.Version2: return(new Writers.GeneralEncapsulatedObjectFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "GEO", encoding)); case ID3v2MajorVersion.Version3: case ID3v2MajorVersion.Version4: return(new Writers.GeneralEncapsulatedObjectFrameWriter(this, Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), "GEOB", encoding)); default: return(null); } }
private void WriteFrame(Frame frame, Stream stream, ID3v2MajorVersion version, EncodingScheme encoding) { FrameWriter writer = frame.CreateWriter(version, encoding); if (writer == null) { throw new NoFrameWriterProvidedException(frame, version); } writer.WriteToStream(stream); }
public bool TryDecodeValue(Charset defaultCharset, bool enableFallback, bool allowControlCharacters, bool enable2047, bool enableJisDetection, bool enableUtf8Detection, bool enableDbcsDetection, out string charsetName, out string cultureName, out EncodingScheme encodingScheme, out string value) { charsetName = null; cultureName = null; encodingScheme = EncodingScheme.None; value = null; StringBuilder stringBuilder = ScratchPad.GetStringBuilder(Math.Min(1024, this.iterator.TotalLength)); char[] array = null; byte[] array2 = null; ValuePosition currentPosition = this.iterator.CurrentPosition; bool flag = false; bool flag2 = false; if (defaultCharset != null && (enableJisDetection || enableUtf8Detection || (enableDbcsDetection && FeInboundCharsetDetector.IsSupportedFarEastCharset(defaultCharset)))) { defaultCharset = this.DetectValueCharset(defaultCharset, enableJisDetection, enableUtf8Detection, enableDbcsDetection, out encodingScheme); flag2 = true; } Decoder decoder = null; string text = null; if (!enable2047) { this.iterator.SkipToEof(); } else { string lastEncodedWordLanguage = null; Charset charset = null; Decoder decoder2 = null; bool flag3 = true; string text2; for (;;) { this.ParseRawFragment(ref flag); if (this.iterator.Eof) { goto IL_217; } ValuePosition currentPosition2 = this.iterator.CurrentPosition; string text3; byte bOrQ; ValuePosition encodedWordContentStart; ValuePosition encodedWordContentEnd; if (!this.ParseEncodedWord(text, lastEncodedWordLanguage, ref array2, out text2, out text3, out bOrQ, out encodedWordContentStart, out encodedWordContentEnd)) { flag = false; } else { if (text == null) { encodingScheme = EncodingScheme.Rfc2047; charsetName = text2; cultureName = text3; } text = text2; if (currentPosition != currentPosition2 && !flag) { if (!flag3) { this.FlushDecoder(decoder2, allowControlCharacters, ref array2, ref array, stringBuilder); flag3 = true; } if (decoder == null) { if (defaultCharset == null || !defaultCharset.IsAvailable) { if (!enableFallback) { break; } } else { decoder = defaultCharset.GetEncoding().GetDecoder(); } } if (decoder != null) { this.ConvertRawFragment(currentPosition, currentPosition2, decoder, allowControlCharacters, ref array, stringBuilder); } else { this.ZeroExpandFragment(currentPosition, currentPosition2, allowControlCharacters, stringBuilder); } } Charset charset2; if (!Charset.TryGetCharset(text2, out charset2)) { if (!flag3) { this.FlushDecoder(decoder2, allowControlCharacters, ref array2, ref array, stringBuilder); flag3 = true; } if (!enableFallback) { goto Block_19; } decoder2 = null; } else if (charset2 != charset) { if (!flag3) { this.FlushDecoder(decoder2, allowControlCharacters, ref array2, ref array, stringBuilder); flag3 = true; } if (!charset2.IsAvailable) { if (!enableFallback) { goto Block_23; } decoder2 = null; } else { decoder2 = charset2.GetEncoding().GetDecoder(); charset = charset2; } } if (decoder2 != null) { this.DecodeEncodedWord(bOrQ, decoder2, encodedWordContentStart, encodedWordContentEnd, allowControlCharacters, ref array2, ref array, stringBuilder); flag3 = false; } else { this.ZeroExpandFragment(currentPosition2, this.iterator.CurrentPosition, allowControlCharacters, stringBuilder); } currentPosition = this.iterator.CurrentPosition; flag = true; } } charsetName = ((defaultCharset == null) ? null : defaultCharset.Name); return(false); Block_19: charsetName = text2; return(false); Block_23: charsetName = text2; return(false); IL_217: if (!flag3) { this.FlushDecoder(decoder2, allowControlCharacters, ref array2, ref array, stringBuilder); } } if (currentPosition != this.iterator.CurrentPosition) { if (text == null) { if (flag2 && encodingScheme == EncodingScheme.None && defaultCharset != null && !defaultCharset.IsSevenBit && defaultCharset.AsciiSupport == CodePageAsciiSupport.Complete) { charsetName = Charset.ASCII.Name; } else { charsetName = ((defaultCharset == null) ? null : defaultCharset.Name); } } if (decoder == null) { if (defaultCharset == null || !defaultCharset.IsAvailable) { if (!enableFallback) { charsetName = ((defaultCharset == null) ? null : defaultCharset.Name); return(false); } decoder = null; } else { decoder = defaultCharset.GetEncoding().GetDecoder(); } } if (decoder != null) { this.ConvertRawFragment(currentPosition, this.iterator.CurrentPosition, decoder, allowControlCharacters, ref array, stringBuilder); } else { this.ZeroExpandFragment(currentPosition, this.iterator.CurrentPosition, allowControlCharacters, stringBuilder); } } ScratchPad.ReleaseStringBuilder(); value = stringBuilder.ToString(); return(true); }
private Globalization.Charset DetectValueCharset(Globalization.Charset defaultCharset, bool enableJisDetection, bool enableUtf8Detection, bool enableDbcsDetection, out EncodingScheme encodingScheme) { var valueIterator = new ValueIterator(iterator.Lines, iterator.LinesMask); var inboundCharsetDetector = new Globalization.FeInboundCharsetDetector(defaultCharset.CodePage, false, enableJisDetection, enableUtf8Detection, enableDbcsDetection); while (!valueIterator.Eof) { inboundCharsetDetector.AddBytes(valueIterator.Bytes, valueIterator.Offset, valueIterator.Length, false); valueIterator.Get(valueIterator.Length); } inboundCharsetDetector.AddBytes(null, 0, 0, true); var codePageChoice = inboundCharsetDetector.GetCodePageChoice(); if (codePageChoice != defaultCharset.CodePage) defaultCharset = Globalization.Charset.GetCharset(codePageChoice); encodingScheme = inboundCharsetDetector.PureAscii ? (!(defaultCharset.Name == "iso-2022-jp") || inboundCharsetDetector.Iso2022KrLikely ? EncodingScheme.None : EncodingScheme.Jis) : (inboundCharsetDetector.Iso2022JpLikely || inboundCharsetDetector.Iso2022KrLikely ? EncodingScheme.Jis : EncodingScheme.EightBit); return defaultCharset; }
private void TestVersion(EncodingScheme encoding, ID3v2MajorVersion version) { foreach(string testcase in _asciiTestCases) { TestTextFrame(new AlbumTextFrame(testcase), encoding, version); TestTextFrame(new ArtistTextFrame(testcase), encoding, version); TestTextFrame(new ComposerTextFrame(testcase), encoding, version); TestTextFrame(new CopyrightTextFrame(testcase), encoding, version); TestTextFrame(new CustomUserTextFrame(testcase), encoding, version); TestTextFrame(new DateTextFrame(testcase), encoding, version); TestTextFrame(new EncodedByTextFrame(testcase), encoding, version); TestTextFrame(new EncodingTimeTextFrame(testcase), encoding, version); TestTextFrame(new FileTypeTextFrame(testcase), encoding, version); TestTextFrame(new GenreTextFrame(testcase), encoding, version); TestTextFrame(new GroupingTextFrame(testcase), encoding, version); TestTextFrame(new InitialKeyTextFrame(testcase), encoding, version); TestTextFrame(new LanguageTextFrame(testcase), encoding, version); TestTextFrame(new LengthTextFrame(testcase), encoding, version); TestTextFrame(new MediaTypeTextFrame(testcase), encoding, version); TestTextFrame(new OrchestraTextFrame(testcase), encoding, version); TestTextFrame(new OriginalAlbumTextFrame(testcase), encoding, version); TestTextFrame(new OriginalArtistTextFrame(testcase), encoding, version); TestTextFrame(new OriginalReleaseTimeTextFrame(testcase), encoding, version); TestTextFrame(new OriginalReleaseYearTextFrame(testcase), encoding, version); TestTextFrame(new PublisherTextFrame(testcase), encoding, version); TestTextFrame(new RecordingTimeTextFrame(testcase), encoding, version); TestTextFrame(new ReleaseTimeTextFrame(testcase), encoding, version); TestTextFrame(new SoftwareSettingsTextFrame(testcase), encoding, version); TestTextFrame(new TaggingTimeTextFrame(testcase), encoding, version); TestTextFrame(new TitleTextFrame(testcase), encoding, version); } if(encoding!=EncodingScheme.Ascii) { foreach(string testcase in _unicodeTestCases) { TestTextFrame(new AlbumTextFrame(testcase), encoding, version); TestTextFrame(new ArtistTextFrame(testcase), encoding, version); TestTextFrame(new ComposerTextFrame(testcase), encoding, version); TestTextFrame(new CopyrightTextFrame(testcase), encoding, version); TestTextFrame(new CustomUserTextFrame(testcase), encoding, version); TestTextFrame(new DateTextFrame(testcase), encoding, version); TestTextFrame(new EncodedByTextFrame(testcase), encoding, version); TestTextFrame(new EncodingTimeTextFrame(testcase), encoding, version); TestTextFrame(new FileTypeTextFrame(testcase), encoding, version); TestTextFrame(new GenreTextFrame(testcase), encoding, version); TestTextFrame(new GroupingTextFrame(testcase), encoding, version); TestTextFrame(new InitialKeyTextFrame(testcase), encoding, version); TestTextFrame(new LanguageTextFrame(testcase), encoding, version); TestTextFrame(new LengthTextFrame(testcase), encoding, version); TestTextFrame(new MediaTypeTextFrame(testcase), encoding, version); TestTextFrame(new OrchestraTextFrame(testcase), encoding, version); TestTextFrame(new OriginalAlbumTextFrame(testcase), encoding, version); TestTextFrame(new OriginalArtistTextFrame(testcase), encoding, version); TestTextFrame(new OriginalReleaseTimeTextFrame(testcase), encoding, version); TestTextFrame(new OriginalReleaseYearTextFrame(testcase), encoding, version); TestTextFrame(new PublisherTextFrame(testcase), encoding, version); TestTextFrame(new RecordingTimeTextFrame(testcase), encoding, version); TestTextFrame(new ReleaseTimeTextFrame(testcase), encoding, version); TestTextFrame(new SoftwareSettingsTextFrame(testcase), encoding, version); TestTextFrame(new TaggingTimeTextFrame(testcase), encoding, version); TestTextFrame(new TitleTextFrame(testcase), encoding, version); } } TestTextFrame(new PartOfSetTextFrame(4), encoding, version); TestTextFrame(new PartOfSetTextFrame(45,123), encoding, version); TestTextFrame(new TrackTextFrame(415), encoding, version); TestTextFrame(new TrackTextFrame(15,1234), encoding, version); TestTextFrame(new YearTextFrame(""), encoding, version); TestTextFrame(new YearTextFrame("14"), encoding, version); TestTextFrame(new YearTextFrame("144"), encoding, version); TestTextFrame(new YearTextFrame("1234"), encoding, version); TestTextFrame(new TimeTextFrame("134"), encoding, version); TestTextFrame(new BeatsPerMinuteTextFrame(134), encoding, version); }
public UrlFrameWriter(UrlFrame frameToWrite, string frameID, FrameHeaderWriter headerWriter, EncodingScheme encoding) : base(frameToWrite, headerWriter, frameID, encoding) { }
public ExtendedTextFrameWriter(ExtendedTextFrame frameToWrite, string frameID, FrameHeaderWriter headerWriter, EncodingScheme encoding) : base(frameToWrite, headerWriter, frameID, encoding) { this._frameID = frameID; }
private Charset DetectValueCharset(Charset defaultCharset, bool enableJisDetection, bool enableUtf8Detection, bool enableDbcsDetection, out EncodingScheme encodingScheme) { ValueIterator valueIterator = new ValueIterator(this.iterator.Lines, this.iterator.LinesMask); FeInboundCharsetDetector feInboundCharsetDetector = new FeInboundCharsetDetector(defaultCharset.CodePage, false, enableJisDetection, enableUtf8Detection, enableDbcsDetection); while (!valueIterator.Eof) { feInboundCharsetDetector.AddBytes(valueIterator.Bytes, valueIterator.Offset, valueIterator.Length, false); valueIterator.Get(valueIterator.Length); } feInboundCharsetDetector.AddBytes(null, 0, 0, true); int codePageChoice = feInboundCharsetDetector.GetCodePageChoice(); if (codePageChoice != defaultCharset.CodePage) { defaultCharset = Charset.GetCharset(codePageChoice); } if (!feInboundCharsetDetector.PureAscii) { if (feInboundCharsetDetector.Iso2022JpLikely || feInboundCharsetDetector.Iso2022KrLikely) { encodingScheme = EncodingScheme.Jis; } else { encodingScheme = EncodingScheme.EightBit; } } else if (defaultCharset.Name == "iso-2022-jp" && !feInboundCharsetDetector.Iso2022KrLikely) { encodingScheme = EncodingScheme.Jis; } else { encodingScheme = EncodingScheme.None; } return(defaultCharset); }
public ExtendedTextFrameWriter(ExtendedTextFrame frameToWrite, string frameID, FrameHeaderWriter headerWriter, EncodingScheme encoding) : base(frameToWrite, headerWriter,frameID,encoding) { this._frameID=frameID; }
private void WriteFrame(Frame frame, Stream stream, ID3v2MajorVersion version, EncodingScheme encoding) { FrameWriter writer=frame.CreateWriter(version, encoding); if(writer==null) { throw new NoFrameWriterProvidedException(frame, version); } writer.WriteToStream(stream); }
//public abstract Parsers.FrameParser CreateParser(ID3v2MajorVersion version, string frameID); public abstract Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding);
public virtual void WriteToFile(string fileName, ID3v2MajorVersion version, EncodingScheme encoding) { FileStream targetFileStream=null; try { // First write all frame data to a memory buffer // This way we catch all fatal exceptions before // touching the file, so there's not a even a slight // chance of corrupting the file. MemoryStream memoryBuffer=new MemoryStream(); WriteFrames(memoryBuffer, version, encoding); int newSize=(int)memoryBuffer.Length; if(newSize==0) { throw new FatalException("No data to write in the tag."); } targetFileStream=File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); TagHeader oldHeader=TagHeader.FromStream(targetFileStream); bool useIntermediate=false; if(oldHeader==null) { // There is no attached tag in the file. We need to use an intermediate temporary file. useIntermediate=true; // Rewind the place in stream to the very beginning, so that when // we copy the data from the original file to the intermediate file, // we won't lose any data. targetFileStream.Seek(0, SeekOrigin.Begin); } else { // File already has an ID3 v2 tag attached. if(oldHeader.TagSize<newSize) { useIntermediate=true; // Allow for 4KB of padding. newSize+=4*1024; // Move to the correct place in stream so when we copy data to // the intermediate file, we won't lose any data. // The +10 is to go skip the tag header, since it's not included // in TagHeader.TagSize targetFileStream.Seek(oldHeader.TagSize+10, SeekOrigin.Begin); } else { // We should write exactly the same number of bytes back to the file. // When writing the padding, compare memoryBuffer.Length to newSize to // calculate the number of padding bytes required to write. newSize=oldHeader.TagSize; // Seek the beginning of the file. The tag header and frame information // will be overwritten. targetFileStream.Seek(0, SeekOrigin.Begin); } } TagHeader newHeader=new TagHeader((byte)version, 0, TagHeaderFlags.None, newSize); if(useIntermediate) { string intermediateFileName=GetTempIntermediateFileName(fileName); FileStream intermediateStream=null; try { intermediateStream=File.Create(intermediateFileName); newHeader.WriteToStream(intermediateStream); // Write the frame data residing in memory buffer. intermediateStream.Write(memoryBuffer.GetBuffer(), 0, (int)memoryBuffer.Length); //Write any required paddings. for(int i=(int)memoryBuffer.Length;i<newSize;i++) { intermediateStream.WriteByte(0); } // Copy the data from the original file to the intermediate file. CopyFromStreamToStream(targetFileStream, intermediateStream); // Close the stream of original and intermediate file streams. targetFileStream.Close(); intermediateStream.Close(); // If control reaches this point, then everything went file, so // should normally delete the original file and rename the intermediate file. // But as a safety measure, for pre-release, alpha, and beta version, // instead of removing the file, I decided to rename the old file to // fileName+".old."+revisionNumber instead. The user can manually delete // the these files after ensuring the integrity of the new files. #if ACHAMENES_ID3_BACKUP_FILES_BEFORE_MODIFICATION File.Move(fileName, GetBackupFileName(fileName)); #else File.Delete(fileName); #endif File.Move(intermediateFileName, fileName); } finally { if(intermediateStream!=null) { intermediateStream.Close(); } } } else // If using an intermediate file is not necessary. { // Similarly, we would normally just start writing to @stream here, // but instead, we close it, make a backup copy of it, and then // open it again, and write the tag information just to ensure nothing // will be lost. targetFileStream.Close(); #if ACHAMENES_ID3_BACKUP_FILES_BEFORE_MODIFICATION File.Copy(fileName, GetBackupFileName(fileName)); #endif targetFileStream=File.Open(fileName, FileMode.Open, FileAccess.Write, FileShare.Write); // Write the header. newHeader.WriteToStream(targetFileStream); // Write frame data from memory buffer. targetFileStream.Write(memoryBuffer.GetBuffer(), 0, (int)memoryBuffer.Length); // Write any required padding. for(int i=(int)memoryBuffer.Length;i<newSize;i++) { targetFileStream.WriteByte(0); } // And finally close the stream. targetFileStream.Close(); } } finally { if(targetFileStream!=null) { targetFileStream.Close(); } } }
public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { if (version == ID3v2MajorVersion.Version2) { return(new Writers.UrlFrameWriter(this, "WXX", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding)); } if (version == ID3v2MajorVersion.Version3 || version == ID3v2MajorVersion.Version4) { return(new Writers.UrlFrameWriter(this, "WXXX", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding)); } return(null); }
private void RunTest(TagBase tag, ID3v2MajorVersion version, EncodingScheme encoding) { File.Delete(_taggedFile1); File.Delete(_taggedFile2); File.Copy(_originalFile, _taggedFile1); File.Copy(_originalFile, _taggedFile2); tag.WriteToFile(_taggedFile1, version, encoding); TagBase tag2=new TagBase(); tag2.ReadFromFile(_taggedFile1); tag2.WriteToFile(_taggedFile2, version, encoding); Assert.IsTrue(CompareFiles(_taggedFile1, _taggedFile2)); TagBase.RemoveTag(_taggedFile1); Assert.IsTrue(CompareFiles(_taggedFile1, _originalFile)); TagBase.RemoveTag(_taggedFile2); Assert.IsTrue(CompareFiles(_taggedFile2, _originalFile)); }
public override Achamenes.ID3.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { if(version==ID3v2MajorVersion.Version2) { return new Writers.PictureFrameWriterM2(this, "PIC", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding); } else if(version==ID3v2MajorVersion.Version3 || version==ID3v2MajorVersion.Version4) { return new Writers.PictureFrameWriterM3And4(this, "APIC", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding); } else { return null; } }
public override ID3Utils.Frames.Writers.FrameWriter CreateWriter(ID3v2MajorVersion version, EncodingScheme encoding) { if (version == ID3v2MajorVersion.Version2) { return(new Writers.TextFrameWriter(this, "TOR", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding)); } if (version == ID3v2MajorVersion.Version3) { return(new Writers.TextFrameWriter(this, "TORY", Writers.FrameHeaderWriter.CreateFrameHeaderWriter(version), encoding)); } return(null); }