#include "qqtcloudprotocol.h" #include "qqtversion.h" #include "qqtcore.h" #include "qqt-qt.h" QQtSocketTcpClient* QQTUpgradeClientInstance ( QObject* parent ) { static QQtSocketTcpClient* cli = NULL; if ( !cli ) { QStringList ip; ip << "222.175.114.244" << "124.133.1.54"; //"www.QQToo.com" cli = new QQtSocketTcpClient ( parent ); cli->SetServerIPAddress ( ip ); cli->SetServerPort ( 8089 ); } return cli; } QQtSocketTcpClient* QQTCloudClientInstance ( QObject* parent ) { static QQtSocketTcpClient* cli = NULL; if ( !cli ) { QStringList ip; ip << "222.175.114.244" << "124.133.1.54"; cli = new QQtSocketTcpClient ( parent ); cli->SetServerIPAddress ( ip ); cli->SetServerPort ( 7079 ); } return cli; } QQTCloudProtocol::QQTCloudProtocol ( QObject* parent ) : QQtProtocol ( parent ) { m_isLogined = false; m_heartCount = 0; m_UID = 0; timer = new QTimer ( this ); timer->setSingleShot ( false ); connect ( timer, SIGNAL ( timeout() ), this, SLOT ( sendHeatBeatMessage() ) ); connect ( this, SIGNAL ( signalSendData() ), this, SLOT ( sendUploadFileData() ), Qt::QueuedConnection ); connect ( this, SIGNAL ( signalDownData() ), this, SLOT ( sendDownFileData() ), Qt::QueuedConnection ); connect ( this, SIGNAL ( signalDownSucc() ), this, SLOT ( sendDownFileSuccess() ), Qt::QueuedConnection ); } QTCheckVersionResult& QQTCloudProtocol::GetVersionResult() { return m_versionresult; } QTCloudListDirResult& QQTCloudProtocol::GetDirList() { return m_dirs; } QTCloudListFileResult& QQTCloudProtocol::GetListedFiles() { return m_files; } bool QQTCloudProtocol::isLogined() { return m_isLogined; } void QQTCloudProtocol::startHeartBeat() { m_heartCount = 0; /* * TODO:心跳检测重连会不会引发这条消息? * 如果连接还未成功开始发送心跳包, * QNativeSocketEngine::write() was not called in QAbstractSocket::ConnectedState */ timer->start ( 30 * 1000 ); } void QQTCloudProtocol::stopHeartBeat() { m_heartCount = MAX_HEARDBEAT + 1; timer->stop(); } void QQTCloudProtocol::sendMessage ( quint16 cmd, QByteArray& data ) { QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( cmd ); qMsg.setData ( data ); qMsg.translate(); //pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); } bool QQTCloudProtocol::dispatcher ( const QByteArray& m ) { bool ret = true; QQTNetworkMessage qMsg; qMsg.parser ( m ); //pline() << qMsg; switch ( qMsg.cmd() ) { case _TCPCMD_LOGINRESUALT: recvLoginResultMessage ( qMsg ); break; case _TCPCMD_HEARTBEATRESP: recvHeatBeatResultMessage ( qMsg ); break; case _TCPCMD_CHECKVERSIONRSP: recvCheckVersionResult ( qMsg ); break; case _TCPCMD_RECEIVEDIRLIST: recvListDirResultMessage ( qMsg ); break; case _TCPCMD_RECEIVEADDRESUALT: recvAddDirResultMessage ( qMsg ); break; case _TCPCMD_RECEIVEALTERRESUALT: recvModDirResultMessage ( qMsg ); break; case _TCPCMD_RECEIVEDELETERESUALT: recvDelDirResultMessage ( qMsg ); break; case _TCPCMD_RECEIVEFILELIST: recvListFilesResultMessage ( qMsg ); break; case _TCPCMD_RECEIVEPUBLICDIRLIST: recvListPubDirResultMessage ( qMsg ); break; case _TCPCMD_RECEIVEPUBLICFILELIST: recvListPubFilesResultMessage ( qMsg ); break; case _TCPCMD_RECEIVEFILEINFO: recvDownFileResultMessage ( qMsg ); break; case _TCPCMD_RECEIVEFILEDATA: recvDownFileDataResultMessage ( qMsg ); break; case _TCPCMD_RECEIVECOMFIREFILEINFO: recvUploadFileResult ( qMsg ); break; case _TCPCMD_RECEIVECOMFIREFILEDATA: recvUploadFileDataResult ( qMsg ); break; case _TCPCMD_RECEIVECOMFIREFILE: recvUploadFileSuccess ( qMsg ); break; default: //pline() << "receive unknown command:" << hex << qMsg.cmd(); ret = false; break; } return ret; } void QQTCloudProtocol::sendHeatBeatMessage() { /* * 断链判断 如果断链 TODO: */ if ( m_heartCount > MAX_HEARDBEAT ) { #if 1 /* * 重连策略 30 * 2 s */ static int curp = 0; if ( curp >= 2 ) { curp = 0; emit signalReconnectQequest(); return; } curp++; #else /* * 此处设置重连策略 30s 150s 300s 600s */ static int p[4] = {1, 5, 10, 20}; static int curp = 0; static int curpos = 0; if ( curp >= p[curpos] ) { curp = 0; curpos = ( curpos + 1 ) % 4; connectToSingelHost(); return; } curp++; #endif return; } pline() << "HeartBeat Count:" << m_heartCount; m_heartCount++; QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( _TCPCMD_HEART ); qMsg.translate(); pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); //waitForBytesWritten(); } void QQTCloudProtocol::sendLoginMessage() { /* * 这个地方可能要改动,串口发过来的时字符串,不是hex */ QSettings set; QByteArray _name = set.value ( "Device/DeviceNo" ).toByteArray(); QByteArray _pwd = set.value ( "Device/Password" ).toByteArray(); QString name, pwd; for ( int i = 0; i < _name.size(); i++ ) name += QString::number ( ( quint8 ) _name[i], 16 ); for ( int i = 0; i < _pwd.size(); i++ ) pwd += QString::number ( ( quint8 ) _pwd[i], 16 ); name = name.toUpper(); pwd = pwd.toUpper(); m_isLogined = false; QTCloudLogin t; t.m_name = name; t.m_password = pwd; QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( _TCPCMD_LOGIN ); QByteArray d; packLoginData ( d, t ); qMsg.setData ( d ); qMsg.translate(); //pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); } void QQTCloudProtocol::sendLogoutMessage() { m_isLogined = false; QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( _TCPCMD_EXIT ); qMsg.translate(); //pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); } void QQTCloudProtocol::recvConnPoolFullMessage ( QQTNetworkMessage& ) {} void QQTCloudProtocol::recvLoginResultMessage ( QQTNetworkMessage& qMsg ) { m_UID = qMsg.uid(); QTCloudLoginResult qtLoginResult; parseLoginResultData ( qtLoginResult, qMsg.data() ); switch ( qtLoginResult.m_result ) { case 0x00: { pline() << "Login success id:" << hex << m_UID; m_isLogined = true; emit signalLoginSucc(); } break; case 0x10: pline() << "Other user logined"; break; case 0x11: pline() << "User unexisted"; break; case 0x12: pline() << "Password error upflowed"; break; case 0x23: case 0x22: case 0x21: pline() << "Password error" << hex << qtLoginResult.m_result; break; case 0xFF: default: pline() << "unknown error" << qtLoginResult.m_result; break; } if ( 0x00 != qtLoginResult.m_result ) emit signalLoginFail(); } void QQTCloudProtocol::recvHeatBeatResultMessage ( QQTNetworkMessage& ) { m_heartCount = 0; pline() << "HeartBeat Callback"; } void QQTCloudProtocol::packCheckVersionData ( QByteArray& l, const QTCheckVersion& t ) { packKeyWordToByteArray ( l, _TCP_SECTION_SOFTWAREID, t.m_softwareid ); packKeyWordToByteArray ( l, _TCP_SECTION_DEVICECODE, t.m_devicecode ); packKeyWordToByteArray ( l, _TCP_SECTION_SOFTWARECODE, t.m_softwarecode ); packKeyWordToByteArray ( l, _TCP_SECTION_VERSION, t.m_version ); } void QQTCloudProtocol::parseCheckVersionResultData ( QTCheckVersionResult& t, const QByteArray& l ) { quint32 pos = 0; QByteArray b = l; t.m_softwareid = parseKeyWordInByteArray ( b, _TCP_SECTION_SOFTWAREID, pos ); t.m_devicecode = parseKeyWordInByteArray ( b, _TCP_SECTION_DEVICECODE, pos ); t.m_softwarecode = parseKeyWordInByteArray ( b, _TCP_SECTION_SOFTWARECODE, pos ); t.m_version = parseKeyWordInByteArray ( b, _TCP_SECTION_VERSION, pos ); t.m_NewSoftwareID = parseKeyWordInByteArray ( b, _TCP_SECTION_NEWSOFTWAREID, pos ); /* * 和公共文件区域的一样,郑工服务器端按照 */ QByteArray m_Explain = parseKeyWordInByteArray ( b, _TCP_SECTION_EXPLAIN, pos ); QTextCodec* Codec = QTextCodec::codecForName ( "gbk" ); t.m_Explain = Codec->toUnicode ( m_Explain ); t.m_ReleaseStatus = parseKeyWordInByteArray ( b, _TCP_SECTION_RELEASESTAT, pos ); t.m_ReleaseDate = parseKeyWordInByteArray ( b, _TCP_SECTION_RELEASEDATE, pos ); t.m_FileName = parseKeyWordInByteArray ( b, _TCP_SECTION_FILENAME, pos ); t.m_FileMD5 = parseKeyWordInByteArray ( b, _TCP_SECTION_FILEMD5, pos ); t.m_FileSize = parseKeyWordInByteArray ( b, _TCP_SECTION_FILESIZE, pos ); } void QQTCloudProtocol::sendCheckVersion() { QTCheckVersion t; t.m_softwareid = "0"; t.m_devicecode = "0601"; t.m_softwarecode = "211100"; t.m_version = ""; quint16 _tcpcmd = _TCPCMD_CHECKVERSION; QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( _tcpcmd ); QByteArray d; packCheckVersionData ( d, t ); qMsg.setData ( d ); qMsg.translate(); //pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); } void QQTCloudProtocol::sendCheckNewVersion() { QTCheckVersion t; t.m_softwareid = m_versionresult.m_NewSoftwareID; t.m_devicecode = ""; t.m_softwarecode = ""; t.m_version = ""; quint16 _tcpcmd = _TCPCMD_CHECKVERSION; QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( _tcpcmd ); QByteArray d; packCheckVersionData ( d, t ); qMsg.setData ( d ); qMsg.translate(); //pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); } void QQTCloudProtocol::recvCheckVersionResult ( QQTNetworkMessage& qMsg ) { parseCheckVersionResultData ( m_versionresult, qMsg.data() ); emit signalCheckVersionResult(); } void QQTCloudProtocol::packListDirData ( QByteArray& l, const QTCloudListDir& t ) { l = t.m_code.toLatin1(); } void QQTCloudProtocol::parseListDirResultData ( QTCloudListDirResult& r, const QByteArray& l ) { quint32 pos = 0; QByteArray b = l; QByteArray h; h = parseKeyWordInByteArray ( b, _TCP_SECTION_UPCODE, pos ); r.m_upcode = h; while ( pos < b.length() ) { _QTCloudListDirResult _r; QByteArray __r; __r = parseKeyWordInByteArray ( b, _TCP_SECTION_ID, pos ); _r.m_id = __r; __r = parseKeyWordInByteArray ( b, _TCP_SECTION_CODE, pos ); _r.m_code = __r; __r = parseKeyWordInByteArray ( b, _TCP_SECTION_NAME, pos ); _r.m_name = __r; r.m_dir.push_back ( _r ); } } void QQTCloudProtocol::packAddDirData ( QByteArray& l, const QTCloudAddDir& t ) { packKeyWordToByteArray ( l, _TCP_SECTION_UPCODE, t.m_upcode ); packKeyWordToByteArray ( l, _TCP_SECTION_CODE, t.m_code ); packKeyWordToByteArray ( l, _TCP_SECTION_NAME, t.m_name ); } void QQTCloudProtocol::parseAddDirResultData ( QTCloudAddDirResult& t, const QByteArray& l ) { quint32 pos = 0; QByteArray b = l; t.m_upcode = parseKeyWordInByteArray ( b, _TCP_SECTION_UPCODE, pos ); t.m_result = parseKeyWordInByteArray ( b, _TCP_SECTION_RESULE, pos ); } void QQTCloudProtocol::packDelFileData ( QByteArray& l, const QTCloudDelFile& t ) { packKeyWordToByteArray ( l, _TCP_SECTION_CODE, t.m_code ); packKeyWordToByteArray ( l, _TCP_SECTION_ID, t.m_id ); } void QQTCloudProtocol::parseListFileResultData ( QTCloudListFileResult& r, const QByteArray& l ) { quint32 pos = 0; QByteArray b = l; QByteArray h; h = parseKeyWordInByteArray ( b, _TCP_SECTION_CODE, pos ); r.m_code = h; while ( pos < b.length() ) { _QTCloudListFileResult _r; QByteArray __r; __r = parseKeyWordInByteArray ( b, _TCP_SECTION_ID, pos ); _r.m_id = __r; __r = parseKeyWordInByteArray ( b, _TCP_SECTION_NAME, pos ); _r.m_name = __r; __r = parseKeyWordInByteArray ( b, _TCP_SECTION_SIZE, pos ); _r.m_size = __r; __r = parseKeyWordInByteArray ( b, _TCP_SECTION_DATE, pos ); _r.m_date = __r; r.m_file.push_back ( _r ); } } void QQTCloudProtocol::packDownDevFileData ( QByteArray& l, const QTCloudDownDevFile& t ) { l = t.m_id.toLatin1(); } void QQTCloudProtocol::parseDownDevFileResultData ( QTCloudDownDevFileResult& t, const QByteArray& l ) { quint32 pos = 0; QByteArray b = l; t.m_fileno = parseKeyWordInByteArray ( b, _TCP_SECTION_FILENO, pos ); t.m_name = parseKeyWordInByteArray ( b, _TCP_SECTION_NAME, pos ); t.m_length = parseKeyWordInByteArray ( b, _TCP_SECTION_LENGTH, pos ); } void QQTCloudProtocol::packDownDevFileSuccessData ( QByteArray& l, const QTCloudDownFileSuccess& t ) { l << t.m_fileno; } void QQTCloudProtocol::packDownDevFileDataData ( QByteArray& l, const QTCloudDownFileData& t ) { l << t.m_fileno << t.m_dno; } void QQTCloudProtocol::parseDownDevFileDataResultData ( QTCloudDownFileDataResult& t, const QByteArray& l ) { quint32 pos = 0; QByteArray b = l; b >> t.m_fileno >> t.m_dno >> t.m_addr >> t.m_dlen; t.m_data.resize ( t.m_dlen ); b >> t.m_data; } void QQTCloudProtocol::packUploadFileData ( QByteArray& l, const QTCloudUploadFile& t ) { l = QString ( _TCPCMD_DATASENDFILEINFO ).arg ( t.m_code ).arg ( t.m_name ).arg ( t.m_overwrite ).arg ( t.m_length ).toLatin1(); } void QQTCloudProtocol::parseUploadFileResultData ( QTCloudUploadFileResult& t, const QByteArray& l ) { QByteArray b = l; b >> t.m_fileno >> t.m_state; } void QQTCloudProtocol::packUploadFileDataData ( QByteArray& l, const QTCloudUploadFileData& t ) { l << t.m_fileno << t.m_dno << t.m_addr << t.m_dlen << t.m_data; } void QQTCloudProtocol::parseUploadFileDataResultData ( QTCloudUploadFileDataResult& t, const QByteArray& l ) { QByteArray b = l; b >> t.m_fileno >> t.m_dno; } void QQTCloudProtocol::parseUploadFileSuccessData ( QTCloudUploadFileSuccess& t, const QByteArray& l ) { QByteArray b = l; b >> t.m_fileno; } void QQTCloudProtocol::sendListDirectory ( QString code ) { QTCloudListDir t; t.m_code = code; quint16 _tcpcmd = _TCPCMD_SEARCHDIR; QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( _tcpcmd ); QByteArray d; packListDirData ( d, t ); qMsg.setData ( d ); qMsg.translate(); //pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); } void QQTCloudProtocol::sendAddDirectory() { QTCloudAddDir t; t.m_upcode = ""; t.m_code = ""; t.m_name = "Method2"; quint16 _tcpcmd = _TCPCMD_ADDDIR; QByteArray d; packAddDirData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendModDirectory() { QTCloudModDirName t; t.m_upcode = ""; t.m_code = ""; t.m_name = "Method2"; quint16 _tcpcmd = _TCPCMD_ALTERDIR; QByteArray d; //(d, t); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendDelDirectory() { QTCloudDelDir t; t.m_upcode = ""; t.m_code = ""; t.m_name = "Method2"; quint16 _tcpcmd = _TCPCMD_DELETEDIR; QByteArray d; //(d, t); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::recvAddDirResultMessage ( QQTNetworkMessage& ) {} void QQTCloudProtocol::recvDelDirResultMessage ( QQTNetworkMessage& ) {} void QQTCloudProtocol::recvModDirResultMessage ( QQTNetworkMessage& ) {} void QQTCloudProtocol::sendListFiles ( QString code ) { QTCloudListFile t; t.m_code = code; quint16 _tcpcmd = _TCPCMD_SEARCHFILE; QByteArray d; packListDirData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendDelFile ( QString code, QString id ) { QTCloudDelFile t; t.m_code = code; t.m_id = id; quint16 _tcpcmd = _TCPCMD_DELETEFILE; QByteArray d; packDelFileData ( d, t ); sendMessage ( _tcpcmd, d ); pline() << t.m_code << t.m_id; } void QQTCloudProtocol::sendListPubDirectory() { QTCloudListPubDir t; t.m_code = ""; quint16 _tcpcmd = _TCPCMD_SEARCHPUBLICDIR; QByteArray d; packListDirData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendListPubFiles() { QTCloudListPubFile t; t.m_code = ""; quint16 _tcpcmd = _TCPCMD_SEARCHPUBLICFILE; QByteArray d; packListDirData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendDownDevFiles ( const QString& id, const QString& localfile ) { m_downfileresult.m_localfile = localfile; m_work = 1; QTCloudDownDevFile t; t.m_id = id; quint16 _tcpcmd = _TCPCMD_DOWNLOADFILE; QByteArray d; packDownDevFileData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendDownPubFiles() { QTCloudDownPubFile t; _QTCloudListFileResult _result; foreach ( _result, m_pubfiles.m_file ) { break; } t.m_id = _result.m_id; quint16 _tcpcmd = _TCPCMD_DOWNLOADPUBFILE; QByteArray d; packDownDevFileData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendDownFileData() { pline() << m_downfiledata.m_fileno << m_downfiledata.m_dno; quint16 _tcpcmd = _TCPCMD_COMFIREFILEINFO; QByteArray d; packDownDevFileDataData ( d, m_downfiledata ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendCancelDown() { QTCloudCancelDownFile t; t.m_fileno = m_downfiledata.m_fileno; quint16 _tcpcmd = _TCPCMD_CANCELREVFILE; m_work = 0; emit signalCancelDown();; QByteArray d; packDownDevFileSuccessData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendDownFileSuccess() { QTCloudDownFileSuccess t; t.m_fileno = m_downfiledata.m_fileno; quint16 _tcpcmd = _TCPCMD_DOWNFILEOK; QByteArray d; packDownDevFileSuccessData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::sendUploadFile ( const QString& code, const QString& cloudname, const QString& localfile ) { m_uploadfile.m_code = code; m_uploadfile.m_name = cloudname; m_uploadfile.m_localfile = localfile; QFileInfo f ( m_uploadfile.m_localfile ); m_uploadfile.m_length = QString::number ( f.size() ); m_uploadfile.m_overwrite = _TCP_RESULT_TRUE; quint16 _tcpcmd = _TCPCMD_SENDFILEINFO; QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( _tcpcmd ); QByteArray d; packUploadFileData ( d, m_uploadfile ); qMsg.setData ( d ); qMsg.translate(); //pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); //waitForBytesWritten(-1); } void QQTCloudProtocol::sendUploadFileData() { m_uploadfiledata.m_addr = m_uploadfiledata.m_dno * _TCP_BLOCKDATA_SIZE; QFile f ( m_uploadfile.m_localfile ); f.open ( QIODevice::ReadOnly ); if ( f.isOpen() ) { f.seek ( m_uploadfiledata.m_addr ); m_uploadfiledata.m_data = f.read ( _TCP_BLOCKDATA_SIZE ); } f.close(); m_uploadfiledata.m_dlen = m_uploadfiledata.m_data.length(); quint16 _tcpcmd = _TCPCMD_SENDFILEDATA; QQTNetworkMessage qMsg; qMsg.setUid ( m_UID ); qMsg.setCmd ( _tcpcmd ); QByteArray d; packUploadFileDataData ( d, m_uploadfiledata ); qMsg.setData ( d ); qMsg.translate(); pline() << qMsg; QByteArray b; qMsg.packer ( b ); write ( b ); pline() << m_uploadfile.m_name << m_uploadfile.m_localfile << m_uploadfiledata.m_fileno << m_uploadfiledata.m_dno << m_uploadfiledata.m_addr << m_uploadfiledata.m_dlen; } void QQTCloudProtocol::sendCancelUpload() { QTCloudCancelUploadFile t; t.m_fileno = m_uploadfiledata.m_fileno; quint16 _tcpcmd = _TCPCMD_CANCELSENDFILE; QByteArray d; packDownDevFileSuccessData ( d, t ); sendMessage ( _tcpcmd, d ); emit signalCancelUpload(); } void QQTCloudProtocol::sendDownUpgradeFile ( const QString& id, const QString& localfile ) { m_downfileresult.m_localfile = localfile; m_work = 1; QTCloudDownDevFile t; t.m_id = id; quint16 _tcpcmd = _TCPCMD_DOWNUPGRADEFILE; QByteArray d; packDownDevFileData ( d, t ); sendMessage ( _tcpcmd, d ); } void QQTCloudProtocol::recvListDirResultMessage ( QQTNetworkMessage& qMsg ) { m_dirs.m_upcode = ""; m_dirs.m_dir.clear(); parseListDirResultData ( m_dirs, qMsg.data() ); pline() << m_dirs.m_upcode; _QTCloudListDirResult _result; foreach ( _result, m_dirs.m_dir ) { /* * 这里保存到model中 */ pline() << _result.m_id << _result.m_code << _result.m_name; } emit signalListDirOK(); } void QQTCloudProtocol::recvListFilesResultMessage ( QQTNetworkMessage& qMsg ) { m_files.m_code = ""; m_files.m_file.clear(); parseListFileResultData ( m_files, qMsg.data() ); pline() << m_files.m_code; _QTCloudListFileResult _result; foreach ( _result, m_files.m_file ) { /* * 这里保存到model中 */ pline() << _result.m_id << _result.m_name << _result.m_size << _result.m_date; } emit signalListFileOK(); } void QQTCloudProtocol::recvListPubDirResultMessage ( QQTNetworkMessage& qMsg ) { m_pubdirs.m_upcode = ""; m_pubdirs.m_dir.clear(); parseListDirResultData ( m_pubdirs, qMsg.data() ); pline() << m_pubdirs.m_upcode; _QTCloudListDirResult _result; foreach ( _result, m_pubdirs.m_dir ) { /* * 这里保存到model中 */ pline() << _result.m_id << _result.m_code << _result.m_name; } } void QQTCloudProtocol::recvListPubFilesResultMessage ( QQTNetworkMessage& qMsg ) { m_pubfiles.m_code = ""; m_pubfiles.m_file.clear(); parseListFileResultData ( m_pubfiles, qMsg.data() ); pline() << m_pubfiles.m_code; _QTCloudListFileResult _result; foreach ( _result, m_pubfiles.m_file ) { /* * 这里保存到model中 */ pline() << _result.m_id << _result.m_name << _result.m_size << _result.m_date; } } void QQTCloudProtocol::recvDownFileResultMessage ( QQTNetworkMessage& qMsg ) { parseDownDevFileResultData ( m_downfileresult, qMsg.data() ); pline() << m_downfileresult.m_fileno << m_downfileresult.m_name << m_downfileresult.m_length; m_downfiledata.m_fileno = m_downfileresult.m_fileno.toInt(); QString tmpFile = m_downfileresult.m_localfile; #ifdef __EMBEDDED_LINUX__ system ( QString ( "touch %1" ).arg ( tmpFile ).toLatin1().data() ); #endif QFile f ( tmpFile ); f.open ( QIODevice::WriteOnly | QIODevice::Truncate ); pline() << tmpFile << f.size(); f.close(); emit signalUpdateProgress ( 0 ); emit signalDownData(); } void QQTCloudProtocol::recvDownFileDataResultMessage ( QQTNetworkMessage& qMsg ) { if ( 0 == m_work ) return; QTCloudDownFileDataResult result; parseDownDevFileDataResultData ( result, qMsg.data() ); pline() << result.m_fileno << result.m_dno << result.m_addr << result.m_dlen;// << m_downfiledata.m_data; int nFileSize = 0; QString tmpFile = m_downfileresult.m_localfile; QFile f ( tmpFile ); f.open ( QIODevice::WriteOnly | QIODevice::Append ); f.write ( result.m_data ); nFileSize = f.size(); f.close(); pline() << nFileSize << m_downfileresult.m_length; int percent = 0; if ( nFileSize > 0 ) percent = 100 * nFileSize / m_downfileresult.m_length.toInt(); emit signalUpdateProgress ( percent ); pline() << percent; if ( nFileSize < m_downfileresult.m_length.toInt() ) { m_downfiledata.m_dno++; emit signalDownData(); } else { m_downfiledata.m_dno = 0; emit signalDownSucc(); } } void QQTCloudProtocol::recvUploadFileResult ( QQTNetworkMessage& qMsg ) { QTCloudUploadFileResult result; parseUploadFileResultData ( result, qMsg.data() ); pline() << result.m_fileno << result.m_state; perr ( result.m_state, 0x00 ) << "ok to send file data"; perr ( result.m_state, 0x01 ) << "unsupport file type"; perr ( result.m_state, 0x02 ) << "file too length"; perr ( result.m_state, 0x03 ) << "too much file"; perr ( result.m_state, 0x04 ) << "files too long"; perr ( result.m_state, 0x14 ) << "no much storage"; if ( result.m_state == 0x00 ) { m_uploadfiledata.m_fileno = result.m_fileno; m_uploadfiledata.m_dno = 0; /* * 使用Timer确认不是网络速率的原因。 */ emit signalUpdateProgress ( 0 ); emit signalSendData(); } } void QQTCloudProtocol::recvUploadFileDataResult ( QQTNetworkMessage& qMsg ) { QTCloudUploadFileDataResult result; parseUploadFileDataResultData ( result, qMsg.data() ); pline() << result.m_fileno << result.m_dno << result.m_dno* _TCP_BLOCKDATA_SIZE << m_uploadfile.m_length.toInt(); /* * 不需要发空串 */ m_uploadfiledata.m_dno = result.m_dno + 1; int percent = 0; if ( m_uploadfile.m_length.toInt() > 0 ) percent = 100 * m_uploadfiledata.m_dno * _TCP_BLOCKDATA_SIZE / m_uploadfile.m_length.toInt(); if ( m_uploadfiledata.m_dno * _TCP_BLOCKDATA_SIZE < m_uploadfile.m_length.toInt() ) { emit signalSendData(); emit signalUpdateProgress ( percent ); } } void QQTCloudProtocol::recvUploadFileSuccess ( QQTNetworkMessage& qMsg ) { QTCloudUploadFileSuccess result; parseUploadFileSuccessData ( result, qMsg.data() ); pline() << result.m_fileno << m_uploadfiledata.m_dno << m_uploadfiledata.m_dno* _TCP_BLOCKDATA_SIZE << m_uploadfile.m_length.toInt() << "upload success"; emit signalUpdateProgress ( 100 ); emit signalUploadSucc(); } void QQTCloudProtocol::packLoginData ( QByteArray& l, const QTCloudLogin& t ) { l = QString ( _TCPCMD_DATALOGIN ).arg ( t.m_name ).arg ( t.m_password ).toLatin1(); } void QQTCloudProtocol::parseLoginResultData ( QTCloudLoginResult& t, const QByteArray& l ) { QByteArray _l = l; _l >> t.m_result; } QByteArray& QQTCloudProtocol::packKeyWordToByteArray ( QByteArray& array, const QString& key, const QString& value ) { return array << key.toLatin1() << "=\"" << value.toLatin1() << "\""; } QByteArray QQTCloudProtocol::parseKeyWordInByteArray ( const QByteArray& array, const QByteArray& section, quint32& pos ) { int index = pos, indexTemp = 0; index = array.indexOf ( section, index ); index = array.indexOf ( '\"', index ); indexTemp = array.indexOf ( '\"', index + 1 ); pos = indexTemp + 1; return array.mid ( index + 1, ( indexTemp - index - 1 ) ); } quint16 QQTCloudProtocol::splitter ( const QByteArray& s ) { QByteArray l = s.left ( 4 ); quint16 b0 = 0, b1 = 0; l >> b0 >> b1; return b1; } quint16 QQTCloudProtocol::minlength() { return 16; } quint16 QQTCloudProtocol::maxlength() { return 32768; }