Buffer size bug in LocateDebugInfoFile.
[wine] / ole / filemoniker.c
1 /***************************************************************************************
2  *                            FileMonikers implementation
3  *
4  *               Copyright 1999  Noomen Hamza
5  ***************************************************************************************/
6
7 #include <ctype.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <assert.h>
11 #include "wine/obj_moniker.h"
12 #include "winerror.h"
13 #include "debug.h"
14 #include "heap.h"
15
16 typedef struct FileMonikerImpl{
17
18     ICOM_VTABLE(IMoniker)*  lpvtbl;
19
20     ULONG ref;
21
22 } FileMonikerImpl;
23
24 static HRESULT WINAPI FileMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject);
25 static ULONG   WINAPI FileMonikerImpl_AddRef(IMoniker* iface);
26 static ULONG   WINAPI FileMonikerImpl_Release(IMoniker* iface);
27 static HRESULT WINAPI FileMonikerImpl_GetClassID(const IMoniker* iface, CLSID *pClassID);
28 static HRESULT WINAPI FileMonikerImpl_IsDirty(IMoniker* iface);
29 static HRESULT WINAPI FileMonikerImpl_Load(IMoniker* iface, IStream* pStm);
30 static HRESULT WINAPI FileMonikerImpl_Save(IMoniker* iface, IStream* pStm, BOOL fClearDirty);
31 static HRESULT WINAPI FileMonikerImpl_GetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize);
32 static HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult);
33 static HRESULT WINAPI FileMonikerImpl_BindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult);
34 static HRESULT WINAPI FileMonikerImpl_Reduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,IMoniker** ppmkToLeft, IMoniker** ppmkReduced);
35 static HRESULT WINAPI FileMonikerImpl_ComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite);
36 static HRESULT WINAPI FileMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker);
37 static HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker);
38 static HRESULT WINAPI FileMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash);
39 static HRESULT WINAPI FileMonikerImpl_IsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning);
40 static HRESULT WINAPI FileMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pFileTime);
41 static HRESULT WINAPI FileMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk);
42 static HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther, IMoniker** ppmkPrefix);
43 static HRESULT WINAPI FileMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath);
44 static HRESULT WINAPI FileMonikerImpl_GetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName);
45 static HRESULT WINAPI FileMonikerImpl_ParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut);
46 static HRESULT WINAPI FileMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys);
47
48 static HRESULT WINAPI FileMonikerImpl_Construct(FileMonikerImpl* iface, LPCOLESTR lpszPathName);
49 static HRESULT WINAPI FileMonikerImpl_Destroy(FileMonikerImpl* iface);
50
51 // Virtual function table for the FileMonikerImpl class.
52 static ICOM_VTABLE(IMoniker) VT_FileMonikerImpl =
53 {
54     FileMonikerImpl_QueryInterface,
55     FileMonikerImpl_AddRef,
56     FileMonikerImpl_Release,
57     FileMonikerImpl_GetClassID,
58     FileMonikerImpl_IsDirty,
59     FileMonikerImpl_Load,
60     FileMonikerImpl_Save,
61     FileMonikerImpl_GetSizeMax,
62     FileMonikerImpl_BindToObject,
63     FileMonikerImpl_BindToStorage,
64     FileMonikerImpl_Reduce,
65     FileMonikerImpl_ComposeWith,
66     FileMonikerImpl_Enum,
67     FileMonikerImpl_IsEqual,
68     FileMonikerImpl_Hash,
69     FileMonikerImpl_IsRunning,
70     FileMonikerImpl_GetTimeOfLastChange,
71     FileMonikerImpl_Inverse,
72     FileMonikerImpl_CommonPrefixWith,
73     FileMonikerImpl_RelativePathTo,
74     FileMonikerImpl_GetDisplayName,
75     FileMonikerImpl_ParseDisplayName,
76     FileMonikerImpl_IsSystemMoniker
77 };
78
79 /*******************************************************************************
80  *        FileMoniker_QueryInterface
81  *******************************************************************************/
82 HRESULT WINAPI FileMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject)
83 {
84   FileMonikerImpl* This=(FileMonikerImpl*)iface;
85   TRACE(ole,"(%p,%p,%p)\n",This,riid,ppvObject);
86
87   // Perform a sanity check on the parameters.
88   if ( (This==0) || (ppvObject==0) )    return E_INVALIDARG;
89   
90   // Initialize the return parameter.
91   *ppvObject = 0;
92
93   // Compare the riid with the interface IDs implemented by this object.
94   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
95       *ppvObject = (IMoniker*)This;
96   else
97       if (memcmp(&IID_IPersist, riid, sizeof(IID_IPersist)) == 0)
98           *ppvObject = (IMoniker*)This;
99       else
100           if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0)
101               *ppvObject = (IMoniker*)This;
102           else
103               if (memcmp(&IID_IMoniker, riid, sizeof(IID_IMoniker)) == 0)
104                   *ppvObject = (IMoniker*)This;
105
106   // Check that we obtained an interface.
107   if ((*ppvObject)==0)        return E_NOINTERFACE;
108   
109    // Query Interface always increases the reference count by one when it is successful
110   FileMonikerImpl_AddRef(iface);
111
112   return S_OK;;
113 }
114
115 /******************************************************************************
116  *        FileMoniker_AddRef
117  ******************************************************************************/
118 ULONG WINAPI FileMonikerImpl_AddRef(IMoniker* iface)
119 {
120     FileMonikerImpl* This=(FileMonikerImpl*)iface;
121
122     TRACE(ole,"(%p)\n",This);
123
124     return ++(This->ref);
125 }
126
127 /******************************************************************************
128  *        FileMoniker_Release
129  ******************************************************************************/
130 ULONG WINAPI FileMonikerImpl_Release(IMoniker* iface)
131 {
132     FileMonikerImpl* This=(FileMonikerImpl*)iface;
133
134     TRACE(ole,"(%p)\n",This);
135
136     This->ref--;
137
138     if (This->ref==0){
139         FileMonikerImpl_Destroy(This);
140         return 0;
141     }
142     return This->ref;;
143 }
144
145 /******************************************************************************
146  *        FileMoniker_GetClassID
147  ******************************************************************************/
148 HRESULT WINAPI FileMonikerImpl_GetClassID(const IMoniker* iface, CLSID *pClassID)//Pointer to CLSID of object
149 {
150     FileMonikerImpl* This=(FileMonikerImpl*)iface;
151
152     FIXME(ole,"(%p,%p),stub!\n",This,pClassID);
153
154     return E_NOTIMPL;
155 }
156
157 /******************************************************************************
158  *        FileMoniker_IsDirty
159  ******************************************************************************/
160 HRESULT WINAPI FileMonikerImpl_IsDirty(IMoniker* iface)
161 {
162     FileMonikerImpl* This=(FileMonikerImpl*)iface;
163
164     FIXME(ole,"(%p),stub!\n",This);
165
166     return E_NOTIMPL;
167 }
168
169 /******************************************************************************
170  *        FileMoniker_Load
171  ******************************************************************************/
172 HRESULT WINAPI FileMonikerImpl_Load(
173           IMoniker* iface,
174           IStream* pStm)
175 {
176     FileMonikerImpl* This=(FileMonikerImpl*)iface;
177
178     FIXME(ole,"(%p,%p),stub!\n",This,pStm);
179
180     return E_NOTIMPL;
181 }
182
183 /******************************************************************************
184  *        FileMoniker_Save
185  ******************************************************************************/
186 HRESULT WINAPI FileMonikerImpl_Save(
187           IMoniker* iface,
188           IStream* pStm,
189           BOOL fClearDirty)
190 {
191     FileMonikerImpl* This=(FileMonikerImpl*)iface;
192
193     FIXME(ole,"(%p,%p,%d),stub!\n",This,pStm,fClearDirty);
194
195     return E_NOTIMPL;
196 }
197
198 /******************************************************************************
199  *        FileMoniker_GetSizeMax
200  ******************************************************************************/
201 HRESULT WINAPI FileMonikerImpl_GetSizeMax(
202           IMoniker* iface,
203           ULARGE_INTEGER* pcbSize)
204 {
205     FileMonikerImpl* This=(FileMonikerImpl*)iface;
206
207     FIXME(ole,"(%p,%p),stub!\n",This,pcbSize);
208
209     return E_NOTIMPL;
210 }
211
212 /******************************************************************************
213  *         FileMoniker_Construct
214  *******************************************************************************/
215 HRESULT WINAPI FileMonikerImpl_Construct(FileMonikerImpl* This, LPCOLESTR lpszPathName){
216
217     FIXME(ole,"(%p,%p),stub!\n",This,lpszPathName);
218
219     memset(This, 0, sizeof(FileMonikerImpl));
220
221     //Initialize the virtual fgunction table.
222     This->lpvtbl       = &VT_FileMonikerImpl;
223     return S_OK;
224 }
225
226 /******************************************************************************
227  *        FileMoniker_Destroy
228  *******************************************************************************/
229 HRESULT WINAPI FileMonikerImpl_Destroy(FileMonikerImpl* This){
230
231     FIXME(ole,"(%p),stub!\n",This);
232
233     SEGPTR_FREE(This);
234     return S_OK;
235 }
236
237 /******************************************************************************
238  *                  FileMoniker_BindToObject
239  ******************************************************************************/
240 HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
241                                             REFIID riid, VOID** ppvResult)
242 {
243     FileMonikerImpl* This=(FileMonikerImpl*)iface;
244     
245     FIXME(ole,"(%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,riid,ppvResult);
246
247     return E_NOTIMPL;
248 }
249
250 /******************************************************************************
251  *        FileMoniker_BindToStorage
252  ******************************************************************************/
253 HRESULT WINAPI FileMonikerImpl_BindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
254                                              REFIID riid, VOID** ppvResult)
255 {
256     FileMonikerImpl* This=(FileMonikerImpl*)iface;
257
258     FIXME(ole,"(%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,riid,ppvResult);
259
260     return E_NOTIMPL;
261 }
262
263 /******************************************************************************
264  *        FileMoniker_Reduce
265  ******************************************************************************/
266 HRESULT WINAPI FileMonikerImpl_Reduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,
267                                       IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
268 {
269     FileMonikerImpl* This=(FileMonikerImpl*)iface;
270
271     FIXME(ole,"(%p,%p,%ld,%p,%p),stub!\n",This,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
272
273     return E_NOTIMPL;
274 }
275
276 /******************************************************************************
277  *        FileMoniker_ComposeWith
278  ******************************************************************************/
279 HRESULT WINAPI FileMonikerImpl_ComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric,
280                                            IMoniker** ppmkComposite)
281 {
282     FileMonikerImpl* This=(FileMonikerImpl*)iface;
283
284     FIXME(ole,"(%p,%p,%d,%p),stub!\n",This,pmkRight,fOnlyIfNotGeneric,ppmkComposite);
285
286     return E_NOTIMPL;
287 }
288
289 /******************************************************************************
290  *        FileMoniker_Enum
291  ******************************************************************************/
292 HRESULT WINAPI FileMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker)
293 {
294     FileMonikerImpl* This=(FileMonikerImpl*)iface;
295
296     FIXME(ole,"(%p,%d,%p),stub!\n",This,fForward,ppenumMoniker);
297
298     return E_NOTIMPL;
299
300 }
301
302 /******************************************************************************
303  *        FileMoniker_IsEqual
304  ******************************************************************************/
305 HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
306 {
307     FileMonikerImpl* This=(FileMonikerImpl*)iface;
308
309     FIXME(ole,"(%p,%p),stub!\n",This,pmkOtherMoniker);
310
311     return E_NOTIMPL;
312 }
313
314 /******************************************************************************
315  *        FileMoniker_Hash
316  ******************************************************************************/
317 HRESULT WINAPI FileMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash)
318 {
319     FileMonikerImpl* This=(FileMonikerImpl*)iface;
320
321     FIXME(ole,"(%p,%p),stub!\n",This,pdwHash);
322
323     return E_NOTIMPL;
324 }
325
326 /******************************************************************************
327  *        FileMoniker_IsRunning
328  ******************************************************************************/
329 HRESULT WINAPI FileMonikerImpl_IsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
330                                          IMoniker* pmkNewlyRunning)
331 {
332     FileMonikerImpl* This=(FileMonikerImpl*)iface;
333
334     FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pmkNewlyRunning);
335
336     return E_NOTIMPL;
337 }
338
339 /******************************************************************************
340  *        FileMoniker_GetTimeOfLastChange
341  ******************************************************************************/
342 HRESULT WINAPI FileMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
343                                                    FILETIME* pFileTime)
344 {
345     FileMonikerImpl* This=(FileMonikerImpl*)iface;
346
347     FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pFileTime);
348
349     return E_NOTIMPL;
350 }
351
352 /******************************************************************************
353  *        FileMoniker_Inverse
354  ******************************************************************************/
355 HRESULT WINAPI FileMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
356 {
357     FileMonikerImpl* This=(FileMonikerImpl*)iface;
358
359     FIXME(ole,"(%p,%p),stub!\n",This,ppmk);
360
361     return E_NOTIMPL;
362 }
363
364 /******************************************************************************
365  *        FileMoniker_CommonPrefixWith
366  ******************************************************************************/
367 HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,
368                                                 IMoniker** ppmkPrefix)
369 {
370     FileMonikerImpl* This=(FileMonikerImpl*)iface;
371
372     FIXME(ole,"(%p,%p,%p),stub!\n",This,pmkOther,ppmkPrefix);
373
374     return E_NOTIMPL;
375 }
376
377 /******************************************************************************
378  *        FileMoniker_RelativePathTo
379  ******************************************************************************/
380 HRESULT WINAPI FileMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath)
381 {
382     FileMonikerImpl* This=(FileMonikerImpl*)iface;
383
384     FIXME(ole,"(%p,%p,%p),stub!\n",This,pmOther,ppmkRelPath);
385
386     return E_NOTIMPL;
387 }
388
389 /******************************************************************************
390  *        FileMoniker_GetDisplayName
391  ******************************************************************************/
392 HRESULT WINAPI FileMonikerImpl_GetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
393                                               LPOLESTR *ppszDisplayName)
394 {
395     FileMonikerImpl* This=(FileMonikerImpl*)iface;
396
397     FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,ppszDisplayName);
398
399     return E_NOTIMPL;
400 }
401
402 /******************************************************************************
403  *        FileMoniker_ParseDisplayName
404  ******************************************************************************/
405 HRESULT WINAPI FileMonikerImpl_ParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
406                                                 LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut)
407 {
408     FileMonikerImpl* This=(FileMonikerImpl*)iface;
409
410     FIXME(ole,"(%p,%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut);
411
412     return E_NOTIMPL;
413 }
414
415 /******************************************************************************
416  *        FileMoniker_IsSystemMonker
417  ******************************************************************************/
418 HRESULT WINAPI FileMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys)
419 {
420     FileMonikerImpl* This=(FileMonikerImpl*)iface;
421
422     FIXME(ole,"(%p,%p),stub!\n",This,pwdMksys);
423
424     return E_NOTIMPL;
425 }
426
427 /******************************************************************************
428  *        CreateFileMoniker16
429  ******************************************************************************/
430 HRESULT WINAPI CreateFileMoniker16(LPCOLESTR16 lpszPathName,LPMONIKER* ppmk){
431
432     FIXME(ole,"(%s,%p),stub!\n",lpszPathName,ppmk);
433
434     return E_NOTIMPL;
435 }
436
437 /******************************************************************************
438  *        CreateFileMoniker32
439  ******************************************************************************/
440 HRESULT WINAPI CreateFileMoniker(LPCOLESTR lpszPathName, LPMONIKER * ppmk)
441 {
442     FileMonikerImpl* newFileMoniker = 0;
443     HRESULT        hr = S_OK;
444
445     TRACE(ole,"(%p,%p)\n",lpszPathName,ppmk);
446
447     newFileMoniker = HeapAlloc(GetProcessHeap(), 0, sizeof(FileMonikerImpl));
448
449     if (newFileMoniker == 0)
450         return STG_E_INSUFFICIENTMEMORY;
451
452     hr = FileMonikerImpl_Construct(newFileMoniker,lpszPathName);
453
454     if (FAILED(hr))
455         return hr;
456
457     hr = FileMonikerImpl_QueryInterface((IMoniker*)newFileMoniker,&IID_IMoniker,(void**)ppmk);
458
459     return hr;
460 }