diff options
-rw-r--r-- | win/CS/HandBrakeWPF/App.xaml.cs | 6 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/HandBrakeWPF.csproj | 4 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Helpers/LogManager.cs | 2 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Utilities/DirectoryUtilities.cs | 32 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Utilities/Portable.cs | 147 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/portable.ini.template | 14 |
6 files changed, 202 insertions, 3 deletions
diff --git a/win/CS/HandBrakeWPF/App.xaml.cs b/win/CS/HandBrakeWPF/App.xaml.cs index 7f7d7ef47..73971ff08 100644 --- a/win/CS/HandBrakeWPF/App.xaml.cs +++ b/win/CS/HandBrakeWPF/App.xaml.cs @@ -66,6 +66,12 @@ namespace HandBrakeWPF StartupOptions.AutoRestartQueue = true;
}
+ // Portable Mode
+ if (Portable.IsPortable())
+ {
+ Portable.Initialise();
+ }
+
base.OnStartup(e);
// If we have a file dropped on the icon, try scanning it.
diff --git a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj index 5537b4045..207083bd6 100644 --- a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj +++ b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj @@ -254,6 +254,7 @@ <Compile Include="Utilities\Input\ChapterImporterXml.cs" />
<Compile Include="Utilities\Interfaces\INotifyPropertyChangedEx.cs" />
<Compile Include="Utilities\Output\CsvHelper.cs" />
+ <Compile Include="Utilities\Portable.cs" />
<Compile Include="Utilities\PropertyChangedBase.cs" />
<Compile Include="Utilities\DirectoryUtilities.cs" />
<Compile Include="Utilities\SystemInfo.cs" />
@@ -477,6 +478,9 @@ <None Include="Installer\MakeNightly64.nsi" />
<AppDesigner Include="Properties\" />
<EmbeddedResource Include="public.key" />
+ <None Include="portable.ini.template">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
</ItemGroup>
<ItemGroup>
<Page Include="Controls\AlertPanel.xaml">
diff --git a/win/CS/HandBrakeWPF/Helpers/LogManager.cs b/win/CS/HandBrakeWPF/Helpers/LogManager.cs index f551af10e..2cd94a25d 100644 --- a/win/CS/HandBrakeWPF/Helpers/LogManager.cs +++ b/win/CS/HandBrakeWPF/Helpers/LogManager.cs @@ -29,7 +29,7 @@ namespace HandBrakeWPF.Helpers public static void Init() { ILog log = LogService.GetLogger(); - string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs"; + string logDir = DirectoryUtilities.GetLogDirectory(); string logFile = Path.Combine(logDir, string.Format("activity_log{0}.txt", GeneralUtilities.ProcessId)); if (!Directory.Exists(Path.GetDirectoryName(logFile))) { diff --git a/win/CS/HandBrakeWPF/Utilities/DirectoryUtilities.cs b/win/CS/HandBrakeWPF/Utilities/DirectoryUtilities.cs index 0f63ebfce..df7f2a1a3 100644 --- a/win/CS/HandBrakeWPF/Utilities/DirectoryUtilities.cs +++ b/win/CS/HandBrakeWPF/Utilities/DirectoryUtilities.cs @@ -34,15 +34,26 @@ namespace HandBrakeWPF.Utilities { if (isNightly) { - return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "HandBrake", "Nightly"); + return Path.Combine(GetStorageDirectory(), "HandBrake", "Nightly"); } else { - return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "HandBrake"); + return Path.Combine(GetStorageDirectory(), "HandBrake"); } } /// <summary> + /// Get the app default log directory. + /// </summary> + /// <returns> + /// The <see cref="string"/>. + /// </returns> + public static string GetLogDirectory() + { + return Path.Combine(GetStorageDirectory(), "HandBrake", "logs"); + } + + /// <summary> /// Simple way of checking if a directory is writeable. /// </summary> /// <param name="dirPath">Path to check</param> @@ -75,5 +86,22 @@ namespace HandBrakeWPF.Utilities return false; } } + + /// <summary> + /// The get storage directory. + /// </summary> + /// <returns> + /// The storage directory. Either AppData or portable location. + /// </returns> + private static string GetStorageDirectory() + { + string storagePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + if (Portable.IsPortable()) + { + storagePath = Portable.GetStorageDirectory(); + } + + return storagePath; + } } } diff --git a/win/CS/HandBrakeWPF/Utilities/Portable.cs b/win/CS/HandBrakeWPF/Utilities/Portable.cs new file mode 100644 index 000000000..9b5981675 --- /dev/null +++ b/win/CS/HandBrakeWPF/Utilities/Portable.cs @@ -0,0 +1,147 @@ +// -------------------------------------------------------------------------------------------------------------------- +// <copyright file="Portable.cs" company="HandBrake Project (http://handbrake.fr)"> +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// </copyright> +// <summary> +// Defines the Portable type. +// </summary> +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrakeWPF.Utilities +{ + using System.Collections.Generic; + using System; + using System.IO; + + /// <summary> + /// This class is responsible for reading the Portable.ini file that allows HandBrake to be run out of a directory. + /// </summary> + public class Portable + { + private static readonly string portableFile = Path.Combine(Environment.CurrentDirectory, "portable.ini"); + private static Dictionary<string, string> keyPairs = new Dictionary<string, string>(); + + /// <summary> + /// Initializes a new instance of the <see cref="Portable"/> class. + /// </summary> + public static void Initialise() + { + if (!IsPortable()) + { + return; // Nothing to do. + } + + // Read the INI file + if (File.Exists(portableFile)) + { + using (StreamReader fileReader = new StreamReader(portableFile)) + { + string line; + while ((line = fileReader.ReadLine()) != null) + { + line = line.Trim(); + + if (line.StartsWith("#")) + { + continue; // Ignore Comments + } + + string[] setting = line.Split('='); + if (setting.Length == 2) + { + keyPairs.Add(setting[0].Trim(), setting[1].Trim()); + } + } + } + } + + // Create any missing directories + if (!Directory.Exists(GetTempDirectory())) + { + Directory.CreateDirectory(GetTempDirectory()); + } + + if (!Directory.Exists(GetStorageDirectory())) + { + Directory.CreateDirectory(GetStorageDirectory()); + } + + // Setup enviroment variables for this instance. + Environment.SetEnvironmentVariable("TMP", GetTempDirectory()); + } + + /// <summary> + /// The is portable. + /// </summary> + /// <returns> + /// The <see cref="bool"/>. + /// </returns> + public static bool IsPortable() + { + if (!File.Exists(portableFile)) + { + return false; + } + + return true; + } + + /// <summary> + /// The get config directory. + /// </summary> + /// <returns> + /// The <see cref="string"/>. + /// </returns> + public static string GetStorageDirectory() + { + // Default to App Data + string storagePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + if (keyPairs.ContainsKey("storage.dir")) + { + string directory = keyPairs["storage.dir"]; + + // If "cwd", then treat that as Current Working Directory. + if (directory == "cwd") + { + storagePath = Path.Combine(Environment.CurrentDirectory, "storage"); + } + + // Otherwise, the users set directory. + if (!string.IsNullOrEmpty(directory) && directory != "cwd") + { + storagePath = directory; + } + } + + // Return what path we figured out to use. + return storagePath; + } + + /// <summary> + /// The get temp directory. + /// </summary> + /// <returns> + /// The <see cref="string"/>. + /// </returns> + private static string GetTempDirectory() + { + if (keyPairs.ContainsKey("tmp.dir")) + { + string directory = keyPairs["tmp.dir"]; + if (directory == "cwd") + { + return Path.Combine(Environment.CurrentDirectory, "tmp"); + } + + if (!string.IsNullOrEmpty(directory) && directory != "cwd") + { + return directory; + } + + return null; + } + + return null; + } + } +}
\ No newline at end of file diff --git a/win/CS/HandBrakeWPF/portable.ini.template b/win/CS/HandBrakeWPF/portable.ini.template new file mode 100644 index 000000000..4c62e6e21 --- /dev/null +++ b/win/CS/HandBrakeWPF/portable.ini.template @@ -0,0 +1,14 @@ +################################# +# HandBrake Portable +################################# +# Notes: +# - Rename this file to portable.ini to activate feature. +# - storage.dir => Stores Presets, Settings and Log Files. +# - tmp.dir => temporary files only. (i.e Preview images) +# +# Set to 'cwd' to use the current applications directory. It will automatically create "storage" and "tmp" folders in this instance. +# Leave blank to use the system "TMP" directory and the "AppData" user profile folder. +################################# + +storage.dir = cwd +tmp.dir = cwd
\ No newline at end of file |