Skip to content
Extraits de code Groupes Projets
Valider 9ab7057e rédigé par TC's avatar TC
Parcourir les fichiers

tiens, il manquait un fichier

parent f8802bb0
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
package ChangeEventHandler;
# Répertoire des évènements qui ont été changés
my %changed_events = ();
# ###
# change_event
# Change un handler
# ###
sub change_event
{
my ($event, $ref_function) = @_;
if(defined($Hook::conn->{_handler}->{$event}))
{
$changed_events{$event} = $Hook::conn->{_handler}->{$event};
}
$Hook::conn->{_handler}->{$event} = [$ref_function, 0];
} # Fin change_event
# ###
# restore_event
# Remet en place un ancien event
# ###
sub restore_event
{
my $event = shift;
if(defined($changed_events{$event}))
{
$Hook::conn->{_handler}->{$event} = $changed_events{$event};
delete $changed_events{$event};
}
elsif(defined($Hook::conn->{_handler}->{$event}))
{
delete $Hook::conn->{_handler}->{$event};
}
} # Fin restore_event
1;
__END__
package EventHandler;
# Hash des évènements qui ont été ajoutés
my %changed_events = ();
# ###
# init_add_event
# Ajoute un handler (à utiliser au chargement du module)
# ... en vrai, ça l'enregistre pour l'ajout, utiliser flush_init_events pour que
# ça l'ajoute vraiment
# ###
sub init_add_event
{
return _register_event(@_);
} # Fin init_add_event
# ###
# flush_init_events
# Ajoute les handlers enregistrés par init_add_event
# ###
sub flush_init_events
{
foreach my $e (keys %changed_events)
{
_do_change_event($e);
}
} # Fin flush_init_events
# ###
# add_event
# Ajoute un handler (à utilisé dans une fonction, pas dans le module)
# ###
sub add_event
{
return 0 unless(_register_event(@_));
return _do_change_event($_[0]);
} # Fin add_event
# ###
# _register_event
# Enregistre un évènement dans le cache de ce module
# ###
sub _register_event
{
my ($event, $when, $ref_function, $ref_obj) = @_;
return 0 unless(defined($event) and defined($when) and defined($ref_function));
if($when !~ /^before$/i && $when !~ /^after$/i)
{
$::logger->error("'$when' not before nor after, not registering");
return 0;
}
unless(defined($changed_events{$event}))
{
$changed_events{$event} = {
'before' => [],
'after' => [],
};
}
# Ajout de la fonction[+objet] à la liste pour cet évènement
push @{$changed_events{$event}{lc $when}}, [$ref_function, $ref_obj];
return 1;
} # Fin _register_event
# ###
# _do_change_event
# Change la fonction handler par défaut d'un évènement
# ###
sub _do_change_event
{
my $event = shift;
return 0 unless(defined($event));
# Changement (ou rien du tout si on est déjà passé par là pour cet event)
# de la fonction pour cet évènement
$Hook::conn->{_handler}->{$event} = [\&dispatch_event, 0];
return 1;
} # Fin _do_change_event
# ###
# remove_event
# Enlève un event de la liste
# ###
sub remove_event
{
my ($event, $when, $ref_fn, $ref_obj) = @_;
if($when !~ /^before$/i && $when !~ /^after$/i)
{
$::logger->error("'$when' not before nor after, not registering");
return 0;
}
if(defined($changed_events{$event}))
{
my @new_list = ();
foreach my $hdls (@{$changed_events{$event}{lc $when}})
{
push @new_list, $hdls
unless($hdls->[0] == $ref_fn && $hdls->[1] == $ref_obj);
}
$changed_events{$event}{lc $when} = \@new_list;
}
else
{
$::logger->error("No record for this event here");
return 0;
}
return 1;
} # Fin remove_event
# ###
# dispatch_event
# Fonction générique pour appeler les fonctions enregistrées
# ###
sub dispatch_event
{
my ($conn, $event) = @_;
# Events enregistrés dans la partie 'before'
&do_events($conn, $event, 'before');
# Event par défaut, celui de Hook.pm, s'il existe
my $type = $event->{'type'};
my $fn = '';
no strict 'refs';
my $symtab = "Hook::";
for my $symbol (keys %$symtab)
{
$fn = $symbol if($symbol =~ /^on_$type$/);
}
&{"Hook::$fn"}($conn, $event) if($fn);
use strict;
# Events enregistrés dans la partie 'after'
&do_events($conn, $event, 'after');
} # Fin dispatch_event
# ###
# do_events
# Lance les events enregistrés pour un 'type' donné ($when)
# ###
sub do_events
{
my ($conn, $event, $when) = @_;
if($when !~ /^before$/i && $when !~ /^after$/i)
{
$::logger->error("'$when' not before nor after, not registering");
return 0;
}
if(defined($changed_events{$event->{'type'}}))
{
$::logger->info("Event '".$event->{'type'}."', processing '$when'...");
unless(@{$changed_events{$event->{'type'}}{lc $when}})
{
$::logger->info(" No registered event, nothing to do.");
return;
}
foreach my $hdls (@{$changed_events{$event->{'type'}}{lc $when}})
{
if($Config::debug > 0)
{
if(defined($hdls->[1]))
{
$hdls->[0]($hdls->[1], $conn, $event, $when);
}
else
{
$hdls->[0]($conn, $event, $when);
}
}
else
{
local $@ = undef;
if(defined($hdls->[1]))
{
eval {
$hdls->[0]($hdls->[1], $conn, $event, $when);
};
}
else
{
eval {
$hdls->[0]($conn, $event, $when);
};
}
}
}
$::logger->info(" Event '".$event->{'type'}."', '$when', done.");
}
} # Fin do_events
1;
__END__
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter