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)#ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <objidl.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/download_file_interface.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Pickle;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImageSkia;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Vector2d;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstruct FileInfo;
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OSExchangeData
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  An object that holds interchange data to be sent out to OS services like
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  clipboard, drag and drop, etc. This object exposes an API that clients can
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  use to specify raw data and its high level type. This object takes care of
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  translating that into something the OS can understand.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: Support for html and file contents is required by TabContentViewWin.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TabContentsViewGtk uses a different class to handle drag support that does
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not use OSExchangeData. As such, file contents and html support is only
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compiled on windows.
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT OSExchangeData {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CustomFormats are used for non-standard data types. For example, bookmark
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nodes are written using a CustomFormat.
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TODO(dcheng): Remove this completely and just use Clipboard::FormatType.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef Clipboard::FormatType CustomFormat;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enumeration of the known formats.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Format {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STRING         = 1 << 0,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URL            = 1 << 1,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_NAME      = 1 << 2,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PICKLED_DATA   = 1 << 3,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_CONTENTS  = 1 << 4,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HTML           = 1 << 5,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Controls whether or not filenames should be converted to file: URLs when
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // getting a URL.
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  enum FilenameToURLPolicy { CONVERT_FILENAMES, DO_NOT_CONVERT_FILENAMES, };
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Encapsulates the info about a file to be downloaded.
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct UI_BASE_EXPORT DownloadFileInfo {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadFileInfo(const base::FilePath& filename,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     DownloadFileProvider* downloader);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~DownloadFileInfo();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath filename;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DownloadFileProvider> downloader;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Provider defines the platform specific part of OSExchangeData that
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interacts with the native system.
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class UI_BASE_EXPORT Provider {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Provider() {}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Provider() {}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual Provider* Clone() const = 0;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual void MarkOriginatedFromRenderer() = 0;
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool DidOriginateFromRenderer() const = 0;
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void SetString(const base::string16& data) = 0;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void SetURL(const GURL& url, const base::string16& title) = 0;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void SetFilename(const base::FilePath& path) = 0;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void SetFilenames(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::vector<FileInfo>& file_names) = 0;
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual void SetPickledData(const CustomFormat& format,
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                const Pickle& data) = 0;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual bool GetString(base::string16* data) const = 0;
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual bool GetURLAndTitle(FilenameToURLPolicy policy,
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GURL* url,
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                base::string16* title) const = 0;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool GetFilename(base::FilePath* path) const = 0;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool GetFilenames(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::vector<FileInfo>* file_names) const = 0;
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual bool GetPickledData(const CustomFormat& format,
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                Pickle* data) const = 0;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool HasString() const = 0;
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual bool HasURL(FilenameToURLPolicy policy) const = 0;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool HasFile() const = 0;
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual bool HasCustomFormat(const CustomFormat& format) const = 0;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void SetFileContents(const base::FilePath& filename,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& file_contents) = 0;
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_WIN)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool GetFileContents(base::FilePath* filename,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 std::string* file_contents) const = 0;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool HasFileContents() const = 0;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void SetDownloadFileInfo(const DownloadFileInfo& download) = 0;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void SetHtml(const base::string16& html, const GURL& base_url) = 0;
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual bool GetHtml(base::string16* html, GURL* base_url) const = 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool HasHtml() const = 0;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void SetDragImage(const gfx::ImageSkia& image,
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const gfx::Vector2d& cursor_offset) = 0;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual const gfx::ImageSkia& GetDragImage() const = 0;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual const gfx::Vector2d& GetDragImageOffset() const = 0;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates the platform specific Provider.
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static Provider* CreateProvider();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OSExchangeData();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates an OSExchangeData with the specified provider. OSExchangeData
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // takes ownership of the supplied provider.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit OSExchangeData(Provider* provider);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~OSExchangeData();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the Provider, which actually stores and manages the data.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Provider& provider() const { return *provider_; }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Provider& provider() { return *provider_; }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Marks drag data as tainted if it originates from the renderer. This is used
160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // to avoid granting privileges to a renderer when dragging in tainted data,
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // since it could allow potential escalation of privileges.
162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void MarkOriginatedFromRenderer();
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool DidOriginateFromRenderer() const;
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These functions add data to the OSExchangeData object of various Chrome
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // types. The OSExchangeData object takes care of translating the data into
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a format suitable for exchange with the OS.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE WELL: Typically, a data object like this will contain only one of the
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            following types of data. In cases where more data is held, the
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            order in which these functions are called is _important_!
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       ---> The order types are added to an OSExchangeData object controls
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            the order of enumeration in our IEnumFORMATETC implementation!
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            This comes into play when selecting the best (most preferable)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //            data type for insertion into a DropTarget.
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetString(const base::string16& data);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A URL can have an optional title in some exchange formats.
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetURL(const GURL& url, const base::string16& title);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A full path to a file.
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetFilename(const base::FilePath& path);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Full path to one or more files. See also SetFilenames() in Provider.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetFilenames(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<FileInfo>& file_names);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds pickled data of the specified format.
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetPickledData(const CustomFormat& format, const Pickle& data);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These functions retrieve data of the specified type. If data exists, the
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // functions return and the result is in the out parameter. If the data does
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not exist, the out parameter is not touched. The out parameter cannot be
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL.
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool GetString(base::string16* data) const;
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool GetURLAndTitle(FilenameToURLPolicy policy,
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      GURL* url,
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      base::string16* title) const;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the path of a file, if available.
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetFilename(base::FilePath* path) const;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetFilenames(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<FileInfo>* file_names) const;
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool GetPickledData(const CustomFormat& format, Pickle* data) const;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test whether or not data of certain types is present, without actually
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returning anything.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasString() const;
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool HasURL(FilenameToURLPolicy policy) const;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasFile() const;
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool HasCustomFormat(const CustomFormat& format) const;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if this OSExchangeData has data in any of the formats in
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |formats| or any custom format in |custom_formats|.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasAnyFormat(int formats,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::set<CustomFormat>& custom_formats) const;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Adds the bytes of a file (CFSTR_FILECONTENTS and CFSTR_FILEDESCRIPTOR on
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Windows).
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetFileContents(const base::FilePath& filename,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& file_contents);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetFileContents(base::FilePath* filename,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       std::string* file_contents) const;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a download file with full path (CF_HDROP).
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDownloadFileInfo(const DownloadFileInfo& download);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a snippet of HTML.  |html| is just raw html but this sets both
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // text/html and CF_HTML.
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetHtml(const base::string16& html, const GURL& base_url);
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool GetHtml(base::string16* html, GURL* base_url) const;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Provides the actual data.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Provider> provider_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OSExchangeData);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_H_
241