https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6cbb6445242203dcd1f11…
commit 6cbb6445242203dcd1f112c62796981e6a1f4d6f
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Sat Oct 26 22:57:01 2019 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Sat Oct 26 22:57:01 2019 +0100
[HHCTRL.OCX] Sync with Wine Staging 4.18. CORE-16441
---
dll/win32/hhctrl.ocx/chm.c | 24 +++++++++++------------
dll/win32/hhctrl.ocx/content.c | 20 +++++++++----------
dll/win32/hhctrl.ocx/help.c | 10 +++++-----
dll/win32/hhctrl.ocx/hhctrl.c | 44 +++++++++++++++++++++++++-----------------
dll/win32/hhctrl.ocx/hhctrl.h | 4 ++--
dll/win32/hhctrl.ocx/index.c | 26 ++++++++++++-------------
dll/win32/hhctrl.ocx/search.c | 12 ++++++------
media/doc/README.WINE | 2 +-
8 files changed, 75 insertions(+), 67 deletions(-)
diff --git a/dll/win32/hhctrl.ocx/chm.c b/dll/win32/hhctrl.ocx/chm.c
index 01403368b0f..07211f1dbd5 100644
--- a/dll/win32/hhctrl.ocx/chm.c
+++ b/dll/win32/hhctrl.ocx/chm.c
@@ -228,11 +228,11 @@ static WCHAR *FindHTMLHelpSetting(HHInfo *info, const WCHAR *extW)
WCHAR *filename;
HRESULT hr;
- filename = heap_alloc( (strlenW(info->pCHMInfo->compiledFile)
- + strlenW(periodW) + strlenW(extW) + 1) * sizeof(WCHAR) );
- strcpyW(filename, info->pCHMInfo->compiledFile);
- strcatW(filename, periodW);
- strcatW(filename, extW);
+ filename = heap_alloc( (lstrlenW(info->pCHMInfo->compiledFile)
+ + lstrlenW(periodW) + lstrlenW(extW) + 1) * sizeof(WCHAR) );
+ lstrcpyW(filename, info->pCHMInfo->compiledFile);
+ lstrcatW(filename, periodW);
+ lstrcatW(filename, extW);
hr = IStorage_OpenStream(pStorage, filename, NULL, STGM_READ, 0, &pStream);
if (FAILED(hr))
{
@@ -483,11 +483,11 @@ LPCWSTR skip_schema(LPCWSTR url)
static const WCHAR msits_schema[] =
{'m','s','-','i','t','s',':'};
static const WCHAR mk_schema[] =
{'m','k',':','@','M','S','I','T','S','t','o','r','e',':'};
- if(!strncmpiW(its_schema, url, ARRAY_SIZE(its_schema)))
+ if(!_wcsnicmp(its_schema, url, ARRAY_SIZE(its_schema)))
return url + ARRAY_SIZE(its_schema);
- if(!strncmpiW(msits_schema, url, ARRAY_SIZE(msits_schema)))
+ if(!_wcsnicmp(msits_schema, url, ARRAY_SIZE(msits_schema)))
return url + ARRAY_SIZE(msits_schema);
- if(!strncmpiW(mk_schema, url, ARRAY_SIZE(mk_schema)))
+ if(!_wcsnicmp(mk_schema, url, ARRAY_SIZE(mk_schema)))
return url + ARRAY_SIZE(mk_schema);
return url;
@@ -500,15 +500,15 @@ void SetChmPath(ChmPath *file, LPCWSTR base_file, LPCWSTR path)
path = skip_schema(path);
- ptr = strstrW(path, separatorW);
+ ptr = wcsstr(path, separatorW);
if(ptr) {
WCHAR chm_file[MAX_PATH];
WCHAR rel_path[MAX_PATH];
WCHAR base_path[MAX_PATH];
LPWSTR p;
- strcpyW(base_path, base_file);
- p = strrchrW(base_path, '\\');
+ lstrcpyW(base_path, base_file);
+ p = wcsrchr(base_path, '\\');
if(p)
*p = 0;
@@ -595,7 +595,7 @@ WCHAR *GetDocumentTitle(CHMInfo *info, LPCWSTR document)
TRACE("%s\n", node.buf);
- if(!strcasecmp(node_name.buf, "title")) {
+ if(!_strnicmp(node_name.buf, "title", -1)) {
if(next_content(&stream, &content) && content.len > 1)
{
document_title = strdupnAtoW(&content.buf[1], content.len-1);
diff --git a/dll/win32/hhctrl.ocx/content.c b/dll/win32/hhctrl.ocx/content.c
index 6a7c8f8a8c2..0bf374344d0 100644
--- a/dll/win32/hhctrl.ocx/content.c
+++ b/dll/win32/hhctrl.ocx/content.c
@@ -62,11 +62,11 @@ static void parse_obj_node_param(ContentItem *item, ContentItem
*hhc_root, const
return;
}
- if(!strncasecmp("name", ptr, len)) {
+ if(!_strnicmp("name", ptr, len)) {
param = &item->name;
- }else if(!strncasecmp("merge", ptr, len)) {
+ }else if(!_strnicmp("merge", ptr, len)) {
param = &merge;
- }else if(!strncasecmp("local", ptr, len)) {
+ }else if(!_strnicmp("local", ptr, len)) {
param = &item->local;
}else {
WARN("unhandled param %s\n", debugstr_an(ptr, len));
@@ -148,9 +148,9 @@ static ContentItem *parse_sitemap_object(HHInfo *info, stream_t
*stream, Content
TRACE("%s\n", node.buf);
- if(!strcasecmp(node_name.buf, "/object"))
+ if(!_strnicmp(node_name.buf, "/object", -1))
break;
- if(!strcasecmp(node_name.buf, "param"))
+ if(!_strnicmp(node_name.buf, "param", -1))
parse_obj_node_param(item, hhc_root, node.buf,
info->pCHMInfo->codePage);
strbuf_zero(&node);
@@ -195,7 +195,7 @@ static ContentItem *parse_ul(HHInfo *info, stream_t *stream,
ContentItem *hhc_ro
TRACE("%s\n", node.buf);
- if(!strcasecmp(node_name.buf, "object")) {
+ if(!_strnicmp(node_name.buf, "object", -1)) {
const char *ptr;
int len;
@@ -210,10 +210,10 @@ static ContentItem *parse_ul(HHInfo *info, stream_t *stream,
ContentItem *hhc_ro
if(!ret)
ret = prev;
}
- }else if(!strcasecmp(node_name.buf, "ul")) {
+ }else if(!_strnicmp(node_name.buf, "ul", -1)) {
new_item = parse_ul(info, stream, hhc_root);
insert_item(prev, new_item, INSERT_CHILD);
- }else if(!strcasecmp(node_name.buf, "/ul")) {
+ }else if(!_strnicmp(node_name.buf, "/ul", -1)) {
break;
}
@@ -245,7 +245,7 @@ static ContentItem *parse_hhc(HHInfo *info, IStream *str, ContentItem
*hhc_root,
TRACE("%s\n", node.buf);
- if(!strcasecmp(node_name.buf, "ul")) {
+ if(!_strnicmp(node_name.buf, "ul", -1)) {
ContentItem *item = parse_ul(info, &stream, hhc_root);
prev = insert_item(prev, item, INSERT_CHILD);
if(!ret)
@@ -268,7 +268,7 @@ static void insert_content_item(HWND hwnd, ContentItem *parent,
ContentItem *ite
memset(&tvis, 0, sizeof(tvis));
tvis.u.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
- tvis.u.item.cchTextMax = strlenW(item->name)+1;
+ tvis.u.item.cchTextMax = lstrlenW(item->name)+1;
tvis.u.item.pszText = item->name;
tvis.u.item.lParam = (LPARAM)item;
tvis.u.item.iImage = item->child ? HHTV_FOLDER : HHTV_DOCUMENT;
diff --git a/dll/win32/hhctrl.ocx/help.c b/dll/win32/hhctrl.ocx/help.c
index 75b28f2f57d..06f73358f44 100644
--- a/dll/win32/hhctrl.ocx/help.c
+++ b/dll/win32/hhctrl.ocx/help.c
@@ -216,7 +216,7 @@ BOOL NavigateToUrl(HHInfo *info, LPCWSTR surl)
TRACE("%s\n", debugstr_w(surl));
- if (strstrW(surl, url_indicator)) {
+ if (wcsstr(surl, url_indicator)) {
hres = navigate_url(info, surl);
if(SUCCEEDED(hres))
return TRUE;
@@ -288,7 +288,7 @@ static void DoSync(HHInfo *info)
static const WCHAR delimW[] = {':',':','/',0};
const WCHAR *index;
- index = strstrW(url, delimW);
+ index = wcsstr(url, delimW);
if (index)
ActivateContentTopic(info->tabs[TAB_CONTENTS].hwnd, index + 3,
info->content); /* skip over ::/ */
@@ -639,7 +639,7 @@ static LRESULT OnTopicChange(HHInfo *info, void *user_data)
memset(&lvi, 0, sizeof(lvi));
lvi.iItem = i;
lvi.mask = LVIF_TEXT|LVIF_PARAM;
- lvi.cchTextMax = strlenW(name)+1;
+ lvi.cchTextMax = lstrlenW(name)+1;
lvi.pszText = name;
lvi.lParam = (LPARAM) item;
SendMessageW(info->popup.hwndList, LVM_INSERTITEMW, 0,
(LPARAM)&lvi);
@@ -1025,7 +1025,7 @@ static BOOL HH_AddToolbar(HHInfo *pHHInfo)
for (dwIndex = 0; dwIndex < dwNumButtons; dwIndex++)
{
LPWSTR szBuf = HH_LoadString(buttons[dwIndex].idCommand);
- DWORD dwLen = strlenW(szBuf);
+ DWORD dwLen = lstrlenW(szBuf);
szBuf[dwLen + 1] = 0; /* Double-null terminate */
buttons[dwIndex].iString = (DWORD)SendMessageW(hToolbar, TB_ADDSTRINGW, 0,
(LPARAM)szBuf);
@@ -1958,7 +1958,7 @@ HHInfo *find_window(const WCHAR *window)
LIST_FOR_EACH_ENTRY(info, &window_list, HHInfo, entry)
{
- if (strcmpW(info->WinType.pszType, window) == 0)
+ if (lstrcmpW(info->WinType.pszType, window) == 0)
return info;
}
return NULL;
diff --git a/dll/win32/hhctrl.ocx/hhctrl.c b/dll/win32/hhctrl.ocx/hhctrl.c
index 7efca002f9f..893cdde6ea7 100644
--- a/dll/win32/hhctrl.ocx/hhctrl.c
+++ b/dll/win32/hhctrl.ocx/hhctrl.c
@@ -97,38 +97,43 @@ static const char *command_to_string(UINT command)
#undef X
}
-static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD buflen, WCHAR
**index, WCHAR **window)
+static BOOL resolve_filename(const WCHAR *env_filename, WCHAR *fullname, DWORD buflen,
WCHAR **index, WCHAR **window)
{
- const WCHAR *extra;
- WCHAR chm_file[MAX_PATH];
-
static const WCHAR helpW[] =
{'\\','h','e','l','p','\\',0};
static const WCHAR delimW[] = {':',':',0};
static const WCHAR delim2W[] = {'>',0};
- filename = skip_schema(filename);
+ DWORD env_len;
+ WCHAR *filename, *extra;
+
+ env_filename = skip_schema(env_filename);
/* the format is "helpFile[::/index][>window]" */
if (index) *index = NULL;
if (window) *window = NULL;
- extra = strstrW(filename, delim2W);
+ env_len = ExpandEnvironmentStringsW(env_filename, NULL, 0);
+ if (!env_len)
+ return 0;
+
+ filename = heap_alloc(env_len * sizeof(WCHAR));
+ if (filename == NULL)
+ return 0;
+
+ ExpandEnvironmentStringsW(env_filename, filename, env_len);
+
+ extra = wcsstr(filename, delim2W);
if (extra)
{
- memcpy(chm_file, filename, (extra-filename)*sizeof(WCHAR));
- chm_file[extra-filename] = 0;
- filename = chm_file;
+ *extra = 0;
if (window)
*window = strdupW(extra+1);
}
- extra = strstrW(filename, delimW);
+ extra = wcsstr(filename, delimW);
if (extra)
{
- if (filename != chm_file)
- memcpy(chm_file, filename, (extra-filename)*sizeof(WCHAR));
- chm_file[extra-filename] = 0;
- filename = chm_file;
+ *extra = 0;
if (index)
*index = strdupW(extra+2);
}
@@ -137,9 +142,12 @@ static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname,
DWORD bufle
if (GetFileAttributesW(fullname) == INVALID_FILE_ATTRIBUTES)
{
GetWindowsDirectoryW(fullname, buflen);
- strcatW(fullname, helpW);
- strcatW(fullname, filename);
+ lstrcatW(fullname, helpW);
+ lstrcatW(fullname, filename);
}
+
+ heap_free(filename);
+
return (GetFileAttributesW(fullname) != INVALID_FILE_ATTRIBUTES);
}
@@ -206,12 +214,12 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command,
DWORD_PTR dat
static const WCHAR delimW[] = {':',':',0};
const WCHAR *i = (const WCHAR *)data;
- index = strstrW(i, delimW);
+ index = wcsstr(i, delimW);
if(index)
{
if(memcmp(info->pCHMInfo->szFile, i, index-i))
FIXME("Opening a CHM file in the context of another is not
supported.\n");
- index += strlenW(delimW);
+ index += lstrlenW(delimW);
}
else
index = i;
diff --git a/dll/win32/hhctrl.ocx/hhctrl.h b/dll/win32/hhctrl.ocx/hhctrl.h
index b358f543788..a03d09f5633 100644
--- a/dll/win32/hhctrl.ocx/hhctrl.h
+++ b/dll/win32/hhctrl.ocx/hhctrl.h
@@ -26,6 +26,7 @@
#include "windef.h"
#include "winbase.h"
+#include "wine/winternl.h"
#include "winuser.h"
#include "winnls.h"
#include "htmlhelp.h"
@@ -39,7 +40,6 @@
#endif
#include "wine/itss.h"
-#include "wine/unicode.h"
#include "wine/heap.h"
#include "wine/list.h"
@@ -258,7 +258,7 @@ static inline LPWSTR strdupW(LPCWSTR str)
if(!str)
return NULL;
- size = (strlenW(str)+1)*sizeof(WCHAR);
+ size = (lstrlenW(str)+1)*sizeof(WCHAR);
ret = heap_alloc(size);
memcpy(ret, str, size);
diff --git a/dll/win32/hhctrl.ocx/index.c b/dll/win32/hhctrl.ocx/index.c
index 8b80ce24e79..54151d0821e 100644
--- a/dll/win32/hhctrl.ocx/index.c
+++ b/dll/win32/hhctrl.ocx/index.c
@@ -43,7 +43,7 @@ static void fill_index_tree(HWND hwnd, IndexItem *item)
lvi.iItem = index++;
lvi.mask = LVIF_TEXT|LVIF_PARAM|LVIF_INDENT;
lvi.iIndent = item->indentLevel;
- lvi.cchTextMax = strlenW(item->keyword)+1;
+ lvi.cchTextMax = lstrlenW(item->keyword)+1;
lvi.pszText = item->keyword;
lvi.lParam = (LPARAM)item;
item->id = (HTREEITEM)SendMessageW(hwnd, LVM_INSERTITEMW, 0,
(LPARAM)&lvi);
@@ -83,20 +83,20 @@ static void parse_index_obj_node_param(IndexItem *item, const char
*text, UINT c
/* Allocate a new sub-item, either on the first run or whenever a
* sub-topic has filled out both the "name" and "local" params.
*/
- if(item->itemFlags == 0x11 && (!strncasecmp("name", ptr, len) ||
!strncasecmp("local", ptr, len)))
+ if(item->itemFlags == 0x11 && (!_strnicmp("name", ptr, len) ||
!_strnicmp("local", ptr, len)))
item_realloc(item, item->nItems+1);
- if(!strncasecmp("keyword", ptr, len)) {
+ if(!_strnicmp("keyword", ptr, len)) {
param = &item->keyword;
- }else if(!item->keyword && !strncasecmp("name", ptr, len)) {
+ }else if(!item->keyword && !_strnicmp("name", ptr, len)) {
/* Some HTML Help index files use an additional "name" parameter
* rather than the "keyword" parameter. In this case, the first
* occurrence of the "name" parameter is the keyword.
*/
param = &item->keyword;
- }else if(!strncasecmp("name", ptr, len)) {
+ }else if(!_strnicmp("name", ptr, len)) {
item->itemFlags |= 0x01;
param = &item->items[item->nItems-1].name;
- }else if(!strncasecmp("local", ptr, len)) {
+ }else if(!_strnicmp("local", ptr, len)) {
item->itemFlags |= 0x10;
param = &item->items[item->nItems-1].local;
}else {
@@ -137,9 +137,9 @@ static IndexItem *parse_index_sitemap_object(HHInfo *info, stream_t
*stream)
TRACE("%s\n", node.buf);
- if(!strcasecmp(node_name.buf, "param")) {
+ if(!_strnicmp(node_name.buf, "param", -1)) {
parse_index_obj_node_param(item, node.buf, info->pCHMInfo->codePage);
- }else if(!strcasecmp(node_name.buf, "/object")) {
+ }else if(!_strnicmp(node_name.buf, "/object", -1)) {
break;
}else {
WARN("Unhandled tag! %s\n", node_name.buf);
@@ -173,7 +173,7 @@ static IndexItem *parse_li(HHInfo *info, stream_t *stream)
TRACE("%s\n", node.buf);
- if(!strcasecmp(node_name.buf, "object")) {
+ if(!_strnicmp(node_name.buf, "object", -1)) {
const char *ptr;
int len;
@@ -228,11 +228,11 @@ static void parse_hhindex(HHInfo *info, IStream *str, IndexItem
*item)
TRACE("%s\n", node.buf);
- if(!strcasecmp(node_name.buf, "li")) {
+ if(!_strnicmp(node_name.buf, "li", -1)) {
IndexItem *new_item;
new_item = parse_li(info, &stream);
- if(new_item && item->keyword &&
strcmpW(new_item->keyword, item->keyword) == 0) {
+ if(new_item && item->keyword &&
lstrcmpW(new_item->keyword, item->keyword) == 0) {
int num_items = item->nItems;
item_realloc(item, num_items+1);
@@ -246,9 +246,9 @@ static void parse_hhindex(HHInfo *info, IStream *str, IndexItem
*item)
item = item->next;
item->indentLevel = indent_level;
}
- }else if(!strcasecmp(node_name.buf, "ul")) {
+ }else if(!_strnicmp(node_name.buf, "ul", -1)) {
indent_level++;
- }else if(!strcasecmp(node_name.buf, "/ul")) {
+ }else if(!_strnicmp(node_name.buf, "/ul", -1)) {
indent_level--;
}else {
WARN("Unhandled tag! %s\n", node_name.buf);
diff --git a/dll/win32/hhctrl.ocx/search.c b/dll/win32/hhctrl.ocx/search.c
index 0e198b87367..f9c13a91312 100644
--- a/dll/win32/hhctrl.ocx/search.c
+++ b/dll/win32/hhctrl.ocx/search.c
@@ -29,7 +29,7 @@ static SearchItem *SearchCHM_Folder(SearchItem *item, IStorage
*pStorage,
/* Allocate a ListView entry for a search result. */
static SearchItem *alloc_search_item(WCHAR *title, const WCHAR *filename)
{
- int filename_len = filename ? (strlenW(filename)+1)*sizeof(WCHAR) : 0;
+ int filename_len = filename ? (lstrlenW(filename)+1)*sizeof(WCHAR) : 0;
SearchItem *item;
item = heap_alloc_zero(sizeof(SearchItem));
@@ -56,7 +56,7 @@ static void fill_search_tree(HWND hwndList, SearchItem *item)
memset(&lvi, 0, sizeof(lvi));
lvi.iItem = index++;
lvi.mask = LVIF_TEXT|LVIF_PARAM;
- lvi.cchTextMax = strlenW(item->title)+1;
+ lvi.cchTextMax = lstrlenW(item->title)+1;
lvi.pszText = item->title;
lvi.lParam = (LPARAM)item;
item->id = (HTREEITEM)SendMessageW(hwndList, LVM_INSERTITEMW, 0,
(LPARAM)&lvi);
@@ -102,7 +102,7 @@ static WCHAR *SearchCHM_File(IStorage *pStorage, const WCHAR *file,
const char *
char *text = &content.buf[1];
int textlen = content.len-1;
- if(!strcasecmp(node_name.buf, "title"))
+ if(!_strnicmp(node_name.buf, "title", -1))
{
int wlen = MultiByteToWideChar(CP_ACP, 0, text, textlen, NULL, 0);
title = heap_alloc((wlen+1)*sizeof(WCHAR));
@@ -168,14 +168,14 @@ static SearchItem *SearchCHM_Storage(SearchItem *item, IStorage
*pStorage,
while (IEnumSTATSTG_Next(elem, 1, &entries, &retr) == NOERROR)
{
filename = entries.pwcsName;
- while(strchrW(filename, '/'))
- filename = strchrW(filename, '/')+1;
+ while(wcschr(filename, '/'))
+ filename = wcschr(filename, '/')+1;
switch(entries.type) {
case STGTY_STORAGE:
item = SearchCHM_Folder(item, pStorage, filename, needle);
break;
case STGTY_STREAM:
- if(strstrW(filename, szHTMext))
+ if(wcsstr(filename, szHTMext))
{
WCHAR *title = SearchCHM_File(pStorage, filename, needle);
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index fdc5b31dc7f..01c8ef6cb1e 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -70,7 +70,7 @@ dll/win32/faultrep # Synced to WineStaging-4.18
dll/win32/fontsub # Synced to WineStaging-2.9
dll/win32/fusion # Synced to WineStaging-4.18
dll/win32/gdiplus # Synced to WineStaging-4.0
-dll/win32/hhctrl.ocx # Synced to WineStaging-4.0
+dll/win32/hhctrl.ocx # Synced to WineStaging-4.18
dll/win32/hlink # Synced to WineStaging-4.0
dll/win32/hnetcfg # Synced to WineStaging-4.18
dll/win32/httpapi # Synced to WineStaging-3.3