summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authorsr55 <[email protected]>2016-12-26 15:21:20 +0000
committersr55 <[email protected]>2016-12-26 15:21:20 +0000
commitd1376abc6678ab2b53b9b682493523263525b108 (patch)
treec8d5578b5089b1714253b880146646775e582eb5 /win
parent6b633b8f6b3f19433ca8a3d42affd737ca726f5d (diff)
WinGui: Add support to make the windows UI more portable friendly. Configurable via portable.ini file. All temp, presets, settings, logs etc can be stored in a specific or current directory.
Diffstat (limited to 'win')
-rw-r--r--win/CS/HandBrakeWPF/App.xaml.cs6
-rw-r--r--win/CS/HandBrakeWPF/HandBrakeWPF.csproj4
-rw-r--r--win/CS/HandBrakeWPF/Helpers/LogManager.cs2
-rw-r--r--win/CS/HandBrakeWPF/Utilities/DirectoryUtilities.cs32
-rw-r--r--win/CS/HandBrakeWPF/Utilities/Portable.cs147
-rw-r--r--win/CS/HandBrakeWPF/portable.ini.template14
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