protected IEnumerator Refresh(int count) { status = SegmentStatus.Update; for (int i = 0; i < count; i++) { if (i >= list.Count) { break; } if (i >= items.Count) { items.Add(prefab.Create()); yield return(new WaitForEndOfFrame()); } if (items[i] != null) { callback?.Invoke(items[i], list[i]); } SetActive(items[i], true); } for (int i = count; i < items.Count; i++) { SetActive(items[i], false); } status = list.Count > count ? SegmentStatus.None : SegmentStatus.Complete; yield return(null); }
} // Setup private void InitSectionData(SegmentStatus status) { // initialize segment data storage status.SegmentId = Header.SegmentId; status.SegmentData = new SegmentAssembler(new DvbStpSegmentIdentity(Header), Header.LastSectionNumber); status.SegmentVersion = Header.SegmentVersion; // notify start of download FireSegmentDownloadStarted(status); } // InitSectionData
} // FireSegmentDownloadStarted protected virtual void FireSegmentSectionReceived(SegmentStatus status) { if (SegmentSectionReceived == null) { return; } var e = GetSegmentSectionReceivedEventArgs(status); OnSegmentSectionReceived(this, e); } // FireSegmentSectionReceived
} // OnSegmentDownloadCompleted #endregion #region Auxiliary methods protected SegmentSectionReceivedEventArgs GetSegmentSectionReceivedEventArgs(SegmentStatus status) { var e = new SegmentSectionReceivedEventArgs() { PayloadId = Header.PayloadId, SegmentId = Header.SegmentId, SegmentVersion = Header.SegmentVersion, SectionCount = status.SegmentData.LastSectionNumber + 1, SectionsReceived = status.SegmentData.ReceivedSections, SectionNumber = Header.SectionNumber, SegmentListIndex = status.InfoIndex }; return(e); } // GetSegmentSectionReceivedEventArgs
} // FireSegmentDownloadRestarted protected virtual void FireSegmentDownloadCompleted(SegmentStatus status) { if (SegmentDownloadCompleted == null) { return; } var e = new SegmentDownloadCompletedEventArgs(status.SegmentData) { PayloadId = Header.PayloadId, SegmentId = Header.SegmentId, SegmentVersion = Header.SegmentVersion, SectionCount = status.SegmentData.LastSectionNumber + 1, SegmentListIndex = status.InfoIndex, SegmentsReceived = this.SegmentsReceived, SegmentsPending = this.SegmentsPending, }; OnSegmentDownloadCompleted(this, e); } // SegmentDownloadCompleted
} // FireSegmentSectionReceived protected virtual void FireSegmentDownloadRestarted(SegmentStatus status, byte oldVersion) { if (SegmentDownloadRestarted == null) { return; } var e = new SegmentDownloadRestartedEventArgs() { PayloadId = status.PayloadId, SegmentListIndex = status.InfoIndex, OldVersion = oldVersion, NewVersion = status.SegmentVersion, SectionCount = status.SegmentData.LastSectionNumber + 1, RestartCount = status.DowloadRestartCount, GlobalRestartCount = this.DowloadRestartCount, }; OnSegmentDownloadRestarted(this, e); } // FireSegmentDownloadRestarted
} // RestartSectionData private void StoreSectionData(SegmentStatus status) { // reset timeout ResetNoDataTimeout(); // version change? if (Header.SegmentVersion != status.SegmentVersion) { RestartSectionData(status); } // if status.SegmentData.AddSectionData(Header.SectionNumber, DatagramData, Header.PayloadOffset, Header.PayloadSize); if (status.SegmentData.IsSegmentComplete) { _segmentsReceived++; _segmentsPending--; FireSegmentDownloadCompleted(status); } // if EndReceptionLoop = (_segmentsPending == 0); } // StoreSectionData
} // ProcessReceivedData private void Setup(IList <DvbStpClientSegmentInfo> payloads) { _payloads = payloads; _segmentsReceived = 0; _segmentsPending = payloads.Count; _status = new SegmentStatus[256]; for (var index = 0; index < payloads.Count; index++) { var info = payloads[index]; var status = new SegmentStatus() { PayloadId = info.PayloadId, SegmentId = -1, SegmentVersion = 0xFF, InfoIndex = index, ExpectedSegmentId = info.SegmentId.HasValue ? BitConverter.GetBytes(IPAddress.HostToNetworkOrder(info.SegmentId.Value)) : null }; _status[info.PayloadId] = status; } // for } // Setup
} // InitSectionData private void RestartSectionData(SegmentStatus status) { // increment restart count DownloadRestartCount++; status.DownloadRestartCount++; // avoid infinite restart loops if (DownloadRestartCount > MaxDownloadRestartCount) { throw new TimeoutException(); } // if // start over var oldVersion = status.SegmentVersion; status.SegmentData = new SegmentAssembler(new DvbStpSegmentIdentity(Header), Header.LastSectionNumber); status.SegmentVersion = Header.SegmentVersion; ResetNoDataTimeout(); // notify of download restart FireSegmentDownloadRestarted(status, oldVersion); } // RestartSectionData