#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

set default_host "DEFAULT_HOST"
set default_port "DEFAULT_PORT"
set default_user "DEFAULT_USER"
set default_pass "DEFAULT_PASSWORD"

proc dialmQuit {} {
	global monfd
	if {$monfd != ""} {
		close $monfd
		set monfd ""
	}
	exit
}

proc dialmUsage {} {
	puts {usage: diaml [-host host] [-port port] [-user username] [-password password]}
	exit
}

proc dialmArgs {argv} {
	global info
	set previous   ""
	set info(host) ""
	set info(port) ""
	set info(user) ""
	set info(pass) ""
	foreach i $argv {
		if {"$previous" == "-host"} {
			set info(host) $i
			set previous ""
		} elseif {"$previous"  == "-port"} {
			set info(port) $i
			set previous ""
		} elseif {"$previous"  == "-user"} {
			set info(user) $i
			set previous ""
		} elseif {"$previous"  == "-password"} {
			set info(pass) $i
			set previous ""
		} elseif {"$i" == "-host"} {
			set previous "-host"
		} elseif {"$i" == "-port"} {
			set previous "-port"
		} elseif {"$i" == "-user"} {
			set previous "-user"
		} elseif {"$i" == "-password"} {
			set previous "-password"
		} else {
			dialmUsage
		}
	}
	if {"$previous" != ""} {
		dialmUsage
	}
}

proc dialmGetInfo {} {
	global monfd info w
	set word ""
	set text ""
	set char [read $monfd 1]
	while {$char != "\n" && $char != " "} {
		set word [append word $char]
		set char [read $monfd 1]
	}
	if {$char == "\n"} {
		return	;
	}
	set char [read $monfd 1]
	while {$char != "\n"} {
		set text [append text $char]
		set char [read $monfd 1]
	}
	if {"$word" == "STATE"} {
		if	 {"$text" == "START_LINK"} { set text "Starting PPP"
		} elseif {"$text" == "UP"	 } { set text "Connected"
		} elseif {"$text" == "STOP_LINK" } { set text "Stopping PPP"
		} elseif {"$text" == "DISCONNECT"} { set text "Disconnecting"
		} elseif {"$text" == "CLOSE"	 } { set text "Closed"
		} elseif {"$text" == "DOWN"	 } { set text "Down"
		} elseif {"$text" == "CONNECT"	 } { set text "Connecting" }
		set info(state) $text
		return
	}
	if {"$word" == "MESSAGE"} {
		set info(message) $text
		return
	}
	if {"$word" == "ALLOW_UP"} {
		if	 {"$text" == "YES"} { .menu.up configure -state normal
		} elseif {"$text" == "NO" } { .menu.up configure -state disabled }
		return
	}
	if {"$word" == "ALLOW_DOWN"} {
		if	 {"$text" == "YES"} { .menu.down configure -state normal
		} elseif {"$text" == "NO" } { .menu.down configure -state disabled }
		return
	}
}

proc dialmUp {} {
	global monfd
	if {$monfd != ""} {
		puts $monfd "U"
		flush $monfd
	}
}

proc dialmDown {} {
	global monfd
	if {$monfd != ""} {
		puts $monfd "D"
		flush $monfd
	}
}

proc dialmReconnect {} {
	global monfd info
	if {$monfd != ""} {
		close $monfd
		set monfd ""
	}
	set monfd [socket $info(host) $info(port)]
	fileevent $monfd readable {dialmGetInfo}
	.menu.up   configure -state disabled
	.menu.down configure -state disabled
	if {$info(user) != ""} {
		set text "L"
		set text [append text $info(user)]
		set text [append text ":"]
		set text [append text $info(pass)]
		puts $monfd $text
		flush $monfd
	}
}

proc dialmConfig {} {
	global sconf
	if {$sconf != 0} {
		pack forget .confuser
		pack forget .confpass
		pack forget .confhost
		pack forget .confport
		set sconf 0
		return
	}
	pack .confuser -side top -fill x -expand 0
	pack .confpass -side top -fill x -expand 0
	pack .confhost -side top -fill x -expand 0
	pack .confport -side top -fill x -expand 0
	set sconf 1 
}

dialmArgs $argv

frame	.menu -relief raised -bd 2
pack	.menu -side top -fill x -expand 0

button	.menu.quit -text "Quit" -command dialmQuit -underline 0
button	.menu.config -text "Config" -command dialmConfig -underline 0
button	.menu.reconnect -text "Reconnect" -command dialmReconnect -underline 0
button	.menu.up -text "Up Link" -command dialmUp -underline 0 -state disabled
button	.menu.down -text "Down Link" -command dialmDown -underline 0 -state disabled
pack	.menu.quit -side left	
pack	.menu.config -side left
pack	.menu.reconnect -side left
pack	.menu.up -side left
pack	.menu.down -side left

frame	.state
pack	.state	-side top -fill x -expand 0
label	.state.label -text "State" -width 9
message	.state.value -textvar info(state) -width 150 -bor 1 -rel sunken
pack	.state.label -side left
pack	.state.value -side left

frame	.message
pack	.message -side top -fill x -expand 0
label	.message.label -text "Message" -width 9
message	.message.value -textvar info(message) -width 150 -bor 1 -rel sunken
pack	.message.label -side left
pack	.message.value -side left

frame	.confuser
label	.confuser.label -text "User Name" -width 9
entry	.confuser.host -textvar info(user) -width 32 -bor 1 -rel sunken
pack	.confuser.label -side left
pack	.confuser.host -side left

frame	.confpass
label	.confpass.label -text "Password" -width 9
entry	.confpass.pass -textvar info(pass) -width 32 -bor 1 -rel sunken
pack	.confpass.label -side left
pack	.confpass.pass -side left

frame	.confhost
label	.confhost.label -text "Host" -width 9
entry	.confhost.host -textvar info(host) -width 32 -bor 1 -rel sunken
pack	.confhost.label -side left
pack	.confhost.host -side left

frame	.confport
label	.confport.label -text "Port" -width 9
entry	.confport.port -textvar info(port) -width 32 -bor 1 -rel sunken
pack	.confport.label -side left
pack	.confport.port -side left


proc dialmInit {} {
	global	info monfd host port user pass sconf
	global	default_host default_port default_user default_pass
	set info(state) "Unknown state"
	set info(message) "Awaiting first message"
	set monfd ""
	set sconf 0
	if {$info(host) == ""} { set info(host) $default_host }
	if {$info(port) == ""} { set info(port) $default_port }
	if {$info(user) == ""} { set info(user) $default_user }
	if {$info(pass) == ""} { set info(pass) $default_pass }
}


dialmInit
dialmReconnect
