#!/usr/bin/python

import os,sys,re,commands

import gtk
import gtk.glade
import gtk.gdk as gdk
import gobject
import pango

from rhpl.translate import _, N_, textdomain

def checkDiscDir(dirname):
	if os.path.exists(os.path.join(dirname, '.discinfo') ):
		return True
	return False
	
def mountDisc():
	(mstatus, moutput)=commands.getstatusoutput('udisks --mount /dev/sr0 --mount-fstype iso9660')
	if (mstatus!=0) or ('Not a mountable file system' in moutput):
		###print " There may be something wrong with your system."
		return None
	else:
		(sstatus,sout)=commands.getstatusoutput('udisks --show-info /dev/sr0')
		pathline=re.findall('(mount paths:.*\s*$)',sout,re.M)
		path=pathline[0].strip('mount paths:')
		##if '/dev/sr0 is mounted' in moutput:
		##	print "/dev/sr0 is already mounted on %s"%(path,)
		####print path
		if  checkDiscDir(path):
			return path	
		return None

if os.path.exists("data/localinst.glade"):
	fn = "data/localinst.glade"
else:
	fn = "/usr/share/localinst/ui/localinst.glade"

class LocalInstaller:
	def __init__(self):
		self.xml = gtk.glade.XML(fn, "localinstWindow", domain = "localinst")

		self.mainwin = self.xml.get_widget("localinstWindow")
		self.mainwin.connect("delete_event", self._quit)

		i = self.xml.get_widget("image")
		imgfn = "/usr/share/localinst/pixmaps/localinst.png"
		i.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file(imgfn))

		self._connectSignal()

	def _connectSignal(self):
		sigs = { "on_cdinst_clicked": self.cdinst,
				 "on_folderinst_clicked": self.folderinst }
		self.xml.signal_autoconnect(sigs)

	def cdinst(self, *args):
		self.path = mountDisc()
		if not self.path:
			dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_NONE,
                                    (_("A CD-ROM has not been detected or it is invalid as software source. "
				      " Please insert a valid CD-ROM in the drive and Retry.")))

			dlg.set_position(gtk.WIN_POS_CENTER)
			dlg.set_modal(True)
			cancelButton = dlg.add_button('gtk-cancel', 0)	
			dlg.run()
			dlg.destroy()
			return
		self._quit()
		### os.system("touch /tmp/localinstmark")
		os.system("system-cdinstall-helper -r \"%s\"" % self.path)
		### os.system("udisks --unmount /dev/sr0") ##clean

	def folderinst(self, *args):
		self.folderchooser()
		if self.path != None:
			self._quit()
			### os.system("touch /tmp/localinstmark")
			os.system("system-cdinstall-helper -r \"%s\"" % self.path)

	def run(self):
		self.mainwin.show()
		gtk.main()
		      
	def _quit(self, *args):
		gtk.main_quit()
		
	def folderchooser(self):
		self.path = None
		xml = gtk.glade.XML(fn, "folderchooser", "localinst")
		dialog = xml.get_widget("folderchooser")
		dialog.show()
		while True:
                      rc = dialog.run()

                      if rc == gtk.RESPONSE_OK:
                               self.path = dialog.get_current_folder()
                               if os.path.exists(self.path + "/repodata/repomd.xml") != True :
                                          dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_NONE,
                                                                 (_("repository metadata (repomd.xml) not exist,  "
                                                                    "Please verify its path and try again")))
                                          dlg.set_position(gtk.WIN_POS_CENTER)
                                          dlg.set_modal(True)
                                          cancelButton = dlg.add_button('gtk-cancel', 0)
                                          dlg.run()
                                          dlg.destroy()
                               else :
                                     break
                      else:
                          self.path = None
                          break

                dialog.destroy()
                gtk.gdk.flush()


if __name__ == "__main__":
	textdomain("localinst")			
	gtk.glade.bindtextdomain("localinst", "/usr/share/locale")
	localinstobj = LocalInstaller()
	localinstobj.run()
