OSDN Git Service

Fix bugs of corruption on resuming downloading files larger than 4GB.
[ffftp/ffftp.git] / statuswin.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 \r
46 /*===== ローカルなワーク =====*/\r
47 \r
48 static HWND hWndSbar = NULL;\r
49 static int SbarColWidth[5] = { 70, 230, 410, 570, -1 };\r
50 \r
51 \r
52 \r
53 /*----- ステータスウインドウを作成する ----------------------------------------\r
54 *\r
55 *       Parameter\r
56 *               HWND hWnd : 親ウインドウのウインドウハンドル\r
57 *               HINSTANCE hInst : インスタンスハンドル\r
58 *\r
59 *       Return Value\r
60 *               int ステータス\r
61 *                       FFFTP_SUCCESS/FFFTP_FAIL\r
62 *----------------------------------------------------------------------------*/\r
63 \r
64 int MakeStatusBarWindow(HWND hWnd, HINSTANCE hInst)\r
65 {\r
66         int Sts;\r
67 \r
68         Sts = FFFTP_FAIL;\r
69         hWndSbar = CreateWindowEx(0,\r
70                         STATUSCLASSNAME, NULL,\r
71                         WS_CHILD | SBS_SIZEGRIP | WS_CLIPSIBLINGS | SBT_NOBORDERS,\r
72                         0, 0, 0, 0,\r
73                         hWnd, (HMENU)1500, hInst, NULL);\r
74 \r
75         if(hWndSbar != NULL)\r
76         {\r
77                 SendMessage(hWndSbar, SB_SETPARTS, sizeof(SbarColWidth)/sizeof(int), (LPARAM)SbarColWidth);\r
78                 ShowWindow(hWndSbar, SW_SHOW);\r
79                 Sts = FFFTP_SUCCESS;\r
80         }\r
81         return(Sts);\r
82 }\r
83 \r
84 \r
85 /*----- ステータスウインドウを削除 --------------------------------------------\r
86 *\r
87 *       Parameter\r
88 *               なし\r
89 *\r
90 *       Return Value\r
91 *               なし\r
92 *----------------------------------------------------------------------------*/\r
93 \r
94 void DeleteStatusBarWindow(void)\r
95 {\r
96         if(hWndSbar != NULL)\r
97                 DestroyWindow(hWndSbar);\r
98         return;\r
99 }\r
100 \r
101 \r
102 /*----- ステータスウインドウのウインドウハンドルを返す ------------------------\r
103 *\r
104 *       Parameter\r
105 *               なし\r
106 *\r
107 *       Return Value\r
108 *               HWND ウインドウハンドル\r
109 *----------------------------------------------------------------------------*/\r
110 \r
111 HWND GetSbarWnd(void)\r
112 {\r
113         return(hWndSbar);\r
114 }\r
115 \r
116 \r
117 /*----- カレントウインドウを表示 ----------------------------------------------\r
118 *\r
119 *       Parameter\r
120 *               int Win : ウインドウ番号 (WIN_xxx : -1=なし)\r
121 *\r
122 *       Return Value\r
123 *               なし\r
124 *----------------------------------------------------------------------------*/\r
125 \r
126 void DispCurrentWindow(int Win)\r
127 {\r
128         if(Win == WIN_LOCAL)\r
129                 SendMessage(GetSbarWnd(), SB_SETTEXT, 0 | 0, (LPARAM)MSGJPN245);\r
130         else if(Win == WIN_REMOTE)\r
131                 SendMessage(GetSbarWnd(), SB_SETTEXT, 0 | 0, (LPARAM)MSGJPN246);\r
132         else\r
133                 SendMessage(GetSbarWnd(), SB_SETTEXT, 0 | 0, (LPARAM)"");\r
134         return;\r
135 }\r
136 \r
137 \r
138 /*----- 選択されているファイル数とサイズを表示 --------------------------------\r
139 *\r
140 *       Parameter\r
141 *               なし\r
142 *\r
143 *       Return Value\r
144 *               なし\r
145 *----------------------------------------------------------------------------*/\r
146 \r
147 void DispSelectedSpace(void)\r
148 {\r
149         char Buf1[50];\r
150         char Buf2[50];\r
151         int Win;\r
152 \r
153         Win = WIN_LOCAL;\r
154         if(GetFocus() == GetRemoteHwnd())\r
155                 Win = WIN_REMOTE;\r
156 \r
157         MakeSizeString(GetSelectedTotalSize(Win), Buf1);\r
158         sprintf(Buf2, MSGJPN247, GetSelectedCount(Win), Buf1);\r
159         SendMessage(GetSbarWnd(), SB_SETTEXT, 1 | 0, (LPARAM)Buf2);\r
160         return;\r
161 }\r
162 \r
163 \r
164 /*----- ローカル側の空き容量を表示 --------------------------------------------\r
165 *\r
166 *       Parameter\r
167 *               char *Path : パス名\r
168 *\r
169 *       Return Value\r
170 *               なし\r
171 *----------------------------------------------------------------------------*/\r
172 \r
173 void DispLocalFreeSpace(char *Path)\r
174 {\r
175         char Buf[40];\r
176 \r
177         sprintf(Buf, MSGJPN248, AskLocalFreeSpace(Path));\r
178         SendMessage(GetSbarWnd(), SB_SETTEXT, 2 | 0, (LPARAM)Buf);\r
179         return;\r
180 }\r
181 \r
182 \r
183 /*----- 転送するファイルの数を表示 --------------------------------------------\r
184 *\r
185 *       Parameter\r
186 *               なし\r
187 *\r
188 *       Return Value\r
189 *               なし\r
190 *----------------------------------------------------------------------------*/\r
191 \r
192 void DispTransferFiles(void)\r
193 {\r
194         char Buf[50];\r
195 \r
196         sprintf(Buf, MSGJPN249, AskTransferFileNum());\r
197         SendMessage(GetSbarWnd(), SB_SETTEXT, 3 | 0, (LPARAM)Buf);\r
198         return;\r
199 }\r
200 \r
201 \r
202 /*----- 受信中のバイト数を表示 ------------------------------------------------\r
203 *\r
204 *       Parameter\r
205 *               LONGLONG Size : バイト数 (-1=表示を消す)\r
206 *\r
207 *       Return Value\r
208 *               なし\r
209 *----------------------------------------------------------------------------*/\r
210 \r
211 void DispDownloadSize(LONGLONG Size)\r
212 {\r
213         char Buf[50];\r
214         char Tmp[50];\r
215 \r
216         strcpy(Buf, "");\r
217         if(Size >= 0)\r
218         {\r
219                 MakeSizeString((double)Size, Tmp);\r
220                 sprintf(Buf, MSGJPN250, Tmp);\r
221         }\r
222         SendMessage(GetSbarWnd(), SB_SETTEXT, 4 | 0, (LPARAM)Buf);\r
223         return;\r
224 }\r
225 \r
226 \r