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 6787 - (hide annotations) (download) (as text)
Fri Jun 9 10:04:39 2017 UTC (6 years, 10 months ago) by doda
Original Path: trunk/teraterm/teraterm/ttplug.c
File MIME type: text/x-csrc
File size: 6995 byte(s)
意図していない動作であるため、コメントを追加

メッセージの国際化には設定を読み込む必要があるが、TTX で設定の読み込みを
フックする為にそれより前に LoadLibrary() する必要があるという矛盾した状態。
UILanguageFile だけ先に読んでおく?
1 maya 3227 #include "teraterm.h"
2     #include "tttypes.h"
3     #include "ttlib.h"
4    
5     // #include <windows.h>
6     #include <stdlib.h>
7     #include <stdio.h>
8     #include <string.h>
9     /* for _findXXXX() functions */
10     #include <io.h>
11     #include "ttwinman.h"
12     #include "ttplugin.h"
13     #include "ttplug.h"
14     #undef TTXOpenTCP
15     #undef TTXCloseTCP
16     #undef TTXOpenFile
17     #undef TTXCloseFile
18     #undef TTXGetUIHooks
19     #undef TTXGetSetupHooks
20    
21 doda 4087 #define MAXNUMEXTENSIONS 32
22 maya 3227 static HANDLE LibHandle[MAXNUMEXTENSIONS];
23     static int NumExtensions = 0;
24     static TTXExports * * Extensions;
25    
26     typedef struct _ExtensionList {
27     TTXExports * exports;
28     struct _ExtensionList * next;
29     } ExtensionList;
30    
31     static int compareOrder(const void * e1, const void * e2) {
32     TTXExports * * exports1 = (TTXExports * *)e1;
33     TTXExports * * exports2 = (TTXExports * *)e2;
34    
35     return (*exports1)->loadOrder - (*exports2)->loadOrder;
36     }
37    
38     static void loadExtension(ExtensionList * * extensions, char const * fileName) {
39     char buf[1024];
40     DWORD err;
41     char uimsg[MAX_UIMSG];
42    
43     if (NumExtensions>=MAXNUMEXTENSIONS) return;
44     LibHandle[NumExtensions] = LoadLibrary(fileName);
45     if (LibHandle[NumExtensions] != NULL) {
46     TTXBindProc bind = (TTXBindProc)GetProcAddress(LibHandle[NumExtensions], "_TTXBind@8");
47     if (bind==NULL)
48     bind = (TTXBindProc)GetProcAddress(LibHandle[NumExtensions], "TTXBind");
49     if (bind != NULL) {
50     ExtensionList * newExtension =
51     (ExtensionList *)malloc(sizeof(ExtensionList));
52    
53     newExtension->exports = (TTXExports *)malloc(sizeof(TTXExports));
54     memset(newExtension->exports, 0, sizeof(TTXExports));
55     newExtension->exports->size = sizeof(TTXExports);
56     if (bind(TTVERSION,(TTXExports FAR *)newExtension->exports)) {
57     newExtension->next = *extensions;
58     *extensions = newExtension;
59     NumExtensions++;
60     return;
61     } else {
62     free(newExtension->exports);
63     free(newExtension);
64     }
65     }
66     FreeLibrary(LibHandle[NumExtensions]);
67     }
68    
69     err = GetLastError();
70 doda 6787 // �����t�@�C�����������b�Z�[�W�����������s�����������A�������_����������
71     // �������������������������A���b�Z�[�W���p���������������B�v�����B
72 maya 3227 get_lang_msg("MSG_TT_ERROR", uimsg, sizeof(uimsg), "Tera Term: Error", ts.UILanguageFile);
73     get_lang_msg("MSG_LOAD_EXT_ERROR", ts.UIMsg, sizeof(ts.UIMsg), "Cannot load extension %s (%d)", ts.UILanguageFile);
74     _snprintf_s(buf, sizeof(buf), _TRUNCATE, ts.UIMsg, fileName, err);
75     MessageBox(NULL, buf, uimsg, MB_OK | MB_ICONEXCLAMATION);
76     }
77    
78     void PASCAL FAR TTXInit(PTTSet ts, PComVar cv) {
79     ExtensionList * extensionList = NULL;
80     int i;
81    
82     // ���������������L�������������ATTX���L���������B
83     //if (getenv("TERATERM_EXTENSIONS") != NULL) {
84     if (1) {
85     char buf[1024];
86     int index;
87     struct _finddata_t searchData;
88     long searchHandle;
89    
90 maya 3623 if (GetModuleFileName(hInst, buf, sizeof(buf)) == 0) {
91     return;
92     }
93 maya 3227 for (index = strlen(buf) - 1;
94     index >= 0 && buf[index] != '\\' && buf[index] != ':' && buf[index] != '/';
95     index--) {
96     }
97     index++;
98     strncpy_s(buf + index, sizeof(buf) - index, "TTX*.DLL", _TRUNCATE);
99    
100     searchHandle = _findfirst(buf,&searchData);
101     if (searchHandle != -1L) {
102     loadExtension(&extensionList, searchData.name);
103    
104     while (_findnext(searchHandle, &searchData)==0) {
105     loadExtension(&extensionList, searchData.name);
106     }
107     _findclose(searchHandle);
108     }
109    
110     if (NumExtensions==0) return;
111    
112     Extensions = (TTXExports * *)malloc(sizeof(TTXExports *)*NumExtensions);
113     for (i = 0; i < NumExtensions; i++) {
114     ExtensionList * old;
115    
116     Extensions[i] = extensionList->exports;
117     old = extensionList;
118     extensionList = extensionList->next;
119     free(old);
120     }
121    
122     qsort(Extensions, NumExtensions, sizeof(Extensions[0]), compareOrder);
123    
124     for (i = 0; i < NumExtensions; i++) {
125     if (Extensions[i]->TTXInit != NULL) {
126     Extensions[i]->TTXInit(ts, cv);
127     }
128     }
129     }
130     }
131    
132     void PASCAL FAR TTXInternalOpenTCP(TTXSockHooks FAR * hooks) {
133     int i;
134    
135     for (i = 0; i < NumExtensions; i++) {
136     if (Extensions[i]->TTXOpenTCP != NULL) {
137     Extensions[i]->TTXOpenTCP(hooks);
138     }
139     }
140     }
141    
142     void PASCAL FAR TTXInternalCloseTCP(TTXSockHooks FAR * hooks) {
143     int i;
144    
145     for (i = NumExtensions - 1; i >= 0; i--) {
146     if (Extensions[i]->TTXCloseTCP != NULL) {
147     Extensions[i]->TTXCloseTCP(hooks);
148     }
149     }
150     }
151    
152     void PASCAL FAR TTXInternalOpenFile(TTXFileHooks FAR * hooks) {
153     int i;
154    
155     for (i = 0; i < NumExtensions; i++) {
156     if (Extensions[i]->TTXOpenFile != NULL) {
157     Extensions[i]->TTXOpenFile(hooks);
158     }
159     }
160     }
161    
162     void PASCAL FAR TTXInternalCloseFile(TTXFileHooks FAR * hooks) {
163     int i;
164    
165     for (i = NumExtensions - 1; i >= 0; i--) {
166     if (Extensions[i]->TTXCloseFile != NULL) {
167     Extensions[i]->TTXCloseFile(hooks);
168     }
169     }
170     }
171    
172     void PASCAL FAR TTXInternalGetUIHooks(TTXUIHooks FAR * hooks) {
173     int i;
174    
175     for (i = 0; i < NumExtensions; i++) {
176     if (Extensions[i]->TTXGetUIHooks != NULL) {
177     Extensions[i]->TTXGetUIHooks(hooks);
178     }
179     }
180     }
181    
182     void PASCAL FAR TTXInternalGetSetupHooks(TTXSetupHooks FAR * hooks) {
183     int i;
184    
185     for (i = NumExtensions - 1; i >= 0; i--) {
186     if (Extensions[i]->TTXGetSetupHooks != NULL) {
187     Extensions[i]->TTXGetSetupHooks(hooks);
188     }
189     }
190     }
191    
192     void PASCAL FAR TTXSetWinSize(int rows, int cols) {
193     int i;
194    
195     for (i = 0; i < NumExtensions; i++) {
196     if (Extensions[i]->TTXSetWinSize != NULL) {
197     Extensions[i]->TTXSetWinSize(rows, cols);
198     }
199     }
200     }
201    
202     void PASCAL FAR TTXModifyMenu(HMENU menu) {
203     int i;
204    
205     for (i = 0; i < NumExtensions; i++) {
206     if (Extensions[i]->TTXModifyMenu != NULL) {
207     Extensions[i]->TTXModifyMenu(menu);
208     }
209     }
210     }
211    
212     void PASCAL FAR TTXModifyPopupMenu(HMENU menu) {
213     int i;
214    
215     for (i = 0; i < NumExtensions; i++) {
216     if (Extensions[i]->TTXModifyPopupMenu != NULL) {
217     Extensions[i]->TTXModifyPopupMenu(menu);
218     }
219     }
220     }
221    
222     BOOL PASCAL FAR TTXProcessCommand(HWND hWin, WORD cmd) {
223     int i;
224    
225     for (i = NumExtensions - 1; i >= 0; i--) {
226     if (Extensions[i]->TTXProcessCommand != NULL) {
227     if (Extensions[i]->TTXProcessCommand(hWin,cmd)) {
228     return TRUE;
229     }
230     }
231     }
232    
233     return FALSE;
234     }
235    
236     void PASCAL FAR TTXEnd(void) {
237     int i;
238    
239     if (NumExtensions==0) return;
240    
241     for (i = NumExtensions - 1; i >= 0; i--) {
242     if (Extensions[i]->TTXEnd != NULL) {
243     Extensions[i]->TTXEnd();
244     }
245     }
246    
247     for (i=0; i<NumExtensions; i++)
248     FreeLibrary(LibHandle[i]);
249    
250     for (i = 0; i < NumExtensions; i++) {
251     free(Extensions[i]);
252     }
253    
254     free(Extensions);
255     NumExtensions = 0;
256     }
257    
258     void PASCAL FAR TTXSetCommandLine(PCHAR cmd, int cmdlen, PGetHNRec rec) {
259     int i;
260    
261     for (i = 0; i < NumExtensions; i++) {
262     if (Extensions[i]->TTXSetCommandLine != NULL) {
263     Extensions[i]->TTXSetCommandLine(cmd, cmdlen, rec);
264     }
265     }
266     }

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