source: trunk/src/shell32/clipboard.cpp@ 4032

Last change on this file since 4032 was 4032, checked in by phaller, 25 years ago

Synchronized shell32 with wine

File size: 7.7 KB
Line 
1/*
2 * clipboard helper functions
3 *
4 * Copyright 2000 Juergen Schmied <juergen.schmied@debitel.de>
5 *
6 * For copy & paste functions within contextmenus does the shell use
7 * the OLE clipboard functions in combination with dataobjects.
8 * The OLE32.DLL gets loaded with LoadLibrary
9 *
10 * - a right mousebutton-copy sets the following formats:
11 * classic:
12 * Shell IDList Array
13 * Prefered Drop Effect
14 * Shell Object Offsets
15 * HDROP
16 * FileName
17 * ole:
18 * OlePrivateData (ClipboardDataObjectInterface)
19 *
20 */
21/*****************************************************************************
22 * Includes *
23 *****************************************************************************/
24
25#include <stdlib.h>
26#include <string.h>
27#include <odin.h>
28#include <odinwrap.h>
29#include <os2sel.h>
30
31#define ICOM_CINTERFACE 1
32
33#include <string.h>
34
35#include "debugtools.h"
36
37#include "pidl.h"
38#include "wine/undocshell.h"
39#include "shell32_main.h"
40#include "shell.h" /* DROPFILESTRUCT */
41
42
43/*****************************************************************************
44 * Local Variables *
45 *****************************************************************************/
46
47ODINDEBUGCHANNEL(shell32-clipboard)
48
49static int refClipCount = 0;
50static HINSTANCE hShellOle32 = 0;
51
52/* exported via shell32_main.h */
53HRESULT (WINAPI* pOleInitialize)(LPVOID reserved);
54void (WINAPI* pOleUninitialize)(void);
55HRESULT (WINAPI* pRegisterDragDrop)(HWND hwnd, IDropTarget* pDropTarget);
56HRESULT (WINAPI* pRevokeDragDrop)(HWND hwnd);
57HRESULT (WINAPI* pDoDragDrop)(LPDATAOBJECT,LPDROPSOURCE,DWORD,DWORD*);
58void (WINAPI* pReleaseStgMedium)(STGMEDIUM* pmedium);
59HRESULT (WINAPI* pOleSetClipboard)(IDataObject* pDataObj);
60HRESULT (WINAPI* pOleGetClipboard)(IDataObject** ppDataObj);
61
62/**************************************************************************
63 * InitShellOle
64 *
65 *
66 */
67void InitShellOle(void)
68{
69}
70
71/**************************************************************************
72 * FreeShellOle
73 *
74 * unload OLE32.DLL
75 */
76void FreeShellOle(void)
77{
78 if (!--refClipCount)
79 {
80 pOleUninitialize();
81 FreeLibrary(hShellOle32);
82 }
83}
84
85/*************************************************************************
86 * SHELL32 LibMain
87 *
88 * NOTES
89 * calling oleinitialize here breaks sone apps.
90 */
91
92static void Shell32ProcLoadHelper(LPVOID* pAddr,
93 HANDLE hModule,
94 LPCSTR lpstrName)
95{
96 *pAddr = (void*)GetProcAddress(hModule,lpstrName);
97
98 if (!pAddr)
99 dprintf(("Shell32-clipboard: Shell32ProcLoadHelper(%08xh,%08xh,%s) failed!\n",
100 pAddr,
101 hModule,
102 lpstrName));
103}
104
105
106/**************************************************************************
107 * LoadShellOle
108 *
109 * make sure OLE32.DLL is loaded
110 */
111BOOL GetShellOle(void)
112{
113 if(!refClipCount)
114 {
115 hShellOle32 = LoadLibraryA("ole32.dll");
116 if(hShellOle32)
117 {
118 Shell32ProcLoadHelper((LPVOID*)&pOleInitialize, hShellOle32,"OleInitialize");
119 Shell32ProcLoadHelper((LPVOID*)&pOleUninitialize, hShellOle32,"OleUninitialize");
120 Shell32ProcLoadHelper((LPVOID*)&pRegisterDragDrop,hShellOle32,"RegisterDragDrop");
121 Shell32ProcLoadHelper((LPVOID*)&pRevokeDragDrop, hShellOle32,"RevokeDragDrop");
122 Shell32ProcLoadHelper((LPVOID*)&pDoDragDrop, hShellOle32,"DoDragDrop");
123 Shell32ProcLoadHelper((LPVOID*)&pReleaseStgMedium,hShellOle32,"ReleaseStgMedium");
124 Shell32ProcLoadHelper((LPVOID*)&pOleSetClipboard, hShellOle32,"OleSetClipboard");
125 Shell32ProcLoadHelper((LPVOID*)&pOleGetClipboard, hShellOle32,"OleGetClipboard");
126
127 pOleInitialize(NULL);
128 refClipCount++;
129 }
130 }
131 return TRUE;
132}
133
134/**************************************************************************
135 * RenderHDROP
136 *
137 * creates a CF_HDROP structure
138 */
139HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
140{
141 int i;
142 int rootsize = 0,size = 0;
143 char szRootPath[MAX_PATH];
144 char szFileName[MAX_PATH];
145 HGLOBAL hGlobal;
146 LPDROPFILESTRUCT pDropFiles;
147 int offset;
148
149 TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
150
151 /* get the size needed */
152 size = sizeof(DROPFILESTRUCT);
153
154 SHGetPathFromIDListA(pidlRoot, szRootPath);
155 PathAddBackslashA(szRootPath);
156 rootsize = strlen(szRootPath);
157
158 for (i=0; i<cidl;i++)
159 {
160 _ILSimpleGetText(apidl[i], szFileName, MAX_PATH);
161 size += rootsize + strlen(szFileName) + 1;
162 }
163
164 size++;
165
166 /* Fill the structure */
167 hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
168 if(!hGlobal) return hGlobal;
169
170 pDropFiles = (LPDROPFILESTRUCT)GlobalLock(hGlobal);
171 pDropFiles->lSize = sizeof(DROPFILESTRUCT);
172 pDropFiles->fWideChar = FALSE;
173
174 offset = pDropFiles->lSize;
175 strcpy(szFileName, szRootPath);
176
177 for (i=0; i<cidl;i++)
178 {
179
180 _ILSimpleGetText(apidl[i], szFileName + rootsize, MAX_PATH - rootsize);
181 size = strlen(szFileName) + 1;
182 strcpy(((char*)pDropFiles)+offset, szFileName);
183 offset += size;
184 }
185
186 ((char*)pDropFiles)[offset] = 0;
187 GlobalUnlock(hGlobal);
188
189 return hGlobal;
190}
191
192HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
193{
194 int i,offset = 0, sizePidl, size;
195 HGLOBAL hGlobal;
196 LPCIDA pcida;
197
198 TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
199
200 /* get the size needed */
201 size = sizeof(CIDA) + sizeof (UINT)*(cidl); /* header */
202 size += ILGetSize (pidlRoot); /* root pidl */
203 for(i=0; i<cidl; i++)
204 {
205 size += ILGetSize(apidl[i]); /* child pidls */
206 }
207
208 /* fill the structure */
209 hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
210 if(!hGlobal) return hGlobal;
211 pcida = (CIDA*)GlobalLock (hGlobal);
212 pcida->cidl = cidl;
213
214 /* root pidl */
215 offset = sizeof(CIDA) + sizeof (UINT)*(cidl);
216 pcida->aoffset[0] = offset; /* first element */
217 sizePidl = ILGetSize (pidlRoot);
218 memcpy(((LPBYTE)pcida)+offset, pidlRoot, sizePidl);
219 offset += sizePidl;
220
221 for(i=0; i<cidl; i++) /* child pidls */
222 {
223 pcida->aoffset[i+1] = offset;
224 sizePidl = ILGetSize(apidl[i]);
225 memcpy(((LPBYTE)pcida)+offset, apidl[i], sizePidl);
226 offset += sizePidl;
227 }
228
229 GlobalUnlock(hGlobal);
230 return hGlobal;
231}
232
233HGLOBAL RenderSHELLIDLISTOFFSET (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
234{
235 FIXME("\n");
236 return 0;
237}
238
239HGLOBAL RenderFILECONTENTS (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
240{
241 FIXME("\n");
242 return 0;
243}
244
245HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
246{
247 FIXME("\n");
248 return 0;
249}
250
251HGLOBAL RenderFILENAME (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
252{
253 int len, size = 0;
254 char szTemp[MAX_PATH], *szFileName;
255 HGLOBAL hGlobal;
256
257 TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
258
259 /* build name of first file */
260 SHGetPathFromIDListA(pidlRoot, szTemp);
261 PathAddBackslashA(szTemp);
262 len = strlen(szTemp);
263 _ILSimpleGetText(apidl[0], szTemp+len, MAX_PATH - len);
264 size = strlen(szTemp) + 1;
265
266 /* fill the structure */
267 hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
268 if(!hGlobal) return hGlobal;
269 szFileName = (char *)GlobalLock(hGlobal);
270 GlobalUnlock(hGlobal);
271 return hGlobal;
272}
273
274HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags)
275{
276 DWORD * pdwFlag;
277 HGLOBAL hGlobal;
278
279 TRACE("(0x%08lx)\n", dwFlags);
280
281 hGlobal = GlobalAlloc(GHND|GMEM_SHARE, sizeof(DWORD));
282 if(!hGlobal) return hGlobal;
283 pdwFlag = (DWORD*)GlobalLock(hGlobal);
284 *pdwFlag = dwFlags;
285 GlobalUnlock(hGlobal);
286 return hGlobal;
287}
288
289/**************************************************************************
290 * IsDataInClipboard
291 *
292 * checks if there is something in the clipboard we can use
293 */
294BOOL IsDataInClipboard (HWND hwnd)
295{
296 BOOL ret = FALSE;
297
298 if (OpenClipboard(hwnd))
299 {
300 if (GetOpenClipboardWindow())
301 {
302 ret = IsClipboardFormatAvailable(CF_TEXT);
303 }
304 CloseClipboard();
305 }
306 return ret;
307}
Note: See TracBrowser for help on using the repository browser.