The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

package Net::SNPP::HylaFAX;

use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
use Net::SNPP;
use Carp;

$VERSION = do { my @r=(q$Revision: 1.1 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r};

@ISA = qw(Exporter Net::SNPP);

@EXPORT = @Net::SNPP::EXPORT;
@EXPORT_OK = qw(NOTIFY_NONE NOTIFY_DONE NOTIFY_REQUEUE MODEM_DEVICE MODEM_CLASS);
%EXPORT_TAGS = (
	NOTIFY => [qw(NOTIFY_NONE NOTIFY_DONE NOTIFY_REQUEUE)],
	MODEM  => [qw(MODEM_DEVICE MODEM_CLASS)],
);

sub NOTIFY_NONE    () { 1 }
sub NOTIFY_DONE    () { 2 }
sub NOTIFY_REQUEUE () { 4 }

sub MODEM_CLASS  () { 1 }
sub MODEM_DEVICE () { 2 }

sub jqueue
{
 @_ == 2 or croak 'usage: $snpp->jqueue( BOOLEAN )';
 my $snpp = shift;
 my $arg = $_[0] ? "YES" : "NO";

 $snpp->_SITE('JQUEUE', $arg)->response() == CMD_OK;
}

sub from_user
{
 @_ == 2 or croak 'usage: $snpp->from_user( MAIL_ADDRESS )';
 my $snpp = shift;

 ($snpp->_SITE('FROMUSER',@_)->response == CMD_OK)
	? ($snpp->message =~ /"([^"]+)"/)[0]
	: undef;
}

my %modem = ( DEVICE => MODEM_DEVICE, CLASS => MODEM_CLASS);

sub modem
{
 @_ == 2 or croak 'usage: $snpp->modem( [MODEM_DEVICE|MODEM_CLASS] )';
 my $snpp = shift;
 my $modem = shift;
 my $arg = $modem == MODEM_DEVICE
		? "DEVICE"
		: $modem == MODEM_CLASS
			? "CLASS"
			: croak 'Unknown modem type';

 my $ret = ($snpp->_SITE('MODEM',$arg)->response == CMD_OK)
	? ($snpp->message =~ /"([^"]+)"/)[0]
	: undef;

 if(defined $ret)
  {
   $ret = uc $ret;
   $ret = $modem{$ret} || croak "Unknown modem type '$ret'";
  }

 $ret;
}

my $i = 0;
my %notify = map { $_ => (1 << $i++) } qw(NONE DONE REQUEUE);

sub notify
{
 @_ == 2 or croak 'usage: $snpp->notify( NOTIFY_LEVEL )';
 my $snpp = shift;
 my $arg = shift;
 my @arg = ();

 croak 'Bad notify argument'
	if $arg < 1 || $arg == 3 || $arg == 5 || $arg > 6;

 push(@arg,"NONE") if $arg & 1;
 push(@arg,"DONE") if $arg & 2;
 push(@arg,"REQUEUE") if $arg & 4;

 my $str = ($snpp->_SITE('NOTIFY',join("+",@arg))->response == CMD_OK)
	? ($snpp->message =~ /"([^"]+)"/)[0]
	: undef;

 my $val = undef;

 if($str)
  {
   $val = 0;
   map { $val |= $notify{$_} } split(/\+/, $str)
  }

 $val;
}

sub notify_addr
{
 my $snpp = shift;

 ($snpp->_SITE('MAILADDR',@_)->response == CMD_OK)
	? ($snpp->message =~ /"([^"]+)"/)[0]
	: undef;
}

1;