OSDN Git Service

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