<Compile Include="Converters\Audio\AudioBehaviourConverter.cs" />\r
<Compile Include="Converters\Subtitles\SubtitleBehaviourConverter.cs" />\r
<Compile Include="Converters\Video\ScalingConverter.cs" />\r
+ <Compile Include="Helpers\FileHelper.cs" />\r
<Compile Include="Model\ScanMode.cs" />\r
<Compile Include="Factories\HBConfigurationFactory.cs" />\r
<Compile Include="Services\Interfaces\IUserSettingService.cs" />\r
--- /dev/null
+// --------------------------------------------------------------------------------------------------------------------\r
+// <copyright file="FileHelper.cs" company="HandBrake Project (http://handbrake.fr)">\r
+// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.\r
+// </copyright>\r
+// <summary>\r
+// Helper methods for dealing with files.\r
+// </summary>\r
+// --------------------------------------------------------------------------------------------------------------------\r
+\r
+namespace HandBrakeWPF.Helpers\r
+{\r
+ using System;\r
+ using System.IO;\r
+\r
+ /// <summary>\r
+ /// Helper methods for dealing with files.\r
+ /// </summary>\r
+ public class FileHelper\r
+ {\r
+ /// <summary>\r
+ /// The file path has invalid chars.\r
+ /// </summary>\r
+ /// <param name="path">\r
+ /// The path.\r
+ /// </param>\r
+ /// <returns>\r
+ /// The <see cref="bool"/>.\r
+ /// </returns>\r
+ public static bool FilePathHasInvalidChars(string path)\r
+ {\r
+ bool result = false;\r
+ if (!string.IsNullOrEmpty(path))\r
+ {\r
+ try\r
+ {\r
+ string file = Path.GetFileNameWithoutExtension(path);\r
+ string directory = Path.GetDirectoryName(path);\r
+\r
+ // TODO this may not be necessary.\r
+ if ((!string.IsNullOrEmpty(directory) && directory.Replace("\"", string.Empty).IndexOfAny(Path.GetInvalidPathChars()) != -1) ||\r
+ file.Replace("\"", string.Empty).IndexOfAny(Path.GetInvalidFileNameChars()) != -1)\r
+ {\r
+ return true;\r
+ }\r
+\r
+ }\r
+ catch (ArgumentException)\r
+ {\r
+ result = true;\r
+ }\r
+ }\r
+\r
+ return result;\r
+ }\r
+ }\r
+}\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Looks up a localized string similar to The entered destination contained illegal characters. You must fix the path and filename before continuing..\r
+ /// </summary>\r
+ public static string Main_InvalidDestination {\r
+ get {\r
+ return ResourceManager.GetString("Main_InvalidDestination", resourceCulture);\r
+ }\r
+ }\r
+ \r
/// <summary>\r
/// Looks up a localized string similar to , Pending Jobs {5}.\r
/// </summary>\r
<data name="Main_SetDestination" xml:space="preserve">\r
<value>You must first set the destination path for the output file before adding to the queue.</value>\r
</data>\r
+ <data name="Main_InvalidDestination" xml:space="preserve">\r
+ <value>The entered destination contained illegal characters. You must fix the path and filename before continuing.</value>\r
+ </data>\r
</root>
\ No newline at end of file
/// <summary>\r
/// Add the current task to the queue.\r
/// </summary>\r
- void AddToQueue();\r
+ /// <returns>\r
+ /// True if added, false if error\r
+ /// </returns>\r
+ bool AddToQueue();\r
\r
/// <summary>\r
/// File Scan\r
\r
if (!string.IsNullOrEmpty(this.CurrentTask.Destination))\r
{\r
- switch (Path.GetExtension(this.CurrentTask.Destination))\r
+ string ext = string.Empty;\r
+ try\r
+ {\r
+ ext = Path.GetExtension(this.CurrentTask.Destination);\r
+ }\r
+ catch (ArgumentException)\r
+ {\r
+ this.errorService.ShowMessageBox(Resources.Main_InvalidDestination, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);\r
+ }\r
+\r
+ switch (ext)\r
{\r
case ".mkv":\r
this.SelectedOutputFormat = OutputFormat.Mkv;\r
/// <summary>\r
/// Add the current task to the queue.\r
/// </summary>\r
- public void AddToQueue()\r
+ /// <returns>\r
+ /// True if added, false if error.\r
+ /// </returns>\r
+ public bool AddToQueue()\r
{\r
if (this.ScannedSource == null || string.IsNullOrEmpty(this.ScannedSource.ScanPath) || this.ScannedSource.Titles.Count == 0)\r
{\r
this.errorService.ShowMessageBox(Resources.Main_ScanSourceFirst, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);\r
- return;\r
+ return false;\r
}\r
\r
if (string.IsNullOrEmpty(this.CurrentTask.Destination))\r
{\r
this.errorService.ShowMessageBox(Resources.Main_SetDestination, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);\r
- return;\r
+ return false;\r
+ }\r
+\r
+ // Sanity check the filename\r
+ if (!string.IsNullOrEmpty(this.Destination) && FileHelper.FilePathHasInvalidChars(this.Destination))\r
+ {\r
+ this.errorService.ShowMessageBox(Resources.Main_InvalidDestination, Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);\r
+ this.NotifyOfPropertyChange(() => this.Destination);\r
+ return false;\r
}\r
\r
QueueTask task = new QueueTask(new EncodeTask(this.CurrentTask), HBConfigurationFactory.Create());\r
{\r
this.ProgramStatusLabel = string.Format(Resources.Main_XEncodesPending, this.queueProcessor.Count);\r
}\r
+\r
+ return true;\r
}\r
\r
/// <summary>\r
}\r
\r
// Create the Queue Task and Start Processing\r
- QueueTask task = new QueueTask(new EncodeTask(this.CurrentTask), HBConfigurationFactory.Create());\r
- this.queueProcessor.Add(task);\r
- this.queueProcessor.Start(UserSettingService.GetUserSetting<bool>(UserSettingConstants.ClearCompletedFromQueue));\r
- this.IsEncoding = true;\r
+ if (this.AddToQueue())\r
+ {\r
+ this.queueProcessor.Start(UserSettingService.GetUserSetting<bool>(UserSettingConstants.ClearCompletedFromQueue));\r
+ this.IsEncoding = true;\r
+ }\r
}\r
\r
/// <summary>\r
</i:Interaction.Triggers>\r
\r
<UserControl.Resources>\r
+ <Converters:BooleanConverter x:Key="booleanConverter" />\r
+ \r
<Style TargetType="Button">\r
<Setter Property="FontWeight" Value="Bold" />\r
<Setter Property="Padding" Value="5,1" />\r
SnapsToDevicePixels="False"\r
ToolBar.OverflowMode="Never"\r
ToolBarTray.IsLocked="True"\r
+ KeyboardNavigation.TabNavigation="Continue"\r
>\r
\r
<Button Name="SelectSource"\r
</StackPanel>\r
\r
<!-- Main Body -->\r
- <Grid Grid.Row="1">\r
+ <Grid Grid.Row="1" IsEnabled="{Binding ShowSourceSelection, Converter={StaticResource booleanConverter}, ConverterParameter=true}">\r
<Grid.ColumnDefinitions>\r
<ColumnDefinition Width="*" MinWidth="700"/>\r
<ColumnDefinition Width="Auto" />\r
ToolBar.OverflowMode="Never" \r
ToolBarTray.IsLocked="True"\r
Loaded="ToolBarLoaded"\r
+ KeyboardNavigation.TabNavigation="Continue"\r
>\r
<Button Micro:Message.Attach="[Event Click] = [Action PresetAdd]" >\r
<Button.Content>\r