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 }