|  | #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. | 
|  |  | 
|  | #endregion | 
|  |  | 
|  | using System; | 
|  | using System.IO; | 
|  | using System.Runtime.CompilerServices; | 
|  | using System.Runtime.InteropServices; | 
|  | using System.Security; | 
|  | using Grpc.Core.Internal; | 
|  |  | 
|  | 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 static readonly CommonPlatformDetection.OSKind Os = CommonPlatformDetection.GetOSKind(); | 
|  |  | 
|  | public static readonly CommonPlatformDetection.CpuArchitecture Cpu = CommonPlatformDetection.GetProcessArchitecture(); | 
|  |  | 
|  | // This is not necessarily true, but good enough. BCL lacks a per-FS | 
|  | // API to determine file case sensitivity. | 
|  | public static bool IsFsCaseInsensitive => Os == CommonPlatformDetection.OSKind.Windows; | 
|  | public static bool IsWindows => Os == CommonPlatformDetection.OSKind.Windows; | 
|  | }; | 
|  |  | 
|  | // 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); | 
|  | } | 
|  | } |