From 041a35a597af46a19f467b9fedbdbc9114eae828 Mon Sep 17 00:00:00 2001 From: Gavin MacGregor Date: Sun, 25 May 2025 14:42:03 +0100 Subject: [PATCH] Move page function and packet coding --- src/qteletextdecoder/levelonepage.h | 3 +++ src/qteletextdecoder/pagebase.h | 13 ++++++++++--- src/qteletextmaker/document.cpp | 14 -------------- src/qteletextmaker/document.h | 12 ------------ src/qteletextmaker/saveformats.cpp | 12 ++++++------ 5 files changed, 19 insertions(+), 35 deletions(-) diff --git a/src/qteletextdecoder/levelonepage.h b/src/qteletextdecoder/levelonepage.h index 13ce9ce..67cc7f5 100644 --- a/src/qteletextdecoder/levelonepage.h +++ b/src/qteletextdecoder/levelonepage.h @@ -41,6 +41,9 @@ public: LevelOnePage(); + PageFunctionEnum pageFunction() const override { return PFLevelOnePage; } + PacketCodingEnum packetCoding() const override { return Coding7bit; } + bool isEmpty() const override; QByteArray packet(int y, int d) const override; diff --git a/src/qteletextdecoder/pagebase.h b/src/qteletextdecoder/pagebase.h index b627598..ad7075c 100644 --- a/src/qteletextdecoder/pagebase.h +++ b/src/qteletextdecoder/pagebase.h @@ -29,9 +29,16 @@ class PageBase //: public QObject public: enum ControlBitsEnum { C4ErasePage, C5Newsflash, C6Subtitle, C7SuppressHeader, C8Update, C9InterruptedSequence, C10InhibitDisplay, C11SerialMagazine, C12NOS, C13NOS, C14NOS }; + // Available Page Functions according to 9.4.2.1 of the spec + enum PageFunctionEnum { PFUnknown = -1, PFLevelOnePage, PFDataBroadcasting, PFGlobalPOP, PFNormalPOP, PFGlobalDRCS, PFNormalDRCS, PFMOT, PFMIP, PFBasicTOPTable, PFAdditionalInformationTable, PFMultiPageTable, PFMultiPageExtensionTable, PFTriggerMessages }; + // Available Page Codings of X/1 to X/25 according to 9.4.2.1 of the spec + enum PacketCodingEnum { CodingUnknown = -1, Coding7bit, Coding8bit, Coding18bit, Coding4bit, Coding4bitThen7bit, CodingPerPacket }; PageBase(); + virtual PageFunctionEnum pageFunction() const { return PFUnknown; } + virtual PacketCodingEnum packetCoding() const { return CodingUnknown; } + virtual bool isEmpty() const; virtual QByteArray packet(int y) const { return m_displayPackets[y]; } @@ -40,9 +47,9 @@ public: virtual bool setPacket(int y, int d, QByteArray pkt); virtual bool packetExists(int y) const { return !m_displayPackets[y].isEmpty(); } virtual bool packetExists(int y, int d) const { return !m_designationPackets[y-26][d].isEmpty(); } - bool clearPacket(int y); - bool clearPacket(int y, int d); - void clearAllPackets(); + virtual bool clearPacket(int y); + virtual bool clearPacket(int y, int d); + virtual void clearAllPackets(); virtual bool controlBit(int b) const { return m_controlBits[b]; } virtual bool setControlBit(int b, bool active); diff --git a/src/qteletextmaker/document.cpp b/src/qteletextmaker/document.cpp index 3ebaf2e..756b55f 100644 --- a/src/qteletextmaker/document.cpp +++ b/src/qteletextmaker/document.cpp @@ -62,8 +62,6 @@ TeletextDocument::TeletextDocument() { m_pageNumber = 0x199; m_description.clear(); - m_pageFunction = PFLevelOnePage; - m_packetCoding = Coding7bit; m_subPages.append(new LevelOnePage); m_currentSubPageIndex = 0; m_undoStack = new QUndoStack(this); @@ -113,18 +111,6 @@ void TeletextDocument::clear() } } -/* -void TeletextDocument::setPageFunction(PageFunctionEnum newPageFunction) -{ - m_pageFunction = newPageFunction; -} - -void TeletextDocument::setPacketCoding(PacketCodingEnum newPacketEncoding) -{ - m_packetCoding = newPacketEncoding; -} -*/ - void TeletextDocument::selectSubPageIndex(int newSubPageIndex, bool forceRefresh) { // forceRefresh overrides "beyond the last subpage" check, so inserting a subpage after the last one still shows - dangerous workaround? diff --git a/src/qteletextmaker/document.h b/src/qteletextmaker/document.h index 8b49bd6..48c0b25 100644 --- a/src/qteletextmaker/document.h +++ b/src/qteletextmaker/document.h @@ -48,22 +48,12 @@ class TeletextDocument : public QObject Q_OBJECT public: - // Available Page Functions according to 9.4.2.1 of the spec - enum PageFunctionEnum { PFLevelOnePage, PFDataBroadcasting, PFGlobalPOP, PFNormalPOP, PFGlobalDRCS, PFNormalDRCS, PFMOT, PFMIP, PFBasicTOPTable, PFAdditionalInformationTable, PFMultiPageTable, PFMultiPageExtensionTable, PFTriggerMessages }; - // Available Page Codings of X/1 to X/25 according to 9.4.2.1 of the spec - enum PacketCodingEnum { Coding7bit, Coding8bit, Coding18bit, Coding4bit, Coding4bitThen7bit, CodingPerPacket }; - TeletextDocument(); ~TeletextDocument(); bool isEmpty() const; void clear(); - PageFunctionEnum pageFunction() const { return m_pageFunction; } -// void setPageFunction(PageFunctionEnum); - PacketCodingEnum packetCoding() const { return m_packetCoding; } -// void setPacketCoding(PacketCodingEnum); - int numberOfSubPages() const { return m_subPages.size(); } LevelOnePage* subPage(int p) const { return m_subPages[p]; } LevelOnePage* currentSubPage() const { return m_subPages[m_currentSubPageIndex]; } @@ -121,8 +111,6 @@ signals: private: QString m_description; int m_pageNumber, m_currentSubPageIndex; - PageFunctionEnum m_pageFunction; - PacketCodingEnum m_packetCoding; QList m_subPages; QList m_recycleSubPages; QUndoStack *m_undoStack; diff --git a/src/qteletextmaker/saveformats.cpp b/src/qteletextmaker/saveformats.cpp index 5bd3afe..af08901 100644 --- a/src/qteletextmaker/saveformats.cpp +++ b/src/qteletextmaker/saveformats.cpp @@ -72,7 +72,7 @@ void SaveFormat::writeSubPageBody(const PageBase &subPage) { writeX27Packets(subPage); writeX28Packets(subPage); - if (m_document->pageFunction() == TeletextDocument::PFLevelOnePage) { + if (subPage.pageFunction() == PageBase::PFLevelOnePage) { writeX26Packets(subPage); writeX1to25Packets(subPage); } else { @@ -173,7 +173,7 @@ void SaveTTIFormat::writeSubPageStart(const PageBase &subPage, int subPageNumber // Subpage // Magazine Organisation Table and Magazine Inventory Page don't have subpages - if (m_document->pageFunction() != TeletextDocument::PFMOT && m_document->pageFunction() != TeletextDocument::PFMIP) + if (subPage.pageFunction() != PageBase::PFMOT && subPage.pageFunction() != PageBase::PFMIP) writeString(QString("SC,%1").arg(subPageNumber, 4, 10, QChar('0'))); // Status bits @@ -190,14 +190,14 @@ void SaveTTIFormat::writeSubPageStart(const PageBase &subPage, int subPageNumber writeString(QString("PS,%1").arg(0x8000 | statusBits, 4, 16, QChar('0'))); - if (m_document->pageFunction() == TeletextDocument::PFLevelOnePage) { + if (subPage.pageFunction() == PageBase::PFLevelOnePage) { // Level One Page: page region and cycle writeString(QString("RE,%1").arg(static_cast(&subPage)->defaultCharSet())); writeString(QString("CT,%1,%2").arg(static_cast(&subPage)->cycleValue()).arg(static_cast(&subPage)->cycleType()==LevelOnePage::CTcycles ? 'C' : 'T')); } else // Not a Level One Page: X/28/0 specifies page function and coding but the PF command // should make it obvious to a human that this is not a Level One Page - writeString(QString("PF,%1,%2").arg(m_document->pageFunction()).arg(m_document->packetCoding())); + writeString(QString("PF,%1,%2").arg(subPage.pageFunction()).arg(subPage.packetCoding())); } void SaveTTIFormat::writeSubPageBody(const PageBase &subPage) @@ -208,7 +208,7 @@ void SaveTTIFormat::writeSubPageBody(const PageBase &subPage) // FLOF links bool writeFLCommand = false; - if (m_document->pageFunction() == TeletextDocument::PFLevelOnePage && subPage.packetExists(27,0)) { + if (subPage.pageFunction() == PageBase::PFLevelOnePage && subPage.packetExists(27,0)) { // Subpage has FLOF links - if any link to a specific subpage we need to write X/27/0 // as raw, otherwise we write the links as a human-readable FL command later on writeFLCommand = true; @@ -231,7 +231,7 @@ void SaveTTIFormat::writeSubPageBody(const PageBase &subPage) // Now write the other packets like the rest of writeSubPageBody does writeX28Packets(subPage); - if (m_document->pageFunction() == TeletextDocument::PFLevelOnePage) { + if (subPage.pageFunction() == PageBase::PFLevelOnePage) { writeX26Packets(subPage); writeX1to25Packets(subPage); } else {