aboutsummaryrefslogtreecommitdiff
path: root/src/InstanceManager.cpp
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-04-05 10:33:38 +0530
committerAkshay Nair <phenax5@gmail.com>2025-04-05 10:34:22 +0530
commit7e09b35b008f58809ac56184a4f83ab875c038e0 (patch)
tree3f7acdb64d2b063760fa22529826aa418e249750 /src/InstanceManager.cpp
parent8eda8343757b2161535388387b0525e0fd56f569 (diff)
downloadnull-browser-7e09b35b008f58809ac56184a4f83ab875c038e0.tar.gz
null-browser-7e09b35b008f58809ac56184a4f83ab875c038e0.zip
Add instance manager for enforcing single instance
Diffstat (limited to 'src/InstanceManager.cpp')
-rw-r--r--src/InstanceManager.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/InstanceManager.cpp b/src/InstanceManager.cpp
new file mode 100644
index 0000000..4fb27f9
--- /dev/null
+++ b/src/InstanceManager.cpp
@@ -0,0 +1,106 @@
+#include <QLocalSocket>
+#include <QtCore>
+#include <cstdlib>
+#include <qnamespace.h>
+
+#include "InstanceManager.hpp"
+
+InstanceManager::InstanceManager() {
+ bool connected = try_server_connection();
+ if (!connected) {
+ server_init();
+ }
+}
+
+void InstanceManager::write_open_urls_to_socket(const QStringList &urls) {
+ if (socket == nullptr)
+ return;
+
+ auto message = urls.join(" ").toStdString();
+ socket->write(message.c_str());
+ socket->write("\n");
+}
+
+void InstanceManager::write_lua_expr_to_socket(const QString &lua_expr) {
+ if (socket == nullptr)
+ return;
+
+ auto message = ("lua " + lua_expr).toStdString();
+ socket->write(message.c_str());
+ socket->write("\n");
+}
+
+void InstanceManager::server_init() {
+ server = new QLocalServer(this);
+ is_server_mode = true;
+
+ connect(server, &QLocalServer::newConnection, this,
+ &InstanceManager::handle_new_connection);
+
+ QLocalServer::removeServer(socket_path);
+ if (!server->listen(socket_path)) {
+ qCritical() << "Unable to start server:" << server->serverError();
+ exit(1); // TODO: Do something else?
+ }
+}
+
+void InstanceManager::send_message() {
+ socket->waitForBytesWritten();
+ socket->close();
+}
+
+void InstanceManager::handle_new_connection() {
+ if (!server->hasPendingConnections())
+ return;
+
+ qDebug() << "New connection";
+ auto *client = server->nextPendingConnection();
+ if (client == nullptr)
+ return;
+
+ connect(client, &QLocalSocket::disconnected, client,
+ &QLocalSocket::deleteLater);
+
+ client->waitForReadyRead();
+ while (client->canReadLine()) {
+ QString data = client->readLine();
+
+ qDebug() << "RECV:" << data;
+ if (data.startsWith("lua ")) {
+ auto lua_expr = data.sliced(4);
+ emit lua_eval_requested(lua_expr);
+ } else {
+ QRegularExpression whitespace("\\s+");
+ auto urls = data.split(whitespace, Qt::SkipEmptyParts);
+ emit urls_open_requested(urls);
+ }
+ }
+
+ client->close();
+}
+
+bool InstanceManager::try_server_connection() {
+ socket = new QLocalSocket(this);
+ socket->connectToServer(socket_path);
+
+ auto connected = socket->waitForConnected(200);
+ if (connected)
+ return true;
+
+ socket->close();
+ socket->deleteLater();
+ socket = nullptr;
+ return false;
+}
+
+InstanceManager::~InstanceManager() {
+ if (socket) {
+ socket->disconnectFromServer();
+ socket->close();
+ socket->deleteLater();
+ }
+ if (server) {
+ server->disconnect();
+ server->deleteLater();
+ }
+}