write_windows.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. l := uint32(len(output))
  42. buffer := []byte(output)
  43. WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}
  44. UitnZero_1 := uint32(0)
  45. DataWrite := uint32(0)
  46. err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
  47. if err != nil {
  48. fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
  49. }
  50. if (err != nil) || (l != DataWrite) {
  51. log.Println("CloseChannel")
  52. if !d.Disconnect() {
  53. atomic.StoreInt32(&d.Disconnected, 1)
  54. close(d.writerChannel)
  55. }
  56. log.Println("~Writer")
  57. return
  58. }
  59. }
  60. }
  61. }
  62. /*
  63. for output := range *writerChannel {
  64. l := uint32(len(output))
  65. buffer := []byte(output)
  66. WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}
  67. UitnZero_1 := uint32(0)
  68. DataWrite := uint32(0)
  69. err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
  70. if err != nil {
  71. fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
  72. }
  73. if (err != nil) || (l != DataWrite) {
  74. close(*writerChannel)
  75. break
  76. }
  77. }
  78. */
  79. }