OSDN Git Service

Fix bugs of Select File dialog.
[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 #define TASK_BUFSIZE    (16*1024)\r
49 \r
50 \r
51 \r
52 \r
53 /*===== 外部参照 =====*/\r
54 \r
55 extern int ClientWidth;\r
56 extern int SepaWidth;\r
57 extern int ListHeight;\r
58 \r
59 /* 設定値 */\r
60 extern int TaskHeight;\r
61 extern HFONT ListFont;\r
62 extern int DebugConsole;\r
63 // 古い処理内容を消去\r
64 extern int RemoveOldLog;\r
65 \r
66 /*===== ローカルなワーク =====*/\r
67 \r
68 static HWND hWndTask = NULL;\r
69 static HANDLE DispLogSemaphore;\r
70 static HANDLE DispLogSemaphore2;\r
71 \r
72 \r
73 \r
74 /*----- タスクウインドウを作成する --------------------------------------------\r
75 *\r
76 *       Parameter\r
77 *               HWND hWnd : 親ウインドウのウインドウハンドル\r
78 *               HINSTANCE hInst : インスタンスハンドル\r
79 *\r
80 *       Return Value\r
81 *               int ステータス\r
82 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
83 *----------------------------------------------------------------------------*/\r
84 \r
85 int MakeTaskWindow(HWND hWnd, HINSTANCE hInst)\r
86 {\r
87         int Sts;\r
88 \r
89         Sts = FFFTP_FAIL;\r
90         hWndTask = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
91                         "EDIT", NULL,\r
92                         WS_CHILD | WS_BORDER | ES_AUTOVSCROLL | WS_VSCROLL | ES_MULTILINE | ES_READONLY | WS_CLIPSIBLINGS,\r
93                         0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight,\r
94                         hWnd, (HMENU)1500, hInst, NULL);\r
95 \r
96         if(hWndTask != NULL)\r
97         {\r
98                 // Windows 9x系をサポートしないため不要\r
99 //              SendMessage(hWndTask, EM_LIMITTEXT, TASK_BUFSIZE, 0);\r
100                 SendMessage(hWndTask, EM_LIMITTEXT, 0x7fffffff, 0);\r
101 \r
102                 if(ListFont != NULL)\r
103                         SendMessage(hWndTask, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
104 \r
105                 ShowWindow(hWndTask, SW_SHOW);\r
106                 Sts = FFFTP_SUCCESS;\r
107 \r
108                 DispLogSemaphore = CreateSemaphore(NULL, 1, 1, NULL);\r
109                 DispLogSemaphore2 = CreateSemaphore(NULL, 1, 1, NULL);\r
110 \r
111         }\r
112         return(Sts);\r
113 }\r
114 \r
115 \r
116 /*----- タスクウインドウを削除 ------------------------------------------------\r
117 *\r
118 *       Parameter\r
119 *               なし\r
120 *\r
121 *       Return Value\r
122 *               なし\r
123 *----------------------------------------------------------------------------*/\r
124 \r
125 void DeleteTaskWindow(void)\r
126 {\r
127         CloseHandle(DispLogSemaphore);\r
128         CloseHandle(DispLogSemaphore2);\r
129         if(hWndTask != NULL)\r
130                 DestroyWindow(hWndTask);\r
131         return;\r
132 }\r
133 \r
134 \r
135 /*----- タスクウインドウのウインドウハンドルを返す ----------------------------\r
136 *\r
137 *       Parameter\r
138 *               なし\r
139 *\r
140 *       Return Value\r
141 *               HWND ウインドウハンドル\r
142 *----------------------------------------------------------------------------*/\r
143 \r
144 HWND GetTaskWnd(void)\r
145 {\r
146         return(hWndTask);\r
147 }\r
148 \r
149 \r
150 /*----- タスクメッセージを表示する --------------------------------------------\r
151 *\r
152 *       Parameter\r
153 *               char *szFormat : フォーマット文字列\r
154 *               ... : パラメータ\r
155 *\r
156 *       Return Value\r
157 *               なし\r
158 *----------------------------------------------------------------------------*/\r
159 \r
160 void SetTaskMsg(char *szFormat, ...)\r
161 {\r
162         int Pos;\r
163         va_list vaArgs;\r
164         char *szBuf;\r
165 //      DWORD Tmp;\r
166 \r
167 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "111\n", 4, &Tmp, NULL);\r
168         while(WaitForSingleObject(DispLogSemaphore, 1) == WAIT_TIMEOUT)\r
169                 BackgrndMessageProc();\r
170 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "222\n", 4, &Tmp, NULL);\r
171 \r
172         if(hWndTask != NULL)\r
173         {\r
174                 if((szBuf = malloc(10*1024+3)) != NULL)\r
175                 {\r
176                         va_start(vaArgs, szFormat);\r
177                         if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)\r
178                         {\r
179 //#pragma aaa\r
180 //                              WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL);\r
181 //                              WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL);\r
182 \r
183                                 strcat(szBuf, "\r\n");\r
184                                 Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);\r
185 \r
186                                 /* テキストサイズのリミット値をチェック */\r
187                                 // Windows 9x系をサポートしないため不要\r
188                                 // 古い処理内容を消去\r
189 //                              if((Pos + strlen(szBuf)) >= TASK_BUFSIZE)\r
190 //                              {\r
191 //                                      /* リミットを越えそうなら、先頭部分を切り捨てる */\r
192 //                                      Pos = SendMessage(GetTaskWnd(), EM_LINEFROMCHAR, TASK_BUFSIZE/10, 0) + 1;\r
193 //                                      Pos = SendMessage(GetTaskWnd(), EM_LINEINDEX, Pos, 0);\r
194 //                                      SendMessage(GetTaskWnd(), EM_SETSEL, 0, Pos);\r
195 //                                      SendMessage(GetTaskWnd(), EM_REPLACESEL, FALSE, (LPARAM)"");\r
196 //\r
197 //                                      Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);\r
198 //                              }\r
199                                 if(RemoveOldLog == YES)\r
200                                 {\r
201                                         if((Pos + strlen(szBuf)) >= TASK_BUFSIZE)\r
202                                         {\r
203                                                 Pos = SendMessage(GetTaskWnd(), EM_LINEINDEX, 1, 0);\r
204                                                 SendMessage(GetTaskWnd(), EM_SETSEL, 0, Pos);\r
205                                                 SendMessage(GetTaskWnd(), EM_REPLACESEL, FALSE, (LPARAM)"");\r
206                                                 Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);\r
207                                         }\r
208                                 }\r
209 \r
210                                 SendMessage(GetTaskWnd(), EM_SETSEL, Pos, Pos);\r
211                                 SendMessage(GetTaskWnd(), EM_REPLACESEL, FALSE, (LPARAM)szBuf);\r
212                         }\r
213                         va_end(vaArgs);\r
214                         free(szBuf);\r
215                 }\r
216         }\r
217 \r
218 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "333\n", 4, &Tmp, NULL);\r
219         ReleaseSemaphore(DispLogSemaphore, 1, NULL);\r
220 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "444\n", 4, &Tmp, NULL);\r
221 \r
222         return;\r
223 }\r
224 \r
225 \r
226 /*----- タスクメッセージをファイルに保存する ----------------------------------\r
227 *\r
228 *       Parameter\r
229 *               char *Fname : ファイル名\r
230 *\r
231 *       Return Value\r
232 *               int ステータス\r
233 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
234 *----------------------------------------------------------------------------*/\r
235 \r
236 int SaveTaskMsg(char *Fname)\r
237 {\r
238         FILE *Strm;\r
239         int Size;\r
240         char *Buf;\r
241         int Sts;\r
242 \r
243 \r
244         Sts = FFFTP_FAIL;\r
245         Size = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);\r
246         if((Buf = malloc(Size)) != NULL)\r
247         {\r
248                 if((Strm = fopen(Fname, "wb")) != NULL)\r
249                 {\r
250                         SendMessage(GetTaskWnd(), WM_GETTEXT, Size, (LPARAM)Buf);\r
251                         if(fwrite(Buf, strlen(Buf), 1, Strm) == 1)\r
252                                 Sts = FFFTP_SUCCESS;\r
253                         fclose(Strm);\r
254 \r
255                         if(Sts == FFFTP_FAIL)\r
256                                 _unlink(Fname);\r
257                 }\r
258                 free(Buf);\r
259         }\r
260         return(Sts);\r
261 }\r
262 \r
263 \r
264 /*----- タスク内容をビューワで表示 --------------------------------------------\r
265 *\r
266 *       Parameter\r
267 *               なし\r
268 *\r
269 *       Return Value\r
270 *               なし\r
271 *----------------------------------------------------------------------------*/\r
272 \r
273 void DispTaskMsg(void)\r
274 {\r
275         char Buf[FMAX_PATH+1];\r
276 \r
277         strcpy(Buf, AskTmpFilePath());\r
278         SetYenTail(Buf);\r
279         strcat(Buf, "_ffftp.tsk");\r
280 \r
281         if(SaveTaskMsg(Buf) == FFFTP_SUCCESS)\r
282         {\r
283                 AddTempFileList(Buf);\r
284                 ExecViewer(Buf, 0);\r
285         }\r
286         return;\r
287 }\r
288 \r
289 \r
290 /*----- デバッグコンソールにメッセージを表示する ------------------------------\r
291 *\r
292 *       Parameter\r
293 *               char *szFormat : フォーマット文字列\r
294 *               ... : パラメータ\r
295 *\r
296 *       Return Value\r
297 *               なし\r
298 *----------------------------------------------------------------------------*/\r
299 \r
300 void DoPrintf(char *szFormat, ...)\r
301 {\r
302         va_list vaArgs;\r
303         char *szBuf;\r
304 //      DWORD Tmp;\r
305 \r
306 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "11111\n", 6, &Tmp, NULL);\r
307         while(WaitForSingleObject(DispLogSemaphore2, 1) == WAIT_TIMEOUT)\r
308                 BackgrndMessageProc();\r
309 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "22222\n", 6, &Tmp, NULL);\r
310 \r
311         if(DebugConsole == YES)\r
312         {\r
313                 if((szBuf = malloc(10*1024)) != NULL)\r
314                 {\r
315                         va_start(vaArgs, szFormat);\r
316                         if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)\r
317                         {\r
318                                 SetTaskMsg("## %s", szBuf);\r
319 \r
320 //#pragma aaa\r
321 //                              WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL);\r
322 //                              WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL);\r
323                         }\r
324                         va_end(vaArgs);\r
325                         free(szBuf);\r
326                 }\r
327         }\r
328 \r
329 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "33333\n", 6, &Tmp, NULL);\r
330         ReleaseSemaphore(DispLogSemaphore2, 1, NULL);\r
331 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "44444\n", 6, &Tmp, NULL);\r
332 \r
333         return;\r
334 }\r
335 \r
336 \r
337 /*----- デバッグコンソールにメッセージを表示する ------------------------------\r
338 *\r
339 *       Parameter\r
340 *               char *szFormat : フォーマット文字列\r
341 *               ... : パラメータ\r
342 *\r
343 *       Return Value\r
344 *               なし\r
345 *----------------------------------------------------------------------------*/\r
346 \r
347 void DoPrintf2(char *szFormat, ...)\r
348 {\r
349         va_list vaArgs;\r
350         char *szBuf;\r
351         DWORD Tmp;\r
352 \r
353 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "11111111\n", 9, &Tmp, NULL);\r
354         while(WaitForSingleObject(DispLogSemaphore2, 1) == WAIT_TIMEOUT)\r
355                 BackgrndMessageProc();\r
356 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "22222222\n", 9, &Tmp, NULL);\r
357 \r
358         if((szBuf = malloc(10*1024)) != NULL)\r
359         {\r
360                 va_start(vaArgs, szFormat);\r
361                 if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)\r
362                 {\r
363                         WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL);\r
364                         WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL);\r
365                 }\r
366                 va_end(vaArgs);\r
367                 free(szBuf);\r
368         }\r
369 \r
370 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "33333333\n", 9, &Tmp, NULL);\r
371         ReleaseSemaphore(DispLogSemaphore2, 1, NULL);\r
372 //WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "44444444\n", 9, &Tmp, NULL);\r
373 \r
374         return;\r
375 }\r
376 \r
377 \r