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