| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | #region Copyright notice and license// Copyright 2018 gRPC authors.//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at////     http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.#endregionusing System;using System.IO;using System.Runtime.CompilerServices;using System.Runtime.InteropServices;using System.Security;[assembly: InternalsVisibleTo("Grpc.Tools.Tests")]namespace Grpc.Tools{    // Metadata names (MSBuild item attributes) that we refer to often.    static class Metadata    {        // On output dependency lists.        public static string Source = "Source";        // On Protobuf items.        public static string ProtoRoot = "ProtoRoot";        public static string OutputDir = "OutputDir";        public static string GrpcServices = "GrpcServices";        public static string GrpcOutputDir = "GrpcOutputDir";    };    // A few flags used to control the behavior under various platforms.    internal static class Platform    {        public enum OsKind { Unknown, Windows, Linux, MacOsX };        public static readonly OsKind Os;        public enum CpuKind { Unknown, X86, X64 };        public static readonly CpuKind Cpu;        // This is not necessarily true, but good enough. BCL lacks a per-FS        // API to determine file case sensitivity.        public static bool IsFsCaseInsensitive => Os == OsKind.Windows;        public static bool IsWindows => Os == OsKind.Windows;        static Platform()        {#if NETCORE            Os = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? OsKind.Windows               : RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? OsKind.Linux               : RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? OsKind.MacOsX               : OsKind.Unknown;            switch (RuntimeInformation.ProcessArchitecture)            {                case Architecture.X86: Cpu = CpuKind.X86; break;                case Architecture.X64: Cpu = CpuKind.X64; break;                // We do not have build tools for other architectures.                default: Cpu = CpuKind.Unknown; break;            }#else            // Running under either Mono or full MS framework.            Os = OsKind.Windows;            if (Type.GetType("Mono.Runtime", throwOnError: false) != null)            {                // Congratulations. We are running under Mono.                var plat = Environment.OSVersion.Platform;                if (plat == PlatformID.MacOSX)                {                    Os = OsKind.MacOsX;                }                else if (plat == PlatformID.Unix || (int)plat == 128)                {                    // This is how Mono detects OSX internally.                    Os = File.Exists("/usr/lib/libc.dylib") ? OsKind.MacOsX : OsKind.Linux;                }            }            // Hope we are not building on ARM under Xamarin!            Cpu = Environment.Is64BitProcess ? CpuKind.X64 : CpuKind.X86;#endif        }    };    // Exception handling helpers.    static class Exceptions    {        // Returns true iff the exception indicates an error from an I/O call. See        // https://github.com/Microsoft/msbuild/blob/v15.4.8.50001/src/Shared/ExceptionHandling.cs#L101        static public bool IsIoRelated(Exception ex) =>            ex is IOException ||            (ex is ArgumentException && !(ex is ArgumentNullException)) ||            ex is SecurityException ||            ex is UnauthorizedAccessException ||            ex is NotSupportedException;    };    // String helpers.    static class Strings    {        // Compare string to argument using OrdinalIgnoreCase comparison.        public static bool EqualNoCase(this string a, string b) =>            string.Equals(a, b, StringComparison.OrdinalIgnoreCase);    }}
 |