import dbus, gobject, avahi
from dbus import DBusException
from dbus.mainloop.glib import DBusGMainLoop
from string import split
import logging
import os, time
from urlgrabber.grabber import URLGrabber

LOG_FILENAME = '/var/log/autoclone.log'
TYPE = "_autoclone_noclassroomname._tcp"
files = {}
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)


def downloadFile(fileToDownload, source, port):
	if not os.path.exists(fileToDownload):
		g = URLGrabber()
	else:
		g = URLGrabber(reget="simple")

	url = "http://"+source+":"+port+"/"+fileToDownload

	try:
		local_filename = g.urlgrab(url)
	except:
		logging.debug("No se puede realizar la descarga de "+fileToDownload+" desde "+source+":"+port)
		time.sleep(600) 


def service_resolved(*args):
	val = str(args[2]).split("@")
	files[val[1]] = {'address' : str(args[7]), 'port': str(val[0])}

	if len(files)>0:
		for i in files:
			downloadFile(i, files[i]['address'], files[i]['port'])


def print_error(*args):
    print 'error_handler'
    print args[0]

def myhandler(interface, protocol, name, stype, domain, flags):
    #print "Found service '%s' type '%s' domain '%s' " % (name, stype, domain)

    if flags & avahi.LOOKUP_RESULT_LOCAL:
            # local service, skip
            pass

    server.ResolveService(interface, protocol, name, stype, domain, avahi.PROTO_UNSPEC, dbus.UInt32(0), reply_handler=service_resolved, error_handler=print_error)


if __name__ == '__main__':

	loop = DBusGMainLoop()
	bus = dbus.SystemBus(mainloop=loop)

	server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, '/'), 'org.freedesktop.Avahi.Server')

	sbrowser = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, TYPE, 'local', dbus.UInt32(0))), avahi.DBUS_INTERFACE_SERVICE_BROWSER)
	sbrowser.connect_to_signal("ItemNew", myhandler)

	gobject.MainLoop().run()
