Sample code for 30+ languages & platforms
Tcl

Async Methods Returning an Object

See more Async Examples

Demonstrates how to call an asynchronous method that returns an object. This example reads email from a POP3 server using the Async versions of the Chilkat methods.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

# This example assumes the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.

set success 0

set mailman [new_CkMailMan]

# Set the POP3 server's hostname
CkMailMan_put_MailHost $mailman "pop.example.com"

# Set the POP3 login/password and any other requirements..
CkMailMan_put_PopUsername $mailman "myLogin"
CkMailMan_put_PopPassword $mailman "myPassword"
CkMailMan_put_PopSsl $mailman 1
CkMailMan_put_MailPort $mailman 995

# Connect to the POP3 server:
# task is a CkTask
set task [CkMailMan_Pop3BeginSessionAsync $mailman]
if {[CkMailMan_get_LastMethodSuccess $mailman] == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    exit
}

# Start the background task.
set success [CkTask_Run $task]
if {!$success} then {
    puts [CkTask_lastErrorText $task]
    delete_CkTask $task

    delete_CkMailMan $mailman
    exit
}

# Wait for the POP3 connect task to finish.
# The 1/0 returned by Wait applies to the Wait method call, not the task.
set maxWaitMs 30000
set success [CkTask_Wait $task $maxWaitMs]
if {expr !$success  ||  [expr [[CkTask_get_StatusInt $task] != 7]  ||  [[CkTask_get_TaskSuccess $task] != 1]]} then {
    if {!$success} then {
        # The task.LastErrorText applies to the Wait method call.
        puts [CkTask_lastErrorText $task]
    }     else {
        # The ResultErrorText applies to the underlying task method call (i.e. the Pop3BeginSession)
        puts [CkTask_status $task]
        puts [CkTask_resultErrorText $task]
    }

    delete_CkTask $task

    delete_CkMailMan $mailman
    exit
}

delete_CkTask $task

# Get the number of messages in the mailbox.
set task [CkMailMan_GetMailboxCountAsync $mailman]

# To keep the example short, we'll skip handling failures.
# The failures would be handled in the same way as shown above.

set success [CkTask_Run $task]
set success [CkTask_Wait $task $maxWaitMs]
set numMessages [CkTask_GetResultInt $task]
delete_CkTask $task

if {$numMessages == 0} then {
    delete_CkMailMan $mailman
    exit
}

set email [new_CkEmail]

for {set i 1} {$i <= $numMessages} {incr i} {

    set task [CkMailMan_FetchByMsgnumAsync $mailman $i]
    if {[CkMailMan_get_LastMethodSuccess $mailman] == 0} then {
        puts [CkMailMan_lastErrorText $mailman]
        delete_CkMailMan $mailman
        delete_CkEmail $email
        exit
    }

    set success [CkTask_Run $task]
    set success [CkTask_Wait $task $maxWaitMs]
    if {expr !$success  ||  [expr [[CkTask_get_StatusInt $task] != 7]  ||  [[CkTask_get_TaskSuccess $task] != 1]]} then {
        if {!$success} then {
            # The task.LastErrorText applies to the Wait method call.
            puts [CkTask_lastErrorText $task]
        }         else {
            # The ResultErrorText applies to the underlying task method call (i.e. the FetchByMsgnum)
            puts [CkTask_status $task]
            puts [CkTask_resultErrorText $task]
        }

        delete_CkTask $task

        delete_CkMailMan $mailman
        delete_CkEmail $email
        exit
    }

    # Each Chilkat object that can be a return value of an asynchronous task will
    # have a method named LoadTaskResult.  The object returned in the underlying
    # asynchronous method call is retrieved by calling LoadTaskResult. 

    # To say it another way: The application will provide a pre-existing object of
    # the desired return type (in this case it is an email object).  This object is
    # loaded by calling LoadTaskResult.  

    set success [CkEmail_LoadTaskResult $email $task]
    delete_CkTask $task

    if {!$success} then {
        puts [CkEmail_lastErrorText $email]
        delete_CkMailMan $mailman
        delete_CkEmail $email
        exit
    }     else {
        puts [CkEmail_from $email]: [CkEmail_subject $email]\n
    }

}

delete_CkMailMan $mailman
delete_CkEmail $email