www.pudn.com > d4j.zip > dialogic.c


/* $Id: dialogic.c,v 1.9 2003/07/24 20:12:21 cgm8 Exp $ */ 
/* 
 * Dialogic.c: Dialogic SRL interface to java 
 * Copyright (c) 1999 Carlos G Mendioroz. 
 * 
 *  This file is part of D4J. 
 * 
 *  D4J is free software; you can redistribute it and/or 
 *  modify it under the terms of the GNU Lesser General Public 
 *  License as published by the Free Software Foundation; either 
 *  version 2 of the License, or (at your option) any later version. 
 *   
 *  D4J is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 *  Lesser General Public License for more details. 
 *   
 *  You should have received a copy of the GNU Lesser General Public 
 *  License along with this library; if not, write to the 
 *  Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
 *  Boston, MA  02111-1307, USA. 
 * 
 * Report problems and direct all questions to: 
 * 
 *	tron@acm.org 
 */ 
#ifndef LINUX 
#include  
#else 
#define O_BINARY 0 
#define dx_fileopen open 
#define dx_fileclose close 
#endif 
#include  
#include  
#include "Dialogic.h" 
#ifndef LINUX 
#include "dxuio.h" 
#endif 
#include "srllib.h" 
#include "dxxxlib.h" 
#include "dxdigit.h" 
#include "msilib.h" 
#include "dcblib.h" 
#include "cclib.h" 
#include "jni.h" 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    openFile 
 * Signature: (Ljava/lang/String;I)I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_openFile 
  (JNIEnv *env, jclass class, jstring Sfile, jint Imode) { 
    char *filename; 
    int fd; 
 
    filename = (char *)(*env)->GetStringUTFChars(env, Sfile, 0); 
    fd = dx_fileopen(filename, O_BINARY | (Imode?O_RDWR|O_CREAT:O_RDONLY), 0644); 
    (*env)->ReleaseStringUTFChars(env, Sfile, filename); 
     
    return fd; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    closeFile 
 * Signature: (I)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_closeFile 
  (JNIEnv *env, jclass class, jint fd) { 
    
   dx_fileclose(fd);  
} 
 
 
static JavaVM *vm; 
static JavaVMAttachArgs attachArgs = { JNI_VERSION_1_2, NULL, NULL} ; 
static jclass evtClass = 0; 
static jfieldID evtDevID = 0; 
static jfieldID evtTypeID = 0; 
static jfieldID evtTermmskID = 0; 
static jfieldID evtCstevtID = 0; 
static jfieldID evtCstdataID = 0; 
static jfieldID evtDataID = 0; 
static jfieldID evtLineID = 0; 
static jfieldID evtConfID = 0; 
static jfieldID evtCrnID = 0; 
static jclass channelClass = 0; 
static jmethodID handleEventID = 0; 
 
struct DX_CST { 
   unsigned short cst_event; 
   unsigned short cst_data; 
} *rs_getevtdata(); 
 
/* 
 * Signal pseudo handler for Linux 
 * Request all data and pass it up for queuing... 
 * 
 */ 
long handleEvent() { 
    int s, a = 0; 
    int dev, evt_type, datalen; 
    long crn; 
    struct DX_CST *cstdata; 
    int *data; 
    short *sdata; 
    char *cdata; 
    struct dcb_digits *dcbd; 
    JNIEnv *env; 
 
    jobject Oevt; 
     
    if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2) != JNI_OK) { 
        (*vm)->AttachCurrentThread(vm, (void **)&env, &attachArgs); 
        a = 1; 
    } 
 
    Oevt = (*env)->AllocObject(env, evtClass); 
    (*env)->SetIntField(env, Oevt, evtDevID, dev = sr_getevtdev()); 
    evt_type = sr_getevttype(); 
    (*env)->SetIntField(env, Oevt, evtTypeID, evt_type); 
 
    datalen = sr_getevtlen(); 
 
    if (datalen == 4 && evt_type != TDX_CST && evt_type != CCEV_OFFERED) { 
	data = sr_getevtdatap(); 
       	(*env)->SetIntField(env, Oevt, evtDataID, *data); 
    } else if (datalen == 2) { 
        sdata = sr_getevtdatap(); 
	(*env)->SetIntField(env, Oevt, evtDataID, *sdata); 
    } else if (datalen == 1) { 
        cdata = sr_getevtdatap(); 
	(*env)->SetIntField(env, Oevt, evtDataID, *cdata); 
    } 
 
    switch(evt_type) { 
    case TDX_CST: 
        cstdata = sr_getevtdatap(); 
        (*env)->SetIntField(env, Oevt, evtCstevtID, cstdata->cst_event); 
        (*env)->SetIntField(env, Oevt, evtCstdataID, cstdata->cst_data); 
	break;     
    case DCBEV_DIGIT: 
        dcbd = sr_getevtdatap(); 
        (*env)->SetIntField(env, Oevt, evtConfID, dcbd->confid); 
        (*env)->SetIntField(env, Oevt, evtLineID, dcbd->chan_num); 
        (*env)->SetIntField(env, Oevt, evtDataID, dcbd->digits[0]); 
        break; 
    case TDX_PLAY: 
    case TDX_RECORD: 
    case TDX_GETDIG: 
    case TDX_PLAYTONE: 
        (*env)->SetIntField(env, Oevt, evtTermmskID, ATDX_TERMMSK(dev)); 
        break; 
    case CCEV_OFFERED: 
	data = sr_getevtdatap(); 
    	if (cc_GetCRN(&crn, data) != 0) 
    		crn = -1; 
    	(*env)->SetLongField(env, Oevt, evtCrnID, crn); 
    	break; 
 
    } 
 
    (*env)->CallStaticVoidMethod(env, channelClass, handleEventID, Oevt); 
 
    if (a)  
        (*vm)->DetachCurrentThread(vm); 
    return 0; 
} 
 
 
/* 
 * Class:     Dialogic 
 * Method:    sr_libinit 
 * Signature: ()I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_sr_1libinit 
  (JNIEnv *env, jclass class) 
{ 
    int nvm, gotvm; 
    int par; 
    jclass clst; 
#ifndef LINUX 
#ifdef OLDDLG 
    if (sr_libinit(DLGC_MT) == -1) { 
        throw(env, "java/lang/RuntimeException", "SRL init error"); 
        return -1; 
    } 
#endif 
    par = SR_POLLMODE; 
#else 
    /* Reference symbols to get them loaded */ 
    if (0) { 
        getpmsg(0); 
        putpmsg(0); 
    } 
    par = SR_POLLMODE; /* SR_SIGMODE; */ 
#endif 
    if( sr_setparm( SRL_DEVICE, SR_MODEID, &par ) == -1 ) { 
        throw(env, "java/lang/RuntimeException", "SRL MODE init error"); 
        return -1; 
    } 
 
    gotvm = (*env)->GetJavaVM(env, &vm); 
    if (gotvm < 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "VM reference error!"); 
        return -1; 
    } 
 
    clst = (*env)->FindClass(env, "local/dialogic/EVT"); 
    if (clst == 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "Class EVT not found!"); 
        return -1; 
    } 
    evtClass = (*env)->NewGlobalRef(env, clst); 
    if (evtClass == 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "Class EVT reference error!"); 
        return -1; 
    } 
    evtDevID = (*env)->GetFieldID(env, evtClass, "dev", "I"); 
    evtTypeID = (*env)->GetFieldID(env, evtClass, "type", "I"); 
    evtTermmskID = (*env)->GetFieldID(env, evtClass, "termmsk", "I"); 
    evtCstevtID = (*env)->GetFieldID(env, evtClass, "cstevt", "I"); 
    evtCstdataID = (*env)->GetFieldID(env, evtClass, "cstdata", "I"); 
    evtDataID = (*env)->GetFieldID(env, evtClass, "data", "I"); 
    evtLineID = (*env)->GetFieldID(env, evtClass, "line", "I"); 
    evtConfID = (*env)->GetFieldID(env, evtClass, "conf", "I"); 
    evtCrnID = (*env)->GetFieldID(env, evtClass, "crn", "J"); 
    clst = (*env)->FindClass(env, "local/dialogic/Channel"); 
    if (clst == 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "Class Channel not found!"); 
        return -1; 
    } 
    channelClass = (*env)->NewGlobalRef(env, clst); 
    if (channelClass == 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "Class Channel reference error!"); 
        return -1; 
    } 
    handleEventID = (*env)->GetStaticMethodID(env, channelClass, "handleEvent", "(Llocal/dialogic/EVT;)V"); 
 
#ifndef LINUX 
    par = SR_STASYNC; 
    if( sr_setparm( SRL_DEVICE, SR_MODELTYPE, &par ) == -1 ) { 
        throw(env, "java/lang/RuntimeException", "SRL MODEL init error"); 
        return -1; 
    } 
#else 
    if (sr_enbhdlr(EV_ANYDEV, EV_ANYEVT, handleEvent ) == -1 ) { 
        throw(env, "java/lang/RuntimeException", "SRL handler registration error"); 
        return -1; 
    } 
#endif 
    return 0; 
} 
 
/* 
 * Class:     Dialogic 
 * Method:    sr_getboardcnt 
 * Signature: (Ljava/lang/String;[I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_sr_1getboardcnt 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_sr_1do_1getboardcnt 
#endif 
  (JNIEnv *env, jclass class, jstring Stype) 
 
{ 
    char *type; 
    int count = 0; 
    long res; 
    long *Rcount; 
 
    type = (char *)(*env)->GetStringUTFChars(env, Stype, 0); 
#ifndef LINUX 
    res = sr_getboardcnt(type, &count); 
#else 
    res = 0; 
#endif 
    (*env)->ReleaseStringUTFChars(env, Stype, type); 
 
    if (res < 0) 
        return res; 
 
    return count; 
} 
 
/* 
 * user IO functions to transfer data to/from voice boards 
 */ 
static jclass iottClass = 0; 
static jmethodID readID = 0; 
static jmethodID writeID = 0; 
static jmethodID seekID = 0; 
 
int dialogic_read(int fd, char *buf, unsigned len) { 
    int s, a = 0; 
    JNIEnv *env; 
    jbyteArray jbuf; 
    char *jbufp; 
     
    if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2) != JNI_OK) { 
        (*vm)->AttachCurrentThread(vm, (void **)&env, &attachArgs); 
        a = 1; 
    } 
    jbuf = (*env)->NewByteArray(env, len); 
    s = (*env)->CallStaticIntMethod(env, iottClass, readID, fd, jbuf);     
    jbufp = (char *)(*env)->GetByteArrayElements(env, jbuf, 0); 
    memcpy(buf, jbufp, s); 
    (*env)->ReleaseByteArrayElements(env, jbuf, jbufp, JNI_ABORT); 
    (*env)->DeleteLocalRef(env, jbuf); 
    if (a)  
        (*vm)->DetachCurrentThread(vm); 
     
    return s; 
} 
  
int dialogic_write(int fd, char *buf, unsigned len) { 
    int s, a = 0; 
    JNIEnv *env; 
    jbyteArray jbuf; 
    char *jbufp; 
     
    if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2) != JNI_OK) { 
        (*vm)->AttachCurrentThread(vm, (void **)&env, &attachArgs); 
        a = 1; 
    } 
    jbuf = (*env)->NewByteArray(env, len); 
    jbufp = (char *)(*env)->GetByteArrayElements(env, jbuf, 0); 
    memcpy(jbufp, buf, len); 
    (*env)->ReleaseByteArrayElements(env, jbuf, jbufp, 0); 
 
    s = (*env)->CallStaticIntMethod(env, iottClass, writeID, fd, jbuf);     
    (*env)->DeleteLocalRef(env, jbuf); 
    if (a)  
        (*vm)->DetachCurrentThread(vm); 
     
    return s; 
} 
 
long dialogic_seek(int fd, long pos, int type) { 
    long s, a = 0; 
    JNIEnv *env; 
     
    if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2) != JNI_OK) { 
        (*vm)->AttachCurrentThread(vm, (void **)&env, &attachArgs); 
        a = 1; 
    } 
    s = (*env)->CallStaticLongMethod(env, iottClass, seekID, fd, pos, type);     
    if (a)  
        (*vm)->DetachCurrentThread(vm); 
     
    return s; 
} 
  
 
/* 
 * Low level channel buffer utility fns 
 */ 
static jclass voiceClass = 0; 
static jfieldID physioID = 0; 
static jfieldID deviceID = 0; 
 
jclass getVoiceClass(JNIEnv *env, jobject Ovoice) {         
    jclass clst; 
    clst = (*env)->GetObjectClass(env, Ovoice); 
    if (clst == 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "Class Voice not found!"); 
        return 0; 
    } 
    voiceClass = (*env)->NewGlobalRef(env, clst); 
    if (voiceClass == 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "Class Voice reference error!"); 
        return 0; 
    } 
    physioID = (*env)->GetFieldID(env, voiceClass, "physio", "I"); 
    deviceID = (*env)->GetFieldID(env, voiceClass, "device", "I"); 
    return voiceClass; 
} 
 
/* 
 * Class:     Dialogic 
 * Method:    dx_libinit 
 * Signature: ()I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1libinit 
  (JNIEnv *env, jclass class) 
{ 
    jclass clst; 
    DX_UIO uio; 
 
#ifndef LINUX 
#ifdef OLDDLG 
    if (dx_libinit(DLGC_MT) == -1) { 
        throw(env, "java/lang/RuntimeException", "DXL init error"); 
        return -1; 
    }; 
#endif 
#endif 
 
    clst = (*env)->FindClass(env, "local/dialogic/IOTT"); 
    if (clst == 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "Class IOTT not found!"); 
        return -1; 
    } 
    iottClass = (*env)->NewGlobalRef(env, clst); 
    if (iottClass == 0) { 
        throw(env, "java/lang/RuntimeException", 
                    "Class IOTT reference error!"); 
        return -1; 
    } 
    readID = (*env)->GetStaticMethodID(env, iottClass, "read", "(I[B)I"); 
    writeID = (*env)->GetStaticMethodID(env, iottClass, "write", "(I[B)I"); 
    seekID = (*env)->GetStaticMethodID(env, iottClass, "seek", "(IJI)J"); 
     
    uio.u_read = dialogic_read; 
    uio.u_write = dialogic_write; 
    uio.u_seek = dialogic_seek; 
    if (dx_setuio(uio) == -1 ) { 
        throw(env, "java/lang/RuntimeException", "DXL dx_setuio error"); 
        return -1; 
    } 
     
    return 0; 
} 
 
/* 
 * Class:     Dialogic 
 * Method:    dx_open 
 * Signature: (Ljava/lang/String;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1open 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1open 
#endif 
  (JNIEnv *env, jclass class, jstring Sdev, jint Ires) 
{ 
    long res; 
    char *dev; 
 
    dev = (char *)(*env)->GetStringUTFChars(env, Sdev, 0); 
    res = dx_open(dev, (int)Ires); 
    (*env)->ReleaseStringUTFChars(env, Sdev, dev); 
    if (res < 0)  { 
        throw(env, "java/lang/RuntimeException", "dx_open error %d", errno); 
        return -1; 
    } 
    return res; 
 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_close 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dx_1close 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dx_1do_1close 
#endif 
  (JNIEnv *env, jclass class, jobject Ovoice) 
{ 
    int dev; 
    char *mem; 
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return; 
    } 
    dev = (*env)->GetIntField(env, Ovoice, deviceID); 
    mem = (char *)(*env)->GetIntField(env, Ovoice, physioID); 
    if (mem != 0) 
        free(mem); 
    dx_close(dev); 
    (*env)->SetIntField(env, Ovoice, physioID, 0L); 
    (*env)->SetIntField(env, Ovoice, deviceID, 0L); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_setdigtyp 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1setdigtyp 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1setdigtyp 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Imask) 
{ 
    return dx_setdigtyp((int)Idev, (int)Imask); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_setevtmsk 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1setevtmsk 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1setevtmsk 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Imask) 
{ 
    return dx_setevtmsk((int)Idev, (int)Imask); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_setparm 
 * Signature: (III)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1setparm 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1setparm 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ipar, jint Ival) 
{ 
    return dx_setparm((int)Idev, (int)Ipar, &Ival); 
} 
 
/* 
 * Class:     Dialogic 
 * Method:    dx_sethook 
 * Signature: (III)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1sethook 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1sethook 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ihook, jint Imode) 
{ 
    return dx_sethook((int)Idev, (int)Ihook, (unsigned short)Imode); 
} 
 
DX_IOTT * mIOTTp(JNIEnv *env, jobject Oiott, jobject Ovoice) 
{ 
    static jfieldID sizeID = 0; 
    static jfieldID handleID = 0; 
    static jfieldID offsetID = 0; 
    static jfieldID lengthID = 0; 
 
    jintArray IAfd, IAoff, IAlen; 
    int s; 
    jint  *fd, *off, *len; 
    DX_IOTT  *iott; 
    int i; 
 
    if (iottClass == 0) { 
        jclass clst; 
        clst = (*env)->GetObjectClass(env, Oiott); 
        if (clst == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class IOTT not found!"); 
            return (DX_IOTT *)0; 
        } 
        iottClass = (*env)->NewGlobalRef(env, clst); 
        if (iottClass == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class IOTT reference error!"); 
            return (DX_IOTT *)0; 
        } 
    } 
    if (sizeID == 0) { 
        sizeID = (*env)->GetFieldID(env, iottClass, "size", "I"); 
        handleID = (*env)->GetFieldID(env, iottClass, "handle", "[I"); 
        offsetID = (*env)->GetFieldID(env, iottClass, "offset", "[I"); 
        lengthID = (*env)->GetFieldID(env, iottClass, "length", "[I"); 
    } 
    if (voiceClass == 0) { 
        throw(env, "java/lang/RuntimeException", "Class Voice not defined!"); 
        return (DX_IOTT *)0; 
    } 
     
    s = (*env)->GetIntField(env, Oiott, sizeID); 
    if (s == 0) return (DX_IOTT *)0; 
 
    IAfd = (*env)->GetObjectField(env, Oiott, handleID); 
    IAoff = (*env)->GetObjectField(env, Oiott, offsetID); 
    IAlen = (*env)->GetObjectField(env, Oiott, lengthID); 
 
    fd = (*env)->GetIntArrayElements(env, IAfd, 0); 
    off = (*env)->GetIntArrayElements(env, IAoff, 0); 
    len = (*env)->GetIntArrayElements(env, IAlen, 0); 
 
 
    /* 
     * Size of DX_IOTT is 28 bytes. 
     * DV_TPT size is 16  
     * DV_DIGIT size is 64 
     * We alloc 1032 bytes (good for 25 segments) in the channel, 
     * 16 TPT conditions at physio + 700,  
     * 1 DV_DIGIT buffer at physio + 956 
     * and 1 DX_XPB buffer at physio + 1020 
     * not to deal with dinamic alloc/free 
     */ 
    if (s > 25) { 
        throw(env, "java/lang/RuntimeException", 
                   "Class IOTT size > 25 error!"); 
        return (DX_IOTT *)0; 
    } 
    iott = (DX_IOTT *)(*env)->GetIntField(env, Ovoice, physioID); 
    if ((long)iott == 0) { 
        iott = (DX_IOTT *)malloc(1032); 
        if ((long)iott == 0) { 
            throw(env, "java/lang/RuntimeException", 
                    "Channel buffer malloc error!"); 
            return (DX_IOTT *)0; 
        } 
        (*env)->SetIntField(env, Ovoice, physioID, (long)iott); 
    } 
 
    for (i = 0; i < s; i++) { 
        iott[i].io_type = IO_DEV|IO_CONT; 
        iott[i].rfu = 0; 
        if (fd[i] < 0) { 
            iott[i].io_fhandle = -fd[i]; 
            iott[i].io_type |= IO_UIO; 
        } else 
            iott[i].io_fhandle = fd[i]; 
        iott[i].io_bufp = 0; 
        iott[i].io_offset = off[i]; 
        iott[i].io_length = len[i]; 
        iott[i].io_nextp = 0; 
        iott[i].io_prevp = 0; 
    } 
    iott[i-1].io_type |= IO_EOT;  
    iott[i-1].io_type &= ~IO_CONT; /* Dialogic does not like |IO_CONT */ 
     
    (*env)->ReleaseIntArrayElements(env, IAfd, fd, JNI_ABORT); 
    (*env)->ReleaseIntArrayElements(env, IAoff, off, JNI_ABORT); 
    (*env)->ReleaseIntArrayElements(env, IAlen, len, JNI_ABORT); 
 
    return iott; 
} 
 
DV_TPT * mTPTp(JNIEnv *env, jobject Otpt, jobject Ovoice) 
{ 
    static jclass tptClass = 0; 
    static jfieldID sizeID = 0; 
    static jfieldID termnoID = 0; 
    static jfieldID lengthID = 0; 
    static jfieldID flagsID = 0; 
    static jfieldID dataID = 0; 
 
    jintArray IAterm, IAlen, IAflgs, IAdata; 
    int s; 
    jint *term, *len, *flgs, *data; 
    DV_TPT  *tpt; 
    int i; 
 
    if (tptClass == 0) { 
        jclass clst; 
        clst = (*env)->GetObjectClass(env, Otpt); 
        if (clst == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class TPT not found!"); 
            return (DV_TPT *)0; 
        } 
 
        tptClass = (*env)->NewGlobalRef(env, clst); 
        if (tptClass == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class TPT reference error!"); 
            return (DV_TPT *)0; 
        } 
 
        sizeID = (*env)->GetFieldID(env, tptClass, "size", "I"); 
        termnoID = (*env)->GetFieldID(env, tptClass, "termno", "[I"); 
        lengthID = (*env)->GetFieldID(env, tptClass, "length", "[I"); 
        flagsID = (*env)->GetFieldID(env, tptClass, "flags", "[I"); 
        dataID = (*env)->GetFieldID(env, tptClass, "data", "[I"); 
    } 
    if (voiceClass == 0) { 
        throw(env, "java/lang/RuntimeException", "Class Voice not defined!"); 
        return (DV_TPT *)0; 
    } 
     
    s = (*env)->GetIntField(env, Otpt, sizeID); 
    if (s == 0) return (DV_TPT *)0; 
 
    IAterm = (*env)->GetObjectField(env, Otpt, termnoID); 
    IAlen = (*env)->GetObjectField(env, Otpt, lengthID); 
    IAflgs = (*env)->GetObjectField(env, Otpt, flagsID); 
    IAdata = (*env)->GetObjectField(env, Otpt, dataID); 
 
    term = (*env)->GetIntArrayElements(env, IAterm, 0); 
    len = (*env)->GetIntArrayElements(env, IAlen, 0); 
    flgs = (*env)->GetIntArrayElements(env, IAflgs, 0); 
    data = (*env)->GetIntArrayElements(env, IAdata, 0); 
 
    /*  
     * See mIOTT on alloc strategy... 
     */ 
    if (s > 16) { 
        throw(env, "java/lang/RuntimeException", 
                   "Class TPT size > 16 error!"); 
        return (DV_TPT *)0; 
    } 
    tpt = (DV_TPT *)((*env)->GetIntField(env, Ovoice, physioID) + 700); 
    if ((long)tpt == 700) { 
        tpt = (DV_TPT *)((char *)malloc(1032) + 700); 
        if ((long)tpt == 700) { 
            throw(env, "java/lang/RuntimeException", 
                    "Channel buffer malloc error!"); 
            return (DV_TPT *)0; 
        } 
        (*env)->SetIntField(env, Ovoice, physioID, (long)tpt - 700); 
    } 
    for (i = 0; i < s; i++) { 
        tpt[i].tp_type = IO_CONT; 
        tpt[i].tp_termno = term[i]; 
        tpt[i].tp_length = len[i]; 
        tpt[i].tp_flags = flgs[i]; 
        tpt[i].tp_data = data[i]; 
        tpt[i].rfu = 0; 
        tpt[i].tp_nextp = 0; 
    } 
    tpt[i-1].tp_type = IO_EOT; 
 
    (*env)->ReleaseIntArrayElements(env, IAterm, term, JNI_ABORT); 
    (*env)->ReleaseIntArrayElements(env, IAlen, len, JNI_ABORT); 
    (*env)->ReleaseIntArrayElements(env, IAflgs, flgs, JNI_ABORT); 
    (*env)->ReleaseIntArrayElements(env, IAdata, data, JNI_ABORT); 
 
    return tpt; 
} 
 
DX_XPB * mXPBp(JNIEnv *env, jobject Oxpb, jobject Ovoice) 
{ 
    static jclass xpbClass = 0; 
    static jfieldID wFileFormatID = 0; 
    static jfieldID wDataFormatID = 0; 
    static jfieldID nSamplesPerSecID = 0; 
    static jfieldID wBitsPerSampleID = 0; 
 
    int s; 
    DX_XPB  *xpb; 
    int i; 
 
    if (xpbClass == 0) { 
        jclass clst; 
        clst = (*env)->GetObjectClass(env, Oxpb); 
        if (clst == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class XPB not found!"); 
            return (DX_XPB *)0; 
        } 
 
        xpbClass = (*env)->NewGlobalRef(env, clst); 
        if (xpbClass == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class XPB reference error!"); 
            return (DX_XPB *)0; 
        } 
 
        wFileFormatID = (*env)->GetFieldID(env, xpbClass, "wFileFormat", "I"); 
        wDataFormatID = (*env)->GetFieldID(env, xpbClass, "wDataFormat", "I"); 
        nSamplesPerSecID = (*env)->GetFieldID(env, xpbClass, "nSamplesPerSec", "I"); 
        wBitsPerSampleID = (*env)->GetFieldID(env, xpbClass, "wBitsPerSample", "I"); 
    } 
    if (voiceClass == 0) { 
        throw(env, "java/lang/RuntimeException", "Class Voice not defined!"); 
        return (DX_XPB *)0; 
    } 
     
    /*  
     * See mIOTT on alloc strategy... 
     */ 
    xpb = (DX_XPB *)((*env)->GetIntField(env, Ovoice, physioID) + 1020); 
    if ((long)xpb == 1020) { 
        xpb = (DX_XPB *)((char *)malloc(1032) + 1020); 
        if ((long)xpb == 1020) { 
            throw(env, "java/lang/RuntimeException", 
                    "Channel buffer malloc error!"); 
            return (DX_XPB *)0; 
        } 
        (*env)->SetIntField(env, Ovoice, physioID, (long)xpb - 1020); 
    } 
    xpb->wFileFormat = (*env)->GetIntField(env, Oxpb, wFileFormatID); 
    xpb->wDataFormat = (*env)->GetIntField(env, Oxpb, wDataFormatID); 
    xpb->nSamplesPerSec = (*env)->GetIntField(env, Oxpb, nSamplesPerSecID); 
    xpb->wBitsPerSample = (*env)->GetIntField(env, Oxpb, wBitsPerSampleID); 
 
    return xpb; 
} 
 
void fTNGENp(JNIEnv *env, jobject Otngen, TN_GEN *tngen) 
{ 
    static jclass tngenClass = 0; 
    static jfieldID dflagID = 0; 
    static jfieldID freq1ID = 0; 
    static jfieldID ampl1ID = 0; 
    static jfieldID freq2ID = 0; 
    static jfieldID ampl2ID = 0; 
    static jfieldID durID = 0; 
 
    if (tngenClass == 0) { 
        jclass clst; 
        clst = (*env)->GetObjectClass(env, Otngen); 
        if (clst == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class TNGEN not found!"); 
            return; 
        } 
 
        tngenClass = (*env)->NewGlobalRef(env, clst); 
        if (tngenClass == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class TNGEN reference error!"); 
            return; 
        } 
 
        dflagID = (*env)->GetFieldID(env, tngenClass, "dflag", "I"); 
        freq1ID = (*env)->GetFieldID(env, tngenClass, "freq1", "I"); 
        ampl1ID = (*env)->GetFieldID(env, tngenClass, "ampl1", "I"); 
        freq2ID = (*env)->GetFieldID(env, tngenClass, "freq2", "I"); 
        ampl2ID = (*env)->GetFieldID(env, tngenClass, "ampl2", "I"); 
        durID = (*env)->GetFieldID(env, tngenClass, "dur", "I"); 
    } 
 
    tngen->tg_dflag = (*env)->GetIntField(env, Otngen, dflagID); 
    tngen->tg_freq1 = (*env)->GetIntField(env, Otngen, freq1ID); 
    tngen->tg_ampl1 = (*env)->GetIntField(env, Otngen, ampl1ID); 
    tngen->tg_freq2 = (*env)->GetIntField(env, Otngen, freq2ID); 
    tngen->tg_ampl2 = (*env)->GetIntField(env, Otngen, ampl2ID); 
    tngen->tg_dur = (*env)->GetIntField(env, Otngen, durID); 
} 
 
void fDXCAPp(JNIEnv *env, jobject Odxcap, DX_CAP *dxcap) 
{ 
    static jclass dxcapClass = 0; 
    static jfieldID nbrdnaID = 0; 
    static jfieldID stdelyID = 0; 
    static jfieldID cnosigID = 0; 
    static jfieldID lcdlyID = 0; 
    static jfieldID lcdly1ID = 0; 
    static jfieldID hedgeID = 0; 
    static jfieldID cnosilID = 0; 
    static jfieldID lo1tolaID = 0; 
    static jfieldID lo1tolbID = 0; 
    static jfieldID lo2tolaID = 0; 
    static jfieldID lo2tolbID = 0; 
    static jfieldID hi1tolaID = 0; 
    static jfieldID hi1tolbID = 0; 
    static jfieldID lo1bmaxID = 0; 
    static jfieldID lo2bmaxID = 0; 
    static jfieldID hi1bmaxID = 0; 
    static jfieldID nsbusyID = 0; 
    static jfieldID logltchID = 0; 
    static jfieldID higltchID = 0; 
    static jfieldID lo1rmaxID = 0; 
    static jfieldID lo2rminID = 0; 
    static jfieldID intflgID = 0; 
    static jfieldID intfltrID = 0; 
    static jfieldID hisizID = 0; 
    static jfieldID alowmaxID = 0; 
    static jfieldID blowmaxID = 0; 
    static jfieldID nbrbegID = 0; 
    static jfieldID hi1ceilID = 0; 
    static jfieldID lo1ceilID = 0; 
    static jfieldID lowerfrqID = 0; 
    static jfieldID upperfrqID = 0; 
    static jfieldID timefrqID = 0; 
    static jfieldID rejctfrqID = 0; 
    static jfieldID maxansrID = 0; 
    static jfieldID ansrdglID = 0; 
    static jfieldID mxtimefrqID = 0; 
    static jfieldID lower2frqID = 0; 
    static jfieldID upper2frqID = 0; 
    static jfieldID time2frqID = 0; 
    static jfieldID mxtime2frqID = 0; 
    static jfieldID lower3frqID = 0; 
    static jfieldID upper3frqID = 0; 
    static jfieldID time3frqID = 0; 
    static jfieldID mxtime3frqID = 0; 
    static jfieldID dtn_presID = 0; 
    static jfieldID dtn_npresID = 0; 
    static jfieldID dtn_deboffID = 0; 
    static jfieldID pamd_failtimeID = 0; 
    static jfieldID pamd_minringID = 0; 
    static jfieldID pamd_spdvalID = 0; 
    static jfieldID pamd_qtempID = 0; 
    static jfieldID noanswerID = 0; 
    static jfieldID maxinteringID = 0; 
 
    if (dxcapClass == 0) { 
        jclass clst; 
        clst = (*env)->GetObjectClass(env, Odxcap); 
        if (clst == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class DXCAP not found!"); 
            return; 
        } 
 
        dxcapClass = (*env)->NewGlobalRef(env, clst); 
        if (dxcapClass == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class DXCAP reference error!"); 
            return; 
        } 
 
        nbrdnaID = (*env)->GetFieldID(env, dxcapClass, "nbrdna", "I"); 
        stdelyID = (*env)->GetFieldID(env, dxcapClass, "stdely", "I"); 
        cnosigID = (*env)->GetFieldID(env, dxcapClass, "cnosig", "I"); 
        lcdlyID = (*env)->GetFieldID(env, dxcapClass, "lcdly", "I"); 
        lcdly1ID = (*env)->GetFieldID(env, dxcapClass, "lcdly1", "I"); 
        hedgeID = (*env)->GetFieldID(env, dxcapClass, "hedge", "I"); 
        cnosilID = (*env)->GetFieldID(env, dxcapClass, "cnosil", "I"); 
        lo1tolaID = (*env)->GetFieldID(env, dxcapClass, "lo1tola", "I"); 
        lo1tolbID = (*env)->GetFieldID(env, dxcapClass, "lo1tolb", "I"); 
        lo2tolaID = (*env)->GetFieldID(env, dxcapClass, "lo2tola", "I"); 
        lo2tolbID = (*env)->GetFieldID(env, dxcapClass, "lo2tolb", "I"); 
        hi1tolaID = (*env)->GetFieldID(env, dxcapClass, "hi1tola", "I"); 
        hi1tolbID = (*env)->GetFieldID(env, dxcapClass, "hi1tolb", "I"); 
        lo1bmaxID = (*env)->GetFieldID(env, dxcapClass, "lo1bmax", "I"); 
        lo2bmaxID = (*env)->GetFieldID(env, dxcapClass, "lo2bmax", "I"); 
        hi1bmaxID = (*env)->GetFieldID(env, dxcapClass, "hi1bmax", "I"); 
        nsbusyID = (*env)->GetFieldID(env, dxcapClass, "nsbusy", "I"); 
        logltchID = (*env)->GetFieldID(env, dxcapClass, "logltch", "I"); 
        higltchID = (*env)->GetFieldID(env, dxcapClass, "higltch", "I"); 
        lo1rmaxID = (*env)->GetFieldID(env, dxcapClass, "lo1rmax", "I"); 
        lo2rminID = (*env)->GetFieldID(env, dxcapClass, "lo2rmin", "I"); 
        intflgID = (*env)->GetFieldID(env, dxcapClass, "intflg", "I"); 
        intfltrID = (*env)->GetFieldID(env, dxcapClass, "intfltr", "I"); 
        hisizID = (*env)->GetFieldID(env, dxcapClass, "hisiz", "I"); 
        alowmaxID = (*env)->GetFieldID(env, dxcapClass, "alowmax", "I"); 
        blowmaxID = (*env)->GetFieldID(env, dxcapClass, "blowmax", "I"); 
        nbrbegID = (*env)->GetFieldID(env, dxcapClass, "nbrbeg", "I"); 
        hi1ceilID = (*env)->GetFieldID(env, dxcapClass, "hi1ceil", "I"); 
        lo1ceilID = (*env)->GetFieldID(env, dxcapClass, "lo1ceil", "I"); 
        lowerfrqID = (*env)->GetFieldID(env, dxcapClass, "lowerfrq", "I"); 
        upperfrqID = (*env)->GetFieldID(env, dxcapClass, "upperfrq", "I"); 
        timefrqID = (*env)->GetFieldID(env, dxcapClass, "timefrq", "I"); 
        rejctfrqID = (*env)->GetFieldID(env, dxcapClass, "rejctfrq", "I"); 
        maxansrID = (*env)->GetFieldID(env, dxcapClass, "maxansr", "I"); 
        ansrdglID = (*env)->GetFieldID(env, dxcapClass, "ansrdgl", "I"); 
        mxtimefrqID = (*env)->GetFieldID(env, dxcapClass, "mxtimefrq", "I"); 
        lower2frqID = (*env)->GetFieldID(env, dxcapClass, "lower2frq", "I"); 
        upper2frqID = (*env)->GetFieldID(env, dxcapClass, "upper2frq", "I"); 
        time2frqID = (*env)->GetFieldID(env, dxcapClass, "time2frq", "I"); 
        mxtime2frqID = (*env)->GetFieldID(env, dxcapClass, "mxtime2frq", "I"); 
        lower3frqID = (*env)->GetFieldID(env, dxcapClass, "lower3frq", "I"); 
        upper3frqID = (*env)->GetFieldID(env, dxcapClass, "upper3frq", "I"); 
        time3frqID = (*env)->GetFieldID(env, dxcapClass, "time3frq", "I"); 
        mxtime3frqID = (*env)->GetFieldID(env, dxcapClass, "mxtime3frq", "I"); 
        dtn_presID = (*env)->GetFieldID(env, dxcapClass, "dtn_pres", "I"); 
        dtn_npresID = (*env)->GetFieldID(env, dxcapClass, "dtn_npres", "I"); 
        dtn_deboffID = (*env)->GetFieldID(env, dxcapClass, "dtn_deboff", "I"); 
        pamd_failtimeID = (*env)->GetFieldID(env, dxcapClass, "pamd_failtime", "I"); 
        pamd_minringID = (*env)->GetFieldID(env, dxcapClass, "pamd_minring", "I"); 
        pamd_spdvalID = (*env)->GetFieldID(env, dxcapClass, "pamd_spdval", "I"); 
        pamd_qtempID = (*env)->GetFieldID(env, dxcapClass, "pamd_qtemp", "I"); 
        noanswerID = (*env)->GetFieldID(env, dxcapClass, "noanswer", "I"); 
        maxinteringID = (*env)->GetFieldID(env, dxcapClass, "maxintering", "I"); 
    } 
 
    dxcap->ca_nbrdna = (*env)->GetIntField(env, Odxcap, nbrdnaID); 
    dxcap->ca_nbrdna = (*env)->GetIntField(env, Odxcap, nbrdnaID); 
    dxcap->ca_stdely = (*env)->GetIntField(env, Odxcap, stdelyID); 
    dxcap->ca_cnosig = (*env)->GetIntField(env, Odxcap, cnosigID); 
    dxcap->ca_lcdly = (*env)->GetIntField(env, Odxcap, lcdlyID); 
    dxcap->ca_lcdly1 = (*env)->GetIntField(env, Odxcap, lcdly1ID); 
    dxcap->ca_hedge = (*env)->GetIntField(env, Odxcap, hedgeID); 
    dxcap->ca_cnosil = (*env)->GetIntField(env, Odxcap, cnosilID); 
    dxcap->ca_lo1tola = (*env)->GetIntField(env, Odxcap, lo1tolaID); 
    dxcap->ca_lo1tolb = (*env)->GetIntField(env, Odxcap, lo1tolbID); 
    dxcap->ca_lo2tola = (*env)->GetIntField(env, Odxcap, lo2tolaID); 
    dxcap->ca_lo2tolb = (*env)->GetIntField(env, Odxcap, lo2tolbID); 
    dxcap->ca_hi1tola = (*env)->GetIntField(env, Odxcap, hi1tolaID); 
    dxcap->ca_hi1tolb = (*env)->GetIntField(env, Odxcap, hi1tolbID); 
    dxcap->ca_lo1bmax = (*env)->GetIntField(env, Odxcap, lo1bmaxID); 
    dxcap->ca_lo2bmax = (*env)->GetIntField(env, Odxcap, lo2bmaxID); 
    dxcap->ca_hi1bmax = (*env)->GetIntField(env, Odxcap, hi1bmaxID); 
    dxcap->ca_nsbusy = (*env)->GetIntField(env, Odxcap, nsbusyID); 
    dxcap->ca_logltch = (*env)->GetIntField(env, Odxcap, logltchID); 
    dxcap->ca_higltch = (*env)->GetIntField(env, Odxcap, higltchID); 
    dxcap->ca_lo1rmax = (*env)->GetIntField(env, Odxcap, lo1rmaxID); 
    dxcap->ca_lo2rmin = (*env)->GetIntField(env, Odxcap, lo2rminID); 
    dxcap->ca_intflg = (*env)->GetIntField(env, Odxcap, intflgID); 
    dxcap->ca_intfltr = (*env)->GetIntField(env, Odxcap, intfltrID); 
    dxcap->ca_hisiz = (*env)->GetIntField(env, Odxcap, hisizID); 
    dxcap->ca_alowmax = (*env)->GetIntField(env, Odxcap, alowmaxID); 
    dxcap->ca_blowmax = (*env)->GetIntField(env, Odxcap, blowmaxID); 
    dxcap->ca_nbrbeg = (*env)->GetIntField(env, Odxcap, nbrbegID); 
    dxcap->ca_hi1ceil = (*env)->GetIntField(env, Odxcap, hi1ceilID); 
    dxcap->ca_lo1ceil = (*env)->GetIntField(env, Odxcap, lo1ceilID); 
    dxcap->ca_lowerfrq = (*env)->GetIntField(env, Odxcap, lowerfrqID); 
    dxcap->ca_upperfrq = (*env)->GetIntField(env, Odxcap, upperfrqID); 
    dxcap->ca_timefrq = (*env)->GetIntField(env, Odxcap, timefrqID); 
    dxcap->ca_rejctfrq = (*env)->GetIntField(env, Odxcap, rejctfrqID); 
    dxcap->ca_maxansr = (*env)->GetIntField(env, Odxcap, maxansrID); 
    dxcap->ca_ansrdgl = (*env)->GetIntField(env, Odxcap, ansrdglID); 
    dxcap->ca_mxtimefrq = (*env)->GetIntField(env, Odxcap, mxtimefrqID); 
    dxcap->ca_lower2frq = (*env)->GetIntField(env, Odxcap, lower2frqID); 
    dxcap->ca_upper2frq = (*env)->GetIntField(env, Odxcap, upper2frqID); 
    dxcap->ca_time2frq = (*env)->GetIntField(env, Odxcap, time2frqID); 
    dxcap->ca_mxtime2frq = (*env)->GetIntField(env, Odxcap, mxtime2frqID); 
    dxcap->ca_lower3frq = (*env)->GetIntField(env, Odxcap, lower3frqID); 
    dxcap->ca_upper3frq = (*env)->GetIntField(env, Odxcap, upper3frqID); 
    dxcap->ca_time3frq = (*env)->GetIntField(env, Odxcap, time3frqID); 
    dxcap->ca_mxtime3frq = (*env)->GetIntField(env, Odxcap, mxtime3frqID); 
    dxcap->ca_dtn_pres = (*env)->GetIntField(env, Odxcap, dtn_presID); 
    dxcap->ca_dtn_npres = (*env)->GetIntField(env, Odxcap, dtn_npresID); 
    dxcap->ca_dtn_deboff = (*env)->GetIntField(env, Odxcap, dtn_deboffID); 
    dxcap->ca_pamd_failtime = (*env)->GetIntField(env, Odxcap, pamd_failtimeID); 
    dxcap->ca_pamd_minring = (*env)->GetIntField(env, Odxcap, pamd_minringID); 
    dxcap->ca_pamd_spdval = (*env)->GetIntField(env, Odxcap, pamd_spdvalID); 
    dxcap->ca_pamd_qtemp = (*env)->GetIntField(env, Odxcap, pamd_qtempID); 
    dxcap->ca_noanswer = (*env)->GetIntField(env, Odxcap, noanswerID); 
    dxcap->ca_maxintering = (*env)->GetIntField(env, Odxcap, maxinteringID); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_play 
 * Signature: (Llocal/dialogic/Voice;Llocal/dialogic/IOTT;Llocal/dialogic/TPT;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1play 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1play 
#endif 
  (JNIEnv *env, jclass class, jobject Ovoice, jobject Oiott, jobject Otpt, jint Imode) 
{ 
    int dev; 
    DX_IOTT * iott; 
    DV_TPT * tpt; 
 
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return 0; 
    } 
    dev = (*env)->GetIntField(env, Ovoice, deviceID); 
 
 
    iott = mIOTTp(env, Oiott, Ovoice); 
    tpt = mTPTp(env, Otpt, Ovoice); 
     
    return dx_play(dev, iott, tpt, (unsigned short)Imode); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_rec 
 * Signature: (Llocal/dialogic/Voice;Llocal/dialogic/IOTT;Llocal/dialogic/TPT;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1rec 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1rec 
#endif 
  (JNIEnv *env, jclass class, jobject Ovoice, jobject Oiott, jobject Otpt, jint Imode) 
{ 
    int dev, res; 
    DX_IOTT * iott; 
    DV_TPT * tpt; 
 
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return 0; 
    } 
    dev = (*env)->GetIntField(env, Ovoice, deviceID); 
 
    iott = mIOTTp(env, Oiott, Ovoice); 
    tpt = mTPTp(env, Otpt, Ovoice); 
 
    res = dx_rec(dev, iott, tpt, (unsigned short)Imode); 
 
    return 0; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_getdig 
 * Signature: (Llocal/dialogic/Voice;Llocal/dialogic/TPT;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1getdig__Llocal_dialogic_Voice_2Llocal_dialogic_TPT_2I 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1getdig__Llocal_dialogic_Voice_2Llocal_dialogic_TPT_2I 
#endif 
  (JNIEnv *env, jclass class, jobject Ovoice, jobject Otpt, jint Imode) 
{ 
    int dev, res; 
    DV_TPT * tpt; 
    DV_DIGIT * digitbuf; 
 
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return 0; 
    } 
    dev = (*env)->GetIntField(env, Ovoice, deviceID); 
 
    /*  
     * See mIOTT on alloc strategy... 
     */ 
    digitbuf = (DV_DIGIT *)((*env)->GetIntField(env, Ovoice, physioID) + 956); 
    if ((long)digitbuf == 956) { 
        digitbuf = (DV_DIGIT *)((char *)malloc(1032) + 956); 
        if ((long)digitbuf == 956) { 
            throw(env, "java/lang/RuntimeException", 
                    "Channel buffer malloc error!"); 
            return 0; 
        } 
        (*env)->SetIntField(env, Ovoice, physioID, (long)digitbuf - 956); 
    } 
 
    tpt = mTPTp(env, Otpt, Ovoice); 
 
    return dx_getdig(dev, tpt, digitbuf, (unsigned short)Imode); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_getdig 
 * Signature: (Llocal/dialogic/Voice;[B)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1getdig__Llocal_dialogic_Voice_2_3B 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1getdig__Llocal_dialogic_Voice_2_3B 
#endif 
  (JNIEnv * env, jclass class, jobject Ovoice, jbyteArray BAbuf) 
{ 
    char *digits, *digitbuf; 
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return 0; 
    } 
    if ((*env)->GetArrayLength(env, BAbuf) < sizeof (struct dv_digit) ) { 
        throw(env, "java/lang/RuntimeException", 
            "Small digit buffer to dx_getdig()" ); 
            return 0; 
    } 
    digitbuf = (char *)((*env)->GetIntField(env, Ovoice, physioID) + 956); 
    if ((long)digitbuf == 956) { 
        /* This should not happen... we should be here after allocing memory */ 
        return 0; 
    } 
    digits = (char *)(*env)->GetByteArrayElements(env, BAbuf, 0); 
    memcpy(digits, digitbuf, sizeof (struct dv_digit)); 
    (*env)->ReleaseByteArrayElements(env, BAbuf, digits, 0); 
     
    return strlen(digitbuf); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_clrdigbuf 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1clrdigbuf 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1clrdigbuf 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
 
    return dx_clrdigbuf(Idev); 
  } 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_bldst 
 * Signature: (IIII)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1bldst 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1bldst 
#endif 
  (JNIEnv *env , jclass class, jint Iid, jint If1, jint Id1, jint Imode) { 
 
    return dx_bldst(Iid, If1, Id1, Imode); 
  } 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_blddt 
 * Signature: (IIIIII)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1blddt 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1blddt 
#endif 
  (JNIEnv *env , jclass class, jint Iid, jint If1, jint Id1, jint If2, jint Id2, jint Imode) { 
 
    return dx_blddt(Iid, If1, Id1, If2, Id2, Imode); 
  } 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_deltones 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1deltones 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1deltones 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
 
    return dx_deltones(Idev); 
  } 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_addtone 
 * Signature: (III)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1addtone 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1addtone 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Idigit, jint Itype) { 
 
    return dx_addtone(Idev, Idigit, Itype); 
  } 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_enbtone 
 * Signature: (III)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1enbtone 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1enbtone 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Iid, jint Imask) { 
 
    return dx_enbtone(Idev, Iid, Imask); 
  } 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_distone 
 * Signature: (III)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1distone 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1distone 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Iid, jint Imask) { 
 
    return dx_distone(Idev, Iid, Imask); 
  } 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_playtone 
 * Signature: (Llocal/dialogic/Voice;Llocal/dialogic/TNGEN;Llocal/dialogic/TPT;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1playtone 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1playtone 
#endif 
  (JNIEnv *env, jclass class, jobject Ovoice, jobject Otngen, jobject Otpt, jint Imode) { 
    int dev, res; 
    TN_GEN tngen; 
    DV_TPT * tpt; 
 
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return 0; 
    } 
    dev = (*env)->GetIntField(env, Ovoice, deviceID); 
 
    tpt = mTPTp(env, Otpt, Ovoice); 
    fTNGENp(env, Otngen, &tngen); 
 
    res = dx_playtone(dev, &tngen, tpt, Imode); 
 
 } 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    sr_waitevt 
 * Signature: (Llocal/dialogic/EVT;)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_sr_1waitevt 
  (JNIEnv *env, jclass class, jobject Oevt) 
{ 
    int dev, evt_type, datalen; 
    long crn; 
    struct DX_CST *cstdata; 
    int *data; 
    short *sdata; 
    char *cdata; 
    struct dcb_digits *dcbd; 
 
    if (evtClass == 0) { 
        throw(env, "java/lang/RuntimeException", 
            "Class EVT not loaded!"); 
        return; 
    } 
 
#ifdef LINUX 
    #define PAR () 
    sr_waitevt(0); 
    (*env)->SetIntField(env, Oevt, evtDevID, dev = sr_getevtdev PAR); 
    if (dev == 0) return; 
#else 
    #define PAR (0) 
    sr_waitevt(-1); 
    (*env)->SetIntField(env, Oevt, evtDevID, dev = sr_getevtdev PAR); 
#endif 
    evt_type = sr_getevttype PAR; 
    (*env)->SetIntField(env, Oevt, evtTypeID, evt_type); 
 
    datalen = sr_getevtlen PAR; 
 
    if (datalen == 4 && evt_type != TDX_CST && evt_type != CCEV_OFFERED) { 
	data = sr_getevtdatap(); 
       	(*env)->SetIntField(env, Oevt, evtDataID, *data); 
    } else if (datalen == 2) { 
        sdata = sr_getevtdatap(); 
	(*env)->SetIntField(env, Oevt, evtDataID, *sdata); 
    } else if (datalen == 1) { 
        cdata = sr_getevtdatap(); 
	(*env)->SetIntField(env, Oevt, evtDataID, *cdata); 
    } 
     
    switch(evt_type) { 
    case TDX_CST: 
        cstdata = sr_getevtdatap(); 
        (*env)->SetIntField(env, Oevt, evtCstevtID, cstdata->cst_event); 
        (*env)->SetIntField(env, Oevt, evtCstdataID, cstdata->cst_data); 
	break;     
    case DCBEV_DIGIT: 
        dcbd = sr_getevtdatap(); 
        (*env)->SetIntField(env, Oevt, evtConfID, dcbd->confid); 
        (*env)->SetIntField(env, Oevt, evtLineID, dcbd->chan_num); 
        (*env)->SetIntField(env, Oevt, evtDataID, dcbd->digits[0]); 
        break; 
    case TDX_PLAY: 
    case TDX_RECORD: 
    case TDX_GETDIG: 
    case TDX_PLAYTONE: 
        (*env)->SetIntField(env, Oevt, evtTermmskID, ATDX_TERMMSK(dev)); 
        break; 
    case CCEV_OFFERED: 
	data = sr_getevtdatap(); 
    	if (cc_GetCRN(&crn, data) != 0) 
    		crn = -1; 
    	(*env)->SetLongField(env, Oevt, evtCrnID, crn); 
    	break; 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ATDX_STATE 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1STATE 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1do_1STATE 
#endif 
  (JNIEnv * env, jclass class, jint Idev) 
{ 
    return ATDX_STATE((int)Idev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ATDX_CPTERM 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1CPTERM 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1do_1CPTERM 
#endif 
  (JNIEnv * env, jclass class, jint Idev) 
{ 
    return ATDX_CPTERM((int)Idev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ATDX_LINEST 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1LINEST 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1do_1LINEST 
#endif 
  (JNIEnv * env, jclass class, jint Idev) 
{ 
    return ATDX_LINEST((int)Idev); 
} 
 
/* 
 * Class:     Dialogic 
 * Method:    dx_stopch 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1stopch 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1stopch 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Imode) 
{ 
    return dx_stopch((int)Idev, (unsigned short)Imode); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_dial 
 * Signature: (ILjava/lang/String;Llocal/dialogic/DXCAP;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1dial 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1dial 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jstring Snumber, 
    jobject Odxcap, jint Imode) 
{ 
    char *number; 
    int ret; 
 
    number = (char *)(*env)->GetStringUTFChars(env, Snumber, 0); 
    if (Odxcap) { 
        DX_CAP cap; 
        fDXCAPp(env, Odxcap, &cap); 
        ret = dx_dial((int)Idev, number, &cap, (unsigned short)DX_CALLP|Imode); 
    } else { 
        ret = dx_dial((int)Idev, number, 0, (unsigned short)Imode); 
    } 
 
    (*env)->ReleaseStringUTFChars(env, Snumber, number); 
    return ret; 
 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_getxmitslot 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1getxmitslot 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1getxmitslot 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    SC_TSINFO tsinfo; 
    long scts; 
    tsinfo.sc_numts = 1; 
    scts = 0; 
    tsinfo.sc_tsarrayp = &scts; 
 
    if (dx_getxmitslot(Idev, &tsinfo) == -1) { 
        throw(env, "java/lang/RuntimeException", "dx_getxmitslot error"); 
    } 
    return scts; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_listen 
 * Signature: (II)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dx_1listen 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dx_1do_1listen 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Its) { 
    SC_TSINFO tsinfo; 
    long scts; 
    tsinfo.sc_numts = 1; 
    scts = Its; 
    tsinfo.sc_tsarrayp = &scts; 
 
    if (dx_listen(Idev, &tsinfo) == -1) { 
        throw(env, "java/lang/RuntimeException", "dx_listen error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_unlisten 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dx_1unlisten 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dx_1do_1unlisten 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    SC_TSINFO tsinfo; 
 
    if (dx_unlisten(Idev) == -1) { 
        throw(env, "java/lang/RuntimeException", "dx_unlisten error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ag_getxmitslot 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ag_1getxmitslot 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ag_1do_1getxmitslot 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    SC_TSINFO tsinfo; 
    long scts; 
    tsinfo.sc_numts = 1; 
    scts = 0; 
    tsinfo.sc_tsarrayp = &scts; 
 
    if (ag_getxmitslot(Idev, &tsinfo) == -1) { 
        throw(env, "java/lang/RuntimeException", "ag_getxmitslot error"); 
    } 
    return scts; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ag_listen 
 * Signature: (II)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ag_1listen 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ag_1do_1listen 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Its) { 
    SC_TSINFO tsinfo; 
    long scts; 
    tsinfo.sc_numts = 1; 
    scts = Its; 
    tsinfo.sc_tsarrayp = &scts; 
 
    if (ag_listen(Idev, &tsinfo) == -1) { 
        throw(env, "java/lang/RuntimeException", "ag_listen error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ag_unlisten 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ag_1unlisten 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ag_1do_1unlisten 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    SC_TSINFO tsinfo; 
 
    if (ag_unlisten(Idev) == -1) { 
        throw(env, "java/lang/RuntimeException", "ag_unlisten error"); 
    } 
} 
 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_playiottdata 
 * Signature: (Llocal/dialogic/Voice;Llocal/dialogic/IOTT;Llocal/dialogic/TPT;Llocal/dialogic/XPB;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1playiottdata 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1playiottdata 
#endif 
  (JNIEnv *env, jclass class, jobject Ovoice, jobject Oiott, jobject Otpt, jobject Oxpb, jint Imode) 
{ 
    int dev; 
    DX_IOTT * iott; 
    DV_TPT * tpt; 
    DX_XPB * xpb; 
     
 
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return 0; 
    } 
    dev = (*env)->GetIntField(env, Ovoice, deviceID); 
 
 
    iott = mIOTTp(env, Oiott, Ovoice); 
    tpt = mTPTp(env, Otpt, Ovoice); 
    xpb = mXPBp(env, Oxpb, Ovoice); 
     
    return dx_playiottdata(dev, iott, tpt, xpb, (unsigned short)Imode); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_reciottdata 
 * Signature: (Llocal/dialogic/Voice;Llocal/dialogic/IOTT;Llocal/dialogic/TPT;Llocal/dialogic/XPB;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1reciottdata 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1reciottdata 
#endif 
  (JNIEnv *env, jclass class, jobject Ovoice, jobject Oiott, jobject Otpt, jobject Oxpb, jint Imode) 
{ 
    int dev; 
    DX_IOTT * iott; 
    DV_TPT * tpt; 
    DX_XPB * xpb; 
     
 
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return 0; 
    } 
    dev = (*env)->GetIntField(env, Ovoice, deviceID); 
 
 
    iott = mIOTTp(env, Oiott, Ovoice); 
    tpt = mTPTp(env, Otpt, Ovoice); 
    xpb = mXPBp(env, Oxpb, Ovoice); 
     
    return dx_reciottdata(dev, iott, tpt, xpb, (unsigned short)Imode); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_mreciottdata 
 * Signature: (Llocal/dialogic/Voice;Llocal/dialogic/IOTT;Llocal/dialogic/TPT;Llocal/dialogic/XPB;III)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1mreciottdata 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1mreciottdata 
#endif 
   (JNIEnv *env, jclass class, jobject Ovoice, jobject Oiott, jobject Otpt, jobject Oxpb, jint Imode, jint Its1, jint Its2) 
{ 
    int dev; 
    DX_IOTT * iott; 
    DV_TPT * tpt; 
    DX_XPB * xpb; 
    SC_TSINFO tsinfo; 
    long scts[2]; 
    tsinfo.sc_numts = 2; 
    scts[0] = Its1; 
    scts[1] = Its2; 
    tsinfo.sc_tsarrayp = scts; 
     
    if (voiceClass == 0 && getVoiceClass(env, Ovoice) == 0) { 
        return 0; 
    } 
    dev = (*env)->GetIntField(env, Ovoice, deviceID); 
 
 
    iott = mIOTTp(env, Oiott, Ovoice); 
    tpt = mTPTp(env, Otpt, Ovoice); 
    xpb = mXPBp(env, Oxpb, Ovoice); 
     
#ifndef LINUX_NO_MREC 
    return dx_mreciottdata(dev, iott, tpt, xpb, (unsigned short)Imode, &tsinfo); 
#else 
    if (xpb->wFileFormat != FILE_FORMAT_VOX) { 
        throw(env, "java/lang/RuntimeException", 
            "Unsupported file format under linux" ); 
            return 0; 
    } 
    switch(xpb->wDataFormat) { 
    case DATA_FORMAT_DIALOGIC_ADPCM: 
        Imode |= MD_ADPCM; 
        break; 
    case DATA_FORMAT_PCM: 
        Imode |= MD_PCM; 
        break; 
    case DATA_FORMAT_ALAW: 
        Imode |= MD_PCM|RM_ALAW; 
        break; 
    case DATA_FORMAT_MULAW: 
        Imode |= MD_PCM; 
        break; 
    default:  
        throw(env, "java/lang/RuntimeException", 
            "Unsupported data format under linux" ); 
        return 0; 
    } 
    switch(xpb->nSamplesPerSec) { 
    case DRT_6KHZ: 
        Imode |= RM_SR6; 
        break; 
    case DRT_8KHZ: 
        Imode |= RM_SR8; 
        break; 
    default: 
        throw(env, "java/lang/RuntimeException", 
            "Unsupported sample rate under linux" ); 
        return 0; 
    } 
         
    return dx_recm(dev, iott, tpt, (unsigned short)Imode, &tsinfo); 
#endif 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_setchxfercnt 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1setchxfercnt 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1setchxfercnt 
#endif 
  (JNIEnv *env , jclass class, jint Idev, jint Ibufnum) { 
 
    return dx_setchxfercnt(Idev, Ibufnum); 
  } 
 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_gtcallid 
 * Signature: (I[B)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1gtcallid 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1gtcallid 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jbyteArray BAbuf) 
{ 
    int dev, res, len; 
    char *digits; 
    if ((*env)->GetArrayLength(env, BAbuf) < 81 ) { 
        throw(env, "java/lang/RuntimeException", 
            "Small digit buffer to dx_gtcallid()" ); 
            return 0; 
    } 
 
    digits = (char *)(*env)->GetByteArrayElements(env, BAbuf, 0); 
 
    res = dx_gtcallid(Idev, digits); 
    if (res == 0) 
        len = strlen(digits); 
    else  
        len = -1 * ATDV_LASTERR(Idev); 
 
    (*env)->ReleaseByteArrayElements(env, BAbuf, digits, 0); 
     
    return len; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_gtextcallid 
 * Signature: (II[B)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1gtextcallid 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1gtextcallid 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Itype, jbyteArray BAbuf) 
{ 
    int dev, res, len; 
    char *digits; 
    if ((*env)->GetArrayLength(env, BAbuf) < 258 ) { 
        throw(env, "java/lang/RuntimeException", 
            "Small digit buffer to dx_gtextcallid()" ); 
            return 0; 
    } 
 
    digits = (char *)(*env)->GetByteArrayElements(env, BAbuf, 0); 
 
    res = dx_gtextcallid(Idev, Itype, digits); 
    if (res == 0) 
        len = strlen(digits); 
    else  
        len = -1 * ATDV_LASTERR(Idev); 
 
    (*env)->ReleaseByteArrayElements(env, BAbuf, digits, 0); 
     
    return len; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_initcallp 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1initcallp 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1initcallp 
#endif 
  (JNIEnv *env, jclass class, jint dev) 
{ 
        return dx_initcallp(dev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dx_getparm 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1getparm 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dx_1do_1getparm 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ipar) { 
    long value; 
 
    if (dx_getparm(Idev, Ipar, &value) == -1) { 
        throw(env, "java/lang/RuntimeException", "dx_getparm error"); 
        return 0; 
    } 
    return value; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ATDX_BUFDIGS 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1BUFDIGS 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1do_1BUFDIGS 
#endif 
  (JNIEnv * env, jclass class, jint Idev) 
{ 
    return ATDX_BUFDIGS((int)Idev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ATDX_TRCOUNT 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1TRCOUNT 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDX_1do_1TRCOUNT 
#endif 
  (JNIEnv * env, jclass class, jint Idev) 
{ 
    return ATDX_TRCOUNT((int)Idev); 
} 
 
 
/* 
 *  DDDD  TTTTT   I   
 *  D   D   T     I   
 *  D   D   T     I   
 *  D   D   T     I   
 *  D   D   T     I   
 *  D   D   T     I   
 *  DDDD    T     I   
 */ 
 
 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_libinit 
 * Signature: ()I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1libinit 
  (JNIEnv *env, jclass class) 
{ 
    int par; 
#ifndef LINUX 
#ifdef OLDDLG 
    if (dt_libinit(DLGC_MT) == -1) { 
        throw(env, "java/lang/RuntimeException", "DTI init error"); 
        return -1; 
    } 
#endif 
#endif 
    return 0; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_open 
 * Signature: (Ljava/lang/String;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1open 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1do_1open 
#endif 
  (JNIEnv *env, jclass class, jstring Sdev, jint Ires) 
{ 
    long res; 
    char *dev; 
 
    dev = (char *)(*env)->GetStringUTFChars(env, Sdev, 0); 
    res = dt_open(dev, (int)Ires); 
    (*env)->ReleaseStringUTFChars(env, Sdev, dev); 
    if (res < 0)  { 
        throw(env, "java/lang/RuntimeException", "dt_open error %d", errno); 
        return -1; 
    } 
    return res; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_close 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1close 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1do_1close 
#endif 
  (JNIEnv *env, jclass class, jint Idev) 
{ 
    dt_close((int)Idev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_getparm 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1getparm 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1do_1getparm 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ipar) { 
    long value; 
 
    if (dt_getparm(Idev, Ipar, &value) == -1) { 
        throw(env, "java/lang/RuntimeException", "dt_getparm error"); 
        return 0; 
    } 
    return value; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_setparm 
 * Signature: (III)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1setparm 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1do_1setparm 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ipar, jint Ivalue) { 
 
    if (dt_setparm(Idev, Ipar, &Ivalue) == -1) { 
        throw(env, "java/lang/RuntimeException", "dt_setparm error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_getxmitslot 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1getxmitslot 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1do_1getxmitslot 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    SC_TSINFO tsinfo; 
    long scts; 
    tsinfo.sc_numts = 1; 
    scts = 0; 
    tsinfo.sc_tsarrayp = &scts; 
 
    if (dt_getxmitslot(Idev, &tsinfo) == -1) { 
        throw(env, "java/lang/RuntimeException", "dt_getxmitslot error"); 
    } 
    return scts; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_listen 
 * Signature: (II)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1listen 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1do_1listen 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Its) { 
    SC_TSINFO tsinfo; 
    long scts; 
    tsinfo.sc_numts = 1; 
    scts = Its; 
    tsinfo.sc_tsarrayp = &scts; 
 
    if (dt_listen(Idev, &tsinfo) == -1) { 
        throw(env, "java/lang/RuntimeException", "dt_listen error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_unlisten 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1unlisten 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1do_1unlisten 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    SC_TSINFO tsinfo; 
 
    if (dt_unlisten(Idev) == -1) { 
        throw(env, "java/lang/RuntimeException", "dt_unlisten error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_getevtmsk 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1getevtmsk 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1do_1getevtmsk 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ievt) { 
    long value; 
 
    if (dt_getevtmsk(Idev, Ievt, &value) == -1) { 
        throw(env, "java/lang/RuntimeException", "dt_getevtmsk error"); 
        return 0; 
    } 
    return value; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_setevtmsk 
 * Signature: (IIII)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1setevtmsk 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dt_1do_1setevtmsk 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ievt, jint Imsk, jint Imode) { 
 
    if (dt_setevtmsk(Idev, Ievt, Imsk, Imode) == -1) { 
        throw(env, "java/lang/RuntimeException", "dt_setevtmsk error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dt_settssig 
 * Signature: (III)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1settssig 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dt_1do_1settssig 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Isig, jint Imode) { 
 
    if (dt_settssig(Idev, Isig, Imode) == -1) { 
        throw(env, "java/lang/RuntimeException", "dt_settssig error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ATDT_TSSGBIT 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDT_1TSSGBIT 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATDT_1do_1TSSGBIT 
#endif 
  (JNIEnv * env, jclass class, jint Idev) 
{ 
    return ATDT_TSSGBIT((int)Idev); 
} 
 
static jclass cdtClass = 0; 
static jfieldID chan_numID = 0; 
static jfieldID chan_selID = 0; 
static jfieldID chan_attrID = 0; 
 
void fCDTp(JNIEnv *env, jobject Ocdt, MS_CDT *cdt) 
{ 
    if (cdtClass == 0) { 
        jclass clst; 
        clst = (*env)->GetObjectClass(env, Ocdt); 
        if (clst == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class CDT not found!"); 
            return; 
        } 
 
        cdtClass = (*env)->NewGlobalRef(env, clst); 
        if (cdtClass == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class CDT reference error!"); 
            return; 
        } 
 
        chan_numID = (*env)->GetFieldID(env, cdtClass, "chan_num", "I"); 
        chan_selID = (*env)->GetFieldID(env, cdtClass, "chan_sel", "I"); 
        chan_attrID = (*env)->GetFieldID(env, cdtClass, "chan_attr", "I"); 
    } 
 
    cdt->chan_num = (*env)->GetIntField(env, Ocdt, chan_numID); 
    cdt->chan_sel = (*env)->GetIntField(env, Ocdt, chan_selID); 
    cdt->chan_attr = (*env)->GetIntField(env, Ocdt, chan_attrID); 
} 
 
void fillCDT(JNIEnv *env, jobject Ocdt, MS_CDT *cdt) 
{ 
    if (cdtClass == 0) { 
        jclass clst; 
        clst = (*env)->GetObjectClass(env, Ocdt); 
        if (clst == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class CDT not found!"); 
            return; 
        } 
 
        cdtClass = (*env)->NewGlobalRef(env, clst); 
        if (cdtClass == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class CDT reference error!"); 
            return; 
        } 
 
        chan_numID = (*env)->GetFieldID(env, cdtClass, "chan_num", "I"); 
        chan_selID = (*env)->GetFieldID(env, cdtClass, "chan_sel", "I"); 
        chan_attrID = (*env)->GetFieldID(env, cdtClass, "chan_attr", "I"); 
    } 
 
    (*env)->SetIntField(env, Ocdt, chan_numID, cdt->chan_num); 
    (*env)->SetIntField(env, Ocdt, chan_selID, cdt->chan_sel); 
    (*env)->SetIntField(env, Ocdt, chan_attrID, cdt->chan_attr); 
} 
 
 
/* 
 *  DDDD   CCCC BBBB  
 *  D   D C     B   B 
 *  D   D C     B   B 
 *  D   D C     BBBB  
 *  D   D C     B   B 
 *  D   D C     B   B 
 *  DDDD   CCCC BBBB  
 */ 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_libinit 
 * Signature: ()I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dcb_1libinit 
  (JNIEnv *env, jclass class) 
{ 
    int par; 
#ifndef LINUX 
#ifdef OLDDLG 
    if (dcb_libinit(DLGC_MT) == -1) { 
        throw(env, "java/lang/RuntimeException", "DCB init error"); 
        return -1; 
    } 
#endif 
#endif 
    return 0; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_addtoconf 
 * Signature: (IILlocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1addtoconf 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1addtoconf 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobject oCDT) 
{ 
    MS_CDT cdt; 
 
    fCDTp(env, oCDT, &cdt); 
 
    if (dcb_addtoconf(Idev, Iconf, &cdt) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_addtoconf error"); 
        return; 
    } 
    fillCDT(env, oCDT, &cdt); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_close 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1close 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1close 
#endif 
  (JNIEnv * env, jclass class, jint Idev) 
{ 
    dcb_close((int)Idev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_delconf 
 * Signature: (II)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1delconf 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1delconf 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf) 
{ 
    if (dcb_delconf(Idev, Iconf) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_delconf error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_estconf 
 * Signature: (I[Llocal/dialogic/CDT;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dcb_1estconf 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dcb_1do_1estconf 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jobjectArray OAcdt, jint Ipar) 
{ 
    MS_CDT cdts[4]; 
    int parties = 0; 
    int conf = 0; 
    jobject Ocdt; 
    int i; 
 
    parties = (*env)->GetArrayLength(env, OAcdt); 
    if (parties < 0 || parties > 4) { 
        throw(env, "java/lang/RuntimeException", "dcb_estconf size error"); 
        return 0; 
    } 
 
    for (i = 0; i < parties; i++) { 
        Ocdt = (*env)->GetObjectArrayElement(env, OAcdt, i); 
        fCDTp(env, Ocdt, &cdts[i]); 
    } 
 
    if (dcb_estconf(Idev, &cdts[0], parties, Ipar, &conf) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_estconf error"); 
        return 0; 
    } 
 
    for (i = 0; i < parties; i++) { 
        Ocdt = (*env)->GetObjectArrayElement(env, OAcdt, i); 
        fillCDT(env, Ocdt, &cdts[i]); 
    } 
 
    return conf; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_getbrdparm 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dcb_1getbrdparm 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dcb_1do_1getbrdparm 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Ipar) 
{ 
    long val; 
    if (dcb_getbrdparm(Idev, Ipar, &val) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_getbrdparm error"); 
        return 0; 
    } 
    return val; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_getcde 
 * Signature: (IILlocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1getcde 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1getcde 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobject Ocdt) 
{ 
    MS_CDT cdt; 
 
    fCDTp(env, Ocdt, &cdt); 
 
    if (dcb_getcde(Idev, Iconf, &cdt) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_getcde error"); 
        return; 
    } 
    fillCDT(env, Ocdt, &cdt); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_gettalkers 
 * Signature: (II[Llocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1gettalkers 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1gettalkers 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobjectArray OAcdt) 
{ 
    MS_CDT cdts[32], cdtt[32]; 
    int parties = 0, talkers = 0; 
    jobject Ocdt[32]; 
    int i, j; 
 
    parties = (*env)->GetArrayLength(env, OAcdt); 
 
    for (i = 0; i < parties; i++) { 
        Ocdt[i] = (*env)->GetObjectArrayElement(env, OAcdt, i); 
        fCDTp(env, Ocdt[i], &cdts[i]); 
        cdts[i].chan_attr &= ~0x80; /* clear talking indication */ 
    } 
 
    if (dcb_gettalkers(Idev, Iconf, &talkers, &cdtt[0]) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_gettalkers error"); 
        return; 
    } 
 
    for (i = 0; i < parties; i++) { 
        for (j = 0; j < talkers; j++) { 
            if (cdtt[j].chan_num == cdts[i].chan_num) { 
                cdts[i].chan_attr |= 0x80;  /* This one is talking */ 
                break; 
            } 
        } 
        fillCDT(env, Ocdt[i], &cdts[i]); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_open 
 * Signature: (Ljava/lang/String;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dcb_1open 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_dcb_1do_1open 
#endif 
  (JNIEnv * env, jclass class, jstring Sdev, jint Ires) 
 { 
    long res; 
    char *dev; 
 
    dev = (char *)(*env)->GetStringUTFChars(env, Sdev, 0); 
    res = dcb_open(dev, (int)Ires); 
    (*env)->ReleaseStringUTFChars(env, Sdev, dev); 
    if (res < 0)  { 
        throw(env, "java/lang/RuntimeException", "dcb_open error %d", errno); 
        return -1; 
    } 
    return res; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_remfromconf 
 * Signature: (IILlocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1remfromconf 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1remfromconf 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobject oCDT) 
{ 
    MS_CDT cdt; 
 
    fCDTp(env, oCDT, &cdt); 
 
    if (dcb_remfromconf(Idev, Iconf, &cdt) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_remfromconf error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_setbrdparm 
 * Signature: (III)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1setbrdparm 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1setbrdparm 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Ipar, jint Ival) 
{ 
    if (dcb_setbrdparm(Idev, Ipar, &Ival) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_setbrdparm error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_setcde 
 * Signature: (IILlocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1setcde 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1setcde 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobject oCDT) 
{ 
    MS_CDT cdt; 
 
    fCDTp(env, oCDT, &cdt); 
 
    if (dcb_setcde(Idev, Iconf, &cdt) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_setcde error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    dcb_setdigitmsk 
 * Signature: (III)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1setdigitmsk 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_dcb_1do_1setdigitmsk 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jint Imsk) 
{ 
    if (dcb_setdigitmsk(Idev, Iconf, Imsk, CBA_SETMSK) == -1) { 
        throw(env, "java/lang/RuntimeException", "dcb_setdigitmsk error"); 
    } 
} 
 
 
/* 
 *  M   M  SSSS   I   
 *  MM MM S       I   
 *  M M M S       I   
 *  M   M  SSS    I   
 *  M   M     S   I   
 *  M   M     S   I   
 *  M   M SSSS    I   
 */ 
 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_libinit 
 * Signature: ()I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1libinit 
  (JNIEnv *env, jclass class) 
{ 
    int par; 
#ifndef LINUX 
#ifdef OLDDLG 
    if (ms_libinit(DLGC_MT) == -1) { 
        throw(env, "java/lang/RuntimeException", "MSI init error"); 
        return -1; 
    } 
#endif 
#endif 
    return 0; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_addtoconf 
 * Signature: (IILlocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1addtoconf 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1addtoconf 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobject oCDT) 
{ 
    MS_CDT cdt; 
 
    fCDTp(env, oCDT, &cdt); 
 
    if (ms_addtoconf(Idev, Iconf, &cdt) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_addtoconf error"); 
        return; 
    } 
    fillCDT(env, oCDT, &cdt); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_delconf 
 * Signature: (II)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1delconf 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1delconf 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf) 
{ 
    if (ms_delconf(Idev, Iconf) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_delconf error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_estconf 
 * Signature: (I[Llocal/dialogic/CDT;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1estconf 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1do_1estconf 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jobjectArray OAcdt, jint Ipar) 
{ 
    MS_CDT cdts[4]; 
    int parties = 0; 
    int conf = 0; 
    jobject Ocdt; 
    int i; 
 
    parties = (*env)->GetArrayLength(env, OAcdt); 
    if (parties < 0 || parties > 4) { 
        throw(env, "java/lang/RuntimeException", "ms_estconf size error"); 
        return 0; 
    } 
 
    for (i = 0; i < parties; i++) { 
        Ocdt = (*env)->GetObjectArrayElement(env, OAcdt, i); 
        fCDTp(env, Ocdt, &cdts[i]); 
    } 
 
    if (ms_estconf(Idev, &cdts[0], parties, Ipar, &conf) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_estconf error"); 
        return 0; 
    } 
 
    for (i = 0; i < parties; i++) { 
        Ocdt = (*env)->GetObjectArrayElement(env, OAcdt, i); 
        fillCDT(env, Ocdt, &cdts[i]); 
    } 
 
    return conf; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_getcde 
 * Signature: (IILlocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1getcde 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1getcde 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobject Ocdt) 
{ 
    MS_CDT cdt; 
 
    fCDTp(env, Ocdt, &cdt); 
 
    if (ms_getcde(Idev, Iconf, &cdt) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_getcde error"); 
        return; 
    } 
    fillCDT(env, Ocdt, &cdt); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_remfromconf 
 * Signature: (IILlocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1remfromconf 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1remfromconf 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobject oCDT) 
{ 
    MS_CDT cdt; 
 
    fCDTp(env, oCDT, &cdt); 
 
    if (ms_remfromconf(Idev, Iconf, &cdt) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_remfromconf error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_setcde 
 * Signature: (IILlocal/dialogic/CDT;)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1setcde 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1setcde 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Iconf, jobject oCDT) 
{ 
    MS_CDT cdt; 
 
    fCDTp(env, oCDT, &cdt); 
 
    if (ms_setcde(Idev, Iconf, &cdt) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_setcde error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_open 
 * Signature: (Ljava/lang/String;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1open 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1do_1open 
#endif 
  (JNIEnv * env, jclass class, jstring Sdev, jint Ires) 
 { 
    long res; 
    char *dev; 
 
    dev = (char *)(*env)->GetStringUTFChars(env, Sdev, 0); 
    res = ms_open(dev, (int)Ires); 
    (*env)->ReleaseStringUTFChars(env, Sdev, dev); 
    if (res < 0)  { 
        throw(env, "java/lang/RuntimeException", "ms_open error %d", errno); 
        return -1; 
    } 
    return res; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_close 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1close 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1close 
#endif 
  (JNIEnv * env, jclass class, jint Idev) 
{ 
    ms_close((int)Idev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_getbrdparm 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1getbrdparm 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1do_1getbrdparm 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Ipar) 
{ 
    long val; 
    if (ms_getbrdparm(Idev, Ipar, &val) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_getbrdparm error"); 
        return 0; 
    } 
    return val; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_setbrdparm 
 * Signature: (III)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1setbrdparm 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1setbrdparm 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Ipar, jint Ival) 
{ 
    if (ms_setbrdparm(Idev, Ipar, &Ival) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_setbrdparm error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_getevtmsk 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1getevtmsk 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1do_1getevtmsk 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Ievent) 
{ 
    short val; 
    if (ms_getevtmsk(Idev, Ievent, &val) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_getevtmsk error"); 
        return 0; 
    } 
    return val; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_setevtmsk 
 * Signature: (IIII)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1setevtmsk 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1setevtmsk 
#endif 
  (JNIEnv * env, jclass class, jint Idev, jint Ievent, jint Imask, jint Iaction) 
{ 
    if (ms_setevtmsk(Idev, Ievent, Imask, Iaction) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_setevtmsk error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_getxmitslot 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1getxmitslot 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ms_1do_1getxmitslot 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    SC_TSINFO tsinfo; 
    long scts; 
    tsinfo.sc_numts = 1; 
    scts = 0; 
    tsinfo.sc_tsarrayp = &scts; 
 
    if (ms_getxmitslot(Idev, &tsinfo) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_getxmitslot error"); 
    } 
    return scts; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_listen 
 * Signature: (II)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1listen 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1listen 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Its) { 
    SC_TSINFO tsinfo; 
    long scts; 
    tsinfo.sc_numts = 1; 
    scts = Its; 
    tsinfo.sc_tsarrayp = &scts; 
 
    if (ms_listen(Idev, &tsinfo) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_listen error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_unlisten 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1unlisten 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1unlisten 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    SC_TSINFO tsinfo; 
 
    if (ms_unlisten(Idev) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_unlisten error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_genring 
 * Signature: (III)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1genring 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1genring 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ilen, jint Imode) { 
 
    if (ms_genring(Idev, Ilen, Imode) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_genring error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_genziptone 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1genziptone 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1genziptone 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
 
    if (ms_genziptone(Idev) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_genziptone error"); 
    } 
} 
 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_setvol 
 * Signature: (III)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1setvol 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1setvol 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Itype, jint Isteps) { 
 
    if (ms_setvol(Idev, Itype, Isteps) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_setvol error"); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ATMS_TSSGBIT 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATMS_1TSSGBIT 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_ATMS_1do_1TSSGBIT 
#endif 
  (JNIEnv *env, jclass class, jint Idev) { 
    long bits; 
    bits = 0; 
 
    if ((bits = ATMS_TSSGBIT(Idev)) == -1) { 
        throw(env, "java/lang/RuntimeException", "ATMS_TSSGBIT error"); 
    } 
    return bits; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    ms_stopfn 
 * Signature: (II)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1stopfn 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_ms_1do_1stopfn 
#endif 
  (JNIEnv *env, jclass class, jint Idev, jint Ifn) { 
    if (ms_stopfn(Idev, Ifn) == -1) { 
        throw(env, "java/lang/RuntimeException", "ms_stopfn error"); 
    } 
} 
 
 
/* 
 *    I   SSSS  DDDD   N   N 
 *    I  S      D   D  N   N 
 *    I  S      D   D  NN  N 
 *    I   SSS   D   D  N N N 
 *    I      S  D   D  N  NN 
 *    I      S  D   D  N   N 
 *    I  SSSS   DDDD   N   N 
 */ 
 
 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_AcceptCall 
 * Signature: (JII)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1AcceptCall 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1AcceptCall 
#endif 
  (JNIEnv *env, jclass class, jlong Lcrn, jint Irings, jint Imode) 
{  
    if (cc_AcceptCall(Lcrn, Irings, Imode) == -1) { 
    	int line = 0; 
    	cc_CRN2LineDev(Lcrn, &line); 
        throw(env, "java/lang/RuntimeException", "cc_AcceptCall error %x",cc_CauseValue(line)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_AnswerCall 
 * Signature: (JII)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1AnswerCall 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1AnswerCall 
#endif 
  (JNIEnv *env, jclass class, jlong Lcrn, jint Irings, jint Imode) 
{  
    if (cc_AnswerCall(Lcrn, Irings, Imode) == -1) { 
    	int line = 0; 
    	cc_CRN2LineDev(Lcrn, &line); 
        throw(env, "java/lang/RuntimeException", "cc_AnswerCall error %x",cc_CauseValue(line)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_CauseValue 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1CauseValue 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1do_1CauseValue 
#endif 
  (JNIEnv *env, jclass class, jint Ildev) 
{  
    return cc_CauseValue(Ildev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_Close 
 * Signature: (I)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1Close 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1Close 
#endif 
  (JNIEnv *env, jclass class, jint Ildev) 
{  
    cc_Close(Ildev); 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_DropCall 
 * Signature: (JII)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1DropCall 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1DropCall 
#endif 
  (JNIEnv *env, jclass class, jlong Lcrn, jint Icause, jint Imode) 
{  
    if (cc_DropCall(Lcrn, Icause, Imode) == -1) { 
    	int line = 0; 
    	cc_CRN2LineDev(Lcrn, &line); 
        throw(env, "java/lang/RuntimeException", "cc_DropCall error %x",cc_CauseValue(line)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_GetANI 
 * Signature: (J[B)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1GetANI 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1GetANI 
#endif 
  (JNIEnv *env, jclass class, jlong Lcrn, jbyteArray BAani) 
{  
    int res; 
    char *ani; 
    if ((*env)->GetArrayLength(env, BAani) < 32 ) { 
        throw(env, "java/lang/RuntimeException", 
            "Small ANI buffer to cc_GetANI()" ); 
            return; 
    } 
 
    ani = (char *)(*env)->GetByteArrayElements(env, BAani, 0); 
 
    res = cc_GetANI(Lcrn, ani); 
 
    (*env)->ReleaseByteArrayElements(env, BAani, ani, 0); 
    if (res < 0) { 
    	int line = 0; 
    	cc_CRN2LineDev(Lcrn, &line); 
        throw(env, "java/lang/RuntimeException", "cc_GetANI error %x", cc_CauseValue(line)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_GetDNIS 
 * Signature: (J[B)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1GetDNIS 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1GetDNIS 
#endif 
  (JNIEnv *env, jclass class, jlong Lcrn, jbyteArray BAdnis) 
{  
    int res; 
    char *dnis; 
    if ((*env)->GetArrayLength(env, BAdnis) < 32 ) { 
        throw(env, "java/lang/RuntimeException", 
            "Small dnis buffer to cc_GetDNIS()" ); 
            return; 
    } 
 
    dnis = (char *)(*env)->GetByteArrayElements(env, BAdnis, 0); 
 
    res = cc_GetDNIS(Lcrn, dnis); 
 
    (*env)->ReleaseByteArrayElements(env, BAdnis, dnis, 0); 
    if (res < 0) { 
    	int line = 0; 
    	cc_CRN2LineDev(Lcrn, &line); 
        throw(env, "java/lang/RuntimeException", "cc_GetDNIS error %x", cc_CauseValue(line)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_GetEvtMsk 
 * Signature: (I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1GetEvtMsk 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1do_1GetEvtMsk 
#endif 
  (JNIEnv *env, jclass class, jint Ildev) 
{  
    long mask; 
    if (cc_GetEvtMsk(Ildev, &mask) == -1) { 
        throw(env, "java/lang/RuntimeException", "cc_GetEvtMsk error %x",cc_CauseValue(Ildev)); 
    } 
    return mask; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_GetParm 
 * Signature: (II)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1GetParm 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1do_1GetParm 
#endif 
  (JNIEnv *env, jclass class, jint Ildev, jint Iparmid) 
{  
    long value; 
    if (cc_GetParm(Ildev, Iparmid, &value) == -1) { 
        throw(env, "java/lang/RuntimeException", "cc_GetParm error %x",cc_CauseValue(Ildev)); 
    } 
    return value; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_MakeCall 
 * Signature: (ILjava/lang/String;Ljava/lang/Object;II)J 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1MakeCall 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1do_1MakeCall 
#endif 
  (JNIEnv *env, jclass class, jint Ildev, jstring Snumber, jobject Omakecall, jint Ito, jint Imode) 
{  
    int ret; 
    long crn = 0; 
    MAKECALL_BLK makecall_blk;  
    char * number; 
     
     
    // Should be read from Omakecall 
    memset(&makecall_blk,0xff,sizeof(MAKECALL_BLK));   
    makecall_blk.isdn.BC_xfer_cap = ISDN_NOTUSED;   
    makecall_blk.isdn.BC_xfer_mode = ISDN_NOTUSED;   
    makecall_blk.isdn.BC_xfer_rate = ISDN_NOTUSED;   
    makecall_blk.isdn.facility_coding_value = ISDN_NOTUSED;   
    makecall_blk.isdn.destination_number_type = ISDN_NOTUSED;   
    makecall_blk.isdn.destination_number_plan = ISDN_NOTUSED;   
    makecall_blk.isdn.origination_number_type = ISDN_NOTUSED;   
    makecall_blk.isdn.origination_number_plan = ISDN_NOTUSED;   
    makecall_blk.isdn.origination_phone_number[0] = ISDN_NOTUSED;   
    makecall_blk.isdn.facility_feature_service = ISDN_NOTUSED;   
    makecall_blk.isdn.usrinfo_layer1_protocol = ISDN_NOTUSED;   
    makecall_blk.isdn.usr_rate = ISDN_NOTUSED;   
    makecall_blk.isdn.usrinfo_bufp = NULL;   
    makecall_blk.isdn.nsfc_bufp = NULL;   
    makecall_blk.isdn.destination_sub_number_type = ISDN_NOTUSED;   
    makecall_blk.isdn.destination_sub_phone_number[0] = ISDN_NOTUSED;   
     
    number = (char *)(*env)->GetStringUTFChars(env, Snumber, 0); 
    ret = cc_MakeCall(Ildev, &crn, number, &makecall_blk, Ito, Imode); 
    (*env)->ReleaseStringUTFChars(env, Snumber, number); 
     
    if (ret == -1) { 
        throw(env, "java/lang/RuntimeException", "cc_MakeCall error %x",cc_CauseValue(Ildev)); 
    } 
    return crn; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_Open 
 * Signature: (Ljava/lang/String;I)I 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1Open 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1do_1Open 
#endif 
  (JNIEnv *env, jclass class, jstring Sdevice, jint Irfu) 
{  
    int linedev, res; 
    char * device; 
     
    device = (char *)(*env)->GetStringUTFChars(env, Sdevice, 0); 
    res = cc_Open(&linedev, device, Irfu); 
    (*env)->ReleaseStringUTFChars(env, Sdevice, device); 
    if (res < 0)  
        throw(env, "java/lang/RuntimeException", "cc_Open error %d", errno); 
    return linedev; 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_RejectCall 
 * Signature: (JII)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1RejectCall 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1RejectCall 
#endif 
  (JNIEnv *env, jclass class, jlong Lcrn, jint Icause, jint Imode) 
{  
    if (cc_RejectCall(Lcrn, Icause, Imode) == -1) { 
    	int line = 0; 
    	cc_CRN2LineDev(Lcrn, &line); 
        throw(env, "java/lang/RuntimeException", "cc_RejectCall error %x",cc_CauseValue(line)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_ReleaseCallEx 
 * Signature: (JI)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1ReleaseCallEx 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1ReleaseCallEx 
#endif 
  (JNIEnv *env, jclass class, jlong Lcrn, jint Imode) 
{  
    if (cc_ReleaseCallEx(Lcrn, Imode) == -1) { 
    	int line = 0; 
    	cc_CRN2LineDev(Lcrn, &line); 
        throw(env, "java/lang/RuntimeException", "cc_ReleaseCallEx error %x",cc_CauseValue(line)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_Restart 
 * Signature: (II)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1Restart 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1Restart 
#endif 
  (JNIEnv *env, jclass class, jint Ildev, jint Imode) 
{  
    if (cc_Restart(Ildev, Imode) == -1) { 
        throw(env, "java/lang/RuntimeException", "cc_Restart error %x",cc_CauseValue(Ildev)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_ResultMsg 
 * Signature: (II[B)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1ResultMsg 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1ResultMsg 
#endif 
  (JNIEnv *env, jclass class, jint Ildev, jint Iresult, jbyteArray BAmessage) 
{  
    int res, mesl; 
    char *message, *messagep; 
    if ((mesl = (*env)->GetArrayLength(env, BAmessage)) < 80 ) { 
        throw(env, "java/lang/RuntimeException", 
            "Small message buffer to cc_ResultMsg()" ); 
            return; 
    } 
 
    res = cc_ResultMsg(Ildev, Iresult, &messagep); 
 
    message = (char *)(*env)->GetByteArrayElements(env, BAmessage, 0); 
    strncpy(message, messagep, mesl); 
    (*env)->ReleaseByteArrayElements(env, BAmessage, message, 0); 
    if (res < 0)  
        throw(env, "java/lang/RuntimeException", "cc_ResultMsg error %x", cc_CauseValue(Ildev)); 
       
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_SetEvtMsk 
 * Signature: (III)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1SetEvtMsk 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1SetEvtMsk 
#endif 
  (JNIEnv *env, jclass class, jint Ildev, jint Imask, jint Iaction) 
{  
    if (cc_SetEvtMsk(Ildev, Imask, Iaction) == -1) { 
        throw(env, "java/lang/RuntimeException", "cc_SetEvtMsk error %x",cc_CauseValue(Ildev)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_SetParm 
 * Signature: (IIJ)V 
 */ 
#ifndef LINUX 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1SetParm 
#else 
JNIEXPORT void JNICALL Java_local_dialogic_Dialogic_cc_1do_1SetParm 
#endif 
  (JNIEnv *env, jclass class, jint Ildev, jint Iparam, jint Ivalue) 
{  
    if (cc_SetParm(Ildev, Iparam, Ivalue) == -1) { 
        throw(env, "java/lang/RuntimeException", "cc_SetParm error %x",cc_CauseValue(Ildev)); 
    } 
} 
 
/* 
 * Class:     local_dialogic_Dialogic 
 * Method:    cc_WaitCall 
 * Signature: (ILjava/lang/Object;II)J 
 */ 
#ifndef LINUX 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1WaitCall 
#else 
JNIEXPORT jint JNICALL Java_local_dialogic_Dialogic_cc_1do_1WaitCall 
#endif 
  (JNIEnv *env, jclass class, jint Ildev, jobject Owaitcall, jint Ito, jint Imode) 
{  
    long crn = 0; 
    if (cc_WaitCall(Ildev, &crn, NULL, Ito, Imode) == -1) { 
        throw(env, "java/lang/RuntimeException", "cc_WaitCall error %x",cc_CauseValue(Ildev)); 
    } 
    return crn; 
} 
 
 
throw(JNIEnv *env, char * which, char *what, long par1, long par2, long par3, long par4) 
{ 
    jclass newExcCls; 
    char errbuf[128]; 
 
   newExcCls = (*env)->FindClass(env, which); 
   if (newExcCls == 0)  return 0; 
   sprintf(errbuf, what, par1, par2, par3, par4); 
   (*env)->ThrowNew(env, newExcCls, errbuf); 
 
}