various trics and changes so that windows compilers, and 32bit systems will not complain about stuff

This commit is contained in:
Emiel Bruijntjes 2015-04-24 10:46:44 +02:00
parent 4e09e54849
commit ad3b95741e
11 changed files with 146 additions and 56 deletions

View File

@ -110,7 +110,7 @@ public:
if (index > 7) return false; if (index > 7) return false;
// magic bit manipulation... // magic bit manipulation...
return (bool)((1 << index) & _byte); return 0 != ((1 << index) & _byte);
} }
/** /**

View File

@ -106,7 +106,7 @@ public:
* @param size size of the buffer to decode * @param size size of the buffer to decode
* @return number of bytes that were processed * @return number of bytes that were processed
*/ */
size_t parse(const char *buffer, size_t size) uint64_t parse(const char *buffer, size_t size)
{ {
return _implementation.parse(ByteBuffer(buffer, size)); return _implementation.parse(ByteBuffer(buffer, size));
} }
@ -129,7 +129,7 @@ public:
* @param buffer buffer to decode * @param buffer buffer to decode
* @return number of bytes that were processed * @return number of bytes that were processed
*/ */
size_t parse(const Buffer &buffer) uint64_t parse(const Buffer &buffer)
{ {
return _implementation.parse(buffer); return _implementation.parse(buffer);
} }

View File

@ -253,7 +253,7 @@ public:
* @param buffer buffer to decode * @param buffer buffer to decode
* @return number of bytes that were processed * @return number of bytes that were processed
*/ */
size_t parse(const Buffer &buffer); uint64_t parse(const Buffer &buffer);
/** /**
* Close the connection * Close the connection

View File

@ -136,7 +136,7 @@ public:
*/ */
operator float() const operator float() const
{ {
return _number / pow(10, _places); return static_cast<float>(_number / pow(10, _places));
} }
/** /**

View File

@ -5,6 +5,18 @@
* and big endian byte orders. This header file adds the missing macros * and big endian byte orders. This header file adds the missing macros
* *
* @author madmongo1 <https://github.com/madmongo1> * @author madmongo1 <https://github.com/madmongo1>
*
* And we have also copied code from the "portable_endian.h" file by
* Mathias Panzenböck. His license:
*
* "License": Public Domain
* I, Mathias Panzenböck, place this file hereby into the public
* domain. Use it at your own risk for whatever you like. In case
* there are jurisdictions that don't support putting things in the
* public domain you can also consider it to be "dual licensed"
* under the BSD, MIT and Apache licenses, if you want to. This
* code is trivial anyway. Consider it an example on how to get the
* endian conversion functions on different platforms.
*/ */
/** /**
@ -39,10 +51,87 @@
#define be64toh(x) OSSwapBigToHostInt64(x) #define be64toh(x) OSSwapBigToHostInt64(x)
#define le64toh(x) OSSwapLittleToHostInt64(x) #define le64toh(x) OSSwapLittleToHostInt64(x)
// not on apple /**
* And on Windows systems weird things are going on as well
*/
#elif (defined(_WIN16) || defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)) && !defined(__CYGWIN__)
#include <winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
//# include <sys/param.h>
#if BYTE_ORDER == LITTLE_ENDIAN
#define htobe16(x) htons(x)
#define htole16(x) (x)
#define be16toh(x) ntohs(x)
#define le16toh(x) (x)
#define htobe32(x) htonl(x)
#define htole32(x) (x)
#define be32toh(x) ntohl(x)
#define le32toh(x) (x)
#define htobe64(x) htonll(x)
#define htole64(x) (x)
#define be64toh(x) ntohll(x)
#define le64toh(x) (x)
#elif BYTE_ORDER == BIG_ENDIAN
/* that would be xbox 360 */
#define htobe16(x) (x)
#define htole16(x) __builtin_bswap16(x)
#define be16toh(x) (x)
#define le16toh(x) __builtin_bswap16(x)
#define htobe32(x) (x)
#define htole32(x) __builtin_bswap32(x)
#define be32toh(x) (x)
#define le32toh(x) __builtin_bswap32(x)
#define htobe64(x) (x)
#define htole64(x) __builtin_bswap64(x)
#define be64toh(x) (x)
#define le64toh(x) __builtin_bswap64(x)
#else #else
// non-apple systems have their own endian header file #error byte order not supported
#endif
#define __BYTE_ORDER BYTE_ORDER
#define __BIG_ENDIAN BIG_ENDIAN
#define __LITTLE_ENDIAN LITTLE_ENDIAN
#define __PDP_ENDIAN PDP_ENDIAN
/**
* OpenBSD handling
*/
#elif defined(__OpenBSD__)
#include <sys/endian.h>
/**
* NetBSD handling
*/
#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
#include <sys/endian.h>
#define be16toh(x) betoh16(x)
#define le16toh(x) letoh16(x)
#define be32toh(x) betoh32(x)
#define le32toh(x) letoh32(x)
#define be64toh(x) betoh64(x)
#define le64toh(x) letoh64(x)
/**
* Not on apple, and not on windows
*/
#else
// this is the normal linux way of doing things
#include <endian.h> #include <endian.h>
// end of "#if defined(__APPLE__)" // end of "#if defined(__APPLE__)"

View File

@ -91,7 +91,7 @@ public:
*/ */
std::string message() const std::string message() const
{ {
return std::string(_body, _bodySize); return std::string(_body, static_cast<size_t>(_bodySize));
} }
}; };

View File

@ -47,26 +47,28 @@ public:
*/ */
NumericField(ReceivedFrame &frame) NumericField(ReceivedFrame &frame)
{ {
// copy the data from the buffer into the field // The Microsoft Visual Studio compiler thinks that there is an issue
if (!std::is_floating_point<T>::value) // with the following code, so we temporarily disable a specific warning
{ #if defined(_MSC_VER)
// convert value based on internal storage size #pragma warning(push)
switch (sizeof(T)) #pragma warning(disable : 4244)
{ #endif
case 1: _value = frame.nextUint8(); break;
case 2: _value = frame.nextUint16(); break; if (std::is_same<int8_t, typename std::remove_cv<T>::type>::value) _value = frame.nextInt8();
case 4: _value = frame.nextUint32(); break; else if (std::is_same<int16_t, typename std::remove_cv<T>::type>::value) _value = frame.nextInt16();
case 8: _value = frame.nextUint64(); break; else if (std::is_same<int32_t, typename std::remove_cv<T>::type>::value) _value = frame.nextInt32();
} else if (std::is_same<int64_t, typename std::remove_cv<T>::type>::value) _value = frame.nextInt64();
} else if (std::is_same<uint8_t, typename std::remove_cv<T>::type>::value) _value = frame.nextUint8();
else else if (std::is_same<uint16_t, typename std::remove_cv<T>::type>::value) _value = frame.nextUint16();
{ else if (std::is_same<uint32_t, typename std::remove_cv<T>::type>::value) _value = frame.nextUint32();
switch (sizeof(T)) else if (std::is_same<uint64_t, typename std::remove_cv<T>::type>::value) _value = frame.nextUint64();
{ else if (std::is_same<float, typename std::remove_cv<T>::type>::value) _value = frame.nextFloat();
case 4: _value = frame.nextFloat(); break; else if (std::is_same<double, typename std::remove_cv<T>::type>::value) _value = frame.nextDouble();
case 8: _value = frame.nextDouble(); break;
} // re-enable the warning
} #if defined(_MSC_VER)
#pragma warning( pop )
#endif
} }
/** /**
@ -126,15 +128,6 @@ public:
return sizeof(_value); return sizeof(_value);
} }
/**
* Get the maximum allowed value for this field
* @return mixed
*/
constexpr static T max()
{
return std::numeric_limits<T>::max();
}
/** /**
* Write encoded payload to the given buffer. * Write encoded payload to the given buffer.
* @param buffer OutBuffer to write to * @param buffer OutBuffer to write to

View File

@ -225,7 +225,7 @@ Deferred &ChannelImpl::declareExchange(const std::string &name, ExchangeType typ
if (type == ExchangeType::headers)exchangeType = "headers"; if (type == ExchangeType::headers)exchangeType = "headers";
// send declare exchange frame // send declare exchange frame
return push(ExchangeDeclareFrame(_id, name, exchangeType, flags & passive, flags & durable, false, arguments)); return push(ExchangeDeclareFrame(_id, name, exchangeType, (flags & passive) != 0, (flags & durable) != 0, false, arguments));
} }
/** /**
@ -274,7 +274,7 @@ Deferred &ChannelImpl::unbindExchange(const std::string &source, const std::stri
Deferred &ChannelImpl::removeExchange(const std::string &name, int flags) Deferred &ChannelImpl::removeExchange(const std::string &name, int flags)
{ {
// send delete exchange frame // send delete exchange frame
return push(ExchangeDeleteFrame(_id, name, flags & ifunused, false)); return push(ExchangeDeleteFrame(_id, name, (flags & ifunused) != 0, false));
} }
/** /**
@ -289,7 +289,7 @@ Deferred &ChannelImpl::removeExchange(const std::string &name, int flags)
DeferredQueue &ChannelImpl::declareQueue(const std::string &name, int flags, const Table &arguments) DeferredQueue &ChannelImpl::declareQueue(const std::string &name, int flags, const Table &arguments)
{ {
// the frame to send // the frame to send
QueueDeclareFrame frame(_id, name, flags & passive, flags & durable, flags & exclusive, flags & autodelete, false, arguments); QueueDeclareFrame frame(_id, name, (flags & passive) != 0, (flags & durable) != 0, (flags & exclusive) != 0, (flags & autodelete) != 0, false, arguments);
// send the queuedeclareframe // send the queuedeclareframe
auto result = std::make_shared<DeferredQueue>(!send(frame)); auto result = std::make_shared<DeferredQueue>(!send(frame));
@ -388,7 +388,7 @@ DeferredDelete &ChannelImpl::purgeQueue(const std::string &name)
DeferredDelete &ChannelImpl::removeQueue(const std::string &name, int flags) DeferredDelete &ChannelImpl::removeQueue(const std::string &name, int flags)
{ {
// the frame to send // the frame to send
QueueDeleteFrame frame(_id, name, flags & ifunused, flags & ifempty, false); QueueDeleteFrame frame(_id, name, (flags & ifunused) != 0, (flags & ifempty) != 0, false);
// send the frame, and create deferred object // send the frame, and create deferred object
auto deferred = std::make_shared<DeferredDelete>(!send(frame)); auto deferred = std::make_shared<DeferredDelete>(!send(frame));
@ -431,17 +431,17 @@ bool ChannelImpl::publish(const std::string &exchange, const std::string &routin
// the max payload size is the max frame size minus the bytes for headers and trailer // the max payload size is the max frame size minus the bytes for headers and trailer
uint32_t maxpayload = _connection->maxPayload(); uint32_t maxpayload = _connection->maxPayload();
uint32_t bytessent = 0; uint64_t bytessent = 0;
// the buffer // the buffer
const char *data = envelope.body(); const char *data = envelope.body();
uint32_t bytesleft = envelope.bodySize(); uint64_t bytesleft = envelope.bodySize();
// split up the body in multiple frames depending on the max frame size // split up the body in multiple frames depending on the max frame size
while (bytesleft > 0) while (bytesleft > 0)
{ {
// size of this chunk // size of this chunk
uint32_t chunksize = std::min(maxpayload, bytesleft); uint64_t chunksize = std::min(static_cast<uint64_t>(maxpayload), bytesleft);
// send out a body frame // send out a body frame
if (!send(BodyFrame(_id, data + bytessent, chunksize))) return false; if (!send(BodyFrame(_id, data + bytessent, chunksize))) return false;
@ -497,7 +497,7 @@ Deferred &ChannelImpl::setQos(uint16_t prefetchCount, bool global)
DeferredConsumer& ChannelImpl::consume(const std::string &queue, const std::string &tag, int flags, const Table &arguments) DeferredConsumer& ChannelImpl::consume(const std::string &queue, const std::string &tag, int flags, const Table &arguments)
{ {
// the frame to send // the frame to send
BasicConsumeFrame frame(_id, queue, tag, flags & nolocal, flags & noack, flags & exclusive, false, arguments); BasicConsumeFrame frame(_id, queue, tag, (flags & nolocal) != 0, (flags & noack) != 0, (flags & exclusive) != 0, false, arguments);
// send the frame, and create deferred object // send the frame, and create deferred object
auto deferred = std::make_shared<DeferredConsumer>(this, !send(frame)); auto deferred = std::make_shared<DeferredConsumer>(this, !send(frame));
@ -576,7 +576,7 @@ DeferredCancel &ChannelImpl::cancel(const std::string &tag)
DeferredGet &ChannelImpl::get(const std::string &queue, int flags) DeferredGet &ChannelImpl::get(const std::string &queue, int flags)
{ {
// the get frame to send // the get frame to send
BasicGetFrame frame(_id, queue, flags & noack); BasicGetFrame frame(_id, queue, (flags & noack) != 0);
// send the frame, and create deferred object // send the frame, and create deferred object
auto deferred = std::make_shared<DeferredGet>(this, !send(frame)); auto deferred = std::make_shared<DeferredGet>(this, !send(frame));
@ -597,7 +597,7 @@ DeferredGet &ChannelImpl::get(const std::string &queue, int flags)
bool ChannelImpl::ack(uint64_t deliveryTag, int flags) bool ChannelImpl::ack(uint64_t deliveryTag, int flags)
{ {
// send an ack frame // send an ack frame
return send(BasicAckFrame(_id, deliveryTag, flags & multiple)); return send(BasicAckFrame(_id, deliveryTag, (flags & multiple) != 0));
} }
/** /**
@ -612,12 +612,12 @@ bool ChannelImpl::reject(uint64_t deliveryTag, int flags)
if (flags & multiple) if (flags & multiple)
{ {
// send a nack frame // send a nack frame
return send(BasicNackFrame(_id, deliveryTag, true, flags & requeue)); return send(BasicNackFrame(_id, deliveryTag, true, (flags & requeue) != 0));
} }
else else
{ {
// send a reject frame // send a reject frame
return send(BasicRejectFrame(_id, deliveryTag, flags & requeue)); return send(BasicRejectFrame(_id, deliveryTag, (flags & requeue) != 0));
} }
} }
@ -631,7 +631,7 @@ bool ChannelImpl::reject(uint64_t deliveryTag, int flags)
Deferred &ChannelImpl::recover(int flags) Deferred &ChannelImpl::recover(int flags)
{ {
// send a nack frame // send a nack frame
return push(BasicRecoverFrame(_id, flags & requeue)); return push(BasicRecoverFrame(_id, (flags & requeue) != 0));
} }
/** /**

View File

@ -104,13 +104,13 @@ void ConnectionImpl::remove(const ChannelImpl *channel)
* @param buffer buffer to decode * @param buffer buffer to decode
* @return number of bytes that were processed * @return number of bytes that were processed
*/ */
size_t ConnectionImpl::parse(const Buffer &buffer) uint64_t ConnectionImpl::parse(const Buffer &buffer)
{ {
// do not parse if already in an error state // do not parse if already in an error state
if (_state == state_closed) return 0; if (_state == state_closed) return 0;
// number of bytes processed // number of bytes processed
size_t processed = 0; uint64_t processed = 0;
// create a monitor object that checks if the connection still exists // create a monitor object that checks if the connection still exists
Monitor monitor(this); Monitor monitor(this);
@ -130,7 +130,7 @@ size_t ConnectionImpl::parse(const Buffer &buffer)
receivedFrame.process(this); receivedFrame.process(this);
// number of bytes processed // number of bytes processed
size_t bytes = receivedFrame.totalSize(); uint64_t bytes = receivedFrame.totalSize();
// add bytes // add bytes
processed += bytes; processed += bytes;

View File

@ -81,15 +81,21 @@ public:
} }
else else
{ {
// we're going to allocated memory, but that should be a size_t, not a uint64_t
size_t memory = static_cast<size_t>(_bodySize);
// prevent truncation
if (memory < _bodySize) throw std::runtime_error("message is too big for this system");
// it does not yet fit, do we have to allocate? // it does not yet fit, do we have to allocate?
if (!_body) _body = new char[_bodySize]; if (!_body) _body = new char[memory];
_selfAllocated = true; _selfAllocated = true;
// prevent that size is too big // prevent that size is too big
if (size > _bodySize - _received) size = _bodySize - _received; if (size > _bodySize - _received) size = _bodySize - _received;
// append data // append data
memcpy((char *)(_body + _received), buffer, size); memcpy(static_cast<void*>(const_cast<char*>(_body) + _received), buffer, static_cast<size_t>(size));
// we have more data now // we have more data now
_received += size; _received += size;

View File

@ -104,7 +104,9 @@ ReceivedFrame::ReceivedFrame(const Buffer &buffer, uint32_t max) : _buffer(buffe
else else
{ {
// frame is not yet valid // frame is not yet valid
_type = _channel = _payloadSize = 0; _type = 0;
_channel = 0;
_payloadSize = 0;
} }
} }