… | |
… | |
140 | } |
140 | } |
141 | |
141 | |
142 | sub send_data { |
142 | sub send_data { |
143 | my ($self, $lid, $data) = @_; |
143 | my ($self, $lid, $data) = @_; |
144 | |
144 | |
|
|
145 | # $JSON::Syck::ImplicitUnicode = 0; |
145 | my $dump = JSON::Syck::Dump ($data); |
146 | my $dump = JSON::Syck::Dump ($data); |
146 | $self->write_data ($lid, (length $dump) . " " . $dump . "\015\012"); |
147 | $self->write_data ($lid, (length $dump) . " " . $dump . "\015\012"); |
147 | } |
148 | } |
148 | |
149 | |
149 | sub handle_data { |
150 | sub handle_data { |
… | |
… | |
152 | while ($$buf =~ m/^(\s*(\d+) )(.*)$/s) { |
153 | while ($$buf =~ m/^(\s*(\d+) )(.*)$/s) { |
153 | my ($prefix, $len, $rembuf) = ($1, $2, $3); |
154 | my ($prefix, $len, $rembuf) = ($1, $2, $3); |
154 | if ((length $rembuf) >= $len) { |
155 | if ((length $rembuf) >= $len) { |
155 | my $data = substr $rembuf, 0, $len; |
156 | my $data = substr $rembuf, 0, $len; |
156 | substr $$buf, 0, (length $prefix) + (length $data), ''; |
157 | substr $$buf, 0, (length $prefix) + (length $data), ''; |
|
|
158 | # $JSON::Syck::ImplicitUnicode = 1; |
157 | $self->{packet_cb}->($self, $lid, JSON::Syck::Load ($data)); |
159 | $self->{packet_cb}->($self, $lid, JSON::Syck::Load ($data)); |
158 | } else { |
160 | } else { |
159 | return |
161 | return |
160 | } |
162 | } |
161 | } |
163 | } |
… | |
… | |
166 | use JSON::Syck; |
168 | use JSON::Syck; |
167 | |
169 | |
168 | sub new { |
170 | sub new { |
169 | my $this = shift; |
171 | my $this = shift; |
170 | my $class = ref($this) || $this; |
172 | my $class = ref($this) || $this; |
171 | my $self = { @_, disconnect_cb => sub {} }; |
173 | my $self = { disconnect_cb => sub {}, @_ }; |
172 | bless $self, $class; |
174 | bless $self, $class; |
173 | return $self; |
175 | return $self; |
174 | } |
176 | } |
175 | |
177 | |
176 | sub connect { |
178 | sub connect { |
… | |
… | |
199 | $self->handle_data (\$self->{read_buffer}); |
201 | $self->handle_data (\$self->{read_buffer}); |
200 | |
202 | |
201 | unless ($l) { |
203 | unless ($l) { |
202 | if (defined $l) { |
204 | if (defined $l) { |
203 | $self->{disconnect_cb}->("EOF from json server '$host:$port'"); |
205 | $self->{disconnect_cb}->("EOF from json server '$host:$port'"); |
|
|
206 | delete $self->{r}; |
|
|
207 | delete $self->{socket}; |
204 | return; |
208 | return; |
205 | |
209 | |
206 | } else { |
210 | } else { |
207 | $self->{disconnect_cb}->("Error while reading from json server '$host:$port': $!"); |
211 | $self->{disconnect_cb}->("Error while reading from json server '$host:$port': $!"); |
|
|
212 | delete $self->{socket}; |
|
|
213 | delete $self->{r}; |
208 | return; |
214 | return; |
209 | } |
215 | } |
210 | } |
216 | } |
211 | }); |
217 | }); |
212 | } |
218 | } |
… | |
… | |
217 | while ($$buf =~ m/^(\s*(\d+) )(.*)$/s) { |
223 | while ($$buf =~ m/^(\s*(\d+) )(.*)$/s) { |
218 | my ($prefix, $len, $rembuf) = ($1, $2, $3); |
224 | my ($prefix, $len, $rembuf) = ($1, $2, $3); |
219 | if ((length $rembuf) >= $len) { |
225 | if ((length $rembuf) >= $len) { |
220 | my $data = substr $rembuf, 0, $len; |
226 | my $data = substr $rembuf, 0, $len; |
221 | substr $$buf, 0, (length $prefix) + (length $data), ''; |
227 | substr $$buf, 0, (length $prefix) + (length $data), ''; |
|
|
228 | # $JSON::Syck::ImplicitUnicode = 1; |
222 | $self->{packet_cb}->($self, JSON::Syck::Load ($data)); |
229 | $self->{packet_cb}->($self, JSON::Syck::Load ($data)); |
223 | } else { |
230 | } else { |
224 | return |
231 | return |
225 | } |
232 | } |
226 | } |
233 | } |
227 | } |
234 | } |
228 | |
235 | |
229 | sub send_data { |
236 | sub send_data { |
230 | my ($self, $data) = @_; |
237 | my ($self, $data) = @_; |
|
|
238 | # $JSON::Syck::ImplicitUnicode = 0; |
231 | my $dump = JSON::Syck::Dump ($data); |
239 | my $dump = JSON::Syck::Dump ($data); |
232 | $self->write_data ((length $dump) . " " . $dump . "\015\012"); |
240 | $self->write_data ((length $dump) . " " . $dump . "\015\012"); |
233 | } |
241 | } |
234 | |
242 | |
235 | sub write_data { |
243 | sub write_data { |