Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
abe3428f
Commit
abe3428f
authored
Mar 01, 2007
by
Jacek Caban
Committed by
Alexandre Julliard
Mar 01, 2007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
hhctrl.ocx: Store full chm paths to solve problems with relative paths.
parent
55a103ca
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
43 additions
and
23 deletions
+43
-23
Makefile.in
dlls/hhctrl.ocx/Makefile.in
+1
-1
chm.c
dlls/hhctrl.ocx/chm.c
+26
-6
content.c
dlls/hhctrl.ocx/content.c
+15
-15
hhctrl.h
dlls/hhctrl.ocx/hhctrl.h
+1
-1
No files found.
dlls/hhctrl.ocx/Makefile.in
View file @
abe3428f
...
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
...
@@ -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
=
\
...
...
dlls/hhctrl.ocx/chm.c
View file @
abe3428f
...
@@ -21,6 +21,8 @@
...
@@ -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:
...
@@ -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)
...
@@ -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
)
;
...
...
dlls/hhctrl.ocx/content.c
View file @
abe3428f
...
@@ -160,7 +160,7 @@ static const char *get_attr(const char *node, const char *name, int *len)
...
@@ -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)
...
@@ -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
...
@@ -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_
...
@@ -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_
...
@@ -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_
...
@@ -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)
...
@@ -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)
...
@@ -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_
...
@@ -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)
...
@@ -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)
...
@@ -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
);
...
...
dlls/hhctrl.ocx/hhctrl.h
View file @
abe3428f
...
@@ -113,7 +113,7 @@ void ReleaseContent(HHInfo*);
...
@@ -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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment