// Copyright Keysight Technologies 2012-2019 // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at http://mozilla.org/MPL/2.0/. using System; using System.Linq; namespace OpenTap.Package { /// /// Uniquely identifies a package in the OpenTAP package system. /// public interface IPackageIdentifier { /// /// The name of the package. /// string Name { get; } /// /// The Semantic Version compliant version of the package. /// SemanticVersion Version { get; } /// /// The CPU Architechture of the package. /// CpuArchitecture Architecture { get; } /// /// Comma seperated list of operating systems that this package can run on. /// string OS { get; } } /// /// Extensions to IPackageIdentifier. /// public static class IPackageIdentifierExtensions { private static string[] SplitOs(string os) { if (os == null) return Array.Empty(); return os.Split(',').Select(o => o.Trim()).Where(o => !string.IsNullOrWhiteSpace(o)).ToArray(); } /// /// True if this package is compatible (can be installed on) the specified operating system and architecture /// /// /// Specifies a CPU architecture. If unspecified, the current host architecture is used. /// Specifies an operating system. If null, the current host operating system is used. /// public static bool IsPlatformCompatible(this IPackageIdentifier pkg, CpuArchitecture selectedArch = CpuArchitecture.Unspecified, string selectedOS = null) { var cpu = selectedArch == CpuArchitecture.Unspecified ? ArchitectureHelper.GuessBaseArchitecture : selectedArch; var os = selectedOS ?? OperatingSystem.Current.ToString(); if (ArchitectureHelper.CompatibleWith(cpu, pkg.Architecture) == false) return false; if (string.IsNullOrWhiteSpace(pkg.OS) || string.IsNullOrWhiteSpace(os)) return true; var oses = SplitOs(os); return oses.Any(o => IsOsCompatible(pkg, o)); } internal static bool IsOsCompatible(this IPackageIdentifier pkg, string os) { var supported = SplitOs(pkg.OS); return supported.Contains(os, StringComparer.OrdinalIgnoreCase); } } }