From 1c98ec94da18c97272e1b0a2c1e43baf0683a187 Mon Sep 17 00:00:00 2001
From: Kahrl <kahrl@gmx.net>
Date: Mon, 7 Nov 2011 04:20:33 +0100
Subject: [PATCH] Make Connection::Receive return the data via a SharedBuffer
 reference, so the caller doesn't have to choose the right buffer size in
 advance.

Conflicts:

	src/test.cpp
---
 src/client.cpp     |  5 ++---
 src/connection.cpp |  4 ++--
 src/connection.h   |  2 +-
 src/server.cpp     |  5 ++---
 src/test.cpp       | 52 +++++++++++++++++++++++-----------------------
 5 files changed, 33 insertions(+), 35 deletions(-)

diff --git a/src/client.cpp b/src/client.cpp
index a777293a3..69c91bc30 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -665,14 +665,13 @@ void Client::ReceiveAll()
 void Client::Receive()
 {
 	DSTACK(__FUNCTION_NAME);
-	u32 data_maxsize = 200000;
-	Buffer<u8> data(data_maxsize);
+	SharedBuffer<u8> data;
 	u16 sender_peer_id;
 	u32 datasize;
 	{
 		//TimeTaker t1("con mutex and receive", m_device);
 		//JMutexAutoLock lock(m_con_mutex); //bulk comment-out
-		datasize = m_con.Receive(sender_peer_id, *data, data_maxsize);
+		datasize = m_con.Receive(sender_peer_id, data);
 	}
 	//TimeTaker t1("ProcessData", m_device);
 	ProcessData(*data, datasize, sender_peer_id);
diff --git a/src/connection.cpp b/src/connection.cpp
index 31c0f77a3..b9c5d2ac8 100644
--- a/src/connection.cpp
+++ b/src/connection.cpp
@@ -1577,7 +1577,7 @@ void Connection::Disconnect()
 	putCommand(c);
 }
 
-u32 Connection::Receive(u16 &peer_id, u8 *data, u32 datasize)
+u32 Connection::Receive(u16 &peer_id, SharedBuffer<u8> &data)
 {
 	for(;;){
 		ConnectionEvent e = waitEvent(m_bc_receive_timeout);
@@ -1589,7 +1589,7 @@ u32 Connection::Receive(u16 &peer_id, u8 *data, u32 datasize)
 			throw NoIncomingDataException("No incoming data");
 		case CONNEVENT_DATA_RECEIVED:
 			peer_id = e.peer_id;
-			memcpy(data, *e.data, e.data.getSize());
+			data = SharedBuffer<u8>(e.data);
 			return e.data.getSize();
 		case CONNEVENT_PEER_ADDED: {
 			Peer tmp(e.peer_id, e.address);
diff --git a/src/connection.h b/src/connection.h
index dc61394fa..6d26e2e35 100644
--- a/src/connection.h
+++ b/src/connection.h
@@ -551,7 +551,7 @@ class Connection: public SimpleThread
 	void Connect(Address address);
 	bool Connected();
 	void Disconnect();
-	u32 Receive(u16 &peer_id, u8 *data, u32 datasize);
+	u32 Receive(u16 &peer_id, SharedBuffer<u8> &data);
 	void SendToAll(u8 channelnum, SharedBuffer<u8> data, bool reliable);
 	void Send(u16 peer_id, u8 channelnum, SharedBuffer<u8> data, bool reliable);
 	void RunTimeouts(float dtime); // dummy
diff --git a/src/server.cpp b/src/server.cpp
index 37ba65a95..52e9dc879 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1777,14 +1777,13 @@ void Server::AsyncRunStep()
 void Server::Receive()
 {
 	DSTACK(__FUNCTION_NAME);
-	u32 data_maxsize = 10000;
-	Buffer<u8> data(data_maxsize);
+	SharedBuffer<u8> data;
 	u16 peer_id;
 	u32 datasize;
 	try{
 		{
 			JMutexAutoLock conlock(m_con_mutex);
-			datasize = m_con.Receive(peer_id, *data, data_maxsize);
+			datasize = m_con.Receive(peer_id, data);
 		}
 
 		// This has to be called so that the client list gets synced
diff --git a/src/test.cpp b/src/test.cpp
index db8db4ecc..37412d179 100644
--- a/src/test.cpp
+++ b/src/test.cpp
@@ -852,9 +852,9 @@ struct TestConnection
 		try
 		{
 			u16 peer_id;
-			u8 data[100];
+			SharedBuffer<u8> data;
 			infostream<<"** running client.Receive()"<<std::endl;
-			u32 size = client.Receive(peer_id, data, 100);
+			u32 size = client.Receive(peer_id, data);
 			infostream<<"** Client received: peer_id="<<peer_id
 					<<", size="<<size
 					<<std::endl;
@@ -874,9 +874,9 @@ struct TestConnection
 		try
 		{
 			u16 peer_id;
-			u8 data[100];
+			SharedBuffer<u8> data;
 			infostream<<"** running server.Receive()"<<std::endl;
-			u32 size = server.Receive(peer_id, data, 100);
+			u32 size = server.Receive(peer_id, data);
 			infostream<<"** Server received: peer_id="<<peer_id
 					<<", size="<<size
 					<<std::endl;
@@ -901,9 +901,9 @@ struct TestConnection
 			try
 			{
 				u16 peer_id;
-				u8 data[100];
+				SharedBuffer<u8> data;
 				infostream<<"** running client.Receive()"<<std::endl;
-				u32 size = client.Receive(peer_id, data, 100);
+				u32 size = client.Receive(peer_id, data);
 				infostream<<"** Client received: peer_id="<<peer_id
 						<<", size="<<size
 						<<std::endl;
@@ -919,9 +919,9 @@ struct TestConnection
 		try
 		{
 			u16 peer_id;
-			u8 data[100];
+			SharedBuffer<u8> data;
 			infostream<<"** running server.Receive()"<<std::endl;
-			u32 size = server.Receive(peer_id, data, 100);
+			u32 size = server.Receive(peer_id, data);
 			infostream<<"** Server received: peer_id="<<peer_id
 					<<", size="<<size
 					<<std::endl;
@@ -944,14 +944,14 @@ struct TestConnection
 			sleep_ms(50);
 
 			u16 peer_id;
-			u8 recvdata[100];
+			SharedBuffer<u8> recvdata;
 			infostream<<"** running server.Receive()"<<std::endl;
-			u32 size = server.Receive(peer_id, recvdata, 100);
+			u32 size = server.Receive(peer_id, recvdata);
 			infostream<<"** Server received: peer_id="<<peer_id
 					<<", size="<<size
 					<<", data="<<*data
 					<<std::endl;
-			assert(memcmp(*data, recvdata, data.getSize()) == 0);
+			assert(memcmp(*data, *recvdata, data.getSize()) == 0);
 		}
 #endif
 		u16 peer_id_client = 2;
@@ -987,29 +987,29 @@ struct TestConnection
 			infostream<<"*** Receiving the packets"<<std::endl;
 
 			u16 peer_id;
-			u8 recvdata[20];
+			SharedBuffer<u8> recvdata;
 			u32 size;
 
 			infostream<<"** running client.Receive()"<<std::endl;
 			peer_id = 132;
-			size = client.Receive(peer_id, recvdata, 20);
+			size = client.Receive(peer_id, recvdata);
 			infostream<<"** Client received: peer_id="<<peer_id
 					<<", size="<<size
-					<<", data="<<recvdata
+					<<", data="<<*recvdata
 					<<std::endl;
 			assert(size == data1.getSize());
-			assert(memcmp(*data1, recvdata, data1.getSize()) == 0);
+			assert(memcmp(*data1, *recvdata, data1.getSize()) == 0);
 			assert(peer_id == PEER_ID_SERVER);
 			
 			infostream<<"** running client.Receive()"<<std::endl;
 			peer_id = 132;
-			size = client.Receive(peer_id, recvdata, 20);
+			size = client.Receive(peer_id, recvdata);
 			infostream<<"** Client received: peer_id="<<peer_id
 					<<", size="<<size
-					<<", data="<<recvdata
+					<<", data="<<*recvdata
 					<<std::endl;
 			assert(size == data2.getSize());
-			assert(memcmp(*data2, recvdata, data2.getSize()) == 0);
+			assert(memcmp(*data2, *recvdata, data2.getSize()) == 0);
 			assert(peer_id == PEER_ID_SERVER);
 			
 			bool got_exception = false;
@@ -1017,10 +1017,10 @@ struct TestConnection
 			{
 				infostream<<"** running client.Receive()"<<std::endl;
 				peer_id = 132;
-				size = client.Receive(peer_id, recvdata, 20);
+				size = client.Receive(peer_id, recvdata);
 				infostream<<"** Client received: peer_id="<<peer_id
 						<<", size="<<size
-						<<", data="<<recvdata
+						<<", data="<<*recvdata
 						<<std::endl;
 			}
 			catch(con::NoIncomingDataException &e)
@@ -1056,12 +1056,12 @@ struct TestConnection
 				//int receivetimes = myrand_range(1,20);
 				int receivetimes = 20;
 				for(int i=0; i<receivetimes; i++){
-					u8 recvdata[100000];
+					SharedBuffer<u8> recvdata;
 					u16 peer_id = 132;
 					u16 size = 0;
 					bool received = false;
 					try{
-						size = client.Receive(peer_id, recvdata, 100000);
+						size = client.Receive(peer_id, recvdata);
 						received = true;
 					}catch(con::NoIncomingDataException &e){
 					}
@@ -1092,7 +1092,7 @@ struct TestConnection
 
 			sleep_ms(3000);
 			
-			u8 recvdata[datasize + 1000];
+			SharedBuffer<u8> recvdata;
 			infostream<<"** running client.Receive()"<<std::endl;
 			u16 peer_id = 132;
 			u16 size = 0;
@@ -1102,7 +1102,7 @@ struct TestConnection
 				if(porting::getTimeMs() - timems0 > 5000)
 					break;
 				try{
-					size = client.Receive(peer_id, recvdata, datasize + 1000);
+					size = client.Receive(peer_id, recvdata);
 					received = true;
 				}catch(con::NoIncomingDataException &e){
 				}
@@ -1116,13 +1116,13 @@ struct TestConnection
 			infostream<<"Received data (size="<<size<<"):";
 			for(int i=0; i<size && i<20; i++){
 				if(i%2==0) DEBUGPRINT(" ");
-				DEBUGPRINT("%.2X", ((int)((const char*)recvdata)[i])&0xff);
+				DEBUGPRINT("%.2X", ((int)(recvdata[i]))&0xff);
 			}
 			if(size>20)
 				infostream<<"...";
 			infostream<<std::endl;
 
-			assert(memcmp(*data1, recvdata, data1.getSize()) == 0);
+			assert(memcmp(*data1, *recvdata, data1.getSize()) == 0);
 			assert(peer_id == PEER_ID_SERVER);
 		}
 		
-- 
GitLab