+ if ($thing->{t}) {
+ my $sub = "handle_$thing->{t}";
+ if ($thing->can($sub)) {
+ no strict 'refs';
+ $thing = $thing->$sub($dxchan);
+ }
+
+ $thing->broadcast($dxchan) if $thing;
+ }
+}
+
+sub handle_eau
+{
+ my $thing = shift;
+ my $dxchan = shift;
+
+ if (my $d = $thing->{d}) {
+ for (split /:/, $d) {
+ my ($type, $here, $call) = unpack "A1 A1 A*", $_;
+ my $nref;
+ if ($type eq 'U') {
+ unless ($nref) {
+ dbg("Thingy::Rt::ea need a node before $call");
+ return;
+ }
+ add_user($nref, $call, $here);
+ my $h = $dxchan->{call} eq $nref->{call} ? 3 : ($thing->{hops} || 99);
+ RouteDB::update($call, $dxchan->{call}, $h);
+ } elsif ($type eq 'N') {
+ $nref = Route::Node::get($call);
+ unless ($nref) {
+ dbg("Thingy::Rt::ea need a definition for $call");
+ return;
+ }
+ my $h = $dxchan->{call} eq $nref->{call} ? 2 : ($thing->{hops} || 99);
+ RouteDB::update($nref->{call}, $dxchan->{call}, $h);
+ } else {
+ dbg("Thingy::Rt::ea invalid type $type");
+ return;
+ }
+ unless ($nref) {
+ dbg("Thingy::Rt::ea no node");
+ return;
+ }
+ }
+ }
+ return $thing;
+}
+
+sub handle_edu
+{
+ my $thing = shift;
+ my $dxchan = shift;
+
+ if (my $d = $thing->{d}) {
+ for (split /:/, $d) {
+ my ($type, $here, $call) = unpack "A1 A1 A*", $_;
+ my $nref;
+ if ($type eq 'U') {
+ unless ($nref) {
+ dbg("Thingy::Rt::ed need a node before $call");
+ return;
+ }
+ $nref->del_user($call);
+ RouteDB::delete($call, $dxchan->{call});
+ } elsif ($type eq 'N') {
+ $nref = Route::Node::get($call);
+ unless ($nref) {
+ dbg("Thingy::Rt::ed need a definition for $call");
+ return;
+ }
+ RouteDB::update($nref->{call}, $dxchan->{call}, $dxchan->{call} eq $nref->{call} ? 2 : ($thing->{hops} || 99));
+ } else {
+ dbg("Thingy::Rt::ed invalid type $type");
+ return;
+ }
+ unless ($nref) {
+ dbg("Thingy::Rt::ed no node");
+ return;
+ }
+ }
+ }
+ return $thing;