Files @ r23482:de566f8c088d
Branch filter:

Location: cpp/openttd-patchpack/source/src/network/core/tcp_content.h - annotation

Patric Stout
Remove: DOS support

In 10 years there was no active development on DOS. Although it
turned out to still work, the FPS was very bad. There is little
interest in the current community to look into this.

Further more, we like to switch to c++11 functions for threads,
which are not implemented by DJGPP, the only current compiler
for DOS.

Additionally, DOS is the only platform which does not support
networking. It is the reason we have tons of #ifdefs to support
disabling networking.

By removing DOS support, we can both use c++11 functions for threads,
and remove all the code related to disabling network. Sadly, this
means we have to see DOS go.

Of course, if you feel up for the task, simply revert this commit,
and implement stub c++11 functions for threads and stub functions
for networking. We are more than happy to accept such Pull Request.
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r16851:b5784600e35e
r16851:b5784600e35e
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r13182:d311a9b54477
r13182:d311a9b54477
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r12674:8254ab83ecad
r14055:e4168a875df8
r18747:12d6e8d373e7
r18754:42d72cb83fe7
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r18737:1ee35da7fa2f
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17622:d9f6f6845b5d
r10793:5ba2151e71e9
r18737:1ee35da7fa2f
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17622:d9f6f6845b5d
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r18737:1ee35da7fa2f
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10826:7756b23b1233
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10843:cc632b9b7c4f
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r15436:42a92f38eb9f
r15436:42a92f38eb9f
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r19693:bb320d3d4a98
r19557:e98fb2ed9b46
r19693:bb320d3d4a98
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r11549:ae69aa3bf4f9
r10843:cc632b9b7c4f
r10793:5ba2151e71e9
r17619:8e40da35981c
r17619:8e40da35981c
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17619:8e40da35981c
r17619:8e40da35981c
r10793:5ba2151e71e9
r17619:8e40da35981c
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17619:8e40da35981c
r17619:8e40da35981c
r10793:5ba2151e71e9
r17619:8e40da35981c
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17619:8e40da35981c
r17619:8e40da35981c
r10793:5ba2151e71e9
r17619:8e40da35981c
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r19944:25a78576fb5e
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17619:8e40da35981c
r17619:8e40da35981c
r10793:5ba2151e71e9
r17619:8e40da35981c
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17619:8e40da35981c
r17619:8e40da35981c
r10793:5ba2151e71e9
r17619:8e40da35981c
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17619:8e40da35981c
r17619:8e40da35981c
r10793:5ba2151e71e9
r17619:8e40da35981c
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r17619:8e40da35981c
r17619:8e40da35981c
r10793:5ba2151e71e9
r17619:8e40da35981c
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r11544:5b7269ee2600
r10793:5ba2151e71e9
r11544:5b7269ee2600
r11544:5b7269ee2600
r11544:5b7269ee2600
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r20565:90fc925b267e
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r19693:bb320d3d4a98
r19537:6e0664ef363a
r19693:bb320d3d4a98
r19537:6e0664ef363a
r10793:5ba2151e71e9
r10793:5ba2151e71e9
r16851:b5784600e35e
/* $Id$ */

/*
 * This file is part of OpenTTD.
 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @file tcp_content.h Basic functions to receive and send TCP packets to/from the content server.
 */

#ifndef NETWORK_CORE_TCP_CONTENT_H
#define NETWORK_CORE_TCP_CONTENT_H

#include "os_abstraction.h"
#include "tcp.h"
#include "packet.h"
#include "../../debug.h"

#ifdef ENABLE_NETWORK

/** The values in the enum are important; they are used as database 'keys' */
enum ContentType {
	CONTENT_TYPE_BEGIN         = 1, ///< Helper to mark the begin of the types
	CONTENT_TYPE_BASE_GRAPHICS = 1, ///< The content consists of base graphics
	CONTENT_TYPE_NEWGRF        = 2, ///< The content consists of a NewGRF
	CONTENT_TYPE_AI            = 3, ///< The content consists of an AI
	CONTENT_TYPE_AI_LIBRARY    = 4, ///< The content consists of an AI library
	CONTENT_TYPE_SCENARIO      = 5, ///< The content consists of a scenario
	CONTENT_TYPE_HEIGHTMAP     = 6, ///< The content consists of a heightmap
	CONTENT_TYPE_BASE_SOUNDS   = 7, ///< The content consists of base sounds
	CONTENT_TYPE_BASE_MUSIC    = 8, ///< The content consists of base music
	CONTENT_TYPE_GAME          = 9, ///< The content consists of a game script
	CONTENT_TYPE_GAME_LIBRARY  = 10, ///< The content consists of a GS library
	CONTENT_TYPE_END,               ///< Helper to mark the end of the types
};

/** Enum with all types of TCP content packets. The order MUST not be changed **/
enum PacketContentType {
	PACKET_CONTENT_CLIENT_INFO_LIST,      ///< Queries the content server for a list of info of a given content type
	PACKET_CONTENT_CLIENT_INFO_ID,        ///< Queries the content server for information about a list of internal IDs
	PACKET_CONTENT_CLIENT_INFO_EXTID,     ///< Queries the content server for information about a list of external IDs
	PACKET_CONTENT_CLIENT_INFO_EXTID_MD5, ///< Queries the content server for information about a list of external IDs and MD5
	PACKET_CONTENT_SERVER_INFO,           ///< Reply of content server with information about content
	PACKET_CONTENT_CLIENT_CONTENT,        ///< Request a content file given an internal ID
	PACKET_CONTENT_SERVER_CONTENT,        ///< Reply with the content of the given ID
	PACKET_CONTENT_END,                   ///< Must ALWAYS be on the end of this list!! (period)
};

/** Unique identifier for the content. */
enum ContentID {
	INVALID_CONTENT_ID = UINT32_MAX, ///< Sentinel for invalid content.
};

/** Container for all important information about a piece of content. */
struct ContentInfo {
	/** The state the content can be in. */
	enum State {
		UNSELECTED,     ///< The content has not been selected
		SELECTED,       ///< The content has been manually selected
		AUTOSELECTED,   ///< The content has been selected as dependency
		ALREADY_HERE,   ///< The content is already at the client side
		DOES_NOT_EXIST, ///< The content does not exist in the content system
		INVALID,        ///< The content's invalid
	};

	ContentType type;        ///< Type of content
	ContentID id;            ///< Unique (server side) ID for the content
	uint32 filesize;         ///< Size of the file
	char filename[48];       ///< Filename (for the .tar.gz; only valid on download)
	char name[32];           ///< Name of the content
	char version[16];        ///< Version of the content
	char url[96];            ///< URL related to the content
	char description[512];   ///< Description of the content
	uint32 unique_id;        ///< Unique ID; either GRF ID or shortname
	byte md5sum[16];         ///< The MD5 checksum
	uint8 dependency_count;  ///< Number of dependencies
	ContentID *dependencies; ///< Malloced array of dependencies (unique server side ids)
	uint8 tag_count;         ///< Number of tags
	char (*tags)[32];        ///< Malloced array of tags (strings)
	State state;             ///< Whether the content info is selected (for download)
	bool upgrade;            ///< This item is an upgrade

	ContentInfo();
	~ContentInfo();

	void TransferFrom(ContentInfo *other);

	size_t Size() const;
	bool IsSelected() const;
	bool IsValid() const;
#ifndef OPENTTD_MSU
	const char *GetTextfile(TextfileType type) const;
#endif /* OPENTTD_MSU */
};

/** Base socket handler for all Content TCP sockets */
class NetworkContentSocketHandler : public NetworkTCPSocketHandler {
protected:
	NetworkAddress client_addr; ///< The address we're connected to.
	virtual void Close();

	bool ReceiveInvalidPacket(PacketContentType type);

	/**
	 * Client requesting a list of content info:
	 *  byte    type
	 *  uint32  openttd version
	 * @param p The packet that was just received.
	 * @return True upon success, otherwise false.
	 */
	virtual bool Receive_CLIENT_INFO_LIST(Packet *p);

	/**
	 * Client requesting a list of content info:
	 *  uint16  count of ids
	 *  uint32  id (count times)
	 * @param p The packet that was just received.
	 * @return True upon success, otherwise false.
	 */
	virtual bool Receive_CLIENT_INFO_ID(Packet *p);

	/**
	 * Client requesting a list of content info based on an external
	 * 'unique' id; GRF ID for NewGRFS, shortname and for base
	 * graphics and AIs.
	 * Scenarios and AI libraries are not supported
	 *  uint8   count of requests
	 *  for each request:
	 *    uint8 type
	 *    unique id (uint32)
	 * @param p The packet that was just received.
	 * @return True upon success, otherwise false.
	 */
	virtual bool Receive_CLIENT_INFO_EXTID(Packet *p);

	/**
	 * Client requesting a list of content info based on an external
	 * 'unique' id; GRF ID + MD5 checksum for NewGRFS, shortname and
	 * xor-ed MD5 checksums for base graphics and AIs.
	 * Scenarios and AI libraries are not supported
	 *  uint8   count of requests
	 *  for each request:
	 *    uint8 type
	 *    unique id (uint32)
	 *    md5 (16 bytes)
	 * @param p The packet that was just received.
	 * @return True upon success, otherwise false.
	 */
	virtual bool Receive_CLIENT_INFO_EXTID_MD5(Packet *p);

	/**
	 * Server sending list of content info:
	 *  byte    type (invalid ID == does not exist)
	 *  uint32  id
	 *  uint32  file_size
	 *  string  name (max 32 characters)
	 *  string  version (max 16 characters)
	 *  uint32  unique id
	 *  uint8   md5sum (16 bytes)
	 *  uint8   dependency count
	 *  uint32  unique id of dependency (dependency count times)
	 *  uint8   tag count
	 *  string  tag (max 32 characters for tag count times)
	 * @param p The packet that was just received.
	 * @return True upon success, otherwise false.
	 */
	virtual bool Receive_SERVER_INFO(Packet *p);

	/**
	 * Client requesting the actual content:
	 *  uint16  count of unique ids
	 *  uint32  unique id (count times)
	 * @param p The packet that was just received.
	 * @return True upon success, otherwise false.
	 */
	virtual bool Receive_CLIENT_CONTENT(Packet *p);

	/**
	 * Server sending list of content info:
	 *  uint32  unique id
	 *  uint32  file size (0 == does not exist)
	 *  string  file name (max 48 characters)
	 * After this initial packet, packets with the actual data are send using
	 * the same packet type.
	 * @param p The packet that was just received.
	 * @return True upon success, otherwise false.
	 */
	virtual bool Receive_SERVER_CONTENT(Packet *p);

	bool HandlePacket(Packet *p);
public:
	/**
	 * Create a new cs socket handler for a given cs
	 * @param s  the socket we are connected with
	 * @param address IP etc. of the client
	 */
	NetworkContentSocketHandler(SOCKET s = INVALID_SOCKET, const NetworkAddress &address = NetworkAddress()) :
		NetworkTCPSocketHandler(s),
		client_addr(address)
	{
	}

	/** On destructing of this class, the socket needs to be closed */
	virtual ~NetworkContentSocketHandler() { this->Close(); }

	bool ReceivePackets();
};

#ifndef OPENTTD_MSU
Subdirectory GetContentInfoSubDir(ContentType type);
#endif /* OPENTTD_MSU */

#endif /* ENABLE_NETWORK */

#endif /* NETWORK_CORE_TCP_CONTENT_H */