La aplicación Sync Client C/C++ de ejemplo

El ejemplo siguiente ilustra cómo utilizar un número seleccionado de funciones de la API de DB2 Everyplace Sync Client para crear una aplicación. Puede encontrar más ejemplos de código fuente en \DB2e\Clients\clientapisample\C_API.

/******************************************************************/
/**
 * Esta función define la función de escucha de la sincronización.
 * Vea isyncore.h para obtener más información.
 * parámetro: listenerData, datos personales del usuario.
 * parámetro: suceso, objeto de suceso
 * parámetro: pExtraInfo (reservado)
 * devolución: entero, si el tipo de suceso es ISCEVTTYPE_Retry:
 *   . ISCRTNCB_ReplyYes    : reintentar menos de 3 veces
 *   . ISCRTNCB_ReplyNo     : reintentar 3 o más veces
 *     si el tipo de suceso es ISCEVTTYPE_Info:
 *   . ISCRTNCB_Done
 *     si tipo suceso es ISCEVTTYPE_Query y código suceso es ISCEVT_QueLogin:
 *   . ISCRTNCB_Done        : nombusuario y contraseña entrados correctamente
 *   . ISCRTNCB_Default     : nombusuario y contraseña no entrados
 *     otros (ISCEVTTYPE_Fatal, ISCEVTTYPE_Error, ISCEVTTYPE_Query
 *            e ISCEVTTYPE_Conflict)
 *   . ISCRTNCB_Default     : emprender la acción por omisión
 **/
static isy_INT32 syncListener(
       isy_UINT32 listenerData,
       ISCEVT    *event,
       isy_VOID  *pExtraInfo)
{
    // appEventCodeToMessage es alguna función de usuario para correlacionar
    // un suceso con algún mensaje descriptivo del suceso
    char *statusMsg = appEventCodeToMessage(event);
    int   timesRetried;
 
    switch (event->type) {
        case ISCEVTTYPE_Fatal:
        case ISCEVTTYPE_Error:
            printf("Error: %s\n", statusMsg);
            return ISCRTNCB_Default ;
 
        case ISCEVTTYPE_Retry:
            timesRetried = event->retry;
            if (timesRetried >= 3)
                return ISCRTNCB_ReplyNo;
            else {
                char ans;
                printf("%s [Y/N] ", statusMsg);
                ans = getchar();
                getchar();
                if(tolower(ans) == 'y')
                        return ISCRTNCB_ReplyYes;
                else
                        return ISCRTNCB_ReplyNo;
            }
 
        case ISCEVTTYPE_Info:
            switch (event->code) {
                case ISCEVT_InfSucceeded:
                case ISCEVT_InfFailed:
                case ISCEVT_InfCanceled:
                    printf("Conclusion: %s\n", statusMsg);
                    break;
                case ISCEVT_InfGeneral:
                case ISCEVT_InfCancelingSync:
                case ISCEVT_InfPrepMsg:
                case ISCEVT_InfSendMsg:
                case ISCEVT_InfWaitMsg:
                case ISCEVT_InfApplyMsg:
                    printf("Status: %s\n", statusMsg);
                    break;
                default: // ignorar otro código de suceso
                    break;
            } // switch (event->code)
            return ISCRTNCB_Done;
 
        case ISCEVTTYPE_Query:
            if (event->code == ISCEVT_QueLogin) {
                ISCLISTENARG *args = event->info;
                isy_TCHAR *target = args->argv[0];
                // Es sólo un ejemplo, no pretende estar libre de fugas de memoria.
                  isy_TCHAR *username = (isy_TCHAR *) calloc(18, sizeof(isy_TCHAR));
                  isy_TCHAR *password = (isy_TCHAR *) calloc(254, sizeof(isy_TCHAR));
							char c;
                		int  i;
 
                printf("Query on target data(%s): %s ...\n", target, statusMsg);
                // Solicitar el nombre de usuario
                printf("Username: ");
                for(i = 0; (c = getchar()) != '\n'; i++) username[i] = c;
                username[i] = '\0';
                if (i == 0) return ISCRTNCB_Default; // nombusuario no entrado
                // Solicitar la contraseña
                printf("Password: ");
                for(i = 0; (c = getchar()) != '\n'; i++) password[i] = c;
                password[i] = '\0';
						args->argv[1] = username;
                  args->argv[2] = password;
               return ISCRTNCB_Done;
            }
            return ISCRTNCB_Default;
 
        // todos los otros tipos de suceso no importan
        default:
            return ISCRTNCB_Default;
    } // switch (event->type)
}
 
// Ejemplo de SyncClient
main()
{
    isy_TCHAR user[]     = isy_T("usuario1");
    isy_TCHAR password[] = isy_T("contraeña");
    HISCSERV  hServ;
    HISCCONF  hConf;
    HISCENG   hEngine;
    isy_INT32 rc;
 
    rc = iscConfigOpen(hServ, isy_T(".\isyncPath"), &hConf;); 
    rc = iscEngineOpen(hConf, &hEngine;);
    iscEngineSetListener(hEngine, syncListener, NULL);
 
    iscEngineSyncConfig(hEngine); // obtener primero la configuración
    iscConfigEnableSubsSet(hConf, NULL); // habilitar todos conj. suscripción
    rc = iscEngineSync(hEngine); // sincronizar config + conjuntos suscripción
 
    if (rc == ISCRTN_Failed) {
        HISCCSR   hCursor;
        isy_TCHAR  id[ISCLEN_SubsSetID];
        isy_TCHAR  name[ISCLEN_SubsSetName];
        isy_INT32  enabled;
 
        iscConfigOpenCursor(hConf, &hCursor;);
        while (iscConfigGetNextSubsSet(hConf, hCursor, id, name)
               == ISCRTN_Succeeded) {
            enabled = iscConfigSubsSetIsEnable(hConf, id);
            if (enabled != ISCRTN_True) continue; // olvidar los que se han
                                                  // inhabilitado
            rc = iscConfigGetSubsSetStatus(hConf, id);
            if (rc != ISCRTN_Succeeded)
// En ese caso, la aplicación puede tener cierto código que
// procese los conjuntos de suscripción no satisfactorios aquí.
// Para inhabilitar el conjunto de suscripciones, llame a:
 
                iscConfigDisableSubsSet(hConf, id);
        }
        iscConfigCloseCursor(hConf, hCursor);
        rc = iscEngineSync(hEngine); // sincronizar config + conjuntos suscripción
    }
    // cerrar todos los descriptores
    iscEngineClose(hEngine);
    iscConfigClose(hConf);
    iscServiceClose(hServ);
} // principal
 

Tareas relacionadas

Consulta relacionada