Don't define COBJMACROS in objbase.h.
[wine/wine-gecko.git] / dlls / itss / moniker.c
blob588a1bd750efb3e2f7d57464ee3a91b4ab37ddda
1 /*
2 * ITSS Moniker implementation
4 * Copyright 2004 Mike McCormack
6 * Implementation of the infamous mk:@MSITStore moniker
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "config.h"
25 #include <stdarg.h>
26 #include <stdio.h>
28 #define COBJMACROS
30 #include "windef.h"
31 #include "winbase.h"
32 #include "winuser.h"
33 #include "winnls.h"
34 #include "winreg.h"
35 #include "ole2.h"
37 #include "itss.h"
38 #include "uuids.h"
40 #include "wine/unicode.h"
41 #include "wine/debug.h"
43 #include "itsstor.h"
45 WINE_DEFAULT_DEBUG_CHANNEL(itss);
47 /*****************************************************************************/
49 typedef struct {
50 IMonikerVtbl *vtbl_ITS_IMoniker;
51 DWORD ref;
52 LPWSTR szHtml;
53 WCHAR szFile[1];
54 } ITS_IMonikerImpl;
56 /*** IUnknown methods ***/
57 static HRESULT WINAPI ITS_IMonikerImpl_QueryInterface(
58 IMoniker* iface,
59 REFIID riid,
60 void** ppvObject)
62 ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface;
64 if (IsEqualGUID(riid, &IID_IUnknown)
65 || IsEqualGUID(riid, &IID_IParseDisplayName))
67 IClassFactory_AddRef(iface);
68 *ppvObject = This;
69 return S_OK;
72 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
73 return E_NOINTERFACE;
76 static ULONG WINAPI ITS_IMonikerImpl_AddRef(
77 IMoniker* iface)
79 ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface;
80 TRACE("%p\n", This);
81 return ++(This->ref);
84 static ULONG WINAPI ITS_IMonikerImpl_Release(
85 IMoniker* iface)
87 ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface;
88 ULONG ref = --This->ref;
90 if (ref == 0)
91 HeapFree(GetProcessHeap(), 0, This);
93 return ref;
96 /*** IPersist methods ***/
97 static HRESULT WINAPI ITS_IMonikerImpl_GetClassID(
98 IMoniker* iface,
99 CLSID* pClassID)
101 ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface;
103 TRACE("%p %p\n", This, pClassID);
104 memcpy( pClassID, &CLSID_ITStorage, sizeof (CLSID) );
105 return S_OK;
108 /*** IPersistStream methods ***/
109 static HRESULT WINAPI ITS_IMonikerImpl_IsDirty(
110 IMoniker* iface)
112 FIXME("\n");
113 return E_NOTIMPL;
116 static HRESULT WINAPI ITS_IMonikerImpl_Load(
117 IMoniker* iface,
118 IStream* pStm)
120 FIXME("\n");
121 return E_NOTIMPL;
124 static HRESULT WINAPI ITS_IMonikerImpl_Save(
125 IMoniker* iface,
126 IStream* pStm,
127 BOOL fClearDirty)
129 FIXME("\n");
130 return E_NOTIMPL;
133 static HRESULT WINAPI ITS_IMonikerImpl_GetSizeMax(
134 IMoniker* iface,
135 ULARGE_INTEGER* pcbSize)
137 FIXME("\n");
138 return E_NOTIMPL;
141 /*** IMoniker methods ***/
142 static HRESULT WINAPI ITS_IMonikerImpl_BindToObject(
143 IMoniker* iface,
144 IBindCtx* pbc,
145 IMoniker* pmkToLeft,
146 REFIID riidResult,
147 void** ppvResult)
149 FIXME("\n");
150 return E_NOTIMPL;
153 static HRESULT WINAPI ITS_IMonikerImpl_BindToStorage(
154 IMoniker* iface,
155 IBindCtx* pbc,
156 IMoniker* pmkToLeft,
157 REFIID riid,
158 void** ppvObj)
160 ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface;
161 DWORD grfMode = STGM_SIMPLE | STGM_READ | STGM_SHARE_EXCLUSIVE;
162 HRESULT r;
163 IStorage *stg = NULL;
165 TRACE("%p %p %p %s %p\n", This,
166 pbc, pmkToLeft, debugstr_guid(riid), ppvObj);
168 r = ITSS_StgOpenStorage( This->szFile, NULL, grfMode, 0, 0, &stg );
169 if( r == S_OK )
171 TRACE("Opened storage %s\n", debugstr_w( This->szFile ) );
172 if (IsEqualGUID(riid, &IID_IStream))
173 r = IStorage_OpenStream( stg, This->szHtml,
174 NULL, grfMode, 0, (IStream**)ppvObj );
175 else if (IsEqualGUID(riid, &IID_IStorage))
176 r = IStorage_OpenStorage( stg, This->szHtml,
177 NULL, grfMode, NULL, 0, (IStorage**)ppvObj );
178 else
179 r = STG_E_ACCESSDENIED;
180 IStorage_Release( stg );
183 return r;
186 static HRESULT WINAPI ITS_IMonikerImpl_Reduce(
187 IMoniker* iface,
188 IBindCtx* pbc,
189 DWORD dwReduceHowFar,
190 IMoniker** ppmkToLeft,
191 IMoniker** ppmkReduced)
193 FIXME("\n");
194 return E_NOTIMPL;
197 static HRESULT WINAPI ITS_IMonikerImpl_ComposeWith(
198 IMoniker* iface,
199 IMoniker* pmkRight,
200 BOOL fOnlyIfNotGeneric,
201 IMoniker** ppmkComposite)
203 FIXME("\n");
204 return E_NOTIMPL;
207 static HRESULT WINAPI ITS_IMonikerImpl_Enum(
208 IMoniker* iface,
209 BOOL fForward,
210 IEnumMoniker** ppenumMoniker)
212 FIXME("\n");
213 return E_NOTIMPL;
216 static HRESULT WINAPI ITS_IMonikerImpl_IsEqual(
217 IMoniker* iface,
218 IMoniker* pmkOtherMoniker)
220 FIXME("\n");
221 return E_NOTIMPL;
224 static HRESULT WINAPI ITS_IMonikerImpl_Hash(
225 IMoniker* iface,
226 DWORD* pdwHash)
228 FIXME("\n");
229 return E_NOTIMPL;
232 static HRESULT WINAPI ITS_IMonikerImpl_IsRunning(
233 IMoniker* iface,
234 IBindCtx* pbc,
235 IMoniker* pmkToLeft,
236 IMoniker* pmkNewlyRunning)
238 FIXME("\n");
239 return E_NOTIMPL;
242 static HRESULT WINAPI ITS_IMonikerImpl_GetTimeOfLastChange(
243 IMoniker* iface,
244 IBindCtx* pbc,
245 IMoniker* pmkToLeft,
246 FILETIME* pFileTime)
248 FIXME("\n");
249 return E_NOTIMPL;
252 static HRESULT WINAPI ITS_IMonikerImpl_Inverse(
253 IMoniker* iface,
254 IMoniker** ppmk)
256 FIXME("\n");
257 return E_NOTIMPL;
260 static HRESULT WINAPI ITS_IMonikerImpl_CommonPrefixWith(
261 IMoniker* iface,
262 IMoniker* pmkOther,
263 IMoniker** ppmkPrefix)
265 FIXME("\n");
266 return E_NOTIMPL;
269 static HRESULT WINAPI ITS_IMonikerImpl_RelativePathTo(
270 IMoniker* iface,
271 IMoniker* pmkOther,
272 IMoniker** ppmkRelPath)
274 FIXME("\n");
275 return E_NOTIMPL;
278 static HRESULT WINAPI ITS_IMonikerImpl_GetDisplayName(
279 IMoniker* iface,
280 IBindCtx* pbc,
281 IMoniker* pmkToLeft,
282 LPOLESTR* ppszDisplayName)
284 ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface;
285 static const WCHAR szFormat[] = {
286 'm','s','-','i','t','s',':','%','s',':',':','%','s',0 };
287 DWORD len = sizeof szFormat / sizeof(WCHAR);
288 LPWSTR str;
290 TRACE("%p %p %p %p\n", iface, pbc, pmkToLeft, ppszDisplayName);
292 len = strlenW( This->szFile ) + strlenW( This->szHtml );
293 str = CoTaskMemAlloc( len*sizeof(WCHAR) );
294 sprintfW( str, szFormat, This->szFile, This->szHtml );
296 *ppszDisplayName = str;
298 return S_OK;
301 static HRESULT WINAPI ITS_IMonikerImpl_ParseDisplayName(
302 IMoniker* iface,
303 IBindCtx* pbc,
304 IMoniker* pmkToLeft,
305 LPOLESTR pszDisplayName,
306 ULONG* pchEaten,
307 IMoniker** ppmkOut)
309 FIXME("\n");
310 return E_NOTIMPL;
313 static HRESULT WINAPI ITS_IMonikerImpl_IsSystemMoniker(
314 IMoniker* iface,
315 DWORD* pdwMksys)
317 FIXME("\n");
318 return E_NOTIMPL;
321 static IMonikerVtbl ITS_IMonikerImpl_Vtbl =
323 ITS_IMonikerImpl_QueryInterface,
324 ITS_IMonikerImpl_AddRef,
325 ITS_IMonikerImpl_Release,
326 ITS_IMonikerImpl_GetClassID,
327 ITS_IMonikerImpl_IsDirty,
328 ITS_IMonikerImpl_Load,
329 ITS_IMonikerImpl_Save,
330 ITS_IMonikerImpl_GetSizeMax,
331 ITS_IMonikerImpl_BindToObject,
332 ITS_IMonikerImpl_BindToStorage,
333 ITS_IMonikerImpl_Reduce,
334 ITS_IMonikerImpl_ComposeWith,
335 ITS_IMonikerImpl_Enum,
336 ITS_IMonikerImpl_IsEqual,
337 ITS_IMonikerImpl_Hash,
338 ITS_IMonikerImpl_IsRunning,
339 ITS_IMonikerImpl_GetTimeOfLastChange,
340 ITS_IMonikerImpl_Inverse,
341 ITS_IMonikerImpl_CommonPrefixWith,
342 ITS_IMonikerImpl_RelativePathTo,
343 ITS_IMonikerImpl_GetDisplayName,
344 ITS_IMonikerImpl_ParseDisplayName,
345 ITS_IMonikerImpl_IsSystemMoniker
348 static HRESULT ITS_IMoniker_create( IMoniker **ppObj, LPWSTR name, DWORD n )
350 ITS_IMonikerImpl *itsmon;
351 DWORD sz;
353 /* szFile[1] has space for one character already */
354 sz = sizeof(ITS_IMonikerImpl) + strlenW( name )*sizeof(WCHAR);
356 itsmon = HeapAlloc( GetProcessHeap(), 0, sz );
357 itsmon->vtbl_ITS_IMoniker = &ITS_IMonikerImpl_Vtbl;
358 itsmon->ref = 1;
359 strcpyW( itsmon->szFile, name );
360 itsmon->szHtml = &itsmon->szFile[n];
362 while( *itsmon->szHtml == ':' )
363 *itsmon->szHtml++ = 0;
365 TRACE("-> %p %s %s\n", itsmon,
366 debugstr_w(itsmon->szFile), debugstr_w(itsmon->szHtml) );
367 *ppObj = (IMoniker*) itsmon;
369 return S_OK;
372 /*****************************************************************************/
374 typedef struct {
375 IParseDisplayNameVtbl *vtbl_ITS_IParseDisplayName;
376 DWORD ref;
377 } ITS_IParseDisplayNameImpl;
379 static HRESULT WINAPI ITS_IParseDisplayNameImpl_QueryInterface(
380 IParseDisplayName* iface,
381 REFIID riid,
382 void** ppvObject)
384 ITS_IParseDisplayNameImpl *This = (ITS_IParseDisplayNameImpl *)iface;
386 if (IsEqualGUID(riid, &IID_IUnknown)
387 || IsEqualGUID(riid, &IID_IParseDisplayName))
389 IClassFactory_AddRef(iface);
390 *ppvObject = This;
391 return S_OK;
394 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
395 return E_NOINTERFACE;
398 static ULONG WINAPI ITS_IParseDisplayNameImpl_AddRef(
399 IParseDisplayName* iface)
401 ITS_IParseDisplayNameImpl *This = (ITS_IParseDisplayNameImpl *)iface;
402 TRACE("%p\n", This);
403 return ++(This->ref);
406 static ULONG WINAPI ITS_IParseDisplayNameImpl_Release(
407 IParseDisplayName* iface)
409 ITS_IParseDisplayNameImpl *This = (ITS_IParseDisplayNameImpl *)iface;
410 ULONG ref = --This->ref;
412 if (ref == 0)
413 HeapFree(GetProcessHeap(), 0, This);
415 return ref;
418 static HRESULT WINAPI ITS_IParseDisplayNameImpl_ParseDisplayName(
419 IParseDisplayName *iface,
420 IBindCtx * pbc,
421 LPOLESTR pszDisplayName,
422 ULONG * pchEaten,
423 IMoniker ** ppmkOut)
425 static const WCHAR szPrefix[] = {
426 '@','M','S','I','T','S','t','o','r','e',':',0 };
427 const DWORD prefix_len = (sizeof szPrefix/sizeof szPrefix[0])-1;
428 DWORD n;
430 ITS_IParseDisplayNameImpl *This = (ITS_IParseDisplayNameImpl *)iface;
432 TRACE("%p %s %p %p\n", This,
433 debugstr_w( pszDisplayName ), pchEaten, ppmkOut );
435 if( strncmpW( pszDisplayName, szPrefix, prefix_len ) )
436 return MK_E_SYNTAX;
438 /* search backwards for a double colon */
439 for( n = strlenW( pszDisplayName ) - 3; prefix_len <= n; n-- )
440 if( ( pszDisplayName[n] == ':' ) && ( pszDisplayName[n+1] == ':' ) )
441 break;
443 if( n < prefix_len )
444 return MK_E_SYNTAX;
446 if( !pszDisplayName[n+2] )
447 return MK_E_SYNTAX;
449 *pchEaten = strlenW( pszDisplayName ) - n - 3;
451 return ITS_IMoniker_create( ppmkOut,
452 &pszDisplayName[prefix_len], n-prefix_len );
455 static IParseDisplayNameVtbl ITS_IParseDisplayNameImpl_Vtbl =
457 ITS_IParseDisplayNameImpl_QueryInterface,
458 ITS_IParseDisplayNameImpl_AddRef,
459 ITS_IParseDisplayNameImpl_Release,
460 ITS_IParseDisplayNameImpl_ParseDisplayName
463 HRESULT ITS_IParseDisplayName_create(IUnknown *pUnkOuter, LPVOID *ppObj)
465 ITS_IParseDisplayNameImpl *its;
467 its = HeapAlloc( GetProcessHeap(), 0, sizeof(ITS_IParseDisplayNameImpl) );
468 its->vtbl_ITS_IParseDisplayName = &ITS_IParseDisplayNameImpl_Vtbl;
469 its->ref = 1;
471 TRACE("-> %p\n", its);
472 *ppObj = (LPVOID) its;
474 return S_OK;