QTfrontend/net/tcpBase.cpp
changeset 8069 bb7671829935
parent 7794 ab7b94c03bc9
child 8070 66bc20d089fc
equal deleted inserted replaced
8068:b35427506169 8069:bb7671829935
    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 }
   189             IPCSocket->write(buf);
   195             IPCSocket->write(buf);
   190             if(m_isDemoMode) demo.append(buf);
   196             if(m_isDemoMode) demo.append(buf);
   191         }
   197         }
   192     }
   198     }
   193 }
   199 }
       
   200 
       
   201 bool TCPBase::couldBeRemoved()
       
   202 {
       
   203     return false;
       
   204 }