1 /***************************************************************************
2 rkrbackendprotocol - description
3 -------------------
4 begin : Thu Nov 04 2010
5 copyright : (C) 2010, 2011 by Thomas Friedrichsmeier
6 email : thomas.friedrichsmeier@kdemail.net
7 ***************************************************************************/
8
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18 #include "rkrbackendprotocol_frontend.h"
19
20 #include "rkrinterface.h"
21
22 #include <QThread>
23
24 #include "rkfrontendtransmitter.h"
25 #include <QCoreApplication>
26
27 #include "../debug.h"
28
29 RKRBackendProtocolFrontend* RKRBackendProtocolFrontend::_instance = 0;
RKRBackendProtocolFrontend(RInterface * parent)30 RKRBackendProtocolFrontend::RKRBackendProtocolFrontend (RInterface* parent) : QObject (parent) {
31 RK_TRACE (RBACKEND);
32
33 RK_ASSERT (!_instance);
34 frontend = parent;
35 _instance = this;
36 }
37
~RKRBackendProtocolFrontend()38 RKRBackendProtocolFrontend::~RKRBackendProtocolFrontend () {
39 RK_TRACE (RBACKEND);
40
41 terminateBackend ();
42 RKFrontendTransmitter::instance ()->wait (1000); // Wait for thread to catch the backend's exit request, and exit()
43 RKFrontendTransmitter::instance ()->quit (); // Tell it to quit, otherwise
44 RKFrontendTransmitter::instance ()->wait (1000); // Wait for thread to quit and clean up.
45 delete RKFrontendTransmitter::instance ();
46 }
47
setupBackend()48 void RKRBackendProtocolFrontend::setupBackend () {
49 RK_TRACE (RBACKEND);
50
51 new RKFrontendTransmitter ();
52 }
53
setRequestCompleted(RBackendRequest * request)54 void RKRBackendProtocolFrontend::setRequestCompleted (RBackendRequest *request) {
55 RK_TRACE (RBACKEND);
56
57 bool sync = request->synchronous;
58 request->completed ();
59 if (!sync) return;
60
61 RKRBackendEvent* ev = new RKRBackendEvent (request);
62 qApp->postEvent (RKFrontendTransmitter::instance (), ev);
63
64 QThread::yieldCurrentThread ();
65 }
66
flushOutput(bool force)67 ROutputList RKRBackendProtocolFrontend::flushOutput (bool force) {
68 return static_cast<RKFrontendTransmitter*> (RKFrontendTransmitter::instance ())->flushOutput (force);
69 }
70
interruptCommand(int command_id)71 void RKRBackendProtocolFrontend::interruptCommand (int command_id) {
72 RK_TRACE (RBACKEND);
73
74 RBackendRequest *req = new RBackendRequest (false, RBackendRequest::Interrupt);
75 req->params.insert ("commandid", QVariant (command_id));
76 qApp->postEvent (RKFrontendTransmitter::instance (), new RKRBackendEvent (req));
77 }
78
sendPriorityCommand(RCommandProxy * proxy)79 void RKRBackendProtocolFrontend::sendPriorityCommand (RCommandProxy* proxy) {
80 RK_TRACE (RBACKEND);
81
82 RBackendRequest *req = new RBackendRequest (false, RBackendRequest::PriorityCommand);
83 req->command = proxy;
84 qApp->postEvent (RKFrontendTransmitter::instance (), new RKRBackendEvent (req));
85
86 }
87
terminateBackend()88 void RKRBackendProtocolFrontend::terminateBackend () {
89 RK_TRACE (RBACKEND);
90
91 // Backend process will terminate automatically, when the transmitter dies
92 }
93
customEvent(QEvent * e)94 void RKRBackendProtocolFrontend::customEvent (QEvent *e) {
95 if (((int) e->type ()) == ((int) RKRBackendEvent::RKWardEvent)) {
96 RKRBackendEvent *ev = static_cast<RKRBackendEvent*> (e);
97 frontend->handleRequest (ev->data ());
98 } else {
99 RK_ASSERT (false);
100 return;
101 }
102 }
103