summaryrefslogtreecommitdiff
path: root/core/launcher/transferserver.h
blob: 1c5ab4b3b0c258dadf825bde252285db1042ada9 (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include <qserversocket.h>
#include <qsocket.h>
#include <qdir.h>
#include <qfile.h>
#include <qbuffer.h>

class QFileInfo;
class OProcess;
class TransferServer : public QServerSocket
{
    Q_OBJECT

public:
    TransferServer( Q_UINT16 port, QObject *parent = 0, const char* name = 0 );
    virtual ~TransferServer();

    void newConnection( int socket );
};

class SyncAuthentication : QObject
{
    Q_OBJECT

public:
    static int isAuthorized(QHostAddress peeraddress);
    static bool checkPassword(const QString& pw);
    static bool checkUser(const QString& user);

    static QString serverId();
    static QString loginName();
    static QString ownerName();
};


class ServerDTP : public QSocket
{
    Q_OBJECT

public:
    ServerDTP( QObject *parent = 0, const char* name = 0 );
    ~ServerDTP();

    enum Mode{ Idle = 0, SendFile, SendGzipFile, SendBuffer,
	       RetrieveFile, RetrieveGzipFile, RetrieveBuffer };

    void sendFile( const QString fn );
    void sendFile( const QString fn, const QHostAddress& host, Q_UINT16 port );
    void sendGzipFile( const QString &fn, const QStringList &archiveTargets );
    void sendGzipFile( const QString &fn, const QStringList &archiveTargets,
		       const QHostAddress& host, Q_UINT16 port );
    void sendByteArray( const QByteArray& array );
    void sendByteArray( const QByteArray& array, const QHostAddress& host, Q_UINT16 port );

    void retrieveFile( const QString fn );
    void retrieveFile( const QString fn, const QHostAddress& host, Q_UINT16 port );
    void retrieveGzipFile( const QString &fn );
    void retrieveGzipFile( const QString &fn, const QHostAddress& host, Q_UINT16 port );
    void retrieveByteArray();
    void retrieveByteArray( const QHostAddress& host, Q_UINT16 port );

    Mode dtpMode() { return mode; }
    QByteArray buffer() { return buf.buffer(); }
    QString fileName() const { return file.name(); }

    void setSocket( int socket );

signals:
    void completed();
    void failed();

private slots:
    void connectionClosed();
    void connected();
    void bytesWritten( int bytes );
    void readyRead();
    void writeTargzBlock(OProcess *, char *, int);
    void targzDone();

    void gzipTarBlock(OProcess *, char *, int);
    void tarExtractBlock(OProcess *, char *, int);
    void gunzipDone();
    void extractTarDone();

private:

    unsigned long bytes_written;
    Mode mode;
    QFile file;
    QBuffer buf;
    OProcess *createTargzProc;
    OProcess *retrieveTargzProc;
    OProcess *gzipProc;
};

class ServerSocket : public QServerSocket
{
    Q_OBJECT

public:
    ServerSocket( Q_UINT16 port, QObject *parent = 0, const char* name = 0 )
	: QServerSocket( port, 1, parent, name ) {}

    void newConnection( int socket ) { emit newIncomming( socket ); }
signals:
    void newIncomming( int socket );
};

class ServerPI : public QSocket
{
    Q_OBJECT

    enum State { Connected, Wait_USER, Wait_PASS, Ready, Forbidden };
    enum Transfer { SendFile = 0, RetrieveFile = 1, SendByteArray = 2, RetrieveByteArray = 3 };

public:
    ServerPI( int socket, QObject *parent = 0, const char* name = 0 );
    virtual ~ServerPI();

protected slots:
    void read();
    void send( const QString& msg );
    void process( const QString& command );
    void connectionClosed();
    void dtpCompleted();
    void dtpFailed();
    void dtpError( int );
    void newConnection( int socket );

protected:
    bool checkReadFile( const QString& file );
    bool checkWriteFile( const QString& file );
    bool parsePort( const QString& pw );
    bool backupRestoreGzip( const QString &file, QStringList &targets );
    bool backupRestoreGzip( const QString &file );

    bool sendList( const QString& arg );
    void sendFile( const QString& file );
    void retrieveFile( const QString& file );

    QString permissionString( QFileInfo *info );
    QString fileListing( QFileInfo *info );
    QString absFilePath( const QString& file );

    void timerEvent( QTimerEvent *e );

private:
    State state;
    Q_UINT16 peerport;
    QHostAddress peeraddress;
    bool passiv;
    bool wait[4];
    ServerDTP *dtp;
    ServerSocket *serversocket;
    QString waitfile;
    QDir directory;
    QByteArray waitarray;
    QString renameFrom;
    QString lastCommand;
    int waitsocket;
};