diff --git a/sea_transport/adminpanel.cpp b/sea_transport/adminpanel.cpp index c596f91..d424284 100644 --- a/sea_transport/adminpanel.cpp +++ b/sea_transport/adminpanel.cpp @@ -1,10 +1,10 @@ #include "adminpanel.h" #include "ui_adminpanel.h" + AdminPanel::AdminPanel(QWidget *parent) : QMainWindow(parent), ui(new Ui::AdminPanel) { ui->setupUi(this); - uvm = new UsersViewModel(this); // connect(ui->pb_logout, &QPushButton::clicked, this, &AdminPanel::on_logout_requested); @@ -20,9 +20,14 @@ AdminPanel::AdminPanel(QWidget *parent) : QMainWindow(parent), ui(new Ui::AdminP // connect(ui->pb_dp_add, &QPushButton::clicked, this, &AdminPanel::on_delivery_point_add); // connect(ui->pb_dp_remove, &QPushButton::clicked, this, &AdminPanel::on_delivery_point_remove); + // ui->tv_vessels->setModel(); + + uvm = new UsersViewModel(this); ui->tv_users->setModel(uvm); + // ui->tv_dp->setModel(); + // ui->tv_storages->setModel(); diff --git a/sea_transport/authwindow.cpp b/sea_transport/authwindow.cpp index 76b4bbf..f8a13ff 100644 --- a/sea_transport/authwindow.cpp +++ b/sea_transport/authwindow.cpp @@ -23,8 +23,9 @@ void AuthWindow::on_auth_requested() { bool success = false; auto a = apparatus::instance()->get_auth_subsystem(); + if (apparatus::isFirstRun()) { - success = a.register_user(login, passw, UserRole::ADMINISTRATOR); + success = a->register_user(login, passw, UserRole::ADMINISTRATOR); if (!success) { QMessageBox::critical(this, "Error", "Cannot register you. Check filesystem permission"); return; @@ -35,7 +36,7 @@ void AuthWindow::on_auth_requested() { } } - auto user = a.get_user(login, success); + auto user = a->get_user(login, success); if (!success) { QMessageBox::critical(this, "Error", "User not found"); return; @@ -48,18 +49,25 @@ void AuthWindow::on_auth_requested() { } + QWidget *w; if (user->role() == UserRole::ADMINISTRATOR) { - AdminPanel(nullptr).set_user(*user).showNormal(); + w = new AdminPanel(nullptr); + ((AdminPanel*) w)->set_user(*user); } else if (user->role() == UserRole::DISPATCHER) { // DispatcherPanel(nullptr, user).set_user(user).show(); + return; } else if (user->role() == UserRole::SKIPPER) { // SkipperPanel(nullptr, user).set_user(user).show(); + return; } else { QMessageBox::critical(this, "Error", "Deserialized user have wrong type. " "It may mean corruption of data."); return; } + + w->show(); + close(); } diff --git a/sea_transport/main.cpp b/sea_transport/main.cpp index a37cf30..5a92eef 100644 --- a/sea_transport/main.cpp +++ b/sea_transport/main.cpp @@ -13,8 +13,8 @@ int main(int argc, char *argv[]) { w.show(); QObject::connect(&a, &QApplication::aboutToQuit, []() { - apparatus::shutdown(); - if (apparatus::isFirstRun()) { + apparatus::instance()->save(); + if (apparatus::isFirstRun() && apparatus::instance()->get_auth_subsystem()->users().length() > 0) { apparatus::generate_lock_file(); } }); diff --git a/sea_transport/system/apparatus.cpp b/sea_transport/system/apparatus.cpp index 4e4e89f..91c2ec3 100644 --- a/sea_transport/system/apparatus.cpp +++ b/sea_transport/system/apparatus.cpp @@ -4,27 +4,15 @@ apparatus *apparatus::_instance = nullptr; const QString apparatus::filename = "data.bin"; -void apparatus::open_stream() { - this->_bin_file = new QFile(apparatus::filename); - this->_bin_file->open(QIODevice::ReadWrite); - - stream.setDevice(_bin_file); -} - -void apparatus::close_stream() { - stream.setDevice(nullptr); - - this->_bin_file->close(); - delete this->_bin_file; - this->_bin_file = nullptr; -} - apparatus::apparatus() { - + this->_auth_system = new auth_system(); + this->_object_system = new object_system(); } apparatus::~apparatus() { - + this->save(); + delete this->_auth_system; + delete this->_object_system; } void apparatus::generate_lock_file() { @@ -42,52 +30,79 @@ apparatus* apparatus::instance() { return apparatus::_instance; } +void apparatus::save() { + if (_instance == nullptr) { + return; + } + QFile f(apparatus::filename); + f.open(QIODevice::WriteOnly); + QDataStream stream(&f); + + // saving GIDs + entity_id vgid = vessel_entity::GID(); + entity_id sgid = storage_entity::GID(); + stream << vgid << sgid; + + // serializing data + this->_auth_system->serialize_data(&stream); + this->_object_system->serialize_data(&stream); + + f.close(); +} + +void apparatus::load() { + if (_instance == nullptr) { + throw std::runtime_error("HOW DU FUCK INSTANCE IS NULL????"); + } + QFile f(apparatus::filename); + f.open(QIODevice::ReadOnly); + QDataStream stream(&f); + + // loading GIDs + entity_id vgid, sgid; + stream >> vgid >> sgid; + vessel_entity::preloadGlobalId(vgid); + storage_entity::preloadGlobalId(sgid); + + // deserializing data + this->_auth_system->deserialize_data(&stream); + this->_object_system->deserialize_data(&stream); + + f.close(); +} + bool apparatus::isFirstRun() { return !QFile().exists("lock"); } -auth_system& apparatus::get_auth_subsystem() { +auth_system* apparatus::get_auth_subsystem() { return this->_auth_system; } -object_system& apparatus::get_object_subsystem() { +object_system* apparatus::get_object_subsystem() { return this->_object_system; } void apparatus::init() { + if (apparatus::_instance != nullptr) { + throw std::runtime_error("System already initialized!"); + } + + bool fr = apparatus::isFirstRun(); apparatus::_instance = new apparatus(); - apparatus::_instance->open_stream(); - apparatus::_instance->loadGIDS(); - apparatus::_instance->deserialize_data(); + if (fr) { + if (!QFile().exists(apparatus::filename)) { + QFile init(apparatus::filename); + init.open(QIODevice::ReadWrite); + init.close(); + } + apparatus::_instance->save(); + } + + apparatus::_instance->load(); } void apparatus::shutdown() { - apparatus::_instance->writeGIDS(); - apparatus::_instance->serialize_data(); - apparatus::_instance->close_stream(); delete apparatus::_instance; } - -void apparatus::writeGIDS() { - entity_id vgid = vessel_entity::GID(); - entity_id sgid = storage_entity::GID(); - this->stream << vgid << sgid; -} - -void apparatus::loadGIDS() { - entity_id vgid, sgid; - this->stream >> vgid >> sgid; - vessel_entity::preloadGlobalId(vgid); - storage_entity::preloadGlobalId(sgid); -} - -void apparatus::serialize_data() { - this->_auth_system.serialize_data(this->stream); - this->_object_system.serialize_data(this->stream); -} - -void apparatus::deserialize_data() { - this->_auth_system.deserialize_data(this->stream); - this->_object_system.deserialize_data(this->stream); -} diff --git a/sea_transport/system/apparatus.h b/sea_transport/system/apparatus.h index eb62840..43ddeee 100644 --- a/sea_transport/system/apparatus.h +++ b/sea_transport/system/apparatus.h @@ -18,29 +18,18 @@ private: static apparatus *_instance; static const QString filename; - QFile *_bin_file; - QDataStream stream; - - auth_system _auth_system; - object_system _object_system; - - void open_stream(); - void close_stream(); - - void writeGIDS(); - void loadGIDS(); + auth_system* _auth_system; + object_system* _object_system; public: - apparatus(); + explicit apparatus(); ~apparatus(); - void generate_empty_data(); - auth_system& get_auth_subsystem(); - object_system& get_object_subsystem(); + auth_system* get_auth_subsystem(); + object_system* get_object_subsystem(); - - void serialize_data(); - void deserialize_data(); + void save(); + void load(); static bool isFirstRun(); static void generate_lock_file(); diff --git a/sea_transport/system/auth_system.cpp b/sea_transport/system/auth_system.cpp index 5d70ea1..a6c53aa 100644 --- a/sea_transport/system/auth_system.cpp +++ b/sea_transport/system/auth_system.cpp @@ -1,4 +1,6 @@ +#include "apparatus.h" #include "auth_system.h" +#include const user_entity* auth_system::get_user(const QString &login, bool &success) { @@ -32,29 +34,35 @@ bool auth_system::register_user(const QString &login, const QString &password, U bool exists = false; this->get_user(login, exists); if (!exists) { + std::cout << apparatus::instance()->get_auth_subsystem()->users().length() << std::endl; this->_users.push_back(user_entity(login, password, role)); + std::cout << apparatus::instance()->get_auth_subsystem()->users().length() << std::endl; + apparatus::instance()->save(); + std::cout << apparatus::instance()->get_auth_subsystem()->users().length() << std::endl; return true; } return false; } -const QVector auth_system::users() const { +const QVector& auth_system::users() const { return this->_users; } -void auth_system::deserialize_data(QDataStream &stream) { +void auth_system::deserialize_data(QDataStream *stream) { int icnt; - stream >> icnt; - this->_users.resize(icnt); - for (int i = 0; i < icnt; i++) { - this->_users[i].deserialize(stream); + *stream >> icnt; + if (icnt > 0) { + this->_users.resize(icnt); + for (int i = 0; i < icnt; i++) { + this->_users[i].deserialize(*stream); + } } } -void auth_system::serialize_data(QDataStream &stream) { - stream << this->_users.size(); +void auth_system::serialize_data(QDataStream *stream) { + *stream << this->_users.size(); for (auto &item : this->_users) { - item.serialize(stream); + item.serialize(*stream); } } diff --git a/sea_transport/system/auth_system.h b/sea_transport/system/auth_system.h index c87439f..ecc42ae 100644 --- a/sea_transport/system/auth_system.h +++ b/sea_transport/system/auth_system.h @@ -17,10 +17,10 @@ public: bool remove_user(const QString &login); bool register_user(const QString &login, const QString &password, UserRole role); - const QVector users() const; + const QVector& users() const; - void deserialize_data(QDataStream &stream); - void serialize_data(QDataStream &stream); + void deserialize_data(QDataStream *stream); + void serialize_data(QDataStream *stream); }; #endif // AUTH_SYSTEM_H diff --git a/sea_transport/system/object_system.cpp b/sea_transport/system/object_system.cpp index 1aa46b6..6b6456c 100644 --- a/sea_transport/system/object_system.cpp +++ b/sea_transport/system/object_system.cpp @@ -85,30 +85,34 @@ const QVector object_system::vessels() const { return this->_vessels; } -void object_system::deserialize_data(QDataStream &stream) { +void object_system::deserialize_data(QDataStream *stream) { int dicnt; - stream >> dicnt; - this->_dpoints.resize(dicnt); - for (int i = 0; i < dicnt; i++) { - this->_dpoints[i].deserialize(stream); + *stream >> dicnt; + if (dicnt > 0) { + this->_dpoints.resize(dicnt); + for (int i = 0; i < dicnt; i++) { + this->_dpoints[i].deserialize(*stream); + } } int vicnt; - stream >> vicnt; - this->_vessels.resize(vicnt); - for (int i = 0; i < vicnt; i++) { - this->_vessels[i].deserialize(stream); + *stream >> vicnt; + if (vicnt > 0) { + this->_vessels.resize(vicnt); + for (int i = 0; i < vicnt; i++) { + this->_vessels[i].deserialize(*stream); + } } } -void object_system::serialize_data(QDataStream &stream) { - stream << this->_dpoints.size(); +void object_system::serialize_data(QDataStream *stream) { + *stream << this->_dpoints.size(); for (auto &item : this->_dpoints) { - item.serialize(stream); + item.serialize(*stream); } - stream << this->_vessels.size(); + *stream << this->_vessels.size(); for (auto &item : this->_vessels) { - item.serialize(stream); + item.serialize(*stream); } } diff --git a/sea_transport/system/object_system.h b/sea_transport/system/object_system.h index 095e2e5..2239a42 100644 --- a/sea_transport/system/object_system.h +++ b/sea_transport/system/object_system.h @@ -28,8 +28,8 @@ public: const QVector dpoints() const; const QVector vessels() const; - void deserialize_data(QDataStream &stream); - void serialize_data(QDataStream &stream); + void deserialize_data(QDataStream *stream); + void serialize_data(QDataStream *stream); }; #endif // OBJECT_SYSTEM_H diff --git a/sea_transport/viewmodels/usersviewmodel.cpp b/sea_transport/viewmodels/usersviewmodel.cpp index 6ad267c..93785f2 100644 --- a/sea_transport/viewmodels/usersviewmodel.cpp +++ b/sea_transport/viewmodels/usersviewmodel.cpp @@ -5,7 +5,7 @@ UsersViewModel::UsersViewModel(QObject *parent) : QAbstractTableModel(parent) { } int UsersViewModel::rowCount(const QModelIndex & /*parent*/) const { - return apparatus::instance()->get_object_subsystem().vessels().size(); + return apparatus::instance()->get_object_subsystem()->vessels().size(); } int UsersViewModel::columnCount(const QModelIndex & /*parent*/) const { @@ -28,7 +28,7 @@ QVariant UsersViewModel::headerData(int section, Qt::Orientation orientation, in QVariant UsersViewModel::data(const QModelIndex &index, int role) const { if (role == Qt::DisplayRole) { - auto item = apparatus::instance()->get_auth_subsystem().users()[index.row()]; + auto item = apparatus::instance()->get_auth_subsystem()->users()[index.row()]; int col = index.column(); switch (col) { diff --git a/sea_transport_project.pro.user b/sea_transport_project.pro.user index 62fefe9..be69ce2 100644 --- a/sea_transport_project.pro.user +++ b/sea_transport_project.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -65,10 +65,17 @@ true + Checked + Checked + Checked + Checked Checked + Unchecked Checked + Unchecked Checked Checked + Checked Checked Checked @@ -99,7 +106,7 @@ qt.qt5.5150.win64_mingw81_kit 0 0 - 1 + 0 true 0 diff --git a/st_test/tst_st_test.cpp b/st_test/tst_st_test.cpp index 8a21a9f..0e015bb 100644 --- a/st_test/tst_st_test.cpp +++ b/st_test/tst_st_test.cpp @@ -245,18 +245,18 @@ void st_test::apparatus_check_first_run() { void st_test::apparatus_check_auth_subsystem() { apparatus::init(); - auth_system as = apparatus::instance()->get_auth_subsystem(); + auto as = apparatus::instance()->get_auth_subsystem(); { - bool test = as.register_user("testor", "passwd", UserRole::ADMINISTRATOR); + bool test = as->register_user("testor", "passwd", UserRole::ADMINISTRATOR); QVERIFY(test); } { bool test; - as.get_user("testor", test); + as->get_user("testor", test); QVERIFY(test); } { - bool test = as.remove_user("testor"); + bool test = as->remove_user("testor"); QVERIFY(test); } apparatus::shutdown(); @@ -264,19 +264,19 @@ void st_test::apparatus_check_auth_subsystem() { void st_test::apparatus_check_object_subsystem() { apparatus::init(); - object_system os = apparatus::instance()->get_object_subsystem(); + auto os = apparatus::instance()->get_object_subsystem(); dpoint_entity p("test"); { - bool test = os.add_dpoint(p); + bool test = os->add_dpoint(p); QVERIFY(test); } { bool test; - os.get_dpoint(p.id(), test); + os->get_dpoint(p.id(), test); QVERIFY(test); } { - bool test = os.remove_dpoint(p.id()); + bool test = os->remove_dpoint(p.id()); QVERIFY(test); } apparatus::shutdown();