| 204 | return dnw.WriteMsg(NewMessage(cmd.Bytes())) |
| 205 | } |
| 206 | func (dnw *DNW) WriteMsg(msg *Message) error { |
| 207 | dnw.mutex.Lock() |
| 208 | defer dnw.mutex.Unlock() |
| 209 | if dnw.Closed() { |
| 210 | return fmt.Errorf("dnw: closed") |
| 211 | } |
| 212 | |
| 213 | p := msg.Bytes() |
| 214 | |
| 215 | /*r := dnw.buffer.Reference() |
| 216 | defer r.Close() |
| 217 | r.Seek(0, io.SeekEnd) //Seek to the end of the buffer to only process new responses after writing each block*/ |
| 218 | |
| 219 | //Write on loop until the end of message or error |
| 220 | blockSize := 10240 |
| 221 | left := blockSize |
| 222 | wrote := 0 |
| 223 | for { |
| 224 | if dnw.Closed() { |
| 225 | return fmt.Errorf("dnw: closed but only wrote %d/%d bytes", wrote, len(p)) |
| 226 | } |
| 227 | |
| 228 | /*msg, err := dnw.readMsg(r) |
| 229 | if err != nil { |
| 230 | return fmt.Errorf("dnw: failed to read message after writing %d/%d bytes: %v", wrote, len(p), err) |
| 231 | } |
| 232 | if msg != nil { |
| 233 | switch msg.Command() { |
| 234 | case "C": |
| 235 | return fmt.Errorf("dnw: %s control received after writing %d/%d bytes", msg.Command(), wrote, len(p)) |
| 236 | case "\x00": |
| 237 | return fmt.Errorf("dnw: 0x%0X control received after writing %d/%d bytes", msg.Command(), wrote, len(p)) |
| 238 | case "eub": |
| 239 | switch msg.SubCommand() { |
| 240 | case "req": |
| 241 | return fmt.Errorf("dnw: new request received after writing %d/%d bytes", wrote, len(p)) |
| 242 | case "ack": |
| 243 | return fmt.Errorf("dnw: ack received after writing %d/%d bytes", wrote, len(p)) |
| 244 | case "nak": |
| 245 | return fmt.Errorf("dnw: nak received after writing %d/%d bytes", wrote, len(p)) |
| 246 | } |
| 247 | } |
| 248 | fmt.Printf("dnw: received message after writing %d/%d bytes: %s\n", wrote, len(p), msg.String()) |
| 249 | }*/ |
| 250 | |
| 251 | //Keep leftover bytes within msg bounds |
| 252 | if wrote+left >= len(p) { |
| 253 | left -= (wrote + left) - len(p) |
| 254 | } |
| 255 | |
| 256 | n, err := dnw.write(p[wrote : wrote+left]) |
| 257 | wrote += n |
| 258 | if err != nil { |
| 259 | return fmt.Errorf("dnw: failed to write after %d/%d bytes: %v", wrote, len(p), err) |
| 260 | } |
| 261 | if wrote >= len(p) { |
| 262 | break |
| 263 | } |