#include "AppController.h" #include AppController::AppController(QObject* parent) : QObject(parent) , m_settings(new LocalSend::Settings(this)) , m_security(new LocalSend::SecurityContext(this)) , m_discovery(new LocalSend::DiscoveryManager(this)) , m_server(new LocalSend::HttpServer(this)) , m_sessions(new LocalSend::SessionManager(this)) { } AppController::~AppController() { stopDiscovery(); } void AppController::initialize() { m_security->initialize(); LocalSend::InfoDto info = buildInfoDto(); m_server->setLocalInfo(info, m_security->fingerprint()); m_discovery->setLocalInfo(info, m_security->fingerprint(), m_settings->port(), m_settings->https() ? LocalSend::ProtocolType::Https : LocalSend::ProtocolType::Http); if (m_server->start(m_settings->port(), m_settings->https())) { emit serverRunningChanged(); } connect(m_discovery, &LocalSend::DiscoveryManager::deviceDiscovered, this, &AppController::onDeviceDiscovered); connect(m_discovery, &LocalSend::DiscoveryManager::deviceLost, this, &AppController::onDeviceLost); connect(m_server, &LocalSend::HttpServer::prepareUploadRequest, this, &AppController::onPrepareUploadRequest); startDiscovery(); } LocalSend::InfoDto AppController::buildInfoDto() const { LocalSend::InfoDto info; info.alias = m_settings->alias(); info.version = m_settings->version(); info.deviceModel = m_settings->deviceModel(); info.deviceType = m_settings->deviceType(); info.download = false; return info; } QString AppController::alias() const { return m_settings->alias(); } void AppController::setAlias(const QString& alias) { if (m_settings->alias() != alias) { m_settings->setAlias(alias); emit aliasChanged(); } } quint16 AppController::port() const { return m_settings->port(); } void AppController::setPort(quint16 port) { if (m_settings->port() != port) { m_settings->setPort(port); emit portChanged(); } } QVariantList AppController::devices() const { QVariantList result; for (const LocalSend::Device& device : m_devices) { QVariantMap map; map[QStringLiteral("ip")] = device.ip; map[QStringLiteral("port")] = device.port; map[QStringLiteral("alias")] = device.alias; map[QStringLiteral("fingerprint")] = device.fingerprint; map[QStringLiteral("deviceModel")] = device.deviceModel; map[QStringLiteral("deviceType")] = LocalSend::deviceTypeToString(device.deviceType); result.append(map); } return result; } bool AppController::serverRunning() const { return m_server->isRunning(); } void AppController::startDiscovery() { m_discovery->start(); } void AppController::stopDiscovery() { m_discovery->stop(); } void AppController::refreshDevices() { m_discovery->startScan(); } void AppController::onDeviceDiscovered(const LocalSend::Device& device) { m_devices.insert(device.fingerprint, device); emit devicesChanged(); } void AppController::onDeviceLost(const QString& fingerprint) { m_devices.remove(fingerprint); emit devicesChanged(); } void AppController::onPrepareUploadRequest(const LocalSend::PrepareUploadRequestDto& dto, const QHostAddress& sender) { LocalSend::Device device; device.ip = sender.toString(); device.alias = dto.info.alias; device.fingerprint = dto.info.fingerprint; device.deviceModel = dto.info.deviceModel; device.deviceType = dto.info.deviceType; device.version = dto.info.version; QString sessionId = m_sessions->createReceiveSession(device, dto.files); QVariantList filesList; for (auto it = dto.files.constBegin(); it != dto.files.constEnd(); ++it) { QVariantMap file; file[QStringLiteral("id")] = it.key(); file[QStringLiteral("fileName")] = it.value().fileName; file[QStringLiteral("size")] = it.value().size; file[QStringLiteral("fileType")] = it.value().fileType; filesList.append(file); } emit receiveRequest(sessionId, dto.info.alias, filesList); }