/* * Copyright (C) 2020-2025 Gavin MacGregor * * This file is part of QTeletextMaker. * * QTeletextMaker is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * QTeletextMaker is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with QTeletextMaker. If not, see . */ #ifndef SAVEFORMATS_H #define SAVEFORMATS_H #include #include #include #include #include "document.h" #include "levelonepage.h" #include "pagebase.h" class SaveFormat { public: virtual ~SaveFormat() { }; virtual void saveAllPages(QSaveFile &outFile, const TeletextDocument &document); virtual void saveCurrentSubPage(QSaveFile &outFile, const TeletextDocument &document); virtual QString description() const =0; virtual QStringList extensions() const =0; QString fileDialogFilter() const { return QString(description() + " (*." + extensions().join(" *.") + ')'); }; virtual bool getWarnings(const PageBase &subPage) { return false; }; QStringList warningStrings() const { return m_warnings; }; QString errorString() const { return m_error; }; protected: virtual void writeDocumentStart() { }; virtual void writeAllPages(); virtual void writeSubPage(const PageBase &subPage, int subPageNumber=0); virtual void writeSubPageStart(const PageBase &subPage, int subPageNumber=0) { }; virtual void writeSubPageBody(const PageBase &subPage); virtual void writeSubPageEnd(const PageBase &subPage) { }; virtual void writeDocumentEnd() { }; virtual void writeX27Packets(const PageBase &subPage); virtual void writeX28Packets(const PageBase &subPage); virtual void writeX26Packets(const PageBase &subPage); virtual void writeX1to25Packets(const PageBase &subPage); virtual QByteArray format7BitPacket(QByteArray packet) { return packet; }; virtual QByteArray format4BitPacket(QByteArray packet) { return packet; }; virtual QByteArray format18BitPacket(QByteArray packet) { return packet; }; virtual int writePacket(QByteArray packet, int packetNumber, int designationCode = -1); virtual int writeRawData(const char *s, int len); TeletextDocument const *m_document; QSaveFile *m_outFile; QDataStream m_outStream; QStringList m_warnings; QString m_error; }; class SaveTTIFormat : public SaveFormat { public: QString description() const override { return QString("MRG Systems TTI"); }; QStringList extensions() const override { return QStringList { "tti", "ttix" }; }; protected: virtual void writeDocumentStart(); virtual void writeSubPageStart(const PageBase &subPage, int subPageNumber=0); virtual void writeSubPageBody(const PageBase &subPage); virtual int writePacket(QByteArray packet, int packetNumber, int designationCode = -1); void writeString(const QString &command); QByteArray format7BitPacket(QByteArray packet); QByteArray format4BitPacket(QByteArray packet) { return format18BitPacket(packet); }; QByteArray format18BitPacket(QByteArray packet); }; class SaveM29Format : public SaveTTIFormat { protected: void writeSubPageStart(const PageBase &subPage, int subPageNumber=0); void writeSubPageBody(const PageBase &subPage); }; class SaveT42Format : public SaveFormat { public: QString description() const override { return QString("t42 packet stream"); }; QStringList extensions() const override { return QStringList { "t42" }; }; protected: void writeSubPageStart(const PageBase &subPage, int subPageNumber=0); virtual int writePacket(QByteArray packet, int packetNumber, int designationCode = -1); virtual QByteArray format7BitPacket(QByteArray packet); virtual QByteArray format4BitPacket(QByteArray packet); virtual QByteArray format18BitPacket(QByteArray packet); int m_magazineNumber; }; class SaveHTTFormat : public SaveT42Format { public: QString description() const override { return QString("HMS SD-Teletext HTT"); }; QStringList extensions() const override { return QStringList { "htt" }; }; protected: int writeRawData(const char *s, int len) override; }; class SaveEP1Format : public SaveFormat { public: QString description() const override { return QString("Softel EP1"); }; QStringList extensions() const override { return QStringList { "ep1" }; }; virtual bool getWarnings(const PageBase &subPage); protected: void writeSubPageStart(const PageBase &subPage, int subPageNumber=0); void writeSubPageBody(const PageBase &subPage); void writeSubPageEnd(const PageBase &subPage); virtual void writeX1to25Packets(const PageBase &subPage); virtual QByteArray format18BitPacket(QByteArray packet); // Language codes unique to EP1 // FIXME duplicated in loadformats.h const QMap m_languageCode { { 0x00, 0x09 }, { 0x01, 0x0d }, { 0x02, 0x18 }, { 0x03, 0x11 }, { 0x04, 0x0b }, { 0x05, 0x17 }, { 0x06, 0x07 }, { 0x08, 0x14 }, { 0x09, 0x0d }, { 0x0a, 0x18 }, { 0x0b, 0x11 }, { 0x0c, 0x0b }, { 0x0e, 0x07 }, { 0x10, 0x09 }, { 0x11, 0x0d }, { 0x12, 0x18 }, { 0x13, 0x11 }, { 0x14, 0x0b }, { 0x15, 0x17 }, { 0x16, 0x1c }, { 0x1d, 0x1e }, { 0x1f, 0x16 }, { 0x21, 0x0d }, { 0x22, 0xff }, { 0x23, 0xff }, { 0x26, 0x07 }, { 0x36, 0x1c }, { 0x37, 0x0e }, { 0x40, 0x09 }, { 0x44, 0x0b } }; }; class SaveFormats { public: SaveFormats(); ~SaveFormats(); SaveFormat *findFormat(const QString &suffix) const; SaveFormat *findExportFormat(const QString &suffix) const; QString filters() const { return s_filters; }; QString exportFilters() const { return s_exportFilters; }; bool isExportOnly(const QString &suffix) const { return findFormat(suffix) == nullptr; }; private: static const inline int s_size = 4; static const inline int s_nativeSize = 1; static int s_instances; inline static SaveFormat *s_fileFormat[s_size]; inline static QString s_filters, s_exportFilters; }; #endif