30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
32 */ |
32 */ |
33 |
33 |
34 #include "hwmap.h" |
34 #include "hwmap.h" |
35 #include "hwconsts.h" |
|
36 |
35 |
37 #include <QMessageBox> |
36 HWMap::HWMap() |
38 #include <QMutex> |
|
39 #include <QList> |
|
40 |
|
41 QList<HWMap*> srvsList; |
|
42 |
|
43 HWMap::HWMap() : |
|
44 m_isStarted(false) |
|
45 { |
37 { |
46 IPCServer = new QTcpServer(this); |
|
47 connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection())); |
|
48 IPCServer->setMaxPendingConnections(1); |
|
49 } |
38 } |
50 |
39 |
51 HWMap::~HWMap() |
40 HWMap::~HWMap() |
52 { |
41 { |
53 } |
42 } |
56 { |
45 { |
57 m_seed=seed; |
46 m_seed=seed; |
58 Start(); |
47 Start(); |
59 } |
48 } |
60 |
49 |
61 void HWMap::ClientDisconnect() |
50 QStringList HWMap::setArguments() |
|
51 { |
|
52 QStringList arguments; |
|
53 arguments << "46631"; |
|
54 arguments << "landpreview"; |
|
55 return arguments; |
|
56 } |
|
57 |
|
58 void HWMap::onClientDisconnect() |
62 { |
59 { |
63 QImage im((uchar*)(const char*)readbuffer, 256, 128, QImage::Format_Mono); |
60 QImage im((uchar*)(const char*)readbuffer, 256, 128, QImage::Format_Mono); |
64 im.setNumColors(2); |
61 im.setNumColors(2); |
65 |
|
66 IPCSocket->close(); |
|
67 IPCServer->close(); |
|
68 |
|
69 emit ImageReceived(im); |
62 emit ImageReceived(im); |
70 readbuffer.clear(); |
|
71 if(srvsList.size()==1) srvsList.pop_front(); |
|
72 emit isReadyNow(); |
|
73 } |
|
74 |
|
75 void HWMap::ClientRead() |
|
76 { |
|
77 readbuffer.append(IPCSocket->readAll()); |
|
78 } |
63 } |
79 |
64 |
80 void HWMap::SendToClientFirst() |
65 void HWMap::SendToClientFirst() |
81 { |
66 { |
82 std::string toSend=std::string("eseed ")+m_seed; |
67 std::string toSend=std::string("eseed ")+m_seed; |
84 IPCSocket->write(&ln, 1); |
69 IPCSocket->write(&ln, 1); |
85 IPCSocket->write(toSend.c_str(), ln); |
70 IPCSocket->write(toSend.c_str(), ln); |
86 |
71 |
87 IPCSocket->write("\x01!", 2); |
72 IPCSocket->write("\x01!", 2); |
88 } |
73 } |
89 |
|
90 void HWMap::NewConnection() |
|
91 { |
|
92 QTcpSocket * client = IPCServer->nextPendingConnection(); |
|
93 if(!IPCSocket) { |
|
94 IPCServer->close(); |
|
95 IPCSocket = client; |
|
96 connect(client, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); |
|
97 connect(client, SIGNAL(readyRead()), this, SLOT(ClientRead())); |
|
98 SendToClientFirst(); |
|
99 } else { |
|
100 qWarning("2nd IPC client?!"); |
|
101 client->disconnectFromHost(); |
|
102 } |
|
103 } |
|
104 |
|
105 void HWMap::StartProcessError(QProcess::ProcessError error) |
|
106 { |
|
107 QMessageBox::critical(0, tr("Error"), |
|
108 tr("Unable to run engine: %1 (") |
|
109 .arg(error) + bindir->absolutePath() + "/hwengine)"); |
|
110 } |
|
111 |
|
112 void HWMap::tcpServerReady() |
|
113 { |
|
114 disconnect(srvsList.front(), SIGNAL(isReadyNow()), *(++srvsList.begin()), SLOT(tcpServerReady())); |
|
115 srvsList.pop_front(); |
|
116 |
|
117 RealStart(); |
|
118 } |
|
119 |
|
120 void HWMap::Start() |
|
121 { |
|
122 if(srvsList.isEmpty()) { |
|
123 srvsList.push_back(this); |
|
124 } else { |
|
125 connect(srvsList.back(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); |
|
126 srvsList.push_back(this); |
|
127 return; |
|
128 } |
|
129 |
|
130 RealStart(); |
|
131 } |
|
132 |
|
133 void HWMap::RealStart() |
|
134 { |
|
135 IPCSocket = 0; |
|
136 if (!IPCServer->listen(QHostAddress::LocalHost, IPC_PORT)) { |
|
137 QMessageBox::critical(0, tr("Error"), |
|
138 tr("Unable to start the server: %1.") |
|
139 .arg(IPCServer->errorString())); |
|
140 } |
|
141 |
|
142 QProcess * process; |
|
143 QStringList arguments; |
|
144 process = new QProcess; |
|
145 connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError))); |
|
146 arguments << "46631"; |
|
147 arguments << "landpreview"; |
|
148 process->start(bindir->absolutePath() + "/hwengine", arguments); |
|
149 } |
|