2. Función de empaquetamiento de estructuras

Como vemos la función smpp34_pack( ... ) toma cinco parámetros y retorna un valor entero que describe el resultado de la operación. Un valor distinto de 0 en el retorno, indica que hubo un error en el intento de empaquetado, luego hay una descripción en modo texto en la variable global smpp34_strerror.

extern int smpp34_errno;
extern char smpp34_strerror[2048];

int smpp34_pack( uint32_t type,    /* in  */
                 uint8_t *ptrBuf,  /* out */
                 int      ptrSize, /* out */
                 int     *ptrLen,  /* out */
                 void    *tt       /* in  */  )
    
Donde:

type: es el command_id del PDU que se quiere empacar, el valor de este parámetro está directamente relacionado a una estructura de datos especifica.

ptrBuf: es un puntero a un buffer, donde va a almacenarse el PDU empacado. La memoria debe ser reservada de manera externa, ya sea dinámica o estática.

ptrSize: es un entero que describe el largo del buffer destino (el parámetro anterior).

ptrLen: en caso de éxito en la llamada, en esta variable queda el largo de la data dentro del buffer. Obviamente, siempre ptrLen < ptrSize.

tt: Es un puntero a una de las estructuras de datos listadas en la introducción y que se corresponde con el valor del primer parámetro.

2.1. Ejemplo de uso

Se detalla a continuación un pequeño ejemplo de uso, en el mismo, se detalla la creación del objeto de dato, la carga de información en la estructura, y el empaquetamiento de la misma.

Ejemplo 1. Ejemplo de pack y dumpBuff.

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <netinet/in.h>
#include "smpp34.h"
#include "smpp34_structs.h"
#include "smpp34_params.h"

char bufPDU[2048];
int  bufPDULen = 0;
char bPrint[2048];

    int
main( int argc, char *argv[] )
{

    int  ret = 0;
    enquire_link_t pdu;

    /* Init PDU ***********************************************************/
    memset(&pdu, 0, sizeof(enquire_link_t));
    pdu.command_length   = 0;
    pdu.command_id       = ENQUIRE_LINK;           /* defined in smpp34.h */
    pdu.command_status   = ESME_ROK;               /* defined in smpp34.h */
    pdu.sequence_number  = 1;

    /* Linealize PDU to buffer ********************************************/
    memset(&bufPDU, 0, sizeof(bufPDU));
    ret = smpp34_pack( pdu.command_id,
            bufPDU, sizeof(bufPDU), &bufPDULen, (void*)&pdu);
    if( ret != 0 ){
        printf("Error in smpp34_pack():%d:\n%s\n",
                smpp34_errno, smpp34_strerror);
        return( -1 );
    };

    /* Print Buffer *******************************************************/
    memset(bPrint, 0, sizeof(bPrint));
    ret = smpp34_dumpBuf(bPrint, sizeof(bPrint), bufPDU, bufPDULen);
    if( ret != 0 ){
        printf("Error in smpp34_dumpBuf():%d:\n%s\n",
                smpp34_errno, smpp34_strerror );
        return( -1 );
    };

    printf("The PDU enquire_link is packet in\n%s", bPrint);
    return( 0 );
};

    
Por último, este mismo ejemplo nos va a servir en la descripción de la función smpp34_dumpBuf( ... ) . El ejemplo se compila y ejecuta:
[rtremsal@localhost dist]$ gcc -o lo lo.c -I./include -static -L./lib -lsmpp34
[rtremsal@localhost dist]$ ./lo 
The PDU enquire_link is packet in
   00 00 00 10 00 00 00 15   00 00 00 00 00 00 00 01   ........ ........