#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<lt::name>(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<lt::alert*> 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);
|
|
}
|
|
}
|
|
}
|