diff --git a/Greenshot/releases/additional_files/readme.txt.template b/Greenshot/releases/additional_files/readme.txt.template index cbc4bce74..6f55b4038 100644 --- a/Greenshot/releases/additional_files/readme.txt.template +++ b/Greenshot/releases/additional_files/readme.txt.template @@ -46,7 +46,7 @@ Added features: * FEATURE-946 Updated to Inno-Setup 5.5.9 for improved installer security * FEATURE-958 Greenshot is now using code signing certificates -Added translation: +Added or changed translation: * CatalĂ  by Gabriel Guix. * Nederlands by Stephan Paternotte diff --git a/GreenshotImgurPlugin/Forms/ImgurHistory.cs b/GreenshotImgurPlugin/Forms/ImgurHistory.cs index 4d67ab528..517bb165f 100644 --- a/GreenshotImgurPlugin/Forms/ImgurHistory.cs +++ b/GreenshotImgurPlugin/Forms/ImgurHistory.cs @@ -29,22 +29,37 @@ using Greenshot.IniFile; namespace GreenshotImgurPlugin { /// - /// Description of ImgurHistory. + /// Imgur history form /// public sealed partial class ImgurHistory : ImgurForm { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ImgurHistory)); private readonly GreenshotColumnSorter _columnSorter; + private static readonly object Lock = new object(); private static readonly ImgurConfiguration Config = IniConfig.GetIniSection(); private static ImgurHistory _instance; public static void ShowHistory() { - // Make sure the history is loaded, will be done only once - ImgurUtils.LoadHistory(); - if (_instance == null) { - _instance = new ImgurHistory(); + lock (Lock) + { + if (ImgurUtils.IsHistoryLoadingNeeded()) + { + // Run upload in the background + new PleaseWaitForm().ShowAndWait("Imgur " + Language.GetString("imgur", LangKey.history), Language.GetString("imgur", LangKey.communication_wait), + ImgurUtils.LoadHistory + ); + } + + // Make sure the history is loaded, will be done only once + if (_instance == null) + { + _instance = new ImgurHistory(); + } + if (!_instance.Visible) + { + _instance.Show(); + } + _instance.Redraw(); } - _instance.Show(); - _instance.Redraw(); } private ImgurHistory() { diff --git a/GreenshotImgurPlugin/Forms/SettingsForm.cs b/GreenshotImgurPlugin/Forms/SettingsForm.cs index e7afda70c..f68a50794 100644 --- a/GreenshotImgurPlugin/Forms/SettingsForm.cs +++ b/GreenshotImgurPlugin/Forms/SettingsForm.cs @@ -25,7 +25,7 @@ namespace GreenshotImgurPlugin { /// Description of PasswordRequestForm. /// public partial class SettingsForm : ImgurForm { - public SettingsForm(ImgurConfiguration config) + public SettingsForm() { // // The InitializeComponent() call is required for Windows Forms designer support. @@ -34,9 +34,7 @@ namespace GreenshotImgurPlugin { CancelButton = buttonCancel; AcceptButton = buttonOK; - ImgurUtils.LoadHistory(); - - historyButton.Enabled = config.runtimeImgurHistory.Count > 0; + historyButton.Enabled = ImgurUtils.IsHistoryLoadingNeeded(); } private void ButtonHistoryClick(object sender, EventArgs e) { diff --git a/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj b/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj index 16a2690f1..6e4f81932 100644 --- a/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj +++ b/GreenshotImgurPlugin/GreenshotImgurPlugin.csproj @@ -22,6 +22,10 @@ + + ..\packages\LinqBridge.1.3.0\lib\net20\LinqBridge.dll + True + ..\Greenshot\Lib\log4net.dll @@ -70,6 +74,7 @@ ImgurPlugin.cs + diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 2889c9501..a65c3e7b2 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -23,7 +23,6 @@ using System; using System.Collections.Generic; using System.Windows.Forms; using Greenshot.IniFile; -using GreenshotPlugin.Controls; using GreenshotPlugin.Core; namespace GreenshotImgurPlugin { @@ -95,18 +94,9 @@ namespace GreenshotImgurPlugin { /// /// bool true if OK was pressed, false if cancel public bool ShowConfigDialog() { - SettingsForm settingsForm = null; - - new PleaseWaitForm().ShowAndWait(ImgurPlugin.Attributes.Name, Language.GetString("imgur", LangKey.communication_wait), - delegate { - settingsForm = new SettingsForm(this); - } - ); + SettingsForm settingsForm = new SettingsForm(); DialogResult result = settingsForm.ShowDialog(); - if (result == DialogResult.OK) { - return true; - } - return false; + return result == DialogResult.OK; } } } diff --git a/GreenshotImgurPlugin/ImgurPlugin.cs b/GreenshotImgurPlugin/ImgurPlugin.cs index 93b8ede40..ec1d41b9e 100644 --- a/GreenshotImgurPlugin/ImgurPlugin.cs +++ b/GreenshotImgurPlugin/ImgurPlugin.cs @@ -23,7 +23,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; -using System.Threading; using System.Windows.Forms; using Greenshot.IniFile; using Greenshot.Plugin; @@ -75,7 +74,7 @@ namespace GreenshotImgurPlugin { /// Use the IGreenshotPluginHost interface to register events /// My own attributes /// true if plugin is initialized, false if not (doesn't show) - public virtual bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { + public bool Initialize(IGreenshotHost pluginHost, PluginAttribute myAttributes) { _host = pluginHost; Attributes = myAttributes; @@ -109,14 +108,8 @@ namespace GreenshotImgurPlugin { PluginUtils.AddToContextMenu(_host, itemPlugInRoot); Language.LanguageChanged += OnLanguageChanged; - // retrieve history in the background - Thread backgroundTask = new Thread(CheckHistory) - { - Name = "Imgur History", - IsBackground = true - }; - backgroundTask.SetApartmentState(ApartmentState.STA); - backgroundTask.Start(); + // Enable history if there are items available + UpdateHistoryMenuItem(); return true; } @@ -129,9 +122,8 @@ namespace GreenshotImgurPlugin { } } - private void CheckHistory() { + private void UpdateHistoryMenuItem() { try { - ImgurUtils.LoadHistory(); _host.GreenshotForm.BeginInvoke((MethodInvoker)delegate { if (_config.ImgurUploadHistory.Count > 0) { _historyMenuItem.Enabled = true; @@ -178,7 +170,7 @@ namespace GreenshotImgurPlugin { Log.InfoFormat("Storing imgur upload for hash {0} and delete hash {1}", imgurInfo.Hash, imgurInfo.DeleteHash); _config.ImgurUploadHistory.Add(imgurInfo.Hash, imgurInfo.DeleteHash); _config.runtimeImgurHistory.Add(imgurInfo.Hash, imgurInfo); - CheckHistory(); + UpdateHistoryMenuItem(); } } ); diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index aee304ec3..95bbfc806 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Linq; using System.Net; using Greenshot.IniFile; using Greenshot.Plugin; @@ -29,7 +30,7 @@ using GreenshotPlugin.Core; namespace GreenshotImgurPlugin { /// - /// Description of ImgurUtils. + /// A collection of Imgur helper methods /// public static class ImgurUtils { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(ImgurUtils)); @@ -38,44 +39,62 @@ namespace GreenshotImgurPlugin { private const string AuthUrlPattern = "https://api.imgur.com/oauth2/authorize?response_type=code&client_id={ClientId}&redirect_uri={RedirectUrl}&state={State}"; private const string TokenUrl = "https://api.imgur.com/oauth2/token"; + /// + /// Check if we need to load the history + /// + /// + public static bool IsHistoryLoadingNeeded() + { + Log.InfoFormat("Checking if imgur cache loading needed, configuration has {0} imgur hashes, loaded are {1} hashes.", Config.ImgurUploadHistory.Count, Config.runtimeImgurHistory.Count); + return Config.runtimeImgurHistory.Count != Config.ImgurUploadHistory.Count; + } + /// /// Load the complete history of the imgur uploads, with the corresponding information /// public static void LoadHistory() { - if (Config.runtimeImgurHistory.Count == Config.ImgurUploadHistory.Count) { + if (!IsHistoryLoadingNeeded()) + { return; } - // Load the ImUr history - IList hashes = new List(); - foreach(string hash in Config.ImgurUploadHistory.Keys) { - hashes.Add(hash); - } - + bool saveNeeded = false; - foreach(string hash in hashes) { + // Load the ImUr history + foreach (string hash in Config.ImgurUploadHistory.Keys.ToList()) { if (Config.runtimeImgurHistory.ContainsKey(hash)) { // Already loaded continue; } - try { - ImgurInfo imgurInfo = RetrieveImgurInfo(hash, Config.ImgurUploadHistory[hash]); + + try + { + var deleteHash = Config.ImgurUploadHistory[hash]; + ImgurInfo imgurInfo = RetrieveImgurInfo(hash, deleteHash); if (imgurInfo != null) { RetrieveImgurThumbnail(imgurInfo); Config.runtimeImgurHistory[hash] = imgurInfo; } else { - Log.DebugFormat("Deleting not found ImgUr {0} from config.", hash); + Log.InfoFormat("Deleting unknown ImgUr {0} from config, delete hash was {1}.", hash, deleteHash); Config.ImgurUploadHistory.Remove(hash); + Config.runtimeImgurHistory.Remove(hash); saveNeeded = true; } } catch (WebException wE) { bool redirected = false; if (wE.Status == WebExceptionStatus.ProtocolError) { - HttpWebResponse response = ((HttpWebResponse)wE.Response); - // Image no longer available + HttpWebResponse response = (HttpWebResponse)wE.Response; + + if (response.StatusCode == HttpStatusCode.Forbidden) + { + Log.Error("Imgur loading forbidden", wE); + break; + } + // Image no longer available? if (response.StatusCode == HttpStatusCode.Redirect) { - Log.InfoFormat("ImgUr image for hash {0} is no longer available", hash); + Log.InfoFormat("ImgUr image for hash {0} is no longer available, removing it from the history", hash); Config.ImgurUploadHistory.Remove(hash); + Config.runtimeImgurHistory.Remove(hash); redirected = true; } } diff --git a/GreenshotPlugin/IniFile/IniValue.cs b/GreenshotPlugin/IniFile/IniValue.cs index b01e87f19..2ad6c356b 100644 --- a/GreenshotPlugin/IniFile/IniValue.cs +++ b/GreenshotPlugin/IniFile/IniValue.cs @@ -353,6 +353,20 @@ namespace Greenshot.IniFile { return null; } + // The following makes the enum string values a bit less restrictive + if (valueType.IsEnum) + { + string searchingEnumString = valueString.Replace("_", "").ToLowerInvariant(); + foreach (var possibleValue in Enum.GetValues(valueType)) + { + var possibleString = possibleValue.ToString().Replace("_", "").ToLowerInvariant(); + if (possibleString.Equals(searchingEnumString)) + { + return possibleValue; + } + } + } + if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(List<>)) { string arraySeparator = separator; object list = Activator.CreateInstance(valueType);