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