Sample code for 30+ languages & platforms
PureBasic

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 PureBasic Downloads

PureBasic
IncludeFile "CkTask.pb"
IncludeFile "CkEmail.pb"
IncludeFile "CkMailMan.pb"

Procedure ChilkatExample()

    success.i = 0

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

    success = 0

    mailman.i = CkMailMan::ckCreate()
    If mailman.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Set the POP3 server's hostname
    CkMailMan::setCkMailHost(mailman, "pop.example.com")

    ; Set the POP3 login/password and any other requirements..
    CkMailMan::setCkPopUsername(mailman, "myLogin")
    CkMailMan::setCkPopPassword(mailman, "myPassword")
    CkMailMan::setCkPopSsl(mailman, 1)
    CkMailMan::setCkMailPort(mailman, 995)

    ; Connect to the POP3 server:
    task.i = CkMailMan::ckPop3BeginSessionAsync(mailman)
    If CkMailMan::ckLastMethodSuccess(mailman) = 0
        Debug CkMailMan::ckLastErrorText(mailman)
        CkMailMan::ckDispose(mailman)
        ProcedureReturn
    EndIf

    ; Start the background task.
    success = CkTask::ckRun(task)
    If Not success
        Debug CkTask::ckLastErrorText(task)
        CkTask::ckDispose(task)

        CkMailMan::ckDispose(mailman)
        ProcedureReturn
    EndIf

    ; Wait for the POP3 connect task to finish.
    ; The 1/0 returned by Wait applies to the Wait method call, not the task.
    maxWaitMs.i = 30000
    success = CkTask::ckWait(task,maxWaitMs)
    If Not success OR (CkTask::ckStatusInt(task) <> 7) OR (CkTask::ckTaskSuccess(task) <> 1)
        If Not success
            ; The task.LastErrorText applies to the Wait method call.
            Debug CkTask::ckLastErrorText(task)
        Else
            ; The ResultErrorText applies to the underlying task method call (i.e. the Pop3BeginSession)
            Debug CkTask::ckStatus(task)
            Debug CkTask::ckResultErrorText(task)
        EndIf

        CkTask::ckDispose(task)

        CkMailMan::ckDispose(mailman)
        ProcedureReturn
    EndIf

    CkTask::ckDispose(task)

    ; Get the number of messages in the mailbox.
    task = CkMailMan::ckGetMailboxCountAsync(mailman)

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

    success = CkTask::ckRun(task)
    success = CkTask::ckWait(task,maxWaitMs)
    numMessages.i = CkTask::ckGetResultInt(task)
    CkTask::ckDispose(task)

    If numMessages = 0
        CkMailMan::ckDispose(mailman)
        ProcedureReturn
    EndIf

    email.i = CkEmail::ckCreate()
    If email.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    i.i
    For i = 1 To numMessages

        task = CkMailMan::ckFetchByMsgnumAsync(mailman,i)
        If CkMailMan::ckLastMethodSuccess(mailman) = 0
            Debug CkMailMan::ckLastErrorText(mailman)
            CkMailMan::ckDispose(mailman)
            CkEmail::ckDispose(email)
            ProcedureReturn
        EndIf

        success = CkTask::ckRun(task)
        success = CkTask::ckWait(task,maxWaitMs)
        If Not success OR (CkTask::ckStatusInt(task) <> 7) OR (CkTask::ckTaskSuccess(task) <> 1)
            If Not success
                ; The task.LastErrorText applies to the Wait method call.
                Debug CkTask::ckLastErrorText(task)
            Else
                ; The ResultErrorText applies to the underlying task method call (i.e. the FetchByMsgnum)
                Debug CkTask::ckStatus(task)
                Debug CkTask::ckResultErrorText(task)
            EndIf

            CkTask::ckDispose(task)

            CkMailMan::ckDispose(mailman)
            CkEmail::ckDispose(email)
            ProcedureReturn
        EndIf

        ; 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.  

        success = CkEmail::ckLoadTaskResult(email,task)
        CkTask::ckDispose(task)

        If Not success
            Debug CkEmail::ckLastErrorText(email)
            CkMailMan::ckDispose(mailman)
            CkEmail::ckDispose(email)
            ProcedureReturn
        Else
            Debug CkEmail::ckFrom(email) + ": " + CkEmail::ckSubject(email) + Chr(10)
        EndIf

    Next


    CkMailMan::ckDispose(mailman)
    CkEmail::ckDispose(email)


    ProcedureReturn
EndProcedure