Explorar o código

Merge branch 'master' into world

mikymod %!s(int64=12) %!d(string=hai) anos
pai
achega
4f43447a3e

+ 1 - 0
engine/CMakeLists.txt

@@ -475,6 +475,7 @@ if (WINDOWS)
 	list (APPEND OS_HEADERS
 		os/win/OsFile.h
 		os/win/OsThread.h
+		os/win/OsSocket.h
 		os/win/OsWindow.h
 		os/win/Mutex.h
 		os/win/Cond.h

+ 1 - 0
engine/core/strings/StringStream.h

@@ -29,6 +29,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include <stdio.h>
 #include "List.h"
 #include "StringUtils.h"
+#include "OS.h"
 
 namespace crown
 {

+ 1 - 0
engine/os/OS.h

@@ -48,6 +48,7 @@ namespace crown
 
 	#undef MK_SHIFT
 	#undef MK_ALT
+
 #elif defined(ANDROID)
 	const size_t	MAX_PATH_LENGTH = 1024;
 	const char		PATH_SEPARATOR = '/';

+ 8 - 8
engine/os/posix/OsSocket.h

@@ -42,13 +42,13 @@ namespace crown
 
 struct ReadResult
 {
-	enum { NO_ERROR, UNKNOWN, REMOTE_CLOSED } error;
+	enum { NO_RESULT_ERROR, UNKNOWN, REMOTE_CLOSED } error;
 	size_t received_bytes;
 };
 
 struct WriteResult
 {
-	enum { NO_ERROR, UNKNOWN, REMOTE_CLOSED } error;
+	enum { NO_RESULT_ERROR, UNKNOWN, REMOTE_CLOSED } error;
 	size_t sent_bytes;
 };
 
@@ -120,7 +120,7 @@ public:
 
 		if (received_bytes == -1 && errno == EAGAIN)
 		{
-			result.error = ReadResult::NO_ERROR;
+			result.error = ReadResult::NO_RESULT_ERROR;
 			result.received_bytes = 0;
 		}
 		else if (received_bytes == 0)
@@ -129,7 +129,7 @@ public:
 		}
 		else
 		{
-			result.error = ReadResult::NO_ERROR;
+			result.error = ReadResult::NO_RESULT_ERROR;
 			result.received_bytes = received_bytes;
 		}
 
@@ -151,7 +151,7 @@ public:
 		}
 		else
 		{
-			result.error = WriteResult::NO_ERROR;
+			result.error = WriteResult::NO_RESULT_ERROR;
 			result.sent_bytes = sent_bytes;
 		}
 
@@ -316,7 +316,7 @@ public:
 
 		if (received_bytes == -1 && errno == EAGAIN)
 		{
-			result.error = ReadResult::NO_ERROR;
+			result.error = ReadResult::NO_RESULT_ERROR;
 			result.received_bytes = 0;
 		}
 		else if (received_bytes == 0)
@@ -325,7 +325,7 @@ public:
 		}
 		else
 		{
-			result.error = ReadResult::NO_ERROR;
+			result.error = ReadResult::NO_RESULT_ERROR;
 			result.received_bytes = received_bytes;
 		}
 
@@ -355,7 +355,7 @@ public:
 			return result;
 		}
 
-		result.error = WriteResult::NO_ERROR;
+		result.error = WriteResult::NO_RESULT_ERROR;
 		result.sent_bytes = sent_bytes;
 		return result;
 	}

+ 4 - 0
engine/os/win/Cond.h

@@ -26,6 +26,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
 #include <windows.h>
 #include "Types.h"
 #include "Mutex.h"

+ 4 - 0
engine/os/win/Mutex.h

@@ -26,6 +26,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
 #include <windows.h>
 #include "Types.h"
 #include "OS.h"

+ 4 - 0
engine/os/win/OsFile.h

@@ -26,6 +26,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
 #include <cstdio>
 #include <windows.h>
 #include "Types.h"

+ 100 - 138
engine/os/win/OsSocket.h

@@ -24,26 +24,32 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 */
 
+#pragma once
+
 #include <winsock2.h>
-#pragma comment(lib, "wsock32.lib")
+#include <windows.h>
 
 #include "NetAddress.h"
 #include "Assert.h"
 #include "Types.h"
 #include "OS.h"
 
+#pragma comment(lib, "Ws2_32.lib")
+
 namespace crown
 {
 
+//-----------------------------------------------------------------------------
 struct ReadResult
 {
-	enum { NO_ERROR, UNKNOWN, REMOTE_CLOSED } error;
+	enum { NO_RESULT_ERROR, UNKNOWN, REMOTE_CLOSED } error;
 	size_t received_bytes;
 };
 
+//-----------------------------------------------------------------------------
 struct WriteResult
 {
-	enum { NO_ERROR, UNKNOWN, REMOTE_CLOSED } error;
+	enum { NO_RESULT_ERROR, UNKNOWN, REMOTE_CLOSED } error;
 	size_t sent_bytes;
 };
 
@@ -55,7 +61,6 @@ public:
 	TCPSocket()
 		: m_socket(0)
 	{
-
 	}
 
 	//-----------------------------------------------------------------------------
@@ -65,59 +70,15 @@ public:
 	}
 
 	//-----------------------------------------------------------------------------
-	TCPSocket::~TCPSocket()
+	~TCPSocket()
 	{
 		close();
 	}
 
-/*	//-----------------------------------------------------------------------------
-	bool TCPSocket::open(uint16_t port)
-	{
-		int32_t sd = socket(AF_INET, SOCK_STREAM, 0);
-
-		if (sd <= 0)
-		{
-			os::print32_tf("failed to open socket\n");
-			set_socket_id(0);
-			return false;
-		}
-
-		set_socket_id(sd);
-
-		// Bind socket
-		sockaddr_in address;
-		address.sin_family = AF_INET;
-		address.sin_addr.s_addr = htonl(INADDR_ANY);
-		address.sin_port = htons(port);
-
-		if (bind(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
-		{
-			os::print32_tf("failed to bind socket\n");
-			close();
-			return false;
-		}
-
-		listen(sd, 5);
-		os::print32_tf("listening on port %d", port);
-
-		sockaddr_in client;
-		uint32_t client_length = sizeof(client);
-
-		int32_t active_sd = accept(sd, (sockaddr*)&client, &client_length);
-		if (active_sd < 0)
-		{
-			os::print32_tf("failed to accept connections");
-		}
-
-		set_active_socket_id(active_sd);
-
-		return true;  
-	}*/
-
 	//-----------------------------------------------------------------------------
-	bool TCPSocket::connect(const NetAddress& destination, uint16_t port)
+	bool connect(const NetAddress& destination, uint16_t port)
 	{		
-		int sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+		int sd = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
 		if (sd <= 0)
 		{
@@ -130,39 +91,41 @@ public:
 
 		sockaddr_in address;
 		address.sin_family = AF_INET;
-		address.sin_addr.s_addr = htonl(destination.address());
-		address.sin_port = htons(port);
+		address.sin_addr.s_addr = ::htonl(destination.address());
+		address.sin_port = ::htons(port);
 
-		if (::connect(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
+		if (::connect(m_socket, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
 		{
 			os::printf("failed to connect socket\n");
 			close();
 			return false;
 		}
+
+		return true;
 	}
 
 	//-----------------------------------------------------------------------------
-	int32_t	TCPSocket::close()
+	void close()
 	{
 		if (m_socket != 0)
 		{
-			::close(m_socket);
+			::closesocket(m_socket);
 			m_socket = 0;
 		}
 	}
 
 	//-----------------------------------------------------------------------------
-	ReadResult TCPSocket::read(void* data, int32_t size)
+	ReadResult read(void* data, int32_t size)
 	{
 		CE_ASSERT_NOT_NULL(data);
 
-		int received_bytes = recv(m_socket, (char*)data, size, 0);
+		int received_bytes = ::recv(m_socket, (char*)data, size, 0);
 
 		ReadResult result;
 
 		if (received_bytes < 0)
 		{
-			result.error = ReadResult::NO_ERROR;
+			result.error = ReadResult::NO_RESULT_ERROR;
 			result.received_bytes = 0;
 		}
 		if (received_bytes == 0)
@@ -171,7 +134,7 @@ public:
 		}
 		else
 		{
-			result.error = ReadResult::NO_ERROR;
+			result.error = ReadResult::NO_RESULT_ERROR;
 			result.received_bytes = received_bytes;
 		}
 
@@ -179,11 +142,11 @@ public:
 	}
 
 	//-----------------------------------------------------------------------------
-	bool TCPSocket::write(const void* data, int32_t size)
+	WriteResult write(const void* data, int32_t size)
 	{
 		CE_ASSERT_NOT_NULL(data);
 
-		int sent_bytes = ::send(sd, (const char*)data, size, 0);
+		int sent_bytes = ::send(m_socket, (const char*)data, size, 0);
 
 		WriteResult result;
 
@@ -193,7 +156,7 @@ public:
 		}
 		else
 		{
-			result.error = WriteResult::NO_ERROR;
+			result.error = WriteResult::NO_RESULT_ERROR;
 			result.sent_bytes = sent_bytes;
 		}
 
@@ -215,24 +178,24 @@ public:
 	{
 		int& sock_id = m_listener.m_socket;
 
-		sock_id = socket(AF_INET, SOCK_STREAM, 0);
-		CE_ASSERT(socket_id != INVALID_SOCKET, "Unable to open socket");
+		sock_id = ::socket(AF_INET, SOCK_STREAM, 0);
+		CE_ASSERT(sock_id != INVALID_SOCKET, "Unable to open socket");
 
 		// set non-blocking io
 		DWORD non_blocking = 1;
-		int result = ioctlsocket(sock_id, FIONBIO, &non_blocking);
+		int result = ::ioctlsocket(sock_id, FIONBIO, &non_blocking);
 		CE_ASSERT(result == 0, "Unable to set socket non-blocking");
 
 		// Bind socket
 		sockaddr_in address;
 		address.sin_family = AF_INET;
-		address.sin_addr.s_addr = htonl(INADDR_ANY);
-		address.sin_port = htons(port);
+		address.sin_addr.s_addr = ::htonl(INADDR_ANY);
+		address.sin_port = ::htons(port);
 
 		result = ::bind(sock_id, (const sockaddr*)&address, sizeof(sockaddr_in));
 		CE_ASSERT(result == 0, "Unable to bind socket");
 		
-		result = ::listen(sd, 5);
+		result = ::listen(sock_id, 5);
 		CE_ASSERT(result == 0, "Unable to listen on socket");
 
 		return true;  
@@ -250,15 +213,16 @@ public:
 		int& sock_id = m_listener.m_socket;
 
 		sockaddr_in client;
-		uint32_t client_length = sizeof(client);
+		int client_length = sizeof(client);
 
-		int32_t asd = accept(sd, (sockaddr*)&client, &client_length);
+		int asd = ::accept(sock_id, (sockaddr*)&client, &client_length);
 		if (asd < 0)
 		{
 			return false;
 		}
 
-		int result = ioctlsocket(asd, FIONBIO, &non_blocking);
+		DWORD non_blocking = 1;
+		int result = ::ioctlsocket(asd, FIONBIO, &non_blocking);
 		CE_ASSERT(result == 0, "Unable to set socket non-blocking");		
 
 		c.m_socket = asd;
@@ -287,124 +251,122 @@ private:
 class UDPSocket
 {
 	//-----------------------------------------------------------------------------
-	UDPSocket::UDPSocket()
+	UDPSocket()
 		: m_socket(0)
 	{
 	}
 
 	//-----------------------------------------------------------------------------
-	UDPSocket::~UDPSocket()
+	~UDPSocket()
 	{
 		close();
 	}
 
 	//-----------------------------------------------------------------------------
-	bool UDPSocket::open(uint16_t port)
+	bool open(uint16_t port)
 	{
-		CE_ASSERT(!is_open(), "Socket is already open");
+		// CE_ASSERT(!is_open(), "Socket is already open");
 
-		m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-		CE_ASSERT(m_socket != INVALID_SOCKET, "Unable to open socket");
+		// m_socket = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+		// CE_ASSERT(m_socket != INVALID_SOCKET, "Unable to open socket");
 
-		// bind to port
-		sockaddr_in address;
-		address.sin_family = AF_INET;
-		address.sin_addr.s_addr = INADDR_ANY;
-		address.sin_port = htons(port);
+		// // bind to port
+		// sockaddr_in address;
+		// address.sin_family = AF_INET;
+		// address.sin_addr.s_addr = INADDR_ANY;
+		// address.sin_port = ::htons(port);
 
-		int result = ::bind(m_socket, (const sockaddr*)&address, sizeof(sockaddr_in));
-		CE_ASSERT(result == 0, "Unable to bind socket");
+		// int result = ::bind(m_socket, (const sockaddr*)&address, sizeof(sockaddr_in));
+		// CE_ASSERT(result == 0, "Unable to bind socket");
 
-		// set non-blocking io
-		DWORD non_blocking = 1;
-		result = ioctlsocket(socket, FIONBIO, &non_blocking);
-		CE_ASSERT(result == 0, "Unable to bind socket");
+		// // set non-blocking io
+		// DWORD non_blocking = 1;
+		// result = ::ioctlsocket(m_socket, FIONBIO, &non_blocking);
+		// CE_ASSERT(result == 0, "Unable to bind socket");
 
 		return true;
 	}
 
 	//-----------------------------------------------------------------------------
-	ReadResult UDPSocket::read(NetAddress& sender, uint16_t& port, const void* data, size_t size)
+	ReadResult read(NetAddress& sender, uint16_t& port, const void* data, size_t size)
 	{
-		CE_ASSERT_NOT_NULL(data);
+		// CE_ASSERT_NOT_NULL(data);
 
-		typedef int socklen_t;
+		// typedef int socklen_t;
 
-		sockaddr_in from;
-		socklen_t from_length = sizeof(from);
+		// sockaddr_in from;
+		// socklen_t from_length = sizeof(from);
 
-		int received_bytes = recvfrom(m_socket, (char*)data, size, 0, (sockaddr*)&from, &from_length);
+		// int received_bytes = ::recvfrom(m_socket, (char*)data, size, 0, (sockaddr*)&from, &from_length);
 
 		ReadResult result;
 
-		if (received_bytes < 0)
-		{
-			result.error = ReadResult::NO_ERROR;
-			result.received_bytes = 0;
-		}
-		else if (received_bytes == 0)
-		{
-			result.error = ReadResult::REMOTE_CLOSED;
-		}
-		else
-		{
-			result.error = ReadResult::NO_ERROR;
-			result.received_bytes = received_bytes;
-		}
-
-		sender.set(ntohl(from.sin_addr.s_addr));
-		port = ntohs(from.sin_port);
+		// if (received_bytes < 0)
+		// {
+		// 	result.error = ReadResult::NO_RESULT_ERROR;
+		// 	result.received_bytes = 0;
+		// }
+		// else if (received_bytes == 0)
+		// {
+		// 	result.error = ReadResult::REMOTE_CLOSED;
+		// }
+		// else
+		// {
+		// 	result.error = ReadResult::NO_RESULT_ERROR;
+		// 	result.received_bytes = received_bytes;
+		// }
+
+		// sender.set(::ntohl(from.sin_addr.s_addr));
+		// port = ::ntohs(from.sin_port);
 
 		return result;
 	}
 
 	//-----------------------------------------------------------------------------
-	WriteResult UDPSocket::write(const NetAddress& receiver, uint16_t port, void* data, size_t size)
+	WriteResult write(const NetAddress& receiver, uint16_t port, void* data, size_t size)
 	{
-		CE_ASSERT_NOT_NULL(data);
+		// CE_ASSERT_NOT_NULL(data);
 
-		if (m_socket == 0)
-		{
-			return false;
-		}
+		// sockaddr_in address;
+		// address.sin_family = AF_INET;
+		// address.sin_addr.s_addr = htonl(receiver.address());
+		// address.sin_port = htons(port);
 
-		sockaddr_in address;
-		address.sin_family = AF_INET;
-		address.sin_addr.s_addr = htonl(receiver.get_address());
-		address.sin_port = htons(receiver.get_port());
-
-		int32_t sent_bytes = sendto(m_socket, (const char*)data, size, 0, (sockaddr*)&address, sizeof(sockaddr_in));
+		// int sent_bytes = sendto(m_socket, (const char*)data, size, 0, (sockaddr*)&address, sizeof(sockaddr_in));
 
 		WriteResult result;
 
-		if (sent_bytes < 0)
-		{
-			result.error = WriteResult::UNKNOWN;
-			return result;
-		}
+		// if (sent_bytes < 0)
+		// {
+		// 	result.error = WriteResult::UNKNOWN;
+		// 	return result;
+		// }
 
-		result.error = WriteResult::NO_ERROR;
-		result.sent_bytes = sent_bytes;
+		// result.error = WriteResult::NO_RESULT_ERROR;
+		// result.sent_bytes = sent_bytes;
 
 		return result;
 	}
 
 	//-----------------------------------------------------------------------------
-	void UDPSocket::close()
+	void close()
 	{
-		if (m_socket != 0)
-		{
-			::close(m_socket);
-			m_socket = 0;
-		}
+		// if (m_socket != 0)
+		// {
+		// 	::closesocket(m_socket);
+		// 	m_socket = 0;
+		// }
 	}
 
 	//-----------------------------------------------------------------------------
-	bool UDPSocket::is_open()
+	bool is_open()
 	{
 		return m_socket != 0; 
 	}
 
+public:
+
+	int m_socket;
 };
 
 } // namespace crown

+ 4 - 0
engine/os/win/OsThread.h

@@ -26,6 +26,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
 #include <windows.h>
 #include <process.h>
 #include <WinBase.h>

+ 4 - 0
engine/os/win/OsWindow.h

@@ -26,6 +26,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
 #include <windows.h>
 
 #include "Types.h"

+ 4 - 0
engine/os/win/Semaphore.h

@@ -26,6 +26,10 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 #pragma once
 
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
 #include <windows.h>
 #include <limits.h>
 

+ 5 - 2
engine/os/win/main.cpp

@@ -24,8 +24,11 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 */
 
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
 #include <windowsx.h>
-#include <winsock2.h>
 
 #define WM_USER_SET_WINDOW_SIZE     (WM_USER+0)
 #define WM_USER_TOGGLE_WINDOW_FRAME (WM_USER+1)
@@ -183,7 +186,7 @@ public:
 		init(argc, argv);
 
 		WSADATA WsaData;
-		CE_ASSERT(WSAStartup(MAKEWORD(2,2), &WsaData) == NO_ERROR, "Unable to initialize socket");
+		CE_ASSERT(WSAStartup(MAKEWORD(2,2), &WsaData) == 0L, "Unable to initialize socket");
 
 		HINSTANCE instance = (HINSTANCE)GetModuleHandle(NULL);
 

+ 1 - 1
engine/rpc/RPCServer.cpp

@@ -215,7 +215,7 @@ void RPCServer::update_client(ClientId id)
 	{
 		ReadResult result = client.read(buf, 32);
 
-		if (result.error == ReadResult::NO_ERROR)
+		if (result.error == ReadResult::NO_RESULT_ERROR)
 		{
 			if (result.received_bytes > 0)
 			{