1package ESL::Dispatch; 2use Data::Dumper; 3require ESL; 4require Exporter; 5use AutoLoader (); 6 7use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); 8 9$VERSION = "1.0"; 10 11@ISA = qw(Exporter DynaLoader); 12 13 14sub init($;$) { 15 my $proto = shift; 16 my $args = shift; 17 my $class = ref($proto) || $proto; 18 my $self = {}; 19 20 $self->{_debug} = $args->{debug} ||= 0; 21 22 $self->{host} = $args->{host} ||= "localhost"; 23 $self->{port} = $args->{port} ||= "8021"; 24 $self->{pass} = $args->{pass} ||= "ClueCon"; 25 $self->{_esl} = new ESL::ESLconnection("$self->{host}", "$self->{port}", "$self->{pass}"); 26 $self->{_callback} = undef; 27 $self->{_custom_subclass} = undef; 28 return bless($self, $class); 29} 30 31sub set_worker($;$$) { 32 my $self = shift; 33 $self->{_worker} = shift; 34 $self->{_timeout} = shift; 35} 36 37sub set_callback($;$$) { 38 my $self = shift; 39 my $event = shift; 40 $self->{_callback}->{$event} = shift; 41 my $subclass = shift; 42 if($subclass) { 43 my @subclasses = split(/,/, $subclass); 44 $self->{_custom_subclass} = \@subclasses; 45 } 46} 47 48sub render_event($;$) { 49 my $self = shift; 50 my $event = shift; 51 my $h = $event->firstHeader(); 52 53 while ($h) { 54 $val = $event->getHeader($h); 55 if($self->{_debug} > 3) { 56 print "$h -> $val\n"; 57 } 58 if ($self->{_decode}) { 59 $val =~ s/\%([A-Fa-f0-9]{2})/pack('C', hex($1))/seg; 60 } 61 $self->{event_hash}->{lc($h)} = $val; 62 $h = $event->nextHeader(); 63 } 64 # Execute callback for this event 65 eval { 66 if($self->{_debug}) { 67 $callback = lc($self->{event_hash}->{'event-name'}); 68 print "DEBUG: executing $callback callback\n"; 69 } 70 &{$self->{_callback}->{lc($self->{event_hash}->{'event-name'})}}($self, $self->{event_hash}); 71 }; 72} 73 74 75sub run($;) { 76 my $self = shift; 77 my $event; 78 79 for(;;) { 80 # Only register for events we have callbacks for. 81 for my $key ( keys %{$self->{_callback}} ) { 82 if ($key =~ m/custom/i) { 83 foreach $subclass (@{$self->{_custom_subclass}}) { 84 $self->{_esl}->events("plain", "$key $subclass"); 85 } 86 next; 87 } 88 $self->{_esl}->events("plain", "$key"); 89 } 90 91 while ($self->{_esl}->connected()) { 92 if($self->{_timeout} > 0) { 93 $event = $self->{_esl}->recvEventTimed($self->{_timeout}); 94 if(!$event) { 95 eval {&{$self->{_worker}}($self);}; 96 next; 97 } 98 } else { 99 $event = $self->{_esl}->recvEvent(); 100 } 101 $self->render_event($event,1); 102 delete $self->{event_hash}; 103 } 104 sleep 1; 105 $self->{_esl} = new ESL::ESLconnection("$self->{host}", "$self->{port}", "$self->{pass}"); 106 } 107} 108 1091; 110