github.com/noxiouz/docker@v0.7.3-0.20160629055221-3d231c78e8c5/pkg/term/windows/ansi_writer.go (about) 1 // +build windows 2 3 package windows 4 5 import ( 6 "os" 7 8 ansiterm "github.com/Azure/go-ansiterm" 9 "github.com/Azure/go-ansiterm/winterm" 10 ) 11 12 // ansiWriter wraps a standard output file (e.g., os.Stdout) providing ANSI sequence translation. 13 type ansiWriter struct { 14 file *os.File 15 fd uintptr 16 infoReset *winterm.CONSOLE_SCREEN_BUFFER_INFO 17 command []byte 18 escapeSequence []byte 19 inAnsiSequence bool 20 parser *ansiterm.AnsiParser 21 } 22 23 func newAnsiWriter(nFile int) *ansiWriter { 24 initLogger() 25 file, fd := winterm.GetStdFile(nFile) 26 info, err := winterm.GetConsoleScreenBufferInfo(fd) 27 if err != nil { 28 return nil 29 } 30 31 parser := ansiterm.CreateParser("Ground", winterm.CreateWinEventHandler(fd, file)) 32 logger.Infof("newAnsiWriter: parser %p", parser) 33 34 aw := &ansiWriter{ 35 file: file, 36 fd: fd, 37 infoReset: info, 38 command: make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), 39 escapeSequence: []byte(ansiterm.KEY_ESC_CSI), 40 parser: parser, 41 } 42 43 logger.Infof("newAnsiWriter: aw.parser %p", aw.parser) 44 logger.Infof("newAnsiWriter: %v", aw) 45 return aw 46 } 47 48 func (aw *ansiWriter) Fd() uintptr { 49 return aw.fd 50 } 51 52 // Write writes len(p) bytes from p to the underlying data stream. 53 func (aw *ansiWriter) Write(p []byte) (total int, err error) { 54 if len(p) == 0 { 55 return 0, nil 56 } 57 58 logger.Infof("Write: % x", p) 59 logger.Infof("Write: %s", string(p)) 60 return aw.parser.Parse(p) 61 }