#!/usr/bin/python
# -*- coding: utf-8 -*-

import gtk
import gtk.glade
import os
from ConfigParser import *
import sys
from os.path import *
import popen2

# Quelldatei
def on_filechooserbutton1_selection_changed(widget):
	global infilename
	infilename = widget.get_filename()

# Zielverzeichnis
def on_filechooserbutton2_selection_changed(widget):
	global outpath
	outpath = widget.get_filename()

# E-Mail
def on_entry1_changed(widget):
	global email
	email = widget.get_text()

# Passwort
def on_entry2_changed(widget):
	global password
	password = widget.get_text()

# Login-Daten speichern
def on_checkbutton1_toggled(widget):
	global savelogin
	savelogin = widget.get_active()

# Dateien verifizieren
def on_checkbutton2_toggled(widget):
	global verify
	verify = widget.get_active()

# Schliessen
def on_button2_clicked(widget):
	if not config.has_section("settings"):
		config.add_section("settings")
	if savelogin:
		config.set("settings", "email", email)
		config.set("settings", "password", password)
	else:
		config.set("settings", "email", "")
		config.set("settings", "password", "")

	config.set("settings", "savelogin", str(savelogin))
	config.set("settings", "verify", str(verify))
	if infilename != None and infilename != "":
		config.set("settings", "lastfile", infilename)
	config.set("settings", "outputdir", outpath)
	
	file = open(configFile, 'w')
	config.write(file)
	file.close()
	gtk.main_quit()

# Dekodieren
def otrdecode(widget, overwrite):
	if overwrite:
		overwriteflag = " -f"
	else:
		overwriteflag = ""
	if verify:
		verifyflag = ""
	else:
		verifyflag = " -q"
	if infilename == None or infilename == "":
		widget.push(widget.get_context_id("Bitte erst Quelldatei auswählen"), "Bitte erst Quelldatei auswählen")
	elif email == "":
		widget.push(widget.get_context_id("Bitte erst E-Mail-Adresse eingeben"), "Bitte erst E-Mail-Adresse eingeben")
		
	elif password == "":
		widget.push(widget.get_context_id("Bitte erst Passwort eingeben"), "Bitte erst Passwort eingeben")
		
	else:
		widget.push(widget.get_context_id("Decoding"), "Dekodiere ...")
		(pout, pin, perr)  = popen2.popen3("\""+join(decoderpath,"otrdecoder")+"\" -i \""+infilename+"\" -o \""+outpath+"\" -e \""+email+"\" -p \""+password+"\""+overwriteflag+verifyflag)
		while True:
			l = ""
			while True:
				c = pout.read(1)
				if c == "\r" or c == "\n":
					break
				l += c
			if not l:
				break
			try:			
				progress = int(l[10:13])
				progressbar1.set_fraction(progress/100.)
				while gtk.events_pending():
					gtk.main_iteration(False)
			except ValueError:
				widget.push(widget.get_context_id("Decoding"), l.strip())
				pass
			
		message = perr.readlines()
		messageline = ""
		for i in message:
			 messageline += i.strip()
		pout.close()
		perr.close()
		pin.close()
		
		widget.push(widget.get_context_id(messageline), messageline)
		if messageline == "Error: Output file already exists.":
			dialog1.show()

# Dekodieren
def on_button3_clicked(widget):
	otrdecode(widget, False)

def on_cancelbutton1_clicked(widget):
	dialog1.hide()
	
def on_okbutton1_clicked(widget):
	dialog1.hide()
	otrdecode(widget, True)
	
# get directory of decoder
decoderpath = dirname(realpath(sys.argv[0]))

infilename = None
outpath = ""
email = ""
password = ""
configFile = os.path.expanduser('~/.otrdecoder')
config = None
savelogin = False
verify = True

xml = gtk.glade.XML(join(decoderpath,'decoder.glade'))

config = SafeConfigParser()
config.read(configFile)

filechooserbutton1 = xml.get_widget('filechooserbutton1')
filechooserbutton2 = xml.get_widget('filechooserbutton2')
dialog1 = xml.get_widget('dialog1')

outpath = filechooserbutton2.get_filename()

if config.has_section("settings"):
	if config.has_option("settings", "email"):
		email = config.get("settings", "email")
	if config.has_option("settings", "password"):
		password = config.get("settings", "password")
	if config.has_option("settings", "savelogin"):
		savelogin = config.getboolean("settings", "savelogin")
	if config.has_option("settings", "verify"):
		verify = config.getboolean("settings", "verify")
	if config.has_option("settings", "lastfile"):
		infilename = config.get("settings", "lastfile")
	if config.has_option("settings", "outputdir"):
		outpath = config.get("settings", "outputdir")

if len(sys.argv) > 1:
	infilename = realpath(sys.argv[1])

if infilename != None:
	filechooserbutton1.set_filename(infilename)
filechooserbutton2.set_filename(outpath)

entry1 = xml.get_widget('entry1')
entry1.set_text(email)
entry2 = xml.get_widget('entry2')
entry2.set_text(password)
checkbutton1 = xml.get_widget('checkbutton1')
checkbutton1.set_active(savelogin)
checkbutton2 = xml.get_widget('checkbutton2')
checkbutton2.set_active(verify)
statusbar1 = xml.get_widget('statusbar1')
progressbar1 = xml.get_widget('progressbar1')

xml.signal_autoconnect({
  'on_filechooserbutton1_selection_changed': on_filechooserbutton1_selection_changed,
  'on_filechooserbutton2_selection_changed': on_filechooserbutton2_selection_changed,
  'on_entry1_changed': on_entry1_changed,
  'on_entry2_changed': on_entry2_changed,
  'on_checkbutton1_toggled': on_checkbutton1_toggled,
  'on_checkbutton2_toggled': on_checkbutton2_toggled,
  'on_button2_clicked': on_button2_clicked,
  'on_button3_clicked': on_button3_clicked,
  'on_cancelbutton1_clicked': on_cancelbutton1_clicked,
  'on_okbutton1_clicked': on_okbutton1_clicked
})
gtk.main()
