1717 */
1818
1919#include " mainwindow.h"
20+ #include " cli.h"
2021
2122#include < QApplication>
2223#include < QTranslator>
2324#include < QLocalSocket>
2425#include < QLocalServer>
2526
27+ #include < getopt.h>
28+
29+ struct Options {
30+ bool cli = false ;
31+ std::optional<bool > cooler_boost = std::nullopt ;
32+ };
33+
34+ void PrintHelp (std::string program_name)
35+ {
36+ fprintf (stdout, R"( Description
37+ Syntax: %s [options]
38+
39+ -B, --coolerboost TOOGLE toggle fan cooler boost
40+
41+ Arguments:
42+ TOGGLE: can be 'ON' or 'OFF'
43+ )" , program_name.c_str ());
44+ exit (1 );
45+ }
46+ const char * const short_opts = " B:h" ;
47+ const option long_opts[] = {
48+ {" coolerboost" , required_argument, nullptr , ' B' },
49+ {" help" , no_argument, nullptr , ' h' },
50+ {nullptr , no_argument, nullptr , 0 }
51+ };
52+
53+ void ProcessArgs (int argc, char ** argv, Options& options)
54+ {
55+ int option_index;
56+ while (true )
57+ {
58+ const auto opt = getopt_long (argc, argv, short_opts, long_opts, &option_index);
59+
60+ if (-1 == opt){
61+ break ;
62+ }
63+
64+ switch (opt)
65+ {
66+ case 0 :
67+ options.cli = true ;
68+ // long option without short equivalent
69+ break ;
70+
71+ case ' B' :
72+ options.cli = true ;
73+
74+ if (std::strcmp (optarg," ON" ) == 0 ){
75+ options.cooler_boost = std::optional<bool >{true };
76+ }
77+ else if (strcmp (optarg," OFF" ) == 0 )
78+ {
79+ options.cooler_boost = std::optional<bool >{false };
80+ }
81+ else {
82+ fprintf (stderr, " Wrong TOGGLE value for coolerboost option.\n " );
83+ PrintHelp (argv[0 ]);
84+ }
85+ break ;
86+
87+ case ' h' : // -h or --help
88+ case ' ?' : // Unrecognized option
89+ default :
90+ PrintHelp (argv[0 ]);
91+ break ;
92+ }
93+ }
94+ }
2695
2796int main (int argc, char *argv[]) {
97+
98+ Options options;
99+ ProcessArgs (argc, argv, options);
100+
28101 const QString serverName = " MControlCenter" ;
29- auto * socket = new QLocalSocket ();
102+ QLocalSocket* socket = new QLocalSocket ();
30103 socket->connectToServer (serverName);
104+
105+ if (options.cli ){
106+ fprintf (stderr, " Executing CLI commands...\n " );
107+ CLI cli;
108+ if (options.cooler_boost .has_value ()){
109+ cli.setCoolerBoost (options.cooler_boost .value ());
110+ }
111+
112+ if (socket->isOpen ()) {
113+ socket->write (" update" );
114+ socket->flush ();
115+ socket->close ();
116+ }
117+ socket->deleteLater ();
118+ return 0 ;
119+ }
120+
31121 if (socket->isOpen ()) {
32122 fprintf (stderr, " Another instance of the application is already running\n " );
123+ socket->write (" show" );
124+ socket->flush ();
33125 socket->close ();
34126 socket->deleteLater ();
35127 return 0 ;
@@ -51,8 +143,17 @@ int main(int argc, char *argv[]) {
51143 MainWindow w;
52144
53145 QLocalServer server;
54- QObject::connect (&server, &QLocalServer::newConnection, [&w]() {
55- w.show ();
146+ QObject::connect (&server, &QLocalServer::newConnection, [&w, &server]() {
147+ QLocalSocket* socket = server.nextPendingConnection ();
148+ if (socket->waitForConnected () && socket->waitForReadyRead ()){
149+ QByteArray data = socket->readAll ();
150+ if (std::strcmp (data.data (), " show" ) == 0 ){
151+ w.show ();
152+ }
153+ else if (std::strcmp (data.data (), " update" ) == 0 ){
154+ w.externalUpdate ();
155+ }
156+ }
56157 });
57158 bool serverListening = server.listen (serverName);
58159 if (!serverListening && (server.serverError () == QAbstractSocket::AddressInUseError)) {
0 commit comments