Git commit eb223f81f53a041ca36d2ed8a23caad29a892499 by Robby Stephenson. Committed on 14/03/2024 at 14:59. Pushed by rstephenson into branch 'master'.
Allow the DBUS interface to export to stdout Using a file name of '--' will result in the text being piped to stdout. With a running instance of Tellico, the dbus command would be: qdbus-qt5 org.kde.tellico /Tellico org.kde.tellico.exportXML -- CCBUG: 479961 M +5 -1 doc/advanced.docbook M +22 -9 src/core/filehandler.cpp M +2 -0 src/core/filehandler.h M +5 -1 src/dbusinterface.cpp https://invent.kde.org/office/tellico/-/commit/eb223f81f53a041ca36d2ed8a23caad29a892499 diff --git a/doc/advanced.docbook b/doc/advanced.docbook index 71a52bba..d901d5c6 100644 --- a/doc/advanced.docbook +++ b/doc/advanced.docbook @@ -62,7 +62,11 @@ bool showEntry(int id) </programlisting> <para> -For the four import commands, the first argument is the file to import, and the second is the import action. Three actions are available: <emphasis>replace</emphasis>, <emphasis>append</emphasis>, and <emphasis>merge</emphasis>. Four file formats are supported for importing: Tellico &XML; files, Bibtex files, MODS files, and RIS files. +For the four import commands, the first argument is the file to import, and the second is the import action. Three actions are available: <emphasis>replace</emphasis>, <emphasis>append</emphasis>, and <emphasis>merge</emphasis>. Four file formats are supported for importing: Tellico &XML; files, Bibtex files, MODS files, and RIS files. Metadata from <link linkend="importing-pdf">&PDF;</link> files can also be imported. +</para> + +<para> +For any of the commands to export text, a file name of <filename>--</filename> will pipe to the standard output. </para> <para> diff --git a/src/core/filehandler.cpp b/src/core/filehandler.cpp index 40f96168..1a871cb9 100644 --- a/src/core/filehandler.cpp +++ b/src/core/filehandler.cpp @@ -41,6 +41,7 @@ #include <QUrl> #include <QDomDocument> #include <QFile> +#include <QDir> #include <QTextStream> #include <QTemporaryFile> #include <QSaveFile> @@ -224,6 +225,14 @@ bool FileHandler::writeTextURL(const QUrl& url_, const QString& text_, bool enco } if(url_.isLocalFile()) { + // push to stdout _if_ file name is '--' AND is same as current path + // as is used in dbusinterface + if(url_.fileName() == QLatin1String("--") && + url_.adjusted(QUrl::RemoveFilename | QUrl::StripTrailingSlash).path() == QDir::currentPath()) { + QTextStream ts(stdout); + writeTextStream(ts, text_, encodeUTF8_); + return true; + } QSaveFile f(url_.toLocalFile()); f.open(QIODevice::WriteOnly); if(f.error() != QFile::NoError) { @@ -264,23 +273,27 @@ bool FileHandler::writeTextURL(const QUrl& url_, const QString& text_, bool enco bool FileHandler::writeTextFile(QSaveFile& file_, const QString& text_, bool encodeUTF8_) { QTextStream ts(&file_); + writeTextStream(ts, text_, encodeUTF8_); + file_.flush(); + const bool success = file_.commit(); + if(!success) { + myLog() << "Failed to write text file:" << file_.error(); + } + return success; +} + +void FileHandler::writeTextStream(QTextStream& ts_, const QString& text_, bool encodeUTF8_) { if(encodeUTF8_) { #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) - ts.setCodec("UTF-8"); + ts_.setCodec("UTF-8"); #else - ts.setEncoding(QStringConverter::Utf8); + ts_.setEncoding(QStringConverter::Utf8); #endif } // KDE Bug 380832. If string is longer than MAX_TEXT_CHUNK_WRITE_SIZE characters, split into chunks. for(int i = 0; i < text_.length(); i += MAX_TEXT_CHUNK_WRITE_SIZE) { - ts << text_.mid(i, MAX_TEXT_CHUNK_WRITE_SIZE); + ts_ << text_.mid(i, MAX_TEXT_CHUNK_WRITE_SIZE); } - file_.flush(); - const bool success = file_.commit(); - if(!success) { - myLog() << "Failed to write text file:" << file_.error(); - } - return success; } bool FileHandler::writeDataURL(const QUrl& url_, const QByteArray& data_, bool force_, bool quiet_) { diff --git a/src/core/filehandler.h b/src/core/filehandler.h index dee4afea..b1c4e32c 100644 --- a/src/core/filehandler.h +++ b/src/core/filehandler.h @@ -37,6 +37,7 @@ namespace KIO { class QDomDocument; class QIODevice; class QSaveFile; +class QTextStream; namespace Tellico { class ImageFactory; @@ -167,6 +168,7 @@ private: * @return A boolean indicating success */ static bool writeTextFile(QSaveFile& file, const QString& text, bool encodeUTF8); + static void writeTextStream(QTextStream& ts, const QString& text, bool encodeUTF8); /** * Writes data to a file. * diff --git a/src/dbusinterface.cpp b/src/dbusinterface.cpp index a89fae52..8b904a35 100644 --- a/src/dbusinterface.cpp +++ b/src/dbusinterface.cpp @@ -88,7 +88,11 @@ bool ApplicationInterface::importFile(Tellico::Import::Format format, const QStr bool ApplicationInterface::exportCollection(Tellico::Export::Format format, const QString& file, bool filtered) { const QUrl url = QUrl::fromUserInput(file, QDir::currentPath(), QUrl::AssumeLocalFile); - myLog() << "Exporting collection to" << url.toDisplayString(QUrl::PreferLocalFile); + if(file == QLatin1String("--")) { + myLog() << "Exporting collection to stdout"; + } else { + myLog() << "Exporting collection to" << url.toDisplayString(QUrl::PreferLocalFile); + } return m_mainWindow->exportCollection(format, url, filtered); }