88**********************************************************************************
99
1010*/
11- #include < QApplication>
12- #include < QIcon>
13- #include < QStyleFactory>
14- #include < QtPlugin>
15- #include < QtGui/QGuiApplication>
16- #include < QtQml/QQmlApplicationEngine>
17- #include < QtQuickControls2/QQuickStyle>
18- #include < QSplashScreen>
19- #include < QTimer>
20- #include < QFileInfo>
21- #include < QStandardPaths>
22- #include < QDir>
23- #include < QFontDatabase>
24- #include < QQmlContext>
25- #include < QQuickWindow>
26- #include < QtPlatformHeaders/QWindowsWindowFunctions>
27-
28- #include < btc/ecc.h>
29- #include < iostream>
30- #include < thread>
31- #include < spdlog/spdlog.h>
32- #include < spdlog/sinks/basic_file_sink.h>
33- #include < spdlog/sinks/stdout_sinks.h>
34-
35- #include " BIP150_151.h"
11+ #include " AppNap.h"
3612#include " AuthorizedPeers.h"
13+ #include " BIP150_151.h"
14+ #include " Bip15xDataConnection.h"
15+ #include " BIP15xHelpers.h"
3716#include " DispatchQueue.h"
3817#include " HeadlessApp.h"
39- #include " Settings/HeadlessSettings.h"
4018#include " LogManager.h"
19+ #include " QMLApp.h"
20+ #include " QmlBridge.h"
21+ #include " Settings/HeadlessSettings.h"
22+ #include " Settings/SignerSettings.h"
4123#include " SignalsHandler.h"
4224#include " SignerAdapter.h"
43- #include " Settings/SignerSettings.h"
4425#include " SystemFileUtils.h"
45- #include " BIP15xHelpers.h"
46- #include " Bip15xDataConnection.h"
4726#include " TransportBIP15x.h"
4827#include " TransportBIP15xServer.h"
4928
50- #include " QMLApp.h"
51- #include " QmlBridge.h"
29+ #include < QApplication>
30+ #include < QDir>
31+ #include < QFileInfo>
32+ #include < QFontDatabase>
33+ #include < QIcon>
34+ #include < QQmlContext>
35+ #include < QQuickWindow>
36+ #include < QSplashScreen>
37+ #include < QStandardPaths>
38+ #include < QStyleFactory>
39+ #include < QtGui/QGuiApplication>
40+ #include < QTimer>
41+ #include < QtPlatformHeaders/QWindowsWindowFunctions>
42+ #include < QtPlugin>
43+ #include < QtQml/QQmlApplicationEngine>
44+ #include < QtQuickControls2/QQuickStyle>
5245
53- #include " AppNap.h"
46+ #include < iostream>
47+ #include < thread>
48+
49+ #include < btc/ecc.h>
50+
51+ #include < spdlog/sinks/basic_file_sink.h>
52+ #include < spdlog/sinks/stdout_sinks.h>
53+ #include < spdlog/spdlog.h>
5454
5555Q_DECLARE_METATYPE (std::string)
5656Q_DECLARE_METATYPE(std::vector<BinaryData>)
@@ -290,6 +290,10 @@ static int QMLApp(int argc, char **argv
290290 const QFont fixedFont = QFontDatabase::systemFont (QFontDatabase::FixedFont);
291291 engine.rootContext ()->setContextProperty (QStringLiteral (" fixedFont" ), fixedFont);
292292
293+ QTimer terminalConnectionTimer;
294+ bool terminalConnected = false ;
295+ bool timerStarted = false ;
296+
293297 try {
294298 // setup signer's own GUI connection
295299 auto guiSrvParams = queue.getGuiServerParams ();
@@ -306,7 +310,7 @@ static int QMLApp(int argc, char **argv
306310 {
307311 std::string clientID = " 127.0.0.1:" + std::to_string (guiPort);
308312
309- auto adapterBip15x =
313+ auto adapterBip15x =
310314 std::dynamic_pointer_cast<Bip15xDataConnection>(adapterConn);
311315 if (adapterBip15x == nullptr ) {
312316 throw std::runtime_error (" unexpected adapter connection type" );
@@ -322,14 +326,39 @@ static int QMLApp(int argc, char **argv
322326 adapter.setCloseHeadless (settings->closeHeadless ());
323327
324328 QMLAppObj qmlAppObj (&adapter, logger, settings, splashScreen, engine.rootContext ());
325- QTimer::singleShot (0 , &qmlAppObj, &QMLAppObj::Start);
326329
327330 switch (settings->runMode ()) {
328331 case bs::signer::ui::RunMode::fullgui:
329332 engine.load (QUrl (QStringLiteral (" qrc:/qml/main.qml" )));
330333 break ;
331334 case bs::signer::ui::RunMode::litegui:
332335 engine.load (QUrl (QStringLiteral (" qrc:/qml/mainLite.qml" )));
336+
337+ terminalConnectionTimer.setSingleShot (true );
338+ // BST-2786
339+ terminalConnectionTimer.setInterval (std::chrono::milliseconds{ 5000 });
340+
341+ QObject::connect (&adapter, &SignerAdapter::ready, [&timerStarted, &terminalConnectionTimer]()
342+ {
343+ if (!timerStarted) {
344+ terminalConnectionTimer.start ();
345+ timerStarted = true ;
346+ }
347+ });
348+
349+
350+ QObject::connect (&adapter, &SignerAdapter::peerConnected, [&terminalConnected] {
351+ terminalConnected = true ;
352+ });
353+ QObject::connect (&adapter, &SignerAdapter::peerDisconnected, [&terminalConnected] {
354+ terminalConnected = false ;
355+ });
356+ QObject::connect (&terminalConnectionTimer, &QTimer::timeout, [&terminalConnected] {
357+ if (!terminalConnected) {
358+ QCoreApplication::quit ();
359+ }
360+ });
361+
333362 break ;
334363 default :
335364 return EXIT_FAILURE;
@@ -343,6 +372,8 @@ static int QMLApp(int argc, char **argv
343372
344373 bs::disableAppNap ();
345374
375+ QTimer::singleShot (0 , &qmlAppObj, &QMLAppObj::Start);
376+
346377 QObject::connect (&qmlAppObj, &QMLAppObj::qmlAppStarted, [&queue](){
347378 queue.start ();
348379 });
0 commit comments