/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact a15e08acb5dd7539b75ba23501581d7c2b462cb5:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 20 4f 63 74 6f 62  /*.** 2015 Octob
0010: 65 72 20 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  er 7.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 43 23 20 63 6f 64   contains C# cod
0190: 65 20 74 6f 20 64 6f 77 6e 6c 6f 61 64 20 61 20  e to download a 
01a0: 73 69 6e 67 6c 65 20 66 69 6c 65 20 62 61 73 65  single file base
01b0: 64 20 6f 6e 20 61 20 55 52 49 2e 0a 2a 2f 0a 0d  d on a URI..*/..
01c0: 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 3b 0d 0a  .using System;..
01d0: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 43 6f 6d  using System.Com
01e0: 70 6f 6e 65 6e 74 4d 6f 64 65 6c 3b 0d 0a 75 73  ponentModel;..us
01f0: 69 6e 67 20 53 79 73 74 65 6d 2e 44 69 61 67 6e  ing System.Diagn
0200: 6f 73 74 69 63 73 3b 0d 0a 75 73 69 6e 67 20 53  ostics;..using S
0210: 79 73 74 65 6d 2e 49 4f 3b 0d 0a 75 73 69 6e 67  ystem.IO;..using
0220: 20 53 79 73 74 65 6d 2e 4e 65 74 3b 0d 0a 75 73   System.Net;..us
0230: 69 6e 67 20 53 79 73 74 65 6d 2e 52 65 66 6c 65  ing System.Refle
0240: 63 74 69 6f 6e 3b 0d 0a 75 73 69 6e 67 20 53 79  ction;..using Sy
0250: 73 74 65 6d 2e 52 75 6e 74 69 6d 65 2e 49 6e 74  stem.Runtime.Int
0260: 65 72 6f 70 53 65 72 76 69 63 65 73 3b 0d 0a 75  eropServices;..u
0270: 73 69 6e 67 20 53 79 73 74 65 6d 2e 54 68 72 65  sing System.Thre
0280: 61 64 69 6e 67 3b 0d 0a 0d 0a 2f 2f 2f 2f 2f 2f  ading;....//////
0290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
02a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
02b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
02c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
02d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 23 72 65  /////////....#re
02e0: 67 69 6f 6e 20 41 73 73 65 6d 62 6c 79 20 4d 65  gion Assembly Me
02f0: 74 61 64 61 74 61 0d 0a 5b 61 73 73 65 6d 62 6c  tadata..[assembl
0300: 79 3a 20 41 73 73 65 6d 62 6c 79 54 69 74 6c 65  y: AssemblyTitle
0310: 28 22 47 65 74 46 69 6c 65 20 54 6f 6f 6c 22 29  ("GetFile Tool")
0320: 5d 0d 0a 5b 61 73 73 65 6d 62 6c 79 3a 20 41 73  ]..[assembly: As
0330: 73 65 6d 62 6c 79 44 65 73 63 72 69 70 74 69 6f  semblyDescriptio
0340: 6e 28 22 44 6f 77 6e 6c 6f 61 64 20 61 20 73 69  n("Download a si
0350: 6e 67 6c 65 20 66 69 6c 65 20 62 61 73 65 64 20  ngle file based 
0360: 6f 6e 20 61 20 55 52 49 2e 22 29 5d 0d 0a 5b 61  on a URI.")]..[a
0370: 73 73 65 6d 62 6c 79 3a 20 41 73 73 65 6d 62 6c  ssembly: Assembl
0380: 79 43 6f 6d 70 61 6e 79 28 22 53 51 4c 69 74 65  yCompany("SQLite
0390: 20 44 65 76 65 6c 6f 70 6d 65 6e 74 20 54 65 61   Development Tea
03a0: 6d 22 29 5d 0d 0a 5b 61 73 73 65 6d 62 6c 79 3a  m")]..[assembly:
03b0: 20 41 73 73 65 6d 62 6c 79 50 72 6f 64 75 63 74   AssemblyProduct
03c0: 28 22 53 51 4c 69 74 65 22 29 5d 0d 0a 5b 61 73  ("SQLite")]..[as
03d0: 73 65 6d 62 6c 79 3a 20 41 73 73 65 6d 62 6c 79  sembly: Assembly
03e0: 43 6f 70 79 72 69 67 68 74 28 22 50 75 62 6c 69  Copyright("Publi
03f0: 63 20 44 6f 6d 61 69 6e 22 29 5d 0d 0a 5b 61 73  c Domain")]..[as
0400: 73 65 6d 62 6c 79 3a 20 43 6f 6d 56 69 73 69 62  sembly: ComVisib
0410: 6c 65 28 66 61 6c 73 65 29 5d 0d 0a 5b 61 73 73  le(false)]..[ass
0420: 65 6d 62 6c 79 3a 20 47 75 69 64 28 22 35 63 34  embly: Guid("5c4
0430: 62 33 37 32 38 2d 31 36 39 33 2d 34 61 33 33 2d  b3728-1693-4a33-
0440: 61 32 31 38 2d 38 65 36 39 37 33 63 61 31 35 61  a218-8e6973ca15a
0450: 36 22 29 5d 0d 0a 5b 61 73 73 65 6d 62 6c 79 3a  6")]..[assembly:
0460: 20 41 73 73 65 6d 62 6c 79 56 65 72 73 69 6f 6e   AssemblyVersion
0470: 28 22 31 2e 30 2e 2a 22 29 5d 0d 0a 0d 0a 23 69  ("1.0.*")]....#i
0480: 66 20 44 45 42 55 47 0d 0a 5b 61 73 73 65 6d 62  f DEBUG..[assemb
0490: 6c 79 3a 20 41 73 73 65 6d 62 6c 79 43 6f 6e 66  ly: AssemblyConf
04a0: 69 67 75 72 61 74 69 6f 6e 28 22 44 65 62 75 67  iguration("Debug
04b0: 22 29 5d 0d 0a 23 65 6c 73 65 0d 0a 5b 61 73 73  ")]..#else..[ass
04c0: 65 6d 62 6c 79 3a 20 41 73 73 65 6d 62 6c 79 43  embly: AssemblyC
04d0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 22 52 65  onfiguration("Re
04e0: 6c 65 61 73 65 22 29 5d 0d 0a 23 65 6e 64 69 66  lease")]..#endif
04f0: 0d 0a 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a  ..#endregion....
0500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0530: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
0550: 0a 0d 0a 6e 61 6d 65 73 70 61 63 65 20 47 65 74  ...namespace Get
0560: 46 69 6c 65 0d 0a 7b 0d 0a 20 20 20 20 2f 2f 2f  File..{..    ///
0570: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
0580: 2f 2f 2f 20 54 68 69 73 20 65 6e 75 6d 65 72 61  /// This enumera
0590: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
05a0: 72 65 70 72 65 73 65 6e 74 20 61 6c 6c 20 74 68  represent all th
05b0: 65 20 70 6f 73 73 69 62 6c 65 20 65 78 69 74 20  e possible exit 
05c0: 63 6f 64 65 73 20 66 72 6f 6d 0d 0a 20 20 20 20  codes from..    
05d0: 2f 2f 2f 20 74 68 69 73 20 74 6f 6f 6c 2e 0d 0a  /// this tool...
05e0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
05f0: 79 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  y>..    internal
0600: 20 65 6e 75 6d 20 45 78 69 74 43 6f 64 65 0d 0a   enum ExitCode..
0610: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f      {..        /
0620: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
0630: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 69        /// The fi
0640: 6c 65 20 64 6f 77 6e 6c 6f 61 64 20 77 61 73 20  le download was 
0650: 61 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20 20  a success...    
0660: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
0670: 79 3e 0d 0a 20 20 20 20 20 20 20 20 53 75 63 63  y>..        Succ
0680: 65 73 73 20 3d 20 30 2c 0d 0a 0d 0a 20 20 20 20  ess = 0,....    
0690: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
06a0: 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54  >..        /// T
06b0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
06c0: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 6d 69  arguments are mi
06d0: 73 73 69 6e 67 20 28 69 2e 65 2e 20 6e 75 6c 6c  ssing (i.e. null
06e0: 29 2e 20 20 47 65 6e 65 72 61 6c 6c 79 2c 0d 0a  ).  Generally,..
06f0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 74 68 69 73          /// this
0700: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70   should not happ
0710: 65 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  en...        ///
0720: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
0730: 20 20 20 20 20 4d 69 73 73 69 6e 67 41 72 67 73       MissingArgs
0740: 20 3d 20 31 2c 0d 0a 0d 0a 20 20 20 20 20 20 20   = 1,....       
0750: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
0760: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
0770: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
0780: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
0790: 75 6d 65 6e 74 73 20 77 61 73 20 73 75 70 70 6c  uments was suppl
07a0: 69 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ied...        //
07b0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
07c0: 20 20 20 20 20 20 57 72 6f 6e 67 4e 75 6d 41 72        WrongNumAr
07d0: 67 73 20 3d 20 32 2c 0d 0a 0d 0a 20 20 20 20 20  gs = 2,....     
07e0: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
07f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
0800: 65 20 55 52 49 20 73 70 65 63 69 66 69 65 64 20  e URI specified 
0810: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
0820: 69 6e 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ine could not be
0830: 20 70 61 72 73 65 64 20 61 73 20 61 0d 0a 20 20   parsed as a..  
0840: 20 20 20 20 20 20 2f 2f 2f 20 73 75 70 70 6f 72        /// suppor
0850: 74 65 64 20 61 62 73 6f 6c 75 74 65 20 55 52 49  ted absolute URI
0860: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
0870: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
0880: 20 20 20 42 61 64 55 72 69 20 3d 20 33 2c 0d 0a     BadUri = 3,..
0890: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73  ..        /// <s
08a0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20  ummary>..       
08b0: 20 2f 2f 2f 20 54 68 65 20 66 69 6c 65 20 6e 61   /// The file na
08c0: 6d 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  me portion of th
08d0: 65 20 55 52 49 20 73 70 65 63 69 66 69 65 64 20  e URI specified 
08e0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
08f0: 69 6e 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ine..        ///
0900: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 65 78   could not be ex
0910: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 2e  tracted from it.
0920: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
0930: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
0940: 20 20 42 61 64 46 69 6c 65 4e 61 6d 65 20 3d 20    BadFileName = 
0950: 34 2c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  4,....        //
0960: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
0970: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 74 65 6d       /// The tem
0980: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
0990: 20 69 73 20 65 69 74 68 65 72 20 69 6e 76 61 6c   is either inval
09a0: 69 64 20 28 69 2e 65 2e 20 6e 75 6c 6c 29 20 6f  id (i.e. null) o
09b0: 72 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  r does not..    
09c0: 20 20 20 20 2f 2f 2f 20 72 65 70 72 65 73 65 6e      /// represen
09d0: 74 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 64  t an available d
09e0: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
09f0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
0a00: 3e 0d 0a 20 20 20 20 20 20 20 20 42 61 64 54 65  >..        BadTe
0a10: 6d 70 50 61 74 68 20 3d 20 35 2c 0d 0a 0d 0a 20  mpPath = 5,.... 
0a20: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d         /// <summ
0a30: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
0a40: 2f 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 77  / An exception w
0a50: 61 73 20 63 61 75 67 68 74 20 69 6e 20 3c 73 65  as caught in <se
0a60: 65 20 63 72 65 66 3d 22 4d 61 69 6e 22 20 2f 3e  e cref="Main" />
0a70: 2e 20 20 47 65 6e 65 72 61 6c 6c 79 2c 20 74 68  .  Generally, th
0a80: 69 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  is..        /// 
0a90: 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65  should not happe
0aa0: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  n...        /// 
0ab0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
0ac0: 20 20 20 20 45 78 63 65 70 74 69 6f 6e 20 3d 20      Exception = 
0ad0: 36 2c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  6,....        //
0ae0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
0af0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 69 6c       /// The fil
0b00: 65 20 64 6f 77 6e 6c 6f 61 64 20 77 61 73 20 63  e download was c
0b10: 61 6e 63 65 6c 65 64 2e 20 20 54 68 69 73 20 74  anceled.  This t
0b20: 6f 6f 6c 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  ool does not mak
0b30: 65 20 75 73 65 20 6f 66 0d 0a 20 20 20 20 20 20  e use of..      
0b40: 20 20 2f 2f 2f 20 74 68 65 20 3c 73 65 65 20 63    /// the <see c
0b50: 72 65 66 3d 22 57 65 62 43 6c 69 65 6e 74 2e 43  ref="WebClient.C
0b60: 61 6e 63 65 6c 41 73 79 6e 63 22 20 2f 3e 20 6d  ancelAsync" /> m
0b70: 65 74 68 6f 64 3b 20 74 68 65 72 65 66 6f 72 65  ethod; therefore
0b80: 2c 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  , this..        
0b90: 2f 2f 2f 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68  /// should not h
0ba0: 61 70 70 65 6e 2e 0d 0a 20 20 20 20 20 20 20 20  appen...        
0bb0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
0bc0: 20 20 20 20 20 20 20 20 44 6f 77 6e 6c 6f 61 64          Download
0bd0: 43 61 6e 63 65 6c 65 64 20 3d 20 37 2c 0d 0a 0d  Canceled = 7,...
0be0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75  .        /// <su
0bf0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
0c00: 2f 2f 2f 20 54 68 65 20 66 69 6c 65 20 64 6f 77  /// The file dow
0c10: 6e 6c 6f 61 64 20 65 6e 63 6f 75 6e 74 65 72 65  nload encountere
0c20: 64 20 61 6e 20 65 72 72 6f 72 2e 20 20 46 75 72  d an error.  Fur
0c30: 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
0c40: 20 61 62 6f 75 74 0d 0a 20 20 20 20 20 20 20 20   about..        
0c50: 2f 2f 2f 20 74 68 69 73 20 65 72 72 6f 72 20 73  /// this error s
0c60: 68 6f 75 6c 64 20 62 65 20 64 69 73 70 6c 61 79  hould be display
0c70: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 73 6f 6c  ed on the consol
0c80: 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  e...        /// 
0c90: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
0ca0: 20 20 20 20 44 6f 77 6e 6c 6f 61 64 45 72 72 6f      DownloadErro
0cb0: 72 20 3d 20 38 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  r = 8..    }....
0cc0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
0cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0cf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
0d10: 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ...    internal 
0d20: 73 74 61 74 69 63 20 63 6c 61 73 73 20 50 72 6f  static class Pro
0d30: 67 72 61 6d 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  gram..    {..   
0d40: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69       #region Pri
0d50: 76 61 74 65 20 44 61 74 61 0d 0a 20 20 20 20 20  vate Data..     
0d60: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
0d70: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
0d80: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 79  is is used to sy
0d90: 6e 63 68 72 6f 6e 69 7a 65 20 6d 75 6c 74 69 74  nchronize multit
0da0: 68 72 65 61 64 65 64 20 61 63 63 65 73 73 20 74  hreaded access t
0db0: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f  o the..        /
0dc0: 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 70 72  // <see cref="pr
0dd0: 65 76 69 6f 75 73 50 65 72 63 65 6e 74 22 20 2f  eviousPercent" /
0de0: 3e 20 61 6e 64 20 3c 73 65 65 20 63 72 65 66 3d  > and <see cref=
0df0: 22 65 78 69 74 43 6f 64 65 22 2f 3e 0d 0a 20 20  "exitCode"/>..  
0e00: 20 20 20 20 20 20 2f 2f 2f 20 66 69 65 6c 64 73        /// fields
0e10: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
0e20: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
0e30: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
0e40: 63 20 72 65 61 64 6f 6e 6c 79 20 6f 62 6a 65 63  c readonly objec
0e50: 74 20 73 79 6e 63 52 6f 6f 74 20 3d 20 6e 65 77  t syncRoot = new
0e60: 20 6f 62 6a 65 63 74 28 29 3b 0d 0a 0d 0a 20 20   object();....  
0e70: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
0e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0eb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
0ec0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75  .        /// <su
0ed0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
0ee0: 2f 2f 2f 20 54 68 69 73 20 65 76 65 6e 74 20 77  /// This event w
0ef0: 69 6c 6c 20 62 65 20 73 69 67 6e 65 64 20 77 68  ill be signed wh
0f00: 65 6e 20 74 68 65 20 66 69 6c 65 20 64 6f 77 6e  en the file down
0f10: 6c 6f 61 64 20 68 61 73 20 63 6f 6d 70 6c 65 74  load has complet
0f20: 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ed,..        ///
0f30: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
0f40: 65 20 64 6f 77 6e 6c 6f 61 64 20 69 74 73 65 6c  e download itsel
0f50: 66 20 77 61 73 20 63 61 6e 63 65 6c 65 64 20 6f  f was canceled o
0f60: 72 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2e 0d  r unsuccessful..
0f70: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73  .        /// </s
0f80: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20  ummary>..       
0f90: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
0fa0: 45 76 65 6e 74 57 61 69 74 48 61 6e 64 6c 65 20  EventWaitHandle 
0fb0: 64 6f 6e 65 45 76 65 6e 74 3b 0d 0a 0d 0a 20 20  doneEvent;....  
0fc0: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
0fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1010: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75  .        /// <su
1020: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
1030: 2f 2f 2f 20 54 68 65 20 70 72 65 76 69 6f 75 73  /// The previous
1040: 20 66 69 6c 65 20 64 6f 77 6e 6c 6f 61 64 20 63   file download c
1050: 6f 6d 70 6c 65 74 69 6f 6e 20 70 65 72 63 65 6e  ompletion percen
1060: 74 61 67 65 20 73 65 65 6e 20 62 79 20 74 68 65  tage seen by the
1070: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73  ..        /// <s
1080: 65 65 20 63 72 65 66 3d 22 44 6f 77 6e 6c 6f 61  ee cref="Downloa
1090: 64 50 72 6f 67 72 65 73 73 43 68 61 6e 67 65 64  dProgressChanged
10a0: 22 20 2f 3e 20 65 76 65 6e 74 20 68 61 6e 64 6c  " /> event handl
10b0: 65 72 2e 20 20 54 68 69 73 20 76 61 6c 75 65 0d  er.  This value.
10c0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 73 20  .        /// is 
10d0: 6e 65 76 65 72 20 64 65 63 72 65 61 73 65 64 2c  never decreased,
10e0: 20 6e 6f 72 20 69 73 20 69 74 20 65 76 65 72 20   nor is it ever 
10f0: 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0d 0a  reset to zero...
1100: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75          /// </su
1110: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
1120: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 69  private static i
1130: 6e 74 20 70 72 65 76 69 6f 75 73 50 65 72 63 65  nt previousPerce
1140: 6e 74 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 20  nt = 0;....     
1150: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
11a0: 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
11b0: 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry>..        ///
11c0: 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
11d0: 65 20 65 78 69 74 20 63 6f 64 65 20 72 65 74 75  e exit code retu
11e0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 74 6f 6f  rned by this too
11f0: 6c 20 61 66 74 65 72 20 74 68 65 20 66 69 6c 65  l after the file
1200: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 64 6f  ..        /// do
1210: 77 6e 6c 6f 61 64 20 63 6f 6d 70 6c 65 74 65 73  wnload completes
1220: 2c 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  , successfully o
1230: 72 20 6f 74 68 65 72 77 69 73 65 2e 20 20 54 68  r otherwise.  Th
1240: 69 73 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  is value is only
1250: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 63 68  ..        /// ch
1260: 61 6e 67 65 64 20 62 79 20 74 68 65 20 3c 73 65  anged by the <se
1270: 65 20 63 72 65 66 3d 22 44 6f 77 6e 6c 6f 61 64  e cref="Download
1280: 46 69 6c 65 43 6f 6d 70 6c 65 74 65 64 22 20 2f  FileCompleted" /
1290: 3e 20 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 2e  > event handler.
12a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
12b0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
12c0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
12d0: 20 45 78 69 74 43 6f 64 65 20 65 78 69 74 43 6f   ExitCode exitCo
12e0: 64 65 20 3d 20 45 78 69 74 43 6f 64 65 2e 53 75  de = ExitCode.Su
12f0: 63 63 65 73 73 3b 0d 0a 20 20 20 20 20 20 20 20  ccess;..        
1300: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
1310: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1360: 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e  .        #region
1370: 20 50 72 69 76 61 74 65 20 53 75 70 70 6f 72 74   Private Support
1380: 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20   Methods..      
1390: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
13a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69  .        /// Thi
13b0: 73 20 6d 65 74 68 6f 64 20 64 69 73 70 6c 61 79  s method display
13c0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
13d0: 67 65 20 74 6f 20 74 68 65 20 63 6f 6e 73 6f 6c  ge to the consol
13e0: 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20  e and/or..      
13f0: 20 20 2f 2f 2f 20 64 69 73 70 6c 61 79 73 20 74    /// displays t
1400: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
1410: 75 73 61 67 65 20 69 6e 66 6f 72 6d 61 74 69 6f  usage informatio
1420: 6e 20 66 6f 72 20 74 68 69 73 20 74 6f 6f 6c 2e  n for this tool.
1430: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  ..        /// </
1440: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
1450: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
1460: 65 3d 22 6d 65 73 73 61 67 65 22 3e 0d 0a 20 20  e="message">..  
1470: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 65 72        /// The er
1480: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 64  ror message to d
1490: 69 73 70 6c 61 79 2c 20 69 66 20 61 6e 79 2e 0d  isplay, if any..
14a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
14b0: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
14c0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
14d0: 75 73 61 67 65 22 3e 0d 0a 20 20 20 20 20 20 20  usage">..       
14e0: 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 74 6f   /// Non-zero to
14f0: 20 64 69 73 70 6c 61 79 20 74 68 65 20 63 6f 6d   display the com
1500: 6d 61 6e 64 20 6c 69 6e 65 20 75 73 61 67 65 20  mand line usage 
1510: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0d 0a 20 20  information...  
1520: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
1530: 6d 3e 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  m>..        priv
1540: 61 74 65 20 73 74 61 74 69 63 20 76 6f 69 64 20  ate static void 
1550: 45 72 72 6f 72 28 0d 0a 20 20 20 20 20 20 20 20  Error(..        
1560: 20 20 20 20 73 74 72 69 6e 67 20 6d 65 73 73 61      string messa
1570: 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge,..           
1580: 20 62 6f 6f 6c 20 75 73 61 67 65 0d 0a 20 20 20   bool usage..   
1590: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
15a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
15b0: 20 20 20 69 66 20 28 6d 65 73 73 61 67 65 20 21     if (message !
15c0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
15d0: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
15e0: 2e 57 72 69 74 65 4c 69 6e 65 28 6d 65 73 73 61  .WriteLine(messa
15f0: 67 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ge);....        
1600: 20 20 20 20 73 74 72 69 6e 67 20 66 69 6c 65 4e      string fileN
1610: 61 6d 65 20 3d 20 50 61 74 68 2e 47 65 74 46 69  ame = Path.GetFi
1620: 6c 65 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20 20  leName(..       
1630: 20 20 20 20 20 20 20 20 20 50 72 6f 63 65 73 73           Process
1640: 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  .GetCurrentProce
1650: 73 73 28 29 2e 4d 61 69 6e 4d 6f 64 75 6c 65 2e  ss().MainModule.
1660: 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20  FileName);....  
1670: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
1680: 65 2e 57 72 69 74 65 4c 69 6e 65 28 53 74 72 69  e.WriteLine(Stri
1690: 6e 67 2e 46 6f 72 6d 61 74 28 22 75 73 61 67 65  ng.Format("usage
16a0: 3a 20 7b 30 7d 20 3c 75 72 69 3e 22 2c 20 66 69  : {0} <uri>", fi
16b0: 6c 65 4e 61 6d 65 29 29 3b 0d 0a 20 20 20 20 20  leName));..     
16c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1710: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1720: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
1730: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
1740: 69 73 20 6d 65 74 68 6f 64 20 61 74 74 65 6d 70  is method attemp
1750: 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
1760: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 70 6f  the file name po
1770: 72 74 69 6f 6e 20 6f 66 20 74 68 65 0d 0a 20 20  rtion of the..  
1780: 20 20 20 20 20 20 2f 2f 2f 20 73 70 65 63 69 66        /// specif
1790: 69 65 64 20 55 52 49 2e 0d 0a 20 20 20 20 20 20  ied URI...      
17a0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
17b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70  ..        /// <p
17c0: 61 72 61 6d 20 6e 61 6d 65 3d 22 75 72 69 22 3e  aram name="uri">
17d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
17e0: 65 20 55 52 49 20 74 6f 20 70 72 6f 63 65 73 73  e URI to process
17f0: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c  ...        /// <
1800: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20  /param>..       
1810: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
1820: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20          /// The 
1830: 66 69 6c 65 20 6e 61 6d 65 20 70 6f 72 74 69 6f  file name portio
1840: 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  n of the specifi
1850: 65 64 20 55 52 49 20 2d 4f 52 2d 20 6e 75 6c 6c  ed URI -OR- null
1860: 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 0d 0a 20   if it cannot.. 
1870: 20 20 20 20 20 20 20 2f 2f 2f 20 62 65 20 64 65         /// be de
1880: 74 65 72 6d 69 6e 65 64 2e 0d 0a 20 20 20 20 20  termined...     
1890: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
18a0: 3e 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  >..        priva
18b0: 74 65 20 73 74 61 74 69 63 20 73 74 72 69 6e 67  te static string
18c0: 20 47 65 74 46 69 6c 65 4e 61 6d 65 28 0d 0a 20   GetFileName(.. 
18d0: 20 20 20 20 20 20 20 20 20 20 20 55 72 69 20 75             Uri u
18e0: 72 69 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ri..            
18f0: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
1900: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 75 72            if (ur
1910: 69 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  i == null)..    
1920: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1930: 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20  rn null;....    
1940: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70          string p
1950: 61 74 68 41 6e 64 51 75 65 72 79 20 3d 20 75 72  athAndQuery = ur
1960: 69 2e 50 61 74 68 41 6e 64 51 75 65 72 79 3b 0d  i.PathAndQuery;.
1970: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1980: 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c  f (String.IsNull
1990: 4f 72 45 6d 70 74 79 28 70 61 74 68 41 6e 64 51  OrEmpty(pathAndQ
19a0: 75 65 72 79 29 29 0d 0a 20 20 20 20 20 20 20 20  uery))..        
19b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
19c0: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
19d0: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 20 3d 20      int index = 
19e0: 70 61 74 68 41 6e 64 51 75 65 72 79 2e 4c 61 73  pathAndQuery.Las
19f0: 74 49 6e 64 65 78 4f 66 28 27 2f 27 29 3b 0d 0a  tIndexOf('/');..
1a00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1a10: 20 28 28 69 6e 64 65 78 20 3c 20 30 29 20 7c 7c   ((index < 0) ||
1a20: 20 28 69 6e 64 65 78 20 3d 3d 20 70 61 74 68 41   (index == pathA
1a30: 6e 64 51 75 65 72 79 2e 4c 65 6e 67 74 68 29 29  ndQuery.Length))
1a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a50: 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a    return null;..
1a60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1a70: 74 75 72 6e 20 70 61 74 68 41 6e 64 51 75 65 72  turn pathAndQuer
1a80: 79 2e 53 75 62 73 74 72 69 6e 67 28 69 6e 64 65  y.Substring(inde
1a90: 78 20 2b 20 31 29 3b 0d 0a 20 20 20 20 20 20 20  x + 1);..       
1aa0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64   }..        #end
1ab0: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
1ac0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1b10: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69       #region Pri
1b20: 76 61 74 65 20 45 76 65 6e 74 20 48 61 6e 64 6c  vate Event Handl
1b30: 65 72 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ers..        ///
1b40: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
1b50: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74      /// This met
1b60: 68 6f 64 20 69 73 20 61 6e 20 65 76 65 6e 74 20  hod is an event 
1b70: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 69 73 20  handler that is 
1b80: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
1b90: 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f  file..        //
1ba0: 2f 20 64 6f 77 6e 6c 6f 61 64 20 63 6f 6d 70 6c  / download compl
1bb0: 65 74 69 6f 6e 20 70 65 72 63 65 6e 74 61 67 65  etion percentage
1bc0: 20 63 68 61 6e 67 65 73 2e 20 20 49 74 20 77 69   changes.  It wi
1bd0: 6c 6c 20 64 69 73 70 6c 61 79 20 70 72 6f 67 72  ll display progr
1be0: 65 73 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ess..        ///
1bf0: 20 6f 6e 20 74 68 65 20 63 6f 6e 73 6f 6c 65 2e   on the console.
1c00: 20 20 53 70 65 63 69 61 6c 20 63 61 72 65 20 69    Special care i
1c10: 73 20 74 61 6b 65 6e 20 74 6f 20 6d 61 6b 65 20  s taken to make 
1c20: 73 75 72 65 20 74 68 61 74 20 70 72 6f 67 72 65  sure that progre
1c30: 73 73 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ss..        /// 
1c40: 65 76 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  events are not d
1c50: 69 73 70 6c 61 79 65 64 20 6f 75 74 2d 6f 66 2d  isplayed out-of-
1c60: 6f 72 64 65 72 2c 20 65 76 65 6e 20 69 66 20 64  order, even if d
1c70: 75 70 6c 69 63 61 74 65 20 61 6e 64 2f 6f 72 0d  uplicate and/or.
1c80: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 6f 75 74  .        /// out
1c90: 2d 6f 66 2d 6f 72 64 65 72 20 65 76 65 6e 74 73  -of-order events
1ca0: 20 61 72 65 20 72 65 63 65 69 76 65 64 2e 0d 0a   are received...
1cb0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75          /// </su
1cc0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20  mmary>..        
1cd0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1ce0: 22 73 65 6e 64 65 72 22 3e 0d 0a 20 20 20 20 20  "sender">..     
1cf0: 20 20 20 2f 2f 2f 20 54 68 65 20 73 6f 75 72 63     /// The sourc
1d00: 65 20 6f 66 20 74 68 65 20 65 76 65 6e 74 2e 0d  e of the event..
1d10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70  .        /// </p
1d20: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 20 20 2f  aram>..        /
1d30: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
1d40: 65 22 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  e">..        ///
1d50: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   Information for
1d60: 20 74 68 65 20 65 76 65 6e 74 20 62 65 69 6e 67   the event being
1d70: 20 70 72 6f 63 65 73 73 65 64 2e 0d 0a 20 20 20   processed...   
1d80: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
1d90: 3e 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  >..        priva
1da0: 74 65 20 73 74 61 74 69 63 20 76 6f 69 64 20 44  te static void D
1db0: 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 65 73 73 43  ownloadProgressC
1dc0: 68 61 6e 67 65 64 28 0d 0a 20 20 20 20 20 20 20  hanged(..       
1dd0: 20 20 20 20 20 6f 62 6a 65 63 74 20 73 65 6e 64       object send
1de0: 65 72 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er,..           
1df0: 20 44 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 65 73   DownloadProgres
1e00: 73 43 68 61 6e 67 65 64 45 76 65 6e 74 41 72 67  sChangedEventArg
1e10: 73 20 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s e..           
1e20: 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20   )..        {.. 
1e30: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 65             if (e
1e40: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
1e50: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1e60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 70 65            int pe
1e70: 72 63 65 6e 74 20 3d 20 65 2e 50 72 6f 67 72 65  rcent = e.Progre
1e80: 73 73 50 65 72 63 65 6e 74 61 67 65 3b 0d 0a 0d  ssPercentage;...
1e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ea0: 20 6c 6f 63 6b 20 28 73 79 6e 63 52 6f 6f 74 29   lock (syncRoot)
1eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ec0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1ed0: 20 20 20 20 20 20 20 20 20 69 66 20 28 70 65 72           if (per
1ee0: 63 65 6e 74 20 3e 20 70 72 65 76 69 6f 75 73 50  cent > previousP
1ef0: 65 72 63 65 6e 74 29 0d 0a 20 20 20 20 20 20 20  ercent)..       
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
1f30: 57 72 69 74 65 28 27 2e 27 29 3b 0d 0a 0d 0a 20  Write('.');.... 
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 20 20 20 20 69 66 20 28 28 70 65 72 63         if ((perc
1f60: 65 6e 74 20 25 20 31 30 29 20 3d 3d 20 30 29 0d  ent % 10) == 0).
1f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e               Con
1f90: 73 6f 6c 65 2e 57 72 69 74 65 28 22 20 7b 30 7d  sole.Write(" {0}
1fa0: 25 20 22 2c 20 70 65 72 63 65 6e 74 29 3b 0d 0a  % ", percent);..
1fb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fc0: 20 20 20 20 20 20 20 20 20 20 70 72 65 76 69 6f            previo
1fd0: 75 73 50 65 72 63 65 6e 74 20 3d 20 70 65 72 63  usPercent = perc
1fe0: 65 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ent;..          
1ff0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2010: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2020: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2030: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
2040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
2080: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d         /// <summ
2090: 61 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ary>..        //
20a0: 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73  / This method is
20b0: 20 61 6e 20 65 76 65 6e 74 20 68 61 6e 64 6c 65   an event handle
20c0: 72 20 74 68 61 74 20 69 73 20 63 61 6c 6c 65 64  r that is called
20d0: 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65 0d 0a   when the file..
20e0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 64 6f 77 6e          /// down
20f0: 6c 6f 61 64 20 68 61 73 20 63 6f 6d 70 6c 65 74  load has complet
2100: 65 64 2c 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ed, successfully
2110: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 2e 20 20   or otherwise.  
2120: 49 74 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20  It will..       
2130: 20 2f 2f 2f 20 64 69 73 70 6c 61 79 20 74 68 65   /// display the
2140: 20 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 20   overall result 
2150: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 6f 77 6e  of the file down
2160: 6c 6f 61 64 20 6f 6e 20 74 68 65 20 63 6f 6e 73  load on the cons
2170: 6f 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ole,..        //
2180: 2f 20 69 6e 63 6c 75 64 69 6e 67 20 61 6e 79 20  / including any 
2190: 3c 73 65 65 20 63 72 65 66 3d 22 45 78 63 65 70  <see cref="Excep
21a0: 74 69 6f 6e 22 20 2f 3e 20 69 6e 66 6f 72 6d 61  tion" /> informa
21b0: 74 69 6f 6e 2c 20 69 66 20 61 70 70 6c 69 63 61  tion, if applica
21c0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ble...        //
21d0: 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d  / The <see cref=
21e0: 22 65 78 69 74 43 6f 64 65 22 20 2f 3e 20 66 69  "exitCode" /> fi
21f0: 65 6c 64 20 69 73 20 63 68 61 6e 67 65 64 20 62  eld is changed b
2200: 79 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  y this method to
2210: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 69 6e  ..        /// in
2220: 64 69 63 61 74 65 20 74 68 65 20 6f 76 65 72 61  dicate the overa
2230: 6c 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  ll result of the
2240: 20 66 69 6c 65 20 64 6f 77 6e 6c 6f 61 64 20 61   file download a
2250: 6e 64 20 74 68 65 20 65 76 65 6e 74 0d 0a 20 20  nd the event..  
2260: 20 20 20 20 20 20 2f 2f 2f 20 77 69 74 68 69 6e        /// within
2270: 20 74 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22   the <see cref="
2280: 64 6f 6e 65 45 76 65 6e 74 22 20 2f 3e 20 66 69  doneEvent" /> fi
2290: 65 6c 64 20 77 69 6c 6c 20 62 65 20 73 69 67 6e  eld will be sign
22a0: 61 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f  aled...        /
22b0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
22c0: 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61         /// <para
22d0: 6d 20 6e 61 6d 65 3d 22 73 65 6e 64 65 72 22 3e  m name="sender">
22e0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
22f0: 65 20 73 6f 75 72 63 65 20 6f 66 20 74 68 65 20  e source of the 
2300: 65 76 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  event...        
2310: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
2320: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
2330: 20 6e 61 6d 65 3d 22 65 22 3e 0d 0a 20 20 20 20   name="e">..    
2340: 20 20 20 20 2f 2f 2f 20 49 6e 66 6f 72 6d 61 74      /// Informat
2350: 69 6f 6e 20 66 6f 72 20 74 68 65 20 65 76 65 6e  ion for the even
2360: 74 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  t being processe
2370: 64 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  d...        /// 
2380: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
2390: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
23a0: 20 76 6f 69 64 20 44 6f 77 6e 6c 6f 61 64 46 69   void DownloadFi
23b0: 6c 65 43 6f 6d 70 6c 65 74 65 64 28 0d 0a 20 20  leCompleted(..  
23c0: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
23d0: 20 73 65 6e 64 65 72 2c 0d 0a 20 20 20 20 20 20   sender,..      
23e0: 20 20 20 20 20 20 41 73 79 6e 63 43 6f 6d 70 6c        AsyncCompl
23f0: 65 74 65 64 45 76 65 6e 74 41 72 67 73 20 65 0d  etedEventArgs e.
2400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
2410: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
2420: 20 20 20 20 20 20 20 69 66 20 28 65 20 21 3d 20         if (e != 
2430: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
2440: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2450: 20 20 20 20 20 20 6c 6f 63 6b 20 28 73 79 6e 63        lock (sync
2460: 52 6f 6f 74 29 0d 0a 20 20 20 20 20 20 20 20 20  Root)..         
2470: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2490: 20 28 70 72 65 76 69 6f 75 73 50 65 72 63 65 6e   (previousPercen
24a0: 74 20 3c 20 31 30 30 29 0d 0a 20 20 20 20 20 20  t < 100)..      
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28    Console.Write(
24d0: 27 20 27 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ' ');..         
24e0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
2500: 65 2e 43 61 6e 63 65 6c 6c 65 64 29 0d 0a 20 20  e.Cancelled)..  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
2520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2530: 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69       Console.Wri
2540: 74 65 4c 69 6e 65 28 22 43 61 6e 63 65 6c 65 64  teLine("Canceled
2550: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
2560: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 20             lock 
2570: 28 73 79 6e 63 52 6f 6f 74 29 0d 0a 20 20 20 20  (syncRoot)..    
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
25a0: 20 20 20 20 20 20 20 20 20 20 20 65 78 69 74 43             exitC
25b0: 6f 64 65 20 3d 20 45 78 69 74 43 6f 64 65 2e 44  ode = ExitCode.D
25c0: 6f 77 6e 6c 6f 61 64 43 61 6e 63 65 6c 65 64 3b  ownloadCanceled;
25d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
25f0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2600: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
2610: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2620: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2630: 20 20 20 20 20 20 20 20 20 45 78 63 65 70 74 69           Excepti
2640: 6f 6e 20 65 72 72 6f 72 20 3d 20 65 2e 45 72 72  on error = e.Err
2650: 6f 72 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  or;....         
2660: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 65             if (e
2670: 72 72 6f 72 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  rror != null).. 
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
26b0: 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28  nsole.WriteLine(
26c0: 22 45 72 72 6f 72 3a 20 7b 30 7d 22 2c 20 65 72  "Error: {0}", er
26d0: 72 6f 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ror);....       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 6c 6f 63 6b 20 28 73 79 6e 63 52 6f 6f 74 29   lock (syncRoot)
2700: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2710: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 20 20 20 20 65 78 69 74 43 6f 64           exitCod
2740: 65 20 3d 20 45 78 69 74 43 6f 64 65 2e 44 6f 77  e = ExitCode.Dow
2750: 6e 6c 6f 61 64 45 72 72 6f 72 3b 0d 0a 20 20 20  nloadError;..   
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2780: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
27e0: 57 72 69 74 65 4c 69 6e 65 28 22 44 6f 6e 65 22  WriteLine("Done"
27f0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
2800: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2810: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2820: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2830: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
2840: 6f 6e 65 45 76 65 6e 74 20 21 3d 20 6e 75 6c 6c  oneEvent != null
2850: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
2860: 20 20 20 64 6f 6e 65 45 76 65 6e 74 2e 53 65 74     doneEvent.Set
2870: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ();..        }..
2880: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
2890: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
28a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28e0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
28f0: 20 23 72 65 67 69 6f 6e 20 50 72 6f 67 72 61 6d   #region Program
2900: 20 45 6e 74 72 79 20 50 6f 69 6e 74 0d 0a 20 20   Entry Point..  
2910: 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
2920: 72 79 3e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ry>..        ///
2930: 20 54 68 69 73 20 69 73 20 74 68 65 20 65 6e 74   This is the ent
2940: 72 79 2d 70 6f 69 6e 74 20 66 6f 72 20 74 68 69  ry-point for thi
2950: 73 20 74 6f 6f 6c 2e 20 20 49 74 20 68 61 6e 64  s tool.  It hand
2960: 6c 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 74  les processing t
2970: 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  he..        /// 
2980: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
2990: 75 6d 65 6e 74 73 2c 20 73 65 74 74 69 6e 67 20  uments, setting 
29a0: 75 70 20 74 68 65 20 77 65 62 20 63 6c 69 65 6e  up the web clien
29b0: 74 2c 20 64 6f 77 6e 6c 6f 61 64 69 6e 67 20 74  t, downloading t
29c0: 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  he..        /// 
29d0: 66 69 6c 65 2c 20 61 6e 64 20 73 61 76 69 6e 67  file, and saving
29e0: 20 69 74 20 74 6f 20 74 68 65 20 66 69 6c 65 20   it to the file 
29f0: 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 20  system...       
2a00: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
2a10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  .        /// <pa
2a20: 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e  ram name="args">
2a30: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68  ..        /// Th
2a40: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61  e command line a
2a50: 72 67 75 6d 65 6e 74 73 2e 0d 0a 20 20 20 20 20  rguments...     
2a60: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
2a70: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65  .        /// <re
2a80: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 20 20  turns>..        
2a90: 2f 2f 2f 20 5a 65 72 6f 20 75 70 6f 6e 20 73 75  /// Zero upon su
2aa0: 63 63 65 73 73 3b 20 6e 6f 6e 2d 7a 65 72 6f 20  ccess; non-zero 
2ab0: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 54 68 69  on failure.  Thi
2ac0: 73 20 77 69 6c 6c 20 62 65 20 6f 6e 65 20 6f 66  s will be one of
2ad0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 2f 2f   the..        //
2ae0: 2f 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68  / values from th
2af0: 65 20 3c 73 65 65 20 63 72 65 66 3d 22 45 78 69  e <see cref="Exi
2b00: 74 43 6f 64 65 22 20 2f 3e 20 65 6e 75 6d 65 72  tCode" /> enumer
2b10: 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ation...        
2b20: 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  /// </returns>..
2b30: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
2b40: 73 74 61 74 69 63 20 69 6e 74 20 4d 61 69 6e 28  static int Main(
2b50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
2b60: 72 69 6e 67 5b 5d 20 61 72 67 73 0d 0a 20 20 20  ring[] args..   
2b70: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
2b80: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2b90: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2ba0: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 53 61 6e 69     // NOTE: Sani
2bb0: 74 79 20 63 68 65 63 6b 20 74 68 65 20 63 6f 6d  ty check the com
2bc0: 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65  mand line argume
2bd0: 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  nts...          
2be0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
2bf0: 20 20 69 66 20 28 61 72 67 73 20 3d 3d 20 6e 75    if (args == nu
2c00: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
2c10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c20: 20 20 20 20 45 72 72 6f 72 28 6e 75 6c 6c 2c 20      Error(null, 
2c30: 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  true);..        
2c40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
2c50: 69 6e 74 29 45 78 69 74 43 6f 64 65 2e 4d 69 73  int)ExitCode.Mis
2c60: 73 69 6e 67 41 72 67 73 3b 0d 0a 20 20 20 20 20  singArgs;..     
2c70: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2c80: 20 20 20 20 20 20 20 20 69 66 20 28 61 72 67 73          if (args
2c90: 2e 4c 65 6e 67 74 68 20 21 3d 20 31 29 0d 0a 20  .Length != 1).. 
2ca0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 72                Er
2cc0: 72 6f 72 28 6e 75 6c 6c 2c 20 74 72 75 65 29 3b  ror(null, true);
2cd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ce0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 45 78    return (int)Ex
2cf0: 69 74 43 6f 64 65 2e 57 72 6f 6e 67 4e 75 6d 41  itCode.WrongNumA
2d00: 72 67 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rgs;..          
2d10: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2d20: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2d30: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 41 74 74 65     // NOTE: Atte
2d40: 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 74  mpt to convert t
2d50: 68 65 20 66 69 72 73 74 20 28 61 6e 64 20 6f 6e  he first (and on
2d60: 6c 79 29 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ly) command line
2d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
2d80: 20 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74 20         argument 
2d90: 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 55  to an absolute U
2da0: 52 49 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  RI...           
2db0: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
2dc0: 20 55 72 69 20 75 72 69 3b 0d 0a 0d 0a 20 20 20   Uri uri;....   
2dd0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 55 72           if (!Ur
2de0: 69 2e 54 72 79 43 72 65 61 74 65 28 61 72 67 73  i.TryCreate(args
2df0: 5b 30 5d 2c 20 55 72 69 4b 69 6e 64 2e 41 62 73  [0], UriKind.Abs
2e00: 6f 6c 75 74 65 2c 20 6f 75 74 20 75 72 69 29 29  olute, out uri))
2e10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
2e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e30: 20 45 72 72 6f 72 28 22 43 6f 75 6c 64 20 6e 6f   Error("Could no
2e40: 74 20 63 72 65 61 74 65 20 61 62 73 6f 6c 75 74  t create absolut
2e50: 65 20 55 52 49 20 66 72 6f 6d 20 61 72 67 75 6d  e URI from argum
2e60: 65 6e 74 2e 22 2c 20 66 61 6c 73 65 29 3b 0d 0a  ent.", false);..
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 72 65 74 75 72 6e 20 28 69 6e 74 29 45 78 69 74  return (int)Exit
2e90: 43 6f 64 65 2e 42 61 64 55 72 69 3b 0d 0a 20 20  Code.BadUri;..  
2ea0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
2ed0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
2ee0: 78 74 72 61 63 74 20 74 68 65 20 66 69 6c 65 20  xtract the file 
2ef0: 6e 61 6d 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20  name portion of 
2f00: 74 68 65 20 55 52 49 20 77 65 0d 0a 20 20 20 20  the URI we..    
2f10: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
2f20: 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e 0d 0a   just created...
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
2f50: 6e 67 20 66 69 6c 65 4e 61 6d 65 20 3d 20 47 65  ng fileName = Ge
2f60: 74 46 69 6c 65 4e 61 6d 65 28 75 72 69 29 3b 0d  tFileName(uri);.
2f70: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2f80: 66 20 28 66 69 6c 65 4e 61 6d 65 20 3d 3d 20 6e  f (fileName == n
2f90: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
2fa0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2fb0: 20 20 20 20 20 45 72 72 6f 72 28 22 43 6f 75 6c       Error("Coul
2fc0: 64 20 6e 6f 74 20 65 78 74 72 61 63 74 20 74 68  d not extract th
2fd0: 65 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  e file name from
2fe0: 20 74 68 65 20 55 52 49 2e 22 2c 20 66 61 6c 73   the URI.", fals
2ff0: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
3000: 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74       return (int
3010: 29 45 78 69 74 43 6f 64 65 2e 42 61 64 46 69 6c  )ExitCode.BadFil
3020: 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20  eName;..        
3030: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
3040: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
3050: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72       // NOTE: Gr
3060: 61 62 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ab the temporary
3070: 20 70 61 74 68 20 73 65 74 75 70 20 66 6f 72 20   path setup for 
3080: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 49  this process.  I
3090: 66 20 69 74 20 69 73 0d 0a 20 20 20 20 20 20 20  f it is..       
30a0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 75 6e       //       un
30b0: 61 76 61 69 6c 61 62 6c 65 2c 20 77 65 20 77 69  available, we wi
30c0: 6c 6c 20 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e  ll not continue.
30d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
30e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
30f0: 72 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 3d  ring directory =
3100: 20 50 61 74 68 2e 47 65 74 54 65 6d 70 50 61 74   Path.GetTempPat
3110: 68 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  h();....        
3120: 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49      if (String.I
3130: 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 69 72  sNullOrEmpty(dir
3140: 65 63 74 6f 72 79 29 20 7c 7c 0d 0a 20 20 20 20  ectory) ||..    
3150: 20 20 20 20 20 20 20 20 20 20 20 20 21 44 69 72              !Dir
3160: 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28 64 69  ectory.Exists(di
3170: 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20 20 20  rectory))..     
3180: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3190: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 28            Error(
31a0: 22 54 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63  "Temporary direc
31b0: 74 6f 72 79 20 69 73 20 69 6e 76 61 6c 69 64 20  tory is invalid 
31c0: 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 22  or unavailable."
31d0: 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20  , false);..     
31e0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
31f0: 6e 20 28 69 6e 74 29 45 78 69 74 43 6f 64 65 2e  n (int)ExitCode.
3200: 42 61 64 54 65 6d 70 50 61 74 68 3b 0d 0a 20 20  BadTempPath;..  
3210: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
3220: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
3230: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
3250: 73 69 6e 67 20 28 57 65 62 43 6c 69 65 6e 74 20  sing (WebClient 
3260: 77 65 62 43 6c 69 65 6e 74 20 3d 20 6e 65 77 20  webClient = new 
3270: 57 65 62 43 6c 69 65 6e 74 28 29 29 0d 0a 20 20  WebClient())..  
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
3290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32a0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
32c0: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
32d0: 20 65 76 65 6e 74 20 75 73 65 64 20 74 6f 20 73   event used to s
32e0: 69 67 6e 61 6c 20 63 6f 6d 70 6c 65 74 69 6f 6e  ignal completion
32f0: 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20   of the..       
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
3310: 20 20 20 20 20 20 66 69 6c 65 20 64 6f 77 6e 6c        file downl
3320: 6f 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  oad...          
3330: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 64 6f 6e 65 45 76 65 6e 74 20 3d 20 6e 65    doneEvent = ne
3360: 77 20 4d 61 6e 75 61 6c 52 65 73 65 74 45 76 65  w ManualResetEve
3370: 6e 74 28 66 61 6c 73 65 29 3b 0d 0a 0d 0a 20 20  nt(false);....  
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
33a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
33b0: 45 3a 20 48 6f 6f 6b 75 70 20 74 68 65 20 65 76  E: Hookup the ev
33c0: 65 6e 74 20 68 61 6e 64 6c 65 72 73 20 77 65 20  ent handlers we 
33d0: 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 20 74 68  care about on th
33e0: 65 20 77 65 62 0d 0a 20 20 20 20 20 20 20 20 20  e web..         
33f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
3400: 20 20 20 20 63 6c 69 65 6e 74 2e 20 20 54 68 65      client.  The
3410: 73 65 20 61 72 65 20 6e 65 63 65 73 73 61 72 79  se are necessary
3420: 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69 6c   because the fil
3430: 65 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20  e is..          
3440: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
3450: 20 20 20 64 6f 77 6e 6c 6f 61 64 65 64 20 61 73     downloaded as
3460: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 2e 0d 0a 20  ynchronously... 
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
3490: 20 20 20 20 20 20 20 20 20 20 20 77 65 62 43 6c             webCl
34a0: 69 65 6e 74 2e 44 6f 77 6e 6c 6f 61 64 50 72 6f  ient.DownloadPro
34b0: 67 72 65 73 73 43 68 61 6e 67 65 64 20 2b 3d 0d  gressChanged +=.
34c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34d0: 20 20 20 20 20 20 20 20 20 6e 65 77 20 44 6f 77           new Dow
34e0: 6e 6c 6f 61 64 50 72 6f 67 72 65 73 73 43 68 61  nloadProgressCha
34f0: 6e 67 65 64 45 76 65 6e 74 48 61 6e 64 6c 65 72  ngedEventHandler
3500: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
3520: 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 65 73 73 43  ownloadProgressC
3530: 68 61 6e 67 65 64 29 3b 0d 0a 0d 0a 20 20 20 20  hanged);....    
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 77 65 62 43 6c 69 65 6e 74 2e 44 6f 77 6e 6c 6f  webClient.Downlo
3560: 61 64 46 69 6c 65 43 6f 6d 70 6c 65 74 65 64 20  adFileCompleted 
3570: 2b 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  +=..            
3580: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20              new 
3590: 41 73 79 6e 63 43 6f 6d 70 6c 65 74 65 64 45 76  AsyncCompletedEv
35a0: 65 6e 74 48 61 6e 64 6c 65 72 28 0d 0a 20 20 20  entHandler(..   
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 20 44 6f 77 6e 6c 6f 61           Downloa
35d0: 64 46 69 6c 65 43 6f 6d 70 6c 65 74 65 64 29 3b  dFileCompleted);
35e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
35f0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 2f 2f 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74  // NOTE: Build t
3620: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
3630: 65 64 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  ed path and file
3640: 20 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20   name,..        
3650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
3660: 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20       within the 
3670: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
3680: 6f 72 79 2c 20 77 68 65 72 65 20 74 68 65 20 66  ory, where the f
3690: 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  ile to..        
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
36b0: 20 20 20 20 20 62 65 20 64 6f 77 6e 6c 6f 61 64       be download
36c0: 65 64 20 77 69 6c 6c 20 62 65 20 73 61 76 65 64  ed will be saved
36d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
36e0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
3700: 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e 43  ileName = Path.C
3710: 6f 6d 62 69 6e 65 28 64 69 72 65 63 74 6f 72 79  ombine(directory
3720: 2c 20 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  , fileName);....
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
3750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
3760: 4f 54 45 3a 20 49 66 20 74 68 65 20 66 69 6c 65  OTE: If the file
3770: 20 6e 61 6d 65 20 61 6c 72 65 61 64 79 20 65 78   name already ex
3780: 69 73 74 73 20 28 69 6e 20 74 68 65 20 74 65 6d  ists (in the tem
3790: 70 6f 72 61 72 79 29 0d 0a 20 20 20 20 20 20 20  porary)..       
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
37b0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 2c        directory,
37c0: 20 64 65 6c 65 74 65 20 69 74 2e 0d 0a 20 20 20   delete it...   
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
37f0: 20 20 20 20 20 20 20 20 20 2f 2f 20 54 4f 44 4f           // TODO
3800: 3a 20 50 65 72 68 61 70 73 20 61 6e 20 65 72 72  : Perhaps an err
3810: 6f 72 20 73 68 6f 75 6c 64 20 62 65 20 72 61 69  or should be rai
3820: 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64  sed here instead
3830: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ?..             
3840: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3860: 66 20 28 46 69 6c 65 2e 45 78 69 73 74 73 28 66  f (File.Exists(f
3870: 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20  ileName))..     
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 46 69 6c 65 2e 44 65 6c 65 74 65 28 66     File.Delete(f
38a0: 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  ileName);....   
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
38d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
38e0: 3a 20 41 66 74 65 72 20 6b 69 63 6b 69 6e 67 20  : After kicking 
38f0: 6f 66 66 20 74 68 65 20 61 73 79 6e 63 68 72 6f  off the asynchro
3900: 6e 6f 75 73 20 66 69 6c 65 20 64 6f 77 6e 6c 6f  nous file downlo
3910: 61 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ad..            
3920: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
3930: 20 70 72 6f 63 65 73 73 2c 20 77 61 69 74 20 5b   process, wait [
3940: 66 6f 72 65 76 65 72 5d 20 75 6e 74 69 6c 20 74  forever] until t
3950: 68 65 20 22 64 6f 6e 65 22 20 65 76 65 6e 74 20  he "done" event 
3960: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
3970: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
3980: 20 73 69 67 6e 61 6c 65 64 2e 0d 0a 20 20 20 20   signaled...    
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39a0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
39b0: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
39c0: 57 72 69 74 65 4c 69 6e 65 28 0d 0a 20 20 20 20  WriteLine(..    
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 20 20 20 20 22 44 6f 77 6e 6c 6f 61 64 69 6e 67      "Downloading
39f0: 20 5c 22 7b 30 7d 5c 22 20 74 6f 20 5c 22 7b 31   \"{0}\" to \"{1
3a00: 7d 5c 22 2e 2e 2e 22 2c 20 75 72 69 2c 20 66 69  }\"...", uri, fi
3a10: 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20  leName);....    
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 77 65 62 43 6c 69 65 6e 74 2e 44 6f 77 6e 6c 6f  webClient.Downlo
3a40: 61 64 46 69 6c 65 41 73 79 6e 63 28 75 72 69 2c  adFileAsync(uri,
3a50: 20 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 20 20 20   fileName);..   
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 20 64 6f 6e 65 45 76 65 6e 74 2e 57 61 69 74 4f   doneEvent.WaitO
3a80: 6e 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ne();..         
3a90: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
3ab0: 20 28 73 79 6e 63 52 6f 6f 74 29 0d 0a 20 20 20   (syncRoot)..   
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
3af0: 65 78 69 74 43 6f 64 65 3b 0d 0a 20 20 20 20 20  exitCode;..     
3b00: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3b10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3b20: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
3b30: 45 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20  Exception e)..  
3b40: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
3b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3b70: 20 2f 2f 20 4e 4f 54 45 3a 20 41 6e 20 65 78 63   // NOTE: An exc
3b80: 65 70 74 69 6f 6e 20 77 61 73 20 63 61 75 67 68  eption was caugh
3b90: 74 2e 20 20 52 65 70 6f 72 74 20 69 74 20 76 69  t.  Report it vi
3ba0: 61 20 74 68 65 20 63 6f 6e 73 6f 6c 65 0d 0a 20  a the console.. 
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3bc0: 2f 20 20 20 20 20 20 20 61 6e 64 20 72 65 74 75  /       and retu
3bd0: 72 6e 20 66 61 69 6c 75 72 65 2e 0d 0a 20 20 20  rn failure...   
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
3bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3c00: 20 45 72 72 6f 72 28 65 2e 54 6f 53 74 72 69 6e   Error(e.ToStrin
3c10: 67 28 29 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20  g(), false);..  
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
3c30: 74 75 72 6e 20 28 69 6e 74 29 45 78 69 74 43 6f  turn (int)ExitCo
3c40: 64 65 2e 45 78 63 65 70 74 69 6f 6e 3b 0d 0a 20  de.Exception;.. 
3c50: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3c60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
3c70: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 20 20 20   #endregion..   
3c80: 20 7d 0d 0a 7d 0d 0a                              }..}..