Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_PLUGIN_DOWNLOAD_HELPER_H_
      6 #define CHROME_BROWSER_PLUGIN_DOWNLOAD_HELPER_H_
      7 #pragma once
      8 
      9 #include <string>
     10 #include "build/build_config.h"
     11 
     12 #if defined(OS_WIN)
     13 #include "base/file_path.h"
     14 #include "net/base/file_stream.h"
     15 #include "net/url_request/url_request.h"
     16 #include "ui/gfx/native_widget_types.h"
     17 
     18 // The PluginDownloadUrlHelper is used to handle one download URL request
     19 // from the plugin. Each download request is handled by a new instance
     20 // of this class.
     21 class PluginDownloadUrlHelper : public net::URLRequest::Delegate {
     22   static const int kDownloadFileBufferSize = 32768;
     23  public:
     24   // The delegate receives notification about the status of downloads
     25   // initiated.
     26   class DownloadDelegate {
     27    public:
     28     virtual ~DownloadDelegate() {}
     29 
     30     virtual void OnDownloadCompleted(const FilePath& download_path,
     31                                      bool success) {}
     32   };
     33 
     34   PluginDownloadUrlHelper(const std::string& download_url,
     35                           int source_pid, gfx::NativeWindow caller_window,
     36                           PluginDownloadUrlHelper::DownloadDelegate* delegate);
     37   ~PluginDownloadUrlHelper();
     38 
     39   void InitiateDownload(net::URLRequestContext* request_context);
     40 
     41   // net::URLRequest::Delegate
     42   virtual void OnAuthRequired(net::URLRequest* request,
     43                               net::AuthChallengeInfo* auth_info);
     44   virtual void OnSSLCertificateError(net::URLRequest* request,
     45                                      int cert_error,
     46                                      net::X509Certificate* cert);
     47   virtual void OnResponseStarted(net::URLRequest* request);
     48   virtual void OnReadCompleted(net::URLRequest* request, int bytes_read);
     49 
     50   void OnDownloadCompleted(net::URLRequest* request);
     51 
     52  protected:
     53   void DownloadCompletedHelper(bool success);
     54 
     55   // The download file request initiated by the plugin.
     56   net::URLRequest* download_file_request_;
     57   // Handle to the downloaded file.
     58   scoped_ptr<net::FileStream> download_file_;
     59   // The full path of the downloaded file.
     60   FilePath download_file_path_;
     61   // The buffer passed off to net::URLRequest::Read.
     62   scoped_refptr<net::IOBuffer> download_file_buffer_;
     63   // TODO(port): this comment doesn't describe the situation on Posix.
     64   // The window handle for sending the WM_COPYDATA notification,
     65   // indicating that the download completed.
     66   gfx::NativeWindow download_file_caller_window_;
     67 
     68   std::string download_url_;
     69   int download_source_child_unique_id_;
     70 
     71   PluginDownloadUrlHelper::DownloadDelegate* delegate_;
     72 
     73   DISALLOW_COPY_AND_ASSIGN(PluginDownloadUrlHelper);
     74 };
     75 
     76 #endif  // OS_WIN
     77 
     78 #endif  // CHROME_BROWSER_PLUGIN_DOWNLOAD_HELPER_H_
     79 
     80 
     81