summaryrefslogtreecommitdiffstats
path: root/lib/store/tests/storedroptest.cpp
blob: 9da8d2d8fc7f96c7e0c781804fc370195001cbd5 (plain)
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 <tqtextbrowser.h>
#include <tqstringlist.h>
#include <tqbuffer.h>
#include <tqclipboard.h>

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::tqclipboard()->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->tqencodedData( 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" ).tqarg( fileName );

    TQByteArray data = store->device()->readAll();
    store->close();
    TQString txt = TQString( "Found %1: \n" ).tqarg( fileName );
    txt += TQString::fromUtf8( data.data(), data.size() );
    txt += "\n";
    return txt;
}