mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-23 08:31:43 +02:00
gcc alignment and warning suppression
This commit is contained in:
@@ -120,22 +120,29 @@ template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
// MSVC requires special handling here.
|
||||
#ifndef _MSC_VER
|
||||
|
||||
#ifdef POCO_COMPILER_CLANG
|
||||
|
||||
#if __has_feature(cxx_alignas)
|
||||
#define POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
|
||||
template <> struct AlignedCharArrayImpl<x> \
|
||||
{ \
|
||||
char alignas(x) aligned; \
|
||||
}
|
||||
#define POCO_HAVE_ALIGNMENT
|
||||
#endif
|
||||
|
||||
#elif defined(__GNUC__) || defined(__IBM_ATTRIBUTES)
|
||||
|
||||
#define POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
|
||||
template <> struct AlignedCharArrayImpl<x> \
|
||||
{ \
|
||||
char aligned __attribute__((aligned(x))); \
|
||||
}
|
||||
#else
|
||||
# error No supported align as directive.
|
||||
#define POCO_HAVE_ALIGNMENT
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(1);
|
||||
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(2);
|
||||
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(4);
|
||||
@@ -151,6 +158,7 @@ template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8192);
|
||||
|
||||
#undef POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
|
||||
#endif // POCO_HAVE_ALIGNMENT
|
||||
|
||||
#else // _MSC_VER
|
||||
|
||||
@@ -180,8 +188,16 @@ template <size_t Alignment> struct AlignedCharArrayImpl;
|
||||
// Any larger and MSVC complains.
|
||||
#undef POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
|
||||
|
||||
#define POCO_HAVE_ALIGNMENT
|
||||
#endif // _MSC_VER
|
||||
|
||||
// POCO_HAVE_ALIGNMENT will be defined on the pre-C++11 platforms/compilers where
|
||||
// it can be reliably determined and used. Uncomment the line below to explicitly
|
||||
// disable use of alignment even for those platforms.
|
||||
// #undef POCO_HAVE_ALIGNMENT
|
||||
|
||||
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
|
||||
template <typename T1, typename T2 = char, typename T3 = char, typename T4 = char>
|
||||
union AlignedCharArrayUnion
|
||||
@@ -221,8 +237,10 @@ public:
|
||||
|
||||
private:
|
||||
Poco::AlignedCharArrayImpl<AlignOf<AlignerImpl>::Alignment> _nonceMember;
|
||||
|
||||
};
|
||||
|
||||
#endif // POCO_HAVE_ALIGNMENT
|
||||
|
||||
} // namespace Poco
|
||||
|
||||
|
@@ -75,6 +75,29 @@
|
||||
#define __THROW
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//
|
||||
// GCC diagnostics enable/disable by Patrick Horgan, see
|
||||
// http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html
|
||||
// use example: GCC_DIAG_OFF(unused-variable)
|
||||
//
|
||||
#if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402
|
||||
#define GCC_DIAG_STR(s) #s
|
||||
#define GCC_DIAG_JOINSTR(x,y) GCC_DIAG_STR(x ## y)
|
||||
#define GCC_DIAG_DO_PRAGMA(x) _Pragma (#x)
|
||||
#define GCC_DIAG_PRAGMA(x) GCC_DIAG_DO_PRAGMA(GCC diagnostic x)
|
||||
#if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406
|
||||
#define GCC_DIAG_OFF(x) GCC_DIAG_PRAGMA(push) \
|
||||
GCC_DIAG_PRAGMA(ignored GCC_DIAG_JOINSTR(-W,x))
|
||||
#define GCC_DIAG_ON(x) GCC_DIAG_PRAGMA(pop)
|
||||
#else
|
||||
#define GCC_DIAG_OFF(x) GCC_DIAG_PRAGMA(ignored GCC_DIAG_JOINSTR(-W,x))
|
||||
#define GCC_DIAG_ON(x) GCC_DIAG_PRAGMA(warning GCC_DIAG_JOINSTR(-W,x))
|
||||
#endif
|
||||
#else
|
||||
#define GCC_DIAG_OFF(x)
|
||||
#define GCC_DIAG_ON(x)
|
||||
#endif
|
||||
#endif // __GNUC__
|
||||
|
||||
|
||||
|
@@ -40,6 +40,7 @@
|
||||
extern "C"
|
||||
{
|
||||
#include "pcre_config.h"
|
||||
GCC_DIAG_OFF(unused-function) // pcre_memmove unused function warning
|
||||
#include "pcre_internal.h"
|
||||
}
|
||||
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include "Poco/Bugcheck.h"
|
||||
#include <vector>
|
||||
|
||||
GCC_DIAG_OFF(unused-but-set-variable)
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1400
|
||||
#pragma warning(disable:4800)//forcing value to bool 'true' or 'false'
|
||||
#endif
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include "Poco/Exception.h"
|
||||
#include "TestPlugin.h"
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
using Poco::ClassLoader;
|
||||
using Poco::Manifest;
|
||||
|
@@ -38,7 +38,7 @@
|
||||
|
||||
#include "Poco/Foundation.h"
|
||||
#include "CppUnit/TestCase.h"
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
|
||||
class ClassLoaderTest: public CppUnit::TestCase
|
||||
{
|
||||
|
@@ -51,6 +51,7 @@
|
||||
#include <vector>
|
||||
#include <cstring>
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
using Poco::Bugcheck;
|
||||
using Poco::Exception;
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include "Poco/Timespan.h"
|
||||
#include "Poco/Exception.h"
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
using Poco::Timestamp;
|
||||
using Poco::DateTime;
|
||||
|
@@ -41,6 +41,7 @@
|
||||
#include <fstream>
|
||||
#include <set>
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
using Poco::File;
|
||||
using Poco::TemporaryFile;
|
||||
|
@@ -37,6 +37,7 @@
|
||||
#include "Poco/Exception.h"
|
||||
#include <map>
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
using Poco::HashMap;
|
||||
|
||||
|
@@ -37,6 +37,9 @@
|
||||
#include "Poco/NumberFormatter.h"
|
||||
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
|
||||
using namespace Poco;
|
||||
|
||||
|
||||
|
@@ -37,6 +37,7 @@
|
||||
#include "Poco/Exception.h"
|
||||
#include <map>
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
using Poco::ListMap;
|
||||
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include "Poco/PatternFormatter.h"
|
||||
#include "Poco/AutoPtr.h"
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
using Poco::LoggingRegistry;
|
||||
using Poco::Channel;
|
||||
|
@@ -36,6 +36,8 @@
|
||||
#include "Poco/NamedTuple.h"
|
||||
#include "Poco/Exception.h"
|
||||
|
||||
GCC_DIAG_OFF(unused-but-set-variable)
|
||||
|
||||
using Poco::NamedTuple;
|
||||
using Poco::Int8;
|
||||
using Poco::UInt8;
|
||||
@@ -52,6 +54,7 @@ using Poco::UInt32;
|
||||
using Poco::NotFoundException;
|
||||
using Poco::InvalidArgumentException;
|
||||
|
||||
|
||||
NamedTuplesTest::NamedTuplesTest(const std::string& name): CppUnit::TestCase(name)
|
||||
{
|
||||
}
|
||||
|
@@ -37,6 +37,9 @@
|
||||
#include "Poco/NumberFormatter.h"
|
||||
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
|
||||
using namespace Poco;
|
||||
|
||||
|
||||
|
@@ -36,6 +36,7 @@
|
||||
#include "Poco/StringTokenizer.h"
|
||||
#include "Poco/Exception.h"
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
|
||||
using Poco::StringTokenizer;
|
||||
using Poco::RangeException;
|
||||
|
@@ -37,6 +37,8 @@
|
||||
#include "Poco/TypeList.h"
|
||||
#include "Poco/Void.h"
|
||||
#include <iostream>
|
||||
|
||||
GCC_DIAG_OFF(unused-but-set-variable)
|
||||
#if defined(_MSC_VER)
|
||||
# pragma warning(disable:4800) // forcing value to bool 'true' or 'false' on MSVC 71
|
||||
#endif
|
||||
|
@@ -42,6 +42,7 @@
|
||||
#include <utility>
|
||||
|
||||
|
||||
GCC_DIAG_OFF(unused-variable)
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1400
|
||||
#pragma warning(disable:4800)//forcing value to bool 'true' or 'false'
|
||||
#endif
|
||||
|
@@ -41,6 +41,7 @@
|
||||
#include "Poco/Exception.h"
|
||||
#include "CppUnit/TestCase.h"
|
||||
|
||||
GCC_DIAG_OFF(unused-but-set-variable)
|
||||
|
||||
class VarTest: public CppUnit::TestCase
|
||||
{
|
||||
|
@@ -43,9 +43,12 @@
|
||||
#include "Poco/Net/Net.h"
|
||||
#include "Poco/Net/SocketDefs.h"
|
||||
#include "Poco/Net/IPAddressImpl.h"
|
||||
#include "Poco/AutoPtr.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <vector>
|
||||
#ifdef POCO_ENABLE_CPP11
|
||||
#include <type_traits>
|
||||
#define POCO_HAVE_ALIGNMENT
|
||||
#else
|
||||
#include "Poco/Alignment.h"
|
||||
#endif
|
||||
@@ -389,12 +392,31 @@ public:
|
||||
|
||||
private:
|
||||
typedef Poco::Net::Impl::IPAddressImpl Impl;
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
typedef Impl* Ptr;
|
||||
#else
|
||||
typedef Poco::AutoPtr<Impl> Ptr;
|
||||
#endif
|
||||
|
||||
Ptr pImpl() const;
|
||||
|
||||
void newIPv4(const void* hostAddr);
|
||||
|
||||
void newIPv6(const void* hostAddr);
|
||||
|
||||
void newIPv6(const void* hostAddr, Poco::UInt32 scope);
|
||||
|
||||
void newIPv4(unsigned prefix);
|
||||
|
||||
void newIPv6(unsigned prefix);
|
||||
|
||||
void newIPv4();
|
||||
|
||||
void newIPv6();
|
||||
|
||||
void destruct();
|
||||
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
char* storage();
|
||||
|
||||
#ifdef POCO_ENABLE_CPP11
|
||||
@@ -404,31 +426,114 @@ private:
|
||||
union
|
||||
{
|
||||
char buffer[sz];
|
||||
private:
|
||||
AlignerType aligner;
|
||||
}
|
||||
#else // !POCO_ENABLE_CPP11
|
||||
AlignedCharArrayUnion <Poco::Net::Impl::IPv6AddressImpl>
|
||||
#endif // POCO_ENABLE_CPP11
|
||||
_memory;
|
||||
#else // !POCO_HAVE_ALIGNMENT
|
||||
Ptr _pImpl;
|
||||
#endif // POCO_HAVE_ALIGNMENT
|
||||
};
|
||||
|
||||
|
||||
inline void IPAddress::destruct()
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
pImpl()->~IPAddressImpl();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline IPAddress::Ptr IPAddress::pImpl() const
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
return reinterpret_cast<Ptr>(const_cast<char *>(_memory.buffer));
|
||||
#else
|
||||
if (_pImpl) return _pImpl;
|
||||
throw NullPointerException("IPaddress implementation pointer is NULL.");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void IPAddress::newIPv4(const void* hostAddr)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv4AddressImpl(hostAddr);
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv4AddressImpl(hostAddr);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void IPAddress::newIPv6(const void* hostAddr)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv6AddressImpl(hostAddr);
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv6AddressImpl(hostAddr);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void IPAddress::newIPv6(const void* hostAddr, Poco::UInt32 scope)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv6AddressImpl(hostAddr, scope);
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv6AddressImpl(hostAddr, scope);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void IPAddress::newIPv4(unsigned prefix)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv4AddressImpl(prefix);
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv4AddressImpl(prefix);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void IPAddress::newIPv6(unsigned prefix)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv6AddressImpl(prefix);
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv6AddressImpl(prefix);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void IPAddress::newIPv4()
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv4AddressImpl;
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv4AddressImpl;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void IPAddress::newIPv6()
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv6AddressImpl;
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv6AddressImpl;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
inline char* IPAddress::storage()
|
||||
{
|
||||
return _memory.buffer;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
BinaryWriter& operator << (BinaryWriter& writer, const IPAddress& value);
|
||||
|
@@ -42,6 +42,9 @@
|
||||
|
||||
#include "Poco/Net/Net.h"
|
||||
#include "Poco/Net/SocketDefs.h"
|
||||
#ifndef POCO_HAVE_ALIGNMENT
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#endif
|
||||
#include <vector>
|
||||
|
||||
|
||||
@@ -51,6 +54,9 @@ namespace Impl {
|
||||
|
||||
|
||||
class IPAddressImpl
|
||||
#ifndef POCO_HAVE_ALIGNMENT
|
||||
: public Poco::RefCountedObject
|
||||
#endif
|
||||
{
|
||||
public:
|
||||
enum Family
|
||||
|
@@ -150,26 +150,45 @@ protected:
|
||||
|
||||
private:
|
||||
typedef Poco::Net::Impl::SocketAddressImpl Impl;
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
typedef Impl* Ptr;
|
||||
#else
|
||||
typedef Poco::AutoPtr<Impl> Ptr;
|
||||
#endif
|
||||
|
||||
Ptr pImpl() const;
|
||||
|
||||
void newIPv4();
|
||||
|
||||
void newIPv4(const sockaddr_in*);
|
||||
|
||||
void newIPv4(const IPAddress& hostAddress, Poco::UInt16 portNumber);
|
||||
|
||||
void newIPv6(const sockaddr_in6*);
|
||||
|
||||
void newIPv6(const IPAddress& hostAddress, Poco::UInt16 portNumber);
|
||||
|
||||
void destruct();
|
||||
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
char* storage();
|
||||
|
||||
#ifdef POCO_ENABLE_CPP11
|
||||
static const unsigned sz = sizeof(Poco::Net::Impl::IPv6SocketAddressImpl);
|
||||
typedef std::aligned_storage<sz>::type AlignerType;
|
||||
union
|
||||
{
|
||||
std::aligned_storage<sz> a;
|
||||
char buffer[sz];
|
||||
private:
|
||||
AlignerType aligner;
|
||||
}
|
||||
#else // !POCO_ENABLE_CPP11
|
||||
AlignedCharArrayUnion <Poco::Net::Impl::IPv6SocketAddressImpl,
|
||||
Poco::Net::Impl::IPv4SocketAddressImpl>
|
||||
AlignedCharArrayUnion <Poco::Net::Impl::IPv6SocketAddressImpl>
|
||||
#endif // POCO_ENABLE_CPP11
|
||||
_memory;
|
||||
#else // !POCO_HAVE_ALIGNMENT
|
||||
Ptr _pImpl;
|
||||
#endif // POCO_HAVE_ALIGNMENT
|
||||
};
|
||||
|
||||
|
||||
@@ -180,19 +199,71 @@ private:
|
||||
|
||||
inline void SocketAddress::destruct()
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
pImpl()->~SocketAddressImpl();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline SocketAddress::Ptr SocketAddress::pImpl() const
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
return reinterpret_cast<Ptr>(const_cast<char *>(_memory.buffer));
|
||||
#else
|
||||
if (_pImpl) return _pImpl;
|
||||
throw Poco::NullPointerException("Pointer to SocketAddress implementation is NULL.");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline char* SocketAddress::storage()
|
||||
inline void SocketAddress::newIPv4()
|
||||
{
|
||||
return _memory.buffer;
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv4SocketAddressImpl;
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void SocketAddress::newIPv4(const sockaddr_in* sockAddr)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv4SocketAddressImpl(sockAddr);
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl(sockAddr);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void SocketAddress::newIPv4(const IPAddress& hostAddress, Poco::UInt16 portNumber)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv4SocketAddressImpl(hostAddress.addr(), htons(portNumber));
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv4SocketAddressImpl(hostAddress.addr(), htons(portNumber));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
inline void SocketAddress::newIPv6(const sockaddr_in6* sockAddr)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv6SocketAddressImpl(sockAddr);
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv6SocketAddressImpl(sockAddr);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void SocketAddress::newIPv6(const IPAddress& hostAddress, Poco::UInt16 portNumber)
|
||||
{
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
new (storage()) Poco::Net::Impl::IPv6SocketAddressImpl(hostAddress.addr(), htons(portNumber), hostAddress.scope());
|
||||
#else
|
||||
_pImpl = new Poco::Net::Impl::IPv6SocketAddressImpl(hostAddress.addr(), htons(portNumber), hostAddress.scope());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -202,6 +273,14 @@ inline IPAddress::Family SocketAddress::family() const
|
||||
}
|
||||
|
||||
|
||||
#ifdef POCO_HAVE_ALIGNMENT
|
||||
inline char* SocketAddress::storage()
|
||||
{
|
||||
return _memory.buffer;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
inline bool SocketAddress::operator == (const SocketAddress& socketAddress) const
|
||||
{
|
||||
return host() == socketAddress.host() && port() == socketAddress.port();
|
||||
|
@@ -43,7 +43,9 @@
|
||||
#include "Poco/Net/Net.h"
|
||||
#include "Poco/Net/SocketDefs.h"
|
||||
#include "Poco/Net/IPAddress.h"
|
||||
|
||||
#ifndef POCO_HAVE_ALIGNMENT
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#endif
|
||||
|
||||
namespace Poco {
|
||||
namespace Net {
|
||||
@@ -51,6 +53,9 @@ namespace Impl {
|
||||
|
||||
|
||||
class Net_API SocketAddressImpl
|
||||
#ifndef POCO_HAVE_ALIGNMENT
|
||||
: public Poco::RefCountedObject
|
||||
#endif
|
||||
{
|
||||
public:
|
||||
virtual ~SocketAddressImpl();
|
||||
|
@@ -64,26 +64,26 @@ namespace Net {
|
||||
|
||||
IPAddress::IPAddress()
|
||||
{
|
||||
new (storage()) IPv4AddressImpl();
|
||||
newIPv4();
|
||||
}
|
||||
|
||||
|
||||
IPAddress::IPAddress(const IPAddress& addr)
|
||||
{
|
||||
if (addr.family() == IPv4)
|
||||
new (storage()) IPv4AddressImpl(addr.addr());
|
||||
newIPv4(addr.addr());
|
||||
else
|
||||
new (storage()) IPv6AddressImpl(addr.addr());
|
||||
newIPv6(addr.addr());
|
||||
}
|
||||
|
||||
|
||||
IPAddress::IPAddress(Family family)
|
||||
{
|
||||
if (family == IPv4)
|
||||
new (storage()) IPv4AddressImpl();
|
||||
newIPv4();
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (family == IPv6)
|
||||
new (storage()) IPv6AddressImpl();
|
||||
newIPv6();
|
||||
#endif
|
||||
else
|
||||
throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
|
||||
@@ -95,14 +95,14 @@ IPAddress::IPAddress(const std::string& addr)
|
||||
IPv4AddressImpl empty4 = IPv4AddressImpl();
|
||||
if (addr.empty() || trim(addr) == "0.0.0.0")
|
||||
{
|
||||
new (storage()) IPv4AddressImpl(empty4.addr());
|
||||
newIPv4(empty4.addr());
|
||||
return;
|
||||
}
|
||||
|
||||
IPv4AddressImpl addr4(IPv4AddressImpl::parse(addr));
|
||||
if (addr4 != empty4)
|
||||
{
|
||||
new (storage()) IPv4AddressImpl(addr4.addr());
|
||||
newIPv4(addr4.addr());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -110,14 +110,14 @@ IPAddress::IPAddress(const std::string& addr)
|
||||
IPv6AddressImpl empty6 = IPv6AddressImpl();
|
||||
if (addr.empty() || trim(addr) == "::")
|
||||
{
|
||||
new (storage()) IPv6AddressImpl(empty6.addr());
|
||||
newIPv6(empty6.addr());
|
||||
return;
|
||||
}
|
||||
|
||||
IPv6AddressImpl addr6(IPv6AddressImpl::parse(addr));
|
||||
if (addr6 != IPv6AddressImpl())
|
||||
{
|
||||
new (storage()) IPv6AddressImpl(addr6.addr());
|
||||
newIPv6(addr6.addr());
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
@@ -131,14 +131,14 @@ IPAddress::IPAddress(const std::string& addr, Family family)
|
||||
if (family == IPv4)
|
||||
{
|
||||
IPv4AddressImpl addr4(IPv4AddressImpl::parse(addr));
|
||||
new (storage()) IPv4AddressImpl(addr4.addr());
|
||||
newIPv4(addr4.addr());
|
||||
return;
|
||||
}
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (family == IPv6)
|
||||
{
|
||||
IPv6AddressImpl addr6(IPv6AddressImpl::parse(addr));
|
||||
new (storage()) IPv6AddressImpl(addr6.addr());
|
||||
newIPv6(addr6.addr());
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
@@ -147,12 +147,15 @@ IPAddress::IPAddress(const std::string& addr, Family family)
|
||||
|
||||
|
||||
IPAddress::IPAddress(const void* addr, poco_socklen_t length)
|
||||
#ifndef POCO_HAVE_ALIGNMENT
|
||||
: _pImpl(0)
|
||||
#endif
|
||||
{
|
||||
if (length == sizeof(struct in_addr))
|
||||
new (storage()) IPv4AddressImpl(addr);
|
||||
newIPv4(addr);
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (length == sizeof(struct in6_addr))
|
||||
new (storage()) IPv6AddressImpl(addr);
|
||||
newIPv6(addr);
|
||||
#endif
|
||||
else throw Poco::InvalidArgumentException("Invalid address length passed to IPAddress()");
|
||||
}
|
||||
@@ -161,10 +164,10 @@ IPAddress::IPAddress(const void* addr, poco_socklen_t length)
|
||||
IPAddress::IPAddress(const void* addr, poco_socklen_t length, Poco::UInt32 scope)
|
||||
{
|
||||
if (length == sizeof(struct in_addr))
|
||||
new (storage()) IPv4AddressImpl(addr);
|
||||
newIPv4(addr);
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (length == sizeof(struct in6_addr))
|
||||
new (storage()) IPv6AddressImpl(addr, scope);
|
||||
newIPv6(addr, scope);
|
||||
#endif
|
||||
else throw Poco::InvalidArgumentException("Invalid address length passed to IPAddress()");
|
||||
}
|
||||
@@ -175,13 +178,13 @@ IPAddress::IPAddress(unsigned prefix, Family family)
|
||||
if (family == IPv4)
|
||||
{
|
||||
if (prefix <= 32)
|
||||
new (storage()) IPv4AddressImpl(prefix);
|
||||
newIPv4(prefix);
|
||||
}
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (family == IPv6)
|
||||
{
|
||||
if (prefix <= 128)
|
||||
new (storage()) IPv6AddressImpl(prefix);
|
||||
newIPv6(prefix);
|
||||
}
|
||||
#endif
|
||||
else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
|
||||
@@ -191,13 +194,16 @@ IPAddress::IPAddress(unsigned prefix, Family family)
|
||||
|
||||
#if defined(_WIN32)
|
||||
IPAddress::IPAddress(const SOCKET_ADDRESS& socket_address)
|
||||
#ifndef POCO_HAVE_ALIGNMENT
|
||||
: _pImpl(0)
|
||||
#endif
|
||||
{
|
||||
ADDRESS_FAMILY family = socket_address.lpSockaddr->sa_family;
|
||||
if (family == AF_INET)
|
||||
new (storage()) IPv4AddressImpl(&reinterpret_cast<const struct sockaddr_in*>(socket_address.lpSockaddr)->sin_addr);
|
||||
newIPv4(&reinterpret_cast<const struct sockaddr_in*>(socket_address.lpSockaddr)->sin_addr);
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (family == AF_INET6)
|
||||
new (storage()) IPv6AddressImpl(&reinterpret_cast<const struct sockaddr_in6*>(socket_address.lpSockaddr)->sin6_addr,
|
||||
newIPv6(&reinterpret_cast<const struct sockaddr_in6*>(socket_address.lpSockaddr)->sin6_addr,
|
||||
reinterpret_cast<const struct sockaddr_in6*>(socket_address.lpSockaddr)->sin6_scope_id);
|
||||
#endif
|
||||
else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
|
||||
@@ -209,10 +215,10 @@ IPAddress::IPAddress(const struct sockaddr& sockaddr)
|
||||
{
|
||||
unsigned short family = sockaddr.sa_family;
|
||||
if (family == AF_INET)
|
||||
new (storage()) IPv4AddressImpl(&reinterpret_cast<const struct sockaddr_in*>(&sockaddr)->sin_addr);
|
||||
newIPv4(&reinterpret_cast<const struct sockaddr_in*>(&sockaddr)->sin_addr);
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (family == AF_INET6)
|
||||
new (storage()) IPv6AddressImpl(&reinterpret_cast<const struct sockaddr_in6*>(&sockaddr)->sin6_addr,
|
||||
newIPv6(&reinterpret_cast<const struct sockaddr_in6*>(&sockaddr)->sin6_addr,
|
||||
reinterpret_cast<const struct sockaddr_in6*>(&sockaddr)->sin6_scope_id);
|
||||
#endif
|
||||
else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to IPAddress()");
|
||||
@@ -231,9 +237,9 @@ IPAddress& IPAddress::operator = (const IPAddress& addr)
|
||||
{
|
||||
destruct();
|
||||
if (addr.family() == IPAddress::IPv4)
|
||||
new (storage()) IPv4AddressImpl(addr.addr());
|
||||
newIPv4(addr.addr());
|
||||
else
|
||||
new (storage()) IPv6AddressImpl(addr.addr());
|
||||
newIPv6(addr.addr());
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
@@ -545,15 +551,14 @@ bool IPAddress::tryParse(const std::string& addr, IPAddress& result)
|
||||
IPv4AddressImpl impl4(IPv4AddressImpl::parse(addr));
|
||||
if (impl4 != IPv4AddressImpl())
|
||||
{
|
||||
|
||||
new (result.storage()) IPv4AddressImpl(impl4.addr());
|
||||
result.newIPv4(impl4.addr());
|
||||
return true;
|
||||
}
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
IPv6AddressImpl impl6(IPv6AddressImpl::parse(addr));
|
||||
if (impl6 != IPv6AddressImpl())
|
||||
{
|
||||
new (result.storage()) IPv6AddressImpl(impl6.addr());
|
||||
result.newIPv6(impl6.addr());
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
@@ -75,7 +75,7 @@ struct AFLT
|
||||
|
||||
SocketAddress::SocketAddress()
|
||||
{
|
||||
new (storage()) IPv4SocketAddressImpl;
|
||||
newIPv4();
|
||||
}
|
||||
|
||||
|
||||
@@ -135,19 +135,19 @@ SocketAddress::SocketAddress(const std::string& hostAndPort)
|
||||
SocketAddress::SocketAddress(const SocketAddress& socketAddress)
|
||||
{
|
||||
if (socketAddress.family() == IPAddress::IPv4)
|
||||
new (storage()) IPv4SocketAddressImpl(reinterpret_cast<const sockaddr_in*>(socketAddress.addr()));
|
||||
newIPv4(reinterpret_cast<const sockaddr_in*>(socketAddress.addr()));
|
||||
else
|
||||
new (storage()) IPv6SocketAddressImpl(reinterpret_cast<const sockaddr_in6*>(socketAddress.addr()));
|
||||
newIPv6(reinterpret_cast<const sockaddr_in6*>(socketAddress.addr()));
|
||||
}
|
||||
|
||||
|
||||
SocketAddress::SocketAddress(const struct sockaddr* sockAddr, poco_socklen_t length)
|
||||
{
|
||||
if (length == sizeof(struct sockaddr_in))
|
||||
new (storage()) IPv4SocketAddressImpl(reinterpret_cast<const struct sockaddr_in*>(sockAddr));
|
||||
newIPv4(reinterpret_cast<const struct sockaddr_in*>(sockAddr));
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (length == sizeof(struct sockaddr_in6))
|
||||
new (storage()) IPv6SocketAddressImpl(reinterpret_cast<const struct sockaddr_in6*>(sockAddr));
|
||||
newIPv6(reinterpret_cast<const struct sockaddr_in6*>(sockAddr));
|
||||
#endif
|
||||
else throw Poco::InvalidArgumentException("Invalid address length passed to SocketAddress()");
|
||||
}
|
||||
@@ -175,9 +175,9 @@ SocketAddress& SocketAddress::operator = (const SocketAddress& socketAddress)
|
||||
{
|
||||
destruct();
|
||||
if (socketAddress.family() == IPAddress::IPv4)
|
||||
new (storage()) IPv4SocketAddressImpl(reinterpret_cast<const sockaddr_in*>(socketAddress.addr()));
|
||||
newIPv4(reinterpret_cast<const sockaddr_in*>(socketAddress.addr()));
|
||||
else
|
||||
new (storage()) IPv6SocketAddressImpl(reinterpret_cast<const sockaddr_in6*>(socketAddress.addr()));
|
||||
newIPv6(reinterpret_cast<const sockaddr_in6*>(socketAddress.addr()));
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
@@ -232,10 +232,10 @@ std::string SocketAddress::toString() const
|
||||
void SocketAddress::init(const IPAddress& hostAddress, Poco::UInt16 portNumber)
|
||||
{
|
||||
if (hostAddress.family() == IPAddress::IPv4)
|
||||
new (storage()) IPv4SocketAddressImpl(hostAddress.addr(), htons(portNumber));
|
||||
newIPv4(hostAddress, portNumber);
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
else if (hostAddress.family() == IPAddress::IPv6)
|
||||
new (storage()) IPv6SocketAddressImpl(hostAddress.addr(), htons(portNumber), hostAddress.scope());
|
||||
newIPv6(hostAddress, portNumber);
|
||||
#endif
|
||||
else throw Poco::NotImplementedException("unsupported IP address family");
|
||||
}
|
||||
|
@@ -104,6 +104,7 @@ void DatagramSocketTest::testBroadcast()
|
||||
int n = ss.sendTo("hello", 5, sa);
|
||||
// not all socket implementations fail if broadcast option is not set
|
||||
// fail ("broadcast option not set - must throw");
|
||||
n = n + 1; // to silence gcc
|
||||
}
|
||||
catch (IOException&)
|
||||
{
|
||||
|
@@ -247,7 +247,7 @@ void HTTPClientSessionTest::testKeepAlive()
|
||||
assert (response.getChunkedTransferEncoding());
|
||||
assert (response.getKeepAlive());
|
||||
std::ostringstream ostr3;
|
||||
std::streamsize n = StreamCopier::copyStream(rs3, ostr3);
|
||||
StreamCopier::copyStream(rs3, ostr3);
|
||||
assert (ostr3.str() == HTTPTestServer::LARGE_BODY);
|
||||
|
||||
request.setMethod(HTTPRequest::HTTP_HEAD);
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include "Poco/Net/NetException.h"
|
||||
#include <sstream>
|
||||
|
||||
GCC_DIAG_OFF(parentheses)
|
||||
|
||||
using Poco::Net::HTTPResponse;
|
||||
using Poco::Net::HTTPMessage;
|
||||
|
@@ -78,7 +78,7 @@ namespace
|
||||
|
||||
std::istream& istr = request.stream();
|
||||
std::ostream& ostr = response.send();
|
||||
std::streamsize n = StreamCopier::copyStream(istr, ostr);
|
||||
StreamCopier::copyStream(istr, ostr);
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -122,6 +122,7 @@ void HTTPStreamFactoryTest::testError()
|
||||
{
|
||||
std::istream* pStr = factory.open(uri);
|
||||
fail("not found - must throw");
|
||||
pStr = pStr + 0; // to silence gcc
|
||||
}
|
||||
catch (HTTPException& exc)
|
||||
{
|
||||
|
Reference in New Issue
Block a user