import sys
import os.path
import ctypes
from optparse import OptionParser
from pynorm.core import libnorm, NormEventStruct
import pynorm.constants as c
USAGE = 'usage: %s [options] <cacheDir>' % sys.argv[0]
DEFAULT_ADDR = '224.1.2.3'
DEFAULT_PORT = 6003
def get_option_parser():
parser = OptionParser(usage=USAGE)
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
parser.add_option('-a', '--address'
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
parser.add_option('-p', '--port', type=int,
help='The port number to listen on (default %i)' % DEFAULT_PORT)
parser.add_option('-i', '--iface',
help='The inteface to transmit multicast on.')
return parser
def main(argv):
(opts, args) = get_option_parser().parse_args(argv)
if len(args) != 2:
print get_option_parser().get_usage()
return 1
path = os.path.abspath(args[1])
instance = libnorm.NormCreateInstance(False)
session = libnorm.NormCreateSession(instance, opts.address, opts.port,
c.NORM_NODE_ANY)
if opts.iface:
libnorm.NormSetMulticastInterface(session, opts.iface)
libnorm.NormSetCacheDirectory(instance, path)
libnorm.NormStartReceiver(session, 1024*1024)
theEvent = NormEventStruct()
try:
while libnorm.NormGetNextEvent(instance, ctypes.byref(theEvent)):
if theEvent.type == c.NORM_RX_OBJECT_NEW:
print 'rawRecv.py: NORM_RX_OBJECT_NEW event ...'
elif theEvent.type == c.NORM_RX_OBJECT_INFO:
print 'rafRecv.py: NORM_RX_OBJECT_INFO event ...'
if c.NORM_OBJECT_FILE == libnorm.NormObjectGetType(theEvent.object):
length = libnorm.NormObjectGetInfoLength(theEvent.object)
buffer = ctypes.create_string_buffer(length)
recv = libnorm.NormObjectGetInfo(theEvent.object, buffer, length)
if recv == 0:
print 'Error'
filename = os.path.join(path, buffer.value)
print 'Filename - %s' % filename
libnorm.NormFileRename(theEvent.object, filename)
elif theEvent.type == c.NORM_RX_OBJECT_UPDATED:
size = libnorm.NormObjectGetSize(theEvent.object)
completed = size - libnorm.NormObjectGetBytesPending(theEvent.object)
percent = 100.0 * (float(completed) / float(size))
print '%.1f completed' % percent
elif theEvent.type == c.NORM_RX_OBJECT_COMPLETED:
print 'Complete'
return 0
elif theEvent.type == c.NORM_RX_OBJECT_ABORTED:
print 'Aborted'
return 0
elif theEvent.type == c.NORM_REMOTE_SENDER_NEW:
print 'New sender'
elif theEvent.type == c.NORM_REMOTE_SENDER_ACTIVE:
print 'Sender active'
elif theEvent.type == c.NORM_REMOTE_SENDER_INACTIVE:
print 'Sender inactive'
except KeyboardInterrupt:
pass
libnorm.NormStopReceiver(session)
libnorm.NormDestroySession(session)
libnorm.NormDestroyInstance(instance)
print 'Exiting.'
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv))