#include "mytcpsocket.h"
#include <QDebug>
#include "mytcpserver.h"
#include <QDir> // 操作文件夹的库
#include <QDateTime>
#include <QTimer>
#include <QByteArray>
MyTcpSocket::MyTcpSocket()
{
m_uploadFile = new TransFile;
m_uploadFile->bTransform = false; // 默认不是在上传文件
m_pDownloadFile = new QFile;
m_pTimer = new QTimer;
//自己封装的MyTcpSocket函数,可以自己产生的socket,自己本身来接收处理
connect(this, SIGNAL(readyRead()), this, SLOT(recvMsg()));
//关联Socket连接断开与客户端下线处理槽函数
connect(this, SIGNAL(disconnected()), this, SLOT(clinetOffline()));
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(handledownloadFileData())); // 关联计时器倒计时
}
QString MyTcpSocket::getStrName()
{
return m_strName;
}
//处理注册请求并返回相应PDU
PDU* handleRegistRequest(PDU *pdu)
{
char caName[32] = {'\0'};
char caPwd[32] = {'\0'};
// 拷贝读取的信息
strncpy(caName, pdu->caData, 32);
strncpy(caPwd, pdu->caData + 32, 32 );
// qDebug() << pdu->uiMsgType << " " << caName << " " << caPwd;
// qDebug() << "-------------" ;
bool ret = DBoperate::getInstance().handleRegist(caName, caPwd); //处理请求,插入数据库
// 响应客户端
PDU *resPdu = mkPDU(0); // 响应消息
resPdu -> uiMsgType = ENUM_MSG_TYPE_REGIST_RESPOND;
if(ret)
{
strcpy(resPdu -> caData, REGIST_OK);
// 注册成功
QDir dir;
ret = dir.mkdir(QString("%1/%2").arg(MyTcpServer::getInstance().getStrRootPath()).arg(caName));
qDebug() << "创建新用户文件夹" << ret;
}
else
{
strcpy(resPdu -> caData, REGIST_FAILED);
}
// qDebug() << resPdu -> uiMsgType << " " << resPdu ->caData;
return resPdu;
}
PDU* handleLoginRequest(PDU *pdu, QString& m_strName)
{
// qDebug() << "登录前奏:";
char caName[32] = {'\0'};
char caPwd[32] = {'\0'};
// 拷贝读取的信息
strncpy(caName, pdu -> caData, 32);
strncpy(caPwd, pdu -> caData + 32, 32);
qDebug() << pdu -> uiMsgType << " " << caName << " " << caPwd;
bool ret = DBoperate::getInstance().handleLogin(caName, caPwd); // 处理请求,插入数据库
// 响应客户端
PDU *resPdu = NULL; // 响应消息
// resPdu -> uiMsgType = ENUM_MSG_TYPE_LOGIN_RESPOND;
if(ret)
{
QString strUserRootPath = QString("%1/%2").arg(MyTcpServer::getInstance().getStrRootPath()).arg(caName); //用户系统根目录
qDebug() << "登录用户的路径:" << strUserRootPath;
resPdu = mkPDU(strUserRootPath.size() + 1);
memcpy(resPdu -> caData, LOGIN_OK, 32);
memcpy(resPdu -> caData + 32, caName, 32); // 将登录后的用户名传回,便于tcpclient确认已经登陆的用户名
//登录成功时,记录Socket对应的用户名
m_strName = caName;
// 返回用户的根目录
strncpy((char*)resPdu -> caMsg, strUserRootPath.toStdString().c_str(), strUserRootPath.size() + 1);
}
else
{
resPdu = mkPDU(0);
strcpy(resPdu -> caData, LOGIN_FAILED);
}
// qDebug() << resPdu -> uiMsgType << " " << resPdu ->caData;
resPdu -> uiMsgType = ENUM_MSG_TYPE_LOGIN_RESPOND;
qDebug() << "登录处理:" << resPdu -> uiMsgType << " " << resPdu ->caData << " " << resPdu ->caData + 32;
return resPdu;
}
// 查询所有在线用户请求
PDU* handleOnlineUsersRequest()
{
QStringList strList = DBoperate::getInstance().handleOnlineUsers(); // 查询请求,查询数据库所有在线用户
uint uiMsgLen = strList.size() * 32; //消息报文长度
//响应客户端
PDU *resPDU = mkPDU(uiMsgLen); //响应消息
resPDU -> uiMsgType = ENUM_MSG_TYPE_ONLINE_USERS_RESPOND;
qDebug() << "在线用户数: " << strList.size();
for (int i = 0; i < strList.size(); i++)
{
memcpy((char*)(resPDU -> caMsg) + 32 * i, strList[i].toStdString().c_str(), strList[i].size());
qDebug() << "所有在线用户有:" << (char*)(resPDU->caMsg) + 32 * i;
}
return resPDU;
}
//查找用户
PDU* handleSearchUserRequest(PDU* pdu)
{
char caName[32] = {'\0'};
strncpy(caName, pdu->caData, 32);
int ret = DBoperate::getInstance().handleSearchUser(caName); // 处理查找用户,0存在不在线,1存在并在线,2不存在
//响应客户端
PDU *resPdu = mkPDU(0); //响应消息
resPdu -> uiMsgType = ENUM_MSG_TYPE_SEARCH_USERS_RESPOND;
// qDebug() << "----------------" << ret;
if(ret == 1)
{
strcpy(resPdu -> caData, SEARCH_USER_OK);
}
else if(ret == 0)
{
strcpy(resPdu->caData, SEARCH_USER_OFFLINE);
}
else if(ret == 2)
{
strcpy(resPdu->caData, SEARCH_USER_EMPTY);
}
return resPdu;
}
//同意加好友
void handleADDFriendAgree(PDU *pdu)
{
char addName[32] = {'\0'};
char sourceName[32] = {'\0'};
//拷贝读取的信息
strncpy(addName, pdu -> caData, 32);
strncpy(sourceName, pdu -> caData + 32, 32);
//将新的好友关系写入数据库
DBoperate::getInstance().handleAddFriendAgree(addName, sourceName);
//服务器需要转发给发送好友请求方其同意的消息
MyTcpServer::getInstance().forwardMsg(sourceName, pdu);
}
//拒绝加好友
void handleAddFriendReject(PDU *pdu)
{
char sourceName[32] = {'\0'};
//拷贝读取的信息
strncpy(sourceName, pdu -> caData + 32, 32);
//服务器需要转发给发送好友请求方其拒绝的消息
MyTcpServer::getInstance().forwardMsg(sourceName, pdu);
}
//处理添加好友请求
PDU* handleAddFriendRequest(PDU *pdu)
{
char addName[32] = {'\0'};
char sourceName[32] = {'\0'};
//拷贝读取的信息
strncpy(addName, pdu -> caData, 32);
strncpy(sourceName, pdu -> caData + 32, 32);
qDebug() << "handleAddFriendRequest " << addName << " " << sourceName;
int iSearchUserStatus = DBoperate::getInstance().handleAddFriend(addName, sourceName);
//0对方不在线,1.对方在线,2.对方不存在,3,已经好友,4.请求错误
PDU * resPdu = NULL;
switch(iSearchUserStatus)
{
case 0: //对方存在不在线
{
resPdu = mkPDU(0);
resPdu -> uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;
strcpy(resPdu->caData, ADD_FRIEND_OFFLINE);
break;
}
case 1: //对方存在在线
{
//需要转发给对方请求添加好友消息
MyTcpServer::getInstance().forwardMsg(addName, pdu);
resPdu = mkPDU(0);
resPdu -> uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;
strcpy(resPdu->caData, ADD_FRIEND_OK); //表示添加好友请求已经发送
break;
}
case 2: //用户不存在
{
resPdu = mkPDU(0);
resPdu -> uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;
strcpy(resPdu->caData, ADD_FRIEND_EMPTY);
break;
}
case 3: //已经是好友
{
resPdu = mkPDU(0);
resPdu -> uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;
strcpy(resPdu -> caData, ADD_FRIEND_EXIST);
break;
}
case 4:
{
resPdu = mkPDU(0);
resPdu -> uiMsgType = ENUM_MSG_TYPE_ADD_FRIEND_RESPOND;
strcpy(resPdu -> caData, UNKNOWN_ERROR);
break;
}
default:
break;
}
return resPdu;
}
//刷新好友列表请求
PDU *handleFlushFriendRequest(PDU *pdu)
{
char strName[32] = {'\0'};
strncpy(strName, pdu -> caData, 32);
QStringList strList = DBoperate::getInstance().handleFlushFriendRequest(strName);
uint uiMsgLen = strList.size() / 2 * 36; //36, char[32] 好友名字 + 4 int 在线状态
PDU *resPdu = mkPDU(uiMsgLen);
resPdu -> uiMsgType = ENUM_MSG_TYPE_FLUSH_FRIEND_RESPOND;
for(int i = 0; i * 2 < strList.size() ; ++i)
{
strncpy((char*)(resPdu->caMsg) + 36 * i,