content: module CertServerF(certServerF,backspace) where
  import Fudgets
  --import AllFudgets(expandTabs)
  import Char(isDigit)
  import FudExtras(longTextChoicePopupF)
  
  certServerF =
     loopThroughRightF (absF certServerSP)
  	             (delayF shF>+<longTextChoicePopupF)
  
  shF = --teeF show "shF" >==<
        (inputLinesSP -+- inputLinesSP) >^^=< subProcessF "sh" >=^< (++"\n")
  
  certServerSP = loop
    where
      loop = get $ either ignore fromInput
  
      ignore _ = loop -- ignore output from shell while waiting for a cmd
  
      fromInput cmd =
        putSh ("LANG=C "++cmd ++ " ; echo +-+ $?") $
        getResult $ \ res ->
        output res $
        loop
  
  getResult cont = loop []
    where
      loop acc = dispatch fromShell fromPopup ignore
        where
          ignore _ = loop acc -- ignore new cmds while a cmd is in progress
  
          fromShell l =
  	  case l of
  	    Left ('+':'-':'+':' ':s) | all isDigit s ->
  	      cont (s=="0",reverse acc)
  	    Right "+-+ Yes No" -> popup (msgTxt acc,("Yes","No")) (loop [])
  	    --Right ('+':'-':'+':' ':s) -> cont (s=="0",reverse acc)
  	    _ -> loop (mapEither backspace backspace l:acc)
  
          fromPopup msg = putSh msg (loop acc)
  
          msgTxt = map stripEither . reverse
  
  output = put . Right
  putSh = put . Left . Left
  popup = put . Left . Right
  
  dispatch fromShell fromPopup fromInput =
      get $ either (either fromShell fromPopup) fromInput
  
  --confirmString Confirm = "Yes"
  --confirmString Cancel = "No"
  
  
  -- Interpret the backspace control character:
  backspace = bs []
    where
      bs ls ('\b':rs) = bs (drop 1 ls) rs
      bs ls (r:rs) = bs (r:ls) rs
      bs ls [] = reverse ls
  