From c4a75d35df146ee16b2a7e9933451f9ab1cedd3f Mon Sep 17 00:00:00 2001 From: Thomas Lindner Date: Wed, 16 Nov 2022 00:29:32 +0100 Subject: [PATCH] simple login handling --- .clang-format | 2 +- src/CMakeLists.txt | 9 +++++- src/deltachat_context.cc | 51 ++++++++++++++++++++++++++++++++ src/deltachat_context.hh | 34 ++++++++++++++++++++++ src/login_dialog.cc | 63 ++++++++++++++++++++++++++++++++++++++++ src/login_dialog.hh | 25 ++++++++++++++++ src/main.cc | 18 ++++++++---- src/main.hh | 22 ++++++++++++++ src/main_window.cc | 9 ++++++ src/main_window.hh | 16 ++++++++++ 10 files changed, 241 insertions(+), 8 deletions(-) create mode 100644 src/deltachat_context.cc create mode 100644 src/deltachat_context.hh create mode 100644 src/login_dialog.cc create mode 100644 src/login_dialog.hh create mode 100644 src/main.hh create mode 100644 src/main_window.cc create mode 100644 src/main_window.hh diff --git a/.clang-format b/.clang-format index 7bf7ac8..08f742a 100644 --- a/.clang-format +++ b/.clang-format @@ -70,7 +70,7 @@ EmptyLineAfterAccessModifier: Never EmptyLineBeforeAccessModifier: LogicalBlock ExperimentalAutoDetectBinPacking: false BasedOnStyle: '' -ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true AllowAllConstructorInitializersOnNextLine: true FixNamespaceComments: true ForEachMacros: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 813f36c..de473ea 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,12 @@ add_executable(${PROJECT_NAME} + deltachat_context.cc + deltachat_context.hh + login_dialog.cc + login_dialog.hh main.cc + main.hh + main_window.cc + main_window.hh ) target_link_libraries(${PROJECT_NAME} PRIVATE @@ -12,7 +19,7 @@ target_compile_features(${PROJECT_NAME} ) target_compile_options(${PROJECT_NAME} PRIVATE - $<$,$,$>:-Wall -Wextra> + $<$,$,$>:-Wall -Wextra> ) set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE ON diff --git a/src/deltachat_context.cc b/src/deltachat_context.cc new file mode 100644 index 0000000..5e487d5 --- /dev/null +++ b/src/deltachat_context.cc @@ -0,0 +1,51 @@ +#include "deltachat_context.hh" + +#include +#include +#include + +namespace kappachat { + +DeltachatContext::DeltachatContext() + : m_context{dc_context_new(NULL, "kappachat.sqlite", NULL)}, + m_event_thread{std::bind(&DeltachatContext::eventThread, this)} {} + +DeltachatContext::~DeltachatContext() { + dc_stop_io(m_context); + dc_context_unref(m_context); + m_event_thread.join(); +} + +void DeltachatContext::setConfig(QString key, QString value) { + dc_set_config(m_context, key.toStdString().c_str(), + value.toStdString().c_str()); +} + +bool DeltachatContext::isConfigured() const { + return dc_is_configured(m_context); +} + +void DeltachatContext::configure() { + dc_configure(m_context); +} + +void DeltachatContext::eventThread() { + dc_event_emitter_t *emitter = dc_get_event_emitter(m_context); + while (dc_event_t *event = dc_get_next_event(emitter)) { + switch (dc_event_get_id(event)) { + case DC_EVENT_CONFIGURE_PROGRESS: { + int permille = dc_event_get_data1_int(event); + char *message = dc_event_get_data2_str(event); + emit configureProgress(permille, message ?: ""); + dc_str_unref(message); + dc_event_unref(event); + break; + } + default: + dc_event_unref(event); + } + } + dc_event_emitter_unref(emitter); +} + +} // namespace kappachat diff --git a/src/deltachat_context.hh b/src/deltachat_context.hh new file mode 100644 index 0000000..5ae6a5d --- /dev/null +++ b/src/deltachat_context.hh @@ -0,0 +1,34 @@ +#pragma once + +#include + +#include +#include +#include + +namespace kappachat { + +class DeltachatContext : public QObject { + Q_OBJECT + + public: + DeltachatContext(); + ~DeltachatContext(); + + bool isConfigured() const; + + public slots: + void setConfig(QString key, QString value); + void configure(); + + signals: + void configureProgress(int permille, QString message); + + private: + void eventThread(); + + dc_context_t *m_context; + std::thread m_event_thread; +}; + +} // namespace kappachat diff --git a/src/login_dialog.cc b/src/login_dialog.cc new file mode 100644 index 0000000..69b58f3 --- /dev/null +++ b/src/login_dialog.cc @@ -0,0 +1,63 @@ +#include "login_dialog.hh" + +#include +#include +#include +#include +#include + +namespace kappachat { + +LoginDialog::LoginDialog(QWidget *parent, DeltachatContext *context) + : QDialog{parent}, + m_context{context}, + m_email{new QLineEdit}, + m_password{new QLineEdit} { + connect(m_context, &DeltachatContext::configureProgress, this, + &LoginDialog::configureProgress); + + auto form = new QFormLayout; + form->addRow(new QLabel{"Email:"}, m_email); + form->addRow(new QLabel{"Password:"}, m_password); + m_password->setEchoMode(QLineEdit::Password); + + auto buttons = + new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); + + auto vbox = new QVBoxLayout{this}; + vbox->addLayout(form); + vbox->addWidget(buttons); + + setWindowTitle("Login"); + setModal(true); + + if (!m_context->isConfigured()) { + show(); + } +} + +void LoginDialog::accept() { + m_context->setConfig("addr", m_email->text()); + m_context->setConfig("mail_pw", m_password->text()); + m_context->configure(); + QDialog::accept(); +} + +void LoginDialog::configureProgress(int permille, QString message) { + if (!permille) { + QMessageBox messagebox; + messagebox.setText("Login failed."); + if (message.length() > 500) { + messagebox.setDetailedText(message); + } else { + messagebox.setInformativeText(message); + } + messagebox.setIcon(QMessageBox::Critical); + messagebox.exec(); + show(); + } +} + +} // namespace kappachat diff --git a/src/login_dialog.hh b/src/login_dialog.hh new file mode 100644 index 0000000..34a3d43 --- /dev/null +++ b/src/login_dialog.hh @@ -0,0 +1,25 @@ +#pragma once + +#include "deltachat_context.hh" +#include +#include + +namespace kappachat { + +class LoginDialog : public QDialog { + Q_OBJECT + + public: + LoginDialog(QWidget *parent, DeltachatContext *context); + + public slots: + void accept() override; + void configureProgress(int permille, QString message); + + private: + DeltachatContext *m_context; + QLineEdit *m_email; + QLineEdit *m_password; +}; + +} // namespace kappachat diff --git a/src/main.cc b/src/main.cc index 598b446..e4ff0dd 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,10 +1,16 @@ -#include -#include +#include "main.hh" int main(int argc, char **argv) { - QApplication app{argc, argv}; - QMainWindow mainwindow; - - mainwindow.show(); + kappachat::Kappachat app{argc, argv}; return app.exec(); } + +namespace kappachat { + +Kappachat::Kappachat(int argc, char **argv) + : QApplication{argc, argv}, login_dialog{&main_window, &context} { + connect(&login_dialog, &LoginDialog::rejected, &main_window, + &MainWindow::close); +} + +} // namespace kappachat diff --git a/src/main.hh b/src/main.hh new file mode 100644 index 0000000..702cf63 --- /dev/null +++ b/src/main.hh @@ -0,0 +1,22 @@ +#pragma once + +#include "deltachat_context.hh" +#include "login_dialog.hh" +#include "main_window.hh" +#include + +namespace kappachat { + +class Kappachat : public QApplication { + Q_OBJECT + + public: + Kappachat(int argc, char **argv); + + private: + DeltachatContext context; + MainWindow main_window; + LoginDialog login_dialog; +}; + +} // namespace kappachat diff --git a/src/main_window.cc b/src/main_window.cc new file mode 100644 index 0000000..73d40bd --- /dev/null +++ b/src/main_window.cc @@ -0,0 +1,9 @@ +#include "main_window.hh" + +namespace kappachat { + +MainWindow::MainWindow() { + showMaximized(); +} + +} // namespace kappachat diff --git a/src/main_window.hh b/src/main_window.hh new file mode 100644 index 0000000..9f45864 --- /dev/null +++ b/src/main_window.hh @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace kappachat { + +class MainWindow : public QMainWindow { + Q_OBJECT + + public: + MainWindow(); + + private: +}; + +} // namespace kappachat