OSDN Git Service

書庫への追加操作に対応していないのに、操作が実行できるようになっていたバグを修正。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sun, 15 Jan 2012 10:47:03 +0000 (10:47 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sun, 15 Jan 2012 10:47:03 +0000 (10:47 +0000)
Command()に書庫のハンドルを渡せるよう変更。TPI_INFO_HANDLE_ON_COMMANDを追加。

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

src/plugin/sqxArc/sqxArc.cpp

index fea616e..9a2137d 100644 (file)
@@ -252,6 +252,9 @@ int __stdcall GetPluginInformation
        case TPI_INFO_VERSION_API:\r
                * (int *) _pPtr = 2;\r
                break;\r
+       case TPI_INFO_HANDLE_ON_COMMAND:\r
+               * (int *) _pPtr = 1;\r
+               break;\r
        default:\r
                return TPI_ERROR_D_UNSUPPORTED;\r
        }\r
@@ -275,7 +278,7 @@ int __stdcall GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)
        _fiInfo->szEngineName = wxT("sqx20u.dll");\r
        _fiInfo->szTPIName    = wxT("sqxArc");\r
        _fiInfo->nTypeId      = s_uFileId++;\r
-       _fiInfo->eSupportedCommand = TPI_COMMAND_CREATE | TPI_COMMAND_ADD | TPI_COMMAND_EXTRACT | TPI_COMMAND_DELETE | TPI_COMMAND_TEST | TPI_COMMAND_REPAIR;\r
+       _fiInfo->eSupportedCommand = TPI_COMMAND_CREATE | TPI_COMMAND_EXTRACT | TPI_COMMAND_DELETE | TPI_COMMAND_TEST | TPI_COMMAND_REPAIR;\r
        _fiInfo->fArchive     = true;\r
        _fiInfo->fComment     = true;\r
        _fiInfo->fSFX         = true;\r
@@ -605,16 +608,18 @@ int __stdcall Command
 (\r
        wxULongLong_t _eCommand,\r
        TPI_SWITCHES * _swInfo,\r
-       const wxString & _szArcName,\r
+       void * _hArchive,\r
        const wxArrayString & _szFiles\r
 )\r
 {\r
-       // 開きなおす。\r
-       void * hArc;\r
-       int nErrorCode = OpenArchive(_szArcName, & hArc);\r
-       if (nErrorCode != TPI_ERROR_SUCCESS)\r
+       int nErrorCode = TPI_ERROR_SUCCESS;\r
+       if (_eCommand == TPI_COMMAND_CREATE)\r
        {\r
-               return nErrorCode;\r
+               nErrorCode = OpenArchive(_swInfo->szArcName, & _hArchive);\r
+               if (nErrorCode != TPI_ERROR_SUCCESS)\r
+               {\r
+                       return nErrorCode;\r
+               }\r
        }\r
 \r
        FARPROC fpProc;\r
@@ -624,46 +629,58 @@ int __stdcall Command
                fpProc = ::GetAPIAddress("InitFileList");\r
                if (fpProc == NULL)\r
                {\r
-                       CloseArchive(hArc);\r
+                       if (_eCommand == TPI_COMMAND_CREATE)\r
+                       {\r
+                               CloseArchive(_hArchive);\r
+                       }\r
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
-               fl = ((void * (__stdcall *)(void *)) fpProc)(hArc);\r
+               fl = ((void * (__stdcall *)(void *)) fpProc)(_hArchive);\r
                if (fl == NULL)\r
                {\r
-                       CloseArchive(hArc);\r
+                       if (_eCommand == TPI_COMMAND_CREATE)\r
+                       {\r
+                               CloseArchive(_hArchive);\r
+                       }\r
                        return TPI_ERROR_UNDEFINED;\r
                }\r
 \r
                fpProc = ::GetAPIAddress("AppendFileList");\r
                if (fpProc == NULL)\r
                {\r
-                       CloseArchive(hArc);\r
+                       if (_eCommand == TPI_COMMAND_CREATE)\r
+                       {\r
+                               CloseArchive(_hArchive);\r
+                       }\r
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
                for (size_t i = 0; i < _szFiles.Count(); i++)\r
                {\r
-                       ((void (__stdcall *)(void *, void *, const wchar_t *)) fpProc)(hArc, fl, _szFiles[i].c_str());\r
+                       ((void (__stdcall *)(void *, void *, const wchar_t *)) fpProc)(_hArchive, fl, _szFiles[i].c_str());\r
                }\r
        }\r
 \r
        // グローバル変数にポインタを保存。\r
        fpProc =\r
                _eCommand == TPI_COMMAND_CREATE  ? ::GetAPIAddress("CompressFiles") :\r
-               _eCommand == TPI_COMMAND_ADD     ? ::GetAPIAddress("CompressFiles") :\r
+//             _eCommand == TPI_COMMAND_ADD     ? ::GetAPIAddress("CompressFiles") :\r
                _eCommand == TPI_COMMAND_EXTRACT ? ::GetAPIAddress("ExtractFiles")  :\r
                _eCommand == TPI_COMMAND_DELETE  ? ::GetAPIAddress("DeleteFiles")   :\r
                _eCommand == TPI_COMMAND_TEST    ? ::GetAPIAddress("TestArchive")   :\r
                _eCommand == TPI_COMMAND_REPAIR  ? ::GetAPIAddress("RepairArchive") : NULL;\r
        if (fpProc == NULL)\r
        {\r
-               CloseArchive(hArc);\r
+               if (_eCommand == TPI_COMMAND_CREATE)\r
+               {\r
+                       CloseArchive(_hArchive);\r
+               }\r
                return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
 \r
        switch (_eCommand)\r
        {\r
        case TPI_COMMAND_CREATE:\r
-       case TPI_COMMAND_ADD:\r
+//     case TPI_COMMAND_ADD:\r
        {\r
                SQX_COMPRESSOPTIONS co;\r
                memset(& co, 0, sizeof(co));\r
@@ -690,7 +707,7 @@ int __stdcall Command
                {\r
                        wcsncpy(co.szPasswordHeader, _swInfo->szPassword.c_str(), sizeof(co.szPasswordHeader) / sizeof(wchar_t) - 1);\r
                }\r
-               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, SQXCALLBACK, void *, void *, SQX_COMPRESSOPTIONS *)) fpProc)(hArc, CallbackProc, NULL, fl, & co));\r
+               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, SQXCALLBACK, void *, void *, SQX_COMPRESSOPTIONS *)) fpProc)(_hArchive, CallbackProc, NULL, fl, & co));\r
                break;\r
        }\r
        case TPI_COMMAND_EXTRACT:\r
@@ -710,26 +727,29 @@ int __stdcall Command
                wcsncpy(eo.szPassword,       _swInfo->szPassword.c_str(), sizeof(eo.szPassword) / sizeof(wchar_t) - 1);\r
                wcsncpy(eo.szPasswordHeader, _swInfo->szPassword.c_str(), sizeof(eo.szPasswordHeader) / sizeof(wchar_t) - 1);\r
                wcsncpy(eo.szOutputPath,     _swInfo->fnDestinationDirectory.GetFullPath().c_str(), sizeof(eo.szOutputPath) / sizeof(wchar_t) - 1);\r
-               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, SQXCALLBACK, void *, void *, SQX_EXTRACTOPTIONS *)) fpProc)(hArc, CallbackProc, NULL, fl, & eo));\r
+               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, SQXCALLBACK, void *, void *, SQX_EXTRACTOPTIONS *)) fpProc)(_hArchive, CallbackProc, NULL, fl, & eo));\r
                break;\r
        }\r
        case TPI_COMMAND_DELETE:\r
-               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, SQXCALLBACK, void *, void *)) fpProc)(hArc, CallbackProc, NULL, fl));\r
+               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, SQXCALLBACK, void *, void *)) fpProc)(_hArchive, CallbackProc, NULL, fl));\r
                break;\r
        case TPI_COMMAND_TEST:\r
-               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, SQXCALLBACK, void *)) fpProc)(hArc, CallbackProc, NULL));\r
+               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, SQXCALLBACK, void *)) fpProc)(_hArchive, CallbackProc, NULL));\r
                break;\r
        case TPI_COMMAND_REPAIR:\r
        {\r
-               wxString sz = _szArcName + wxT("_repaired");\r
-               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, const wchar_t *, SQX_ARCLIST *, SQX_ARCLIST *)) fpProc)(hArc, sz.c_str(), NULL, NULL));\r
+               wxString sz = _swInfo->szArcName + wxT("_repaired");\r
+               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, const wchar_t *, SQX_ARCLIST *, SQX_ARCLIST *)) fpProc)(_hArchive, sz.c_str(), NULL, NULL));\r
                break;\r
        }\r
        }\r
 \r
        if (nErrorCode != TPI_ERROR_SUCCESS)\r
        {\r
-               CloseArchive(hArc);\r
+               if (_eCommand == TPI_COMMAND_CREATE)\r
+               {\r
+                       CloseArchive(_hArchive);\r
+               }\r
                return nErrorCode;\r
        }\r
 \r
@@ -738,12 +758,16 @@ int __stdcall Command
                fpProc = ::GetAPIAddress("DoneFileList");\r
                if (fpProc == NULL)\r
                {\r
-                       CloseArchive(hArc);\r
+                       if (_eCommand == TPI_COMMAND_CREATE)\r
+                       {\r
+                               CloseArchive(_hArchive);\r
+                       }\r
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
-               ((void (__stdcall *)(void *, void *)) fpProc)(hArc, fl);\r
+               ((void (__stdcall *)(void *, void *)) fpProc)(_hArchive, fl);\r
        }\r
-       return CloseArchive(hArc);\r
+\r
+       return _eCommand == TPI_COMMAND_CREATE ? CloseArchive(_hArchive) : TPI_ERROR_SUCCESS;\r
 }\r
 \r
 #ifdef __cplusplus\r