1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#ifndef NET_URL_REQUEST_URL_REQUEST_FILE_DIR_JOB_H_
63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#define NET_URL_REQUEST_URL_REQUEST_FILE_DIR_JOB_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_path.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/task.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/directory_lister.h"
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/url_request/url_request_job.h"
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace net {
183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass URLRequestFileDirJob
203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  : public URLRequestJob,
213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    public DirectoryLister::DirectoryListerDelegate {
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  URLRequestFileDirJob(URLRequest* request, const FilePath& dir_path);
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool list_complete() const { return list_complete_; }
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void StartAsync();
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Overridden from URLRequestJob:
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void Start();
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void Kill();
323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual bool ReadRawData(IOBuffer* buf, int buf_size, int *bytes_read);
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool GetMimeType(std::string* mime_type) const;
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool GetCharset(std::string* charset);
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Overridden from DirectoryLister::DirectoryListerDelegate:
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void OnListFile(
383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      const DirectoryLister::DirectoryListerData& data);
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void OnListDone(int error);
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~URLRequestFileDirJob();
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void CloseLister();
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // When we have data and a read has been pending, this function
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // will fill the response buffer and notify the request
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // appropriately.
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void CompleteRead();
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Fills a buffer with the output.
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool FillReadBuffer(char *buf, int buf_size, int *bytes_read);
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_refptr<DirectoryLister> lister_;
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_path_;
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string data_;
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool canceled_;
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Indicates whether we have the complete list of the dir
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool list_complete_;
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Indicates whether we have written the HTML header
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool wrote_header_;
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // To simulate Async IO, we hold onto the Reader's buffer while
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // we wait for IO to complete.  When done, we fill the buffer
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // manually.
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool read_pending_;
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_refptr<IOBuffer> read_buffer_;
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int read_buffer_length_;
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ScopedRunnableMethodFactory<URLRequestFileDirJob> method_factory_;
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(URLRequestFileDirJob);
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace net
773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#endif  // NET_URL_REQUEST_URL_REQUEST_FILE_DIR_JOB_H_
79