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