From 00e075e5517eb85c3fd4e4134f19d87b91ed4bc0 Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Tue, 30 Mar 2010 21:38:31 +0000 Subject: [PATCH] Committing modified version of jwiesemann's patch (see #11223): Fix wxURL copy ctor and assignment: the default ones provided by the compiler are wrong because wxURL uses pointers internally. Also add a test for copy & assignment in URLTestCase. Closes #11223 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63806 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/url.h | 7 +++++-- src/common/url.cpp | 50 ++++++++++++++++++++++++++++++++++++-------- tests/uris/url.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 96 insertions(+), 13 deletions(-) diff --git a/include/wx/url.h b/include/wx/url.h index c74abf302c..71189f1830 100644 --- a/include/wx/url.h +++ b/include/wx/url.h @@ -48,11 +48,13 @@ class WXDLLIMPEXP_NET wxURL : public wxURI { public: wxURL(const wxString& sUrl = wxEmptyString); - wxURL(const wxURI& url); + wxURL(const wxURI& uri); + wxURL(const wxURL& url); virtual ~wxURL(); wxURL& operator = (const wxString& url); - wxURL& operator = (const wxURI& url); + wxURL& operator = (const wxURI& uri); + wxURL& operator = (const wxURL& url); wxProtocol& GetProtocol() { return *m_protocol; } wxURLError GetError() const { return m_error; } @@ -99,6 +101,7 @@ protected: void Init(const wxString&); bool ParseURL(); void CleanData(); + void Free(); bool FetchProtocol(); friend class wxProtoInfo; diff --git a/src/common/url.cpp b/src/common/url.cpp index 918923287a..383a5d088b 100644 --- a/src/common/url.cpp +++ b/src/common/url.cpp @@ -65,9 +65,15 @@ wxURL::wxURL(const wxString& url) : wxURI(url) ParseURL(); } -wxURL::wxURL(const wxURI& url) : wxURI(url) +wxURL::wxURL(const wxURI& uri) : wxURI(uri) { - Init(url.BuildURI()); + Init(uri.BuildURI()); + ParseURL(); +} + +wxURL::wxURL(const wxURL& url) : wxURI(url) +{ + Init(url.GetURL()); ParseURL(); } @@ -102,18 +108,39 @@ void wxURL::Init(const wxString& url) // Assignment // -------------------------------------------------------------- -wxURL& wxURL::operator = (const wxURI& url) +wxURL& wxURL::operator = (const wxString& url) { wxURI::operator = (url); - Init(url.BuildURI()); + Free(); + Init(url); ParseURL(); + return *this; } -wxURL& wxURL::operator = (const wxString& url) + +wxURL& wxURL::operator = (const wxURI& uri) { - wxURI::operator = (url); - Init(url); - ParseURL(); + if (&uri != this) + { + wxURI::operator = (uri); + Free(); + Init(uri.BuildURI()); + ParseURL(); + } + + return *this; +} + +wxURL& wxURL::operator = (const wxURL& url) +{ + if (&url != this) + { + wxURI::operator = (url); + Free(); + Init(url.GetURL()); + ParseURL(); + } + return *this; } @@ -195,7 +222,7 @@ void wxURL::CleanData() } } -wxURL::~wxURL() +void wxURL::Free() { CleanData(); #if wxUSE_PROTOCOL_HTTP @@ -207,6 +234,11 @@ wxURL::~wxURL() #endif } +wxURL::~wxURL() +{ + Free(); +} + // -------------------------------------------------------------- // FetchProtocol // -------------------------------------------------------------- diff --git a/tests/uris/url.cpp b/tests/uris/url.cpp index 8cf9d0961c..7f17ec4625 100644 --- a/tests/uris/url.cpp +++ b/tests/uris/url.cpp @@ -37,9 +37,11 @@ public: private: CPPUNIT_TEST_SUITE( URLTestCase ); CPPUNIT_TEST( GetInputStream ); + CPPUNIT_TEST( CopyAndAssignment ); CPPUNIT_TEST_SUITE_END(); void GetInputStream(); + void CopyAndAssignment(); DECLARE_NO_COPY_CLASS(URLTestCase) }; @@ -68,7 +70,7 @@ void URLTestCase::GetInputStream() wxLogWarning("No network connectivity; skipping the URLTestCase::GetInputStream test unit."); return; } - + wxURL url("http://wxwidgets.org/logo9.jpg"); CPPUNIT_ASSERT_EQUAL(wxURL_NOERR, url.GetError()); @@ -77,8 +79,54 @@ void URLTestCase::GetInputStream() wxMemoryOutputStream ostream; CPPUNIT_ASSERT(in_stream->Read(ostream).GetLastError() == wxSTREAM_EOF); - + // wx logo image currently is 13219 bytes CPPUNIT_ASSERT(ostream.GetSize() == 13219); + + // we have to delete the object created by GetInputStream() + delete in_stream; } +void URLTestCase::CopyAndAssignment() +{ + wxURL url1("http://www.example.org/"); + wxURL url2; + wxURI *puri = &url2; // downcast + + { // Copy constructor + wxURL url3(url1); + CPPUNIT_ASSERT(url1 == url3); + } + { // Constructor for string + wxURL url3(url1.GetURL()); + CPPUNIT_ASSERT(url1 == url3); + } + { // 'Copy' constructor for uri + wxURL url3(*puri); + CPPUNIT_ASSERT(url2 == url3); + } + + // assignment for uri + *puri = url1; + CPPUNIT_ASSERT(url1 == url2); + + // assignment to self through base pointer + *puri = url2; + + // Assignment of string + url1 = wxS("http://www.example2.org/index.html"); + *puri = wxS("http://www.example2.org/index.html"); + CPPUNIT_ASSERT(url1 == url2); + + // Assignment + url1 = wxS(""); + url2 = url1; + CPPUNIT_ASSERT(url1 == url2); + + // assignment to self + url2 = url2; + + // check for destructor (with base pointer!) + puri = new wxURL(); + delete puri; +} -- 2.47.2