/// <summary>
    /// Called when a page is received to store in the cache
    /// </summary>
    /// <param name="pageNumber">Page number</param>
    /// <param name="subPageNumber">Subpage number</param>
    /// <param name="pageData">PageData </param>
    /// <param name="vbiLines">VBI lines</param>
    public void PageReceived(int pageNumber, int subPageNumber, byte[] pageData, string vbiLines)
    {
      //if (pageNumber == 0x600) Trace.WriteLine(String.Format("PageReceived {0:X}/{1:X}", pageNumber, subPageNumber));
      if (pageNumber < MIN_PAGE || pageNumber >= MAX_PAGE)
        throw new ArgumentOutOfRangeException("pageNumber");


      if (_pageCache[pageNumber] == null)
      {
        _pageCache[pageNumber] = new TeletextPage(pageNumber);
      }
      if (subPageNumber == 0)
      {
        if (_pageCache[pageNumber].SubPageCount > 0)
        {
          for (int i = 1; i <= _pageCache[pageNumber].SubPageCount; ++i)
          {
            _pageCache[pageNumber].Delete(pageNumber, i);
            if (OnPageDeleted != null)
            {
              OnPageDeleted(pageNumber, i);
            }
          }
        }
      }

      if (subPageNumber > 0)
      {
        subPageNumber--;
      }
      bool isUpdate, isNew, isDeleted;
      _pageCache[pageNumber].SubPageReceived(pageNumber, ref subPageNumber, ref pageData, out isUpdate, out isNew,
                                             out isDeleted, vbiLines);
      if (isNew)
      {
        if (OnPageAdded != null)
        {
          OnPageAdded(pageNumber, subPageNumber);
        }
      }
      if (isDeleted)
      {
        if (OnPageDeleted != null)
        {
          OnPageDeleted(pageNumber, subPageNumber);
        }
      }
      if (isUpdate)
      {
        if (OnPageUpdated != null)
        {
          OnPageUpdated(pageNumber, subPageNumber);
        }
      }
      TimeSpan ts = DateTime.Now - _checkTimer;
      if (ts.TotalSeconds < 10)
        return;
      for (pageNumber = MIN_PAGE; pageNumber < MAX_PAGE; pageNumber++)
      {
        if (_pageCache[pageNumber] == null)
          continue;
        if (_pageCache[pageNumber].SubPageCount < 0)
          continue;
        ts = DateTime.Now - _pageCache[pageNumber].LastTimeReceived;
        if (ts.TotalSeconds >= 120)
        {
          //if (pageNumber == 0x600)
          //  Trace.WriteLine("timeout on 600");
          _pageCache[pageNumber].Dispose();
          _pageCache[pageNumber] = null;
          if (OnPageDeleted != null)
          {
            OnPageDeleted(pageNumber, 0);
          }
        }
      }
      _checkTimer = DateTime.Now;
    }
        /// <summary>
        /// Called when a page is received to store in the cache
        /// </summary>
        /// <param name="pageNumber">Page number</param>
        /// <param name="subPageNumber">Subpage number</param>
        /// <param name="pageData">PageData </param>
        /// <param name="vbiLines">VBI lines</param>
        public void PageReceived(int pageNumber, int subPageNumber, byte[] pageData, string vbiLines)
        {
            //if (pageNumber == 0x600) Trace.WriteLine(String.Format("PageReceived {0:X}/{1:X}", pageNumber, subPageNumber));
            if (pageNumber < MIN_PAGE || pageNumber >= MAX_PAGE)
            {
                throw new ArgumentOutOfRangeException("pageNumber");
            }


            if (_pageCache[pageNumber] == null)
            {
                _pageCache[pageNumber] = new TeletextPage(pageNumber);
            }
            if (subPageNumber == 0)
            {
                if (_pageCache[pageNumber].SubPageCount > 0)
                {
                    for (int i = 1; i <= _pageCache[pageNumber].SubPageCount; ++i)
                    {
                        _pageCache[pageNumber].Delete(pageNumber, i);
                        if (OnPageDeleted != null)
                        {
                            OnPageDeleted(pageNumber, i);
                        }
                    }
                }
            }

            if (subPageNumber > 0)
            {
                subPageNumber--;
            }
            bool isUpdate, isNew, isDeleted;

            _pageCache[pageNumber].SubPageReceived(pageNumber, ref subPageNumber, ref pageData, out isUpdate, out isNew,
                                                   out isDeleted, vbiLines);
            if (isNew)
            {
                if (OnPageAdded != null)
                {
                    OnPageAdded(pageNumber, subPageNumber);
                }
            }
            if (isDeleted)
            {
                if (OnPageDeleted != null)
                {
                    OnPageDeleted(pageNumber, subPageNumber);
                }
            }
            if (isUpdate)
            {
                if (OnPageUpdated != null)
                {
                    OnPageUpdated(pageNumber, subPageNumber);
                }
            }
            TimeSpan ts = DateTime.Now - _checkTimer;

            if (ts.TotalSeconds < 10)
            {
                return;
            }
            for (pageNumber = MIN_PAGE; pageNumber < MAX_PAGE; pageNumber++)
            {
                if (_pageCache[pageNumber] == null)
                {
                    continue;
                }
                if (_pageCache[pageNumber].SubPageCount < 0)
                {
                    continue;
                }
                ts = DateTime.Now - _pageCache[pageNumber].LastTimeReceived;
                if (ts.TotalSeconds >= 120)
                {
                    //if (pageNumber == 0x600)
                    //  Trace.WriteLine("timeout on 600");
                    _pageCache[pageNumber].Dispose();
                    _pageCache[pageNumber] = null;
                    if (OnPageDeleted != null)
                    {
                        OnPageDeleted(pageNumber, 0);
                    }
                }
            }
            _checkTimer = DateTime.Now;
        }