00001 #ifndef COMMUNICATION_H
00002 #define COMMUNICATION_H
00003
00004 #include <QObject>
00005 #include <QHostAddress>
00006 #include <QUdpSocket>
00007 #include <QList>
00008 #include <QString>
00009 #include <QHash>
00010 #include <QTime>
00011 #include <QTimer>
00012
00013 #include "fileTransfer.h"
00014
00018 uint qHash (const QHostAddress &ip);
00019
00024 class LanPacket
00025 {
00026 public:
00027
00032 enum PacketType
00033 {
00034 Invalid=0,
00035 Welcome, Hi, Bye,
00036 Ping, Pong,
00037 SysPing, SysPong,
00038 Bmsg, BmsgOk,
00039 Pmsg, PmsgOk,
00040 FileReq, FileOk, FileRefuse
00041 };
00042
00046 LanPacket ();
00047
00052 LanPacket (const QByteArray &data);
00053
00058 LanPacket (const enum PacketType packet_type);
00059
00067 LanPacket (const enum PacketType packet_type, const QString& str_data, quint32 file_size=0, quint16 port=0);
00068
00073 bool isValid () const;
00074
00079 QByteArray constData ();
00080
00085 PacketType getType () const;
00086
00091 quint16 getSize () const;
00092
00097 QString getString () const;
00098
00103 quint32 getFileSize () const;
00104
00109 quint16 getPort () const;
00110
00111 private:
00112
00119 QByteArray packInt (quint32 num, bool bit32=false);
00120
00124 void clearData ();
00125
00129 bool validate ();
00130
00131 bool is_valid;
00132 QByteArray packet_data;
00133 LanPacket::PacketType packet_type;
00134 quint16 data_size;
00135 QString str_data;
00136 quint32 file_size;
00137 quint16 port;
00138 };
00139
00140
00146 class Communication : public QObject
00147 {
00148 Q_OBJECT
00149 public:
00153 Communication ();
00154
00158 ~Communication ();
00159
00168 void welcome (const QString& nick, QHostAddress broadcast, quint16 port=2310);
00169
00175 void bye ();
00176
00184 void sendPMsg (const QHostAddress& user_ip, const QString& msg);
00185
00192 void sendBMsg (const QString& msg);
00193
00204 void sendFile (QHostAddress user_ip, QString file_name);
00205
00214 void checkPing (QHostAddress user_ip);
00215
00224 void acceptFileRequest (QHostAddress user_ip, const QString &path);
00225
00233 void refuseFileRequest (QHostAddress user_ip);
00234
00240 void cancelTranfer ();
00241
00242 signals:
00243
00249 void connected ();
00250
00256 void unableConnect ();
00257
00264 void newUser(QHostAddress user_ip, QString user_nick);
00265
00271 void leaveUser (QHostAddress user_ip);
00272
00279 void recvPMsg (QHostAddress user_ip, QString msg);
00280
00287 void recvBMsg (QHostAddress user_ip, QString msg);
00288
00298 void fileRequest (QHostAddress user_ip, QString file_name, quint32 size);
00299
00307 void acceptSendFile (QHostAddress user_ip, QString file_name);
00308
00316 void refuseSendFile (QHostAddress user_ip, QString file_name);
00317
00324 void transferEnd (QHostAddress user_ip, bool ok);
00325
00331 void fileProgress (int perc);
00332
00339 void pong (QHostAddress user_ip, qint32 time);
00340
00346 void invalidNick ();
00347
00348
00349 protected:
00350
00354 struct SendFileTime
00355 {
00356 QString name;
00357 QTime time;
00358 };
00359
00364 struct RecvFileSize
00365 {
00366 QString name;
00367 quint32 size;
00368 };
00369
00374 struct QueueItem
00375 {
00376 LanPacket packet;
00377 QTime last_send;
00378 QString md5;
00379 QHash<QHostAddress, int> num_err;
00380 };
00381
00382 QString user_nick;
00383 QHostAddress broadcast;
00384 QList<QHostAddress> ip_list;
00385 QUdpSocket read_socket;
00386 bool is_connect;
00387 bool connecting;
00388 QHash<QHostAddress, QTime> ping_list;
00389 QHash<QHostAddress, SendFileTime> send_file_list;
00390 QHash<QHostAddress, RecvFileSize> incoming_file;
00391 QList<QueueItem> packet_queue;
00392 QTimer *packet_timer;
00393 QTimer *ping_timer;
00394 QTimer *connect_timer;
00395 quint32 rand_num;
00396 QHostAddress my_ip;
00397 quint16 main_port;
00398
00399 bool is_transfer;
00400 FileTransfer* file_transfer;
00408 void connectOk (const QHostAddress &ip);
00409
00415 void connectFail ();
00416
00423 void checkConnection (const QString &place);
00424
00432 void sendPacket (QHostAddress ip, LanPacket packet, bool control=false);
00433
00440 void servicePacket (LanPacket& packet, QHostAddress ip);
00441
00447 void removeUser (QHostAddress user_ip);
00448
00456 void removeQueue (QHostAddress user_ip, LanPacket::PacketType pack_type, QString md5);
00457
00458
00459
00460
00461 private slots:
00462
00468 void readData ();
00469
00474 void packetTimer ();
00475
00480 void sysPingTimer ();
00481
00487 void connectTimeOut ();
00488
00494 void fileTransferEnd (bool ok);
00495
00501 void fileTransferProgres (int perc);
00502 };
00503
00504
00505 #endif
00506