1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian 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_DOWNLOAD_DRAG_DOWNLOAD_FILE_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_DOWNLOAD_DRAG_DOWNLOAD_FILE_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/linked_ptr.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_file.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_item.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_manager.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/dragdrop/download_file_interface.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FileStream;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass DragDownloadFile : public ui::DownloadFileProvider,
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         public DownloadManager::Observer,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         public DownloadItem::Observer {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // On Windows, we need to download into a temporary file. Two threads are
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // involved: background drag-and-drop thread and UI thread.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The first parameter file_name_or_path should contain file name while the
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // second parameter file_stream should be NULL.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // On MacOSX, we need to download into a file stream that has already been
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // created. Only UI thread is involved.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The file path and file stream should be provided as the first two
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // parameters.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DragDownloadFile(const FilePath& file_name_or_path,
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   linked_ptr<net::FileStream> file_stream,
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const GURL& url,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const GURL& referrer,
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const std::string& referrer_encoding,
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   TabContents* tab_contents);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // DownloadFileProvider methods.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on drag-and-drop thread (Windows).
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on UI thread (MacOSX).
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool Start(ui::DownloadFileObserver* observer);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Stop();
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual IStream* GetStream() { return NULL; }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // DownloadManager::Observer methods.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on UI thread.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ModelChanged();
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // DownloadItem::Observer methods.
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on UI thread.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnDownloadUpdated(DownloadItem* download);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnDownloadOpened(DownloadItem* download) { }
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on drag-and-drop thread (Windows).
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on UI thread (Windows).
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~DragDownloadFile();
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on drag-and-drop thread (Windows only).
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartNestedMessageLoop();
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void QuitNestedMessageLoop();
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on either drag-and-drop thread or UI thread (Windows).
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called on UI thread (MacOSX).
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitiateDownload();
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DownloadCompleted(bool is_successful);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper methods to make sure we're in the correct thread.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AssertCurrentlyOnDragThread();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AssertCurrentlyOnUIThread();
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initialized on drag-and-drop thread. Accessed on either thread after that
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // (Windows).
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Accessed on UI thread (MacOSX).
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_path_;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_name_;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  linked_ptr<net::FileStream> file_stream_;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url_;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL referrer_;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string referrer_encoding_;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* tab_contents_;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop* drag_message_loop_;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath temp_dir_path_;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Accessed on drag-and-drop thread (Windows).
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Accessed on UI thread (MacOSX).
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_started_;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_successful_;
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<ui::DownloadFileObserver> observer_;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Accessed on drag-and-drop thread (Windows only).
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_running_nested_message_loop_;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Access on UI thread.
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DownloadManager* download_manager_;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool download_item_observer_added_;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DragDownloadFile);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_DOWNLOAD_DRAG_DOWNLOAD_FILE_H_
113