import repository from arizona
[raven.git] / lib / arizona-lib / download_indicator.py
1 #! /usr/bin/env python
2
3 """
4 Stork Project (http://www.cs.arizona.edu/stork/)
5 Module: download_indicator
6 Description:   Has a function 'download_indicator' which is used to show
7                progress bar while downloading.               
8 Programmed by Jeffry Johnston
9 """
10
11 import math
12 import arizonareport
13
14 glo_width = 70
15
16 def set_filename(filename):
17    """
18    <Purpose>
19       Set the file name for download_indicator function.
20       
21    <Arguments>
22       filename:
23          it will be set and used for download_indicator to show the file
24          name on the screen.
25    
26    <Exceptions>
27       TypeError:
28          If the filename passed in is not a string, TypeError is raised
29
30    <Side Effects>
31       Assign filename passed in to glo_filename.
32
33    <Returns>
34       None.
35    """
36    # if filename is not a string, then raise TypeError.
37    if not isinstance(filename, str): 
38       arizonareport.send_syslog(arizonareport.ERR, "set_filename(): 'filename' is incorrect")
39       raise TypeError
40
41    arizonareport.send_out_comma(0, filename + ":")
42
43
44
45
46
47 def get_width():
48    """ Returns the currently set console width, as set by set_width() """
49    return glo_width
50    
51    
52    
53
54
55 def set_width(width):
56    """
57    <Purpose>
58       Set the console width for download_indicator function.
59       
60    <Arguments>
61       width:
62          maximum width of the console text on the screen
63    
64    <Exceptions>
65       TypeError:
66          If the filename passed in is not a string, TypeError is raised
67
68    <Side Effects>
69       Assign filename passed in to glo_filename.
70
71    <Returns>
72       None.
73    """
74    global glo_width
75
76    # if width is not an int, then raise TypeError.
77    if not isinstance(width, int): 
78       arizonareport.send_syslog(arizonareport.ERR, "set_width(): 'width' is incorrect")
79       raise TypeError
80
81    glo_width = width
82
83
84
85
86
87 def download_indicator(block_count, block_size, file_size):
88    """
89    <Purpose>
90       Displays a progress indicator to show download progress [====     ]
91       
92    <Arguments>
93       block_count:
94          Number of blocks that have been downloaded.
95          Note: Bytes downloaded = block_count * block_size.
96
97       block_size:  
98          Size of each block.  
99
100       file_size:    
101          Size of the file in bytes.  
102    
103    <Exceptions>
104       None.
105
106    <Side Effects>
107       None.
108
109    <Returns>
110       None.
111    """
112    # find bar width
113    width = glo_width - (6 + 2 * len(str(file_size)))
114    
115    # calculate progress and amount downloaded 
116    bytes_downloaded = block_count * block_size
117    progress = int(math.ceil(width * bytes_downloaded / file_size))
118    if progress > width:
119       progress = width
120    if progress < 0:
121       progress = 0
122    
123    # generate progress indicator string
124    st = "\r" + "[" + ("=" * progress) + (" " * (width - progress)) + \
125         "] " + str(int(min(bytes_downloaded, file_size))) + "/" + \
126         str(file_size) + " "
127         
128    # did the indicator still end up too wide?  If so, cut it off so that 
129    # it does not wrap      
130    if len(st) > glo_width:
131       st = st[0:width - 3] + "..."
132
133    arizonareport.send_out_comma(0, st)
134