The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

# $Id: Command.pm,v 0.16 2003/08/07 00:01:59 lawrence Exp $
use strict;
use Net::Msmgr qw(:debug);
our @ISA = qw (Net::Msmgr::Object);
use Carp;
=pod
=head1 NAME
Net::Msmgr::Command
=head1 SYNOPSIS
use Net::Msmgr::Command;
my $connection = new Net::Msmgr::Connection( .... );
my $command = new Net::Msmgr::Command;
$command->type(Net::Msmgr::Command::Async); # there are other types
$command->cmd('XYZ'); # one of the MSNP messages
$command->params( [ param1, param2, ... ] );
$command->send($connection);
=head1 DESCRIPTION
Net::Msmgr::Command is the encapsulation for an MSNP command. They come in four types, and this library provides manifest constants for each type.
=over
=item Net::Msmgr::Command::Normal
This is a normal command. It will have a TRID and no payload.
=item Net::Msmgr::Command::Async
This is used to instantiate async commands, which are commands that have no TRID.
=item Net::Msmgr::Command::Payload
These are commands with payload data (e.g. MSG), and a TRID.
=item Net::Msmgr::Command::Pseudo
These are unused in the current version of the library, but are
placeholders to associate with user handlers.
=back
=cut
use constant Normal => 1;
use constant Payload => 2;
use constant Async => 3;
use constant Pseudo => 4;
=pod
=head1 CONSTRUCTOR
my $command = new Net::Msmgr::Command ( type => ... );
or
my $command = Net::Msmgr::Command->new( type => ...);
Constructor parameters are:
=over
=item type (mandatory)
One of Net::Msmgr::Command::Async, Payload, Normal, or Pseudo
=item cmd (mandatory)
A MSNP Command (e.g. MSG, USR, XFR)
=item params (optional)
A listref of optional parameters. Each command type has a fixed list of parameters.
=item body (optional)
The payload data for Net::Msmgr::Command::Payload messages.
=back
=head1 INSTANCE METHODS
=over
=cut
sub _fields
{
return shift->SUPER::_fields,
( type => undef,
cmd => undef,
trid => undef,
params => [],
connection => undef,
body => undef);
}
=pod
=item $command->as_text;
Human readable representation of only the command and parameters
(excluding payload data) for debugging.
=cut
sub as_text
{
my $self = shift;
my $message = $self->cmd . ' ' . join(' ', @{$self->params}) . "\n";
return $message;
}
=pod
=item $command->send( $connection );
Associate a command with a Net::Msmgr::Connection stream and transmit it.
=cut
sub send($$)
{
my $self = shift;
my $connection = shift;
if ($self->{'type'} eq Normal)
{
my $trid = Net::Msmgr::TRID;
$self->trid($trid);
my $message = $self->cmd .
" $trid " .
join(' ', @{$self->{params}}) .
"\r\n" ;
$connection->send($message);
print STDERR "--> $message" if $connection->debug & DEBUG_COMMAND_SEND;
}
elsif ($self->{'type'} eq Payload)
{
my $length = length($self->{body});
my $trid = Net::Msmgr::TRID;
$self->trid($trid);
my $message =
$self->cmd .
" $trid " .
join(' ', @{$self->{params}}, $length) .
"\r\n" .
$self->{body} ;
$connection->send($message);
}
elsif ($self->{'type'} eq Async)
{
my $message = $self->cmd .
join(' ', @{$self->{params}}) .
"\r\n" ;
$connection->send($message);
print STDERR "--> $message" if $connection->debug & DEBUG_COMMAND_SEND;
}
elsif ($self-{'type'} eq Pseudo)
{ # can't be sent
}
else
{
carp "unknown message type. Cannot send";
}
return $self;
}
=pod
=back
=head1 ACCESSOR METHODS
=over
=item my $type = $command->type;
=item $command->type($newtype);
Read or set the type.
=item my $cmd = $command->cmd;
=item $command->cmd($newcmd);
Read or set the cmd.
=item my @params = @{$command->params};
=item $command->params( [ $p0, $p1, $p2 ] );
Read or set the parameter list.
=item my $connection = $command->connection;
=item $command->connection($new_connection);
Set or change the connection stream associated with this command.
Probably not a good idea.
=item my $body = $command->body;
=item $command->body($new_body);
Read or set the body.
=cut
1;
#
# $Log: Command.pm,v $
# Revision 0.16 2003/08/07 00:01:59 lawrence
# Initial Release
#
#