QTfrontend/hwmap.cpp
changeset 177 c67c15e6fae3
parent 172 5294ada3910b
child 180 ea83b9e9057f
equal deleted inserted replaced
176:533d03041dcd 177:c67c15e6fae3
    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 }