OSDN Git Service

wxArrayString::CountをGetCountへ修正。
[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.ToUTF8(), "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                 while (! feof(fp))\r
88                 {\r
89                         memset(sz, 0, sizeof(sz));\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                 for (wxULongLong llSize = 0; llSize < ::GetFileSize(hRead, NULL); llSize += dwSize)\r
138                 {\r
139                         memset(sz, 0, sizeof(sz));\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                 // \8fI\92[\82É\92B\82µ\82½\8fê\8d\87\81B\r
235                 return TPI_ERROR_S_ENDOFDATA;\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.GetCount();\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                 g_asOutput.Shrink();\r
364         }\r
365         if (_hArchive != NULL)\r
366         {\r
367                 * _hArchive = & g_asOutput;\r
368         }\r
369         return g_asOutput.GetCount() == 0 ? TPI_ERROR_UNDEFINED : TPI_ERROR_SUCCESS;\r
370 }\r
371 \r
372 int __stdcall CloseArchive\r
373 (\r
374         void * _hArchive\r
375 )\r
376 {\r
377         ((wxArrayString *) _hArchive)->Clear();\r
378         return TPI_ERROR_SUCCESS;\r
379 }\r
380 \r
381 int __stdcall GetFileInformation\r
382 (\r
383         void * _hArchive,\r
384         TPI_FILEINFO * _fiInfo,\r
385         bool _bFirst\r
386 )\r
387 {\r
388         static size_t s_uCurrentLine;\r
389         static wxULongLong s_llFileID;\r
390         if (_hArchive == NULL)\r
391         {\r
392                 return TPI_ERROR_UNDEFINED;\r
393         }\r
394         wxArrayString asOutput = * (wxArrayString *) _hArchive;\r
395 \r
396         // XML\82©\82ç\82Ì\93Ç\82Ý\8d\9e\82Ý\82Í\8f\89\89ñ\82É\8ds\82¤\81B\r
397         static wxString szEndLine, szDateFormat;\r
398         static unsigned long nProcessPerLine;\r
399         static PosInfo piFName, piPSize, piUSize, piDate;\r
400         if (_bFirst)\r
401         {\r
402                 s_llFileID = 0;\r
403                 wxString szStartLine = g_LibInfo.node.GetPropVal(wxT("list-line-s"), wxEmptyString);\r
404                 if (! szStartLine.IsEmpty())\r
405                 {\r
406                         // \8aJ\8en\8ds\82Ì\8e\9f\82Ì\8ds\82É\83Z\83b\83g\81B\r
407                         s_uCurrentLine = asOutput.Index(szStartLine) + 1;\r
408                         if (s_uCurrentLine == wxNOT_FOUND + 1)\r
409                         {\r
410                                 // \8f\91\8cÉ\82ª\93Ç\82Ý\8d\9e\82ß\82È\82©\82Á\82½\81H\r
411                                 return TPI_ERROR_ARC_UNSUPPORTED;\r
412                         }\r
413                 }\r
414 \r
415                 // \8f\89\8aú\90Ý\92è\81B\r
416                 g_LibInfo.node.GetPropVal(wxT("list-line-c"), wxT("1")).ToULong(& nProcessPerLine);\r
417                 szEndLine = g_LibInfo.node.GetPropVal(wxT("list-line-e"), szStartLine);\r
418                 szDateFormat = g_LibInfo.node.GetPropVal(wxT("list-date-f"), wxDefaultDateTimeFormat);\r
419                 piFName = MakePosInfo(wxT("fname"));\r
420                 piPSize = MakePosInfo(wxT("psize"));\r
421                 piUSize = MakePosInfo(wxT("usize"));\r
422                 piDate = MakePosInfo(wxT("date"));\r
423         }\r
424 \r
425         if (s_uCurrentLine >= asOutput.GetCount())\r
426         {\r
427                 // \8f\91\8cÉ\82ª\93Ç\82Ý\8d\9e\82ß\82È\82©\82Á\82½\81H\r
428                 return TPI_ERROR_ARC_UNSUPPORTED;\r
429         }\r
430 \r
431         // \8dÅ\8fI\8ds\82©\82Ç\82¤\82©\8am\94F\81B\r
432         if (asOutput[s_uCurrentLine] == szEndLine)\r
433         {\r
434                 return TPI_ERROR_S_ENDOFDATA;\r
435         }\r
436 \r
437         // \83t\83@\83C\83\8b\96¼\82ð\8eæ\93¾\81B\r
438         _fiInfo->szStoredName = piFName.nCount == 0 ? asOutput[s_uCurrentLine + piFName.nLine].Mid(piFName.nStart) : asOutput[s_uCurrentLine + piFName.nLine].Mid(piFName.nStart, piFName.nCount);\r
439         _fiInfo->szStoredName.Trim();\r
440         _fiInfo->fnFileName = wxFileName::wxFileName(_fiInfo->szStoredName);\r
441 \r
442         // \83T\83C\83Y\8eæ\93¾\81B\r
443         _fiInfo->llPackedSize   = GetSize(piPSize, s_uCurrentLine, asOutput);\r
444         _fiInfo->llUnpackedSize = GetSize(piUSize, s_uCurrentLine, asOutput);\r
445 \r
446         // \8dX\90V\8e\9e\8d\8f\8eæ\93¾\81B\r
447         if (piDate.nStart != 0 || piDate.nCount != 0)\r
448         {\r
449                 _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
450         }\r
451 \r
452         // \8dÅ\8cã\82É\8e\9f\82Ì\8ds\82Ö\90i\82ß\82Ä\82¨\82­\81B\r
453         _fiInfo->llFileID = s_llFileID++;\r
454         s_uCurrentLine += nProcessPerLine;\r
455 \r
456         return TPI_ERROR_SUCCESS;\r
457 }\r
458 \r
459 int __stdcall GetArchiveInformation\r
460 (\r
461         void *,\r
462         TPI_ARCHIVEINFO * _aiInfo\r
463 )\r
464 {\r
465         // \8c`\8e®\82É\8aÖ\82·\82é\8fî\95ñ\82ð\8eæ\93¾\81B\r
466         MakeFormatInfo(wxT("cuiWrapper"), & _aiInfo->fiInfo, & g_LibInfo.node, 0);\r
467         return TPI_ERROR_SUCCESS;\r
468 }\r
469 \r
470 int __stdcall Command\r
471 (\r
472         unsigned int _uCommand,\r
473         TPI_SWITCHES * _swInfo,\r
474         const wxString & _szArcName,\r
475         const wxArrayString & _szFiles\r
476 )\r
477 {\r
478         // xml\82©\82ç\83R\83}\83\93\83h\83\89\83C\83\93\82ð\8eæ\93¾\81B\r
479         wxString szPath, szCommandLine;\r
480 \r
481         // API\83A\83h\83\8c\83X\8eæ\93¾\81B\r
482         if (! g_LibInfo.node.GetPropVal(\r
483                         _uCommand == TPI_COMMAND_ADD     ? wxT("add") :\r
484                         _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract") : \r
485                         _uCommand == TPI_COMMAND_DELETE  ? wxT("delete") : \r
486                         _uCommand == TPI_COMMAND_UPDATE  ? wxT("update") : \r
487                         _uCommand == TPI_COMMAND_TEST    ? wxT("test") : \r
488                         _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair") : \r
489                         _uCommand == TPI_COMMAND_MOVE    ? wxT("move") : \r
490                         _uCommand == TPI_COMMAND_SFX     ? wxT("sfx") : \r
491                         _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx") : wxEmptyString, & szCommandLine))\r
492         {\r
493                 g_LibInfo.node.GetPropVal(\r
494                         _uCommand == TPI_COMMAND_ADD     ? wxT("add-alt") :\r
495                         _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract-alt") : \r
496                         _uCommand == TPI_COMMAND_DELETE  ? wxT("delete-alt") : \r
497                         _uCommand == TPI_COMMAND_UPDATE  ? wxT("update-alt") : \r
498                         _uCommand == TPI_COMMAND_TEST    ? wxT("test-alt") : \r
499                         _uCommand == TPI_COMMAND_REPAIR  ? wxT("repair-alt") : \r
500                         _uCommand == TPI_COMMAND_MOVE    ? wxT("move-alt") : \r
501                         _uCommand == TPI_COMMAND_SFX     ? wxT("sfx-alt") : \r
502                         _uCommand == TPI_COMMAND_UNSFX   ? wxT("unsfx-alt") : wxEmptyString, & szCommandLine);\r
503         }\r
504 \r
505         if (szCommandLine.IsEmpty())\r
506         {\r
507                 return TPI_ERROR_U_USE_LIBRARY;\r
508         }\r
509 \r
510         // \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
511         wxString\r
512                 szResponceFileName = MakeResponceFile(_szFiles, g_LibInfo.node.GetPropVal(wxT("quote-resp"), wxT("1")) == wxT("1")),\r
513                 szCommandLineSend  = MakeCommandLineSend(szCommandLine, _szArcName, _swInfo, _szFiles, szResponceFileName);\r
514 \r
515         // \83R\83}\83\93\83h\83\89\83C\83\93\8eÀ\8ds\81B\r
516         wxString szOutput;\r
517         DWORD nErrorCode = myExecute(g_LibInfo.szExeFile + wxT(" ") + szCommandLineSend, & szOutput, _swInfo->fnDestinationDirectory.GetFullPath());\r
518 \r
519         // \83\8c\83X\83|\83\93\83X\83t\83@\83C\83\8b\8dí\8f\9c\81B\r
520         ::wxRemoveFile(szResponceFileName);\r
521 \r
522         if (nErrorCode != TPI_ERROR_SUCCESS)\r
523         {\r
524 #ifdef __LINUX__\r
525                 ::wxMessageBox(wxString::Format(wxT("Error :\n%d\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()));\r
526 #else\r
527                 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
528 #endif\r
529         }\r
530         return nErrorCode;\r
531 }\r
532 \r
533 int __stdcall SetCallbackProc\r
534 (\r
535         TPI_PROC _prArcProc\r
536 )\r
537 {\r
538         // \83|\83C\83\93\83^\82ð\95Û\91\81B\r
539         if (_prArcProc == NULL)\r
540         {\r
541                 return TPI_ERROR_D_PARAMETER;\r
542         }\r
543         g_prProc = * _prArcProc;\r
544 \r
545         return TPI_ERROR_SUCCESS;\r
546 }\r
547 \r
548 #ifdef __cplusplus\r
549 }\r
550 #endif\r