VDBUnixReplayServerConsoleApplication.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 18 Feb 2019 10:55:12 +0000
changeset 154 26937faa5a97
parent 115 0dd989ce3ae7
child 164 364ebdd1d42c
permissions -rw-r--r--
Use standard `#enqueueMessage:` mechanism to enqueue delayed updates rather than baking our own `#enqueueDelayedUpdate:`. The former is "standard" API defined in `ApplicationModel`. We still need to specialize that behavior in (overridden) `#enqueueMessage:for:arguments:` but API-wise, we use the standard API.

"
jv:vdb - Visual / VM Debugger
Copyright (C) 2015-now Jan Vrany

This software is licensed under 'Creative Commons Attribution-NonCommercial 4.0 International License'

You may find a full license text in LICENSE.txt or at http://creativecommons.org/licenses/by-nc/4.0/
"
"{ Package: 'jv:vdb' }"

"{ NameSpace: Smalltalk }"

VDBAbstractUnixConsoleApplication subclass:#VDBUnixReplayServerConsoleApplication
	instanceVariableNames:'rrHolder rr'
	classVariableNames:''
	poolDictionaries:''
	category:'VDB-UI-Console-Unix'
!

!VDBUnixReplayServerConsoleApplication class methodsFor:'documentation'!

copyright
"
jv:vdb - Visual / VM Debugger
Copyright (C) 2015-now Jan Vrany

This software is licensed under 'Creative Commons Attribution-NonCommercial 4.0 International License'

You may find a full license text in LICENSE.txt or at http://creativecommons.org/licenses/by-nc/4.0/
"
! !

!VDBUnixReplayServerConsoleApplication class methodsFor:'accessing'!

defaultWindowTitle
    ^ self resources string: 'Replay Console'

    "Created: / 26-07-2018 / 17:12:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 03-10-2018 / 15:39:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBUnixReplayServerConsoleApplication methodsFor:'accessing'!

consoleInput
    "superclass VDBAbstractConsoleApplication says that I am responsible to implement this method"

    ^ rr consoleInput

    "Modified: / 26-07-2018 / 17:14:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

consoleOutput
    "superclass VDBAbstractConsoleApplication says that I am responsible to implement this method"

    ^ rr consoleOutput

    "Modified: / 26-07-2018 / 17:14:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBUnixReplayServerConsoleApplication methodsFor:'acessing'!

rr
    ^ rr

    "Created: / 26-07-2018 / 17:17:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

rr: aRR
    self rrHolder value: aRR

    "Created: / 26-07-2018 / 17:17:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBUnixReplayServerConsoleApplication methodsFor:'aspects'!

consoleView
    consoleView isNil ifTrue:[ 
        consoleView :=VT100TerminalView new.
        consoleView foregroundColor: Color white
                    backgroundColor: Color black;
                    cursorForegroundColor: Color white
                          backgroundColor: Color white.
        rr notNil ifTrue:[ 
            consoleView inStream: self consoleInput.
            consoleView outStream: self consoleOutput.
            consoleView startReaderProcessWhenVisible.
        ].
    ].
    ^ consoleView

    "Created: / 26-07-2018 / 20:27:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

rrHolder
    "return/create the 'debuggerHolder' value holder (automatically generated)"

    rrHolder isNil ifTrue:[
        rrHolder := ValueHolder new.
        rrHolder addDependent:self.
    ].
    ^ rrHolder

    "Created: / 26-07-2018 / 17:17:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

rrHolder:aValueModel
    "set the 'debuggerHolder' value holder (automatically generated)"

    |oldValue newValue|

    rrHolder notNil ifTrue:[
        oldValue := rrHolder value.
        rrHolder removeDependent:self.
    ].
    rrHolder := aValueModel.
    rrHolder notNil ifTrue:[
        rrHolder addDependent:self.
    ].
    newValue := rrHolder value.
    oldValue ~~ newValue ifTrue:[
        self update:#value with:newValue from:rrHolder.
    ].

    "Created: / 26-07-2018 / 17:18:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBUnixReplayServerConsoleApplication methodsFor:'change & update'!

update:something with:aParameter from:changedObject
    "Invoked when an object that I depend upon sends a change notification."

    changedObject == rrHolder ifTrue:[
        rrHolder value == rr ifFalse:[
            rr notNil ifTrue:[ 
                self unsubscribe.
            ].
            rr := rrHolder value.
            rr notNil ifTrue:[ 
                self subscribe.
            ].
        ].
        ^ self.
    ].
    super update:something with:aParameter from:changedObject

    "Created: / 26-07-2018 / 17:19:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBUnixReplayServerConsoleApplication methodsFor:'event handling'!

onRRExitEvent: anRRTerminaedEvent
    consoleView notNil ifTrue:[
        | status info |
        status := anRRTerminaedEvent status.
        consoleView cr.
        (status success or:[status status == #signal and:[status code == UnixOperatingSystem sigTERM]]) ifTrue:[ 
            info := resources string: '>> replay server terminated'
        ] ifFalse:[status isError ifTrue:[
            info := resources string: '>> replay server terminated (with status %1)' with: anRRTerminaedEvent status code.
        ] ifFalse:[status status == #signal ifTrue:[ 
            info := resources string: '>> replay server crashed (signal %1)' with: anRRTerminaedEvent status code.    
        ]]].
        consoleView nextPutLine: (info asText allBold colorizeAllWith:Color red).
    ].

    "Created: / 31-07-2018 / 08:52:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

onRRStartEvent: anRRStartedEvent

    "Created: / 31-07-2018 / 08:52:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBUnixReplayServerConsoleApplication methodsFor:'initialization & release'!

subscribe
    "Register for debugger events. To be overrided by subclasses"
    
    super subscribe.
    rr notNil ifTrue:[
        (rr announcer)
            when:RRStartEvent
                send:#onRRStartEvent:
                to:self;
            when:RRExitEvent
                send:#onRRExitEvent:
                to:self.
        consoleView notNil ifTrue:[
            consoleView stopReaderProcess.
            consoleView inStream:self consoleInput.
            consoleView outStream:self consoleOutput.
            consoleView startReaderProcessWhenVisible.
        ].
    ].

    "Created: / 26-07-2018 / 17:19:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 31-07-2018 / 08:53:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

unsubscribe
    "Unsubscribe myself fo debugger events"

    super unsubscribe.
    rr notNil ifTrue:[ 
        rr announcer unsubscribe: self. 
    ].
    consoleView notNil ifTrue:[ 
        consoleView stopReaderProcess.
        consoleView inStream: nil.
        consoleView outStream: nil.
    ].

    "Created: / 26-07-2018 / 17:20:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 31-07-2018 / 08:38:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!VDBUnixReplayServerConsoleApplication methodsFor:'startup & release'!

closeRequest
    (rr notNil and:[ rr running ]) ifTrue:[ 
        (Dialog confirm: (resources string: 'Replay Server is running. Stop server and close?')) ifFalse:[ 
            ^ self.
        ].
        rr stop.
    ].
    ^ super closeRequest.

    "Created: / 27-07-2018 / 07:49:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !