File: FileAccess\FileAccessData.cs
Web Access
Project: src\msbuild\src\Build\Microsoft.Build.csproj (Microsoft.Build)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using Microsoft.Build.BackEnd;

namespace Microsoft.Build.Experimental.FileAccess
{
    /// <summary>
    /// File access data.
    /// </summary>
    [CLSCompliant(false)]
    public struct FileAccessData
        : ITranslatable
    {
        private ReportedFileOperation _operation;
        private RequestedAccess _requestedAccess;
        private uint _processId;
        private uint _id;
        private uint _correlationId;
        private uint _error;
        private DesiredAccess _desiredAccess;
        private FlagsAndAttributes _flagsAndAttributes;
        private string _path;
        private string? _processArgs;
        private bool _isAnAugmentedFileAccess;
        private string? _enumeratePattern;
        private FlagsAndAttributes _openedFileOrDirectoryAttributes;

        public FileAccessData(
            ReportedFileOperation operation,
            RequestedAccess requestedAccess,
            uint processId,
            uint id,
            uint correlationId,
            uint error,
            DesiredAccess desiredAccess,
            FlagsAndAttributes flagsAndAttributes,
            string path,
            string? processArgs,
            bool isAnAugmentedFileAccess)
            // This overload predates EnumeratePattern and OpenedFileOrDirectoryAttributes; callers using it have
            // no values to supply, so they default to "not provided": no enumeration pattern and no attributes.
            : this(
                operation,
                requestedAccess,
                processId,
                id,
                correlationId,
                error,
                desiredAccess,
                flagsAndAttributes,
                path,
                processArgs,
                isAnAugmentedFileAccess,
                enumeratePattern: null,
                openedFileOrDirectoryAttributes: 0)
        {
        }

        public FileAccessData(
            ReportedFileOperation operation,
            RequestedAccess requestedAccess,
            uint processId,
            uint id,
            uint correlationId,
            uint error,
            DesiredAccess desiredAccess,
            FlagsAndAttributes flagsAndAttributes,
            string path,
            string? processArgs,
            bool isAnAugmentedFileAccess,
            string? enumeratePattern,
            FlagsAndAttributes openedFileOrDirectoryAttributes)
        {
            _operation = operation;
            _requestedAccess = requestedAccess;
            _processId = processId;
            _id = id;
            _correlationId = correlationId;
            _error = error;
            _desiredAccess = desiredAccess;
            _flagsAndAttributes = flagsAndAttributes;
            _path = path;
            _processArgs = processArgs;
            _isAnAugmentedFileAccess = isAnAugmentedFileAccess;
            _enumeratePattern = enumeratePattern;
            _openedFileOrDirectoryAttributes = openedFileOrDirectoryAttributes;
        }

        /// <summary>The operation that performed the file access.</summary>
        public ReportedFileOperation Operation
        {
            readonly get => _operation;
            private set => _operation = value;
        }

        /// <summary>The requested access.</summary>
        public RequestedAccess RequestedAccess
        {
            readonly get => _requestedAccess;
            private set => _requestedAccess = value;
        }

        /// <summary>The process id.</summary>
        public uint ProcessId
        {
            readonly get => _processId;
            private set => _processId = value;
        }

        /// <summary>Id of file access.</summary>
        public uint Id
        {
            readonly get => _id;
            private set => _id = value;
        }


        /// <summary>Correlation id of file access.</summary>
        public uint CorrelationId
        {
            readonly get => _correlationId;
            private set => _correlationId = value;
        }


        /// <summary>The error code of the operation.</summary>
        public uint Error
        {
            readonly get => _error;
            private set => _error = value;
        }

        /// <summary>The desired access.</summary>
        public DesiredAccess DesiredAccess
        {
            readonly get => _desiredAccess;
            private set => _desiredAccess = value;
        }

        /// <summary>The file flags and attributes.</summary>
        public FlagsAndAttributes FlagsAndAttributes
        {
            readonly get => _flagsAndAttributes;
            private set => _flagsAndAttributes = value;
        }

        /// <summary>The path being accessed.</summary>
        public string Path
        {
            readonly get => _path;
            private set => _path = value;
        }

        /// <summary>The process arguments.</summary>
        public string? ProcessArgs
        {
            readonly get => _processArgs;
            private set => _processArgs = value;
        }

        /// <summary>Whether the file access is augmented.</summary>
        public bool IsAnAugmentedFileAccess
        {
            readonly get => _isAnAugmentedFileAccess;
            private set => _isAnAugmentedFileAccess = value;
        }

        /// <summary>
        /// The search pattern passed to a directory enumeration API (e.g., the <c>lpFileName</c>
        /// pattern argument to <c>FindFirstFileEx</c> such as <c>*.cs</c>). <see langword="null"/>
        /// for accesses that are not directory enumerations.
        /// </summary>
        public string? EnumeratePattern
        {
            readonly get => _enumeratePattern;
            private set => _enumeratePattern = value;
        }

        /// <summary>
        /// The actual flags and attributes of the opened file or directory as resolved by the
        /// kernel. Contrast with <see cref="FlagsAndAttributes"/>, which reflects what the caller
        /// requested when opening the handle.
        /// </summary>
        public FlagsAndAttributes OpenedFileOrDirectoryAttributes
        {
            readonly get => _openedFileOrDirectoryAttributes;
            private set => _openedFileOrDirectoryAttributes = value;
        }

        void ITranslatable.Translate(ITranslator translator)
        {
            translator.TranslateEnum(ref _operation, (int)_operation);
            translator.TranslateEnum(ref _requestedAccess, (int)_requestedAccess);
            translator.Translate(ref _processId);
            translator.Translate(ref _id);
            translator.Translate(ref _correlationId);
            translator.Translate(ref _error);
            translator.TranslateEnum(ref _desiredAccess, (int)_desiredAccess);
            translator.TranslateEnum(ref _flagsAndAttributes, (int)_flagsAndAttributes);
            translator.Translate(ref _path);
            translator.Translate(ref _processArgs);
            translator.Translate(ref _isAnAugmentedFileAccess);
            translator.Translate(ref _enumeratePattern);
            translator.TranslateEnum(ref _openedFileOrDirectoryAttributes, (int)_openedFileOrDirectoryAttributes);
        }
    }
}