summaryrefslogtreecommitdiff
path: root/appl/cmd/ip/ppp/pppgui.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/cmd/ip/ppp/pppgui.b')
-rw-r--r--appl/cmd/ip/ppp/pppgui.b373
1 files changed, 373 insertions, 0 deletions
diff --git a/appl/cmd/ip/ppp/pppgui.b b/appl/cmd/ip/ppp/pppgui.b
new file mode 100644
index 00000000..40e7e3b4
--- /dev/null
+++ b/appl/cmd/ip/ppp/pppgui.b
@@ -0,0 +1,373 @@
+#
+# Copyright © 1998 Lucent Technologies Inc. All rights reserved.
+# Revisions copyright © 2000,2001 Vita Nuova Holdings Limited. All rights reserved.
+#
+# Originally Written by N. W. Knauft
+# Adapted by E. V. Hensbergen (ericvh@lucent.com)
+# Further adapted by Vita Nuova
+#
+
+implement PPPGUI;
+
+include "sys.m";
+ sys: Sys;
+
+include "draw.m";
+ draw: Draw;
+
+include "tk.m";
+ tk: Tk;
+
+include "tkclient.m";
+ tkclient: Tkclient;
+
+include "translate.m";
+ translate: Translate;
+ Dict: import translate;
+ dict: ref Dict;
+
+include "lock.m";
+include "modem.m";
+include "script.m";
+include "pppclient.m";
+ ppp: PPPClient;
+
+include "pppgui.m";
+
+#Screen constants
+BBG: con "#C0C0C0"; # Background color for button
+PBG: con "#808080"; # Background color for progress bar
+LTGRN: con "#00FF80"; # Color for progress bar
+BARW: con 216; # Progress bar width
+BARH: con " 9"; # Progress bar height
+INCR: con 30; # Progress bar increment size
+N_INCR: con 7; # Number of increments in progress bar width
+BSIZE: con 25; # Icon button size
+ISIZE: con BSIZE + 4; # Icon window size
+DIALQUANTA : con 1000;
+ICONQUANTA : con 5000;
+
+#Globals
+pppquanta := DIALQUANTA;
+
+#Font
+FONT: con "/fonts/lucidasans/unicode.6.font";
+
+#Messages
+stat_msgs := array[] of {
+ "Initializing Modem",
+ "Dialling Service Provider",
+ "Logging Into Network",
+ "Executing Login Script",
+ "Script Execution Complete",
+ "Logging Into Network",
+ "Verifying Password",
+ "Connected",
+ "",
+};
+
+config_icon := array[] of {
+ "button .btn -text X -width "+string BSIZE+" -height "+string BSIZE+" -command {send tsk open} -bg "+BBG,
+ "pack .btn",
+
+ "pack propagate . no",
+ ". configure -bd 0",
+ ". unmap",
+ "update",
+};
+
+
+# Create internet connect window, spawn event handler
+init(ctxt: ref Draw->Context, stat: chan of int, pppmod: PPPClient, args: list of string): chan of int
+{
+ sys = load Sys Sys->PATH;
+ draw = load Draw Draw->PATH;
+ tk = load Tk Tk->PATH;
+ tkclient = load Tkclient Tkclient->PATH;
+
+ if (draw == nil || tk == nil || tkclient == nil) {
+ sys->fprint(sys->fildes(2), "pppgui: can't load Draw or Tk: %r\n");
+ return nil;
+ }
+
+ translate = load Translate Translate->PATH;
+ if(translate != nil) {
+ translate->init();
+ dictname := translate->mkdictname("", "pppgui");
+ dicterr: string;
+ (dict, dicterr) = translate->opendict(dictname);
+ if(dicterr != nil)
+ sys->fprint(sys->fildes(2), "pppgui: can't open %s: %s\n", dictname, dicterr);
+ }else
+ sys->fprint(sys->fildes(2), "pppgui: can't load %s: %r\n", Translate->PATH);
+ ppp = pppmod; # set the global
+
+ tkargs := "";
+
+ if (args != nil) {
+ tkargs = hd args;
+ args = tl args;
+ } else
+ tkargs="-x 340 -y 4";
+
+ tkclient->init();
+
+ (t, wmctl) := tkclient->toplevel(ctxt, tkargs, "PPP", Tkclient->Plain);
+
+ config_win := array[] of {
+ "frame .f",
+ "frame .fprog",
+
+ "canvas .cprog -bg "+PBG+" -bd 2 -width "+string BARW+" -height "+BARH+" -relief ridge",
+ "pack .cprog -in .fprog -pady 6",
+
+ "label .stat -text {"+X("Initializing connection...")+"} -width 164 -font "+FONT,
+ "pack .stat -in .f -side left -fill y -anchor w",
+
+ "button .done -text {"+X("Cancel")+"} -width 60 -command {send cmd cancel} -bg "+BBG+" -font "+FONT,
+ "pack .fprog -side bottom -expand 1 -fill x",
+ "pack .done -side right -padx 1 -pady 1 -fill y -anchor e",
+ "pack .f -side left -expand 1 -padx 5 -pady 3 -fill both -anchor w",
+
+ "pack propagate . no",
+ ". configure -bd 2 -relief raised -width "+string WIDTH,
+ "update",
+ };
+
+ for(i := 0; i < len config_win; i++)
+ tk->cmd(t, config_win[i]);
+
+ itkargs := "";
+ if (args != nil) {
+ itkargs = hd args;
+ args = tl args;
+ }
+ tkclient->onscreen(t, nil);
+ tkclient->startinput(t, "ptr" :: nil);
+
+ if (itkargs == "") {
+ x := int tk->cmd(t, ". cget x");
+ y := int tk->cmd(t, ". cget y");
+ x += WIDTH - ISIZE;
+ itkargs = "-x "+string x+" -y "+string y;
+ }
+
+ (ticon, iconctl) := tkclient->toplevel(ctxt, itkargs, "PPP", Tkclient->Plain);
+
+ for( i = 0; i < len config_icon; i++)
+ tk->cmd(ticon, config_icon[i]);
+
+ tk->cmd(ticon, "image create bitmap Network -file network.bit -maskfile network.bit");
+ tk->cmd(ticon, ".btn configure -image Network");
+ tkclient->startinput(ticon, "ptr"::nil);
+
+ chn := chan of int;
+ spawn handle_events(t, wmctl, ticon, iconctl, stat, chn);
+ return chn;
+}
+
+ppp_timer(sync: chan of int, stat: chan of int)
+{
+ for(;;) {
+ sys->sleep(pppquanta);
+ alt {
+ <-sync =>
+ return;
+ stat <-= -1 =>
+ ;
+ }
+ }
+}
+
+send(cmd: chan of string, msg: string)
+{
+ cmd <-= msg;
+}
+
+# Process events and pass disconnect cmd to calling app
+handle_events(t: ref Tk->Toplevel, wmctl: chan of string, ticon: ref Tk->Toplevel, iconctl: chan of string, stat, chn: chan of int)
+{
+ sys->pctl(Sys->NEWPGRP, nil);
+ cmd := chan of string;
+ tk->namechan(t, cmd, "cmd");
+
+ tsk := chan of string;
+ tk->namechan(ticon, tsk, "tsk");
+
+ connected := 0;
+ winmapped := 1;
+ timecount := 0;
+ xmin := 0;
+ x := 0;
+
+ iocmd := sys->file2chan("/chan", "pppgui");
+ if (iocmd == nil) {
+ sys->print("fail: pppgui: file2chan: /chan/pppgui: %r\n");
+ return;
+ }
+
+ pppquanta = DIALQUANTA;
+ sync_chan := chan of int;
+ spawn ppp_timer(sync_chan, stat);
+
+Work:
+ for(;;) alt {
+ s := <-t.ctxt.kbd =>
+ tk->keyboard(t, s);
+
+ s := <-t.ctxt.ptr =>
+ tk->pointer(t, *s);
+
+ s := <-t.ctxt.ctl or
+ s = <-t.wreq or
+ s = <-wmctl =>
+ tkclient->wmctl(t, s);
+
+ s := <-ticon.ctxt.kbd =>
+ tk->keyboard(ticon, s);
+ s := <-ticon.ctxt.ptr =>
+ tk->pointer(ticon, *s);
+ s := <-ticon.ctxt.ctl or
+ s = <-ticon.wreq or
+ s = <-iconctl =>
+ tkclient->wmctl(ticon, s);
+
+ (off, data, fid, wc) := <-iocmd.write => # remote io control
+ if (wc == nil)
+ break;
+ spawn send(cmd, string data[0:len data]);
+ wc <-= (len data, nil);
+
+ (nil, nbytes, fid, rc) := <-iocmd.read =>
+ if (rc != nil)
+ rc <-= (nil, "not readable");
+
+ press := <-cmd =>
+ case press {
+ "cancel" or "disconnect" =>
+ tk->cmd(t, ".stat configure -text 'Disconnecting...");
+ tk->cmd(t, "update");
+ ppp->reset();
+ if (!connected) {
+ # other end may have gone away
+ alt {
+ chn <-= 666 => ;
+ * => ;
+ }
+ }
+ break Work;
+ * => ;
+ }
+
+ prs := <-tsk =>
+ case prs {
+ "open" =>
+ tk->cmd(ticon, ". unmap; update");
+ tk->cmd(t, ". map; raise .; update");
+ winmapped = 1;
+ timecount = 0;
+ * => ;
+ }
+
+ s := <-stat =>
+ if (s == -1) { # just an update event
+ if(winmapped){
+ if(!connected) { # increment status bar
+ if (x < xmin+INCR) {
+ x++;
+ tk->cmd(t, ".cprog create rectangle 0 0 "+string x + BARH+" -fill "+LTGRN);
+ }
+ }else{
+ timecount++;
+ if(timecount > 1){
+ winmapped = 0;
+ timecount = 0;
+ tk->cmd(t, ". unmap; update");
+ tk->cmd(ticon, ". map; raise .; update");
+ continue;
+ }
+ }
+ tk->cmd(t, "raise .; update");
+ } else {
+ tk->cmd(ticon, "raise .; update");
+ timecount = 0;
+ }
+ continue;
+ }
+ if (s == ppp->s_Error) {
+ tk->cmd(t, ".stat configure -text '"+ppp->lasterror);
+ if (!winmapped) {
+ tk->cmd(ticon, ". unmap; update");
+ tk->cmd(t, ". map; raise .");
+ }
+ tk->cmd(t, "update");
+ sys->sleep(3000);
+ ppp->reset();
+ if (!connected)
+ chn <-= 0; # Failure
+ break Work;
+ }
+
+ if (s == ppp->s_Initialized)
+ tk->cmd(t,".cprog create rectangle 0 0 "+string BARW + BARH+" -fill "+PBG);
+
+ x = xmin = s * INCR;
+ if (xmin > BARW)
+ xmin = BARW;
+ tk->cmd(t, ".cprog create rectangle 0 0 "+string xmin + BARH+" -fill "+LTGRN);
+ tk->cmd(t, "raise .; update");
+ tk->cmd(t, ".stat configure -text '"+X(stat_msgs[s]));
+
+ if (s == ppp->s_SuccessPPP || s == ppp->s_Done) {
+ if(!connected){
+ chn <-= 1;
+ connected = 1;
+ }
+ pppquanta = ICONQUANTA;
+
+ # find and display connection speed
+ speed := findrate("/dev/modemstat", "rcvrate" :: "baud" :: nil);
+ if(speed != nil)
+ tk->cmd(t, ".stat configure -text {"+X(stat_msgs[s])+" "+speed+" bps}");
+ else
+ tk->cmd(t, ".stat configure -text {"+X(stat_msgs[s])+"}");
+ tk->cmd(t, ".done configure -text Disconnect -command 'send cmd disconnect");
+ tk->cmd(t, "update");
+ sys->sleep(2000);
+ tk->cmd(t, ". unmap; pack forget .fprog; update");
+ winmapped = 0;
+ tk->cmd(ticon, ". map; raise .; update");
+ }
+
+ tk->cmd(t, "update");
+ }
+ sync_chan <-= 1; # stop ppp_timer
+}
+
+findrate(file: string, opt: list of string): string
+{
+ fd := sys->open(file, sys->OREAD);
+ if(fd == nil)
+ return nil;
+ buf := array [1024] of byte;
+ n := sys->read(fd, buf, len buf);
+ if(n <= 1)
+ return nil;
+ (nil, flds) := sys->tokenize(string buf[0:n], " \t\r\n");
+ for(; flds != nil; flds = tl flds)
+ for(l := opt; l != nil; l = tl l)
+ if (hd flds == hd l)
+ return hd tl flds;
+ return nil;
+}
+
+
+
+# Translate a string
+
+X(s : string) : string
+{
+ if (dict== nil) return s;
+ return dict.xlate(s);
+}
+