Chilkat Event Callbacks in Unicode (wchar_t) "C"

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.

#include <stdio.h>
#include <C_CkSFtpW.h>

BOOL myAbortCheckW()
    {
    // To abort the current Chilkat method call, return non-zero.
    return 0;
    }

BOOL myPercentDoneW(int pctDone)
    {
    printf("Percent Done: %d\n",pctDone);

    // To abort the current Chilkat method call, return non-zero.
    return 0;
    }

void myProgressInfoW(const wchar_t *name, const wchar_t *value)
    {
    wprintf(L"%ls: %ls\n",name,value);
    }

void ChilkatSampleW(void)
    {
    HCkSFtpW sftp;
    BOOL success;
    int port;
    const wchar_t *hostname;
    const wchar_t *handle;

    // Declare event callbacks.
    BOOL (*fnAbortCheckW)() = myAbortCheckW;
    BOOL (*fnPercentDoneW)(int pctDone) = myPercentDoneW;
    void (*fnProgressInfoW)(const wchar_t *name, const wchar_t *value) = myProgressInfoW;

    sftp = CkSFtpW_Create();

    // Setup event callbacks.
    CkSFtpW_setAbortCheck(sftp, fnAbortCheckW);
    CkSFtpW_setPercentDone(sftp, fnPercentDoneW);
    CkSFtpW_setProgressInfo(sftp, fnProgressInfoW);

    // Make sure to set a HeartbeatMs for AbortCheck / PercentDone callbacks..
    // Set the HeartbeatMs to 250 milliseconds.
    CkSFtpW_putHeartbeatMs(sftp,250);

    //  Set some timeouts, in milliseconds:
    CkSFtpW_putConnectTimeoutMs(sftp,5000);
    CkSFtpW_putIdleTimeoutMs(sftp,10000);

    //  Connect to the SSH server.
    //  The standard SSH port = 22
    //  The hostname may be a hostname or IP address.

    hostname = L"sftp.example.com";
    port = 22;
    success = CkSFtpW_Connect(sftp,hostname,port);
    if (success != TRUE) {
        wprintf(L"l%s\n",CkSFtpW_lastErrorText(sftp));
        CkSFtpW_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 = CkSFtpW_AuthenticatePw(sftp,L"myLogin",L"myPassword");
    if (success != TRUE) {
        wprintf(L"l%s\n",CkSFtpW_lastErrorText(sftp));
        CkSFtpW_Dispose(sftp);
        return;
    }

    //  After authenticating, the SFTP subsystem must be initialized:
    success = CkSFtpW_InitializeSftp(sftp);
    if (success != TRUE) {
        wprintf(L"l%s\n",CkSFtpW_lastErrorText(sftp));
        CkSFtpW_Dispose(sftp);
        return;
    }

    //  Open a file on the server:
    handle = CkSFtpW_openFile(sftp,L"hamlet.xml",L"readOnly",L"openExisting");
    if (CkSFtpW_getLastMethodSuccess(sftp) != TRUE) {
        wprintf(L"l%s\n",CkSFtpW_lastErrorText(sftp));
        CkSFtpW_Dispose(sftp);
        return;
    }

    //  Download the file:
    success = CkSFtpW_DownloadFile(sftp,handle,L"c:/temp/hamlet.xml");
    if (success != TRUE) {
        wprintf(L"l%s\n",CkSFtpW_lastErrorText(sftp));
        CkSFtpW_Dispose(sftp);
        return;
    }

    //  Close the file.
    success = CkSFtpW_CloseHandle(sftp,handle);
    if (success != TRUE) {
        wprintf(L"l%s\n",CkSFtpW_lastErrorText(sftp));
        CkSFtpW_Dispose(sftp);
        return;
    }

    wprintf(L"Success.\n");

    CkSFtpW_Dispose(sftp);
    }

int main()
{
  ChilkatSampleW();
  return 0;
}