1#!/usr/bin/env python
2'''
3Simple NORM file receiver example app using Python NORM API
4'''
5
6import sys, os.path
7from optparse import OptionParser
8
9import pynorm
10
11USAGE = 'usage: %s [options] <cacheDir>' % sys.argv[0]
12DEFAULT_ADDR = '224.1.2.3'
13DEFAULT_PORT = 6003
14
15def get_option_parser():
16    parser = OptionParser(usage=USAGE)
17    parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
18
19    parser.add_option('-a', '--address',
20            help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
21    parser.add_option('-p', '--port', type=int,
22            help='The port number to listen on (default %i)' % DEFAULT_PORT)
23    parser.add_option('-i', '--iface',
24            help='The inteface to transmit multicast on.')
25    return parser
26
27def main(argv):
28    (opts, args) = get_option_parser().parse_args(argv)
29
30    if len(args) != 2:
31        print get_option_parser().get_usage()
32        return 1
33
34    path = os.path.abspath(args[1])
35
36    instance = pynorm.Instance()
37    instance.setCacheDirectory(path)
38
39    session = instance.createSession(opts.address, opts.port)
40    if opts.iface:
41        session.setMulticastInterface(opts.iface)
42    session.startReceiver(1024*1024)
43
44    try:
45        for event in instance:
46            if event == 'NORM_RX_OBJECT_INFO':
47                event.object.filename = os.path.join(path, event.object.info)
48                print 'Downloading file %s' % event.object.filename
49
50            elif event == 'NORM_RX_OBJECT_UPDATED':
51                print 'File %s - %i bytes left to download' % (
52                        event.object.filename, event.object.bytesPending)
53
54            elif event == 'NORM_RX_OBJECT_COMPLETED':
55                print 'File %s completed' % event.object.filename
56                return 0
57
58            elif event == 'NORM_RX_OBJECT_ABORTED':
59                print 'File %s aborted' % event.object.filename
60                return 1
61
62            else:
63                print event
64    except KeyboardInterrupt:
65        pass
66
67    print 'Exiting.'
68    return 0
69
70if __name__ == '__main__':
71    sys.exit(main(sys.argv))
72