From 2a24b41d60a729bdccb7bfdd25b928d8e17149c8 Mon Sep 17 00:00:00 2001 From: Scott Ehlert Date: Thu, 30 Jun 2011 01:18:41 -0500 Subject: [PATCH] Properly detect Mac OS X in DepotDownloader. OSVersion.Platform just returns Unix on Mono. --- DepotDownloader/CDRManager.cs | 19 ++----- DepotDownloader/DepotDownloader.csproj | 1 + DepotDownloader/Util.cs | 68 ++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 DepotDownloader/Util.cs diff --git a/DepotDownloader/CDRManager.cs b/DepotDownloader/CDRManager.cs index 8e731c5b..6de48bea 100644 --- a/DepotDownloader/CDRManager.cs +++ b/DepotDownloader/CDRManager.cs @@ -159,7 +159,7 @@ namespace DepotDownloader if ( ver.VersionID == version ) { if ( ver.IsEncryptionKeyAvailable ) - return DecodeHexString( ver.DepotEncryptionKey ); + return Util.DecodeHexString( ver.DepotEncryptionKey ); break; } } @@ -183,7 +183,7 @@ namespace DepotDownloader if ( platform == PlatformID.Win32NT ) platformStr = "windows"; - else if ( platform == PlatformID.MacOSX ) + else if ( Util.IsMacOSX() ) platformStr = "macos"; foreach ( var blobField in appInfoBlob.FileSystems ) @@ -212,7 +212,7 @@ namespace DepotDownloader if ( platform == PlatformID.Win32NT ) platformSuffix = "-win32"; - else if ( platform == PlatformID.Unix ) + else if ( platform == PlatformID.Unix && !Util.IsMacOSX() ) platformSuffix = "-linux"; int gameLen = gameName.Length; @@ -280,18 +280,5 @@ namespace DepotDownloader return null; } } - static byte[] DecodeHexString( string hex ) - { - if ( hex == null ) - return null; - - int chars = hex.Length; - byte[] bytes = new byte [ chars / 2 ]; - - for ( int i = 0 ; i < chars ; i += 2 ) - bytes[ i / 2 ] = Convert.ToByte( hex.Substring( i, 2 ), 16 ); - - return bytes; - } } } diff --git a/DepotDownloader/DepotDownloader.csproj b/DepotDownloader/DepotDownloader.csproj index 032edeaf..f952909c 100644 --- a/DepotDownloader/DepotDownloader.csproj +++ b/DepotDownloader/DepotDownloader.csproj @@ -72,6 +72,7 @@ + diff --git a/DepotDownloader/Util.cs b/DepotDownloader/Util.cs new file mode 100644 index 00000000..911794bb --- /dev/null +++ b/DepotDownloader/Util.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; + +namespace DepotDownloader +{ + static class Util + { + [DllImport( "libc" )] + static extern int uname( IntPtr buf ); + + static int _isMacOSX = -1; + + // Environment.OSVersion.Platform returns PlatformID.Unix under Mono on OS X + // Code adapted from Mono: mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUI.cs + public static bool IsMacOSX() + { + if ( _isMacOSX != -1 ) + return _isMacOSX == 1; + + IntPtr buf = IntPtr.Zero; + + try + { + // The size of the utsname struct varies from system to system, but this _seems_ more than enough + buf = Marshal.AllocHGlobal( 4096 ); + + if ( uname( buf ) == 0 ) + { + string sys = Marshal.PtrToStringAnsi( buf ); + if ( sys == "Darwin" ) + { + _isMacOSX = 1; + return true; + } + } + } + catch + { + // Do nothing? + } + finally + { + if ( buf != IntPtr.Zero ) + Marshal.FreeHGlobal( buf ); + } + + _isMacOSX = 0; + return false; + } + + public static byte[] DecodeHexString( string hex ) + { + if ( hex == null ) + return null; + + int chars = hex.Length; + byte[] bytes = new byte[ chars / 2 ]; + + for ( int i = 0 ; i < chars ; i += 2 ) + bytes[ i / 2 ] = Convert.ToByte( hex.Substring(i, 2), 16 ); + + return bytes; + } + } +}