#include #include #include #include #include #include #include class StoreDropTest : public TQTextBrowser { public: StoreDropTest( TQWidget* parent ); protected: virtual void contentsDragEnterEvent( TQDragEnterEvent * e ); virtual void contentsDragMoveEvent( TQDragMoveEvent * e ); virtual void contentsDropEvent( TQDropEvent * e ); virtual void keyPressEvent( TQKeyEvent * e ); virtual void paste(); private: bool processMimeSource( TQMimeSource* ev ); void showZipContents( TQByteArray data, const char* mimeType, bool oasis ); TQString loadTextFile( KoStore* store, const TQString& fileName ); }; int main( int argc, char** argv ) { KApplication::disableAutoDcopRegistration(); KCmdLineArgs::init(argc, argv, "storedroptest", 0, 0, 0, 0); KApplication app; StoreDropTest* window = new StoreDropTest( 0 ); window->resize( 500, 500 ); window->show(); TQObject::connect( tqApp, TQT_SIGNAL( lastWindowClosed() ), tqApp, TQT_SLOT( quit() ) ); return app.exec(); } StoreDropTest::StoreDropTest( TQWidget* parent ) : TQTextBrowser( parent ) { setText( "KoStore drop/paste test\nDrop or paste a selection from a KOffice application into this widget to see the ZIP contents" ); setAcceptDrops( true ); } void StoreDropTest::contentsDragEnterEvent( TQDragEnterEvent * ev ) { ev->acceptAction(); } void StoreDropTest::contentsDragMoveEvent( TQDragMoveEvent * ev ) { ev->acceptAction(); } void StoreDropTest::keyPressEvent( TQKeyEvent * e ) { if ( ( ( e->state() & ShiftButton ) && e->key() == Key_Insert ) || ( ( e->state() & ControlButton ) && e->key() == Key_V ) ) paste(); //else // TQTextBrowser::keyPressEvent( e ); } void StoreDropTest::paste() { qDebug( "paste" ); TQMimeSource* m = TQApplication::clipboard()->data(); if ( !m ) return; processMimeSource( m ); } void StoreDropTest::contentsDropEvent( TQDropEvent *ev ) { if ( processMimeSource( ev ) ) ev->acceptAction(); else ev->ignore(); } bool StoreDropTest::processMimeSource( TQMimeSource* ev ) { const TQCString acceptMimeType = "application/vnd.oasis.opendocument."; const char* fmt; TQStringList formats; for (int i=0; (fmt = ev->format(i)); i++) { formats += fmt; bool oasis = TQString( fmt ).startsWith( acceptMimeType ); if ( oasis || TQString( fmt ) == "application/x-kpresenter" ) { TQByteArray data = ev->encodedData( fmt ); showZipContents( data, fmt, oasis ); return true; } } setText( "No acceptable format found. All I got was:\n" + formats.join( "\n" ) ); return false; } void StoreDropTest::showZipContents( TQByteArray data, const char* mimeType, bool oasis ) { if ( data.isEmpty() ) { setText( "No data!" ); return; } TQBuffer buffer( data ); KoStore * store = KoStore::createStore( &buffer, KoStore::Read ); if ( store->bad() ) { setText( "Invalid ZIP!" ); return; } store->disallowNameExpansion(); TQString txt = TQString( "Valid ZIP file found for format " ) + mimeType + "\n"; if ( oasis ) { txt += loadTextFile( store, "content.xml" ); txt += loadTextFile( store, "styles.xml" ); txt += loadTextFile( store, "settings.xml" ); txt += loadTextFile( store, "META-INF/manifest.xml" ); } else { txt += loadTextFile( store, "maindoc.xml" ); } setText( txt ); } TQString StoreDropTest::loadTextFile( KoStore* store, const TQString& fileName ) { if ( !store->open( fileName ) ) return TQString( "%1 not found\n" ).arg( fileName ); TQByteArray data = store->device()->readAll(); store->close(); TQString txt = TQString( "Found %1: \n" ).arg( fileName ); txt += TQString::fromUtf8( data.data(), data.size() ); txt += "\n"; return txt; }