/// <summary>
        /// creating response stream
        /// </summary>
        /// <param name="resourceInfo">downloading link</param>
        /// <param name="startRangePosition">range start position</param>
        /// <param name="endRangePosition">range end position</param>
        /// <returns></returns>
        public Stream CreateResponseStream(ResourceInfo resourceInfo, int startRangePosition, int endRangePosition)
        {
            if (resourceInfo != null)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resourceInfo.Url);
                request.Timeout = 30000;

                if (startRangePosition != 0)
                {
                    if (endRangePosition == 0)
                    {
                        request.AddRange(startRangePosition);
                    }
                    else
                    {
                        request.AddRange(startRangePosition, endRangePosition);
                    }
                }

                WebResponse response = request.GetResponse();

                return response.GetResponseStream();
            }
            else
                return null;
        }
        public RemoteFileInfo GetFileInfo(ResourceInfo resourceInfo, out System.IO.Stream stream)
        {
            RemoteFileInfo result = proxy.GetFileInfo(resourceInfo, out stream);

            if (stream != null)
            {
                stream = new LimitedSpeedProxyStream(stream, speedLimit);
            }

            return result;
        }
        /// <summary>
        /// Method for getting file information
        /// </summary>
        /// <param name="resourceInfo">link</param>
        /// <param name="stream">download stream</param>
        /// <returns>information about downloading file</returns>
        public RemoteFileInfo GetFileInfo(ResourceInfo resourceInfo, out Stream stream)
        {
            if (resourceInfo != null)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resourceInfo.Url);
                request.Timeout = 30000;

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                RemoteFileInfo result = new RemoteFileInfo();
                result.LastModified = response.LastModified;
                result.FileSize = response.ContentLength;
                result.AcceptRanges = string.Compare(response.Headers["Accept-Ranges"], "bytes", true, CultureInfo.CurrentCulture) == 0;

                stream = response.GetResponseStream();

                return result;
            }
            else
            {
                stream = null;
                return null;
            }
        }
 public static ResourceInfo FromUrl(
     string url,
     bool authenticate,
     string logOn,
     string password)
 {
     ResourceInfo ri = new ResourceInfo();
     ri.Url = url;
     ri.Authenticate = authenticate;
     ri.LogOn = logOn;
     ri.Password = password;
     return ri;
 }
 public static ResourceInfo FromUrl(string url)
 {
     ResourceInfo ri = new ResourceInfo();
     ri.Url = url;
     return ri;
 }
 public System.IO.Stream CreateResponseStream(ResourceInfo resourceInfo, int startRangePosition, int endRangePosition)
 {
     return new LimitedSpeedProxyStream(proxy.CreateResponseStream(resourceInfo, startRangePosition, endRangePosition), speedLimit);
 }
 private static string GetFileName(ResourceInfo mirror)
 {
     Uri uri = new Uri(mirror.Url);
     var fileName = uri.Segments[uri.Segments.Length - 1];
     return HttpUtility.UrlDecode(fileName).Replace("/", "\\");
 }
 /// <summary>
 /// Add one mirror to VM
 /// </summary>
 /// <param name="mirrorToAdd">miror to add</param>
 public void AddMirror(string mirrorToAdd)
 {
     ResourceInfo ri = new ResourceInfo();
     ri.Url = mirrorToAdd;
     this.mirror = ri;
     NotifyPropertyChanged("Mirror");
 }
 /// <summary>
 /// Adding mirror to mirror list of VM
 /// </summary>
 /// <param name="mirrorToAdd">mirror to add</param>
 public void AddMirrorToList(string mirrorToAdd)
 {
     ResourceInfo ri = new ResourceInfo();
     ri.Url = mirrorToAdd;
     mirrors.Add(ri);
     NotifyPropertyChanged("Mirrors");
 }
        /// <summary>
        /// Add new download
        /// </summary>
        /// <param name="mirror">download mirror</param>
        public void AddDownload(string mirror)
        {
            try
            {
                ResourceInfo info = new ResourceInfo();
                info.Url = mirror;
                string fileName = string.Empty;
                fileName = info != null
                    ? GetFileName(info)
                    : string.Empty;

                Downloader fileToDownload = new Downloader(
                    info,
                    null,
                    Settings.Default.DefaultSavePathDocuments,
                    fileName);
                DownloaderManager.Instance.Add(fileToDownload, true);

            }
            catch (ArgumentException)
            {

            }
        }
        public Downloader Add(
            ResourceInfo resourceInfo, 
            ResourceInfo[] mirrors, 
            string localFile, 
            List<FileSegment> segments, 
            RemoteFileInfo remoteInfo,  
            bool autoStart, 
            DateTime createdDateTime,
            string fileName)
        {
            Downloader d = new Downloader(resourceInfo, mirrors, localFile, segments, remoteInfo, createdDateTime, fileName);
            Add(d, autoStart);

            return d;
        }
        public Downloader Add(ResourceInfo resourceInfo, ResourceInfo[] mirrors, string localFile, bool autoStart, string fileName)
        {
            Downloader d = new Downloader(resourceInfo, mirrors, localFile, fileName);
            Add(d, autoStart);

            return d;
        }