+sub process_one
+{
+ my $self = shift;
+
+ while (my $data = shift @{$self->{inqueue}}) {
+ my ($sort, $call, $line) = $self->decode_input($data);
+ next unless defined $sort;
+
+ # do the really sexy console interface bit! (Who is going to do the TK interface then?)
+ dbg("<- $sort $call $line") if $sort ne 'D' && isdbg('chan');
+
+ # handle A records
+ my $user = $self->user;
+ if ($sort eq 'I') {
+ die "\$user not defined for $call" unless defined $user;
+
+ # normal input
+ $self->normal($line);
+ } elsif ($sort eq 'G') {
+ $self->enhanced($line);
+ } elsif ($sort eq 'A' || $sort eq 'O' || $sort eq 'W') {
+ $self->start($line, $sort);
+ } elsif ($sort eq 'C') {
+ $self->width($line); # change number of columns
+ } elsif ($sort eq 'Z') {
+ $self->disconnect;
+ } elsif ($sort eq 'D') {
+ ; # ignored (an echo)
+ } else {
+ dbg atime . " DXChannel::process_one: Unknown command letter ($sort) received from $call\n";
+ }
+ }
+}
+
+sub process
+{
+ foreach my $dxchan (values %channels) {
+ next if $dxchan->{disconnecting};
+ $dxchan->process_one;
+ }
+}
+
+sub handle_xml
+{
+ my $self = shift;
+ my $r = 0;
+
+ if (DXXml::available()) {
+ $r = $self->{handle_xml} || 0;
+ } else {
+ delete $self->{handle_xml} if exists $self->{handle_xml};
+ }
+ return $r;
+}
+
+sub error_handler
+{
+ my $self = shift;
+ my $error = shift || '';
+ dbg("$self->{call} ERROR '$error', closing") if isdbg('chan');
+ $self->{conn}->set_error(undef) if exists $self->{conn};
+ $self->disconnect(1);
+}
+