1 class IMDbFtpDownloader {
3 private ZLib.InflateStream strm;
5 private char[] buf_out;
7 private LineParser parser;
8 private Cancellable cancellable;
10 [CCode (instance_pos = -1)]
11 size_t write_callback (void *buffer, size_t size, size_t nmemb) {
12 if (cancellable != null && cancellable.is_cancelled ())
14 strm.next_in = buffer;
15 strm.avail_in = (uint) (size * nmemb);
16 if (strm.avail_in == 0)
20 strm.next_out = (char*) buf_out + have;
21 strm.avail_out = buf_out.length - have;
23 char* p = (char*) buf_out;
25 var ret = strm.inflate (ZLib.Flush.NO_FLUSH);
26 assert (ret != ZLib.Status.STREAM_ERROR);
27 if (ret == ZLib.Status.NEED_DICT)
28 ret = ZLib.Status.DATA_ERROR;
30 case ZLib.Status.DATA_ERROR:
31 case ZLib.Status.MEM_ERROR:
35 have = buf_out.length - strm.avail_out;
39 for (int i = 0; i < have; i++, j++) {
43 parser.parse_line ((string) l);
49 Memory.copy (p, l, j);
54 } while (strm.avail_out == 0);
59 int progress_callback (double dltotal, double dlnow, double ultotal, double ulnow) {
60 if (cancellable != null && cancellable.is_cancelled ())
63 int p = (int) (100 * dlnow / dltotal);
72 public IMDbFtpDownloader (Cancellable? _cancellable) {
73 cancellable = _cancellable;
74 curl = new Curl.EasyHandle ();
75 curl.setopt (Curl.Option.WRITEFUNCTION, write_callback);
76 curl.setopt (Curl.Option.WRITEDATA, this);
77 curl.setopt (Curl.Option.NOPROGRESS, 0L);
78 curl.setopt (Curl.Option.PROGRESSFUNCTION, progress_callback);
79 curl.setopt (Curl.Option.PROGRESSDATA, this);
80 buf_out = new char[16384];
83 public void download (string url, LineParser? _parser) throws IOError {
84 curl.setopt (Curl.Option.URL, url);
89 strm = ZLib.InflateStream.full (15 | 32);
91 var res = curl.perform ();
92 if (Curl.Code.ABORTED_BY_CALLBACK == res) {
93 throw new IOError.CANCELLED ("Download cancelled.");
97 public signal void progress_changed (int percent);