OSDN Git Service

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