#include "widget.h"
#include "ui_widget.h"
#include <QSqlQuery>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
port = 8000;
sendport = 8001;
socket = new QUdpSocket();
socket->bind(port,QUdpSocket::ShareAddress
| QUdpSocket::ReuseAddressHint);
connect(socket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
ui->tableWidget->setColumnCount(2);
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
ui->tableWidget->verticalHeader()->setHidden(true);
QStringList header;
header << tr("username") <<tr("ipAddress");
ui->tableWidget->setHorizontalHeaderLabels(header);
ui->tableWidget->setSortingEnabled(true);
}
Widget::~Widget()
{
qDebug()<<"finish";
delete ui;
}
void Widget::processPendingDatagrams()
{
while(socket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
socket->readDatagram(datagram.data(),datagram.size());
QDataStream in(&datagram,QIODevice::ReadOnly);
int messageType;
in >> messageType;
switch(messageType)
{
case Message:
{
QString send_user,rec_ip,send_msg;
in >> send_user >>rec_ip >>send_msg;
qDebug()<<send_user <<rec_ip<<send_msg;
sendMessage(Message,rec_ip,tr("%1/%2").arg(send_user).arg(send_msg));
break;
}
case NewParticipant:
{
QString username,address;
in >>username >>address;
update_online_user(username,address);
break;
}
case ParticipantLeft:
{
QString username;
in >> username;
del_online_user(username);
break;
}
case Load:
{
QString username,pwd,ipAddress;
in >> username >> pwd >> ipAddress;
// qDebug()<<username<<pwd<<ipAddress;
QSqlQuery query;
query.prepare("select * from user where username="+tr("'%1'").arg(username));
// qDebug()<<"select * from user where username="+tr("%1").arg(username);
query.exec();
if(query.next())
{
if(pwd==query.value(1).toString())//用户名密码正确
{
//验证用户是否已经登录
if(ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
sendMessage(Load,ipAddress,tr("succ"));
else
sendMessage(Load,ipAddress,tr("online"));
}
else//密码错误
{
sendMessage(Load,ipAddress,tr("pwdErro"));
}
}
else//用户名不存在
{
sendMessage(Load,ipAddress,tr("userErro"));
}
break;
}
case Reg_User:
{
QString username,pwd,address;
in >>username >>pwd >> address;
// qDebug()<<username<<pwd<<address;
QSqlQuery query;
query.prepare("select * from user where username="+tr("'%1'").arg(username));
query.exec();
if(query.next())
{
sendMessage(Reg_User,address,tr("false"));
return;
}
query.prepare("insert into user values("+tr("'%1','%2')").arg(username).arg(pwd));
// qDebug()<<"insert into user values("+tr("'%1','%2')").arg(username).arg(pwd);
if(query.exec())
sendMessage(Reg_User,address,tr("succ"));
else
sendMessage(Reg_User,address,tr("overtime"));
break;
}
case Send_File:
{
QString username,rec_ip,filename,lisport;
in >>username >>rec_ip >>filename >>lisport;
sendMessage(Send_File,rec_ip,tr("%1/%2/%3").arg(username).arg(filename).arg(lisport));
break;
}
case Refuse:
{
QString send_name,ipaddress;
in >>send_name>>ipaddress;
sendMessage(Refuse,ipaddress,send_name);
break;
}
default:
{
break;
}
}
}
}
void Widget::sendMessage(MessageType type, QString ipAddress, QString state)
{
qDebug()<<type<<ipAddress<<state;
qDebug()<<state;
QByteArray data;
QDataStream out(&data,QIODevice::WriteOnly);
out << type;
switch(type)
{
case Message:
{
out << state.split("/").at(0);
out << state.right(state.length()-state.indexOf("/")-1);
break;
}
case NewParticipant:
{
out << state.split("/").at(0) << state.split("/").at(1);
break;
}
case ParticipantLeft:
{
out << state;
break;
}
case Load:
{
out << state;
break;
}
case Reg_User:
{
out << state;
break;
}
case Send_File:
{
out <<state.split("/").at(0)<<state.split("/").at(1)<< state.split("/").at(2);
break;
}
case Refuse:
{
out <<state;
break;
}
default:
{
break;
}
}
socket->writeDatagram(data.data(),data.length(),QHostAddress(ipAddress),sendport);
}
void Widget::update_online_user(QString username, QString ipaddress)
{
if(ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
{
int row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);
ui->tableWidget->setItem(row,0,(new QTableWidgetItem(username)));
ui->tableWidget->setItem(row,1,(new QTableWidgetItem(ipaddress)));
sendMessage(NewParticipant,tr("192.168.0.255"),tr("%1/%2").arg(username).arg(ipaddress));
}
}
void Widget::del_online_user(QString username)
{
qDebug()<<"delete "<<username;
if(!ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty())
{
int row = ui->tableWidget->findItems(username,Qt::MatchExactly).first()->row();
ui->tableWidget->removeRow(row);
sendMessage(ParticipantLeft,tr("192.168.0.255"),username);
}
}