using System; using System.Collections.Generic; using FluentFTP; namespace FluentFTP.Extensions { /// /// Implementation of the non-standard XSHA512 command /// public static class XSHA512 { delegate string AsyncGetXSHA512(string path); static Dictionary m_asyncmethods = new Dictionary(); /// /// Gets the SHA-512 hash of the specified file using XSHA512. 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-512 hash. public static string GetXSHA512(this FtpClient client, string path) { FtpReply reply; if (!(reply = client.Execute("XSHA512 {0}", path)).Success) throw new FtpCommandException(reply); return reply.Message; } /// /// Asynchronusly retrieve a SHA512 hash. The XSHA512 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 BeginGetXSHA512(this FtpClient client, string path, AsyncCallback callback, object state) { AsyncGetXSHA512 func = new AsyncGetXSHA512(client.GetXSHA512); IAsyncResult ar = func.BeginInvoke(path, callback, state); ; lock (m_asyncmethods) { m_asyncmethods.Add(ar, func); } return ar; } /// /// Ends an asynchronous call to BeginGetXSHA512() /// /// IAsyncResult returned from BeginGetXSHA512() /// The SHA-512 hash of the specified file. public static string EndGetXSHA512(IAsyncResult ar) { AsyncGetXSHA512 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); } } }