Merge from trunk
[plcapi.git] / trunk / pycurl / tests / test_gtk.py
1 #! /usr/bin/env python
2 # -*- coding: iso-8859-1 -*-
3 # vi:ts=4:et
4 # $Id$
5
6 import sys, threading
7 from gtk import *
8 import pycurl
9
10 # We should ignore SIGPIPE when using pycurl.NOSIGNAL - see
11 # the libcurl tutorial for more info.
12 try:
13     import signal
14     from signal import SIGPIPE, SIG_IGN
15     signal.signal(signal.SIGPIPE, signal.SIG_IGN)
16 except ImportError:
17     pass
18
19
20 class ProgressBar:
21     def __init__(self, uri):
22         self.round = 0.0
23         win = GtkDialog()
24         win.set_title("PycURL progress")
25         win.show()
26         vbox = GtkVBox(spacing=5)
27         vbox.set_border_width(10)
28         win.vbox.pack_start(vbox)
29         win.set_default_size(200, 20)
30         vbox.show()
31         label = GtkLabel("Downloading %s" % uri)
32         label.set_alignment(0, 0.5)
33         vbox.pack_start(label, expand=FALSE)
34         label.show()
35         pbar = GtkProgressBar()
36         pbar.show()
37         self.pbar = pbar
38         vbox.pack_start(pbar)
39         win.connect("destroy", self.close_app)
40         win.connect("delete_event", self.close_app)
41
42     def progress(self, download_t, download_d, upload_t, upload_d):
43         threads_enter()
44         if download_t == 0:
45             self.round = self.round + 0.1
46             if self.round >= 1.0:  self.round = 0.0
47         else:
48             self.round = float(download_d) / float(download_t)
49         self.pbar.update(self.round)
50         threads_leave()
51
52     def mainloop(self):
53         threads_enter()
54         mainloop()
55         threads_leave()
56
57     def close_app(self, *args):
58         args[0].destroy()
59         mainquit()
60
61
62 class Test(threading.Thread):
63     def __init__(self, url, target_file, progress):
64         threading.Thread.__init__(self)
65         self.target_file = target_file
66         self.progress = progress
67         self.curl = pycurl.Curl()
68         self.curl.setopt(pycurl.URL, url)
69         self.curl.setopt(pycurl.WRITEDATA, self.target_file)
70         self.curl.setopt(pycurl.FOLLOWLOCATION, 1)
71         self.curl.setopt(pycurl.NOPROGRESS, 0)
72         self.curl.setopt(pycurl.PROGRESSFUNCTION, self.progress)
73         self.curl.setopt(pycurl.MAXREDIRS, 5)
74         self.curl.setopt(pycurl.NOSIGNAL, 1)
75
76     def run(self):
77         self.curl.perform()
78         self.curl.close()
79         self.target_file.close()
80         self.progress(1.0, 1.0, 0, 0)
81
82
83 # Check command line args
84 if len(sys.argv) < 3:
85     print "Usage: %s <URL> <filename>" % sys.argv[0]
86     raise SystemExit
87
88 # Make a progress bar window
89 p = ProgressBar(sys.argv[1])
90 # Start thread for fetching url
91 Test(sys.argv[1], open(sys.argv[2], 'wb'), p.progress).start()
92 # Enter the GTK mainloop
93 p.mainloop()