// /**
//
// (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
// Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved. <BR>
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
// Module Name:
//
// Tftp.uni
//
// Abstract:
//
// String definitions for UEFI Shell TFTP command
//
//
// **/

/=#

#langdef   en-US "english"

#string STR_GEN_TOO_MANY           #language en-US "%H%s%N: Too many arguments\r\n"
#string STR_GEN_TOO_FEW            #language en-US "%H%s%N: Too few arguments\r\n"
#string STR_GEN_PARAM_INV          #language en-US "%H%s%N: Invalid argument - '%H%s%N'\r\n"
#string STR_GEN_PROBLEM            #language en-US "%H%s%N: Unknown flag - '%H%s%N'\r\n"
#string STR_GEN_FILE_OPEN_FAIL     #language en-US "%H%s%N: Cannot open file - '%H%s%N'\r\n"
#string STR_GEN_CRLF               #language en-US "\r\n"

#string STR_TFTP_ERR_NO_NIC        #language en-US "No network interface card found.\r\n"
#string STR_TFTP_ERR_NIC_NAME      #language en-US "Failed to get the name of the network interface card number %d - %r\r\n"
#string STR_TFTP_ERR_OPEN_PROTOCOL #language en-US "Unable to open MTFTP4 protocol on '%H%s%N' - %r\r\n"
#string STR_TFTP_ERR_CONFIGURE     #language en-US "Unable to configure MTFTP4 protocol on '%H%s%N' - %r\r\n"
#string STR_TFTP_ERR_FILE_SIZE     #language en-US "Unable to get the size of the file '%H%s%N' on '%H%s%N' - %r\r\n"
#string STR_TFTP_ERR_DOWNLOAD      #language en-US "Unable to download the file '%H%s%N' on '%H%s%N' - %r\r\n"
#string STR_TFTP_ERR_WRITE         #language en-US "Unable to write into file '%H%s%N' - %r\r\n"
#string STR_TFTP_ERR_NIC_NOT_FOUND #language en-US "Network Interface Card '%H%s%N' not found.\r\n"
#string STR_TFTP_DOWNLOADING       #language en-US "Downloading the file '%H%s%N'\r\n"
#string STR_TFTP_STRING            #language en-US "%s"

#string STR_GET_HELP_TFTP          #language en-US ""
".TH tftp 0 "Download a file from TFTP server."\r\n"
".SH NAME\r\n"
"Download a file from TFTP server.\r\n"
".SH SYNOPSIS\r\n"
" \r\n"
"TFTP [-i interface] [-l <port>] [-r <port>] [-c <retry count>] [-t <timeout>]\r\n"
"     [-s <block size>] host remotefilepath [localfilepath]\r\n"
".SH OPTIONS\r\n"
" \r\n"
"  -i interface     - Specifies an adapter name, i.e., eth0.\r\n"
"  -l port          - Specifies the local port number. Default value is 0\r\n"
"                     and the port number is automatically assigned.\r\n"
"  -r port          - Specifies the remote port number. Default value is 69.\r\n"
"  -c <retry count> - The number of times to transmit request packets and\r\n"
"                     wait for a response. The default value is 6.\r\n"
"  -t <timeout>     - The number of seconds to wait for a response after\r\n"
"                     sending a request packet. Default value is 4s.\r\n"
"  -s <block size>  - Specifies the TFTP blksize option as defined in RFC 2348.\r\n"
"                     Valid range is between 8 and 65464, default value is 512.\r\n"
"  host             - Specify TFTP Server IPv4 address.\r\n"
"  remotefilepath   - TFTP server file path to download the file.\r\n"
"  localfilepath    - Local destination file path.\r\n"
".SH DESCRIPTION\r\n"
" \r\n"
"NOTES:\r\n"
"  1. The TFTP command allows to get the file specified by its 'remotefilepath'\r\n"
"     path from the TFTP server specified by its 'host' IPv4 address. If the\r\n"
"     optional 'localfilepath' parameter is provided, the downloaded file is\r\n"
"     stored locally using the provided file path. If the local file path is\r\n"
"     not specified, the file is stored in the current directory using the file\r\n"
"     server's name.\r\n"
"  2. Before using the TFTP command, the network interface intended to be\r\n"
"     used to retrieve the file must be configured. This configuration may be\r\n"
"     done by means of the 'ifconfig' command.\r\n"
"  3. If a network interface is defined with the '-i' option then only this\r\n"
"     interface will be used to retrieve the remote file. Otherwise, all network\r\n"
"     interfaces are tried in the order they have been discovered during the\r\n"
"     DXE phase.\r\n"
".SH EXAMPLES\r\n"
" \r\n"
"EXAMPLES:\r\n"
"  * To get the file "dir1/file1.dat" from the TFTP server 192.168.1.1 and\r\n"
"    store it as file2.dat in the current directory :\r\n"
"    fs0:\> tftp 192.168.1.1 dir1/file1.dat file2.dat\r\n"
".SH RETURNVALUES\r\n"
" \r\n"
"RETURN VALUES:\r\n"
"  SHELL_SUCCESS             The action was completed as requested.\r\n"
"  SHELL_INVALID_PARAMETER   One of the passed-in parameters was incorrectly\r\n"
"                            formatted or its value was out of bounds.\r\n"

