blob: 50de54425ce1792a13e0aa89d66216d1f30db79e [file] [log] [blame]
/***************************************************************************************
* FileMonikers implementation
*
* Copyright 1999 Noomen Hamza
***************************************************************************************/
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "winerror.h"
#include "wine/obj_base.h"
#include "wine/obj_storage.h"
#include "wine/obj_moniker.h"
#include "debug.h"
#include "heap.h"
typedef struct FileMonikerImpl{
ICOM_VTABLE(IMoniker)* lpvtbl;
ULONG ref;
} FileMonikerImpl;
static HRESULT WINAPI FileMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject);
static ULONG WINAPI FileMonikerImpl_AddRef(IMoniker* iface);
static ULONG WINAPI FileMonikerImpl_Release(IMoniker* iface);
static HRESULT WINAPI FileMonikerImpl_GetClassID(const IMoniker* iface, CLSID *pClassID);
static HRESULT WINAPI FileMonikerImpl_IsDirty(IMoniker* iface);
static HRESULT WINAPI FileMonikerImpl_Load(IMoniker* iface, IStream* pStm);
static HRESULT WINAPI FileMonikerImpl_Save(IMoniker* iface, IStream* pStm, BOOL fClearDirty);
static HRESULT WINAPI FileMonikerImpl_GetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize);
static HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult);
static HRESULT WINAPI FileMonikerImpl_BindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult);
static HRESULT WINAPI FileMonikerImpl_Reduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,IMoniker** ppmkToLeft, IMoniker** ppmkReduced);
static HRESULT WINAPI FileMonikerImpl_ComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite);
static HRESULT WINAPI FileMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker);
static HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker);
static HRESULT WINAPI FileMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash);
static HRESULT WINAPI FileMonikerImpl_IsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning);
static HRESULT WINAPI FileMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pFileTime);
static HRESULT WINAPI FileMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk);
static HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther, IMoniker** ppmkPrefix);
static HRESULT WINAPI FileMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath);
static HRESULT WINAPI FileMonikerImpl_GetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName);
static HRESULT WINAPI FileMonikerImpl_ParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut);
static HRESULT WINAPI FileMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys);
static HRESULT WINAPI FileMonikerImpl_Construct(FileMonikerImpl* iface, LPCOLESTR lpszPathName);
static HRESULT WINAPI FileMonikerImpl_Destroy(FileMonikerImpl* iface);
// Virtual function table for the FileMonikerImpl class.
static ICOM_VTABLE(IMoniker) VT_FileMonikerImpl =
{
FileMonikerImpl_QueryInterface,
FileMonikerImpl_AddRef,
FileMonikerImpl_Release,
FileMonikerImpl_GetClassID,
FileMonikerImpl_IsDirty,
FileMonikerImpl_Load,
FileMonikerImpl_Save,
FileMonikerImpl_GetSizeMax,
FileMonikerImpl_BindToObject,
FileMonikerImpl_BindToStorage,
FileMonikerImpl_Reduce,
FileMonikerImpl_ComposeWith,
FileMonikerImpl_Enum,
FileMonikerImpl_IsEqual,
FileMonikerImpl_Hash,
FileMonikerImpl_IsRunning,
FileMonikerImpl_GetTimeOfLastChange,
FileMonikerImpl_Inverse,
FileMonikerImpl_CommonPrefixWith,
FileMonikerImpl_RelativePathTo,
FileMonikerImpl_GetDisplayName,
FileMonikerImpl_ParseDisplayName,
FileMonikerImpl_IsSystemMoniker
};
/*******************************************************************************
* FileMoniker_QueryInterface
*******************************************************************************/
HRESULT WINAPI FileMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
TRACE(ole,"(%p,%p,%p)\n",This,riid,ppvObject);
// Perform a sanity check on the parameters.
if ( (This==0) || (ppvObject==0) ) return E_INVALIDARG;
// Initialize the return parameter.
*ppvObject = 0;
// Compare the riid with the interface IDs implemented by this object.
if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
*ppvObject = (IMoniker*)This;
else
if (memcmp(&IID_IPersist, riid, sizeof(IID_IPersist)) == 0)
*ppvObject = (IMoniker*)This;
else
if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0)
*ppvObject = (IMoniker*)This;
else
if (memcmp(&IID_IMoniker, riid, sizeof(IID_IMoniker)) == 0)
*ppvObject = (IMoniker*)This;
// Check that we obtained an interface.
if ((*ppvObject)==0) return E_NOINTERFACE;
// Query Interface always increases the reference count by one when it is successful
FileMonikerImpl_AddRef(iface);
return S_OK;;
}
/******************************************************************************
* FileMoniker_AddRef
******************************************************************************/
ULONG WINAPI FileMonikerImpl_AddRef(IMoniker* iface)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
TRACE(ole,"(%p)\n",This);
return ++(This->ref);
}
/******************************************************************************
* FileMoniker_Release
******************************************************************************/
ULONG WINAPI FileMonikerImpl_Release(IMoniker* iface)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
TRACE(ole,"(%p)\n",This);
This->ref--;
if (This->ref==0){
FileMonikerImpl_Destroy(This);
return 0;
}
return This->ref;;
}
/******************************************************************************
* FileMoniker_GetClassID
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_GetClassID(const IMoniker* iface, CLSID *pClassID)//Pointer to CLSID of object
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p),stub!\n",This,pClassID);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_IsDirty
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_IsDirty(IMoniker* iface)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p),stub!\n",This);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_Load
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_Load(
IMoniker* iface,
IStream* pStm)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p),stub!\n",This,pStm);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_Save
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_Save(
IMoniker* iface,
IStream* pStm,
BOOL fClearDirty)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%d),stub!\n",This,pStm,fClearDirty);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_GetSizeMax
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_GetSizeMax(
IMoniker* iface,
ULARGE_INTEGER* pcbSize)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p),stub!\n",This,pcbSize);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_Construct
*******************************************************************************/
HRESULT WINAPI FileMonikerImpl_Construct(FileMonikerImpl* This, LPCOLESTR lpszPathName){
FIXME(ole,"(%p,%p),stub!\n",This,lpszPathName);
memset(This, 0, sizeof(FileMonikerImpl));
//Initialize the virtual fgunction table.
This->lpvtbl = &VT_FileMonikerImpl;
return S_OK;
}
/******************************************************************************
* FileMoniker_Destroy
*******************************************************************************/
HRESULT WINAPI FileMonikerImpl_Destroy(FileMonikerImpl* This){
FIXME(ole,"(%p),stub!\n",This);
SEGPTR_FREE(This);
return S_OK;
}
/******************************************************************************
* FileMoniker_BindToObject
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
REFIID riid, VOID** ppvResult)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,riid,ppvResult);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_BindToStorage
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_BindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
REFIID riid, VOID** ppvResult)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,riid,ppvResult);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_Reduce
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_Reduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,
IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%ld,%p,%p),stub!\n",This,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_ComposeWith
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_ComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric,
IMoniker** ppmkComposite)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%d,%p),stub!\n",This,pmkRight,fOnlyIfNotGeneric,ppmkComposite);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_Enum
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%d,%p),stub!\n",This,fForward,ppenumMoniker);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_IsEqual
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p),stub!\n",This,pmkOtherMoniker);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_Hash
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p),stub!\n",This,pdwHash);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_IsRunning
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_IsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
IMoniker* pmkNewlyRunning)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pmkNewlyRunning);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_GetTimeOfLastChange
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft,
FILETIME* pFileTime)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pFileTime);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_Inverse
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p),stub!\n",This,ppmk);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_CommonPrefixWith
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,
IMoniker** ppmkPrefix)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%p),stub!\n",This,pmkOther,ppmkPrefix);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_RelativePathTo
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_RelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%p),stub!\n",This,pmOther,ppmkRelPath);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_GetDisplayName
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_GetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
LPOLESTR *ppszDisplayName)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,ppszDisplayName);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_ParseDisplayName
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_ParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft,
LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut);
return E_NOTIMPL;
}
/******************************************************************************
* FileMoniker_IsSystemMonker
******************************************************************************/
HRESULT WINAPI FileMonikerImpl_IsSystemMoniker(IMoniker* iface,DWORD* pwdMksys)
{
FileMonikerImpl* This=(FileMonikerImpl*)iface;
FIXME(ole,"(%p,%p),stub!\n",This,pwdMksys);
return E_NOTIMPL;
}
/******************************************************************************
* CreateFileMoniker16
******************************************************************************/
HRESULT WINAPI CreateFileMoniker16(LPCOLESTR16 lpszPathName,LPMONIKER* ppmk){
FIXME(ole,"(%s,%p),stub!\n",lpszPathName,ppmk);
return E_NOTIMPL;
}
/******************************************************************************
* CreateFileMoniker32
******************************************************************************/
HRESULT WINAPI CreateFileMoniker(LPCOLESTR lpszPathName, LPMONIKER * ppmk)
{
FileMonikerImpl* newFileMoniker = 0;
HRESULT hr = S_OK;
TRACE(ole,"(%p,%p)\n",lpszPathName,ppmk);
newFileMoniker = HeapAlloc(GetProcessHeap(), 0, sizeof(FileMonikerImpl));
if (newFileMoniker == 0)
return STG_E_INSUFFICIENTMEMORY;
hr = FileMonikerImpl_Construct(newFileMoniker,lpszPathName);
if (FAILED(hr))
return hr;
hr = FileMonikerImpl_QueryInterface((IMoniker*)newFileMoniker,&IID_IMoniker,(void**)ppmk);
return hr;
}