Date: Friday, February 24, 2006 @ 18:30:34
Author: gilles
Path: /cvsroot/carob/carob
Modified: include/JavaSocket.hpp (1.25 -> 1.26) src/JavaSocket.cpp (1.42
-> 1.43)
Changed receive/sendFromSocket function to return void: they both throw
exception in case of error, if they return, this is success
Added java-byte array serialization functions
------------------------+
include/JavaSocket.hpp | 30 ++++++++++++----
src/JavaSocket.cpp | 87 ++++++++++++++++++++++++++---------------------
2 files changed, 72 insertions(+), 45 deletions(-)
Index: carob/include/JavaSocket.hpp
diff -u carob/include/JavaSocket.hpp:1.25 carob/include/JavaSocket.hpp:1.26
--- carob/include/JavaSocket.hpp:1.25 Wed Feb 1 16:19:18 2006
+++ carob/include/JavaSocket.hpp Fri Feb 24 18:30:33 2006
@@ -25,6 +25,8 @@
#include "StringCodecs.hpp"
#include "CarobException.hpp"
+#include "Common.hpp" // for java_byte: cannot forward declare typedefs
+
#include <string>
#include <netinet/in.h> //for in_addr_t
@@ -149,6 +151,22 @@
void readJavaBool(bool& b) const throw (SocketIOException,
UnexpectedException);
/**
+ * Reads an array of bytes from the socket. The array must be allocated !
+ * @param length number of bytes to read
+ * @param data allocated array of (at least) length bytes
+ * @throws SocketIOException
+ */
+ void readJavaBytes(int32_t length, java_byte* data) const
+ throw (SocketIOException, UnexpectedException);
+ /**
+ * Writes an array of bytes to the socket.
+ * @param length number of bytes to write
+ * @param data array of (at least) length bytes
+ * @throws SocketIOException
+ */
+ void writeJavaBytes(int32_t length, java_byte* data) const
+ throw (SocketIOException, UnexpectedException);
+ /**
* Gets the socket file descriptor
* @return the file descriptor
*/
@@ -170,13 +188,12 @@
* @param buf data to be send
* @param len length of buf
* @param flags send option, see recv man page
- * @return true if the data could be send successfully
* @throws SocketIOException
*/
- bool sendToSocket(const std::wstring& fctName,
+ void sendToSocket(const std::wstring& fctName,
const std::wstring& objName, const void* buf, int len,
- int flags)
- const throw (SocketIOException, UnexpectedException);
+ int flags) const throw (SocketIOException,
+ UnexpectedException);
/**
* Wrapper around recv(...) function to handle errors and throw exceptions
* @param fctName name of the calling function (for logging purposes)
@@ -184,10 +201,9 @@
* @param buf buffer in which to put the received data in
* @param len length of buf
* @param flags send option, see send man page
- * @return true if the data could be send successfully
- * @throws SocketIOException
+ * @throws SocketIOException in case of error
*/
- bool receiveFromSocket(const std::wstring& fctName,
+ void receiveFromSocket(const std::wstring& fctName,
const std::wstring& objName,
void *buf, int len, int flags)
const throw (SocketIOException, UnexpectedException);
Index: carob/src/JavaSocket.cpp
diff -u carob/src/JavaSocket.cpp:1.42 carob/src/JavaSocket.cpp:1.43
--- carob/src/JavaSocket.cpp:1.42 Fri Feb 24 12:54:12 2006
+++ carob/src/JavaSocket.cpp Fri Feb 24 18:30:33 2006
@@ -218,10 +218,8 @@
int32_t netlen = htonl(utf8str.length());
//First write number of bytes to follow as
- if (sendToSocket(fctName, L"UTF string", &netlen, sizeof(netlen),
SOCKET_SEND_FLAGS))
- {
- sendToSocket(fctName, L"UTF string", utf8str.data(), utf8str.length(),
SOCKET_SEND_FLAGS);
- }
+ sendToSocket(fctName, L"UTF string", &netlen, sizeof(netlen),
SOCKET_SEND_FLAGS);
+ sendToSocket(fctName, L"UTF string", utf8str.data(), utf8str.length(),
SOCKET_SEND_FLAGS);
return utf8str.length();
}
@@ -236,24 +234,21 @@
uint16_t lenRec;
size_t sizeRead = 0;
//First get size
- if (receiveFromSocket(fctName, L"UTF string size", &lenRecNet,
sizeof(lenRecNet), 0))
- {
- lenRec = ntohl(lenRecNet); // number of bytes to come
+ receiveFromSocket(fctName, L"UTF string size", &lenRecNet,
sizeof(lenRecNet), 0);
+ lenRec = ntohl(lenRecNet); // number of bytes to come
- uint8_t* utfStr = new uint8_t[lenRec];
- if (receiveFromSocket(fctName, L"UTF string", utfStr, lenRec, 0))
- {
- const std::string received(reinterpret_cast<char*>(utfStr), lenRec);
+ uint8_t* utfStr = new uint8_t[lenRec];
+ receiveFromSocket(fctName, L"UTF string", utfStr, lenRec, 0);
+ const std::string received(reinterpret_cast<char*>(utfStr), lenRec);
- try {
- s = fromUTF8(received);
- } catch (CodecException) {
- delete[] utfStr; throw;
- }
- sizeRead = (size_t)lenRec;
- }
- delete[] utfStr;
+ try {
+ s = fromUTF8(received);
+ } catch (CodecException) {
+ delete[] utfStr; throw;
}
+ sizeRead = (size_t)lenRec;
+
+ delete[] utfStr;
return sizeRead;
}
@@ -274,10 +269,8 @@
// so we must convert it after reception
int32_t rec = 0;
- if (receiveFromSocket(fctName, L"Int32", &rec, sizeof(rec), 0))
- {
- i = ntohl(rec);
- }
+ receiveFromSocket(fctName, L"Int32", &rec, sizeof(rec), 0);
+ i = ntohl(rec);
}
void JavaSocket::writeJavaLong(int64_t i) const throw (SocketIOException,
@@ -297,16 +290,14 @@
// so we must convert it after reception
int64_t rec = 0;
- if (receiveFromSocket(fctName, L"Int64", &rec, sizeof(rec), 0))
- {
- i = ntohll(rec);
- }
+ receiveFromSocket(fctName, L"Int64", &rec, sizeof(rec), 0);
+ i = ntohll(rec);
}
void JavaSocket::writeJavaBool(bool b) const throw (SocketIOException,
UnexpectedException)
{
- wstring fctName(L"JavaSocket::WriteBoolean");
+ wstring fctName(L"JavaSocket::writeJavaBool");
uint8_t byteToSend = b; // the implicit casts do it right
//No byte order problem here: the only value read is '0' for false
//all other values are true
@@ -316,11 +307,25 @@
void JavaSocket::readJavaBool(bool& b) const throw (SocketIOException,
UnexpectedException)
{
- wstring fctName(L"JavaSocket::ReadBoolean");
+ wstring fctName(L"JavaSocket::readJavaBool");
uint8_t rec;
- if (receiveFromSocket(fctName, L"Boolean", &rec, sizeof(rec), 0))
- b = rec; // the implicit cast does it right
+ receiveFromSocket(fctName, L"Boolean", &rec, sizeof(rec), 0);
+ b = rec; // the implicit cast does it right
+}
+
+void JavaSocket::readJavaBytes(int32_t length, java_byte* data) const
+ throw (SocketIOException, UnexpectedException)
+{
+ wstring fctName(L"JavaSocket::readJavaBytes");
+ receiveFromSocket(fctName, L"JavaBytes", data, length, 0);
+}
+
+void JavaSocket::writeJavaBytes(int32_t length, java_byte* data) const
+ throw (SocketIOException, UnexpectedException)
+{
+ wstring fctName(L"JavaSocket::writeJavaBytes");
+ sendToSocket(fctName, L"JavaBytes", data, length, SOCKET_SEND_FLAGS);
}
int JavaSocket::recvFully(void *buf, const int len, const int flags)
@@ -345,21 +350,28 @@
return len;
}
-bool JavaSocket::sendToSocket(const wstring& fctName, const wstring& objName,
+void JavaSocket::sendToSocket(const wstring& fctName, const wstring& objName,
const void* buf, int len, int flags) const
throw (SocketIOException, UnexpectedException)
{
+ // in non blocking mode, send will block until len bytes are send. So no need
+ // to loop here
int ret = send(socketFd, buf, len, flags);
if ( ret == -1 )
{
- wstring msg = L'(' + fctName + L"): could not write " + objName + L" to
socket";
- throw SocketIOException(msg);
- return false;
+ throw SocketIOException(L'(' + fctName + L"): could not write "
+ + objName + L" to socket");
+ }
+ if (ret != len)
+ {
+ // should never happen
+ throw SocketIOException(L'(' + fctName + L"): only " + toWString(ret)
+ + L"/" + toWString(len) + L" bytes send while sending " + objName
+ + L" to socket");
}
- return true;
}
-bool JavaSocket::receiveFromSocket(const wstring& fctName,
+void JavaSocket::receiveFromSocket(const wstring& fctName,
const wstring& objName, void *buf, int len, int flags) const
throw (SocketIOException, UnexpectedException)
{
@@ -372,7 +384,6 @@
{
throw SocketIOException(fctName + L"Peer reset connection while reading
integer.");
}
- return true;
}
const uint64_t JavaSocket::ntohll(const uint64_t &n) const
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits