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);
 }
 

Reply via email to