// Chiusura trasferimento dati void DuktoProtocol::closeCurrentTransfer(bool aborted) { mCurrentSocket->disconnect(); mCurrentSocket->disconnectFromHost(); if (mCurrentSocket->state() != QTcpSocket::UnconnectedState) mCurrentSocket->waitForDisconnected(1000); mCurrentSocket->close(); mCurrentSocket->deleteLater(); mCurrentSocket = NULL; if (mCurrentFile) { mCurrentFile->close(); delete mCurrentFile; mCurrentFile = NULL; } mIsSending = false; if (!aborted) emit sendFileComplete(); mFilesToSend.clear(); }
void DuktoProtocol::sendData(qint64 b) { QByteArray d; // Aggiornamento statistiche mSentData += b; updateStatus(); // Verifica se tutti i dati messi nel buffer // sono stati inviati mSentBuffer -= b; // Se ci sono altri dati da inviare, attendo // che vengano inviati if (mSentBuffer > 0) return; // Se si tratta di un invio testuale, butto dentro // tutto il testo if ((!mTextToSend.isEmpty()) && (mFilesToSend->at(mFileCounter - 1) == "___DUKTO___TEXT___")) { d.append(mTextToSend.toUtf8().data()); mCurrentSocket->write(d); mSentBuffer = d.size(); mTextToSend.clear(); return; } // Se il file corrente non è ancora terminato // invio una nuova parte del file if (mCurrentFile) d = mCurrentFile->read(10000); if (d.size() > 0) { mCurrentSocket->write(d); mSentBuffer = d.size(); return; } // Altrimenti chiudo il file e passo al prossimo d.append(nextElementHeader()); // Non ci sono altri file da inviare? if (d.size() == 0) { // Chiudo la connessione mCurrentSocket->disconnect(); mCurrentSocket->disconnectFromHost(); mCurrentSocket->waitForDisconnected(1000); mCurrentSocket->close(); mCurrentSocket->deleteLater(); mCurrentSocket = NULL; if (mCurrentFile) { mCurrentFile->close(); delete mCurrentFile; mCurrentFile = NULL; } mIsSending = false; sendFileComplete(mFilesToSend); delete mFilesToSend; mFilesToSend = NULL; return; } // Invio l'header insime al primo chunk di file mTotalSize += d.size(); if (mCurrentFile) d.append(mCurrentFile->read(10000)); mCurrentSocket->write(d); mSentBuffer += d.size(); return; }