| // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_COMMON_OS_EXCHANGE_DATA_H__ |
| #define CHROME_COMMON_OS_EXCHANGE_DATA_H__ |
| |
| #include <atlbase.h> |
| #include <objidl.h> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| |
| class GURL; |
| class Pickle; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // OSExchangeData |
| // An object that holds interchange data to be sent out to OS services like |
| // clipboard, drag and drop, etc. This object exposes an API that clients can |
| // use to specify raw data and its high level type. This object takes care of |
| // translating that into something the OS can understand. |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| class OSExchangeData : public IDataObject { |
| public: |
| // Returns true if source has plain text that is a valid url. |
| static bool HasPlainTextURL(IDataObject* source); |
| |
| // Returns true if source has plain text that is a valid URL and sets url to |
| // that url. |
| static bool GetPlainTextURL(IDataObject* source, GURL* url); |
| |
| OSExchangeData(); |
| OSExchangeData(IDataObject* source); |
| virtual ~OSExchangeData(); |
| |
| // These functions add data to the OSExchangeData object of various Chrome |
| // types. The OSExchangeData object takes care of translating the data into |
| // a format suitable for exchange with the OS. |
| // NOTE WELL: Typically, a data object like this will contain only one of the |
| // following types of data. In cases where more data is held, the |
| // order in which these functions are called is _important_! |
| // ---> The order types are added to an OSExchangeData object controls |
| // the order of enumeration in our IEnumFORMATETC implementation! |
| // This comes into play when selecting the best (most preferable) |
| // data type for insertion into a DropTarget. |
| void SetString(const std::wstring& data); |
| // A URL can have an optional title in some exchange formats. |
| void SetURL(const GURL& url, const std::wstring& title); |
| // A full path to a file |
| void SetFilename(const std::wstring& full_path); |
| // Adds pickled data of the specified format. |
| void SetPickledData(CLIPFORMAT format, const Pickle& data); |
| // Adds the bytes of a file (CFSTR_FILECONTENTS and CFSTR_FILEDESCRIPTOR). |
| void SetFileContents(const std::wstring& filename, |
| const std::string& file_contents); |
| // Adds a snippet of HTML. |html| is just raw html but this sets both |
| // text/html and CF_HTML. |
| void SetHtml(const std::wstring& html, const GURL& base_url); |
| |
| // These functions retrieve data of the specified type. If data exists, the |
| // functions return and the result is in the out parameter. If the data does |
| // not exist, the out parameter is not touched. The out parameter cannot be |
| // NULL. |
| bool GetString(std::wstring* data) const; |
| bool GetURLAndTitle(GURL* url, std::wstring* title) const; |
| // Return the path of a file, if available. |
| bool GetFilename(std::wstring* full_path) const; |
| bool GetPickledData(CLIPFORMAT format, Pickle* data) const; |
| bool GetFileContents(std::wstring* filename, |
| std::string* file_contents) const; |
| bool GetHtml(std::wstring* html, GURL* base_url) const; |
| |
| // Test whether or not data of certain types is present, without actually |
| // returning anything. |
| bool HasString() const; |
| bool HasURL() const; |
| bool HasURLTitle() const; |
| bool HasFile() const; |
| bool HasFormat(CLIPFORMAT format) const; |
| |
| // IDataObject implementation: |
| HRESULT __stdcall GetData(FORMATETC* format_etc, STGMEDIUM* medium); |
| HRESULT __stdcall GetDataHere(FORMATETC* format_etc, STGMEDIUM* medium); |
| HRESULT __stdcall QueryGetData(FORMATETC* format_etc); |
| HRESULT __stdcall GetCanonicalFormatEtc( |
| FORMATETC* format_etc, FORMATETC* result); |
| HRESULT __stdcall SetData( |
| FORMATETC* format_etc, STGMEDIUM* medium, BOOL should_release); |
| HRESULT __stdcall EnumFormatEtc( |
| DWORD direction, IEnumFORMATETC** enumerator); |
| HRESULT __stdcall DAdvise( |
| FORMATETC* format_etc, DWORD advf, IAdviseSink* sink, DWORD* connection); |
| HRESULT __stdcall DUnadvise(DWORD connection); |
| HRESULT __stdcall EnumDAdvise(IEnumSTATDATA** enumerator); |
| |
| // IUnknown implementation: |
| HRESULT __stdcall QueryInterface(const IID& iid, void** object); |
| ULONG __stdcall AddRef(); |
| ULONG __stdcall Release(); |
| |
| private: |
| // FormatEtcEnumerator only likes us for our StoredDataMap typedef. |
| friend class FormatEtcEnumerator; |
| |
| // Our internal representation of stored data & type info. |
| struct StoredDataInfo { |
| FORMATETC format_etc; |
| STGMEDIUM* medium; |
| bool owns_medium; |
| |
| StoredDataInfo(CLIPFORMAT cf, STGMEDIUM* a_medium) { |
| format_etc.cfFormat = cf; |
| format_etc.dwAspect = DVASPECT_CONTENT; |
| format_etc.lindex = -1; |
| format_etc.ptd = NULL; |
| format_etc.tymed = a_medium->tymed; |
| |
| owns_medium = true; |
| |
| medium = a_medium; |
| } |
| |
| ~StoredDataInfo() { |
| if (owns_medium) { |
| ReleaseStgMedium(medium); |
| delete medium; |
| } |
| } |
| }; |
| |
| typedef std::vector<StoredDataInfo*> StoredData; |
| StoredData contents_; |
| |
| CComPtr<IDataObject> source_object_; |
| |
| LONG ref_count_; |
| |
| DISALLOW_EVIL_CONSTRUCTORS(OSExchangeData); |
| }; |
| |
| #endif // #ifndef CHROME_COMMON_OS_EXCHANGE_DATA_H__ |