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: calLibrary.cpp,v 1.23 2009/09/27 13:44:12 sirakaba Exp $\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 #ifdef __LINUX__\r
59 void __attribute__((destructor)) Detach(void)\r
60 {\r
61         ::FreeLibrary(g_LibInfo.hLib);\r
62         ::FreeLibrary(g_LibInfo.hLibAlt);\r
63 }\r
64 #else\r
65 BOOL __stdcall DllMain(HMODULE, DWORD fdwReason, void *)\r
66 {\r
67         switch (fdwReason)\r
68         {\r
69         case DLL_PROCESS_DETACH:\r
70                 ::FreeLibrary(g_LibInfo.hLib);\r
71                 break;\r
72         }\r
73         return TRUE;\r
74 }\r
75 #endif\r
76 \r
77 wxDateTime FileTimeToWxDateTime(FILETIME * pft)\r
78 {\r
79 #ifdef __WINDOWS__\r
80         FILETIME ftLocal;\r
81         SYSTEMTIME st;\r
82         if (! ::FileTimeToLocalFileTime(pft, & ftLocal) || ! ::FileTimeToSystemTime(& ftLocal, & st))\r
83         {\r
84                 return (time_t) 0;\r
85         }\r
86         wxDateTime dt(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);\r
87         return dt;\r
88 #else\r
89     return (time_t) 0;\r
90 #endif\r
91 }\r
92 \r
93 //******************************************************************************\r
94 //    Callback Wrapper\r
95 //******************************************************************************\r
96 \r
97 BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void * _lpEis)\r
98 {\r
99         if (_uMsg != ::RegisterWindowMessage((const wchar_t *) WM_ARCEXTRACT))\r
100         {\r
101                 // \93Æ\8e©\8ed\97l\82È\82Ç\82É\91Î\82·\82é\97\\94õ\83R\81[\83h\81B\r
102                 return TRUE;\r
103         }\r
104 \r
105         // \8d\\91¢\91Ì\82ð\8f\89\8aú\89»\81B\r
106         TPI_PROCESSINFO piInfo;\r
107         piInfo.uMessage = TPI_MESSAGE_STATUS;\r
108 \r
109         if (_lpEis != NULL)\r
110         {\r
111                 if ((g_LibInfo.fRunning && g_LibInfo.fCallback32bit) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fCallback32bit))\r
112                 {\r
113                         if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
114                         {\r
115                                 // \8f\89\8aú\89»\81B\r
116                                 EXTRACTINGINFOEXW * ex = (EXTRACTINGINFOEXW *) _lpEis;\r
117 \r
118                                 // EXTRACTINGINFOEXW -> TPI_FILEINFO\95Ï\8a·\81B\r
119                                 piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
120                                 piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\r
121                                 piInfo.fiInfo.llPackedSize      = ex->dwCompressedSize;\r
122                                 piInfo.fiInfo.llUnpackedSize    = ex->exinfo.dwFileSize;\r
123                                 piInfo.fiInfo.uOSType           = ex->uOSType;\r
124                                 piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
125                                 piInfo.fiInfo.szStoredName      = WC2String(ex->exinfo.szSourceFileName);\r
126                                 piInfo.fiInfo.szMethod          = WC2String(ex->szMode);\r
127 \r
128                                 // EXTRACTINGINFOEXW -> TPI_PROCESSINFO\95Ï\8a·\81B\r
129                                 piInfo.llProcessedSize          = ex->exinfo.dwWriteSize;\r
130                                 piInfo.fnDestination            = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
131                         }\r
132                         else\r
133                         {\r
134                                 // \8f\89\8aú\89»\81B\r
135                                 EXTRACTINGINFOEX * ex = (EXTRACTINGINFOEX *) _lpEis;\r
136 \r
137                                 // EXTRACTINGINFOEX -> TPI_FILEINFO\95Ï\8a·\81B\r
138                                 piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
139                                 piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\r
140                                 piInfo.fiInfo.llPackedSize      = ex->dwCompressedSize;\r
141                                 piInfo.fiInfo.llUnpackedSize    = ex->exinfo.dwFileSize;\r
142                                 piInfo.fiInfo.uOSType           = ex->uOSType;\r
143                                 piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
144                                 piInfo.fiInfo.szStoredName      = UTF82String(ex->exinfo.szSourceFileName);\r
145                                 piInfo.fiInfo.szMethod          = UTF82String(ex->szMode);\r
146 \r
147                                 // EXTRACTINGINFOEX -> TPI_PROCESSINFO\95Ï\8a·\81B\r
148                                 piInfo.llProcessedSize          = ex->exinfo.dwWriteSize;\r
149                                 piInfo.fnDestination            = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
150                         }\r
151                         piInfo.fiInfo.dwAttribute       = 0;\r
152                 }\r
153                 else\r
154                 {\r
155                         if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
156                         {\r
157                                 // \8f\89\8aú\89»\81B\r
158                                 EXTRACTINGINFOEX64W * ex = (EXTRACTINGINFOEX64W *) _lpEis;\r
159 \r
160                                 // EXTRACTINGINFOEX64W -> TPI_FILEINFO\95Ï\8a·\81B\r
161                                 piInfo.fiInfo.dwAttribute       = ex->dwAttributes;\r
162                                 piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
163                                 piInfo.fiInfo.tmAccess          = FileTimeToWxDateTime(& ex->ftAccessTime);\r
164                                 piInfo.fiInfo.tmCreate          = FileTimeToWxDateTime(& ex->ftCreateTime);\r
165                                 piInfo.fiInfo.tmModified        = FileTimeToWxDateTime(& ex->ftWriteTime);\r
166                                 piInfo.fiInfo.llPackedSize      = ex->llCompressedSize;\r
167                                 piInfo.fiInfo.llUnpackedSize    = ex->llFileSize;\r
168                                 piInfo.fiInfo.uOSType           = ex->uOSType;\r
169                                 piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
170                                 piInfo.fiInfo.szStoredName      = WC2String(ex->exinfo.szSourceFileName);\r
171                                 piInfo.fiInfo.szMethod          = WC2String(ex->szMode);\r
172 \r
173                                 // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO\95Ï\8a·\81B\r
174                                 piInfo.llProcessedSize          = ex->llWriteSize;\r
175                                 piInfo.fnDestination            = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
176                         }\r
177                         else\r
178                         {\r
179                                 // \8f\89\8aú\89»\81B\r
180                                 EXTRACTINGINFOEX64 * ex = (EXTRACTINGINFOEX64 *) _lpEis;\r
181 \r
182                                 // EXTRACTINGINFOEX64 -> TPI_FILEINFO\95Ï\8a·\81B\r
183                                 piInfo.fiInfo.dwAttribute       = ex->dwAttributes;\r
184                                 piInfo.fiInfo.dwCRC32           = ex->dwCRC;\r
185                                 piInfo.fiInfo.tmAccess          = FileTimeToWxDateTime(& ex->ftAccessTime);\r
186                                 piInfo.fiInfo.tmCreate          = FileTimeToWxDateTime(& ex->ftCreateTime);\r
187                                 piInfo.fiInfo.tmModified        = FileTimeToWxDateTime(& ex->ftWriteTime);\r
188                                 piInfo.fiInfo.llPackedSize      = ex->llCompressedSize;\r
189                                 piInfo.fiInfo.llUnpackedSize    = ex->llFileSize;\r
190                                 piInfo.fiInfo.uOSType           = ex->uOSType;\r
191                                 piInfo.fiInfo.wCompressRatio    = ex->wRatio;\r
192                                 piInfo.fiInfo.szStoredName      = UTF82String(ex->exinfo.szSourceFileName);\r
193                                 piInfo.fiInfo.szMethod          = UTF82String(ex->szMode);\r
194 \r
195                                 // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO\95Ï\8a·\81B\r
196                                 piInfo.llProcessedSize          = ex->llWriteSize;\r
197                                 piInfo.fnDestination            = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
198                         }\r
199                 }\r
200                 piInfo.fiInfo.fnFileName        = wxFileName(piInfo.fiInfo.szStoredName);\r
201         }\r
202 \r
203         // \90\94\8e\9a\82Ì\8f\87\82Å\82È\82­\8f\88\97\9d\82Ì\8f\87\82Å\95À\82ñ\82Å\82¢\82é\82±\82Æ\82É\92\8d\88Ó\81B\r
204         switch (_uState)\r
205         {\r
206         case ARCEXTRACT_OPEN:\r
207                 // \93\96\8aY\8f\91\8cÉ\82Ì\8f\88\97\9d\82ð\8aJ\8en\81B\r
208                 piInfo.uStatus = TPI_STATUS_OPENARCHIVE;\r
209                 break;\r
210         case 5:\r
211                 // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8c\9f\8dõ\92\86\81B\r
212                 piInfo.uStatus = TPI_STATUS_SEEKFILE;\r
213                 break;\r
214         case ARCEXTRACT_BEGIN:\r
215                 // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8aJ\8en\81B\r
216                 piInfo.uStatus = TPI_STATUS_BEGINPROCESS;\r
217                 break;\r
218         case ARCEXTRACT_INPROCESS:\r
219                 // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8eÀ\8ds\92\86\81B\r
220                 piInfo.uStatus = TPI_STATUS_INPROCESS;\r
221                 break;\r
222         case 6:\r
223                 // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8fI\97¹\81B\r
224                 piInfo.uStatus = TPI_STATUS_ENDPROCESS;\r
225                 break;\r
226         case 7:\r
227                 // \93\96\8aY\8f\91\8cÉ\82Ì\8c\9f\8d¸\92\86\81B\r
228                 piInfo.uStatus = TPI_STATUS_TESTARCHIVE;\r
229                 break;\r
230         case ARCEXTRACT_COPY:\r
231                 // \93\96\8aY\8f\91\8cÉ\82Ì\8f\91\82«\96ß\82µ\92\86\81B\r
232                 piInfo.uStatus = TPI_STATUS_COPYARCHIVE;\r
233                 break;\r
234         case ARCEXTRACT_END:\r
235                 // \93\96\8aY\8f\91\8cÉ\82Ì\8f\88\97\9d\82ð\8fI\97¹\81B\r
236                 piInfo.uStatus = TPI_STATUS_CLOSEARCHIVE;\r
237                 break;\r
238         }\r
239 \r
240         // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82É\91\97\90M\81B\r
241         if (g_prProc == NULL)\r
242         {\r
243                 return TRUE;\r
244         }\r
245 \r
246         return g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CANCEL;\r
247 }\r
248 \r
249 //******************************************************************************\r
250 //    Inside Functions\r
251 //******************************************************************************\r
252 \r
253 #define GetAPIAddress(name, unicode) GetProcAddress(g_LibInfo.hLib, (g_LibInfo.szPrefix + wxT(name) + ((unicode && g_LibInfo.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
254 #define GetAPIAddressAlt(name, unicode) GetProcAddress(g_LibInfoAlt.hLib, (g_LibInfoAlt.szPrefix + wxT(name) + ((unicode && g_LibInfoAlt.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
255 \r
256 int CalErrorCodeConvert(int nCalErrorCode)\r
257 {\r
258         switch (nCalErrorCode)\r
259         {\r
260         case 0:                     return TPI_ERROR_SUCCESS;\r
261         case -1:                                        return TPI_ERROR_S_ENDOFDATA;\r
262         case ERROR_DISK_SPACE:      return TPI_ERROR_IO_ARC_WRITE;\r
263         case ERROR_READ_ONLY:       return TPI_ERROR_IO_FILE_WRITE;\r
264         case ERROR_USER_SKIP:       return TPI_ERROR_D_SKIPPED;\r
265         case ERROR_UNKNOWN_TYPE:    return TPI_ERROR_IO_MISC;\r
266         case ERROR_METHOD:          return TPI_ERROR_ARC_UNSUPPORTED;\r
267         case ERROR_PASSWORD_FILE:   return TPI_ERROR_ARC_ENCRYPTED;\r
268         case ERROR_VERSION:         return TPI_ERROR_ARC_UNSUPPORTED;\r
269         case ERROR_FILE_CRC:        return TPI_ERROR_ARC_BROKEN_SUM;\r
270         case ERROR_FILE_OPEN:       return TPI_ERROR_IO_FILE_OPEN;\r
271         case ERROR_MORE_FRESH:      return TPI_ERROR_IO_FILE_MISC;\r
272         case ERROR_NOT_EXIST:       return TPI_ERROR_IO_FILE_ACCESS;\r
273         case ERROR_ALREADY_EXIST:   return TPI_ERROR_IO_FILE_ACCESS;\r
274         case ERROR_TOO_MANY_FILES:  return TPI_ERROR_IO_ARC_MISC;\r
275         case ERROR_MAKEDIRECTORY:   return TPI_ERROR_IO_DIR_OPEN;\r
276         case ERROR_CANNOT_WRITE:    return TPI_ERROR_IO_FILE_WRITE;\r
277         case ERROR_HUFFMAN_CODE:    return TPI_ERROR_ARC_BROKEN_MISC;\r
278         case ERROR_COMMENT_HEADER:  return TPI_ERROR_ARC_BROKEN_HEADER;\r
279         case ERROR_HEADER_CRC:      return TPI_ERROR_ARC_BROKEN_SUM;\r
280         case ERROR_HEADER_BROKEN:   return TPI_ERROR_ARC_BROKEN_HEADER;\r
281         case ERROR_ARC_FILE_OPEN:   return TPI_ERROR_IO_ARC_OPEN;\r
282         case ERROR_NOT_ARC_FILE:    return TPI_ERROR_D_UNSUPPORTED;\r
283         case ERROR_CANNOT_READ:     return TPI_ERROR_IO_ARC_READ;\r
284         case ERROR_FILE_STYLE:      return TPI_ERROR_D_UNSUPPORTED;\r
285         case ERROR_COMMAND_NAME:    return TPI_ERROR_UNDEFINED;\r
286         case ERROR_MORE_HEAP_MEMORY:return TPI_ERROR_D_OUTOFMEMORY;\r
287         case ERROR_ENOUGH_MEMORY:   return TPI_ERROR_D_OUTOFMEMORY;\r
288         case ERROR_ALREADY_RUNNING: return TPI_ERROR_UNDEFINED;\r
289         case ERROR_USER_CANCEL:     return TPI_ERROR_D_SKIPPED;\r
290         case ERROR_HARC_ISNOT_OPENED: return TPI_ERROR_D_PARAMETER;\r
291         case ERROR_NOT_SEARCH_MODE: return TPI_ERROR_D_PARAMETER;\r
292         case ERROR_NOT_SUPPORT:     return TPI_ERROR_U_USE_LIBRARY;\r
293         case ERROR_TIME_STAMP:      return TPI_ERROR_UNDEFINED;\r
294         case ERROR_TMP_OPEN:        return TPI_ERROR_IO_TMP_OPEN;\r
295         case ERROR_LONG_FILE_NAME:  return TPI_ERROR_IO_FILE_ACCESS;\r
296         case ERROR_ARC_READ_ONLY:   return TPI_ERROR_IO_ARC_ACCESS;\r
297         case ERROR_SAME_NAME_FILE:  return TPI_ERROR_UNDEFINED;\r
298         case ERROR_NOT_FIND_ARC_FILE: return TPI_ERROR_IO_ARC_NOTFOUND;\r
299         case ERROR_RESPONSE_READ:   return TPI_ERROR_IO_MISC_READ;\r
300         case ERROR_NOT_FILENAME:    return TPI_ERROR_IO_FILE_NOTFOUND;\r
301         case ERROR_TMP_COPY:        return TPI_ERROR_IO_TMP_COPY;\r
302         case ERROR_EOF:             return TPI_ERROR_ARC_BROKEN_SIZE;\r
303         case ERROR_ADD_TO_LARC:     return TPI_ERROR_UNDEFINED;\r
304         case ERROR_TMP_BACK_SPACE:  return TPI_ERROR_IO_TMP_MOVE;\r
305         case ERROR_SHARING:         return TPI_ERROR_IO_FILE_ACCESS;\r
306         case ERROR_NOT_FIND_FILE:   return TPI_ERROR_IO_NOTFOUND;\r
307         case ERROR_LOG_FILE:        return TPI_ERROR_IO_MISC_WRITE;\r
308         case ERROR_NO_DEVICE:       return TPI_ERROR_IO_FILE_ACCESS;\r
309         case ERROR_GET_ATTRIBUTES:  return TPI_ERROR_IO_FILE_GETINFO;\r
310         case ERROR_SET_ATTRIBUTES:  return TPI_ERROR_IO_FILE_SETINFO;\r
311         case ERROR_GET_INFORMATION: return TPI_ERROR_IO_FILE_GETINFO;\r
312         case ERROR_GET_POINT:       return TPI_ERROR_IO_FILE_POINT;\r
313         case ERROR_SET_POINT:       return TPI_ERROR_IO_FILE_POINT;\r
314         case ERROR_CONVERT_TIME:    return TPI_ERROR_UNDEFINED;\r
315         case ERROR_GET_TIME:        return TPI_ERROR_IO_FILE_GETINFO;\r
316         case ERROR_SET_TIME:        return TPI_ERROR_IO_FILE_SETINFO;\r
317         case ERROR_CLOSE_FILE:      return TPI_ERROR_IO_FILE_CLOSE;\r
318         case ERROR_HEAP_MEMORY:     return TPI_ERROR_D_USEMEMORY;\r
319         case ERROR_HANDLE:          return TPI_ERROR_UNDEFINED;\r
320         case ERROR_TIME_STAMP_RANGE:return TPI_ERROR_UNDEFINED;\r
321         case ERROR_MAKE_ARCHIVE:    return TPI_ERROR_ARC_BROKEN_MISC;\r
322         case ERROR_NOT_CONFIRM_NAME:return TPI_ERROR_ARC_BROKEN_HEADER;\r
323         case ERROR_UNEXPECTED_EOF:  return TPI_ERROR_ARC_BROKEN_HEADER;\r
324         case ERROR_INVALID_END_MARK:return TPI_ERROR_ARC_BROKEN_SIZE;\r
325         case ERROR_INVOLVED_LZH:    return TPI_ERROR_ARC_BROKEN_MISC;\r
326         case ERROR_NO_END_MARK:     return TPI_ERROR_ARC_BROKEN_SIZE;\r
327         case ERROR_HDR_INVALID_SIZE:return TPI_ERROR_ARC_BROKEN_HEADER;\r
328         case ERROR_UNKNOWN_LEVEL:   return TPI_ERROR_ARC_UNSUPPORTED;\r
329         case ERROR_BROKEN_DATA:     return TPI_ERROR_ARC_BROKEN_MISC;\r
330         case ERROR_INVALID_PATH:    return TPI_ERROR_ARC_DANGER;\r
331         case ERROR_TOO_BIG:         return TPI_ERROR_IO_FILE_WRITE;\r
332         case ERROR_EXECUTABLE_FILE: return TPI_ERROR_ARC_DANGER;\r
333         case ERROR_INVALID_VALUE:   return TPI_ERROR_UNDEFINED;\r
334         case ERROR_HDR_EXPLOIT:     return TPI_ERROR_ARC_DANGER;\r
335         case ERROR_HDR_NO_CRC:      return TPI_ERROR_ARC_BROKEN_HEADER;\r
336         case ERROR_HDR_NO_NAME:     return TPI_ERROR_ARC_BROKEN_HEADER;\r
337         default:                    return TPI_ERROR_UNDEFINED;\r
338         }\r
339 }\r
340 \r
341 int CalSetCallbackProc(bool fAlt)\r
342 {\r
343         // \90æ\82É\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82Ì\90Ý\92è\82ð\89ð\8f\9c\82µ\82Ä\82¨\82­\81B\r
344         FARPROC fpProc;\r
345         if (fAlt)\r
346         {\r
347                 fpProc = ::GetAPIAddressAlt("KillOwnerWindowEx64", false);\r
348                 g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
349                 if (g_LibInfoAlt.fCallback32bit)\r
350                 {\r
351                         fpProc = ::GetAPIAddressAlt("KillOwnerWindowEx", false);\r
352                 }\r
353         }\r
354         else\r
355         {\r
356                 fpProc = ::GetAPIAddress("KillOwnerWindowEx64", false);\r
357                 g_LibInfo.fCallback32bit = fpProc == NULL;\r
358                 if (g_LibInfo.fCallback32bit)\r
359                 {\r
360                         fpProc = ::GetAPIAddress("KillOwnerWindowEx", false);\r
361                 }\r
362         }\r
363         if (fpProc == NULL)\r
364         {\r
365                 return TPI_ERROR_U_USE_LIBRARY;\r
366         }\r
367         // \83G\83\89\81[\82Å\82à\96³\8e\8b\82·\82é\81B\r
368         ((BOOL (__stdcall *)(HWND)) fpProc)(NULL);\r
369 \r
370         // \91±\82¢\82Ä\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82Ì\90Ý\92è\81B\r
371         if (fAlt)\r
372         {\r
373                 fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx64", false);\r
374                 g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
375                 if (g_LibInfoAlt.fCallback32bit)\r
376                 {\r
377                         fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx", true);\r
378                 }\r
379         }\r
380         else\r
381         {\r
382                 fpProc = ::GetAPIAddress("SetOwnerWindowEx64", false);\r
383                 g_LibInfo.fCallback32bit = fpProc == NULL;\r
384                 if (g_LibInfo.fCallback32bit)\r
385                 {\r
386                         fpProc = ::GetAPIAddress("SetOwnerWindowEx", true);\r
387                 }\r
388         }\r
389 \r
390         return (fpProc == NULL || ! ((fAlt ? g_LibInfoAlt.fCallback32bit : g_LibInfo.fCallback32bit)\r
391                 ? ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *       )) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc)\r
392                 : ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *, DWORD)) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc, (fAlt ? g_LibInfoAlt.fUnicode : g_LibInfo.fUnicode) ? sizeof(EXTRACTINGINFOEX64W) : sizeof(EXTRACTINGINFOEX64))))\r
393                 ? TPI_ERROR_U_USE_LIBRARY : TPI_ERROR_SUCCESS;\r
394 }\r
395 \r
396 //******************************************************************************\r
397 //    Functions\r
398 //******************************************************************************\r
399 \r
400 #ifdef __cplusplus\r
401 extern "C"\r
402 {\r
403 #endif\r
404 \r
405 int __stdcall GetPluginInformation\r
406 (\r
407         unsigned int _uInfoId,\r
408         wxULongLong,\r
409         void * _pPtr\r
410 )\r
411 {\r
412         if (_pPtr == NULL)\r
413         {\r
414                 return TPI_ERROR_D_PARAMETER;\r
415         }\r
416         switch (LOWORD(_uInfoId))\r
417         {\r
418         case TPI_INFO_VERSION_MAJOR:\r
419         case TPI_INFO_VERSION_MINOR:\r
420                 * (int *) _pPtr = 0;\r
421                 break;\r
422         case TPI_INFO_VERSION_API:\r
423                 * (int *) _pPtr = 2;\r
424                 break;\r
425         default:\r
426                 return TPI_ERROR_D_UNSUPPORTED;\r
427         }\r
428         return TPI_ERROR_SUCCESS;\r
429 }\r
430 \r
431 int __stdcall GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)\r
432 {\r
433         static unsigned int s_uFileID;\r
434         wxStandardPaths p;\r
435         wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/calLibrary.xml"));\r
436         // \88ê\8bC\82É\90æ\93ª\82Ì\83\89\83C\83u\83\89\83\8a\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
437         wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
438 \r
439         if (_bFirst)\r
440         {\r
441                 // xml\89ð\90Í\8aJ\8en\81B\r
442                 s_uFileID = 0;\r
443         }\r
444         else\r
445         {\r
446                 for (unsigned int i = 0; i < s_uFileID && xmlLibrary != NULL; i++)\r
447                 {\r
448                         xmlLibrary = xmlLibrary->GetNext();\r
449                 }\r
450         }\r
451 \r
452         if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
453         {\r
454                 // \83f\81[\83^\82Ì\8fI\92[\82É\92B\82µ\82½\8fê\8d\87\81B\r
455                 return TPI_ERROR_S_ENDOFDATA;\r
456         }\r
457 \r
458         MakeFormatInfo(wxT("calLibrary"), _fiInfo, xmlLibrary, s_uFileID++);\r
459 \r
460         return TPI_ERROR_SUCCESS;\r
461 }\r
462 \r
463 int __stdcall LoadPlugin\r
464 (\r
465         const wxString & _szArcName,\r
466         wxULongLong _llSubOption\r
467 )\r
468 {\r
469         // xml\89ð\90Í\8aJ\8en\81B\r
470         wxStandardPaths p;\r
471         wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/calLibrary.xml"));\r
472         if (! config.IsOk())\r
473         {\r
474                 return TPI_ERROR_UNDEFINED;\r
475         }\r
476         // \88ê\8bC\82É\90æ\93ª\82Ì\83\89\83C\83u\83\89\83\8a\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
477         wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
478 \r
479         // \91Î\8fÛ\82ª\91\8dÝ\82·\82é\82È\82ç\82Î\91Î\89\9e\82·\82é\83\89\83C\83u\83\89\83\8a\82ð\92²\8d¸\81A\r
480         // \91Î\8fÛ\82ª\91\8dÝ\82µ\82È\82¢\82È\82ç\82Î\8ew\8e¦\82³\82ê\82½\83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
481         if (! ::wxFileExists(_szArcName))\r
482         {\r
483                 // \93K\93\96\82È\88Ê\92u\82Ü\82Å\88Ú\93®\81B\r
484                 for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < _llSubOption && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
485                 {\r
486                         xmlLibrary = xmlLibrary->GetNext();\r
487                 }\r
488                 if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
489                 {\r
490                         // xml\95\96@\83G\83\89\81[\81B\r
491                         return TPI_ERROR_UNDEFINED;\r
492                 }\r
493                 g_LibInfo.node = * xmlLibrary;\r
494 \r
495                 // \83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
496                 g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
497                 if (g_LibInfo.hLib == NULL)\r
498                 {\r
499                         return TPI_ERROR_U_LOAD_LIBRARY;\r
500                 }\r
501                 g_LibInfo.szPrefix = xmlLibrary->GetPropVal(wxT("prefix"), wxEmptyString);\r
502                 g_LibInfo.fUnicode = xmlLibrary->GetPropVal(wxT("unicode"), wxT("0")) == wxT("1");\r
503 \r
504                 // \91ã\91Ö\83\89\83C\83u\83\89\83\8a\82à\83\8d\81[\83h\81B\83\8d\81[\83h\82Å\82«\82È\82­\82Ä\82à\83G\83\89\81[\82É\82Í\82µ\82È\82¢\81B\r
505                 g_LibInfoAlt.szPrefix = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
506                 g_LibInfoAlt.fUnicode = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
507                 g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
508 \r
509                 return TPI_ERROR_SUCCESS;\r
510         }\r
511 \r
512         // \96³\8cÀ\83\8b\81[\83v\82É\8a×\82ç\82È\82¢\82æ\82¤\8fã\8cÀ\82ð\90Ý\92è\81B\r
513         for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
514         {\r
515                 // \83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
516                 g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
517                 if (g_LibInfo.hLib == NULL)\r
518                 {\r
519                         xmlLibrary = xmlLibrary->GetNext();\r
520                         continue;\r
521                 }\r
522                 g_LibInfo.szPrefix = xmlLibrary->GetPropVal(wxT("prefix"), wxEmptyString);\r
523                 g_LibInfo.fUnicode = xmlLibrary->GetPropVal(wxT("unicode"), wxT("0")) == wxT("1");\r
524 \r
525                 // \91ã\91Ö\83\89\83C\83u\83\89\83\8a\82à\83\8d\81[\83h\81B\83\8d\81[\83h\82Å\82«\82È\82­\82Ä\82à\83G\83\89\81[\82É\82Í\82µ\82È\82¢\81B\r
526                 g_LibInfoAlt.szPrefix = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
527                 g_LibInfoAlt.fUnicode = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
528                 g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
529                 g_LibInfo.node = * xmlLibrary;\r
530 \r
531                 // \8f\91\8cÉ\82É\91Î\89\9e\82µ\82Ä\82¢\82é\82©\83`\83F\83b\83N\81B\r
532                 if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
533                 {\r
534                         // \91Î\89\9e\82µ\82Ä\82¢\82ê\82Î\8f\88\97\9d\82ð\8fI\97¹\81B\r
535                         return TPI_ERROR_SUCCESS;\r
536                 }\r
537 \r
538                 ::FreeLibrary(g_LibInfo.hLib);\r
539                 xmlLibrary = xmlLibrary->GetNext();\r
540         }\r
541 \r
542         return TPI_ERROR_U_LOAD_LIBRARY;\r
543 }\r
544 \r
545 int __stdcall FreePlugin\r
546 (\r
547         void * // _pReserved\r
548 )\r
549 {\r
550         ::FreeLibrary(g_LibInfo.hLib);\r
551         ::FreeLibrary(g_LibInfoAlt.hLib);\r
552         return TPI_ERROR_SUCCESS;\r
553 }\r
554 \r
555 int __stdcall CheckArchive\r
556 (\r
557         const wxString & _szArcName,\r
558         int * _nFileCount\r
559 )\r
560 {\r
561         // Unicode\83\82\81[\83h\82É\90Ý\92è\81B\r
562         FARPROC fpProc = ::GetAPIAddress("SetUnicodeMode", false);\r
563         g_fExistUnicodeMode = fpProc != NULL;\r
564         if (g_fExistUnicodeMode)\r
565         {\r
566                 ((BOOL (__stdcall *)(BOOL)) fpProc)(TRUE);\r
567         }\r
568 \r
569         fpProc = ::GetAPIAddress("CheckArchive", true);\r
570         if (fpProc == NULL)\r
571         {\r
572                 return TPI_ERROR_U_USE_LIBRARY;\r
573         }\r
574 \r
575         if (! (g_LibInfo.fUnicode\r
576                 ? ((BOOL (__stdcall *)(const wchar_t *, const int)) fpProc)(_szArcName.wchar_str(), 0)\r
577                 : ((BOOL (__stdcall *)(const char    *, const int)) fpProc)(_szArcName.ToUTF8(),    0)\r
578         ))\r
579         {\r
580                 return TPI_ERROR_D_UNSUPPORTED;\r
581         }\r
582 \r
583         if (_nFileCount != NULL)\r
584         {\r
585                 fpProc = ::GetAPIAddress("GetFileCount", true);\r
586                 if (fpProc == NULL)\r
587                 {\r
588                         return TPI_ERROR_U_USE_LIBRARY;\r
589                 }\r
590 \r
591                 * _nFileCount = g_LibInfo.fUnicode\r
592                         ? ((int (__stdcall *)(const wchar_t *)) fpProc)(_szArcName.wchar_str())\r
593                         : ((int (__stdcall *)(const char *)) fpProc)(_szArcName.ToUTF8());\r
594                 if (* _nFileCount == -1)\r
595                 {\r
596                         return TPI_ERROR_ARC_UNSUPPORTED;\r
597                 }\r
598         }\r
599 \r
600         return TPI_ERROR_SUCCESS;\r
601 }\r
602 \r
603 int __stdcall OpenArchive\r
604 (\r
605         const wxString & _szArcName,\r
606         void * * _hArchive\r
607 )\r
608 {\r
609         FARPROC fpProc = ::GetAPIAddress("OpenArchive", true);\r
610         if (fpProc == NULL)\r
611         {\r
612                 return TPI_ERROR_U_USE_LIBRARY;\r
613         }\r
614 \r
615         * _hArchive = g_LibInfo.fUnicode\r
616                 ? ((void * (__stdcall *)(const HWND, const wchar_t *, const DWORD)) fpProc)(NULL, _szArcName.wchar_str(), 0)\r
617                 : ((void * (__stdcall *)(const HWND, const char    *, const DWORD)) fpProc)(NULL, _szArcName.ToUTF8(),  0);\r
618         return _hArchive == NULL ? TPI_ERROR_UNDEFINED : TPI_ERROR_SUCCESS;\r
619 }\r
620 \r
621 int __stdcall CloseArchive\r
622 (\r
623         void * _hArchive\r
624 )\r
625 {\r
626         FARPROC fpProc = ::GetAPIAddress("CloseArchive", false);\r
627         return fpProc == NULL ? TPI_ERROR_U_USE_LIBRARY : CalErrorCodeConvert(((int (__stdcall *)(void *)) fpProc)(_hArchive));\r
628 }\r
629 \r
630 int __stdcall GetFileInformation\r
631 (\r
632         void * _hArchive,\r
633         TPI_FILEINFO * _fiInfo,\r
634         bool _bFirst\r
635 )\r
636 {\r
637         static unsigned int s_uFileID;\r
638         static FARPROC fpNext, fpAttr;\r
639         int nErrorCode;\r
640         INDIVIDUALINFO iiInfo;\r
641         INDIVIDUALINFOW iiInfoW;\r
642         memset(& iiInfo,  0, sizeof(iiInfo));\r
643         memset(& iiInfoW, 0, sizeof(iiInfoW));\r
644 \r
645         if (_bFirst)\r
646         {\r
647                 s_uFileID = 0;\r
648                 FARPROC fpProc = ::GetAPIAddress("FindFirst", true);\r
649                 fpNext = ::GetAPIAddress("FindNext", true);\r
650                 fpAttr = ::GetAPIAddress("GetAttribute", false);\r
651                 if (fpProc == 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 *, const wchar_t *, LPINDIVIDUALINFOW)) fpProc)(_hArchive, L"*", & iiInfoW)\r
658                         : ((int (__stdcall *)(void *, const char *,    LPINDIVIDUALINFO))  fpProc)(_hArchive,  "*", & iiInfo);\r
659         }\r
660         else\r
661         {\r
662                 if (fpNext == NULL)\r
663                 {\r
664                         return TPI_ERROR_U_USE_LIBRARY;\r
665                 }\r
666 \r
667                 nErrorCode = g_LibInfo.fUnicode\r
668                         ? ((int (__stdcall *)(void *, LPINDIVIDUALINFOW)) fpNext)(_hArchive, & iiInfoW)\r
669                         : ((int (__stdcall *)(void *, LPINDIVIDUALINFO))  fpNext)(_hArchive, & iiInfo);\r
670         }\r
671 \r
672         nErrorCode = CalErrorCodeConvert(nErrorCode);\r
673         if (nErrorCode == TPI_ERROR_SUCCESS)\r
674         {\r
675                 _fiInfo->dwAttribute = (fpAttr == NULL) ? 0 : ((int (__stdcall *)(void *)) fpAttr)(_hArchive);\r
676                 if ((signed) _fiInfo->dwAttribute == -1)\r
677                 {\r
678                         _fiInfo->dwAttribute = 0;\r
679                 }\r
680 \r
681                 if (g_LibInfo.fUnicode)\r
682                 {\r
683                         _fiInfo->dwCRC32        = iiInfoW.dwCRC;\r
684                         _fiInfo->uOSType        = iiInfoW.uOSType;\r
685                         _fiInfo->llPackedSize   = iiInfoW.dwCompressedSize;\r
686                         _fiInfo->llUnpackedSize = iiInfoW.dwOriginalSize;\r
687                         _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfoW.wTime, iiInfoW.wDate));\r
688                         _fiInfo->szStoredName   = WC2String(iiInfoW.szFileName);\r
689                         _fiInfo->szMethod       = WC2String(iiInfoW.szMode);\r
690                         _fiInfo->wCompressRatio = iiInfoW.wRatio;\r
691                 }\r
692                 else\r
693                 {\r
694                         _fiInfo->dwCRC32        = iiInfo.dwCRC;\r
695                         _fiInfo->uOSType        = iiInfo.uOSType;\r
696                         _fiInfo->llPackedSize   = iiInfo.dwCompressedSize;\r
697                         _fiInfo->llUnpackedSize = iiInfo.dwOriginalSize;\r
698                         _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfo.wTime, iiInfo.wDate));\r
699                         _fiInfo->szStoredName   = UTF82String(iiInfo.szFileName);\r
700                         _fiInfo->szMethod       = UTF82String(iiInfo.szMode);\r
701                         _fiInfo->wCompressRatio = iiInfo.wRatio;\r
702                 }\r
703                 _fiInfo->llFileID       = s_uFileID++;\r
704                 _fiInfo->fnFileName     = wxFileName(_fiInfo->szStoredName);\r
705 //              _fiInfo->ftAccessTime   = 0;\r
706 //              _fiInfo->ftCreateTime   = 0;\r
707         }\r
708 \r
709         return nErrorCode;\r
710 }\r
711 \r
712 int __stdcall GetArchiveInformation\r
713 (\r
714         void * _hArchive,\r
715         TPI_ARCHIVEINFO * _aiInfo\r
716 )\r
717 {\r
718         FARPROC fpProc = ::GetAPIAddress("GetArcFileName", true);\r
719         if (fpProc != NULL)\r
720         {\r
721                 // TODO : \83t\83@\83C\83\8b\96¼\82Ì\95\8e\9a\90\94\90§\8cÀ\82ð\93P\94p\81B\r
722                 wxString s;\r
723                 if (g_LibInfo.fUnicode)\r
724                 {\r
725                         wchar_t sz[2049];\r
726                         ((int (__stdcall *)(void *, wchar_t *, const int)) fpProc)(_hArchive, sz, 2048);\r
727                         s = WC2String(sz);\r
728                 }\r
729                 else\r
730                 {\r
731                         char sz[2049];\r
732                         ((int (__stdcall *)(void *, char *, const int)) fpProc)(_hArchive, sz, 2048);\r
733                         s = UTF82String(sz);\r
734                 }\r
735                 _aiInfo->fnArchive = wxFileName(s);\r
736         }\r
737 \r
738         fpProc = ::GetAPIAddress("GetArcFileSizeEx", false);\r
739         if (fpProc != NULL)\r
740         {\r
741                 ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llFileSize);\r
742         }\r
743         else\r
744         {\r
745                 fpProc = ::GetAPIAddress("GetArcFileSize", false);\r
746                 if (fpProc != NULL)\r
747                 {\r
748                         _aiInfo->llFileSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
749                 }\r
750         }\r
751 \r
752         fpProc = ::GetAPIAddress("GetArcOriginalSizeEx", false);\r
753         if (fpProc != NULL)\r
754         {\r
755                 ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llUnpackedSize);\r
756         }\r
757         else\r
758         {\r
759                 fpProc = ::GetAPIAddress("GetArcOriginalSize", false);\r
760                 if (fpProc != NULL)\r
761                 {\r
762                         _aiInfo->llUnpackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
763                 }\r
764         }\r
765 \r
766         fpProc = ::GetAPIAddress("GetArcCompressedSizeEx", false);\r
767         if (fpProc != NULL)\r
768         {\r
769                 ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llPackedSize);\r
770         }\r
771         else\r
772         {\r
773                 fpProc = ::GetAPIAddress("GetArcCompressedSize", false);\r
774                 if (fpProc != NULL)\r
775                 {\r
776                         _aiInfo->llPackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
777                 }\r
778         }\r
779 \r
780         fpProc = ::GetAPIAddress("GetArcReadSizeEx", false);\r
781         if (fpProc != NULL)\r
782         {\r
783                 ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llReadSize);\r
784         }\r
785         else\r
786         {\r
787                 fpProc = ::GetAPIAddress("GetArcReadSize", false);\r
788                 if (fpProc != NULL)\r
789                 {\r
790                         _aiInfo->llReadSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
791                 }\r
792         }\r
793 \r
794         fpProc = ::GetAPIAddress("GetArcRatio", false);\r
795         if (fpProc != NULL)\r
796         {\r
797                 _aiInfo->wCompressRatio = ((WORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
798         }\r
799 \r
800         FILETIME ft;\r
801         fpProc = ::GetAPIAddress("GetArcAccessTimeEx", false);\r
802         if (fpProc != NULL)\r
803         {\r
804                 ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
805                 _aiInfo->tmAccess = FileTimeToWxDateTime(& ft);\r
806         }\r
807 \r
808         fpProc = ::GetAPIAddress("GetArcCreatedTimeEx", false);\r
809         if (fpProc != NULL)\r
810         {\r
811                 ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
812                 _aiInfo->tmCreate = FileTimeToWxDateTime(& ft);\r
813         }\r
814 \r
815         fpProc = ::GetAPIAddress("GetArcWriteTimeEx", false);\r
816         if (fpProc != NULL)\r
817         {\r
818                 ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
819                 _aiInfo->tmModified = FileTimeToWxDateTime(& ft);\r
820         }\r
821 \r
822         fpProc = ::GetAPIAddress("GetArcOSType", false);\r
823         if (fpProc != NULL)\r
824         {\r
825                 _aiInfo->uOSType = ((UINT (__stdcall *)(void *)) fpProc)(_hArchive);\r
826         }\r
827 \r
828         fpProc = ::GetAPIAddress("IsSFXFile", false);\r
829         if (fpProc != NULL)\r
830         {\r
831                 _aiInfo->nSFXType = ((int (__stdcall *)(void *)) fpProc)(_hArchive);\r
832         }\r
833         if (fpProc == NULL || _aiInfo->nSFXType < 0)\r
834         {\r
835                 // \83G\83\89\81[\82Ì\8fê\8d\87\82Í\82Æ\82è\82 \82¦\82¸\92Ê\8fí\82Ì\8f\91\8cÉ\82Æ\82Ý\82È\82·\81B\r
836                 _aiInfo->nSFXType = 0;\r
837         }\r
838 \r
839         // \8c`\8e®\82É\8aÖ\82·\82é\8fî\95ñ\82ð\8eæ\93¾\81B\r
840         MakeFormatInfo(wxT("calLibrary"), & _aiInfo->fiInfo, & g_LibInfo.node, 0);\r
841 \r
842         return TPI_ERROR_SUCCESS;\r
843 }\r
844 \r
845 int __stdcall Command\r
846 (\r
847         unsigned int _uCommand,\r
848         TPI_SWITCHES * _swInfo,\r
849         const wxString & _szArcName,\r
850         const wxArrayString & _szFiles\r
851 )\r
852 {\r
853         // Ini\82©\82ç\83R\83}\83\93\83h\83\89\83C\83\93\82ð\8eæ\93¾\81B\r
854         wxString szPath, szCommandLine;\r
855 \r
856         // API\83A\83h\83\8c\83X\8eæ\93¾\81B\r
857         g_LibInfoAlt.fRunning\r
858                 = g_LibInfo.node.GetPropVal(\r
859                         _uCommand == TPI_COMMAND_ADD     ? wxT("add-alt") :\r
860                         _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract-alt") : \r
861                         _uCommand == TPI_COMMAND_DELETE  ? wxT("delete-alt") : \r
862                         _uCommand == TPI_COMMAND_UPDATE  ? wxT("update-alt") : \r
863                         _uCommand == TPI_COMMAND_TEST    ? wxT("test-alt") : \r
864                         _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair-alt") : \r
865                         _uCommand == TPI_COMMAND_MOVE    ? wxT("move-alt") : \r
866                         _uCommand == TPI_COMMAND_SFX     ? wxT("sfx-alt") : \r
867                         _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx-alt") : wxEmptyString, & szCommandLine);\r
868         g_LibInfo.fRunning\r
869                 = g_LibInfo.node.GetPropVal(\r
870                         _uCommand == TPI_COMMAND_ADD     ? wxT("add") :\r
871                         _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract") : \r
872                         _uCommand == TPI_COMMAND_DELETE  ? wxT("delete") : \r
873                         _uCommand == TPI_COMMAND_UPDATE  ? wxT("update") : \r
874                         _uCommand == TPI_COMMAND_TEST    ? wxT("test") : \r
875                         _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair") : \r
876                         _uCommand == TPI_COMMAND_MOVE    ? wxT("move") : \r
877                         _uCommand == TPI_COMMAND_SFX     ? wxT("sfx") : \r
878                         _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx") : wxEmptyString, & szCommandLine);\r
879 \r
880         FARPROC fpProc =\r
881                 g_LibInfo.fRunning    ? ::GetAPIAddress(   "", true) :\r
882                 g_LibInfoAlt.fRunning ? ::GetAPIAddressAlt("", true) : NULL;\r
883         if (fpProc == NULL || szCommandLine.IsEmpty())\r
884         {\r
885                 return TPI_ERROR_U_USE_LIBRARY;\r
886         }\r
887 \r
888         // \83R\83}\83\93\83h\83\89\83C\83\93\81E\83\8c\83X\83|\83\93\83X\83t\83@\83C\83\8b\8dì\90¬\81B\r
889         wxString\r
890                 szResponceFileName = MakeResponceFile(_szFiles, g_LibInfo.node.GetPropVal(wxT("quote-resp"), wxT("1")) == wxT("1")),\r
891                 szCommandLineSend  = MakeCommandLineSend(szCommandLine, _szArcName, _swInfo, _szFiles, szResponceFileName);\r
892 \r
893         // \83R\83}\83\93\83h\83\89\83C\83\93\8eÀ\8ds\81B\r
894         int nErrorCode;\r
895         wxString szOutput;\r
896         if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
897         {\r
898                 wchar_t szTmpOut[2049];\r
899                 nErrorCode = ((int (__stdcall *)(const HWND, const wchar_t *, wchar_t *, DWORD)) fpProc)(NULL, szCommandLineSend.wchar_str(), szTmpOut, 2048);\r
900                 szOutput = WC2String(szTmpOut);\r
901         }\r
902         else\r
903         {\r
904                 char szTmpOut[2049];\r
905                 nErrorCode = ((int (__stdcall *)(const HWND, const char *, char *, DWORD)) fpProc)(NULL, szCommandLineSend.ToUTF8(), szTmpOut, 2048);\r
906                 szOutput = UTF82String(szTmpOut);\r
907         }\r
908 \r
909         // \83\8c\83X\83|\83\93\83X\83t\83@\83C\83\8b\8dí\8f\9c\81B\r
910         ::wxRemoveFile(szResponceFileName);\r
911 \r
912         if (nErrorCode != 0)\r
913         {\r
914 #ifdef __LINUX__\r
915                 ::wxMessageBox(wxString::Format(wxT("Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()));\r
916 #else\r
917                 MessageBox(NULL, wxString::Format(wxT("Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()), NULL, 0);\r
918 #endif\r
919         }\r
920         return CalErrorCodeConvert(nErrorCode);\r
921 }\r
922 \r
923 int __stdcall SetCallbackProc\r
924 (\r
925         TPI_PROC _prArcProc\r
926 )\r
927 {\r
928         // \83|\83C\83\93\83^\82ð\95Û\91\81B\r
929         if (_prArcProc == NULL)\r
930         {\r
931                 return TPI_ERROR_D_PARAMETER;\r
932         }\r
933         g_prProc = * _prArcProc;\r
934 \r
935         // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82ð\90Ý\92è\81B\r
936         CalSetCallbackProc(true);\r
937         return CalSetCallbackProc(false);\r
938 }\r
939 \r
940 #ifdef __cplusplus\r
941 }\r
942 #endif\r