diff --git a/ShareX.UploadersLib/FileUploaders/FTPAdapter.cs b/ShareX.UploadersLib/FileUploaders/FTPAdapter.cs
deleted file mode 100644
index 5578e0d05..000000000
--- a/ShareX.UploadersLib/FileUploaders/FTPAdapter.cs
+++ /dev/null
@@ -1,510 +0,0 @@
-#region License Information (GPL v3)
-
-/*
- ShareX - A program that allows you to take screenshots and share any file type
- Copyright (c) 2007-2017 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.HelpersLib;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.IO;
-using System.Net;
-using System.Text;
-using System.Text.RegularExpressions;
-
-namespace ShareX.UploadersLib
-{
- public class FTPOptions
- {
- public FTPOptions()
- {
- }
-
- public FTPOptions(FTPAccount acc, IWebProxy proxy)
- {
- Account = acc;
- ProxySettings = proxy;
- }
-
- public FTPAccount Account { get; set; }
-
- public IWebProxy ProxySettings { get; set; }
- }
-
- public class FTPAdapter
- {
- public event ProgressEventHandler ProgressChanged;
-
- public delegate void ProgressEventHandler(ProgressManager progress);
-
- public event StringEventHandler FTPOutput;
-
- public delegate void StringEventHandler(string text);
-
- public FTPOptions Options;
-
- private const int BufferSize = 2048;
-
- public FTPAdapter(FTPOptions options)
- {
- Options = options;
- }
-
- private void OnProgressChanged(ProgressManager progress)
- {
- if (ProgressChanged != null)
- {
- ProgressChanged(progress);
- }
- }
-
- public bool Upload(Stream stream, string url)
- {
- try
- {
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.UploadFile;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
- request.UsePassive = !Options.Account.IsActive;
-
- using (stream)
- using (Stream requestStream = request.GetRequestStream())
- {
- ProgressManager progress = new ProgressManager(stream.Length);
-
- byte[] buffer = new byte[BufferSize];
- int bytesRead;
-
- while ((bytesRead = stream.Read(buffer, 0, BufferSize)) > 0)
- {
- requestStream.Write(buffer, 0, bytesRead);
- progress.UpdateProgress(bytesRead);
- OnProgressChanged(progress);
- }
- }
-
- WriteOutput("Upload: " + url);
- return true;
- }
- catch (Exception ex)
- {
- WriteOutput(string.Format("Error: {0} - Upload: {1}", ex.Message, url));
- }
- return false;
- }
-
- public bool UploadFile(string filePath, string url)
- {
- FileStream stream = new FileStream(filePath, FileMode.Open);
- return Upload(stream, url);
- }
-
- public bool UploadText(string text, string url)
- {
- MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(text), false);
- return Upload(stream, url);
- }
-
- #region Async Methods
-
- private class AsyncUploadHelper
- {
- public BackgroundWorker BackgroundWorker;
- public Stream Stream;
- public string URL;
- }
-
- public void AsyncUpload(Stream stream, string url)
- {
- BackgroundWorker bw = new BackgroundWorker { WorkerReportsProgress = true };
- bw.DoWork += bw_AsyncUploadDoWork;
- bw.ProgressChanged += bw_AsyncUploadProgressChanged;
- AsyncUploadHelper upload = new AsyncUploadHelper { BackgroundWorker = bw, Stream = stream, URL = url };
- bw.RunWorkerAsync(upload);
- }
-
- private void bw_AsyncUploadDoWork(object sender, DoWorkEventArgs e)
- {
- try
- {
- AsyncUploadHelper upload = (AsyncUploadHelper)e.Argument;
-
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(upload.URL);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.UploadFile;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
- request.UsePassive = !Options.Account.IsActive;
-
- using (upload.Stream)
- using (Stream requestStream = request.GetRequestStream())
- {
- ProgressManager progress = new ProgressManager(upload.Stream.Length);
-
- byte[] buffer = new byte[BufferSize];
- int bytesRead;
-
- while ((bytesRead = upload.Stream.Read(buffer, 0, BufferSize)) > 0)
- {
- requestStream.Write(buffer, 0, bytesRead);
- progress.UpdateProgress(bytesRead);
- upload.BackgroundWorker.ReportProgress((int)progress.Percentage, progress);
- }
- }
- }
- catch (Exception ex)
- {
- DebugHelper.WriteException(ex);
- }
- }
-
- private void bw_AsyncUploadProgressChanged(object sender, ProgressChangedEventArgs e)
- {
- if (ProgressChanged != null)
- {
- ProgressChanged((ProgressManager)e.UserState);
- }
- }
-
- public void AsyncUploadFile(string filePath, string url)
- {
- FileStream stream = new FileStream(filePath, FileMode.Open);
- AsyncUpload(stream, url);
- }
-
- public void AsyncUploadText(string text, string url)
- {
- MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(text), false);
- AsyncUpload(stream, url);
- }
-
- #endregion Async Methods
-
- public bool DownloadFile(string url, string savePath)
- {
- try
- {
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.DownloadFile;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
- request.UsePassive = !Options.Account.IsActive;
-
- using (FileStream fileStream = new FileStream(savePath, FileMode.Create))
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- using (Stream stream = response.GetResponseStream())
- {
- ProgressManager progress = new ProgressManager(stream.Length);
-
- byte[] buffer = new byte[BufferSize];
- int bytesRead;
-
- while ((bytesRead = stream.Read(buffer, 0, BufferSize)) > 0)
- {
- fileStream.Write(buffer, 0, bytesRead);
- progress.UpdateProgress(bytesRead);
- OnProgressChanged(progress);
- }
- }
-
- WriteOutput(string.Format("DownloadFile: {0} -> {1}", url, savePath));
- return true;
- }
- catch (Exception ex)
- {
- WriteOutput(string.Format("Error: {0} - DownloadFile: {1} -> {2}", ex.Message, url, savePath));
- }
- return false;
- }
-
- public void DeleteFile(string url)
- {
- string filename = URLHelpers.GetFileName(url);
- if (filename == "." || filename == "..") return;
-
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.DeleteFile;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
-
- request.GetResponse();
-
- WriteOutput("DeleteFile: " + url);
- }
-
- public void RemoveDirectory(string url)
- {
- string filename = URLHelpers.GetFileName(url);
- if (filename == "." || filename == "..") return;
-
- List files = ListDirectoryDetails(url);
- string path = URLHelpers.GetDirectoryPath(url);
-
- foreach (FTPLineResult file in files)
- {
- if (file.IsDirectory)
- {
- RemoveDirectory(URLHelpers.CombineURL(url, file.Name));
- }
- else
- {
- DeleteFile(URLHelpers.CombineURL(url, file.Name));
- }
- }
-
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.RemoveDirectory;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
-
- request.GetResponse();
-
- WriteOutput("RemoveDirectory: " + url);
- }
-
- public void Rename(string url, string newFileName)
- {
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.Rename;
- request.RenameTo = newFileName;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
-
- request.GetResponse();
-
- WriteOutput(string.Format("Rename: {0} -> {1}", url, newFileName));
- }
-
- public long GetFileSize(string url)
- {
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.GetFileSize;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
-
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- WriteOutput("GetFileSize: " + url);
-
- return response.ContentLength;
- }
- }
-
- public string[] ListDirectory(string url)
- {
- List result = new List();
-
- url = URLHelpers.AddSlash(url, SlashType.Suffix);
-
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.ListDirectory;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
- request.Timeout = 10000;
- request.UsePassive = !Options.Account.IsActive;
-
- using (WebResponse response = request.GetResponse())
- using (StreamReader reader = new StreamReader(response.GetResponseStream()))
- {
- while (!reader.EndOfStream)
- {
- result.Add(reader.ReadLine());
- }
-
- WriteOutput("ListDirectory: " + url);
-
- return result.ToArray();
- }
- }
-
- public List ListDirectoryDetails(string url)
- {
- List result = new List();
-
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Proxy = Options.ProxySettings;
- request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
- request.UsePassive = !Options.Account.IsActive;
-
- using (WebResponse response = request.GetResponse())
- using (StreamReader reader = new StreamReader(response.GetResponseStream()))
- {
- while (!reader.EndOfStream)
- {
- result.Add(FTPLineParser.Parse(reader.ReadLine()));
- }
-
- WriteOutput("ListDirectoryDetails: " + url);
-
- return result;
- }
- }
-
- public bool MakeDirectory(string url)
- {
- try
- {
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
-
- request.Method = WebRequestMethods.Ftp.MakeDirectory;
- request.Credentials = new NetworkCredential(Options.Account.Username, Options.Account.Password);
- request.KeepAlive = false;
-
- request.GetResponse();
-
- WriteOutput("MakeDirectory: " + url);
- return true;
- }
- catch (Exception ex)
- {
- WriteOutput(string.Format("Error: {0} - MakeDirectory: {1}", ex.Message, url));
- }
- return false;
- }
-
- public void MakeMultiDirectory(string dirName)
- {
- string path = "";
- string[] dirs = dirName.Split('/');
- foreach (string dir in dirs)
- {
- if (!string.IsNullOrEmpty(dir))
- {
- path = URLHelpers.CombineURL(path, dir);
- MakeDirectory(URLHelpers.CombineURL(Options.Account.FTPAddress, path));
- }
- }
-
- WriteOutput("MakeMultiDirectory: " + dirName);
- }
-
- public void WriteOutput(string text)
- {
- if (FTPOutput != null)
- {
- FTPOutput(string.Format("{0} - {1}", DateTime.Now.ToLongTimeString(), text));
- }
- }
- }
-
- public static class FTPLineParser
- {
- private static Regex unixStyle = new Regex(@"^(?(?[-dl])(?[-r][-w][-x])(?[-r][-w][-x])(?[-r][-w][-x]))\s+(?\d+)\s+(?\w+)\s+(?\w+)\s+(?\d+)\s+(?\w+)\s+(?\d{1,2})\s+(?(?\d{1,2}):*(?\d{1,2}))\s+(?.*)$");
- private static Regex winStyle = new Regex(@"^(?\d{1,2})-(?\d{1,2})-(?\d{1,2})\s+(?\d{1,2}):(?\d{1,2})(?am|pm)\s+(?[<]dir[>])?\s+(?\d+)?\s+(?.*)$");
-
- public static FTPLineResult Parse(string line)
- {
- Match match = unixStyle.Match(line);
- if (match.Success)
- {
- return ParseMatch(match.Groups, ListStyle.Unix);
- }
-
- throw new Exception("Only support Unix ftp servers.");
-
- /*
- match = winStyle.Match(line);
- if (match.Success)
- {
- return ParseMatch(match.Groups, ListStyle.Windows);
- }
-
- throw new Exception("Invalid line format");
- */
- }
-
- private static FTPLineResult ParseMatch(GroupCollection matchGroups, ListStyle style)
- {
- FTPLineResult result = new FTPLineResult();
-
- result.Style = style;
- string dirMatch = style == ListStyle.Unix ? "d" : "";
- result.IsDirectory = matchGroups["Directory"].Value.Equals(dirMatch, StringComparison.InvariantCultureIgnoreCase);
- result.Permissions = matchGroups["Permissions"].Value;
- result.Name = matchGroups["Name"].Value;
-
- if (!result.IsDirectory)
- {
- result.SetSize(matchGroups["Size"].Value);
- }
-
- result.Owner = matchGroups["Owner"].Value;
- result.Group = matchGroups["Group"].Value;
- result.SetDateTime(matchGroups["Year"].Value, matchGroups["Month"].Value, matchGroups["Day"].Value);
-
- return result;
- }
- }
-
- public enum ListStyle
- {
- Unix,
- Windows
- }
-
- public class FTPLineResult
- {
- public ListStyle Style;
- public string Name;
- public string Permissions;
- public DateTime DateTime;
- public bool TimeInfo;
- public bool IsDirectory;
- public long Size;
- public string SizeString;
- public string Owner;
- public string Group;
- public bool IsSpecial;
-
- public void SetSize(string size)
- {
- Size = long.Parse(size);
- SizeString = Size.ToString("N0");
- }
-
- public void SetDateTime(string year, string month, string day)
- {
- string time = "";
-
- if (year.Contains(":"))
- {
- time = year;
- year = DateTime.Now.Year.ToString();
- TimeInfo = true;
- }
-
- DateTime = DateTime.Parse(string.Format("{0}/{1}/{2} {3}", year, month, day, time));
- DateTime = DateTime.ToLocalTime();
- }
- }
-}
\ No newline at end of file
diff --git a/ShareX.UploadersLib/ShareX.UploadersLib.csproj b/ShareX.UploadersLib/ShareX.UploadersLib.csproj
index 8cb71afe4..d2998cccf 100644
--- a/ShareX.UploadersLib/ShareX.UploadersLib.csproj
+++ b/ShareX.UploadersLib/ShareX.UploadersLib.csproj
@@ -292,7 +292,6 @@
-