29 QList<TCPBase*> srvsList; |
29 QList<TCPBase*> srvsList; |
30 QPointer<QTcpServer> TCPBase::IPCServer(0); |
30 QPointer<QTcpServer> TCPBase::IPCServer(0); |
31 |
31 |
32 TCPBase::~TCPBase() |
32 TCPBase::~TCPBase() |
33 { |
33 { |
|
34 // make sure this object is not in the server list anymore |
|
35 srvsList.removeOne(this); |
|
36 |
34 if (IPCSocket) |
37 if (IPCSocket) |
35 IPCSocket->deleteLater(); |
38 IPCSocket->deleteLater(); |
36 } |
39 } |
37 |
40 |
38 TCPBase::TCPBase(bool demoMode) : |
41 TCPBase::TCPBase(bool demoMode) : |
|
42 m_hasStarted(false), |
39 m_isDemoMode(demoMode), |
43 m_isDemoMode(demoMode), |
40 IPCSocket(0) |
44 IPCSocket(0) |
41 { |
45 { |
42 if(!IPCServer) |
46 if(!IPCServer) |
43 { |
47 { |
69 IPCSocket = IPCServer->nextPendingConnection(); |
73 IPCSocket = IPCServer->nextPendingConnection(); |
70 if(!IPCSocket) return; |
74 if(!IPCSocket) return; |
71 connect(IPCSocket, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); |
75 connect(IPCSocket, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); |
72 connect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); |
76 connect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); |
73 SendToClientFirst(); |
77 SendToClientFirst(); |
74 |
|
75 if(srvsList.size()==1) srvsList.pop_front(); |
|
76 emit isReadyNow(); |
|
77 } |
78 } |
78 |
79 |
79 void TCPBase::RealStart() |
80 void TCPBase::RealStart() |
80 { |
81 { |
81 connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection())); |
82 connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection())); |
82 IPCSocket = 0; |
83 IPCSocket = 0; |
83 |
84 |
84 QProcess * process; |
85 QProcess * process; |
85 process = new QProcess; |
86 process = new QProcess(); |
86 connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError))); |
87 connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError))); |
87 QStringList arguments=getArguments(); |
88 QStringList arguments=getArguments(); |
88 |
89 |
89 // redirect everything written on stdout/stderr |
90 // redirect everything written on stdout/stderr |
90 if(isDevBuild) |
91 if(isDevBuild) |
91 process->setProcessChannelMode(QProcess::ForwardedChannels); |
92 process->setProcessChannelMode(QProcess::ForwardedChannels); |
|
93 |
92 process->start(bindir->absolutePath() + "/hwengine", arguments); |
94 process->start(bindir->absolutePath() + "/hwengine", arguments); |
|
95 |
|
96 m_hasStarted = true; |
93 } |
97 } |
94 |
98 |
95 void TCPBase::ClientDisconnect() |
99 void TCPBase::ClientDisconnect() |
96 { |
100 { |
97 disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); |
101 disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); |
98 onClientDisconnect(); |
102 onClientDisconnect(); |
99 |
103 |
100 /* if(srvsList.size()==1) srvsList.pop_front(); |
104 emit isReadyNow(); |
101 emit isReadyNow();*/ |
|
102 IPCSocket->deleteLater(); |
105 IPCSocket->deleteLater(); |
103 |
|
104 // make sure this object is not in the server list anymore |
|
105 srvsList.removeOne(this); |
|
106 |
106 |
107 deleteLater(); |
107 deleteLater(); |
108 } |
108 } |
109 |
109 |
110 void TCPBase::ClientRead() |
110 void TCPBase::ClientRead() |
128 ClientDisconnect(); |
128 ClientDisconnect(); |
129 } |
129 } |
130 |
130 |
131 void TCPBase::tcpServerReady() |
131 void TCPBase::tcpServerReady() |
132 { |
132 { |
133 disconnect(srvsList.takeFirst(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); |
133 disconnect(srvsList.first(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); |
134 |
134 |
135 RealStart(); |
135 RealStart(); |
136 } |
136 } |
137 |
137 |
138 void TCPBase::Start() |
138 void TCPBase::Start(bool couldCancelPreviousRequest) |
139 { |
139 { |
140 if(srvsList.isEmpty()) |
140 if(srvsList.isEmpty()) |
141 { |
141 { |
142 srvsList.push_back(this); |
142 srvsList.push_back(this); |
|
143 RealStart(); |
143 } |
144 } |
144 else |
145 else |
145 { |
146 { |
146 connect(srvsList.back(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); |
147 if(couldCancelPreviousRequest && srvsList.last()->couldBeRemoved()) |
147 srvsList.push_back(this); |
148 { |
148 return; |
149 TCPBase * last = srvsList.takeLast(); |
149 } |
150 last->deleteLater(); |
150 |
151 Start(couldCancelPreviousRequest); |
151 RealStart(); |
152 } else |
|
153 { |
|
154 connect(srvsList.last(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); |
|
155 srvsList.push_back(this); |
|
156 } |
|
157 } |
152 } |
158 } |
153 |
159 |
154 void TCPBase::onClientRead() |
160 void TCPBase::onClientRead() |
155 { |
161 { |
156 } |
162 } |