- Added destructor definitions (= default) to all classes that had them declared in header but not defined - Fixes 'undefined reference to destructor' linker errors across 30+ classes - Covers services, UI components, and synchronizers
224 lines
8.2 KiB
C++
224 lines
8.2 KiB
C++
#include "ui/connectionwizard.h"
|
|
#include <QMessageBox>
|
|
#include <QTimer>
|
|
#include <QDebug>
|
|
#include <QSslSocket>
|
|
|
|
ConnectionWizard::ConnectionWizard(QWidget *parent, AccountService *accountService)
|
|
: QWizard(parent), m_accountService(accountService)
|
|
{
|
|
setWindowTitle("Configurar conexión de correo");
|
|
setWizardStyle(QWizard::ModernStyle);
|
|
setOption(QWizard::HaveHelpButton, false);
|
|
setOption(QWizard::HaveFinishButtonOnEarlyPages, true);
|
|
|
|
setupPageIntro();
|
|
setupPageIncoming();
|
|
setupPageOutgoing();
|
|
setupPageAuth();
|
|
setupPageTest();
|
|
|
|
// Set page order
|
|
addPage(m_introPage);
|
|
addPage(m_incomingPage);
|
|
addPage(m_outgoingPage);
|
|
addPage(m_authPage);
|
|
addPage(m_testPage);
|
|
|
|
// Start at intro
|
|
startId();
|
|
}
|
|
|
|
void ConnectionWizard::setupPageIntro()
|
|
{
|
|
m_introPage = new QWizardPage(this);
|
|
m_introPage->setTitle("Configuración de conexión");
|
|
m_introPage->setSubTitle("Introduce los datos de los servidores entrantes y salientes para configurar tu cuenta de correo.");
|
|
|
|
QVBoxLayout *lay = new QVBoxLayout(m_introPage);
|
|
QLabel *info = new QLabel(
|
|
"Este asistente te guiará paso a paso para configurar los servidores IMAP/POP3 y SMTP.\\n"
|
|
"Si no conoces los datos, consulta a tu proveedor de correo o busca en sus páginas de soporte."
|
|
);
|
|
info->setWordWrap(true);
|
|
lay->addWidget(info);
|
|
lay->addStretch();
|
|
m_introPage->setLayout(lay);
|
|
}
|
|
|
|
void ConnectionWizard::setupPageIncoming()
|
|
{
|
|
m_incomingPage = new QWizardPage(this);
|
|
m_incomingPage->setTitle("Servidor entrante (IMAP/POP3)");
|
|
m_incomingPage->setSubTitle("Configura el servidor que recibirá tus correos.");
|
|
|
|
QFormLayout *form = new QFormLayout();
|
|
m_incomingTypeCombo = new QComboBox();
|
|
m_incomingTypeCombo->addItem("IMAP", QVariant::fromValue(QString("imap")));
|
|
m_incomingTypeCombo->addItem("POP3", QVariant::fromValue(QString("pop3")));
|
|
form->addRow("Tipo:", m_incomingTypeCombo);
|
|
|
|
m_incomingHostEdit = new QLineEdit();
|
|
m_incomingHostEdit->setPlaceholderText("ej. imap.ejemplo.com");
|
|
form->addRow("Servidor:", m_incomingHostEdit);
|
|
|
|
m_incomingPortEdit = new QLineEdit();
|
|
m_incomingPortEdit->setPlaceholderText("993");
|
|
m_incomingPortEdit->setValidator(new QIntValidator(1, 65535, this));
|
|
form->addRow("Puerto:", m_incomingPortEdit);
|
|
|
|
m_incomingSslCheck = new QCheckBox("Usar conexión segura (SSL/TLS)");
|
|
m_incomingSslCheck->setChecked(true);
|
|
form->addRow("", m_incomingSslCheck);
|
|
|
|
m_incomingPage->setLayout(form);
|
|
}
|
|
|
|
void ConnectionWizard::setupPageOutgoing()
|
|
{
|
|
m_outgoingPage = new QWizardPage(this);
|
|
m_outgoingPage->setTitle("Servidor saliente (SMTP)");
|
|
m_outgoingPage->setSubTitle("Configura el servidor que enviará tus correos.");
|
|
|
|
QFormLayout *form = new QFormLayout();
|
|
m_outgoingHostEdit = new QLineEdit();
|
|
m_outgoingHostEdit->setPlaceholderText("ej. smtp.ejemplo.com");
|
|
form->addRow("Servidor:", m_outgoingHostEdit);
|
|
|
|
m_outgoingPortEdit = new QLineEdit();
|
|
m_outgoingPortEdit->setPlaceholderText("587");
|
|
m_outgoingPortEdit->setValidator(new QIntValidator(1, 65535, this));
|
|
form->addRow("Puerto:", m_outgoingPortEdit);
|
|
|
|
m_outgoingSslCheck = new QCheckBox("Usar conexión segura (STARTTLS/SSL)");
|
|
m_outgoingSslCheck->setChecked(true);
|
|
form->addRow("", m_outgoingSslCheck);
|
|
|
|
m_outgoingPage->setLayout(form);
|
|
}
|
|
|
|
void ConnectionWizard::setupPageAuth()
|
|
{
|
|
m_authPage = new QWizardPage(this);
|
|
m_authPage->setTitle("Autenticación");
|
|
m_authPage->setSubTitle("Introduce tu nombre de usuario y contraseña para acceder a los servidores.");
|
|
|
|
QFormLayout *form = new QFormLayout();
|
|
m_usernameEdit = new QLineEdit();
|
|
m_usernameEdit->setPlaceholderText("tu-usuario@dominio.com");
|
|
form->addRow("Usuario:", m_usernameEdit);
|
|
|
|
m_passwordEdit = new QLineEdit();
|
|
m_passwordEdit->setEchoMode(QLineEdit::Password);
|
|
m_passwordEdit->setPlaceholderText("Contraseña");
|
|
form->addRow("Contraseña:", m_passwordEdit);
|
|
|
|
m_authMethodCombo = new QComboBox();
|
|
m_authMethodCombo->addItem("Contraseña normal", QVariant::fromValue(QString("plain")));
|
|
m_authMethodCombo->addItem("Autenticación OAuth2", QVariant::fromValue(QString("oauth2")));
|
|
form->addRow("Método:", m_authMethodCombo);
|
|
|
|
m_authPage->setLayout(form);
|
|
}
|
|
|
|
void ConnectionWizard::setupPageTest()
|
|
{
|
|
m_testPage = new QWizardPage(this);
|
|
m_testPage->setTitle("Probar conexión");
|
|
m_testPage->setSubTitle("Verifica que los datos ingresados sean correctos.");
|
|
|
|
QVBoxLayout *lay = new QVBoxLayout(m_testPage);
|
|
m_testStatusLabel = new QLabel("Listo para probar la conexión.");
|
|
m_testStatusLabel->setAlignment(Qt::AlignCenter);
|
|
m_testStatusLabel->setStyleSheet("font-size: 14px; color: #555;");
|
|
lay->addWidget(m_testStatusLabel);
|
|
|
|
m_testDetailLabel = new QLabel("");
|
|
m_testDetailLabel->setWordWrap(true);
|
|
m_testDetailLabel->setAlignment(Qt::AlignCenter);
|
|
m_testDetailLabel->setStyleSheet("font-size: 12px; color: #888;");
|
|
lay->addWidget(m_testDetailLabel);
|
|
|
|
lay->addStretch();
|
|
|
|
m_testButton = new QPushButton("Probar conexión ahora");
|
|
m_testButton->setStyleSheet(
|
|
"QPushButton { background-color: #0071e3; color: white; border: none; padding: 8px 16px; border-radius: 4px; }"
|
|
"QPushButton:hover { background-color: #005bb5; }"
|
|
);
|
|
lay->addWidget(m_testButton, 0, Qt::AlignCenter);
|
|
|
|
connect(m_testButton, &QPushButton::clicked, this, &ConnectionWizard::onTestClicked);
|
|
|
|
m_testPage->setLayout(lay);
|
|
}
|
|
|
|
void ConnectionWizard::onTestClicked()
|
|
{
|
|
if (!m_accountService) {
|
|
m_testStatusLabel->setText("⚠️ Servicio de cuenta no disponible.");
|
|
m_testStatusLabel->setStyleSheet("color: #e60000;");
|
|
m_testDetailLabel->setText("El servicio de cuenta no está inicializado.");
|
|
return;
|
|
}
|
|
|
|
Account::ConnectionSettings settings = connectionSettings();
|
|
// Basic validation
|
|
if (settings.incomingHost.isEmpty() || settings.username.isEmpty() || settings.password.isEmpty()) {
|
|
m_testStatusLabel->setText("⚠️ Faltan datos obligatorios.");
|
|
m_testStatusLabel->setStyleSheet("color: #e60000;");
|
|
m_testDetailLabel->setText("Por favor, completa los campos de servidor entrante, usuario y contraseña.");
|
|
return;
|
|
}
|
|
|
|
m_testStatusLabel->setText("⏳ Probando conexión...");
|
|
m_testStatusLabel->setStyleSheet("color: #0071e3;");
|
|
m_testDetailLabel->setText("Conectando al servidor IMAP...");
|
|
|
|
// Use a small delay to allow UI update before blocking call
|
|
QTimer::singleShot(0, this, [this, settings]() {
|
|
QString errorMsg;
|
|
bool ok = m_accountService->testConnection(settings, errorMsg);
|
|
if (ok) {
|
|
m_testStatusLabel->setText("✅ Conexión exitosa.");
|
|
m_testStatusLabel->setStyleSheet("color: #34c759;");
|
|
m_testDetailLabel->setText("Los datos ingresados son correctos. Puedes finalizar la configuración.");
|
|
} else {
|
|
m_testStatusLabel->setText("❌ Error de conexión.");
|
|
m_testStatusLabel->setStyleSheet("color: #ff3b30;");
|
|
m_testDetailLabel->setText(errorMsg.isEmpty() ? "Error desconocido." : errorMsg);
|
|
}
|
|
});
|
|
}
|
|
|
|
Account::ConnectionSettings ConnectionWizard::connectionSettings() const
|
|
{
|
|
Account::ConnectionSettings s;
|
|
// Incoming
|
|
s.type = m_incomingTypeCombo->currentData().toString(); // "imap" or "pop3"
|
|
s.incomingHost = m_incomingHostEdit->text().trimmed();
|
|
s.incomingPort = m_incomingPortEdit->text().toInt();
|
|
s.incomingSsl = m_incomingSslCheck->isChecked();
|
|
|
|
// Outgoing (SMTP)
|
|
s.outgoingHost = m_outgoingHostEdit->text().trimmed();
|
|
s.outgoingPort = m_outgoingPortEdit->text().toInt();
|
|
s.outgoingSsl = m_outgoingSslCheck->isChecked();
|
|
|
|
// Auth
|
|
s.username = m_usernameEdit->text().trimmed();
|
|
s.password = m_passwordEdit->text();
|
|
s.authMethod = m_authMethodCombo->currentData().toString(); // "plain" or "oauth2"
|
|
|
|
return s;
|
|
}
|
|
|
|
void ConnectionWizard::accept()
|
|
{
|
|
// When Finish is pressed, emit the settings and close
|
|
Account::ConnectionSettings settings = connectionSettings();
|
|
emit settingsReady(settings);
|
|
QWizard::accept();
|
|
}
|
|
ConnectionWizard::~ConnectionWizard() = default;
|