Jacek Caban : hhctrl.ocx: Handle memory allocation in OpenCHM and
CloseCHM.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Feb 23 05:28:22 CST 2007
Module: wine
Branch: master
Commit: 1711c3a5c473d5b011e67f32a25b7fad9645df73
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1711c3a5c473d5b011e67f32a25b7fad9645df73
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Feb 23 03:30:38 2007 +0100
hhctrl.ocx: Handle memory allocation in OpenCHM and CloseCHM.
---
dlls/hhctrl.ocx/chm.c | 60 +++++++++++++++++++++++++++------------------
dlls/hhctrl.ocx/help.c | 15 ++++++-----
dlls/hhctrl.ocx/hhctrl.h | 4 +-
3 files changed, 46 insertions(+), 33 deletions(-)
diff --git a/dlls/hhctrl.ocx/chm.c b/dlls/hhctrl.ocx/chm.c
index 9fc98c6..83599a1 100644
--- a/dlls/hhctrl.ocx/chm.c
+++ b/dlls/hhctrl.ocx/chm.c
@@ -127,48 +127,60 @@ done:
}
/* Opens the CHM file for reading */
-BOOL CHM_OpenCHM(CHMInfo *pChmInfo, LPCWSTR szFile)
+CHMInfo *OpenCHM(LPCWSTR szFile)
{
HRESULT hres;
static const WCHAR wszSTRINGS[] = {'#','S','T','R','I','N','G','S',0};
- pChmInfo->szFile = szFile;
+ CHMInfo *ret = hhctrl_alloc_zero(sizeof(CHMInfo));
- if (FAILED(CoCreateInstance(&CLSID_ITStorage, NULL, CLSCTX_INPROC_SERVER,
- &IID_IITStorage, (void **) &pChmInfo->pITStorage)))
- return FALSE;
+ ret->szFile = szFile;
- if (FAILED(IITStorage_StgOpenStorage(pChmInfo->pITStorage, szFile, NULL,
- STGM_READ | STGM_SHARE_DENY_WRITE,
- NULL, 0, &pChmInfo->pStorage)))
- return FALSE;
+ hres = CoCreateInstance(&CLSID_ITStorage, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IITStorage, (void **) &ret->pITStorage) ;
+ if(FAILED(hres)) {
+ WARN("Could not create ITStorage: %08x\n", hres);
+ return CloseCHM(ret);
+ }
- hres = IStorage_OpenStream(pChmInfo->pStorage, wszSTRINGS, NULL, STGM_READ, 0,
- &pChmInfo->strings_stream);
+ hres = IITStorage_StgOpenStorage(ret->pITStorage, szFile, NULL,
+ STGM_READ | STGM_SHARE_DENY_WRITE, NULL, 0, &ret->pStorage);
if(FAILED(hres)) {
- WARN("Could not open #STRINGS stream: %08x\n", hres);
- return FALSE;
+ WARN("Could not open storage: %08x\n", hres);
+ return CloseCHM(ret);
}
- pChmInfo->strings = NULL;
- pChmInfo->strings_size = 0;
+ hres = IStorage_OpenStream(ret->pStorage, wszSTRINGS, NULL, STGM_READ, 0,
+ &ret->strings_stream);
+ if(FAILED(hres)) {
+ WARN("Could not open #STRINGS stream: %08x\n", hres);
+ return CloseCHM(ret);
+ }
- return TRUE;
+ return ret;
}
-void CHM_CloseCHM(CHMInfo *pCHMInfo)
+CHMInfo *CloseCHM(CHMInfo *chm)
{
- IITStorage_Release(pCHMInfo->pITStorage);
- IStorage_Release(pCHMInfo->pStorage);
- IStream_Release(pCHMInfo->strings_stream);
+ if(chm->pITStorage)
+ IITStorage_Release(chm->pITStorage);
- if(pCHMInfo->strings_size) {
+ if(chm->pStorage)
+ IStorage_Release(chm->pStorage);
+
+ if(chm->strings_stream)
+ IStream_Release(chm->strings_stream);
+
+ if(chm->strings_size) {
int i;
- for(i=0; i<pCHMInfo->strings_size; i++)
- hhctrl_free(pCHMInfo->strings[i]);
+ for(i=0; i<chm->strings_size; i++)
+ hhctrl_free(chm->strings[i]);
}
- hhctrl_free(pCHMInfo->strings);
+ hhctrl_free(chm->strings);
+ hhctrl_free(chm);
+
+ return NULL;
}
diff --git a/dlls/hhctrl.ocx/help.c b/dlls/hhctrl.ocx/help.c
index 0e5d4bd..e018c14 100644
--- a/dlls/hhctrl.ocx/help.c
+++ b/dlls/hhctrl.ocx/help.c
@@ -800,10 +800,7 @@ static void HH_Close(HHInfo *pHHInfo)
hhctrl_free(pHHInfo->pHHWinType);
if (pHHInfo->pCHMInfo)
- {
- CHM_CloseCHM(pHHInfo->pCHMInfo);
- hhctrl_free(pHHInfo->pCHMInfo);
- }
+ CloseCHM(pHHInfo->pCHMInfo);
if (pHHInfo->pWBInfo)
{
@@ -816,12 +813,16 @@ static HHInfo *HH_OpenHH(LPWSTR filename)
{
HHInfo *pHHInfo = hhctrl_alloc_zero(sizeof(HHInfo));
+ pHHInfo->pCHMInfo = OpenCHM(filename);
+ if(!pHHInfo->pCHMInfo) {
+ HH_Close(pHHInfo);
+ return NULL;
+ }
+
pHHInfo->pHHWinType = hhctrl_alloc_zero(sizeof(HH_WINTYPEW));
- pHHInfo->pCHMInfo = hhctrl_alloc(sizeof(CHMInfo));
pHHInfo->pWBInfo = hhctrl_alloc(sizeof(WBInfo));
- if (!CHM_OpenCHM(pHHInfo->pCHMInfo, filename)
- || !CHM_LoadWinTypeFromCHM(pHHInfo->pCHMInfo, pHHInfo->pHHWinType)) {
+ if (!CHM_LoadWinTypeFromCHM(pHHInfo->pCHMInfo, pHHInfo->pHHWinType)) {
HH_Close(pHHInfo);
return NULL;
}
diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h
index 355fc02..23803b1 100644
--- a/dlls/hhctrl.ocx/hhctrl.h
+++ b/dlls/hhctrl.ocx/hhctrl.h
@@ -70,9 +70,9 @@ void WB_UnEmbedBrowser(WBInfo *pWBInfo);
void WB_ResizeBrowser(WBInfo *pWBInfo, DWORD dwWidth, DWORD dwHeight);
void WB_DoPageAction(WBInfo *pWBInfo, DWORD dwAction);
-BOOL CHM_OpenCHM(CHMInfo *pCHMInfo, LPCWSTR szFile);
+CHMInfo *OpenCHM(LPCWSTR szFile);
BOOL CHM_LoadWinTypeFromCHM(CHMInfo *pCHMInfo, HH_WINTYPEW *pHHWinType);
-void CHM_CloseCHM(CHMInfo *pCHMInfo);
+CHMInfo *CloseCHM(CHMInfo *pCHMInfo);
/* memory allocation functions */
More information about the wine-cvs
mailing list