write_windows.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package door
  2. import (
  3. "fmt"
  4. "log"
  5. "strings"
  6. "sync/atomic"
  7. "syscall"
  8. )
  9. func Writer(d *Door) {
  10. var handle syscall.Handle = syscall.Handle(d.Config.Comm_handle)
  11. // handle syscall.Handle, writerChannel *chan string
  12. log.Println("Writer")
  13. defer d.wg.Done()
  14. for {
  15. select {
  16. case <-d.closeChannel:
  17. close(d.writerChannel)
  18. log.Println("~Writer")
  19. return
  20. default:
  21. }
  22. select {
  23. case <-d.closeChannel:
  24. close(d.writerChannel)
  25. log.Println("~Writer")
  26. return
  27. case output, ok := <-d.writerChannel:
  28. if !ok {
  29. log.Println("closeChannel")
  30. if !d.Disconnect() {
  31. atomic.StoreInt32(&d.Disconnected, 1)
  32. }
  33. log.Println("~Writer")
  34. return
  35. } else {
  36. if strings.HasSuffix(output, RestorePos) {
  37. output += Color(d.LastColor...)
  38. } else {
  39. d.UpdateLastColor(output, &d.LastColor)
  40. }
  41. var l uint32 = uint32(len(output))
  42. var buffer []byte = []byte(output)
  43. WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}
  44. var UitnZero_1 uint32 = uint32(0)
  45. var DataWrite uint32 = uint32(0)
  46. var err error
  47. err = syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
  48. if err != nil {
  49. fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
  50. }
  51. if (err != nil) || (l != DataWrite) {
  52. log.Println("CloseChannel")
  53. if !d.Disconnect() {
  54. atomic.StoreInt32(&d.Disconnected, 1)
  55. close(d.writerChannel)
  56. }
  57. log.Println("~Writer")
  58. return
  59. }
  60. }
  61. }
  62. }
  63. /*
  64. for output := range *writerChannel {
  65. l := uint32(len(output))
  66. buffer := []byte(output)
  67. WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}
  68. UitnZero_1 := uint32(0)
  69. DataWrite := uint32(0)
  70. err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
  71. if err != nil {
  72. fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
  73. }
  74. if (err != nil) || (l != DataWrite) {
  75. close(*writerChannel)
  76. break
  77. }
  78. }
  79. */
  80. }