diff --git a/FileTransferStatusForm.Designer.cs b/FileTransferStatusForm.Designer.cs index aeb794b..b9a16b4 100644 --- a/FileTransferStatusForm.Designer.cs +++ b/FileTransferStatusForm.Designer.cs @@ -32,12 +32,15 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FileTransferStatusForm)); this.cancelButton = new System.Windows.Forms.Button(); this.mainGroupBox = new System.Windows.Forms.GroupBox(); + this.errorsTextBox = new System.Windows.Forms.TextBox(); + this.mainLabel2 = new System.Windows.Forms.Label(); this.progressBar2 = new System.Windows.Forms.ProgressBar(); this.progressBar1 = new System.Windows.Forms.ProgressBar(); this.mainLabel1 = new System.Windows.Forms.Label(); this.updateTimer = new System.Windows.Forms.Timer(this.components); - this.mainLabel2 = new System.Windows.Forms.Label(); + this.errorsGroupBox = new System.Windows.Forms.GroupBox(); this.mainGroupBox.SuspendLayout(); + this.errorsGroupBox.SuspendLayout(); this.SuspendLayout(); // // cancelButton @@ -58,6 +61,18 @@ this.mainGroupBox.Name = "mainGroupBox"; this.mainGroupBox.TabStop = false; // + // errorsTextBox + // + resources.ApplyResources(this.errorsTextBox, "errorsTextBox"); + this.errorsTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.errorsTextBox.Name = "errorsTextBox"; + this.errorsTextBox.ReadOnly = true; + // + // mainLabel2 + // + resources.ApplyResources(this.mainLabel2, "mainLabel2"); + this.mainLabel2.Name = "mainLabel2"; + // // progressBar2 // resources.ApplyResources(this.progressBar2, "progressBar2"); @@ -78,16 +93,19 @@ this.updateTimer.Interval = 500; this.updateTimer.Tick += new System.EventHandler(this.updateTimer_Tick); // - // mainLabel2 + // errorsGroupBox // - resources.ApplyResources(this.mainLabel2, "mainLabel2"); - this.mainLabel2.Name = "mainLabel2"; + this.errorsGroupBox.Controls.Add(this.errorsTextBox); + resources.ApplyResources(this.errorsGroupBox, "errorsGroupBox"); + this.errorsGroupBox.Name = "errorsGroupBox"; + this.errorsGroupBox.TabStop = false; // // FileTransferStatusForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.cancelButton; + this.Controls.Add(this.errorsGroupBox); this.Controls.Add(this.mainGroupBox); this.Controls.Add(this.cancelButton); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; @@ -97,6 +115,8 @@ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FileTransferStatusForm_FormClosing); this.Load += new System.EventHandler(this.FileTransferStatusForm_Load); this.mainGroupBox.ResumeLayout(false); + this.errorsGroupBox.ResumeLayout(false); + this.errorsGroupBox.PerformLayout(); this.ResumeLayout(false); } @@ -110,5 +130,7 @@ private System.Windows.Forms.Label mainLabel1; private System.Windows.Forms.Timer updateTimer; private System.Windows.Forms.Label mainLabel2; + private System.Windows.Forms.TextBox errorsTextBox; + private System.Windows.Forms.GroupBox errorsGroupBox; } } \ No newline at end of file diff --git a/FileTransferStatusForm.cs b/FileTransferStatusForm.cs index cd6494e..d8fa0c3 100644 --- a/FileTransferStatusForm.cs +++ b/FileTransferStatusForm.cs @@ -15,6 +15,7 @@ limitations under the License. */ using System; +using System.Drawing; using System.Windows.Forms; namespace MeshCentralRouter @@ -22,6 +23,12 @@ namespace MeshCentralRouter public partial class FileTransferStatusForm : Form { private FileViewer fileViewer; + private bool loaded = false; + public bool showingError = false; + private string errors = ""; + private bool done = false; + private Point mainBoxLocation; + private Point errorBoxLocation; public FileTransferStatusForm(FileViewer fileViewer) { @@ -30,6 +37,8 @@ namespace MeshCentralRouter Translate.TranslateControl(this); updateInfo(); updateTimer.Enabled = true; + mainBoxLocation = mainGroupBox.Location; + errorBoxLocation = errorsGroupBox.Location; } private void updateTimer_Tick(object sender, EventArgs e) @@ -37,6 +46,31 @@ namespace MeshCentralRouter updateInfo(); } + public delegate void updateErrorMessageshandler(); + + public void addErrorMessage(string msg) + { + lock (this) + { + errors += (msg + "\r\n"); + showingError = true; + } + if (loaded == false) return; + if (this.InvokeRequired) { this.Invoke(new updateErrorMessageshandler(updateErrorMessages)); } else { updateErrorMessages(); } + } + + public void updateErrorMessages() + { + showDialogParts(!done, showingError); + lock (this) { errorsTextBox.Text = errors; } + } + + public void transferCompleted() + { + done = true; + showDialogParts(!done, showingError); + } + private void updateInfo() { if (fileViewer.uploadActive) @@ -87,7 +121,11 @@ namespace MeshCentralRouter if (x > (int)fileViewer.downloadFileArray.Count) { x = fileViewer.downloadFileArray.Count; } progressBar2.Value = fileViewer.downloadFileArrayPtr; } - else { Close(); } + else + { + done = true; + if (showingError == false) { Close(); } else { cancelButton.Text = Translate.T(Properties.Resources.Close); } + } } private string secondsLeftToString(double x) @@ -114,12 +152,60 @@ namespace MeshCentralRouter private void cancelButton_Click(object sender, EventArgs e) { - Close(); + if (done) + { + fileViewer.transferStatusForm = null; + Close(); + } + else + { + // Cancel file transfer + if (fileViewer.uploadActive) { fileViewer.uploadCancel(); } + if (fileViewer.downloadActive) { fileViewer.downloadCancel(); } + } } private void FileTransferStatusForm_Load(object sender, EventArgs e) { CenterToParent(); + lock (this) { errorsTextBox.Text = errors; } + loaded = true; + showDialogParts(!done, showingError); } + + private void showDialogParts(bool status, bool errors) + { + mainGroupBox.Visible = status; + errorsGroupBox.Visible = errors; + if (errors == false) + { + if (status == false) + { + // Show nothing + this.Height = 109; + } + else + { + // Show only status box + this.Height = mainGroupBox.Height + 99; + } + } + else + { + if (status == false) + { + // Show only error box + this.Height = errorsGroupBox.Height + 99; + errorsGroupBox.Location = mainBoxLocation; + } + else + { + // Show both status and error box + this.Height = mainGroupBox.Height + errorsGroupBox.Height + 109; + errorsGroupBox.Location = errorBoxLocation; + } + } + } + } } diff --git a/FileTransferStatusForm.resx b/FileTransferStatusForm.resx index 5de3228..3aec102 100644 --- a/FileTransferStatusForm.resx +++ b/FileTransferStatusForm.resx @@ -123,7 +123,7 @@ - 277, 130 + 277, 244 75, 23 @@ -145,11 +145,110 @@ $this - 1 + 2 + Top, Left, Right + + + mainLabel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainGroupBox + + + 0 + + + progressBar2 + + + System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainGroupBox + + + 1 + + + progressBar1 + + + System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainGroupBox + + + 2 + + + mainLabel1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + mainGroupBox + + + 3 + + + 12, 12 + + + 340, 109 + + + 4 + + + Transfer Progress + + + mainGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + Top, Bottom, Left, Right + + 17, 19 + + + True + + + 306, 84 + + + 6 + + + errorsTextBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + errorsGroupBox + + + 0 + Top, Left, Right @@ -255,33 +354,33 @@ 3 - - 12, 12 - - - 340, 112 - - - 4 - - - Transfer Progress - - - mainGroupBox - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - 17, 17 + + 12, 127 + + + 340, 109 + + + 7 + + + Transfer Errors + + + errorsGroupBox + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + True @@ -289,7 +388,7 @@ 6, 13 - 364, 165 + 364, 279 @@ -1985,6 +2084,9 @@ AADAPwAAwD8AAMA/AADAPwAA + + NoControl + CenterParent diff --git a/FileViewer.cs b/FileViewer.cs index 9a223b5..2923ee9 100644 --- a/FileViewer.cs +++ b/FileViewer.cs @@ -60,6 +60,7 @@ namespace MeshCentralRouter public long uploadFilePtr = 0; public long uploadFileSize = 0; public DateTime uploadFileStartTime = DateTime.MinValue; + public string uploadFileName = null; // Download state public bool downloadActive = false; @@ -445,8 +446,35 @@ namespace MeshCentralRouter } else if (sub == "cancel") { - // Cancel the download - downloadCancel(); + // Unable to download this file + if (transferStatusForm != null) { transferStatusForm.addErrorMessage(String.Format(Translate.T(Properties.Resources.ErrorDownloadingFileX), downloadFileArray[downloadFileArrayPtr].ToString())); } + + // Send DOWNLOAD command + string cmd = "{\"action\":\"download\",\"sub\":\"stop\",\"id\":" + (downloadFileArrayPtr + 1000) + "}"; + byte[] bincmd = UTF8Encoding.UTF8.GetBytes(cmd); + wc.SendBinary(bincmd, 0, bincmd.Length); + if (downloadFileStream != null) { downloadFileStream.Close(); downloadFileStream = null; } // Close the file + try { File.Delete(Path.Combine(downloadLocalPath.FullName, downloadFileArray[downloadFileArrayPtr].ToString())); } catch (Exception) { } + + // Go to next file + if (downloadFileArray.Count > downloadFileArrayPtr + 1) + { + // Download the next file + downloadFileArrayPtr++; + downloadNextFile(); + } + else + { + // Done with all files + downloadActive = false; + downloadStop = false; + downloadFileArrayPtr = -1; + downloadFileArray = null; + downloadLocalPath = null; + downloadRemotePath = null; + closeTransferDialog(); + localRefresh(); + } } break; } @@ -511,13 +539,16 @@ namespace MeshCentralRouter if (uploadStop) { uploadCancel(); return; } uploadNextPart(false); } - else if (action == "uploaddone") + else if ((action == "uploaddone") || (action == "uploaderror")) { // Clean up current upload uploadFilePtr = 0; uploadFileSize = 0; if (uploadFileStream != null) { uploadFileStream.Close(); uploadFileStream = null; } + // If this is an error, show it in the dialog + if ((action == "uploaderror") && (transferStatusForm != null)) { transferStatusForm.addErrorMessage(String.Format(Translate.T(Properties.Resources.ErrorUploadingFileX), uploadFileName)); } + // Check if another file needs to be uploaded if (uploadFileArray.Count > uploadFileArrayPtr + 1) { @@ -536,14 +567,11 @@ namespace MeshCentralRouter uploadRemotePath = null; uploadFilePtr = 0; uploadFileSize = 0; + uploadFileName = null; closeTransferDialog(); remoteRefresh(); } } - else if (action == "uploaderror") - { - uploadCancel(); - } else if (reqid == 1) { // Result of a LS command @@ -765,13 +793,7 @@ namespace MeshCentralRouter string r = remoteFolder; if (r.EndsWith("/")) { r = r.Substring(0, r.Length - 1); } int i = r.LastIndexOf("/"); - if (i >= 0) - { - r = r.Substring(0, i + 1); - } else - { - r = ""; - } + if (i >= 0) { r = r.Substring(0, i + 1); } else { r = ""; } requestRemoteFolder(r); } @@ -948,7 +970,7 @@ namespace MeshCentralRouter private void uploadButton_Click(object sender, EventArgs e) { // If a transfer is currently active, ignore this. - if (uploadActive || downloadActive) return; + if (uploadActive || downloadActive || (transferStatusForm != null)) return; // If any files are going to be overwritten int overWriteCount = 0; @@ -989,11 +1011,12 @@ namespace MeshCentralRouter uploadRemotePath = remoteFolder; uploadActive = true; uploadStop = false; - uploadNextFile(); // Show transfer status dialog transferStatusForm = new FileTransferStatusForm(this); transferStatusForm.Show(this); + + uploadNextFile(); } private void uploadNextFile() @@ -1011,10 +1034,40 @@ namespace MeshCentralRouter localFilePath = (string)uploadFileArray[uploadFileArrayPtr]; localFileName = Path.GetFileName(localFilePath); } - uploadFileStream = File.OpenRead(localFilePath); + try { uploadFileStream = File.OpenRead(localFilePath); } catch (Exception ex) + { + // Display the error + if (transferStatusForm != null) { transferStatusForm.addErrorMessage(String.Format(Translate.T(Properties.Resources.UnableToOpenFileX), localFileName)); } + + // Skip to the next file + // Check if another file needs to be uploaded + if (uploadFileArray.Count > uploadFileArrayPtr + 1) + { + // Upload the next file + uploadFileArrayPtr++; + uploadNextFile(); + } + else + { + // Done with all files + uploadActive = false; + uploadStop = false; + uploadFileArrayPtr = -1; + uploadFileArray = null; + uploadLocalPath = null; + uploadRemotePath = null; + uploadFilePtr = 0; + uploadFileSize = 0; + uploadFileName = null; + closeTransferDialog(); + remoteRefresh(); + } + return; + } uploadFileSize = new FileInfo(localFilePath).Length; uploadFilePtr = 0; uploadFileStartTime = DateTime.Now; + uploadFileName = localFileName; // Send UPLOAD command string cmd = "{\"action\":\"upload\",\"reqid\":" + (uploadFileArrayPtr + 1000) + ",\"path\":\"" + uploadRemotePath + "\",\"name\":\"" + localFileName + "\",\"size\":" + uploadFileSize + "}"; @@ -1071,13 +1124,21 @@ namespace MeshCentralRouter { if (transferStatusForm == null) return; if (this.InvokeRequired) { this.Invoke(new closeTransferDialogHandler(closeTransferDialog)); return; } - transferStatusForm.Close(); transferStatusForm = null; + if (transferStatusForm.showingError == false) + { + // Everything was succesful, close the form + transferStatusForm.Close(); + transferStatusForm = null; + } else { + // Error are displayed, keep the form open + transferStatusForm.transferCompleted(); + } } private void downloadButton_Click(object sender, EventArgs e) { // If a transfer is currently active, ignore this. - if (uploadActive || downloadActive) return; + if (uploadActive || downloadActive || (transferStatusForm != null)) return; // If any files are going to be overwritten int overWriteCount = 0; @@ -1103,16 +1164,10 @@ namespace MeshCentralRouter { FileConfirmOverwriteForm f = new FileConfirmOverwriteForm(); if (overWriteCount == 1) { f.mainTextLabel = String.Format(Translate.T(Properties.Resources.OverwriteOneFile), overWriteCount); } else { f.mainTextLabel = String.Format(Translate.T(Properties.Resources.OverwriteXfiles), overWriteCount); } - if (f.ShowDialog(this) == DialogResult.OK) { performFileDownload(); } + if (f.ShowDialog(this) != DialogResult.OK) return; } - else - { - performFileDownload(); - } - } - private void performFileDownload() - { + // Perform the download downloadFileArrayPtr = 0; downloadFileArray = new ArrayList(); downloadFileSizeArray = new ArrayList(); @@ -1128,11 +1183,12 @@ namespace MeshCentralRouter downloadRemotePath = remoteFolder; downloadActive = true; downloadStop = false; - downloadNextFile(); // Show transfer status dialog transferStatusForm = new FileTransferStatusForm(this); transferStatusForm.Show(this); + + downloadNextFile(); } private void downloadNextFile() @@ -1141,7 +1197,32 @@ namespace MeshCentralRouter string localFilePath; localFilePath = Path.Combine(downloadLocalPath.FullName, (string)downloadFileArray[downloadFileArrayPtr]); - try { downloadFileStream = File.OpenWrite(localFilePath); } catch (Exception) { return; } + try { downloadFileStream = File.OpenWrite(localFilePath); } catch (Exception) { + // Download error, show it in the dialog + FileInfo f = new FileInfo(localFilePath); + if (transferStatusForm != null) { transferStatusForm.addErrorMessage(String.Format(Translate.T(Properties.Resources.UnableToWriteFileX), f.Name)); } + + // Unable to download the file, skip it. + if (downloadFileArray.Count > downloadFileArrayPtr + 1) + { + // Download the next file + downloadFileArrayPtr++; + downloadNextFile(); + } + else + { + // Done with all files + downloadActive = false; + downloadStop = false; + downloadFileArrayPtr = -1; + downloadFileArray = null; + downloadLocalPath = null; + downloadRemotePath = null; + closeTransferDialog(); + localRefresh(); + } + return; + } downloadFileSize = (int)downloadFileSizeArray[downloadFileArrayPtr]; downloadFilePtr = 0; downloadFileStartTime = DateTime.Now; @@ -1199,7 +1280,6 @@ namespace MeshCentralRouter } } - public void downloadCancel() { if (downloadActive == false) return; @@ -1259,28 +1339,54 @@ namespace MeshCentralRouter private void rightListView_DragEnter(object sender, DragEventArgs e) { - if (uploadActive || downloadActive) return; + if (uploadActive || downloadActive || (transferStatusForm != null)) return; if ((node.agentid < 5) && ((remoteFolder == null) || (remoteFolder == ""))) { return; } if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; } private void rightListView_DragDrop(object sender, DragEventArgs e) { - if (uploadActive || downloadActive) return; + if (uploadActive || downloadActive || (transferStatusForm != null)) return; if ((node.agentid < 5) && ((remoteFolder == null) || (remoteFolder == ""))) { return; } + string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); + + // If any files are going to be overwritten + int overWriteCount = 0; + foreach (string file in files) + { + FileInfo f = new FileInfo(file); + string filename = f.Name; + foreach (ListViewItem l2 in rightListView.Items) + { + if (l2.ImageIndex == 2) + { + string filename2 = l2.Text; + if (node.agentid < 5) { filename = filename.ToLower(); filename2 = filename2.ToLower(); } + if (filename.Equals(filename2)) { overWriteCount++; } + } + } + } + if (overWriteCount > 0) + { + FileConfirmOverwriteForm f = new FileConfirmOverwriteForm(); + if (overWriteCount == 1) { f.mainTextLabel = String.Format(Translate.T(Properties.Resources.OverwriteOneFile), overWriteCount); } else { f.mainTextLabel = String.Format(Translate.T(Properties.Resources.OverwriteXfiles), overWriteCount); } + if (f.ShowDialog(this) != DialogResult.OK) return; + } + + // Perform the upload uploadFileArrayPtr = 0; uploadFileArray = new ArrayList(); - string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); foreach (string file in files) { uploadFileArray.Add(file); } uploadLocalPath = null; uploadRemotePath = remoteFolder; uploadActive = true; uploadStop = false; - uploadNextFile(); // Show transfer status dialog transferStatusForm = new FileTransferStatusForm(this); transferStatusForm.Show(this); + + uploadNextFile(); } private void leftListView_MouseMove(object sender, MouseEventArgs e) @@ -1324,14 +1430,40 @@ namespace MeshCentralRouter private void leftListView_DragEnter(object sender, DragEventArgs e) { - if (uploadActive || downloadActive || (localFolder == null)) return; + if (uploadActive || downloadActive || (localFolder == null) || (transferStatusForm != null)) return; if ((e.Data.GetDataPresent("Type") == true) && ((string)e.Data.GetData("Type") == ("MeshCentralRouterRemoteFiles-" + rndString))) { e.Effect = DragDropEffects.Copy; } } private void leftListView_DragDrop(object sender, DragEventArgs e) { - if (uploadActive || downloadActive) return; + if (uploadActive || downloadActive || (transferStatusForm != null)) return; if ((e.Data.GetDataPresent("Type") == false) || ((string)e.Data.GetData("Type") != ("MeshCentralRouterRemoteFiles-" + rndString))) return; + + ArrayList files = (ArrayList)e.Data.GetData("RemoteFiles"); + + // If any files are going to be overwritten + int overWriteCount = 0; + foreach (string file in files) + { + string filename = file; + foreach (ListViewItem l2 in leftListView.Items) + { + if (l2.ImageIndex == 2) + { + string filename2 = l2.Text; + if (node.agentid < 5) { filename = filename.ToLower(); filename2 = filename2.ToLower(); } + if (filename.Equals(filename2)) { overWriteCount++; } + } + } + } + if (overWriteCount > 0) + { + FileConfirmOverwriteForm f = new FileConfirmOverwriteForm(); + if (overWriteCount == 1) { f.mainTextLabel = String.Format(Translate.T(Properties.Resources.OverwriteOneFile), overWriteCount); } else { f.mainTextLabel = String.Format(Translate.T(Properties.Resources.OverwriteXfiles), overWriteCount); } + if (f.ShowDialog(this) != DialogResult.OK) return; + } + + // Perform downloads downloadFileArrayPtr = 0; downloadFileArray = (ArrayList)e.Data.GetData("RemoteFiles"); downloadFileSizeArray = (ArrayList)e.Data.GetData("RemoteSizes"); @@ -1339,11 +1471,12 @@ namespace MeshCentralRouter downloadRemotePath = (string)e.Data.GetData("RemoteFolder"); downloadActive = true; downloadStop = false; - downloadNextFile(); // Show transfer status dialog transferStatusForm = new FileTransferStatusForm(this); transferStatusForm.Show(this); + + downloadNextFile(); } private static string getRandomString(int length) { diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 6d4c8d1..8143e05 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -143,6 +143,15 @@ namespace MeshCentralRouter.Properties { } } + /// + /// Looks up a localized string similar to Close. + /// + internal static string Close { + get { + return ResourceManager.GetString("Close", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -281,6 +290,24 @@ namespace MeshCentralRouter.Properties { } } + /// + /// Looks up a localized string similar to Error downloading file: {0}. + /// + internal static string ErrorDownloadingFileX { + get { + return ResourceManager.GetString("ErrorDownloadingFileX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error uploading file: {0}. + /// + internal static string ErrorUploadingFileX { + get { + return ResourceManager.GetString("ErrorUploadingFileX", resourceCulture); + } + } + /// /// Looks up a localized string similar to Estimating.... /// @@ -879,6 +906,24 @@ namespace MeshCentralRouter.Properties { } } + /// + /// Looks up a localized string similar to Unable to open file: {0}. + /// + internal static string UnableToOpenFileX { + get { + return ResourceManager.GetString("UnableToOpenFileX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to write file: {0}. + /// + internal static string UnableToWriteFileX { + get { + return ResourceManager.GetString("UnableToWriteFileX", resourceCulture); + } + } + /// /// Looks up a localized string similar to Updating.... /// diff --git a/Properties/Resources.resx b/Properties/Resources.resx index afceb7c..ab2a104 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -427,4 +427,19 @@ {0} seconds left + + Close + + + Error downloading file: {0} + + + Error uploading file: {0} + + + Unable to open file: {0} + + + Unable to write file: {0} + \ No newline at end of file