15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_DOWNLOAD_SAVE_FILE_RESOURCE_HANDLER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_DOWNLOAD_SAVE_FILE_RESOURCE_HANDLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_handler.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SaveFileManager;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Forwards data to the save thread.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SaveFileResourceHandler : public ResourceHandler {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SaveFileResourceHandler(int render_process_host_id,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int render_view_id,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const GURL& url,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          SaveFileManager* manager);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SaveFileResourceHandler();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceHandler Implementation:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnUploadProgress(int request_id,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                uint64 position,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                uint64 size) OVERRIDE;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Saves the redirected URL to final_url_, we need to use the original
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL to match original request.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnRequestRedirected(int request_id,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const GURL& url,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ResourceResponse* response,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool* defer) OVERRIDE;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends the download creation information to the download thread.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnResponseStarted(int request_id,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ResourceResponse* response,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool* defer) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pass-through implementation.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnWillStart(int request_id,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GURL& url,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool* defer) OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new buffer, which will be handed to the download thread for file
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // writing and deletion.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnWillRead(int request_id,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::IOBuffer** buf,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int* buf_size,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int min_size) OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Passes the buffer to the download file writer.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnReadCompleted(int request_id, int bytes_read,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool* defer) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnResponseCompleted(int request_id,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const net::URLRequestStatus& status,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& security_info) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // N/A to this flavor of SaveFileResourceHandler.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDataDownloaded(int request_id, int bytes_downloaded) OVERRIDE;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the content-length header is not present (or contains something other
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // than numbers), StringToInt64 returns 0, which indicates 'unknown size' and
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is handled correctly by the SaveManager.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_content_length(const std::string& content_length);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_content_disposition(const std::string& content_disposition) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_disposition_ = content_disposition;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int save_id_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_process_id_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int render_view_id_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> read_buffer_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content_disposition_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL final_url_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 content_length_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SaveFileManager* save_manager_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kReadBufSize = 32768;  // bytes
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SaveFileResourceHandler);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CONTENT_BROWSER_DOWNLOAD_SAVE_FILE_RESOURCE_HANDLER_H_
94