using System; using System.Collections.Generic; using FluentFTP; namespace FluentFTP.Extensions { /// /// Implementation of the non-standard XSHA256 command /// public static class XSHA256 { delegate string AsyncGetXSHA256(string path); static Dictionary m_asyncmethods = new Dictionary(); /// /// Gets the SHA-256 hash of the specified file using XSHA256. This is a non-standard extension /// to the protocol and may or may not work. A FtpCommandException will be /// thrown if the command fails. /// /// FtpClient Object /// Full or relative path to remote file /// Server response, presumably the SHA-256 hash. public static string GetXSHA256(this FtpClient client, string path) { FtpReply reply; if (!(reply = client.Execute("XSHA256 {0}", path)).Success) throw new FtpCommandException(reply); return reply.Message; } /// /// Asynchronusly retrieve a SHA256 hash. The XSHA256 command is non-standard /// and not guaranteed to work. /// /// FtpClient Object /// Full or relative path to remote file /// AsyncCallback /// State Object /// IAsyncResult public static IAsyncResult BeginGetXSHA256(this FtpClient client, string path, AsyncCallback callback, object state) { AsyncGetXSHA256 func = new AsyncGetXSHA256(client.GetXSHA256); IAsyncResult ar = func.BeginInvoke(path, callback, state); ; lock (m_asyncmethods) { m_asyncmethods.Add(ar, func); } return ar; } /// /// Ends an asynchronous call to BeginGetXSHA256() /// /// IAsyncResult returned from BeginGetXSHA256() /// The SHA-256 hash of the specified file. public static string EndGetXSHA256(IAsyncResult ar) { AsyncGetXSHA256 func = null; lock (m_asyncmethods) { if (!m_asyncmethods.ContainsKey(ar)) throw new InvalidOperationException("The specified IAsyncResult was not found in the collection."); func = m_asyncmethods[ar]; m_asyncmethods.Remove(ar); } return func.EndInvoke(ar); } } }