communication.h

Idź do dokumentacji tego pliku.
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 

Wygenerowano Sun Jun 11 12:55:08 2006 dla lanChat programem  doxygen 1.4.6