private void writeCommentChunk(BinaryWriter w, MetaFieldInfo info, string comment = "") { byte[] commentData = null; if (null == info) // Plain string { w.Write(StreamUtils.EncodeBEUInt32(encodeTimestamp(DateTime.Now))); w.Write((short)0); commentData = Utils.Latin1Encoding.GetBytes(comment); } else { w.Write(StreamUtils.EncodeBEUInt32(((CommentData)info.SpecificData).Timestamp)); w.Write(StreamUtils.EncodeBEInt16(((CommentData)info.SpecificData).MarkerId)); commentData = Utils.Latin1Encoding.GetBytes(info.Value); } w.Write(StreamUtils.EncodeBEUInt16((ushort)commentData.Length)); w.Write(commentData); }
protected override int write(TagData tag, BinaryWriter w, string zone) { int result = 0; if (zone.Equals(CHUNKTYPE_NAME)) { if (tag.Title.Length > 0) { w.Write(Utils.Latin1Encoding.GetBytes(zone)); long sizePos = w.BaseStream.Position; w.Write(0); // Placeholder for field size that will be rewritten at the end of the method byte[] strBytes = Utils.Latin1Encoding.GetBytes(tag.Title); w.Write(strBytes); w.BaseStream.Seek(sizePos, SeekOrigin.Begin); w.Write(StreamUtils.EncodeBEInt32(strBytes.Length)); result++; } } else if (zone.Equals(CHUNKTYPE_AUTHOR)) { if (tag.Artist.Length > 0) { w.Write(Utils.Latin1Encoding.GetBytes(zone)); long sizePos = w.BaseStream.Position; w.Write(0); // Placeholder for field size that will be rewritten at the end of the method byte[] strBytes = Utils.Latin1Encoding.GetBytes(tag.Artist); w.Write(strBytes); w.BaseStream.Seek(sizePos, SeekOrigin.Begin); w.Write(StreamUtils.EncodeBEInt32(strBytes.Length)); result++; } } else if (zone.Equals(CHUNKTYPE_COPYRIGHT)) { if (tag.Copyright.Length > 0) { w.Write(Utils.Latin1Encoding.GetBytes(zone)); long sizePos = w.BaseStream.Position; w.Write(0); // Placeholder for field size that will be rewritten at the end of the method byte[] strBytes = Utils.Latin1Encoding.GetBytes(tag.Copyright); w.Write(strBytes); w.BaseStream.Seek(sizePos, SeekOrigin.Begin); w.Write(StreamUtils.EncodeBEInt32(strBytes.Length)); result++; } } else if (zone.StartsWith(CHUNKTYPE_ANNOTATION)) { // Do not write anything, this field is deprecated (Cf. specs "Use of this chunk is discouraged within FORM AIFC. The more refined Comments Chunk should be used instead") } else if (zone.StartsWith(CHUNKTYPE_COMMENTS)) { bool applicable = tag.Comment.Length > 0; if (!applicable && tag.AdditionalFields.Count > 0) { foreach (MetaFieldInfo fieldInfo in tag.AdditionalFields) { applicable = (fieldInfo.NativeFieldCode.StartsWith(CHUNKTYPE_COMMENTS)); if (applicable) { break; } } } if (applicable) { ushort numComments = 0; w.Write(Utils.Latin1Encoding.GetBytes(CHUNKTYPE_COMMENTS)); long sizePos = w.BaseStream.Position; w.Write(0); // Placeholder for 'chunk size' field that will be rewritten at the end of the method w.Write((ushort)0); // Placeholder for 'number of comments' field that will be rewritten at the end of the method // First write generic comments (those linked to the Comment field) string[] comments = tag.Comment.Split(Settings.InternalValueSeparator); foreach (string s in comments) { writeCommentChunk(w, null, s); numComments++; } // Then write comments linked to a Marker ID if (tag.AdditionalFields != null && tag.AdditionalFields.Count > 0) { foreach (MetaFieldInfo fieldInfo in tag.AdditionalFields) { if (fieldInfo.NativeFieldCode.StartsWith(CHUNKTYPE_COMMENTS)) { if (((CommentData)fieldInfo.SpecificData).MarkerId != 0) { writeCommentChunk(w, fieldInfo); numComments++; } } } } long dataEndPos = w.BaseStream.Position; w.BaseStream.Seek(sizePos, SeekOrigin.Begin); w.Write(StreamUtils.EncodeBEInt32((int)(dataEndPos - sizePos - 4))); w.Write(StreamUtils.EncodeBEUInt16(numComments)); result++; } } return(result); }