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_PROVIDER_WIN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <objidl.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shlobj.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
11a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Win8 SDK compatibility, see http://goo.gl/fufvl for more information.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Note: This interface has been renamed IDataObjectAsyncCapability."
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If we're building on pre-8 we define it to its old name. It's documented as
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being binary compatible.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __IDataObjectAsyncCapability_FWD_DEFINED__
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IDataObjectAsyncCapability IAsyncOperation
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/scoped_vector.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_comptr.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DataObjectImpl : public DownloadFileObserver,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public IDataObject,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public IDataObjectAsyncCapability {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Observer {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnWaitForData() = 0;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnDataObjectDisposed() = 0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Observer() { }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DataObjectImpl();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessors.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_observer(Observer* observer) { observer_ = observer; }
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_in_drag_loop(bool in_drag_loop) { in_drag_loop_ = in_drag_loop; }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of known formats.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size() const { return contents_.size(); }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DownloadFileObserver implementation:
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDownloadCompleted(const base::FilePath& file_path);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDownloadAborted();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IDataObject implementation:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall GetData(FORMATETC* format_etc, STGMEDIUM* medium);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall GetDataHere(FORMATETC* format_etc, STGMEDIUM* medium);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall QueryGetData(FORMATETC* format_etc);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall GetCanonicalFormatEtc(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FORMATETC* format_etc, FORMATETC* result);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall SetData(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FORMATETC* format_etc, STGMEDIUM* medium, BOOL should_release);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall EnumFormatEtc(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DWORD direction, IEnumFORMATETC** enumerator);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall DAdvise(FORMATETC* format_etc, DWORD advf,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            IAdviseSink* sink, DWORD* connection);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall DUnadvise(DWORD connection);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall EnumDAdvise(IEnumSTATDATA** enumerator);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IDataObjectAsyncCapability implementation:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall EndOperation(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT result, IBindCtx* reserved, DWORD effects);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall GetAsyncMode(BOOL* is_op_async);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall InOperation(BOOL* in_async_op);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall SetAsyncMode(BOOL do_op_async);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall StartOperation(IBindCtx* reserved);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IUnknown implementation:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT __stdcall QueryInterface(const IID& iid, void** object);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ULONG __stdcall AddRef();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ULONG __stdcall Release();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FormatEtcEnumerator only likes us for our StoredDataMap typedef.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class FormatEtcEnumerator;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class OSExchangeDataProviderWin;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DataObjectImpl();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StopDownloads();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes from contents_ the first data that matches |format|.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveData(const FORMATETC& format);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our internal representation of stored data & type info.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct StoredDataInfo {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FORMATETC format_etc;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STGMEDIUM* medium;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool owns_medium;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DownloadFileProvider> downloader;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    StoredDataInfo(const FORMATETC& format_etc, STGMEDIUM* medium)
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        : format_etc(format_etc), medium(medium), owns_medium(true) {}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~StoredDataInfo() {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (owns_medium) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ReleaseStgMedium(medium);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete medium;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (downloader.get())
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        downloader->Stop();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  typedef ScopedVector<StoredDataInfo> StoredData;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StoredData contents_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedComPtr<IDataObject> source_object_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_aborting_;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool in_drag_loop_;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool in_async_mode_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool async_operation_started_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Observer* observer_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT OSExchangeDataProviderWin
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public OSExchangeData::Provider {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if source has plain text that is a valid url.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool HasPlainTextURL(IDataObject* source);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if source has plain text that is a valid URL and sets url to
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that url.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetPlainTextURL(IDataObject* source, GURL* url);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static DataObjectImpl* GetDataObjectImpl(const OSExchangeData& data);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static IDataObject* GetIDataObject(const OSExchangeData& data);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static IDataObjectAsyncCapability* GetIAsyncOperation(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const OSExchangeData& data);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit OSExchangeDataProviderWin(IDataObject* source);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OSExchangeDataProviderWin();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~OSExchangeDataProviderWin();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDataObject* data_object() const { return data_.get(); }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDataObjectAsyncCapability* async_operation() const { return data_.get(); }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OSExchangeData::Provider methods.
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual Provider* Clone() const;
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void MarkOriginatedFromRenderer();
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool DidOriginateFromRenderer() const;
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetString(const base::string16& data);
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetURL(const GURL& url, const base::string16& title);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetFilename(const base::FilePath& path);
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetFilenames(const std::vector<FileInfo>& filenames);
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void SetPickledData(const OSExchangeData::CustomFormat& format,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const Pickle& data);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetFileContents(const base::FilePath& filename,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const std::string& file_contents);
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetHtml(const base::string16& html, const GURL& base_url);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool GetString(base::string16* data) const;
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool GetURLAndTitle(OSExchangeData::FilenameToURLPolicy policy,
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              GURL* url,
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              base::string16* title) const;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool GetFilename(base::FilePath* path) const;
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool GetFilenames(std::vector<FileInfo>* filenames) const;
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool GetPickledData(const OSExchangeData::CustomFormat& format,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Pickle* data) const;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool GetFileContents(base::FilePath* filename,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               std::string* file_contents) const;
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool GetHtml(base::string16* html, GURL* base_url) const;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasString() const;
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool HasURL(OSExchangeData::FilenameToURLPolicy policy) const;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasFile() const;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasFileContents() const;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasHtml() const;
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool HasCustomFormat(
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const OSExchangeData::CustomFormat& format) const;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDownloadFileInfo(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const OSExchangeData::DownloadFileInfo& download_info);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetDragImage(const gfx::ImageSkia& image,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const gfx::Vector2d& cursor_offset) OVERRIDE;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const gfx::ImageSkia& GetDragImage() const OVERRIDE;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const gfx::Vector2d& GetDragImageOffset() const OVERRIDE;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<DataObjectImpl> data_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedComPtr<IDataObject> source_object_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Drag image and offset data. Only used for Ash.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::ImageSkia drag_image_;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d drag_image_offset_;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderWin);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_WIN_H_
203