Mercurial > hg > xemacs-beta
annotate netinstall/geturl.cc @ 4690:257b468bf2ca
Move the #'query-coding-region implementation to C.
This is necessary because there is no reasonable way to access the
corresponding mswindows-multibyte functionality from Lisp, and we need such
functionality if we're going to have a reliable and portable
#'query-coding-region implementation. However, this change doesn't yet
provide #'query-coding-region for the mswindow-multibyte coding systems,
there should be no functional differences between an XEmacs with this change
and one without it.
src/ChangeLog addition:
2009-09-19 Aidan Kehoe <kehoea@parhasard.net>
Move the #'query-coding-region implementation to C.
This is necessary because there is no reasonable way to access the
corresponding mswindows-multibyte functionality from Lisp, and we
need such functionality if we're going to have a reliable and
portable #'query-coding-region implementation. However, this
change doesn't yet provide #'query-coding-region for the
mswindow-multibyte coding systems, there should be no functional
differences between an XEmacs with this change and one without it.
* mule-coding.c (struct fixed_width_coding_system):
Add a new coding system type, fixed_width, and implement it. It
uses the CCL infrastructure but has a much simpler creation API,
and its own query_method, formerly in lisp/mule/mule-coding.el.
* unicode.c:
Move the Unicode query method implementation here from
unicode.el.
* lisp.h: Declare Fmake_coding_system_internal, Fcopy_range_table
here.
* intl-win32.c (complex_vars_of_intl_win32):
Use Fmake_coding_system_internal, not Fmake_coding_system.
* general-slots.h: Add Qsucceeded, Qunencodable, Qinvalid_sequence
here.
* file-coding.h (enum coding_system_variant):
Add fixed_width_coding_system here.
(struct coding_system_methods):
Add query_method and query_lstream_method to the coding system
methods.
Provide flags for the query methods.
Declare the default query method; initialise it correctly in
INITIALIZE_CODING_SYSTEM_TYPE.
* file-coding.c (default_query_method):
New function, the default query method for coding systems that do
not set it. Moved from coding.el.
(make_coding_system_1):
Accept new elements in PROPS in #'make-coding-system; aliases, a
list of aliases; safe-chars and safe-charsets (these were
previously accepted but not saved); and category.
(Fmake_coding_system_internal):
New function, what used to be #'make-coding-system--on Mule
builds, we've now moved some of the functionality of this to
Lisp.
(Fcoding_system_canonical_name_p):
Move this earlier in the file, since it's now called from within
make_coding_system_1.
(Fquery_coding_region):
Move the implementation of this here, from coding.el.
(complex_vars_of_file_coding):
Call Fmake_coding_system_internal, not Fmake_coding_system;
specify safe-charsets properties when we're a mule build.
* extents.h (mouse_highlight_priority, Fset_extent_priority,
Fset_extent_face, Fmap_extents):
Make these available to other C files.
lisp/ChangeLog addition:
2009-09-19 Aidan Kehoe <kehoea@parhasard.net>
Move the #'query-coding-region implementation to C.
* coding.el:
Consolidate code that depends on the presence or absence of Mule
at the end of this file.
(default-query-coding-region, query-coding-region):
Move these functions to C.
(default-query-coding-region-safe-charset-skip-chars-map):
Remove this variable, the corresponding C variable is
Vdefault_query_coding_region_chartab_cache in file-coding.c.
(query-coding-string): Update docstring to reflect actual multiple
values, be more careful about not modifying a range table that
we're currently mapping over.
(encode-coding-char): Make the implementation of this simpler.
(featurep 'mule): Autoload #'make-coding-system from
mule/make-coding-system.el if we're a mule build; provide an
appropriate compiler macro.
Do various non-mule compatibility things if we're not a mule
build.
* update-elc.el (additional-dump-dependencies):
Add mule/make-coding-system as a dump time dependency if we're a
mule build.
* unicode.el (ccl-encode-to-ucs-2):
(decode-char):
(encode-char):
Move these earlier in the file, for the sake of some byte compile
warnings.
(unicode-query-coding-region):
Move this to unicode.c
* mule/make-coding-system.el:
New file, not dumped. Contains the functionality to rework the
arguments necessary for fixed-width coding systems, and contains
the implementation of #'make-coding-system, which now calls
#'make-coding-system-internal.
* mule/vietnamese.el (viscii):
* mule/latin.el (iso-8859-2):
(windows-1250):
(iso-8859-3):
(iso-8859-4):
(iso-8859-14):
(iso-8859-15):
(iso-8859-16):
(iso-8859-9):
(macintosh):
(windows-1252):
* mule/hebrew.el (iso-8859-8):
* mule/greek.el (iso-8859-7):
(windows-1253):
* mule/cyrillic.el (iso-8859-5):
(koi8-r):
(koi8-u):
(windows-1251):
(alternativnyj):
(koi8-ru):
(koi8-t):
(koi8-c):
(koi8-o):
* mule/arabic.el (iso-8859-6):
(windows-1256):
Move all these coding systems to being of type fixed-width, not of
type CCL. This allows the distinct query-coding-region for them to
be in C, something which will eventually allow us to implement
query-coding-region for the mswindows-multibyte coding systems.
* mule/general-late.el (posix-charset-to-coding-system-hash):
Document why we're pre-emptively persuading the byte compiler that
the ELC for this file needs to be written using escape-quoted.
Call #'set-unicode-query-skip-chars-args, now the Unicode
query-coding-region implementation is in C.
* mule/thai-xtis.el (tis-620):
Don't bother checking whether we're XEmacs or not here.
* mule/mule-coding.el:
Move the eight bit fixed-width functionality from this file to
make-coding-system.el.
tests/ChangeLog addition:
2009-09-19 Aidan Kehoe <kehoea@parhasard.net>
* automated/mule-tests.el:
Check a coding system's type, not an 8-bit-fixed property, for
whether that coding system should be treated as a fixed-width
coding system.
* automated/query-coding-tests.el:
Don't test the query coding functionality for mswindows-multibyte
coding systems, it's not yet implemented.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 19 Sep 2009 22:53:13 +0100 |
parents | 42a8626b741e |
children |
rev | line source |
---|---|
448 | 1 /* |
2 * Copyright (c) 2000, Red Hat, Inc. | |
3 * | |
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. | |
8 * | |
9 * A copy of the GNU General Public License can be found at | |
10 * http://www.gnu.org/ | |
11 * | |
12 * Written by DJ Delorie <dj@cygnus.com> | |
13 * | |
14 */ | |
15 | |
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 */ | |
19 | |
20 #include "win32.h" | |
21 #include "commctrl.h" | |
22 | |
23 #include <stdio.h> | |
24 #include <stdlib.h> | |
25 #include <errno.h> | |
26 | |
27 #include "dialog.h" | |
28 #include "geturl.h" | |
29 #include "resource.h" | |
30 #include "netio.h" | |
31 #include "msg.h" | |
32 #include "log.h" | |
33 | |
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; | |
41 | |
42 static BOOL | |
43 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code) | |
44 { | |
45 switch (id) | |
46 { | |
47 case IDCANCEL: | |
48 exit_setup (0); | |
49 } | |
50 return FALSE; | |
51 } | |
52 | |
53 static BOOL CALLBACK | |
54 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam) | |
55 { | |
56 switch (message) | |
57 { | |
58 case WM_INITDIALOG: | |
59 gw_dialog = h; | |
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); | |
64 return FALSE; | |
65 case WM_COMMAND: | |
66 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd); | |
67 } | |
68 return FALSE; | |
69 } | |
70 | |
71 static DWORD WINAPI | |
72 dialog (void *) | |
73 { | |
74 MSG m; | |
672 | 75 HWND lgw_dialog = CreateDialog (hinstance, MAKEINTRESOURCE (IDD_DLSTATUS), |
448 | 76 0, dialog_proc); |
672 | 77 ShowWindow (lgw_dialog, SW_SHOWNORMAL); |
78 UpdateWindow (lgw_dialog); | |
448 | 79 while (GetMessage (&m, 0, 0, 0) > 0) { |
80 TranslateMessage (&m); | |
81 DispatchMessage (&m); | |
82 } | |
83 return FALSE; | |
84 } | |
85 | |
86 static DWORD start_tics; | |
87 | |
88 static void | |
89 init_dialog (char *url, int length) | |
90 { | |
91 if (gw_dialog == 0) | |
92 { | |
93 DWORD tid; | |
94 HANDLE thread; | |
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)); | |
100 is_showing = 0; | |
101 } | |
102 char *sl=url, *cp; | |
103 for (cp=url; *cp; cp++) | |
104 if (*cp == '/' || *cp == '\\' || *cp == ':') | |
105 sl = cp+1; | |
106 max_bytes = length; | |
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); | |
112 if (!is_showing) | |
113 { | |
114 SetForegroundWindow (gw_dialog); | |
115 is_showing = 1; | |
116 } | |
117 start_tics = GetTickCount (); | |
118 } | |
119 | |
120 | |
121 static void | |
122 progress (int bytes) | |
123 { | |
124 static char buf[100]; | |
125 int kbps; | |
126 static DWORD last_tics = 0; | |
127 DWORD tics = GetTickCount (); | |
128 if (tics == start_tics) // to prevent division by zero | |
129 return; | |
130 if (tics < last_tics + 200) // to prevent flickering updates | |
131 return; | |
132 last_tics = tics; | |
133 | |
134 kbps = bytes / (tics - start_tics); | |
135 ShowWindow (gw_progress, (max_bytes > 0) ? SW_SHOW : SW_HIDE); | |
136 if (max_bytes > 100) | |
137 { | |
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); | |
142 } | |
143 else | |
144 sprintf (buf, "%d %d kb/s\n", bytes, kbps); | |
145 | |
146 SetWindowText (gw_rate, buf); | |
147 } | |
148 | |
149 struct GUBuf { | |
150 GUBuf *next; | |
151 int count; | |
152 char buf[2000]; | |
153 }; | |
154 | |
155 char * | |
156 get_url_to_string (char *_url) | |
157 { | |
158 log (LOG_BABBLE, "get_url_to_string %s", _url); | |
159 init_dialog (_url, 0); | |
160 NetIO *n = NetIO::open (_url); | |
161 if (!n || !n->ok ()) | |
162 { | |
163 delete n; | |
164 log (LOG_BABBLE, "get_url_to_string failed!"); | |
165 return 0; | |
166 } | |
167 | |
168 if (n->file_size) | |
169 max_bytes = n->file_size; | |
170 | |
171 GUBuf *bufs = 0; | |
172 GUBuf **nextp = &bufs; | |
173 int total_bytes = 1; /* for the NUL */ | |
174 progress (0); | |
175 while (1) | |
176 { | |
177 GUBuf *b = new GUBuf; | |
178 *nextp = b; | |
179 b->next = 0; | |
180 nextp = &(b->next); | |
181 | |
182 b->count = n->read (b->buf, sizeof (b->buf)); | |
183 if (b->count <= 0) | |
184 break; | |
185 total_bytes += b->count; | |
186 progress (total_bytes); | |
187 } | |
188 | |
189 char *rv = (char *) malloc (total_bytes); | |
190 char *rvp = rv; | |
191 while (bufs && bufs->count > 0) | |
192 { | |
193 GUBuf *tmp = bufs->next; | |
194 memcpy (rvp, bufs->buf, bufs->count); | |
195 rvp += bufs->count; | |
196 delete bufs; | |
197 bufs = tmp; | |
198 } | |
199 *rvp = 0; | |
672 | 200 |
201 if (n) | |
202 delete n; | |
203 | |
448 | 204 return rv; |
205 } | |
206 | |
207 int | |
208 get_url_to_file (char *_url, char *_filename, int expected_length) | |
209 { | |
210 log (LOG_BABBLE, "get_url_to_file %s %s", _url, _filename); | |
211 init_dialog (_url, expected_length); | |
212 | |
213 remove (_filename); /* but ignore errors */ | |
214 | |
215 NetIO *n = NetIO::open (_url); | |
216 if (!n || !n->ok ()) | |
217 { | |
218 delete n; | |
219 log (LOG_BABBLE, "get_url_to_file failed!"); | |
220 return 1; | |
221 } | |
222 | |
223 FILE *f = fopen (_filename, "wb"); | |
224 if (!f) | |
225 { | |
226 char *err = strerror (errno); | |
227 if (!err) | |
228 err = "(unknown error)"; | |
229 fatal (IDS_ERR_OPEN_WRITE, _filename, err); | |
230 } | |
231 | |
232 if (n->file_size) | |
233 max_bytes = n->file_size; | |
234 | |
235 int total_bytes = 0; | |
236 progress (0); | |
237 while (1) | |
238 { | |
239 char buf[8192]; | |
240 int count; | |
241 count = n->read (buf, sizeof (buf)); | |
242 if (count <= 0) | |
243 break; | |
244 fwrite (buf, 1, count, f); | |
245 total_bytes += count; | |
246 progress (total_bytes); | |
247 } | |
248 | |
249 fclose (f); | |
250 | |
672 | 251 if (n) |
252 delete n; | |
253 | |
448 | 254 return 0; |
255 } | |
256 | |
257 void | |
258 dismiss_url_status_dialog () | |
259 { | |
260 ShowWindow (gw_dialog, SW_HIDE); | |
261 is_showing = 0; | |
262 } |