Index: net/url_request/url_request_file_dir_job.cc |
diff --git a/net/url_request/url_request_file_dir_job.cc b/net/url_request/url_request_file_dir_job.cc |
index 553add8ee6c1e9eaa91881cb68d4e2c648e69a10..23b671e2d3a3202be79559fdba41fd838674d21b 100644 |
--- a/net/url_request/url_request_file_dir_job.cc |
+++ b/net/url_request/url_request_file_dir_job.cc |
@@ -12,6 +12,7 @@ |
#include "base/time.h" |
#include "googleurl/src/gurl.h" |
#include "net/base/io_buffer.h" |
+#include "net/base/net_errors.h" |
#include "net/base/net_util.h" |
#include "net/url_request/url_request.h" |
@@ -19,11 +20,10 @@ |
#include <sys/stat.h> |
#endif |
-using std::string; |
- |
URLRequestFileDirJob::URLRequestFileDirJob(net::URLRequest* request, |
const FilePath& dir_path) |
- : net::URLRequestJob(request), |
+ : URLRequestJob(request), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(lister_(dir_path, this)), |
dir_path_(dir_path), |
canceled_(false), |
list_complete_(false), |
@@ -34,8 +34,7 @@ URLRequestFileDirJob::URLRequestFileDirJob(net::URLRequest* request, |
} |
URLRequestFileDirJob::~URLRequestFileDirJob() { |
- DCHECK(read_pending_ == false); |
- DCHECK(lister_ == NULL); |
+ DCHECK(!read_pending_); |
} |
void URLRequestFileDirJob::Start() { |
@@ -48,36 +47,22 @@ void URLRequestFileDirJob::Start() { |
} |
void URLRequestFileDirJob::StartAsync() { |
- DCHECK(!lister_); |
- |
- // TODO(willchan): This is stupid. We should tell |lister_| not to call us |
- // back. Fix this stupidity. |
- |
- // AddRef so that *this* cannot be destroyed while the lister_ |
- // is trying to feed us data. |
- |
- AddRef(); |
- lister_ = new net::DirectoryLister(dir_path_, this); |
- lister_->Start(); |
+ lister_.Start(); |
NotifyHeadersComplete(); |
} |
void URLRequestFileDirJob::Kill() { |
- if (canceled_) |
- return; |
- |
- canceled_ = true; |
- |
- // Don't call CloseLister or dispatch an error to the net::URLRequest because |
- // we want OnListDone to be called to also write the error to the output |
- // stream. OnListDone will notify the net::URLRequest at this time. |
- if (lister_) |
- lister_->Cancel(); |
- |
- net::URLRequestJob::Kill(); |
+ if (!is_done() && !list_complete_) { |
+ lister_.Cancel(); |
+ read_pending_ = false; |
+ list_complete_ = true; |
+ } |
+ DCHECK(!read_pending_); |
+ DCHECK(list_complete_); |
method_factory_.RevokeAll(); |
+ URLRequestJob::Kill(); |
} |
bool URLRequestFileDirJob::ReadRawData(net::IOBuffer* buf, int buf_size, |
@@ -99,19 +84,18 @@ bool URLRequestFileDirJob::ReadRawData(net::IOBuffer* buf, int buf_size, |
return false; |
} |
-bool URLRequestFileDirJob::GetMimeType(string* mime_type) const { |
+bool URLRequestFileDirJob::GetMimeType(std::string* mime_type) const { |
*mime_type = "text/html"; |
return true; |
} |
-bool URLRequestFileDirJob::GetCharset(string* charset) { |
+bool URLRequestFileDirJob::GetCharset(std::string* charset) { |
// All the filenames are converted to UTF-8 before being added. |
*charset = "utf-8"; |
return true; |
} |
-void URLRequestFileDirJob::OnListFile( |
- const net::DirectoryLister::DirectoryListerData& data) { |
+void URLRequestFileDirJob::OnListFile(const net::DirectoryLister::Data& data) { |
// We wait to write out the header until we get the first file, so that we |
// can catch errors from DirectoryLister and show an error page. |
if (!wrote_header_) { |
@@ -158,28 +142,13 @@ void URLRequestFileDirJob::OnListFile( |
} |
void URLRequestFileDirJob::OnListDone(int error) { |
- CloseLister(); |
- |
- if (canceled_) { |
- read_pending_ = false; |
- // No need for NotifyCanceled() since canceled_ is set inside Kill(). |
- } else if (error) { |
+ if (error != net::OK) { |
read_pending_ = false; |
NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, error)); |
} else { |
list_complete_ = true; |
CompleteRead(); |
} |
- |
- Release(); // The Lister is finished; may delete *this* |
-} |
- |
-void URLRequestFileDirJob::CloseLister() { |
- if (lister_) { |
- lister_->Cancel(); |
- lister_->set_delegate(NULL); |
- lister_ = NULL; |
- } |
} |
bool URLRequestFileDirJob::FillReadBuffer(char *buf, int buf_size, |