FileTrans/mainwindow.cpp

381 lines
17 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
settings(QApplication::organizationName(), QApplication::applicationName())
{
ui->setupUi(this);
setFixedSize(400, 500);
ui->lineEdit_port->setValidator(new QIntValidator(1024, 65535, this));
ui->lineEdit_root_dir->setText(settings.value("Directory", QApplication::applicationDirPath()).toString());
QAction *action_browse = new QAction;
action_browse->setIcon(QIcon::fromTheme("folder"));
ui->lineEdit_root_dir->addAction(action_browse, QLineEdit::TrailingPosition);
connect(action_browse, &QAction::triggered, [=](){
QString dir = QFileDialog::getExistingDirectory(this, tr("Root Directory"),
settings.value("Directory", QApplication::applicationDirPath()).toString(),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (dir != "") {
ui->lineEdit_root_dir->setText(dir);
settings.setValue("Directory", ui->lineEdit_root_dir->text());
}
});
connect(ui->lineEdit_message, &QLineEdit::returnPressed, [=](){
on_pushButton_send_pressed();
});
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface interface, list) {
QList<QNetworkAddressEntry> entryList = interface.addressEntries();
foreach (QNetworkAddressEntry entry, entryList) {
if (!entry.ip().toString().contains("::") && entry.ip().toString() != "127.0.0.1") {
IP = entry.ip().toString();
ui->lineEdit_ip->setText(IP);
}
}
}
connect(ui->pushButton_start, &QPushButton::toggled, [=](bool b){
if (b) {
state = 0;
port_local = 9999;
while (!tcpServer->listen(QHostAddress::Any, port_local)) {
port_local--;
}
ui->label_local->setText(IP + ":" + QString::number(port_local));
ui->lineEdit_port->setText(QString::number(port_local));
ui->textBrowser->clear();
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] 监听:" + IP + ":" + QString::number(port_local));
ui->pushButton_start->setText("Stop");
} else {
tcpServer->close();
ui->pushButton_start->setText("Start");
}
});
connect(ui->pushButton_add, &QPushButton::clicked, [=]{
if (path == "")
path = ".";
QStringList SL_path = QFileDialog::getOpenFileNames(this, "上传文件", path);
//qDebug() << SL_path;
for (int i=0; i<SL_path.length(); i++) {
QString filepath = SL_path.at(i);
path = filepath;
//qDebug() << filepath;
upload(filepath);
}
});
connect(ui->pushButton_clear, &QPushButton::clicked, [=]{
ui->textBrowser->clear();
});
tcpServer = new QTcpServer(this);
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnect()));
ui->pushButton_start->toggle();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::newConnect()
{
tcpSocket = tcpServer->nextPendingConnection();
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] " + tcpSocket->peerAddress().toString().replace("::ffff:","") + ":" + QString::number(tcpSocket->peerPort()));
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
connect(tcpSocket, &QTcpSocket::disconnected, [=](){
qDebug() << state;
if (state == 0) {
if (type == "file")
state = 1;
} else {
file.close();
file.open(QIODevice::ReadOnly);
qDebug() << "setFileTime" << file.setFileTime(QDateTime::fromTime_t(lastModified), QFileDevice::FileModificationTime);
file.close();
state = 0;
length = 0;
}
});
//connect(tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){
connect(tcpSocket, &QAbstractSocket::errorOccurred, [=](QAbstractSocket::SocketError socketError){
qDebug() << socketError;
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketError>();
QString errorString = metaEnum.valueToKey(socketError);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] newConnect: " + errorString);
});
}
void MainWindow::readyRead()
{
QByteArray BA = tcpSocket->readAll();
QString IP_remote = tcpSocket->peerAddress().toString().replace("::ffff:","") + ":" + QString::number(tcpSocket->peerPort());
if (state == 0) {
QString s = BA;
QJsonParseError JPE;
QJsonDocument JD = QJsonDocument::fromJson(s.toUtf8(), &JPE);
QString fileName = "?";
if (JPE.error == QJsonParseError::NoError) {
if (JD.isObject()) {
QJsonObject JO = JD.object();
type = JO.value("type").toString();
if (type == "text") {
QString message = JO.value("message").toString();
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] [" + IP_remote + "] " + message);
} else if (type == "command") {
QString command = JO.value("message").toString();
if (command == "capture") {
QScreen *screen = QApplication::primaryScreen();
QPixmap pixmap = screen->grabWindow(QApplication::desktop()->winId());
upload(pixmap, tcpSocket->peerAddress(), tcpSocket->localPort());
}
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] [" + IP_remote + "] " + command);
} else if (type == "open") {
QString surl = JO.value("message").toString();
QDesktopServices::openUrl(QUrl(surl));
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] [" + IP_remote + "] open " + surl);
} else if (type == "file") {
fileName = JO.value("fileName").toString();
lastModified = JO.value("lastModified").toDouble()/1000;
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] [" + IP_remote + "]" + fileName);
QString filepath = ui->lineEdit_root_dir->text() + "/" + fileName;
file.setFileName(filepath);
file.open(QIODevice::WriteOnly);
}
}
}
} else if (state == 1) {
file.write(BA);
length += BA.length();
ui->statusBar->showMessage("接收:" + BS(length));
}
}
QString MainWindow::BS(long b)
{
QString s = "";
if (b > 999999999) {
s = QString::number(b/(1024*1024*1024.0), 'f', 2) + " GB";
} else {
if (b > 999999) {
s = QString::number(b/(1024*1024.0), 'f', 2) + " MB";
} else {
if (b > 999) {
s = QString::number(b/(1024.0), 'f', 2) + " KB";
} else {
s = QString::number(b) + " B";
}
}
}
return s;
}
void MainWindow::on_pushButton_openDir_pressed()
{
QDesktopServices::openUrl(QUrl(ui->lineEdit_root_dir->text()));
}
void MainWindow::on_pushButton_send_pressed()
{
QString s = ui->lineEdit_message->text();
if (s == "")
return;
qint64 port = ui->lineEdit_port->text().toInt();
QTcpSocket *tcpSocket1 = new QTcpSocket(this);
//connect(tcpSocket1, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){
connect(tcpSocket1, &QAbstractSocket::errorOccurred, [=](QAbstractSocket::SocketError socketError){
qDebug() << socketError;
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketError>();
QString errorString = metaEnum.valueToKey(socketError);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] Text: " + errorString);
});
tcpSocket1->connectToHost(QHostAddress(ui->lineEdit_ip->text()), port);
connect(tcpSocket1, &QTcpSocket::connected, [=](){
QJsonObject JO;
JO.insert("type", "text");
JO.insert("message", s);
QString s = QJsonDocument(JO).toJson(QJsonDocument::Compact);
tcpSocket1->write(s.toUtf8());
tcpSocket1->close();
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] 发送:" + s);
ui->lineEdit_message->setText("");
});
}
void MainWindow::on_pushButton_open_pressed()
{
QString s = ui->lineEdit_message->text();
if (s == "")
return;
qint64 port = ui->lineEdit_port->text().toInt();
QTcpSocket *tcpSocket1 = new QTcpSocket(this);
//connect(tcpSocket1, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){
connect(tcpSocket1, &QAbstractSocket::errorOccurred, [=](QAbstractSocket::SocketError socketError){
qDebug() << socketError;
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketError>();
QString errorString = metaEnum.valueToKey(socketError);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] Play: " + errorString);
});
tcpSocket1->connectToHost(QHostAddress(ui->lineEdit_ip->text()), port);
connect(tcpSocket1, &QTcpSocket::connected, [=](){
QJsonObject JO;
JO.insert("type", "open");
JO.insert("message", s);
QString s = QJsonDocument(JO).toJson(QJsonDocument::Compact);
tcpSocket1->write(s.toUtf8());
tcpSocket1->close();
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] 发送 " + s);
});
}
void MainWindow::on_pushButton_capture_pressed()
{
qint64 port = ui->lineEdit_port->text().toInt();
QTcpSocket *tcpSocket1 = new QTcpSocket(this);
//connect(tcpSocket1, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){
connect(tcpSocket1, &QAbstractSocket::errorOccurred, [=](QAbstractSocket::SocketError socketError){
qDebug() << socketError;
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketError>();
QString errorString = metaEnum.valueToKey(socketError);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] Capture: " + errorString);
});
tcpSocket1->connectToHost(QHostAddress(ui->lineEdit_ip->text()), port);
connect(tcpSocket1, &QTcpSocket::connected, [=](){
QJsonObject JO;
JO.insert("type", "command");
JO.insert("message", "capture");
QString s = QJsonDocument(JO).toJson(QJsonDocument::Compact);
tcpSocket1->write(s.toUtf8());
tcpSocket1->close();
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] command capture");
});
}
void MainWindow::upload(QString filepath)
{
if (ui->lineEdit_ip->text() == IP) {
ui->statusBar->showMessage("不需要上传给自己!");
return;
}
qint64 port = ui->lineEdit_port->text().toInt();
QTcpSocket *tcpSocket1 = new QTcpSocket(this);
//connect(tcpSocket1, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){
connect(tcpSocket1, &QAbstractSocket::errorOccurred, [=](QAbstractSocket::SocketError socketError){
qDebug() << socketError;
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketError>();
QString errorString = metaEnum.valueToKey(socketError);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] File: " + errorString);
});
tcpSocket1->connectToHost(QHostAddress(ui->lineEdit_ip->text()), port);
connect(tcpSocket1, &QTcpSocket::connected, [=](){
QString fileName = QFileInfo(filepath).fileName();
QJsonObject JO;
JO.insert("type", "file");
JO.insert("fileName", fileName);
JO.insert("lastModified", static_cast<qint64>(QFileInfo(filepath).lastModified().toTime_t())*1000);
QString s = QJsonDocument(JO).toJson(QJsonDocument::Compact);
tcpSocket1->write(s.toUtf8());
tcpSocket1->close();
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] 上传:" + s);
});
QTcpSocket *tcpSocket2 = new QTcpSocket(this);
//connect(tcpSocket2, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){
connect(tcpSocket2, &QAbstractSocket::errorOccurred, [=](QAbstractSocket::SocketError socketError){
qDebug() << socketError;
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketError>();
QString errorString = metaEnum.valueToKey(socketError);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] " + errorString);
});
tcpSocket2->connectToHost(QHostAddress(ui->lineEdit_ip->text()), port);
connect(tcpSocket2, &QTcpSocket::connected, [=](){
qint64 length1 = 0;
QFile file(filepath);
if (file.open(QIODevice::ReadOnly)) {
while (!file.atEnd()) {
QByteArray BA = file.read(10240); //每次读取10k数据
tcpSocket2->write(BA);
//qDebug() << "\b" << file.pos();
length1 += 10240;
ui->statusBar->showMessage("上传:" + BS(length1) + "/" + BS(file.size()));
}
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] " + "上传完成");
tcpSocket2->close();
}
});
}
void MainWindow::upload(QPixmap pixmap, QHostAddress hostAddress, quint64 port)
{
QTcpSocket *tcpSocket1 = new QTcpSocket(this);
//connect(tcpSocket1, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){
connect(tcpSocket, &QAbstractSocket::errorOccurred, [=](QAbstractSocket::SocketError socketError){
qDebug() << socketError;
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketError>();
QString errorString = metaEnum.valueToKey(socketError);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] Pixmap info: " + errorString);
});
tcpSocket1->connectToHost(hostAddress, port);
connect(tcpSocket1, &QTcpSocket::connected, [=](){
QString fileName = QDateTime::currentDateTime().toString("yyyyMMddHHmmss") + ".jpg";
QJsonObject JO;
JO.insert("type", "file");
JO.insert("fileName", fileName);
JO.insert("lastModified", 0);
QString s = QJsonDocument(JO).toJson(QJsonDocument::Compact);
tcpSocket1->write(s.toUtf8());
tcpSocket1->close();
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] 上传:" + s);
});
QTcpSocket *tcpSocket2 = new QTcpSocket(this);
//connect(tcpSocket2, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError socketError){
connect(tcpSocket, &QAbstractSocket::errorOccurred, [=](QAbstractSocket::SocketError socketError){
qDebug() << socketError;
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketError>();
QString errorString = metaEnum.valueToKey(socketError);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] Pixmap upload: " + errorString);
});
tcpSocket2->connectToHost(hostAddress, port);
connect(tcpSocket2, &QTcpSocket::connected, [=](){
//QPixmap编码成jpg的内存操作https://blog.csdn.net/jklinux/article/details/71699182
QByteArray BA;
QBuffer buffer(&BA);
if (!pixmap.save(&buffer, "jpg")) {
QMessageBox::critical(this, "Error", "QPixmap.save(QBuffer,\"jpg\") failed");
return;
}
tcpSocket2->write(BA);
ui->textBrowser->append("[" + QDateTime::currentDateTime().toString("HH:mm:ss") + "] Pixmap上传完成");
tcpSocket2->close();
});
}
void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{
//if(e->mimeData()->hasFormat("text/uri-list")) //只接收文件列表
e->acceptProposedAction(); //可以在这个窗口部件上拖放对象
}
void MainWindow::dropEvent(QDropEvent *e) //释放对方时,执行的操作
{
QList<QUrl> urls = e->mimeData()->urls();
qDebug() << urls << urls.size();
if (urls.isEmpty())
return;
foreach (QUrl url, urls) {
qDebug() << url.toString();
QString filepath = url.toLocalFile();
qDebug() << filepath;
upload(filepath);
}
}