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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSExchangeData::DownloadFileInfo::DownloadFileInfo(
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& filename,
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadFileProvider* downloader)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : filename(filename),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      downloader(downloader) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSExchangeData::DownloadFileInfo::~DownloadFileInfo() {}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSExchangeData::OSExchangeData() : provider_(CreateProvider()) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSExchangeData::OSExchangeData(Provider* provider) : provider_(provider) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OSExchangeData::~OSExchangeData() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid OSExchangeData::MarkOriginatedFromRenderer() {
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  provider_->MarkOriginatedFromRenderer();
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool OSExchangeData::DidOriginateFromRenderer() const {
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return provider_->DidOriginateFromRenderer();
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OSExchangeData::SetString(const base::string16& data) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->SetString(data);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OSExchangeData::SetURL(const GURL& url, const base::string16& title) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->SetURL(url, title);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OSExchangeData::SetFilename(const base::FilePath& path) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->SetFilename(path);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OSExchangeData::SetFilenames(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<FileInfo>& filenames) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->SetFilenames(filenames);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void OSExchangeData::SetPickledData(const CustomFormat& format,
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    const Pickle& data) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->SetPickledData(format, data);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool OSExchangeData::GetString(base::string16* data) const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->GetString(data);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool OSExchangeData::GetURLAndTitle(FilenameToURLPolicy policy,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    GURL* url,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    base::string16* title) const {
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return provider_->GetURLAndTitle(policy, url, title);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool OSExchangeData::GetFilename(base::FilePath* path) const {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->GetFilename(path);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeData::GetFilenames(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<FileInfo>* filenames) const {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->GetFilenames(filenames);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool OSExchangeData::GetPickledData(const CustomFormat& format,
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    Pickle* data) const {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->GetPickledData(format, data);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeData::HasString() const {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->HasString();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool OSExchangeData::HasURL(FilenameToURLPolicy policy) const {
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return provider_->HasURL(policy);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeData::HasFile() const {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->HasFile();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool OSExchangeData::HasCustomFormat(const CustomFormat& format) const {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->HasCustomFormat(format);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool OSExchangeData::HasAnyFormat(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int formats,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::set<CustomFormat>& custom_formats) const {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats & STRING) != 0 && HasString())
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if ((formats & URL) != 0 && HasURL(CONVERT_FILENAMES))
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats & FILE_CONTENTS) != 0 && provider_->HasFileContents())
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats & HTML) != 0 && provider_->HasHtml())
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((formats & FILE_NAME) != 0 && provider_->HasFile())
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<CustomFormat>::const_iterator i = custom_formats.begin();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != custom_formats.end(); ++i) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasCustomFormat(*i))
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OSExchangeData::SetFileContents(const base::FilePath& filename,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& file_contents) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->SetFileContents(filename, file_contents);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool OSExchangeData::GetFileContents(base::FilePath* filename,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     std::string* file_contents) const {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->GetFileContents(filename, file_contents);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OSExchangeData::SetDownloadFileInfo(const DownloadFileInfo& download) {
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  provider_->SetDownloadFileInfo(download);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OSExchangeData::SetHtml(const base::string16& html, const GURL& base_url) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->SetHtml(html, base_url);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool OSExchangeData::GetHtml(base::string16* html, GURL* base_url) const {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider_->GetHtml(html, base_url);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
152