13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_RENDERER_HOST_SAVE_FILE_RESOURCE_HANDLER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_RENDERER_HOST_SAVE_FILE_RESOURCE_HANDLER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_handler.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SaveFileManager;
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Forwards data to the save thread.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SaveFileResourceHandler : public ResourceHandler {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SaveFileResourceHandler(int render_process_host_id,
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          int render_view_id,
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const GURL& url,
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          SaveFileManager* manager);
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // ResourceHandler Implementation:
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool OnUploadProgress(int request_id, uint64 position, uint64 size);
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Saves the redirected URL to final_url_, we need to use the original
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL to match original request.
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool OnRequestRedirected(int request_id, const GURL& url,
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   ResourceResponse* response, bool* defer);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sends the download creation information to the download thread.
33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool OnResponseStarted(int request_id, ResourceResponse* response);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Pass-through implementation.
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool OnWillStart(int request_id, const GURL& url, bool* defer);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a new buffer, which will be handed to the download thread for file
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // writing and deletion.
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool OnWillRead(int request_id, net::IOBuffer** buf, int* buf_size,
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          int min_size);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Passes the buffer to the download file writer.
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool OnReadCompleted(int request_id, int* bytes_read);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool OnResponseCompleted(int request_id,
473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                   const net::URLRequestStatus& status,
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   const std::string& security_info);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void OnRequestClosed();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If the content-length header is not present (or contains something other
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // than numbers), StringToInt64 returns 0, which indicates 'unknown size' and
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is handled correctly by the SaveManager.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_content_length(const std::string& content_length);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_content_disposition(const std::string& content_disposition) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    content_disposition_ = content_disposition;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual ~SaveFileResourceHandler();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int save_id_;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_process_id_;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int render_view_id_;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<net::IOBuffer> read_buffer_;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string content_disposition_;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url_;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL final_url_;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 content_length_;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SaveFileManager* save_manager_;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kReadBufSize = 32768;  // bytes
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SaveFileResourceHandler);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_RENDERER_HOST_SAVE_FILE_RESOURCE_HANDLER_H_
80