From 384a9b05b198b327e97c7ea9fc8e73dd84c37496 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Tue, 16 Jun 2026 02:52:55 +0530 Subject: [PATCH] Somewhat working --- .../Trenser.VehicleServiceSystem.vcxproj | 2 + .../AuthenticationManagementService.cpp | 14 +++- .../views/AdminMenu.cpp | 7 ++ .../views/AdminMenu.h | 3 +- .../views/CustomerMenu.cpp | 8 ++ .../views/CustomerMenu.h | 3 +- .../views/Menu.cpp | 84 +++++++++++++++++++ .../Trenser.VehicleServiceSystem/views/Menu.h | 30 +++++++ .../views/TechnicianMenu.cpp | 8 ++ .../views/TechnicianMenu.h | 3 +- 10 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/Menu.cpp create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/Menu.h diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj index 7ae72bd..e554d2b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj @@ -149,6 +149,7 @@ + @@ -193,6 +194,7 @@ + diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp index ac5682d..094289a 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp @@ -43,11 +43,21 @@ bool AuthenticationManagementService::login(const std::string& username, const s user->getId(), []() { - std::cout << "USER_DISABLED event received" << std::endl; + HANDLE eventHandle = OpenEventA(EVENT_MODIFY_STATE, FALSE, "VehicleServiceSystem_AccountDisabled"); + if (eventHandle) + { + SetEvent(eventHandle); + CloseHandle(eventHandle); + } }, []() { - std::cout << "NOTIFICATION_AVAILABLE event received" << std::endl; + HANDLE eventHandle = OpenEventA(EVENT_MODIFY_STATE, FALSE, "VehicleServiceSystem_NotificationAvailable"); + if (eventHandle) + { + SetEvent(eventHandle); + CloseHandle(eventHandle); + } }); return true; } diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp index 76a1901..c236823 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.cpp @@ -30,10 +30,16 @@ Return type: void */ void AdminMenu::showMenu() { + startEventListener(); while (true) { try { + if (!m_isMenuActive) + { + logout(); + break; + } int choice; util::clear(); std::cout << "Admin Menu" @@ -68,6 +74,7 @@ void AdminMenu::showMenu() util::pressEnter(); } } + stopEventListener(); } /* diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h index bdffcb6..b5f0085 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/AdminMenu.h @@ -9,8 +9,9 @@ Date:19-May-2026 #pragma once #include "Controller.h" +#include "Menu.h" -class AdminMenu +class AdminMenu : Menu { private: Controller m_controller; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp index 0d60f97..017106b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.cpp @@ -32,10 +32,17 @@ Return type: void */ void CustomerMenu::showMenu() { + + startEventListener(); while (true) { try { + if (!m_isMenuActive) + { + logout(); + break; + } int choice; util::clear(); std::cout << "Customer Menu" @@ -62,6 +69,7 @@ void CustomerMenu::showMenu() util::pressEnter(); } } + stopEventListener(); } /* diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.h index d491720..2791295 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/CustomerMenu.h @@ -9,9 +9,10 @@ Date:19-May-2026 */ #pragma once +#include "Menu.h" #include "Controller.h" -class CustomerMenu +class CustomerMenu : Menu { private: Controller m_controller; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/Menu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/Menu.cpp new file mode 100644 index 0000000..486a684 --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/Menu.cpp @@ -0,0 +1,84 @@ +#include "Menu.h" + +Menu::Menu() + : + m_isMenuActive(false), + m_hasNewNotifications(false), + m_accountDisabledEvent(NULL), + m_notificationAvailableEvent(NULL), + m_shutdownEvent(NULL) {} + +Menu::~Menu() +{ + stopEventListener(); +} + +void Menu::startEventListener() +{ + if (m_isMenuActive.load()) + { + return; + } + m_isMenuActive.store(true); + m_hasNewNotifications.store(false); + m_accountDisabledEvent = CreateEventA(NULL, FALSE, FALSE, "VehicleServiceSystem_AccountDisabled"); + m_notificationAvailableEvent = CreateEventA(NULL, FALSE, FALSE, "VehicleServiceSystem_NotificationAvailable"); + m_shutdownEvent = CreateEventA(NULL, FALSE, FALSE, NULL); + m_eventListenerThread = std::thread(&Menu::eventListenerLoop, this); +} + +void Menu::eventListenerLoop() +{ + HANDLE handles[3]; + handles[0] = m_accountDisabledEvent; + handles[1] = m_notificationAvailableEvent; + handles[2] = m_shutdownEvent; + while (m_isMenuActive.load()) + { + DWORD result = WaitForMultipleObjects(3, handles, FALSE, INFINITE); + switch (result) + { + case WAIT_OBJECT_0: + m_isMenuActive.store(false); + MessageBoxA( + NULL, + "Your account has been disabled.", + "Account Disabled", + MB_OK | MB_ICONWARNING); + break; + case WAIT_OBJECT_0 + 1: + m_hasNewNotifications.store(true); + break; + case WAIT_OBJECT_0 + 2: + return; + } + } +} + +void Menu::stopEventListener() +{ + m_isMenuActive.store(false); + if (m_shutdownEvent) + { + SetEvent(m_shutdownEvent); + } + if (m_eventListenerThread.joinable()) + { + m_eventListenerThread.join(); + } + if (m_accountDisabledEvent) + { + CloseHandle(m_accountDisabledEvent); + } + if (m_notificationAvailableEvent) + { + CloseHandle(m_notificationAvailableEvent); + } + if (m_shutdownEvent) + { + CloseHandle(m_shutdownEvent); + } + m_accountDisabledEvent = NULL; + m_notificationAvailableEvent = NULL; + m_shutdownEvent = NULL; +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/Menu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/Menu.h new file mode 100644 index 0000000..169a47d --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/Menu.h @@ -0,0 +1,30 @@ +/* +File: Menu.h +Description: Base class providing common event listener functionality + for all menu implementations. +Author: Trenser +Date:16-Jun-2026 +*/ + +#pragma once + +#include +#include +#include + +class Menu +{ +protected: + std::atomic m_isMenuActive; + std::atomic m_hasNewNotifications; + HANDLE m_accountDisabledEvent; + HANDLE m_notificationAvailableEvent; + HANDLE m_shutdownEvent; + std::thread m_eventListenerThread; + void startEventListener(); + void stopEventListener(); + void eventListenerLoop(); +public: + Menu(); + virtual ~Menu(); +}; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp index 8ff3e12..7105369 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.cpp @@ -27,10 +27,16 @@ Returns: */ void TechnicianMenu::showMenu() { + startEventListener(); while (true) { try { + if (!m_isMenuActive) + { + logout(); + break; + } int choice; util::clear(); std::cout << "Technician Menu" @@ -45,6 +51,7 @@ void TechnicianMenu::showMenu() { break; } + stopEventListener(); } catch (const std::exception& e) { @@ -52,6 +59,7 @@ void TechnicianMenu::showMenu() util::pressEnter(); } } + stopEventListener(); } /* diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h index 2d118a0..27ea617 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/TechnicianMenu.h @@ -9,8 +9,9 @@ Date:19-May-2026 #pragma once #include "Controller.h" +#include "Menu.h" -class TechnicianMenu +class TechnicianMenu : Menu { private: Controller m_controller;