Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/ttplug.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9226 - (hide annotations) (download) (as text)
Tue Apr 27 16:10:42 2021 UTC (2 years, 11 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/ttplug.c
File MIME type: text/x-csrc
File size: 9883 byte(s)
ロードできるプラグイン数の制限をなくした

- 従来は32までだった
- 不要な do { } while(0) を削除
1 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3     * (C) Robert O'Callahan
4 nmaya 9048 * (C) 2004- TeraTerm Project
5 doda 6806 * All rights reserved.
6     *
7 doda 6841 * Redistribution and use in source and binary forms, with or without
8     * modification, are permitted provided that the following conditions
9     * are met:
10 doda 6806 *
11 doda 6841 * 1. Redistributions of source code must retain the above copyright
12     * notice, this list of conditions and the following disclaimer.
13     * 2. Redistributions in binary form must reproduce the above copyright
14     * notice, this list of conditions and the following disclaimer in the
15     * documentation and/or other materials provided with the distribution.
16     * 3. The name of the author may not be used to endorse or promote products
17     * derived from this software without specific prior written permission.
18 doda 6806 *
19 doda 6841 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
20     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 doda 6806 */
30 maya 3227 #include "teraterm.h"
31     #include "tttypes.h"
32     #include "ttlib.h"
33    
34 zmatsuo 9224 #define _CRTDBG_MAP_ALLOC
35 maya 3227 #include <stdlib.h>
36     #include <stdio.h>
37     #include <string.h>
38 zmatsuo 9224 #include <crtdbg.h>
39 maya 3227 #include "ttwinman.h"
40     #include "ttplugin.h"
41 zmatsuo 9224 #include "codeconv.h"
42 zmatsuo 9225 #include "asprintf.h"
43 maya 3227
44 zmatsuo 9225 #include "ttplug.h"
45    
46 maya 3227 static int NumExtensions = 0;
47    
48     typedef struct _ExtensionList {
49 zmatsuo 9226 TTXExports * exports;
50     HANDLE LibHandle;
51 maya 3227 } ExtensionList;
52    
53 zmatsuo 9226 static ExtensionList *Extensions;
54    
55 maya 3227 static int compareOrder(const void * e1, const void * e2) {
56     TTXExports * * exports1 = (TTXExports * *)e1;
57     TTXExports * * exports2 = (TTXExports * *)e2;
58    
59     return (*exports1)->loadOrder - (*exports2)->loadOrder;
60     }
61    
62 zmatsuo 9226 static void loadExtension(wchar_t const *fileName)
63 zmatsuo 9224 {
64     DWORD err;
65     const wchar_t *sub_message;
66     HMODULE hPlugin;
67 maya 3227
68 zmatsuo 9224 hPlugin = LoadLibraryW(fileName);
69     if (hPlugin != NULL) {
70     TTXBindProc bind = NULL;
71 zmatsuo 7536 #if defined(_MSC_VER)
72 zmatsuo 9224 if (bind == NULL)
73     bind = (TTXBindProc)GetProcAddress(hPlugin, "_TTXBind@8");
74 zmatsuo 7536 #else
75 zmatsuo 9224 if (bind == NULL)
76     bind = (TTXBindProc)GetProcAddress(hPlugin, "TTXBind@8");
77 zmatsuo 7536 #endif
78 zmatsuo 9224 if (bind == NULL)
79     bind = (TTXBindProc)GetProcAddress(hPlugin, "TTXBind");
80     if (bind != NULL) {
81 zmatsuo 9226 TTXExports * exports = (TTXExports *)malloc(sizeof(TTXExports));
82     if (exports == NULL) {
83     return;
84     }
85     memset(exports, 0, sizeof(TTXExports));
86     exports->size = sizeof(TTXExports);
87 maya 3227
88 zmatsuo 9226 if (bind(TTVERSION, exports)) {
89     ExtensionList *newExtension;
90     ExtensionList *extensions = (ExtensionList *)realloc(Extensions, sizeof(ExtensionList) * (NumExtensions + 1));
91     if (extensions == NULL) {
92     free(exports);
93     FreeLibrary(hPlugin);
94     return;
95     }
96     Extensions = extensions;
97     newExtension = &extensions[NumExtensions];
98 zmatsuo 9224 NumExtensions++;
99 zmatsuo 9226
100     newExtension->exports = exports;
101     newExtension->LibHandle = hPlugin;
102 zmatsuo 9224 return;
103     }
104     else {
105 zmatsuo 9226 free(exports);
106 zmatsuo 9224 }
107     }
108 zmatsuo 9226 FreeLibrary(hPlugin);
109 zmatsuo 9224 }
110 maya 3227
111 zmatsuo 9224 err = GetLastError();
112     switch (err) {
113     case 31:
114     sub_message = L"Unresolved dll entry";
115     break;
116     case 1114:
117     sub_message = L"tls entry exists";
118     break;
119     case 2:
120     sub_message = L"rejected by plugin";
121     break;
122     case 193:
123     sub_message = L"invalid dll image";
124     break;
125     default:
126     sub_message = L"unknown";
127     break;
128     }
129     // �����t�@�C�����������b�Z�[�W�����������s�����������A�������_����������
130     // �������������������������A���b�Z�[�W���p���������������B�v�����B
131     static const TTMessageBoxInfoW info = {"Tera Term", "MSG_TT_ERROR", L"Tera Term: Error", "MSG_LOAD_EXT_ERROR",
132     L"Cannot load extension %s (%d, %s)"};
133     TTMessageBoxW(NULL, &info, MB_OK | MB_ICONEXCLAMATION, ts.UILanguageFile, fileName, err, sub_message);
134 maya 3227 }
135    
136 zmatsuo 9225 void PASCAL TTXInit(PTTSet ts_, PComVar cv_)
137     {
138     int i;
139     wchar_t *load_mask;
140     WIN32_FIND_DATAW fd;
141     HANDLE hFind;
142     wchar_t *HomeDirW = ToWcharA(ts_->HomeDir);
143 maya 3227
144 zmatsuo 9225 aswprintf(&load_mask, L"%s\\TTX*.DLL", HomeDirW);
145 maya 3227
146 zmatsuo 9225 hFind = FindFirstFileW(load_mask, &fd);
147     if (hFind != INVALID_HANDLE_VALUE) {
148     do {
149     wchar_t *filename;
150     aswprintf(&filename, L"%s\\%s", HomeDirW, fd.cFileName);
151 zmatsuo 9226 loadExtension(filename);
152 zmatsuo 9225 free(filename);
153     } while (FindNextFileW(hFind, &fd));
154     FindClose(hFind);
155     }
156     free(load_mask);
157     free(HomeDirW);
158 maya 3227
159 zmatsuo 9225 if (NumExtensions==0) return;
160 maya 3227
161 zmatsuo 9225 qsort(Extensions, NumExtensions, sizeof(Extensions[0]), compareOrder);
162 maya 3227
163 zmatsuo 9225 for (i = 0; i < NumExtensions; i++) {
164 zmatsuo 9226 if (Extensions[i].exports->TTXInit != NULL) {
165     Extensions[i].exports->TTXInit(ts_, cv_);
166 zmatsuo 9225 }
167     }
168 maya 3227 }
169    
170 zmatsuo 9223 static void PASCAL TTXInternalOpenTCP(TTXSockHooks * hooks) {
171 maya 3227 int i;
172    
173     for (i = 0; i < NumExtensions; i++) {
174 zmatsuo 9226 if (Extensions[i].exports->TTXOpenTCP != NULL) {
175     Extensions[i].exports->TTXOpenTCP(hooks);
176 maya 3227 }
177     }
178     }
179    
180 zmatsuo 9223 void PASCAL TTXOpenTCP(void)
181     {
182 zmatsuo 9226 static TTXSockHooks SockHooks = {
183     &Pclosesocket, &Pconnect, &Phtonl, &Phtons, &Pinet_addr,
184     &Pioctlsocket, &Precv, &Pselect, &Psend, &Psetsockopt,
185     &Psocket, &PWSAAsyncSelect, &PWSAAsyncGetHostByName,
186     &PWSACancelAsyncRequest, &PWSAGetLastError,
187     /* &Pgetaddrinfo,*/ &Pfreeaddrinfo, &PWSAAsyncGetAddrInfo
188     };
189     TTXInternalOpenTCP(&SockHooks);
190 zmatsuo 9223 }
191    
192     static void PASCAL TTXInternalCloseTCP(TTXSockHooks * hooks) {
193 maya 3227 int i;
194    
195     for (i = NumExtensions - 1; i >= 0; i--) {
196 zmatsuo 9226 if (Extensions[i].exports->TTXCloseTCP != NULL) {
197     Extensions[i].exports->TTXCloseTCP(hooks);
198 maya 3227 }
199     }
200     }
201    
202 zmatsuo 9223 void PASCAL TTXCloseTCP(void)
203     {
204 zmatsuo 9226 static TTXSockHooks SockHooks = {
205     &Pclosesocket, &Pconnect, &Phtonl, &Phtons, &Pinet_addr,
206     &Pioctlsocket, &Precv, &Pselect, &Psend, &Psetsockopt,
207     &Psocket, &PWSAAsyncSelect, &PWSAAsyncGetHostByName,
208     &PWSACancelAsyncRequest, &PWSAGetLastError,
209     /* &Pgetaddrinfo,*/ &Pfreeaddrinfo, &PWSAAsyncGetAddrInfo
210     };
211     TTXInternalCloseTCP(&SockHooks);
212 zmatsuo 9223 }
213    
214     static void PASCAL TTXInternalOpenFile(TTXFileHooks * hooks) {
215 maya 3227 int i;
216    
217     for (i = 0; i < NumExtensions; i++) {
218 zmatsuo 9226 if (Extensions[i].exports->TTXOpenFile != NULL) {
219     Extensions[i].exports->TTXOpenFile(hooks);
220 maya 3227 }
221     }
222     }
223    
224 zmatsuo 9223 void PASCAL TTXOpenFile(void)
225     {
226 zmatsuo 9226 static TTXFileHooks FileHooks = {
227     &PCreateFile, &PCloseFile, &PReadFile, &PWriteFile
228     };
229     TTXInternalOpenFile(&FileHooks);
230 zmatsuo 9223 }
231    
232     static void PASCAL TTXInternalCloseFile(TTXFileHooks * hooks) {
233 maya 3227 int i;
234    
235     for (i = NumExtensions - 1; i >= 0; i--) {
236 zmatsuo 9226 if (Extensions[i].exports->TTXCloseFile != NULL) {
237     Extensions[i].exports->TTXCloseFile(hooks);
238 maya 3227 }
239     }
240     }
241    
242 zmatsuo 9223 void PASCAL TTXCloseFile(void)
243     {
244 zmatsuo 9226 static TTXFileHooks FileHooks = {
245     &PCreateFile, &PCloseFile, &PReadFile, &PWriteFile
246     };
247     TTXInternalCloseFile(&FileHooks);
248 zmatsuo 9223 }
249    
250     static void PASCAL TTXInternalGetUIHooks(TTXUIHooks * hooks) {
251 maya 3227 int i;
252    
253     for (i = 0; i < NumExtensions; i++) {
254 zmatsuo 9226 if (Extensions[i].exports->TTXGetUIHooks != NULL) {
255     Extensions[i].exports->TTXGetUIHooks(hooks);
256 maya 3227 }
257     }
258     }
259    
260 zmatsuo 9223 void PASCAL TTXGetUIHooks(void)
261     {
262 zmatsuo 9226 static TTXUIHooks UIHooks = {
263     &SetupTerminal, &SetupWin, &SetupKeyboard, &SetupSerialPort,
264     &SetupTCPIP, &GetHostName, &ChangeDirectory, &AboutDialog,
265     &ChooseFontDlg, &SetupGeneral, &WindowWindow
266     };
267     TTXInternalGetUIHooks(&UIHooks);
268 zmatsuo 9223 }
269    
270     static void PASCAL TTXInternalGetSetupHooks(TTXSetupHooks * hooks) {
271 maya 3227 int i;
272    
273     for (i = NumExtensions - 1; i >= 0; i--) {
274 zmatsuo 9226 if (Extensions[i].exports->TTXGetSetupHooks != NULL) {
275     Extensions[i].exports->TTXGetSetupHooks(hooks);
276 maya 3227 }
277     }
278     }
279    
280 zmatsuo 9223 void PASCAL TTXGetSetupHooks(void)
281     {
282 zmatsuo 9226 static TTXSetupHooks SetupHooks = {
283     &ReadIniFile, &WriteIniFile, &ReadKeyboardCnf, &CopyHostList,
284     &AddHostToList, &ParseParam
285     };
286     TTXInternalGetSetupHooks(&SetupHooks);
287 zmatsuo 9223 }
288    
289 doda 6801 void PASCAL TTXSetWinSize(int rows, int cols) {
290 maya 3227 int i;
291    
292     for (i = 0; i < NumExtensions; i++) {
293 zmatsuo 9226 if (Extensions[i].exports->TTXSetWinSize != NULL) {
294     Extensions[i].exports->TTXSetWinSize(rows, cols);
295 maya 3227 }
296     }
297     }
298    
299 doda 6801 void PASCAL TTXModifyMenu(HMENU menu) {
300 maya 3227 int i;
301    
302     for (i = 0; i < NumExtensions; i++) {
303 zmatsuo 9226 if (Extensions[i].exports->TTXModifyMenu != NULL) {
304     Extensions[i].exports->TTXModifyMenu(menu);
305 maya 3227 }
306     }
307     }
308    
309 doda 6801 void PASCAL TTXModifyPopupMenu(HMENU menu) {
310 maya 3227 int i;
311    
312     for (i = 0; i < NumExtensions; i++) {
313 zmatsuo 9226 if (Extensions[i].exports->TTXModifyPopupMenu != NULL) {
314     Extensions[i].exports->TTXModifyPopupMenu(menu);
315 maya 3227 }
316     }
317     }
318    
319 doda 6801 BOOL PASCAL TTXProcessCommand(HWND hWin, WORD cmd) {
320 maya 3227 int i;
321    
322     for (i = NumExtensions - 1; i >= 0; i--) {
323 zmatsuo 9226 if (Extensions[i].exports->TTXProcessCommand != NULL) {
324     if (Extensions[i].exports->TTXProcessCommand(hWin,cmd)) {
325 maya 3227 return TRUE;
326     }
327     }
328     }
329    
330     return FALSE;
331     }
332    
333 zmatsuo 9226 void PASCAL TTXEnd(void)
334     {
335     int i;
336 maya 3227
337 zmatsuo 9226 if (NumExtensions == 0)
338     return;
339 maya 3227
340 zmatsuo 9226 for (i = NumExtensions - 1; i >= 0; i--) {
341     if (Extensions[i].exports->TTXEnd != NULL) {
342     Extensions[i].exports->TTXEnd();
343     }
344     }
345 maya 3227
346 zmatsuo 9226 for (i = 0; i < NumExtensions; i++) {
347     free(Extensions[i].exports);
348     FreeLibrary(Extensions[i].LibHandle);
349     }
350 maya 3227
351 zmatsuo 9226 free(Extensions);
352     Extensions = NULL;
353     NumExtensions = 0;
354 maya 3227 }
355    
356 doda 6801 void PASCAL TTXSetCommandLine(PCHAR cmd, int cmdlen, PGetHNRec rec) {
357 maya 3227 int i;
358    
359     for (i = 0; i < NumExtensions; i++) {
360 zmatsuo 9226 if (Extensions[i].exports->TTXSetCommandLine != NULL) {
361     Extensions[i].exports->TTXSetCommandLine(cmd, cmdlen, rec);
362 maya 3227 }
363     }
364     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26