# $Id$

set user_status_list [list \
    available	[::msgcat::mc "Available"] \
    chat	[::msgcat::mc "Free to chat"] \
    away	[::msgcat::mc "Away"] \
    xa		[::msgcat::mc "Extended away"] \
    dnd		[::msgcat::mc "Do not disturb"] \
    invisible	[::msgcat::mc "Invisible"] \
    unavailable	[::msgcat::mc "Not logged in"]]

array set ssl_certificate_fields [list \
    subject   [::msgcat::mc "Subject"] \
    issuer    [::msgcat::mc "Issuer"] \
    notBefore [::msgcat::mc "Begin date"] \
    notAfter  [::msgcat::mc "Expiry date"] \
    serial    [::msgcat::mc "Serial number"] \
    cipher    [::msgcat::mc "Cipher"] \
    sbits     [::msgcat::mc "Session key bits"] \
    sha1_hash [::msgcat::mc "SHA1 hash"]]

proc update_tls_info {xlib args} {
    global tls_info

    catch {unset tls_info($xlib)}
    if {[llength $args] > 0} {
	set tls_info($xlib) $args
    }
}

hook::add disconnected_hook update_tls_info

proc ssl_info {} {
    global ssl_certificate_fields
    global tls_info

    set server_list {}
    set msg_list {}
    foreach xlib [connections] {
	if {[info exists tls_info($xlib)]} {
	    set server [connection_server $xlib]
	    if {[lsearch -exact $server_list $server] >= 0} {
		continue
	    } else {
		lappend server_list $server
		lappend msg_list $server
	    }
	    set info {}
	    foreach {k v} $tls_info($xlib) {
		switch -- $k {
		    subject -
		    issuer {
			set v [regsub -all {\s*[/,]\s*(\w+=)} $v \n\t\\1]
		    }
		}
		if {![string equal $v ""]} {
		    if {[info exists ssl_certificate_fields($k)]} {
			append info [format "%s: %s\n" \
					    $ssl_certificate_fields($k) $v]
		    } else {
			append info [format "%s: %s\n" $k $v]
		    }
		}
	    }
	    lappend msg_list [string trim $info]
	}
    }
    return $msg_list
}

proc update_ssl_info {} {
    global tls_warning_info
    global tls_info

    set state disabled
    set len [llength [connections]]
    set fg normal
    if {$len} {
	set balloon ""
	foreach xlib [connections] {
	    if {$len > 1} {
		append balloon "[connection_jid $xlib]: "
	    }
	    if {[info exists tls_info($xlib)]} {
		if {![info exists tls_warning_info($xlib)] ||
			[string equal $tls_warning_info($xlib) ""]} {
		    append balloon [::msgcat::mc "Enabled\n"]
		} else {
		    append balloon $tls_warning_info($xlib)
		    set fg warning
		}
		set state normal
	    } else {
		append balloon [::msgcat::mc "Disabled\n"]
	    }
	}
    } else {
	set balloon [::msgcat::mc "Disconnected"]
    }
    return [list $state $fg [string trim $balloon]]
}

###############################################################################

set status_afterid ""

proc client:status {xlib text} {
    set_status $text
}

proc set_status {text} {
    global status
    global status_afterid

    after cancel $status_afterid
    set status $text

    hook::run set_status_hook $text
    
    set status_afterid [after 5000 clear_status]
}

proc clear_status {} {
    global status

    set status ""
    
    hook::run clear_status_hook
}

# vim:ts=8:sw=4:sts=4:noet
