OSDN Git Service

4c873476b260943ea41c38b4308f9a8767b083a7
[tpi/lychee.git] / src / common / handle / TPIHandle.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: TPIHandle.cpp,v 1.5 2009/08/28 12:41:29 sirakaba Exp $\r
20 *******************************************************************************/\r
21 \r
22 //******************************************************************************\r
23 //    Includes\r
24 //******************************************************************************\r
25 \r
26 #define wxUSE_DYNLIB_CLASS 1\r
27 #include "../header/plugin.h"\r
28 #include <wx/dynlib.h>\r
29 #include "TPIHandle.h"\r
30 \r
31 //******************************************************************************\r
32 //    Class (TPIHandle)\r
33 //******************************************************************************\r
34 \r
35 TPIHandle::~TPIHandle(void)\r
36 {\r
37         this->FreeLibrary();\r
38 }\r
39 \r
40 bool TPIHandle::InitLibrary(const wxString & _szLibName, const wxString & _szArcName, wxULongLong _llSubOption)\r
41 {\r
42         this->lib.Load(_szLibName);\r
43         if (! this->lib.IsLoaded())\r
44         {\r
45                 return false;\r
46         }\r
47 \r
48         if (_szArcName.IsEmpty())\r
49         {\r
50                 return true;\r
51         }\r
52 \r
53         if (! this->lib.HasSymbol(wxT("LoadPlugin")))\r
54         {\r
55                 return false;\r
56         }\r
57         void * p = this->lib.GetSymbol(wxT("LoadPlugin"));\r
58         if (! p)\r
59         {\r
60                 return false;\r
61         }\r
62 \r
63         return ((int (__stdcall *)(const wxString &, wxULongLong)) p)(_szArcName, _llSubOption) == TPI_ERROR_SUCCESS;\r
64 }\r
65 \r
66 bool TPIHandle::FreeLibrary(void)\r
67 {\r
68         if (! this->lib.IsLoaded())\r
69         {\r
70                 return false;\r
71         }\r
72 \r
73         if (! this->lib.HasSymbol(wxT("FreePlugin")))\r
74         {\r
75                 return false;\r
76         }\r
77         void * p = this->lib.GetSymbol(wxT("FreePlugin"));\r
78         if (! p)\r
79         {\r
80                 return false;\r
81         }\r
82         ((int (__stdcall *)(void *)) p)(NULL);\r
83 \r
84         this->lib.Unload();\r
85         return true;\r
86 }\r
87 \r
88 int TPIHandle::GetPluginInformation(unsigned int _uInfoId, wxULongLong _llSubOption, void * _pPtr)\r
89 {\r
90         if (! this->lib.HasSymbol(wxT("GetPluginInformation")))\r
91         {\r
92                 return -1;\r
93         }\r
94         void * p = this->lib.GetSymbol(wxT("GetPluginInformation"));\r
95         if (! p)\r
96         {\r
97                 return -1;\r
98         }\r
99 \r
100         return ((int (__stdcall *)(unsigned int, wxULongLong, void *)) p)(_uInfoId, _llSubOption, _pPtr);\r
101 }\r
102 \r
103 int TPIHandle::GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)\r
104 {\r
105         if (! this->lib.HasSymbol(wxT("GetFormatInformation")) || ! _fiInfo)\r
106         {\r
107                 return -1;\r
108         }\r
109         void * p = this->lib.GetSymbol(wxT("GetFormatInformation"));\r
110         if (! p)\r
111         {\r
112                 return -1;\r
113         }\r
114 \r
115         // Initialization.\r
116         _fiInfo->fComment           = false;\r
117         _fiInfo->fEncryptKeyFile    = false;\r
118         _fiInfo->fEncryptPassword   = false;\r
119         _fiInfo->fEncryptHeader     = false;\r
120         _fiInfo->fMMOptimize        = false;\r
121         _fiInfo->fMultiVolume       = false;\r
122         _fiInfo->fSolid             = false;\r
123         _fiInfo->sCompressLevelMin  = 0;\r
124         _fiInfo->sCompressLevelMax  = 0;\r
125         _fiInfo->sRecoveryRecordMin = 0;\r
126         _fiInfo->sRecoveryRecordMax = 0;\r
127         _fiInfo->szTypeName         = wxEmptyString;\r
128         _fiInfo->szSuffix           = wxEmptyString;\r
129         _fiInfo->szEngineName       = wxEmptyString;\r
130         _fiInfo->szTPIName          = wxEmptyString;\r
131         _fiInfo->llSupportedCommand = 0;\r
132         _fiInfo->llTypeId           = 0;\r
133         _fiInfo->pCustomInfo    = NULL;\r
134 \r
135         return ((int (__stdcall *)(TPI_FORMATINFO *, bool)) p)(_fiInfo, _bFirst);\r
136 }\r
137 \r
138 int TPIHandle::CheckArchive(const wxString & _szArcName, int * _nFileCount)\r
139 {\r
140         if (! this->lib.HasSymbol(wxT("CheckArchive")))\r
141         {\r
142                 return -1;\r
143         }\r
144         void * p = this->lib.GetSymbol(wxT("CheckArchive"));\r
145         if (! p)\r
146         {\r
147                 return -1;\r
148         }\r
149 \r
150         return ((int (__stdcall *)(const wxString &, int *)) p)(_szArcName, _nFileCount);\r
151 }\r
152 \r
153 int TPIHandle::OpenArchive(const wxString & _szArcName)\r
154 {\r
155         if (! this->lib.HasSymbol(wxT("OpenArchive")))\r
156         {\r
157                 return -1;\r
158         }\r
159         void * p = this->lib.GetSymbol(wxT("OpenArchive"));\r
160         if (! p)\r
161         {\r
162                 return -1;\r
163         }\r
164 \r
165         return ((int (__stdcall *)(const wxString &, void * *)) p)(_szArcName, & this->archive);\r
166 }\r
167 \r
168 int TPIHandle::CloseArchive(void)\r
169 {\r
170         if (! this->lib.HasSymbol(wxT("CloseArchive")))\r
171         {\r
172                 return -1;\r
173         }\r
174         void * p = this->lib.GetSymbol(wxT("CloseArchive"));\r
175         if (! p)\r
176         {\r
177                 return -1;\r
178         }\r
179 \r
180         return ((int (__stdcall *)(void *)) p)(this->archive);\r
181 }\r
182 \r
183 int TPIHandle::GetFileInformation(TPI_FILEINFO * _fiInfo, bool _bFirst)\r
184 {\r
185         if (! this->lib.HasSymbol(wxT("GetFileInformation")) || ! _fiInfo)\r
186         {\r
187                 return -1;\r
188         }\r
189         void * p = this->lib.GetSymbol(wxT("GetFileInformation"));\r
190         if (! p)\r
191         {\r
192                 return -1;\r
193         }\r
194 \r
195         // Initialization.\r
196         _fiInfo->dwAttribute    = 0;\r
197         _fiInfo->dwCRC32        = 0;\r
198         _fiInfo->tmAccess       = 0;\r
199         _fiInfo->tmCreate       = 0;\r
200         _fiInfo->tmModified     = 0;\r
201         _fiInfo->uDanger        = 0;\r
202         _fiInfo->uOSType        = 0;\r
203         _fiInfo->llPackedSize   = 0;\r
204         _fiInfo->llUnpackedSize = 0;\r
205         _fiInfo->szStoredName   = wxEmptyString;\r
206         _fiInfo->szMethod       = wxEmptyString;\r
207         _fiInfo->wCompressRatio = 0;\r
208         _fiInfo->llFileID       = 0;\r
209         _fiInfo->pCustomInfo    = NULL;\r
210 \r
211         return ((int (__stdcall *)(void *, TPI_FILEINFO *, bool)) p)(this->archive, _fiInfo, _bFirst);\r
212 }\r
213 \r
214 int TPIHandle::GetArchiveInformation(TPI_ARCHIVEINFO * _aiInfo)\r
215 {\r
216         if (! this->lib.HasSymbol(wxT("GetArchiveInformation")) || ! _aiInfo)\r
217         {\r
218                 return -1;\r
219         }\r
220         void * p = this->lib.GetSymbol(wxT("GetArchiveInformation"));\r
221         if (! p)\r
222         {\r
223                 return -1;\r
224         }\r
225 \r
226         // Initialization.\r
227         _aiInfo->fSolid                 = false;\r
228         _aiInfo->fMMOptimize    = false;\r
229         _aiInfo->fEncryptData   = false;\r
230         _aiInfo->fEncryptHeader = false;\r
231         _aiInfo->sCompressLevel = 0;\r
232         _aiInfo->sRecoveryRecord= 0;\r
233         _aiInfo->tmAccess       = 0;\r
234         _aiInfo->tmCreate       = 0;\r
235         _aiInfo->tmModified     = 0;\r
236         _aiInfo->nSFXType       = 0;\r
237         _aiInfo->uOSType        = 0;\r
238         _aiInfo->llFileSize     = 0;\r
239         _aiInfo->llPackedSize   = 0;\r
240         _aiInfo->llReadSize     = 0;\r
241         _aiInfo->llUnpackedSize = 0;\r
242         _aiInfo->llSplitSize    = 0;\r
243         _aiInfo->szComment      = wxEmptyString;\r
244         _aiInfo->wCompressRatio = 0;\r
245         _aiInfo->pCustomInfo    = NULL;\r
246         // FORMATINFO\r
247         _aiInfo->fiInfo.fComment           = false;\r
248         _aiInfo->fiInfo.fEncryptKeyFile    = false;\r
249         _aiInfo->fiInfo.fEncryptPassword   = false;\r
250         _aiInfo->fiInfo.fEncryptHeader     = false;\r
251         _aiInfo->fiInfo.fMMOptimize        = false;\r
252         _aiInfo->fiInfo.fMultiVolume       = false;\r
253         _aiInfo->fiInfo.fSolid             = false;\r
254         _aiInfo->fiInfo.sCompressLevelMin  = 0;\r
255         _aiInfo->fiInfo.sCompressLevelMax  = 0;\r
256         _aiInfo->fiInfo.sRecoveryRecordMin = 0;\r
257         _aiInfo->fiInfo.sRecoveryRecordMax = 0;\r
258         _aiInfo->fiInfo.szTypeName         = wxEmptyString;\r
259         _aiInfo->fiInfo.szSuffix           = wxEmptyString;\r
260         _aiInfo->fiInfo.szEngineName       = wxEmptyString;\r
261         _aiInfo->fiInfo.szTPIName          = wxEmptyString;\r
262         _aiInfo->fiInfo.llSupportedCommand = 0;\r
263         _aiInfo->fiInfo.llTypeId           = 0;\r
264         _aiInfo->fiInfo.pCustomInfo    = NULL;\r
265 \r
266         return ((int (__stdcall *)(void *, TPI_ARCHIVEINFO *)) p)(this->archive, _aiInfo);\r
267 }\r
268 \r
269 int TPIHandle::Command(unsigned int _uCommand, TPI_SWITCHES * _swInfo, const wxString & _szArcName, const wxArrayString & _szFiles)\r
270 {\r
271         if (! this->lib.HasSymbol(wxT("Command")))\r
272         {\r
273                 return -1;\r
274         }\r
275         void * p = this->lib.GetSymbol(wxT("Command"));\r
276         if (! p)\r
277         {\r
278                 return -1;\r
279         }\r
280 \r
281         return ((int (__stdcall *)(unsigned int, TPI_SWITCHES *, const wxString &, const wxArrayString &)) p)(_uCommand, _swInfo, _szArcName, _szFiles);\r
282 }\r
283 \r
284 int TPIHandle::SetCallbackProc(TPI_PROC _prProc)\r
285 {\r
286         if (! this->lib.HasSymbol(wxT("SetCallbackProc")))\r
287         {\r
288                 return -1;\r
289         }\r
290         void * p = this->lib.GetSymbol(wxT("SetCallbackProc"));\r
291         if (! p)\r
292         {\r
293                 return -1;\r
294         }\r
295 \r
296         return ((int (__stdcall *)(TPI_PROC)) p)(_prProc);\r
297 }\r