|
@@ -2,24 +2,87 @@ package door
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
+ "log"
|
|
|
+ "strings"
|
|
|
+ "sync/atomic"
|
|
|
"syscall"
|
|
|
)
|
|
|
|
|
|
-func Writer(handle syscall.Handle, writerChannel *chan string) {
|
|
|
- for output := range *writerChannel {
|
|
|
- l := uint32(len(output))
|
|
|
- buffer := []byte(output)
|
|
|
- WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}
|
|
|
- UitnZero_1 := uint32(0)
|
|
|
- DataWrite := uint32(0)
|
|
|
- err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
|
|
|
- if err != nil {
|
|
|
- fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
|
|
|
+func Writer(d *Door) {
|
|
|
+ var handle syscall.Handle = syscall.Handle(d.Config.Comm_handle)
|
|
|
+ // handle syscall.Handle, writerChannel *chan string
|
|
|
+ log.Println("Writer")
|
|
|
+ defer d.wg.Done()
|
|
|
+
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case <-d.closeChannel:
|
|
|
+ close(d.writerChannel)
|
|
|
+ log.Println("~Writer")
|
|
|
+ return
|
|
|
+ default:
|
|
|
}
|
|
|
|
|
|
- if (err != nil) || (l != DataWrite) {
|
|
|
- close(*writerChannel)
|
|
|
- break
|
|
|
+ select {
|
|
|
+ case <-d.closeChannel:
|
|
|
+ close(d.writerChannel)
|
|
|
+ log.Println("~Writer")
|
|
|
+ return
|
|
|
+ case output, ok := <-d.writerChannel:
|
|
|
+ if !ok {
|
|
|
+ log.Println("closeChannel")
|
|
|
+ if !d.Disconnect() {
|
|
|
+ atomic.StoreInt32(&d.Disconnected, 1)
|
|
|
+ }
|
|
|
+ log.Println("~Writer")
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ if strings.HasSuffix(output, RestorePos) {
|
|
|
+ output += Color(d.LastColor...)
|
|
|
+ } else {
|
|
|
+ d.UpdateLastColor(output, &d.LastColor)
|
|
|
+ }
|
|
|
+
|
|
|
+ l := uint32(len(output))
|
|
|
+ buffer := []byte(output)
|
|
|
+ WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}
|
|
|
+
|
|
|
+ UitnZero_1 := uint32(0)
|
|
|
+ DataWrite := uint32(0)
|
|
|
+ err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if (err != nil) || (l != DataWrite) {
|
|
|
+ log.Println("CloseChannel")
|
|
|
+ if !d.Disconnect() {
|
|
|
+ atomic.StoreInt32(&d.Disconnected, 1)
|
|
|
+ close(d.writerChannel)
|
|
|
+ }
|
|
|
+ log.Println("~Writer")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ for output := range *writerChannel {
|
|
|
+ l := uint32(len(output))
|
|
|
+ buffer := []byte(output)
|
|
|
+ WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]}
|
|
|
+ UitnZero_1 := uint32(0)
|
|
|
+ DataWrite := uint32(0)
|
|
|
+ err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if (err != nil) || (l != DataWrite) {
|
|
|
+ close(*writerChannel)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ */
|
|
|
}
|