File: ProgressEventArgs.cs
Web Access
Project: ..\..\..\src\Microsoft.Win32.Msi\Microsoft.Win32.Msi.csproj (Microsoft.Win32.Msi)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.RegularExpressions;
 
namespace Microsoft.Win32.Msi
{
    /// <summary>
    /// Defines event data for a progress message. 
    /// </summary>
    public class ProgressEventArgs : InstallMessageEventArgs
    {
        /// <summary>
        /// Returns the type of progress message (derived from the first field).
        /// </summary>
        public ProgressType ProgressType => (ProgressType)Fields[0];
 
        /// <summary>
        /// The message fields.
        /// </summary>
        public readonly int[] Fields;
 
        public ProgressEventArgs(string message, InstallMessage messageType, MessageBox style) :
            base(message, messageType, style)
        {
            // Progress messages have up to 4 fields and are formatted as "<field>: <fieldValue>", e.g.
            // "1: 2 2: 25 3: 0 4: 1". Not all fields may be present and some fields have no meaning
            // depending on the message subtype (even though they are present).
            // 
            // See https://docs.microsoft.com/en-us/windows/win32/msi/parsing-windows-installer-messages
            Match match = Regex.Match(message, @"(?<field>\d):\s+(?<value>\d+)");
 
            List<int> fields = new();
 
            while (match.Success)
            {
                fields.Add(Convert.ToInt32(match.Groups["value"].Value));
                match = match.NextMatch();
            }
 
            Fields = fields.ToArray();
        }
    }
}