This repository has been archived by the owner on May 8, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 16
/
duktoprotocol.h
130 lines (113 loc) · 4.99 KB
/
duktoprotocol.h
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
/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users
* Copyright (C) 2011 Emanuele Colombo
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef DUKTOPROTOCOL_H
#define DUKTOPROTOCOL_H
#include <QObject>
#include <QtNetwork/QUdpSocket>
#include <QtNetwork/QTcpSocket>
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QHostInfo>
#include <QHash>
#include <QFile>
#include <QStringList>
#include "peer.h"
class DuktoProtocol : public QObject
{
Q_OBJECT
public:
DuktoProtocol();
virtual ~DuktoProtocol();
void initialize();
void setPorts(qint16 udp, qint16 tcp);
void sayHello(QHostAddress dest);
void sayHello(QHostAddress dest, qint16 port);
void sayGoodbye();
inline QHash<QString, Peer>& getPeers() { return mPeers; }
void sendFile(QString ipDest, qint16 port, QStringList files);
void sendText(QString ipDest, qint16 port, QString text);
void sendScreen(QString ipDest, qint16 port, QString path);
inline bool isBusy() { return mIsSending || mIsReceiving; }
void abortCurrentTransfer();
void updateBuddyName();
public slots:
void newUdpData();
void newIncomingConnection();
void readNewData();
void closedConnection();
void closedConnectionTmp();
void sendMetaData();
void sendData(qint64 b);
void sendConnectError(QAbstractSocket::SocketError);
signals:
void peerListAdded(Peer peer);
void peerListRemoved(Peer peer);
void sendFileComplete();
void sendFileError(int code);
void sendFileAborted();
void receiveFileStart(QString senderIp);
void receiveFileComplete(QStringList *files, qint64 totalSize);
void receiveTextComplete(QString *text, qint64 totalSize);
void receiveFileCancelled();
void transferStatusUpdate(qint64 total, qint64 partial);
private:
QString getSystemSignature();
QStringList expandTree(const QStringList& files);
void addRecursive(QStringList& e, QString path);
qint64 computeTotalSize(const QStringList& e);
QByteArray nextElementHeader();
void sendToAllBroadcast(const QByteArray& packet, const QList<qint16>& ports);
void closeCurrentTransfer(bool aborted = false);
void handleMessage(QByteArray &data, QHostAddress &sender);
void updateStatus();
QUdpSocket *mSocket; // Socket UDP segnalazione
QTcpServer *mTcpServer; // Socket TCP attesa dati
QTcpSocket *mCurrentSocket; // Socket TCP dell'attuale trasferimento file
QHash<QString, Peer> mPeers; // Elenco peer individuati
// Send and receive members
qint16 mLocalUdpPort;
qint16 mLocalTcpPort;
bool mIsSending;
bool mIsReceiving;
QFile *mCurrentFile; // Puntatore al file aperto corrente
qint64 mTotalSize; // Quantità totale di dati da inviare o ricevere
int mFileCounter; // Puntatore all'elemento correntemente da trasmettere o ricevere
// Sending members
QStringList mFilesToSend; // Elenco degli elementi da trasmettere
qint64 mSentData; // Quantità di dati totale trasmessi
qint64 mSentBuffer; // Quantità di dati rimanenti nel buffer di trasmissione
QString mBasePath; // Percorso base per l'invio di file e cartelle
QString mTextToSend; // Testo da inviare (in caso di invio testuale)
bool mSendingScreen; // Flag che indica se si sta inviando uno screenshot
// Receive members
qint64 mElementsToReceiveCount; // Numero di elementi da ricevere
qint64 mTotalReceivedData; // Quantità di dati ricevuti totale
qint64 mElementReceivedData; // Quantità di dati ricevuti per l'elemento corrente
qint64 mElementSize; // Dimensione dell'elemento corrente
QString mRootFolderName; // Nome della cartella principale ricevuta
QString mRootFolderRenamed; // Nome della cartella principale da utilizzare
QStringList *mReceivedFiles; // Elenco degli elementi da trasmettere
QByteArray mTextToReceive; // Testo ricevuto in caso di invio testo
bool mReceivingText; // Ricezione di testo in corso
QByteArray mPartialName; // Nome prossimo file letto solo in parte
enum RecvStatus {
FILENAME,
FILESIZE,
DATA
} mRecvStatus;
};
#endif // DUKTOPROTOCOL_H