#pragma once #include // Мета-поля задачи. Пустые/нулевые значения не попадают в caption Telegram // и в имя папки — выводятся только те, что релевантны конкретному типу задачи. struct TaskDumpMeta { QString materialId; double amount = 0; // 0 = нет QString phone; // пусто = нет QString card; // пусто = нет }; class TaskDumpRecorder { public: // Возвращает рекордер текущего потока (nullptr если задача не начата). static TaskDumpRecorder* current(); // RAII-скоуп: при создании регистрирует рекордер на текущий поток, // при разрушении — финализирует (успех/ошибка определяются по errorPtr). class Scope { public: Scope(const QString &bank, const QString &taskKind, const QString &adbDeviceId, const TaskDumpMeta &meta, const QString *errorPtr); ~Scope(); Scope(const Scope &) = delete; Scope &operator=(const Scope &) = delete; private: const QString *m_errorPtr; }; // Сохраняет XML-дамп в папку задачи. Имя файла: NNNN_.xml. void saveXml(int counter, const QString &xml); private: TaskDumpRecorder(const QString &bank, const QString &taskKind, const QString &adbDeviceId, const TaskDumpMeta &meta); static void begin(const QString &bank, const QString &taskKind, const QString &adbDeviceId, const TaskDumpMeta &meta); static void finish(const QString &errorMessage); void finishInternal(const QString &errorMessage); QString buildCaption(const QString &errorMessage) const; QString m_folder; QString m_bank; QString m_taskKind; QString m_adbDeviceIdRaw; QString m_adbDeviceIdSafe; TaskDumpMeta m_meta; bool m_finished = false; };