/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using Greenshot.IniFile; using Greenshot.Plugin; using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; using System.Reflection; using System.Windows.Forms; namespace GreenshotPlugin.Core { public enum ClipboardFormat { PNG, DIB, HTML, HTMLDATAURL, BITMAP, DIBV5 } public enum OutputFormat { bmp, gif, jpg, png, tiff, greenshot, ico } public enum WindowCaptureMode { Screen, GDI, Aero, AeroTransparent, Auto } public enum BuildStates { UNSTABLE, RELEASE_CANDIDATE, RELEASE } public enum ClickActions { DO_NOTHING, OPEN_LAST_IN_EXPLORER, OPEN_LAST_IN_EDITOR, OPEN_SETTINGS, SHOW_CONTEXT_MENU } /// /// Description of CoreConfiguration. /// [IniSection("Core", Description="Greenshot core configuration")] public class CoreConfiguration : IniSection, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; [IniProperty("Language", Description = "The language in IETF format (e.g. en-US)")] public string Language { get; set; } [IniProperty("RegionHotkey", Description="Hotkey for starting the region capture", DefaultValue="PrintScreen")] public string RegionHotkey { get; set; } [IniProperty("WindowHotkey", Description="Hotkey for starting the window capture", DefaultValue="Alt + PrintScreen")] public string WindowHotkey { get; set; } [IniProperty("FullscreenHotkey", Description="Hotkey for starting the fullscreen capture", DefaultValue="Ctrl + PrintScreen")] public string FullscreenHotkey { get; set; } [IniProperty("LastregionHotkey", Description="Hotkey for starting the last region capture", DefaultValue="Shift + PrintScreen")] public string LastregionHotkey { get; set; } [IniProperty("IEHotkey", Description="Hotkey for starting the IE capture", DefaultValue="Shift + Ctrl + PrintScreen")] public string IEHotkey { get; set; } [IniProperty("IsFirstLaunch", Description="Is this the first time launch?", DefaultValue="true")] public bool IsFirstLaunch { get; set; } [IniProperty("Destinations", Separator=",", Description="Which destinations? Possible options (more might be added by plugins) are: Editor, FileDefault, FileWithDialog, Clipboard, Printer, EMail, Picker", DefaultValue="Picker")] public List OutputDestinations { get; set; } = new List(); [IniProperty("ClipboardFormats", Separator=",", Description="Specify which formats we copy on the clipboard? Options are: PNG, HTML, HTMLDATAURL and DIB", DefaultValue="PNG,DIB")] public List ClipboardFormats { get; set; } = new List(); [IniProperty("CaptureMousepointer", Description="Should the mouse be captured?", DefaultValue="true")] public bool CaptureMousepointer { get; set; } [IniProperty("CaptureWindowsInteractive", Description="Use interactive window selection to capture? (false=Capture active window)", DefaultValue="false")] public bool CaptureWindowsInteractive { get; set; } [IniProperty("CaptureDelay", Description="Capture delay in millseconds.", DefaultValue="100")] public int CaptureDelay { get; set; } [IniProperty("ScreenCaptureMode", Description = "The capture mode used to capture a screen. (Auto, FullScreen, Fixed)", DefaultValue = "Auto")] public ScreenCaptureMode ScreenCaptureMode { get; set; } [IniProperty("ScreenToCapture", Description = "The screen number to capture when using ScreenCaptureMode Fixed.", DefaultValue = "1")] public int ScreenToCapture { get; set; } [IniProperty("WindowCaptureMode", Description = "The capture mode used to capture a Window (Screen, GDI, Aero, AeroTransparent, Auto).", DefaultValue = "Auto")] public WindowCaptureMode WindowCaptureMode { get; set; } [IniProperty("WindowCaptureAllChildLocations", Description="Enable/disable capture all children, very slow but will make it possible to use this information in the editor.", DefaultValue="False")] public bool WindowCaptureAllChildLocations { get; set; } [IniProperty("DWMBackgroundColor", Description="The background color for a DWM window capture.")] public Color DWMBackgroundColor { get; set; } [IniProperty("PlayCameraSound", LanguageKey="settings_playsound",Description="Play a camera sound after taking a capture.", DefaultValue="false")] public bool PlayCameraSound { get; set; } = false; [IniProperty("ShowTrayNotification", LanguageKey="settings_shownotify",Description="Show a notification from the systray when a capture is taken.", DefaultValue="true")] public bool ShowTrayNotification { get; set; } = true; [IniProperty("OutputFilePath", Description="Output file path.")] public string OutputFilePath { get; set; } [IniProperty("OutputFileAllowOverwrite", Description = "If the target file already exists True will make Greenshot always overwrite and False will display a 'Save-As' dialog.", DefaultValue = "true")] public bool OutputFileAllowOverwrite { get; set; } [IniProperty("OutputFileFilenamePattern", Description = "Filename pattern for screenshot.", DefaultValue = "${capturetime:d\"yyyy-MM-dd HH_mm_ss\"}-${title}")] public string OutputFileFilenamePattern { get; set; } [IniProperty("OutputFileFormat", Description="Default file type for writing screenshots. (bmp, gif, jpg, png, tiff)", DefaultValue="png")] public OutputFormat OutputFileFormat { get; set; } = OutputFormat.png; [IniProperty("OutputFileReduceColors", Description="If set to true, than the colors of the output file are reduced to 256 (8-bit) colors", DefaultValue="false")] public bool OutputFileReduceColors { get; set; } [IniProperty("OutputFileAutoReduceColors", Description = "If set to true the amount of colors is counted and if smaller than 256 the color reduction is automatically used.", DefaultValue = "false")] public bool OutputFileAutoReduceColors { get; set; } [IniProperty("OutputFileReduceColorsTo", Description = "Amount of colors to reduce to, when reducing", DefaultValue = "256")] public int OutputFileReduceColorsTo { get; set; } [IniProperty("OutputFileCopyPathToClipboard", Description="When saving a screenshot, copy the path to the clipboard?", DefaultValue="true")] public bool OutputFileCopyPathToClipboard { get; set; } [IniProperty("OutputFileAsFullpath", Description="SaveAs Full path?")] public string OutputFileAsFullpath { get; set; } [IniProperty("OutputFileJpegQuality", Description="JPEG file save quality in %.", DefaultValue="80")] public int OutputFileJpegQuality { get; set; } [IniProperty("OutputFilePromptQuality", Description="Ask for the quality before saving?", DefaultValue="false")] public bool OutputFilePromptQuality { get; set; } [IniProperty("OutputFileIncrementingNumber", Description="The number for the ${NUM} in the filename pattern, is increased automatically after each save.", DefaultValue="1")] public uint OutputFileIncrementingNumber { get; set; } [IniProperty("OutputPrintPromptOptions", LanguageKey="settings_alwaysshowprintoptionsdialog", Description="Ask for print options when printing?", DefaultValue="true")] public bool OutputPrintPromptOptions { get; set; } [IniProperty("OutputPrintAllowRotate", LanguageKey="printoptions_allowrotate", Description="Allow rotating the picture for fitting on paper?", DefaultValue="false")] public bool OutputPrintAllowRotate { get; set; } [IniProperty("OutputPrintAllowEnlarge", LanguageKey="printoptions_allowenlarge", Description="Allow growing the picture for fitting on paper?", DefaultValue="false")] public bool OutputPrintAllowEnlarge { get; set; } [IniProperty("OutputPrintAllowShrink", LanguageKey="printoptions_allowshrink", Description="Allow shrinking the picture for fitting on paper?", DefaultValue="true")] public bool OutputPrintAllowShrink { get; set; } [IniProperty("OutputPrintCenter", LanguageKey="printoptions_allowcenter", Description="Center image when printing?", DefaultValue="true")] public bool OutputPrintCenter { get; set; } [IniProperty("OutputPrintInverted", LanguageKey="printoptions_inverted", Description="Print image inverted (use e.g. for console captures)", DefaultValue="false")] public bool OutputPrintInverted { get; set; } [IniProperty("OutputPrintGrayscale", LanguageKey = "printoptions_printgrayscale", Description = "Force grayscale printing", DefaultValue = "false")] public bool OutputPrintGrayscale { get; set; } [IniProperty("OutputPrintMonochrome", LanguageKey = "printoptions_printmonochrome", Description = "Force monorchrome printing", DefaultValue = "false")] public bool OutputPrintMonochrome { get; set; } [IniProperty("OutputPrintMonochromeThreshold", Description = "Threshold for monochrome filter (0 - 255), lower value means less black", DefaultValue = "127")] public byte OutputPrintMonochromeThreshold { get; set; } [IniProperty("OutputPrintFooter", LanguageKey = "printoptions_timestamp", Description = "Print footer on print?", DefaultValue = "true")] public bool OutputPrintFooter { get; set; } [IniProperty("OutputPrintFooterPattern", Description = "Footer pattern", DefaultValue = "${capturetime:d\"D\"} ${capturetime:d\"T\"} - ${title}")] public string OutputPrintFooterPattern { get; set; } [IniProperty("NotificationSound", Description = "The wav-file to play when a capture is taken, loaded only once at the Greenshot startup", DefaultValue="default")] public string NotificationSound { get; set; } [IniProperty("UseProxy", Description="Use your global proxy?", DefaultValue="True")] public bool UseProxy { get; set; } [IniProperty("IECapture", Description="Enable/disable IE capture", DefaultValue="True")] public bool IECapture { get; set; } [IniProperty("IEFieldCapture", Description="Enable/disable IE field capture, very slow but will make it possible to annotate the fields of a capture in the editor.", DefaultValue="False")] public bool IEFieldCapture { get; set; } [IniProperty("WindowClassesToCheckForIE", Description = "Comma separated list of Window-Classes which need to be checked for a IE instance!", DefaultValue = "AfxFrameOrView70,IMWindowClass")] public List WindowClassesToCheckForIE { get; set; } [IniProperty("AutoCropDifference", Description="Sets how to compare the colors for the autocrop detection, the higher the more is 'selected'. Possible values are from 0 to 255, where everything above ~150 doesn't make much sense!", DefaultValue="10")] public int AutoCropDifference { get; set; } [IniProperty("IncludePlugins", Description="Comma separated list of Plugins which are allowed. If something in the list, than every plugin not in the list will not be loaded!")] public List IncludePlugins { get; set; } [IniProperty("ExcludePlugins", Description="Comma separated list of Plugins which are NOT allowed.")] public List ExcludePlugins { get; set; } [IniProperty("ExcludeDestinations", Description = "Comma separated list of destinations which should be disabled.")] public List ExcludeDestinations { get; set; } [IniProperty("UpdateCheckInterval", Description="How many days between every update check? (0=no checks)", DefaultValue="14")] public int UpdateCheckInterval { get; set; } [IniProperty("LastUpdateCheck", Description="Last update check")] public DateTime LastUpdateCheck { get; set; } [IniProperty("DisableSettings", Description = "Enable/disable the access to the settings, can only be changed manually in this .ini", DefaultValue = "False")] public bool DisableSettings { get; set; } [IniProperty("DisableQuickSettings", Description = "Enable/disable the access to the quick settings, can only be changed manually in this .ini", DefaultValue = "False")] public bool DisableQuickSettings { get; set; } [IniProperty("DisableTrayicon", Description = "Disable the trayicon, can only be changed manually in this .ini", DefaultValue = "False")] public bool HideTrayicon { get; set; } [IniProperty("HideExpertSettings", Description = "Hide expert tab in the settings, can only be changed manually in this .ini", DefaultValue = "False")] public bool HideExpertSettings { get; set; } [IniProperty("ThumnailPreview", Description="Enable/disable thumbnail previews", DefaultValue="True")] public bool ThumnailPreview { get; set; } [IniProperty("NoGDICaptureForProduct", Description = "List of productnames for which GDI capturing is skipped (using fallback).", DefaultValue = "IntelliJ IDEA")] public List NoGDICaptureForProduct { get; set; } [IniProperty("NoDWMCaptureForProduct", Description = "List of productnames for which DWM capturing is skipped (using fallback).", DefaultValue = "Citrix ICA Client")] public List NoDWMCaptureForProduct { get; set; } [IniProperty("OptimizeForRDP", Description="Make some optimizations for usage with remote desktop", DefaultValue="False")] public bool OptimizeForRDP { get; set; } [IniProperty("DisableRDPOptimizing", Description = "Disable all optimizations for usage with remote desktop", DefaultValue = "False")] public bool DisableRDPOptimizing { get; set; } [IniProperty("MinimizeWorkingSetSize", Description="Optimize memory footprint, but with a performance penalty!", DefaultValue="False")] public bool MinimizeWorkingSetSize { get; set; } [IniProperty("WindowCaptureRemoveCorners", Description = "Remove the corners from a window capture", DefaultValue = "True")] public bool WindowCaptureRemoveCorners { get; set; } [IniProperty("CheckForUnstable", Description = "Also check for unstable version updates", DefaultValue = "False")] public bool CheckForUnstable { get; set; } [IniProperty("ActiveTitleFixes", Description="The fixes that are active.")] public List ActiveTitleFixes { get; set; } [IniProperty("TitleFixMatcher", Description="The regular expressions to match the title with.")] public Dictionary TitleFixMatcher { get; set; } [IniProperty("TitleFixReplacer", Description="The replacements for the matchers.")] public Dictionary TitleFixReplacer { get; set; } [IniProperty("ExperimentalFeatures", Description="A list of experimental features, this allows us to test certain features before releasing them.", ExcludeIfNull=true)] public List ExperimentalFeatures { get; set; } [IniProperty("EnableSpecialDIBClipboardReader", Description = "Enable a special DIB clipboard reader", DefaultValue="True")] public bool EnableSpecialDIBClipboardReader { get; set; } [IniProperty("WindowCornerCutShape", Description = "The cutshape which is used to remove the window corners, is mirrorred for all corners", DefaultValue = "5,3,2,1,1")] public List WindowCornerCutShape { get; set; } [IniProperty("LeftClickAction", Description = "Specify what action is made if the tray icon is left clicked, if a double-click action is specified this action is initiated after a delay (configurable via the windows double-click speed)", DefaultValue = "SHOW_CONTEXT_MENU")] public ClickActions LeftClickAction { get; set; } [IniProperty("DoubleClickAction", Description = "Specify what action is made if the tray icon is double clicked", DefaultValue = "OPEN_LAST_IN_EXPLORER")] public ClickActions DoubleClickAction { get; set; } [IniProperty("ZoomerEnabled", Description = "Sets if the zoomer is enabled", DefaultValue = "True")] public bool ZoomerEnabled { get; set; } [IniProperty("ZoomerOpacity", Description = "Specify the transparency for the zoomer, from 0-1 (where 1 is no transparency and 0 is complete transparent. An usefull setting would be 0.7)", DefaultValue = "1")] public float ZoomerOpacity { get; set; } [IniProperty("MaxMenuItemLength", Description = "Maximum length of submenu items in the context menu, making this longer might cause context menu issues on dual screen systems.", DefaultValue = "25")] public int MaxMenuItemLength { get; set; } [IniProperty("MailApiTo", Description = "The 'to' field for the email destination (settings for Outlook can be found under the Office section)", DefaultValue = "")] public string MailApiTo { get; set; } [IniProperty("MailApiCC", Description = "The 'CC' field for the email destination (settings for Outlook can be found under the Office section)", DefaultValue = "")] public string MailApiCC { get; set; } [IniProperty("MailApiBCC", Description = "The 'BCC' field for the email destination (settings for Outlook can be found under the Office section)", DefaultValue = "")] public string MailApiBCC { get; set; } [IniProperty("OptimizePNGCommand", Description = "Optional command to execute on a temporary PNG file, the command should overwrite the file and Greenshot will read it back. Note: this command is also executed when uploading PNG's!", DefaultValue = "")] public string OptimizePNGCommand { get; set; } [IniProperty("OptimizePNGCommandArguments", Description = "Arguments for the optional command to execute on a PNG, {0} is replaced by the temp-filename from Greenshot. Note: Temp-file is deleted afterwards by Greenshot.", DefaultValue = "\"{0}\"")] public string OptimizePNGCommandArguments { get; set; } [IniProperty("LastSaveWithVersion", Description = "Version of Greenshot which created this .ini")] public string LastSaveWithVersion { get; set; } [IniProperty("ProcessEXIFOrientation", Description = "When reading images from files or clipboard, use the EXIF information to correct the orientation", DefaultValue = "True")] public bool ProcessEXIFOrientation { get; set; } [IniProperty("LastCapturedRegion", Description = "The last used region, for reuse in the capture last region")] public Rectangle LastCapturedRegion { get; set; } private Size _iconSize; [IniProperty("IconSize", Description = "Defines the size of the icons (e.g. for the buttons in the editor), default value 16,16 anything bigger will cause scaling", DefaultValue = "16,16")] public Size IconSize { get { return _iconSize; } set { Size newSize = value; if (newSize != Size.Empty) { if (newSize.Width < 16) { newSize.Width = 16; } else if (newSize.Width > 256) { newSize.Width = 256; } newSize.Width = (newSize.Width / 16) * 16; if (newSize.Height < 16) { newSize.Height = 16; } else if (IconSize.Height > 256) { newSize.Height = 256; } newSize.Height = (newSize.Height / 16) * 16; } if (_iconSize != newSize) { _iconSize = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IconSize")); } } } [IniProperty("WebRequestTimeout", Description = "The connect timeout value for webrequets, these are seconds", DefaultValue = "100")] public int WebRequestTimeout { get; set; } [IniProperty("WebRequestReadWriteTimeout", Description = "The read/write timeout value for webrequets, these are seconds", DefaultValue = "100")] public int WebRequestReadWriteTimeout { get; set; } /// /// Specifies what THIS build is /// public BuildStates BuildState { get { string informationalVersion = Application.ProductVersion; if (informationalVersion != null) { if (informationalVersion.ToLowerInvariant().Contains("-rc")) { return BuildStates.RELEASE_CANDIDATE; } if (informationalVersion.ToLowerInvariant().Contains("-unstable")) { return BuildStates.UNSTABLE; } } return BuildStates.RELEASE; } } public bool UseLargeIcons => IconSize.Width >= 32 || IconSize.Height >= 32; /// /// A helper method which returns true if the supplied experimental feature is enabled /// /// /// public bool IsExperimentalFeatureEnabled(string experimentalFeature) { return (ExperimentalFeatures != null && ExperimentalFeatures.Contains(experimentalFeature)); } /// /// Supply values we can't put as defaults /// /// The property to return a default for /// object with the default value for the supplied property public override object GetDefault(string property) { switch(property) { case "PluginWhitelist": case "PluginBacklist": return new List(); case "OutputFileAsFullpath": if (IniConfig.IsPortable) { return Path.Combine(Application.StartupPath, @"..\..\Documents\Pictures\Greenshots\dummy.png"); } else { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"dummy.png"); } case "OutputFilePath": if (IniConfig.IsPortable) { string pafOutputFilePath = Path.Combine(Application.StartupPath, @"..\..\Documents\Pictures\Greenshots"); if (!Directory.Exists(pafOutputFilePath)) { try { Directory.CreateDirectory(pafOutputFilePath); return pafOutputFilePath; } catch (Exception ex) { LOG.Warn(ex); // Problem creating directory, fallback to Desktop } } else { return pafOutputFilePath; } } return Environment.GetFolderPath(Environment.SpecialFolder.Desktop); case "DWMBackgroundColor": return Color.Transparent; case "ActiveTitleFixes": return new List {"Firefox", "IE", "Chrome"}; case "TitleFixMatcher": return new Dictionary {{"Firefox", " - Mozilla Firefox.*"}, {"IE", " - (Microsoft|Windows) Internet Explorer.*"}, {"Chrome", " - Google Chrome.*"}}; case "TitleFixReplacer": return new Dictionary {{"Firefox", ""}, {"IE", ""}, {"Chrome", ""}}; } return null; } /// /// This method will be called before converting the property, making to possible to correct a certain value /// Can be used when migration is needed /// /// The name of the property /// The string value of the property /// string with the propertyValue, modified or not... public override string PreCheckValue(string propertyName, string propertyValue) { // Changed the separator, now we need to correct this if ("Destinations".Equals(propertyName)) { if (propertyValue != null) { return propertyValue.Replace('|',','); } } if("OutputFilePath".Equals(propertyName)) { if (string.IsNullOrEmpty(propertyValue)) { return null; } } return base.PreCheckValue(propertyName, propertyValue); } /// /// This method will be called before writing the configuration /// public override void BeforeSave() { try { // Store version, this can be used later to fix settings after an update LastSaveWithVersion = Assembly.GetEntryAssembly().GetName().Version.ToString(); } catch { // ignored } } /// /// This method will be called after reading the configuration, so eventually some corrections can be made /// public override void AfterLoad() { // Comment with releases // CheckForUnstable = true; if (string.IsNullOrEmpty(LastSaveWithVersion)) { try { // Store version, this can be used later to fix settings after an update LastSaveWithVersion = Assembly.GetEntryAssembly().GetName().Version.ToString(); } catch { // ignored } // Disable the AutoReduceColors as it causes issues with Mozzila applications and some others OutputFileAutoReduceColors = false; } // Fix for excessive feed checking if (UpdateCheckInterval != 0 && UpdateCheckInterval <= 7 && LastSaveWithVersion.StartsWith("1.2")) { UpdateCheckInterval = 14; } if (UpdateCheckInterval > 365) { UpdateCheckInterval = 365; } // Enable OneNote if upgrading from 1.1 if (ExcludeDestinations != null && ExcludeDestinations.Contains("OneNote")) { if(LastSaveWithVersion != null && LastSaveWithVersion.StartsWith("1.1")) { ExcludeDestinations.Remove("OneNote"); } else { // TODO: Remove with the release ExcludeDestinations.Remove("OneNote"); } } if (OutputDestinations == null) { OutputDestinations = new List(); } // Make sure there is an output! if (OutputDestinations.Count == 0) { OutputDestinations.Add("Editor"); } // Prevent both settings at once, bug #3435056 if (OutputDestinations.Contains("Clipboard") && OutputFileCopyPathToClipboard) { OutputFileCopyPathToClipboard = false; } // Make sure we have clipboard formats, otherwise a paste doesn't make sense! if (ClipboardFormats == null || ClipboardFormats.Count == 0) { ClipboardFormats = new List {ClipboardFormat.PNG, ClipboardFormat.HTML, ClipboardFormat.DIB}; } // Make sure the lists are lowercase, to speedup the check if (NoGDICaptureForProduct != null) { // Fix error in configuration if (NoGDICaptureForProduct.Count >= 2) { if ("intellij".Equals(NoGDICaptureForProduct[0]) && "idea".Equals(NoGDICaptureForProduct[1])) { NoGDICaptureForProduct.RemoveRange(0, 2); NoGDICaptureForProduct.Add("Intellij Idea"); IsDirty = true; } } for (int i = 0; i < NoGDICaptureForProduct.Count; i++) { NoGDICaptureForProduct[i] = NoGDICaptureForProduct[i].ToLower(); } } if (NoDWMCaptureForProduct != null) { // Fix error in configuration if (NoDWMCaptureForProduct.Count >= 3) { if ("citrix".Equals(NoDWMCaptureForProduct[0]) && "ica".Equals(NoDWMCaptureForProduct[1]) && "client".Equals(NoDWMCaptureForProduct[2])) { NoDWMCaptureForProduct.RemoveRange(0, 3); NoDWMCaptureForProduct.Add("Citrix ICA Client"); IsDirty = true; } } for (int i = 0; i < NoDWMCaptureForProduct.Count; i++) { NoDWMCaptureForProduct[i] = NoDWMCaptureForProduct[i].ToLower(); } } if (AutoCropDifference < 0) { AutoCropDifference = 0; } if (AutoCropDifference > 255) { AutoCropDifference = 255; } if (OutputFileReduceColorsTo < 2) { OutputFileReduceColorsTo = 2; } if (OutputFileReduceColorsTo > 256) { OutputFileReduceColorsTo = 256; } if (WebRequestTimeout <= 10) { WebRequestTimeout = 100; } if (WebRequestReadWriteTimeout < 1) { WebRequestReadWriteTimeout = 100; } // Added for BUG-1992, reset the OutputFilePath / OutputFileAsFullpath if they don't exist (e.g. the configuration is used on a different PC) if (!Directory.Exists(OutputFilePath)) { OutputFilePath = GetDefault(nameof(OutputFilePath)) as string; } if (!File.Exists(OutputFileAsFullpath)) { OutputFileAsFullpath = GetDefault(nameof(OutputFileAsFullpath)) as string; } } } }