summaryrefslogtreecommitdiffstats
path: root/app/os_exchange_data_provider_win.h
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-12 21:58:18 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-12 21:58:18 +0000
commit8c3dc79bc13ba84f418d3c135e1bf296a3e29722 (patch)
tree32eb9688d500a90eb74a7c4f8cb5a97e507dd0fc /app/os_exchange_data_provider_win.h
parentabaccb2cb8cff8138e5ea9daf420645e5852c9eb (diff)
downloadchromium_src-8c3dc79bc13ba84f418d3c135e1bf296a3e29722.zip
chromium_src-8c3dc79bc13ba84f418d3c135e1bf296a3e29722.tar.gz
chromium_src-8c3dc79bc13ba84f418d3c135e1bf296a3e29722.tar.bz2
Refactors OSExchangeData for easier portability.
BUG=none TEST=none Review URL: http://codereview.chromium.org/164401 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23230 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app/os_exchange_data_provider_win.h')
-rw-r--r--app/os_exchange_data_provider_win.h128
1 files changed, 128 insertions, 0 deletions
diff --git a/app/os_exchange_data_provider_win.h b/app/os_exchange_data_provider_win.h
new file mode 100644
index 0000000..42b11e2
--- /dev/null
+++ b/app/os_exchange_data_provider_win.h
@@ -0,0 +1,128 @@
+// Copyright (c) 2009 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 APP_OS_EXCHANGE_DATA_PROVIDER_WIN_H_
+#define APP_OS_EXCHANGE_DATA_PROVIDER_WIN_H_
+
+#include <objidl.h>
+#include <string>
+
+#include "app/os_exchange_data.h"
+#include "base/scoped_comptr_win.h"
+
+class DataObjectImpl : public IDataObject {
+ public:
+ DataObjectImpl();
+ ~DataObjectImpl();
+
+ // 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;
+ friend class OSExchangeDataProviderWin;
+
+ // 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_;
+
+ ScopedComPtr<IDataObject> source_object_;
+
+ LONG ref_count_;
+};
+
+class OSExchangeDataProviderWin : public OSExchangeData::Provider {
+ 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);
+
+ static IDataObject* GetIDataObject(const OSExchangeData& data);
+
+ explicit OSExchangeDataProviderWin(IDataObject* source);
+ OSExchangeDataProviderWin();
+
+ virtual ~OSExchangeDataProviderWin();
+
+ IDataObject* data_object() const { return data_.get(); }
+
+ // OSExchangeData::Provider methods.
+ virtual void SetString(const std::wstring& data);
+ virtual void SetURL(const GURL& url, const std::wstring& title);
+ virtual void SetFilename(const std::wstring& full_path);
+ virtual void SetPickledData(OSExchangeData::CustomFormat format,
+ const Pickle& data);
+ virtual void SetFileContents(const std::wstring& filename,
+ const std::string& file_contents);
+ virtual void SetHtml(const std::wstring& html, const GURL& base_url);
+
+ virtual bool GetString(std::wstring* data) const;
+ virtual bool GetURLAndTitle(GURL* url, std::wstring* title) const;
+ virtual bool GetFilename(std::wstring* full_path) const;
+ virtual bool GetPickledData(OSExchangeData::CustomFormat format,
+ Pickle* data) const;
+ virtual bool GetFileContents(std::wstring* filename,
+ std::string* file_contents) const;
+ virtual bool GetHtml(std::wstring* html, GURL* base_url) const;
+ virtual bool HasString() const;
+ virtual bool HasURL() const;
+ virtual bool HasFile() const;
+ virtual bool HasFileContents() const;
+ virtual bool HasHtml() const;
+ virtual bool HasCustomFormat(OSExchangeData::CustomFormat format) const;
+
+ private:
+ scoped_refptr<DataObjectImpl> data_;
+ ScopedComPtr<IDataObject> source_object_;
+
+ DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderWin);
+};
+
+#endif // APP_OS_EXCHANGE_DATA_PROVIDER_WIN_H_