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


/* $Id: dialogicGC.c,v 1.4 2003/11/13 11:57:25 cgm8 Exp $ */ 
 
/* 
 * DialogicGC.c: Dialogic GlobalCall 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 "DialogicGC.h" 
#include "srllib.h" 
#include "dxxxlib.h" 
#include "gclib.h" 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_Start 
 * Signature: ()I 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1Start 
  (JNIEnv *env, jclass class) { 
        gc_Start(0L); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_Stop 
 * Signature: ()I 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1Stop 
  (JNIEnv *env, jclass class) { 
        gc_Stop(); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_Open 
 * Signature: (Ljava/lang/String;)I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_GCChannel_gc_1Open 
  (JNIEnv *env, jclass class, jstring Sline) { 
    long line = 0; 
    int ret; 
    char *name; 
 
    name = (char *)(*env)->GetStringUTFChars(env, Sline, 0); 
 
    ret = gc_Open(&line, name, 0); 
    (*env)->ReleaseStringUTFChars(env, Sline, name); 
 
    if(ret) 
        return GCerror(env, "GCOpen"); 
    return line; 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_Close 
 * Signature: (I)I 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1Close 
  (JNIEnv *env, jclass class, jint Iline) { 
    if (gc_Close(Iline)) 
        GCerror(env, "Close"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_GetVoiceH 
 * Signature: (I)I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_GCChannel_gc_1GetVoiceH 
  (JNIEnv *env, jclass class, jint Iline) { 
    int voiceH; 
 
    if (gc_GetVoiceH(Iline, &voiceH)) 
        return GCerror(env, "GetVoiceH"); 
    return voiceH; 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_GetNetworkH 
 * Signature: (I)I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_GCChannel_gc_1GetNetworkH 
  (JNIEnv *env, jclass class, jint Iline) { 
    int netH; 
 
    if (gc_GetNetworkH(Iline, &netH)) 
        return GCerror(env, "GetNetworkH"); 
    return netH; 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_Attach 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1Attach 
  (JNIEnv *env, jclass class, jint Iline, jint Ivoice, jint Imode) { 
 
    if (gc_Attach(Iline, Ivoice, Imode)) 
        GCerror(env, "Attach"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_Detach 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1Detach 
  (JNIEnv *env, jclass class, jint Iline, jint Ivoice, jint Imode) { 
 
    if (gc_Detach(Iline, Ivoice, Imode)) 
        GCerror(env, "Dettach"); 
  } 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_WaitCall 
 * Signature: (III)I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_GCChannel_gc_1WaitCall 
  (JNIEnv *env, jclass class, jint Iline, jint Ito, jint Imode) { 
    long crn = 0; 
    long * crnp; 
 
    if (Imode == EV_ASYNC) 
        crnp = NULL; 
    else 
        crnp = &crn; 
 
    if (gc_WaitCall(Iline, crnp, NULL, Ito, Imode)) 
        return GCerror(env, "WaitCall"); 
    return crn; 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_AcceptCall 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1AcceptCall 
  (JNIEnv *env, jclass class, jint Icrn, jint Irings, jint Imode) { 
 
    if (gc_AcceptCall(Icrn, Irings, Imode)) 
        GCerror(env, "AcceptCall"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_AnswerCall 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1AnswerCall 
  (JNIEnv *env, jclass class, jint Icrn, jint Irings, jint Imode) { 
 
    if (gc_AnswerCall(Icrn, Irings, Imode)) 
        GCerror(env, "AnswerCall"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_CallAck 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1CallAck 
  (JNIEnv *env, jclass class, jint Icrn, jint Idnis, jint Imode) { 
    GC_CALLACK_BLK callack; 
    callack.type = GCACK_SERVICE_DNIS; 
    callack.service.dnis.accept = Idnis; 
 
    if (gc_CallAck(Icrn, &callack, Imode)) 
        GCerror(env, "CallAck"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_DropCall 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1DropCall 
  (JNIEnv *env, jclass class, jint Icrn, jint Icause, jint Imode) { 
 
    if (gc_DropCall(Icrn, Icause, Imode)) 
        GCerror(env, "DropCall"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_GetDNIS 
 * Signature: (I[B)V 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_GCChannel_gc_1GetDNIS 
  (JNIEnv *env, jclass class, jint Icrn, jbyteArray BAbuf) { 
    char *bufp; 
    int l; 
 
    if ((*env)->GetArrayLength(env, BAbuf) < 5) { 
        throw(env, "java/lang/RuntimeException", "Small buffer for GetDNIS"); 
        return -1; 
    } 
    bufp = (*env)->GetByteArrayElements(env, BAbuf, 0); 
    if (gc_GetDNIS(Icrn, bufp)) { 
        GCerror(env, "GetDNIS"); 
        return -1; 
    } 
    l = strlen(bufp); 
    (*env)->ReleaseByteArrayElements(env, BAbuf, bufp, 0); 
    return l; 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_GetANI 
 * Signature: (I[B)V 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_GCChannel_gc_1GetANI 
  (JNIEnv *env, jclass class, jint Icrn, jbyteArray BAbuf) { 
    char *bufp; 
    int l; 
 
    if ((*env)->GetArrayLength(env, BAbuf) < 15) { 
        throw(env, "java/lang/RuntimeException", "Small buffer for GetANI"); 
        return -1; 
    } 
    bufp = (*env)->GetByteArrayElements(env, BAbuf, 0); 
    if (gc_GetANI(Icrn, bufp)) { 
        GCerror(env, "GetANI"); 
        return -1; 
    } 
    l = strlen(bufp); 
    (*env)->ReleaseByteArrayElements(env, BAbuf, bufp, 0); 
    return l; 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_GetCallInfo 
 * Signature: (II[B)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1GetCallInfo 
  (JNIEnv *env, jclass class, jint Icrn, jint Iid, jbyteArray BAbuf) { 
    char buf[32], *bufp; 
    int l = 0; 
 
    if (gc_GetCallInfo(Icrn, Iid, buf)) { 
        GCerror(env, "GetCallInfo"); 
        return; 
    } 
 
 
    l = (*env)->GetArrayLength(env, BAbuf); 
    bufp = (*env)->GetByteArrayElements(env, BAbuf, 0); 
    strncpy(bufp, buf, l); 
    (*env)->ReleaseByteArrayElements(env, BAbuf, bufp, 0); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_GetParm 
 * Signature: (II)I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_GCChannel_gc_1GetParm 
  (JNIEnv *env, jclass class, jint Iline, jint Iid) { 
    GC_PARM parm; 
 
    if (gc_GetParm(Iline, Iid, &parm)) 
        return GCerror(env, "GetParm"); 
    return parm.longvalue; 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_SetParm 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1SetParm 
  (JNIEnv *env, jclass class, jint Iline, jint Iid, jint Ival) { 
    GC_PARM parm; 
 
    parm.longvalue = Ival; 
    if (gc_SetParm(Iline, Iid, parm)) 
        GCerror(env, "SetParm"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_MakeCall 
 * Signature: (ILjava/lang/String;II)I 
 */ 
JNIEXPORT jint JNICALL Java_local_dialogic_GCChannel_gc_1MakeCall 
  (JNIEnv *env, jclass class, jint Iline, jstring Snumber, jint Ito, jint Imode) { 
    char * number; 
    long crn; 
 
    number = (char *)(*env)->GetStringUTFChars(env, Snumber, 0); 
 
    if (gc_MakeCall(Iline, &crn, number, 0L, Ito, Imode)) { 
        GCerror(env, "MakeCall"); 
    } 
    (*env)->ReleaseStringUTFChars(env, Snumber, number); 
    return crn; 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_ReleaseCall 
 * Signature: (I)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1ReleaseCall 
  (JNIEnv *env, jclass class, jint Icrn) { 
    if (gc_ReleaseCall(Icrn)) 
        GCerror(env, "ReleaseCall"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_ResetLineDev 
 * Signature: (II)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1ResetLineDev 
  (JNIEnv *env, jclass class, jint Iline, jint Imode) { 
    if (gc_ResetLineDev(Iline, Imode)) 
        GCerror(env, "ResetLineDev"); 
  } 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_SetBilling 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1SetBilling 
  (JNIEnv *env, jclass class, jint Icrn, jint Irate, jint Imode) { 
 
    if (gc_SetBilling(Icrn, Irate, 0L, Imode)) 
        GCerror(env, "SetBilling"); 
  } 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_SetChanState 
 * Signature: (III)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1SetChanState 
  (JNIEnv *env, jclass class, jint Iline, jint Istate, jint Imode) { 
 
    if (gc_SetChanState(Iline, Istate, Imode)) 
        GCerror(env, "SetChanState"); 
  } 
 
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 evtCRNID = 0; 
struct DX_CST { 
   unsigned short cst_event; 
   unsigned short cst_data; 
} *rs_getevtdata(); 
 
/* 
 * Class:     local_dialogic_GCChannel 
 * Method:    gc_waitevt 
 * Signature: (Llocal/dialogic/EVT;)V 
 */ 
JNIEXPORT void JNICALL Java_local_dialogic_GCChannel_gc_1getMeta 
  (JNIEnv *env, jclass class, jobject Oevt) 
{ 
    METAEVENT meta; 
 
    if (evtClass == 0) { 
        jclass clst; 
        clst = (*env)->GetObjectClass(env, Oevt); 
        if (clst == 0) { 
            throw(env, "java/lang/RuntimeException", 
                "Class EVT not found!"); 
            return; 
        } 
        evtClass = (*env)->NewGlobalRef(env, clst); 
        if (evtClass == 0) { 
            throw(env, "java/lang/RuntimeException", 
                        "Class EVT reference error!"); 
            return; 
        } 
 
        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"); 
        evtCRNID = (*env)->GetFieldID(env, evtClass, "crn", "J"); 
    } 
    gc_GetMetaEvent(&meta); 
    (*env)->SetIntField(env, Oevt, evtLineID, meta.linedev); 
    (*env)->SetIntField(env, Oevt, evtCRNID, meta.crn); 
} 
 
 
GCerror(JNIEnv env, char *where) 
{ 
    int gcerror = 0, cclib = 0; 
    long ccerror = 0; 
    char errbuf[128]; 
    gc_ErrorValue(&gcerror, &cclib, &ccerror); 
     
    sprintf(errbuf, "%s: (0x%x/0x%x/0x%x)", where, gcerror, cclib, ccerror); 
    throw(env, "java/lang/RuntimeException", errbuf); 
    return -1; 
} 
 
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); 
}