Added version information.
[wine] / dlls / ole32 / ole2stubs.c
1 /*
2  * Temporary place for ole2 stubs.
3  *
4  * Copyright (C) 1999 Corel Corporation
5  * Move these functions to dlls/ole32/ole2impl.c when you implement them.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #define NONAMELESSUNION
23 #define NONAMELESSSTRUCT
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
28 #include "objidl.h"
29 #include "wine/debug.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(ole);
32
33 /******************************************************************************
34  *               OleCreateLinkToFile        [OLE32.96]
35  */
36 HRESULT WINAPI  OleCreateLinkToFile(LPCOLESTR lpszFileName, REFIID riid,
37                         DWORD renderopt, LPFORMATETC lpFormatEtc,
38                         LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID* ppvObj)
39 {
40     FIXME("(%p,%p,%li,%p,%p,%p,%p), stub!\n",lpszFileName, riid, renderopt, lpFormatEtc, pClientSite, pStg, ppvObj);
41     return E_NOTIMPL;
42 }
43
44
45 /******************************************************************************
46  *              OleDuplicateData        [OLE32.102]
47  */
48 HRESULT WINAPI OleDuplicateData(HANDLE hSrc, CLIPFORMAT cfFormat,
49                                   UINT uiFlags)
50 {
51     FIXME("(%p,%x,%x), stub!\n", hSrc, cfFormat, uiFlags);
52     return E_NOTIMPL;
53 }
54
55
56 /***********************************************************************
57  *             OleTranslateAccelerator [OLE32.130]
58  */
59 HRESULT WINAPI OleTranslateAccelerator (LPOLEINPLACEFRAME lpFrame,
60                    LPOLEINPLACEFRAMEINFO lpFrameInfo, LPMSG lpmsg)
61 {
62     FIXME("(%p,%p,%p),stub!\n", lpFrame, lpFrameInfo, lpmsg);
63     return S_OK;
64 }
65
66 /******************************************************************************
67  *              SetConvertStg        [OLE32.142]
68  */
69 HRESULT WINAPI SetConvertStg(LPSTORAGE pStg, BOOL fConvert)
70 {
71   FIXME("(%p,%x), stub!\n", pStg, fConvert);
72   return E_NOTIMPL;
73 }
74
75 /******************************************************************************
76  *              OleCreate        [OLE32.89]
77  *
78  */
79 HRESULT WINAPI OleCreate(
80         REFCLSID rclsid,
81         REFIID riid,
82         DWORD renderopt,
83         LPFORMATETC pFormatEtc,
84         LPOLECLIENTSITE pClientSite,
85         LPSTORAGE pStg,
86         LPVOID* ppvObj)
87 {
88   HRESULT hres, hres1;
89   IUnknown * pUnk = NULL;
90
91   FIXME("\n\t%s\n\t%s stub!\n", debugstr_guid(rclsid), debugstr_guid(riid));
92
93   if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER , riid, (LPVOID*)&pUnk))))
94   {
95     if (pClientSite)
96     {
97       IOleObject * pOE;
98       IPersistStorage * pPS;
99       if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)&pOE))))
100       {
101         TRACE("trying to set clientsite %p\n", pClientSite);
102         hres1 = IOleObject_SetClientSite(pOE, pClientSite);
103         TRACE("-- result 0x%08lx\n", hres1);
104         IOleObject_Release(pOE);
105       }
106       if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)&pPS))))
107       {
108         TRACE("trying to set stg %p\n", pStg);
109         hres1 = IPersistStorage_InitNew(pPS, pStg);
110         TRACE("-- result 0x%08lx\n", hres1);
111         IPersistStorage_Release(pPS);
112       }
113     }
114   }
115
116   *ppvObj = pUnk;
117
118   TRACE("-- %p \n", pUnk);
119   return hres;
120 }
121
122 /******************************************************************************
123  *              OleCreateLink        [OLE32.94]
124  */
125 HRESULT WINAPI OleCreateLink(LPMONIKER pmkLinkSrc, REFIID riid, DWORD renderopt, LPFORMATETC lpFormatEtc,
126                 LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID* ppvObj)
127 {
128   FIXME("(not shown), stub!\n");
129   return E_NOTIMPL;
130 }
131
132 /******************************************************************************
133  *              OleCreateFromFile        [OLE32.93]
134  */
135 HRESULT WINAPI OleCreateFromFile(REFCLSID rclsid, LPCOLESTR lpszFileName, REFIID riid,
136             DWORD renderopt, LPFORMATETC lpFormatEtc, LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID* ppvObj)
137 {
138   FIXME("(not shown), stub!\n");
139   return E_NOTIMPL;
140 }
141
142
143 /******************************************************************************
144  *              OleGetIconOfClass        [OLE32.106]
145  */
146 HGLOBAL WINAPI OleGetIconOfClass(REFCLSID rclsid, LPOLESTR lpszLabel, BOOL fUseTypeAsLabel)
147 {
148   FIXME("(%p,%p,%x), stub!\n", rclsid, lpszLabel, fUseTypeAsLabel);
149   return NULL;
150 }
151
152
153 /******************************************************************************
154  *              OleCreateStaticFromData        [OLE32.98]
155  */
156 HRESULT     WINAPI OleCreateStaticFromData(LPDATAOBJECT pSrcDataObj, REFIID iid,
157                 DWORD renderopt, LPFORMATETC pFormatEtc, LPOLECLIENTSITE pClientSite,
158                 LPSTORAGE pStg, LPVOID* ppvObj)
159 {
160   FIXME("(not shown), stub!\n");
161   return E_NOTIMPL;
162 }
163
164 /******************************************************************************
165  *              OleCreateLinkFromData        [OLE32.95]
166  */
167
168 HRESULT WINAPI  OleCreateLinkFromData(LPDATAOBJECT pSrcDataObj, REFIID riid,
169                 DWORD renderopt, LPFORMATETC pFormatEtc,
170                 LPOLECLIENTSITE pClientSite, LPSTORAGE pStg,
171                 LPVOID* ppvObj)
172 {
173   FIXME("(not shown), stub!\n");
174   return E_NOTIMPL;
175 }
176
177 /******************************************************************************
178  *              OleIsRunning        [OLE32.111]
179  */
180 BOOL WINAPI OleIsRunning(LPOLEOBJECT pObject)
181 {
182   FIXME("(%p), stub!\n", pObject);
183   return TRUE;
184 }
185
186 /***********************************************************************
187  *           OleRegEnumVerbs    [OLE32.120]
188  */
189 HRESULT WINAPI OleRegEnumVerbs (REFCLSID clsid, LPENUMOLEVERB* ppenum)
190 {
191     FIXME("(%p,%p), stub!\n", clsid, ppenum);
192     return OLEOBJ_E_NOVERBS;
193 }
194
195 /***********************************************************************
196  *           OleRegEnumFormatEtc    [OLE32.119]
197  */
198 HRESULT     WINAPI OleRegEnumFormatEtc (
199   REFCLSID clsid,
200   DWORD    dwDirection,
201   LPENUMFORMATETC* ppenumFormatetc)
202 {
203     FIXME("(%p, %ld, %p), stub!\n", clsid, dwDirection, ppenumFormatetc);
204
205     return E_NOTIMPL;
206 }
207
208 /***********************************************************************
209  *           OLE_FreeClipDataArray   [internal]
210  *
211  * NOTES:
212  *  frees the data associated with an array of CLIPDATAs
213  */
214 static void OLE_FreeClipDataArray(ULONG count, CLIPDATA * pClipDataArray)
215 {
216     ULONG i;
217     for (i = 0; i < count; i++)
218     {
219         if (pClipDataArray[i].pClipData)
220         {
221             CoTaskMemFree(pClipDataArray[i].pClipData);
222         }
223     }
224 }
225
226 HRESULT WINAPI FreePropVariantArray(ULONG,PROPVARIANT*);
227
228 /***********************************************************************
229  *           PropVariantClear                       [OLE32.166]
230  */
231 HRESULT WINAPI PropVariantClear(PROPVARIANT * pvar) /* [in/out] */
232 {
233         TRACE("(%p)\n", pvar);
234
235         if (!pvar)
236             return S_OK;
237
238         switch(pvar->vt)
239         {
240             case VT_STREAM:
241             case VT_STREAMED_OBJECT:
242             case VT_STORAGE:
243             case VT_STORED_OBJECT:
244                 IUnknown_Release((LPUNKNOWN)pvar->u.pStream);
245                 break;
246             case VT_CLSID:
247             case VT_LPSTR:
248             case VT_LPWSTR:
249                 CoTaskMemFree(pvar->u.puuid); /* pick an arbitary typed pointer - we don't care about the type as we are just freeing it */
250                 break;
251             case VT_BLOB:
252             case VT_BLOB_OBJECT:
253                 CoTaskMemFree(pvar->u.blob.pBlobData);
254                 break;
255             case VT_BSTR:
256                 FIXME("Need to load OLEAUT32 for SysFreeString\n");
257                 /* SysFreeString(pvar->u.bstrVal); */
258                 break;
259             case VT_CF:
260                 if (pvar->u.pclipdata)
261                 {
262                         OLE_FreeClipDataArray(1, pvar->u.pclipdata);
263                         CoTaskMemFree(pvar->u.pclipdata);
264                 }
265                 break;
266             default:
267                 if (pvar->vt & VT_ARRAY)
268                 {
269                     FIXME("Need to call SafeArrayDestroy\n");
270 /*                  SafeArrayDestroy(pvar->u.caub); */
271                 }
272                 switch (pvar->vt & VT_VECTOR)
273                 {
274                 case VT_VARIANT:
275                         FreePropVariantArray(pvar->u.capropvar.cElems, pvar->u.capropvar.pElems);
276                         break;
277                 case VT_CF:
278                         OLE_FreeClipDataArray(pvar->u.caclipdata.cElems, pvar->u.caclipdata.pElems);
279                         break;
280                 case VT_BSTR:
281                 case VT_LPSTR:
282                 case VT_LPWSTR:
283                         FIXME("Freeing of vector sub-type not supported yet\n");
284                 }
285                 if (pvar->vt & VT_VECTOR)
286                 {
287                         CoTaskMemFree(pvar->u.capropvar.pElems); /* pick an arbitary VT_VECTOR structure - they all have the same memory layout */
288                 }
289         }
290
291         ZeroMemory(pvar, sizeof(*pvar));
292
293         return S_OK;
294 }
295
296 /***********************************************************************
297  *           PropVariantCopy                        [OLE32.246]
298  */
299 HRESULT WINAPI PropVariantCopy(PROPVARIANT *pvarDest,      /* [out] FIXME: PROPVARIANT * */
300                                const PROPVARIANT *pvarSrc) /* [in] FIXME: const PROPVARIANT * */
301 {
302         ULONG len;
303         TRACE("(%p, %p): stub:\n", pvarDest, pvarSrc);
304
305         /* this will deal with most cases */
306         CopyMemory(pvarDest, pvarSrc, sizeof(*pvarDest));
307
308         switch(pvarSrc->vt)
309         {
310         case VT_STREAM:
311         case VT_STREAMED_OBJECT:
312         case VT_STORAGE:
313         case VT_STORED_OBJECT:
314                 IUnknown_AddRef((LPUNKNOWN)pvarDest->u.pStream);
315                 break;
316         case VT_CLSID:
317                 pvarDest->u.puuid = CoTaskMemAlloc(sizeof(CLSID));
318                 CopyMemory(pvarDest->u.puuid, pvarSrc->u.puuid, sizeof(CLSID));
319                 break;
320         case VT_LPSTR:
321                 len = strlen(pvarSrc->u.pszVal);
322                 pvarDest->u.pszVal = CoTaskMemAlloc(len);
323                 CopyMemory(pvarDest->u.pszVal, pvarSrc->u.pszVal, len);
324                 break;
325         case VT_LPWSTR:
326                 len = lstrlenW(pvarSrc->u.pwszVal);
327                 pvarDest->u.pwszVal = CoTaskMemAlloc(len);
328                 CopyMemory(pvarDest->u.pwszVal, pvarSrc->u.pwszVal, len);
329                 break;
330         case VT_BLOB:
331         case VT_BLOB_OBJECT:
332                 if (pvarSrc->u.blob.pBlobData)
333                 {
334                         len = pvarSrc->u.blob.cbSize;
335                         pvarDest->u.blob.pBlobData = CoTaskMemAlloc(len);
336                         CopyMemory(pvarDest->u.blob.pBlobData, pvarSrc->u.blob.pBlobData, len);
337                 }
338                 break;
339         case VT_BSTR:
340                 FIXME("Need to copy BSTR\n");
341                 break;
342         case VT_CF:
343                 if (pvarSrc->u.pclipdata)
344                 {
345                         len = pvarSrc->u.pclipdata->cbSize - sizeof(pvarSrc->u.pclipdata->ulClipFmt);
346                         CoTaskMemAlloc(len);
347                         CopyMemory(pvarDest->u.pclipdata->pClipData, pvarSrc->u.pclipdata->pClipData, len);
348                 }
349                 break;
350         default:
351                 if (pvarSrc->vt & VT_ARRAY)
352                 {
353                     FIXME("Need to call SafeArrayCopy\n");
354 /*                  SafeArrayCopy(...); */
355                 }
356                 if (pvarSrc->vt & VT_VECTOR)
357                 {
358                         int elemSize;
359                         switch(pvarSrc->vt & VT_VECTOR)
360                         {
361                         case VT_I1:
362                                 elemSize = sizeof(pvarSrc->u.cVal);
363                                 break;
364                         case VT_UI1:
365                                 elemSize = sizeof(pvarSrc->u.bVal);
366                                 break;
367                         case VT_I2:
368                                 elemSize = sizeof(pvarSrc->u.iVal);
369                                 break;
370                         case VT_UI2:
371                                 elemSize = sizeof(pvarSrc->u.uiVal);
372                                 break;
373                         case VT_BOOL:
374                                 elemSize = sizeof(pvarSrc->u.boolVal);
375                                 break;
376                         case VT_I4:
377                                 elemSize = sizeof(pvarSrc->u.lVal);
378                                 break;
379                         case VT_UI4:
380                                 elemSize = sizeof(pvarSrc->u.ulVal);
381                                 break;
382                         case VT_R4:
383                                 elemSize = sizeof(pvarSrc->u.fltVal);
384                                 break;
385                         case VT_R8:
386                                 elemSize = sizeof(pvarSrc->u.dblVal);
387                                 break;
388                         case VT_ERROR:
389                                 elemSize = sizeof(pvarSrc->u.scode);
390                                 break;
391                         case VT_I8:
392                                 elemSize = sizeof(pvarSrc->u.hVal);
393                                 break;
394                         case VT_UI8:
395                                 elemSize = sizeof(pvarSrc->u.uhVal);
396                                 break;
397                         case VT_CY:
398                                 elemSize = sizeof(pvarSrc->u.cyVal);
399                                 break;
400                         case VT_DATE:
401                                 elemSize = sizeof(pvarSrc->u.date);
402                                 break;
403                         case VT_FILETIME:
404                                 elemSize = sizeof(pvarSrc->u.filetime);
405                                 break;
406                         case VT_CLSID:
407                                 elemSize = sizeof(*pvarSrc->u.puuid);
408                                 break;
409                         case VT_CF:
410                                 elemSize = sizeof(*pvarSrc->u.pclipdata);
411                                 break;
412                         case VT_BSTR:
413                         case VT_LPSTR:
414                         case VT_LPWSTR:
415                         case VT_VARIANT:
416                         default:
417                                 FIXME("Invalid element type: %ul\n", pvarSrc->vt & VT_VECTOR);
418                                 return E_INVALIDARG;
419                         }
420                         len = pvarSrc->u.capropvar.cElems;
421                         pvarDest->u.capropvar.pElems = CoTaskMemAlloc(len * elemSize);
422                         if (pvarSrc->vt == (VT_VECTOR | VT_VARIANT))
423                         {
424                                 ULONG i;
425                                 for (i = 0; i < len; i++)
426                                         PropVariantCopy(&pvarDest->u.capropvar.pElems[i], &pvarSrc->u.capropvar.pElems[i]);
427                         }
428                         else if (pvarSrc->vt == (VT_VECTOR | VT_CF))
429                         {
430                                 FIXME("Copy clipformats\n");
431                         }
432                         else if (pvarSrc->vt == (VT_VECTOR | VT_BSTR))
433                         {
434                                 FIXME("Copy BSTRs\n");
435                         }
436                         else if (pvarSrc->vt == (VT_VECTOR | VT_LPSTR))
437                         {
438                                 FIXME("Copy LPSTRs\n");
439                         }
440                         else if (pvarSrc->vt == (VT_VECTOR | VT_LPSTR))
441                         {
442                                 FIXME("Copy LPWSTRs\n");
443                         }
444                         else
445                                 CopyMemory(pvarDest->u.capropvar.pElems, pvarSrc->u.capropvar.pElems, len * elemSize);
446                 }
447         }
448
449         return S_OK;
450 }
451
452 /***********************************************************************
453  *           FreePropVariantArray                           [OLE32.195]
454  */
455 HRESULT WINAPI FreePropVariantArray(ULONG cVariants, /* [in] */
456                                     PROPVARIANT *rgvars)    /* [in/out] */
457 {
458         ULONG i;
459
460         TRACE("(%lu, %p)\n", cVariants, rgvars);
461
462         for(i = 0; i < cVariants; i++)
463                 PropVariantClear(&rgvars[i]);
464
465         return S_OK;
466 }
467
468 /***********************************************************************
469  *           CoIsOle1Class                              [OLE32.29]
470  */
471 BOOL WINAPI CoIsOle1Class(REFCLSID clsid)
472 {
473   FIXME("%s\n", debugstr_guid(clsid));
474   return FALSE;
475 }
476
477 /***********************************************************************
478  *           DllGetClassObject                          [OLE2.4]
479  */
480 HRESULT WINAPI DllGetClassObject16(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
481 {
482   FIXME("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
483   return E_NOTIMPL;
484 }
485
486 /***********************************************************************
487  *           OleSetClipboard                            [OLE2.49]
488  */
489 HRESULT WINAPI OleSetClipboard16(IDataObject* pDataObj)
490 {
491   FIXME("(%p): stub\n", pDataObj);
492   return S_OK;
493 }
494
495 /***********************************************************************
496  *           OleGetClipboard                            [OLE2.50]
497  */
498 HRESULT WINAPI OleGetClipboard16(IDataObject** ppDataObj)
499 {
500   FIXME("(%p): stub\n", ppDataObj);
501   return E_NOTIMPL;
502 }