Example #1
0
        public void WaitOne(DDownloadProgress aProgress)
        {
            lock (iLock)
            {
                iProgressList.Add(aProgress);
                aProgress(iProgress);
            }

            iEvent.WaitOne();
        }
Example #2
0
        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);
        }