QTfrontend/ipc.h
author unc0rr
Wed, 26 Oct 2005 17:26:39 +0000
changeset 18 d49c23eba8ba
permissions -rw-r--r--
Start to write QT frontend
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     1
/*
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     2
 * Hedgewars, a worms-like game
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     3
 * Copyright (c) 2005 Andrey Korotaev <unC0Rr@gmail.com>
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     4
 *
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     5
 * Distributed under the terms of the BSD-modified licence:
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     6
 *
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     7
 * Permission is hereby granted, free of charge, to any person obtaining a copy
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     8
 * of this software and associated documentation files (the "Software"), to deal
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
     9
 * with the Software without restriction, including without limitation the
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    10
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    11
 * sell copies of the Software, and to permit persons to whom the Software is
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    12
 * furnished to do so, subject to the following conditions:
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    13
 *
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    14
 * 1. Redistributions of source code must retain the above copyright notice,
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    15
 *    this list of conditions and the following disclaimer.
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    16
 * 2. Redistributions in binary form must reproduce the above copyright notice,
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    17
 *    this list of conditions and the following disclaimer in the documentation
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    18
 *    and/or other materials provided with the distribution.
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    19
 * 3. The name of the author may not be used to endorse or promote products
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    20
 *    derived from this software without specific prior written permission.
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    21
 *
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    22
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    23
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    24
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    25
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    26
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    27
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    28
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    29
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    30
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    31
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    32
 */
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    33
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    34
#include <qserversocket.h>
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    35
#include <qsocket.h>
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    36
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    37
#define MAXMSGCHARS 255
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    38
#define SENDIPC(a) SendIPC(a, sizeof(a) - 1)
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    39
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    40
class QSocket;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    41
class QServerSocket;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    42
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    43
class IPCServer : public QServerSocket
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    44
{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    45
	Q_OBJECT
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    46
public:
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    47
	IPCServer( const QHostAddress & address, Q_UINT16 port, QObject *parent ) :
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    48
	QServerSocket(address, port, 1, parent, 0)
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    49
	{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    50
		if ( !ok() )
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    51
		{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    52
			qWarning("Failed to bind");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    53
			exit( 1 );
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    54
		}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    55
		msgsize = 0; 
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    56
	}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    57
	
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    58
private:
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    59
	char msgbuf[MAXMSGCHARS];
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    60
	unsigned char msgbufsize; 
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    61
	unsigned char msgsize;	
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    62
	QSocket* ipcsock;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    63
	
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    64
	void SendConfig()
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    65
	{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    66
		SENDIPC("TL");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    67
		SENDIPC("e$gmflags 0");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    68
		SENDIPC("eaddteam");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    69
		SENDIPC("ename team \"C0CuCKAzZz\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    70
		SENDIPC("ename hh0 \"Йожык\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    71
		SENDIPC("ename hh1 \"Ёжик\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    72
		SENDIPC("ename hh2 \"Ёжык\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    73
		SENDIPC("ename hh3 \"Йожик\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    74
		SENDIPC("ename hh4 \"Ёжик без ножек\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    75
		SENDIPC("ename hh5 \"Just hedgehog\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    76
		SENDIPC("ename hh6 \"Ёжик без головы\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    77
		SENDIPC("ename hh7 \"Валасатый йож\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    78
		SENDIPC("ebind left  \"+left\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    79
		SENDIPC("ebind right \"+right\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    80
		SENDIPC("ebind up    \"+up\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    81
		SENDIPC("ebind down  \"+down\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    82
		SENDIPC("ebind F1  \"slot 1\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    83
		SENDIPC("ebind F2  \"slot 2\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    84
		SENDIPC("ebind F3  \"slot 3\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    85
		SENDIPC("ebind F4  \"slot 4\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    86
		SENDIPC("ebind F5  \"slot 5\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    87
		SENDIPC("ebind F6  \"slot 6\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    88
		SENDIPC("ebind F7  \"slot 7\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    89
		SENDIPC("ebind F8  \"slot 8\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    90
		SENDIPC("ebind F10 \"quit\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    91
		SENDIPC("ebind F11 \"capture\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    92
		SENDIPC("ebind space     \"+attack\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    93
		SENDIPC("ebind return    \"ljump\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    94
		SENDIPC("ebind backspace \"hjump\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    95
		SENDIPC("ebind tab       \"switch\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    96
		SENDIPC("ebind 1 \"timer 1\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    97
		SENDIPC("ebind 2 \"timer 2\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    98
		SENDIPC("ebind 3 \"timer 3\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
    99
		SENDIPC("ebind 4 \"timer 4\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   100
		SENDIPC("ebind 5 \"timer 5\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   101
		SENDIPC("ebind mousel \"put\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   102
		SENDIPC("egrave \"coffin\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   103
		SENDIPC("efort \"Barrelhouse\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   104
		SENDIPC("ecolor 65535");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   105
		SENDIPC("eadd hh0 0");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   106
		SENDIPC("eadd hh1 0");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   107
		SENDIPC("eadd hh2 0");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   108
		SENDIPC("eadd hh3 0");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   109
		SENDIPC("eaddteam");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   110
		SENDIPC("ename team \"-= ЕЖЫ =-\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   111
		SENDIPC("ename hh0 \"Маленький\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   112
		SENDIPC("ename hh1 \"Удаленький\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   113
		SENDIPC("ename hh2 \"Игольчатый\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   114
		SENDIPC("ename hh3 \"Стреляный\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   115
		SENDIPC("ename hh4 \"Ежиха\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   116
		SENDIPC("ename hh5 \"Ежонок\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   117
		SENDIPC("ename hh6 \"Инфернальный\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   118
		SENDIPC("ename hh7 \"X\"");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   119
		SENDIPC("egrave Bone");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   120
		SENDIPC("ecolor 16776960");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   121
		SENDIPC("eadd hh0 1");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   122
		SENDIPC("eadd hh1 1");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   123
		SENDIPC("eadd hh2 1");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   124
		SENDIPC("eadd hh3 1");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   125
		SENDIPC("efort Barrelhouse");		
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   126
	}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   127
	
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   128
	void ParseMessage()
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   129
	{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   130
		switch(msgsize) {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   131
			case 1: switch(msgbuf[0]) {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   132
				case '?': {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   133
					SENDIPC("!");
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   134
					break;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   135
				}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   136
			}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   137
			case 5: switch(msgbuf[0]) {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   138
				case 'C': {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   139
					SendConfig();
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   140
					break;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   141
				}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   142
			}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   143
		}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   144
	}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   145
	
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   146
	void SendIPC(const char* msg, unsigned char len)
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   147
	{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   148
		ipcsock->writeBlock((char *)&len, 1);
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   149
		ipcsock->writeBlock(msg, len);
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   150
	}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   151
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   152
private slots:
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   153
	void newConnection( int socket )
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   154
	{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   155
    	ipcsock = new QSocket( this );
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   156
		connect( ipcsock, SIGNAL(readyRead()), this, SLOT(readClient()) );
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   157
		connect( ipcsock, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   158
		ipcsock->setSocket( socket );
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   159
	}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   160
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   161
	void readClient()
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   162
	{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   163
		Q_ULONG readbytes = 1;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   164
		while (readbytes > 0) {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   165
			if (msgsize == 0) {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   166
				msgbufsize = 0;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   167
				readbytes = ipcsock->readBlock((char *)&msgsize, 1);
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   168
			}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   169
			else {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   170
				msgbufsize += readbytes = ipcsock->readBlock((char *)&msgbuf[msgbufsize], msgsize - msgbufsize);
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   171
				if (msgbufsize = msgsize) {
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   172
					ParseMessage();
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   173
					msgsize = 0;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   174
				}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   175
			}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   176
		}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   177
	}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   178
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   179
	void discardClient()
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   180
	{
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   181
    	delete ipcsock;
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   182
	}
d49c23eba8ba Start to write QT frontend
unc0rr
parents:
diff changeset
   183
};