#include "alertmanager.h" /** * A macro to generate the switch case statements to handle specific alert types */ #define ALERT_EVENT_CASE(name, signal, alert) \ case name: \ emit signal(lt::alert_cast(alert)); \ break AlertManager::AlertManager(QObject *parent) : QObject(parent) { connect(this, &AlertManager::alertsReady, this, &AlertManager::dispatchAlertsForSession); } void AlertManager::addSession(lt::session_handle *session) { session->set_alert_notify([this, session]() -> void { emit alertsReady(session); }); } void AlertManager::dispatchAlertsForSession(lt::session_handle *session) { std::vector alerts; session->pop_alerts(&alerts); for (auto alert : alerts) { switch(alert->type()) { ALERT_EVENT_CASE(add_torrent_alert, addTorrentAlerted, alert); ALERT_EVENT_CASE(file_completed_alert, fileCompletedAlerted, alert); ALERT_EVENT_CASE(metadata_received_alert, metadataReceivedAlerted, alert); ALERT_EVENT_CASE(save_resume_data_alert, saveResumeDataAlerted, alert); ALERT_EVENT_CASE(save_resume_data_failed_alert, saveResumeDataFailedAlerted, alert); ALERT_EVENT_CASE(state_changed_alert, stateChangedAlerted, alert); ALERT_EVENT_CASE(state_update_alert, stateUpdateAlerted, alert); ALERT_EVENT_CASE(torrent_finished_alert, torrentFinishedAlerted, alert); } } }