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