QTfrontend/tcpBase.cpp
author nemo
Sat, 04 Dec 2010 11:30:54 -0500
changeset 4455 a0c8779713f2
parent 3697 d5b30d6373fc
child 4976 088d40d8aba2
permissions -rw-r--r--
In AI survival mode, have the AI score when it kills humans, instead of its own team, clear poison on an AI kill, and reset AI health using InitialHealth instead of 100.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     1
/*
1066
1f1b3686a2b0 Update copyright headers a bit
unc0rr
parents: 533
diff changeset
     2
 * Hedgewars, a free turn based strategy game
486
7ea71cd3acd5 - Change proto version to 4
unc0rr
parents: 443
diff changeset
     3
 * Copyright (c) 2006-2007 Igor Ulyanov <iulyanov@gmail.com>
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     4
 *
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     8
 *
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    12
 * GNU General Public License for more details.
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    13
 *
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    14
 * You should have received a copy of the GNU General Public License
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    15
 * along with this program; if not, write to the Free Software
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    17
 */
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    18
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    19
#include "tcpBase.h"
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    20
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    21
#include <QMessageBox>
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    22
#include <QList>
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    23
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    24
#include <QImage>
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    25
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    26
#include "hwconsts.h"
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    27
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    28
QList<TCPBase*> srvsList;
389
9628e69b609f Fix IPCSocket issues
unc0rr
parents: 381
diff changeset
    29
QPointer<QTcpServer> TCPBase::IPCServer(0);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    30
419
fdeed9718e6b virtual destructors for tcpBase derived classes, readarray clear removed as unneeded
displacer
parents: 390
diff changeset
    31
TCPBase::~TCPBase()
fdeed9718e6b virtual destructors for tcpBase derived classes, readarray clear removed as unneeded
displacer
parents: 390
diff changeset
    32
{
fdeed9718e6b virtual destructors for tcpBase derived classes, readarray clear removed as unneeded
displacer
parents: 390
diff changeset
    33
}
fdeed9718e6b virtual destructors for tcpBase derived classes, readarray clear removed as unneeded
displacer
parents: 390
diff changeset
    34
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    35
TCPBase::TCPBase(bool demoMode) :
185
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    36
  m_isDemoMode(demoMode),
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    37
  IPCSocket(0)
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    38
{
186
7157b34a24d6 unneded variable removed
displacer
parents: 185
diff changeset
    39
  if(!IPCServer) {
390
dca6bd77d71d memory leak fixed (tanks unC0Rr)
displacer
parents: 389
diff changeset
    40
    IPCServer = new QTcpServer(0);
185
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    41
    IPCServer->setMaxPendingConnections(1);
291
afa378f1e961 automatic assign of game server TCP port
displacer
parents: 197
diff changeset
    42
    if (!IPCServer->listen(QHostAddress::LocalHost)) {
185
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    43
      QMessageBox::critical(0, tr("Error"),
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
    44
                tr("Unable to start the server: %1.")
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
    45
                .arg(IPCServer->errorString()));
291
afa378f1e961 automatic assign of game server TCP port
displacer
parents: 197
diff changeset
    46
      exit(0); // FIXME - should be graceful exit here
185
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    47
    }
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    48
  }
291
afa378f1e961 automatic assign of game server TCP port
displacer
parents: 197
diff changeset
    49
  ipc_port=IPCServer->serverPort();
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    50
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    51
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    52
void TCPBase::NewConnection()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    53
{
185
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    54
  if(IPCSocket) {
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    55
    // connection should be already finished
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    56
    return;
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    57
  }
389
9628e69b609f Fix IPCSocket issues
unc0rr
parents: 381
diff changeset
    58
  disconnect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection()));
380
86f3d818da1c small memory leak fixed
displacer
parents: 379
diff changeset
    59
  IPCSocket = IPCServer->nextPendingConnection();
86f3d818da1c small memory leak fixed
displacer
parents: 379
diff changeset
    60
  if(!IPCSocket) return;
86f3d818da1c small memory leak fixed
displacer
parents: 379
diff changeset
    61
  connect(IPCSocket, SIGNAL(disconnected()), this, SLOT(ClientDisconnect()));
86f3d818da1c small memory leak fixed
displacer
parents: 379
diff changeset
    62
  connect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
185
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    63
  SendToClientFirst();
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    64
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    65
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    66
void TCPBase::RealStart()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    67
{
197
8a7123b84d1b multiple classes accept signal receive bugfix
displacer
parents: 186
diff changeset
    68
  connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection()));
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    69
  IPCSocket = 0;
389
9628e69b609f Fix IPCSocket issues
unc0rr
parents: 381
diff changeset
    70
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    71
  QProcess * process;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    72
  process = new QProcess;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    73
  connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError)));
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    74
  QStringList arguments=setArguments();
3697
d5b30d6373fc remove trailing spaces from end of line
koda
parents: 3157
diff changeset
    75
3157
77ed36827e30 Frontend:
smxx
parents: 2948
diff changeset
    76
  // redirect everything written on stdout/stderr
77ed36827e30 Frontend:
smxx
parents: 2948
diff changeset
    77
  if(isDevBuild)
77ed36827e30 Frontend:
smxx
parents: 2948
diff changeset
    78
    process->setProcessChannelMode(QProcess::ForwardedChannels);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    79
  process->start(bindir->absolutePath() + "/hwengine", arguments);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    80
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    81
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    82
void TCPBase::ClientDisconnect()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    83
{
443
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    84
  disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    85
  onClientDisconnect();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    86
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    87
  if(srvsList.size()==1) srvsList.pop_front();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    88
  emit isReadyNow();
443
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    89
  IPCSocket->deleteLater();
390
dca6bd77d71d memory leak fixed (tanks unC0Rr)
displacer
parents: 389
diff changeset
    90
  deleteLater();
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    91
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    92
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    93
void TCPBase::ClientRead()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    94
{
443
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    95
  QByteArray readed=IPCSocket->readAll();
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    96
  if(readed.isEmpty()) return;
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    97
  readbuffer.append(readed);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    98
  onClientRead();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    99
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   100
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   101
void TCPBase::StartProcessError(QProcess::ProcessError error)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   102
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   103
  QMessageBox::critical(0, tr("Error"),
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   104
            tr("Unable to run engine: %1 (")
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   105
            .arg(error) + bindir->absolutePath() + "/hwengine)");
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   106
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   107
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   108
void TCPBase::tcpServerReady()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   109
{
390
dca6bd77d71d memory leak fixed (tanks unC0Rr)
displacer
parents: 389
diff changeset
   110
  disconnect(srvsList.takeFirst(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   111
185
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
   112
  RealStart();
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   113
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   114
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   115
void TCPBase::Start()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   116
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   117
  if(srvsList.isEmpty()) {
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   118
    srvsList.push_back(this);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   119
  } else {
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   120
    connect(srvsList.back(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   121
    srvsList.push_back(this);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   122
    return;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   123
  }
389
9628e69b609f Fix IPCSocket issues
unc0rr
parents: 381
diff changeset
   124
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   125
  RealStart();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   126
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   127
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   128
void TCPBase::onClientRead()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   129
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   130
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   131
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   132
void TCPBase::onClientDisconnect()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   133
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   134
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   135
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   136
void TCPBase::SendToClientFirst()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   137
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   138
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   139
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   140
void TCPBase::SendIPC(const QByteArray & buf)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   141
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   142
    if (buf.size() > MAXMSGCHARS) return;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   143
    quint8 len = buf.size();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   144
    RawSendIPC(QByteArray::fromRawData((char *)&len, 1) + buf);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   145
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   146
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   147
void TCPBase::RawSendIPC(const QByteArray & buf)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   148
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   149
    if (!IPCSocket)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   150
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   151
        toSendBuf += buf;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   152
    } else
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   153
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   154
        if (toSendBuf.size() > 0)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   155
        {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   156
            IPCSocket->write(toSendBuf);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   157
            if(m_isDemoMode) demo.append(toSendBuf);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   158
            toSendBuf.clear();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   159
        }
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   160
        if(!buf.isEmpty()) {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   161
          IPCSocket->write(buf);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   162
          if(m_isDemoMode) demo.append(buf);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   163
        }
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 1066
diff changeset
   164
    }
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   165
}