# verify.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 Verify {
    variable boolNetworkChanges
    variable boolWirelessChanges
}

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

proc Verify::BuildPage {w} {
    variable Tab1st
    set lblHeading $w.lblheading
    ::LabelHeading $lblHeading [mc verify.body.heading] 
    set frmText [frame $w.frmtext -width $::numGutsHeadingWraplength]
    BuildTextBox $frmText
    set frmReport [frame $w.frmreport]
    set lblReport [label $frmReport.lblreport -text [mc verify.report]]
    set lblClick [label $frmReport.lblclick -text [mc verify.click] -font fontLink \
     -fg blue -cursor hand2]
    bind $lblClick <1> {::Verify::SaveText}
    set lblContinue [label $w.lblcont -text [mc verify.tocontinue] -font fontRegularBold]
    grid $lblHeading -row 0 -column 0 -sticky sw
    grid $frmText -row 1 -column 0 -sticky ew
    grid $frmReport -row 2 -column 0 -sticky new
    grid $lblReport -row 0 -column 0 -sticky e
    grid $lblClick -row 0 -column 1 -sticky w
    grid columnconfigure $frmReport 1 -weight 1
    grid $lblContinue -row 3 -column 0 -sticky sw
    grid rowconfigure $w 0 -weight 1
    grid rowconfigure $w 1 -weight 0
    grid rowconfigure $w 2 -weight 1
    grid columnconfigure $w 0 -weight 1
    set Tab1st $frmText
}

proc Verify::SaveText {} {
    variable textVerify
    set strText [$textVerify get 0.0 end]
    set fileText [tk_getSaveFile -parent . -initialdir / -title [mc verify.savefile]]
    if {![string equal $fileText ""]} {
        if {[catch {open $fileText w} fileID]} {
            tk_messageBox -message [mc verify.savefilefail.msg $fileText $fileID] -icon error \
             -type ok -default ok
        } else {
            puts $fileID $strText
            close $fileID
        }
    }
}

proc Verify::BuildTextBox {w} {
    variable textVerify
    set frmText $w
    set ys $frmText.ys
    set t [text $frmText.instructions -wrap word -yscrollcommand [list $ys set] \
     -background white -font fontRegular -tabs {20p 175p}]
    set numLSpace [font metrics [$t cget -font] -linespace]
    set numHeightInLines [expr 270 / $numLSpace]
    $t configure -height $numHeightInLines
    set textVerify $t

    ##Disable text selection and editing
    set t_bind [bindtags $t] 
    set text_pos [lsearch $t_bind Text] 
    bindtags $t [lreplace $t_bind $text_pos $text_pos] 

    ## Re-enable the mouse wheel
    bind all <MouseWheel> "+::wheelEvent %X %Y %D"
    
    scrollbar $ys -command [list $t yview] -orient vertical
    grid $t $ys -sticky news
    grid columnconfigure $frmText 0 -weight 1
}

proc Verify::ShowSettings {} {
    variable boolNetworkChanges
    variable boolWirelessChanges
    set boolNetworkChanges 0
    set boolWirelessChanges 0
    ## Make a short var that's easy to use for text inserts
    upvar #0 ::Verify::textVerify t

    $t delete 0.0 end
    set strFormat [mc verify.text.heading $::Discover::arrSettings(Hardware) \
     $::Discover::arrSettings(MAC)]
    $t insert end $strFormat 
    $t insert end "\n\n[mc verify.network]"
    if {$::Discover::arrSettings(DHCP) == "NA"} {
        $t insert end "\n\t[mc verify.legacydhcp]"
        if {$::Config::arrSettings(DHCP) == "Off"} {
            ShowNetworkSettings $t
            set boolNetworkChanges 1
        } else {
            ## Config::DHCP=On 
            if {[string equal $::Discover::arrSettings(IP) "0.0.0.0"]} {
                $t insert end \n\t[mc verify.nodhcpserver [mc network.title.bold]]
            }
        }
    } else {
        if {$::Config::arrSettings(DHCP) == "On"} {
            $t insert end \n\t[mc network.body.dhcp]
            set boolNetworkChanges 1
            if {$::Discover::arrSettings(DHCP) == "Off"} {
                ## The user changed it from Off to On
            } else {
                ## The user just left DHCP On
                if {[string equal $::Discover::arrSettings(IP) "0.0.0.0"]} {
                    $t insert end \n\t[mc verify.nodhcpserver [mc network.title.bold]]
                }
            }
        } elseif {![SettingsChanged network] && $::Discover::arrSettings(DHCP) == "On"} {
            ## The user changed to DHCP Off but didn't change the IP settings
            $t insert end \n\t[mc verify.dhcpreserved]
            ShowNetworkSettings $t
            set boolNetworkChanges 1
        } else {
            ShowNetworkSettings $t
            set boolNetworkChanges 1
        } 
    }
    if {$::boolIsWireless} { 
        ## Pressing Skip will set boolIsWireless 0
        $t insert end "\n\n[mc verify.wireless]"
        ShowWirelessSettings $t
        set boolWirelessChanges 1
    }
}

proc Verify::ShowNetworkSettings {t} {
    if {![ValidNetwork $::Config::arrSettings(IP) $::Config::arrSettings(Submask) \
     $::Config::arrSettings(Gateway)]} {
        $t insert end \n\t[mc verify.invalidnetwork]
    }
    $t insert end \n\t[mc network.ip]\t$::Config::arrSettings(IP)
    $t insert end \n\t[mc network.submask]\t$::Config::arrSettings(Submask)
    $t insert end \n\t[mc network.gateway]\t$::Config::arrSettings(Gateway)
}

proc Verify::ShowWirelessSettings {t} {
    if {$::Wireless::boolShowSSID} {
        $t insert end \n\t[mc wireless.body.1name]\t$::Config::arrSettings(DesiredSSID)
    } else {
        $t insert end \n\t[mc wireless.body.1auto]
    }
    $t insert end \n\t[mc wireless.body.2auth]\t$::Config::arrSettings(AuthMode)
    $t insert end \n\t[mc wireless.body.2encr]\t$::Config::arrSettings(EncryptionMode)
    if {$::Wireless::boolShowKey} {
        set strHide ""
        regsub -all -- {.} $::Config::arrSettings(EncryptionKey) * strHide
        $t insert end \n\t[mc wireless.body.2key]\t$strHide
    }
    $t insert end \n\t[mc wireless.body.3ctry]\t$::Config::arrSettings(Country)
}

proc Verify::ValidNetwork {strIP strSub strGate} {
    set boolIPVerified 1
    set boolSubVerified 1
    set boolGateVerified 1
    set boolZeroGate 0
    
    ## Gateway is not necessary
    if {[string equal $strGate "..."] || [string equal $strGate "0.0.0.0"]} {
        set strGate "0.0.0.0"
        set boolZeroGate 1
    }
    if {[string equal $strIP "0.0.0.0"]} {
        set boolIPVerified 0
    }

    if {$boolIPVerified} {
        set lstMask [split $strSub .] 
        foreach {M(1) M(2) M(3) M(4)} $lstMask {}
        if { $M(1) != 255 || $M(2) != 255 } {
            tk_messageBox -type ok -icon warning -parent . \
             -title "Are You Sure?" \
             -message [mc verify.badsubmask $strSub]
            set boolSubVerified 0
        }
    }
    
    if {$boolIPVerified && $boolSubVerified} {
        ## Gateway is not necessary
        if {!$boolZeroGate && ![ValidGate $strIP $strSub $strGate]} {
            tk_messageBox -type ok -icon warning -parent . \
             -title "Are you sure?" \
             -message [mc verify.badgateway $strGate]
            set boolGateVerified 0
        }
    }

    if {! $boolIPVerified || ! $boolSubVerified || ! $boolGateVerified} {
        set ret 0
    } else {
        set ret 1
    }

    return $ret
}

## This proc checks that an IP(numGate) falls in the range of IPs
## in a network as specified by an IP and a submask
## It does not validate the addresses themselves (0-255 and dotted
## notation is assumed) 
proc Verify::ValidGate {strIP strMask strGate} {
    set ret 1
    set lstMask [split $strMask .] 
    foreach {M(1) M(2) M(3) M(4)} $lstMask {}
    set lstIP [split $strIP .]
    foreach {I(1) I(2) I(3) I(4)} $lstIP {}
    set lstGate [split $strGate .]
    foreach {G(1) G(2) G(3) G(4)} $lstGate {}
    for {set i 1} {$i <= 4} {incr i} {
        set numAnded [expr $M($i) & $I($i)]
        if {$numAnded > $G($i) || $G($i) > ($numAnded + 255 - $M($i))} {
            set ret 0
            break
        }
    }
    return $ret
}


proc Verify::SettingsChanged {strType} {
    set ret 0
    switch $strType {
        network {
            foreach name $::Config::arrSettings(lstNSettable) {
                if {$::Discover::arrSettings($name) != $::Config::arrSettings($name)} {
                    set ret 1
                    break
                }
            }
        }
        wireless {
            foreach name $::Config::arrSettings(lstWSettable) {
                if {$::Discover::arrSettings($name) != $::Config::arrSettings($name)} {
                    set ret 1
                    break
                }
            }
        }
    }
    return $ret
}
