示例#1
0
        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);
        }
示例#2
0
        }     // 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
示例#3
0
        } // FireSegmentDownloadStarted

        protected virtual void FireSegmentSectionReceived(SegmentStatus status)
        {
            if (SegmentSectionReceived == null)
            {
                return;
            }

            var e = GetSegmentSectionReceivedEventArgs(status);

            OnSegmentSectionReceived(this, e);
        } // FireSegmentSectionReceived
示例#4
0
        } // 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
示例#5
0
        } // 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
示例#6
0
        } // 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
示例#7
0
        } // 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
示例#8
0
        } // 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
示例#9
0
        } // 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