LINEADDRESSCAPS *tapi_line_getaddrcaps(uint dev, DWORD addrID) { LINEADDRESSCAPS *ad=NULL; LONG retval; int size; size = sizeof(LINEADDRESSCAPS) + 256; while (1) { DWORD apiver; LINEEXTENSIONID extid; retval = lineNegotiateAPIVersion(TapiObj.hObj, dev, TAPI_VERSION, TAPI_VERSION, &apiver, &extid); if (retval != 0) return NULL; ad = (LINEADDRESSCAPS *)realloc(ad, size); if (!ad) return NULL; memset(ad, 0, size); ad->dwTotalSize = size; retval = lineGetAddressCaps(TapiObj.hObj, dev, addrID, apiver, 0, ad); if (retval!=0) { free(ad); return NULL; } if (ad->dwNeededSize > ad->dwTotalSize) { size = ad->dwNeededSize; continue; } else break; } return ad; }
LINEDEVCAPS *tapi_getdevcaps(uint dev) { LINEDEVCAPS *pcaps=NULL; LONG retval, size; DWORD apiver; size = sizeof(LINEDEVCAPS) + 256; while (1) { LINEEXTENSIONID extid; retval = lineNegotiateAPIVersion(TapiObj.hObj, dev, TAPI_VERSION, TAPI_VERSION, &apiver, &extid); if (retval != 0) return NULL; pcaps = (LINEDEVCAPS *)realloc(pcaps, size); if (!pcaps) return NULL; memset(pcaps, 0, size); pcaps->dwTotalSize = size; retval = lineGetDevCaps(TapiObj.hObj, dev, apiver, 0, pcaps); if (retval!=0) { free(pcaps); return NULL; } if (pcaps->dwNeededSize > pcaps->dwTotalSize) { size = pcaps->dwNeededSize; continue; } else break; } return pcaps; }
int xtapi_enumdevices(TapiDevice *dev, int num) { LONG retval; int i; Assert(TapiObj.hObj != NULL); Assert(num <= TapiObj.num_devs); for (i = 0; i < num; i++) { LINEEXTENSIONID extid; LINEDEVCAPS *caps; caps = tapi_getdevcaps(i); if (caps == NULL) return XTAPI_OUT_OF_MEMORY; if ((caps->dwBearerModes & LINEBEARERMODE_VOICE) && (caps->dwMediaModes & LINEMEDIAMODE_DATAMODEM)) { dev[i].type = XTAPI_MODEM_DEVICE; } else dev[i].type = 0; retval = lineNegotiateAPIVersion(TapiObj.hObj, i, TAPI_VERSION, TAPI_VERSION, (DWORD *)&dev[i].apiver, &extid); if (retval == LINEERR_INCOMPATIBLEAPIVERSION) return XTAPI_INCOMPATIBLE_VERSION; else if (retval != 0) return xtapi_err(retval); dev[i].id = i; dev[i].min_baud = (uint)caps->dwMaxRate; dev[i].max_baud = (uint)caps->dwMaxRate; free(caps); } return XTAPI_SUCCESS; }
JNIEXPORT jint JNICALL Java_net_xtapi_serviceProvider_MSTAPI_openLine (JNIEnv *pEnv, jobject oObj, jint lLine, jobject oTerminalName) { long lRc; DWORD lNegVer; char szDebug[256]; long lUnused = 0; long sizeBuffer; HLINE hLine; LINEEXTENSIONID lpExtensionID; LPLINEDEVCAPS lpLineDevCaps = NULL; lRc = lineNegotiateAPIVersion(g_hTAPI, lLine, TAPIVERSION, TAPIVERSION, &lNegVer, &lpExtensionID); if(TAPIVERSION == lNegVer) { wsprintf(szDebug,"Negotiated TAPI 1.4 on line %d.",lLine); debugString(8,"openLine",szDebug,_where()); } else { wsprintf(szDebug,"Failed to Negotiate TAPI 1.4 on line %d.",lLine); debugString(4,"openLine",szDebug,_where()); return -1; } lRc = lineOpen(g_hTAPI, lLine, &hLine, lNegVer, lUnused, lLine, LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_AUTOMATEDVOICE, 0); wsprintf(szDebug,"lineOpen on line %d returned with %d",lLine, lRc); if(lRc < 0) { debugString(4,"openLine",szDebug,_where()); return lRc; } else debugString(8,"openLine",szDebug,_where()); sizeBuffer = sizeof(lpLineDevCaps) + 1024; lpLineDevCaps = (LINEDEVCAPS *) malloc(sizeBuffer); memset(lpLineDevCaps, 0, sizeBuffer); lpLineDevCaps->dwTotalSize = sizeBuffer; lRc = lineGetDevCaps(g_hTAPI, lLine, lNegVer, 0, lpLineDevCaps); wsprintf(szDebug,"lineGetDevCaps returned -> %d",lRc); debugString(8,"openLine",szDebug,_where()); if(0 == lRc) { if(lpLineDevCaps->dwLineNameSize > 0) { // lpLineDevCaps holds the name of the terminal, push that name up // to Java. long lpName = (long)lpLineDevCaps + lpLineDevCaps->dwLineNameOffset; jstring oName = pEnv->NewStringUTF((const char *)lpName); jclass cls; jmethodID mid; cls = pEnv->GetObjectClass (oTerminalName); mid = pEnv->GetMethodID(cls,"append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;"); pEnv->CallObjectMethod (oTerminalName, mid, oName); } lRc = lineSetStatusMessages(hLine,lpLineDevCaps->dwLineStates,0); if(lRc != 0) { debugString(4,"openLine","lineSetStatusMessages failed",_where()); hLine = (HLINE)-1; } } free(lpLineDevCaps); return (long)hLine; }