send progress dialog
This commit is contained in:
@@ -49,6 +49,8 @@ void AppController::initialize()
|
||||
this, &AppController::onPrepareUploadRequest);
|
||||
connect(m_server, &LocalSend::HttpServer::uploadRequest,
|
||||
this, &AppController::onUploadRequest);
|
||||
connect(m_server, &LocalSend::HttpServer::cancelRequest,
|
||||
this, &AppController::onCancelRequest);
|
||||
connect(m_sessions, &LocalSend::SessionManager::receiveSessionAccepted,
|
||||
this, &AppController::onSessionAccepted);
|
||||
connect(m_sessions, &LocalSend::SessionManager::receiveSessionDeclined,
|
||||
@@ -185,6 +187,22 @@ void AppController::acceptReceive(const QString& sessionId)
|
||||
return;
|
||||
}
|
||||
|
||||
m_currentReceiveSessionId = sessionId;
|
||||
m_receiveProgressValue = 0.0;
|
||||
m_receivedSize = 0;
|
||||
m_currentReceiveFileIndex = 0;
|
||||
m_currentReceiveFileName.clear();
|
||||
m_totalReceiveFiles = session.files.size();
|
||||
m_currentReceiveSenderAlias = session.sender.alias;
|
||||
m_totalReceiveSize = 0;
|
||||
m_receiveFileNames.clear();
|
||||
for (auto it = session.files.constBegin(); it != session.files.constEnd(); ++it) {
|
||||
m_totalReceiveSize += it->file.size;
|
||||
m_receiveFileNames.insert(it.key(), it->file.fileName);
|
||||
}
|
||||
emit receivingChanged();
|
||||
emit receiveProgressChanged();
|
||||
|
||||
QString baseDir = downloadPath();
|
||||
QDir dir(baseDir);
|
||||
if (!dir.exists()) {
|
||||
@@ -198,6 +216,7 @@ void AppController::acceptReceive(const QString& sessionId)
|
||||
qDebug() << "[AppController] File" << it.key() << "->" << filePath;
|
||||
}
|
||||
|
||||
m_server->addActiveSession(sessionId);
|
||||
m_sessions->acceptReceiveSession(sessionId, destinationPaths);
|
||||
}
|
||||
|
||||
@@ -274,6 +293,8 @@ void AppController::onPrepareUploadRequest(const QString& httpSessionId,
|
||||
|
||||
LocalSend::Device device;
|
||||
device.ip = sender.toString();
|
||||
device.port = dto.info.port;
|
||||
device.protocol = dto.info.protocol;
|
||||
device.alias = dto.info.alias;
|
||||
device.fingerprint = dto.info.fingerprint;
|
||||
device.deviceModel = dto.info.deviceModel;
|
||||
@@ -337,6 +358,16 @@ void AppController::onUploadRequest(const QString& sessionId, const QString& fil
|
||||
|
||||
m_sessions->updateReceiveProgress(sessionId, fileId, written);
|
||||
|
||||
if (sessionId == m_currentReceiveSessionId) {
|
||||
m_currentReceiveFileName = m_receiveFileNames.value(fileId);
|
||||
m_currentReceiveFileIndex++;
|
||||
m_receivedSize += written;
|
||||
if (m_totalReceiveSize > 0) {
|
||||
m_receiveProgressValue = (static_cast<double>(m_receivedSize) / m_totalReceiveSize) * 100.0;
|
||||
}
|
||||
emit receiveProgressChanged();
|
||||
}
|
||||
|
||||
if (written >= transfer.file.size) {
|
||||
m_sessions->completeReceiveFile(sessionId, fileId);
|
||||
}
|
||||
@@ -362,7 +393,16 @@ void AppController::onReceiveProgress(const QString& sessionId, const QString& f
|
||||
|
||||
void AppController::onReceiveCompleted(const QString& sessionId)
|
||||
{
|
||||
if (sessionId == m_currentReceiveSessionId) {
|
||||
m_receiveProgressValue = 100.0;
|
||||
m_currentReceiveFileIndex = m_totalReceiveFiles;
|
||||
emit receiveProgressChanged();
|
||||
}
|
||||
emit receiveCompleted(sessionId);
|
||||
if (sessionId == m_currentReceiveSessionId) {
|
||||
m_server->removeActiveSession(sessionId);
|
||||
resetReceiveState();
|
||||
}
|
||||
}
|
||||
|
||||
bool AppController::sending() const
|
||||
@@ -399,6 +439,55 @@ void AppController::setReceivePin(const QString& pin)
|
||||
}
|
||||
}
|
||||
|
||||
bool AppController::receiving() const
|
||||
{
|
||||
return !m_currentReceiveSessionId.isEmpty();
|
||||
}
|
||||
|
||||
double AppController::receiveProgress() const
|
||||
{
|
||||
return m_receiveProgressValue;
|
||||
}
|
||||
|
||||
QString AppController::currentReceiveFileName() const
|
||||
{
|
||||
return m_currentReceiveFileName;
|
||||
}
|
||||
|
||||
int AppController::currentReceiveFileIndex() const
|
||||
{
|
||||
return m_currentReceiveFileIndex;
|
||||
}
|
||||
|
||||
int AppController::totalReceiveFiles() const
|
||||
{
|
||||
return m_totalReceiveFiles;
|
||||
}
|
||||
|
||||
QString AppController::currentReceiveSenderAlias() const
|
||||
{
|
||||
return m_currentReceiveSenderAlias;
|
||||
}
|
||||
|
||||
QString AppController::currentSendFileName() const
|
||||
{
|
||||
if (m_currentFileIndex >= 0 && m_currentFileIndex < m_pendingSendPaths.size()) {
|
||||
QFileInfo info(m_pendingSendPaths[m_currentFileIndex]);
|
||||
return info.fileName();
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
||||
int AppController::currentSendFileIndex() const
|
||||
{
|
||||
return m_currentFileIndex + 1;
|
||||
}
|
||||
|
||||
int AppController::totalSendFiles() const
|
||||
{
|
||||
return m_pendingSendPaths.size();
|
||||
}
|
||||
|
||||
void AppController::addFiles(const QStringList& filePaths)
|
||||
{
|
||||
QMimeDatabase mimeDb;
|
||||
@@ -470,8 +559,6 @@ void AppController::sendFiles(const QString& deviceFingerprint, const QStringLis
|
||||
m_currentFileIndex = 0;
|
||||
m_sendProgress = 0.0;
|
||||
m_pinFirstAttempt = true;
|
||||
emit sendingChanged();
|
||||
emit sendProgressChanged();
|
||||
|
||||
qDebug() << "[AppController] sendFiles: device=" << deviceFingerprint
|
||||
<< "files=" << filePaths.size();
|
||||
@@ -487,8 +574,7 @@ void AppController::sendFiles(const QString& deviceFingerprint, const QStringLis
|
||||
|
||||
if (!info.exists()) {
|
||||
emit sendError(QStringLiteral("File not found: ") + filePath);
|
||||
m_currentSendSessionId.clear();
|
||||
emit sendingChanged();
|
||||
resetSendState();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -510,6 +596,9 @@ void AppController::sendFiles(const QString& deviceFingerprint, const QStringLis
|
||||
}()
|
||||
);
|
||||
|
||||
emit sendingChanged();
|
||||
emit sendProgressChanged();
|
||||
|
||||
LocalSend::PrepareUploadRequestDto request;
|
||||
request.info = buildRegisterDto();
|
||||
request.files = files;
|
||||
@@ -525,15 +614,35 @@ void AppController::cancelSend()
|
||||
}
|
||||
|
||||
LocalSend::Device target = m_devices.value(m_currentSendDeviceFingerprint);
|
||||
m_httpClient->abortCurrentUpload();
|
||||
m_httpClient->cancel(target, m_currentSendSessionId);
|
||||
|
||||
m_sessions->cancelSendSession(m_currentSendSessionId);
|
||||
m_currentSendSessionId.clear();
|
||||
resetSendState();
|
||||
m_pendingSendPaths.clear();
|
||||
m_pendingFilesList.clear();
|
||||
m_sendProgress = 0.0;
|
||||
emit sendingChanged();
|
||||
emit sendProgressChanged();
|
||||
emit pendingFilesChanged();
|
||||
}
|
||||
|
||||
void AppController::cancelReceive()
|
||||
{
|
||||
if (m_currentReceiveSessionId.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
qDebug() << "[AppController] cancelReceive, sessionId:" << m_currentReceiveSessionId;
|
||||
|
||||
LocalSend::ReceiveSession session = m_sessions->receiveSession(m_currentReceiveSessionId);
|
||||
LocalSend::Device senderDevice = session.sender;
|
||||
|
||||
m_sessions->cancelReceiveSession(m_currentReceiveSessionId);
|
||||
m_server->removeActiveSession(m_currentReceiveSessionId);
|
||||
|
||||
if (!senderDevice.ip.isEmpty() && senderDevice.port > 0) {
|
||||
m_httpClient->cancel(senderDevice, m_currentReceiveSessionId);
|
||||
}
|
||||
|
||||
resetReceiveState();
|
||||
}
|
||||
|
||||
void AppController::onPrepareUploadResponse(const LocalSend::PrepareUploadResponseDto& response)
|
||||
@@ -544,15 +653,13 @@ void AppController::onPrepareUploadResponse(const LocalSend::PrepareUploadRespon
|
||||
LocalSend::SendSession session = m_sessions->sendSession(m_currentSendSessionId);
|
||||
if (session.sessionId.isEmpty()) {
|
||||
emit sendError(QStringLiteral("Session not found"));
|
||||
m_currentSendSessionId.clear();
|
||||
emit sendingChanged();
|
||||
resetSendState();
|
||||
return;
|
||||
}
|
||||
|
||||
if (response.files.isEmpty()) {
|
||||
emit sendError(QStringLiteral("Receiver declined the transfer"));
|
||||
m_currentSendSessionId.clear();
|
||||
emit sendingChanged();
|
||||
resetSendState();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -568,9 +675,8 @@ void AppController::onPrepareUploadResponse(const LocalSend::PrepareUploadRespon
|
||||
void AppController::onPrepareUploadError(const QString& error)
|
||||
{
|
||||
qWarning() << "[AppController] onPrepareUploadError:" << error;
|
||||
resetSendState();
|
||||
emit sendError(error);
|
||||
m_currentSendSessionId.clear();
|
||||
emit sendingChanged();
|
||||
}
|
||||
|
||||
void AppController::onPrepareUploadPinRequired()
|
||||
@@ -583,16 +689,14 @@ void AppController::onPrepareUploadPinRequired()
|
||||
void AppController::onPrepareUploadTooManyAttempts()
|
||||
{
|
||||
qWarning() << "[AppController] onPrepareUploadTooManyAttempts";
|
||||
resetSendState();
|
||||
emit sendError(QStringLiteral("Too many PIN attempts"));
|
||||
m_currentSendSessionId.clear();
|
||||
emit sendingChanged();
|
||||
}
|
||||
|
||||
void AppController::retryWithPin(const QString& pin)
|
||||
{
|
||||
if (m_currentSendDeviceFingerprint.isEmpty() || !m_devices.contains(m_currentSendDeviceFingerprint)) {
|
||||
m_currentSendSessionId.clear();
|
||||
emit sendingChanged();
|
||||
resetSendState();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -637,6 +741,10 @@ void AppController::onUploadCompleted()
|
||||
{
|
||||
qDebug() << "[AppController] onUploadCompleted, file index:" << m_currentFileIndex;
|
||||
|
||||
if (m_currentSendSessionId.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_sessions->completeSendFile(m_currentSendSessionId, m_currentSendFileId);
|
||||
|
||||
m_currentFileIndex++;
|
||||
@@ -647,22 +755,32 @@ void AppController::onUploadCompleted()
|
||||
qDebug() << "[AppController] All files sent successfully";
|
||||
m_sendProgress = 100.0;
|
||||
emit sendProgressChanged();
|
||||
emit sendCompleted(m_currentSendSessionId);
|
||||
m_currentSendSessionId.clear();
|
||||
m_pendingFilesList.clear();
|
||||
QString sessionId = m_currentSendSessionId;
|
||||
resetSendState();
|
||||
m_pendingSendPaths.clear();
|
||||
emit sendingChanged();
|
||||
m_pendingFilesList.clear();
|
||||
emit pendingFilesChanged();
|
||||
emit sendCompleted(sessionId);
|
||||
}
|
||||
}
|
||||
|
||||
void AppController::onUploadError(const QString& error)
|
||||
{
|
||||
if (m_currentSendSessionId.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
qWarning() << "[AppController] onUploadError:" << error;
|
||||
emit sendError(error);
|
||||
m_sessions->failSendFile(m_currentSendSessionId, m_currentSendFileId);
|
||||
m_currentSendSessionId.clear();
|
||||
emit sendingChanged();
|
||||
|
||||
if (error == QStringLiteral("SESSION_CANCELLED")) {
|
||||
m_sessions->cancelSendSession(m_currentSendSessionId);
|
||||
resetSendState();
|
||||
emit sendCanceled();
|
||||
} else {
|
||||
m_sessions->failSendFile(m_currentSendSessionId, m_currentSendFileId);
|
||||
resetSendState();
|
||||
emit sendError(error);
|
||||
}
|
||||
}
|
||||
|
||||
void AppController::sendNextFile()
|
||||
@@ -694,8 +812,7 @@ void AppController::sendNextFile()
|
||||
|
||||
if (token.isEmpty()) {
|
||||
emit sendError(QStringLiteral("No token for file: ") + fileId);
|
||||
m_currentSendSessionId.clear();
|
||||
emit sendingChanged();
|
||||
resetSendState();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -715,3 +832,50 @@ LocalSend::RegisterDto AppController::buildRegisterDto() const
|
||||
dto.download = false;
|
||||
return dto;
|
||||
}
|
||||
|
||||
void AppController::onCancelRequest(const QString& sessionId)
|
||||
{
|
||||
qDebug() << "[AppController] onCancelRequest, sessionId:" << sessionId;
|
||||
|
||||
if (sessionId == m_currentSendSessionId) {
|
||||
m_httpClient->abortCurrentUpload();
|
||||
m_sessions->cancelSendSession(m_currentSendSessionId);
|
||||
resetSendState();
|
||||
emit sendCanceled();
|
||||
return;
|
||||
}
|
||||
|
||||
if (sessionId == m_currentReceiveSessionId) {
|
||||
m_sessions->cancelReceiveSession(m_currentReceiveSessionId);
|
||||
m_server->removeActiveSession(m_currentReceiveSessionId);
|
||||
resetReceiveState();
|
||||
emit receiveError(sessionId, QStringLiteral("Sender canceled the transfer"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void AppController::resetSendState()
|
||||
{
|
||||
m_currentSendSessionId.clear();
|
||||
m_currentSendFileId.clear();
|
||||
m_currentSendDeviceFingerprint.clear();
|
||||
m_currentFileIndex = 0;
|
||||
m_sendProgress = 0.0;
|
||||
emit sendingChanged();
|
||||
emit sendProgressChanged();
|
||||
}
|
||||
|
||||
void AppController::resetReceiveState()
|
||||
{
|
||||
m_currentReceiveSessionId.clear();
|
||||
m_receiveProgressValue = 0.0;
|
||||
m_currentReceiveFileName.clear();
|
||||
m_currentReceiveFileIndex = 0;
|
||||
m_totalReceiveFiles = 0;
|
||||
m_totalReceiveSize = 0;
|
||||
m_receivedSize = 0;
|
||||
m_currentReceiveSenderAlias.clear();
|
||||
m_receiveFileNames.clear();
|
||||
emit receivingChanged();
|
||||
emit receiveProgressChanged();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user