Merge from trunk
[plcapi.git] / trunk / pycurl / tests / test_gtk.py
diff --git a/trunk/pycurl/tests/test_gtk.py b/trunk/pycurl/tests/test_gtk.py
new file mode 100644 (file)
index 0000000..9626310
--- /dev/null
@@ -0,0 +1,93 @@
+#! /usr/bin/env python
+# -*- coding: iso-8859-1 -*-
+# vi:ts=4:et
+# $Id$
+
+import sys, threading
+from gtk import *
+import pycurl
+
+# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see
+# the libcurl tutorial for more info.
+try:
+    import signal
+    from signal import SIGPIPE, SIG_IGN
+    signal.signal(signal.SIGPIPE, signal.SIG_IGN)
+except ImportError:
+    pass
+
+
+class ProgressBar:
+    def __init__(self, uri):
+        self.round = 0.0
+        win = GtkDialog()
+        win.set_title("PycURL progress")
+        win.show()
+        vbox = GtkVBox(spacing=5)
+        vbox.set_border_width(10)
+        win.vbox.pack_start(vbox)
+        win.set_default_size(200, 20)
+        vbox.show()
+        label = GtkLabel("Downloading %s" % uri)
+        label.set_alignment(0, 0.5)
+        vbox.pack_start(label, expand=FALSE)
+        label.show()
+        pbar = GtkProgressBar()
+        pbar.show()
+        self.pbar = pbar
+        vbox.pack_start(pbar)
+        win.connect("destroy", self.close_app)
+        win.connect("delete_event", self.close_app)
+
+    def progress(self, download_t, download_d, upload_t, upload_d):
+        threads_enter()
+        if download_t == 0:
+            self.round = self.round + 0.1
+            if self.round >= 1.0:  self.round = 0.0
+        else:
+            self.round = float(download_d) / float(download_t)
+        self.pbar.update(self.round)
+        threads_leave()
+
+    def mainloop(self):
+        threads_enter()
+        mainloop()
+        threads_leave()
+
+    def close_app(self, *args):
+        args[0].destroy()
+        mainquit()
+
+
+class Test(threading.Thread):
+    def __init__(self, url, target_file, progress):
+        threading.Thread.__init__(self)
+        self.target_file = target_file
+        self.progress = progress
+        self.curl = pycurl.Curl()
+        self.curl.setopt(pycurl.URL, url)
+        self.curl.setopt(pycurl.WRITEDATA, self.target_file)
+        self.curl.setopt(pycurl.FOLLOWLOCATION, 1)
+        self.curl.setopt(pycurl.NOPROGRESS, 0)
+        self.curl.setopt(pycurl.PROGRESSFUNCTION, self.progress)
+        self.curl.setopt(pycurl.MAXREDIRS, 5)
+        self.curl.setopt(pycurl.NOSIGNAL, 1)
+
+    def run(self):
+        self.curl.perform()
+        self.curl.close()
+        self.target_file.close()
+        self.progress(1.0, 1.0, 0, 0)
+
+
+# Check command line args
+if len(sys.argv) < 3:
+    print "Usage: %s <URL> <filename>" % sys.argv[0]
+    raise SystemExit
+
+# Make a progress bar window
+p = ProgressBar(sys.argv[1])
+# Start thread for fetching url
+Test(sys.argv[1], open(sys.argv[2], 'wb'), p.progress).start()
+# Enter the GTK mainloop
+p.mainloop()