1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
#include <kapplication.h>
#include <kcmdlineargs.h>
#include <KoStore.h>
#include <qtextbrowser.h>
#include <qstringlist.h>
#include <qbuffer.h>
#include <qclipboard.h>
class StoreDropTest : public QTextBrowser
{
public:
StoreDropTest( QWidget* parent );
protected:
virtual void contentsDragEnterEvent( QDragEnterEvent * e );
virtual void contentsDragMoveEvent( QDragMoveEvent * e );
virtual void contentsDropEvent( QDropEvent * e );
virtual void keyPressEvent( QKeyEvent * e );
virtual void paste();
private:
bool processMimeSource( QMimeSource* ev );
void showZipContents( QByteArray data, const char* mimeType, bool oasis );
QString loadTextFile( KoStore* store, const QString& 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();
QObject::connect( qApp, SIGNAL( lastWindowClosed() ), qApp, SLOT( quit() ) );
return app.exec();
}
StoreDropTest::StoreDropTest( QWidget* parent )
: QTextBrowser( 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( QDragEnterEvent * ev )
{
ev->acceptAction();
}
void StoreDropTest::contentsDragMoveEvent( QDragMoveEvent * ev )
{
ev->acceptAction();
}
void StoreDropTest::keyPressEvent( QKeyEvent * e )
{
if ( ( ( e->state() & ShiftButton ) && e->key() == Key_Insert ) ||
( ( e->state() & ControlButton ) && e->key() == Key_V ) )
paste();
//else
// QTextBrowser::keyPressEvent( e );
}
void StoreDropTest::paste()
{
qDebug( "paste" );
QMimeSource* m = QApplication::clipboard()->data();
if ( !m )
return;
processMimeSource( m );
}
void StoreDropTest::contentsDropEvent( QDropEvent *ev )
{
if ( processMimeSource( ev ) )
ev->acceptAction();
else
ev->ignore();
}
bool StoreDropTest::processMimeSource( QMimeSource* ev )
{
const QCString acceptMimeType = "application/vnd.oasis.opendocument.";
const char* fmt;
QStringList formats;
for (int i=0; (fmt = ev->format(i)); i++) {
formats += fmt;
bool oasis = QString( fmt ).startsWith( acceptMimeType );
if ( oasis || QString( fmt ) == "application/x-kpresenter" ) {
QByteArray 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( QByteArray data, const char* mimeType, bool oasis )
{
if ( data.isEmpty() ) {
setText( "No data!" );
return;
}
QBuffer buffer( data );
KoStore * store = KoStore::createStore( &buffer, KoStore::Read );
if ( store->bad() ) {
setText( "Invalid ZIP!" );
return;
}
store->disallowNameExpansion();
QString txt = QString( "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 );
}
QString StoreDropTest::loadTextFile( KoStore* store, const QString& fileName )
{
if ( !store->open( fileName ) )
return QString( "%1 not found\n" ).arg( fileName );
QByteArray data = store->device()->readAll();
store->close();
QString txt = QString( "Found %1: \n" ).arg( fileName );
txt += QString::fromUtf8( data.data(), data.size() );
txt += "\n";
return txt;
}
|