OSDN Git Service

GetFileInformationでXMLからの読み込み回数を減らして高速化。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sat, 3 Oct 2009 02:39:25 +0000 (02:39 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sat, 3 Oct 2009 02:39:25 +0000 (02:39 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/tpi/tpi@10 9df91469-1e22-0410-86e7-ea8537beb833

src/plugin/cuiWrapper/cuiWrapper.cpp
src/plugin/cuiWrapper/cuiWrapper.h

index 85b39d5..da0327d 100644 (file)
@@ -170,6 +170,29 @@ DWORD myExecute(wxString szCommandLine, wxString * szOutput, wxString szCwd, boo
 #endif\r
 }\r
 \r
+PosInfo MakePosInfo(wxString szPrefix)\r
+{\r
+       PosInfo pi;\r
+       g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-s"), wxEmptyString).ToULong(& pi.nStart);\r
+       g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-c"), wxEmptyString).ToULong(& pi.nCount);\r
+       g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-l"), wxT("0")).ToULong(& pi.nLine);\r
+       return pi;\r
+}\r
+\r
+wxULongLong GetSize(PosInfo & pi, size_t uCurrent, wxArrayString & as)\r
+{\r
+       if (pi.nStart == 0 && pi.nCount == 0)\r
+       {\r
+               return 0;\r
+       }\r
+\r
+       wxULongLong_t nTemp;\r
+       size_t nPos = uCurrent + pi.nLine;\r
+       wxString sz = pi.nCount == 0 ? as[nPos].Mid(pi.nStart) : as[nPos].Mid(pi.nStart, pi.nCount);\r
+       sz.ToULongLong(& nTemp);\r
+       return nTemp;\r
+}\r
+\r
 //******************************************************************************\r
 //    Functions\r
 //******************************************************************************\r
@@ -385,10 +408,14 @@ int __stdcall GetFileInformation
        }\r
        wxArrayString asOutput = * (wxArrayString *) _hArchive;\r
 \r
-       wxString szStartLine = g_LibInfo.node.GetPropVal(wxT("list-line-s"), wxEmptyString);\r
+       // XML\82©\82ç\82Ì\93Ç\82Ý\8d\9e\82Ý\82Í\8f\89\89ñ\82É\8ds\82¤\81B\r
+       static wxString szEndLine, szDateFormat;\r
+       static unsigned long nProcessPerLine;\r
+       static PosInfo piFName, piPSize, piUSize, piDate;\r
        if (_bFirst)\r
        {\r
                s_llFileID = 0;\r
+               wxString szStartLine = g_LibInfo.node.GetPropVal(wxT("list-line-s"), wxEmptyString);\r
                if (! szStartLine.IsEmpty())\r
                {\r
                        for (s_uCurrentLine = 0; s_uCurrentLine < asOutput.Count(); s_uCurrentLine++)\r
@@ -401,6 +428,15 @@ int __stdcall GetFileInformation
                                }\r
                        }\r
                }\r
+\r
+               // \8f\89\8aú\90Ý\92è\81B\r
+               g_LibInfo.node.GetPropVal(wxT("list-line-c"), wxT("1")).ToULong(& nProcessPerLine);\r
+               szEndLine = g_LibInfo.node.GetPropVal(wxT("list-line-e"), szStartLine);\r
+               szDateFormat = g_LibInfo.node.GetPropVal(wxT("list-date-f"), wxDefaultDateTimeFormat);\r
+               piFName = MakePosInfo(wxT("fname"));\r
+               piPSize = MakePosInfo(wxT("psize"));\r
+               piUSize = MakePosInfo(wxT("usize"));\r
+               piDate = MakePosInfo(wxT("date"));\r
        }\r
 \r
        if (s_uCurrentLine >= asOutput.Count())\r
@@ -410,59 +446,29 @@ int __stdcall GetFileInformation
        }\r
 \r
        // \8dÅ\8fI\8ds\82©\82Ç\82¤\82©\8am\94F\81B\r
-       if (asOutput[s_uCurrentLine] == g_LibInfo.node.GetPropVal(wxT("list-line-e"), szStartLine))\r
+       if (asOutput[s_uCurrentLine] == szEndLine)\r
        {\r
                return TPI_ERROR_UNDEFINED;\r
        }\r
 \r
        // \83t\83@\83C\83\8b\96¼\82ð\8eæ\93¾\81B\r
-       unsigned long nStartPos = 0, nEndPos = 0, nLine = 0;\r
-       g_LibInfo.node.GetPropVal(wxT("list-fname-s"), wxEmptyString).ToULong(& nStartPos);\r
-       g_LibInfo.node.GetPropVal(wxT("list-fname-c"), wxEmptyString).ToULong(& nEndPos);\r
-       g_LibInfo.node.GetPropVal(wxT("list-fname-l"), wxT("0")).ToULong(& nLine);\r
-       _fiInfo->szStoredName = nEndPos == 0 ? asOutput[s_uCurrentLine + nLine].Mid(nStartPos) : asOutput[s_uCurrentLine + nLine].Mid(nStartPos, nEndPos);\r
+       _fiInfo->szStoredName = piFName.nCount == 0 ? asOutput[s_uCurrentLine + piFName.nLine].Mid(piFName.nStart) : asOutput[s_uCurrentLine + piFName.nLine].Mid(piFName.nStart, piFName.nCount);\r
        _fiInfo->szStoredName.Trim();\r
        _fiInfo->fnFileName = wxFileName::wxFileName(_fiInfo->szStoredName);\r
 \r
-       // \88³\8fk\8cã\83T\83C\83Y\8eæ\93¾\81B\r
-       wxULongLong_t nTemp;\r
-       nStartPos = 0, nEndPos = 0;\r
-       g_LibInfo.node.GetPropVal(wxT("list-psize-s"), wxEmptyString).ToULong(& nStartPos);\r
-       g_LibInfo.node.GetPropVal(wxT("list-psize-c"), wxEmptyString).ToULong(& nEndPos);\r
-       g_LibInfo.node.GetPropVal(wxT("list-psize-l"), wxT("0")).ToULong(& nLine);\r
-       if (nStartPos != 0 || nEndPos != 0)\r
-       {\r
-               wxString sz = nEndPos == 0 ? asOutput[s_uCurrentLine + nLine].Mid(nStartPos) : asOutput[s_uCurrentLine + nLine].Mid(nStartPos, nEndPos);\r
-               sz.ToULongLong(& nTemp);\r
-               _fiInfo->llPackedSize = nTemp;\r
-       }\r
-\r
-       // \88³\8fk\91O\83T\83C\83Y\8eæ\93¾\81B\r
-       nStartPos = 0, nEndPos = 0;\r
-       g_LibInfo.node.GetPropVal(wxT("list-usize-s"), wxEmptyString).ToULong(& nStartPos);\r
-       g_LibInfo.node.GetPropVal(wxT("list-usize-c"), wxEmptyString).ToULong(& nEndPos);\r
-       g_LibInfo.node.GetPropVal(wxT("list-usize-l"), wxT("0")).ToULong(& nLine);\r
-       if (nStartPos != 0 || nEndPos != 0)\r
-       {\r
-               wxString sz = nEndPos == 0 ? asOutput[s_uCurrentLine + nLine].Mid(nStartPos) : asOutput[s_uCurrentLine + nLine].Mid(nStartPos, nEndPos);\r
-               sz.ToULongLong(& nTemp);\r
-               _fiInfo->llUnpackedSize = nTemp;\r
-       }\r
+       // \83T\83C\83Y\8eæ\93¾\81B\r
+       _fiInfo->llPackedSize   = GetSize(piPSize, s_uCurrentLine, asOutput);\r
+       _fiInfo->llUnpackedSize = GetSize(piUSize, s_uCurrentLine, asOutput);\r
 \r
        // \8dX\90V\8e\9e\8d\8f\8eæ\93¾\81B\r
-       nStartPos = 0, nEndPos = 0;\r
-       g_LibInfo.node.GetPropVal(wxT("list-date-s"), wxEmptyString).ToULong(& nStartPos);\r
-       g_LibInfo.node.GetPropVal(wxT("list-date-c"), wxEmptyString).ToULong(& nEndPos);\r
-       g_LibInfo.node.GetPropVal(wxT("list-date-l"), wxT("0")).ToULong(& nLine);\r
-       if (nStartPos != 0 || nEndPos != 0)\r
+       if (piDate.nStart != 0 || piDate.nCount != 0)\r
        {\r
-               _fiInfo->tmModified.ParseFormat(nEndPos == 0 ? asOutput[s_uCurrentLine + nLine].Mid(nStartPos) : asOutput[s_uCurrentLine + nLine].Mid(nStartPos, nEndPos), g_LibInfo.node.GetPropVal(wxT("list-date-f"), wxDefaultDateTimeFormat));\r
+               _fiInfo->tmModified.ParseFormat(piDate.nCount == 0 ? asOutput[s_uCurrentLine + piDate.nLine].Mid(piDate.nStart) : asOutput[s_uCurrentLine + piDate.nLine].Mid(piDate.nStart, piDate.nCount), szDateFormat);\r
        }\r
 \r
        // \8dÅ\8cã\82É\8e\9f\82Ì\8ds\82Ö\90i\82ß\82Ä\82¨\82­\81B\r
        _fiInfo->llFileID = s_llFileID++;\r
-       g_LibInfo.node.GetPropVal(wxT("list-line-c"), wxT("1")).ToULong(& nStartPos);\r
-       s_uCurrentLine += nStartPos;\r
+       s_uCurrentLine += nProcessPerLine;\r
 \r
        return TPI_ERROR_SUCCESS;\r
 }\r
index 0e0a67a..4da3c4e 100644 (file)
 //    Defines
 //******************************************************************************
 
-#ifndef FNAME_MAX32
-#define FNAME_MAX32 512
-#endif
-
-// Window Message
-#define        WM_ARCEXTRACT           wxT("wm_arcextract")
-#define        ARCEXTRACT_BEGIN                0
-#define        ARCEXTRACT_INPROCESS    1
-#define        ARCEXTRACT_END                  2
-#define ARCEXTRACT_OPEN                        3
-#define ARCEXTRACT_COPY                        4
-
-// Warning Code
-#ifndef ERROR_START
-#define ERROR_START                            0x8000
-#define ERROR_DISK_SPACE               0x8005
-#define ERROR_READ_ONLY                        0x8006
-#define ERROR_USER_SKIP                        0x8007
-#define ERROR_UNKNOWN_TYPE             0x8008
-#define ERROR_METHOD                   0x8009
-#define ERROR_PASSWORD_FILE            0x800A
-#define ERROR_VERSION                  0x800B
-#define ERROR_FILE_CRC                 0x800C
-#define ERROR_FILE_OPEN                        0x800D
-#define ERROR_MORE_FRESH               0x800E
-#define ERROR_NOT_EXIST                        0x800F
-#define ERROR_ALREADY_EXIST            0x8010
-#define ERROR_TOO_MANY_FILES   0x8011
-// Error Code
-#define ERROR_MAKEDIRECTORY            0x8012
-#define ERROR_CANNOT_WRITE             0x8013
-#define ERROR_HUFFMAN_CODE             0x8014
-#define ERROR_COMMENT_HEADER   0x8015
-#define ERROR_HEADER_CRC               0x8016
-#define ERROR_HEADER_BROKEN            0x8017
-#define ERROR_ARC_FILE_OPEN            0x8018
-#define ERROR_NOT_ARC_FILE             0x8019
-#define ERROR_CANNOT_READ              0x801A
-#define ERROR_FILE_STYLE               0x801B
-#define ERROR_COMMAND_NAME             0x801C
-#define ERROR_MORE_HEAP_MEMORY 0x801D
-#define ERROR_ENOUGH_MEMORY            0x801E
-#define ERROR_ALREADY_RUNNING  0x801F
-#define ERROR_USER_CANCEL              0x8020
-#define ERROR_HARC_ISNOT_OPENED        0x8021
-#define ERROR_NOT_SEARCH_MODE  0x8022
-#define ERROR_NOT_SUPPORT              0x8023
-#define ERROR_TIME_STAMP               0x8024
-#define ERROR_TMP_OPEN                 0x8025
-#define ERROR_LONG_FILE_NAME   0x8026
-#define ERROR_ARC_READ_ONLY            0x8027
-#define ERROR_SAME_NAME_FILE   0x8028
-#define ERROR_NOT_FIND_ARC_FILE        0x8029
-#define ERROR_RESPONSE_READ            0x802A
-#define ERROR_NOT_FILENAME             0x802B
-#define ERROR_TMP_COPY                 0x802C
-#define ERROR_EOF                              0x802D
-#define ERROR_ADD_TO_LARC              0x802E
-#define ERROR_TMP_BACK_SPACE    0x802F
-#define ERROR_SHARING                  0x8030
-#define ERROR_NOT_FIND_FILE            0x8031
-#define ERROR_LOG_FILE                 0x8032
-#define        ERROR_NO_DEVICE                 0x8033
-#define ERROR_GET_ATTRIBUTES    0x8034
-#define ERROR_SET_ATTRIBUTES   0x8035
-#define ERROR_GET_INFORMATION   0x8036
-#define ERROR_GET_POINT                        0x8037
-#define ERROR_SET_POINT                        0x8038
-#define ERROR_CONVERT_TIME             0x8039
-#define ERROR_GET_TIME                 0x803A
-#define ERROR_SET_TIME                 0x803B
-#define ERROR_CLOSE_FILE               0x803C
-#define ERROR_HEAP_MEMORY              0x803D
-#define ERROR_HANDLE                   0x803E
-#define ERROR_TIME_STAMP_RANGE  0x803F
-#define ERROR_MAKE_ARCHIVE             0x8040
-#define ERROR_NOT_CONFIRM_NAME 0x8041
-#define ERROR_UNEXPECTED_EOF   0x8042
-#define ERROR_INVALID_END_MARK 0x8043
-#define ERROR_INVOLVED_LZH             0x8044
-#define ERROR_NO_END_MARK              0x8045
-#define ERROR_HDR_INVALID_SIZE 0x8046
-#define ERROR_UNKNOWN_LEVEL            0x8047
-#define ERROR_BROKEN_DATA              0x8048
-#define ERROR_INVALID_PATH             0x8049
-#define ERROR_TOO_BIG                  0x804A
-#define ERROR_EXECUTABLE_FILE  0x804B
-#define ERROR_INVALID_VALUE            0x804C
-#define ERROR_END                              ERROR_INVALID_VALUE
-#endif
-
 #pragma pack(1)
 
-typedef struct _tagINDIVIDUALINFO
-{
-       DWORD dwOriginalSize;
-       DWORD dwCompressedSize;
-       DWORD dwCRC;
-       UINT uFlag;
-       UINT uOSType;
-       WORD wRatio;
-       WORD wDate;
-       WORD wTime;
-       char szFileName[FNAME_MAX32 + 1];
-       char dummy1[3];
-       char szAttribute[8];
-       char szMode[8];
-}      INDIVIDUALINFO, * LPINDIVIDUALINFO;
-
-typedef struct EXTRACTINGINFO
+typedef struct PosInfo
 {
-       DWORD dwFileSize;
-       DWORD dwWriteSize;
-       char szSourceFileName[FNAME_MAX32 + 1];
-       char dummy1[3];
-       char szDestFileName[FNAME_MAX32 + 1];
-       char dummy[3];
-}      EXTRACTINGINFO, * LPEXTRACTINGINFO;
-
-typedef struct EXTRACTINGINFOEX
-{
-       EXTRACTINGINFO exinfo;
-       DWORD dwCompressedSize;
-       DWORD dwCRC;
-       UINT uOSType;
-       WORD wRatio;
-       WORD wDate;
-       WORD wTime;
-       char szAttribute[8];
-       char szMode[8];
-}      EXTRACTINGINFOEX, * LPEXTRACTINGINFOEX;
-
-typedef struct EXTRACTINGINFOEX64
-{
-       DWORD dwStructSize;
-       EXTRACTINGINFO exinfo;
-       UINT64 llFileSize;
-       UINT64 llCompressedSize;
-       UINT64 llWriteSize;
-       DWORD dwAttributes;
-       DWORD dwCRC;
-       UINT uOSType;
-       WORD wRatio;
-       FILETIME ftCreateTime;
-       FILETIME ftAccessTime;
-       FILETIME ftWriteTime;
-       char szMode[8];
-       char szSourceFileName[FNAME_MAX32 + 1];
-       char dummy1[3];
-       char szDestFileName[FNAME_MAX32 + 1];
-       char dummy2[3];
-}      EXTRACTINGINFOEX64, * LPEXTRACTINGINFOEX64;
-
-typedef BOOL(CALLBACK * ARCHIVERPROC)(HWND, unsigned int, unsigned int, void *);
+       unsigned long nStart;
+       unsigned long nCount;
+       unsigned long nLine;
+}      PosInfo;
 
 #pragma pack()