1 // Copyright (c) 2012 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 #include "ui/base/dragdrop/os_exchange_data.h"
6 
7 #include <utility>
8 #include <vector>
9 
10 #include "base/callback.h"
11 #include "base/pickle.h"
12 #include "build/build_config.h"
13 #include "ui/base/clipboard/clipboard_format_type.h"
14 #include "ui/base/dragdrop/os_exchange_data_provider_factory.h"
15 #include "url/gurl.h"
16 
17 namespace ui {
18 
DownloadFileInfo(const base::FilePath & filename,std::unique_ptr<DownloadFileProvider> downloader)19 OSExchangeData::DownloadFileInfo::DownloadFileInfo(
20     const base::FilePath& filename,
21     std::unique_ptr<DownloadFileProvider> downloader)
22     : filename(filename), downloader(std::move(downloader)) {}
23 
24 OSExchangeData::DownloadFileInfo::~DownloadFileInfo() = default;
25 
OSExchangeData()26 OSExchangeData::OSExchangeData()
27     : provider_(OSExchangeDataProviderFactory::CreateProvider()) {
28 }
29 
OSExchangeData(std::unique_ptr<Provider> provider)30 OSExchangeData::OSExchangeData(std::unique_ptr<Provider> provider)
31     : provider_(std::move(provider)) {
32 }
33 
~OSExchangeData()34 OSExchangeData::~OSExchangeData() {
35 }
36 
MarkOriginatedFromRenderer()37 void OSExchangeData::MarkOriginatedFromRenderer() {
38   provider_->MarkOriginatedFromRenderer();
39 }
40 
DidOriginateFromRenderer() const41 bool OSExchangeData::DidOriginateFromRenderer() const {
42   return provider_->DidOriginateFromRenderer();
43 }
44 
SetString(const base::string16 & data)45 void OSExchangeData::SetString(const base::string16& data) {
46   provider_->SetString(data);
47 }
48 
SetURL(const GURL & url,const base::string16 & title)49 void OSExchangeData::SetURL(const GURL& url, const base::string16& title) {
50   provider_->SetURL(url, title);
51 }
52 
SetFilename(const base::FilePath & path)53 void OSExchangeData::SetFilename(const base::FilePath& path) {
54   provider_->SetFilename(path);
55 }
56 
SetFilenames(const std::vector<FileInfo> & filenames)57 void OSExchangeData::SetFilenames(
58     const std::vector<FileInfo>& filenames) {
59   provider_->SetFilenames(filenames);
60 }
61 
SetPickledData(const ClipboardFormatType & format,const base::Pickle & data)62 void OSExchangeData::SetPickledData(const ClipboardFormatType& format,
63                                     const base::Pickle& data) {
64   provider_->SetPickledData(format, data);
65 }
66 
GetString(base::string16 * data) const67 bool OSExchangeData::GetString(base::string16* data) const {
68   return provider_->GetString(data);
69 }
70 
GetURLAndTitle(FilenameToURLPolicy policy,GURL * url,base::string16 * title) const71 bool OSExchangeData::GetURLAndTitle(FilenameToURLPolicy policy,
72                                     GURL* url,
73                                     base::string16* title) const {
74   return provider_->GetURLAndTitle(policy, url, title);
75 }
76 
GetFilename(base::FilePath * path) const77 bool OSExchangeData::GetFilename(base::FilePath* path) const {
78   return provider_->GetFilename(path);
79 }
80 
GetFilenames(std::vector<FileInfo> * filenames) const81 bool OSExchangeData::GetFilenames(std::vector<FileInfo>* filenames) const {
82   return provider_->GetFilenames(filenames);
83 }
84 
GetPickledData(const ClipboardFormatType & format,base::Pickle * data) const85 bool OSExchangeData::GetPickledData(const ClipboardFormatType& format,
86                                     base::Pickle* data) const {
87   return provider_->GetPickledData(format, data);
88 }
89 
HasString() const90 bool OSExchangeData::HasString() const {
91   return provider_->HasString();
92 }
93 
HasURL(FilenameToURLPolicy policy) const94 bool OSExchangeData::HasURL(FilenameToURLPolicy policy) const {
95   return provider_->HasURL(policy);
96 }
97 
HasFile() const98 bool OSExchangeData::HasFile() const {
99   return provider_->HasFile();
100 }
101 
HasCustomFormat(const ClipboardFormatType & format) const102 bool OSExchangeData::HasCustomFormat(const ClipboardFormatType& format) const {
103   return provider_->HasCustomFormat(format);
104 }
105 
HasAnyFormat(int formats,const std::set<ClipboardFormatType> & format_types) const106 bool OSExchangeData::HasAnyFormat(
107     int formats,
108     const std::set<ClipboardFormatType>& format_types) const {
109   if ((formats & STRING) != 0 && HasString())
110     return true;
111   if ((formats & URL) != 0 && HasURL(CONVERT_FILENAMES))
112     return true;
113 #if defined(OS_WIN)
114   if ((formats & FILE_CONTENTS) != 0 && provider_->HasFileContents())
115     return true;
116 #endif
117 #if defined(USE_AURA)
118   if ((formats & HTML) != 0 && provider_->HasHtml())
119     return true;
120 #endif
121   if ((formats & FILE_NAME) != 0 && provider_->HasFile())
122     return true;
123   for (const auto& format : format_types) {
124     if (HasCustomFormat(format))
125       return true;
126   }
127   return false;
128 }
129 
130 #if defined(OS_WIN)
SetFileContents(const base::FilePath & filename,const std::string & file_contents)131 void OSExchangeData::SetFileContents(const base::FilePath& filename,
132                                      const std::string& file_contents) {
133   provider_->SetFileContents(filename, file_contents);
134 }
135 
GetFileContents(base::FilePath * filename,std::string * file_contents) const136 bool OSExchangeData::GetFileContents(base::FilePath* filename,
137                                      std::string* file_contents) const {
138   return provider_->GetFileContents(filename, file_contents);
139 }
140 
HasVirtualFilenames() const141 bool OSExchangeData::HasVirtualFilenames() const {
142   return provider_->HasVirtualFilenames();
143 }
144 
GetVirtualFilenames(std::vector<FileInfo> * filenames) const145 bool OSExchangeData::GetVirtualFilenames(
146     std::vector<FileInfo>* filenames) const {
147   return provider_->GetVirtualFilenames(filenames);
148 }
149 
GetVirtualFilesAsTempFiles(base::OnceCallback<void (const std::vector<std::pair<base::FilePath,base::FilePath>> &)> callback) const150 bool OSExchangeData::GetVirtualFilesAsTempFiles(
151     base::OnceCallback<
152         void(const std::vector<std::pair<base::FilePath, base::FilePath>>&)>
153         callback) const {
154   return provider_->GetVirtualFilesAsTempFiles(std::move(callback));
155 }
156 
SetDownloadFileInfo(DownloadFileInfo * download)157 void OSExchangeData::SetDownloadFileInfo(DownloadFileInfo* download) {
158   provider_->SetDownloadFileInfo(download);
159 }
160 #endif
161 
162 #if defined(USE_AURA)
HasHtml() const163 bool OSExchangeData::HasHtml() const {
164   return provider_->HasHtml();
165 }
166 
SetHtml(const base::string16 & html,const GURL & base_url)167 void OSExchangeData::SetHtml(const base::string16& html, const GURL& base_url) {
168   provider_->SetHtml(html, base_url);
169 }
170 
GetHtml(base::string16 * html,GURL * base_url) const171 bool OSExchangeData::GetHtml(base::string16* html, GURL* base_url) const {
172   return provider_->GetHtml(html, base_url);
173 }
174 #endif
175 
176 }  // namespace ui
177