Index: third_party/sqlite/sqlite-src-3100200/tool/GetFile.cs |
diff --git a/third_party/sqlite/sqlite-src-3100200/tool/GetFile.cs b/third_party/sqlite/sqlite-src-3100200/tool/GetFile.cs |
deleted file mode 100644 |
index 2a62deb552d827bd04420504d1711af4c50ab2ff..0000000000000000000000000000000000000000 |
--- a/third_party/sqlite/sqlite-src-3100200/tool/GetFile.cs |
+++ /dev/null |
@@ -1,450 +0,0 @@ |
-/* |
-** 2015 October 7 |
-** |
-** The author disclaims copyright to this source code. In place of |
-** a legal notice, here is a blessing: |
-** |
-** May you do good and not evil. |
-** May you find forgiveness for yourself and forgive others. |
-** May you share freely, never taking more than you give. |
-** |
-************************************************************************* |
-** This file contains C# code to download a single file based on a URI. |
-*/ |
- |
-using System; |
-using System.ComponentModel; |
-using System.Diagnostics; |
-using System.IO; |
-using System.Net; |
-using System.Reflection; |
-using System.Runtime.InteropServices; |
-using System.Threading; |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-#region Assembly Metadata |
-[assembly: AssemblyTitle("GetFile Tool")] |
-[assembly: AssemblyDescription("Download a single file based on a URI.")] |
-[assembly: AssemblyCompany("SQLite Development Team")] |
-[assembly: AssemblyProduct("SQLite")] |
-[assembly: AssemblyCopyright("Public Domain")] |
-[assembly: ComVisible(false)] |
-[assembly: Guid("5c4b3728-1693-4a33-a218-8e6973ca15a6")] |
-[assembly: AssemblyVersion("1.0.*")] |
- |
-#if DEBUG |
-[assembly: AssemblyConfiguration("Debug")] |
-#else |
-[assembly: AssemblyConfiguration("Release")] |
-#endif |
-#endregion |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-namespace GetFile |
-{ |
- /// <summary> |
- /// This enumeration is used to represent all the possible exit codes from |
- /// this tool. |
- /// </summary> |
- internal enum ExitCode |
- { |
- /// <summary> |
- /// The file download was a success. |
- /// </summary> |
- Success = 0, |
- |
- /// <summary> |
- /// The command line arguments are missing (i.e. null). Generally, |
- /// this should not happen. |
- /// </summary> |
- MissingArgs = 1, |
- |
- /// <summary> |
- /// The wrong number of command line arguments was supplied. |
- /// </summary> |
- WrongNumArgs = 2, |
- |
- /// <summary> |
- /// The URI specified on the command line could not be parsed as a |
- /// supported absolute URI. |
- /// </summary> |
- BadUri = 3, |
- |
- /// <summary> |
- /// The file name portion of the URI specified on the command line |
- /// could not be extracted from it. |
- /// </summary> |
- BadFileName = 4, |
- |
- /// <summary> |
- /// The temporary directory is either invalid (i.e. null) or does not |
- /// represent an available directory. |
- /// </summary> |
- BadTempPath = 5, |
- |
- /// <summary> |
- /// An exception was caught in <see cref="Main" />. Generally, this |
- /// should not happen. |
- /// </summary> |
- Exception = 6, |
- |
- /// <summary> |
- /// The file download was canceled. This tool does not make use of |
- /// the <see cref="WebClient.CancelAsync" /> method; therefore, this |
- /// should not happen. |
- /// </summary> |
- DownloadCanceled = 7, |
- |
- /// <summary> |
- /// The file download encountered an error. Further information about |
- /// this error should be displayed on the console. |
- /// </summary> |
- DownloadError = 8 |
- } |
- |
- /////////////////////////////////////////////////////////////////////////// |
- |
- internal static class Program |
- { |
- #region Private Data |
- /// <summary> |
- /// This is used to synchronize multithreaded access to the |
- /// <see cref="previousPercent" /> and <see cref="exitCode"/> |
- /// fields. |
- /// </summary> |
- private static readonly object syncRoot = new object(); |
- |
- /////////////////////////////////////////////////////////////////////// |
- |
- /// <summary> |
- /// This event will be signed when the file download has completed, |
- /// even if the file download itself was canceled or unsuccessful. |
- /// </summary> |
- private static EventWaitHandle doneEvent; |
- |
- /////////////////////////////////////////////////////////////////////// |
- |
- /// <summary> |
- /// The previous file download completion percentage seen by the |
- /// <see cref="DownloadProgressChanged" /> event handler. This value |
- /// is never decreased, nor is it ever reset to zero. |
- /// </summary> |
- private static int previousPercent = 0; |
- |
- /////////////////////////////////////////////////////////////////////// |
- |
- /// <summary> |
- /// This will be the exit code returned by this tool after the file |
- /// download completes, successfully or otherwise. This value is only |
- /// changed by the <see cref="DownloadFileCompleted" /> event handler. |
- /// </summary> |
- private static ExitCode exitCode = ExitCode.Success; |
- #endregion |
- |
- /////////////////////////////////////////////////////////////////////// |
- |
- #region Private Support Methods |
- /// <summary> |
- /// This method displays an error message to the console and/or |
- /// displays the command line usage information for this tool. |
- /// </summary> |
- /// <param name="message"> |
- /// The error message to display, if any. |
- /// </param> |
- /// <param name="usage"> |
- /// Non-zero to display the command line usage information. |
- /// </param> |
- private static void Error( |
- string message, |
- bool usage |
- ) |
- { |
- if (message != null) |
- Console.WriteLine(message); |
- |
- string fileName = Path.GetFileName( |
- Process.GetCurrentProcess().MainModule.FileName); |
- |
- Console.WriteLine(String.Format("usage: {0} <uri>", fileName)); |
- } |
- |
- /////////////////////////////////////////////////////////////////////// |
- |
- /// <summary> |
- /// This method attempts to determine the file name portion of the |
- /// specified URI. |
- /// </summary> |
- /// <param name="uri"> |
- /// The URI to process. |
- /// </param> |
- /// <returns> |
- /// The file name portion of the specified URI -OR- null if it cannot |
- /// be determined. |
- /// </returns> |
- private static string GetFileName( |
- Uri uri |
- ) |
- { |
- if (uri == null) |
- return null; |
- |
- string pathAndQuery = uri.PathAndQuery; |
- |
- if (String.IsNullOrEmpty(pathAndQuery)) |
- return null; |
- |
- int index = pathAndQuery.LastIndexOf('/'); |
- |
- if ((index < 0) || (index == pathAndQuery.Length)) |
- return null; |
- |
- return pathAndQuery.Substring(index + 1); |
- } |
- #endregion |
- |
- /////////////////////////////////////////////////////////////////////// |
- |
- #region Private Event Handlers |
- /// <summary> |
- /// This method is an event handler that is called when the file |
- /// download completion percentage changes. It will display progress |
- /// on the console. Special care is taken to make sure that progress |
- /// events are not displayed out-of-order, even if duplicate and/or |
- /// out-of-order events are received. |
- /// </summary> |
- /// <param name="sender"> |
- /// The source of the event. |
- /// </param> |
- /// <param name="e"> |
- /// Information for the event being processed. |
- /// </param> |
- private static void DownloadProgressChanged( |
- object sender, |
- DownloadProgressChangedEventArgs e |
- ) |
- { |
- if (e != null) |
- { |
- int percent = e.ProgressPercentage; |
- |
- lock (syncRoot) |
- { |
- if (percent > previousPercent) |
- { |
- Console.Write('.'); |
- |
- if ((percent % 10) == 0) |
- Console.Write(" {0}% ", percent); |
- |
- previousPercent = percent; |
- } |
- } |
- } |
- } |
- |
- /////////////////////////////////////////////////////////////////////// |
- |
- /// <summary> |
- /// This method is an event handler that is called when the file |
- /// download has completed, successfully or otherwise. It will |
- /// display the overall result of the file download on the console, |
- /// including any <see cref="Exception" /> information, if applicable. |
- /// The <see cref="exitCode" /> field is changed by this method to |
- /// indicate the overall result of the file download and the event |
- /// within the <see cref="doneEvent" /> field will be signaled. |
- /// </summary> |
- /// <param name="sender"> |
- /// The source of the event. |
- /// </param> |
- /// <param name="e"> |
- /// Information for the event being processed. |
- /// </param> |
- private static void DownloadFileCompleted( |
- object sender, |
- AsyncCompletedEventArgs e |
- ) |
- { |
- if (e != null) |
- { |
- lock (syncRoot) |
- { |
- if (previousPercent < 100) |
- Console.Write(' '); |
- } |
- |
- if (e.Cancelled) |
- { |
- Console.WriteLine("Canceled"); |
- |
- lock (syncRoot) |
- { |
- exitCode = ExitCode.DownloadCanceled; |
- } |
- } |
- else |
- { |
- Exception error = e.Error; |
- |
- if (error != null) |
- { |
- Console.WriteLine("Error: {0}", error); |
- |
- lock (syncRoot) |
- { |
- exitCode = ExitCode.DownloadError; |
- } |
- } |
- else |
- { |
- Console.WriteLine("Done"); |
- } |
- } |
- } |
- |
- if (doneEvent != null) |
- doneEvent.Set(); |
- } |
- #endregion |
- |
- /////////////////////////////////////////////////////////////////////// |
- |
- #region Program Entry Point |
- /// <summary> |
- /// This is the entry-point for this tool. It handles processing the |
- /// command line arguments, setting up the web client, downloading the |
- /// file, and saving it to the file system. |
- /// </summary> |
- /// <param name="args"> |
- /// The command line arguments. |
- /// </param> |
- /// <returns> |
- /// Zero upon success; non-zero on failure. This will be one of the |
- /// values from the <see cref="ExitCode" /> enumeration. |
- /// </returns> |
- private static int Main( |
- string[] args |
- ) |
- { |
- // |
- // NOTE: Sanity check the command line arguments. |
- // |
- if (args == null) |
- { |
- Error(null, true); |
- return (int)ExitCode.MissingArgs; |
- } |
- |
- if (args.Length != 1) |
- { |
- Error(null, true); |
- return (int)ExitCode.WrongNumArgs; |
- } |
- |
- // |
- // NOTE: Attempt to convert the first (and only) command line |
- // argument to an absolute URI. |
- // |
- Uri uri; |
- |
- if (!Uri.TryCreate(args[0], UriKind.Absolute, out uri)) |
- { |
- Error("Could not create absolute URI from argument.", false); |
- return (int)ExitCode.BadUri; |
- } |
- |
- // |
- // NOTE: Attempt to extract the file name portion of the URI we |
- // just created. |
- // |
- string fileName = GetFileName(uri); |
- |
- if (fileName == null) |
- { |
- Error("Could not extract the file name from the URI.", false); |
- return (int)ExitCode.BadFileName; |
- } |
- |
- // |
- // NOTE: Grab the temporary path setup for this process. If it is |
- // unavailable, we will not continue. |
- // |
- string directory = Path.GetTempPath(); |
- |
- if (String.IsNullOrEmpty(directory) || |
- !Directory.Exists(directory)) |
- { |
- Error("Temporary directory is invalid or unavailable.", false); |
- return (int)ExitCode.BadTempPath; |
- } |
- |
- try |
- { |
- using (WebClient webClient = new WebClient()) |
- { |
- // |
- // NOTE: Create the event used to signal completion of the |
- // file download. |
- // |
- doneEvent = new ManualResetEvent(false); |
- |
- // |
- // NOTE: Hookup the event handlers we care about on the web |
- // client. These are necessary because the file is |
- // downloaded asynchronously. |
- // |
- webClient.DownloadProgressChanged += |
- new DownloadProgressChangedEventHandler( |
- DownloadProgressChanged); |
- |
- webClient.DownloadFileCompleted += |
- new AsyncCompletedEventHandler( |
- DownloadFileCompleted); |
- |
- // |
- // NOTE: Build the fully qualified path and file name, |
- // within the temporary directory, where the file to |
- // be downloaded will be saved. |
- // |
- fileName = Path.Combine(directory, fileName); |
- |
- // |
- // NOTE: If the file name already exists (in the temporary) |
- // directory, delete it. |
- // |
- // TODO: Perhaps an error should be raised here instead? |
- // |
- if (File.Exists(fileName)) |
- File.Delete(fileName); |
- |
- // |
- // NOTE: After kicking off the asynchronous file download |
- // process, wait [forever] until the "done" event is |
- // signaled. |
- // |
- Console.WriteLine( |
- "Downloading \"{0}\" to \"{1}\"...", uri, fileName); |
- |
- webClient.DownloadFileAsync(uri, fileName); |
- doneEvent.WaitOne(); |
- } |
- |
- lock (syncRoot) |
- { |
- return (int)exitCode; |
- } |
- } |
- catch (Exception e) |
- { |
- // |
- // NOTE: An exception was caught. Report it via the console |
- // and return failure. |
- // |
- Error(e.ToString(), false); |
- return (int)ExitCode.Exception; |
- } |
- } |
- #endregion |
- } |
-} |