annotate foosdk/sdk/libPPUI/IDataObjectUtils.cpp @ 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 #include "stdafx.h"
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 "IDataObjectUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 HRESULT IDataObjectUtils::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
6 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 if (bHere) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 switch(tymed) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 case TYMED_ISTREAM:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 if (medium->pstm == NULL) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 ULONG written = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 HRESULT state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 state = medium->pstm->Write(blockPtr, pfc::downcast_guarded<ULONG>(blockSize),&written);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 if (FAILED(state)) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 if (written != blockSize) return STG_E_MEDIUMFULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 return S_OK;
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 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 return DV_E_TYMED;
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 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 if (tymed & TYMED_HGLOBAL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 HGLOBAL hMem = HGlobalFromMemblock(blockPtr, blockSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 if (hMem == NULL) return E_OUTOFMEMORY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 medium->tymed = TYMED_HGLOBAL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 medium->hGlobal = hMem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 medium->pUnkForRelease = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 if (tymed & TYMED_ISTREAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 HRESULT state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 HGLOBAL hMem = HGlobalFromMemblock(blockPtr, blockSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 if (hMem == NULL) return E_OUTOFMEMORY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 medium->tymed = TYMED_ISTREAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 pfc::com_ptr_t<IStream> stream;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 if (FAILED( state = CreateStreamOnHGlobal(hMem,TRUE,stream.receive_ptr()) ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 GlobalFree(hMem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
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 LARGE_INTEGER wtf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 if (FAILED( state = stream->Seek(wtf,STREAM_SEEK_END,NULL) ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 medium->pstm = stream.detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 medium->pUnkForRelease = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return DV_E_TYMED;
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 } catch(pfc::exception_not_implemented const &) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 return E_NOTIMPL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 } catch(std::bad_alloc const &) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 return E_OUTOFMEMORY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 } catch(...) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 return E_UNEXPECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }
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 HGLOBAL IDataObjectUtils::HGlobalFromMemblock(const void * ptr,t_size size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 HGLOBAL handle = GlobalAlloc(GMEM_MOVEABLE,size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 if (handle != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 void * destptr = GlobalLock(handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (destptr == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 GlobalFree(handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 handle = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 memcpy(destptr,ptr,size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 GlobalUnlock(handle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 return handle;
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 IDataObjectUtils::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
79 FORMATETC fmt = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 fmt.cfFormat = (CLIPFORMAT)format; fmt.dwAspect = aspect; fmt.lindex = index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 fmt.tymed = TYMED_HGLOBAL /* | TYMED_ISTREAM*/;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 STGMEDIUM med = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 HRESULT state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 if (FAILED( state = obj->GetData(&fmt,&med) ) ) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 ReleaseStgMediumScope relScope(&med);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 return STGMEDIUMToDataBlock(med, out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 HRESULT IDataObjectUtils::STGMEDIUMToDataBlock(const STGMEDIUM & med, pfc::array_t<t_uint8> & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 switch(med.tymed) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 case TYMED_HGLOBAL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 CGlobalLockScope lock(med.hGlobal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 out.set_data_fromptr( (const t_uint8*) lock.GetPtr(), lock.GetSize() );
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 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 case TYMED_ISTREAM:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 HRESULT state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 IStream * stream = med.pstm;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 LARGE_INTEGER offset = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 STATSTG stats = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 if (FAILED( state = stream->Stat(&stats,STATFLAG_NONAME ) ) ) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 t_size toRead = pfc::downcast_guarded<t_size>(stats.cbSize.QuadPart);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 out.set_size(toRead);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 if (FAILED( state = stream->Seek(offset,STREAM_SEEK_SET,NULL) ) ) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 ULONG cbRead = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 if (FAILED( state = stream->Read(out.get_ptr(), pfc::downcast_guarded<ULONG>(toRead), &cbRead) ) ) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 if (cbRead != toRead) return E_UNEXPECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 return DV_E_TYMED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 HRESULT IDataObjectUtils::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
119 return ExtractDataObjectContent(obj, format, DVASPECT_CONTENT, -1, out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 HRESULT IDataObjectUtils::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
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 = index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 for(t_uint32 walk = 0; walk < 32; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 const DWORD tymed = 1 << walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if ((ExtractDataObjectContent_SupportedTymeds & tymed) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 fmt.tymed = tymed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 HRESULT state = obj->QueryGetData(&fmt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 if (SUCCEEDED(state)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 if (state == S_OK) return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 if (state != DV_E_TYMED) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 return E_FAIL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
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 HRESULT IDataObjectUtils::ExtractDataObjectContentTest(pfc::com_ptr_t<IDataObject> obj, UINT format) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 return ExtractDataObjectContentTest(obj,format,DVASPECT_CONTENT,-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 HRESULT IDataObjectUtils::ExtractDataObjectString(pfc::com_ptr_t<IDataObject> obj, pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 pfc::array_t<t_uint8> data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 HRESULT state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 state = ExtractDataObjectContent(obj,CF_UNICODETEXT,data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 if (SUCCEEDED(state)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 out = pfc::stringcvt::string_utf8_from_os_ex( (const wchar_t*) data.get_ptr(), data.get_size() / sizeof(wchar_t) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 return S_OK;
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 state = ExtractDataObjectContent(obj,CF_TEXT,data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if (SUCCEEDED(state)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 out = pfc::stringcvt::string_utf8_from_os_ex( (const char*) data.get_ptr(), data.get_size() / sizeof(char) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 return E_FAIL;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 HRESULT IDataObjectUtils::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
161 STGMEDIUM med = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 FORMATETC fmt = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 fmt.cfFormat = (CLIPFORMAT)format; fmt.dwAspect = aspect; fmt.lindex = index; fmt.tymed = TYMED_HGLOBAL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 HRESULT state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 if (FAILED(state = DataBlockToSTGMEDIUM(data,dataSize,&med,TYMED_HGLOBAL,false))) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 return obj->SetData(&fmt,&med,TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 HRESULT IDataObjectUtils::SetDataObjectString(pfc::com_ptr_t<IDataObject> obj, const char * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 pfc::stringcvt::string_wide_from_utf8 s(str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 return SetDataObjectContent(obj,CF_UNICODETEXT,DVASPECT_CONTENT,-1,s.get_ptr(), (s.length()+1) * sizeof(s[0]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
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 HRESULT IDataObjectUtils::ExtractDataObjectDWORD(pfc::com_ptr_t<IDataObject> obj, UINT format, DWORD & val) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 HRESULT state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 pfc::array_t<t_uint8> buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 if (FAILED( state = ExtractDataObjectContent(obj, format, DVASPECT_CONTENT, -1, buffer) ) ) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 if (buffer.get_size() < sizeof(val)) return E_UNEXPECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 val = *(DWORD*) buffer.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 return S_OK;
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 HRESULT IDataObjectUtils::SetDataObjectDWORD(pfc::com_ptr_t<IDataObject> obj, UINT format, DWORD val) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 return SetDataObjectContent(obj,format,DVASPECT_CONTENT,-1,&val,sizeof(val));
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 HRESULT IDataObjectUtils::PasteSucceeded(pfc::com_ptr_t<IDataObject> obj, DWORD effect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 return SetDataObjectDWORD(obj, RegisterClipboardFormat(CFSTR_PASTESUCCEEDED), effect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }