OSDN Git Service

上書き確認を実装。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Fri, 24 Sep 2010 14:36:04 +0000 (14:36 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Fri, 24 Sep 2010 14:36:04 +0000 (14:36 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/tpi/tpi@346 9df91469-1e22-0410-86e7-ea8537beb833

src/plugin/eggArc/eggArc.cpp
src/plugin/rarArc/rarArc.cpp
src/plugin/xpiLibrary/xpiLibrary.cpp

index bfbfa1b..e0b5964 100644 (file)
@@ -39,6 +39,65 @@ TPI_SWITCHES * g_swInfo;
 const wxArrayString * g_asFiles;\r
 \r
 //******************************************************************************\r
+//    Inside Functions\r
+//******************************************************************************\r
+\r
+#define GetAPIAddress(name) GetProcAddress(g_hLib, "EGG_" name)\r
+\r
+int ErrorCodeConvert(int nErrorCode)\r
+{\r
+       switch (nErrorCode)\r
+       {\r
+       case EGG_ERROR_FAIL:        return TPI_ERROR_UNDEFINED;\r
+       case EGG_ERROR_SUCCESS:     return TPI_ERROR_SUCCESS;\r
+       case EGG_ERROR_SKIP:        return TPI_ERROR_D_SKIPPED;\r
+       case EGG_ERROR_CANCEL:      return TPI_ERROR_D_SKIPPED;\r
+       case EGG_ERROR_IO:          return TPI_ERROR_IO_MISC;\r
+       case EGG_ERROR_TYPEMISMATCH:return TPI_ERROR_ARC_UNSUPPORTED;\r
+       case EGG_ERROR_FILE:        return TPI_ERROR_IO_MISC;\r
+       case EGG_ERROR_FORMAT:      return TPI_ERROR_IO_ARC_MISC;\r
+       case EGG_ERROR_ALGORITHM:   return TPI_ERROR_UNDEFINED;\r
+       default:                    return TPI_ERROR_UNDEFINED;\r
+       }\r
+}\r
+\r
+int __stdcall GetFileInformation2\r
+(\r
+       void * _hArchive,\r
+       TPI_FILEINFO * _fiInfo,\r
+       wxULongLong_t _nIndex\r
+)\r
+{\r
+       static FARPROC fpProc = ::GetAPIAddress("GetFileHeader");\r
+       if (fpProc == NULL)\r
+       {\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
+       }\r
+\r
+       EGGFileHeader fhInfo;\r
+       int nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t, EGGFileHeader *)) fpProc)(_hArchive, _nIndex, & fhInfo));\r
+       if (nErrorCode == TPI_ERROR_SUCCESS)\r
+       {\r
+               _fiInfo->dwAttribute    = fhInfo.attribute;\r
+               if (fhInfo.encrypted)\r
+               {\r
+                       _fiInfo->dwAttribute |= TPI_ATTRIBUTE_ENCRYPTED;\r
+               }\r
+               _fiInfo->dwCRC32        = fhInfo.crc;\r
+               _fiInfo->nPackedSize    = fhInfo.packedSize;\r
+               _fiInfo->nUnpackedSize  = fhInfo.unpackedSize;\r
+               _fiInfo->tmModified     = fhInfo.lastModified;\r
+               _fiInfo->szComment      = WC2String(fhInfo.comment);\r
+               _fiInfo->szStoredName   = WC2String(fhInfo.fileName);\r
+               _fiInfo->szMethod       = fhInfo.method == 2 ? wxT("ALZ") : fhInfo.method == 0 ? wxT("EGG") : wxT("unknown");\r
+               _fiInfo->nFileId        = _nIndex;\r
+               _fiInfo->fnFileName     = wxFileName(_fiInfo->szStoredName);\r
+       }\r
+\r
+       return nErrorCode;\r
+}\r
+\r
+//******************************************************************************\r
 //    Callback Wrapper\r
 //******************************************************************************\r
 \r
@@ -55,22 +114,34 @@ UINT __cdecl CallbackProc(void * user, UINT code, void* param)
                break;\r
        case eggevent::Extract::CODE:\r
        {\r
-               // 展開するかどうか判断。\r
-               // TODO : アプリケーション側へ。\r
+               // 対象ファイルか確認。\r
                eggevent::Extract * p = (eggevent::Extract *) param;\r
-               wxString szFileName = WC2String(p->nameInArchive);\r
-               if (g_asFiles->Count() != 0 && g_asFiles->Index(szFileName) == wxNOT_FOUND)\r
+               GetFileInformation2(* (void **) user, & piInfo.fiInfo, p->index);\r
+               if (g_asFiles->Count() != 0 && g_asFiles->Index(piInfo.fiInfo.fnFileName.GetFullPath()) == wxNOT_FOUND)\r
+               {\r
+                       return EGG_ERROR_SKIP;\r
+               }\r
+\r
+               // 処理するかどうか確認。\r
+               piInfo.eMessage = TPI_MESSAGE_ASK;\r
+               piInfo.eStatus  = TPI_PARAM_DEST;\r
+               piInfo.fnDestination = wxFileName(g_swInfo->fnDestinationDirectory.GetPathWithSep() + (g_swInfo->fStoreDirectoryPathes ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetFullName()));\r
+               if (g_prProc != NULL && g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CONTINUE)\r
+               {\r
+                       return EGG_ERROR_CANCEL;\r
+               }\r
+               if (! piInfo.fnDestination.IsOk())\r
                {\r
                        return EGG_ERROR_SKIP;\r
                }\r
 \r
                // 展開する。\r
-               wcsncpy(p->fileName, (g_swInfo->fnDestinationDirectory.GetPathWithSep() + (g_swInfo->fStoreDirectoryPathes ? szFileName : wxFileName(szFileName).GetFullName())).wchar_str(), MAX_PATH - 1);\r
+               wcsncpy(p->fileName, piInfo.fnDestination.GetFullPath().wchar_str(), MAX_PATH - 1);\r
                return EGG_ERROR_SUCCESS;\r
        }\r
        case eggevent::ActivityStart::CODE:\r
                piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
-               GetFileInformation(* (void **) user, & piInfo.fiInfo, ((eggevent::ActivityStart *) param)->index == 0);\r
+               GetFileInformation2(* (void **) user, & piInfo.fiInfo, ((eggevent::ActivityStart *) param)->index);\r
                break;\r
        case eggevent::Progress::CODE:\r
                piInfo.eStatus = TPI_STATUS_INPROCESS;\r
@@ -85,7 +156,6 @@ UINT __cdecl CallbackProc(void * user, UINT code, void* param)
        case eggevent::QueryPassword::CODE:\r
        {\r
                // パスワード問い合わせ。\r
-               // TODO : 個別ファイルに対する問い合わせの実装。\r
                piInfo.eMessage = TPI_MESSAGE_ASK;\r
                piInfo.eStatus  = TPI_PARAM_PASSWORD;\r
 \r
@@ -123,29 +193,6 @@ UINT __cdecl CallbackProc(void * user, UINT code, void* param)
 }\r
 \r
 //******************************************************************************\r
-//    Inside Functions\r
-//******************************************************************************\r
-\r
-#define GetAPIAddress(name) GetProcAddress(g_hLib, "EGG_" name)\r
-\r
-int ErrorCodeConvert(int nErrorCode)\r
-{\r
-       switch (nErrorCode)\r
-       {\r
-       case EGG_ERROR_FAIL:        return TPI_ERROR_UNDEFINED;\r
-       case EGG_ERROR_SUCCESS:     return TPI_ERROR_SUCCESS;\r
-       case EGG_ERROR_SKIP:        return TPI_ERROR_D_SKIPPED;\r
-       case EGG_ERROR_CANCEL:      return TPI_ERROR_D_SKIPPED;\r
-       case EGG_ERROR_IO:          return TPI_ERROR_IO_MISC;\r
-       case EGG_ERROR_TYPEMISMATCH:return TPI_ERROR_ARC_UNSUPPORTED;\r
-       case EGG_ERROR_FILE:        return TPI_ERROR_IO_MISC;\r
-       case EGG_ERROR_FORMAT:      return TPI_ERROR_IO_ARC_MISC;\r
-       case EGG_ERROR_ALGORITHM:   return TPI_ERROR_UNDEFINED;\r
-       default:                    return TPI_ERROR_UNDEFINED;\r
-       }\r
-}\r
-\r
-//******************************************************************************\r
 //    Functions\r
 //******************************************************************************\r
 \r
@@ -297,55 +344,21 @@ int __stdcall GetFileInformation
 {\r
        static wxULongLong_t s_nFileId;\r
        static size_t s_nFileCount;\r
-       static FARPROC fpProc;\r
-       int nErrorCode;\r
-\r
        if (_bFirst)\r
        {\r
                s_nFileId = 0;\r
-               fpProc = ::GetAPIAddress("GetFileCount");\r
+               FARPROC fpProc = ::GetAPIAddress("GetFileCount");\r
                if (fpProc == NULL)\r
                {\r
                        return TPI_ERROR_U_USE_LIBRARY;\r
                }\r
-               nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t *)) fpProc)(_hArchive, & s_nFileCount));\r
+               int nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t *)) fpProc)(_hArchive, & s_nFileCount));\r
                if (nErrorCode != TPI_ERROR_SUCCESS)\r
                {\r
                        return nErrorCode;\r
                }\r
-\r
-               fpProc = ::GetAPIAddress("GetFileHeader");\r
-               if (fpProc == NULL)\r
-               {\r
-                       return TPI_ERROR_U_USE_LIBRARY;\r
-               }\r
-       }\r
-       if (s_nFileId >= s_nFileCount)\r
-       {\r
-               return TPI_ERROR_S_ENDOFDATA;\r
-       }\r
-\r
-       EGGFileHeader fhInfo;\r
-       nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t, EGGFileHeader *)) fpProc)(_hArchive, s_nFileId, & fhInfo));\r
-       if (nErrorCode == TPI_ERROR_SUCCESS)\r
-       {\r
-               _fiInfo->dwAttribute    = fhInfo.attribute;\r
-               if (fhInfo.encrypted)\r
-               {\r
-                       _fiInfo->dwAttribute |= TPI_ATTRIBUTE_ENCRYPTED;\r
-               }\r
-               _fiInfo->dwCRC32        = fhInfo.crc;\r
-               _fiInfo->nPackedSize    = fhInfo.packedSize;\r
-               _fiInfo->nUnpackedSize  = fhInfo.unpackedSize;\r
-               _fiInfo->tmModified     = fhInfo.lastModified;\r
-               _fiInfo->szComment      = WC2String(fhInfo.comment);\r
-               _fiInfo->szStoredName   = WC2String(fhInfo.fileName);\r
-               _fiInfo->szMethod       = fhInfo.method == 2 ? wxT("ALZ") : fhInfo.method == 0 ? wxT("EGG") : wxT("unknown");\r
-               _fiInfo->nFileId        = s_nFileId++;\r
-               _fiInfo->fnFileName     = wxFileName(_fiInfo->szStoredName);\r
        }\r
-\r
-       return nErrorCode;\r
+       return s_nFileId >= s_nFileCount ? TPI_ERROR_S_ENDOFDATA : GetFileInformation2(_hArchive, _fiInfo, s_nFileId++);\r
 }\r
 \r
 int __stdcall GetArchiveInformation\r
index 11d199c..4bb7d34 100644 (file)
@@ -381,15 +381,28 @@ int __stdcall Command
        g_hdInfo = & hdInfo;\r
        while (nErrorCode == TPI_ERROR_SUCCESS && ErrorCodeConvert(((int (__stdcall *)(void *, RARHeaderDataEx *)) pR)(hArc, & hdInfo)) == TPI_ERROR_SUCCESS)\r
        {\r
-               nErrorCode =\r
-                       ErrorCodeConvert(\r
-                               ((int (__stdcall *)(void *, int, wchar_t *, wchar_t *)) pP)(\r
-                                       hArc,\r
-                                       (_szFiles.GetCount() != 0 && _szFiles.Index(wxString(hdInfo.FileNameW)) == wxNOT_FOUND) ? RAR_SKIP : _eCommand == TPI_COMMAND_EXTRACT ? RAR_EXTRACT : RAR_TEST,\r
-                                       _swInfo->fStoreDirectoryPathes ? _swInfo->fnDestinationDirectory.GetFullPath().wchar_str() : NULL,\r
-                                       _swInfo->fStoreDirectoryPathes ? NULL : (_swInfo->fnDestinationDirectory.GetPathWithSep() + wxFileName(hdInfo.FileNameW).GetFullName()).wchar_str()\r
-                               )\r
-                       );\r
+               TPI_PROCESSINFO piInfo;\r
+               piInfo.fiInfo.fnFileName     = wxFileName(WC2String(hdInfo.FileNameW));\r
+               piInfo.fnDestination         = wxFileName(_swInfo->fnDestinationDirectory.GetPathWithSep() + (_swInfo->fStoreDirectoryPathes ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetFullName()));\r
+               bool bSkip = _szFiles.GetCount() != 0 && _szFiles.Index(piInfo.fiInfo.fnFileName.GetFullPath()) == wxNOT_FOUND;\r
+               if (! bSkip && _eCommand == TPI_COMMAND_EXTRACT)\r
+               {\r
+                       // 処理するかどうか確認。\r
+                       piInfo.eMessage = TPI_MESSAGE_ASK;\r
+                       piInfo.eStatus  = TPI_PARAM_DEST;\r
+                       piInfo.fiInfo.nUnpackedSize  = hdInfo.UnpSizeHigh;\r
+                       piInfo.fiInfo.nUnpackedSize  = piInfo.fiInfo.nUnpackedSize << 32;\r
+                       piInfo.fiInfo.nUnpackedSize += hdInfo.UnpSize;\r
+                       piInfo.fiInfo.tmModified.SetFromDOS(hdInfo.FileTime);\r
+                       if (g_prProc != NULL && g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CONTINUE)\r
+                       {\r
+                               nErrorCode = TPI_ERROR_D_SKIPPED;\r
+                               break;\r
+                       }\r
+                       bSkip = ! piInfo.fnDestination.IsOk();\r
+               }\r
+\r
+               nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, int, wchar_t *, wchar_t *)) pP)(hArc, bSkip ? RAR_SKIP : _eCommand == TPI_COMMAND_EXTRACT ? RAR_EXTRACT : RAR_TEST, NULL, piInfo.fnDestination.GetFullPath().wchar_str()));\r
        }\r
        CloseArchive(hArc);\r
        return nErrorCode;\r
index 3ea81b5..9678f39 100644 (file)
@@ -395,8 +395,24 @@ int __stdcall Command
 \r
        for (size_t i = 0; i < _asFiles.GetCount(); i++)\r
        {\r
+               // 処理を行うか確認。\r
+               piInfo.eMessage = TPI_MESSAGE_ASK;\r
+               piInfo.eStatus = TPI_PARAM_DEST;\r
+               piInfo.fiInfo.fnFileName = wxFileName(_asFiles[i]);\r
+               piInfo.fnDestination = piInfo.fiInfo.fnFileName;\r
+               piInfo.fnDestination.SetPath(_swInfo->fnDestinationDirectory.GetPath());\r
+               if (CallbackProc(0, 0, (long) & piInfo))\r
+               {\r
+                       nErrorCode = TPI_ERROR_D_SKIPPED;\r
+                       break;\r
+               }\r
+               if (! piInfo.fnDestination.IsOk())\r
+               {\r
+                       continue;\r
+               }\r
+\r
                // XPIをロード。\r
-               HMODULE hXPI = ::LoadLibrary((szXPIPath + wxFileName(_asFiles[i]).GetPath()).wchar_str());\r
+               HMODULE hXPI = ::LoadLibrary((szXPIPath + piInfo.fiInfo.fnFileName.GetPath()).wchar_str());\r
                if (hXPI == NULL)\r
                {\r
                        nErrorCode = TPI_ERROR_U_USE_LIBRARY;\r
@@ -415,10 +431,8 @@ int __stdcall Command
                }\r
 \r
                // コールバックを送信。\r
+               piInfo.eMessage = TPI_MESSAGE_STATUS;\r
                piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
-               piInfo.fiInfo.fnFileName = wxFileName(_asFiles[i]);\r
-               piInfo.fnDestination = piInfo.fiInfo.fnFileName;\r
-               piInfo.fnDestination.SetPath(_swInfo->fnDestinationDirectory.GetPath());\r
                if (CallbackProc(0, 0, (long) & piInfo))\r
                {\r
                        ::FreeLibrary(hXPI);\r
@@ -458,6 +472,7 @@ int __stdcall Command
        }\r
 \r
        // 最終のコールバック。\r
+       piInfo.eMessage = TPI_MESSAGE_STATUS;\r
        piInfo.eStatus  = TPI_STATUS_CLOSEARCHIVE;\r
        piInfo.fiInfo.fnFileName = _fnArcName;\r
        if (CallbackProc(0, 0, (long) & piInfo))\r