#region License /* Copyright (c) 2005 Leslie Sanford * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #endregion #region Contact /* * Leslie Sanford * Email: jabberdabber@hotmail.com */ #endregion using System; using System.Text; namespace Sanford.Multimedia.Midi { /// /// Provides functionality for building meta text messages. /// public class MetaTextBuilder : IMessageBuilder { #region MetaTextBuilder Members #region Fields // The text represented by the MetaMessage. private string text; // The MetaMessage type - must be one of the text based types. private MetaType type = MetaType.Text; // The built MetaMessage. private MetaMessage result = null; // Indicates whether or not the text has changed since the message was // last built. private bool changed = true; #endregion #region Construction /// /// Initializes a new instance of the MetaMessageTextBuilder class. /// public MetaTextBuilder() { text = string.Empty; } /// /// Initializes a new instance of the MetaMessageTextBuilder class with the /// specified type. /// /// /// The type of MetaMessage. /// /// /// If the MetaMessage type is not a text based type. /// /// /// The MetaMessage type must be one of the following text based /// types: /// /// /// Copyright /// /// /// Cuepoint /// /// /// DeviceName /// /// /// InstrumentName /// /// /// Lyric /// /// /// Marker /// /// /// ProgramName /// /// /// Text /// /// /// TrackName /// /// /// If the MetaMessage is not a text based type, an exception /// will be thrown. /// public MetaTextBuilder(MetaType type) { #region Require if(!IsTextType(type)) { throw new ArgumentException("Not text based meta message type.", "message"); } #endregion this.text = string.Empty; } /// /// Initializes a new instance of the MetaMessageTextBuilder class with the /// specified type. /// /// /// The type of MetaMessage. /// /// /// If the MetaMessage type is not a text based type. /// /// /// The MetaMessage type must be one of the following text based /// types: /// /// /// Copyright /// /// /// Cuepoint /// /// /// DeviceName /// /// /// InstrumentName /// /// /// Lyric /// /// /// Marker /// /// /// ProgramName /// /// /// Text /// /// /// TrackName /// /// /// If the MetaMessage is not a text based type, an exception /// will be thrown. /// public MetaTextBuilder(MetaType type, string text) { #region Require if(!IsTextType(type)) { throw new ArgumentException("Not text based meta message type.", "message"); } #endregion this.type = type; if(text != null) { this.text = text; } else { this.text = string.Empty; } } /// /// Initializes a new instance of the MetaMessageTextBuilder class with the /// specified MetaMessage. /// /// /// The MetaMessage to use for initializing the MetaMessageTextBuilder. /// /// /// If the MetaMessage is not a text based type. /// /// /// The MetaMessage must be one of the following text based types: /// /// /// Copyright /// /// /// Cuepoint /// /// /// DeviceName /// /// /// InstrumentName /// /// /// Lyric /// /// /// Marker /// /// /// ProgramName /// /// /// Text /// /// /// TrackName /// /// /// If the MetaMessage is not a text based type, an exception will be /// thrown. /// public MetaTextBuilder(MetaMessage message) { Initialize(message); } #endregion #region Methods /// /// Initializes the MetaMessageTextBuilder with the specified MetaMessage. /// /// /// The MetaMessage to use for initializing the MetaMessageTextBuilder. /// /// /// If the MetaMessage is not a text based type. /// public void Initialize(MetaMessage message) { #region Require if(!IsTextType(message.MetaType)) { throw new ArgumentException("Not text based meta message.", "message"); } #endregion ASCIIEncoding encoding = new ASCIIEncoding(); text = encoding.GetString(message.GetBytes()); this.type = message.MetaType; } /// /// Indicates whether or not the specified MetaType is a text based /// type. /// /// /// The MetaType to test. /// /// /// true if the MetaType is a text based type; /// otherwise, false. /// private bool IsTextType(MetaType type) { bool result; if(type == MetaType.Copyright || type == MetaType.CuePoint || type == MetaType.DeviceName || type == MetaType.InstrumentName || type == MetaType.Lyric || type == MetaType.Marker || type == MetaType.ProgramName || type == MetaType.Text || type == MetaType.TrackName) { result = true; } else { result = false; } return result; } #endregion #region Properties /// /// Gets or sets the text for the MetaMessage. /// public string Text { get { return text; } set { if(value != null) { text = value; } else { text = string.Empty; } changed = true; } } /// /// Gets or sets the MetaMessage type. /// /// /// If the type is not a text based type. /// public MetaType Type { get { return type; } set { #region Require if(!IsTextType(value)) { throw new ArgumentException("Not text based meta message type.", "message"); } #endregion type = value; changed = true; } } /// /// Gets the built MetaMessage. /// public MetaMessage Result { get { return result; } } #endregion #endregion #region IMessageBuilder Members /// /// Builds the text MetaMessage. /// public void Build() { // If the text has changed since the last time this method was // called. if(changed) { // // Build text MetaMessage. // ASCIIEncoding encoding = new ASCIIEncoding(); byte[] data = encoding.GetBytes(text); result = new MetaMessage(Type, data); changed = false; } } #endregion } }