OSDN Git Service

Fix bugs of routines for IPv6.
[ffftp/ffftp.git] / taskwin.c
1 /*=============================================================================\r
2 *\r
3 *                                                               タスクウインドウ\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 #define  STRICT\r
31 // IPv6対応\r
32 #include <winsock2.h>\r
33 #include <windows.h>\r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 #include <string.h>\r
37 #include <mbstring.h>\r
38 #include <malloc.h>\r
39 #include <windowsx.h>\r
40 #include <commctrl.h>\r
41 #include <stdarg.h>\r
42 // IPv6対応\r
43 //#include <winsock.h>\r
44 \r
45 #include "common.h"\r
46 #include "resource.h"\r
47 \r
48 // Windows 9x系をサポートしないため不要\r
49 //#define TASK_BUFSIZE  (16*1024)\r
50 \r
51 \r
52 \r
53 \r
54 /*===== 外部参照 =====*/\r
55 \r
56 extern int ClientWidth;\r
57 extern int SepaWidth;\r
58 extern int ListHeight;\r
59 \r
60 /* 設定値 */\r
61 extern int TaskHeight;\r
62 extern HFONT ListFont;\r
63 extern int DebugConsole;\r
64 \r
65 /*===== ローカルなワーク =====*/\r
66 \r
67 static HWND hWndTask = NULL;\r
68 static HANDLE DispLogSemaphore;\r
69 static HANDLE DispLogSemaphore2;\r
70 \r
71 \r
72 \r
73 /*----- タスクウインドウを作成する --------------------------------------------\r
74 *\r
75 *       Parameter\r
76 *               HWND hWnd : 親ウインドウのウインドウハンドル\r
77 *               HINSTANCE hInst : インスタンスハンドル\r
78 *\r
79 *       Return Value\r
80 *               int ステータス\r
81 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
82 *----------------------------------------------------------------------------*/\r
83 \r
84 int MakeTaskWindow(HWND hWnd, HINSTANCE hInst)\r
85 {\r
86         int Sts;\r
87 \r
88         Sts = FFFTP_FAIL;\r
89         hWndTask = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
90                         "EDIT", NULL,\r
91                         WS_CHILD | WS_BORDER | ES_AUTOVSCROLL | WS_VSCROLL | ES_MULTILINE | ES_READONLY | WS_CLIPSIBLINGS,\r
92                         0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight,\r
93                         hWnd, (HMENU)1500, hInst, NULL);\r
94 \r
95         if(hWndTask != NULL)\r
96         {\r
97                 // Windows 9x系をサポートしないため不要\r
98 //              SendMessage(hWndTask, EM_LIMITTEXT, TASK_BUFSIZE, 0);\r
99                 SendMessage(hWndTask, EM_LIMITTEXT, 0x7fffffff, 0);\r
100 \r
101                 if(ListFont != NULL)\r
102                         SendMessage(hWndTask, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
103 \r
104                 ShowWindow(hWndTask, SW_SHOW);\r
105                 Sts = FFFTP_SUCCESS;\r
106 \r
107                 DispLogSemaphore = CreateSemaphore(NULL, 1, 1, NULL);\r
108                 DispLogSemaphore2 = CreateSemaphore(NULL, 1, 1, NULL);\r
109 \r
110         }\r
111         return(Sts);\r
112 }\r
113 \r
114 \r
115 /*----- タスクウインドウを削除 ------------------------------------------------\r
116 *\r
117 *       Parameter\r
118 *               なし\r
119 *\r
120 *       Return Value\r
121 *               なし\r
122 *----------------------------------------------------------------------------*/\r
123 \r
124 void DeleteTaskWindow(void)\r
125 {\r
126         CloseHandle(DispLogSemaphore);\r
127         CloseHandle(DispLogSemaphore2);\r
128         if(hWndTask != NULL)\r
129                 DestroyWindow(hWndTask);\r
130         return;\r
131 }\r
132 \r
133 \r
134 /*----- タスクウインドウのウインドウハンドルを返す ----------------------------\r
135 *\r
136 *       Parameter\r
137 *               なし\r
138 *\r
139 *       Return Value\r
140 *               HWND ウインドウハンドル\r
141 *----------------------------------------------------------------------------*/\r
142 \r
143 HWND GetTaskWnd(void)\r
144 {\r
145         return(hWndTask);\r
146 }\r
147 \r
148 \r
149 /*----- タスクメッセージを表示する --------------------------------------------\r
150 *\r
151 *       Parameter\r
152 *               char *szFormat : フォーマット文字列\r
153 *               ... : パラメータ\r
154 *\r
155 *       Return Value\r
156 *               なし\r
157 *----------------------------------------------------------------------------*/\r
158 \r
159 void SetTaskMsg(char *szFormat, ...)\r
160 {\r
161         int Pos;\r
162         va_list vaArgs;\r
163         char *szBuf;\r
164 //      DWORD Tmp;\r
165 \r
166 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "111\n", 4, &Tmp, NULL);\r
167         while(WaitForSingleObject(DispLogSemaphore, 1) == WAIT_TIMEOUT)\r
168                 BackgrndMessageProc();\r
169 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "222\n", 4, &Tmp, NULL);\r
170 \r
171         if(hWndTask != NULL)\r
172         {\r
173                 if((szBuf = malloc(10*1024+3)) != NULL)\r
174                 {\r
175                         va_start(vaArgs, szFormat);\r
176                         if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)\r
177                         {\r
178 //#pragma aaa\r
179 //                              WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL);\r
180 //                              WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL);\r
181 \r
182                                 strcat(szBuf, "\r\n");\r
183                                 Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);\r
184 \r
185                                 /* テキストサイズのリミット値をチェック */\r
186                                 // Windows 9x系をサポートしないため不要\r
187 //                              if((Pos + strlen(szBuf)) >= TASK_BUFSIZE)\r
188 //                              {\r
189 //                                      /* リミットを越えそうなら、先頭部分を切り捨てる */\r
190 //                                      Pos = SendMessage(GetTaskWnd(), EM_LINEFROMCHAR, TASK_BUFSIZE/10, 0) + 1;\r
191 //                                      Pos = SendMessage(GetTaskWnd(), EM_LINEINDEX, Pos, 0);\r
192 //                                      SendMessage(GetTaskWnd(), EM_SETSEL, 0, Pos);\r
193 //                                      SendMessage(GetTaskWnd(), EM_REPLACESEL, FALSE, (LPARAM)"");\r
194 //\r
195 //                                      Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);\r
196 //                              }\r
197 \r
198                                 SendMessage(GetTaskWnd(), EM_SETSEL, Pos, Pos);\r
199                                 SendMessage(GetTaskWnd(), EM_REPLACESEL, FALSE, (LPARAM)szBuf);\r
200                         }\r
201                         va_end(vaArgs);\r
202                         free(szBuf);\r
203                 }\r
204         }\r
205 \r
206 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "333\n", 4, &Tmp, NULL);\r
207         ReleaseSemaphore(DispLogSemaphore, 1, NULL);\r
208 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "444\n", 4, &Tmp, NULL);\r
209 \r
210         return;\r
211 }\r
212 \r
213 \r
214 /*----- タスクメッセージをファイルに保存する ----------------------------------\r
215 *\r
216 *       Parameter\r
217 *               char *Fname : ファイル名\r
218 *\r
219 *       Return Value\r
220 *               int ステータス\r
221 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
222 *----------------------------------------------------------------------------*/\r
223 \r
224 int SaveTaskMsg(char *Fname)\r
225 {\r
226         FILE *Strm;\r
227         int Size;\r
228         char *Buf;\r
229         int Sts;\r
230 \r
231 \r
232         Sts = FFFTP_FAIL;\r
233         Size = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);\r
234         if((Buf = malloc(Size)) != NULL)\r
235         {\r
236                 if((Strm = fopen(Fname, "wb")) != NULL)\r
237                 {\r
238                         SendMessage(GetTaskWnd(), WM_GETTEXT, Size, (LPARAM)Buf);\r
239                         if(fwrite(Buf, strlen(Buf), 1, Strm) == 1)\r
240                                 Sts = FFFTP_SUCCESS;\r
241                         fclose(Strm);\r
242 \r
243                         if(Sts == FFFTP_FAIL)\r
244                                 _unlink(Fname);\r
245                 }\r
246                 free(Buf);\r
247         }\r
248         return(Sts);\r
249 }\r
250 \r
251 \r
252 /*----- タスク内容をビューワで表示 --------------------------------------------\r
253 *\r
254 *       Parameter\r
255 *               なし\r
256 *\r
257 *       Return Value\r
258 *               なし\r
259 *----------------------------------------------------------------------------*/\r
260 \r
261 void DispTaskMsg(void)\r
262 {\r
263         char Buf[FMAX_PATH+1];\r
264 \r
265         strcpy(Buf, AskTmpFilePath());\r
266         SetYenTail(Buf);\r
267         strcat(Buf, "_ffftp.tsk");\r
268 \r
269         if(SaveTaskMsg(Buf) == FFFTP_SUCCESS)\r
270         {\r
271                 AddTempFileList(Buf);\r
272                 ExecViewer(Buf, 0);\r
273         }\r
274         return;\r
275 }\r
276 \r
277 \r
278 /*----- デバッグコンソールにメッセージを表示する ------------------------------\r
279 *\r
280 *       Parameter\r
281 *               char *szFormat : フォーマット文字列\r
282 *               ... : パラメータ\r
283 *\r
284 *       Return Value\r
285 *               なし\r
286 *----------------------------------------------------------------------------*/\r
287 \r
288 void DoPrintf(char *szFormat, ...)\r
289 {\r
290         va_list vaArgs;\r
291         char *szBuf;\r
292 //      DWORD Tmp;\r
293 \r
294 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "11111\n", 6, &Tmp, NULL);\r
295         while(WaitForSingleObject(DispLogSemaphore2, 1) == WAIT_TIMEOUT)\r
296                 BackgrndMessageProc();\r
297 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "22222\n", 6, &Tmp, NULL);\r
298 \r
299         if(DebugConsole == YES)\r
300         {\r
301                 if((szBuf = malloc(10*1024)) != NULL)\r
302                 {\r
303                         va_start(vaArgs, szFormat);\r
304                         if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)\r
305                         {\r
306                                 SetTaskMsg("## %s", szBuf);\r
307 \r
308 //#pragma aaa\r
309 //                              WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL);\r
310 //                              WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL);\r
311                         }\r
312                         va_end(vaArgs);\r
313                         free(szBuf);\r
314                 }\r
315         }\r
316 \r
317 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "33333\n", 6, &Tmp, NULL);\r
318         ReleaseSemaphore(DispLogSemaphore2, 1, NULL);\r
319 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "44444\n", 6, &Tmp, NULL);\r
320 \r
321         return;\r
322 }\r
323 \r
324 \r
325 /*----- デバッグコンソールにメッセージを表示する ------------------------------\r
326 *\r
327 *       Parameter\r
328 *               char *szFormat : フォーマット文字列\r
329 *               ... : パラメータ\r
330 *\r
331 *       Return Value\r
332 *               なし\r
333 *----------------------------------------------------------------------------*/\r
334 \r
335 void DoPrintf2(char *szFormat, ...)\r
336 {\r
337         va_list vaArgs;\r
338         char *szBuf;\r
339         DWORD Tmp;\r
340 \r
341 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "11111111\n", 9, &Tmp, NULL);\r
342         while(WaitForSingleObject(DispLogSemaphore2, 1) == WAIT_TIMEOUT)\r
343                 BackgrndMessageProc();\r
344 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "22222222\n", 9, &Tmp, NULL);\r
345 \r
346         if((szBuf = malloc(10*1024)) != NULL)\r
347         {\r
348                 va_start(vaArgs, szFormat);\r
349                 if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)\r
350                 {\r
351                         WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL);\r
352                         WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL);\r
353                 }\r
354                 va_end(vaArgs);\r
355                 free(szBuf);\r
356         }\r
357 \r
358 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "33333333\n", 9, &Tmp, NULL);\r
359         ReleaseSemaphore(DispLogSemaphore2, 1, NULL);\r
360 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "44444444\n", 9, &Tmp, NULL);\r
361 \r
362         return;\r
363 }\r
364 \r
365 \r