class IMDbGzipParser { private LineParser parser; private Cancellable cancellable; public IMDbGzipParser (Cancellable? _cancellable) { cancellable = _cancellable; } public void parse (string path, LineParser? _parser) throws IOError { parser = _parser; var file = File.new_for_path (path); var gz_stream = new GzipInputStream (file.read (cancellable)); var stream = new DataInputStream (gz_stream); int total_in = 0; size_t length; string line; progress (0, 0); line = stream.read_line (out length, cancellable); while (line != null) { parser.parse_line (line); line = stream.read_line (out length, cancellable); if (gz_stream.total_in () > total_in) { total_in = (int) gz_stream.total_in (); progress (0, total_in); } } } public signal void progress (int total, int now); }