/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.ftpserver.ftplet;

/**
 * Interface for a reply to an FTP request.
 *
 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
 */
public interface FtpReply {

    /**
     * 110 Restart marker reply. In this case, the text is exact and not left to
     * the particular implementation; it must read: MARK yyyy = mmmm Where yyyy
     * is User-process data stream marker, and mmmm server's equivalent marker
     * (note the spaces between markers and "=").
     */
    int REPLY_110_RESTART_MARKER_REPLY = 110;

    /**
     * 120 Service ready in nnn minutes.
     */
    int REPLY_120_SERVICE_READY_IN_NNN_MINUTES = 120;

    /**
     * 125 Data connection already open; transfer starting.
     */
    int REPLY_125_DATA_CONNECTION_ALREADY_OPEN = 125;

    /**
     * 150 File status okay; about to open data connection.
     */
    int REPLY_150_FILE_STATUS_OKAY = 150;

    /**
     * 200 Command okay.
     */
    int REPLY_200_COMMAND_OKAY = 200;

    /**
     * 202 Command not implemented, superfluous at this site.
     */
    int REPLY_202_COMMAND_NOT_IMPLEMENTED = 202;

    /**
     * 211 System status, or system help reply.
     */
    int REPLY_211_SYSTEM_STATUS_REPLY = 211;

    /**
     * 212 Directory status.
     */
    int REPLY_212_DIRECTORY_STATUS = 212;

    /**
     * 213 File status.
     */
    int REPLY_213_FILE_STATUS = 213;

    /**
     * 214 Help message. On how to use the server or the meaning of a particular
     * non-standard command. This reply is useful only to the human user.
     */
    int REPLY_214_HELP_MESSAGE = 214;

    /**
     * 215 NAME system type. Where NAME is an official system name from the list
     * in the Assigned Numbers document.
     */
    int REPLY_215_NAME_SYSTEM_TYPE = 215;

    /**
     * 220 Service ready for new user.
     */
    int REPLY_220_SERVICE_READY = 220;

    /**
     * Service closing control connection. Logged out if appropriate.
     */
    int REPLY_221_CLOSING_CONTROL_CONNECTION = 221;

    /**
     * 225 Data connection open; no transfer in progress.
     */
    int REPLY_225_DATA_CONNECTION_OPEN_NO_TRANSFER_IN_PROGRESS = 225;

    /**
     * Closing data connection. Requested file action successful (for example,
     * file transfer or file abort).
     */
    int REPLY_226_CLOSING_DATA_CONNECTION = 226;

    /**
     * 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
     */
    int REPLY_227_ENTERING_PASSIVE_MODE = 227;

    /**
     * 230 User logged in, proceed.
     */
    int REPLY_230_USER_LOGGED_IN = 230;

    /**
     * 250 Requested file action okay, completed.
     */
    int REPLY_250_REQUESTED_FILE_ACTION_OKAY = 250;

    /**
     * 257 "PATHNAME" created.
     */
    int REPLY_257_PATHNAME_CREATED = 257;

    /**
     * 331 User name okay, need password.
     */
    int REPLY_331_USER_NAME_OKAY_NEED_PASSWORD = 331;

    /**
     * 332 Need account for login.
     */
    int REPLY_332_NEED_ACCOUNT_FOR_LOGIN = 332;

    /**
     * 350 Requested file action pending further information.
     */
     int REPLY_350_REQUESTED_FILE_ACTION_PENDING_FURTHER_INFORMATION = 350;

    /**
     * 421 Service not available, closing control connection. This may be a
     * reply to any command if the service knows it must shut down.
     */
     int REPLY_421_SERVICE_NOT_AVAILABLE_CLOSING_CONTROL_CONNECTION = 421;

    /**
     * 425 Can't open data connection.
     */
     int REPLY_425_CANT_OPEN_DATA_CONNECTION = 425;

    /**
     * 426 Connection closed; transfer aborted.
     */
     int REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED = 426;

    /**
     * 450 Requested file action not taken. File unavailable (e.g., file busy).
     */
     int REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN = 450;

    /**
     * 451 Requested action aborted: local error in processing.
     */
     int REPLY_451_REQUESTED_ACTION_ABORTED = 451;

    /**
     * 452 Requested action not taken. Insufficient storage space in system.
     */
     int REPLY_452_REQUESTED_ACTION_NOT_TAKEN = 452;

    /**
     * 500 Syntax error, command unrecognized. This may include errors such as
     * command line too long.
     */
     int REPLY_500_SYNTAX_ERROR_COMMAND_UNRECOGNIZED = 500;

    /**
     * 501 Syntax error in parameters or arguments.
     */
     int REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS = 501;

    /**
     * 502 Command not implemented.
     */
     int REPLY_502_COMMAND_NOT_IMPLEMENTED = 502;

    /**
     * 503 Bad sequence of commands.
     */
     int REPLY_503_BAD_SEQUENCE_OF_COMMANDS = 503;

    /**
     * 504 Command not implemented for that parameter.
     */
     int REPLY_504_COMMAND_NOT_IMPLEMENTED_FOR_THAT_PARAMETER = 504;

    /**
     * 530 Not logged in.
     */
     int REPLY_530_NOT_LOGGED_IN = 530;

    /**
     * 532 Need account for storing files.
     */
     int REPLY_532_NEED_ACCOUNT_FOR_STORING_FILES = 532;

    /**
     * 550 Requested action not taken. File unavailable (e.g., file not found,
     * no access).
     */
     int REPLY_550_REQUESTED_ACTION_NOT_TAKEN = 550;

    /**
     * 551 Requested action aborted: page type unknown.
     */
     int REPLY_551_REQUESTED_ACTION_ABORTED_PAGE_TYPE_UNKNOWN = 551;

    /**
     * 552 Requested file action aborted. Exceeded storage allocation (for
     * current directory or dataset).
     */
     int REPLY_552_REQUESTED_FILE_ACTION_ABORTED_EXCEEDED_STORAGE = 552;

    /**
     * 553 Requested action not taken. File name not allowed.
     */
    int REPLY_553_REQUESTED_ACTION_NOT_TAKEN_FILE_NAME_NOT_ALLOWED = 553;

    /**
     * The reply code.
     *
     * @return The reply code
     */
    int getCode();

    /**
     * The reply message, might be multiple lines.
     *
     * @return The reply message
     */
    String getMessage();

    /**
     * Returns the timestamp (in milliseconds since the epoch time) when this
     * reply was sent.
     *
     * @return the timestamp (in milliseconds since the epoch time) when this
     * reply was sent.
     */
    long getSentTime();

    /**
     * Must implement toString to format the reply as described in the RFC. Most
     * important is the handling of multi-line replies.
     *
     * @return The formated reply
     */
    String toString();

    /**
     * Tells whether or not this reply indicates a positive completion.
     * @return <code>true</code>, if this reply is a positive completion or
     * positive intermediate reply; <code>false</code>, otherwise.
     */
    boolean isPositive();
}
