- From: Richard Atterer <richard@list03.atterer.net>
- Date: Mon, 3 Mar 2003 02:11:58 +0100
- To: www-lib@w3.org
On Wed, Feb 12, 2003 at 06:34:29PM +0100, Richard Atterer wrote: > Pausing a download while leaving the connection open > [...] The code I posted was incorrect. It worked most of the time, but it failed if you paused the download, then continued it, and then stopped it (by deleting the request object), because the wrong HTEvent object was re-registered when continuing. The following code is hopefully correct - it Works For Me... The part for finding the net object is the same: /* The HTNet object whose socket we'll unregister from the event loop. This will prevent more data from being delivered to it, effectively pausing the request. */ HTNet* net = HTRequest_net(request); unsigned protocol = HTProtocol_id(HTNet_protocol(net)); if (protocol == 21) { /* Protocol is FTP, which uses a control connection (which corresponds to the main HTNet object) and a data connection. We need the HTNet object for the latter. */ ftp_ctrl* ctrl = static_cast<ftp_ctrl*>(HTNet_context(net)); net = ctrl->dnet; } But to pause the download, better use: HTChannel* channel = HTHost_channel(HTNet_host(net)); HTEvent_unregister(HTChannel_socket(channel), HTEvent_READ); And to continue downloading, use: HTHost* host = HTNet_host(net); HTHost_unregister(host, net, HTEvent_READ); HTHost_register(host, net, HTEvent_READ); Why this weird "unregister, then register" thing on continuing? Well, I first tried pause: HTHost_unregister(host, net, HTEvent_READ); continue: HTHost_register(host, net, HTEvent_READ); but it turns out that HTHost_unregister() only works for everything *except* HTEvent_READ - the source says this is in order to be notified of a closed connection %-(. My next attempt pause: HTEvent_unregister(HTChannel_socket(channel), HTEvent_READ); continue: HTHost_register(host, net, HTEvent_READ); failed because HTHost_register() checks a flag within the host object to avoid unregistering twice, and that flag is not cleared by the first call. So I take advantage of a bug: HTHost_unregister() clears the flag in question even though it subsequently refuses to unregister HTEvent_READ! Who says that libwww bugs can't be useful sometimes! ;-) Cheers, Richard -- __ _ |_) /| Richard Atterer | CS student at the Technische | GnuPG key: | \/¯| http://atterer.net | Universität München, Germany | 0x888354F7 ¯ '` ¯
Received on Sunday, 2 March 2003 20:15:09 UTC