Chilkat Event Callbacks in the "C" Programming Language
This example illustrates how to implement standard event callback functions for the Chilkat C
API. All Chilkat classes
with events use the standard callbacks shown below: AbortCheck
, PercentDone
, and ProgressInfo
. While this example focuses on callbacks for an SFTP download, the same method applies to other Chilkat C
APIs like Http, Ftp2, MailMan, and Rest.
#include <stdio.h>
#include <C_CkSFtp.h>
BOOL myAbortCheck()
{
// To abort the current Chilkat method call, return non-zero.
return 0;
}
BOOL myPercentDone(int pctDone)
{
printf("Percent Done: %d\n",pctDone);
// To abort the current Chilkat method call, return non-zero.
return 0;
}
void myProgressInfo(const char *name, const char *value)
{
printf("%s: %s\n",name,value);
}
void ChilkatSample(void)
{
HCkSFtp sftp;
BOOL success;
int port;
const char *hostname;
const char *handle;
// Declare event callbacks.
BOOL (*fnAbortCheck)() = myAbortCheck;
BOOL (*fnPercentDone)(int pctDone) = myPercentDone;
void (*fnProgressInfo)(const char *name, const char *value) = myProgressInfo;
sftp = CkSFtp_Create();
// Setup event callbacks.
CkSFtp_setAbortCheck(sftp, fnAbortCheck);
CkSFtp_setPercentDone(sftp, fnPercentDone);
CkSFtp_setProgressInfo(sftp, fnProgressInfo);
// Make sure to set a HeartbeatMs for AbortCheck / PercentDone callbacks..
// Set the HeartbeatMs to 250 milliseconds.
CkSFtp_putHeartbeatMs(sftp,250);
// Set some timeouts, in milliseconds:
CkSFtp_putConnectTimeoutMs(sftp,5000);
CkSFtp_putIdleTimeoutMs(sftp,10000);
// Connect to the SSH server.
// The standard SSH port = 22
// The hostname may be a hostname or IP address.
hostname = "sftp.example.com";
port = 22;
success = CkSFtp_Connect(sftp,hostname,port);
if (success != TRUE) {
printf("%s\n",CkSFtp_lastErrorText(sftp));
CkSFtp_Dispose(sftp);
return;
}
// Authenticate with the SSH server. Chilkat SFTP supports
// both password-based authenication as well as public-key
// authentication. This example uses password authenication.
success = CkSFtp_AuthenticatePw(sftp,"myLogin","myPassword");
if (success != TRUE) {
printf("%s\n",CkSFtp_lastErrorText(sftp));
CkSFtp_Dispose(sftp);
return;
}
// After authenticating, the SFTP subsystem must be initialized:
success = CkSFtp_InitializeSftp(sftp);
if (success != TRUE) {
printf("%s\n",CkSFtp_lastErrorText(sftp));
CkSFtp_Dispose(sftp);
return;
}
// Open a file on the server:
handle = CkSFtp_openFile(sftp,"hamlet.xml","readOnly","openExisting");
if (CkSFtp_getLastMethodSuccess(sftp) != TRUE) {
printf("%s\n",CkSFtp_lastErrorText(sftp));
CkSFtp_Dispose(sftp);
return;
}
// Download the file:
success = CkSFtp_DownloadFile(sftp,handle,"c:/temp/hamlet.xml");
if (success != TRUE) {
printf("%s\n",CkSFtp_lastErrorText(sftp));
CkSFtp_Dispose(sftp);
return;
}
// Close the file.
success = CkSFtp_CloseHandle(sftp,handle);
if (success != TRUE) {
printf("%s\n",CkSFtp_lastErrorText(sftp));
CkSFtp_Dispose(sftp);
return;
}
printf("Success.\n");
CkSFtp_Dispose(sftp);
}
int main()
{
ChilkatSample();
return 0;
}