| Index: app/os_exchange_data_provider_win.h
|
| ===================================================================
|
| --- app/os_exchange_data_provider_win.h (revision 35459)
|
| +++ app/os_exchange_data_provider_win.h (working copy)
|
| @@ -6,16 +6,34 @@
|
| #define APP_OS_EXCHANGE_DATA_PROVIDER_WIN_H_
|
|
|
| #include <objidl.h>
|
| +#include <shlobj.h>
|
| #include <string>
|
|
|
| #include "app/os_exchange_data.h"
|
| #include "base/scoped_comptr_win.h"
|
|
|
| -class DataObjectImpl : public IDataObject {
|
| +class DataObjectImpl : public OSExchangeData::DownloadFileObserver,
|
| + public IDataObject,
|
| + public IAsyncOperation {
|
| public:
|
| + class Observer {
|
| + public:
|
| + virtual void OnWaitForData() = 0;
|
| + virtual void OnDataObjectDisposed() = 0;
|
| + protected:
|
| + virtual ~Observer() { }
|
| + };
|
| +
|
| DataObjectImpl();
|
| - ~DataObjectImpl();
|
|
|
| + // Accessors.
|
| + void set_observer(Observer* observer) { observer_ = observer; }
|
| +
|
| + // DownloadFileObserver implementation:
|
| + virtual void OnDataReady(
|
| + int format,
|
| + const std::vector<OSExchangeData::DownloadFileInfo*>& downloads);
|
| +
|
| // IDataObject implementation:
|
| HRESULT __stdcall GetData(FORMATETC* format_etc, STGMEDIUM* medium);
|
| HRESULT __stdcall GetDataHere(FORMATETC* format_etc, STGMEDIUM* medium);
|
| @@ -31,6 +49,14 @@
|
| HRESULT __stdcall DUnadvise(DWORD connection);
|
| HRESULT __stdcall EnumDAdvise(IEnumSTATDATA** enumerator);
|
|
|
| + // IAsyncOperation implementation:
|
| + HRESULT __stdcall EndOperation(
|
| + HRESULT result, IBindCtx* reserved, DWORD effects);
|
| + HRESULT __stdcall GetAsyncMode(BOOL* is_op_async);
|
| + HRESULT __stdcall InOperation(BOOL* in_async_op);
|
| + HRESULT __stdcall SetAsyncMode(BOOL do_op_async);
|
| + HRESULT __stdcall StartOperation(IBindCtx* reserved);
|
| +
|
| // IUnknown implementation:
|
| HRESULT __stdcall QueryInterface(const IID& iid, void** object);
|
| ULONG __stdcall AddRef();
|
| @@ -41,22 +67,34 @@
|
| friend class FormatEtcEnumerator;
|
| friend class OSExchangeDataProviderWin;
|
|
|
| + virtual ~DataObjectImpl();
|
| +
|
| + void StopDownloads();
|
| +
|
| // Our internal representation of stored data & type info.
|
| struct StoredDataInfo {
|
| FORMATETC format_etc;
|
| STGMEDIUM* medium;
|
| bool owns_medium;
|
| + bool in_delay_rendering;
|
| + std::vector<OSExchangeData::DownloadFileInfo*> downloads;
|
|
|
| - StoredDataInfo(CLIPFORMAT cf, STGMEDIUM* a_medium) {
|
| + StoredDataInfo(CLIPFORMAT cf, STGMEDIUM* medium)
|
| + : medium(medium),
|
| + owns_medium(true),
|
| + in_delay_rendering(false) {
|
| format_etc.cfFormat = cf;
|
| format_etc.dwAspect = DVASPECT_CONTENT;
|
| format_etc.lindex = -1;
|
| format_etc.ptd = NULL;
|
| - format_etc.tymed = a_medium->tymed;
|
| + format_etc.tymed = medium ? medium->tymed : TYMED_HGLOBAL;
|
| + }
|
|
|
| - owns_medium = true;
|
| -
|
| - medium = a_medium;
|
| + StoredDataInfo(FORMATETC* format_etc, STGMEDIUM* medium)
|
| + : format_etc(*format_etc),
|
| + medium(medium),
|
| + owns_medium(true),
|
| + in_delay_rendering(false) {
|
| }
|
|
|
| ~StoredDataInfo() {
|
| @@ -64,6 +102,11 @@
|
| ReleaseStgMedium(medium);
|
| delete medium;
|
| }
|
| + for (size_t i = 0; i < downloads.size(); ++i) {
|
| + if (downloads[i]->downloader)
|
| + downloads[i]->downloader->Stop();
|
| + }
|
| + downloads.clear();
|
| }
|
| };
|
|
|
| @@ -72,7 +115,10 @@
|
|
|
| ScopedComPtr<IDataObject> source_object_;
|
|
|
| - LONG ref_count_;
|
| + bool is_aborting_;
|
| + bool in_async_mode_;
|
| + bool async_operation_started_;
|
| + Observer* observer_;
|
| };
|
|
|
| class OSExchangeDataProviderWin : public OSExchangeData::Provider {
|
| @@ -84,7 +130,9 @@
|
| // that url.
|
| static bool GetPlainTextURL(IDataObject* source, GURL* url);
|
|
|
| + static DataObjectImpl* GetDataObjectImpl(const OSExchangeData& data);
|
| static IDataObject* GetIDataObject(const OSExchangeData& data);
|
| + static IAsyncOperation* GetIAsyncOperation(const OSExchangeData& data);
|
|
|
| explicit OSExchangeDataProviderWin(IDataObject* source);
|
| OSExchangeDataProviderWin();
|
| @@ -92,6 +140,7 @@
|
| virtual ~OSExchangeDataProviderWin();
|
|
|
| IDataObject* data_object() const { return data_.get(); }
|
| + IAsyncOperation* async_operation() const { return data_.get(); }
|
|
|
| // OSExchangeData::Provider methods.
|
| virtual void SetString(const std::wstring& data);
|
| @@ -117,6 +166,8 @@
|
| virtual bool HasFileContents() const;
|
| virtual bool HasHtml() const;
|
| virtual bool HasCustomFormat(OSExchangeData::CustomFormat format) const;
|
| + virtual void SetDownloadFileInfo(
|
| + OSExchangeData::DownloadFileInfo* download_info);
|
|
|
| private:
|
| scoped_refptr<DataObjectImpl> data_;
|
|
|