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;