hlink: Improve the loading of hlinks.

This commit is contained in:
Rob Shearman 2007-05-23 19:07:29 +01:00 committed by Alexandre Julliard
parent 0f063c72b2
commit 7b2e7cb81a
1 changed files with 94 additions and 20 deletions

View File

@ -46,6 +46,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(hlink);
#define HLINK_SAVE_FRIENDLY_PRESENT 0x10 #define HLINK_SAVE_FRIENDLY_PRESENT 0x10
/* 0x20, 0x40 unknown */ /* 0x20, 0x40 unknown */
#define HLINK_SAVE_TARGET_FRAME_PRESENT 0x80 #define HLINK_SAVE_TARGET_FRAME_PRESENT 0x80
/* known flags */
#define HLINK_SAVE_ALL (HLINK_SAVE_TARGET_FRAME_PRESENT|HLINK_SAVE_FRIENDLY_PRESENT|HLINK_SAVE_LOCATION_PRESENT|0x04|HLINK_SAVE_MONIKER_IS_ABSOLUTE|HLINK_SAVE_MONIKER_PRESENT)
static const IHlinkVtbl hlvt; static const IHlinkVtbl hlvt;
static const IPersistStreamVtbl psvt; static const IPersistStreamVtbl psvt;
@ -650,23 +652,6 @@ static HRESULT WINAPI IPersistStream_fnIsDirty(IPersistStream* iface)
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI IPersistStream_fnLoad(IPersistStream* iface,
IStream* pStm)
{
HRESULT r = E_NOTIMPL;
DWORD hdr[2];
DWORD read;
HlinkImpl *This = HlinkImpl_from_IPersistStream(iface);
IStream_Read(pStm, &hdr, sizeof(hdr), &read);
/* FIXME: unknown header values */
r = OleLoadFromStream(pStm, &IID_IMoniker, (LPVOID*)&(This->Moniker));
TRACE("Load Result 0x%x (%p)\n", r, This->Moniker);
return r;
}
static HRESULT write_hlink_string(IStream *pStm, LPCWSTR str) static HRESULT write_hlink_string(IStream *pStm, LPCWSTR str)
{ {
DWORD len; DWORD len;
@ -677,10 +662,10 @@ static HRESULT write_hlink_string(IStream *pStm, LPCWSTR str)
len = strlenW(str) + 1; len = strlenW(str) + 1;
hr = IStream_Write(pStm, &len, sizeof(len), NULL); hr = IStream_Write(pStm, &len, sizeof(len), NULL);
/* FIXME: error checking */ if (FAILED(hr)) return hr;
hr = IStream_Write(pStm, str, len * sizeof(WCHAR), NULL); hr = IStream_Write(pStm, str, len * sizeof(WCHAR), NULL);
/* FIXME: error checking */ if (FAILED(hr)) return hr;
return S_OK; return S_OK;
} }
@ -690,6 +675,94 @@ static inline ULONG size_hlink_string(LPCWSTR str)
return sizeof(DWORD) + (strlenW(str) + 1) * sizeof(WCHAR); return sizeof(DWORD) + (strlenW(str) + 1) * sizeof(WCHAR);
} }
static HRESULT read_hlink_string(IStream *pStm, LPWSTR *out_str)
{
LPWSTR str;
DWORD len;
ULONG read;
HRESULT hr;
hr = IStream_Read(pStm, &len, sizeof(len), &read);
if (FAILED(hr)) return hr;
if (read != sizeof(len)) return STG_E_READFAULT;
TRACE("read len %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
if (!str) return E_OUTOFMEMORY;
hr = IStream_Read(pStm, str, len * sizeof(WCHAR), &read);
if (FAILED(hr))
{
HeapFree(GetProcessHeap(), 0, str);
return hr;
}
if (read != len * sizeof(WCHAR))
{
HeapFree(GetProcessHeap(), 0, str);
return STG_E_READFAULT;
}
TRACE("read string %s\n", debugstr_w(str));
*out_str = str;
return S_OK;
}
static HRESULT WINAPI IPersistStream_fnLoad(IPersistStream* iface,
IStream* pStm)
{
HRESULT r;
DWORD hdr[2];
DWORD read;
HlinkImpl *This = HlinkImpl_from_IPersistStream(iface);
r = IStream_Read(pStm, &hdr, sizeof(hdr), &read);
if (read != sizeof(hdr) || (hdr[0] != HLINK_SAVE_MAGIC))
{
r = E_FAIL;
goto end;
}
if (hdr[1] & ~HLINK_SAVE_ALL)
FIXME("unknown flag(s) 0x%x\n", hdr[1] & ~HLINK_SAVE_ALL);
if (hdr[1] & HLINK_SAVE_TARGET_FRAME_PRESENT)
{
TRACE("loading target frame name\n");
r = read_hlink_string(pStm, &This->TargetFrameName);
if (FAILED(r)) goto end;
}
if (hdr[1] & HLINK_SAVE_FRIENDLY_PRESENT)
{
TRACE("loading target friendly name\n");
if (!(hdr[1] & 0x4))
FIXME("0x4 flag not present with friendly name flag - not sure what this means\n");
r = read_hlink_string(pStm, &This->FriendlyName);
if (FAILED(r)) goto end;
}
if (hdr[1] & HLINK_SAVE_MONIKER_PRESENT)
{
TRACE("loading moniker\n");
r = OleLoadFromStream(pStm, &IID_IMoniker, (LPVOID*)&(This->Moniker));
if (FAILED(r))
goto end;
This->absolute = hdr[1] & HLINK_SAVE_MONIKER_IS_ABSOLUTE ? TRUE : FALSE;
}
if (hdr[1] & HLINK_SAVE_LOCATION_PRESENT)
{
TRACE("loading location\n");
r = read_hlink_string(pStm, &This->Location);
if (FAILED(r)) goto end;
}
end:
TRACE("Load Result 0x%x (%p)\n", r, This->Moniker);
return r;
}
static HRESULT WINAPI IPersistStream_fnSave(IPersistStream* iface, static HRESULT WINAPI IPersistStream_fnSave(IPersistStream* iface,
IStream* pStm, BOOL fClearDirty) IStream* pStm, BOOL fClearDirty)
{ {
@ -742,7 +815,7 @@ static HRESULT WINAPI IPersistStream_fnSave(IPersistStream* iface,
r = OleSaveToStream(monstream, pStm); r = OleSaveToStream(monstream, pStm);
IPersistStream_Release(monstream); IPersistStream_Release(monstream);
} }
IMoniker_Release(moniker); if (FAILED(r)) goto end;
} }
if (This->Location) if (This->Location)
@ -752,6 +825,7 @@ static HRESULT WINAPI IPersistStream_fnSave(IPersistStream* iface,
} }
end: end:
if (moniker) IMoniker_Release(moniker);
TRACE("Save Result 0x%x\n", r); TRACE("Save Result 0x%x\n", r);
return r; return r;