protected override void BeginRequest(RetryQueueRequest request)
 {
     //Adding an intentional delay here to work around a known timing issue
     //with the SSME.  If this is called too soon after initialization the
     //request will be aborted with no indication raised from the SSME.
     //TODO: Remove this workaround once the SSME has been fixed.
     DispatcherTimer timer = new DispatcherTimer();
     timer.Interval = TimeSpan.FromMilliseconds(250);
     EventHandler tickHandler = null;
     tickHandler = (s, e) =>
         {
             Segment segment = null;
             List<StreamInfo> streams = null;
             var streamSelectionRequest = request as StreamSelectionRequest;
             if (streamSelectionRequest != null)
             {
                 streams = streamSelectionRequest.Streams.Select(i => i.StreamInfo).ToList();
                 segment = streamSelectionRequest.Segment;
             }
             else
             {
                 var streamModifyRequest = request as StreamModifyRequest;
                 if (streamModifyRequest != null)
                 {
                     streams = streamModifyRequest.Streams.Select(i => i.StreamInfo).ToList();
                     segment = streamModifyRequest.Segment;
                 }
             }                    
             segment.SegmentInfo.SelectStreamsAsync(streams, request);
             timer.Tick -= tickHandler;
             timer.Stop();
         };
     timer.Tick += tickHandler;
     timer.Start();
 }
        private void AttemptToStartRequests()
        {
            lock (_threadSync)
            {
                while (HasPendingRequests && _activeRequests.Count < MaximumConcurrentRequests)
                {
                    RetryQueueRequest nextItem = NextRequest();
                    if (nextItem != null)
                    {
                        nextItem.LastAttemptStarted = DateTime.Now;
                        _activeRequests.Add(nextItem);

                        BeginRequest(nextItem);

                        if (!_timeoutMonitor.IsEnabled)
                        {
                            _timeoutMonitor.Start();
                        }
                    }
                    else
                    {
                        if (!_timeoutMonitor.IsEnabled)
                        {
                            _timeoutMonitor.Start();
                        }
                        break;
                    }
                }
            }
        }
        protected void NotifyRequestSuccessful(RetryQueueRequest request)
        {
            lock (_threadSync)
            {
                if (_activeRequests.Contains(request))
                {
                    _activeRequests.Remove(request);
                }
            }

            OnRequestCompleted(request);
            AttemptToStartRequests();
        }
        protected void NotifyRequestSuccessful(RetryQueueRequest request)
        {
            lock (_threadSync)
            {
                if (_activeRequests.Contains(request))
                {
                    _activeRequests.Remove(request);
                }
            }

            OnRequestCompleted(request);
            AttemptToStartRequests();
        }
 protected virtual void CancelRequest(RetryQueueRequest request) { }
 protected virtual void OnRequestCompleted(RetryQueueRequest request) { }
 protected virtual void OnRequestExceededMaximumRetryAttempts(RetryQueueRequest request) { }
 protected virtual void OnRetryingRequest(RetryQueueRequest request) { }
 protected abstract void BeginRequest(RetryQueueRequest request);
        protected override void CancelRequest(RetryQueueRequest request)
        {
            base.CancelRequest(request);

            var offlineTask = request as OfflineTask;

            if (offlineTask != null && offlineTask.DownloadWebClient != null)
            {
                offlineTask.DownloadWebClient.CancelAsync();
            }
        }
        protected override void OnRequestExceededMaximumRetryAttempts(RetryQueueRequest request)
        {
            base.OnRequestExceededMaximumRetryAttempts(request);

            var downloadRequest = request as DownloadRequest;
            if (DownloadExceededMaximumRetries != null && downloadRequest != null)
            {
                DownloadExceededMaximumRetries(this, downloadRequest.MediaTrack, downloadRequest.ChunkTimestamp);
            }
        }
 protected void AddRequest(RetryQueueRequest request)
 {
     _requestQueue.Enqueue(request);
     NotifyRequestAdded();
 }
        protected override void OnRetryingRequest(RetryQueueRequest request)
        {
            base.OnRetryingRequest(request);

            var streamSelectionRequest = request as IStreamSelectionRequest;
            if (RetryingStreamSelection != null && streamSelectionRequest != null)
            {
                RetryingStreamSelection(this, streamSelectionRequest.Segment, streamSelectionRequest.Streams);
            }
        }
 protected virtual void CancelRequest(RetryQueueRequest request)
 {
 }
 protected virtual void OnRequestCompleted(RetryQueueRequest request)
 {
 }
 protected virtual void OnRequestExceededMaximumRetryAttempts(RetryQueueRequest request)
 {
 }
 protected virtual void OnRetryingRequest(RetryQueueRequest request)
 {
 }
        protected override void BeginRequest(RetryQueueRequest request)
        {
            var downloadRequest = request as DownloadRequest;
            if (downloadRequest != null)
            {
                _rateMonitor.UpdateRate();
                if (_rateMonitor.CurrentRate > _maximumRequestRate)
                {
                    var delay = _rateMonitor.RecommendDelay(_maximumRequestRate);
                    var timer = new DispatcherTimer
                    {
                        Interval = delay
                    };

                    EventHandler tickHandler = null;
                    tickHandler = (s, e) =>
                    {
                        timer.Tick -= tickHandler;
                        timer.Stop();
                        downloadRequest.MediaTrack.TrackInfo.BeginGetChunk(
                            downloadRequest.ChunkTimestamp, BeginGetChunk_Completed,
                            downloadRequest);
                    };
                    timer.Tick += tickHandler;
                    timer.Start();
                }
                else
                {
                    downloadRequest.MediaTrack.TrackInfo.BeginGetChunk(downloadRequest.ChunkTimestamp, BeginGetChunk_Completed, downloadRequest);
                }
            }
        }
        protected override void OnRequestExceededMaximumRetryAttempts(RetryQueueRequest request)
        {
            base.OnRequestExceededMaximumRetryAttempts(request);

            var streamSelectionRequest = request as IStreamSelectionRequest;
            if (StreamSelectionExceededMaximumRetries != null && streamSelectionRequest != null)
            {
                StreamSelectionExceededMaximumRetries(this, streamSelectionRequest.Segment, streamSelectionRequest.Streams);
            }
        }
        protected override void OnRetryingRequest(RetryQueueRequest request)
        {
            base.OnRetryingRequest(request);

            var downloadRequest = request as DownloadRequest;
            if (RetryingDownload != null && downloadRequest != null)
            {
                RetryingDownload(this, downloadRequest.MediaTrack, downloadRequest.ChunkTimestamp);
            }
        }
 protected void AddRequest(RetryQueueRequest request)
 {
     _requestQueue.Enqueue(request);
     NotifyRequestAdded();
 }
        protected override void BeginRequest(RetryQueueRequest request)
        {
            var offlineTask = request as OfflineTask;

            if (offlineTask != null)
            {
                switch (offlineTask.Type)
                {
                    case OfflineTaskType.DownloadFile:
                        BeginDownloadFile(offlineTask);
                        break;
                    case OfflineTaskType.ProcessManifest:
                        break;
                    case OfflineTaskType.QueueChunkList:
                        break;
                    default:
                        break;
                }
            }
        }
 protected abstract void BeginRequest(RetryQueueRequest request);