Patch title: Release 96 bulk changes
Abstract:
File: /pliant/graphic/ui/client/connect.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "context.pli"
module "/pliant/util/pml/io.pli"
module "/pliant/util/pml/channel.pli"


function url_split url protocol server path
  arg Str url ; arg_w Str protocol server path
  var Str all := url
  var Int dp := all search ":" -1
  var Int slash := all search "/" all:len
  if dp>0 and slash>dp
    protocol := all 0 dp ; all := all dp+1 all:len
  else
    protocol := ""
  if (all eparse "//" any:server "/" any:path)
    path := "/"+path
  else
    server := "" ; path := all


method session connect_another url context s -> status
  arg_rw UISession session ; arg Str url ; arg Dictionary context ; arg_rw Stream s ; arg ExtendedStatus status
  url_split url (var Str protocol) (var Str server) (var Str path)
  # console "connect to url " url " -> " protocol " , " server " , " path eol
  if protocol="loopback"
    status := s open "loopback:/client/ui" in+out+safe+noautopost
    s otag "pliant"
    s oattr "service" "ui"
  eif protocol="tcp"
    if (server eparse any:(var Str server2) ":" (var Int port))
      server := server2
    else
      port := 36
    status := s open "tcp://"+server+"/client/"+string:port in+out+safe+noautopost # FIXME: find correct port
    s otag "pliant"
    s oattr "service" "ui"
  eif (protocol parse word:"tcp" any:(var Str server) _ (var Int port))
    status := s open "tcp://"+server+"/client/"+string:port in+out+safe+noautopost # FIXME: find correct port
    s otag "pliant"
    s oattr "service" "ui"
  eif protocol="host" or protocol="site"
    var Pointer:UILogin login :> session:console:login first server
    if not exists:login
      login :> session:console:login first ""
    if exists:login and login:secured
      status := s open "zchannel2:/ui/"+protocol+"/"+server+"/user/"+login:user+"/"+login:password in+out+safe+noautopost
    else
      status := failure "no login"
  var Pointer:UILogin login :> session:console:login first server
  if not exists:login
    login :> session:console:login first ""
  if exists:login and not login:secured
    s otag "login" login:user login:password
  if status=failure
    console "server connection oops" eol


method session connect_main url context -> s
  arg_rw UISession session ; arg Str url ; arg Dictionary context ; arg Link:Stream s
  each extra session:extra_connections
    extra safe_configure "shutdown"
  session url := url
  session context := context
  session namespace := var Dictionary empty_dictionary
  s :> new Stream
  session connect_another url context s
  url_split url (var Str protocol) (var Str server) (var Str path)
  if protocol="tcp" and (server eparse any:(var Str server2) ":" (var Int port))
    server := server2
  eif protocol="host"
    server := ""
  s otag "connect" server path
  # console "connect '" server "' '" path "'" eol
  s flush anytime
  session connection :> s
  thread
    part session "ui session instructions processor"
      var UIClientContext cc
      cc session :> share session
      cc connection :> s
      cc eos := false
      while not cc:eos and s=success
        # if (s ipick open (var Ident id))
        #   console "instuction " (cast id Str) eol
        cc process_instruction true


export url_split '. connect_main' '. connect_another'