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