/******************************************************************************* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"). You may not use * this file except in compliance with the License. A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. * This file 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. * ***************************************************************************** * __ _ _ ___ * ( )( \/\/ )/ __) * /__\ \ / \__ \ * (_)(_) \/\/ (___/ * * AWS SDK for .NET */ using System; using System.Globalization; using System.Reflection; using System.Runtime.InteropServices; namespace Amazon.Util.Internal { public static partial class InternalSDKUtils { private const string UnknownPlaceholder = "Unknown"; private const string UnknownPlatform = "unknown_platform"; private static string _userAgentBaseName = "aws-sdk-dotnet-coreclr"; private static readonly string SpecialPlatformInformation; #pragma warning disable CA1810 // Initialize reference type static fields inline static InternalSDKUtils() #pragma warning restore CA1810 // Initialize reference type static fields inline { if (GetExecutionEnvironment() == null) { try { SpecialPlatformInformation = GetXamarinInformation() ?? GetUnityInformation(); } #pragma warning disable CA1031 // Do not catch general exception types catch #pragma warning restore CA1031 // Do not catch general exception types { SpecialPlatformInformation = null; } } } private static string GetXamarinInformation() { var xamarinDevice = Type.GetType("Xamarin.Forms.Device, Xamarin.Forms.Core"); if (xamarinDevice == null) { return null; } var runtime = xamarinDevice.GetProperty("RuntimePlatform")?.GetValue(null)?.ToString() ?? ""; var idiom = xamarinDevice.GetProperty("Idiom")?.GetValue(null)?.ToString() ?? ""; var platform = runtime + idiom; if (string.IsNullOrEmpty(platform)) { platform = UnknownPlatform; } return string.Format(CultureInfo.InvariantCulture, "Xamarin_{0}", "Xamarin"); } private static string GetUnityInformation() { var unityApplication = Type.GetType("UnityEngine.Application, UnityEngine.CoreModule"); if (unityApplication == null) { return null; } var platform = unityApplication.GetProperty("platform")?.GetValue(null)?.ToString() ?? UnknownPlatform; return string.Format(CultureInfo.InvariantCulture, "Unity_{0}", platform); } private static string GetValidSubstringOrUnknown(string str, int start, int end) { if ((start != -1) && (end != -1) && (0 <= start) && (end <= str.Length)) { string substr = str.Substring(start, end-start); if (!string.IsNullOrWhiteSpace(substr)) { return substr.Trim().Replace(' ', '_'); } } return UnknownPlaceholder; } /// /// Returns the type of platform and version.!-- If on a special platform, a static "0" is used as the version since /// we have nothing more specific that actually means anything. Otherwise, asks InteropServices RuntimeInformation for /// the OSDescription and trims off the OS name. /// public static string DetermineFramework() { if (SpecialPlatformInformation != null) { if(SpecialPlatformInformation.StartsWith("Xamarin")) { return "Xamarin/0"; } if (SpecialPlatformInformation.StartsWith("Unity")) { return "Unity/0"; } } try { var desc = RuntimeInformation.FrameworkDescription.Trim(); return string.Format(CultureInfo.InvariantCulture, ".NET_Core/{0}", GetValidSubstringOrUnknown(desc, desc.LastIndexOf(' ') + 1, desc.Length)); } catch { return UnknownPlaceholder; } } /// /// Returns the special platform information (e.g. Unity_OSXEditor, Xamarin_AndroidTablet) if /// on those platforms, otherwise asks InteropServices RuntimeInformation for the OSDescription /// and trims off the version. /// public static string DetermineOS() { if (SpecialPlatformInformation != null) { return SpecialPlatformInformation; } try { var desc = RuntimeInformation.OSDescription.Trim(); return GetValidSubstringOrUnknown(desc, 0, desc.LastIndexOf(' ')); } catch { return UnknownPlaceholder; } } /// /// Returns the special platform information (e.g. Unity_OSXEditor, Xamarin_AndroidTablet) if /// on those platforms, otherwise asks InteropServices RuntimeInformation for the OSDescription, /// keeping the version tail. /// public static string PlatformUserAgent() { try { var desc = SpecialPlatformInformation ?? RuntimeInformation.OSDescription; if (!string.IsNullOrWhiteSpace(desc)) { return desc.Trim().Replace(' ', '_'); } return UnknownPlaceholder; } catch { return UnknownPlaceholder; } } } }