TerminalSession.st
author Claus Gittinger <cg@exept.de>
Sun, 03 Jul 2016 10:10:06 +0200
changeset 3981 aa54de68b481
parent 3725 471628214f13
child 4027 c08940786e9a
permissions -rw-r--r--
#FEATURE by cg class: TerminalSession comment/format in: #documentation changed: #sendInterruptSignal
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
3595
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
     3
"{ NameSpace: Smalltalk }"
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
     4
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
Object subclass:#TerminalSession
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:'inStream outStream errStream readerProcess shellPid shellCommand
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
		shellDirectory readerDelay pluggableCheckBeforeReadAction
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
     8
		pluggableProcessInputAction execFDArray stxToStdinPipe
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
     9
		stdOutToStxPipe pty ptyName terminatedAction collectedOutput
3095
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
    10
		promptActions'
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
	classVariableNames:'Debug'
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
	poolDictionaries:''
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
	category:'Views-TerminalViews'
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
!TerminalSession class methodsFor:'documentation'!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
documentation
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
    This keeps the state and API to interact with another program
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    via a terminal session. Under Unix, a pseudo-tty connection
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
    is used; other operating systems might use other mechanisms.
3315
2b2c0d24f156 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3302
diff changeset
    23
    This is (currently) used by the GDBApplication, to interact
3981
aa54de68b481 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 3725
diff changeset
    24
    with gdb, cscope and the program.
aa54de68b481 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 3725
diff changeset
    25
    It can be used wherever more control is needed than a simple pipe
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
    offers (such as terminal emulation, window size, CTRL-c support etc.)
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
3302
aad2814c1e87 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3285
diff changeset
    28
    A lot of code has been Extracted from TerminalView, which will be refactored, 
3981
aa54de68b481 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 3725
diff changeset
    29
    once this is stable. 
aa54de68b481 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 3725
diff changeset
    30
    For now, there is some code duplication (as of Summer 2014).
3315
2b2c0d24f156 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3302
diff changeset
    31
2b2c0d24f156 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3302
diff changeset
    32
    outStream   - the controlled program's output (a pty-half)
2b2c0d24f156 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3302
diff changeset
    33
    inStream    - the controlled program's input (a pty-half)
2b2c0d24f156 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3302
diff changeset
    34
    errStream   - the controlled program's output (a pty-half)
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
! !
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
!TerminalSession class methodsFor:'initialization'!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
initialize
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    Debug := false.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    "
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
     self initialize
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    "
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
! !
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
!TerminalSession methodsFor:'accessing'!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
errStream
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    ^ errStream
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
inStream
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    ^ inStream
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
outStream
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    ^ outStream
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
pluggableCheckBeforeReadAction:something
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    pluggableCheckBeforeReadAction := something.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
pluggableProcessInputAction:something
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    pluggableProcessInputAction := something.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
3039
2f36acd9c8b2 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3038
diff changeset
    71
pty
2f36acd9c8b2 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3038
diff changeset
    72
    ^ pty
2f36acd9c8b2 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3038
diff changeset
    73
!
2f36acd9c8b2 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3038
diff changeset
    74
3040
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
    75
ptyName
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
    76
    ^ ptyName
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
    77
!
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
    78
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
shellCommand
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    ^ shellCommand
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
shellDirectory
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    ^ shellDirectory
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
shellPid
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    ^ shellPid
3084
43ba6ede1157 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3069
diff changeset
    89
!
43ba6ede1157 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3069
diff changeset
    90
43ba6ede1157 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3069
diff changeset
    91
terminatedAction:something
43ba6ede1157 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3069
diff changeset
    92
    terminatedAction := something.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
! !
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
!TerminalSession methodsFor:'initialization & release'!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
closeDownShell
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    "shut down my shell process and stop the background reader thread."
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    |pid|
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    (pid := shellPid) notNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
        Debug ifTrue:[
3724
3c722e973dd0 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 3722
diff changeset
   104
            Transcript show:'killing shell pid='; showCR:pid.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
        ].
3724
3c722e973dd0 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 3722
diff changeset
   106
        OperatingSystem isMSWINDOWSlike ifFalse:[
3c722e973dd0 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 3722
diff changeset
   107
            OperatingSystem terminateProcessGroup:pid.
3c722e973dd0 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 3722
diff changeset
   108
        ].    
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
        OperatingSystem terminateProcess:pid.
3725
471628214f13 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3724
diff changeset
   110
        Delay waitForSeconds:0.2.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
        shellPid notNil ifTrue:[
3725
471628214f13 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3724
diff changeset
   112
            "/ Delay waitForSeconds:1.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
            OperatingSystem isMSWINDOWSlike ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
                OperatingSystem killProcessGroup:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
            ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
            OperatingSystem killProcess:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
            shellPid := nil.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
        ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
        OperatingSystem closePid:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    "Modified: / 5.5.1999 / 18:43:02 / cg"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
closeStreams
3037
47f022308e7d class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3028
diff changeset
   126
    self stopReaderProcess.
47f022308e7d class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3028
diff changeset
   127
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    inStream notNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
        inStream isStream ifTrue:[inStream close].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
        inStream := nil
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    outStream notNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
        outStream close.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
        outStream := nil
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
    errStream notNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
        errStream close.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
        errStream := nil
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   142
createTerminalConnectionAndSetupWith:setupBlock
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   143
    "create a terminal conenction (pseudo terminal or pipe)"
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   144
3040
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   145
    |slaveFD master slave ptyTriple|
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   146
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   147
    OperatingSystem isMSWINDOWSlike ifTrue:[
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   148
        "use two pipes to COMMAND.COM"
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   149
        stxToStdinPipe := NonPositionableExternalStream makePipe.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   150
        stxToStdinPipe isNil ifTrue:[
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   151
            self error:(self class classResources string:'Could not create pipe to COMMAND.COM.') mayProceed:true. 
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   152
            ^ self.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   153
        ].
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   154
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   155
        stdOutToStxPipe := NonPositionableExternalStream makePipe.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   156
        stdOutToStxPipe isNil ifTrue:[
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   157
            self error:(self class classResources classResources string:'Could not create pipe from COMMAND.COM.') mayProceed:true. 
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   158
            ^ self.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   159
        ].
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   160
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   161
        "/ pipe readSide is p at:1;
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   162
        "/      writeSide is p at:2
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   163
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   164
        slaveFD := (stdOutToStxPipe at:2) fileDescriptor.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   165
        execFDArray := Array 
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   166
                         with:(stxToStdinPipe at:1) fileDescriptor        "stdin"
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   167
                         with:slaveFD                                       "stdout"
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   168
                         with:slaveFD.                                      "stderr"
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   169
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   170
        outStream := stdOutToStxPipe at:1.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   171
        inStream  := stxToStdinPipe at:2.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   172
    ] ifFalse:[
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   173
        "Use a pseudo-tty"
3040
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   174
        ptyTriple := OperatingSystem makePTY.
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   175
        ptyTriple isNil ifTrue:[
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   176
            self warn:'Cannot open pty.'.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   177
            ^ self.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   178
        ].
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   179
3040
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   180
        ptyName := ptyTriple at:3.
3039
2f36acd9c8b2 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3038
diff changeset
   181
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   182
        "/ pty at:1 is the master;
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   183
        "/ pty at:2 is the slave
3040
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   184
        master := NonPositionableExternalStream forReadWriteToFileDescriptor:(ptyTriple at:1).
3039
2f36acd9c8b2 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3038
diff changeset
   185
        master buffered:false.
2f36acd9c8b2 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3038
diff changeset
   186
3040
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   187
        slave := NonPositionableExternalStream forReadWriteToFileDescriptor:(ptyTriple at:2).
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   188
        slave buffered:false.
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   189
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   190
        pty := { master . slave }.
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   191
3039
2f36acd9c8b2 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3038
diff changeset
   192
        inStream := outStream := master.
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   193
        setupBlock value.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   194
        "/ fork a shell process on the slave-side
3040
c455569df459 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3039
diff changeset
   195
        slaveFD := (ptyTriple at:2).
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   196
        execFDArray := Array with:slaveFD with:slaveFD with:slaveFD.
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   197
    ].
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   198
!
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   199
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
killShell
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    "shut down my shell process and stop the background reader thread."
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    |pid|
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    (pid := shellPid) notNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
        Debug ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
            Transcript show:'killing shell pid='; showCR:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
        ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
        OperatingSystem terminateProcessGroup:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
        OperatingSystem terminateProcess:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
        Delay waitForSeconds:1.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
        shellPid notNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
            OperatingSystem isMSWINDOWSlike ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
                OperatingSystem killProcessGroup:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
            ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
            OperatingSystem killProcess:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
            shellPid := nil.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
        ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
        OperatingSystem closePid:pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
reinitialize
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    shellPid := nil.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    inStream := outStream := errStream := nil.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
3084
43ba6ede1157 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3069
diff changeset
   228
startCommand:aCommand in:aDirectory environment:envIn setupTerminalWith:setupBlock terminatedAction:terminatedActionArg
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
    "start a command on a pseudo terminal. If the command arg is nil,
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
     a shell is started. If aDirectory is not nil, the command is
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
     executed in that directory.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
     Also fork a reader process, to read the shell's output and
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
     tell me, whenever something arrives"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   235
    |blocked exitStatus 
3088
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   236
     cmd shell args env shellAndArgs didOpenTerminal|
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    shellCommand := aCommand.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    shellDirectory := aDirectory.
3084
43ba6ede1157 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3069
diff changeset
   240
    terminatedAction := terminatedActionArg.
3088
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   241
    didOpenTerminal := false.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
3085
bd99146f19bf class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3084
diff changeset
   243
    (inStream isNil or:[outStream isNil]) ifTrue:[
bd99146f19bf class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3084
diff changeset
   244
        self createTerminalConnectionAndSetupWith:setupBlock.
3088
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   245
        didOpenTerminal := true.
3085
bd99146f19bf class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3084
diff changeset
   246
    ].
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
    OperatingSystem isMSWINDOWSlike ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
        shellAndArgs := OperatingSystem commandAndArgsForOSCommand:aCommand.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
        shell := shellAndArgs at:1.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
        args  := (shellAndArgs at:2) ? ''.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
    ] ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
        aCommand isNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
            shell := OperatingSystem getEnvironment:'SHELL'.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
            shell size == 0 ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
                shell := '/bin/sh'.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
            ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
            cmd := shell asFilename baseName.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
            args := (Array with:cmd).
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
        ] ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
            shell := '/bin/sh'.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
            args := (Array with:'sh' with:'-c' with:aCommand).
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
        ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
        env := Dictionary new.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
        env declareAllFrom:envIn.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
        env at:'SHELL' put:shell.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    blocked := OperatingSystem blockInterrupts.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
    shellPid := Processor
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
               monitor:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
                  OperatingSystem
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
                      exec:shell
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
                      withArguments:args
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
                      environment:env
3038
c418ee215311 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3037
diff changeset
   276
                      fileDescriptors:execFDArray
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
                      fork:true
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
                      newPgrp:true
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
                      inDirectory:aDirectory.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
               ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
               action:[:status |
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
                    Debug ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
                        Transcript show:'pid:'; showCR:status pid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
                        Transcript show:'status:'; showCR:status status.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
                        Transcript show:'code:'; showCR:status code.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
                        Transcript show:'core:'; showCR:status core.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
                    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
                    status stillAlive ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
                        exitStatus := status.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
                        OperatingSystem closePid:shellPid.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
                        shellPid := nil.
3135
623a3d09191b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3132
diff changeset
   292
                        terminatedAction valueWithOptionalArgument:status
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
                    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
               ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
    blocked ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
        OperatingSystem unblockInterrupts
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
    "close the slave side of the pty/pipes (only used by the child)"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
    pty notNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
        (pty at:2) close.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
3088
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   305
    didOpenTerminal ifTrue:[
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   306
        stdOutToStxPipe notNil ifTrue:[
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   307
            (stdOutToStxPipe at:2) close.
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   308
            (stxToStdinPipe at:1) close.
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   309
        ].
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
3088
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   311
        shellPid isNil ifTrue:[
3069
4c01425c7095 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3040
diff changeset
   312
        "/ self warn:'Cannot start shell'.
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   313
            outStream notNil ifTrue:[outStream close].
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   314
            inStream notNil ifTrue:[inStream close].
3088
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   315
            inStream := outStream := nil.
52f83256a664 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3087
diff changeset
   316
        ].
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
    ].
3069
4c01425c7095 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3040
diff changeset
   318
    ^ shellPid
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
3069
4c01425c7095 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3040
diff changeset
   320
    "Created: / 20-07-1998 / 18:19:32 / cg"
4c01425c7095 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3040
diff changeset
   321
    "Modified: / 01-08-2013 / 20:38:37 / cg"
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
! !
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
!TerminalSession methodsFor:'input / output'!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
paste:someText
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
    "paste - redefined to send the chars to the shell instead
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
     of pasting into the view"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
    |s nLines|
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
    s := someText.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
    s isString ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
        s := s asStringCollection
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    ] ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
        (s isKindOf:StringCollection) ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
            self warn:'selection (' , s class name , ') is not convertable to Text'.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
            ^ self
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
        ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
    (nLines := s size) == 0 ifTrue:[^ self].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
    (nLines == 1 and:[(s at:1) size == 0]) ifTrue:[^ self].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
    s keysAndValuesDo:[:idx :line |
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
        line notNil ifTrue:[inStream nextPutAll:line].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
        idx ~~ nLines ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
            self sendLineEnd.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
        ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
    "Modified: / 12.6.1998 / 22:12:47 / cg"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
3112
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   353
sendCharacter:aCharacter
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   354
    inStream nextPut:aCharacter.
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   355
!
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   356
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
sendLine:aString
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
    inStream nextPutAll:aString.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    self sendLineEnd
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
sendLineEnd
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
    OperatingSystem isMSDOSlike ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
        inStream nextPut:Character return.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
        inStream nextPut:Character linefeed.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
    ] ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
        inStream nextPut:Character return.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
! !
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
!TerminalSession methodsFor:'misc'!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   373
collectedOutput
3097
529fbe182ce0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3096
diff changeset
   374
    "return any collected output, so far"
529fbe182ce0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3096
diff changeset
   375
529fbe182ce0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3096
diff changeset
   376
    collectedOutput isNil ifTrue:[^ nil].
529fbe182ce0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3096
diff changeset
   377
    ^ collectedOutput contents
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   378
!
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   379
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
defineWindowSizeLines:numberOfLines columns:numberOfColumns
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
    | delta prevNumCols prevNumLines|
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
    "/ any idea, how to do this under windows ?
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
    OperatingSystem isUNIXlike ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
        "/
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
        "/ tell the pty;
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
        "/ tell the shell;
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
        "/
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
        (inStream notNil 
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
        and:[inStream isExternalStream
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
        and:[inStream isOpen]]) ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
            Debug ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
                Transcript showCR:'TerminalSession [info]: changed len to ', numberOfLines printString.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
            ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
            (OperatingSystem 
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
                setWindowSizeOnFileDescriptor:inStream fileDescriptor
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
                width:numberOfColumns
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
                height:numberOfLines) ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
                Debug ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
                    Transcript showCR:'TerminalSession [warning]: cannot change windowSize'.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
                ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
            ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
        ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
        shellPid notNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
            OperatingSystem sendSignal:OperatingSystem sigWINCH to:shellPid
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
        ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
    "Created: / 11.6.1998 / 22:51:39 / cg"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
    "Modified: / 5.5.1999 / 19:45:09 / cg"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
3110
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   415
forgetPrompt:aString
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   416
    promptActions removeKey:aString
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   417
!
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   418
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   419
onPrompt:aString do:aBlock
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   420
    "remember what to do, when a prompt arrives;
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   421
     notice: will only start checking for prompt, when startCollectingOutput
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   422
     has been called."
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   423
3095
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   424
    promptActions := Dictionary new
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   425
                        at:aString put:aBlock;
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   426
                        yourself
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   427
!
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   428
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   429
onPrompt:string1 do:block1 onPrompt:string2 do:block2
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   430
    "remember what to do, when a prompt arrives;
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   431
     notice: will only start checking for prompt, when startCollectingOutput
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   432
     has been called."
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   433
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   434
    promptActions := Dictionary new
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   435
                        at:string1 put:block1;
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   436
                        at:string2 put:block2;
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   437
                        yourself
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   438
!
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   439
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   440
outputFromAction:aBlock prompt:prompt timeout:seconds
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   441
    "evaluate aBlock and wait for the prompt.
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   442
     return gdb output as string collection"
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   443
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   444
    ^ self
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   445
        outputFromAction:aBlock 
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   446
        prompt:prompt 
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   447
        timeout:seconds
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   448
        to:nil
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   449
!
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   450
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   451
outputFromAction:aBlock prompt:prompt timeout:seconds to:aStreamOrNil
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   452
    "evaluate aBlock and wait for the prompt.
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   453
     return gdb output as string collection"
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   454
3112
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   455
    |sema output lastSize gotPrompt|
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   456
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   457
    sema := Semaphore new.
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   458
    aStreamOrNil isNil ifTrue:[
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   459
        self startCollectingOutput.
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   460
    ] ifFalse:[
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   461
        self startCollectingOutputTo:aStreamOrNil
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   462
    ].
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   463
    self onPrompt:prompt do:[:strings | output := strings. sema signal. ].
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   464
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   465
    aBlock value.
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   466
3112
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   467
    lastSize := 0.
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   468
    [
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   469
        |newSize|
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   470
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   471
        (gotPrompt := (sema waitWithTimeout:seconds) notNil) ifFalse:[
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   472
            newSize := collectedOutput size.
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   473
            Transcript show:'timeout - output size is: '; showCR:newSize.
3595
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
   474
            newSize > 100000 ifTrue:[
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
   475
                self stopCollectingOutput.
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
   476
                self onPrompt:nil do:nil.
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
   477
                collectedOutput := nil.
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
   478
                TimeoutError raiseRequestErrorString:'GDB output too big'.
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
   479
            ].
3112
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   480
            newSize = lastSize ifTrue:[
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   481
                "/ self information:'Error: command timeout.'.
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   482
                self stopCollectingOutput.
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   483
                self onPrompt:nil do:nil.
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   484
                TimeoutError raiseRequestErrorString:'GDB command timeout'.
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   485
            ].
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   486
            lastSize := newSize.
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   487
        ].  
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   488
    ] doWhile:[ gotPrompt not ].
48fe32a582b4 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3111
diff changeset
   489
3111
9db40cb12c21 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3110
diff changeset
   490
    output notEmptyOrNil ifTrue:[
9db40cb12c21 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3110
diff changeset
   491
        output first isEmpty ifTrue:[
9db40cb12c21 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3110
diff changeset
   492
            "/ self halt.
9db40cb12c21 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3110
diff changeset
   493
            output := output copyFrom:2
9db40cb12c21 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3110
diff changeset
   494
        ].
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   495
    ].
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   496
    ^ output
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   497
!
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   498
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   499
outputFromCommand:aCommand prompt:prompt timeout:seconds
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   500
    "return a command's output as string collection"
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   501
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   502
    ^ self
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   503
        outputFromCommand:aCommand 
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   504
        prompt:prompt 
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   505
        timeout:seconds 
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   506
        to:nil
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   507
!
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   508
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   509
outputFromCommand:aCommand prompt:prompt timeout:seconds to:aStreamOrNil
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   510
    "return a command's output as string collection"
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   511
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   512
    |output firstLine|
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   513
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   514
    output := self 
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   515
                outputFromAction:[ self sendLine:aCommand ]
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   516
                prompt:prompt 
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   517
                timeout:seconds
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   518
                to:aStreamOrNil.
3111
9db40cb12c21 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3110
diff changeset
   519
    output isEmptyOrNil ifTrue:[^ output].
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   520
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   521
    "/ the first line of output is the echo
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   522
    firstLine := output first withoutLeadingSeparators.
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   523
    firstLine ~= aCommand ifTrue:[
3135
623a3d09191b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3132
diff changeset
   524
        (aCommand startsWith:firstLine) ifTrue:[
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   525
            "/ sigh - it is sometimes truncated (to be investigated)
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   526
            self halt.
3135
623a3d09191b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3132
diff changeset
   527
            ^ output.
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   528
        ].
3135
623a3d09191b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3132
diff changeset
   529
        "/ self halt.
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   530
        ^ output.
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   531
    ].
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   532
    ^ output copyFrom:2
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   533
!
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   534
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   535
sendInterruptSignal
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
    "send an INT-signal to the shell (UNIX only)"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
    shellPid notNil ifTrue:[
3722
2038d4cd1afa #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3713
diff changeset
   539
        OperatingSystem interruptProcessGroup:shellPid.
3981
aa54de68b481 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 3725
diff changeset
   540
        OperatingSystem interruptProcess:shellPid.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
    "Modified: / 10.6.1998 / 17:49:49 / cg"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
sendKillSignal
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
    "send a KILL-signal to the shell (UNIX only)"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
    shellPid notNil ifTrue:[
3722
2038d4cd1afa #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3713
diff changeset
   550
        OperatingSystem killProcessGroup:shellPid.
2038d4cd1afa #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3713
diff changeset
   551
        OperatingSystem killProcess:shellPid.
2038d4cd1afa #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3713
diff changeset
   552
        OperatingSystem childProcessWait:false pid:shellPid.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
    ]
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   554
!
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   555
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   556
startCollectingOutput
3097
529fbe182ce0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3096
diff changeset
   557
    "start collecting output in a collecting stream"
529fbe182ce0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3096
diff changeset
   558
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   559
    self startCollectingOutputTo:(WriteStream on:(String new:1000)).
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   560
!
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   561
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   562
startCollectingOutputTo:aStream
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   563
    "start collecting output into a collecting (or other) stream"
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   564
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   565
    collectedOutput := aStream.
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   566
!
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   567
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   568
stopCollectingOutput
3097
529fbe182ce0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3096
diff changeset
   569
    "start collecting output in a collecting stream"
529fbe182ce0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3096
diff changeset
   570
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   571
    collectedOutput := nil.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
! !
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
!TerminalSession methodsFor:'reader process'!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   576
collectOutputAndCheckForPrompt:buffer count:n
3110
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   577
    |string collectedString collectedLines i i2 lastLine|
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   578
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   579
    collectedOutput isNil ifTrue:[^ self].
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   580
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   581
    string := buffer copyTo:n.
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   582
    collectedOutput nextPutAll:string.
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   583
3095
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   584
    promptActions notNil ifTrue:[
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   585
        collectedString := collectedOutput contents.
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   586
        i := collectedString lastIndexOf:Character lf.
3713
a02088a8910d #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3595
diff changeset
   587
        i ~~ 0 ifTrue:[
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   588
            lastLine := (collectedString copyFrom:i+1) withoutTrailingSeparators.
3110
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   589
            lastLine isEmpty ifTrue:[
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   590
                i2 := collectedString lastIndexOf:Character lf startingAt:(i-1).
3713
a02088a8910d #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3595
diff changeset
   591
                i2 ~~ 0 ifTrue:[
3110
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   592
                    lastLine := (collectedString copyFrom:i2+1 to:i-1) withoutTrailingSeparators.
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   593
                ].
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   594
            ].
2e9ebced59e6 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3097
diff changeset
   595
            "/ Transcript show:lastLine; showCR:lastLine asByteArray.
3095
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   596
            promptActions keysAndValuesDo:[:expectedPrompt :promptAction |
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   597
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   598
                ((lastLine endsWith:expectedPrompt) 
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   599
                or:[ (lastLine startsWith:expectedPrompt) ]) ifTrue:[
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   600
                    "/ ('found prompt; call ',promptAction printString) printCR.
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   601
3095
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   602
                    "/ perform the promptaction
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   603
                    collectedLines := collectedString asStringCollection 
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   604
                                        collect:[:each | 
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   605
                                            (each endsWith:String crlf) 
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   606
                                                    ifTrue:[ each copyButLast:2 ]
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   607
                                                    ifFalse:[
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   608
                                                        (each endsWith:Character return) 
3317
4602d20cdba0 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3315
diff changeset
   609
                                                            ifTrue:[ each copyButLast ]
3095
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   610
                                                            ifFalse:[ each ]]].
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   611
                    collectedLines removeLast.  "/ the prompt itself
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   612
                    promptAction value: collectedLines.
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   613
                ]
10715ba9921b class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3088
diff changeset
   614
            ].
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   615
        ].
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   616
    ].
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   617
!
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   618
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
readAnyAvailableData
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
    "read data from the stream,
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
     and sends me #processInput:n: events if something arrived.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
     Returns the amount of data read."
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   624
    |buffer bufferSize n|
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   625
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
    outStream isNil ifTrue:[^ 0].   "/ already closed
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
3132
cadb44acf325 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3112
diff changeset
   628
    bufferSize := 1024.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
    buffer := String new:bufferSize.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
    ExternalStream readErrorSignal handle:[:ex |
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
        n := 0
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
    ] do:[
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   634
        |line|
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   635
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   636
        collectedOutput class == ActorStream ifTrue:[
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   637
            (outStream readWaitWithTimeout:0.5) ifTrue:[
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   638
                n := 0
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   639
            ] ifFalse:[
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   640
                line := outStream nextLine,Character cr.
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   641
                n := line size.
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   642
                pluggableProcessInputAction notNil ifTrue:[
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   643
                    pluggableProcessInputAction value:line value:n.
3285
dded4dc30bac class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3276
diff changeset
   644
                ].
dded4dc30bac class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3276
diff changeset
   645
                collectedOutput notNil ifTrue:[
dded4dc30bac class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3276
diff changeset
   646
                    self collectOutputAndCheckForPrompt:line count:n.
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   647
                ]
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   648
            ]
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   649
        ] ifFalse:[
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   650
            n := outStream nextAvailableBytes:bufferSize into:buffer startingAt:1.
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   651
            n > 0 ifTrue:[
3285
dded4dc30bac class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3276
diff changeset
   652
                pluggableProcessInputAction notNil ifTrue:[
dded4dc30bac class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3276
diff changeset
   653
                    pluggableProcessInputAction value:buffer value:n.
dded4dc30bac class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3276
diff changeset
   654
                ].
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   655
                collectedOutput notNil ifTrue:[
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   656
                    self collectOutputAndCheckForPrompt:buffer count:n
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   657
                ].
3087
21384929202f class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3085
diff changeset
   658
            ].
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
        ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
    ^ n
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
readerProcessLoop
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
    "look for the session's output"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
    StreamError handle:[:ex |
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
        Transcript show:'Terminal(PTY-reader) [error]: '; showCR:ex description.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
    ] do:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   670
        [true] whileTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
            AbortOperationRequest handle:[:ex |
3096
e3e3a28294f5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3095
diff changeset
   672
                ^ self
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
            ] do:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
                |n sensor|
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
                readerDelay notNil ifTrue:[ Delay waitForSeconds:readerDelay].
3276
180b977dcbe5 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
   677
                outStream isNil ifTrue:[^ self].
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
                outStream readWait.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
                (pluggableCheckBeforeReadAction isNil
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
                or:[pluggableCheckBeforeReadAction value]) ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
                    n := self readAnyAvailableData.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   683
                    n == 0 ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   684
                        "/ Windows IPC has a bug - it always
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
                        "/ returns 0 (when the command is idle)
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   686
                        "/ and says it's at the end (sigh)
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   688
                        OperatingSystem isMSWINDOWSlike ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
                            Delay waitForSeconds:0.1
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
                        ] ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
                            outStream atEnd ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
                                outStream close. outStream := nil.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
                                inStream close.  inStream := nil.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
                                Processor activeProcess terminate.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
                            ] ifFalse:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
                                "/ this should not happen.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
                                Delay waitForSeconds:0.1
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
                            ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
                        ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
                    ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
                ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
            ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
        ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
    ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
startReaderProcess
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   709
    "Start a reader process, which looks for the commands output,
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
     and sends me #processInput:n: events whenever something arrives."
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
    readerProcess isNil ifTrue:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
        readerProcess := [
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
            [
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
                self readerProcessLoop.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
            ] ifCurtailed:[
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
                readerProcess := nil    
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
            ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
        ] fork. "/ forkAt:9.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
        readerProcess name:'pty reader'.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
    ]
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
    "
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
     VT100TerminalView openShell
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
    "
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
    "Modified: / 5.5.1999 / 17:58:02 / cg"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
    "Modified: / 28.1.2002 / 21:10:13 / micha"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   731
stopReaderProcess
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
    "stop the background reader thread"
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
3037
47f022308e7d class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3028
diff changeset
   734
    |p|
47f022308e7d class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3028
diff changeset
   735
47f022308e7d class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3028
diff changeset
   736
    (p := readerProcess) notNil ifTrue:[
47f022308e7d class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3028
diff changeset
   737
        readerProcess := nil.
47f022308e7d class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3028
diff changeset
   738
        p terminate.
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
        "/ give it a chance to really terminate
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
        Processor yield.
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
    ].
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
! !
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
!TerminalSession class methodsFor:'documentation'!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
version
3595
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
   747
    ^ '$Header$'
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
!
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
version_CVS
3595
d212572ec418 class: TerminalSession
Claus Gittinger <cg@exept.de>
parents: 3317
diff changeset
   751
    ^ '$Header$'
3028
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   752
! !
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
e49cf8755fd6 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   755
TerminalSession initialize!