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