private void EnsureDownloader() { if (_byteRangeDownloader == null) { _byteRangeDownloader = new ByteRangeDownloader(_uri, _tempFileStream, _readEventHandles[(int)ReadEvent.ByteRangeReadEvent].SafeWaitHandle, _tempFileMutex); // Local assert to allow Proxy get/set under partial trust new WebPermission(PermissionState.Unrestricted).Assert(); // Blessed try { _byteRangeDownloader.Proxy = _originalRequest.Proxy; } finally { WebPermission.RevertAssert(); } _byteRangeDownloader.Credentials = _originalRequest.Credentials; _byteRangeDownloader.CachePolicy = _originalRequest.CachePolicy; _byteRangesAvailable = new ArrayList(); // byte ranges that are downloaded } }
void IByteRangeDownloaderService.InitializeByteRangeDownloader( String url, String tempFile, SafeWaitHandle eventHandle) { if (url == null) { throw new ArgumentNullException("url"); } if(tempFile == null) { throw new ArgumentNullException("tempFile"); } if(eventHandle == null) { throw new ArgumentNullException("eventHandle"); } if (eventHandle.IsInvalid || eventHandle.IsClosed) { throw new ArgumentException(SR.Get(SRID.InvalidEventHandle), "eventHandle"); } Uri requestedUri = new Uri(url, UriKind.Absolute); if(tempFile.Length <= 0) { throw new ArgumentException(SR.Get(SRID.InvalidTempFileName), "tempFile"); } ByteRangeDownloader loader = new ByteRangeDownloader(requestedUri, tempFile, eventHandle); // We defined _downloader as Object for performance reasons. If we define it as ByteRangeDownloader the whole // class will be loaded although it might not be used at all. By declaring it as Object we can prevent it // from being loaded. This technique is used in other areas. _downloader = (Object) loader; }