# wireless.tcl
# Copyright (c) 2003 Digi International Inc., All Rights Reserved
# 
# This software contains proprietary and confidential information of Digi
# International Inc.  By accepting transfer of this copy, Recipient agrees
# to retain this software in confidence, to prevent disclosure to others,
# and to make no use of this software other than that for which it was
# delivered.  This is an unpublished copyrighted work of Digi International
# Inc.  Except as permitted by federal law, 17 USC 117, copying is strictly
# prohibited.
# 
# Restricted Rights Legend
#
# Use, duplication, or disclosure by the Government is subject to
# restrictions set forth in sub-paragraph (c)(1)(ii) of The Rights in
# Technical Data and Computer Software clause at DFARS 252.227-7031 or
# subparagraphs (c)(1) and (2) of the Commercial Computer Software -
# Restricted Rights at 48 CFR 52.227-19, as applicable.
#
# Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
#
# ***************************************************************************

namespace eval Wireless {
    variable boolShowSSID 0
    variable boolShowKey 0
    variable lstCountry
}

proc Wireless::MainGuts {w} {
    variable lstCountry
    variable cmbCountry
    variable Tab1st
    set frmMain $w.frmwireless
    if {![winfo exists $frmMain]} {
        frame $frmMain
        BuildPage $frmMain
        grid $frmMain -row 0 -column 0 -sticky news \
         -padx [expr $::numTitleBoldXPad + $::numBorderWidth] -pady 5
    }
    raise $frmMain
    set ::Tab1st $Tab1st
    bind $::Tab1st <<ShiftTab>> {focus $::btnHelp;break}

    $cmbCountry configure -values $lstCountry
    set indexDiscover -1
    catch {set indexDiscover [lsearch $lstCountry $::Discover::arrSettings(Country)]}
    set indexDefault [lsearch $lstCountry [mc wireless.defaultcountry]]
    if {$indexDiscover >= 0} {
        $cmbCountry setvalue @$indexDiscover
    } else {
        $cmbCountry setvalue @$indexDefault
    }
}

proc Wireless::BuildPage {w} {
    variable lstCountry
    variable cmbCountry
    variable entrySSID
    variable entryKey
    variable Tab1st
    set cmbCountry $w.cmbcntry
    set lstAuth [list [mc wireless.open] [mc wireless.shared]]
    set lstEncr [list [mc wireless.wep] [mc wireless.disabled]]
    
    set entrySSID $w.entssid
    set entryKey $w.entkey

    set lbl1 [label $w.lbl1 -text [mc wireless.1]]
    set lblStep1 [label $w.lblstep1 -text [mc wireless.body.1]]
    set radAuto [radiobutton $w.radauto -text [mc wireless.body.1auto] \
     -variable ::Config::arrSettings(AutoSSID) -value On \
     -command ::Wireless::SSIDState]
    set radConnect [radiobutton $w.radconn -text [mc wireless.body.1net] \
     -variable ::Config::arrSettings(AutoSSID) -value Off \
     -command ::Wireless::SSIDState]
    set lblSSID [label $w.lblssid -text [mc wireless.body.1name]]
    ## entrySSID predefined above
    entry $entrySSID -textvariable ::Config::arrSettings(DesiredSSID)
    set lbl2 [label $w.lbl2 -text [mc wireless.2]]
    set lblStep2 [label $w.lblstep2 -text [mc wireless.body.2]]
    set lblAuth [label $w.lblauth -text [mc wireless.body.2auth]]
    set cmbAuth [ComboBox $w.cmbauth -values $lstAuth \
     -textvariable ::Config::arrSettings(AuthMode) \
     -modifycmd ::Wireless::SecurityState -editable 0]
    set lblEncr [label $w.lblencr -text [mc wireless.body.2encr]]
    set cmbEncr [ComboBox $w.cmbencr -values $lstEncr \
     -textvariable ::Config::arrSettings(EncryptionMode) \
     -modifycmd ::Wireless::SecurityState -editable 0] 
    set lblKey [label $w.lblkey -text [mc wireless.body.2key]]
    ## entryKey predefined above
    entry $entryKey -validate key -validatecommand {string is xdigit %P} -textvariable ::Config::arrSettings(EncryptionKey)
    set lbl3 [label $w.lbl3 -text [mc wireless.3]]
    set lblStep3 [label $w.lblstep3 -text [mc wireless.body.3]]
    set lblCountry [label $w.lblctry -text [mc wireless.body.3ctry]]
    ## cmbCountry predefined above
    ComboBox $cmbCountry -values $lstCountry \
     -textvariable ::Config::arrSettings(Country) 
    set lblContinue [label $w.lblcont -text [mc guts.tocontinue] -font fontRegularBold]
    
    grid $lbl1 -row 0 -column 0 -sticky nw -rowspan 4
    grid $lblStep1 -row 0 -column 1 -sticky nw -columnspan 2
    grid $radAuto -row 1 -column 1 -sticky nw -columnspan 2
    grid $radConnect -row 2 -column 1 -sticky nw -columnspan 2
    grid $lblSSID -row 3 -column 1 -sticky nw
    grid $entrySSID -row 3 -column 2 -sticky nw
    
    grid $lbl2 -row 4 -column 0 -sticky nw -rowspan 4
    grid $lblStep2 -row 4 -column 1 -sticky nw -columnspan 2
    grid $lblAuth -row 5 -column 1 -sticky nw
    grid $cmbAuth -row 5 -column 2 -sticky nw
    grid $lblEncr -row 6 -column 1 -sticky nw
    grid $cmbEncr -row 6 -column 2 -sticky nw
    grid $lblKey -row 7 -column 1 -sticky nw
    grid $entryKey -row 7 -column 2 -sticky nw
    
    grid $lbl3 -row 8 -column 0 -sticky nw -rowspan 2 
    grid $lblStep3 -row 8 -column 1 -sticky nw -columnspan 2
    grid $lblCountry -row 9 -column 1 -sticky nw
    grid $cmbCountry -row 9 -column 2 -sticky nw
    
    grid $lblContinue -row 10 -column 0 -sticky sw -columnspan 3

    grid columnconfigure $w 3 -weight 2
    grid rowconfigure $w 3 -weight 1
    grid rowconfigure $w 7 -weight 1
    grid rowconfigure $w 9 -weight 1
    grid rowconfigure $w 10 -weight 1
    set Tab1st $radAuto
}

proc Wireless::GetCountryList {} {
    set lstCountry [exec -- $::pathAddp -q -m $::Discover::arrSettings(MAC) -C]
    ## Still a string here, let's yank the tabs
    regsub -all -- {\t} $lstCountry {} lstCountry
    set lstCountry [split $lstCountry \n]
    set indexFirst [expr [lsearch $lstCountry *Countries:*] + 1]
    set lstCountry [lrange $lstCountry $indexFirst end]

    set lstCountry [lsort $lstCountry]
    return $lstCountry
}

proc Wireless::SSIDState {} {
    variable boolShowSSID
    variable entrySSID
    switch $::Config::arrSettings(AutoSSID) {
        NA -
        Off {
            EntryEnable $entrySSID
            set boolShowSSID 1
        }
        On {
            EntryDisable $entrySSID
            set boolShowSSID 0
        }
    }
}

proc Wireless::SecurityState {} {
    variable boolShowKey
    variable entryKey
    if {[string match $::Config::arrSettings(AuthMode) [mc wireless.shared]] || \
        [string match $::Config::arrSettings(EncryptionMode) [mc wireless.wep]]} {
        EntryEnable $entryKey
        set boolShowKey 1
    } else { 
        EntryDisable $entryKey
        set boolShowKey 0
    }
}

proc Wireless::EntryDisable {entry} {
    $entry configure -state disabled -bg $::colorSystem -fg grey50
}

proc Wireless::EntryEnable {entry} {
    $entry configure -state normal -bg white -fg black
}

proc Wireless::VerifyKey {} {
    set ret 0
    set numLength [string length $::Config::arrSettings(EncryptionKey)]
    switch $numLength {
        10 {
            set ret 1
            set ::Config::arrSettings(WEP) WEP40
        }
        26 {
            set ret 1
            set ::Config::arrSettings(WEP) WEP128
        }
        default {
            set ret 0
        }
    }
    return $ret
}
    

