#!/usr/bin/wish package require http namespace eval action { } proc reception {canal adresse client} { fconfigure $canal -buffering none gets $canal numero if {$numero != ""} { if {$numero == "appelant"} { puts $canal $::numero close $canal } else { close $canal action saisie $numero "" } } } proc correspondant {n} { if {$n != $::numero} { set ::numero $n regsub (^\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]$) $::numero "0\\0" ::numero # ICI début de communication avec ce numéro } } proc ecoute {} { if {[catch {socket -server "reception" -myaddr 127.0.0.1 3003}]} { return 0 } else { return 1 } } proc sauveDonnees {} { array set ::droit [list utilisateur $::utilisateur] array set ::droit [list passe $::passe] array set ::droit [list alias $::alias] set fd [open [file dirname $::argv0]/cti.dat w] puts $fd [array get ::droit] close $fd array set ::param [list limitecpt $::limitecpt] array set ::param [list interception $::interception] array set ::param [list edphone $::edphone] array set ::param [list dateversion $::dateversion] array set ::param [list codecdefaut $::codecdefaut] array set ::param [list descoff $::descoff] set fd [open [file dirname $::argv0]/ctibdd.dat w] puts $fd [array get ::param] close $fd } proc ferme {} { set pas 20 set geo [winfo geometry .] set x [winfo x .] set y [winfo y .] set l [winfo width .] set h [winfo height .] set cx [expr $x + $l / 2] set cy [expr $y + $h / 2] if {$h > $l} { set pasx $pas set pady [expr $pas * $h / $l] } else { set pasx [expr $pas * $l / $h] set pasy $pas } while {$h > 0 && $l > 0} { set x [expr $cx - $l / 2] set y [expr $cy - $h / 2] wm geometry . ${h}x${l}+${x}+${y} update idletasks incr h -$pasy incr l -$pasx } wm iconify . wm geometry . $geo } proc recupDonnees {} { if {[file exists [file dirname $::argv0]/cti.dat]} { set fd [open [file dirname $::argv0]/cti.dat r] catch {array set ::droit [read $fd]} close $fd if {[array names ::droit utilisateur] != "" && [array names ::droit passe] != "" && [array names ::droit alias] != ""} { set ::utilisateur $::droit(utilisateur) set ::passe $::droit(passe) set ::alias $::droit(alias) } else { file delete -force [file dirname $::argv0]/cti.dat } } set ::limitecpt 0 set ::interception 0 set ::edphone 0 set ::dateversion 0 set ::codecdefaut "PCM" set ::descoff 0 if {[file exists [file dirname $::argv0]/ctibdd.dat]} { set fd [open [file dirname $::argv0]/ctibdd.dat r] catch {array set ::param [read $fd]} close $fd if {[array names ::param limitecpt] != ""} { set ::limitecpt $::param(limitecpt) } if {[array names ::param interception] != ""} { set ::interception $::param(interception) } if {[array names ::param edphone] != ""} { set ::edphone $::param(edphone) } if {[array names ::param dateversion] != ""} { set ::dateversion $::param(dateversion) } if {[array names ::param codecdefaut] != ""} { set ::codecdefaut $::param(codecdefaut) } if {[array names ::param descoff] != ""} { set ::descoff $::param(descoff) } } boucle "" "" } proc initialisation {} { set ::docprec "" set ::nbprincipal -1 set ::sonnerie 0 set ::nbsignal -1 set ::nbgarde -1 set ::nbaction "" set ::nbcompte -1 set ::appelEnCours 0 set ::prochain "" set ::jaifaituntruc 0 set ::rafraichissement 0 array set ::journal [list "" ""] set ::option "" } proc ecritcoordonnees {} { catch {destroy ${::sommet}.coordonnees} regexp (^0)(\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]\[0-9\]$) $::nouvalias t z ::nouvalias set ::utilisateur $::nouvutilisateur set ::passe $::nouvpasse set ::alias $::nouvalias sauveDonnees initialisation boucle "" "" .param.alias configure -text "Votre poste : $::alias" .param.bouton configure -command "coordonnees \"Paramètres\"" return 1 } proc coordonnees {t} { if {[winfo exists ${::sommet}.coordonnees]} { return } set ::nouvutilisateur $::utilisateur set ::nouvpasse $::passe set ::nouvalias $::alias .param.bouton configure -command "" toplevel ${::sommet}.coordonnees label ${::sommet}.coordonnees.titre -text $t -relief sunken -borderwidth 3 frame ${::sommet}.coordonnees.saisie frame ${::sommet}.coordonnees.saisie.utilisateur label ${::sommet}.coordonnees.saisie.utilisateur.titre -text "Nom d'utilisateur" entry ${::sommet}.coordonnees.saisie.utilisateur.entree -width 20 -textvariable ::nouvutilisateur frame ${::sommet}.coordonnees.saisie.passe label ${::sommet}.coordonnees.saisie.passe.titre -text "Mot de passe" entry ${::sommet}.coordonnees.saisie.passe.entree -width 20 -textvariable ::nouvpasse frame ${::sommet}.coordonnees.saisie.numero label ${::sommet}.coordonnees.saisie.numero.titre -text "Numéro de téléphone" entry ${::sommet}.coordonnees.saisie.numero.entree -width 10 -textvariable ::nouvalias frame ${::sommet}.coordonnees.options checkbutton ${::sommet}.coordonnees.options.compte -text "Limiter à ce compte (ou toute la société)" -variable "::limitecpt" -onvalue 1 -offvalue 0 checkbutton ${::sommet}.coordonnees.options.interception -text "Signaler tous les appels (pour interception)" -variable "::interception" -onvalue 1 -offvalue 0 checkbutton ${::sommet}.coordonnees.options.descoff -text "Afficher la description officielle des utilisateurs" -variable "::descoff" -onvalue 1 -offvalue 0 # checkbutton ${::sommet}.coordonnees.options.edphone -text "Utiliser le softphone Étoile Dièse" -variable "::edphone" -onvalue 1 -offvalue 0 set ::edphone 0 button ${::sommet}.coordonnees.envoi -text "Validation" -command "ecritcoordonnees" pack ${::sommet}.coordonnees.titre -side top -fill x pack ${::sommet}.coordonnees.saisie -side top -fill x pack ${::sommet}.coordonnees.options -side top -fill x pack ${::sommet}.coordonnees.envoi -side top -fill x pack ${::sommet}.coordonnees.saisie.utilisateur -side left -expand 1 -fill both pack ${::sommet}.coordonnees.saisie.passe -side left -expand 1 -fill both pack ${::sommet}.coordonnees.saisie.numero -side left -expand 1 -fill both pack ${::sommet}.coordonnees.saisie.utilisateur.titre -side top -fill x pack ${::sommet}.coordonnees.saisie.utilisateur.entree -side top -fill x pack ${::sommet}.coordonnees.saisie.passe.titre -side top -fill x pack ${::sommet}.coordonnees.saisie.passe.entree -side top -fill x pack ${::sommet}.coordonnees.saisie.numero.titre -side top -fill x pack ${::sommet}.coordonnees.saisie.numero.entree -side top -fill x pack ${::sommet}.coordonnees.options.compte -side top -fill x pack ${::sommet}.coordonnees.options.interception -side top -fill x pack ${::sommet}.coordonnees.options.descoff -side top -fill x # pack ${::sommet}.coordonnees.options.edphone -side top -fill x } proc sauveprog {so jeton} { puts -nonewline $::fdprog [read $so] } proc getprog {url fichier} { if {$::systeme == "Windows"} { set wget "[file dirname $::argv0]/wget.exe" } else { set wget "wget" } set proto "http" regexp (^\[^:\]*) $url proto if {$proto == "https"} { file delete -force $fichier set fd [open "|wget -O $fichier -t 1 -T 10 -q -O - \"$url\"" r] set retour [read $fd] catch {close $fd} if {[file size $fichier] == 0} { set retour "ko" file delete -force $fichier } else { set retour "ok" } } else { set ::fdprog [open $fichier w] fconfigure $::fdprog -translation binary if {![catch {set jeton [::http::geturl $url -binary 1 -handler sauveprog]} erreur]} { close $::fdprog set retour [::http::status $jeton] ::http::cleanup $jeton if {[file size $fichier] == 0} { set retour "ko" } if {$retour != "ok"} { file delete -force $fichier } } else { close $::fdprog file delete -force $fichier puts "ERREUR : $url - $erreur" set retour "ko" } } return $retour } proc http {url} { if {$::systeme == "Windows"} { set wget "[file dirname $::argv0]/wget.exe" } else { set wget "wget" } set proto "http" regexp (^\[^:\]*) $url proto if {$proto == "https"} { set fd [open "|wget -t 1 -T 10 -q -O - \"$url\"" r] set retour [read $fd] catch {close $fd} } else { if {![catch {set jeton [::http::geturl $url -timeout 3000]}]} { set retour [::http::data $jeton] ::http::cleanup $jeton } else { set retour "" } } return $retour } proc analyse {doc bal} { set trouve 0 while {[regexp (<)(\[^>\]+)(>) $doc t i balise]} { set trouve 1 set debut [string first $t $doc] set exdeb [expr $debut + [string length $t]] set exfin [string first "" $doc $debut] if {$exfin == -1} { set fin "end" set exfin "end" set b $bal } else { set fin [expr $exfin + [string length $t] + 1] incr exfin -1 if {$bal == ""} { set b $balise } else { set b "$bal,$balise" } if {[array names ::decompte $b] == ""} { array set ::decompte [list $b 1] } else { incr ::decompte($b) } set b "$b-[expr $::decompte($b) - 1]" } set d [string trim [string range $doc $exdeb $exfin]] incr debut -1 set doc [string trim "[string range $doc 0 $debut][string range $doc $fin end]"] analyse $d $b } if {!$trouve && $doc != ""} { array set ::xml [list $bal $doc] if {[array names ::xml "xml-0,retour-0,url-0"] != ""} { set ::url $::xml(xml-0,retour-0,url-0) } } } proc telecharge {action saisie} { if {$::edphone && $action == "saisie" && !$::appelEnCours} { if {[appel $saisie 20 0]} { set document [http "${::url}?utilisateur=$::utilisateur&passe=$::passe&alias=$::alias&prog=[file tail $::argv0]$::option&action=fvauto&etiquette=$::etiqusuivi"] set ::rafraichissement 1 set ::jaifaituntruc 1 } } else { set a $action if {$::edphone && $action == ""} { if {[array names ::xml "xml-0,actions-0,fv-0"] != ""} { if {$::xml(xml-0,actions-0,fv-0) == "0"} { set a "fvauto" } } } set document [http "${::url}?utilisateur=$::utilisateur&passe=$::passe&alias=$::alias&saisie=$saisie&action=$a&prog=[file tail $::argv0]&etiquette=$::etiqusuivi$::option"] if {$::edphone && $action == "raccroche" && $saisie == ""} { raccroche } } set ::option "" set retour 1 if {$document != "" && [string first "" $document] != -1} { if {$document != $::docprec || $::rafraichissement} { set ::rafraichissement 0 catch {unset ::xml} catch {unset ::decompte} analyse $document "" if {[array names ::xml "xml-0,retour-0,etiquette-0"] != ""} { set ::etiqusuivi $::xml(xml-0,retour-0,etiquette-0) } if {$::docprec == ""} { if {[affichage]} { if {[remplissage]} { set ::docprec $document } } else { set retour 0 } } else { if {![remplissage]} { if {[affichage]} { remplissage set ::docprec $document } else { set retour 0 } } else { set ::docprec $document } } } } return $retour } proc affichage {} { initialisation catch {destroy $::centre} catch {destroy $::collaborateur} catch {destroy $::situation} catch {destroy $::principal} catch {destroy $::signal} catch {destroy $::garde} catch {destroy $::softphone} # Le code retour if {[array names ::xml "xml-0,retour-0,code-0"] != ""} { # Controle de la version if {[array names ::xml "xml-0,retour-0,dateversion-0"] != ""} { if {$::xml(xml-0,retour-0,dateversion-0) > $::dateversion} { catch {destroy .maj} toplevel .maj label .maj.message -text "Mise-à-jour du programme,\nveuillez patienter..." -font "Helvetica 16 bold" pack .maj.message update idletasks set recup [getprog $::xml(xml-0,retour-0,chemin-0) [file dirname $::argv0]/temp_[file tail $::argv0]] if {$recup == "ok"} { if {[file size [file dirname $::argv0]/temp_[file tail $::argv0]] == $::xml(xml-0,retour-0,taille-0)} { file rename -force $::argv0 [file dirname $::argv0]/vieu_[file tail $::argv0] file rename -force [file dirname $::argv0]/temp_[file tail $::argv0] $::argv0 set ::dateversion $::xml(xml-0,retour-0,dateversion-0) sauveDonnees if {$::systeme == "Linux"} { file attributes $::argv0 -permissions 0755 } set fd [open [file dirname $::argv0]/flag_[file tail $::argv0] w] close $fd if {$::systeme == "Darwin"} { exec wish $::argv0 & } else { exec $::argv0 & } file delete -force [file dirname $::argv0]/flag_[file tail $::argv0] exit } else { file delete -force [file dirname $::argv0]/temp_[file tail $::argv0] } } } } set code $::xml(xml-0,retour-0,code-0) if {$code != 0} { if {$::systeme != "Darwin"} { wm iconify . } coordonnees $::xml(xml-0,retour-0,libelle-0) return 0 } frame $::centre -background $::fond frame $::collaborateur -background $::fond pack $::centre -side left -fill both pack $::collaborateur -side left -fill both frame $::situation -relief flat -background $::fond pack $::situation -side top -fill both -expand 1 frame $::principal -relief flat -background $::fond frame $::signal -relief flat -background $::fond frame $::garde -relief flat -background $::fond label ${::principal}.titre -relief raised -background #caefff -text "Communication en cours" -width 50 -anchor c label ${::signal}.titre -relief raised -background #caefff -text "Signaux d'appel" -width 50 -anchor c label ${::garde}.titre -relief raised -background #caefff -text "Communication en attente" -width 50 -anchor c pack $::principal -side top -fill both -expand 1 pack ${::principal}.titre -side top -fill x pack $::signal -side top -fill both -expand 1 pack ${::signal}.titre -side top -fill x pack $::garde -side top -fill both -expand 1 pack ${::garde}.titre -side top -fill x # Liste des comptes catch {unset ::nbposte} if {[array names ::decompte "xml-0,compte"] != ""} { set ::nbcompte $::decompte(xml-0,compte) set rang 0 for {set compte 0} {$compte < $::nbcompte} {incr compte} { # Liste des postes if {[array names ::decompte "xml-0,compte-$compte,poste"] != ""} { array set ::nbposte [list $::xml(xml-0,compte-$compte,identite-0) $::decompte(xml-0,compte-$compte,poste)] for {set poste 0} {$poste < $::decompte(xml-0,compte-$compte,poste)} {incr poste} { if {$::xml(xml-0,compte-$compte,poste-${poste},identite-0) == $::utilisateur || $::limitecpt == 0} { if {[expr $rang % $::tailleColonne] == 0} { set indice [expr $rang / $::tailleColonne] frame ${::collaborateur}.colonne$indice pack ${::collaborateur}.colonne$indice -side left -fill y } frame ${::collaborateur}.colonne$indice.poste-$compte-$poste frame ${::collaborateur}.colonne$indice.poste-$compte-${poste}.bouton -background $::fond if {$::systeme == "Darwin"} { frame ${::collaborateur}.colonne$indice.poste-$compte-${poste}.bouton.pastille -width 20 -relief raised } button ${::collaborateur}.colonne$indice.poste-$compte-${poste}.bouton.b -background $::fond -activebackground $::fondactif -anchor w button ${::collaborateur}.colonne$indice.poste-$compte-${poste}.etiquette -text c -background $::fond -activebackground $::fondactif pack ${::collaborateur}.colonne$indice.poste-$compte-$poste -side top -fill x pack ${::collaborateur}.colonne$indice.poste-$compte-${poste}.bouton -side left -fill both -expand 1 if {$::systeme == "Darwin"} { pack ${::collaborateur}.colonne$indice.poste-$compte-${poste}.bouton.pastille -side left -fill y } pack ${::collaborateur}.colonne$indice.poste-$compte-${poste}.bouton.b -side left -fill both -expand 1 pack ${::collaborateur}.colonne$indice.poste-$compte-${poste}.etiquette -side left progBulle ${::collaborateur}.colonne$indice.poste-$compte-${poste}.etiquette "Modifier le libellé" incr rang } } } } } # L'Edphone if {$::edphone} { if {![file exists [file dirname $::argv0]/$::bibedphone]} { set ::fdprog [open [file dirname $::argv0]/$::bibedphone w] fconfigure $::fdprog -translation binary if {![catch {set jeton [::http::geturl $::urlbib$::bibedphone -binary 1 -handler sauveprog]} erreur]} { close $::fdprog ::http::cleanup $jeton } else { close $::fdprog file delete -force [file dirname $::argv0]/$::bibedphone puts "ERREUR : ::urlbib$::bibedphone - $erreur" } } if {[file exists [file dirname $::argv0]/$::bibedphone]} { load [file dirname $::argv0]/$::bibedphone if {[array names ::xml "xml-0,situation-0,compte-0"] != "" && [array names ::xml "xml-0,situation-0,domaine-0"] != "" && [array names ::xml "xml-0,situation-0,identite-0"] != "" && [array names ::xml "xml-0,situation-0,description-0"] != ""} { if {[enregistrement $::xml(xml-0,situation-0,description-0) $::alias $::xml(xml-0,situation-0,domaine-0) $::xml(xml-0,situation-0,compte-0) $::xml(xml-0,situation-0,identite-0) "ED" "diese7.etoilediese.fr" 120]} { if {[appel "testapplet@etoilediese.fr" 10 0]} { raccroche codec $::codecdefaut frame $::softphone -background $::fond frame ${::softphone}.compression -background $::fond radiobutton ${::softphone}.compression.speex -relief flat -text "Compression" -command "cfgcodec \"SPEEX\"" -variable "::codecdefaut" -value "SPEEX" -background $::fond -activebackground $::fondactif -borderwidth 0 -indicatoron 0 radiobutton ${::softphone}.compression.pcm -relief flat -text "Qualité" -command "cfgcodec \"PCM\"" -variable "::codecdefaut" -value "PCM" -background $::fond -activebackground $::fondactif -borderwidth 0 -indicatoron 0 pack ${::softphone}.compression -side left pack ${::softphone}.compression.speex -side left -fill x -expand 1 pack ${::softphone}.compression.pcm -side left -fill x -expand 1 pack $::softphone -side top -fill x } else { desenregistrement set ::edphone 0 } } else { desenregistrement set ::edphone 0 } } else { set ::edphone 0 } } else { set ::edphone 0 } } return 1 } else { return 0 } } proc clavier {} { if {[winfo exists .clavier]} { return } toplevel .clavier for {set ligne 0} {$ligne < 4} {incr ligne} { frame .clavier.ligne${ligne} -background $::fond pack .clavier.ligne${ligne} -side top for {set boucle 1} {$boucle < 4} {incr boucle} { set touche [expr $boucle + $ligne * 3] if {$touche == 10} { set touche "*" } elseif {$touche == 11} { set touche "0" } elseif {$touche == 12} { set touche "#" } button .clavier.ligne${ligne}.touche${boucle} -background $::fond -activebackground $::fondactif -command "dtmf \"$touche\"" -text $touche pack .clavier.ligne${ligne}.touche${boucle} -side left } } } proc cfgcodec {c} { codec $c set ::codecdefaut $c sauveDonnees } proc ecritetiquette {n} { if {[winfo exists .etiquette]} { destroy .etiquette } if {$::etiquette == ""} { catch {unset ::param(etiquette-$n)} } else { array set ::param [list "etiquette-$n" $::etiquette] } sauveDonnees initialisation } proc etiquette {n} { if {[winfo exists .etiquette]} { destroy .etiquette } toplevel .etiquette label .etiquette.titre -text "Etiquette de numéro" -background grey -relief ridge -borderwidth 3 frame .etiquette.saisie label .etiquette.saisie.numero -text "Numéro $n" entry .etiquette.saisie.etiquette -width 20 -textvariable ::etiquette button .etiquette.saisie.envoi -text "Valider" -command "ecritetiquette $n" pack .etiquette.titre -side top -fill x -expand 1 pack .etiquette.saisie -side top -fill x -expand 1 pack .etiquette.saisie.numero -side left -fill x -expand 1 pack .etiquette.saisie.etiquette -side left -fill x -expand 1 pack .etiquette.saisie.envoi -side left -fill x -expand 1 if {[array names ::param "etiquette-$n"] != ""} { set ::etiquette $::param(etiquette-$n) } } proc progBulle {ob texte} { bind $ob "bulle $ob \"$texte\" %X %Y" bind $ob "if {\$action::objetbulle == \"$ob\"} {catch {destroy .bulle}; catch {after cancel \$action::bulle}}; set action::objetbulle \"\"" } proc bulle {ob texte x y} { if {$action::objetbulle != $ob} { catch {destroy .bulle} catch {after cancel $action::bulle} toplevel .bulle label .bulle.label -text $texte -background #fffabd -foreground black pack .bulle.label wm geometry .bulle +[expr ${x} + 10]+[expr ${y} + 10] wm overrideredirect .bulle 1 set action::bulle [after 2000 "catch {destroy .bulle}"] set action::objetbulle $ob bind .bulle.label