public void WaitOne(DDownloadProgress aProgress) { lock (iLock) { iProgressList.Add(aProgress); aProgress(iProgress); } iEvent.WaitOne(); }
public bool Download(DDownloadProgress aProgress) { lock (iLock) { iProgressList.Add(aProgress); aProgress(0); } try { HttpWebRequest headRequest = (HttpWebRequest)WebRequest.Create(iUri); headRequest.Method = "HEAD"; int fileSize = 0; using (HttpWebResponse headResponse = (HttpWebResponse)headRequest.GetResponse()) { fileSize = Int32.Parse(headResponse.Headers[HttpResponseHeader.ContentLength]); } string tempFilename = Path.Combine(iCachePath, Path.GetFileNameWithoutExtension(iUri.AbsolutePath) + ".part"); string filename = Path.Combine(iCachePath, Path.GetFileName(iUri.AbsolutePath)); int startingPoint = 0; if (File.Exists(tempFilename)) { startingPoint = (int)(new FileInfo(tempFilename).Length); } iProgress = (uint)((startingPoint / (float)fileSize) * 100.0f); lock (iLock) { foreach (DDownloadProgress d in iProgressList) { d(iProgress); } } lock (iLock) { if (iDisposed) { return(false); } } if (fileSize > startingPoint) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(iUri); request.Credentials = CredentialCache.DefaultCredentials; if (request.Proxy != null) { request.Proxy.Credentials = CredentialCache.DefaultCredentials; } request.AddRange(startingPoint); using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream stream = response.GetResponseStream()) { FileMode mode = FileMode.Append; if (startingPoint == 0 || response.StatusCode != HttpStatusCode.PartialContent) { mode = FileMode.Create; } int total = startingPoint; using (Stream file = new FileStream(tempFilename, mode, FileAccess.Write, FileShare.ReadWrite)) { byte[] buffer = new byte[2048]; // read in 2K chuncks int bytes; do { bytes = stream.Read(buffer, 0, buffer.Length); file.Write(buffer, 0, bytes); total += bytes; uint oldProgress = iProgress; iProgress = (uint)((total / (float)fileSize) * 100.0f); if (iProgress != oldProgress) { lock (iLock) { if (iDisposed) { return(false); } foreach (DDownloadProgress d in iProgressList) { d(iProgress); } } } }while(bytes > 0); } } } } File.Move(tempFilename, filename); return(true); } catch (Exception e) { UserLog.WriteLine("Failed to download " + iUri + ":" + e); } return(false); }