OSDN Git Service

分割書庫を開いた際に一部の格納ファイルがボリューム毎に一ファイルの扱いとなっていたバグを修正。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sun, 21 Nov 2010 12:02:51 +0000 (12:02 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sun, 21 Nov 2010 12:02:51 +0000 (12:02 +0000)
OpenArchive,Commandのエラー処理の際に、CloseArchiveを呼び忘れていた場合があったバグを修正。

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/tpi/tpi@442 9df91469-1e22-0410-86e7-ea8537beb833

doc/history.html
src/plugin/eggArc/eggArc.cpp
src/plugin/rarArc/rarArc.cpp

index 7dd9db3..f0257d3 100644 (file)
        <li class="chg">Unicodeだと問題が生じる場合が多いため、標準出力をUTF-8として読まないよう変更。</li>\r
       </ul>\r
      </dd>\r
+     <dt>eggArc</dt>\r
+     <dd>\r
+      <ul>\r
+       <li class="fix">OpenArchive,Commandのエラー処理の際に、CloseArchiveを呼び忘れていた場合があったバグを修正。</li>\r
+      </ul>\r
+     </dd>\r
      <dt>rarArc</dt>\r
      <dd>\r
       <ul>\r
        <li class="fix">Unixで作成された書庫を開いた際、パーミッションを属性値として扱っていたバグを修正。</li>\r
+       <li class="fix">分割書庫を開いた際に一部の格納ファイルがボリューム毎に一ファイルの扱いとなっていたバグを修正。</li>\r
+       <li class="fix">OpenArchive,Commandのエラー処理の際に、CloseArchiveを呼び忘れていた場合があったバグを修正。</li>\r
       </ul>\r
      </dd>\r
      <dt>spiLibrary</dt>\r
index ca305da..accf53e 100644 (file)
@@ -339,12 +339,14 @@ int __stdcall OpenArchive
                fpProc = ::GetAPIAddress("GetFileCount");\r
                if (fpProc == NULL)\r
                {\r
+                       CloseArchive(* _hArchive);\r
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
                unsigned int n;\r
                nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t *)) fpProc)(* _hArchive, & n));\r
                if (nErrorCode != TPI_ERROR_SUCCESS)\r
                {\r
+                       CloseArchive(* _hArchive);\r
                        return nErrorCode;\r
                }\r
                * _nFileCount = n;\r
@@ -437,11 +439,13 @@ int __stdcall Command
        FARPROC fpProc = _eCommand == TPI_COMMAND_EXTRACT ? ::GetAPIAddress("Extract") : ::GetAPIAddress("Test");\r
        if (fpProc == NULL)\r
        {\r
+               CloseArchive(hArc);\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
        nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *)) fpProc)(hArc));\r
        if (nErrorCode != TPI_ERROR_SUCCESS)\r
        {\r
+               CloseArchive(hArc);\r
                return nErrorCode;\r
        }\r
 \r
index 05a930b..33c5be9 100644 (file)
@@ -231,7 +231,7 @@ int __stdcall OpenArchive
        g_oaInfo.ArcName    = NULL;\r
        g_oaInfo.ArcNameW   = (wchar_t *) malloc((_szArcName.Len() + 1) * sizeof(wchar_t));\r
        wcscpy(g_oaInfo.ArcNameW, _szArcName.wchar_str());\r
-       g_oaInfo.OpenMode   = RAR_OM_EXTRACT;\r
+       g_oaInfo.OpenMode   = RAR_OM_LIST;\r
        g_oaInfo.CmtBuf     = g_szComment;\r
        g_oaInfo.CmtBufSize = sizeof(g_szComment) - 1;\r
        * _hArchive = ((void * (__stdcall *)(RAROpenArchiveDataEx *)) p)(& g_oaInfo);\r
@@ -249,11 +249,13 @@ int __stdcall OpenArchive
        // コールバック関数を設定。\r
        if (! g_hLib.HasSymbol(wxT("RARSetCallback")))\r
        {\r
+               CloseArchive(* _hArchive);\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
        p = g_hLib.GetSymbol(wxT("RARSetCallback"));\r
        if (! p)\r
        {\r
+               CloseArchive(* _hArchive);\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
        ((void (__stdcall *)(void *, void *, long)) p)(* _hArchive, (void *) CallbackProc, (long) & g_hdInfo);\r
@@ -364,19 +366,55 @@ int __stdcall Command
        }\r
 \r
        // 開きなおす。\r
-       void * hArc;\r
-       int nErrorCode = OpenArchive(_szArcName, & hArc);\r
+       if (! g_hLib.HasSymbol(wxT("RAROpenArchiveEx")))\r
+       {\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+       void * p = g_hLib.GetSymbol(wxT("RAROpenArchiveEx"));\r
+       if (! p)\r
+       {\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+       RAROpenArchiveDataEx oaInfo;\r
+       memset(& oaInfo, 0, sizeof(oaInfo));\r
+       oaInfo.ArcName    = NULL;\r
+       oaInfo.ArcNameW   = (wchar_t *) malloc((_szArcName.Len() + 1) * sizeof(wchar_t));\r
+       wcscpy(oaInfo.ArcNameW, _szArcName.wchar_str());\r
+       oaInfo.OpenMode   = RAR_OM_EXTRACT;\r
+       oaInfo.CmtBufSize = 0;\r
+       void * hArc = ((void * (__stdcall *)(RAROpenArchiveDataEx *)) p)(& oaInfo);\r
+       free(oaInfo.ArcNameW);\r
+       if (hArc == NULL)\r
+       {\r
+               return TPI_ERROR_UNDEFINED;\r
+       }\r
+       int nErrorCode = ErrorCodeConvert(oaInfo.OpenResult);\r
        if (nErrorCode != TPI_ERROR_SUCCESS)\r
        {\r
                return nErrorCode;\r
        }\r
 \r
+       // コールバック関数を設定。\r
+       if (! g_hLib.HasSymbol(wxT("RARSetCallback")))\r
+       {\r
+               CloseArchive(hArc);\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+       p = g_hLib.GetSymbol(wxT("RARSetCallback"));\r
+       if (! p)\r
+       {\r
+               CloseArchive(hArc);\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+       ((void (__stdcall *)(void *, void *, long)) p)(hArc, (void *) CallbackProc, (long) & g_hdInfo);\r
+\r
        void\r
                * pS = g_hLib.HasSymbol(wxT("RARSetPassword"))  ? g_hLib.GetSymbol(wxT("RARSetPassword"))  : NULL,\r
                * pR = g_hLib.HasSymbol(wxT("RARReadHeaderEx")) ? g_hLib.GetSymbol(wxT("RARReadHeaderEx")) : NULL,\r
                * pP = g_hLib.HasSymbol(wxT("RARProcessFileW")) ? g_hLib.GetSymbol(wxT("RARProcessFileW")) : NULL;\r
        if (! pR || ! pP)\r
        {\r
+               CloseArchive(hArc);\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
        if (pS)\r