@@ -26,78 +26,97 @@ proc ::cluster::packet::encode { payload } {
2626 return $encoded
2727}
2828
29- # validate a given field once it is parsed. allows us to cancel
30- # decoding a packet if needed.
31- proc ::cluster::packet::validate {field} {
29+ proc ::cluster::packet::decode { packet {cluster {}} } {
3230
33- }
31+ set decoded [io decode $packet \
32+ -validate [::apply {
33+ {cluster field} {
34+ # break - stop parsing, return packet as is
35+ # continue - do not include field
36+ # return false - stop parsing, return empty packet
37+ # error - throw given error
38+ # else - add field to packet by name and id
39+ # notes:
40+ # - modify field with upvar field if needed
41+ # - modify results with upvar results if needed
42+ switch -- [dict get $field id] {
43+ 14 {
44+ # check the filter and only continue if we match
45+ if {$cluster ne {} && ! [$cluster check_filter $data ]} {
46+ return false
47+ }
48+ }
49+ }
50+ }
51+ } $cluster ]
52+ ]
3453
35- proc ::cluster::packet::decode { packet {cluster {}} } {
36- set decoded [io decode $packet -while ::cluster::bpacket::validate]
3754
38- # try {
39- # # ~! "Decode Packet" "Decoding a Packet [string bytelength $packet]"
40- # set reader [::bpacket::reader new $packet]
41- # set result [dict create]
42- # set results [list]
43- # set active 1
44- # while {$active} {
45- # lassign [$reader next] active id type data
46- # switch -- $active {
47- # 0 {
48- # # We are done parsing the packet!
49- # lappend results $result
50- # break
51- # }
52- # 1 {
53- # # We have more to parse!
54- # switch -- $id {
55- # 1 {
56- # lassign $data type channel
57- # dict set result type $type
58- # dict set result channel $channel
59- # }
60- # 2 { dict set result hid $data }
61- # 3 { dict set result sid $data }
62- # 4 { dict set result flags $data }
63- # 5 { dict set result timestamp $data }
64- # 6 { dict set result protocols $data }
65- # 7 { dict set result ruid $data }
66- # 8 { dict set result op $data }
67- # 9 { dict set result data $data }
68- # 10 { dict set result raw $data }
69- # 11 { dict set result tags $data }
70- # 12 { dict set result keepalive $data }
71- # 13 {
72- # # When we receive a filter we will immediately try to check with the
73- # # cluster if our service matches and quit decoding immediately if we
74- # # dont.
75- # if { $cluster ne {} && ! [$cluster check_filter $data] } {
76- # break
77- # }
78- # dict set result filter $data
79- # }
80- # 14 {
81- # dict set result error $data
82- # }
83- # }
84- # }
85- # 2 {
86- # # We are done with a packet -- but another might still be
87- # # available!
88- # lappend results $result
89- # set result [dict create]
90- # }
91- # }
92- # }
93- # $reader destroy
94- # } on error {result options} {
95- # puts stderr "Malformed Packet! $result"
96- # catch { ::onError $result $options "Malformed Packet!" }
97- # catch { $reader destroy }
98- # }
99- # if { $active } {
100- # set result {}
101- # }
102- return $results
55+ return $decoded
10356}
57+
58+ # TODO: trash this once we confirm the above rewrite is working
59+ # try {
60+ # # ~! "Decode Packet" "Decoding a Packet [string bytelength $packet]"
61+ # set reader [::bpacket::reader new $packet]
62+ # set result [dict create]
63+ # set results [list]
64+ # set active 1
65+ # while {$active} {
66+ # lassign [$reader next] active id type data
67+ # switch -- $active {
68+ # 0 {
69+ # # We are done parsing the packet!
70+ # lappend results $result
71+ # break
72+ # }
73+ # 1 {
74+ # # We have more to parse!
75+ # switch -- $id {
76+ # 1 {
77+ # lassign $data type channel
78+ # dict set result type $type
79+ # dict set result channel $channel
80+ # }
81+ # 2 { dict set result hid $data }
82+ # 3 { dict set result sid $data }
83+ # 4 { dict set result flags $data }
84+ # 5 { dict set result timestamp $data }
85+ # 6 { dict set result protocols $data }
86+ # 7 { dict set result ruid $data }
87+ # 8 { dict set result op $data }
88+ # 9 { dict set result data $data }
89+ # 10 { dict set result raw $data }
90+ # 11 { dict set result tags $data }
91+ # 12 { dict set result keepalive $data }
92+ # 13 {
93+ # # When we receive a filter we will immediately try to check with the
94+ # # cluster if our service matches and quit decoding immediately if we
95+ # # dont.
96+ # if { $cluster ne {} && ! [$cluster check_filter $data] } {
97+ # break
98+ # }
99+ # dict set result filter $data
100+ # }
101+ # 14 {
102+ # dict set result error $data
103+ # }
104+ # }
105+ # }
106+ # 2 {
107+ # # We are done with a packet -- but another might still be
108+ # # available!
109+ # lappend results $result
110+ # set result [dict create]
111+ # }
112+ # }
113+ # }
114+ # $reader destroy
115+ # } on error {result options} {
116+ # puts stderr "Malformed Packet! $result"
117+ # catch { ::onError $result $options "Malformed Packet!" }
118+ # catch { $reader destroy }
119+ # }
120+ # if { $active } {
121+ # set result {}
122+ # }
0 commit comments