/// <summary> /// Logs a message from the <see cref="Validator"/>. /// </summary> /// <param name="message">A <see cref="String"/> of tab-delmited tokens /// in the validation message.</param> /// <param name="action">The name of the action to which the message /// belongs.</param> /// <exception cref="ArgumentNullException">The message cannot be null. /// </exception> /// <exception cref="WixException">The message does not contain four (4) /// or more tab-delimited tokens.</exception> /// <remarks> /// <para><paramref name="message"/> a tab-delimited set of tokens, /// formatted according to Windows Installer guidelines for ICE /// message. The following table lists what each token by index /// should mean.</para> /// <para><paramref name="action"/> a name that represents the ICE /// action that was executed (e.g. 'ICE08').</para> /// <list type="table"> /// <listheader> /// <term>Index</term> /// <description>Description</description> /// </listheader> /// <item> /// <term>0</term> /// <description>Name of the ICE.</description> /// </item> /// <item> /// <term>1</term> /// <description>Message type. See the following list.</description> /// </item> /// <item> /// <term>2</term> /// <description>Detailed description.</description> /// </item> /// <item> /// <term>3</term> /// <description>Help URL or location.</description> /// </item> /// <item> /// <term>4</term> /// <description>Table name.</description> /// </item> /// <item> /// <term>5</term> /// <description>Column name.</description> /// </item> /// <item> /// <term>6</term> /// <description>This and remaining fields are primary keys /// to identify a row.</description> /// </item> /// </list> /// <para>The message types are one of the following value.</para> /// <list type="table"> /// <listheader> /// <term>Value</term> /// <description>Message Type</description> /// </listheader> /// <item> /// <term>0</term> /// <description>Failure message reporting the failure of the /// ICE custom action.</description> /// </item> /// <item> /// <term>1</term> /// <description>Error message reporting database authoring that /// case incorrect behavior.</description> /// </item> /// <item> /// <term>2</term> /// <description>Warning message reporting database authoring that /// causes incorrect behavior in certain cases. Warnings can also /// report unexpected side-effects of database authoring. /// </description> /// </item> /// <item> /// <term>3</term> /// <description>Informational message.</description> /// </item> /// </list> /// </remarks> public virtual void Log(string message, string action) { if (message == null) { throw new ArgumentNullException("message"); } string[] messageParts = message.Split('\t'); if (3 > messageParts.Length) { if (null == action) { throw new WixException(WixErrors.UnexpectedExternalUIMessage(message)); } else { throw new WixException(WixErrors.UnexpectedExternalUIMessage(message, action)); } } SourceLineNumberCollection messageSourceLineNumbers = null; if (6 < messageParts.Length) { string[] primaryKeys = new string[messageParts.Length - 6]; Array.Copy(messageParts, 6, primaryKeys, 0, primaryKeys.Length); messageSourceLineNumbers = this.GetSourceLineNumbers(messageParts[4], primaryKeys); } else // use the file name as the source line information { messageSourceLineNumbers = this.sourceLineNumbers; } switch (messageParts[1]) { case "0": case "1": this.OnMessage(WixErrors.ValidationError(messageSourceLineNumbers, messageParts[0], messageParts[2])); break; case "2": this.OnMessage(WixWarnings.ValidationWarning(messageSourceLineNumbers, messageParts[0], messageParts[2])); break; case "3": this.OnMessage(WixVerboses.ValidationInfo(messageParts[0], messageParts[2])); break; default: throw new WixException(WixErrors.InvalidValidatorMessageType(messageParts[1])); } }