OSDN Git Service

TPI_FORMATINFOに形式名と拡張子をできるだけ格納するよう変更。
[tpi/lychee.git] / src / plugin / cuiWrapper / cuiWrapper.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: cuiWrapper.cpp,v 1.26 2009/09/27 13:41:02 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/config.h>\r
30 #include <wx/stdpaths.h>\r
31 #include <wx/xml/xml.h>\r
32 #include <wx/tokenzr.h>\r
33 #include <windows.h>\r
34 #include "cuiWrapper.h"\r
35 \r
36 //******************************************************************************\r
37 //    Global varients\r
38 //******************************************************************************\r
39 \r
40 struct g_LibInfo\r
41 {\r
42         wxString szExeFile;\r
43         wxString szExeFileAlt;\r
44         wxString szListCommand;\r
45         int nLibIndex;\r
46         wxXmlNode node;\r
47 }       g_LibInfo;\r
48 \r
49 TPI_PROC g_prProc;\r
50 wxString g_szCurrentArchive;\r
51 wxArrayString g_asOutput;\r
52 \r
53 //******************************************************************************\r
54 //    Entry\r
55 //******************************************************************************\r
56 \r
57 BOOL __stdcall DllMain(HMODULE, DWORD, void *)\r
58 {\r
59         return TRUE;\r
60 }\r
61 \r
62 //******************************************************************************\r
63 //    Inside Functions\r
64 //******************************************************************************\r
65 \r
66 DWORD myExecute(wxString szCommandLine, wxString * szOutput, wxString szCwd, bool bCheckExist = false)\r
67 {\r
68 #ifdef __LINUX__\r
69         wxString sz = ::wxGetCwd();\r
70         ::wxSetWorkingDirectory(szCwd);\r
71         FILE * fp = popen(szCommandLine.char_str(), "r");\r
72         ::wxSetWorkingDirectory(sz);\r
73         if (fp == NULL)\r
74         {\r
75 //              wxMessageBox(wxString::Format(wxT("Error :\n\nCommandLine:\n%s"), szCommandLine.c_str()));\r
76                 return TPI_ERROR_U_USE_LIBRARY;\r
77         }\r
78 \r
79         if (bCheckExist)\r
80         {\r
81                 return TPI_ERROR_SUCCESS;\r
82         }\r
83 \r
84         if (szOutput != NULL)\r
85         {\r
86                 char sz[32769];\r
87                 memset(sz, 0, sizeof(sz));\r
88                 while (! feof(fp))\r
89                 {\r
90                         fread(sz, sizeof(char), sizeof(sz) - 1, fp);\r
91                         * szOutput += UTF82String(sz);\r
92                 }\r
93 //              ::wxMessageBox(* szOutput);\r
94         }\r
95 \r
96         pclose(fp);\r
97         return TPI_ERROR_SUCCESS;\r
98 #else\r
99         SECURITY_ATTRIBUTES sa;\r
100         memset(& sa, 0, sizeof(SECURITY_ATTRIBUTES));\r
101         sa.bInheritHandle = TRUE;\r
102         sa.nLength = sizeof(SECURITY_ATTRIBUTES);\r
103         HANDLE hRead, hWrite;\r
104         if (! ::CreatePipe(& hRead, & hWrite, & sa, 65537))\r
105         {\r
106                 return TPI_ERROR_U_USE_LIBRARY;\r
107         }\r
108         STARTUPINFO si;\r
109         memset(& si, 0, sizeof(STARTUPINFO));\r
110         si.cb = sizeof(STARTUPINFO);\r
111         si.dwFlags = STARTF_USESTDHANDLES;\r
112         si.hStdOutput = hWrite;\r
113         si.hStdError = hWrite;\r
114         PROCESS_INFORMATION pi;\r
115         if (! ::CreateProcess(NULL, szCommandLine.wchar_str(), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, szCwd.IsEmpty() ? NULL : szCwd.wchar_str(), & si, & pi))\r
116         {\r
117                 return TPI_ERROR_U_USE_LIBRARY;\r
118         }\r
119 \r
120         ::WaitForInputIdle(pi.hProcess, INFINITE);\r
121         ::WaitForSingleObject(pi.hProcess, INFINITE);\r
122 \r
123         DWORD nErrorCode = 0;\r
124         ::GetExitCodeProcess(pi.hProcess, & nErrorCode);\r
125         ::CloseHandle(pi.hThread);\r
126         ::CloseHandle(pi.hProcess);\r
127 \r
128         if (bCheckExist)\r
129         {\r
130                 return TPI_ERROR_SUCCESS;\r
131         }\r
132 \r
133         if (szOutput != NULL)\r
134         {\r
135                 DWORD dwSize = 0;\r
136                 char sz[32769];\r
137                 memset(sz, 0, sizeof(sz));\r
138                 for (wxULongLong llSize = 0; llSize < ::GetFileSize(hRead, NULL); llSize += dwSize)\r
139                 {\r
140                         dwSize = 0;\r
141                         ::ReadFile(hRead, sz, sizeof(sz) - 1, & dwSize, NULL);\r
142                         * szOutput += UTF82String(sz);\r
143 //                      ::MessageBoxA(NULL, sz, NULL, 0);\r
144                 }\r
145         }\r
146         ::CloseHandle(hRead);\r
147         ::CloseHandle(hWrite);\r
148 \r
149         return nErrorCode == 0 ? TPI_ERROR_SUCCESS : TPI_ERROR_UNDEFINED;\r
150 #endif\r
151 }\r
152 \r
153 PosInfo MakePosInfo(wxString szPrefix)\r
154 {\r
155         PosInfo pi;\r
156         g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-s"), wxEmptyString).ToULong(& pi.nStart);\r
157         g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-c"), wxEmptyString).ToULong(& pi.nCount);\r
158         g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-l"), wxT("0")).ToULong(& pi.nLine);\r
159         return pi;\r
160 }\r
161 \r
162 wxULongLong GetSize(PosInfo & pi, size_t uCurrent, wxArrayString & as)\r
163 {\r
164         if (pi.nStart == 0 && pi.nCount == 0)\r
165         {\r
166                 return 0;\r
167         }\r
168 \r
169         wxULongLong_t nTemp;\r
170         size_t nPos = uCurrent + pi.nLine;\r
171         wxString sz = pi.nCount == 0 ? as[nPos].Mid(pi.nStart) : as[nPos].Mid(pi.nStart, pi.nCount);\r
172         sz.ToULongLong(& nTemp);\r
173         return nTemp;\r
174 }\r
175 \r
176 //******************************************************************************\r
177 //    Functions\r
178 //******************************************************************************\r
179 \r
180 #ifdef __cplusplus\r
181 extern "C"\r
182 {\r
183 #endif\r
184 \r
185 int __stdcall GetPluginInformation\r
186 (\r
187         unsigned int _uInfoId,\r
188         wxULongLong,\r
189         void * _pPtr\r
190 )\r
191 {\r
192         if (_pPtr == NULL)\r
193         {\r
194                 return TPI_ERROR_D_PARAMETER;\r
195         }\r
196         switch (LOWORD(_uInfoId))\r
197         {\r
198         case TPI_INFO_VERSION_MAJOR:\r
199         case TPI_INFO_VERSION_MINOR:\r
200                 * (int *) _pPtr = 0;\r
201                 break;\r
202         case TPI_INFO_VERSION_API:\r
203                 * (int *) _pPtr = 2;\r
204                 break;\r
205         default:\r
206                 return TPI_ERROR_D_UNSUPPORTED;\r
207         }\r
208         return TPI_ERROR_SUCCESS;\r
209 }\r
210 \r
211 int __stdcall GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)\r
212 {\r
213         static unsigned int s_uFileID;\r
214         wxStandardPaths p;\r
215         wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/cuiWrapper.xml"));\r
216         // \88ê\8bC\82É\90æ\93ª\82Ì\83\89\83C\83u\83\89\83\8a\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
217         wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
218 \r
219         if (_bFirst)\r
220         {\r
221                 // xml\89ð\90Í\8aJ\8en\81B\r
222                 s_uFileID = 0;\r
223         }\r
224         else\r
225         {\r
226                 for (unsigned int i = 0; i < s_uFileID && xmlLibrary != NULL; i++)\r
227                 {\r
228                         xmlLibrary = xmlLibrary->GetNext();\r
229                 }\r
230         }\r
231 \r
232         if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
233         {\r
234                 // xml\95\96@\83G\83\89\81[\81B\r
235                 return TPI_ERROR_UNDEFINED;\r
236         }\r
237 \r
238         MakeFormatInfo(wxT("cuiWrapper"), _fiInfo, xmlLibrary, s_uFileID++);\r
239         if (myExecute(xmlLibrary->GetPropVal(wxT("name"), wxEmptyString), NULL, wxEmptyString, true) != TPI_ERROR_SUCCESS)\r
240         {\r
241                 _fiInfo->llSupportedCommand = 0;\r
242         }\r
243 \r
244         return TPI_ERROR_SUCCESS;\r
245 }\r
246 \r
247 int __stdcall LoadPlugin\r
248 (\r
249         const wxString & _szArcName,\r
250         wxULongLong _llSubOption\r
251 )\r
252 {\r
253         // xml\89ð\90Í\8aJ\8en\81B\r
254         wxStandardPaths p;\r
255         wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/cuiWrapper.xml"));\r
256         if (! config.IsOk())\r
257         {\r
258                 return TPI_ERROR_UNDEFINED;\r
259         }\r
260         // \88ê\8bC\82É\90æ\93ª\82Ì\83\89\83C\83u\83\89\83\8a\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
261         wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
262 \r
263         // \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
264         // \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
265         if (! ::wxFileExists(_szArcName))\r
266         {\r
267                 // \93K\93\96\82È\88Ê\92u\82Ü\82Å\88Ú\93®\81B\r
268                 for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < _llSubOption && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
269                 {\r
270                         xmlLibrary = xmlLibrary->GetNext();\r
271                 }\r
272                 if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
273                 {\r
274                         // xml\95\96@\83G\83\89\81[\81B\r
275                         return TPI_ERROR_UNDEFINED;\r
276                 }\r
277                 g_LibInfo.szExeFile = xmlLibrary->GetPropVal(wxT("name"), wxEmptyString);\r
278                 g_LibInfo.szExeFileAlt = xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString);\r
279                 g_LibInfo.node = * xmlLibrary;\r
280 \r
281                 return TPI_ERROR_SUCCESS;\r
282         }\r
283 \r
284         // \96³\8cÀ\83\8b\81[\83v\82É\8a×\82ç\82È\82¢\82æ\82¤\8fã\8cÀ\82ð\90Ý\92è\81B\r
285         for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
286         {\r
287                 // \83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
288                 g_LibInfo.szExeFile = xmlLibrary->GetPropVal(wxT("name"), wxEmptyString);\r
289                 g_LibInfo.szExeFileAlt = xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString);\r
290                 g_LibInfo.node = * xmlLibrary;\r
291 \r
292                 // \8f\91\8cÉ\82É\91Î\89\9e\82µ\82Ä\82¢\82é\82©\83`\83F\83b\83N\81B\r
293                 if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
294                 {\r
295                         // \91Î\89\9e\82µ\82Ä\82¢\82ê\82Î\8f\88\97\9d\82ð\8fI\97¹\81B\r
296                         return TPI_ERROR_SUCCESS;\r
297                 }\r
298 \r
299                 xmlLibrary = xmlLibrary->GetNext();\r
300         }\r
301 \r
302         return TPI_ERROR_U_LOAD_LIBRARY;\r
303 }\r
304 \r
305 int __stdcall FreePlugin\r
306 (\r
307         void * // _pReserved\r
308 )\r
309 {\r
310         return TPI_ERROR_SUCCESS;\r
311 }\r
312 \r
313 int __stdcall CheckArchive\r
314 (\r
315         const wxString & _szArcName,\r
316         int * _nFileCount\r
317 )\r
318 {\r
319         wxFileName fnArchive(_szArcName);\r
320         wxArrayString asExt = ::wxStringTokenize(g_LibInfo.node.GetPropVal(wxT("suffix"), wxEmptyString), wxT(";"));\r
321         if (! g_LibInfo.node.HasProp(wxT("list")))\r
322         {\r
323                 return TPI_ERROR_ARC_UNSUPPORTED;\r
324         }\r
325 \r
326         for (size_t i = 0; i < asExt.GetCount(); i++)\r
327         {\r
328                 // .tar.XXX\82È\82Ç\93ñ\8fd\94»\92è\82Ö\82Ì\91Î\89\9e\81B\r
329 //              if (asExt[i].IsSameAs(fnArchive.GetExt(), false))\r
330                 if (fnArchive.GetFullName().EndsWith(wxT('.') + asExt[i]))\r
331                 {\r
332                         // \8aJ\82¢\82Ä\8am\94F\81B\90æ\8ds\82µ\82Ä\83f\81[\83^\82ð\8eæ\93¾\82µ\82Ä\82¨\82­\81B\r
333                         int nErrorCode = OpenArchive(_szArcName, NULL);\r
334 \r
335                         // \91Î\89\9e\81B\r
336                         if (_nFileCount != NULL)\r
337                         {\r
338                                 // \83t\83@\83C\83\8b\90\94\82Í\91½\82ß\82É\8eæ\82Á\82Ä\82¨\82­\81B\r
339                                 * _nFileCount = g_asOutput.Count();\r
340                         }\r
341                         return nErrorCode;\r
342                 }\r
343         }\r
344 \r
345         return TPI_ERROR_ARC_UNSUPPORTED;\r
346 }\r
347 \r
348 int __stdcall OpenArchive\r
349 (\r
350         const wxString & _szArcName,\r
351         void * * _hArchive\r
352 )\r
353 {\r
354         if (g_szCurrentArchive != _szArcName)\r
355         {\r
356                 wxString szOutput;\r
357                 if (myExecute(g_LibInfo.szExeFile + wxT(" ") + MakeCommandLineSend(g_LibInfo.node.GetPropVal(wxT("list"), wxEmptyString), _szArcName, NULL, NULL, wxEmptyString), & szOutput, wxEmptyString) != TPI_ERROR_SUCCESS)\r
358                 {\r
359                         return TPI_ERROR_U_USE_LIBRARY;\r
360                 }\r
361                 g_szCurrentArchive = _szArcName;\r
362                 g_asOutput = ::wxStringTokenize(szOutput, wxT("\r\n"));\r
363         }\r
364         if (_hArchive != NULL)\r
365         {\r
366                 * _hArchive = & g_asOutput;\r
367         }\r
368         return g_asOutput.Count() == 0 ? TPI_ERROR_UNDEFINED : TPI_ERROR_SUCCESS;\r
369 }\r
370 \r
371 int __stdcall CloseArchive\r
372 (\r
373         void * _hArchive\r
374 )\r
375 {\r
376         ((wxArrayString *) _hArchive)->Clear();\r
377         return TPI_ERROR_SUCCESS;\r
378 }\r
379 \r
380 int __stdcall GetFileInformation\r
381 (\r
382         void * _hArchive,\r
383         TPI_FILEINFO * _fiInfo,\r
384         bool _bFirst\r
385 )\r
386 {\r
387         static size_t s_uCurrentLine;\r
388         static wxULongLong s_llFileID;\r
389         if (_hArchive == NULL)\r
390         {\r
391                 return TPI_ERROR_UNDEFINED;\r
392         }\r
393         wxArrayString asOutput = * (wxArrayString *) _hArchive;\r
394 \r
395         // XML\82©\82ç\82Ì\93Ç\82Ý\8d\9e\82Ý\82Í\8f\89\89ñ\82É\8ds\82¤\81B\r
396         static wxString szEndLine, szDateFormat;\r
397         static unsigned long nProcessPerLine;\r
398         static PosInfo piFName, piPSize, piUSize, piDate;\r
399         if (_bFirst)\r
400         {\r
401                 s_llFileID = 0;\r
402                 wxString szStartLine = g_LibInfo.node.GetPropVal(wxT("list-line-s"), wxEmptyString);\r
403                 if (! szStartLine.IsEmpty())\r
404                 {\r
405                         for (s_uCurrentLine = 0; s_uCurrentLine < asOutput.Count(); s_uCurrentLine++)\r
406                         {\r
407                                 if (asOutput[s_uCurrentLine] == szStartLine)\r
408                                 {\r
409                                         // \8e\9f\82Ì\8ds\82Ö\90i\82ñ\82Å\8fI\97¹\81B\r
410                                         s_uCurrentLine++;\r
411                                         break;\r
412                                 }\r
413                         }\r
414                 }\r
415 \r
416                 // \8f\89\8aú\90Ý\92è\81B\r
417                 g_LibInfo.node.GetPropVal(wxT("list-line-c"), wxT("1")).ToULong(& nProcessPerLine);\r
418                 szEndLine = g_LibInfo.node.GetPropVal(wxT("list-line-e"), szStartLine);\r
419                 szDateFormat = g_LibInfo.node.GetPropVal(wxT("list-date-f"), wxDefaultDateTimeFormat);\r
420                 piFName = MakePosInfo(wxT("fname"));\r
421                 piPSize = MakePosInfo(wxT("psize"));\r
422                 piUSize = MakePosInfo(wxT("usize"));\r
423                 piDate = MakePosInfo(wxT("date"));\r
424         }\r
425 \r
426         if (s_uCurrentLine >= asOutput.Count())\r
427         {\r
428                 // \8f\91\8cÉ\82ª\93Ç\82Ý\8d\9e\82ß\82È\82©\82Á\82½\81H\r
429                 return TPI_ERROR_ARC_UNSUPPORTED;\r
430         }\r
431 \r
432         // \8dÅ\8fI\8ds\82©\82Ç\82¤\82©\8am\94F\81B\r
433         if (asOutput[s_uCurrentLine] == szEndLine)\r
434         {\r
435                 return TPI_ERROR_UNDEFINED;\r
436         }\r
437 \r
438         // \83t\83@\83C\83\8b\96¼\82ð\8eæ\93¾\81B\r
439         _fiInfo->szStoredName = piFName.nCount == 0 ? asOutput[s_uCurrentLine + piFName.nLine].Mid(piFName.nStart) : asOutput[s_uCurrentLine + piFName.nLine].Mid(piFName.nStart, piFName.nCount);\r
440         _fiInfo->szStoredName.Trim();\r
441         _fiInfo->fnFileName = wxFileName::wxFileName(_fiInfo->szStoredName);\r
442 \r
443         // \83T\83C\83Y\8eæ\93¾\81B\r
444         _fiInfo->llPackedSize   = GetSize(piPSize, s_uCurrentLine, asOutput);\r
445         _fiInfo->llUnpackedSize = GetSize(piUSize, s_uCurrentLine, asOutput);\r
446 \r
447         // \8dX\90V\8e\9e\8d\8f\8eæ\93¾\81B\r
448         if (piDate.nStart != 0 || piDate.nCount != 0)\r
449         {\r
450                 _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
451         }\r
452 \r
453         // \8dÅ\8cã\82É\8e\9f\82Ì\8ds\82Ö\90i\82ß\82Ä\82¨\82­\81B\r
454         _fiInfo->llFileID = s_llFileID++;\r
455         s_uCurrentLine += nProcessPerLine;\r
456 \r
457         return TPI_ERROR_SUCCESS;\r
458 }\r
459 \r
460 int __stdcall GetArchiveInformation\r
461 (\r
462         void *,\r
463         TPI_ARCHIVEINFO * _aiInfo\r
464 )\r
465 {\r
466         // \8c`\8e®\82É\8aÖ\82·\82é\8fî\95ñ\82ð\8eæ\93¾\81B\r
467         MakeFormatInfo(wxT("cuiWrapper"), & _aiInfo->fiInfo, & g_LibInfo.node, 0);\r
468         return TPI_ERROR_SUCCESS;\r
469 }\r
470 \r
471 int __stdcall Command\r
472 (\r
473         unsigned int _uCommand,\r
474         TPI_SWITCHES * _swInfo,\r
475         const wxString & _szArcName,\r
476         const wxArrayString & _szFiles\r
477 )\r
478 {\r
479         // xml\82©\82ç\83R\83}\83\93\83h\83\89\83C\83\93\82ð\8eæ\93¾\81B\r
480         wxString szPath, szCommandLine;\r
481 \r
482         // API\83A\83h\83\8c\83X\8eæ\93¾\81B\r
483         if (! g_LibInfo.node.GetPropVal(\r
484                         _uCommand == TPI_COMMAND_ADD     ? wxT("add") :\r
485                         _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract") : \r
486                         _uCommand == TPI_COMMAND_DELETE  ? wxT("delete") : \r
487                         _uCommand == TPI_COMMAND_UPDATE  ? wxT("update") : \r
488                         _uCommand == TPI_COMMAND_TEST    ? wxT("test") : \r
489                         _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair") : \r
490                         _uCommand == TPI_COMMAND_MOVE    ? wxT("move") : \r
491                         _uCommand == TPI_COMMAND_SFX     ? wxT("sfx") : \r
492                         _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx") : wxEmptyString, & szCommandLine))\r
493         {\r
494                 g_LibInfo.node.GetPropVal(\r
495                         _uCommand == TPI_COMMAND_ADD     ? wxT("add-alt") :\r
496                         _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract-alt") : \r
497                         _uCommand == TPI_COMMAND_DELETE  ? wxT("delete-alt") : \r
498                         _uCommand == TPI_COMMAND_UPDATE  ? wxT("update-alt") : \r
499                         _uCommand == TPI_COMMAND_TEST    ? wxT("test-alt") : \r
500                         _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair-alt") : \r
501                         _uCommand == TPI_COMMAND_MOVE    ? wxT("move-alt") : \r
502                         _uCommand == TPI_COMMAND_SFX     ? wxT("sfx-alt") : \r
503                         _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx-alt") : wxEmptyString, & szCommandLine);\r
504         }\r
505 \r
506         if (szCommandLine.IsEmpty())\r
507         {\r
508                 return TPI_ERROR_U_USE_LIBRARY;\r
509         }\r
510 \r
511         // \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
512         wxString\r
513                 szResponceFileName = MakeResponceFile(_szFiles, g_LibInfo.node.GetPropVal(wxT("quote-resp"), wxT("1")) == wxT("1")),\r
514                 szCommandLineSend  = MakeCommandLineSend(szCommandLine, _szArcName, _swInfo, _szFiles, szResponceFileName);\r
515 \r
516         // \83R\83}\83\93\83h\83\89\83C\83\93\8eÀ\8ds\81B\r
517         wxString szOutput;\r
518         DWORD nErrorCode = myExecute(g_LibInfo.szExeFile + wxT(" ") + szCommandLineSend, & szOutput, _swInfo->fnDestinationDirectory.GetFullPath());\r
519 \r
520         // \83\8c\83X\83|\83\93\83X\83t\83@\83C\83\8b\8dí\8f\9c\81B\r
521         ::wxRemoveFile(szResponceFileName);\r
522 \r
523         if (nErrorCode != TPI_ERROR_SUCCESS)\r
524         {\r
525 #ifdef __LINUX__\r
526                 ::wxMessageBox(wxString::Format(wxT("Error :\n%d\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()));\r
527 #else\r
528                 MessageBox(NULL, wxString::Format(wxT("Error :\n%d\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()), NULL, 0);\r
529 #endif\r
530         }\r
531         return nErrorCode;\r
532 }\r
533 \r
534 int __stdcall SetCallbackProc\r
535 (\r
536         TPI_PROC _prArcProc\r
537 )\r
538 {\r
539         // \83|\83C\83\93\83^\82ð\95Û\91\81B\r
540         if (_prArcProc == NULL)\r
541         {\r
542                 return TPI_ERROR_D_PARAMETER;\r
543         }\r
544         g_prProc = * _prArcProc;\r
545 \r
546         return TPI_ERROR_SUCCESS;\r
547 }\r
548 \r
549 #ifdef __cplusplus\r
550 }\r
551 #endif\r