diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ find_package(KF5Akonadi ${AKONADI_VERSION} CONFIG REQUIRED) find_package(KF5AkonadiContact ${AKONADI_CONTACT_VERSION} CONFIG REQUIRED) +find_package(KF5Mime ${AKONADI_VERSION} CONFIG REQUIRED) find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Core Widgets Test) message(STATUS "Qt version: ${Qt5Core_VERSION}") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,7 +35,7 @@ set(akonadiclient_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp) add_library(libakonadiclient STATIC ${libakonadiclient_SRCS}) -target_link_libraries(libakonadiclient KF5::AkonadiCore KF5::AkonadiXml KF5::AkonadiContact) +target_link_libraries(libakonadiclient KF5::AkonadiCore KF5::AkonadiXml KF5::AkonadiContact KF5::Mime) target_link_libraries(libakonadiclient KF5::I18n) target_link_libraries(libakonadiclient Qt5::Core) diff --git a/src/showcommand.h b/src/showcommand.h --- a/src/showcommand.h +++ b/src/showcommand.h @@ -45,6 +45,8 @@ private: QStringList mItemArgs; AbstractCommand::Errors mExitStatus; + QCommandLineOption mRawOption; + bool mRaw = false; private Q_SLOTS: void processNextItem(); diff --git a/src/showcommand.cpp b/src/showcommand.cpp --- a/src/showcommand.cpp +++ b/src/showcommand.cpp @@ -22,6 +22,7 @@ #include #include +#include #include @@ -32,20 +33,24 @@ DEFINE_COMMAND("show", ShowCommand, "Show the raw payload of an item"); ShowCommand::ShowCommand(QObject *parent) - : AbstractCommand(parent) + : AbstractCommand(parent), + mRawOption(QStringLiteral("raw"), i18nc("@info:shell", "Use raw payload (disables quoted-printable decoding)")) { } void ShowCommand::setupCommandOptions(QCommandLineParser *parser) { parser->addPositionalArgument("item", i18nc("@info:shell", "The items to show"), i18nc("@info:shell", "item...")); + parser->addOption(mRawOption); } int ShowCommand::initCommand(QCommandLineParser *parser) { mItemArgs = parser->positionalArguments(); if (!checkArgCount(mItemArgs, 1, i18nc("@info:shell", "No items specified"))) return InvalidUsage; + mRaw = parser->isSet(mRawOption); + return NoError; } @@ -96,12 +101,25 @@ if (!item.hasPayload()) { emit error(i18nc("@info:shell", "Item '%1' has no payload", job->property("arg").toString())); mExitStatus = RuntimeError; - } else { + } else if (mRaw) { std::cout << item.payloadData().constData(); // output the raw payload - if (!mItemArgs.isEmpty()) { // not the last item - std::cout << "\n"; // blank line to separate + } else { + if (item.hasPayload()) { + const KMime::Message::Ptr mail = item.payload(); + std::cout << qPrintable(mail->head()); + const auto mainPart = mail->mainBodyPart(); + if (mainPart) { + std::cout << qPrintable(mainPart->decodedText()); + } else { + std::cout << "ERROR: no main body part"; + } + } else { + std::cout << qPrintable(QString::fromUtf8(item.payloadData().constData())); } } + if (!mItemArgs.isEmpty()) { // not the last item + std::cout << "\n"; // blank line to separate + } } }