diff --git a/tools/chatgui/src/member_files/batch.cpp b/tools/chatgui/src/member_files/batch.cpp index ecfcc400..474b2c64 100644 --- a/tools/chatgui/src/member_files/batch.cpp +++ b/tools/chatgui/src/member_files/batch.cpp @@ -30,11 +30,10 @@ MemberFileBatch::MemberFileBatch(quint64 group, quint64 server, quint64 owner, M } MemberFileBatch::~MemberFileBatch() { - m_cancelled = true; cancelRequest(m_request); cancelRequest(m_transfer); m_pool.waitForDone(); -} - -void MemberFileBatch::cancelRequest(quint64 id) { - if (id) gui_bridge_member_files_cancel(id); + m_cancelled = true; + gui_bridge_member_files_cancel(m_request); + gui_bridge_member_files_cancel(m_transfer); + m_pool.waitForDone(); } // Сначала проверяем всё локальное дерево; до успешного обхода сервер не изменяется. @@ -274,7 +273,9 @@ void MemberFileBatch::advance(bool skipped) { void MemberFileBatch::cancel() { if (m_finished) return; - m_cancelled = true; cancelRequest(m_request); m_request = 0; cancelRequest(m_transfer); + m_cancelled = true; + gui_bridge_member_files_cancel(m_request); m_request = 0; + gui_bridge_member_files_cancel(m_transfer); DEBUG_INFO(DEBUG_CATEGORY_MEDIA, "file batch: cancelling transfer=%llu worker=%d", (unsigned long long)m_transfer, m_work); if (!m_transfer && !m_work) finish(); } diff --git a/tools/chatgui/src/member_files/batch.h b/tools/chatgui/src/member_files/batch.h index 26d5e6b7..aed4f8eb 100644 --- a/tools/chatgui/src/member_files/batch.h +++ b/tools/chatgui/src/member_files/batch.h @@ -2,6 +2,7 @@ * В GUI-потоке задать progress/finished/conflict, затем один раз вызвать upload (Upload) либо start (Download/Remove). * Локальный обход/подготовка/очистка идут в собственном worker; запросы и передачи — через bridge в uasync. * Внешний диспетчер передаёт ответы через response/transfer; сам batch не подписывается на события bridge. + * Отказ постановки завершает batch ошибкой; отмена команды до исполнения приходит обычным MF_CANCELLED. * cancel ждёт завершения текущего локального I/O/передачи до finished; уже выполненные изменения не откатываются. * При неуспехе временный экспорт удаляется перед finished. Деструктор ждёт worker, но не сетевое завершение. */ #pragma once @@ -59,7 +60,6 @@ private: void advance(bool skipped = false); // Учесть/удалить голову и отложенно вызвать next в GUI-потоке. void finish(const QString& error = {}); // Зафиксировать исход; при необходимости очистить временный экспорт. bool replace(bool sameType); // true разрешает замену; иначе пропустить поддерево либо отменить batch. - void cancelRequest(quint64 id); // Передать отмену ненулевого запроса/передачи в доступное ядро. const quint64 m_group, m_server, m_owner; // Контекст всей очереди, не зависит от навигации браузера. const Mode m_mode; // Одна операция на всё время жизни объекта. QList m_queue, m_verify, m_remove; // Работа, финальные STAT и обратный порядок удаления.