QTfrontend/tcpBase.cpp
author unc0rr
Mon, 29 Sep 2008 22:14:23 +0000
changeset 1301 c6fe8a4bfd34
parent 1066 1f1b3686a2b0
child 2948 3f21a9dc93d0
permissions -rw-r--r--
Fix a bug screwing team selection up in network game (REMOVETEAM message doesn't have teamID, and after removing the team QMap still contains old info, when add and remove team with the same name, total hedgehogs number will be decreased by first team hh number)
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"),
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
    44
			    tr("Unable to start the server: %1.")
3b777d7008d9 static TCP Server
displacer
parents: 184
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();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    75
  process->start(bindir->absolutePath() + "/hwengine", arguments);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    76
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    77
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    78
void TCPBase::ClientDisconnect()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    79
{
443
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    80
  disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    81
  onClientDisconnect();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    82
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    83
  if(srvsList.size()==1) srvsList.pop_front();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    84
  emit isReadyNow();
443
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    85
  IPCSocket->deleteLater();
390
dca6bd77d71d memory leak fixed (tanks unC0Rr)
displacer
parents: 389
diff changeset
    86
  deleteLater();
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    87
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    88
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    89
void TCPBase::ClientRead()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    90
{
443
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    91
  QByteArray readed=IPCSocket->readAll();
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    92
  if(readed.isEmpty()) return;
eec37eb7f5db fort, grave and difficulty information for net team
displacer
parents: 419
diff changeset
    93
  readbuffer.append(readed);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    94
  onClientRead();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    95
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    96
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    97
void TCPBase::StartProcessError(QProcess::ProcessError error)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    98
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    99
  QMessageBox::critical(0, tr("Error"),
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   100
			tr("Unable to run engine: %1 (")
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   101
			.arg(error) + bindir->absolutePath() + "/hwengine)");
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   102
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   103
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   104
void TCPBase::tcpServerReady()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   105
{
390
dca6bd77d71d memory leak fixed (tanks unC0Rr)
displacer
parents: 389
diff changeset
   106
  disconnect(srvsList.takeFirst(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   107
185
3b777d7008d9 static TCP Server
displacer
parents: 184
diff changeset
   108
  RealStart();
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   109
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   110
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   111
void TCPBase::Start()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   112
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   113
  if(srvsList.isEmpty()) {
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   114
    srvsList.push_back(this);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   115
  } else {
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   116
    connect(srvsList.back(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady()));
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   117
    srvsList.push_back(this);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   118
    return;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   119
  }
389
9628e69b609f Fix IPCSocket issues
unc0rr
parents: 381
diff changeset
   120
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   121
  RealStart();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   122
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   123
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   124
void TCPBase::onClientRead()
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   125
{
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::onClientDisconnect()
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::SendToClientFirst()
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::SendIPC(const QByteArray & buf)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   137
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   138
	if (buf.size() > MAXMSGCHARS) return;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   139
	quint8 len = buf.size();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   140
	RawSendIPC(QByteArray::fromRawData((char *)&len, 1) + buf);
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   141
}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   142
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   143
void TCPBase::RawSendIPC(const QByteArray & buf)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   144
{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   145
	if (!IPCSocket)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   146
	{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   147
		toSendBuf += buf;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   148
	} else
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   149
	{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   150
		if (toSendBuf.size() > 0)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   151
		{
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   152
			IPCSocket->write(toSendBuf);
533
eebb7684ac22 Save saves in Save directory
unc0rr
parents: 486
diff changeset
   153
			if(m_isDemoMode) demo.append(toSendBuf);
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   154
			toSendBuf.clear();
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   155
		}
379
e4cd3cd209c6 additional error checking
displacer
parents: 291
diff changeset
   156
		if(!buf.isEmpty()) {
e4cd3cd209c6 additional error checking
displacer
parents: 291
diff changeset
   157
		  IPCSocket->write(buf);
533
eebb7684ac22 Save saves in Save directory
unc0rr
parents: 486
diff changeset
   158
		  if(m_isDemoMode) demo.append(buf);
379
e4cd3cd209c6 additional error checking
displacer
parents: 291
diff changeset
   159
		}
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   160
	}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   161
}