| InfoSys-FreeDB documentation | Contained in the InfoSys-FreeDB distribution. |
InfoSys::FreeDB::Connection - FreeDB abstract connection
None. This is an abstract class.
FreeDB abstract connection
InfoSys::FreeDB::Connection is the abstract connection class of the InfoSys::FreeDB module hierarchy.
By default nothing is exported.
This tag contains variables useful to parse the messages from FreeDB servers.
Regular expression to parse the end of message dot.
Regular expression to parse the end of line.
Creates a new InfoSys::FreeDB::Connection object. OPT_HASH_REF is a hash reference used to pass initialization options. OPT_HASH_REF is mandatory. On error an exception Error::Simple is thrown.
Options for OPT_HASH_REF may include:
client_hostPassed to set_client_host(). Mandatory option.
client_namePassed to set_client_name(). Mandatory option.
client_userPassed to set_client_user(). Mandatory option.
client_versionPassed to set_client_version(). Mandatory option.
freedb_hostPassed to set_freedb_host(). Mandatory option.
freedb_portPassed to set_freedb_port(). Mandatory option.
proto_levelPassed to set_proto_level(). Defaults to 1.
proxy_hostPassed to set_proxy_host().
proxy_passwdPassed to set_proxy_passwd().
proxy_portPassed to set_proxy_port(). Defaults to 8080.
proxy_userPassed to set_proxy_user().
This is an interface method. Connects the object to the FreeDB information service using the object's attributes. A hello commend is sent out, the protocol level is queried and set to the highest level available. On error an exception Error::Simple is thrown.
Issues a discid command on the FreeDB database. ENTRY is a InfoSys::FreeDB::Entry object. On error an exception Error::Simple is thrown.
Disconnects the object from the FreeDB information service.
Returns the connecting client host.
Returns the connecting client name.
Returns the connecting client user.
Returns the connecting client version.
Returns the FreeDB host.
Returns the FreeDB port.
Returns the current protocol level.
Returns the proxy host to use.
Returns the proxy password to use.
Returns the proxy port to use.
Returns the proxy user name to use.
This is an interface method. Issues a log command on the FreeDB database. TO BE SPECIFIED
Issues an lscat command on the FreeDB database. Returns a InfoSys::FreeDB::Response::LsCat object. On error an exception Error::Simple is thrown.
Issues an motd command on the FreeDB database. Returns InfoSys::FreeDB::Response::Motd object. On error an exception Error::Simple is thrown.
This is an interface method. Issues a proto command on the FreeDB database. If LEVEL is not specified, the protocol level is queried. If LEVEL is specified it is used to set the protocol level. Returns InfoSys::FreeDB::Response::Proto object. On error an exception Error::Simple is thrown.
Queries the FreeDB database. ENTRY is a InfoSys::FreeDB::Entry object. Returns a InfoSys::FreeDB::Response::Query object. On error an exception Error::Simple is thrown.
This is an interface method. Issues a quit command on the FreeDB database and disconnects. Returns InfoSys::FreeDB::Response::Quit object. On error an exception Error::Simple is thrown.
Reads an entry from the FreeDB database. MATCH is a InfoSys::FreeDB::Match object. Returns a InfoSys::FreeDB::Response::Match object. On error an exception Error::Simple is thrown.
Set the connecting client host. VALUE is the value. VALUE may not be undef. On error an exception Error::Simple is thrown.
Set the connecting client name. VALUE is the value. VALUE may not be undef. On error an exception Error::Simple is thrown.
Set the connecting client user. VALUE is the value. VALUE may not be undef. On error an exception Error::Simple is thrown.
Set the connecting client version. VALUE is the value. VALUE may not be undef. On error an exception Error::Simple is thrown.
Set the FreeDB host. VALUE is the value. VALUE may not be undef. On error an exception Error::Simple is thrown.
Set the FreeDB port. VALUE is the value. VALUE may not be undef. On error an exception Error::Simple is thrown.
Set the current protocol level. VALUE is the value. Default value at initialization is 1. On error an exception Error::Simple is thrown.
Set the proxy host to use. VALUE is the value. On error an exception Error::Simple is thrown.
Set the proxy password to use. VALUE is the value. On error an exception Error::Simple is thrown.
Set the proxy port to use. VALUE is the value. Default value at initialization is 8080. On error an exception Error::Simple is thrown.
Set the proxy user name to use. VALUE is the value. On error an exception Error::Simple is thrown.
Issues a sites command on the FreeDB database. Returns a InfoSys::FreeDB::Response::Sites object. On error an exception Error::Simple is thrown.
Issues a stat command on the FreeDB database. Returns a InfoSys::FreeDB::Response::Stat object. On error an exception Error::Simple is thrown.
This is an interface method. Issues a update command on the FreeDB database. TO BE SPECIFIED
Issues a ver command on the FreeDB database. Returns a InfoSys::FreeDB::Response::Ver object. On error an exception Error::Simple is thrown.
Issues a whom command on the FreeDB database. Returns a InfoSys::FreeDB::Response::Whom object. On error an exception Error::Simple is thrown.
This is an interface method. Writes an entry to the FreeDB database. ENTRY is a InfoSys::FreeDB::Entry object. CATEGORY is a valid FreeDB category. Returns a InfoSys::FreeDB::Response::Write::1 object in the case an error occurred in the first pass of the writing. Otherwise a InfoSys::FreeDB::Response::Write::2 object is returned. On error an exception Error::Simple is thrown.
InfoSys::FreeDB, InfoSys::FreeDB::Connection::CDDBP, InfoSys::FreeDB::Connection::HTTP, InfoSys::FreeDB::Entry, InfoSys::FreeDB::Entry::Track, InfoSys::FreeDB::Match, InfoSys::FreeDB::Response, InfoSys::FreeDB::Response::DiscId, InfoSys::FreeDB::Response::Hello, InfoSys::FreeDB::Response::LsCat, InfoSys::FreeDB::Response::Motd, InfoSys::FreeDB::Response::Proto, InfoSys::FreeDB::Response::Query, InfoSys::FreeDB::Response::Quit, InfoSys::FreeDB::Response::Read, InfoSys::FreeDB::Response::SignOn, InfoSys::FreeDB::Response::Sites, InfoSys::FreeDB::Response::Stat, InfoSys::FreeDB::Response::Ver, InfoSys::FreeDB::Response::Whom, InfoSys::FreeDB::Response::Write::1, InfoSys::FreeDB::Response::Write::2, InfoSys::FreeDB::Site
None known (yet.)
First development: September 2003 Last update: December 2003
Vincenzo Zocca
Copyright 2003 by Vincenzo Zocca
This file is part of the InfoSys::FreeDB module hierarchy for Perl by
Vincenzo Zocca.
The InfoSys::FreeDB module hierarchy 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.
The InfoSys::FreeDB module hierarchy 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 the InfoSys::FreeDB module hierarchy; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
| InfoSys-FreeDB documentation | Contained in the InfoSys-FreeDB distribution. |
package InfoSys::FreeDB::Connection; use 5.006; use base qw( Exporter ); use strict; use warnings; use AutoLoader qw(AUTOLOAD); use Error qw(:try); require Exporter; our $FINAL_DOT_RX = '[\r\n]\.[\r\n]'; our $FINAL_EOL_RX = '[\r\n]'; # Used by _initialize our %DEFAULT_VALUE = ( 'proto_level' => 1, 'proxy_port' => 8080, ); # Exporter variable our %EXPORT_TAGS = ( 'line_parse' => [ qw( $FINAL_DOT_RX $FINAL_EOL_RX ) ], ); # Package version our ($VERSION) = '$Revision: 0.92 $' =~ /\$Revision:\s+([^\s]+)/; # Exporter variable our @EXPORT = qw( ); # Exporter variable our @EXPORT_OK = qw( $FINAL_DOT_RX $FINAL_EOL_RX ); 1; __END__
sub new { my $class = shift; my $self = {}; bless( $self, ( ref($class) || $class ) ); return( $self->_initialize(@_) ); } sub _initialize { my $self = shift; my $opt = defined($_[0]) ? shift : {}; # Check $opt ref($opt) eq 'HASH' || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::_initialize, first argument must be 'HASH' reference."); # _connection_, SINGLE exists( $opt->{_connection_} ) && $self->set__connection_( $opt->{_connection_} ); # client_host, SINGLE, mandatory exists( $opt->{client_host} ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::_initialize, option 'client_host' is mandatory."); $self->set_client_host( $opt->{client_host} ); # client_name, SINGLE, mandatory exists( $opt->{client_name} ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::_initialize, option 'client_name' is mandatory."); $self->set_client_name( $opt->{client_name} ); # client_user, SINGLE, mandatory exists( $opt->{client_user} ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::_initialize, option 'client_user' is mandatory."); $self->set_client_user( $opt->{client_user} ); # client_version, SINGLE, mandatory exists( $opt->{client_version} ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::_initialize, option 'client_version' is mandatory."); $self->set_client_version( $opt->{client_version} ); # freedb_host, SINGLE, mandatory exists( $opt->{freedb_host} ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::_initialize, option 'freedb_host' is mandatory."); $self->set_freedb_host( $opt->{freedb_host} ); # freedb_port, SINGLE, mandatory exists( $opt->{freedb_port} ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::_initialize, option 'freedb_port' is mandatory."); $self->set_freedb_port( $opt->{freedb_port} ); # proto_level, SINGLE, with default value $self->set_proto_level( exists( $opt->{proto_level} ) ? $opt->{proto_level} : $DEFAULT_VALUE{proto_level} ); # proxy_host, SINGLE exists( $opt->{proxy_host} ) && $self->set_proxy_host( $opt->{proxy_host} ); # proxy_passwd, SINGLE exists( $opt->{proxy_passwd} ) && $self->set_proxy_passwd( $opt->{proxy_passwd} ); # proxy_port, SINGLE, with default value $self->set_proxy_port( exists( $opt->{proxy_port} ) ? $opt->{proxy_port} : $DEFAULT_VALUE{proxy_port} ); # proxy_user, SINGLE exists( $opt->{proxy_user} ) && $self->set_proxy_user( $opt->{proxy_user} ); # Return $self return($self); } sub _value_is_allowed { return(1); } sub _wait_command_reply { throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::_wait_command_reply, call this method in a subclass that has implemented it."); } sub connect { throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::connect, call this method in a subclass that has implemented it."); } sub discid { my $self = shift; my $entry = shift; # Send command and wait for reply my @cmd = ( 'discid', scalar( $entry->get_track() ) ); foreach my $track ( $entry->get_track() ) { push( @cmd, $track->get_offset() ); } push( @cmd, $entry->get_disc_length() ); my $cmd = join( ' ', @cmd ); my $content_ref = $self->_wait_command_reply($cmd, { 200 => $FINAL_EOL_RX, 500 => $FINAL_EOL_RX, } ); # Parse the result require InfoSys::FreeDB::Response::DiscId; my $res = InfoSys::FreeDB::Response::DiscId->new_from_content_ref( $content_ref ); # Write the discid in the entry $res->is_error() || $entry->set_discid( $res->get_discid() ); # Return the result return($res); } sub disconnect { my $self = shift; # Call quit return( $self->quit() ); } sub get__connection_ { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{_connection_} ); } sub get_client_host { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{client_host} ); } sub get_client_name { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{client_name} ); } sub get_client_user { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{client_user} ); } sub get_client_version { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{client_version} ); } sub get_freedb_host { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{freedb_host} ); } sub get_freedb_port { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{freedb_port} ); } sub get_proto_level { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{proto_level} ); } sub get_proxy_host { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{proxy_host} ); } sub get_proxy_passwd { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{proxy_passwd} ); } sub get_proxy_port { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{proxy_port} ); } sub get_proxy_user { my $self = shift; return( $self->{InfoSys_FreeDB_Connection}{proxy_user} ); } sub log { throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::log, call this method in a subclass that has implemented it."); } sub lscat { my $self = shift; # Send command and wait for reply my $cmd = 'cddb lscat'; my $content_ref = $self->_wait_command_reply($cmd, { 210 => $FINAL_DOT_RX, } ); # Parse the result and return it require InfoSys::FreeDB::Response::LsCat; return( InfoSys::FreeDB::Response::LsCat->new_from_content_ref( $content_ref ) ); } sub motd { my $self = shift; # Send command and wait for reply my $cmd = 'motd'; my $content_ref = $self->_wait_command_reply($cmd, { 210 => $FINAL_DOT_RX, 401 => $FINAL_EOL_RX, } ); # Parse the result and return it require InfoSys::FreeDB::Response::Motd; return( InfoSys::FreeDB::Response::Motd->new_from_content_ref( $content_ref ) ); } sub proto { throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::proto, call this method in a subclass that has implemented it."); } sub query { my $self = shift; my $entry = shift; # Make the discid $self->discid( $entry ); # Send command and wait for reply my @cmd = ( 'cddb', 'query', $entry->get_discid(), scalar( $entry->get_track() ) ); foreach my $track ( $entry->get_track() ) { push( @cmd, $track->get_offset() ); } push( @cmd, $entry->get_disc_length() ); my $cmd = join( ' ', @cmd ); my $content_ref = $self->_wait_command_reply($cmd, { 200 => $FINAL_EOL_RX, 210 => $FINAL_EOL_RX, 211 => $FINAL_DOT_RX, 202 => $FINAL_EOL_RX, 403 => $FINAL_EOL_RX, 409 => $FINAL_EOL_RX, } ); # Parse the result and return it require InfoSys::FreeDB::Response::Query; return( InfoSys::FreeDB::Response::Query->new_from_content_ref( $content_ref ) ); } sub quit { throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::quit, call this method in a subclass that has implemented it."); } sub read { my $self = shift; my $match = shift; # Send command and wait for reply my @cmd = ( 'cddb', 'read', $match->get_categ(), $match->get_discid(), ); my $cmd = join( ' ', @cmd ); my $content_ref = $self->_wait_command_reply($cmd, { 210 => $FINAL_DOT_RX, 211 => $FINAL_DOT_RX, 401 => $FINAL_EOL_RX, 402 => $FINAL_EOL_RX, 403 => $FINAL_EOL_RX, 409 => $FINAL_EOL_RX, } ); # Parse the result and return it require InfoSys::FreeDB::Response::Read; return( InfoSys::FreeDB::Response::Read->new_from_content_ref( $content_ref ) ); } sub set__connection_ { my $self = shift; my $val = shift; # Check if isa/ref/rx/value is allowed &_value_is_allowed( '_connection_', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set__connection_, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{_connection_} = $val; } sub set_client_host { my $self = shift; my $val = shift; # Value for 'client_host' is not allowed to be empty defined($val) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_client_host, value may not be empty."); # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'client_host', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_client_host, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{client_host} = $val; } sub set_client_name { my $self = shift; my $val = shift; # Value for 'client_name' is not allowed to be empty defined($val) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_client_name, value may not be empty."); # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'client_name', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_client_name, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{client_name} = $val; } sub set_client_user { my $self = shift; my $val = shift; # Value for 'client_user' is not allowed to be empty defined($val) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_client_user, value may not be empty."); # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'client_user', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_client_user, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{client_user} = $val; } sub set_client_version { my $self = shift; my $val = shift; # Value for 'client_version' is not allowed to be empty defined($val) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_client_version, value may not be empty."); # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'client_version', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_client_version, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{client_version} = $val; } sub set_freedb_host { my $self = shift; my $val = shift; # Value for 'freedb_host' is not allowed to be empty defined($val) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_freedb_host, value may not be empty."); # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'freedb_host', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_freedb_host, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{freedb_host} = $val; } sub set_freedb_port { my $self = shift; my $val = shift; # Value for 'freedb_port' is not allowed to be empty defined($val) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_freedb_port, value may not be empty."); # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'freedb_port', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_freedb_port, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{freedb_port} = $val; } sub set_proto_level { my $self = shift; my $val = shift; # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'proto_level', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_proto_level, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{proto_level} = $val; } sub set_proxy_host { my $self = shift; my $val = shift; # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'proxy_host', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_proxy_host, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{proxy_host} = $val; } sub set_proxy_passwd { my $self = shift; my $val = shift; # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'proxy_passwd', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_proxy_passwd, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{proxy_passwd} = $val; } sub set_proxy_port { my $self = shift; my $val = shift; # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'proxy_port', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_proxy_port, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{proxy_port} = $val; } sub set_proxy_user { my $self = shift; my $val = shift; # Check if isa/ref/rx/value is allowed &_value_is_allowed( 'proxy_user', $val ) || throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::set_proxy_user, the specified value '$val' is not allowed."); # Assignment $self->{InfoSys_FreeDB_Connection}{proxy_user} = $val; } sub sites { my $self = shift; # Send command and wait for reply my $cmd = 'sites'; my $content_ref = $self->_wait_command_reply($cmd, { 210 => $FINAL_DOT_RX, 401 => $FINAL_EOL_RX, } ); # Parse the result and return it require InfoSys::FreeDB::Response::Sites; return( InfoSys::FreeDB::Response::Sites->new_from_content_ref( $content_ref ) ); } sub stat { my $self = shift; # Send command and wait for reply my $cmd = 'stat'; my $content_ref = $self->_wait_command_reply($cmd, { 210 => $FINAL_DOT_RX, } ); # Parse the result and return it require InfoSys::FreeDB::Response::Stat; return( InfoSys::FreeDB::Response::Stat->new_from_content_ref( $content_ref ) ); } sub update { throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::update, call this method in a subclass that has implemented it."); } sub ver { my $self = shift; # Send command and wait for reply my $cmd = 'ver'; my $content_ref = $self->_wait_command_reply($cmd, { 200 => $FINAL_EOL_RX, 211 => $FINAL_DOT_RX, } ); # Parse the result and return it require InfoSys::FreeDB::Response::Ver; return( InfoSys::FreeDB::Response::Ver->new_from_content_ref( $content_ref ) ); } sub whom { my $self = shift; # Send command and wait for reply my $cmd = 'whom'; my $content_ref = $self->_wait_command_reply($cmd, { 210 => $FINAL_DOT_RX, 401 => $FINAL_EOL_RX, } ); # Parse the result and return it require InfoSys::FreeDB::Response::Whom; return( InfoSys::FreeDB::Response::Whom->new_from_content_ref( $content_ref ) ); } sub write { throw Error::Simple("ERROR: InfoSys::FreeDB::Connection::write, call this method in a subclass that has implemented it."); }