# Copyright (c) 2012 CentralNic Ltd. All rights reserved. This program is
# free software; you can redistribute it and/or modify it under the same
# terms as Perl itself.
# 
# $Id: ResponseCodes.pm,v 1.2 2011/01/04 10:37:33 gavin Exp $
package Net::EPP::ResponseCodes;
use base qw(Exporter);
use vars qw(@EXPORT);
use strict;

=head1 NAME

Net::EPP::ResponseCodes - a module to export some constants that
correspond to EPP response codes

=head1 SYNOPSIS

	use Net::EPP::ResponseCodes;
	use Net::EPP::Simple;
	use strict;

	my $epp = Net::EPP::Simple->new(
		host	=> 'epp.nic.tld',
		user	=> 'my-id',
		pass	=> 'my-password',
	);

	my $result = $epp->domain_transfer_request('example.tld', 'foobar', 1);

	if ($result) {
		print "Transfer initiated OK\n";

	} else {
		if ($Net::EPP::Simple::Code == OBJECT_PENDING_TRANSFER) {
			print "Error: domain is already pending transfer\n";

		} elsif ($Net::EPP::Simple::Code == INVALID_AUTH_INFO) {
			print "Error: invalid authcode provided\n";

		} elsif ($Net::EPP::Simple::Code == OBJECT_DOES_NOT_EXIST) {
			print "Error: domain not found\n";

		} elsif ($Net::EPP::Simple::Code == STATUS_PROHIBITS_OP) {
			print "Error: domain cannot be transferred\n";

		} else {
			print "Error code $Net::EPP::Simple::Code\n";

		}
	}

=head1 DESCRIPTION

EPP is the Extensible Provisioning Protocol. EPP (defined in RFC 4930) is an
application layer client-server protocol for the provisioning and management of
objects stored in a shared central repository. Specified in XML, the protocol
defines generic object management operations and an extensible framework that
maps protocol operations to objects. As of writing, its only well-developed
application is the provisioning of Internet domain names, hosts, and related
contact details.

Every response sent to the client by an EPP server contains a C<E<lt>resultE<gt>>
element that has a C<code> attribute. This is a four-digit
numeric code that describes the result of the request. This module exports
a set of constants that provide handy mnemonics for each of the defined
codes.

=head1 EXPORTS

C<Net::EPP::ResponseCodes> exports the following constants. The number in
brackets is the integer value associated with the constant.

=head2 Successful command completion responses (1nnn)

=over

=item  OK (1000)

=item  OK_PENDING (1001)

=item  OK_NO_MESSAGES (1300)

=item  OK_MESSAGES (1301)

=item  OK_BYE (1500)

=back

=head2 Command error responses (2nnn)

=head3 Protocol Syntax

=over

=item  UNKNOWN_COMMAND (2011)

=item  SYNTAX_ERROR (2011)

=item  USE_ERROR (2011)

=item  MISSING_PARAM (2011)

=item  PARAM_RANGE_ERROR (2011)

=item  PARAM_SYNTAX_ERROR (2011)

=back

=head3 Implementation-specific Rules

=over

=item  UNIMPLEMENTED_VERSION (2100)

=item  UNIMPLEMENTED_COMMAND (2101)

=item  UNIMPLEMENTED_OPTION (2102)

=item  UNIMPLEMENTED_EXTENSION (2103)

=item  BILLING_FAILURE (2104)

=item  NOT_RENEWABLE (2105)

=item  NOT_TRANSFERRABLE (2106)

=back

=head3 Security (22nn)

=over

=item  AUTHENTICATION_ERROR (2200)

=item  AUTHORISATION_ERROR (2201)

=item  AUTHORIZATION_ERROR (2201)

=item  INVALID_AUTH_INFO (2202)

=back

=head3 Data Management (23nn)

=over

=item  OBJECT_PENDING_TRANSFER (2300)

=item  OBJECT_NOT_PENDING_TRANSFER (2301)

=item  OBJECT_EXISTS (2302)

=item  OBJECT_DOES_NOT_EXIST (2303)

=item  STATUS_PROHIBITS_OP (2304)

=item  ASSOC_PROHIBITS_OP (2305)

=item  PARAM_POLICY_ERROR (2306)

=item  UNIMPLEMENTED_OBJECT_SERVICE (2307)

=item  DATA_MGMT_POLICY_VIOLATION (2308)

=back

=head3 Server System (24nn)

=over

=item  COMMAND_FAILED (2400)

=back

=head3 Connection Management (25nn)

=over

=item  COMMAND_FAILED_BYE (2500)

=item  AUTH_FAILED_BYE (2501)

=item  SESSION_LIMIT_EXCEEDED_BYE (2502)

=back

=head1 AUTHOR

CentralNic Ltd (L<http://www.centralnic.com/>).

=head1 COPYRIGHT

This module is (c) 2012 CentralNic Ltd. This module is free software; you can
redistribute it and/or modify it under the same terms as Perl itself.

=head1 SEE ALSO

=over

=item * L<Net::EPP::Client>

=item * L<Net::EPP::Frame>

=item * L<Net::EPP::Proxy>

=item * RFCs 4930 and RFC 4934, available from L<http://www.ietf.org/>.

=item * The CentralNic EPP site at L<http://www.centralnic.com/resellers/epp>.

=back

=cut

#
# Successful command completion responses:
#
use constant OK					=> 1000;
use constant OK_PENDING				=> 1001;
use constant OK_NO_MESSAGES			=> 1300;
use constant OK_MESSAGES			=> 1301;
use constant OK_BYE				=> 1500;

#
# Command error responses:
#

# Protocol Syntax:
use constant UNKNOWN_COMMAND			=> 2011;
use constant SYNTAX_ERROR			=> 2011;
use constant USE_ERROR				=> 2011;
use constant MISSING_PARAM			=> 2011;
use constant PARAM_RANGE_ERROR			=> 2011;
use constant PARAM_SYNTAX_ERROR			=> 2011;

# Implementation-specific Rules:
use constant UNIMPLEMENTED_VERSION		=> 2100;
use constant UNIMPLEMENTED_COMMAND		=> 2101;
use constant UNIMPLEMENTED_OPTION		=> 2102;
use constant UNIMPLEMENTED_EXTENSION		=> 2103;
use constant BILLING_FAILURE			=> 2104;
use constant NOT_RENEWABLE			=> 2105;
use constant NOT_TRANSFERRABLE			=> 2106;

# Security:
use constant AUTHENTICATION_ERROR		=> 2200;
use constant AUTHORISATION_ERROR		=> 2201;
use constant AUTHORIZATION_ERROR		=> 2201;
use constant INVALID_AUTH_INFO			=> 2202;

# Data Management:
use constant OBJECT_PENDING_TRANSFER		=> 2300;
use constant OBJECT_NOT_PENDING_TRANSFER	=> 2301;
use constant OBJECT_EXISTS			=> 2302;
use constant OBJECT_DOES_NOT_EXIST		=> 2303;
use constant STATUS_PROHIBITS_OP		=> 2304;
use constant ASSOC_PROHIBITS_OP			=> 2305;
use constant PARAM_POLICY_ERROR			=> 2306;
use constant UNIMPLEMENTED_OBJECT_SERVICE	=> 2307;
use constant DATA_MGMT_POLICY_VIOLATION		=> 2308;

# Server System:
use constant COMMAND_FAILED			=> 2400;

# Connection Management:
use constant COMMAND_FAILED_BYE			=> 2500;
use constant AUTH_FAILED_BYE			=> 2501;
use constant SESSION_LIMIT_EXCEEDED_BYE		=> 2502;

our @EXPORT;
my $package = __PACKAGE__;
foreach my $constant (keys(%constant::declared)) {
	if ($constant =~ /^$package/) {
		$constant =~ s/^$package\:\://;
		push(@EXPORT, $constant);
	}
}

1;
