diff --git a/CHANGELOG b/CHANGELOG
index 7d595257f..d58478770 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -27,6 +27,8 @@ Release 1.5.2 (2013-03-??)
- added PrintHandler
- renamed DefaultHandler to ParseHandler
- redefined DefaultHandler as typedef to ParseHandler
+- fixed GH #127: Eliminate -Wshadow warnings
+- SocketAddress small object optimization
Release 1.5.1 (2013-01-11)
==========================
diff --git a/Foundation/include/Poco/Timespan.h b/Foundation/include/Poco/Timespan.h
index 9263755b0..fd57e56f5 100644
--- a/Foundation/include/Poco/Timespan.h
+++ b/Foundation/include/Poco/Timespan.h
@@ -63,7 +63,7 @@ public:
/// Creates a Timespan. Useful for creating
/// a Timespan from a struct timeval.
- Timespan(int days, int hours, int minutes, int seconds, int microseconds);
+ Timespan(int days, int hours, int minutes, int seconds, int microSeconds);
/// Creates a Timespan.
Timespan(const Timespan& timespan);
@@ -78,7 +78,7 @@ public:
Timespan& operator = (TimeDiff microseconds);
/// Assignment operator.
- Timespan& assign(int days, int hours, int minutes, int seconds, int microseconds);
+ Timespan& assign(int days, int hours, int minutes, int seconds, int microSeconds);
/// Assigns a new span.
Timespan& assign(long seconds, long microseconds);
@@ -95,22 +95,22 @@ public:
bool operator < (const Timespan& ts) const;
bool operator <= (const Timespan& ts) const;
- bool operator == (TimeDiff microseconds) const;
- bool operator != (TimeDiff microseconds) const;
- bool operator > (TimeDiff microseconds) const;
- bool operator >= (TimeDiff microseconds) const;
- bool operator < (TimeDiff microseconds) const;
- bool operator <= (TimeDiff microseconds) const;
+ bool operator == (TimeDiff microSeconds) const;
+ bool operator != (TimeDiff microSeconds) const;
+ bool operator > (TimeDiff microSeconds) const;
+ bool operator >= (TimeDiff microSeconds) const;
+ bool operator < (TimeDiff microSeconds) const;
+ bool operator <= (TimeDiff microSeconds) const;
Timespan operator + (const Timespan& d) const;
Timespan operator - (const Timespan& d) const;
Timespan& operator += (const Timespan& d);
Timespan& operator -= (const Timespan& d);
- Timespan operator + (TimeDiff microseconds) const;
- Timespan operator - (TimeDiff microseconds) const;
- Timespan& operator += (TimeDiff microseconds);
- Timespan& operator -= (TimeDiff microseconds);
+ Timespan operator + (TimeDiff microSeconds) const;
+ Timespan operator - (TimeDiff microSeconds) const;
+ Timespan& operator += (TimeDiff microSeconds);
+ Timespan& operator -= (TimeDiff microSeconds);
int days() const;
/// Returns the number of days.
@@ -272,39 +272,39 @@ inline bool Timespan::operator <= (const Timespan& ts) const
}
-inline bool Timespan::operator == (TimeDiff microseconds) const
+inline bool Timespan::operator == (TimeDiff microSeconds) const
{
- return _span == microseconds;
+ return _span == microSeconds;
}
-inline bool Timespan::operator != (TimeDiff microseconds) const
+inline bool Timespan::operator != (TimeDiff microSeconds) const
{
- return _span != microseconds;
+ return _span != microSeconds;
}
-inline bool Timespan::operator > (TimeDiff microseconds) const
+inline bool Timespan::operator > (TimeDiff microSeconds) const
{
- return _span > microseconds;
+ return _span > microSeconds;
}
-inline bool Timespan::operator >= (TimeDiff microseconds) const
+inline bool Timespan::operator >= (TimeDiff microSeconds) const
{
- return _span >= microseconds;
+ return _span >= microSeconds;
}
-inline bool Timespan::operator < (TimeDiff microseconds) const
+inline bool Timespan::operator < (TimeDiff microSeconds) const
{
- return _span < microseconds;
+ return _span < microSeconds;
}
-inline bool Timespan::operator <= (TimeDiff microseconds) const
+inline bool Timespan::operator <= (TimeDiff microSeconds) const
{
- return _span <= microseconds;
+ return _span <= microSeconds;
}
diff --git a/Foundation/src/Timespan.cpp b/Foundation/src/Timespan.cpp
index 2d573339d..c8b601606 100644
--- a/Foundation/src/Timespan.cpp
+++ b/Foundation/src/Timespan.cpp
@@ -54,20 +54,20 @@ Timespan::Timespan():
}
-Timespan::Timespan(TimeDiff microseconds):
- _span(microseconds)
+Timespan::Timespan(TimeDiff microSeconds):
+ _span(microSeconds)
{
}
-Timespan::Timespan(long seconds, long microseconds):
- _span(TimeDiff(seconds)*SECONDS + microseconds)
+Timespan::Timespan(long seconds, long microSeconds):
+ _span(TimeDiff(seconds)*SECONDS + microSeconds)
{
}
-Timespan::Timespan(int days, int hours, int minutes, int seconds, int microseconds):
- _span(TimeDiff(microseconds) + TimeDiff(seconds)*SECONDS + TimeDiff(minutes)*MINUTES + TimeDiff(hours)*HOURS + TimeDiff(days)*DAYS)
+Timespan::Timespan(int days, int hours, int minutes, int seconds, int microSeconds):
+ _span(TimeDiff(microSeconds) + TimeDiff(seconds)*SECONDS + TimeDiff(minutes)*MINUTES + TimeDiff(hours)*HOURS + TimeDiff(days)*DAYS)
{
}
@@ -90,23 +90,23 @@ Timespan& Timespan::operator = (const Timespan& timespan)
}
-Timespan& Timespan::operator = (TimeDiff microseconds)
+Timespan& Timespan::operator = (TimeDiff microSeconds)
{
- _span = microseconds;
+ _span = microSeconds;
return *this;
}
-Timespan& Timespan::assign(int days, int hours, int minutes, int seconds, int microseconds)
+Timespan& Timespan::assign(int days, int hours, int minutes, int seconds, int microSeconds)
{
- _span = TimeDiff(microseconds) + TimeDiff(seconds)*SECONDS + TimeDiff(minutes)*MINUTES + TimeDiff(hours)*HOURS + TimeDiff(days)*DAYS;
+ _span = TimeDiff(microSeconds) + TimeDiff(seconds)*SECONDS + TimeDiff(minutes)*MINUTES + TimeDiff(hours)*HOURS + TimeDiff(days)*DAYS;
return *this;
}
-Timespan& Timespan::assign(long seconds, long microseconds)
+Timespan& Timespan::assign(long seconds, long microSeconds)
{
- _span = TimeDiff(seconds)*SECONDS + TimeDiff(microseconds);
+ _span = TimeDiff(seconds)*SECONDS + TimeDiff(microSeconds);
return *this;
}
@@ -143,28 +143,28 @@ Timespan& Timespan::operator -= (const Timespan& d)
}
-Timespan Timespan::operator + (TimeDiff microseconds) const
+Timespan Timespan::operator + (TimeDiff microSeconds) const
{
- return Timespan(_span + microseconds);
+ return Timespan(_span + microSeconds);
}
-Timespan Timespan::operator - (TimeDiff microseconds) const
+Timespan Timespan::operator - (TimeDiff microSeconds) const
{
- return Timespan(_span - microseconds);
+ return Timespan(_span - microSeconds);
}
-Timespan& Timespan::operator += (TimeDiff microseconds)
+Timespan& Timespan::operator += (TimeDiff microSeconds)
{
- _span += microseconds;
+ _span += microSeconds;
return *this;
}
-Timespan& Timespan::operator -= (TimeDiff microseconds)
+Timespan& Timespan::operator -= (TimeDiff microSeconds)
{
- _span -= microseconds;
+ _span -= microSeconds;
return *this;
}
diff --git a/Net/Makefile b/Net/Makefile
index ec808f2f9..dbb2e44d9 100644
--- a/Net/Makefile
+++ b/Net/Makefile
@@ -12,7 +12,7 @@ SHAREDOPT_CXX += -DNet_EXPORTS
objects = \
DNS HTTPResponse HostEntry Socket \
- DatagramSocket HTTPServer IPAddress IPAddressImpl SocketAddress \
+ DatagramSocket HTTPServer IPAddress IPAddressImpl SocketAddress SocketAddress \
HTTPBasicCredentials HTTPCookie HTMLForm MediaType DialogSocket \
DatagramSocketImpl FilePartSource HTTPServerConnection MessageHeader \
HTTPChunkedStream HTTPServerConnectionFactory MulticastSocket SocketStream \
diff --git a/Net/Net_CE_vs90.vcproj b/Net/Net_CE_vs90.vcproj
index f3bc53560..543e54eb1 100644
--- a/Net/Net_CE_vs90.vcproj
+++ b/Net/Net_CE_vs90.vcproj
@@ -448,6 +448,8 @@
RelativePath=".\include\Poco\Net\NetworkInterface.h"/>
+
@@ -469,6 +471,8 @@
RelativePath=".\src\NetworkInterface.cpp"/>
+
+
@@ -386,6 +387,7 @@
+
diff --git a/Net/Net_vs100.vcxproj.filters b/Net/Net_vs100.vcxproj.filters
index 3d2e72cae..b8cdb3188 100644
--- a/Net/Net_vs100.vcxproj.filters
+++ b/Net/Net_vs100.vcxproj.filters
@@ -426,6 +426,9 @@
Messages\Header Files
+
+ NetCore\Header Files
+
@@ -707,6 +710,9 @@
Messages\Source Files
+
+ NetCore\Source Files
+
diff --git a/Net/Net_vs110.vcxproj b/Net/Net_vs110.vcxproj
index 43fc6dbe7..13c540641 100644
--- a/Net/Net_vs110.vcxproj
+++ b/Net/Net_vs110.vcxproj
@@ -281,6 +281,7 @@
+
@@ -382,6 +383,7 @@
+
diff --git a/Net/Net_vs110.vcxproj.filters b/Net/Net_vs110.vcxproj.filters
index b6e78d737..c7093921f 100644
--- a/Net/Net_vs110.vcxproj.filters
+++ b/Net/Net_vs110.vcxproj.filters
@@ -153,6 +153,9 @@
NetCore\Header Files
+
+ NetCore\Header Files
+
NetCore\Header Files
@@ -452,6 +455,9 @@
NetCore\Source Files
+
+ NetCore\Source Files
+
Sockets\Source Files
diff --git a/Net/Net_vs71.vcproj b/Net/Net_vs71.vcproj
index 4ce770675..d2a49bbd2 100644
--- a/Net/Net_vs71.vcproj
+++ b/Net/Net_vs71.vcproj
@@ -380,6 +380,8 @@
RelativePath=".\include\Poco\Net\NetworkInterface.h"/>
+
@@ -401,6 +403,8 @@
RelativePath=".\src\NetworkInterface.cpp"/>
+
+
@@ -422,6 +424,8 @@
RelativePath=".\src\NetworkInterface.cpp"/>
+
+
@@ -421,6 +423,8 @@
RelativePath=".\src\NetworkInterface.cpp"/>
+
+
@@ -374,6 +375,7 @@
+
diff --git a/Net/Net_x64_vs100.vcxproj.filters b/Net/Net_x64_vs100.vcxproj.filters
index f86ba9bfe..c74409b5a 100644
--- a/Net/Net_x64_vs100.vcxproj.filters
+++ b/Net/Net_x64_vs100.vcxproj.filters
@@ -150,6 +150,9 @@
NetCore\Header Files
+
+ NetCore\Header Files
+
NetCore\Header Files
@@ -449,6 +452,9 @@
NetCore\Source Files
+
+ NetCore\Source Files
+
Sockets\Source Files
diff --git a/Net/Net_x64_vs110.vcxproj b/Net/Net_x64_vs110.vcxproj
index f68514ef3..3bca8900b 100644
--- a/Net/Net_x64_vs110.vcxproj
+++ b/Net/Net_x64_vs110.vcxproj
@@ -279,6 +279,7 @@
+
@@ -380,6 +381,7 @@
+
diff --git a/Net/Net_x64_vs110.vcxproj.filters b/Net/Net_x64_vs110.vcxproj.filters
index 3f97fdc73..91c3bc29f 100644
--- a/Net/Net_x64_vs110.vcxproj.filters
+++ b/Net/Net_x64_vs110.vcxproj.filters
@@ -153,6 +153,9 @@
NetCore\Header Files
+
+ NetCore\Header Files
+
NetCore\Header Files
@@ -452,6 +455,9 @@
NetCore\Source Files
+
+ NetCore\Source Files
+
Sockets\Source Files
diff --git a/Net/Net_x64_vs90.vcproj b/Net/Net_x64_vs90.vcproj
index 9e42a53fa..27e8df3d2 100644
--- a/Net/Net_x64_vs90.vcproj
+++ b/Net/Net_x64_vs90.vcproj
@@ -405,6 +405,8 @@
RelativePath=".\include\Poco\Net\NetworkInterface.h"/>
+
@@ -426,6 +428,8 @@
RelativePath=".\src\NetworkInterface.cpp"/>
+
~IPAddressImpl();
+}
+
+
inline IPAddress::Ptr IPAddress::pImpl() const
{
return reinterpret_cast(const_cast(_memory));
diff --git a/Net/include/Poco/Net/IPAddressImpl.h b/Net/include/Poco/Net/IPAddressImpl.h
index d1e9ddfb9..9c3bc00b7 100644
--- a/Net/include/Poco/Net/IPAddressImpl.h
+++ b/Net/include/Poco/Net/IPAddressImpl.h
@@ -61,7 +61,10 @@ public:
,IPv6
#endif
};
+
+ virtual ~IPAddressImpl();
+ virtual IPAddressImpl* clone() const = 0;
virtual std::string toString() const = 0;
virtual poco_socklen_t length() const = 0;
virtual const void* addr() const = 0;
@@ -85,9 +88,6 @@ public:
virtual void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet) = 0;
virtual unsigned prefixLength() const = 0;
- virtual IPAddressImpl* clone() const = 0;
- virtual ~IPAddressImpl();
-
protected:
IPAddressImpl();
diff --git a/Net/include/Poco/Net/SocketAddress.h b/Net/include/Poco/Net/SocketAddress.h
index c4c569bd4..9b7f82f24 100644
--- a/Net/include/Poco/Net/SocketAddress.h
+++ b/Net/include/Poco/Net/SocketAddress.h
@@ -41,8 +41,7 @@
#include "Poco/Net/Net.h"
-#include "Poco/Net/SocketDefs.h"
-#include "Poco/Net/IPAddress.h"
+#include "Poco/Net/SocketAddressImpl.h"
namespace Poco {
@@ -50,7 +49,6 @@ namespace Net {
class IPAddress;
-class SocketAddressImpl;
class Net_API SocketAddress
@@ -63,20 +61,20 @@ public:
SocketAddress();
/// Creates a wildcard (all zero) IPv4 SocketAddress.
- SocketAddress(const IPAddress& host, Poco::UInt16 port);
+ SocketAddress(const IPAddress& hostAddress, Poco::UInt16 portNumber);
/// Creates a SocketAddress from an IP address and given port number.
SocketAddress(Poco::UInt16 port);
/// Creates a SocketAddress with unspecified (wildcard) IP address
/// and given port number.
- SocketAddress(const std::string& host, Poco::UInt16 port);
+ SocketAddress(const std::string& hostAddress, Poco::UInt16 portNumber);
/// Creates a SocketAddress from an IP address and given port number.
///
/// The IP address must either be a domain name, or it must
/// be in dotted decimal (IPv4) or hex string (IPv6) format.
- SocketAddress(const std::string& host, const std::string& port);
+ SocketAddress(const std::string& hostAddress, const std::string& portNumber);
/// Creates a SocketAddress from an IP address and the
/// service name or port number.
///
@@ -106,12 +104,9 @@ public:
~SocketAddress();
/// Destroys the SocketAddress.
- SocketAddress& operator = (const SocketAddress& addr);
+ SocketAddress& operator = (const SocketAddress& socketAddress);
/// Assigns another SocketAddress.
- void swap(SocketAddress& addr);
- /// Swaps the SocketAddress with another one.
-
IPAddress host() const;
/// Returns the host IP address.
@@ -133,9 +128,9 @@ public:
IPAddress::Family family() const;
/// Returns the address family of the host's address.
- bool operator < (const SocketAddress& addr) const;
- bool operator == (const SocketAddress& addr) const;
- bool operator != (const SocketAddress& addr) const;
+ bool operator < (const SocketAddress& socketAddress) const;
+ bool operator == (const SocketAddress& socketAddress) const;
+ bool operator != (const SocketAddress& socketAddress) const;
enum
{
@@ -149,21 +144,35 @@ public:
};
protected:
- void init(const IPAddress& host, Poco::UInt16 port);
- void init(const std::string& host, Poco::UInt16 port);
+ void init(const IPAddress& hostAddress, Poco::UInt16 portNumber);
+ void init(const std::string& hostAddress, Poco::UInt16 portNumber);
Poco::UInt16 resolveService(const std::string& service);
private:
- SocketAddressImpl* _pImpl;
+ typedef Poco::Net::Impl::SocketAddressImpl Impl;
+ typedef Impl* Ptr;
+
+ Ptr pImpl() const;
+ void destruct();
+
+ char _memory[sizeof(Poco::Net::Impl::IPv6SocketAddressImpl)];
};
//
// inlines
//
-inline void swap(SocketAddress& a1, SocketAddress& a2)
+
+
+inline void SocketAddress::destruct()
{
- a1.swap(a2);
+ pImpl()->~SocketAddressImpl();
+}
+
+
+inline SocketAddress::Ptr SocketAddress::pImpl() const
+{
+ return reinterpret_cast(const_cast(_memory));
}
@@ -173,15 +182,15 @@ inline IPAddress::Family SocketAddress::family() const
}
-inline bool SocketAddress::operator == (const SocketAddress& addr) const
+inline bool SocketAddress::operator == (const SocketAddress& socketAddress) const
{
- return host() == addr.host() && port() == addr.port();
+ return host() == socketAddress.host() && port() == socketAddress.port();
}
-inline bool SocketAddress::operator != (const SocketAddress& addr) const
+inline bool SocketAddress::operator != (const SocketAddress& socketAddress) const
{
- return host() != addr.host() || port() != addr.port();
+ return host() != socketAddress.host() || port() != socketAddress.port();
}
diff --git a/Net/include/Poco/Net/SocketAddressImpl.h b/Net/include/Poco/Net/SocketAddressImpl.h
new file mode 100644
index 000000000..5c91233b7
--- /dev/null
+++ b/Net/include/Poco/Net/SocketAddressImpl.h
@@ -0,0 +1,198 @@
+//
+// SocketAddressImpl.h
+//
+// $Id: //poco/1.4/Net/include/Poco/Net/SocketAddressImpl.h#2 $
+//
+// Library: Net
+// Package: NetCore
+// Module: SocketAddressImpl
+//
+// Definition of the SocketAddressImpl class.
+//
+// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+//
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+
+
+#ifndef Net_SocketAddressImpl_INCLUDED
+#define Net_SocketAddressImpl_INCLUDED
+
+
+#include "Poco/Net/Net.h"
+#include "Poco/Net/SocketDefs.h"
+#include "Poco/Net/IPAddress.h"
+
+
+namespace Poco {
+namespace Net {
+namespace Impl {
+
+
+class Net_API SocketAddressImpl
+{
+public:
+ virtual ~SocketAddressImpl();
+
+ virtual IPAddress host() const = 0;
+ virtual UInt16 port() const = 0;
+ virtual poco_socklen_t length() const = 0;
+ virtual const struct sockaddr* addr() const = 0;
+ virtual int af() const = 0;
+
+protected:
+ SocketAddressImpl();
+
+private:
+ SocketAddressImpl(const SocketAddressImpl&);
+ SocketAddressImpl& operator = (const SocketAddressImpl&);
+};
+
+
+class Net_API IPv4SocketAddressImpl: public SocketAddressImpl
+{
+public:
+ IPv4SocketAddressImpl();
+
+ IPv4SocketAddressImpl(const struct sockaddr_in* addr);
+
+ IPv4SocketAddressImpl(const void* addr, UInt16 port);
+
+ IPAddress host() const;
+
+ UInt16 port() const;
+
+ poco_socklen_t length() const;
+
+ const struct sockaddr* addr() const;
+
+ int af() const;
+
+private:
+ struct sockaddr_in _addr;
+};
+
+
+//
+// inlines
+//
+
+inline IPAddress IPv4SocketAddressImpl::host() const
+{
+ return IPAddress(&_addr.sin_addr, sizeof(_addr.sin_addr));
+}
+
+
+inline UInt16 IPv4SocketAddressImpl::port() const
+{
+ return _addr.sin_port;
+}
+
+
+inline poco_socklen_t IPv4SocketAddressImpl::length() const
+{
+ return sizeof(_addr);
+}
+
+
+inline const struct sockaddr* IPv4SocketAddressImpl::addr() const
+{
+ return reinterpret_cast(&_addr);
+}
+
+
+inline int IPv4SocketAddressImpl::af() const
+{
+ return _addr.sin_family;
+}
+
+
+#if defined(POCO_HAVE_IPv6)
+
+
+class Net_API IPv6SocketAddressImpl: public SocketAddressImpl
+{
+public:
+ IPv6SocketAddressImpl(const struct sockaddr_in6* addr);
+
+ IPv6SocketAddressImpl(const void* addr, UInt16 port);
+
+ IPv6SocketAddressImpl(const void* addr, UInt16 port, UInt32 scope);
+
+ IPAddress host() const;
+
+ UInt16 port() const;
+
+ poco_socklen_t length() const;
+
+ const struct sockaddr* addr() const;
+
+ int af() const;
+
+private:
+ struct sockaddr_in6 _addr;
+};
+
+
+//
+// inlines
+//
+
+inline IPAddress IPv6SocketAddressImpl::host() const
+{
+ return IPAddress(&_addr.sin6_addr, sizeof(_addr.sin6_addr), _addr.sin6_scope_id);
+}
+
+
+inline UInt16 IPv6SocketAddressImpl::port() const
+{
+ return _addr.sin6_port;
+}
+
+
+inline poco_socklen_t IPv6SocketAddressImpl::length() const
+{
+ return sizeof(_addr);
+}
+
+
+inline const struct sockaddr* IPv6SocketAddressImpl::addr() const
+{
+ return reinterpret_cast(&_addr);
+}
+
+
+inline int IPv6SocketAddressImpl::af() const
+{
+ return _addr.sin6_family;
+}
+
+
+#endif //POCO_HAVE_IPv6
+
+
+} } } // namespace Poco::Net::Impl
+
+
+#endif // Net_SocketAddressImpl_INCLUDED
diff --git a/Net/src/IPAddress.cpp b/Net/src/IPAddress.cpp
index 8b7f7940a..b0cf8487b 100644
--- a/Net/src/IPAddress.cpp
+++ b/Net/src/IPAddress.cpp
@@ -221,7 +221,7 @@ IPAddress::IPAddress(const struct sockaddr& sockaddr)
IPAddress::~IPAddress()
{
- pImpl()->~IPAddressImpl();
+ destruct();
}
@@ -229,6 +229,7 @@ IPAddress& IPAddress::operator = (const IPAddress& addr)
{
if (&addr != this)
{
+ destruct();
if (addr.family() == IPAddress::IPv4)
new (_memory) IPv4AddressImpl(addr.addr());
else
diff --git a/Net/src/SocketAddress.cpp b/Net/src/SocketAddress.cpp
index ae4bcb20d..827a6f2d3 100644
--- a/Net/src/SocketAddress.cpp
+++ b/Net/src/SocketAddress.cpp
@@ -50,6 +50,9 @@ using Poco::NumberParser;
using Poco::NumberFormatter;
using Poco::UInt16;
using Poco::InvalidArgumentException;
+using Poco::Net::Impl::SocketAddressImpl;
+using Poco::Net::Impl::IPv4SocketAddressImpl;
+using Poco::Net::Impl::IPv6SocketAddressImpl;
namespace Poco {
@@ -65,151 +68,6 @@ struct AFLT
};
-//
-// SocketAddressImpl
-//
-
-
-class SocketAddressImpl: public RefCountedObject
-{
-public:
- virtual IPAddress host() const = 0;
- virtual UInt16 port() const = 0;
- virtual poco_socklen_t length() const = 0;
- virtual const struct sockaddr* addr() const = 0;
- virtual int af() const = 0;
-
-protected:
- SocketAddressImpl()
- {
- }
-
- virtual ~SocketAddressImpl()
- {
- }
-
-private:
- SocketAddressImpl(const SocketAddressImpl&);
- SocketAddressImpl& operator = (const SocketAddressImpl&);
-};
-
-
-class IPv4SocketAddressImpl: public SocketAddressImpl
-{
-public:
- IPv4SocketAddressImpl()
- {
- std::memset(&_addr, 0, sizeof(_addr));
- _addr.sin_family = AF_INET;
- poco_set_sin_len(&_addr);
- }
-
- IPv4SocketAddressImpl(const struct sockaddr_in* addr)
- {
- std::memcpy(&_addr, addr, sizeof(_addr));
- }
-
- IPv4SocketAddressImpl(const void* addr, UInt16 port)
- {
- std::memset(&_addr, 0, sizeof(_addr));
- _addr.sin_family = AF_INET;
- std::memcpy(&_addr.sin_addr, addr, sizeof(_addr.sin_addr));
- _addr.sin_port = port;
- }
-
- IPAddress host() const
- {
- return IPAddress(&_addr.sin_addr, sizeof(_addr.sin_addr));
- }
-
- UInt16 port() const
- {
- return _addr.sin_port;
- }
-
- poco_socklen_t length() const
- {
- return sizeof(_addr);
- }
-
- const struct sockaddr* addr() const
- {
- return reinterpret_cast(&_addr);
- }
-
- int af() const
- {
- return _addr.sin_family;
- }
-
-private:
- struct sockaddr_in _addr;
-};
-
-
-#if defined(POCO_HAVE_IPv6)
-
-
-class IPv6SocketAddressImpl: public SocketAddressImpl
-{
-public:
- IPv6SocketAddressImpl(const struct sockaddr_in6* addr)
- {
- std::memcpy(&_addr, addr, sizeof(_addr));
- }
-
- IPv6SocketAddressImpl(const void* addr, UInt16 port)
- {
- std::memset(&_addr, 0, sizeof(_addr));
- _addr.sin6_family = AF_INET6;
- poco_set_sin6_len(&_addr);
- std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
- _addr.sin6_port = port;
- }
-
- IPv6SocketAddressImpl(const void* addr, UInt16 port, UInt32 scope)
- {
- std::memset(&_addr, 0, sizeof(_addr));
- _addr.sin6_family = AF_INET6;
- poco_set_sin6_len(&_addr);
- std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
- _addr.sin6_port = port;
- _addr.sin6_scope_id = scope;
- }
-
- IPAddress host() const
- {
- return IPAddress(&_addr.sin6_addr, sizeof(_addr.sin6_addr), _addr.sin6_scope_id);
- }
-
- UInt16 port() const
- {
- return _addr.sin6_port;
- }
-
- poco_socklen_t length() const
- {
- return sizeof(_addr);
- }
-
- const struct sockaddr* addr() const
- {
- return reinterpret_cast(&_addr);
- }
-
- int af() const
- {
- return _addr.sin6_family;
- }
-
-private:
- struct sockaddr_in6 _addr;
-};
-
-
-#endif // POCO_HAVE_IPv6
-
-
//
// SocketAddress
//
@@ -217,31 +75,31 @@ private:
SocketAddress::SocketAddress()
{
- _pImpl = new IPv4SocketAddressImpl;
+ new (_memory) IPv4SocketAddressImpl;
}
-SocketAddress::SocketAddress(const IPAddress& addr, Poco::UInt16 port)
+SocketAddress::SocketAddress(const IPAddress& hostAddress, Poco::UInt16 portNumber)
{
- init(addr, port);
+ init(hostAddress, portNumber);
}
-SocketAddress::SocketAddress(Poco::UInt16 port)
+SocketAddress::SocketAddress(Poco::UInt16 portNumber)
{
- init(IPAddress(), port);
+ init(IPAddress(), portNumber);
}
-SocketAddress::SocketAddress(const std::string& addr, Poco::UInt16 port)
+SocketAddress::SocketAddress(const std::string& hostAddress, Poco::UInt16 portNumber)
{
- init(addr, port);
+ init(hostAddress, portNumber);
}
-SocketAddress::SocketAddress(const std::string& addr, const std::string& port)
+SocketAddress::SocketAddress(const std::string& hostAddress, const std::string& portNumber)
{
- init(addr, resolveService(port));
+ init(hostAddress, resolveService(portNumber));
}
@@ -274,20 +132,22 @@ SocketAddress::SocketAddress(const std::string& hostAndPort)
}
-SocketAddress::SocketAddress(const SocketAddress& addr)
+SocketAddress::SocketAddress(const SocketAddress& socketAddress)
{
- _pImpl = addr._pImpl;
- _pImpl->duplicate();
+ if (socketAddress.family() == IPAddress::IPv4)
+ new (_memory) IPv4SocketAddressImpl(reinterpret_cast(socketAddress.addr()));
+ else
+ new (_memory) IPv6SocketAddressImpl(reinterpret_cast(socketAddress.addr()));
}
-SocketAddress::SocketAddress(const struct sockaddr* addr, poco_socklen_t length)
+SocketAddress::SocketAddress(const struct sockaddr* sockAddr, poco_socklen_t length)
{
if (length == sizeof(struct sockaddr_in))
- _pImpl = new IPv4SocketAddressImpl(reinterpret_cast(addr));
+ new (_memory) IPv4SocketAddressImpl(reinterpret_cast(sockAddr));
#if defined(POCO_HAVE_IPv6)
else if (length == sizeof(struct sockaddr_in6))
- _pImpl = new IPv6SocketAddressImpl(reinterpret_cast(addr));
+ new (_memory) IPv6SocketAddressImpl(reinterpret_cast(sockAddr));
#endif
else throw Poco::InvalidArgumentException("Invalid address length passed to SocketAddress()");
}
@@ -295,63 +155,59 @@ SocketAddress::SocketAddress(const struct sockaddr* addr, poco_socklen_t length)
SocketAddress::~SocketAddress()
{
- _pImpl->release();
+ destruct();
}
-bool SocketAddress::operator < (const SocketAddress& addr) const
+bool SocketAddress::operator < (const SocketAddress& socketAddress) const
{
- if (family() < addr.family()) return true;
- if (host() < addr.host()) return true;
- return (port() < addr.port());
+ if (family() < socketAddress.family()) return true;
+ if (host() < socketAddress.host()) return true;
+ return (port() < socketAddress.port());
}
-SocketAddress& SocketAddress::operator = (const SocketAddress& addr)
+SocketAddress& SocketAddress::operator = (const SocketAddress& socketAddress)
{
- if (&addr != this)
+ if (&socketAddress != this)
{
- _pImpl->release();
- _pImpl = addr._pImpl;
- _pImpl->duplicate();
+ destruct();
+ if (socketAddress.family() == IPAddress::IPv4)
+ new (_memory) IPv4SocketAddressImpl(reinterpret_cast(socketAddress.addr()));
+ else
+ new (_memory) IPv6SocketAddressImpl(reinterpret_cast(socketAddress.addr()));
}
return *this;
}
-void SocketAddress::swap(SocketAddress& addr)
-{
- std::swap(_pImpl, addr._pImpl);
-}
-
-
IPAddress SocketAddress::host() const
{
- return _pImpl->host();
+ return pImpl()->host();
}
Poco::UInt16 SocketAddress::port() const
{
- return ntohs(_pImpl->port());
+ return ntohs(pImpl()->port());
}
poco_socklen_t SocketAddress::length() const
{
- return _pImpl->length();
+ return pImpl()->length();
}
const struct sockaddr* SocketAddress::addr() const
{
- return _pImpl->addr();
+ return pImpl()->addr();
}
int SocketAddress::af() const
{
- return _pImpl->af();
+ return pImpl()->af();
}
@@ -371,28 +227,28 @@ std::string SocketAddress::toString() const
}
-void SocketAddress::init(const IPAddress& host, Poco::UInt16 port)
+void SocketAddress::init(const IPAddress& hostAddress, Poco::UInt16 portNumber)
{
- if (host.family() == IPAddress::IPv4)
- _pImpl = new IPv4SocketAddressImpl(host.addr(), htons(port));
+ if (hostAddress.family() == IPAddress::IPv4)
+ new (_memory) IPv4SocketAddressImpl(hostAddress.addr(), htons(portNumber));
#if defined(POCO_HAVE_IPv6)
- else if (host.family() == IPAddress::IPv6)
- _pImpl = new IPv6SocketAddressImpl(host.addr(), htons(port), host.scope());
+ else if (hostAddress.family() == IPAddress::IPv6)
+ new (_memory) IPv6SocketAddressImpl(hostAddress.addr(), htons(portNumber), hostAddress.scope());
#endif
else throw Poco::NotImplementedException("unsupported IP address family");
}
-void SocketAddress::init(const std::string& host, Poco::UInt16 port)
+void SocketAddress::init(const std::string& hostAddress, Poco::UInt16 portNumber)
{
IPAddress ip;
- if (IPAddress::tryParse(host, ip))
+ if (IPAddress::tryParse(hostAddress, ip))
{
- init(ip, port);
+ init(ip, portNumber);
}
else
{
- HostEntry he = DNS::hostByName(host);
+ HostEntry he = DNS::hostByName(hostAddress);
HostEntry::AddressList addresses = he.addresses();
if (addresses.size() > 0)
{
@@ -400,9 +256,9 @@ void SocketAddress::init(const std::string& host, Poco::UInt16 port)
// if we get both IPv4 and IPv6 addresses, prefer IPv4
std::sort(addresses.begin(), addresses.end(), AFLT());
#endif
- init(addresses[0], port);
+ init(addresses[0], portNumber);
}
- else throw HostNotFoundException("No address found for host", host);
+ else throw HostNotFoundException("No address found for host", hostAddress);
}
}
diff --git a/Net/src/SocketAddressImpl.cpp b/Net/src/SocketAddressImpl.cpp
new file mode 100644
index 000000000..1cc4a542e
--- /dev/null
+++ b/Net/src/SocketAddressImpl.cpp
@@ -0,0 +1,142 @@
+//
+// SocketAddressImpl.cpp
+//
+// $Id: //poco/1.4/Net/src/SocketAddressImpl.cpp#5 $
+//
+// Library: Net
+// Package: NetCore
+// Module: SocketAddressImpl
+//
+// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+//
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+//
+
+
+#include "Poco/Net/SocketAddressImpl.h"
+#include "Poco/Net/SocketDefs.h"
+/*
+#include "Poco/Net/IPAddress.h"
+#include "Poco/Net/NetException.h"
+#include "Poco/Net/DNS.h"
+#include "Poco/RefCountedObject.h"
+#include "Poco/NumberParser.h"
+#include "Poco/NumberFormatter.h"
+#include
+#include
+
+
+using Poco::RefCountedObject;
+using Poco::NumberParser;
+using Poco::NumberFormatter;
+using Poco::UInt16;
+using Poco::InvalidArgumentException;
+*/
+
+namespace Poco {
+namespace Net {
+namespace Impl {
+
+//
+// SocketAddressImpl
+//
+
+
+SocketAddressImpl::SocketAddressImpl()
+{
+}
+
+
+SocketAddressImpl::~SocketAddressImpl()
+{
+}
+
+
+//
+// IPv4SocketAddressImpl
+//
+
+
+IPv4SocketAddressImpl::IPv4SocketAddressImpl()
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+ _addr.sin_family = AF_INET;
+ poco_set_sin_len(&_addr);
+}
+
+
+IPv4SocketAddressImpl::IPv4SocketAddressImpl(const struct sockaddr_in* addr)
+{
+ std::memcpy(&_addr, addr, sizeof(_addr));
+}
+
+
+IPv4SocketAddressImpl::IPv4SocketAddressImpl(const void* addr, UInt16 port)
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+ _addr.sin_family = AF_INET;
+ std::memcpy(&_addr.sin_addr, addr, sizeof(_addr.sin_addr));
+ _addr.sin_port = port;
+}
+
+
+#if defined(POCO_HAVE_IPv6)
+
+
+//
+// IPv6SocketAddressImpl
+//
+
+
+IPv6SocketAddressImpl::IPv6SocketAddressImpl(const struct sockaddr_in6* addr)
+{
+ std::memcpy(&_addr, addr, sizeof(_addr));
+}
+
+
+IPv6SocketAddressImpl::IPv6SocketAddressImpl(const void* addr, UInt16 port)
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+ _addr.sin6_family = AF_INET6;
+ poco_set_sin6_len(&_addr);
+ std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
+ _addr.sin6_port = port;
+}
+
+
+IPv6SocketAddressImpl::IPv6SocketAddressImpl(const void* addr, UInt16 port, UInt32 scope)
+{
+ std::memset(&_addr, 0, sizeof(_addr));
+ _addr.sin6_family = AF_INET6;
+ poco_set_sin6_len(&_addr);
+ std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
+ _addr.sin6_port = port;
+ _addr.sin6_scope_id = scope;
+}
+
+
+#endif // POCO_HAVE_IPv6
+
+
+} } } // namespace Poco::Net::Impl
diff --git a/Net/testsuite/src/DatagramSocketTest.cpp b/Net/testsuite/src/DatagramSocketTest.cpp
index 60313694e..137e6011c 100644
--- a/Net/testsuite/src/DatagramSocketTest.cpp
+++ b/Net/testsuite/src/DatagramSocketTest.cpp
@@ -66,10 +66,10 @@ void DatagramSocketTest::testEcho()
{
UDPEchoServer echoServer;
DatagramSocket ss;
+ char buffer[256];
ss.connect(SocketAddress("localhost", echoServer.port()));
int n = ss.sendBytes("hello", 5);
assert (n == 5);
- char buffer[256];
n = ss.receiveBytes(buffer, sizeof(buffer));
assert (n == 5);
assert (std::string(buffer, n) == "hello");
diff --git a/Net/testsuite/src/UDPEchoServer.h b/Net/testsuite/src/UDPEchoServer.h
index 2518810e8..32a1504b6 100644
--- a/Net/testsuite/src/UDPEchoServer.h
+++ b/Net/testsuite/src/UDPEchoServer.h
@@ -66,7 +66,7 @@ public:
void run();
/// Does the work.
-
+
private:
Poco::Net::DatagramSocket _socket;
Poco::Thread _thread;