annotate foosdk/sdk/libPPUI/IDataObjectUtils.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <shlobj.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <ShlDisp.h> // IAsyncOperation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "pp-COM-macros.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 namespace IDataObjectUtils {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class ReleaseStgMediumScope {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 ReleaseStgMediumScope(STGMEDIUM * medium) : m_medium(medium) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 ~ReleaseStgMediumScope() {if (m_medium != NULL) ReleaseStgMedium(m_medium);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 STGMEDIUM * m_medium;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 PFC_CLASS_NOT_COPYABLE_EX(ReleaseStgMediumScope)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 static constexpr DWORD DataBlockToSTGMEDIUM_SupportedTymeds = TYMED_ISTREAM | TYMED_HGLOBAL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 static constexpr DWORD ExtractDataObjectContent_SupportedTymeds = TYMED_ISTREAM | TYMED_HGLOBAL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 HRESULT DataBlockToSTGMEDIUM(const void * blockPtr, t_size blockSize, STGMEDIUM * medium, DWORD tymed, bool bHere) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 HGLOBAL HGlobalFromMemblock(const void * ptr,t_size size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 HRESULT ExtractDataObjectContent(pfc::com_ptr_t<IDataObject> obj, UINT format, DWORD aspect, LONG index, pfc::array_t<t_uint8> & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 HRESULT ExtractDataObjectContent(pfc::com_ptr_t<IDataObject> obj, UINT format, pfc::array_t<t_uint8> & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 HRESULT ExtractDataObjectContentTest(pfc::com_ptr_t<IDataObject> obj, UINT format, DWORD aspect, LONG index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 HRESULT ExtractDataObjectContentTest(pfc::com_ptr_t<IDataObject> obj, UINT format);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 HRESULT ExtractDataObjectString(pfc::com_ptr_t<IDataObject> obj, pfc::string_base & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 HRESULT SetDataObjectString(pfc::com_ptr_t<IDataObject> obj, const char * str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 HRESULT SetDataObjectContent(pfc::com_ptr_t<IDataObject> obj, UINT format, DWORD aspect, LONG index, const void * data, t_size dataSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 HRESULT STGMEDIUMToDataBlock(const STGMEDIUM & med, pfc::array_t<t_uint8> & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 HRESULT ExtractDataObjectDWORD(pfc::com_ptr_t<IDataObject> obj, UINT format, DWORD & val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 HRESULT SetDataObjectDWORD(pfc::com_ptr_t<IDataObject> obj, UINT format, DWORD val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 HRESULT PasteSucceeded(pfc::com_ptr_t<IDataObject> obj, DWORD effect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 class comparator_FORMATETC {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 static int compare(const FORMATETC & v1, const FORMATETC & v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 int val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 val = pfc::compare_t(v1.cfFormat,v2.cfFormat); if (val != 0) return val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 val = pfc::compare_t(v1.dwAspect,v2.dwAspect); if (val != 0) return val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 val = pfc::compare_t(v1.lindex, v2.lindex ); if (val != 0) return val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 class CDataObjectBase : public IDataObject {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 COM_QI_SIMPLE(IDataObject)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 HRESULT STDMETHODCALLTYPE GetData(FORMATETC * formatetc, STGMEDIUM * medium) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 return GetData_internal(formatetc,medium,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 HRESULT STDMETHODCALLTYPE GetDataHere(FORMATETC * formatetc, STGMEDIUM * medium) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 return GetData_internal(formatetc,medium,true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 HRESULT STDMETHODCALLTYPE QueryGetData(FORMATETC * formatetc) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 if (formatetc == NULL) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if ((DataBlockToSTGMEDIUM_SupportedTymeds & formatetc->tymed) == 0) return DV_E_TYMED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 return RenderDataTest(formatetc->cfFormat,formatetc->dwAspect,formatetc->lindex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 } PP_COM_CATCH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(FORMATETC * in, FORMATETC * out) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //check this again
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 if (in == NULL || out == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 *out = *in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 return DATA_S_SAMEFORMATETC;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 HRESULT STDMETHODCALLTYPE EnumFormatEtc(DWORD dwDirection,IEnumFORMATETC ** ppenumFormatetc) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 if (dwDirection == DATADIR_GET) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 if (ppenumFormatetc == NULL) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 return CreateIEnumFORMATETC(ppenumFormatetc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 } else if (dwDirection == DATADIR_SET) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 return E_NOTIMPL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 HRESULT STDMETHODCALLTYPE SetData(FORMATETC * pFormatetc, STGMEDIUM * pmedium, BOOL fRelease) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 ReleaseStgMediumScope relScope(fRelease ? pmedium : NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 if (pFormatetc == NULL || pmedium == NULL) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 /*TCHAR buf[256];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 if (GetClipboardFormatName(pFormatetc->cfFormat,buf,PFC_TABSIZE(buf)) > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 buf[PFC_TABSIZE(buf)-1] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 OutputDebugString(TEXT("SetData: ")); OutputDebugString(buf); OutputDebugString(TEXT("\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 OutputDebugString(TEXT("SetData: unknown clipboard format.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }*/
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 pfc::array_t<t_uint8> temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 HRESULT state = STGMEDIUMToDataBlock(*pmedium,temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 if (FAILED(state)) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 m_entries.set(*pFormatetc,temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 } PP_COM_CATCH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 HRESULT STDMETHODCALLTYPE DAdvise(FORMATETC* pFormatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection) override { (void)pFormatetc; (void)advf; (void)pAdvSink; (void)pdwConnection; return OLE_E_ADVISENOTSUPPORTED; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 HRESULT STDMETHODCALLTYPE DUnadvise(DWORD dwConnection) override { (void)dwConnection; return OLE_E_ADVISENOTSUPPORTED; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 HRESULT STDMETHODCALLTYPE EnumDAdvise(IEnumSTATDATA** ppenumAdvise) override { (void)ppenumAdvise; return OLE_E_ADVISENOTSUPPORTED; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 typedef pfc::array_t<uint8_t> data_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 virtual HRESULT RenderData(UINT format,DWORD aspect,LONG dataIndex, data_t & out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 FORMATETC fmt = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 fmt.cfFormat = (CLIPFORMAT)format; fmt.dwAspect = aspect; fmt.lindex = dataIndex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 const pfc::array_t<t_uint8> * entry = m_entries.query_ptr(fmt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (entry != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 out = * entry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 return DV_E_FORMATETC;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 virtual HRESULT RenderDataTest(UINT format,DWORD aspect,LONG dataIndex) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 FORMATETC fmt = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 fmt.cfFormat = (CLIPFORMAT)format; fmt.dwAspect = aspect; fmt.lindex = dataIndex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 if (m_entries.have_item(fmt)) return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 return DV_E_FORMATETC;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 typedef pfc::list_base_t<FORMATETC> TFormatList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 static void AddFormat(TFormatList & out,UINT code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 FORMATETC fmt = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 fmt.dwAspect = DVASPECT_CONTENT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 fmt.lindex = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 fmt.cfFormat = (CLIPFORMAT)code;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 for(t_size medWalk = 0; medWalk < 32; ++medWalk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 const DWORD med = 1 << medWalk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 if ((DataBlockToSTGMEDIUM_SupportedTymeds & med) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 fmt.tymed = med;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 out.add_item(fmt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 virtual void EnumFormats(TFormatList & out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 pfc::avltree_t<UINT> formats;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 for(auto walk = m_entries.cfirst(); walk.is_valid(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 formats.add_item( walk->m_key.cfFormat );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 for(auto walk = formats.cfirst(); walk.is_valid(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 AddFormat(out, *walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 HRESULT CreateIEnumFORMATETC(IEnumFORMATETC ** outptr) const throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 pfc::list_t<FORMATETC> out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 EnumFormats(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 return SHCreateStdEnumFmtEtc((UINT)out.get_count(), out.get_ptr(), outptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 } PP_COM_CATCH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 HRESULT GetData_internal(FORMATETC * formatetc, STGMEDIUM * medium,bool bHere) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 if (formatetc == NULL || medium == NULL) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 data_t out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 HRESULT hr = RenderData(formatetc->cfFormat,formatetc->dwAspect,formatetc->lindex,out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 if (FAILED(hr)) return hr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 return DataBlockToSTGMEDIUM(out.get_ptr(),out.get_size(),medium,formatetc->tymed,bHere);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 } PP_COM_CATCH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 typedef pfc::map_t<FORMATETC, pfc::array_t<t_uint8>, comparator_FORMATETC> t_entries;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 t_entries m_entries;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 #ifdef __IDataObjectAsyncCapability_INTERFACE_DEFINED__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 typedef IDataObjectAsyncCapability IDataObjectAsyncCapability_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 typedef IAsyncOperation IDataObjectAsyncCapability_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 class CAsyncDataObjectBase : public CDataObjectBase, public IDataObjectAsyncCapability_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 BOOL m_inOperation = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 BOOL m_asyncMode = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 COM_QI_BEGIN()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 COM_QI_CHAIN(CDataObjectBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 COM_QI_ENTRY(IDataObjectAsyncCapability_t)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 COM_QI_END()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 HRESULT STDMETHODCALLTYPE SetAsyncMode(BOOL fDoOpAsync) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 m_asyncMode = fDoOpAsync;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 HRESULT STDMETHODCALLTYPE GetAsyncMode(BOOL *pfIsOpAsync) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 if ( pfIsOpAsync == nullptr ) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 *pfIsOpAsync = m_asyncMode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 HRESULT STDMETHODCALLTYPE StartOperation(IBindCtx *pbcReserved) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 (void)pbcReserved;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 m_inOperation = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 HRESULT STDMETHODCALLTYPE InOperation(BOOL *pfInAsyncOp) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 if ( pfInAsyncOp == nullptr ) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 *pfInAsyncOp = m_inOperation;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 HRESULT STDMETHODCALLTYPE EndOperation(HRESULT hResult,IBindCtx *pbcReserved,DWORD dwEffects) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 (void)hResult; (void)pbcReserved; (void)dwEffects;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 m_inOperation = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 }