mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 08:04:47 +00:00
hhctrl.ocx: Store full chm paths to solve problems with relative paths.
This commit is contained in:
parent
55a103ca5c
commit
abe3428f8b
|
@ -3,7 +3,7 @@ TOPOBJDIR = ../..
|
||||||
SRCDIR = @srcdir@
|
SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = hhctrl.ocx
|
MODULE = hhctrl.ocx
|
||||||
IMPORTS = advapi32 comctl32 shell32 ole32 oleaut32 user32 gdi32 kernel32
|
IMPORTS = advapi32 comctl32 shell32 shlwapi ole32 oleaut32 user32 gdi32 kernel32
|
||||||
EXTRALIBS = -luuid
|
EXTRALIBS = -luuid
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
#include "hhctrl.h"
|
#include "hhctrl.h"
|
||||||
|
|
||||||
|
#include "winreg.h"
|
||||||
|
#include "shlwapi.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
|
WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
|
||||||
|
@ -247,23 +249,38 @@ done:
|
||||||
return SUCCEEDED(hr);
|
return SUCCEEDED(hr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetChmPath(ChmPath *file, LPCWSTR path)
|
void SetChmPath(ChmPath *file, LPCWSTR base_file, LPCWSTR path)
|
||||||
{
|
{
|
||||||
LPCWSTR ptr;
|
LPCWSTR ptr;
|
||||||
static const WCHAR separatorW[] = {':',':',0};
|
static const WCHAR separatorW[] = {':',':',0};
|
||||||
|
|
||||||
ptr = strstrW(path, separatorW);
|
ptr = strstrW(path, separatorW);
|
||||||
if(ptr) {
|
if(ptr) {
|
||||||
file->chm_file = hhctrl_alloc((ptr-path+1)*sizeof(WCHAR));
|
WCHAR chm_file[MAX_PATH];
|
||||||
memcpy(file->chm_file, path, (ptr-path)*sizeof(WCHAR));
|
WCHAR rel_path[MAX_PATH];
|
||||||
file->chm_file[ptr-path] = 0;
|
WCHAR base_path[MAX_PATH];
|
||||||
|
LPWSTR p;
|
||||||
|
|
||||||
|
strcpyW(base_path, base_file);
|
||||||
|
p = strrchrW(base_path, '\\');
|
||||||
|
if(p)
|
||||||
|
*p = 0;
|
||||||
|
|
||||||
|
memcpy(rel_path, path, (ptr-path)*sizeof(WCHAR));
|
||||||
|
rel_path[ptr-path] = 0;
|
||||||
|
|
||||||
|
PathCombineW(chm_file, base_path, rel_path);
|
||||||
|
|
||||||
|
file->chm_file = strdupW(chm_file);
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
}else {
|
}else {
|
||||||
file->chm_file = NULL;
|
file->chm_file = strdupW(base_file);
|
||||||
ptr = path;
|
ptr = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
file->chm_index = strdupW(ptr);
|
file->chm_index = strdupW(ptr);
|
||||||
|
|
||||||
|
TRACE("ChmFile = {%s %s}\n", debugstr_w(file->chm_file), debugstr_w(file->chm_index));
|
||||||
}
|
}
|
||||||
|
|
||||||
IStream *GetChmStream(CHMInfo *info, LPCWSTR parent_chm, ChmPath *chm_file)
|
IStream *GetChmStream(CHMInfo *info, LPCWSTR parent_chm, ChmPath *chm_file)
|
||||||
|
@ -299,13 +316,16 @@ IStream *GetChmStream(CHMInfo *info, LPCWSTR parent_chm, ChmPath *chm_file)
|
||||||
/* Opens the CHM file for reading */
|
/* Opens the CHM file for reading */
|
||||||
CHMInfo *OpenCHM(LPCWSTR szFile)
|
CHMInfo *OpenCHM(LPCWSTR szFile)
|
||||||
{
|
{
|
||||||
|
WCHAR file[MAX_PATH] = {0};
|
||||||
|
DWORD res;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
static const WCHAR wszSTRINGS[] = {'#','S','T','R','I','N','G','S',0};
|
static const WCHAR wszSTRINGS[] = {'#','S','T','R','I','N','G','S',0};
|
||||||
|
|
||||||
CHMInfo *ret = hhctrl_alloc_zero(sizeof(CHMInfo));
|
CHMInfo *ret = hhctrl_alloc_zero(sizeof(CHMInfo));
|
||||||
|
|
||||||
ret->szFile = strdupW(szFile);
|
res = GetFullPathNameW(szFile, sizeof(file), file, NULL);
|
||||||
|
ret->szFile = strdupW(file);
|
||||||
|
|
||||||
hres = CoCreateInstance(&CLSID_ITStorage, NULL, CLSCTX_INPROC_SERVER,
|
hres = CoCreateInstance(&CLSID_ITStorage, NULL, CLSCTX_INPROC_SERVER,
|
||||||
&IID_IITStorage, (void **) &ret->pITStorage) ;
|
&IID_IITStorage, (void **) &ret->pITStorage) ;
|
||||||
|
|
|
@ -160,7 +160,7 @@ static const char *get_attr(const char *node, const char *name, int *len)
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_obj_node_param(ContentItem *item, const char *text)
|
static void parse_obj_node_param(ContentItem *item, ContentItem *hhc_root, const char *text)
|
||||||
{
|
{
|
||||||
const char *ptr;
|
const char *ptr;
|
||||||
LPWSTR *param, merge;
|
LPWSTR *param, merge;
|
||||||
|
@ -195,12 +195,12 @@ static void parse_obj_node_param(ContentItem *item, const char *text)
|
||||||
(*param)[wlen] = 0;
|
(*param)[wlen] = 0;
|
||||||
|
|
||||||
if(param == &merge) {
|
if(param == &merge) {
|
||||||
SetChmPath(&item->merge, merge);
|
SetChmPath(&item->merge, hhc_root->merge.chm_file, merge);
|
||||||
hhctrl_free(merge);
|
hhctrl_free(merge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static ContentItem *parse_hhc(HHInfo*,IStream*,insert_type_t*);
|
static ContentItem *parse_hhc(HHInfo*,IStream*,ContentItem*,insert_type_t*);
|
||||||
|
|
||||||
static ContentItem *insert_item(ContentItem *item, ContentItem *new_item, insert_type_t insert_type)
|
static ContentItem *insert_item(ContentItem *item, ContentItem *new_item, insert_type_t insert_type)
|
||||||
{
|
{
|
||||||
|
@ -226,7 +226,8 @@ static ContentItem *insert_item(ContentItem *item, ContentItem *new_item, insert
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ContentItem *parse_sitemap_object(HHInfo *info, stream_t *stream, insert_type_t *insert_type)
|
static ContentItem *parse_sitemap_object(HHInfo *info, stream_t *stream, ContentItem *hhc_root,
|
||||||
|
insert_type_t *insert_type)
|
||||||
{
|
{
|
||||||
strbuf_t node, node_name;
|
strbuf_t node, node_name;
|
||||||
ContentItem *item;
|
ContentItem *item;
|
||||||
|
@ -246,7 +247,7 @@ static ContentItem *parse_sitemap_object(HHInfo *info, stream_t *stream, insert_
|
||||||
if(!strcasecmp(node_name.buf, "/object"))
|
if(!strcasecmp(node_name.buf, "/object"))
|
||||||
break;
|
break;
|
||||||
if(!strcasecmp(node_name.buf, "param"))
|
if(!strcasecmp(node_name.buf, "param"))
|
||||||
parse_obj_node_param(item, node.buf);
|
parse_obj_node_param(item, hhc_root, node.buf);
|
||||||
|
|
||||||
strbuf_zero(&node);
|
strbuf_zero(&node);
|
||||||
}
|
}
|
||||||
|
@ -259,7 +260,7 @@ static ContentItem *parse_sitemap_object(HHInfo *info, stream_t *stream, insert_
|
||||||
|
|
||||||
merge_stream = GetChmStream(info->pCHMInfo, item->merge.chm_file, &item->merge);
|
merge_stream = GetChmStream(info->pCHMInfo, item->merge.chm_file, &item->merge);
|
||||||
if(merge_stream) {
|
if(merge_stream) {
|
||||||
item->child = parse_hhc(info, merge_stream, insert_type);
|
item->child = parse_hhc(info, merge_stream, hhc_root, insert_type);
|
||||||
IStream_Release(merge_stream);
|
IStream_Release(merge_stream);
|
||||||
}else {
|
}else {
|
||||||
WARN("Could not get %s::%s stream\n", debugstr_w(item->merge.chm_file),
|
WARN("Could not get %s::%s stream\n", debugstr_w(item->merge.chm_file),
|
||||||
|
@ -271,7 +272,7 @@ static ContentItem *parse_sitemap_object(HHInfo *info, stream_t *stream, insert_
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ContentItem *parse_ul(HHInfo *info, stream_t *stream)
|
static ContentItem *parse_ul(HHInfo *info, stream_t *stream, ContentItem *hhc_root)
|
||||||
{
|
{
|
||||||
strbuf_t node, node_name;
|
strbuf_t node, node_name;
|
||||||
ContentItem *ret = NULL, *prev = NULL, *new_item = NULL;
|
ContentItem *ret = NULL, *prev = NULL, *new_item = NULL;
|
||||||
|
@ -295,13 +296,13 @@ static ContentItem *parse_ul(HHInfo *info, stream_t *stream)
|
||||||
|
|
||||||
if(ptr && len == sizeof(sz_text_sitemap)-1
|
if(ptr && len == sizeof(sz_text_sitemap)-1
|
||||||
&& !memcmp(ptr, sz_text_sitemap, len)) {
|
&& !memcmp(ptr, sz_text_sitemap, len)) {
|
||||||
new_item = parse_sitemap_object(info, stream, &it);
|
new_item = parse_sitemap_object(info, stream, hhc_root, &it);
|
||||||
prev = insert_item(prev, new_item, it);
|
prev = insert_item(prev, new_item, it);
|
||||||
if(!ret)
|
if(!ret)
|
||||||
ret = prev;
|
ret = prev;
|
||||||
}
|
}
|
||||||
}else if(!strcasecmp(node_name.buf, "ul")) {
|
}else if(!strcasecmp(node_name.buf, "ul")) {
|
||||||
new_item = parse_ul(info, stream);
|
new_item = parse_ul(info, stream, hhc_root);
|
||||||
insert_item(prev, new_item, INSERT_CHILD);
|
insert_item(prev, new_item, INSERT_CHILD);
|
||||||
}else if(!strcasecmp(node_name.buf, "/ul")) {
|
}else if(!strcasecmp(node_name.buf, "/ul")) {
|
||||||
break;
|
break;
|
||||||
|
@ -316,7 +317,8 @@ static ContentItem *parse_ul(HHInfo *info, stream_t *stream)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ContentItem *parse_hhc(HHInfo *info, IStream *str, insert_type_t *insert_type)
|
static ContentItem *parse_hhc(HHInfo *info, IStream *str, ContentItem *hhc_root,
|
||||||
|
insert_type_t *insert_type)
|
||||||
{
|
{
|
||||||
stream_t stream;
|
stream_t stream;
|
||||||
strbuf_t node, node_name;
|
strbuf_t node, node_name;
|
||||||
|
@ -335,7 +337,7 @@ static ContentItem *parse_hhc(HHInfo *info, IStream *str, insert_type_t *insert_
|
||||||
TRACE("%s\n", node.buf);
|
TRACE("%s\n", node.buf);
|
||||||
|
|
||||||
if(!strcasecmp(node_name.buf, "ul")) {
|
if(!strcasecmp(node_name.buf, "ul")) {
|
||||||
ContentItem *item = parse_ul(info, &stream);
|
ContentItem *item = parse_ul(info, &stream, hhc_root);
|
||||||
prev = insert_item(prev, item, INSERT_CHILD);
|
prev = insert_item(prev, item, INSERT_CHILD);
|
||||||
if(!ret)
|
if(!ret)
|
||||||
ret = prev;
|
ret = prev;
|
||||||
|
@ -394,9 +396,7 @@ void InitContent(HHInfo *info)
|
||||||
insert_type_t insert_type;
|
insert_type_t insert_type;
|
||||||
|
|
||||||
info->content = hhctrl_alloc_zero(sizeof(ContentItem));
|
info->content = hhctrl_alloc_zero(sizeof(ContentItem));
|
||||||
SetChmPath(&info->content->merge, info->WinType.pszToc);
|
SetChmPath(&info->content->merge, info->pCHMInfo->szFile, info->WinType.pszToc);
|
||||||
if(!info->content->merge.chm_file)
|
|
||||||
info->content->merge.chm_file = strdupW(info->pCHMInfo->szFile);
|
|
||||||
|
|
||||||
stream = GetChmStream(info->pCHMInfo, info->pCHMInfo->szFile, &info->content->merge);
|
stream = GetChmStream(info->pCHMInfo, info->pCHMInfo->szFile, &info->content->merge);
|
||||||
if(!stream) {
|
if(!stream) {
|
||||||
|
@ -404,7 +404,7 @@ void InitContent(HHInfo *info)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
info->content->child = parse_hhc(info, stream, &insert_type);
|
info->content->child = parse_hhc(info, stream, info->content, &insert_type);
|
||||||
IStream_Release(stream);
|
IStream_Release(stream);
|
||||||
|
|
||||||
set_item_parents(NULL, info->content);
|
set_item_parents(NULL, info->content);
|
||||||
|
|
|
@ -113,7 +113,7 @@ void ReleaseContent(HHInfo*);
|
||||||
CHMInfo *OpenCHM(LPCWSTR szFile);
|
CHMInfo *OpenCHM(LPCWSTR szFile);
|
||||||
BOOL LoadWinTypeFromCHM(CHMInfo *pCHMInfo, HH_WINTYPEW *pHHWinType);
|
BOOL LoadWinTypeFromCHM(CHMInfo *pCHMInfo, HH_WINTYPEW *pHHWinType);
|
||||||
CHMInfo *CloseCHM(CHMInfo *pCHMInfo);
|
CHMInfo *CloseCHM(CHMInfo *pCHMInfo);
|
||||||
void SetChmPath(ChmPath*,LPCWSTR);
|
void SetChmPath(ChmPath*,LPCWSTR,LPCWSTR);
|
||||||
IStream *GetChmStream(CHMInfo*,LPCWSTR,ChmPath*);
|
IStream *GetChmStream(CHMInfo*,LPCWSTR,ChmPath*);
|
||||||
LPWSTR FindContextAlias(CHMInfo*,DWORD);
|
LPWSTR FindContextAlias(CHMInfo*,DWORD);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue