# isdnReleaseBuffer

Returns an event buffer to the NMS ISDN API.

#### Prototype

DWORD isdnReleaseBuffer ( CTAHD ctahd, void *buffer)

Argument | Description
ctahd | Context handle associated with a D channel, returned by ctaCreateContext.
buffer | Pointer to the event buffer.

#### Return values

Return value | Description
SUCCESS |
CTAERR_INVALID_CTAHD | The context handle is invalid.
CTAERR_INVALID_STATE | An ISDN protocol stack instance is not started on the specified context, or an instance is starting or stopping on the context.
ISDNERR_INVALID_BUFFER | The buffer submitted is not valid.

#### Events

None.

#### Details

This function informs the stack that the application has finished processing an event buffer (described by the CTA_EVENT buffer and size fields) and is returning the buffer to the NMS ISDN API. The event ID for ISDN events is ISDNEVN_RCV_MESSAGE.

The application must return every event buffer to the NMS ISDN API as soon as possible, or the API times out and stops passing events to the application.

#### Example

DWORD sample_process_events (CTAHD ctahd)
{
CTA_EVENT event;
ISDN_MESSAGE *imsg;
ISDN_PACKET *ipkt;
BYTE *data;
DWORD ret;
char errortext[40];
#define EVENT_CODE(from, code) ((from<<8)|code)
...
/*
** Protocol already started...
** Application may have sent messages to stack
*/
...
/*
** Application waiting for events
*/
myWaitForEvent( ctahd, &event);
/*
** Got event ISDN_RCV_MESSAGE
** If the event value field is not SUCCESS, then
** the event was not received successfully.
*/
if( event.value != SUCCESS )
{
ctaGetText(ctahd, event.value, errortext, 40);
printf("RCV_FAIL: %s\n", errortext);
return MY_ERROR_RCV_FAILED;
}
/*
** NOTE: all asynchronous events have the
** msg->userid field is ISDN_USERID_ASYNC
*/
ipkt = (ISDN_PACKET *) event->buffer;
imsg = &ipkt->message;
data = ipkt->data;
printf("from: %c code=%c to=%c id=%d len=%d\n",
imsg->from_ent,
imsg->code,
imsg->to_ent,
imsg->add.conn_id,
ipkt->data_len);
switch(EVENT_CODE(imsg->from_ent, imsg->code) )
{
case EVENT_CODE(ENT_ACU, CONN_CO):
/*
** Call is now connected
*/
printf("Connected on conn_id: %d\n",imsg->add.conn_id);
break;
case EVENT_CODE(ENT_ACU,ACU_CLEAR_CO):
/*
** Call is now cleared
*/
printf("Cleared on conn_id: %d\n", imsg->add.conn_id);
break;
...
default:
printf("Unprocessed message: %c %c\n", imsg->from_ent,
imsg->code);
break;
}
/*
** Processing is done, release the buffer as soon as possible
*/
ret = isdnReleaseBuffer( ctahd, event.buffer );
if( ret != SUCCESS )
{
ctaGetText(ctahd, event.value, errortext, 40);
printf("RELEASE_FAIL: %s\n", errortext);
return MY_ERROR_RELEASE_FAILED;
}
...
}