1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\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
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
32 #include <winsock2.h>
\r
33 #include <windows.h>
\r
37 #include <mbstring.h>
\r
39 #include <windowsx.h>
\r
40 #include <commctrl.h>
\r
43 //#include <winsock.h>
\r
46 #include "resource.h"
\r
48 #define TASK_BUFSIZE (16*1024)
\r
53 /*===== 外部参照 =====*/
\r
55 extern int ClientWidth;
\r
56 extern int SepaWidth;
\r
57 extern int ListHeight;
\r
60 extern int TaskHeight;
\r
61 extern HFONT ListFont;
\r
62 extern int DebugConsole;
\r
64 extern int RemoveOldLog;
\r
66 /*===== ローカルなワーク =====*/
\r
68 static HWND hWndTask = NULL;
\r
69 static HANDLE DispLogSemaphore;
\r
70 static HANDLE DispLogSemaphore2;
\r
74 /*----- タスクウインドウを作成する --------------------------------------------
\r
77 * HWND hWnd : 親ウインドウのウインドウハンドル
\r
78 * HINSTANCE hInst : インスタンスハンドル
\r
82 * FFFTP_SUCCESS/FFFTP_FAIL
\r
83 *----------------------------------------------------------------------------*/
\r
85 int MakeTaskWindow(HWND hWnd, HINSTANCE hInst)
\r
91 // hWndTask = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,
\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
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
102 if(hWndTask != NULL)
\r
104 // Windows 9x系をサポートしないため不要
\r
105 // SendMessage(hWndTask, EM_LIMITTEXT, TASK_BUFSIZE, 0);
\r
106 SendMessage(hWndTask, EM_LIMITTEXT, 0x7fffffff, 0);
\r
108 if(ListFont != NULL)
\r
109 SendMessage(hWndTask, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));
\r
111 ShowWindow(hWndTask, SW_SHOW);
\r
112 Sts = FFFTP_SUCCESS;
\r
114 DispLogSemaphore = CreateSemaphore(NULL, 1, 1, NULL);
\r
115 DispLogSemaphore2 = CreateSemaphore(NULL, 1, 1, NULL);
\r
122 /*----- タスクウインドウを削除 ------------------------------------------------
\r
129 *----------------------------------------------------------------------------*/
\r
131 void DeleteTaskWindow(void)
\r
133 CloseHandle(DispLogSemaphore);
\r
134 CloseHandle(DispLogSemaphore2);
\r
135 if(hWndTask != NULL)
\r
136 DestroyWindow(hWndTask);
\r
141 /*----- タスクウインドウのウインドウハンドルを返す ----------------------------
\r
148 *----------------------------------------------------------------------------*/
\r
150 HWND GetTaskWnd(void)
\r
156 /*----- タスクメッセージを表示する --------------------------------------------
\r
159 * char *szFormat : フォーマット文字列
\r
164 *----------------------------------------------------------------------------*/
\r
166 void SetTaskMsg(char *szFormat, ...)
\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
178 if(hWndTask != NULL)
\r
180 if((szBuf = malloc(10*1024+3)) != NULL)
\r
182 va_start(vaArgs, szFormat);
\r
183 if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)
\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
189 strcat(szBuf, "\r\n");
\r
190 Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);
\r
192 /* テキストサイズのリミット値をチェック */
\r
193 // Windows 9x系をサポートしないため不要
\r
195 // if((Pos + strlen(szBuf)) >= TASK_BUFSIZE)
\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
203 // Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);
\r
205 if(RemoveOldLog == YES)
\r
207 if((Pos + strlen(szBuf)) >= TASK_BUFSIZE)
\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
216 SendMessage(GetTaskWnd(), EM_SETSEL, Pos, Pos);
\r
217 SendMessage(GetTaskWnd(), EM_REPLACESEL, FALSE, (LPARAM)szBuf);
\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
232 /*----- タスクメッセージをファイルに保存する ----------------------------------
\r
235 * char *Fname : ファイル名
\r
239 * FFFTP_SUCCESS/FFFTP_FAIL
\r
240 *----------------------------------------------------------------------------*/
\r
242 int SaveTaskMsg(char *Fname)
\r
251 Size = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0);
\r
252 if((Buf = malloc(Size)) != NULL)
\r
254 if((Strm = fopen(Fname, "wb")) != NULL)
\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
261 if(Sts == FFFTP_FAIL)
\r
270 /*----- タスク内容をビューワで表示 --------------------------------------------
\r
277 *----------------------------------------------------------------------------*/
\r
279 void DispTaskMsg(void)
\r
281 char Buf[FMAX_PATH+1];
\r
283 strcpy(Buf, AskTmpFilePath());
\r
285 strcat(Buf, "_ffftp.tsk");
\r
287 if(SaveTaskMsg(Buf) == FFFTP_SUCCESS)
\r
289 AddTempFileList(Buf);
\r
290 ExecViewer(Buf, 0);
\r
296 /*----- デバッグコンソールにメッセージを表示する ------------------------------
\r
299 * char *szFormat : フォーマット文字列
\r
304 *----------------------------------------------------------------------------*/
\r
306 void DoPrintf(char *szFormat, ...)
\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
317 if(DebugConsole == YES)
\r
319 if((szBuf = malloc(10*1024)) != NULL)
\r
321 va_start(vaArgs, szFormat);
\r
322 if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)
\r
324 SetTaskMsg("## %s", szBuf);
\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
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
343 /*----- デバッグコンソールにメッセージを表示する ------------------------------
\r
346 * char *szFormat : フォーマット文字列
\r
351 *----------------------------------------------------------------------------*/
\r
353 void DoPrintf2(char *szFormat, ...)
\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
364 if((szBuf = malloc(10*1024)) != NULL)
\r
366 va_start(vaArgs, szFormat);
\r
367 if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)
\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
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