OSDN Git Service

不正終了する場合があったバグを修正。
[tpi/lychee.git] / src / plugin / calLibrary / calLibrary.cpp
1 /*******************************************************************************\r
2   TPI - flexible but useless plug-in framework.\r
3   Copyright (C) 2002-2009 Silky\r
4 \r
5   This library is free software; you can redistribute it and/or modify it under\r
6   the terms of the GNU Lesser General Public License as published by the Free\r
7   Software Foundation; either version 2.1 of the License, or (at your option)\r
8   any later version.\r
9 \r
10   This library is distributed in the hope that it will be useful, but WITHOUT\r
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \r
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\r
13   for more details.\r
14 \r
15   You should have received a copy of the GNU Lesser General Public License along\r
16   with this library; if not, write to the Free Software Foundation, Inc.,\r
17   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
18 \r
19   $Id$\r
20 *******************************************************************************/\r
21 \r
22 //******************************************************************************\r
23 //    Includes\r
24 //******************************************************************************\r
25 \r
26 #include "../../common/header/plugin.h"\r
27 #include "../../common/header/plugin-extra.h"\r
28 #include "../../common/library/library.h"\r
29 #include <wx/dynlib.h>\r
30 #include <wx/config.h>\r
31 #include <wx/stdpaths.h>\r
32 #include <wx/xml/xml.h>\r
33 #include <windows.h>\r
34 #include "calLibrary.h"\r
35 \r
36 //******************************************************************************\r
37 //    Global varients\r
38 //******************************************************************************\r
39 \r
40 struct g_LibInfo\r
41 {\r
42         HMODULE hLib;\r
43         wxString szPrefix;\r
44         int nLibIndex;\r
45         wxXmlNode node;\r
46         bool fUnicode;\r
47         bool fCallback32bit;\r
48         bool fRunning;\r
49 }       g_LibInfo, g_LibInfoAlt;\r
50 \r
51 TPI_PROC g_prProc;\r
52 bool g_fExistUnicodeMode;\r
53 \r
54 //******************************************************************************\r
55 //    Entry\r
56 //******************************************************************************\r
57 \r
58 BOOL __stdcall DllMain(HMODULE, DWORD fdwReason, void *)\r
59 {\r
60         switch (fdwReason)\r
61         {\r
62         case DLL_PROCESS_DETACH:\r
63                 ::FreeLibrary(g_LibInfo.hLib);\r
64                 break;\r
65         }\r
66         return TRUE;\r
67 }\r
68 \r
69 wxDateTime FileTimeToWxDateTime(FILETIME * pft)\r
70 {\r
71         FILETIME ftLocal;\r
72         SYSTEMTIME st;\r
73         if (! ::FileTimeToLocalFileTime(pft, & ftLocal) || ! ::FileTimeToSystemTime(& ftLocal, & st))\r
74         {\r
75                 return (time_t) 0;\r
76         }\r
77         wxDateTime dt(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);\r
78         return dt;\r
79 }\r
80 \r
81 //******************************************************************************\r
82 //    Callback Wrapper\r
83 //******************************************************************************\r
84 \r
85 BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void * _lpEis)\r
86 {\r
87         if (_uMsg != ::RegisterWindowMessage((const wchar_t *) WM_ARCEXTRACT))\r
88         {\r
89                 // 独自仕様などに対する予備コード。\r
90                 return TRUE;\r
91         }\r
92 \r
93         // 構造体を初期化。\r
94         TPI_PROCESSINFO piInfo;\r
95         piInfo.uMessage = TPI_MESSAGE_STATUS;\r
96 \r
97         if (_lpEis != NULL)\r
98         {\r
99                 if ((g_LibInfo.fRunning && g_LibInfo.fCallback32bit) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fCallback32bit))\r
100                 {\r
101                         if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
102                         {\r
103                                 // 初期化。\r
104                                 EXTRACTINGINFOEXW * ex = (EXTRACTINGINFOEXW *) _lpEis;\r
105 \r
106                                 // EXTRACTINGINFOEXW -> TPI_FILEINFO変換。\r
107                                 piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
108                                 piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\r
109                                 piInfo.fiInfo.llPackedSize      = ex->dwCompressedSize;\r
110                                 piInfo.fiInfo.llUnpackedSize    = ex->exinfo.dwFileSize;\r
111                                 piInfo.fiInfo.uOSType           = ex->uOSType;\r
112                                 piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
113                                 piInfo.fiInfo.szStoredName      = WC2String(ex->exinfo.szSourceFileName);\r
114                                 piInfo.fiInfo.szMethod          = WC2String(ex->szMode);\r
115 \r
116                                 // EXTRACTINGINFOEXW -> TPI_PROCESSINFO変換。\r
117                                 piInfo.llProcessedSize          = ex->exinfo.dwWriteSize;\r
118                                 piInfo.fnDestination            = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
119                         }\r
120                         else\r
121                         {\r
122                                 // 初期化。\r
123                                 EXTRACTINGINFOEX * ex = (EXTRACTINGINFOEX *) _lpEis;\r
124 \r
125                                 // EXTRACTINGINFOEX -> TPI_FILEINFO変換。\r
126                                 piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
127                                 piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\r
128                                 piInfo.fiInfo.llPackedSize      = ex->dwCompressedSize;\r
129                                 piInfo.fiInfo.llUnpackedSize    = ex->exinfo.dwFileSize;\r
130                                 piInfo.fiInfo.uOSType           = ex->uOSType;\r
131                                 piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
132                                 piInfo.fiInfo.szStoredName      = UTF82String(ex->exinfo.szSourceFileName);\r
133                                 piInfo.fiInfo.szMethod          = UTF82String(ex->szMode);\r
134 \r
135                                 // EXTRACTINGINFOEX -> TPI_PROCESSINFO変換。\r
136                                 piInfo.llProcessedSize          = ex->exinfo.dwWriteSize;\r
137                                 piInfo.fnDestination            = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
138                         }\r
139                         piInfo.fiInfo.dwAttribute       = 0;\r
140                 }\r
141                 else\r
142                 {\r
143                         if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
144                         {\r
145                                 // 初期化。\r
146                                 EXTRACTINGINFOEX64W * ex = (EXTRACTINGINFOEX64W *) _lpEis;\r
147 \r
148                                 // EXTRACTINGINFOEX64W -> TPI_FILEINFO変換。\r
149                                 piInfo.fiInfo.dwAttribute       = ex->dwAttributes;\r
150                                 piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
151                                 piInfo.fiInfo.tmAccess          = FileTimeToWxDateTime(& ex->ftAccessTime);\r
152                                 piInfo.fiInfo.tmCreate          = FileTimeToWxDateTime(& ex->ftCreateTime);\r
153                                 piInfo.fiInfo.tmModified        = FileTimeToWxDateTime(& ex->ftWriteTime);\r
154                                 piInfo.fiInfo.llPackedSize      = ex->llCompressedSize;\r
155                                 piInfo.fiInfo.llUnpackedSize    = ex->llFileSize;\r
156                                 piInfo.fiInfo.uOSType           = ex->uOSType;\r
157                                 piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
158                                 piInfo.fiInfo.szStoredName      = WC2String(ex->exinfo.szSourceFileName);\r
159                                 piInfo.fiInfo.szMethod          = WC2String(ex->szMode);\r
160 \r
161                                 // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO変換。\r
162                                 piInfo.llProcessedSize          = ex->llWriteSize;\r
163                                 piInfo.fnDestination            = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
164                         }\r
165                         else\r
166                         {\r
167                                 // 初期化。\r
168                                 EXTRACTINGINFOEX64 * ex = (EXTRACTINGINFOEX64 *) _lpEis;\r
169 \r
170                                 // EXTRACTINGINFOEX64 -> TPI_FILEINFO変換。\r
171                                 piInfo.fiInfo.dwAttribute       = ex->dwAttributes;\r
172                                 piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
173                                 piInfo.fiInfo.tmAccess          = FileTimeToWxDateTime(& ex->ftAccessTime);\r
174                                 piInfo.fiInfo.tmCreate          = FileTimeToWxDateTime(& ex->ftCreateTime);\r
175                                 piInfo.fiInfo.tmModified        = FileTimeToWxDateTime(& ex->ftWriteTime);\r
176                                 piInfo.fiInfo.llPackedSize      = ex->llCompressedSize;\r
177                                 piInfo.fiInfo.llUnpackedSize    = ex->llFileSize;\r
178                                 piInfo.fiInfo.uOSType           = ex->uOSType;\r
179                                 piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
180                                 piInfo.fiInfo.szStoredName      = UTF82String(ex->exinfo.szSourceFileName);\r
181                                 piInfo.fiInfo.szMethod          = UTF82String(ex->szMode);\r
182 \r
183                                 // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO変換。\r
184                                 piInfo.llProcessedSize          = ex->llWriteSize;\r
185                                 piInfo.fnDestination            = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
186                         }\r
187                 }\r
188                 piInfo.fiInfo.fnFileName        = wxFileName(piInfo.fiInfo.szStoredName);\r
189         }\r
190 \r
191         // 数字の順でなく処理の順で並んでいることに注意。\r
192         switch (_uState)\r
193         {\r
194         case ARCEXTRACT_OPEN:\r
195                 // 当該書庫の処理を開始。\r
196                 piInfo.uStatus = TPI_STATUS_OPENARCHIVE;\r
197                 break;\r
198         case 5:\r
199                 // 当該ファイルの検索中。\r
200                 piInfo.uStatus = TPI_STATUS_SEEKFILE;\r
201                 break;\r
202         case ARCEXTRACT_BEGIN:\r
203                 // 当該ファイルの処理を開始。\r
204                 piInfo.uStatus = TPI_STATUS_BEGINPROCESS;\r
205                 break;\r
206         case ARCEXTRACT_INPROCESS:\r
207                 // 当該ファイルの処理を実行中。\r
208                 piInfo.uStatus = TPI_STATUS_INPROCESS;\r
209                 break;\r
210         case 6:\r
211                 // 当該ファイルの処理を終了。\r
212                 piInfo.uStatus = TPI_STATUS_ENDPROCESS;\r
213                 break;\r
214         case 7:\r
215                 // 当該書庫の検査中。\r
216                 piInfo.uStatus = TPI_STATUS_TESTARCHIVE;\r
217                 break;\r
218         case ARCEXTRACT_COPY:\r
219                 // 当該書庫の書き戻し中。\r
220                 piInfo.uStatus = TPI_STATUS_COPYARCHIVE;\r
221                 break;\r
222         case ARCEXTRACT_END:\r
223                 // 当該書庫の処理を終了。\r
224                 piInfo.uStatus = TPI_STATUS_CLOSEARCHIVE;\r
225                 break;\r
226         }\r
227 \r
228         // コールバック関数に送信。\r
229         if (g_prProc == NULL)\r
230         {\r
231                 return TRUE;\r
232         }\r
233 \r
234         return g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CANCEL;\r
235 }\r
236 \r
237 //******************************************************************************\r
238 //    Inside Functions\r
239 //******************************************************************************\r
240 \r
241 #define GetAPIAddress(name, unicode) GetProcAddress(g_LibInfo.hLib, (g_LibInfo.szPrefix + wxT(name) + ((unicode && g_LibInfo.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
242 #define GetAPIAddressAlt(name, unicode) GetProcAddress(g_LibInfoAlt.hLib, (g_LibInfoAlt.szPrefix + wxT(name) + ((unicode && g_LibInfoAlt.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
243 \r
244 int ErrorCodeConvert(int nErrorCode)\r
245 {\r
246         switch (nErrorCode)\r
247         {\r
248         case 0:                     return TPI_ERROR_SUCCESS;\r
249         case -1:                                        return TPI_ERROR_S_ENDOFDATA;\r
250         case ERROR_DISK_SPACE:      return TPI_ERROR_IO_ARC_WRITE;\r
251         case ERROR_READ_ONLY:       return TPI_ERROR_IO_FILE_WRITE;\r
252         case ERROR_USER_SKIP:       return TPI_ERROR_D_SKIPPED;\r
253         case ERROR_UNKNOWN_TYPE:    return TPI_ERROR_IO_MISC;\r
254         case ERROR_METHOD:          return TPI_ERROR_ARC_UNSUPPORTED;\r
255         case ERROR_PASSWORD_FILE:   return TPI_ERROR_ARC_ENCRYPTED;\r
256         case ERROR_VERSION:         return TPI_ERROR_ARC_UNSUPPORTED;\r
257         case ERROR_FILE_CRC:        return TPI_ERROR_ARC_BROKEN_SUM;\r
258         case ERROR_FILE_OPEN:       return TPI_ERROR_IO_FILE_OPEN;\r
259         case ERROR_MORE_FRESH:      return TPI_ERROR_IO_FILE_MISC;\r
260         case ERROR_NOT_EXIST:       return TPI_ERROR_IO_FILE_ACCESS;\r
261         case ERROR_ALREADY_EXIST:   return TPI_ERROR_IO_FILE_ACCESS;\r
262         case ERROR_TOO_MANY_FILES:  return TPI_ERROR_IO_ARC_MISC;\r
263         case ERROR_MAKEDIRECTORY:   return TPI_ERROR_IO_DIR_OPEN;\r
264         case ERROR_CANNOT_WRITE:    return TPI_ERROR_IO_FILE_WRITE;\r
265         case ERROR_HUFFMAN_CODE:    return TPI_ERROR_ARC_BROKEN_MISC;\r
266         case ERROR_COMMENT_HEADER:  return TPI_ERROR_ARC_BROKEN_HEADER;\r
267         case ERROR_HEADER_CRC:      return TPI_ERROR_ARC_BROKEN_SUM;\r
268         case ERROR_HEADER_BROKEN:   return TPI_ERROR_ARC_BROKEN_HEADER;\r
269         case ERROR_ARC_FILE_OPEN:   return TPI_ERROR_IO_ARC_OPEN;\r
270         case ERROR_NOT_ARC_FILE:    return TPI_ERROR_D_UNSUPPORTED;\r
271         case ERROR_CANNOT_READ:     return TPI_ERROR_IO_ARC_READ;\r
272         case ERROR_FILE_STYLE:      return TPI_ERROR_D_UNSUPPORTED;\r
273         case ERROR_COMMAND_NAME:    return TPI_ERROR_UNDEFINED;\r
274         case ERROR_MORE_HEAP_MEMORY:return TPI_ERROR_D_OUTOFMEMORY;\r
275         case ERROR_ENOUGH_MEMORY:   return TPI_ERROR_D_OUTOFMEMORY;\r
276         case ERROR_ALREADY_RUNNING: return TPI_ERROR_UNDEFINED;\r
277         case ERROR_USER_CANCEL:     return TPI_ERROR_D_SKIPPED;\r
278         case ERROR_HARC_ISNOT_OPENED: return TPI_ERROR_D_PARAMETER;\r
279         case ERROR_NOT_SEARCH_MODE: return TPI_ERROR_D_PARAMETER;\r
280         case ERROR_NOT_SUPPORT:     return TPI_ERROR_U_USE_LIBRARY;\r
281         case ERROR_TIME_STAMP:      return TPI_ERROR_UNDEFINED;\r
282         case ERROR_TMP_OPEN:        return TPI_ERROR_IO_TMP_OPEN;\r
283         case ERROR_LONG_FILE_NAME:  return TPI_ERROR_IO_FILE_ACCESS;\r
284         case ERROR_ARC_READ_ONLY:   return TPI_ERROR_IO_ARC_ACCESS;\r
285         case ERROR_SAME_NAME_FILE:  return TPI_ERROR_UNDEFINED;\r
286         case ERROR_NOT_FIND_ARC_FILE: return TPI_ERROR_IO_ARC_NOTFOUND;\r
287         case ERROR_RESPONSE_READ:   return TPI_ERROR_IO_MISC_READ;\r
288         case ERROR_NOT_FILENAME:    return TPI_ERROR_IO_FILE_NOTFOUND;\r
289         case ERROR_TMP_COPY:        return TPI_ERROR_IO_TMP_COPY;\r
290         case ERROR_EOF:             return TPI_ERROR_ARC_BROKEN_SIZE;\r
291         case ERROR_ADD_TO_LARC:     return TPI_ERROR_UNDEFINED;\r
292         case ERROR_TMP_BACK_SPACE:  return TPI_ERROR_IO_TMP_MOVE;\r
293         case ERROR_SHARING:         return TPI_ERROR_IO_FILE_ACCESS;\r
294         case ERROR_NOT_FIND_FILE:   return TPI_ERROR_IO_NOTFOUND;\r
295         case ERROR_LOG_FILE:        return TPI_ERROR_IO_MISC_WRITE;\r
296         case ERROR_NO_DEVICE:       return TPI_ERROR_IO_FILE_ACCESS;\r
297         case ERROR_GET_ATTRIBUTES:  return TPI_ERROR_IO_FILE_GETINFO;\r
298         case ERROR_SET_ATTRIBUTES:  return TPI_ERROR_IO_FILE_SETINFO;\r
299         case ERROR_GET_INFORMATION: return TPI_ERROR_IO_FILE_GETINFO;\r
300         case ERROR_GET_POINT:       return TPI_ERROR_IO_FILE_POINT;\r
301         case ERROR_SET_POINT:       return TPI_ERROR_IO_FILE_POINT;\r
302         case ERROR_CONVERT_TIME:    return TPI_ERROR_UNDEFINED;\r
303         case ERROR_GET_TIME:        return TPI_ERROR_IO_FILE_GETINFO;\r
304         case ERROR_SET_TIME:        return TPI_ERROR_IO_FILE_SETINFO;\r
305         case ERROR_CLOSE_FILE:      return TPI_ERROR_IO_FILE_CLOSE;\r
306         case ERROR_HEAP_MEMORY:     return TPI_ERROR_D_USEMEMORY;\r
307         case ERROR_HANDLE:          return TPI_ERROR_UNDEFINED;\r
308         case ERROR_TIME_STAMP_RANGE:return TPI_ERROR_UNDEFINED;\r
309         case ERROR_MAKE_ARCHIVE:    return TPI_ERROR_ARC_BROKEN_MISC;\r
310         case ERROR_NOT_CONFIRM_NAME:return TPI_ERROR_ARC_BROKEN_HEADER;\r
311         case ERROR_UNEXPECTED_EOF:  return TPI_ERROR_ARC_BROKEN_HEADER;\r
312         case ERROR_INVALID_END_MARK:return TPI_ERROR_ARC_BROKEN_SIZE;\r
313         case ERROR_INVOLVED_LZH:    return TPI_ERROR_ARC_BROKEN_MISC;\r
314         case ERROR_NO_END_MARK:     return TPI_ERROR_ARC_BROKEN_SIZE;\r
315         case ERROR_HDR_INVALID_SIZE:return TPI_ERROR_ARC_BROKEN_HEADER;\r
316         case ERROR_UNKNOWN_LEVEL:   return TPI_ERROR_ARC_UNSUPPORTED;\r
317         case ERROR_BROKEN_DATA:     return TPI_ERROR_ARC_BROKEN_MISC;\r
318         case ERROR_INVALID_PATH:    return TPI_ERROR_ARC_DANGER;\r
319         case ERROR_TOO_BIG:         return TPI_ERROR_IO_FILE_WRITE;\r
320         case ERROR_EXECUTABLE_FILE: return TPI_ERROR_ARC_DANGER;\r
321         case ERROR_INVALID_VALUE:   return TPI_ERROR_UNDEFINED;\r
322         case ERROR_HDR_EXPLOIT:     return TPI_ERROR_ARC_DANGER;\r
323         case ERROR_HDR_NO_CRC:      return TPI_ERROR_ARC_BROKEN_HEADER;\r
324         case ERROR_HDR_NO_NAME:     return TPI_ERROR_ARC_BROKEN_HEADER;\r
325         default:                    return TPI_ERROR_UNDEFINED;\r
326         }\r
327 }\r
328 \r
329 int CalSetCallbackProc(bool fAlt)\r
330 {\r
331         // 先にコールバック関数の設定を解除しておく。\r
332         FARPROC fpProc;\r
333         if (fAlt)\r
334         {\r
335                 fpProc = ::GetAPIAddressAlt("KillOwnerWindowEx64", false);\r
336                 g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
337                 if (g_LibInfoAlt.fCallback32bit)\r
338                 {\r
339                         fpProc = ::GetAPIAddressAlt("KillOwnerWindowEx", false);\r
340                 }\r
341         }\r
342         else\r
343         {\r
344                 fpProc = ::GetAPIAddress("KillOwnerWindowEx64", false);\r
345                 g_LibInfo.fCallback32bit = fpProc == NULL;\r
346                 if (g_LibInfo.fCallback32bit)\r
347                 {\r
348                         fpProc = ::GetAPIAddress("KillOwnerWindowEx", false);\r
349                 }\r
350         }\r
351         if (fpProc == NULL)\r
352         {\r
353                 return TPI_ERROR_U_USE_LIBRARY;\r
354         }\r
355         // エラーでも無視する。\r
356         ((BOOL (__stdcall *)(HWND)) fpProc)(NULL);\r
357 \r
358         // 続いてコールバック関数の設定。\r
359         if (fAlt)\r
360         {\r
361                 fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx64", false);\r
362                 g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
363                 if (g_LibInfoAlt.fCallback32bit)\r
364                 {\r
365                         fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx", true);\r
366                 }\r
367         }\r
368         else\r
369         {\r
370                 fpProc = ::GetAPIAddress("SetOwnerWindowEx64", false);\r
371                 g_LibInfo.fCallback32bit = fpProc == NULL;\r
372                 if (g_LibInfo.fCallback32bit)\r
373                 {\r
374                         fpProc = ::GetAPIAddress("SetOwnerWindowEx", true);\r
375                 }\r
376         }\r
377 \r
378         return (fpProc == NULL || ! ((fAlt ? g_LibInfoAlt.fCallback32bit : g_LibInfo.fCallback32bit)\r
379                 ? ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *       )) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc)\r
380                 : ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *, DWORD)) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc, (fAlt ? g_LibInfoAlt.fUnicode : g_LibInfo.fUnicode) ? sizeof(EXTRACTINGINFOEX64W) : sizeof(EXTRACTINGINFOEX64))))\r
381                 ? TPI_ERROR_U_USE_LIBRARY : TPI_ERROR_SUCCESS;\r
382 }\r
383 \r
384 //******************************************************************************\r
385 //    Functions\r
386 //******************************************************************************\r
387 \r
388 #ifdef __cplusplus\r
389 extern "C"\r
390 {\r
391 #endif\r
392 \r
393 int __stdcall GetPluginInformation\r
394 (\r
395         unsigned int _uInfoId,\r
396         wxULongLong,\r
397         void * _pPtr\r
398 )\r
399 {\r
400         if (_pPtr == NULL)\r
401         {\r
402                 return TPI_ERROR_D_PARAMETER;\r
403         }\r
404         switch (_uInfoId)\r
405         {\r
406         case TPI_INFO_VERSION_MAJOR:\r
407         case TPI_INFO_VERSION_MINOR:\r
408                 * (int *) _pPtr = 0;\r
409                 break;\r
410         case TPI_INFO_VERSION_API:\r
411                 * (int *) _pPtr = 2;\r
412                 break;\r
413         default:\r
414                 return TPI_ERROR_D_UNSUPPORTED;\r
415         }\r
416         return TPI_ERROR_SUCCESS;\r
417 }\r
418 \r
419 int __stdcall GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)\r
420 {\r
421         static unsigned int s_uFileId;\r
422         wxStandardPaths p;\r
423         wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/calLibrary.xml"));\r
424         // 一気に先頭のライブラリの情報を取得。\r
425         wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
426 \r
427         if (_bFirst)\r
428         {\r
429                 // xml解析開始。\r
430                 s_uFileId = 0;\r
431         }\r
432         else\r
433         {\r
434                 for (unsigned int i = 0; i < s_uFileId && xmlLibrary != NULL; i++)\r
435                 {\r
436                         xmlLibrary = xmlLibrary->GetNext();\r
437                 }\r
438         }\r
439 \r
440         if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
441         {\r
442                 // データの終端に達した場合。\r
443                 return TPI_ERROR_S_ENDOFDATA;\r
444         }\r
445 \r
446         MakeFormatInfo(wxT("calLibrary"), _fiInfo, xmlLibrary, s_uFileId++);\r
447 \r
448         return TPI_ERROR_SUCCESS;\r
449 }\r
450 \r
451 int __stdcall LoadPlugin\r
452 (\r
453         const wxString & _szArcName,\r
454         wxULongLong _llTypeId\r
455 )\r
456 {\r
457         // xml解析開始。\r
458         wxStandardPaths p;\r
459         wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/calLibrary.xml"));\r
460         if (! config.IsOk())\r
461         {\r
462                 return TPI_ERROR_UNDEFINED;\r
463         }\r
464         // 一気に先頭のライブラリの情報を取得。\r
465         wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
466 \r
467         // 対象が存在するならば対応するライブラリを調査、\r
468         // 対象が存在しないならば指示されたライブラリをロード。\r
469         if (! ::wxFileExists(_szArcName))\r
470         {\r
471                 // 適当な位置まで移動。\r
472                 for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < _llTypeId && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
473                 {\r
474                         xmlLibrary = xmlLibrary->GetNext();\r
475                 }\r
476                 if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
477                 {\r
478                         // xml文法エラー。\r
479                         return TPI_ERROR_UNDEFINED;\r
480                 }\r
481                 g_LibInfo.node = * xmlLibrary;\r
482 \r
483                 // ライブラリをロード。\r
484                 g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
485                 if (g_LibInfo.hLib == NULL)\r
486                 {\r
487                         return TPI_ERROR_U_LOAD_LIBRARY;\r
488                 }\r
489                 g_LibInfo.szPrefix = xmlLibrary->GetPropVal(wxT("prefix"), wxEmptyString);\r
490                 g_LibInfo.fUnicode = xmlLibrary->GetPropVal(wxT("unicode"), wxT("0")) == wxT("1");\r
491 \r
492                 // 代替ライブラリもロード。ロードできなくてもエラーにはしない。\r
493                 g_LibInfoAlt.szPrefix = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
494                 g_LibInfoAlt.fUnicode = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
495                 g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
496 \r
497                 return TPI_ERROR_SUCCESS;\r
498         }\r
499 \r
500         // 無限ループに陥らないよう上限を設定。\r
501         for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
502         {\r
503                 // ライブラリをロード。\r
504                 g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
505                 if (g_LibInfo.hLib == NULL)\r
506                 {\r
507                         xmlLibrary = xmlLibrary->GetNext();\r
508                         continue;\r
509                 }\r
510                 g_LibInfo.szPrefix = xmlLibrary->GetPropVal(wxT("prefix"), wxEmptyString);\r
511                 g_LibInfo.fUnicode = xmlLibrary->GetPropVal(wxT("unicode"), wxT("0")) == wxT("1");\r
512 \r
513                 // 代替ライブラリもロード。ロードできなくてもエラーにはしない。\r
514                 g_LibInfoAlt.szPrefix = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
515                 g_LibInfoAlt.fUnicode = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
516                 g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
517                 g_LibInfo.node = * xmlLibrary;\r
518 \r
519                 // 書庫に対応しているかチェック。\r
520                 if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
521                 {\r
522                         // 対応していれば処理を終了。\r
523                         return TPI_ERROR_SUCCESS;\r
524                 }\r
525 \r
526                 ::FreeLibrary(g_LibInfo.hLib);\r
527                 xmlLibrary = xmlLibrary->GetNext();\r
528         }\r
529 \r
530         return TPI_ERROR_U_LOAD_LIBRARY;\r
531 }\r
532 \r
533 int __stdcall FreePlugin\r
534 (\r
535         void * // _pReserved\r
536 )\r
537 {\r
538         ::FreeLibrary(g_LibInfo.hLib);\r
539         ::FreeLibrary(g_LibInfoAlt.hLib);\r
540         return TPI_ERROR_SUCCESS;\r
541 }\r
542 \r
543 int __stdcall CheckArchive\r
544 (\r
545         const wxString & _szArcName,\r
546         wxULongLong * _llFileCount\r
547 )\r
548 {\r
549         // Unicodeモードに設定。\r
550         FARPROC fpProc = ::GetAPIAddress("SetUnicodeMode", false);\r
551         g_fExistUnicodeMode = fpProc != NULL;\r
552         if (g_fExistUnicodeMode)\r
553         {\r
554                 ((BOOL (__stdcall *)(BOOL)) fpProc)(TRUE);\r
555         }\r
556 \r
557         fpProc = ::GetAPIAddress("CheckArchive", true);\r
558         if (fpProc == NULL)\r
559         {\r
560                 return TPI_ERROR_U_USE_LIBRARY;\r
561         }\r
562 \r
563         if (! (g_LibInfo.fUnicode\r
564                 ? ((BOOL (__stdcall *)(const wchar_t *, const int)) fpProc)(_szArcName.wchar_str(), 0)\r
565                 : ((BOOL (__stdcall *)(const char    *, const int)) fpProc)(_szArcName.ToUTF8(),    0)\r
566         ))\r
567         {\r
568                 return TPI_ERROR_D_UNSUPPORTED;\r
569         }\r
570 \r
571         if (_llFileCount != NULL)\r
572         {\r
573                 fpProc = ::GetAPIAddress("GetFileCount", true);\r
574                 if (fpProc == NULL)\r
575                 {\r
576                         return TPI_ERROR_U_USE_LIBRARY;\r
577                 }\r
578 \r
579                 int nFileCount = g_LibInfo.fUnicode\r
580                         ? ((int (__stdcall *)(const wchar_t *)) fpProc)(_szArcName.wchar_str())\r
581                         : ((int (__stdcall *)(const char *)) fpProc)(_szArcName.ToUTF8());\r
582                 if (nFileCount == -1)\r
583                 {\r
584                         return TPI_ERROR_ARC_UNSUPPORTED;\r
585                 }\r
586                 * _llFileCount = nFileCount;\r
587         }\r
588 \r
589         return TPI_ERROR_SUCCESS;\r
590 }\r
591 \r
592 int __stdcall OpenArchive\r
593 (\r
594         const wxString & _szArcName,\r
595         void * * _hArchive\r
596 )\r
597 {\r
598         FARPROC fpProc = ::GetAPIAddress("OpenArchive", true);\r
599         if (fpProc == NULL)\r
600         {\r
601                 return TPI_ERROR_U_USE_LIBRARY;\r
602         }\r
603 \r
604         * _hArchive = g_LibInfo.fUnicode\r
605                 ? ((void * (__stdcall *)(const HWND, const wchar_t *, const DWORD)) fpProc)(NULL, _szArcName.wchar_str(), 0)\r
606                 : ((void * (__stdcall *)(const HWND, const char    *, const DWORD)) fpProc)(NULL, _szArcName.ToUTF8(),  0);\r
607         return _hArchive == NULL ? TPI_ERROR_UNDEFINED : TPI_ERROR_SUCCESS;\r
608 }\r
609 \r
610 int __stdcall CloseArchive\r
611 (\r
612         void * _hArchive\r
613 )\r
614 {\r
615         FARPROC fpProc = ::GetAPIAddress("CloseArchive", false);\r
616         return fpProc == NULL ? TPI_ERROR_U_USE_LIBRARY : ErrorCodeConvert(((int (__stdcall *)(void *)) fpProc)(_hArchive));\r
617 }\r
618 \r
619 int __stdcall GetFileInformation\r
620 (\r
621         void * _hArchive,\r
622         TPI_FILEINFO * _fiInfo,\r
623         bool _bFirst\r
624 )\r
625 {\r
626         static unsigned int s_uFileId;\r
627         static FARPROC fpNext, fpAttr;\r
628         int nErrorCode;\r
629         INDIVIDUALINFO iiInfo;\r
630         INDIVIDUALINFOW iiInfoW;\r
631         memset(& iiInfo,  0, sizeof(iiInfo));\r
632         memset(& iiInfoW, 0, sizeof(iiInfoW));\r
633 \r
634         if (_bFirst)\r
635         {\r
636                 s_uFileId = 0;\r
637                 FARPROC fpProc = ::GetAPIAddress("FindFirst", true);\r
638                 fpNext = ::GetAPIAddress("FindNext", true);\r
639                 fpAttr = ::GetAPIAddress("GetAttribute", false);\r
640                 if (fpProc == NULL)\r
641                 {\r
642                         return TPI_ERROR_U_USE_LIBRARY;\r
643                 }\r
644 \r
645                 nErrorCode = g_LibInfo.fUnicode\r
646                         ? ((int (__stdcall *)(void *, const wchar_t *, LPINDIVIDUALINFOW)) fpProc)(_hArchive, L"*", & iiInfoW)\r
647                         : ((int (__stdcall *)(void *, const char *,    LPINDIVIDUALINFO))  fpProc)(_hArchive,  "*", & iiInfo);\r
648         }\r
649         else\r
650         {\r
651                 if (fpNext == NULL)\r
652                 {\r
653                         return TPI_ERROR_U_USE_LIBRARY;\r
654                 }\r
655 \r
656                 nErrorCode = g_LibInfo.fUnicode\r
657                         ? ((int (__stdcall *)(void *, LPINDIVIDUALINFOW)) fpNext)(_hArchive, & iiInfoW)\r
658                         : ((int (__stdcall *)(void *, LPINDIVIDUALINFO))  fpNext)(_hArchive, & iiInfo);\r
659         }\r
660 \r
661         nErrorCode = ErrorCodeConvert(nErrorCode);\r
662         if (nErrorCode == TPI_ERROR_SUCCESS)\r
663         {\r
664                 _fiInfo->dwAttribute = (fpAttr == NULL) ? 0 : ((int (__stdcall *)(void *)) fpAttr)(_hArchive);\r
665                 if ((signed) _fiInfo->dwAttribute == -1)\r
666                 {\r
667                         _fiInfo->dwAttribute = 0;\r
668                 }\r
669 \r
670                 if (g_LibInfo.fUnicode)\r
671                 {\r
672                         _fiInfo->dwCRC32        = iiInfoW.dwCRC;\r
673                         _fiInfo->uOSType        = iiInfoW.uOSType;\r
674                         _fiInfo->llPackedSize   = iiInfoW.dwCompressedSize;\r
675                         _fiInfo->llUnpackedSize = iiInfoW.dwOriginalSize;\r
676                         _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfoW.wTime, iiInfoW.wDate));\r
677                         _fiInfo->szStoredName   = WC2String(iiInfoW.szFileName);\r
678                         _fiInfo->szMethod       = WC2String(iiInfoW.szMode);\r
679                         _fiInfo->wCompressRatio = iiInfoW.wRatio;\r
680                 }\r
681                 else\r
682                 {\r
683                         _fiInfo->dwCRC32        = iiInfo.dwCRC;\r
684                         _fiInfo->uOSType        = iiInfo.uOSType;\r
685                         _fiInfo->llPackedSize   = iiInfo.dwCompressedSize;\r
686                         _fiInfo->llUnpackedSize = iiInfo.dwOriginalSize;\r
687                         _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfo.wTime, iiInfo.wDate));\r
688                         _fiInfo->szStoredName   = UTF82String(iiInfo.szFileName);\r
689                         _fiInfo->szMethod       = UTF82String(iiInfo.szMode);\r
690                         _fiInfo->wCompressRatio = iiInfo.wRatio;\r
691                 }\r
692                 _fiInfo->llFileId       = s_uFileId++;\r
693                 _fiInfo->fnFileName     = wxFileName(_fiInfo->szStoredName);\r
694 //              _fiInfo->ftAccessTime   = 0;\r
695 //              _fiInfo->ftCreateTime   = 0;\r
696         }\r
697 \r
698         return nErrorCode;\r
699 }\r
700 \r
701 int __stdcall GetArchiveInformation\r
702 (\r
703         void * _hArchive,\r
704         TPI_ARCHIVEINFO * _aiInfo\r
705 )\r
706 {\r
707         FARPROC fpProc = ::GetAPIAddress("GetArcFileName", true);\r
708         if (fpProc != NULL)\r
709         {\r
710                 // TODO : ファイル名の文字数制限を撤廃。\r
711                 wxString s;\r
712                 if (g_LibInfo.fUnicode)\r
713                 {\r
714                         wchar_t sz[2049];\r
715                         ((int (__stdcall *)(void *, wchar_t *, const int)) fpProc)(_hArchive, sz, 2048);\r
716                         s = WC2String(sz);\r
717                 }\r
718                 else\r
719                 {\r
720                         char sz[2049];\r
721                         ((int (__stdcall *)(void *, char *, const int)) fpProc)(_hArchive, sz, 2048);\r
722                         s = UTF82String(sz);\r
723                 }\r
724                 _aiInfo->fnArchive.FileName(s);\r
725         }\r
726 \r
727         fpProc = ::GetAPIAddress("GetArcFileSizeEx", false);\r
728         if (fpProc != NULL)\r
729         {\r
730                 ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llFileSize);\r
731         }\r
732         else\r
733         {\r
734                 fpProc = ::GetAPIAddress("GetArcFileSize", false);\r
735                 if (fpProc != NULL)\r
736                 {\r
737                         _aiInfo->llFileSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
738                 }\r
739         }\r
740 \r
741         fpProc = ::GetAPIAddress("GetArcOriginalSizeEx", false);\r
742         if (fpProc != NULL)\r
743         {\r
744                 ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llUnpackedSize);\r
745         }\r
746         else\r
747         {\r
748                 fpProc = ::GetAPIAddress("GetArcOriginalSize", false);\r
749                 if (fpProc != NULL)\r
750                 {\r
751                         _aiInfo->llUnpackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
752                 }\r
753         }\r
754 \r
755         fpProc = ::GetAPIAddress("GetArcCompressedSizeEx", false);\r
756         if (fpProc != NULL)\r
757         {\r
758                 ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llPackedSize);\r
759         }\r
760         else\r
761         {\r
762                 fpProc = ::GetAPIAddress("GetArcCompressedSize", false);\r
763                 if (fpProc != NULL)\r
764                 {\r
765                         _aiInfo->llPackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
766                 }\r
767         }\r
768 \r
769         fpProc = ::GetAPIAddress("GetArcReadSizeEx", false);\r
770         if (fpProc != NULL)\r
771         {\r
772                 ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llReadSize);\r
773         }\r
774         else\r
775         {\r
776                 fpProc = ::GetAPIAddress("GetArcReadSize", false);\r
777                 if (fpProc != NULL)\r
778                 {\r
779                         _aiInfo->llReadSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
780                 }\r
781         }\r
782 \r
783         fpProc = ::GetAPIAddress("GetArcRatio", false);\r
784         if (fpProc != NULL)\r
785         {\r
786                 _aiInfo->wCompressRatio = ((WORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
787         }\r
788 \r
789         FILETIME ft;\r
790         fpProc = ::GetAPIAddress("GetArcAccessTimeEx", false);\r
791         if (fpProc != NULL)\r
792         {\r
793                 ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
794                 _aiInfo->tmAccess = FileTimeToWxDateTime(& ft);\r
795         }\r
796 \r
797         fpProc = ::GetAPIAddress("GetArcCreatedTimeEx", false);\r
798         if (fpProc != NULL)\r
799         {\r
800                 ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
801                 _aiInfo->tmCreate = FileTimeToWxDateTime(& ft);\r
802         }\r
803 \r
804         fpProc = ::GetAPIAddress("GetArcWriteTimeEx", false);\r
805         if (fpProc != NULL)\r
806         {\r
807                 ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
808                 _aiInfo->tmModified = FileTimeToWxDateTime(& ft);\r
809         }\r
810 \r
811         fpProc = ::GetAPIAddress("GetArcOSType", false);\r
812         if (fpProc != NULL)\r
813         {\r
814                 _aiInfo->uOSType = ((UINT (__stdcall *)(void *)) fpProc)(_hArchive);\r
815         }\r
816 \r
817         fpProc = ::GetAPIAddress("IsSFXFile", false);\r
818         if (fpProc != NULL)\r
819         {\r
820                 _aiInfo->nSFXType = ((int (__stdcall *)(void *)) fpProc)(_hArchive);\r
821         }\r
822         if (fpProc == NULL || _aiInfo->nSFXType < 0)\r
823         {\r
824                 // エラーの場合はとりあえず通常の書庫とみなす。\r
825                 _aiInfo->nSFXType = 0;\r
826         }\r
827 \r
828         // 形式に関する情報を取得。\r
829         MakeFormatInfo(wxT("calLibrary"), & _aiInfo->fiInfo, & g_LibInfo.node, 0);\r
830 \r
831         return TPI_ERROR_SUCCESS;\r
832 }\r
833 \r
834 int __stdcall Command\r
835 (\r
836         unsigned int _uCommand,\r
837         TPI_SWITCHES * _swInfo,\r
838         const wxString & _szArcName,\r
839         const wxArrayString & _szFiles\r
840 )\r
841 {\r
842         // Iniからコマンドラインを取得。\r
843         wxString szPath, szCommandLine;\r
844 \r
845         // APIアドレス取得。\r
846         g_LibInfoAlt.fRunning\r
847                 = g_LibInfo.node.GetPropVal(\r
848                         _uCommand == TPI_COMMAND_CREATE  ? wxT("create-alt") :\r
849                         _uCommand == TPI_COMMAND_ADD     ? wxT("add-alt") :\r
850                         _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract-alt") : \r
851                         _uCommand == TPI_COMMAND_DELETE  ? wxT("delete-alt") : \r
852                         _uCommand == TPI_COMMAND_UPDATE  ? wxT("update-alt") : \r
853                         _uCommand == TPI_COMMAND_TEST    ? wxT("test-alt") : \r
854                         _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair-alt") : \r
855                         _uCommand == TPI_COMMAND_MOVE    ? wxT("move-alt") : \r
856                         _uCommand == TPI_COMMAND_SFX     ? wxT("sfx-alt") : \r
857                         _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx-alt") : wxEmptyString, & szCommandLine);\r
858         g_LibInfo.fRunning\r
859                 = g_LibInfo.node.GetPropVal(\r
860                         _uCommand == TPI_COMMAND_CREATE  ? wxT("create") :\r
861                         _uCommand == TPI_COMMAND_ADD     ? wxT("add") :\r
862                         _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract") : \r
863                         _uCommand == TPI_COMMAND_DELETE  ? wxT("delete") : \r
864                         _uCommand == TPI_COMMAND_UPDATE  ? wxT("update") : \r
865                         _uCommand == TPI_COMMAND_TEST    ? wxT("test") : \r
866                         _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair") : \r
867                         _uCommand == TPI_COMMAND_MOVE    ? wxT("move") : \r
868                         _uCommand == TPI_COMMAND_SFX     ? wxT("sfx") : \r
869                         _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx") : wxEmptyString, & szCommandLine);\r
870 \r
871         FARPROC fpProc =\r
872                 g_LibInfo.fRunning    ? ::GetAPIAddress(   "", true) :\r
873                 g_LibInfoAlt.fRunning ? ::GetAPIAddressAlt("", true) : NULL;\r
874         if (fpProc == NULL || szCommandLine.IsEmpty())\r
875         {\r
876                 return TPI_ERROR_U_USE_LIBRARY;\r
877         }\r
878 \r
879         // コマンドライン・レスポンスファイル作成。\r
880         wxString\r
881                 szResponceFileName = MakeResponceFile(_szFiles, g_LibInfo.node.GetPropVal(wxT("quote-resp"), wxT("1")) == wxT("1")),\r
882                 szCommandLineSend  = MakeCommandLineSend(szCommandLine, _szArcName, _swInfo, _szFiles, szResponceFileName);\r
883 \r
884         // コマンドライン実行。\r
885         int nErrorCode;\r
886         wxString szOutput;\r
887         if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
888         {\r
889                 wchar_t szTmpOut[2049];\r
890                 nErrorCode = ((int (__stdcall *)(const HWND, const wchar_t *, wchar_t *, DWORD)) fpProc)(NULL, szCommandLineSend.wchar_str(), szTmpOut, 2048);\r
891                 szOutput = WC2String(szTmpOut);\r
892         }\r
893         else\r
894         {\r
895                 char szTmpOut[2049];\r
896                 nErrorCode = ((int (__stdcall *)(const HWND, const char *, char *, DWORD)) fpProc)(NULL, szCommandLineSend.ToUTF8(), szTmpOut, 2048);\r
897                 szOutput = UTF82String(szTmpOut);\r
898         }\r
899 \r
900         // レスポンスファイル削除。\r
901         ::wxRemoveFile(szResponceFileName);\r
902 \r
903         if (nErrorCode != 0)\r
904         {\r
905                 ::wxLogError(L"Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s", nErrorCode, szCommandLineSend.c_str(), szOutput.c_str());\r
906         }\r
907         return ErrorCodeConvert(nErrorCode);\r
908 }\r
909 \r
910 int __stdcall SetCallbackProc\r
911 (\r
912         TPI_PROC _prArcProc\r
913 )\r
914 {\r
915         // ポインタを保存。\r
916         if (_prArcProc == NULL)\r
917         {\r
918                 return TPI_ERROR_D_PARAMETER;\r
919         }\r
920         g_prProc = * _prArcProc;\r
921 \r
922         // コールバック関数を設定。\r
923         CalSetCallbackProc(true);\r
924         return CalSetCallbackProc(false);\r
925 }\r
926 \r
927 #ifdef __cplusplus\r
928 }\r
929 #endif\r