diff --git a/include/wx/webrequest.h b/include/wx/webrequest.h index c7a430f2c2..85fe58fb1f 100644 --- a/include/wx/webrequest.h +++ b/include/wx/webrequest.h @@ -154,10 +154,6 @@ public: wxString AsString() const; - bool Init(); - - void Finalize(); - virtual wxString GetFileName() const; protected: @@ -166,15 +162,24 @@ protected: wxWebResponse(wxWebRequest& request); + // Called from derived class ctor to finish initialization which can't be + // performed in ctor itself as it needs to use pure virtual method. + void Init(); + void* GetDataBuffer(size_t sizeNeeded); void ReportDataReceived(size_t sizeReceived); private: + // Called by wxWebRequest only. + void Finalize(); + wxMemoryBuffer m_readBuffer; mutable wxFFile m_file; mutable wxScopedPtr m_stream; + friend class wxWebRequest; + wxDECLARE_NO_COPY_CLASS(wxWebResponse); }; diff --git a/src/common/webrequest.cpp b/src/common/webrequest.cpp index 564ea457a5..6f9641127c 100644 --- a/src/common/webrequest.cpp +++ b/src/common/webrequest.cpp @@ -260,7 +260,7 @@ wxWebResponse::~wxWebResponse() wxRemoveFile(m_file.GetName()); } -bool wxWebResponse::Init() +void wxWebResponse::Init() { if ( m_request.GetStorage() == wxWebRequest::Storage_File ) { @@ -274,15 +274,13 @@ bool wxWebResponse::Init() GetContentLength() > freeSpace ) { m_request.SetState(wxWebRequest::State_Failed, _("Not enough free disk space for download.")); - return false; + return; } } tmpPrefix.SetName("wxd"); wxFileName::CreateTempFileName(tmpPrefix.GetFullPath(), &m_file); } - - return true; } wxString wxWebResponse::GetMimeType() const diff --git a/src/common/webrequest_curl.cpp b/src/common/webrequest_curl.cpp index b7280ffb20..6c04d1eeee 100644 --- a/src/common/webrequest_curl.cpp +++ b/src/common/webrequest_curl.cpp @@ -63,6 +63,8 @@ wxWebResponseCURL::wxWebResponseCURL(wxWebRequest& request) : { curl_easy_setopt(GetHandle(), CURLOPT_WRITEDATA, static_cast(this)); curl_easy_setopt(GetHandle(), CURLOPT_HEADERDATA, static_cast(this)); + + Init(); } size_t wxWebResponseCURL::WriteData(void* buffer, size_t size) @@ -192,7 +194,6 @@ void wxWebRequestCURL::Start() return; m_response.reset(new wxWebResponseCURL(*this)); - m_response->Init(); if ( m_dataSize ) { diff --git a/src/msw/webrequest_winhttp.cpp b/src/msw/webrequest_winhttp.cpp index ce45266be0..ef8bfad462 100644 --- a/src/msw/webrequest_winhttp.cpp +++ b/src/msw/webrequest_winhttp.cpp @@ -220,8 +220,11 @@ void wxWebRequestWinHTTP::CreateResponse() if ( ::WinHttpReceiveResponse(m_request, NULL) ) { m_response.reset(new wxWebResponseWinHTTP(*this)); - if ( !m_response->Init() ) + // wxWebResponseWinHTTP ctor could have changed the state if its + // initialization failed, so check for this. + if ( GetState() == State_Failed ) return; + int status = m_response->GetStatus(); if ( status == 401 || status == 407) { @@ -364,6 +367,8 @@ wxWebResponseWinHTTP::wxWebResponseWinHTTP(wxWebRequestWinHTTP& request): if ( contentLengthStr.empty() || !contentLengthStr.ToLongLong(&m_contentLength) ) m_contentLength = -1; + + Init(); } wxString wxWebResponseWinHTTP::GetURL() const diff --git a/src/osx/webrequest_urlsession.mm b/src/osx/webrequest_urlsession.mm index 96e5e59045..f0e0eb40ea 100644 --- a/src/osx/webrequest_urlsession.mm +++ b/src/osx/webrequest_urlsession.mm @@ -140,7 +140,6 @@ void wxWebRequestURLSession::Start() [session.GetDelegate() registerRequest:this task:m_task]; m_response.reset(new wxWebResponseURLSession(*this, m_task)); - m_response->Init(); SetState(State_Active); [m_task resume]; @@ -191,6 +190,8 @@ wxWebResponseURLSession::wxWebResponseURLSession(wxWebRequest& request, WX_NSURL wxWebResponse(request) { m_task = [task retain]; + + Init(); } wxWebResponseURLSession::~wxWebResponseURLSession()