diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 0ac047936..7ba9c4332 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -49,5 +49,14 @@ EXTRA_DIST = \ ZoneMinder/lib/ZoneMinder/Database.pm \ ZoneMinder/lib/ZoneMinder/SharedMem.pm \ ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Channel.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Channel/Handle.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Channel/Spawning.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Channel/Inet.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Channel/Unix.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Channel/File.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Channel/Serial.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Connection.pm \ + ZoneMinder/lib/ZoneMinder/Trigger/Connection/Example.pm \ zm.in diff --git a/scripts/ZoneMinder/Makefile.PL b/scripts/ZoneMinder/Makefile.PL index 0feaee720..6b8b92dbc 100644 --- a/scripts/ZoneMinder/Makefile.PL +++ b/scripts/ZoneMinder/Makefile.PL @@ -14,6 +14,15 @@ WriteMakefile( 'lib/ZoneMinder/Database.pm' => '$(INST_LIBDIR)/ZoneMinder/Database.pm', 'lib/ZoneMinder/SharedMem.pm' => '$(INST_LIBDIR)/ZoneMinder/SharedMem.pm', 'lib/ZoneMinder/ConfigAdmin.pm' => '$(INST_LIBDIR)/ZoneMinder/ConfigAdmin.pm', + 'lib/ZoneMinder/Trigger/Channel.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Channel.pm', + 'lib/ZoneMinder/Trigger/Channel/Handle.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Channel/Handle.pm', + 'lib/ZoneMinder/Trigger/Channel/Spawning.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Channel/Spawning.pm', + 'lib/ZoneMinder/Trigger/Channel/Inet.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Channel/Inet.pm', + 'lib/ZoneMinder/Trigger/Channel/Unix.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Channel/Unix.pm', + 'lib/ZoneMinder/Trigger/Channel/File.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Channel/File.pm', + 'lib/ZoneMinder/Trigger/Channel/Serial.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Channel/Serial.pm', + 'lib/ZoneMinder/Trigger/Connection.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Connection.pm', + 'lib/ZoneMinder/Trigger/Connection/Example.pm' => '$(INST_LIBDIR)/ZoneMinder/Trigger/Connection/Example.pm', }, ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'lib/ZoneMinder.pm', # retrieve abstract from module diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel.pm new file mode 100644 index 000000000..8b40f2ffc --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel.pm @@ -0,0 +1,164 @@ +# ========================================================================== +# +# ZoneMinder Trigger Channel Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the base class definition of the trigger channel +# class tree +# +package ZoneMinder::Trigger::Channel; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Database Access +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); + +our $AUTOLOAD; + +sub new +{ + my $class = shift; + my $self = {}; + $self->{readable} = !undef; + $self->{writeable} = !undef; + $self->{selectable} = undef; + $self->{state} = 'closed'; + bless( $self, $class ); + return $self; +} + +sub clone +{ + my $self = shift; + my $clone = { %$self }; + bless $clone, ref $self; +} + +sub open() +{ + my $self = shift; + my $class = ref($self) or die( "Can't get class for non object $self" ); + die( "Abstract base class method called for object of class $class" ); +} + +sub close() +{ + my $self = shift; + my $class = ref($self) or die( "Can't get class for non object $self" ); + die( "Abstract base class method called for object of class $class" ); +} + +sub getState() +{ + my $self = shift; + return( $self->{state} ); +} + +sub isOpen() +{ + my $self = shift; + return( $self->{state} eq "open" ); +} + +sub isConnected() +{ + my $self = shift; + return( $self->{state} eq "connected" ); +} + +sub DESTROY +{ +} + +sub AUTOLOAD +{ + my $self = shift; + my $class = ref($self) || die( "$self not object" ); + my $name = $AUTOLOAD; + $name =~ s/.*://; + if ( !exists($self->{$name}) ) + { + die( "Can't access $name member of object of class $class" ); + } + return( $self->{$name} ); +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/File.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/File.pm new file mode 100644 index 000000000..35f548abd --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/File.pm @@ -0,0 +1,119 @@ +# ========================================================================== +# +# ZoneMinder Trigger Channel Handle Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the class definition of the simple file based trigger +# channel class +# +package ZoneMinder::Trigger::Channel::File; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; +require ZoneMinder::Trigger::Channel::Handle; + +our @ISA = qw(ZoneMinder::Trigger::Channel::Handle); + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Simple file based trigger channel +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); +use Fcntl; + +sub new +{ + my $class = shift; + my %params = @_; + my $self = ZoneMinder::Trigger::Channel::Handle->new; + $self->{path} = $params{path}; + bless( $self, $class ); + return $self; +} + +sub open() +{ + my $self = shift; + local *sfh; + #sysopen( *sfh, $conn->{path}, O_NONBLOCK|O_RDONLY ) or die( "Can't sysopen: $!" ); + #open( *sfh, "<".$conn->{path} ) or die( "Can't open: $!" ); + open( *sfh, "+<".$self->{path} ) or die( "Can't open: $!" ); + $self->{state} = 'open'; + $self->{handle} = *sfh; +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Handle.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Handle.pm new file mode 100644 index 000000000..f97205ffd --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Handle.pm @@ -0,0 +1,149 @@ +# ========================================================================== +# +# ZoneMinder Trigger Channel Handle Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the class definition of the handle based trigger channel +# class +# +package ZoneMinder::Trigger::Channel::Handle; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; +require ZoneMinder::Trigger::Channel; + +our @ISA = qw(ZoneMinder::Trigger::Channel); + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Base class for handle based trigger channels +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); +use POSIX; + +sub new +{ + my $class = shift; + my $port = shift; + my $self = ZoneMinder::Trigger::Channel->new(); + $self->{handle} = undef; + bless( $self, $class ); + return $self; +} + +sub close() +{ + my $self = shift; + close( $self->{handle} ); + $self->{state} = 'closed'; + $self->{handle} = undef; +} + +sub read() +{ + my $self = shift; + my $buffer; + my $nbytes = sysread( $self->{handle}, $buffer, POSIX::BUFSIZ ); + if ( !$nbytes ) + { + return( undef ); + } + Debug( "Read '$buffer' ($nbytes bytes)\n" ); + return( $buffer ); +} + +sub write() +{ + my $self = shift; + my $buffer = shift; + my $nbytes = syswrite( $self->{handle}, $buffer ); + if ( !defined( $nbytes) || $nbytes < length($buffer) ) + { + Error( "Unable to write buffer '".$buffer.", expected ".length($buffer)." bytes, sent ".$nbytes.": $!\n" ); + return( undef ); + } + Debug( "Wrote '$buffer' ($nbytes bytes)\n" ); + return( !undef ); +} + +sub fileno() +{ + my $self = shift; + return( defined($self->{handle})?fileno($self->{handle}):-1 ); +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Inet.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Inet.pm new file mode 100644 index 000000000..b993faa98 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Inet.pm @@ -0,0 +1,140 @@ +# ========================================================================== +# +# ZoneMinder Trigger Channel Handle Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the class definition of the tcp socket based trigger +# channel class +# +package ZoneMinder::Trigger::Channel::Inet; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; +require ZoneMinder::Trigger::Channel::Spawning; + +our @ISA = qw(ZoneMinder::Trigger::Channel::Spawning); + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Internet (TCP) based trigger channel +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); +use Socket; + +sub new +{ + my $class = shift; + my %params = @_; + my $self = ZoneMinder::Trigger::Channel::Spawning->new(); + $self->{selectable} = !undef; + $self->{port} = $params{port}; + bless( $self, $class ); + return $self; +} + +sub open() +{ + my $self = shift; + local *sfh; + my $saddr = sockaddr_in( $self->{port}, INADDR_ANY ); + socket( *sfh, PF_INET, SOCK_STREAM, getprotobyname('tcp') ) or die( "Can't open socket: $!" ); + setsockopt( *sfh, SOL_SOCKET, SO_REUSEADDR, 1 ); + bind( *sfh, $saddr ) or die( "Can't bind: $!" ); + listen( *sfh, SOMAXCONN ) or die( "Can't listen: $!" ); + $self->{state} = 'open'; + $self->{handle} = *sfh; +} + +sub _spawn( $ ) +{ + my $self = shift; + my $new_handle = shift; + my $clone = $self->clone(); + $clone->{handle} = $new_handle; + $clone->{state} = 'connected'; + return( $clone ); +} + +sub accept() +{ + my $self = shift; + local *cfh; + my $paddr = accept( *cfh, $self->{handle} ); + return( $self->_spawn( *cfh ) ); +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Serial.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Serial.pm new file mode 100644 index 000000000..1485a3857 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Serial.pm @@ -0,0 +1,160 @@ +# ========================================================================== +# +# ZoneMinder Trigger Channel Handle Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the class definition of the serial port trigger channel +# class +# +package ZoneMinder::Trigger::Channel::Serial; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; +require ZoneMinder::Trigger::Channel; + +our @ISA = qw(ZoneMinder::Trigger::Channel); + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Serial access trigger channel +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); +use Device::SerialPort; + +sub new +{ + my $class = shift; + my %params = @_; + my $self = ZoneMinder::Trigger::Channel->new; + $self->{path} = $params{path}; + bless( $self, $class ); + return $self; +} + +sub open() +{ + my $self = shift; + my $device = new Device::SerialPort( $self->{path} ); + $device->baudrate(9600); + $device->databits(8); + $device->parity('none'); + $device->stopbits(1); + $device->handshake('none'); + + $device->read_const_time(50); + $device->read_char_time(10); + + $self->{device} = $device; + $self->{state} = 'open'; + $self->{state} = 'connected'; +} + +sub close() +{ + my $self = shift; + $self->{device}->close(); + $self->{state} = 'closed'; +} + +sub read() +{ + my $self = shift; + my $buffer = $self->{device}->lookfor(); + if ( !$buffer || !length($buffer) ) + { + return( undef ); + } + Debug( "Read '$buffer' (".length($buffer)." bytes)\n" ); + return( $buffer ); +} + +sub write() +{ + my $self = shift; + my $buffer = shift; + my $nbytes = $self->{device}->write( $buffer ); + $self->{device}->write_drain(); + if ( !defined( $nbytes) || $nbytes < length($buffer) ) + { + Error( "Unable to write buffer '".$buffer.", expected ".length($buffer)." bytes, sent ".$nbytes.": $!\n" ); + return( undef ); + } + Debug( "Wrote '$buffer' ($nbytes bytes)\n" ); + return( !undef ); +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Spawning.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Spawning.pm new file mode 100644 index 000000000..bcd14e5ef --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Spawning.pm @@ -0,0 +1,107 @@ +# ========================================================================== +# +# ZoneMinder Trigger Channel Handle Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the class definition of the handle based trigger channel +# classes that spawn new connections when connected. +# +package ZoneMinder::Trigger::Channel::Spawning; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; +require ZoneMinder::Trigger::Channel::Handle; + +our @ISA = qw(ZoneMinder::Trigger::Channel::Handle); + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Base class for handle based triggers that spawn new connections +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); + +sub new +{ + my $class = shift; + my $port = shift; + my $self = ZoneMinder::Trigger::Channel::Handle->new(); + $self->{spawns} = !undef; + bless( $self, $class ); + return $self; +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Unix.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Unix.pm new file mode 100644 index 000000000..e4a9113e0 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Channel/Unix.pm @@ -0,0 +1,121 @@ +# ========================================================================== +# +# ZoneMinder Trigger Channel Handle Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the class definition of the unix socket based trigger +# channel class +# +package ZoneMinder::Trigger::Channel::Unix; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; +require ZoneMinder::Trigger::Channel::Spawning; + +our @ISA = qw(ZoneMinder::Trigger::Channel::Spawning); + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Unix socket based trigger channel +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); +use Socket; + +sub new +{ + my $class = shift; + my %params = @_; + my $self = ZoneMinder::Trigger::Channel->new; + $self->{selectable} = !undef; + $self->{path} = $params{path}; + bless( $self, $class ); + return $self; +} + +sub open() +{ + my $self = shift; + local *sfh; + unlink( $self->{path} ); + my $saddr = sockaddr_un( $self->{path} ); + socket( *sfh, PF_UNIX, SOCK_STREAM, 0 ) or die( "Can't open socket: $!" ); + bind( *sfh, $saddr ) or die( "Can't bind: $!" ); + listen( *sfh, SOMAXCONN ) or die( "Can't listen: $!" ); + $self->{handle} = *sfh; +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Connection.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Connection.pm new file mode 100644 index 000000000..262ae9899 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Connection.pm @@ -0,0 +1,227 @@ +# ========================================================================== +# +# ZoneMinder Trigger Connection Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains the base class definition of the trigger connection +# class tree +# +package ZoneMinder::Trigger::Connection; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Base connection class +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); + +our $AUTOLOAD; + +sub new +{ + my $class = shift; + my %params = @_; + my $self = {}; + $self->{name} = $params{name}; + $self->{channel} = $params{channel}; + $self->{input} = $params{mode} =~ /r/i; + $self->{output} = $params{mode} =~ /w/i; + bless( $self, $class ); + return $self; +} + +sub clone +{ + my $self = shift; + my $clone = { %$self }; + bless $clone, ref $self; + return( $clone ); +} + +sub _spawn( $ ) +{ + my $self = shift; + my $new_channel = shift; + my $clone = $self->clone(); + $clone->{channel} = $new_channel; + return( $clone ); +} + +sub accept() +{ + my $self = shift; + my $new_channel = $self->{channel}->accept(); + return( $self->_spawn( $new_channel ) ); +} + +sub open() +{ + my $self = shift; + return( $self->{channel}->open() ); +} + +sub close() +{ + my $self = shift; + return( $self->{channel}->close() ); +} + +sub fileno() +{ + my $self = shift; + return( $self->{channel}->fileno() ); +} + +sub isOpen() +{ + my $self = shift; + return( $self->{channel}->isOpen() ); +} + +sub isConnected() +{ + my $self = shift; + return( $self->{channel}->isConnected() ); +} + +sub canRead() +{ + my $self = shift; + return( $self->{input} && $self->isConnected() ); +} + +sub canWrite() +{ + my $self = shift; + return( $self->{output} && $self->isConnected() ); +} + +sub getMessages +{ + my $self = shift; + my $buffer = $self->{channel}->read(); + + return( undef ) if ( !defined($buffer) ); + + my @messages = split( /\r?\n/, $buffer ); + return( \@messages ); +} + +sub putMessages +{ + my $self = shift; + my $messages = shift; + + if ( @$messages ) + { + my $buffer = join( "\n", @$messages ); + $buffer .= "\n"; + if ( !$self->{channel}->write( $buffer ) ) + { + Error( "Unable to write buffer '".$buffer." to connection ".$self->{name}." (".$self->fileno().")\n" ); + } + } + return( undef ); +} + +sub DESTROY +{ +} + +sub AUTOLOAD +{ + my $self = shift; + my $class = ref($self) || die( "$self not object" ); + my $name = $AUTOLOAD; + $name =~ s/.*://; + if ( exists($self->{$name}) ) + { + return( $self->{$name} ); + } + elsif ( defined($self->{channel}) ) + { + if ( exists($self->{channel}->{$name}) ) + { + return( $self->{channel}->{$name} ); + } + } + die( "Can't access $name member of object of class $class" ); +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Connection/Example.pm b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Connection/Example.pm new file mode 100644 index 000000000..d2694ccc2 --- /dev/null +++ b/scripts/ZoneMinder/lib/ZoneMinder/Trigger/Connection/Example.pm @@ -0,0 +1,134 @@ +# ========================================================================== +# +# ZoneMinder Trigger Channel Handle Module, $Date$, $Revision$ +# Copyright (C) 2003, 2004, 2005 Philip Coombes +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ========================================================================== +# +# This module contains an example overriden trigger connection class +# +package ZoneMinder::Trigger::Connection::Example; + +use 5.006; +use strict; +use warnings; + +require ZoneMinder::Base; +require ZoneMinder::Trigger::Connection; + +our @ISA = qw(ZoneMinder::Trigger::Connection); + +our $VERSION = $ZoneMinder::Base::VERSION; + +# ========================================================================== +# +# Example overridden connection class +# +# ========================================================================== + +use ZoneMinder::Debug qw(:all); + +sub new +{ + my $class = shift; + my $path = shift; + my $self = (ZoneMinder::Trigger::Connection->new( @_ ); + bless( $self, $class ); + return $self; +} + +sub getMessages +{ + my $self = shift; + my $buffer = $self->{channel}->read(); + + return( undef ) if ( !defined($buffer) ); + + Debug( "Handling buffer '$buffer'\n" ); + my @messages = grep { s/-/|/g; 1; } split( /\r?\n/, $buffer ); + return( \@messages ); +} + +sub putMessages +{ + my $self = shift; + my $messages = shift; + + if ( @$messages ) + { + my $buffer = join( "\n", grep{ s/\|/-/; 1; } @$messages ); + $buffer .= "\n"; + if ( !$self->{channel}->write( $buffer ) ) + { + Error( "Unable to write buffer '".$buffer." to connection ".$self->{name}." (".$self->fileno().")\n" ); + } + } + return( undef ); +} + +1; +__END__ +# Below is stub documentation for your module. You'd better edit it! + +=head1 NAME + +ZoneMinder::Database - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use ZoneMinder::Database; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for ZoneMinder, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + + + +=head1 SEE ALSO + +Mention other useful documentation such as the documentation of +related modules or operating system documentation (such as man pages +in UNIX), or any relevant external documentation such as RFCs or +standards. + +If you have a mailing list set up for your module, mention it here. + +If you have a web site set up for your module, mention it here. + +=head1 AUTHOR + +Philip Coombes, Ephilip.coombes@zoneminder.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2005 by Philip Coombes + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.8.3 or, +at your option, any later version of Perl 5 you may have available. + + +=cut diff --git a/scripts/zmtrigger.pl b/scripts/zmtrigger.pl index afc32d811..8b47488c2 100644 --- a/scripts/zmtrigger.pl +++ b/scripts/zmtrigger.pl @@ -40,515 +40,16 @@ use constant MAX_CONNECT_DELAY => 10; use constant MONITOR_RELOAD_INTERVAL => 300; use constant SELECT_TIMEOUT => 0.25; -# -# Define classes for any channels that triggers may go in and/or out over -# - -# Base channel class -package Channel; - -use ZoneMinder::Debug; - -our $AUTOLOAD; - -sub new -{ - my $class = shift; - my $self = {}; - $self->{readable} = !undef; - $self->{writeable} = !undef; - $self->{selectable} = undef; - $self->{state} = 'closed'; - bless( $self, $class ); - return $self; -} - -sub clone -{ - my $self = shift; - my $clone = { %$self }; - bless $clone, ref $self; -} - -sub open() -{ - my $self = shift; - my $class = ref($self) or die( "Can't get class for non object $self" ); - die( "Abstract base class method called for object of class $class" ); -} - -sub close() -{ - my $self = shift; - my $class = ref($self) or die( "Can't get class for non object $self" ); - die( "Abstract base class method called for object of class $class" ); -} - -sub getState() -{ - my $self = shift; - return( $self->{state} ); -} - -sub isOpen() -{ - my $self = shift; - return( $self->{state} eq "open" ); -} - -sub isConnected() -{ - my $self = shift; - return( $self->{state} eq "connected" ); -} - -sub DESTROY -{ -} - -sub AUTOLOAD -{ - my $self = shift; - my $class = ref($self) || die( "$self not object" ); - my $name = $AUTOLOAD; - $name =~ s/.*://; - if ( !exists($self->{$name}) ) - { - die( "Can't access $name member of object of class $class" ); - } - return( $self->{$name} ); -} - -# Handle based channel -package Channel::Handle; -our @ISA = qw(Channel); - -use ZoneMinder::Debug qw(:all); -use POSIX; - -sub new -{ - my $class = shift; - my $port = shift; - my $self = Channel->new(); - $self->{handle} = undef; - bless( $self, $class ); - return $self; -} - -sub close() -{ - my $self = shift; - close( $self->{handle} ); - $self->{state} = 'closed'; - $self->{handle} = undef; -} - -sub read() -{ - my $self = shift; - my $buffer; - my $nbytes = sysread( $self->{handle}, $buffer, POSIX::BUFSIZ ); - if ( !$nbytes ) - { - return( undef ); - } - Debug( "Read '$buffer' ($nbytes bytes)\n" ); - return( $buffer ); -} - -sub write() -{ - my $self = shift; - my $buffer = shift; - my $nbytes = syswrite( $self->{handle}, $buffer ); - if ( !defined( $nbytes) || $nbytes < length($buffer) ) - { - Error( "Unable to write buffer '".$buffer.", expected ".length($buffer)." bytes, sent ".$nbytes.": $!\n" ); - return( undef ); - } - Debug( "Wrote '$buffer' ($nbytes bytes)\n" ); - return( !undef ); -} - -sub fileno() -{ - my $self = shift; - return( defined($self->{handle})?fileno($self->{handle}):-1 ); -} - -# Spawning selectable channels -package Channel::Spawning; -our @ISA = qw(Channel::Handle); - -sub new -{ - my $class = shift; - my $port = shift; - my $self = Channel::Handle->new(); - $self->{spawns} = !undef; - bless( $self, $class ); - return $self; -} - -# Inet TCP socket channel -package Channel::Inet; -our @ISA = qw(Channel::Spawning); - -use Socket; - -sub new -{ - my $class = shift; - my %params = @_; - my $self = Channel::Spawning->new(); - $self->{selectable} = !undef; - $self->{port} = $params{port}; - bless( $self, $class ); - return $self; -} - -sub open() -{ - my $self = shift; - local *sfh; - my $saddr = sockaddr_in( $self->{port}, INADDR_ANY ); - socket( *sfh, PF_INET, SOCK_STREAM, getprotobyname('tcp') ) or die( "Can't open socket: $!" ); - setsockopt( *sfh, SOL_SOCKET, SO_REUSEADDR, 1 ); - bind( *sfh, $saddr ) or die( "Can't bind: $!" ); - listen( *sfh, SOMAXCONN ) or die( "Can't listen: $!" ); - $self->{state} = 'open'; - $self->{handle} = *sfh; -} - -sub _spawn( $ ) -{ - my $self = shift; - my $new_handle = shift; - my $clone = $self->clone(); - $clone->{handle} = $new_handle; - $clone->{state} = 'connected'; - return( $clone ); -} - -sub accept() -{ - my $self = shift; - local *cfh; - my $paddr = accept( *cfh, $self->{handle} ); - return( $self->_spawn( *cfh ) ); -} - -# Unix socket channel -package Channel::Unix; -our @ISA = qw(Channel::Spawning); - -use Socket; - -sub new -{ - my $class = shift; - my %params = @_; - my $self = Channel->new; - $self->{selectable} = !undef; - $self->{path} = $params{path}; - bless( $self, $class ); - return $self; -} - -sub open() -{ - my $self = shift; - local *sfh; - unlink( $self->{path} ); - my $saddr = sockaddr_un( $self->{path} ); - socket( *sfh, PF_UNIX, SOCK_STREAM, 0 ) or die( "Can't open socket: $!" ); - bind( *sfh, $saddr ) or die( "Can't bind: $!" ); - listen( *sfh, SOMAXCONN ) or die( "Can't listen: $!" ); - $self->{handle} = *sfh; -} - -# Simple file channel -package Channel::File; -our @ISA = qw(Channel::Handle); - -use Fcntl; - -sub new -{ - my $class = shift; - my %params = @_; - my $self = Channel::Handle->new; - $self->{path} = $params{path}; - bless( $self, $class ); - return $self; -} - -sub open() -{ - my $self = shift; - local *sfh; - #sysopen( *sfh, $conn->{path}, O_NONBLOCK|O_RDONLY ) or die( "Can't sysopen: $!" ); - #open( *sfh, "<".$conn->{path} ) or die( "Can't open: $!" ); - open( *sfh, "+<".$self->{path} ) or die( "Can't open: $!" ); - $self->{state} = 'open'; - $self->{handle} = *sfh; -} - -# Serial device channel -package Channel::Serial; -our @ISA = qw(Channel); - -use ZoneMinder::Debug qw(:all); -use Device::SerialPort; - -sub new -{ - my $class = shift; - my %params = @_; - my $self = Channel->new; - $self->{path} = $params{path}; - bless( $self, $class ); - return $self; -} - -sub open() -{ - my $self = shift; - my $device = new Device::SerialPort( $self->{path} ); - $device->baudrate(9600); - $device->databits(8); - $device->parity('none'); - $device->stopbits(1); - $device->handshake('none'); - - $device->read_const_time(50); - $device->read_char_time(10); - - $self->{device} = $device; - $self->{state} = 'open'; - $self->{state} = 'connected'; -} - -sub close() -{ - my $self = shift; - $self->{device}->close(); - $self->{state} = 'closed'; -} - -sub read() -{ - my $self = shift; - my $buffer = $self->{device}->lookfor(); - if ( !$buffer || !length($buffer) ) - { - return( undef ); - } - Debug( "Read '$buffer' (".length($buffer)." bytes)\n" ); - return( $buffer ); -} - -sub write() -{ - my $self = shift; - my $buffer = shift; - my $nbytes = $self->{device}->write( $buffer ); - $self->{device}->write_drain(); - if ( !defined( $nbytes) || $nbytes < length($buffer) ) - { - Error( "Unable to write buffer '".$buffer.", expected ".length($buffer)." bytes, sent ".$nbytes.": $!\n" ); - return( undef ); - } - Debug( "Wrote '$buffer' ($nbytes bytes)\n" ); - return( !undef ); -} - - -package Connection; -use ZoneMinder::Debug; - -our $AUTOLOAD; - -sub new -{ - my $class = shift; - my %params = @_; - my $self = {}; - $self->{name} = $params{name}; - $self->{channel} = $params{channel}; - $self->{input} = $params{mode} =~ /r/i; - $self->{output} = $params{mode} =~ /w/i; - bless( $self, $class ); - return $self; -} - -sub clone -{ - my $self = shift; - my $clone = { %$self }; - bless $clone, ref $self; - return( $clone ); -} - -sub _spawn( $ ) -{ - my $self = shift; - my $new_channel = shift; - my $clone = $self->clone(); - $clone->{channel} = $new_channel; - return( $clone ); -} - -sub accept() -{ - my $self = shift; - my $new_channel = $self->{channel}->accept(); - return( $self->_spawn( $new_channel ) ); -} - -sub open() -{ - my $self = shift; - return( $self->{channel}->open() ); -} - -sub close() -{ - my $self = shift; - return( $self->{channel}->close() ); -} - -sub fileno() -{ - my $self = shift; - return( $self->{channel}->fileno() ); -} - -sub isOpen() -{ - my $self = shift; - return( $self->{channel}->isOpen() ); -} - -sub isConnected() -{ - my $self = shift; - return( $self->{channel}->isConnected() ); -} - -sub canRead() -{ - my $self = shift; - return( $self->{input} && $self->isConnected() ); -} - -sub canWrite() -{ - my $self = shift; - return( $self->{output} && $self->isConnected() ); -} - -sub getMessages -{ - my $self = shift; - my $buffer = $self->{channel}->read(); - - return( undef ) if ( !defined($buffer) ); - - my @messages = split( /\r?\n/, $buffer ); - return( \@messages ); -} - -sub putMessages -{ - my $self = shift; - my $messages = shift; - - if ( @$messages ) - { - my $buffer = join( "\n", @$messages ); - $buffer .= "\n"; - if ( !$self->{channel}->write( $buffer ) ) - { - Error( "Unable to write buffer '".$buffer." to connection ".$self->{name}." (".$self->fileno().")\n" ); - } - } - return( undef ); -} - -sub DESTROY -{ -} - -sub AUTOLOAD -{ - my $self = shift; - my $class = ref($self) || die( "$self not object" ); - my $name = $AUTOLOAD; - $name =~ s/.*://; - if ( exists($self->{$name}) ) - { - return( $self->{$name} ); - } - elsif ( defined($self->{channel}) ) - { - if ( exists($self->{channel}->{$name}) ) - { - return( $self->{channel}->{$name} ); - } - } - die( "Can't access $name member of object of class $class" ); -} - -package Connection::Special; -our @ISA = qw(Connection); - -sub new -{ - my $class = shift; - my $path = shift; - my $self = Connection->new( @_ ); - bless( $self, $class ); - return $self; -} - -sub getMessages -{ - my $self = shift; - my $buffer = $self->{channel}->read(); - - return( undef ) if ( !defined($buffer) ); - - Debug( "Handling buffer '$buffer'\n" ); - my @messages = grep { s/-/|/g; 1; } split( /\r?\n/, $buffer ); - return( \@messages ); -} - -sub putMessages -{ - my $self = shift; - my $messages = shift; - - if ( @$messages ) - { - my $buffer = join( "\n", grep{ s/\|/-/; 1; } @$messages ); - $buffer .= "\n"; - if ( !$self->{channel}->write( $buffer ) ) - { - Error( "Unable to write buffer '".$buffer." to connection ".$self->{name}." (".$self->fileno().")\n" ); - } - } - return( undef ); -} - -package main; +use ZoneMinder::Trigger::Channel::Inet; +use ZoneMinder::Trigger::Channel::Unix; +use ZoneMinder::Trigger::Channel::Serial; +use ZoneMinder::Trigger::Connection; my @connections; -push( @connections, Connection->new( name=>"Chan1", channel=>Channel::Inet->new( port=>6802 ), mode=>"rw" ) ); -push( @connections, Connection->new( name=>"Chan2", channel=>Channel::Unix->new( path=>'/tmp/test.sock' ), mode=>"rw" ) ); -#push( @connections, Connection->new( name=>"Chan3", channel=>Channel::File->new( path=>'/tmp/zmtrigger.out' ), mode=>"w" ) ); -push( @connections, Connection->new( name=>"Chan4", channel=>Channel::Serial->new( path=>'/dev/ttyS0' ), mode=>"rw" ) ); +push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan1", channel=>ZoneMinder::Trigger::Channel::Inet->new( port=>6802 ), mode=>"rw" ) ); +push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan2", channel=>ZoneMinder::Trigger::Channel::Unix->new( path=>'/tmp/test.sock' ), mode=>"rw" ) ); +#push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan3", channel=>ZoneMinder::Trigger::Channel::File->new( path=>'/tmp/zmtrigger.out' ), mode=>"w" ) ); +push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan4", channel=>ZoneMinder::Trigger::Channel::Serial->new( path=>'/dev/ttyS0' ), mode=>"rw" ) ); # ========================================================================== # @@ -559,9 +60,7 @@ push( @connections, Connection->new( name=>"Chan4", channel=>Channel::Serial->ne use ZoneMinder; use DBI; use POSIX; -use Fcntl; -use Socket; -use IO::Handle; +#use Socket; use Data::Dumper; use constant LOG_FILE => ZM_PATH_LOGS.'/zmtrigger.log'; @@ -600,7 +99,6 @@ my @out_connections = grep { $_->output() } @connections; foreach my $connection ( @in_select_connections ) { - print( "FN:".$connection->fileno()."\n" ); vec( $base_rin, $connection->fileno(), 1 ) = 1; }