// CkFtp2.h: interface for the CkFtp2 class.
//
//////////////////////////////////////////////////////////////////////

// This header is generated for Chilkat 11.5.0

#define _CkVersion 11.5.0

#ifndef _CkFtp2_H
#define _CkFtp2_H
	
#include "chilkatDefs.h"
#include "CkString.h"
#include "CkClassWithCallbacks.h"

class CkTask;
class CkBinData;
class CkByteData;
class CkStringBuilder;
class CkDateTime;
class CkStream;
class CkJsonObject;
class CkCert;
class CkStringTable;
class CkSecureString;
class CkFtp2Progress;



#if !defined(__sun__) && !defined(__sun)
#pragma pack (push, 8)
#endif


#undef Copy

// CLASS: CkFtp2
class CK_VISIBLE_PUBLIC CkFtp2  : public CkClassWithCallbacks
{
    private:

	// Don't allow assignment or copying these objects.
	CkFtp2(const CkFtp2 &);
	CkFtp2 &operator=(const CkFtp2 &);

    public:
	CkFtp2(void);
	virtual ~CkFtp2(void);

	static CkFtp2 *createNew(void);
	static CkFtp2 *createNew2(int progLang);
	void CK_VISIBLE_PRIVATE inject(void *impl);

	// May be called when finished with the object to free/dispose of any
	// internal resources held by the object. 
	void dispose(void);

	
		
	CkFtp2Progress *get_EventCallbackObject(void) const;
	void put_EventCallbackObject(CkFtp2Progress *progress);


	// BEGIN PUBLIC INTERFACE

	// ----------------------
	// Properties
	// ----------------------
	// When set to true, causes the currently running method to abort. Methods that
	// always finish quickly (i.e.have no lengthy file operations or network
	// communications) are not affected. If no method is running, then this property is
	// automatically reset to false when the next method is called. When the abort
	// occurs, this property is reset to false. Both synchronous and asynchronous
	// method calls can be aborted. (A synchronous method call could be aborted by
	// setting this property from a separate thread.)
	bool get_AbortCurrent(void);
	// When set to true, causes the currently running method to abort. Methods that
	// always finish quickly (i.e.have no lengthy file operations or network
	// communications) are not affected. If no method is running, then this property is
	// automatically reset to false when the next method is called. When the abort
	// occurs, this property is reset to false. Both synchronous and asynchronous
	// method calls can be aborted. (A synchronous method call could be aborted by
	// setting this property from a separate thread.)
	void put_AbortCurrent(bool newVal);

	// Some FTP servers require an Account name in addition to login/password. This
	// property can be set for those servers with this requirement.
	void get_Account(CkString &str);
	// Some FTP servers require an Account name in addition to login/password. This
	// property can be set for those servers with this requirement.
	const char *account(void);
	// Some FTP servers require an Account name in addition to login/password. This
	// property can be set for those servers with this requirement.
	void put_Account(const char *newVal);

	// When Active (i.e. PORT) mode is used (opposite of Passive), the client-side is
	// responsible for choosing a random port for each data connection. (Note: In the
	// FTP protocol, each data transfer occurs on a separate TCP/IP connection.
	// Commands are sent over the control channel (port 21 for non-SSL, port 990 for
	// SSL).)
	// 
	// This property, along with ActivePortRangeStart, allows the client to specify a
	// range of ports for data connections.
	// 
	int get_ActivePortRangeEnd(void);
	// When Active (i.e. PORT) mode is used (opposite of Passive), the client-side is
	// responsible for choosing a random port for each data connection. (Note: In the
	// FTP protocol, each data transfer occurs on a separate TCP/IP connection.
	// Commands are sent over the control channel (port 21 for non-SSL, port 990 for
	// SSL).)
	// 
	// This property, along with ActivePortRangeStart, allows the client to specify a
	// range of ports for data connections.
	// 
	void put_ActivePortRangeEnd(int newVal);

	// This property, along with ActivePortRangeEnd, allows the client to specify a
	// range of ports for data connections when in Active mode.
	int get_ActivePortRangeStart(void);
	// This property, along with ActivePortRangeEnd, allows the client to specify a
	// range of ports for data connections when in Active mode.
	void put_ActivePortRangeStart(int newVal);

	// If set to a non-zero value, causes an ALLO command, with this size as the
	// parameter, to be automatically sent when uploading files to an FTP server.
	// 
	// This command could be required by some servers to reserve sufficient storage
	// space to accommodate the new file to be transferred.
	// 
	unsigned long get_AllocateSize(void);
	// If set to a non-zero value, causes an ALLO command, with this size as the
	// parameter, to be automatically sent when uploading files to an FTP server.
	// 
	// This command could be required by some servers to reserve sufficient storage
	// space to accommodate the new file to be transferred.
	// 
	void put_AllocateSize(unsigned long newVal);

	// If true, then uses the MLSD command to fetch directory listings when the FTP
	// server supports MLSD. This property is true by default.
	// 
	// When MLSD is used, the GetPermissions method will return the perm fact for a
	// given file or directory. This is a different format than the more commonly
	// recognized UNIX permissions string. Note: MLSD provides more accurate and
	// dependable file listings, especially for last-mod date/time information. If
	// usage of the MLSD command is turned off, it may adversely affect the quality and
	// availability of other information.
	// 
	bool get_AllowMlsd(void);
	// If true, then uses the MLSD command to fetch directory listings when the FTP
	// server supports MLSD. This property is true by default.
	// 
	// When MLSD is used, the GetPermissions method will return the perm fact for a
	// given file or directory. This is a different format than the more commonly
	// recognized UNIX permissions string. Note: MLSD provides more accurate and
	// dependable file listings, especially for last-mod date/time information. If
	// usage of the MLSD command is turned off, it may adversely affect the quality and
	// availability of other information.
	// 
	void put_AllowMlsd(bool newVal);

	// The number of bytes received during an asynchronous FTP download. This property
	// is updated in real-time and an application may periodically fetch and display
	// it's value while the download is in progress. Starting in Chilkat v11.0.0,
	// applications should update to use instead.
	unsigned long get_AsyncBytesReceived(void);

	// Same as AsyncBytesReceived, but returns the value as a 64-bit integer. Starting
	// in Chilkat v11.0.0, applications should update to use instead.
	__int64 get_AsyncBytesReceived64(void);

	// The number of bytes received during an asynchronous FTP download. This property
	// is updated in real-time and an application may periodically fetch and display
	// it's value while the download is in progress. Starting in Chilkat v11.0.0,
	// applications should update to use instead.
	void get_AsyncBytesReceivedStr(CkString &str);
	// The number of bytes received during an asynchronous FTP download. This property
	// is updated in real-time and an application may periodically fetch and display
	// it's value while the download is in progress. Starting in Chilkat v11.0.0,
	// applications should update to use instead.
	const char *asyncBytesReceivedStr(void);

	// The number of bytes sent during an asynchronous FTP upload. This property is
	// updated in real-time and an application may periodically fetch and display it's
	// value while the upload is in progress. Starting in Chilkat v11.0.0, applications
	// should update to use instead.
	unsigned long get_AsyncBytesSent(void);

	// Same as AsyncBytesSent, but returns the value as a 64-bit integer. Starting in
	// Chilkat v11.0.0, applications should update to use instead.
	__int64 get_AsyncBytesSent64(void);

	// The number of bytes sent during an asynchronous FTP upload. This string property
	// is updated in real-time and an application may periodically fetch and display
	// it's value while the upload is in progress. Starting in Chilkat v11.0.0,
	// applications should update to use instead.
	void get_AsyncBytesSentStr(CkString &str);
	// The number of bytes sent during an asynchronous FTP upload. This string property
	// is updated in real-time and an application may periodically fetch and display
	// it's value while the upload is in progress. Starting in Chilkat v11.0.0,
	// applications should update to use instead.
	const char *asyncBytesSentStr(void);

	// Same as AuthTls, except the command sent to the FTP server is AUTH SSL instead
	// of AUTH TLS . Most FTP servers accept either. AuthTls is more commonly used. If
	// a particular server has trouble with AuthTls, try AuthSsl instead.
	bool get_AuthSsl(void);
	// Same as AuthTls, except the command sent to the FTP server is AUTH SSL instead
	// of AUTH TLS . Most FTP servers accept either. AuthTls is more commonly used. If
	// a particular server has trouble with AuthTls, try AuthSsl instead.
	void put_AuthSsl(bool newVal);

	// Set this to true to switch to a TLS encrypted channel. This property should be
	// set prior to connecting. If this property is set, the port typically remains at
	// it's default (21) and the Ssl property should *not* be set. When AuthTls is
	// used, all control and data transmissions are encrypted. If your FTP client is
	// behind a network-address-translating router, you may need to call
	// ClearControlChannel after connecting and authenticating (i.e. after calling the
	// Connect method). This keeps all data transmissions encrypted, but clears the
	// control channel so that commands are sent unencrypted, thus allowing the router
	// to translate network IP numbers in FTP commands.
	bool get_AuthTls(void);
	// Set this to true to switch to a TLS encrypted channel. This property should be
	// set prior to connecting. If this property is set, the port typically remains at
	// it's default (21) and the Ssl property should *not* be set. When AuthTls is
	// used, all control and data transmissions are encrypted. If your FTP client is
	// behind a network-address-translating router, you may need to call
	// ClearControlChannel after connecting and authenticating (i.e. after calling the
	// Connect method). This keeps all data transmissions encrypted, but clears the
	// control channel so that commands are sent unencrypted, thus allowing the router
	// to translate network IP numbers in FTP commands.
	void put_AuthTls(bool newVal);

	// When true (which is the default value), a FEAT command is automatically sent
	// to the FTP server immediately after connecting. This allows the Chilkat FTP2
	// component to know more about the server's capabilities and automatically adjust
	// any applicable internal settings based on the response. In rare cases, some FTP
	// servers reject the FEAT command and close the connection. Usually, if an FTP
	// server does not implement FEAT, a harmless command not understood response is
	// returned.
	// 
	// Set this property to false to prevent the FEAT command from being sent.
	// 
	bool get_AutoFeat(void);
	// When true (which is the default value), a FEAT command is automatically sent
	// to the FTP server immediately after connecting. This allows the Chilkat FTP2
	// component to know more about the server's capabilities and automatically adjust
	// any applicable internal settings based on the response. In rare cases, some FTP
	// servers reject the FEAT command and close the connection. Usually, if an FTP
	// server does not implement FEAT, a harmless command not understood response is
	// returned.
	// 
	// Set this property to false to prevent the FEAT command from being sent.
	// 
	void put_AutoFeat(bool newVal);

	// If true, then the following will occur when a connection is made to an FTP
	// server:
	// 
	// 1) If the Port property = 990, then sets AuthTls = false, AuthSsl = false,
	// and Ssl = true
	// 2) If the Port property = 21, sets Ssl = false
	// 
	// The default value of this property is true.
	// 
	bool get_AutoFix(void);
	// If true, then the following will occur when a connection is made to an FTP
	// server:
	// 
	// 1) If the Port property = 990, then sets AuthTls = false, AuthSsl = false,
	// and Ssl = true
	// 2) If the Port property = 21, sets Ssl = false
	// 
	// The default value of this property is true.
	// 
	void put_AutoFix(bool newVal);

	// Forces the component to retrieve each file's size prior to downloading for the
	// purpose of monitoring percentage completion progress. For many FTP servers, this
	// is not required and therefore for performance reasons this property defaults to
	// false.
	bool get_AutoGetSizeForProgress(void);
	// Forces the component to retrieve each file's size prior to downloading for the
	// purpose of monitoring percentage completion progress. For many FTP servers, this
	// is not required and therefore for performance reasons this property defaults to
	// false.
	void put_AutoGetSizeForProgress(bool newVal);

	// When true (which is the default value), then an OPTS UTF8 ON command is
	// automatically sent when connecting/authenticating if it is discovered via the
	// FEAT command that the UTF8 option is supported.
	// 
	// Set this property to false to prevent the OPTS UTF8 ON command from being
	// sent.
	// 
	bool get_AutoOptsUtf8(void);
	// When true (which is the default value), then an OPTS UTF8 ON command is
	// automatically sent when connecting/authenticating if it is discovered via the
	// FEAT command that the UTF8 option is supported.
	// 
	// Set this property to false to prevent the OPTS UTF8 ON command from being
	// sent.
	// 
	void put_AutoOptsUtf8(bool newVal);

	// If true then the UseEpsv property is automatically set upon connecting to the
	// FTP server. The default value of this property is false.
	// 
	// If the AutoFeat property is true, and if the AutoSetUseEpsv property is
	// true, then the FTP server's features are automatically queried when
	// connecting. In this case, the UseEpsv property is automatically set to true if
	// the FTP server supports EPSV.
	// 
	// Important: EPSV can cause problems with some deep-inspection firewalls. If a
	// passive data connection cannot be established, make sure to test with both the
	// AutoSetUseEpsv and UseEpsv properties set equal to false.
	// 
	bool get_AutoSetUseEpsv(void);
	// If true then the UseEpsv property is automatically set upon connecting to the
	// FTP server. The default value of this property is false.
	// 
	// If the AutoFeat property is true, and if the AutoSetUseEpsv property is
	// true, then the FTP server's features are automatically queried when
	// connecting. In this case, the UseEpsv property is automatically set to true if
	// the FTP server supports EPSV.
	// 
	// Important: EPSV can cause problems with some deep-inspection firewalls. If a
	// passive data connection cannot be established, make sure to test with both the
	// AutoSetUseEpsv and UseEpsv properties set equal to false.
	// 
	void put_AutoSetUseEpsv(bool newVal);

	// When true (which is the default value), a SYST command is automatically sent
	// to the FTP server immediately after connecting. This allows the Chilkat FTP2
	// component to know more about the server and automatically adjust any applicable
	// internal settings based on the response. If the SYST command causes trouble
	// (which is rare), this behavior can be turned off by setting this property equal
	// to false.
	bool get_AutoSyst(void);
	// When true (which is the default value), a SYST command is automatically sent
	// to the FTP server immediately after connecting. This allows the Chilkat FTP2
	// component to know more about the server and automatically adjust any applicable
	// internal settings based on the response. If the SYST command causes trouble
	// (which is rare), this behavior can be turned off by setting this property equal
	// to false.
	void put_AutoSyst(bool newVal);

	// Many FTP servers support the XCRC command. The Chilkat FTP component will
	// automatically know if XCRC is supported because it automatically sends a FEAT
	// command to the server immediately after connecting.
	// 
	// If this property is set to true, then all uploads will be automatically
	// verified by sending an XCRC command immediately after the transfer completes. If
	// the CRC is not verified, the upload method (such as PutFile) will return a
	// failed status.
	// 
	// To prevent XCRC checking, set this property to false.
	// 
	bool get_AutoXcrc(void);
	// Many FTP servers support the XCRC command. The Chilkat FTP component will
	// automatically know if XCRC is supported because it automatically sends a FEAT
	// command to the server immediately after connecting.
	// 
	// If this property is set to true, then all uploads will be automatically
	// verified by sending an XCRC command immediately after the transfer completes. If
	// the CRC is not verified, the upload method (such as PutFile) will return a
	// failed status.
	// 
	// To prevent XCRC checking, set this property to false.
	// 
	void put_AutoXcrc(bool newVal);

	// If set to a non-zero value, the FTP2 component will bandwidth throttle all
	// downloads to this value.
	// 
	// The default value of this property is 0. The value should be specified in
	// bytes/second.
	// 
	// Note: It is difficult to throttle very small downloads. (For example, how do you
	// bandwidth throttle a 1-byte download???) As the downloaded file size gets
	// larger, the transfer rate will better approximate this property's setting.
	// 
	// Also note: When downloading, the FTP server has no knowledge of the client's
	// desire for throttling, and is always sending data as fast as possible. (There's
	// nothing in the FTP protocol to request throttling.) Therefore, any throttling
	// for a download on the client side is simply to allow system socket buffers
	// (outgoing buffers on the sender, and incoming buffers on the client) to fill to
	// 100% capacity, and this also poses the threat of causing a data connection to
	// become broken. It's probably not worthwhile to attempt to throttle downloads. It
	// may have been better that this property never existed.
	// 
	int get_BandwidthThrottleDown(void);
	// If set to a non-zero value, the FTP2 component will bandwidth throttle all
	// downloads to this value.
	// 
	// The default value of this property is 0. The value should be specified in
	// bytes/second.
	// 
	// Note: It is difficult to throttle very small downloads. (For example, how do you
	// bandwidth throttle a 1-byte download???) As the downloaded file size gets
	// larger, the transfer rate will better approximate this property's setting.
	// 
	// Also note: When downloading, the FTP server has no knowledge of the client's
	// desire for throttling, and is always sending data as fast as possible. (There's
	// nothing in the FTP protocol to request throttling.) Therefore, any throttling
	// for a download on the client side is simply to allow system socket buffers
	// (outgoing buffers on the sender, and incoming buffers on the client) to fill to
	// 100% capacity, and this also poses the threat of causing a data connection to
	// become broken. It's probably not worthwhile to attempt to throttle downloads. It
	// may have been better that this property never existed.
	// 
	void put_BandwidthThrottleDown(int newVal);

	// If set to a non-zero value, the FTP2 component will bandwidth throttle all
	// uploads to this value.
	// 
	// The default value of this property is 0. The value should be specified in
	// bytes/second.
	// 
	// Note: It is difficult to throttle very small uploads. (For example, how do you
	// bandwidth throttle a 1-byte upload???) As the uploaded file size gets larger,
	// the transfer rate will better approximate this property's setting.
	// 
	int get_BandwidthThrottleUp(void);
	// If set to a non-zero value, the FTP2 component will bandwidth throttle all
	// uploads to this value.
	// 
	// The default value of this property is 0. The value should be specified in
	// bytes/second.
	// 
	// Note: It is difficult to throttle very small uploads. (For example, how do you
	// bandwidth throttle a 1-byte upload???) As the uploaded file size gets larger,
	// the transfer rate will better approximate this property's setting.
	// 
	void put_BandwidthThrottleUp(int newVal);

	// The IP address to use for computers with multiple network interfaces or IP
	// addresses. For computers with a single network interface (i.e. most computers),
	// this property should not be set. For multihoming computers, the default IP
	// address is automatically used if this property is not set.
	// 
	// The IP address is a string such as in dotted notation using numbers, not domain
	// names, such as 165.164.55.124 .
	// 
	void get_ClientIpAddress(CkString &str);
	// The IP address to use for computers with multiple network interfaces or IP
	// addresses. For computers with a single network interface (i.e. most computers),
	// this property should not be set. For multihoming computers, the default IP
	// address is automatically used if this property is not set.
	// 
	// The IP address is a string such as in dotted notation using numbers, not domain
	// names, such as 165.164.55.124 .
	// 
	const char *clientIpAddress(void);
	// The IP address to use for computers with multiple network interfaces or IP
	// addresses. For computers with a single network interface (i.e. most computers),
	// this property should not be set. For multihoming computers, the default IP
	// address is automatically used if this property is not set.
	// 
	// The IP address is a string such as in dotted notation using numbers, not domain
	// names, such as 165.164.55.124 .
	// 
	void put_ClientIpAddress(const char *newVal);

	// Indicates the charset to be used for commands sent to the FTP server. The
	// command charset must match what the FTP server is expecting in order to
	// communicate non-English characters correctly. The default value of this property
	// is ansi .
	// 
	// This property may be updated to utf-8 after connecting because a FEAT command is
	// automatically sent to get the features of the FTP server. If UTF8 is indicated
	// as a feature, then this property is automatically changed to utf-8 .
	// 
	void get_CommandCharset(CkString &str);
	// Indicates the charset to be used for commands sent to the FTP server. The
	// command charset must match what the FTP server is expecting in order to
	// communicate non-English characters correctly. The default value of this property
	// is ansi .
	// 
	// This property may be updated to utf-8 after connecting because a FEAT command is
	// automatically sent to get the features of the FTP server. If UTF8 is indicated
	// as a feature, then this property is automatically changed to utf-8 .
	// 
	const char *commandCharset(void);
	// Indicates the charset to be used for commands sent to the FTP server. The
	// command charset must match what the FTP server is expecting in order to
	// communicate non-English characters correctly. The default value of this property
	// is ansi .
	// 
	// This property may be updated to utf-8 after connecting because a FEAT command is
	// automatically sent to get the features of the FTP server. If UTF8 is indicated
	// as a feature, then this property is automatically changed to utf-8 .
	// 
	void put_CommandCharset(const char *newVal);

	// If the Connect method fails, this property can be checked to determine the
	// reason for failure.
	// 
	// Possible values are:0 = success
	// 
	// Normal (non-TLS) sockets:
	// 1 = empty hostname
	// 2 = DNS lookup failed
	// 3 = DNS timeout
	// 4 = Aborted by application.
	// 5 = Internal failure.
	// 6 = Connect Timed Out
	// 7 = Connect Rejected (or failed for some other reason)
	// 
	// SSL/TLS:
	// 100 = TLS internal error.
	// 101 = Failed to send client hello.
	// 102 = Unexpected handshake message.
	// 103 = Failed to read server hello.
	// 104 = No server certificate.
	// 105 = Unexpected TLS protocol version.
	// 106 = Server certificate verify failed (the server certificate is expired or the cert's signature verification failed).
	// 107 = Unacceptable TLS protocol version.
	// 109 = Failed to read handshake messages.
	// 110 = Failed to send client certificate handshake message.
	// 111 = Failed to send client key exchange handshake message.
	// 112 = Client certificate's private key not accessible.
	// 113 = Failed to send client cert verify handshake message.
	// 114 = Failed to send change cipher spec handshake message.
	// 115 = Failed to send finished handshake message.
	// 116 = Server's Finished message is invalid.
	// 
	// FTP:
	// 200 = Connected, but failed to receive greeting from FTP server.
	// 201 = Failed to do AUTH TLS or AUTH SSL.
	// Protocol/Component:
	// 300 = asynch op in progress
	// 301 = login failure.
	// 
	int get_ConnectFailReason(void);

	// Maximum number of seconds to wait when connecting to an FTP server. The default
	// is 30 seconds. A value of 0 indicates the willingness to wait forever.
	int get_ConnectTimeout(void);
	// Maximum number of seconds to wait when connecting to an FTP server. The default
	// is 30 seconds. A value of 0 indicates the willingness to wait forever.
	void put_ConnectTimeout(int newVal);

	// True if the FTP2 component was able to establish a TCP/IP connection to the FTP
	// server after calling Connect.
	bool get_ConnectVerified(void);

	// Used to control CRLF line endings when downloading text files in ASCII mode. The
	// default value is 0.
	// 
	// Possible values are:0 = Do nothing.  The line-endings are not modified as received from the FTP server.
	// 1 = Convert all line-endings to CR+LF
	// 2 = Convert all line-endings to bare LF's
	// 3 = Convert all line-endings to bare CR's
	// 
	int get_CrlfMode(void);
	// Used to control CRLF line endings when downloading text files in ASCII mode. The
	// default value is 0.
	// 
	// Possible values are:0 = Do nothing.  The line-endings are not modified as received from the FTP server.
	// 1 = Convert all line-endings to CR+LF
	// 2 = Convert all line-endings to bare LF's
	// 3 = Convert all line-endings to bare CR's
	// 
	void put_CrlfMode(int newVal);

	// The number of bytes received during an FTP download. This property is updated in
	// real-time and an application may periodically fetch and display it's value while
	// the download is in progress.
	unsigned long get_CurBytesReceived(void);

	// Same as CurBytesReceived, but returns the value as a 64-bit integer.
	__int64 get_CurBytesReceived64(void);

	// The number of bytes received during an FTP download. This property is updated in
	// real-time and an application may periodically fetch and display it's value while
	// the download is in progress.
	void get_CurBytesReceivedStr(CkString &str);
	// The number of bytes received during an FTP download. This property is updated in
	// real-time and an application may periodically fetch and display it's value while
	// the download is in progress.
	const char *curBytesReceivedStr(void);

	// The number of bytes sent during an FTP upload. This property is updated in
	// real-time and an application may periodically fetch and display it's value while
	// the upload is in progress.
	unsigned long get_CurBytesSent(void);

	// Same as CurBytesSent, but returns the value as a 64-bit integer.
	__int64 get_CurBytesSent64(void);

	// The number of bytes sent during an FTP upload. This string property is updated
	// in real-time and an application may periodically fetch and display it's value
	// while the upload is in progress.
	void get_CurBytesSentStr(CkString &str);
	// The number of bytes sent during an FTP upload. This string property is updated
	// in real-time and an application may periodically fetch and display it's value
	// while the upload is in progress.
	const char *curBytesSentStr(void);

	// Controls the data protection level for the data connections. Possible values are
	// control , clear , or private .
	//     * control is the default, and the data connections will be the same as for
	//     the control connection. If the control connection is SSL/TLS, then the data
	//     connections are also SSL/TLS. If the control connection is unencrypted, then the
	//     data connections will also be unencrypted.
	//     * clear means that the data connections will always be unencrypted (TCP
	//     without TLS).
	//     * private means that the data connections will always be encrypted (TLS).
	void get_DataProtection(CkString &str);
	// Controls the data protection level for the data connections. Possible values are
	// control , clear , or private .
	//     * control is the default, and the data connections will be the same as for
	//     the control connection. If the control connection is SSL/TLS, then the data
	//     connections are also SSL/TLS. If the control connection is unencrypted, then the
	//     data connections will also be unencrypted.
	//     * clear means that the data connections will always be unencrypted (TCP
	//     without TLS).
	//     * private means that the data connections will always be encrypted (TLS).
	const char *dataProtection(void);
	// Controls the data protection level for the data connections. Possible values are
	// control , clear , or private .
	//     * control is the default, and the data connections will be the same as for
	//     the control connection. If the control connection is SSL/TLS, then the data
	//     connections are also SSL/TLS. If the control connection is unencrypted, then the
	//     data connections will also be unencrypted.
	//     * clear means that the data connections will always be unencrypted (TCP
	//     without TLS).
	//     * private means that the data connections will always be encrypted (TLS).
	void put_DataProtection(const char *newVal);

	// Indicates the charset of the directory listings received from the FTP server.
	// The FTP2 client must interpret the directory listing bytes using the correct
	// character encoding in order to correctly receive non-English characters. The
	// default value of this property is ansi .
	// 
	// This property may be updated to utf-8 after connecting because a FEAT command is
	// automatically sent to get the features of the FTP server. If UTF8 is indicated
	// as a feature, then this property is automatically changed to utf-8 .
	// 
	void get_DirListingCharset(CkString &str);
	// Indicates the charset of the directory listings received from the FTP server.
	// The FTP2 client must interpret the directory listing bytes using the correct
	// character encoding in order to correctly receive non-English characters. The
	// default value of this property is ansi .
	// 
	// This property may be updated to utf-8 after connecting because a FEAT command is
	// automatically sent to get the features of the FTP server. If UTF8 is indicated
	// as a feature, then this property is automatically changed to utf-8 .
	// 
	const char *dirListingCharset(void);
	// Indicates the charset of the directory listings received from the FTP server.
	// The FTP2 client must interpret the directory listing bytes using the correct
	// character encoding in order to correctly receive non-English characters. The
	// default value of this property is ansi .
	// 
	// This property may be updated to utf-8 after connecting because a FEAT command is
	// automatically sent to get the features of the FTP server. If UTF8 is indicated
	// as a feature, then this property is automatically changed to utf-8 .
	// 
	void put_DirListingCharset(const char *newVal);

	// The average download rate in bytes/second. This property is updated in real-time
	// during any FTP download (asynchronous or synchronous).
	int get_DownloadTransferRate(void);

	// 
	// 
	// This property that automatic resolution of credentials from the operating
	// system’s secure storage.
	// 
	// When set to true, the supported properties and methods (listed below) can
	// accept a secret specification string (beginning with !! ) in place of a literal
	// value. Chilkat detects this format and retrieves the corresponding secret from:
	// 
	//     * Windows Credential Manager (Windows)
	//     * Apple Keychain (macOS)
	// 
	// Secrets are identified using a structured string format:
	// !![appName|]service[|domain]|username
	// 
	// Applies to Password , HttpProxyPassword , ProxyPassword , SocksPassword .
	// 
	// This feature allows applications to avoid embedding sensitive data directly in
	// code by securely resolving credentials at runtime.
	// 
	// The default value is false
	// 
	// 
	// References:
	// 1: #Password
	// 2: #HttpProxyPassword
	// 3: #ProxyPassword
	// 4: #SocksPassword
	bool get_EnableSecrets(void);
	// 
	// 
	// This property that automatic resolution of credentials from the operating
	// system’s secure storage.
	// 
	// When set to true, the supported properties and methods (listed below) can
	// accept a secret specification string (beginning with !! ) in place of a literal
	// value. Chilkat detects this format and retrieves the corresponding secret from:
	// 
	//     * Windows Credential Manager (Windows)
	//     * Apple Keychain (macOS)
	// 
	// Secrets are identified using a structured string format:
	// !![appName|]service[|domain]|username
	// 
	// Applies to Password , HttpProxyPassword , ProxyPassword , SocksPassword .
	// 
	// This feature allows applications to avoid embedding sensitive data directly in
	// code by securely resolving credentials at runtime.
	// 
	// The default value is false
	// 
	// 
	// References:
	// 1: #Password
	// 2: #HttpProxyPassword
	// 3: #ProxyPassword
	// 4: #SocksPassword
	void put_EnableSecrets(bool newVal);

	// If set, forces the IP address used in the PORT command for Active mode (i.e.
	// non-passive) data transfers. This string property should be set to the IP
	// address in dotted notation, such as 233.190.65.31 .
	// 
	// Note: This property can also be set to the special keyword control to force the
	// PORT IP address to be the address of the control connection's peer.
	// 
	// Starting in v9.5.0.58, the IP address can be prefixed with the string bind- .
	// For example, bind-233.190.65.31 . When bind- is specified, the local data socket
	// will be bound to the IP address when created. Otherwise, the IP address is only
	// used as the argument to the PORT command that is sent to the server.
	// 
	void get_ForcePortIpAddress(CkString &str);
	// If set, forces the IP address used in the PORT command for Active mode (i.e.
	// non-passive) data transfers. This string property should be set to the IP
	// address in dotted notation, such as 233.190.65.31 .
	// 
	// Note: This property can also be set to the special keyword control to force the
	// PORT IP address to be the address of the control connection's peer.
	// 
	// Starting in v9.5.0.58, the IP address can be prefixed with the string bind- .
	// For example, bind-233.190.65.31 . When bind- is specified, the local data socket
	// will be bound to the IP address when created. Otherwise, the IP address is only
	// used as the argument to the PORT command that is sent to the server.
	// 
	const char *forcePortIpAddress(void);
	// If set, forces the IP address used in the PORT command for Active mode (i.e.
	// non-passive) data transfers. This string property should be set to the IP
	// address in dotted notation, such as 233.190.65.31 .
	// 
	// Note: This property can also be set to the special keyword control to force the
	// PORT IP address to be the address of the control connection's peer.
	// 
	// Starting in v9.5.0.58, the IP address can be prefixed with the string bind- .
	// For example, bind-233.190.65.31 . When bind- is specified, the local data socket
	// will be bound to the IP address when created. Otherwise, the IP address is only
	// used as the argument to the PORT command that is sent to the server.
	// 
	void put_ForcePortIpAddress(const char *newVal);

	// The initial greeting received from the FTP server after connecting.
	void get_Greeting(CkString &str);
	// The initial greeting received from the FTP server after connecting.
	const char *greeting(void);

	// Chilkat FTP2 supports MODE Z, which is a transfer mode implemented by some FTP
	// servers. It allows for files to be uploaded and downloaded using compressed
	// streams (using the zlib deflate algorithm). This is a read-only property. It
	// will be set to true if the FTP2 component detects that your FTP server
	// supports MODE Z. Otherwise it is set to false.
	bool get_HasModeZ(void);

	// The interval in milliseconds between each AbortCheck event callback, which
	// enables an application to abort certain method calls before they complete. By
	// default, HeartbeatMs is set to 0 , meaning no AbortCheck event callbacks will
	// trigger.
	// 
	// References:
	// 1: #AbortCheck
	int get_HeartbeatMs(void);
	// The interval in milliseconds between each AbortCheck event callback, which
	// enables an application to abort certain method calls before they complete. By
	// default, HeartbeatMs is set to 0 , meaning no AbortCheck event callbacks will
	// trigger.
	// 
	// References:
	// 1: #AbortCheck
	void put_HeartbeatMs(int newVal);

	// The domain name of the FTP server. May also use the IPv4 or IPv6 address in
	// string format.
	void get_Hostname(CkString &str);
	// The domain name of the FTP server. May also use the IPv4 or IPv6 address in
	// string format.
	const char *hostname(void);
	// The domain name of the FTP server. May also use the IPv4 or IPv6 address in
	// string format.
	void put_Hostname(const char *newVal);

	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy authentication method name. Valid choices are Basic or NTLM .
	void get_HttpProxyAuthMethod(CkString &str);
	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy authentication method name. Valid choices are Basic or NTLM .
	const char *httpProxyAuthMethod(void);
	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy authentication method name. Valid choices are Basic or NTLM .
	void put_HttpProxyAuthMethod(const char *newVal);

	// If an HTTP proxy is used, and it uses NTLM authentication, then this optional
	// property is the NTLM authentication domain.
	void get_HttpProxyDomain(CkString &str);
	// If an HTTP proxy is used, and it uses NTLM authentication, then this optional
	// property is the NTLM authentication domain.
	const char *httpProxyDomain(void);
	// If an HTTP proxy is used, and it uses NTLM authentication, then this optional
	// property is the NTLM authentication domain.
	void put_HttpProxyDomain(const char *newVal);

	// If an HTTP proxy is to be used, set this property to the HTTP proxy hostname or
	// IPv4 address (in dotted decimal notation).
	void get_HttpProxyHostname(CkString &str);
	// If an HTTP proxy is to be used, set this property to the HTTP proxy hostname or
	// IPv4 address (in dotted decimal notation).
	const char *httpProxyHostname(void);
	// If an HTTP proxy is to be used, set this property to the HTTP proxy hostname or
	// IPv4 address (in dotted decimal notation).
	void put_HttpProxyHostname(const char *newVal);

	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy password.
	void get_HttpProxyPassword(CkString &str);
	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy password.
	const char *httpProxyPassword(void);
	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy password.
	void put_HttpProxyPassword(const char *newVal);

	// If an HTTP proxy is to be used, set this property to the HTTP proxy port number.
	// (Two commonly used HTTP proxy ports are 8080 and 3128.)
	int get_HttpProxyPort(void);
	// If an HTTP proxy is to be used, set this property to the HTTP proxy port number.
	// (Two commonly used HTTP proxy ports are 8080 and 3128.)
	void put_HttpProxyPort(int newVal);

	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy login name.
	void get_HttpProxyUsername(CkString &str);
	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy login name.
	const char *httpProxyUsername(void);
	// If an HTTP proxy requiring authentication is to be used, set this property to
	// the HTTP proxy login name.
	void put_HttpProxyUsername(const char *newVal);

	// The maximum amount of time, in milliseconds, to wait for a response on the
	// control channel. A value of 0 means to wait indefinitely. The default value is
	// 60000 (i.e. 60 seconds).
	// 
	// This is also the maximum amount of time to wait while paused during an upload
	// because outgoing system socket buffers are full. If an upload hangs with no
	// additional data sent for this amount of time (because the server is not
	// consuming data on its end), then the upload will fail with a timeout.
	// 
	int get_IdleTimeoutMs(void);
	// The maximum amount of time, in milliseconds, to wait for a response on the
	// control channel. A value of 0 means to wait indefinitely. The default value is
	// 60000 (i.e. 60 seconds).
	// 
	// This is also the maximum amount of time to wait while paused during an upload
	// because outgoing system socket buffers are full. If an upload hangs with no
	// additional data sent for this amount of time (because the server is not
	// consuming data on its end), then the upload will fail with a timeout.
	// 
	void put_IdleTimeoutMs(int newVal);

	// Important: This property is deprecated. Applications should instead call the
	// CheckConnection method.
	// 
	// Returns true if currently connected and logged into an FTP server, otherwise
	// returns false.
	// 
	// Note: Accessing this property may cause a NOOP command to be sent to the FTP
	// server.
	// 
	bool get_IsConnected(void);

	// Turns the in-memory session logging on or off. If on, the session log can be
	// obtained via the SessionLog property.
	bool get_KeepSessionLog(void);
	// Turns the in-memory session logging on or off. If on, the session log can be
	// obtained via the SessionLog property.
	void put_KeepSessionLog(bool newVal);

	// Enables internal features that can help when uploading or downloading extremely
	// large files. In some cases, if the time required to transfer a file is long, the
	// control connection is closed by the server or other network infrastructure
	// because it was idle for so long. Setting this property equal to true will keep
	// the control connection very slightly used to prevent this from happening.
	// 
	// The default value of this property is false. This property should only be set
	// to true if this sort of problem is encountered.
	// 
	bool get_LargeFileMeasures(void);
	// Enables internal features that can help when uploading or downloading extremely
	// large files. In some cases, if the time required to transfer a file is long, the
	// control connection is closed by the server or other network infrastructure
	// because it was idle for so long. Setting this property equal to true will keep
	// the control connection very slightly used to prevent this from happening.
	// 
	// The default value of this property is false. This property should only be set
	// to true if this sort of problem is encountered.
	// 
	void put_LargeFileMeasures(bool newVal);

	// Contains the last control-channel reply. For example: 550 Failed to change
	// directory. or 250 Directory successfully changed. The control channel reply is
	// typically formatted as an integer status code followed by a one-line
	// description.
	void get_LastReply(CkString &str);
	// Contains the last control-channel reply. For example: 550 Failed to change
	// directory. or 250 Directory successfully changed. The control channel reply is
	// typically formatted as an integer status code followed by a one-line
	// description.
	const char *lastReply(void);

	// This property can be set to an option string, such as -a , which is added to the
	// LIST command when retrieving FTP directory listings. This only applies when
	// Chilkat issues the LIST command, as it prefers the MLSD command for servers that
	// support it. Most servers do support MLSD, which provides machine-readable
	// listings in a standardized format for easier parsing. Chilkat uses LIST only
	// when necessary. Note that LIST options like LIST -a aren't part of the FTP
	// standard; the listing format is unspecified in the FTP specification. Many
	// servers merely pass these arguments to the underlying OS command, commonly ls on
	// Unix systems.
	void get_ListOption(CkString &str);
	// This property can be set to an option string, such as -a , which is added to the
	// LIST command when retrieving FTP directory listings. This only applies when
	// Chilkat issues the LIST command, as it prefers the MLSD command for servers that
	// support it. Most servers do support MLSD, which provides machine-readable
	// listings in a standardized format for easier parsing. Chilkat uses LIST only
	// when necessary. Note that LIST options like LIST -a aren't part of the FTP
	// standard; the listing format is unspecified in the FTP specification. Many
	// servers merely pass these arguments to the underlying OS command, commonly ls on
	// Unix systems.
	const char *listOption(void);
	// This property can be set to an option string, such as -a , which is added to the
	// LIST command when retrieving FTP directory listings. This only applies when
	// Chilkat issues the LIST command, as it prefers the MLSD command for servers that
	// support it. Most servers do support MLSD, which provides machine-readable
	// listings in a standardized format for easier parsing. Chilkat uses LIST only
	// when necessary. Note that LIST options like LIST -a aren't part of the FTP
	// standard; the listing format is unspecified in the FTP specification. Many
	// servers merely pass these arguments to the underlying OS command, commonly ls on
	// Unix systems.
	void put_ListOption(const char *newVal);

	// A wildcard pattern, defaulting to * that determines the files and directories
	// included in the following methods: GetDirCount, GetFilename, GetIsDirectory,
	// GetSize, GetCreateTime* and GetLastMod*.
	// 
	// Note: Do not include a directory path in the ListPattern. For example, do not
	// set the ListPattern equal to a string such as this: subdir/*.txt . The correct
	// solution is to first change the remote directory to subdir by calling
	// ChangeRemoteDir, and then set the ListPattern equal to *.txt .
	// 
	void get_ListPattern(CkString &str);
	// A wildcard pattern, defaulting to * that determines the files and directories
	// included in the following methods: GetDirCount, GetFilename, GetIsDirectory,
	// GetSize, GetCreateTime* and GetLastMod*.
	// 
	// Note: Do not include a directory path in the ListPattern. For example, do not
	// set the ListPattern equal to a string such as this: subdir/*.txt . The correct
	// solution is to first change the remote directory to subdir by calling
	// ChangeRemoteDir, and then set the ListPattern equal to *.txt .
	// 
	const char *listPattern(void);
	// A wildcard pattern, defaulting to * that determines the files and directories
	// included in the following methods: GetDirCount, GetFilename, GetIsDirectory,
	// GetSize, GetCreateTime* and GetLastMod*.
	// 
	// Note: Do not include a directory path in the ListPattern. For example, do not
	// set the ListPattern equal to a string such as this: subdir/*.txt . The correct
	// solution is to first change the remote directory to subdir by calling
	// ChangeRemoteDir, and then set the ListPattern equal to *.txt .
	// 
	void put_ListPattern(const char *newVal);

	// True if the FTP2 component was able to login to the FTP server after calling
	// Connect.
	bool get_LoginVerified(void);

	// A read-only property that indicates whether a partial transfer was received in
	// the last method call to download a file. Set to true if a partial transfer was
	// received. Set to false if nothing was received, or if the full file was
	// received.
	bool get_PartialTransfer(void);

	// Set to true for FTP to operate in passive mode, otherwise set to false for
	// non-passive (.i.e. active or port mode). The default value of this property is
	// true.
	bool get_Passive(void);
	// Set to true for FTP to operate in passive mode, otherwise set to false for
	// non-passive (.i.e. active or port mode). The default value of this property is
	// true.
	void put_Passive(bool newVal);

	// This can handle problems that may arise when an FTP server is located behind a
	// NAT router. FTP servers respond to the PASV command by sending the IP address
	// and port where it will be listening for the data connection. If the control
	// connection is SSL encrypted, the NAT router is not able to convert from an
	// internal IP address (typically beginning with 192.168) to an external address.
	// When set to true, PassiveUseHostAddr property tells the FTP client to discard
	// the IP address part of the PASV response and replace it with the IP address of
	// the already-established control connection. The default value of this property
	// is true.
	bool get_PassiveUseHostAddr(void);
	// This can handle problems that may arise when an FTP server is located behind a
	// NAT router. FTP servers respond to the PASV command by sending the IP address
	// and port where it will be listening for the data connection. If the control
	// connection is SSL encrypted, the NAT router is not able to convert from an
	// internal IP address (typically beginning with 192.168) to an external address.
	// When set to true, PassiveUseHostAddr property tells the FTP client to discard
	// the IP address part of the PASV response and replace it with the IP address of
	// the already-established control connection. The default value of this property
	// is true.
	void put_PassiveUseHostAddr(bool newVal);

	// Password for logging into the FTP server.
	void get_Password(CkString &str);
	// Password for logging into the FTP server.
	const char *password(void);
	// Password for logging into the FTP server.
	void put_Password(const char *newVal);

	// This property is only valid in programming environment and languages that allow
	// for event callbacks.
	// 
	// Sets the value to be defined as 100% complete for the purpose of PercentDone
	// event callbacks. The defaut value of 100 means that at most 100 event
	// PercentDone callbacks will occur in a method that (1) is event enabled and (2)
	// is such that it is possible to measure progress as a percentage completed. This
	// property may be set to larger numbers to get more fine-grained PercentDone
	// callbacks. For example, setting this property equal to 1000 will provide
	// callbacks with .1 percent granularity. For example, a value of 453 would
	// indicate 45.3% competed. This property is clamped to a minimum value of 10, and
	// a maximum value of 100000.
	// 
	int get_PercentDoneScale(void);
	// This property is only valid in programming environment and languages that allow
	// for event callbacks.
	// 
	// Sets the value to be defined as 100% complete for the purpose of PercentDone
	// event callbacks. The defaut value of 100 means that at most 100 event
	// PercentDone callbacks will occur in a method that (1) is event enabled and (2)
	// is such that it is possible to measure progress as a percentage completed. This
	// property may be set to larger numbers to get more fine-grained PercentDone
	// callbacks. For example, setting this property equal to 1000 will provide
	// callbacks with .1 percent granularity. For example, a value of 453 would
	// indicate 45.3% competed. This property is clamped to a minimum value of 10, and
	// a maximum value of 100000.
	// 
	void put_PercentDoneScale(int newVal);

	// Port number. Automatically defaults to the default port for the FTP service.
	int get_Port(void);
	// Port number. Automatically defaults to the default port for the FTP service.
	void put_Port(int newVal);

	// If true, then use IPv6 over IPv4 when both are supported for a particular
	// domain. The default value of this property is false, which will choose IPv4
	// over IPv6.
	bool get_PreferIpv6(void);
	// If true, then use IPv6 over IPv4 when both are supported for a particular
	// domain. The default value of this property is false, which will choose IPv4
	// over IPv6.
	void put_PreferIpv6(bool newVal);

	// If true, the NLST command is used instead of LIST when fetching a directory
	// listing. This can help in very rare cases where the FTP server returns truncated
	// filenames. The drawback to using NLST is that it won't return size or date/time
	// info (but it should return the full filename).
	// 
	// The default value of this property is false.
	// 
	bool get_PreferNlst(void);
	// If true, the NLST command is used instead of LIST when fetching a directory
	// listing. This can help in very rare cases where the FTP server returns truncated
	// filenames. The drawback to using NLST is that it won't return size or date/time
	// info (but it should return the full filename).
	// 
	// The default value of this property is false.
	// 
	void put_PreferNlst(bool newVal);

	// Progress monitoring for FTP downloads rely on the FTP server indicating the file
	// size within the RETR response. Some FTP servers however, do not indicate the
	// file size and therefore it is not possible to monitor progress based on
	// percentage completion. This property allows the application to explicitly tell
	// the FTP component the size of the file about to be downloaded for the next
	// GetFile call.
	int get_ProgressMonSize(void);
	// Progress monitoring for FTP downloads rely on the FTP server indicating the file
	// size within the RETR response. Some FTP servers however, do not indicate the
	// file size and therefore it is not possible to monitor progress based on
	// percentage completion. This property allows the application to explicitly tell
	// the FTP component the size of the file about to be downloaded for the next
	// GetFile call.
	void put_ProgressMonSize(int newVal);

	// Same as ProgressMonSize, but allows for sizes greater than the 32-bit integer
	// limit.
	__int64 get_ProgressMonSize64(void);
	// Same as ProgressMonSize, but allows for sizes greater than the 32-bit integer
	// limit.
	void put_ProgressMonSize64(__int64 newVal);

	// The hostname of your FTP proxy, if a proxy server is used.
	void get_ProxyHostname(CkString &str);
	// The hostname of your FTP proxy, if a proxy server is used.
	const char *proxyHostname(void);
	// The hostname of your FTP proxy, if a proxy server is used.
	void put_ProxyHostname(const char *newVal);

	// The proxy scheme used by your FTP proxy server. Valid values are 0 to 9. The
	// default value is 0 which indicates that no proxy server is used. Supported proxy
	// methods are as follows:
	// 
	// Note: The ProxyHostname is the hostname of the firewall, if the proxy is a
	// firewall. Also, the ProxyUsername and ProxyPassword are the firewall
	// username/password (if the proxy is a firewall).
	// 
	//     ProxyMethod = 1 (SITE site)
	// 
	//         USER ProxyUsername
	//         PASS ProxyPassword
	//         SITE Hostname
	//         USER Username
	//         PASS Password
	// 
	//     ProxyMethod = 2 (USER user@site)
	// 
	//         USER Username@Hostname:Port
	//         PASS Password
	// 
	//     ProxyMethod = 3 (USER with login)
	// 
	//         USER ProxyUsername
	//         PASS ProxyPassword
	//         USER Username@Hostname:Port
	//         PASS Password
	// 
	//     ProxyMethod = 4 (USER/PASS/ACCT)
	// 
	//         USER Username@Hostname:Port ProxyUsername
	//         PASS Password
	//         ACCT ProxyPassword
	// 
	//     ProxyMethod = 5 (OPEN site)
	// 
	//         USER ProxyUsername
	//         PASS ProxyPassword
	//         OPEN Hostname
	//         USER Username
	//         PASS Password
	// 
	//     ProxyMethod = 6 (firewallId@site)
	// 
	//         USER ProxyUsername@Hostname
	//         USER Username
	//         PASS Password
	// 
	//     ProxyMethod = 7
	// 
	//         USER ProxyUsername
	//         USER ProxyPassword
	//         SITE Hostname:Port USER Username
	//         PASS Password
	// 
	//     ProxyMethod = 8
	// 
	//         USER Username@ProxyUsername@Hostname
	//         PASS Password@ProxyPassword
	// 
	//     ProxyMethod = 9
	// 
	//         ProxyUsername ProxyPassword Username Password
	// 
	int get_ProxyMethod(void);
	// The proxy scheme used by your FTP proxy server. Valid values are 0 to 9. The
	// default value is 0 which indicates that no proxy server is used. Supported proxy
	// methods are as follows:
	// 
	// Note: The ProxyHostname is the hostname of the firewall, if the proxy is a
	// firewall. Also, the ProxyUsername and ProxyPassword are the firewall
	// username/password (if the proxy is a firewall).
	// 
	//     ProxyMethod = 1 (SITE site)
	// 
	//         USER ProxyUsername
	//         PASS ProxyPassword
	//         SITE Hostname
	//         USER Username
	//         PASS Password
	// 
	//     ProxyMethod = 2 (USER user@site)
	// 
	//         USER Username@Hostname:Port
	//         PASS Password
	// 
	//     ProxyMethod = 3 (USER with login)
	// 
	//         USER ProxyUsername
	//         PASS ProxyPassword
	//         USER Username@Hostname:Port
	//         PASS Password
	// 
	//     ProxyMethod = 4 (USER/PASS/ACCT)
	// 
	//         USER Username@Hostname:Port ProxyUsername
	//         PASS Password
	//         ACCT ProxyPassword
	// 
	//     ProxyMethod = 5 (OPEN site)
	// 
	//         USER ProxyUsername
	//         PASS ProxyPassword
	//         OPEN Hostname
	//         USER Username
	//         PASS Password
	// 
	//     ProxyMethod = 6 (firewallId@site)
	// 
	//         USER ProxyUsername@Hostname
	//         USER Username
	//         PASS Password
	// 
	//     ProxyMethod = 7
	// 
	//         USER ProxyUsername
	//         USER ProxyPassword
	//         SITE Hostname:Port USER Username
	//         PASS Password
	// 
	//     ProxyMethod = 8
	// 
	//         USER Username@ProxyUsername@Hostname
	//         PASS Password@ProxyPassword
	// 
	//     ProxyMethod = 9
	// 
	//         ProxyUsername ProxyPassword Username Password
	// 
	void put_ProxyMethod(int newVal);

	// The password for authenticating with the FTP proxy server.
	void get_ProxyPassword(CkString &str);
	// The password for authenticating with the FTP proxy server.
	const char *proxyPassword(void);
	// The password for authenticating with the FTP proxy server.
	void put_ProxyPassword(const char *newVal);

	// If an FTP proxy server is used, this is the port number at which the proxy
	// server is listening for connections.
	int get_ProxyPort(void);
	// If an FTP proxy server is used, this is the port number at which the proxy
	// server is listening for connections.
	void put_ProxyPort(int newVal);

	// The username for authenticating with the FTP proxy server.
	void get_ProxyUsername(CkString &str);
	// The username for authenticating with the FTP proxy server.
	const char *proxyUsername(void);
	// The username for authenticating with the FTP proxy server.
	void put_ProxyUsername(const char *newVal);

	// Forces a timeout when incoming data is expected on a data channel, but no data
	// arrives for this number of seconds. The ReadTimeout is the amount of time that
	// needs to elapse while no additional data is forthcoming. During a long download,
	// if the data stream halts for more than this amount, it will timeout. Otherwise,
	// there is no limit on the length of time for the entire download.
	// 
	// The default value is 60.
	// 
	int get_ReadTimeout(void);
	// Forces a timeout when incoming data is expected on a data channel, but no data
	// arrives for this number of seconds. The ReadTimeout is the amount of time that
	// needs to elapse while no additional data is forthcoming. During a long download,
	// if the data stream halts for more than this amount, it will timeout. Otherwise,
	// there is no limit on the length of time for the entire download.
	// 
	// The default value is 60.
	// 
	void put_ReadTimeout(int newVal);

	// If true, then the FTP2 client will verify the server's SSL certificate. The
	// server's certificate signature is verified with its issuer, and the issuer's
	// cert is verified with its issuer, etc. up to the root CA cert. If a signature
	// verification fails, the connection is not allowed. Also, if the certificate is
	// expired, or if the cert's signature is invalid, the connection is not allowed.
	// The default value of this property is false.
	bool get_RequireSslCertVerify(void);
	// If true, then the FTP2 client will verify the server's SSL certificate. The
	// server's certificate signature is verified with its issuer, and the issuer's
	// cert is verified with its issuer, etc. up to the root CA cert. If a signature
	// verification fails, the connection is not allowed. Also, if the certificate is
	// expired, or if the cert's signature is invalid, the connection is not allowed.
	// The default value of this property is false.
	void put_RequireSslCertVerify(bool newVal);

	// Both uploads and downloads may be resumed by simply setting this property =
	// true and re-calling the upload or download method.
	bool get_RestartNext(void);
	// Both uploads and downloads may be resumed by simply setting this property =
	// true and re-calling the upload or download method.
	void put_RestartNext(bool newVal);

	// Contains the session log if KeepSessionLog is turned on.
	void get_SessionLog(CkString &str);
	// Contains the session log if KeepSessionLog is turned on.
	const char *sessionLog(void);

	// The SOCKS4/SOCKS5 hostname or IPv4 address (in dotted decimal notation). This
	// property is only used if the SocksVersion property is set to 4 or 5).
	void get_SocksHostname(CkString &str);
	// The SOCKS4/SOCKS5 hostname or IPv4 address (in dotted decimal notation). This
	// property is only used if the SocksVersion property is set to 4 or 5).
	const char *socksHostname(void);
	// The SOCKS4/SOCKS5 hostname or IPv4 address (in dotted decimal notation). This
	// property is only used if the SocksVersion property is set to 4 or 5).
	void put_SocksHostname(const char *newVal);

	// The SOCKS5 password (if required). The SOCKS4 protocol does not include the use
	// of a password, so this does not apply to SOCKS4.
	void get_SocksPassword(CkString &str);
	// The SOCKS5 password (if required). The SOCKS4 protocol does not include the use
	// of a password, so this does not apply to SOCKS4.
	const char *socksPassword(void);
	// The SOCKS5 password (if required). The SOCKS4 protocol does not include the use
	// of a password, so this does not apply to SOCKS4.
	void put_SocksPassword(const char *newVal);

	// The SOCKS4/SOCKS5 proxy port. The default value is 1080. This property only
	// applies if a SOCKS proxy is used (if the SocksVersion property is set to 4 or
	// 5).
	int get_SocksPort(void);
	// The SOCKS4/SOCKS5 proxy port. The default value is 1080. This property only
	// applies if a SOCKS proxy is used (if the SocksVersion property is set to 4 or
	// 5).
	void put_SocksPort(int newVal);

	// The SOCKS4/SOCKS5 proxy username. This property is only used if the SocksVersion
	// property is set to 4 or 5).
	void get_SocksUsername(CkString &str);
	// The SOCKS4/SOCKS5 proxy username. This property is only used if the SocksVersion
	// property is set to 4 or 5).
	const char *socksUsername(void);
	// The SOCKS4/SOCKS5 proxy username. This property is only used if the SocksVersion
	// property is set to 4 or 5).
	void put_SocksUsername(const char *newVal);

	// SocksVersion May be set to one of the following integer values:
	// 
	// 0 - No SOCKS proxy is used. This is the default.
	// 4 - Connect via a SOCKS4 proxy.
	// 5 - Connect via a SOCKS5 proxy.
	// 
	int get_SocksVersion(void);
	// SocksVersion May be set to one of the following integer values:
	// 
	// 0 - No SOCKS proxy is used. This is the default.
	// 4 - Connect via a SOCKS4 proxy.
	// 5 - Connect via a SOCKS5 proxy.
	// 
	void put_SocksVersion(int newVal);

	// Sets the receive buffer size socket option. Normally, this property should be
	// left unchanged. The default value is 4194304.
	// 
	// This property can be increased if download performance seems slow. It is
	// recommended to be a multiple of 4096.
	// 
	// Note: This property only applies to FTP data connections. The FTP control
	// connection is not used for uploading or downloading files, and is therefore not
	// performance sensitive.
	// 
	int get_SoRcvBuf(void);
	// Sets the receive buffer size socket option. Normally, this property should be
	// left unchanged. The default value is 4194304.
	// 
	// This property can be increased if download performance seems slow. It is
	// recommended to be a multiple of 4096.
	// 
	// Note: This property only applies to FTP data connections. The FTP control
	// connection is not used for uploading or downloading files, and is therefore not
	// performance sensitive.
	// 
	void put_SoRcvBuf(int newVal);

	// Sets the send buffer size socket option. Normally, this property should be left
	// unchanged. The default value is 262144.
	// 
	// This property can be increased if upload performance seems slow. It is
	// recommended to be a multiple of 4096. Testing with sizes such as 512K and 1MB is
	// reasonable.
	// 
	// Note: This property only applies to FTP data connections. The FTP control
	// connection is not used for uploading or downloading files, and is therefore not
	// performance sensitive.
	// 
	int get_SoSndBuf(void);
	// Sets the send buffer size socket option. Normally, this property should be left
	// unchanged. The default value is 262144.
	// 
	// This property can be increased if upload performance seems slow. It is
	// recommended to be a multiple of 4096. Testing with sizes such as 512K and 1MB is
	// reasonable.
	// 
	// Note: This property only applies to FTP data connections. The FTP control
	// connection is not used for uploading or downloading files, and is therefore not
	// performance sensitive.
	// 
	void put_SoSndBuf(int newVal);

	// Use TLS/SSL for FTP connections. You would typically set Ssl = true when
	// connecting to port 990 on FTP servers that support TLS/SSL mode. Note: It is
	// more common to use AuthTls.
	bool get_Ssl(void);
	// Use TLS/SSL for FTP connections. You would typically set Ssl = true when
	// connecting to port 990 on FTP servers that support TLS/SSL mode. Note: It is
	// more common to use AuthTls.
	void put_Ssl(bool newVal);

	// Provides a means for setting a list of ciphers that are allowed for SSL/TLS
	// connections. The default (empty string) indicates that all implemented ciphers
	// are possible. The TLS ciphers supported in Chilkat v9.5.0.55 and later are:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
	// TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
	// TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
	// TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
	// TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA
	// TLS_RSA_WITH_AES_256_CBC_SHA256
	// TLS_RSA_WITH_AES_256_GCM_SHA384
	// TLS_RSA_WITH_AES_256_CBC_SHA
	// TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
	// TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
	// TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
	// TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
	// TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
	// TLS_DHE_RSA_WITH_AES_128_CBC_SHA
	// TLS_RSA_WITH_AES_128_CBC_SHA256
	// TLS_RSA_WITH_AES_128_GCM_SHA256
	// TLS_RSA_WITH_AES_128_CBC_SHA
	// TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_ECDHE_RSA_WITH_RC4_128_SHA
	// TLS_RSA_WITH_RC4_128_SHA
	// TLS_RSA_WITH_RC4_128_MD5
	// TLS_DHE_RSA_WITH_DES_CBC_SHA
	// TLS_RSA_WITH_DES_CBC_SHA
	// To restrict SSL/TLS connections to one or more specific ciphers, set this
	// property to a comma-separated list of ciphers such as
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 .
	// The order should be in terms of preference, with the preferred algorithms listed
	// first. (Note that the client cannot specifically choose the algorithm is picked
	// because it is the server that chooses. The client simply provides the server
	// with a list from which to choose.)
	// 
	// The property can also disallow connections with servers having certificates with
	// RSA keys less than a certain size. By default, server certificates having RSA
	// keys of 512 bits or greater are allowed. Add the keyword rsa1024 to disallow
	// connections with servers having keys smaller than 1024 bits. Add the keyword
	// rsa2048 to disallow connections with servers having keys smaller than 2048 bits.
	// 
	// Note: Prior to Chilkat v9.5.0.55, it was not possible to explicitly list allowed
	// cipher suites. The deprecated means for indicating allowed ciphers was both
	// incomplete and unprecise. For example, the following keywords could be listed to
	// allow matching ciphers: aes256-cbc , aes128-cbc , 3des-cbc , and rc4 . These
	// keywords will still be recognized, but programs should be updated to explicitly
	// list the allowed ciphers.
	// 
	// secure-renegotiation: Starting in Chilkat v9.5.0.55, the keyword
	// secure-renegotiation may be added to require that all renegotions be done
	// securely (as per RFC 5746).
	// 
	// best-practices: Starting in Chilkat v9.5.0.55, this property may be set to the
	// single keyword best-practices . This will allow ciphers based on the current
	// best practices. As new versions of Chilkat are released, the best practices may
	// change. Changes will be noted here. The current best practices are:
	// 
	//     * If the server uses an RSA key, it must be 1024 bits or greater.
	//     * All renegotations must be secure renegotiations.
	//     * All ciphers using RC4, DES, or 3DES are disallowed.
	// 
	// Example: The following string would restrict to 2 specific cipher suites,
	// require RSA keys to be 1024 bits or greater, and require secure renegotiations:
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, rsa1024,
	// secure-renegotiation
	// 
	void get_SslAllowedCiphers(CkString &str);
	// Provides a means for setting a list of ciphers that are allowed for SSL/TLS
	// connections. The default (empty string) indicates that all implemented ciphers
	// are possible. The TLS ciphers supported in Chilkat v9.5.0.55 and later are:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
	// TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
	// TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
	// TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
	// TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA
	// TLS_RSA_WITH_AES_256_CBC_SHA256
	// TLS_RSA_WITH_AES_256_GCM_SHA384
	// TLS_RSA_WITH_AES_256_CBC_SHA
	// TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
	// TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
	// TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
	// TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
	// TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
	// TLS_DHE_RSA_WITH_AES_128_CBC_SHA
	// TLS_RSA_WITH_AES_128_CBC_SHA256
	// TLS_RSA_WITH_AES_128_GCM_SHA256
	// TLS_RSA_WITH_AES_128_CBC_SHA
	// TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_ECDHE_RSA_WITH_RC4_128_SHA
	// TLS_RSA_WITH_RC4_128_SHA
	// TLS_RSA_WITH_RC4_128_MD5
	// TLS_DHE_RSA_WITH_DES_CBC_SHA
	// TLS_RSA_WITH_DES_CBC_SHA
	// To restrict SSL/TLS connections to one or more specific ciphers, set this
	// property to a comma-separated list of ciphers such as
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 .
	// The order should be in terms of preference, with the preferred algorithms listed
	// first. (Note that the client cannot specifically choose the algorithm is picked
	// because it is the server that chooses. The client simply provides the server
	// with a list from which to choose.)
	// 
	// The property can also disallow connections with servers having certificates with
	// RSA keys less than a certain size. By default, server certificates having RSA
	// keys of 512 bits or greater are allowed. Add the keyword rsa1024 to disallow
	// connections with servers having keys smaller than 1024 bits. Add the keyword
	// rsa2048 to disallow connections with servers having keys smaller than 2048 bits.
	// 
	// Note: Prior to Chilkat v9.5.0.55, it was not possible to explicitly list allowed
	// cipher suites. The deprecated means for indicating allowed ciphers was both
	// incomplete and unprecise. For example, the following keywords could be listed to
	// allow matching ciphers: aes256-cbc , aes128-cbc , 3des-cbc , and rc4 . These
	// keywords will still be recognized, but programs should be updated to explicitly
	// list the allowed ciphers.
	// 
	// secure-renegotiation: Starting in Chilkat v9.5.0.55, the keyword
	// secure-renegotiation may be added to require that all renegotions be done
	// securely (as per RFC 5746).
	// 
	// best-practices: Starting in Chilkat v9.5.0.55, this property may be set to the
	// single keyword best-practices . This will allow ciphers based on the current
	// best practices. As new versions of Chilkat are released, the best practices may
	// change. Changes will be noted here. The current best practices are:
	// 
	//     * If the server uses an RSA key, it must be 1024 bits or greater.
	//     * All renegotations must be secure renegotiations.
	//     * All ciphers using RC4, DES, or 3DES are disallowed.
	// 
	// Example: The following string would restrict to 2 specific cipher suites,
	// require RSA keys to be 1024 bits or greater, and require secure renegotiations:
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, rsa1024,
	// secure-renegotiation
	// 
	const char *sslAllowedCiphers(void);
	// Provides a means for setting a list of ciphers that are allowed for SSL/TLS
	// connections. The default (empty string) indicates that all implemented ciphers
	// are possible. The TLS ciphers supported in Chilkat v9.5.0.55 and later are:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
	// TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
	// TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
	// TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
	// TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
	// TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA
	// TLS_RSA_WITH_AES_256_CBC_SHA256
	// TLS_RSA_WITH_AES_256_GCM_SHA384
	// TLS_RSA_WITH_AES_256_CBC_SHA
	// TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
	// TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
	// TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
	// TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
	// TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
	// TLS_DHE_RSA_WITH_AES_128_CBC_SHA
	// TLS_RSA_WITH_AES_128_CBC_SHA256
	// TLS_RSA_WITH_AES_128_GCM_SHA256
	// TLS_RSA_WITH_AES_128_CBC_SHA
	// TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_RSA_WITH_3DES_EDE_CBC_SHA
	// TLS_ECDHE_RSA_WITH_RC4_128_SHA
	// TLS_RSA_WITH_RC4_128_SHA
	// TLS_RSA_WITH_RC4_128_MD5
	// TLS_DHE_RSA_WITH_DES_CBC_SHA
	// TLS_RSA_WITH_DES_CBC_SHA
	// To restrict SSL/TLS connections to one or more specific ciphers, set this
	// property to a comma-separated list of ciphers such as
	// TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 .
	// The order should be in terms of preference, with the preferred algorithms listed
	// first. (Note that the client cannot specifically choose the algorithm is picked
	// because it is the server that chooses. The client simply provides the server
	// with a list from which to choose.)
	// 
	// The property can also disallow connections with servers having certificates with
	// RSA keys less than a certain size. By default, server certificates having RSA
	// keys of 512 bits or greater are allowed. Add the keyword rsa1024 to disallow
	// connections with servers having keys smaller than 1024 bits. Add the keyword
	// rsa2048 to disallow connections with servers having keys smaller than 2048 bits.
	// 
	// Note: Prior to Chilkat v9.5.0.55, it was not possible to explicitly list allowed
	// cipher suites. The deprecated means for indicating allowed ciphers was both
	// incomplete and unprecise. For example, the following keywords could be listed to
	// allow matching ciphers: aes256-cbc , aes128-cbc , 3des-cbc , and rc4 . These
	// keywords will still be recognized, but programs should be updated to explicitly
	// list the allowed ciphers.
	// 
	// secure-renegotiation: Starting in Chilkat v9.5.0.55, the keyword
	// secure-renegotiation may be added to require that all renegotions be done
	// securely (as per RFC 5746).
	// 
	// best-practices: Starting in Chilkat v9.5.0.55, this property may be set to the
	// single keyword best-practices . This will allow ciphers based on the current
	// best practices. As new versions of Chilkat are released, the best practices may
	// change. Changes will be noted here. The current best practices are:
	// 
	//     * If the server uses an RSA key, it must be 1024 bits or greater.
	//     * All renegotations must be secure renegotiations.
	//     * All ciphers using RC4, DES, or 3DES are disallowed.
	// 
	// Example: The following string would restrict to 2 specific cipher suites,
	// require RSA keys to be 1024 bits or greater, and require secure renegotiations:
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, rsa1024,
	// secure-renegotiation
	// 
	void put_SslAllowedCiphers(const char *newVal);

	// Selects the secure protocol to be used for secure (SSL/TLS) implicit and
	// explicit (AUTH TLS / AUTH SSL) connections . Possible values are:
	// 
	//     default
	//     TLS 1.3
	//     TLS 1.2
	//     TLS 1.1
	//     TLS 1.0
	//     SSL 3.0
	//     TLS 1.3 or higher
	//     TLS 1.2 or higher
	//     TLS 1.1 or higher
	//     TLS 1.0 or higher
	//      
	// 
	// The default value is default which will choose the, which allows for the
	// protocol to be selected dynamically at runtime based on the requirements of the
	// server. Choosing an exact protocol will cause the connection to fail unless that
	// exact protocol is negotiated. It is better to choose X or higher than an exact
	// protocol. The default is effectively SSL 3.0 or higher .
	void get_SslProtocol(CkString &str);
	// Selects the secure protocol to be used for secure (SSL/TLS) implicit and
	// explicit (AUTH TLS / AUTH SSL) connections . Possible values are:
	// 
	//     default
	//     TLS 1.3
	//     TLS 1.2
	//     TLS 1.1
	//     TLS 1.0
	//     SSL 3.0
	//     TLS 1.3 or higher
	//     TLS 1.2 or higher
	//     TLS 1.1 or higher
	//     TLS 1.0 or higher
	//      
	// 
	// The default value is default which will choose the, which allows for the
	// protocol to be selected dynamically at runtime based on the requirements of the
	// server. Choosing an exact protocol will cause the connection to fail unless that
	// exact protocol is negotiated. It is better to choose X or higher than an exact
	// protocol. The default is effectively SSL 3.0 or higher .
	const char *sslProtocol(void);
	// Selects the secure protocol to be used for secure (SSL/TLS) implicit and
	// explicit (AUTH TLS / AUTH SSL) connections . Possible values are:
	// 
	//     default
	//     TLS 1.3
	//     TLS 1.2
	//     TLS 1.1
	//     TLS 1.0
	//     SSL 3.0
	//     TLS 1.3 or higher
	//     TLS 1.2 or higher
	//     TLS 1.1 or higher
	//     TLS 1.0 or higher
	//      
	// 
	// The default value is default which will choose the, which allows for the
	// protocol to be selected dynamically at runtime based on the requirements of the
	// server. Choosing an exact protocol will cause the connection to fail unless that
	// exact protocol is negotiated. It is better to choose X or higher than an exact
	// protocol. The default is effectively SSL 3.0 or higher .
	void put_SslProtocol(const char *newVal);

	// Read-only property that returns true if the FTP server's digital certificate
	// was verified when connecting via SSL / TLS.
	bool get_SslServerCertVerified(void);

	// If true, then empty directories on the server are created locally when doing a
	// download synchronization. If false, then only directories containing files
	// that are downloaded are auto-created.
	// 
	// The default value of this property is true.
	// 
	bool get_SyncCreateAllLocalDirs(void);
	// If true, then empty directories on the server are created locally when doing a
	// download synchronization. If false, then only directories containing files
	// that are downloaded are auto-created.
	// 
	// The default value of this property is true.
	// 
	void put_SyncCreateAllLocalDirs(bool newVal);

	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, *.xml; *.txt; *.csv . If set, the Sync* upload and download methods
	// will only transfer files that match any one of these patterns. Pattern matching
	// is case-insensitive.
	// 
	// Note: Starting in version 9.5.0.47, this property also applies to the
	// DownloadTree and DirTreeXml methods.
	// 
	void get_SyncMustMatch(CkString &str);
	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, *.xml; *.txt; *.csv . If set, the Sync* upload and download methods
	// will only transfer files that match any one of these patterns. Pattern matching
	// is case-insensitive.
	// 
	// Note: Starting in version 9.5.0.47, this property also applies to the
	// DownloadTree and DirTreeXml methods.
	// 
	const char *syncMustMatch(void);
	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, *.xml; *.txt; *.csv . If set, the Sync* upload and download methods
	// will only transfer files that match any one of these patterns. Pattern matching
	// is case-insensitive.
	// 
	// Note: Starting in version 9.5.0.47, this property also applies to the
	// DownloadTree and DirTreeXml methods.
	// 
	void put_SyncMustMatch(const char *newVal);

	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, xml; txt; data_* . If set, the Sync* upload and download methods will
	// only enter directories that match any one of these patterns. Pattern matching is
	// case-insensitive.
	void get_SyncMustMatchDir(CkString &str);
	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, xml; txt; data_* . If set, the Sync* upload and download methods will
	// only enter directories that match any one of these patterns. Pattern matching is
	// case-insensitive.
	const char *syncMustMatchDir(void);
	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, xml; txt; data_* . If set, the Sync* upload and download methods will
	// only enter directories that match any one of these patterns. Pattern matching is
	// case-insensitive.
	void put_SyncMustMatchDir(const char *newVal);

	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, *.xml; *.txt; *.csv . If set, the Sync* upload and download methods
	// will not transfer files that match any one of these patterns. Pattern matching
	// is case-insensitive.
	// 
	// Note: Starting in version 9.5.0.47, this property also applies to the
	// DownloadTree and DirTreeXml methods.
	// 
	void get_SyncMustNotMatch(CkString &str);
	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, *.xml; *.txt; *.csv . If set, the Sync* upload and download methods
	// will not transfer files that match any one of these patterns. Pattern matching
	// is case-insensitive.
	// 
	// Note: Starting in version 9.5.0.47, this property also applies to the
	// DownloadTree and DirTreeXml methods.
	// 
	const char *syncMustNotMatch(void);
	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, *.xml; *.txt; *.csv . If set, the Sync* upload and download methods
	// will not transfer files that match any one of these patterns. Pattern matching
	// is case-insensitive.
	// 
	// Note: Starting in version 9.5.0.47, this property also applies to the
	// DownloadTree and DirTreeXml methods.
	// 
	void put_SyncMustNotMatch(const char *newVal);

	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, xml; txt; data_* . If set, the Sync* upload and download methods will
	// enter directories that match any one of these patterns. Pattern matching is
	// case-insensitive.
	void get_SyncMustNotMatchDir(CkString &str);
	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, xml; txt; data_* . If set, the Sync* upload and download methods will
	// enter directories that match any one of these patterns. Pattern matching is
	// case-insensitive.
	const char *syncMustNotMatchDir(void);
	// Can contain a wildcarded list of file patterns separated by semicolons. For
	// example, xml; txt; data_* . If set, the Sync* upload and download methods will
	// enter directories that match any one of these patterns. Pattern matching is
	// case-insensitive.
	void put_SyncMustNotMatchDir(const char *newVal);

	// Contains the list of files that would be transferred in a call to
	// SyncRemoteTree2 when the previewOnly argument is set to true. This string
	// property contains one filepath per line, separated by CRLF line endings. After
	// SyncRemoteTree2 is called, this property contains the filepaths of the local
	// files that would be uploaded to the FTP server.
	void get_SyncPreview(CkString &str);
	// Contains the list of files that would be transferred in a call to
	// SyncRemoteTree2 when the previewOnly argument is set to true. This string
	// property contains one filepath per line, separated by CRLF line endings. After
	// SyncRemoteTree2 is called, this property contains the filepaths of the local
	// files that would be uploaded to the FTP server.
	const char *syncPreview(void);

	// Contains the current or last negotiated TLS cipher suite. If no TLS connection
	// has yet to be established, or if a connection as attempted and failed, then this
	// will be empty. A sample cipher suite string looks like this:
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256.
	void get_TlsCipherSuite(CkString &str);
	// Contains the current or last negotiated TLS cipher suite. If no TLS connection
	// has yet to be established, or if a connection as attempted and failed, then this
	// will be empty. A sample cipher suite string looks like this:
	// TLS_DHE_RSA_WITH_AES_256_CBC_SHA256.
	const char *tlsCipherSuite(void);

	// Specifies a set of pins for Public Key Pinning for TLS connections. This
	// property lists the expected SPKI fingerprints for the server certificates. If
	// the server's certificate (sent during the TLS handshake) does not match any of
	// the SPKI fingerprints, then the TLS handshake is aborted and the connection
	// fails. The format of this string property is as follows:hash_algorithm, encoding, SPKI_fingerprint_1, SPKI_fingerprint_2, ...
	// For example, the following string specifies a single sha256 base64-encoded SPKI
	// fingerprint:"sha256, base64, lKg1SIqyhPSK19tlPbjl8s02yChsVTDklQpkMCHvsTE="
	// This example specifies two SPKI fingerprints:"sha256, base64, 4t37LpnGmrMEAG8HEz9yIrnvJV2euVRwCLb9EH5WZyI=, 68b0G5iqMvWVWvUCjMuhLEyekM5729PadtnU5tdXZKs="
	// Any of the following hash algorithms are allowed:.sha1, sha256, sha384, sha512,
	// md2, md5, haval, ripemd128, ripemd160,ripemd256, or ripemd320.
	// 
	// The following encodings are allowed: base64, hex, and any of the encodings
	// indicated in the link below.
	// 
	void get_TlsPinSet(CkString &str);
	// Specifies a set of pins for Public Key Pinning for TLS connections. This
	// property lists the expected SPKI fingerprints for the server certificates. If
	// the server's certificate (sent during the TLS handshake) does not match any of
	// the SPKI fingerprints, then the TLS handshake is aborted and the connection
	// fails. The format of this string property is as follows:hash_algorithm, encoding, SPKI_fingerprint_1, SPKI_fingerprint_2, ...
	// For example, the following string specifies a single sha256 base64-encoded SPKI
	// fingerprint:"sha256, base64, lKg1SIqyhPSK19tlPbjl8s02yChsVTDklQpkMCHvsTE="
	// This example specifies two SPKI fingerprints:"sha256, base64, 4t37LpnGmrMEAG8HEz9yIrnvJV2euVRwCLb9EH5WZyI=, 68b0G5iqMvWVWvUCjMuhLEyekM5729PadtnU5tdXZKs="
	// Any of the following hash algorithms are allowed:.sha1, sha256, sha384, sha512,
	// md2, md5, haval, ripemd128, ripemd160,ripemd256, or ripemd320.
	// 
	// The following encodings are allowed: base64, hex, and any of the encodings
	// indicated in the link below.
	// 
	const char *tlsPinSet(void);
	// Specifies a set of pins for Public Key Pinning for TLS connections. This
	// property lists the expected SPKI fingerprints for the server certificates. If
	// the server's certificate (sent during the TLS handshake) does not match any of
	// the SPKI fingerprints, then the TLS handshake is aborted and the connection
	// fails. The format of this string property is as follows:hash_algorithm, encoding, SPKI_fingerprint_1, SPKI_fingerprint_2, ...
	// For example, the following string specifies a single sha256 base64-encoded SPKI
	// fingerprint:"sha256, base64, lKg1SIqyhPSK19tlPbjl8s02yChsVTDklQpkMCHvsTE="
	// This example specifies two SPKI fingerprints:"sha256, base64, 4t37LpnGmrMEAG8HEz9yIrnvJV2euVRwCLb9EH5WZyI=, 68b0G5iqMvWVWvUCjMuhLEyekM5729PadtnU5tdXZKs="
	// Any of the following hash algorithms are allowed:.sha1, sha256, sha384, sha512,
	// md2, md5, haval, ripemd128, ripemd160,ripemd256, or ripemd320.
	// 
	// The following encodings are allowed: base64, hex, and any of the encodings
	// indicated in the link below.
	// 
	void put_TlsPinSet(const char *newVal);

	// Contains the current or last negotiated TLS protocol version. If no TLS
	// connection has yet to be established, or if a connection as attempted and
	// failed, then this will be empty. Possible values are SSL 3.0 , TLS 1.0 , TLS 1.1
	// , TLS 1.2 , and TLS 1.3 .
	void get_TlsVersion(CkString &str);
	// Contains the current or last negotiated TLS protocol version. If no TLS
	// connection has yet to be established, or if a connection as attempted and
	// failed, then this will be empty. Possible values are SSL 3.0 , TLS 1.0 , TLS 1.1
	// , TLS 1.2 , and TLS 1.3 .
	const char *tlsVersion(void);

	// This is a catch-all property to be used for uncommon needs. This property
	// defaults to the empty string and should typically remain empty.
	// 
	// Can be set to a list of the following comma separated keywords:
	//     * OpenNonExclusive - Introduced in v9.5.0.78. When downloading files on
	//     Windows systems, open the local file with non-exclusive access to allow other
	//     programs the ability to access the file as it's being downloaded.
	//     * ProtectFromVpn - Introduced in v9.5.0.80. On Android systems, will bypass
	//     any VPN that may be installed or active.
	//     * EnableTls13 - Introduced in v9.5.0.82. Causes TLS 1.3 to be offered in the
	//     ClientHello of the TLS protocol, allowing the server to select TLS 1.3 for the
	//     session. Future versions of Chilkat will enable TLS 1.3 by default. This option
	//     is only necessary in v9.5.0.82 if TLS 1.3 is desired.
	//     * DisableTls13 - Disables the use of TLS 1.3. TLS 1.3 is enabled by default
	//     in Chilkat v9.5.0.84 and above. This keyword can be used to avoid TLS 1.3 if it
	//     causes problems.
	//     * NoPreserveFileTime - Introduced in v9.5.0.85. Downloaded files will get
	//     the current local system date/time and no attempt will be made to try to
	//     preserver the last-modified date/time of the file on the server.
	// 
	void get_UncommonOptions(CkString &str);
	// This is a catch-all property to be used for uncommon needs. This property
	// defaults to the empty string and should typically remain empty.
	// 
	// Can be set to a list of the following comma separated keywords:
	//     * OpenNonExclusive - Introduced in v9.5.0.78. When downloading files on
	//     Windows systems, open the local file with non-exclusive access to allow other
	//     programs the ability to access the file as it's being downloaded.
	//     * ProtectFromVpn - Introduced in v9.5.0.80. On Android systems, will bypass
	//     any VPN that may be installed or active.
	//     * EnableTls13 - Introduced in v9.5.0.82. Causes TLS 1.3 to be offered in the
	//     ClientHello of the TLS protocol, allowing the server to select TLS 1.3 for the
	//     session. Future versions of Chilkat will enable TLS 1.3 by default. This option
	//     is only necessary in v9.5.0.82 if TLS 1.3 is desired.
	//     * DisableTls13 - Disables the use of TLS 1.3. TLS 1.3 is enabled by default
	//     in Chilkat v9.5.0.84 and above. This keyword can be used to avoid TLS 1.3 if it
	//     causes problems.
	//     * NoPreserveFileTime - Introduced in v9.5.0.85. Downloaded files will get
	//     the current local system date/time and no attempt will be made to try to
	//     preserver the last-modified date/time of the file on the server.
	// 
	const char *uncommonOptions(void);
	// This is a catch-all property to be used for uncommon needs. This property
	// defaults to the empty string and should typically remain empty.
	// 
	// Can be set to a list of the following comma separated keywords:
	//     * OpenNonExclusive - Introduced in v9.5.0.78. When downloading files on
	//     Windows systems, open the local file with non-exclusive access to allow other
	//     programs the ability to access the file as it's being downloaded.
	//     * ProtectFromVpn - Introduced in v9.5.0.80. On Android systems, will bypass
	//     any VPN that may be installed or active.
	//     * EnableTls13 - Introduced in v9.5.0.82. Causes TLS 1.3 to be offered in the
	//     ClientHello of the TLS protocol, allowing the server to select TLS 1.3 for the
	//     session. Future versions of Chilkat will enable TLS 1.3 by default. This option
	//     is only necessary in v9.5.0.82 if TLS 1.3 is desired.
	//     * DisableTls13 - Disables the use of TLS 1.3. TLS 1.3 is enabled by default
	//     in Chilkat v9.5.0.84 and above. This keyword can be used to avoid TLS 1.3 if it
	//     causes problems.
	//     * NoPreserveFileTime - Introduced in v9.5.0.85. Downloaded files will get
	//     the current local system date/time and no attempt will be made to try to
	//     preserver the last-modified date/time of the file on the server.
	// 
	void put_UncommonOptions(const char *newVal);

	// The average upload rate in bytes/second. This property is updated in real-time
	// during any FTP upload (asynchronous or synchronous).
	int get_UploadTransferRate(void);

	// If true, the FTP2 component will use the EPSV command instead of PASV for
	// passive mode data transfers. The default value of this property is false. (It
	// is somewhat uncommon for FTP servers to support EPSV.)
	// 
	// Note: If the AutoFeat property is true, then the FTP server's features are
	// automatically queried after connecting. In this case, if the AutoSetUseEpsv
	// property is also set to true, the UseEpsv property is automatically set to
	// true if the FTP server supports EPSV.
	// 
	// Important: EPSV can cause problems with some deep-inspection firewalls. If a
	// passive data connection cannot be established, make sure to test with both the
	// AutoSetUseEpsv and UseEpsv properties set equal to false.
	// 
	bool get_UseEpsv(void);
	// If true, the FTP2 component will use the EPSV command instead of PASV for
	// passive mode data transfers. The default value of this property is false. (It
	// is somewhat uncommon for FTP servers to support EPSV.)
	// 
	// Note: If the AutoFeat property is true, then the FTP server's features are
	// automatically queried after connecting. In this case, if the AutoSetUseEpsv
	// property is also set to true, the UseEpsv property is automatically set to
	// true if the FTP server supports EPSV.
	// 
	// Important: EPSV can cause problems with some deep-inspection firewalls. If a
	// passive data connection cannot be established, make sure to test with both the
	// AutoSetUseEpsv and UseEpsv properties set equal to false.
	// 
	void put_UseEpsv(bool newVal);

	// Username for logging into the FTP server. Defaults to anonymous . This property
	// can be set to the empty string to skip authentication within the Connect method.
	void get_Username(CkString &str);
	// Username for logging into the FTP server. Defaults to anonymous . This property
	// can be set to the empty string to skip authentication within the Connect method.
	const char *username(void);
	// Username for logging into the FTP server. Defaults to anonymous . This property
	// can be set to the empty string to skip authentication within the Connect method.
	void put_Username(const char *newVal);



	// ----------------------
	// Methods
	// ----------------------
	// Same as PutFile but the file on the FTP server is appended.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool AppendFile(const char *localFilePath, const char *remoteFilePath);

	// Same as PutFile but the file on the FTP server is appended.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *AppendFileAsync(const char *localFilePath, const char *remoteFilePath);


	// Uploads data to be appended to a file on the FTP server.
	bool AppendFileBd(const char *remoteFilename, CkBinData &bd);

	// Uploads data to be appended to a file on the FTP server.
	CkTask *AppendFileBdAsync(const char *remoteFilename, CkBinData &bd);


	// Same as PutFileFromBinaryData, except the file on the FTP server is appended.
	bool AppendFileFromBinaryData(const char *remoteFilename, CkByteData &content);

	// Same as PutFileFromBinaryData, except the file on the FTP server is appended.
	CkTask *AppendFileFromBinaryDataAsync(const char *remoteFilename, CkByteData &content);


	// Same as PutFileFromTextData, except the file on the FTP server is appended.
	bool AppendFileFromTextData(const char *remoteFilename, const char *textData, const char *charset);

	// Same as PutFileFromTextData, except the file on the FTP server is appended.
	CkTask *AppendFileFromTextDataAsync(const char *remoteFilename, const char *textData, const char *charset);


	// Uploads the text data from sb to a file on the FTP server using the charset
	// encoding specified in charset.
	bool AppendFileSb(const char *remoteFilename, CkStringBuilder &sb, const char *charset);

	// Uploads the text data from sb to a file on the FTP server using the charset
	// encoding specified in charset.
	CkTask *AppendFileSbAsync(const char *remoteFilename, CkStringBuilder &sb, const char *charset);


	// Changes the current remote directory. The remoteDirPath should be relative to the current
	// remote directory, which is initially the HOME directory of the FTP user account.
	// 
	// If the remoteDirPath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	// Note: Some FTP servers allow changing to multiple directory levels at once. For
	// example, to change to subdir1/subdir2 . Other FTP servers can only change one
	// level at a time. In this the case, you would first change the remote directory
	// to subdir1 , and then change to subdir2 .
	// 
	bool ChangeRemoteDir(const char *remoteDirPath);

	// Changes the current remote directory. The remoteDirPath should be relative to the current
	// remote directory, which is initially the HOME directory of the FTP user account.
	// 
	// If the remoteDirPath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	// Note: Some FTP servers allow changing to multiple directory levels at once. For
	// example, to change to subdir1/subdir2 . Other FTP servers can only change one
	// level at a time. In this the case, you would first change the remote directory
	// to subdir1 , and then change to subdir2 .
	// 
	CkTask *ChangeRemoteDirAsync(const char *remoteDirPath);


	// Returns true if currently connected and logged into an FTP server, otherwise
	// returns false.
	// 
	// Note: This may cause a NOOP command to be sent to the FTP server.
	// 
	bool CheckConnection(void);

	// Returns true if currently connected and logged into an FTP server, otherwise
	// returns false.
	// 
	// Note: This may cause a NOOP command to be sent to the FTP server.
	// 
	CkTask *CheckConnectionAsync(void);


	// Reverts the FTP control channel from SSL/TLS to an unencrypted channel. This may
	// be required when using FTPS with AUTH TLS where the FTP client is behind a DSL
	// or cable-modem router that performs NAT (network address translation). If the
	// control channel is encrypted, the router is unable to translate the IP address
	// sent in the PORT command for data transfers. By clearing the control channel,
	// the data transfers will remain encrypted, but the FTP commands are passed
	// unencrypted. Your program would typically clear the control channel after
	// authenticating.
	bool ClearControlChannel(void);

	// Reverts the FTP control channel from SSL/TLS to an unencrypted channel. This may
	// be required when using FTPS with AUTH TLS where the FTP client is behind a DSL
	// or cable-modem router that performs NAT (network address translation). If the
	// control channel is encrypted, the router is unable to translate the IP address
	// sent in the PORT command for data transfers. By clearing the control channel,
	// the data transfers will remain encrypted, but the FTP commands are passed
	// unencrypted. Your program would typically clear the control channel after
	// authenticating.
	CkTask *ClearControlChannelAsync(void);


	// The GetDirCount method returns the count of files and sub-directories in the
	// current remote FTP directory, according to the ListPattern property. For
	// example, if ListPattern is set to *.xml , then GetDirCount returns the count of
	// XML files in the remote directory.
	// 
	// The 1st time it is accessed, the component will (behind the scenes) fetch the
	// directory listing from the FTP server. This information is cached in the
	// component until (1) the current remote directory is changed, or (2) the
	// ListPattern is changed, or (3) the this method (ClearDirCache) is called.
	// 
	void ClearDirCache(void);


	// Clears the in-memory session log.
	void ClearSessionLog(void);


	// Connects and logs in to the FTP server using the username/password provided in
	// the component properties. Check the integer value of the ConnectFailReason if
	// this method returns false (indicating failure).
	// 
	// Note: To separately establish the connection and then authenticate (in separate
	// method calls), call ConnectOnly followed by LoginAfterConnectOnly.
	// 
	// Important: All TCP-based Internet communications, regardless of the protocol
	// (such as HTTP, FTP, SSH, IMAP, POP3, SMTP, etc.), and regardless of SSL/TLS,
	// begin with establishing a TCP connection to a remote host:port. External
	// security-related infrastructure such as software firewalls (Windows Firewall),
	// hardware firewalls, anti-virus, at either source or destination (or both) can
	// block the connection. If the connection fails, make sure to check all potential
	// external causes of blockage.
	// 
	bool Connect(void);

	// Connects and logs in to the FTP server using the username/password provided in
	// the component properties. Check the integer value of the ConnectFailReason if
	// this method returns false (indicating failure).
	// 
	// Note: To separately establish the connection and then authenticate (in separate
	// method calls), call ConnectOnly followed by LoginAfterConnectOnly.
	// 
	// Important: All TCP-based Internet communications, regardless of the protocol
	// (such as HTTP, FTP, SSH, IMAP, POP3, SMTP, etc.), and regardless of SSL/TLS,
	// begin with establishing a TCP connection to a remote host:port. External
	// security-related infrastructure such as software firewalls (Windows Firewall),
	// hardware firewalls, anti-virus, at either source or destination (or both) can
	// block the connection. If the connection fails, make sure to check all potential
	// external causes of blockage.
	// 
	CkTask *ConnectAsync(void);


	// Connects to the FTP server, but does not authenticate. The combination of
	// calling this method followed by LoginAfterConnectOnly is the equivalent of
	// calling the Connect method (which both connects and authenticates).
	// 
	// Important: All TCP-based Internet communications, regardless of the protocol
	// (such as HTTP, FTP, SSH, IMAP, POP3, SMTP, etc.), and regardless of SSL/TLS,
	// begin with establishing a TCP connection to a remote host:port. External
	// security-related infrastructure such as software firewalls (Windows Firewall),
	// hardware firewalls, anti-virus, at either source or destination (or both) can
	// block the connection. If the connection fails, make sure to check all potential
	// external causes of blockage.
	// 
	bool ConnectOnly(void);

	// Connects to the FTP server, but does not authenticate. The combination of
	// calling this method followed by LoginAfterConnectOnly is the equivalent of
	// calling the Connect method (which both connects and authenticates).
	// 
	// Important: All TCP-based Internet communications, regardless of the protocol
	// (such as HTTP, FTP, SSH, IMAP, POP3, SMTP, etc.), and regardless of SSL/TLS,
	// begin with establishing a TCP connection to a remote host:port. External
	// security-related infrastructure such as software firewalls (Windows Firewall),
	// hardware firewalls, anti-virus, at either source or destination (or both) can
	// block the connection. If the connection fails, make sure to check all potential
	// external causes of blockage.
	// 
	CkTask *ConnectOnlyAsync(void);


	// Explicitly converts the control channel to a secure SSL/TLS connection.
	// 
	// Note: If you initially connect with either the AuthTls or AuthSsl property set
	// to true, then DO NOT call ConvertToTls. The control channel is automatically
	// converted to SSL/TLS from within the Connect method when these properties are
	// set.
	// 
	// Note: It is very uncommon for this method to be needed.
	// 
	bool ConvertToTls(void);

	// Explicitly converts the control channel to a secure SSL/TLS connection.
	// 
	// Note: If you initially connect with either the AuthTls or AuthSsl property set
	// to true, then DO NOT call ConvertToTls. The control channel is automatically
	// converted to SSL/TLS from within the Connect method when these properties are
	// set.
	// 
	// Note: It is very uncommon for this method to be needed.
	// 
	CkTask *ConvertToTlsAsync(void);


	// Creates an FTP plan that lists the FTP operations that would be performed when
	// PutTree is called. Additionally, the PutPlan method executes an FTP plan and
	// logs each successful operation to a plan log file. If a large-scale upload is
	// interrupted, the PutPlan can be resumed, skipping over the operations already
	// listed in the plan log file.
	bool CreatePlan(const char *localDir, CkString &outStr);

	// Creates an FTP plan that lists the FTP operations that would be performed when
	// PutTree is called. Additionally, the PutPlan method executes an FTP plan and
	// logs each successful operation to a plan log file. If a large-scale upload is
	// interrupted, the PutPlan can be resumed, skipping over the operations already
	// listed in the plan log file.
	const char *createPlan(const char *localDir);
	// Creates an FTP plan that lists the FTP operations that would be performed when
	// PutTree is called. Additionally, the PutPlan method executes an FTP plan and
	// logs each successful operation to a plan log file. If a large-scale upload is
	// interrupted, the PutPlan can be resumed, skipping over the operations already
	// listed in the plan log file.
	CkTask *CreatePlanAsync(const char *localDir);


	// Creates a directory on the FTP server. If the directory already exists, a new
	// one is not created and false is returned.
	// 
	// If the remoteDirPath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool CreateRemoteDir(const char *remoteDirPath);

	// Creates a directory on the FTP server. If the directory already exists, a new
	// one is not created and false is returned.
	// 
	// If the remoteDirPath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *CreateRemoteDirAsync(const char *remoteDirPath);


	// Deletes all the files in the current remote FTP directory matching the pattern.
	// Returns the number of files deleted, or -1 for failure. The pattern is a string
	// such as *.txt , where any number of * wildcard characters can be used. * matches
	// 0 or more of any character.
	int DeleteMatching(const char *remotePattern);

	// Deletes all the files in the current remote FTP directory matching the pattern.
	// Returns the number of files deleted, or -1 for failure. The pattern is a string
	// such as *.txt , where any number of * wildcard characters can be used. * matches
	// 0 or more of any character.
	CkTask *DeleteMatchingAsync(const char *remotePattern);


	// Deletes a file on the FTP server.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool DeleteRemoteFile(const char *remoteFilePath);

	// Deletes a file on the FTP server.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *DeleteRemoteFileAsync(const char *remoteFilePath);


	// Deletes the entire subtree and all files from the current remote FTP directory.
	// To delete a subtree on the FTP server, your program would first navigate to the
	// root of the subtree to be deleted by calling ChangeRemoteDir, and then call
	// DeleteTree. There are two event callbacks: VerifyDeleteFile and VerifyDeleteDir.
	// Both are called prior to deleting each file or directory. The arguments to the
	// callback include the full filepath of the file or directory, and an output-only
	// skip flag. If your application sets the skip flag to true, the file or directory
	// is NOT deleted. If a directory is not deleted, all files and sub-directories
	// will remain. Example programs can be found at http://www.example-code.com/
	bool DeleteTree(void);

	// Deletes the entire subtree and all files from the current remote FTP directory.
	// To delete a subtree on the FTP server, your program would first navigate to the
	// root of the subtree to be deleted by calling ChangeRemoteDir, and then call
	// DeleteTree. There are two event callbacks: VerifyDeleteFile and VerifyDeleteDir.
	// Both are called prior to deleting each file or directory. The arguments to the
	// callback include the full filepath of the file or directory, and an output-only
	// skip flag. If your application sets the skip flag to true, the file or directory
	// is NOT deleted. If a directory is not deleted, all files and sub-directories
	// will remain. Example programs can be found at http://www.example-code.com/
	CkTask *DeleteTreeAsync(void);


	// Automatically determines the ProxyMethod that should be used with an FTP proxy
	// server. Tries each of the five possible ProxyMethod settings and returns the
	// value (1-5) of the ProxyMethod that succeeded.
	// 
	// This method may take a minute or two to complete. Returns 0 if no proxy methods
	// were successful. Returns -1 to indicate an error (i.e. it was unable to test all
	// proxy methods.)
	// 
	int DetermineProxyMethod(void);

	// Automatically determines the ProxyMethod that should be used with an FTP proxy
	// server. Tries each of the five possible ProxyMethod settings and returns the
	// value (1-5) of the ProxyMethod that succeeded.
	// 
	// This method may take a minute or two to complete. Returns 0 if no proxy methods
	// were successful. Returns -1 to indicate an error (i.e. it was unable to test all
	// proxy methods.)
	// 
	CkTask *DetermineProxyMethodAsync(void);


	// Discovers which combinations of FTP2 property settings result in successful data
	// transfers.
	// 
	// DetermineSettings tries 13 different combinations of these properties:Ssl
	// AuthTls
	// AuthSsl
	// Port
	// Passive
	// PassiveUseHostAddr
	// Within the FTP protocol, the process of fetching a directory listing is also
	// considered a data transfer . The DetermineSettings method works by checking to
	// see which combinations result in a successful directory listing download. The
	// method takes no arguments and returns a string containing an XML report of the
	// results. It is a blocking call that may take approximately a minute to run. If
	// you are unsure about how to interpret the results, cut-and-paste it into an
	// email and send it to support@chilkatsoft.com.
	// 
	bool DetermineSettings(CkString &outXmlReport);

	// Discovers which combinations of FTP2 property settings result in successful data
	// transfers.
	// 
	// DetermineSettings tries 13 different combinations of these properties:Ssl
	// AuthTls
	// AuthSsl
	// Port
	// Passive
	// PassiveUseHostAddr
	// Within the FTP protocol, the process of fetching a directory listing is also
	// considered a data transfer . The DetermineSettings method works by checking to
	// see which combinations result in a successful directory listing download. The
	// method takes no arguments and returns a string containing an XML report of the
	// results. It is a blocking call that may take approximately a minute to run. If
	// you are unsure about how to interpret the results, cut-and-paste it into an
	// email and send it to support@chilkatsoft.com.
	// 
	const char *determineSettings(void);
	// Discovers which combinations of FTP2 property settings result in successful data
	// transfers.
	// 
	// DetermineSettings tries 13 different combinations of these properties:Ssl
	// AuthTls
	// AuthSsl
	// Port
	// Passive
	// PassiveUseHostAddr
	// Within the FTP protocol, the process of fetching a directory listing is also
	// considered a data transfer . The DetermineSettings method works by checking to
	// see which combinations result in a successful directory listing download. The
	// method takes no arguments and returns a string containing an XML report of the
	// results. It is a blocking call that may take approximately a minute to run. If
	// you are unsure about how to interpret the results, cut-and-paste it into an
	// email and send it to support@chilkatsoft.com.
	// 
	CkTask *DetermineSettingsAsync(void);


	// Recursively downloads the structure of a complete remote directory tree. Returns
	// an XML document with the directory structure.
	// 
	// Note: Starting in version 9.5.0.47, the SyncMustMatch and SyncMustNotMatch
	// properties apply to this method.
	// 
	bool DirTreeXml(CkString &outStrXml);

	// Recursively downloads the structure of a complete remote directory tree. Returns
	// an XML document with the directory structure.
	// 
	// Note: Starting in version 9.5.0.47, the SyncMustMatch and SyncMustNotMatch
	// properties apply to this method.
	// 
	const char *dirTreeXml(void);
	// Recursively downloads the structure of a complete remote directory tree. Returns
	// an XML document with the directory structure.
	// 
	// Note: Starting in version 9.5.0.47, the SyncMustMatch and SyncMustNotMatch
	// properties apply to this method.
	// 
	CkTask *DirTreeXmlAsync(void);


	// Disconnects from the FTP server, ending the current session.
	bool Disconnect(void);

	// Disconnects from the FTP server, ending the current session.
	CkTask *DisconnectAsync(void);


	// Downloads an entire tree from the FTP server and recreates the directory tree on
	// the local filesystem.
	// 
	// This method downloads all the files and subdirectories in the current remote
	// directory. An application would first navigate to the directory to be downloaded
	// via ChangeRemoteDir and then call this method.
	// 
	// Note: Starting in version 9.5.0.47, the SyncMustMatch and SyncMustNotMatch
	// properties apply to this method.
	// 
	bool DownloadTree(const char *localRoot);

	// Downloads an entire tree from the FTP server and recreates the directory tree on
	// the local filesystem.
	// 
	// This method downloads all the files and subdirectories in the current remote
	// directory. An application would first navigate to the directory to be downloaded
	// via ChangeRemoteDir and then call this method.
	// 
	// Note: Starting in version 9.5.0.47, the SyncMustMatch and SyncMustNotMatch
	// properties apply to this method.
	// 
	CkTask *DownloadTreeAsync(const char *localRoot);


	// Sends a FEAT command to the FTP server and returns the response. Returns a
	// zero-length string to indicate failure. Here is a typical response:211-Features:
	//  MDTM
	//  REST STREAM
	//  SIZE
	//  MLST type*;size*;modify*;
	//  MLSD
	//  AUTH SSL
	//  AUTH TLS
	//  UTF8
	//  CLNT
	//  MFMT
	// 211 End
	bool Feat(CkString &outStr);

	// Sends a FEAT command to the FTP server and returns the response. Returns a
	// zero-length string to indicate failure. Here is a typical response:211-Features:
	//  MDTM
	//  REST STREAM
	//  SIZE
	//  MLST type*;size*;modify*;
	//  MLSD
	//  AUTH SSL
	//  AUTH TLS
	//  UTF8
	//  CLNT
	//  MFMT
	// 211 End
	const char *feat(void);
	// Sends a FEAT command to the FTP server and returns the response. Returns a
	// zero-length string to indicate failure. Here is a typical response:211-Features:
	//  MDTM
	//  REST STREAM
	//  SIZE
	//  MLST type*;size*;modify*;
	//  MLSD
	//  AUTH SSL
	//  AUTH TLS
	//  UTF8
	//  CLNT
	//  MFMT
	// 211 End
	CkTask *FeatAsync(void);


	// Applications should instead call GetCreateTimeStr .
	// 
	// Returns the create date/time for the Nth file or sub-directory in the current
	// remote directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	// 
	// The caller is responsible for deleting the object returned by this method.
	CkDateTime *GetCreateDt(int index);

	// Applications should instead call GetCreateTimeStr .
	// 
	// Returns the create date/time for the Nth file or sub-directory in the current
	// remote directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	// 
	CkTask *GetCreateDtAsync(int index);


	// Applications should instead call GetCreateTimeByNameStr .
	// 
	// Returns the file-creation date/time for a remote file by filename.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	// Note: Linux/Unix type filesystems do not store create date/times. Therefore, if
	// the FTP server is on such as system, this method will return a date/time equal
	// to the last-modified date/time.
	// 
	// The caller is responsible for deleting the object returned by this method.
	CkDateTime *GetCreateDtByName(const char *filename);

	// Applications should instead call GetCreateTimeByNameStr .
	// 
	// Returns the file-creation date/time for a remote file by filename.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	// Note: Linux/Unix type filesystems do not store create date/times. Therefore, if
	// the FTP server is on such as system, this method will return a date/time equal
	// to the last-modified date/time.
	// 
	CkTask *GetCreateDtByNameAsync(const char *filename);


	// Returns the file-creation date/time (in RFC822 string format, such as Tue, 25
	// Sep 2012 12:25:32 -0500 ) for a remote file by filename.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	// Note: Linux/Unix type filesystems do not store create date/times. If the FTP
	// server is on such as system, this method will return a date/time equal to the
	// last-modified date/time.
	// 
	bool GetCreateTimeByNameStr(const char *filename, CkString &outStr);

	// Returns the file-creation date/time (in RFC822 string format, such as Tue, 25
	// Sep 2012 12:25:32 -0500 ) for a remote file by filename.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	// Note: Linux/Unix type filesystems do not store create date/times. If the FTP
	// server is on such as system, this method will return a date/time equal to the
	// last-modified date/time.
	// 
	const char *getCreateTimeByNameStr(const char *filename);
	// Returns the file-creation date/time (in RFC822 string format, such as Tue, 25
	// Sep 2012 12:25:32 -0500 ) for a remote file by filename.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	// Note: Linux/Unix type filesystems do not store create date/times. If the FTP
	// server is on such as system, this method will return a date/time equal to the
	// last-modified date/time.
	// 
	const char *createTimeByNameStr(const char *filename);

	// Returns the file-creation date/time (in RFC822 string format, such as Tue, 25
	// Sep 2012 12:25:32 -0500 ) for a remote file by filename.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	// Note: Linux/Unix type filesystems do not store create date/times. If the FTP
	// server is on such as system, this method will return a date/time equal to the
	// last-modified date/time.
	// 
	CkTask *GetCreateTimeByNameStrAsync(const char *filename);


	// Returns the create time (in RFC822 string format, such as Tue, 25 Sep 2012
	// 12:25:32 -0500 ) for the Nth file or sub-directory in the current remote
	// directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	bool GetCreateTimeStr(int index, CkString &outStr);

	// Returns the create time (in RFC822 string format, such as Tue, 25 Sep 2012
	// 12:25:32 -0500 ) for the Nth file or sub-directory in the current remote
	// directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	const char *getCreateTimeStr(int index);
	// Returns the create time (in RFC822 string format, such as Tue, 25 Sep 2012
	// 12:25:32 -0500 ) for the Nth file or sub-directory in the current remote
	// directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	const char *createTimeStr(int index);

	// Returns the create time (in RFC822 string format, such as Tue, 25 Sep 2012
	// 12:25:32 -0500 ) for the Nth file or sub-directory in the current remote
	// directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	CkTask *GetCreateTimeStrAsync(int index);


	// Returns the current remote directory.
	bool GetCurrentRemoteDir(CkString &outStr);

	// Returns the current remote directory.
	const char *getCurrentRemoteDir(void);
	// Returns the current remote directory.
	const char *currentRemoteDir(void);

	// Returns the current remote directory.
	CkTask *GetCurrentRemoteDirAsync(void);


	// Returns the number of files and sub-directories in the current remote directory
	// that match the ListPattern property.
	// 
	// Note: that using this method may retrieve the directory listing from the FTP
	// server, potentially creating a temporary data connection. If the FTP server
	// doesn't support the MLST/MLSD commands, this action is similar to uploading or
	// downloading files. If the method causes your program to hang, it likely
	// indicates a failure to establish this connection. To resolve this, set the
	// Passive property to true and PassiveUseHostAddr to true to switch to passive
	// mode. If issues persist, check the LastErrorText property after the method times
	// out. For further guidance on FTP settings, refer to this Chilkat blog post:
	// https://www.cknotes.com/?p=282.
	// 
	// A return value of -1 indicates failure.
	// 
	// 
	// References:
	// 1: https://www.cknotes.com/?p=282
	int GetDirCount(void);

	// Returns the number of files and sub-directories in the current remote directory
	// that match the ListPattern property.
	// 
	// Note: that using this method may retrieve the directory listing from the FTP
	// server, potentially creating a temporary data connection. If the FTP server
	// doesn't support the MLST/MLSD commands, this action is similar to uploading or
	// downloading files. If the method causes your program to hang, it likely
	// indicates a failure to establish this connection. To resolve this, set the
	// Passive property to true and PassiveUseHostAddr to true to switch to passive
	// mode. If issues persist, check the LastErrorText property after the method times
	// out. For further guidance on FTP settings, refer to this Chilkat blog post:
	// https://www.cknotes.com/?p=282.
	// 
	// A return value of -1 indicates failure.
	// 
	// 
	// References:
	// 1: https://www.cknotes.com/?p=282
	CkTask *GetDirCountAsync(void);


	// Downloads a file from the FTP server to the local filesystem.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool GetFile(const char *remoteFilePath, const char *localFilePath);

	// Downloads a file from the FTP server to the local filesystem.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *GetFileAsync(const char *remoteFilePath, const char *localFilePath);


	// Downloads a file from the FTP server into a BinData object.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool GetFileBd(const char *remoteFilePath, CkBinData &binData);

	// Downloads a file from the FTP server into a BinData object.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *GetFileBdAsync(const char *remoteFilePath, CkBinData &binData);


	// Returns the filename for the Nth file or sub-directory in the current remote
	// directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	bool GetFilename(int index, CkString &outStr);

	// Returns the filename for the Nth file or sub-directory in the current remote
	// directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	const char *getFilename(int index);
	// Returns the filename for the Nth file or sub-directory in the current remote
	// directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	const char *filename(int index);

	// Returns the filename for the Nth file or sub-directory in the current remote
	// directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	CkTask *GetFilenameAsync(int index);


	// Downloads a file from the FTP server into a StringBuilder object.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool GetFileSb(const char *remoteFilePath, const char *charset, CkStringBuilder &sb);

	// Downloads a file from the FTP server into a StringBuilder object.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *GetFileSbAsync(const char *remoteFilePath, const char *charset, CkStringBuilder &sb);


	// Downloads a file to a stream. If called synchronously, the toStream must have a
	// sink, such as a file or another stream object. If called asynchronously, then
	// the foreground thread can read the stream.
	bool GetFileToStream(const char *remoteFilePath, CkStream &toStream);

	// Downloads a file to a stream. If called synchronously, the toStream must have a
	// sink, such as a file or another stream object. If called asynchronously, then
	// the foreground thread can read the stream.
	CkTask *GetFileToStreamAsync(const char *remoteFilePath, CkStream &toStream);


	// Returns group name, if available, for the Nth file. If empty, then no group
	// information is available.
	// 
	// Note: When MLSD is used to get directory listings, it is likely that the owner
	// and group information is not transmitted. In cases where the FTP server is on a
	// UNIX/Linux system, the AllowMlsd property can be set to false to force UNIX
	// directory listings instead of MLSD directory listings. This should result in
	// being able to obtain owner/group information. However, it may sacrifice the
	// quality and accuracy of the various date/time values that are returned.
	// 
	bool GetGroup(int index, CkString &outStr);

	// Returns group name, if available, for the Nth file. If empty, then no group
	// information is available.
	// 
	// Note: When MLSD is used to get directory listings, it is likely that the owner
	// and group information is not transmitted. In cases where the FTP server is on a
	// UNIX/Linux system, the AllowMlsd property can be set to false to force UNIX
	// directory listings instead of MLSD directory listings. This should result in
	// being able to obtain owner/group information. However, it may sacrifice the
	// quality and accuracy of the various date/time values that are returned.
	// 
	const char *getGroup(int index);
	// Returns group name, if available, for the Nth file. If empty, then no group
	// information is available.
	// 
	// Note: When MLSD is used to get directory listings, it is likely that the owner
	// and group information is not transmitted. In cases where the FTP server is on a
	// UNIX/Linux system, the AllowMlsd property can be set to false to force UNIX
	// directory listings instead of MLSD directory listings. This should result in
	// being able to obtain owner/group information. However, it may sacrifice the
	// quality and accuracy of the various date/time values that are returned.
	// 
	const char *group(int index);

	// Returns group name, if available, for the Nth file. If empty, then no group
	// information is available.
	// 
	// Note: When MLSD is used to get directory listings, it is likely that the owner
	// and group information is not transmitted. In cases where the FTP server is on a
	// UNIX/Linux system, the AllowMlsd property can be set to false to force UNIX
	// directory listings instead of MLSD directory listings. This should result in
	// being able to obtain owner/group information. However, it may sacrifice the
	// quality and accuracy of the various date/time values that are returned.
	// 
	CkTask *GetGroupAsync(int index);


	// Returns true for a sub-directory and false for a file, for the Nth entry in
	// the current remote directory. The first file/dir is at index 0, and the last one
	// is at index (GetDirCount()-1)
	bool GetIsDirectory(int index);

	// Returns true for a sub-directory and false for a file, for the Nth entry in
	// the current remote directory. The first file/dir is at index 0, and the last one
	// is at index (GetDirCount()-1)
	CkTask *GetIsDirectoryAsync(int index);


	// Returns true if the remote file is a symbolic link. (Symbolic links only exist
	// on Unix/Linux systems, not on Windows filesystems.)
	bool GetIsSymbolicLink(int index);

	// Returns true if the remote file is a symbolic link. (Symbolic links only exist
	// on Unix/Linux systems, not on Windows filesystems.)
	CkTask *GetIsSymbolicLinkAsync(int index);


	// Provides details about the last method called on this object instance. While
	// many methods do not generate information, some allow you to retrieve details by
	// accessing the last JSON data immediately after the method call returns.
	void GetLastJsonData(CkJsonObject &json);


	// Applications should instead call GetLastModifiedTimeStr .
	// 
	// Returns the last modified date/time for the Nth file or sub-directory in the
	// current remote directory. The first file/dir is at index 0, and the last one is
	// at index (GetDirCount()-1)
	// 
	// The caller is responsible for deleting the object returned by this method.
	CkDateTime *GetLastModDt(int index);

	// Applications should instead call GetLastModifiedTimeStr .
	// 
	// Returns the last modified date/time for the Nth file or sub-directory in the
	// current remote directory. The first file/dir is at index 0, and the last one is
	// at index (GetDirCount()-1)
	// 
	CkTask *GetLastModDtAsync(int index);


	// Applications should instead call GetLastModifiedTimeByNameStr .
	// 
	// Returns the last-modified date/time for a remote file.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	// The caller is responsible for deleting the object returned by this method.
	CkDateTime *GetLastModDtByName(const char *filename);

	// Applications should instead call GetLastModifiedTimeByNameStr .
	// 
	// Returns the last-modified date/time for a remote file.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	CkTask *GetLastModDtByNameAsync(const char *filename);


	// Returns a remote file's last-modified date/time in RFC822 string format, such as
	// Tue, 25 Sep 2012 12:25:32 -0500 .
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	bool GetLastModifiedTimeByNameStr(const char *filename, CkString &outStr);

	// Returns a remote file's last-modified date/time in RFC822 string format, such as
	// Tue, 25 Sep 2012 12:25:32 -0500 .
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	const char *getLastModifiedTimeByNameStr(const char *filename);
	// Returns a remote file's last-modified date/time in RFC822 string format, such as
	// Tue, 25 Sep 2012 12:25:32 -0500 .
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	const char *lastModifiedTimeByNameStr(const char *filename);

	// Returns a remote file's last-modified date/time in RFC822 string format, such as
	// Tue, 25 Sep 2012 12:25:32 -0500 .
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	CkTask *GetLastModifiedTimeByNameStrAsync(const char *filename);


	// Returns the last modified date/time (in RFC822 string format, such as Tue, 25
	// Sep 2012 12:25:32 -0500 ) for the Nth file or sub-directory in the current
	// remote directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	bool GetLastModifiedTimeStr(int index, CkString &outStr);

	// Returns the last modified date/time (in RFC822 string format, such as Tue, 25
	// Sep 2012 12:25:32 -0500 ) for the Nth file or sub-directory in the current
	// remote directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	const char *getLastModifiedTimeStr(int index);
	// Returns the last modified date/time (in RFC822 string format, such as Tue, 25
	// Sep 2012 12:25:32 -0500 ) for the Nth file or sub-directory in the current
	// remote directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	const char *lastModifiedTimeStr(int index);

	// Returns the last modified date/time (in RFC822 string format, such as Tue, 25
	// Sep 2012 12:25:32 -0500 ) for the Nth file or sub-directory in the current
	// remote directory. The first file/dir is at index 0, and the last one is at index
	// (GetDirCount()-1)
	CkTask *GetLastModifiedTimeStrAsync(int index);


	// Returns owner name, if available, for the Nth file. If empty, then no owner
	// information is available.
	// 
	// Note: When MLSD is used to get directory listings, it is likely that the owner
	// and group information is not transmitted. In cases where the FTP server is on a
	// UNIX/Linux system, the AllowMlsd property can be set to false to force UNIX
	// directory listings instead of MLSD directory listings. This should result in
	// being able to obtain owner/group information. However, it may sacrifice the
	// quality and accuracy of the various date/time values that are returned.
	// 
	bool GetOwner(int index, CkString &outStr);

	// Returns owner name, if available, for the Nth file. If empty, then no owner
	// information is available.
	// 
	// Note: When MLSD is used to get directory listings, it is likely that the owner
	// and group information is not transmitted. In cases where the FTP server is on a
	// UNIX/Linux system, the AllowMlsd property can be set to false to force UNIX
	// directory listings instead of MLSD directory listings. This should result in
	// being able to obtain owner/group information. However, it may sacrifice the
	// quality and accuracy of the various date/time values that are returned.
	// 
	const char *getOwner(int index);
	// Returns owner name, if available, for the Nth file. If empty, then no owner
	// information is available.
	// 
	// Note: When MLSD is used to get directory listings, it is likely that the owner
	// and group information is not transmitted. In cases where the FTP server is on a
	// UNIX/Linux system, the AllowMlsd property can be set to false to force UNIX
	// directory listings instead of MLSD directory listings. This should result in
	// being able to obtain owner/group information. However, it may sacrifice the
	// quality and accuracy of the various date/time values that are returned.
	// 
	const char *owner(int index);

	// Returns owner name, if available, for the Nth file. If empty, then no owner
	// information is available.
	// 
	// Note: When MLSD is used to get directory listings, it is likely that the owner
	// and group information is not transmitted. In cases where the FTP server is on a
	// UNIX/Linux system, the AllowMlsd property can be set to false to force UNIX
	// directory listings instead of MLSD directory listings. This should result in
	// being able to obtain owner/group information. However, it may sacrifice the
	// quality and accuracy of the various date/time values that are returned.
	// 
	CkTask *GetOwnerAsync(int index);


	// Returns permissions information, if available, for the Nth file. If empty, then
	// no permissions information is available. The value returned by the GetPermType
	// method defines the content and format of the permissions string returned by this
	// method. Possible permission types are mlsd , unix , netware , openvms , and
	// batchStatusFlags . The format of each permission type is as follows:
	// --------------------------------------------------------------------------------
	// 
	// PermType: mlsd:
	// 
	// A perm fact is returned. The format of the perm fact is defined in RFC 3659 as
	// follows:  The perm fact is used to indicate access rights the current FTP user
	//    has over the object listed.  Its value is always an unordered
	//    sequence of alphabetic characters.
	// 
	//       perm-fact    = "Perm" "=" *pvals
	//       pvals        = "a" / "c" / "d" / "e" / "f" /
	//                      "l" / "m" / "p" / "r" / "w"
	// 
	//    There are ten permission indicators currently defined.  Many are
	//    meaningful only when used with a particular type of object.  The
	//    indicators are case independent, "d" and "D" are the same indicator.
	// 
	//    The "a" permission applies to objects of type=file, and indicates
	//    that the APPE (append) command may be applied to the file named.
	// 
	//    The "c" permission applies to objects of type=dir (and type=pdir,
	//    type=cdir).  It indicates that files may be created in the directory
	//    named.  That is, that a STOU command is likely to succeed, and that
	//    STOR and APPE commands might succeed if the file named did not
	//    previously exist, but is to be created in the directory object that
	//    has the "c" permission.  It also indicates that the RNTO command is
	//    likely to succeed for names in the directory.
	// 
	//    The "d" permission applies to all types.  It indicates that the
	//    object named may be deleted, that is, that the RMD command may be
	//    applied to it if it is a directory, and otherwise that the DELE
	//    command may be applied to it.
	// 
	//    The "e" permission applies to the directory types.  When set on an
	//    object of type=dir, type=cdir, or type=pdir it indicates that a CWD
	//    command naming the object should succeed, and the user should be able
	//    to enter the directory named.  For type=pdir it also indicates that
	//    the CDUP command may succeed (if this particular pathname is the one
	//    to which a CDUP would apply.)
	// 
	//    The "f" permission for objects indicates that the object named may be
	//    renamed - that is, may be the object of an RNFR command.
	// 
	//    The "l" permission applies to the directory file types, and indicates
	//    that the listing commands, LIST, NLST, and MLSD may be applied to the
	//    directory in question.
	// 
	//    The "m" permission applies to directory types, and indicates that the
	//    MKD command may be used to create a new directory within the
	//    directory under consideration.
	// 
	//    The "p" permission applies to directory types, and indicates that
	//    objects in the directory may be deleted, or (stretching naming a
	//    little) that the directory may be purged.  Note: it does not indicate
	//    that the RMD command may be used to remove the directory named
	//    itself, the "d" permission indicator indicates that.
	// 
	//    The "r" permission applies to type=file objects, and for some
	//    systems, perhaps to other types of objects, and indicates that the
	//    RETR command may be applied to that object.
	// 
	//    The "w" permission applies to type=file objects, and for some
	//    systems, perhaps to other types of objects, and indicates that the
	//    STOR command may be applied to the object named.
	// 
	//    Note: That a permission indicator is set can never imply that the
	//       appropriate command is guaranteed to work -- just that it might.
	//       Other system specific limitations, such as limitations on
	//       available space for storing files, may cause an operation to fail,
	//       where the permission flags may have indicated that it was likely
	//       to succeed.  The permissions are a guide only.
	// 
	//    Implementation note: The permissions are described here as they apply
	//       to FTP commands.  They may not map easily into particular
	//       permissions available on the server's operating system.  Servers
	//       are expected to synthesize these permission bits from the
	//       permission information available from operating system.  For
	//       example, to correctly determine whether the "D" permission bit
	//       should be set on a directory for a server running on the UNIX(TM)
	//       operating system, the server should check that the directory named
	//       is empty, and that the user has write permission on both the
	//       directory under consideration, and its parent directory.
	// 
	//       Some systems may have more specific permissions than those listed
	//       here, such systems should map those to the flags defined as best
	//       they are able.  Other systems may have only more broad access
	//       controls.  They will generally have just a few possible
	//       permutations of permission flags, however they should attempt to
	//       correctly represent what is permitted.
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: unix:
	// 
	// A Unix/Linux permissions string is returned ( such as drwxr-xr-x or -rw-r--r-- )    The UNIX permissions string is 10 characters. Each character has a specific meaning. If the first character is:
	//     d 	the entry is a directory.
	//     b 	the entry is a block special file.
	//     c 	the entry is a character special file.
	//     l 	the entry is a symbolic link. Either the -N flag was specified, or the symbolic link did not point to an existing file.
	//     p 	the entry is a first-in, first-out (FIFO) special file.
	//     s 	the entry is a local socket.
	//     - 	the entry is an ordinary file.
	// 
	//     The next nine characters are divided into three sets of three characters each. The first set of three characters show 
	// the owner's permission. The next set of three characters show the permission of the other users in the group. The last
	// set of three characters shows the permission of anyone else with access to the file. The three characters in each set 
	// indicate, respectively, read, write, and execute permission of the file. With execute permission of a directory, you can search 
	// a directory for a specified file. Permissions are indicated like this:
	// 
	//     r 	read
	//     w 	write (edit)
	//     x 	execute (search)
	//     - 	corresponding permission not granted 
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: netware:
	// 
	// Contains the NetWare rights string from a NetWare FTP server directory listing
	// format. For example -WCE---S or RWCEAFMS .Directory Rights	Description
	// ----------------	-------------------------------
	// Read (R)		Read data from an existing file.
	// Write (W)		Write data to an existing file.
	// Create (C)		Create a new file or subdirectory.
	// Erase (E)		Delete an existing files or directory.
	// Modify (M)	Rename and change attributes of a file.
	// File Scan (F)	List the contents of a directory.
	// Access Control (A)	Control the rights of other users to access files or directories.
	// Supervisor (S)	Automatically allowed all rights.
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: openvms:
	// 
	// Contains the OpenVMS permissions string. For example (RWED,RWED,RWED,RWED) ,
	// (RWED,RWED,,) , (RWED,RWED,R,R) , etc.
	// --------------------------------------------------------------------------------
	// 
	// PermType: batchStatusFlags:
	// 
	// Contains the batch status flags from a Connect:Enterprise Server. Such as
	// -CR--M---- or -ART------ .The Batch Status Flags  is a 10-character string where each character describes an attribute of the batch. 
	// A dash indicates that flag is turned off and therefore has no meaning to the 
	// batch in question. The flags are always displayed in the same order: 
	// 
	// 1) I  -- Incomplete batch which will NOT be processed. 
	// 2) A or C -- Added or Collected
	// 3) R -- Requestable by partner 
	// 4) T -- Transmitted to partner 
	// 5) E -- Extracted (inbound file processed by McLane) 
	// 6) M -- Multi-transmittable 
	// 7) U -- Un-extractable 
	// 8) N -- Non-transmittable 
	// 9) P -- In Progress 
	// 10) - -- Always a dash.
	// 
	bool GetPermissions(int index, CkString &outStr);

	// Returns permissions information, if available, for the Nth file. If empty, then
	// no permissions information is available. The value returned by the GetPermType
	// method defines the content and format of the permissions string returned by this
	// method. Possible permission types are mlsd , unix , netware , openvms , and
	// batchStatusFlags . The format of each permission type is as follows:
	// --------------------------------------------------------------------------------
	// 
	// PermType: mlsd:
	// 
	// A perm fact is returned. The format of the perm fact is defined in RFC 3659 as
	// follows:  The perm fact is used to indicate access rights the current FTP user
	//    has over the object listed.  Its value is always an unordered
	//    sequence of alphabetic characters.
	// 
	//       perm-fact    = "Perm" "=" *pvals
	//       pvals        = "a" / "c" / "d" / "e" / "f" /
	//                      "l" / "m" / "p" / "r" / "w"
	// 
	//    There are ten permission indicators currently defined.  Many are
	//    meaningful only when used with a particular type of object.  The
	//    indicators are case independent, "d" and "D" are the same indicator.
	// 
	//    The "a" permission applies to objects of type=file, and indicates
	//    that the APPE (append) command may be applied to the file named.
	// 
	//    The "c" permission applies to objects of type=dir (and type=pdir,
	//    type=cdir).  It indicates that files may be created in the directory
	//    named.  That is, that a STOU command is likely to succeed, and that
	//    STOR and APPE commands might succeed if the file named did not
	//    previously exist, but is to be created in the directory object that
	//    has the "c" permission.  It also indicates that the RNTO command is
	//    likely to succeed for names in the directory.
	// 
	//    The "d" permission applies to all types.  It indicates that the
	//    object named may be deleted, that is, that the RMD command may be
	//    applied to it if it is a directory, and otherwise that the DELE
	//    command may be applied to it.
	// 
	//    The "e" permission applies to the directory types.  When set on an
	//    object of type=dir, type=cdir, or type=pdir it indicates that a CWD
	//    command naming the object should succeed, and the user should be able
	//    to enter the directory named.  For type=pdir it also indicates that
	//    the CDUP command may succeed (if this particular pathname is the one
	//    to which a CDUP would apply.)
	// 
	//    The "f" permission for objects indicates that the object named may be
	//    renamed - that is, may be the object of an RNFR command.
	// 
	//    The "l" permission applies to the directory file types, and indicates
	//    that the listing commands, LIST, NLST, and MLSD may be applied to the
	//    directory in question.
	// 
	//    The "m" permission applies to directory types, and indicates that the
	//    MKD command may be used to create a new directory within the
	//    directory under consideration.
	// 
	//    The "p" permission applies to directory types, and indicates that
	//    objects in the directory may be deleted, or (stretching naming a
	//    little) that the directory may be purged.  Note: it does not indicate
	//    that the RMD command may be used to remove the directory named
	//    itself, the "d" permission indicator indicates that.
	// 
	//    The "r" permission applies to type=file objects, and for some
	//    systems, perhaps to other types of objects, and indicates that the
	//    RETR command may be applied to that object.
	// 
	//    The "w" permission applies to type=file objects, and for some
	//    systems, perhaps to other types of objects, and indicates that the
	//    STOR command may be applied to the object named.
	// 
	//    Note: That a permission indicator is set can never imply that the
	//       appropriate command is guaranteed to work -- just that it might.
	//       Other system specific limitations, such as limitations on
	//       available space for storing files, may cause an operation to fail,
	//       where the permission flags may have indicated that it was likely
	//       to succeed.  The permissions are a guide only.
	// 
	//    Implementation note: The permissions are described here as they apply
	//       to FTP commands.  They may not map easily into particular
	//       permissions available on the server's operating system.  Servers
	//       are expected to synthesize these permission bits from the
	//       permission information available from operating system.  For
	//       example, to correctly determine whether the "D" permission bit
	//       should be set on a directory for a server running on the UNIX(TM)
	//       operating system, the server should check that the directory named
	//       is empty, and that the user has write permission on both the
	//       directory under consideration, and its parent directory.
	// 
	//       Some systems may have more specific permissions than those listed
	//       here, such systems should map those to the flags defined as best
	//       they are able.  Other systems may have only more broad access
	//       controls.  They will generally have just a few possible
	//       permutations of permission flags, however they should attempt to
	//       correctly represent what is permitted.
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: unix:
	// 
	// A Unix/Linux permissions string is returned ( such as drwxr-xr-x or -rw-r--r-- )    The UNIX permissions string is 10 characters. Each character has a specific meaning. If the first character is:
	//     d 	the entry is a directory.
	//     b 	the entry is a block special file.
	//     c 	the entry is a character special file.
	//     l 	the entry is a symbolic link. Either the -N flag was specified, or the symbolic link did not point to an existing file.
	//     p 	the entry is a first-in, first-out (FIFO) special file.
	//     s 	the entry is a local socket.
	//     - 	the entry is an ordinary file.
	// 
	//     The next nine characters are divided into three sets of three characters each. The first set of three characters show 
	// the owner's permission. The next set of three characters show the permission of the other users in the group. The last
	// set of three characters shows the permission of anyone else with access to the file. The three characters in each set 
	// indicate, respectively, read, write, and execute permission of the file. With execute permission of a directory, you can search 
	// a directory for a specified file. Permissions are indicated like this:
	// 
	//     r 	read
	//     w 	write (edit)
	//     x 	execute (search)
	//     - 	corresponding permission not granted 
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: netware:
	// 
	// Contains the NetWare rights string from a NetWare FTP server directory listing
	// format. For example -WCE---S or RWCEAFMS .Directory Rights	Description
	// ----------------	-------------------------------
	// Read (R)		Read data from an existing file.
	// Write (W)		Write data to an existing file.
	// Create (C)		Create a new file or subdirectory.
	// Erase (E)		Delete an existing files or directory.
	// Modify (M)	Rename and change attributes of a file.
	// File Scan (F)	List the contents of a directory.
	// Access Control (A)	Control the rights of other users to access files or directories.
	// Supervisor (S)	Automatically allowed all rights.
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: openvms:
	// 
	// Contains the OpenVMS permissions string. For example (RWED,RWED,RWED,RWED) ,
	// (RWED,RWED,,) , (RWED,RWED,R,R) , etc.
	// --------------------------------------------------------------------------------
	// 
	// PermType: batchStatusFlags:
	// 
	// Contains the batch status flags from a Connect:Enterprise Server. Such as
	// -CR--M---- or -ART------ .The Batch Status Flags  is a 10-character string where each character describes an attribute of the batch. 
	// A dash indicates that flag is turned off and therefore has no meaning to the 
	// batch in question. The flags are always displayed in the same order: 
	// 
	// 1) I  -- Incomplete batch which will NOT be processed. 
	// 2) A or C -- Added or Collected
	// 3) R -- Requestable by partner 
	// 4) T -- Transmitted to partner 
	// 5) E -- Extracted (inbound file processed by McLane) 
	// 6) M -- Multi-transmittable 
	// 7) U -- Un-extractable 
	// 8) N -- Non-transmittable 
	// 9) P -- In Progress 
	// 10) - -- Always a dash.
	// 
	const char *getPermissions(int index);
	// Returns permissions information, if available, for the Nth file. If empty, then
	// no permissions information is available. The value returned by the GetPermType
	// method defines the content and format of the permissions string returned by this
	// method. Possible permission types are mlsd , unix , netware , openvms , and
	// batchStatusFlags . The format of each permission type is as follows:
	// --------------------------------------------------------------------------------
	// 
	// PermType: mlsd:
	// 
	// A perm fact is returned. The format of the perm fact is defined in RFC 3659 as
	// follows:  The perm fact is used to indicate access rights the current FTP user
	//    has over the object listed.  Its value is always an unordered
	//    sequence of alphabetic characters.
	// 
	//       perm-fact    = "Perm" "=" *pvals
	//       pvals        = "a" / "c" / "d" / "e" / "f" /
	//                      "l" / "m" / "p" / "r" / "w"
	// 
	//    There are ten permission indicators currently defined.  Many are
	//    meaningful only when used with a particular type of object.  The
	//    indicators are case independent, "d" and "D" are the same indicator.
	// 
	//    The "a" permission applies to objects of type=file, and indicates
	//    that the APPE (append) command may be applied to the file named.
	// 
	//    The "c" permission applies to objects of type=dir (and type=pdir,
	//    type=cdir).  It indicates that files may be created in the directory
	//    named.  That is, that a STOU command is likely to succeed, and that
	//    STOR and APPE commands might succeed if the file named did not
	//    previously exist, but is to be created in the directory object that
	//    has the "c" permission.  It also indicates that the RNTO command is
	//    likely to succeed for names in the directory.
	// 
	//    The "d" permission applies to all types.  It indicates that the
	//    object named may be deleted, that is, that the RMD command may be
	//    applied to it if it is a directory, and otherwise that the DELE
	//    command may be applied to it.
	// 
	//    The "e" permission applies to the directory types.  When set on an
	//    object of type=dir, type=cdir, or type=pdir it indicates that a CWD
	//    command naming the object should succeed, and the user should be able
	//    to enter the directory named.  For type=pdir it also indicates that
	//    the CDUP command may succeed (if this particular pathname is the one
	//    to which a CDUP would apply.)
	// 
	//    The "f" permission for objects indicates that the object named may be
	//    renamed - that is, may be the object of an RNFR command.
	// 
	//    The "l" permission applies to the directory file types, and indicates
	//    that the listing commands, LIST, NLST, and MLSD may be applied to the
	//    directory in question.
	// 
	//    The "m" permission applies to directory types, and indicates that the
	//    MKD command may be used to create a new directory within the
	//    directory under consideration.
	// 
	//    The "p" permission applies to directory types, and indicates that
	//    objects in the directory may be deleted, or (stretching naming a
	//    little) that the directory may be purged.  Note: it does not indicate
	//    that the RMD command may be used to remove the directory named
	//    itself, the "d" permission indicator indicates that.
	// 
	//    The "r" permission applies to type=file objects, and for some
	//    systems, perhaps to other types of objects, and indicates that the
	//    RETR command may be applied to that object.
	// 
	//    The "w" permission applies to type=file objects, and for some
	//    systems, perhaps to other types of objects, and indicates that the
	//    STOR command may be applied to the object named.
	// 
	//    Note: That a permission indicator is set can never imply that the
	//       appropriate command is guaranteed to work -- just that it might.
	//       Other system specific limitations, such as limitations on
	//       available space for storing files, may cause an operation to fail,
	//       where the permission flags may have indicated that it was likely
	//       to succeed.  The permissions are a guide only.
	// 
	//    Implementation note: The permissions are described here as they apply
	//       to FTP commands.  They may not map easily into particular
	//       permissions available on the server's operating system.  Servers
	//       are expected to synthesize these permission bits from the
	//       permission information available from operating system.  For
	//       example, to correctly determine whether the "D" permission bit
	//       should be set on a directory for a server running on the UNIX(TM)
	//       operating system, the server should check that the directory named
	//       is empty, and that the user has write permission on both the
	//       directory under consideration, and its parent directory.
	// 
	//       Some systems may have more specific permissions than those listed
	//       here, such systems should map those to the flags defined as best
	//       they are able.  Other systems may have only more broad access
	//       controls.  They will generally have just a few possible
	//       permutations of permission flags, however they should attempt to
	//       correctly represent what is permitted.
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: unix:
	// 
	// A Unix/Linux permissions string is returned ( such as drwxr-xr-x or -rw-r--r-- )    The UNIX permissions string is 10 characters. Each character has a specific meaning. If the first character is:
	//     d 	the entry is a directory.
	//     b 	the entry is a block special file.
	//     c 	the entry is a character special file.
	//     l 	the entry is a symbolic link. Either the -N flag was specified, or the symbolic link did not point to an existing file.
	//     p 	the entry is a first-in, first-out (FIFO) special file.
	//     s 	the entry is a local socket.
	//     - 	the entry is an ordinary file.
	// 
	//     The next nine characters are divided into three sets of three characters each. The first set of three characters show 
	// the owner's permission. The next set of three characters show the permission of the other users in the group. The last
	// set of three characters shows the permission of anyone else with access to the file. The three characters in each set 
	// indicate, respectively, read, write, and execute permission of the file. With execute permission of a directory, you can search 
	// a directory for a specified file. Permissions are indicated like this:
	// 
	//     r 	read
	//     w 	write (edit)
	//     x 	execute (search)
	//     - 	corresponding permission not granted 
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: netware:
	// 
	// Contains the NetWare rights string from a NetWare FTP server directory listing
	// format. For example -WCE---S or RWCEAFMS .Directory Rights	Description
	// ----------------	-------------------------------
	// Read (R)		Read data from an existing file.
	// Write (W)		Write data to an existing file.
	// Create (C)		Create a new file or subdirectory.
	// Erase (E)		Delete an existing files or directory.
	// Modify (M)	Rename and change attributes of a file.
	// File Scan (F)	List the contents of a directory.
	// Access Control (A)	Control the rights of other users to access files or directories.
	// Supervisor (S)	Automatically allowed all rights.
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: openvms:
	// 
	// Contains the OpenVMS permissions string. For example (RWED,RWED,RWED,RWED) ,
	// (RWED,RWED,,) , (RWED,RWED,R,R) , etc.
	// --------------------------------------------------------------------------------
	// 
	// PermType: batchStatusFlags:
	// 
	// Contains the batch status flags from a Connect:Enterprise Server. Such as
	// -CR--M---- or -ART------ .The Batch Status Flags  is a 10-character string where each character describes an attribute of the batch. 
	// A dash indicates that flag is turned off and therefore has no meaning to the 
	// batch in question. The flags are always displayed in the same order: 
	// 
	// 1) I  -- Incomplete batch which will NOT be processed. 
	// 2) A or C -- Added or Collected
	// 3) R -- Requestable by partner 
	// 4) T -- Transmitted to partner 
	// 5) E -- Extracted (inbound file processed by McLane) 
	// 6) M -- Multi-transmittable 
	// 7) U -- Un-extractable 
	// 8) N -- Non-transmittable 
	// 9) P -- In Progress 
	// 10) - -- Always a dash.
	// 
	const char *permissions(int index);

	// Returns permissions information, if available, for the Nth file. If empty, then
	// no permissions information is available. The value returned by the GetPermType
	// method defines the content and format of the permissions string returned by this
	// method. Possible permission types are mlsd , unix , netware , openvms , and
	// batchStatusFlags . The format of each permission type is as follows:
	// --------------------------------------------------------------------------------
	// 
	// PermType: mlsd:
	// 
	// A perm fact is returned. The format of the perm fact is defined in RFC 3659 as
	// follows:  The perm fact is used to indicate access rights the current FTP user
	//    has over the object listed.  Its value is always an unordered
	//    sequence of alphabetic characters.
	// 
	//       perm-fact    = "Perm" "=" *pvals
	//       pvals        = "a" / "c" / "d" / "e" / "f" /
	//                      "l" / "m" / "p" / "r" / "w"
	// 
	//    There are ten permission indicators currently defined.  Many are
	//    meaningful only when used with a particular type of object.  The
	//    indicators are case independent, "d" and "D" are the same indicator.
	// 
	//    The "a" permission applies to objects of type=file, and indicates
	//    that the APPE (append) command may be applied to the file named.
	// 
	//    The "c" permission applies to objects of type=dir (and type=pdir,
	//    type=cdir).  It indicates that files may be created in the directory
	//    named.  That is, that a STOU command is likely to succeed, and that
	//    STOR and APPE commands might succeed if the file named did not
	//    previously exist, but is to be created in the directory object that
	//    has the "c" permission.  It also indicates that the RNTO command is
	//    likely to succeed for names in the directory.
	// 
	//    The "d" permission applies to all types.  It indicates that the
	//    object named may be deleted, that is, that the RMD command may be
	//    applied to it if it is a directory, and otherwise that the DELE
	//    command may be applied to it.
	// 
	//    The "e" permission applies to the directory types.  When set on an
	//    object of type=dir, type=cdir, or type=pdir it indicates that a CWD
	//    command naming the object should succeed, and the user should be able
	//    to enter the directory named.  For type=pdir it also indicates that
	//    the CDUP command may succeed (if this particular pathname is the one
	//    to which a CDUP would apply.)
	// 
	//    The "f" permission for objects indicates that the object named may be
	//    renamed - that is, may be the object of an RNFR command.
	// 
	//    The "l" permission applies to the directory file types, and indicates
	//    that the listing commands, LIST, NLST, and MLSD may be applied to the
	//    directory in question.
	// 
	//    The "m" permission applies to directory types, and indicates that the
	//    MKD command may be used to create a new directory within the
	//    directory under consideration.
	// 
	//    The "p" permission applies to directory types, and indicates that
	//    objects in the directory may be deleted, or (stretching naming a
	//    little) that the directory may be purged.  Note: it does not indicate
	//    that the RMD command may be used to remove the directory named
	//    itself, the "d" permission indicator indicates that.
	// 
	//    The "r" permission applies to type=file objects, and for some
	//    systems, perhaps to other types of objects, and indicates that the
	//    RETR command may be applied to that object.
	// 
	//    The "w" permission applies to type=file objects, and for some
	//    systems, perhaps to other types of objects, and indicates that the
	//    STOR command may be applied to the object named.
	// 
	//    Note: That a permission indicator is set can never imply that the
	//       appropriate command is guaranteed to work -- just that it might.
	//       Other system specific limitations, such as limitations on
	//       available space for storing files, may cause an operation to fail,
	//       where the permission flags may have indicated that it was likely
	//       to succeed.  The permissions are a guide only.
	// 
	//    Implementation note: The permissions are described here as they apply
	//       to FTP commands.  They may not map easily into particular
	//       permissions available on the server's operating system.  Servers
	//       are expected to synthesize these permission bits from the
	//       permission information available from operating system.  For
	//       example, to correctly determine whether the "D" permission bit
	//       should be set on a directory for a server running on the UNIX(TM)
	//       operating system, the server should check that the directory named
	//       is empty, and that the user has write permission on both the
	//       directory under consideration, and its parent directory.
	// 
	//       Some systems may have more specific permissions than those listed
	//       here, such systems should map those to the flags defined as best
	//       they are able.  Other systems may have only more broad access
	//       controls.  They will generally have just a few possible
	//       permutations of permission flags, however they should attempt to
	//       correctly represent what is permitted.
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: unix:
	// 
	// A Unix/Linux permissions string is returned ( such as drwxr-xr-x or -rw-r--r-- )    The UNIX permissions string is 10 characters. Each character has a specific meaning. If the first character is:
	//     d 	the entry is a directory.
	//     b 	the entry is a block special file.
	//     c 	the entry is a character special file.
	//     l 	the entry is a symbolic link. Either the -N flag was specified, or the symbolic link did not point to an existing file.
	//     p 	the entry is a first-in, first-out (FIFO) special file.
	//     s 	the entry is a local socket.
	//     - 	the entry is an ordinary file.
	// 
	//     The next nine characters are divided into three sets of three characters each. The first set of three characters show 
	// the owner's permission. The next set of three characters show the permission of the other users in the group. The last
	// set of three characters shows the permission of anyone else with access to the file. The three characters in each set 
	// indicate, respectively, read, write, and execute permission of the file. With execute permission of a directory, you can search 
	// a directory for a specified file. Permissions are indicated like this:
	// 
	//     r 	read
	//     w 	write (edit)
	//     x 	execute (search)
	//     - 	corresponding permission not granted 
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: netware:
	// 
	// Contains the NetWare rights string from a NetWare FTP server directory listing
	// format. For example -WCE---S or RWCEAFMS .Directory Rights	Description
	// ----------------	-------------------------------
	// Read (R)		Read data from an existing file.
	// Write (W)		Write data to an existing file.
	// Create (C)		Create a new file or subdirectory.
	// Erase (E)		Delete an existing files or directory.
	// Modify (M)	Rename and change attributes of a file.
	// File Scan (F)	List the contents of a directory.
	// Access Control (A)	Control the rights of other users to access files or directories.
	// Supervisor (S)	Automatically allowed all rights.
	//  
	// --------------------------------------------------------------------------------
	// 
	// PermType: openvms:
	// 
	// Contains the OpenVMS permissions string. For example (RWED,RWED,RWED,RWED) ,
	// (RWED,RWED,,) , (RWED,RWED,R,R) , etc.
	// --------------------------------------------------------------------------------
	// 
	// PermType: batchStatusFlags:
	// 
	// Contains the batch status flags from a Connect:Enterprise Server. Such as
	// -CR--M---- or -ART------ .The Batch Status Flags  is a 10-character string where each character describes an attribute of the batch. 
	// A dash indicates that flag is turned off and therefore has no meaning to the 
	// batch in question. The flags are always displayed in the same order: 
	// 
	// 1) I  -- Incomplete batch which will NOT be processed. 
	// 2) A or C -- Added or Collected
	// 3) R -- Requestable by partner 
	// 4) T -- Transmitted to partner 
	// 5) E -- Extracted (inbound file processed by McLane) 
	// 6) M -- Multi-transmittable 
	// 7) U -- Un-extractable 
	// 8) N -- Non-transmittable 
	// 9) P -- In Progress 
	// 10) - -- Always a dash.
	// 
	CkTask *GetPermissionsAsync(int index);


	// Returns the type of permissions information that is available for the Nth file.
	// If empty, then no permissions information is available. The value returned by
	// this method defines the content and format of the permissions string returned by
	// the GetPermissions method. Possible values are mlsd , unix , netware , openvms ,
	// and batchStatusFlags .
	bool GetPermType(int index, CkString &outStr);

	// Returns the type of permissions information that is available for the Nth file.
	// If empty, then no permissions information is available. The value returned by
	// this method defines the content and format of the permissions string returned by
	// the GetPermissions method. Possible values are mlsd , unix , netware , openvms ,
	// and batchStatusFlags .
	const char *getPermType(int index);
	// Returns the type of permissions information that is available for the Nth file.
	// If empty, then no permissions information is available. The value returned by
	// this method defines the content and format of the permissions string returned by
	// the GetPermissions method. Possible values are mlsd , unix , netware , openvms ,
	// and batchStatusFlags .
	const char *permType(int index);

	// Returns the type of permissions information that is available for the Nth file.
	// If empty, then no permissions information is available. The value returned by
	// this method defines the content and format of the permissions string returned by
	// the GetPermissions method. Possible values are mlsd , unix , netware , openvms ,
	// and batchStatusFlags .
	CkTask *GetPermTypeAsync(int index);


	// Downloads the contents of a remote file into a byte array.
	bool GetRemoteFileBinaryData(const char *remoteFilename, CkByteData &outData);

	// Downloads the contents of a remote file into a byte array.
	CkTask *GetRemoteFileBinaryDataAsync(const char *remoteFilename);


	// Downloads a text file directly into a string variable. The character encoding of
	// the text file is specified by the charset argument, which is a value such as utf-8,
	// iso-8859-1, Shift_JIS, etc.
	bool GetRemoteFileTextC(const char *remoteFilename, const char *charset, CkString &outStr);

	// Downloads a text file directly into a string variable. The character encoding of
	// the text file is specified by the charset argument, which is a value such as utf-8,
	// iso-8859-1, Shift_JIS, etc.
	const char *getRemoteFileTextC(const char *remoteFilename, const char *charset);
	// Downloads a text file directly into a string variable. The character encoding of
	// the text file is specified by the charset argument, which is a value such as utf-8,
	// iso-8859-1, Shift_JIS, etc.
	const char *remoteFileTextC(const char *remoteFilename, const char *charset);

	// Downloads a text file directly into a string variable. The character encoding of
	// the text file is specified by the charset argument, which is a value such as utf-8,
	// iso-8859-1, Shift_JIS, etc.
	CkTask *GetRemoteFileTextCAsync(const char *remoteFilename, const char *charset);


	// Downloads the content of a remote text file directly into an in-memory string.
	// 
	// Note: If the remote text file does not use the ANSI character encoding, call
	// GetRemoteFileTextC instead, which allows for the character encoding to be
	// specified so that characters are properly interpreted.
	// 
	bool GetRemoteFileTextData(const char *remoteFilename, CkString &outStr);

	// Downloads the content of a remote text file directly into an in-memory string.
	// 
	// Note: If the remote text file does not use the ANSI character encoding, call
	// GetRemoteFileTextC instead, which allows for the character encoding to be
	// specified so that characters are properly interpreted.
	// 
	const char *getRemoteFileTextData(const char *remoteFilename);
	// Downloads the content of a remote text file directly into an in-memory string.
	// 
	// Note: If the remote text file does not use the ANSI character encoding, call
	// GetRemoteFileTextC instead, which allows for the character encoding to be
	// specified so that characters are properly interpreted.
	// 
	const char *remoteFileTextData(const char *remoteFilename);

	// Downloads the content of a remote text file directly into an in-memory string.
	// 
	// Note: If the remote text file does not use the ANSI character encoding, call
	// GetRemoteFileTextC instead, which allows for the character encoding to be
	// specified so that characters are properly interpreted.
	// 
	CkTask *GetRemoteFileTextDataAsync(const char *remoteFilename);


	// Returns the FTP server's digital certificate (for SSL / TLS connections).
	bool GetServerCert(CkCert &cert);


	// Returns the size of the Nth remote file in the current directory.
	int GetSize(int index);

	// Returns the size of the Nth remote file in the current directory.
	CkTask *GetSizeAsync(int index);


	// Returns the size of the Nth remote file in the current directory as a 64-bit
	// integer. Returns -1 if the file does not exist.
	__int64 GetSize64(int index);

	// Returns the size of the Nth remote file in the current directory as a 64-bit
	// integer. Returns -1 if the file does not exist.
	CkTask *GetSize64Async(int index);


	// Returns a remote file's size in bytes. Returns -1 if the file does not exist.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	int GetSizeByName(const char *filename);

	// Returns a remote file's size in bytes. Returns -1 if the file does not exist.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	CkTask *GetSizeByNameAsync(const char *filename);


	// Returns a remote file's size in bytes as a 64-bit integer.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	__int64 GetSizeByName64(const char *filename);

	// Returns a remote file's size in bytes as a 64-bit integer.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	CkTask *GetSizeByName64Async(const char *filename);


	// Returns the size in decimal string format of the Nth remote file in the current
	// directory. This is helpful for cases when the file size (in bytes) is greater
	// than what can fit in a 32-bit integer.
	bool GetSizeStr(int index, CkString &outStr);

	// Returns the size in decimal string format of the Nth remote file in the current
	// directory. This is helpful for cases when the file size (in bytes) is greater
	// than what can fit in a 32-bit integer.
	const char *getSizeStr(int index);
	// Returns the size in decimal string format of the Nth remote file in the current
	// directory. This is helpful for cases when the file size (in bytes) is greater
	// than what can fit in a 32-bit integer.
	const char *sizeStr(int index);

	// Returns the size in decimal string format of the Nth remote file in the current
	// directory. This is helpful for cases when the file size (in bytes) is greater
	// than what can fit in a 32-bit integer.
	CkTask *GetSizeStrAsync(int index);


	// Returns the size of a remote file as a string. This is helpful when file a file
	// size is greater than what can fit in a 32-bit integer.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	bool GetSizeStrByName(const char *filename, CkString &outStr);

	// Returns the size of a remote file as a string. This is helpful when file a file
	// size is greater than what can fit in a 32-bit integer.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	const char *getSizeStrByName(const char *filename);
	// Returns the size of a remote file as a string. This is helpful when file a file
	// size is greater than what can fit in a 32-bit integer.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	const char *sizeStrByName(const char *filename);

	// Returns the size of a remote file as a string. This is helpful when file a file
	// size is greater than what can fit in a 32-bit integer.
	// 
	// Note: The filename passed to this method must NOT include a path. Prior to calling
	// this method, make sure to set the current remote directory (via the
	// ChangeRemoteDir method) to the remote directory where this file exists.
	// 
	// Note: Prior to calling this method, it should be ensured that the ListPattern
	// property is set to a pattern that would match the requested filename. (The default
	// value of ListPattern is * , which will match all filenames.)
	// 
	CkTask *GetSizeStrByNameAsync(const char *filename);


	// This method is deprecated. Applications should instead call GetServerCert .
	// 
	// Returns the FTP server's digital certificate (for SSL / TLS connections).
	// 
	// The caller is responsible for deleting the object returned by this method.
	CkCert *GetSslServerCert(void);


	// Appends to strTable the paths of the files uploaded or downloaded in the last call
	// to SyncDeleteTree, SyncLocalDir, SyncLocalTree, SyncRemoteTree, or
	// SyncRemoteTree2. In both cases (for upload and download) each line contains the
	// paths relative to the root synced directory.
	void GetSyncedFiles(CkStringTable &strTable);


	// Returns a listing of the files and directories in the current directory matching
	// the pattern. Passing *.* will return all the files and directories.
	bool GetTextDirListing(const char *pattern, CkString &outStrRawListing);

	// Returns a listing of the files and directories in the current directory matching
	// the pattern. Passing *.* will return all the files and directories.
	const char *getTextDirListing(const char *pattern);
	// Returns a listing of the files and directories in the current directory matching
	// the pattern. Passing *.* will return all the files and directories.
	const char *textDirListing(const char *pattern);

	// Returns a listing of the files and directories in the current directory matching
	// the pattern. Passing *.* will return all the files and directories.
	CkTask *GetTextDirListingAsync(const char *pattern);


	// Returns (in XML format) the files and directories in the current directory
	// matching the pattern. Passing *.* will return all the files and directories.
	// 
	// Note: The lastModTime XML elements contain date/time information in the local
	// (client) timezone. However, it's possible based on the capabilities of an FTP
	// server (or lack of capabilities) that the timezone information for the remote
	// files is not available. In other words, in some cases, the timezone of an FTP
	// server cannot be known, especially for older FTP server implementations.
	// 
	bool GetXmlDirListing(const char *pattern, CkString &outStrXmlListing);

	// Returns (in XML format) the files and directories in the current directory
	// matching the pattern. Passing *.* will return all the files and directories.
	// 
	// Note: The lastModTime XML elements contain date/time information in the local
	// (client) timezone. However, it's possible based on the capabilities of an FTP
	// server (or lack of capabilities) that the timezone information for the remote
	// files is not available. In other words, in some cases, the timezone of an FTP
	// server cannot be known, especially for older FTP server implementations.
	// 
	const char *getXmlDirListing(const char *pattern);
	// Returns (in XML format) the files and directories in the current directory
	// matching the pattern. Passing *.* will return all the files and directories.
	// 
	// Note: The lastModTime XML elements contain date/time information in the local
	// (client) timezone. However, it's possible based on the capabilities of an FTP
	// server (or lack of capabilities) that the timezone information for the remote
	// files is not available. In other words, in some cases, the timezone of an FTP
	// server cannot be known, especially for older FTP server implementations.
	// 
	const char *xmlDirListing(const char *pattern);

	// Returns (in XML format) the files and directories in the current directory
	// matching the pattern. Passing *.* will return all the files and directories.
	// 
	// Note: The lastModTime XML elements contain date/time information in the local
	// (client) timezone. However, it's possible based on the capabilities of an FTP
	// server (or lack of capabilities) that the timezone information for the remote
	// files is not available. In other words, in some cases, the timezone of an FTP
	// server cannot be known, especially for older FTP server implementations.
	// 
	CkTask *GetXmlDirListingAsync(const char *pattern);


	// This is the same as PutFile, but designed to work around the following potential
	// problem associated with an upload that is extremely large.
	// 
	// FTP uses two TCP (or TLS) connections: a control connection to submit commands
	// and receive replies, and a data connection for actual file transfers. It is the
	// nature of FTP that during a transfer the control connection stays completely
	// idle. Many routers and firewalls automatically close idle connections after a
	// certain period of time. Worse, they often don't notify the user, but just
	// silently drop the connection.
	// 
	// For FTP, this means that during a long transfer the control connection can get
	// dropped because it is detected as idle, but neither client nor server are
	// notified. When all data has been transferred, the server assumes the control
	// connection is alive and it sends the transfer confirmation reply.
	// 
	// Likewise, the client thinks the control connection is alive and it waits for the
	// reply from the server. But since the control connection got dropped without
	// notification, the reply never arrives and eventually the connection will
	// timeout.
	// 
	// The Solution: This method uploads the file in chunks, where each chunk appends
	// to the remote file. This way, each chunk is a separate FTP upload that does not
	// take too long to complete. The chunkSize specifies the number of bytes to upload in
	// each chunk. The size should be based on the amount of memory available (because
	// each chunk will reside in memory as it's being uploaded), the transfer rate, and
	// the total size of the file being uploaded. For example, if a 4GB file is
	// uploaded, and the chunkSize is set to 1MB (1,048,576 bytes), then 4000 separate
	// chunks would be required. This is likely not a good choice for chunkSize. A more
	// appropriate chunkSize might be 20MB, in which case the upload would complete in 200
	// separate chunks. The application would temporarily be using a 20MB buffer for
	// uploading chunks. The tradeoff is between the number of chunks (the more chunks,
	// the larger the overall time to upload), the amount of memory that is reasonable
	// for the temporary buffer, and the amount of time required to upload each chunk
	// (if the chunk size is too large, then the problem described above is not
	// solved).
	// 
	bool LargeFileUpload(const char *localPath, const char *remotePath, int chunkSize);

	// This is the same as PutFile, but designed to work around the following potential
	// problem associated with an upload that is extremely large.
	// 
	// FTP uses two TCP (or TLS) connections: a control connection to submit commands
	// and receive replies, and a data connection for actual file transfers. It is the
	// nature of FTP that during a transfer the control connection stays completely
	// idle. Many routers and firewalls automatically close idle connections after a
	// certain period of time. Worse, they often don't notify the user, but just
	// silently drop the connection.
	// 
	// For FTP, this means that during a long transfer the control connection can get
	// dropped because it is detected as idle, but neither client nor server are
	// notified. When all data has been transferred, the server assumes the control
	// connection is alive and it sends the transfer confirmation reply.
	// 
	// Likewise, the client thinks the control connection is alive and it waits for the
	// reply from the server. But since the control connection got dropped without
	// notification, the reply never arrives and eventually the connection will
	// timeout.
	// 
	// The Solution: This method uploads the file in chunks, where each chunk appends
	// to the remote file. This way, each chunk is a separate FTP upload that does not
	// take too long to complete. The chunkSize specifies the number of bytes to upload in
	// each chunk. The size should be based on the amount of memory available (because
	// each chunk will reside in memory as it's being uploaded), the transfer rate, and
	// the total size of the file being uploaded. For example, if a 4GB file is
	// uploaded, and the chunkSize is set to 1MB (1,048,576 bytes), then 4000 separate
	// chunks would be required. This is likely not a good choice for chunkSize. A more
	// appropriate chunkSize might be 20MB, in which case the upload would complete in 200
	// separate chunks. The application would temporarily be using a 20MB buffer for
	// uploading chunks. The tradeoff is between the number of chunks (the more chunks,
	// the larger the overall time to upload), the amount of memory that is reasonable
	// for the temporary buffer, and the amount of time required to upload each chunk
	// (if the chunk size is too large, then the problem described above is not
	// solved).
	// 
	CkTask *LargeFileUploadAsync(const char *localPath, const char *remotePath, int chunkSize);


	// Loads the caller of the task's async method.
	bool LoadTaskCaller(CkTask &task);


	// Authenticates with the FTP server using the values provided in the Username,
	// Password, and/or other properties. This can be called after establishing the
	// connection via the ConnectOnly method. (The Connect method both connects and
	// authenticates.) The combination of calling ConnectOnly followed by
	// LoginAfterConnectOnly is the equivalent of calling the Connect method.
	// 
	// Note: After successful authentication, the FEAT and SYST commands are
	// automatically sent to help the client understand what is supported by the FTP
	// server. To prevent these commands from being sent, set the AutoFeat and/or
	// AutoSyst properties equal to false.
	// 
	bool LoginAfterConnectOnly(void);

	// Authenticates with the FTP server using the values provided in the Username,
	// Password, and/or other properties. This can be called after establishing the
	// connection via the ConnectOnly method. (The Connect method both connects and
	// authenticates.) The combination of calling ConnectOnly followed by
	// LoginAfterConnectOnly is the equivalent of calling the Connect method.
	// 
	// Note: After successful authentication, the FEAT and SYST commands are
	// automatically sent to help the client understand what is supported by the FTP
	// server. To prevent these commands from being sent, set the AutoFeat and/or
	// AutoSyst properties equal to false.
	// 
	CkTask *LoginAfterConnectOnlyAsync(void);


	// Copies all the files in the current remote FTP directory to a local directory.
	// To copy all the files in a remote directory, set remotePattern to *.* The
	// pattern can contain any number of * characters, where * matches 0 or more of any
	// character. The return value is the number of files transferred, and on error, a
	// value of -1 is returned. Detailed information about the transfer can be obtained
	// from the last-error information (LastErrorText/LastErrorHtml/LastErrorXml).
	// 
	// About case sensitivity: The MGetFiles command works by sending the LIST command
	// to the FTP server. For example: LIST *.txt . The FTP server responds with a
	// directory listing of the files matching the wildcarded pattern, and it is these
	// files that are downloaded. Case sensitivity depends on the case-sensitivity of
	// the remote file system. If the FTP server is running on a Windows-based
	// computer, it is likely to be case insensitive. However, if the FTP server is
	// running on Linux, MAC OS X, etc. it is likely to be case sensitive. There is no
	// good way to force case-insensitivity if the remote filesystem is case-sensitive
	// because it is not possible for the FTP client to send a LIST command indicating
	// that it wants the matching to be case-insensitive.
	// 
	int MGetFiles(const char *remotePattern, const char *localDir);

	// Copies all the files in the current remote FTP directory to a local directory.
	// To copy all the files in a remote directory, set remotePattern to *.* The
	// pattern can contain any number of * characters, where * matches 0 or more of any
	// character. The return value is the number of files transferred, and on error, a
	// value of -1 is returned. Detailed information about the transfer can be obtained
	// from the last-error information (LastErrorText/LastErrorHtml/LastErrorXml).
	// 
	// About case sensitivity: The MGetFiles command works by sending the LIST command
	// to the FTP server. For example: LIST *.txt . The FTP server responds with a
	// directory listing of the files matching the wildcarded pattern, and it is these
	// files that are downloaded. Case sensitivity depends on the case-sensitivity of
	// the remote file system. If the FTP server is running on a Windows-based
	// computer, it is likely to be case insensitive. However, if the FTP server is
	// running on Linux, MAC OS X, etc. it is likely to be case sensitive. There is no
	// good way to force case-insensitivity if the remote filesystem is case-sensitive
	// because it is not possible for the FTP client to send a LIST command indicating
	// that it wants the matching to be case-insensitive.
	// 
	CkTask *MGetFilesAsync(const char *remotePattern, const char *localDir);


	// Uploads all the files matching pattern on the local computer to the current
	// remote FTP directory. The pattern parameter can include directory information,
	// such as C:/my_dir/*.txt or it can simply be a pattern such as *.* that matches
	// the files in the application's current directory. Subdirectories are not
	// recursed. The return value is the number of files copied, with a value of -1
	// returned for errors. Detailed information about the transfer can be obtained
	// from the XML log.
	int MPutFiles(const char *pattern);

	// Uploads all the files matching pattern on the local computer to the current
	// remote FTP directory. The pattern parameter can include directory information,
	// such as C:/my_dir/*.txt or it can simply be a pattern such as *.* that matches
	// the files in the application's current directory. Subdirectories are not
	// recursed. The return value is the number of files copied, with a value of -1
	// returned for errors. Detailed information about the transfer can be obtained
	// from the XML log.
	CkTask *MPutFilesAsync(const char *pattern);


	// Sends an NLST command to the FTP server and returns the results in XML format.
	// The NLST command returns a list of filenames in the given directory (matching
	// the pattern). The remoteDirPattern should be a pattern such as * , *.* , *.txt ,
	// subDir/*.xml , etc.
	// 
	// The format of the XML returned is:filename_or_dir_1filename_or_dir_2filename_or_dir_3filename_or_dir_4...
	// 
	bool NlstXml(const char *remoteDirPattern, CkString &outStr);

	// Sends an NLST command to the FTP server and returns the results in XML format.
	// The NLST command returns a list of filenames in the given directory (matching
	// the pattern). The remoteDirPattern should be a pattern such as * , *.* , *.txt ,
	// subDir/*.xml , etc.
	// 
	// The format of the XML returned is:filename_or_dir_1filename_or_dir_2filename_or_dir_3filename_or_dir_4...
	// 
	const char *nlstXml(const char *remoteDirPattern);
	// Sends an NLST command to the FTP server and returns the results in XML format.
	// The NLST command returns a list of filenames in the given directory (matching
	// the pattern). The remoteDirPattern should be a pattern such as * , *.* , *.txt ,
	// subDir/*.xml , etc.
	// 
	// The format of the XML returned is:filename_or_dir_1filename_or_dir_2filename_or_dir_3filename_or_dir_4...
	// 
	CkTask *NlstXmlAsync(const char *remoteDirPattern);


	// Issues a no-op command to the FTP server.
	bool Noop(void);

	// Issues a no-op command to the FTP server.
	CkTask *NoopAsync(void);


	// Uploads a local file to the current directory on the FTP server.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	// Note: The IdleTimeoutMs property sets the maximum amount of time to wait while
	// paused during an upload because outgoing system socket buffers are full. If an
	// upload hangs with no additional data sent for this amount of time (because the
	// server is not consuming data on its end), then the upload will fail with a
	// timeout.
	// 
	bool PutFile(const char *localFilePath, const char *remoteFilePath);

	// Uploads a local file to the current directory on the FTP server.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	// Note: The IdleTimeoutMs property sets the maximum amount of time to wait while
	// paused during an upload because outgoing system socket buffers are full. If an
	// upload hangs with no additional data sent for this amount of time (because the
	// server is not consuming data on its end), then the upload will fail with a
	// timeout.
	// 
	CkTask *PutFileAsync(const char *localFilePath, const char *remoteFilePath);


	// Uploads the contents of a BinData to a remote file.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool PutFileBd(CkBinData &binData, const char *remoteFilePath);

	// Uploads the contents of a BinData to a remote file.
	// 
	// If the remoteFilePath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *PutFileBdAsync(CkBinData &binData, const char *remoteFilePath);


	// Creates a file on the remote server containing the data passed in a byte array.
	bool PutFileFromBinaryData(const char *remoteFilename, CkByteData &content);

	// Creates a file on the remote server containing the data passed in a byte array.
	CkTask *PutFileFromBinaryDataAsync(const char *remoteFilename, CkByteData &content);


	// Creates a file on the remote server containing the data passed in a string.
	bool PutFileFromTextData(const char *remoteFilename, const char *textData, const char *charset);

	// Creates a file on the remote server containing the data passed in a string.
	CkTask *PutFileFromTextDataAsync(const char *remoteFilename, const char *textData, const char *charset);


	// Uploads the contents of a StringBuilder to a remote file.
	// 
	// If the charset contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool PutFileSb(CkStringBuilder &sb, const char *charset, bool includeBom, const char *remoteFilePath);

	// Uploads the contents of a StringBuilder to a remote file.
	// 
	// If the charset contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *PutFileSbAsync(CkStringBuilder &sb, const char *charset, bool includeBom, const char *remoteFilePath);


	// Executes an FTP plan (created by the CreatePlan method) and logs each successful
	// operation to a plan log file. If a large-scale upload is interrupted, the
	// PutPlan can be resumed, skipping over the operations already listed in the plan
	// log file. When resuming an interrupted PutPlan method, use the same log file.
	// All completed operations found in the already-existing log will automatically be
	// skipped.
	bool PutPlan(const char *plan, const char *alreadyDoneFilename);

	// Executes an FTP plan (created by the CreatePlan method) and logs each successful
	// operation to a plan log file. If a large-scale upload is interrupted, the
	// PutPlan can be resumed, skipping over the operations already listed in the plan
	// log file. When resuming an interrupted PutPlan method, use the same log file.
	// All completed operations found in the already-existing log will automatically be
	// skipped.
	CkTask *PutPlanAsync(const char *plan, const char *alreadyDoneFilename);


	// Uploads an entire directory tree from the local filesystem to the remote FTP
	// server, recreating the directory tree on the server. The PutTree method copies a
	// directory tree to the current remote directory on the FTP server.
	bool PutTree(const char *localDir);

	// Uploads an entire directory tree from the local filesystem to the remote FTP
	// server, recreating the directory tree on the server. The PutTree method copies a
	// directory tree to the current remote directory on the FTP server.
	CkTask *PutTreeAsync(const char *localDir);


	// Sends an arbitrary (raw) command to the FTP server.
	bool Quote(const char *cmd);

	// Sends an arbitrary (raw) command to the FTP server.
	CkTask *QuoteAsync(const char *cmd);


	// Removes a directory from the FTP server.
	// 
	// If the remoteDirPath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	bool RemoveRemoteDir(const char *remoteDirPath);

	// Removes a directory from the FTP server.
	// 
	// If the remoteDirPath contains non-English characters, it may be necessary to set the
	// DirListingCharset property equal to utf-8 . Please refer to the documentation
	// for the DirListingCharset property.
	// 
	CkTask *RemoveRemoteDirAsync(const char *remoteDirPath);


	// Renames a file or directory on the FTP server. To move a file from one directory
	// to another on a remote FTP server, call this method and include the source and
	// destination directory filepath.
	// 
	// If the existingRemoteFilePath or newRemoteFilePath contains non-English characters, it may be necessary to set
	// the DirListingCharset property equal to utf-8 . Please refer to the
	// documentation for the DirListingCharset property.
	// 
	bool RenameRemoteFile(const char *existingRemoteFilePath, const char *newRemoteFilePath);

	// Renames a file or directory on the FTP server. To move a file from one directory
	// to another on a remote FTP server, call this method and include the source and
	// destination directory filepath.
	// 
	// If the existingRemoteFilePath or newRemoteFilePath contains non-English characters, it may be necessary to set
	// the DirListingCharset property equal to utf-8 . Please refer to the
	// documentation for the DirListingCharset property.
	// 
	CkTask *RenameRemoteFileAsync(const char *existingRemoteFilePath, const char *newRemoteFilePath);


	// Sends an raw command to the FTP server and returns the raw response.
	bool SendCommand(const char *cmd, CkString &outReply);

	// Sends an raw command to the FTP server and returns the raw response.
	const char *sendCommand(const char *cmd);
	// Sends an raw command to the FTP server and returns the raw response.
	CkTask *SendCommandAsync(const char *cmd);


	// Chilkat FTP2 supports MODE Z, which is a transfer mode implemented by some FTP
	// servers. It allows for files to be uploaded and downloaded using compressed
	// streams (using the zlib deflate algorithm).
	// 
	// Call this method after connecting to enable Mode Z. Once enabled, all transfers
	// (uploads, downloads, and directory listings) are compressed.
	// 
	bool SetModeZ(void);

	// Chilkat FTP2 supports MODE Z, which is a transfer mode implemented by some FTP
	// servers. It allows for files to be uploaded and downloaded using compressed
	// streams (using the zlib deflate algorithm).
	// 
	// Call this method after connecting to enable Mode Z. Once enabled, all transfers
	// (uploads, downloads, and directory listings) are compressed.
	// 
	CkTask *SetModeZAsync(void);


	// Used in conjunction with the DownloadTree method. Call this method prior to
	// calling DownloadTree to set the oldest date for a file to be downloaded. When
	// DownloadTree is called, any file older than this date will not be downloaded.
	// 
	// The oldestDateTimeStr should be a date/time string in RFC822 format, such as Tue, 25 Sep 2012
	// 12:25:32 -0500 .
	// 
	void SetOldestDateStr(const char *oldestDateTimeStr);


	// This is a general purpose method to set miscellaneous options that might arise
	// due to buggy or quirky FTP servers. The option is a string describing the option.
	// The current list of possible options are:
	//     * Microsoft-TLS-1.2-Workaround -- This is to force the data connection to
	//     use TLS 1.0 instead of the default. It works around the Microsoft FTP server bug
	//     found here: https://support.microsoft.com/en-us/kb/2888853
	// 
	// To turn off an option, prepend the string No- . For example
	// No-Microsoft-TLS-1.2-Workaround . All options are turned off by default.
	// 
	bool SetOption(const char *option);


	// Sets the password in a more secure way than setting the Password property.
	// Calling this method is the equivalent of setting the Password property.
	// 
	// Note: Starting in v9.5.0.76, this method has been copied to SetSecurePassword.
	// Applications should call SetSecurePassword instead because this method is now
	// deprecated.
	// 
	bool SetPassword(CkSecureString &password);


	// Sets the last-modified date/time of a file on the FTP server. The dateTimeStr should be
	// a date/time string in RFC822 format, such as Tue, 25 Sep 2012 12:25:32 -0500 .
	// 
	// Important: Not all FTP servers support this functionality. Please see the
	// information at the Chilkat blog below:
	// 
	bool SetRemoteFileDateTimeStr(const char *dateTimeStr, const char *remoteFilename);

	// Sets the last-modified date/time of a file on the FTP server. The dateTimeStr should be
	// a date/time string in RFC822 format, such as Tue, 25 Sep 2012 12:25:32 -0500 .
	// 
	// Important: Not all FTP servers support this functionality. Please see the
	// information at the Chilkat blog below:
	// 
	CkTask *SetRemoteFileDateTimeStrAsync(const char *dateTimeStr, const char *remoteFilename);


	// Sets the last-modified date/time of a file on the FTP server. Important: Not all
	// FTP servers support this functionality. Please see the information at the
	// Chilkat blog below:
	bool SetRemoteFileDt(CkDateTime &dt, const char *remoteFilename);

	// Sets the last-modified date/time of a file on the FTP server. Important: Not all
	// FTP servers support this functionality. Please see the information at the
	// Chilkat blog below:
	CkTask *SetRemoteFileDtAsync(CkDateTime &dt, const char *remoteFilename);


	// Sets the password in a more secure way than setting the Password property.
	// Calling this method is the equivalent of setting the Password property.
	bool SetSecurePassword(CkSecureString &password);


	// Enforces a requirement on the server's certificate. The reqName can be one of the
	// following:
	//     * SubjectDN
	//     * SubjectCN
	//     * IssuerDN
	//     * IssuerCN
	//     * SAN (added in v9.5.0.84)
	// 
	// The reqName specifies the part of the certificate, and the reqValue is the value that
	// it must match exactly or with a wildcard (*). If the server's certificate does
	// not match, the SSL / TLS connection is aborted.
	// 
	void SetSslCertRequirement(const char *reqName, const char *reqValue);


	// Allows for a client-side certificate to be used for the SSL / TLS connection.
	bool SetSslClientCert(CkCert &cert);


	// Allows for a client-side certificate to be used for the SSL / TLS connection. If
	// the PEM requires no password, pass an empty string in pemPassword. If the PEM is in a
	// file, pass the path to the file in pemDataOrFilename. If the PEM is already loaded into a
	// string variable, then pass the string containing the contents of the PEM in
	// pemDataOrFilename.
	bool SetSslClientCertPem(const char *pemDataOrFilename, const char *pemPassword);


	// Allows for a client-side certificate to be used for the SSL / TLS connection.
	bool SetSslClientCertPfx(const char *pfxFilename, const char *pfxPassword);


	// Set the FTP transfer mode to us-ascii.
	bool SetTypeAscii(void);

	// Set the FTP transfer mode to us-ascii.
	CkTask *SetTypeAsciiAsync(void);


	// Set the FTP transfer mode to binary.
	bool SetTypeBinary(void);

	// Set the FTP transfer mode to binary.
	CkTask *SetTypeBinaryAsync(void);


	// Sends an arbitrary site command to the FTP server. The params argument should
	// contain the parameters to the site command as they would appear on a command
	// line. For example: recfm=fb lrecl=600 .
	bool Site(const char *siteCommand);

	// Sends an arbitrary site command to the FTP server. The params argument should
	// contain the parameters to the site command as they would appear on a command
	// line. For example: recfm=fb lrecl=600 .
	CkTask *SiteAsync(const char *siteCommand);


	// Causes the calling process to sleep for a number of milliseconds.
	void SleepMs(int millisec);


	// Sends a STAT command to the FTP server and returns the server's reply.
	bool Stat(CkString &outStr);

	// Sends a STAT command to the FTP server and returns the server's reply.
	const char *ck_stat(void);
	// Sends a STAT command to the FTP server and returns the server's reply.
	CkTask *StatAsync(void);


	// Delete remote files that do not exist locally. The remote directory tree rooted
	// at the current remote directory is traversed and remote files that have no
	// corresponding local file are deleted.
	// 
	// Note: In v9.5.0.51 and higher, the list of deleted files is available in the
	// SyncedFiles property.
	// 
	bool SyncDeleteRemote(const char *localRoot);

	// Delete remote files that do not exist locally. The remote directory tree rooted
	// at the current remote directory is traversed and remote files that have no
	// corresponding local file are deleted.
	// 
	// Note: In v9.5.0.51 and higher, the list of deleted files is available in the
	// SyncedFiles property.
	// 
	CkTask *SyncDeleteRemoteAsync(const char *localRoot);


	// The same as SyncLocalTree, except the sub-directories are not traversed. The
	// files in the current remote directory are synchronized (downloaded) with the
	// files in localRoot. For possible mode settings, see SyncLocalTree.
	// 
	// Note: In v9.5.0.51 and higher, the list of downloaded files is available in the
	// SyncedFiles property.
	// 
	bool SyncLocalDir(const char *localRoot, int mode);

	// The same as SyncLocalTree, except the sub-directories are not traversed. The
	// files in the current remote directory are synchronized (downloaded) with the
	// files in localRoot. For possible mode settings, see SyncLocalTree.
	// 
	// Note: In v9.5.0.51 and higher, the list of downloaded files is available in the
	// SyncedFiles property.
	// 
	CkTask *SyncLocalDirAsync(const char *localRoot, int mode);


	// Downloads files from the FTP server to a local directory tree. Synchronization
	// modes include:
	// 
	//     mode=0: Download all files
	//     mode=1: Download all files that do not exist on the local filesystem.
	//     mode=2: Download newer or non-existant files.
	//     mode=3: Download only newer files. If a file does not already exist on the
	//     local filesystem, it is not downloaded from the server.
	//     mode=5: Download only missing files or files with size differences.
	//     mode=6: Same as mode 5, but also download newer files.
	//     mode=99: Do not download files, but instead delete remote files that do not
	//     exist locally.
	//     * There is no mode #4. It is a mode used internally by the DirTreeXml
	//     method.
	//      
	// 
	// Note: In v9.5.0.51 and higher, the list of downloaded (or deleted) files is
	// available in the SyncedFiles property.
	// 
	bool SyncLocalTree(const char *localRoot, int mode);

	// Downloads files from the FTP server to a local directory tree. Synchronization
	// modes include:
	// 
	//     mode=0: Download all files
	//     mode=1: Download all files that do not exist on the local filesystem.
	//     mode=2: Download newer or non-existant files.
	//     mode=3: Download only newer files. If a file does not already exist on the
	//     local filesystem, it is not downloaded from the server.
	//     mode=5: Download only missing files or files with size differences.
	//     mode=6: Same as mode 5, but also download newer files.
	//     mode=99: Do not download files, but instead delete remote files that do not
	//     exist locally.
	//     * There is no mode #4. It is a mode used internally by the DirTreeXml
	//     method.
	//      
	// 
	// Note: In v9.5.0.51 and higher, the list of downloaded (or deleted) files is
	// available in the SyncedFiles property.
	// 
	CkTask *SyncLocalTreeAsync(const char *localRoot, int mode);


	// Uploads a directory tree from the local filesystem to the FTP server.
	// Synchronization modes include:
	// 
	//     mode=0: Upload all files
	//     mode=1: Upload all files that do not exist on the FTP server.
	//     mode=2: Upload newer or non-existant files.
	//     mode=3: Upload only newer files. If a file does not already exist on the FTP
	//     server, it is not uploaded.
	//     mode=4: transfer missing files or files with size differences.
	//     mode=5: same as mode 4, but also newer files.
	// 
	// Note: In v9.5.0.51 and higher, the list of uploaded files is available in the
	// SyncedFiles property.
	// 
	bool SyncRemoteTree(const char *localRoot, int mode);

	// Uploads a directory tree from the local filesystem to the FTP server.
	// Synchronization modes include:
	// 
	//     mode=0: Upload all files
	//     mode=1: Upload all files that do not exist on the FTP server.
	//     mode=2: Upload newer or non-existant files.
	//     mode=3: Upload only newer files. If a file does not already exist on the FTP
	//     server, it is not uploaded.
	//     mode=4: transfer missing files or files with size differences.
	//     mode=5: same as mode 4, but also newer files.
	// 
	// Note: In v9.5.0.51 and higher, the list of uploaded files is available in the
	// SyncedFiles property.
	// 
	CkTask *SyncRemoteTreeAsync(const char *localRoot, int mode);


	// Same as SyncRemoteTree, except two extra arguments are added to allow for more
	// flexibility. If bDescend is false, then the directory tree is not descended and
	// only the files in localDirPath are synchronized. If bPreviewOnly is true then no files are
	// transferred and instead the files that would've been transferred (had bPreviewOnly been
	// set to false) are listed in the SyncPreview property.
	// 
	// Note: If bPreviewOnly is set to true, the remote directories (if they do not exist)
	// are created. It is only the files that are not uploaded.
	// 
	// Note: In v9.5.0.51 and higher, the list of uploaded files is available in the
	// SyncedFiles property.
	// 
	bool SyncRemoteTree2(const char *localDirPath, int mode, bool bDescend, bool bPreviewOnly);

	// Same as SyncRemoteTree, except two extra arguments are added to allow for more
	// flexibility. If bDescend is false, then the directory tree is not descended and
	// only the files in localDirPath are synchronized. If bPreviewOnly is true then no files are
	// transferred and instead the files that would've been transferred (had bPreviewOnly been
	// set to false) are listed in the SyncPreview property.
	// 
	// Note: If bPreviewOnly is set to true, the remote directories (if they do not exist)
	// are created. It is only the files that are not uploaded.
	// 
	// Note: In v9.5.0.51 and higher, the list of uploaded files is available in the
	// SyncedFiles property.
	// 
	CkTask *SyncRemoteTree2Async(const char *localDirPath, int mode, bool bDescend, bool bPreviewOnly);


	// Sends a SYST command to the FTP server to find out the type of operating system
	// at the server. The method returns the FTP server's response string. Refer to RFC
	// 959 for details.
	bool Syst(CkString &outStr);

	// Sends a SYST command to the FTP server to find out the type of operating system
	// at the server. The method returns the FTP server's response string. Refer to RFC
	// 959 for details.
	const char *syst(void);
	// Sends a SYST command to the FTP server to find out the type of operating system
	// at the server. The method returns the FTP server's response string. Refer to RFC
	// 959 for details.
	CkTask *SystAsync(void);






	// END PUBLIC INTERFACE


};
#if !defined(__sun__) && !defined(__sun)
#pragma pack (pop)
#endif
	
#endif
