File indexing completed on 2024-06-09 04:24:06

0001 /* This file is part of the KDE project
0002  *  SPDX-FileCopyrightText: 2004 David Faure <faure@kde.org>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 #include <KoStore.h>
0007 
0008 #include <QStringList>
0009 #include <QBuffer>
0010 #include <QMimeData>
0011 #include <QClipboard>
0012 #include <QTextBrowser>
0013 #include <QDragEnterEvent>
0014 #include <QDragMoveEvent>
0015 #include <QKeyEvent>
0016 #include <QDropEvent>
0017 #include <QApplication>
0018 #include <QCommandLineParser>
0019 
0020 class StoreDropTest : public QTextBrowser
0021 {
0022 public:
0023     StoreDropTest(QWidget* parent);
0024 protected:
0025     virtual void contentsDragEnterEvent(QDragEnterEvent * e);
0026     virtual void contentsDragMoveEvent(QDragMoveEvent * e);
0027     virtual void contentsDropEvent(QDropEvent * e);
0028     void keyPressEvent(QKeyEvent * e) override;
0029     virtual void paste();
0030 private:
0031     bool processMimeData(const QMimeData* mimeData);
0032     void showZipContents(QByteArray data, const QString &mimeType, bool oasis);
0033     QString loadTextFile(KoStore* store, const QString& fileName);
0034 };
0035 
0036 int main(int argc, char** argv)
0037 {
0038     QApplication app(argc, argv);
0039     StoreDropTest* window = new StoreDropTest(0);
0040     window->resize(500, 500);
0041     window->show();
0042 
0043     QObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()));
0044     return app.exec();
0045 }
0046 
0047 StoreDropTest::StoreDropTest(QWidget* parent)
0048         : QTextBrowser(parent)
0049 {
0050     setText("KoStore drop/paste test\nDrop or paste a selection from a Krita application into this widget to see the ZIP contents");
0051     setAcceptDrops(true);
0052 }
0053 
0054 void StoreDropTest::contentsDragEnterEvent(QDragEnterEvent * ev)
0055 {
0056     ev->acceptProposedAction();
0057 }
0058 
0059 void StoreDropTest::contentsDragMoveEvent(QDragMoveEvent * ev)
0060 {
0061     ev->acceptProposedAction();
0062 }
0063 
0064 void StoreDropTest::keyPressEvent(QKeyEvent * e)
0065 {
0066     if (((e->modifiers() & Qt::ShiftModifier) && e->key() == Qt::Key_Insert) ||
0067             ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_V))
0068         paste();
0069     //else
0070     //    QTextBrowser::keyPressEvent( e );
0071 }
0072 
0073 void StoreDropTest::paste()
0074 {
0075     qDebug("paste");
0076     const QMimeData* m = QApplication::clipboard()->mimeData();
0077     if (!m)
0078         return;
0079 
0080     const QString acceptMimeType("application/vnd.oasis.opendocument.");
0081     QStringList formats = m->formats();
0082     Q_FOREACH (QString fmt, formats) {
0083         bool oasis = fmt.startsWith(acceptMimeType);
0084         if (oasis || fmt == "application/x-kpresenter") {
0085             QByteArray data = m->data(fmt);
0086             showZipContents(data, fmt.toLatin1(), oasis);
0087             return;
0088         }
0089     }
0090     setText("No acceptable format found. All I got was:\n" + formats.join("\n"));
0091 
0092 }
0093 
0094 void StoreDropTest::contentsDropEvent(QDropEvent *ev)
0095 {
0096     if (processMimeData(ev->mimeData()))
0097         ev->acceptProposedAction();
0098     else
0099         ev->ignore();
0100 }
0101 
0102 bool StoreDropTest::processMimeData(const QMimeData* mimeData)
0103 {
0104     const QString acceptMimeType("application/vnd.oasis.opendocument.");
0105     foreach (const QString &format, mimeData->formats()) {
0106         bool oasis = format.startsWith(acceptMimeType);
0107         if (oasis || format == "application/x-kpresenter") {
0108             const QByteArray data = mimeData->data(format);
0109             showZipContents(data, format, oasis);
0110             return true;
0111         }
0112     }
0113     setText("No acceptable format found. All I got was:\n" + mimeData->formats().join("\n"));
0114     return false;
0115 }
0116 
0117 void StoreDropTest::showZipContents(QByteArray data, const QString &mimeType, bool oasis)
0118 {
0119     if (data.isEmpty()) {
0120         setText("No data!");
0121         return;
0122     }
0123     QBuffer buffer(&data);
0124     KoStore * store = KoStore::createStore(&buffer, KoStore::Read);
0125     if (store->bad()) {
0126         setText("Invalid ZIP!");
0127     delete store;
0128         return;
0129     }
0130     
0131 
0132     QString txt = QString("Valid ZIP file found for format ") + mimeType + "\n";
0133 
0134     if (oasis) {
0135         txt += loadTextFile(store, "content.xml");
0136         txt += loadTextFile(store, "styles.xml");
0137         txt += loadTextFile(store, "settings.xml");
0138         txt += loadTextFile(store, "META-INF/manifest.xml");
0139     } else {
0140         txt += loadTextFile(store, "maindoc.xml");
0141     }
0142     setText(txt);
0143     delete store;
0144 }
0145 
0146 QString StoreDropTest::loadTextFile(KoStore* store, const QString& fileName)
0147 {
0148     if (!store->open(fileName))
0149         return QString("%1 not found\n").arg(fileName);
0150 
0151     QByteArray data = store->device()->readAll();
0152     store->close();
0153     QString txt = QString("Found %1: \n").arg(fileName);
0154     txt += QString::fromUtf8(data.data(), data.size());
0155     txt += "\n";
0156     return txt;
0157 }