2 * Copyright (c) 2000, Red Hat, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by DJ Delorie <dj@cygnus.com>
16 /* The purpose of this file is to act as a pretty interface to
17 netio.cc. We add a progress dialog and some convenience functions
18 (like collect to string or file */
34 static int is_showing = 0;
35 static HWND gw_dialog = 0;
36 static HWND gw_url = 0;
37 static HWND gw_rate = 0;
38 static HWND gw_progress = 0;
39 static HANDLE init_event;
40 static int max_bytes = 0;
43 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code)
54 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
60 gw_url = GetDlgItem (h, IDC_DLS_URL);
61 gw_rate = GetDlgItem (h, IDC_DLS_RATE);
62 gw_progress = GetDlgItem (h, IDC_DLS_PROGRESS);
63 SetEvent (init_event);
66 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd);
75 HWND lgw_dialog = CreateDialog (hinstance, MAKEINTRESOURCE (IDD_DLSTATUS),
77 ShowWindow (lgw_dialog, SW_SHOWNORMAL);
78 UpdateWindow (lgw_dialog);
79 while (GetMessage (&m, 0, 0, 0) > 0) {
80 TranslateMessage (&m);
86 static DWORD start_tics;
89 init_dialog (char *url, int length)
95 init_event = CreateEvent (0, 0, 0, 0);
96 thread = CreateThread (0, 0, dialog, 0, 0, &tid);
97 WaitForSingleObject (init_event, 1000);
98 CloseHandle (init_event);
99 SendMessage (gw_progress, PBM_SETRANGE, 0, MAKELPARAM (0, 100));
103 for (cp=url; *cp; cp++)
104 if (*cp == '/' || *cp == '\\' || *cp == ':')
107 SetWindowText (gw_url, sl);
108 SetWindowText (gw_rate, "Connecting...");
109 SendMessage (gw_progress, PBM_SETPOS, (WPARAM) 0, 0);
110 ShowWindow (gw_progress, (length > 0) ? SW_SHOW : SW_HIDE);
111 ShowWindow (gw_dialog, SW_SHOWNORMAL);
114 SetForegroundWindow (gw_dialog);
117 start_tics = GetTickCount ();
124 static char buf[100];
126 static DWORD last_tics = 0;
127 DWORD tics = GetTickCount ();
128 if (tics == start_tics) // to prevent division by zero
130 if (tics < last_tics + 200) // to prevent flickering updates
134 kbps = bytes / (tics - start_tics);
135 ShowWindow (gw_progress, (max_bytes > 0) ? SW_SHOW : SW_HIDE);
138 int perc = bytes / (max_bytes / 100);
139 SendMessage (gw_progress, PBM_SETPOS, (WPARAM) perc, 0);
140 sprintf (buf, "%3d %% (%dk/%dk) %d kb/s\n",
141 perc, bytes/1000, max_bytes/1000, kbps);
144 sprintf (buf, "%d %d kb/s\n", bytes, kbps);
146 SetWindowText (gw_rate, buf);
156 get_url_to_string (char *_url)
158 log (LOG_BABBLE, "get_url_to_string %s", _url);
159 init_dialog (_url, 0);
160 NetIO *n = NetIO::open (_url);
164 log (LOG_BABBLE, "get_url_to_string failed!");
169 max_bytes = n->file_size;
172 GUBuf **nextp = &bufs;
173 int total_bytes = 1; /* for the NUL */
177 GUBuf *b = new GUBuf;
182 b->count = n->read (b->buf, sizeof (b->buf));
185 total_bytes += b->count;
186 progress (total_bytes);
189 char *rv = (char *) malloc (total_bytes);
191 while (bufs && bufs->count > 0)
193 GUBuf *tmp = bufs->next;
194 memcpy (rvp, bufs->buf, bufs->count);
208 get_url_to_file (char *_url, char *_filename, int expected_length)
210 log (LOG_BABBLE, "get_url_to_file %s %s", _url, _filename);
211 init_dialog (_url, expected_length);
213 remove (_filename); /* but ignore errors */
215 NetIO *n = NetIO::open (_url);
219 log (LOG_BABBLE, "get_url_to_file failed!");
223 FILE *f = fopen (_filename, "wb");
226 char *err = strerror (errno);
228 err = "(unknown error)";
229 fatal (IDS_ERR_OPEN_WRITE, _filename, err);
233 max_bytes = n->file_size;
241 count = n->read (buf, sizeof (buf));
244 fwrite (buf, 1, count, f);
245 total_bytes += count;
246 progress (total_bytes);
258 dismiss_url_status_dialog ()
260 ShowWindow (gw_dialog, SW_HIDE);