diff --git a/ShareX.UploadersLib/BaseUploaders/Uploader.cs b/ShareX.UploadersLib/BaseUploaders/Uploader.cs index f2a18bf99..90837bbed 100644 --- a/ShareX.UploadersLib/BaseUploaders/Uploader.cs +++ b/ShareX.UploadersLib/BaseUploaders/Uploader.cs @@ -41,7 +41,7 @@ public class Uploader public event Action EarlyURLCopyRequested; public bool IsUploading { get; protected set; } - public List Errors { get; private set; } = new List(); + public UploaderErrorManager Errors { get; private set; } = new UploaderErrorManager(); public bool IsError => !StopUploadRequested && Errors != null && Errors.Count > 0; public int BufferSize { get; set; } = 8192; @@ -483,7 +483,7 @@ private string ProcessError(Exception e, string requestURL) string errorText = sb.ToString(); - if (Errors == null) Errors = new List(); + if (Errors == null) Errors = new UploaderErrorManager(); Errors.Add(errorText); DebugHelper.WriteLine("Error:\r\n" + errorText); diff --git a/ShareX.UploadersLib/FileUploaders/Dropbox.cs b/ShareX.UploadersLib/FileUploaders/Dropbox.cs index 7de245f1c..e0bbe97d6 100644 --- a/ShareX.UploadersLib/FileUploaders/Dropbox.cs +++ b/ShareX.UploadersLib/FileUploaders/Dropbox.cs @@ -303,7 +303,7 @@ public string CreateShareableLink(string path, bool directLink) { linkMetadata = JsonConvert.DeserializeObject(response); } - else if (IsError && Errors[Errors.Count - 1].Contains("\"shared_link_already_exists\"")) // Ugly workaround + else if (IsError && Errors.Errors[Errors.Count - 1].Text.Contains("\"shared_link_already_exists\"")) // Ugly workaround { DropboxListSharedLinksResult result = ListSharedLinks(path, true); diff --git a/ShareX.UploadersLib/FileUploaders/Jira.cs b/ShareX.UploadersLib/FileUploaders/Jira.cs index d3ed0bcd0..3f4b80e32 100644 --- a/ShareX.UploadersLib/FileUploaders/Jira.cs +++ b/ShareX.UploadersLib/FileUploaders/Jira.cs @@ -269,7 +269,7 @@ private string GetSummary(string issueId) } // This query can returns error so we have to remove last error from errors list - Errors.RemoveAt(Errors.Count - 1); + Errors.Errors.RemoveAt(Errors.Count - 1); return null; } diff --git a/ShareX.UploadersLib/FileUploaders/SendSpaceManager.cs b/ShareX.UploadersLib/FileUploaders/SendSpaceManager.cs index 5766ffe8c..20ea52fe6 100644 --- a/ShareX.UploadersLib/FileUploaders/SendSpaceManager.cs +++ b/ShareX.UploadersLib/FileUploaders/SendSpaceManager.cs @@ -25,7 +25,6 @@ You should have received a copy of the GNU General Public License using ShareX.HelpersLib; using System; -using System.Collections.Generic; namespace ShareX.UploadersLib.FileUploaders { @@ -39,7 +38,7 @@ public static class SendSpaceManager public static string Password; public static SendSpace.UploadInfo UploadInfo; - public static List PrepareUploadInfo(string apiKey, string username = null, string password = null) + public static UploaderErrorManager PrepareUploadInfo(string apiKey, string username = null, string password = null) { SendSpace sendSpace = new SendSpace(apiKey); diff --git a/ShareX.UploadersLib/Forms/CustomUploaderSettingsForm.cs b/ShareX.UploadersLib/Forms/CustomUploaderSettingsForm.cs index c4a8a86c8..7fd010458 100644 --- a/ShareX.UploadersLib/Forms/CustomUploaderSettingsForm.cs +++ b/ShareX.UploadersLib/Forms/CustomUploaderSettingsForm.cs @@ -623,7 +623,7 @@ await Task.Run(() => { CustomImageUploader imageUploader = new CustomImageUploader(item); result = imageUploader.Upload(stream, "Test.png"); - result.Errors.AddRange(imageUploader.Errors); + result.Errors.Add(imageUploader.Errors); } break; case CustomUploaderDestinationType.TextUploader: @@ -637,7 +637,7 @@ await Task.Run(() => if (!string.IsNullOrEmpty(text)) { result = textUploader.UploadText(text, "Test.txt"); - result.Errors.AddRange(textUploader.Errors); + result.Errors.Add(textUploader.Errors); } } } @@ -647,18 +647,18 @@ await Task.Run(() => { CustomFileUploader fileUploader = new CustomFileUploader(item); result = fileUploader.Upload(stream, "Test.png"); - result.Errors.AddRange(fileUploader.Errors); + result.Errors.Add(fileUploader.Errors); } break; case CustomUploaderDestinationType.URLShortener: CustomURLShortener urlShortener = new CustomURLShortener(item); result = urlShortener.ShortenURL(Links.Website); - result.Errors.AddRange(urlShortener.Errors); + result.Errors.Add(urlShortener.Errors); break; case CustomUploaderDestinationType.URLSharingService: CustomURLSharer urlSharer = new CustomURLSharer(item); result = urlSharer.ShareURL(Links.Website); - result.Errors.AddRange(urlSharer.Errors); + result.Errors.Add(urlSharer.Errors); break; } } diff --git a/ShareX.UploadersLib/Helpers/UploaderErrorInfo.cs b/ShareX.UploadersLib/Helpers/UploaderErrorInfo.cs new file mode 100644 index 000000000..8b9c383f4 --- /dev/null +++ b/ShareX.UploadersLib/Helpers/UploaderErrorInfo.cs @@ -0,0 +1,42 @@ +#region License Information (GPL v3) + +/* + ShareX - A program that allows you to take screenshots and share any file type + Copyright (c) 2007-2022 ShareX Team + + 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 2 + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Optionally you can also view the license at . +*/ + +#endregion License Information (GPL v3) + +using System; + +namespace ShareX.UploadersLib +{ + public class UploaderErrorInfo + { + public string Title { get; set; } + public string Text { get; set; } + public Exception Exception { get; set; } + + public UploaderErrorInfo(string title, string text) + { + Title = title; + Text = text; + } + } +} \ No newline at end of file diff --git a/ShareX.UploadersLib/Helpers/UploaderErrorManager.cs b/ShareX.UploadersLib/Helpers/UploaderErrorManager.cs new file mode 100644 index 000000000..11f2d8f6b --- /dev/null +++ b/ShareX.UploadersLib/Helpers/UploaderErrorManager.cs @@ -0,0 +1,74 @@ +#region License Information (GPL v3) + +/* + ShareX - A program that allows you to take screenshots and share any file type + Copyright (c) 2007-2022 ShareX Team + + 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 2 + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Optionally you can also view the license at . +*/ + +#endregion License Information (GPL v3) + +using ShareX.UploadersLib.Properties; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ShareX.UploadersLib +{ + public class UploaderErrorManager + { + public List Errors { get; private set; } + + public int Count => Errors.Count; + + public UploaderErrorManager() + { + Errors = new List(); + } + + public void Add(string text) + { + Add(Resources.Error, text); + } + + public void Add(string title, string text) + { + Errors.Add(new UploaderErrorInfo(title, text)); + } + + public void Add(UploaderErrorManager manager) + { + Errors.AddRange(manager.Errors); + } + + public void Insert(int index, string text) + { + Insert(index, Resources.Error, text); + } + + public void Insert(int index, string title, string text) + { + Errors.Insert(index, new UploaderErrorInfo(title, text)); + } + + public override string ToString() + { + return string.Join(Environment.NewLine + Environment.NewLine, Errors.Select(x => x.Text)); + } + } +} \ No newline at end of file diff --git a/ShareX.UploadersLib/ShareX.UploadersLib.csproj b/ShareX.UploadersLib/ShareX.UploadersLib.csproj index 1295fd934..236163dbe 100644 --- a/ShareX.UploadersLib/ShareX.UploadersLib.csproj +++ b/ShareX.UploadersLib/ShareX.UploadersLib.csproj @@ -254,6 +254,7 @@ + @@ -284,6 +285,7 @@ + diff --git a/ShareX.UploadersLib/UploadResult.cs b/ShareX.UploadersLib/UploadResult.cs index 7c2b61e9c..c3a9c4034 100644 --- a/ShareX.UploadersLib/UploadResult.cs +++ b/ShareX.UploadersLib/UploadResult.cs @@ -24,8 +24,6 @@ You should have received a copy of the GNU General Public License #endregion License Information (GPL v3) using ShareX.HelpersLib; -using System; -using System.Collections.Generic; using System.Text; namespace ShareX.UploadersLib @@ -52,7 +50,7 @@ public bool IsSuccess } public string Response { get; set; } - public List Errors { get; set; } + public UploaderErrorManager Errors { get; set; } public bool IsURLExpected { get; set; } public bool IsError @@ -67,7 +65,7 @@ public bool IsError public UploadResult() { - Errors = new List(); + Errors = new UploaderErrorManager(); IsURLExpected = true; } @@ -104,7 +102,7 @@ public string ErrorsToString() { if (IsError) { - return string.Join(Environment.NewLine + Environment.NewLine, Errors.ToArray()); + return Errors.ToString(); } return null; diff --git a/ShareX/TaskManager.cs b/ShareX/TaskManager.cs index d69d1ae08..729972223 100644 --- a/ShareX/TaskManager.cs +++ b/ShareX/TaskManager.cs @@ -300,7 +300,7 @@ private static void Task_TaskCompleted(WorkerTask task) } else if (task.Status == TaskStatus.Failed) { - string errors = string.Join("\r\n\r\n", info.Result.Errors.ToArray()); + string errors = info.Result.Errors.ToString(); DebugHelper.WriteLine($"Task failed. File name: {info.FileName}, Errors:\r\n{errors}"); @@ -320,12 +320,18 @@ private static void Task_TaskCompleted(WorkerTask task) if (info.Result.Errors.Count > 0) { - string errorMessage = info.Result.Errors[0]; + UploaderErrorInfo error = info.Result.Errors.Errors[0]; - if (info.TaskSettings.GeneralSettings.ShowToastNotificationAfterTaskCompleted && !string.IsNullOrEmpty(errorMessage) && + string title = error.Title; + if (string.IsNullOrEmpty(title)) + { + title = Resources.TaskManager_task_UploadCompleted_Error; + } + + if (info.TaskSettings.GeneralSettings.ShowToastNotificationAfterTaskCompleted && !string.IsNullOrEmpty(error.Text) && (!info.TaskSettings.GeneralSettings.DisableNotificationsOnFullscreen || !CaptureHelpers.IsActiveWindowFullscreen())) { - TaskHelpers.ShowNotificationTip(errorMessage, "ShareX - " + Resources.TaskManager_task_UploadCompleted_Error, 5000); + TaskHelpers.ShowNotificationTip(error.Text, "ShareX - " + title, 5000); } } } diff --git a/ShareX/WorkerTask.cs b/ShareX/WorkerTask.cs index c4d2a6915..60a5e81fa 100644 --- a/ShareX/WorkerTask.cs +++ b/ShareX/WorkerTask.cs @@ -526,7 +526,7 @@ private bool DoUpload(Stream data, string fileName, int retry = 0) if (uploader != null) { - AddErrorMessage(uploader.Errors.ToArray()); + AddErrorMessage(uploader.Errors); } isError |= Info.Result.IsError; @@ -535,14 +535,24 @@ private bool DoUpload(Stream data, string fileName, int retry = 0) return isError; } - private void AddErrorMessage(params string[] errorMessages) + private void AddErrorMessage(UploaderErrorManager errors) { if (Info.Result == null) { Info.Result = new UploadResult(); } - Info.Result.Errors.AddRange(errorMessages); + Info.Result.Errors.Add(errors); + } + + private void AddErrorMessage(string error) + { + if (Info.Result == null) + { + Info.Result = new UploadResult(); + } + + Info.Result.Errors.Add(error); } private bool DoThreadJob() @@ -840,7 +850,7 @@ private void DoAfterUploadJobs() if (result != null) { Info.Result.ShortenedURL = result.ShortenedURL; - Info.Result.Errors.AddRange(result.Errors); + Info.Result.Errors.Add(result.Errors); } } @@ -850,7 +860,7 @@ private void DoAfterUploadJobs() if (result != null) { - Info.Result.Errors.AddRange(result.Errors); + Info.Result.Errors.Add(result.Errors); } if (Info.Job == TaskJob.ShareURL)