- simplyfied read of supplementary services
This commit is contained in:
parent
ec07811d72
commit
0e85ce353d
64
chan_capi.c
64
chan_capi.c
|
@ -2571,6 +2571,11 @@ static int capi_call_deflect(struct ast_channel *c, char *param)
|
|||
ast_log(LOG_WARNING, "capi deflection requires an argument (destination phone number)\n");
|
||||
return -1;
|
||||
}
|
||||
if (!(capi_controllers[i->controller]->CD)) {
|
||||
ast_log(LOG_NOTICE,"%s: CALL DEFLECT for %s not supported by controller.\n",
|
||||
i->name, c->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((i->state != CAPI_STATE_INCALL) &&
|
||||
(i->state != CAPI_STATE_DID) &&
|
||||
|
@ -3045,6 +3050,11 @@ static int capi_retrieve(struct ast_channel *c, char *param)
|
|||
i->name, c->name);
|
||||
return -1;
|
||||
}
|
||||
if (!(capi_controllers[i->controller]->holdretrieve)) {
|
||||
ast_log(LOG_NOTICE,"%s: RETRIEVE for %s not supported by controller.\n",
|
||||
i->name, c->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fac[0] = 3; /* len */
|
||||
fac[1] = 0x03; /* retrieve */
|
||||
|
@ -3077,6 +3087,11 @@ static int capi_hold(struct ast_channel *c, char *param)
|
|||
i->name, c->name);
|
||||
return -1;
|
||||
}
|
||||
if (!(capi_controllers[i->controller]->holdretrieve)) {
|
||||
ast_log(LOG_NOTICE,"%s: HOLD for %s not supported by controller.\n",
|
||||
i->name, c->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fac[0] = 3; /* len */
|
||||
fac[1] = 0x02; /* this is a HOLD up */
|
||||
|
@ -3106,6 +3121,12 @@ static int capi_malicious(struct ast_channel *c, char *param)
|
|||
_cmsg CMSG;
|
||||
char fac[4];
|
||||
|
||||
if (!(capi_controllers[i->controller]->MCID)) {
|
||||
ast_log(LOG_NOTICE,"%s: MCID for %s not supported by controller.\n",
|
||||
i->name, c->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fac[0] = 3; /* len */
|
||||
fac[1] = 0x0e; /* MCID */
|
||||
fac[2] = 0x00;
|
||||
|
@ -3474,11 +3495,12 @@ static void supported_sservices(struct ast_capi_controller *cp)
|
|||
_cmsg CMSG, CMSG2;
|
||||
struct timeval tv;
|
||||
char fac[20];
|
||||
unsigned int services;
|
||||
|
||||
memset(fac, 0, sizeof(fac));
|
||||
FACILITY_REQ_HEADER(&CMSG, ast_capi_ApplID, get_ast_capi_MessageNumber(), 0);
|
||||
FACILITY_REQ_CONTROLLER(&CMSG) = cp->controller;
|
||||
FACILITY_REQ_FACILITYSELECTOR(&CMSG) = 0x0003; /* sservices */
|
||||
FACILITY_REQ_FACILITYSELECTOR(&CMSG) = FACILITYSELECTOR_SUPPLEMENTARY;
|
||||
fac[0] = 3;
|
||||
FACILITY_REQ_FACILITYREQUESTPARAMETER(&CMSG) = (char *)&fac;
|
||||
_capi_put_cmsg(&CMSG);
|
||||
|
@ -3498,21 +3520,8 @@ static void supported_sservices(struct ast_capi_controller *cp)
|
|||
}
|
||||
}
|
||||
|
||||
/* preset all zero */
|
||||
cp->holdretrieve = 0;
|
||||
cp->terminalportability = 0;
|
||||
cp->ECT = 0;
|
||||
cp->threePTY = 0;
|
||||
cp->CF = 0;
|
||||
cp->CD = 0;
|
||||
cp->MCID = 0;
|
||||
cp->CCBS = 0;
|
||||
cp->MWI = 0;
|
||||
cp->CCNR = 0;
|
||||
cp->CONF = 0;
|
||||
|
||||
/* parse supported sservices */
|
||||
if (FACILITY_CONF_FACILITYSELECTOR(&CMSG2) != 0x0003) {
|
||||
if (FACILITY_CONF_FACILITYSELECTOR(&CMSG2) != FACILITYSELECTOR_SUPPLEMENTARY) {
|
||||
ast_log(LOG_NOTICE, "unexpected FACILITY_SELECTOR = %#x\n",
|
||||
FACILITY_CONF_FACILITYSELECTOR(&CMSG2));
|
||||
return;
|
||||
|
@ -3523,49 +3532,52 @@ static void supported_sservices(struct ast_capi_controller *cp)
|
|||
(short)FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[1]);
|
||||
return;
|
||||
}
|
||||
services = read_capi_dword(&(FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6]));
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "supplementary services : 0x%08x\n",
|
||||
services);
|
||||
|
||||
/* success, so set the features we have */
|
||||
if ((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6] & 1) == 1) {
|
||||
if (services & 0x0001) {
|
||||
cp->holdretrieve = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "HOLD/RETRIEVE\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6] & 2) >> 1) == 1) {
|
||||
if (services & 0x0002) {
|
||||
cp->terminalportability = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "TERMINAL PORTABILITY\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6] & 4) >> 2) == 1) {
|
||||
if (services & 0x0004) {
|
||||
cp->ECT = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "ECT\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6] & 8) >> 3) == 1) {
|
||||
if (services & 0x0008) {
|
||||
cp->threePTY = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "3PTY\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6] & 16) >> 4) == 1) {
|
||||
if (services & 0x0010) {
|
||||
cp->CF = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "CF\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6] & 32) >> 5) == 1) {
|
||||
if (services & 0x0020) {
|
||||
cp->CD = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "CD\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6] & 64) >> 6) == 1) {
|
||||
if (services & 0x0040) {
|
||||
cp->MCID = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "MCID\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[6] & 128) >> 7) == 1) {
|
||||
if (services & 0x0080) {
|
||||
cp->CCBS = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "CCBS\n");
|
||||
}
|
||||
if ((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[7] & 1) == 1) {
|
||||
if (services & 0x0100) {
|
||||
cp->MWI = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "MWI\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[7] & 2) >> 1) == 1) {
|
||||
if (services & 0x0200) {
|
||||
cp->CCNR = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "CCNR\n");
|
||||
}
|
||||
if (((FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(&CMSG2)[7] & 4) >> 2) == 1) {
|
||||
if (services & 0x0400) {
|
||||
cp->CONF = 1;
|
||||
cc_ast_verbose(3, 0, VERBOSE_PREFIX_4 "CONF\n");
|
||||
}
|
||||
|
|
|
@ -49,6 +49,14 @@ static inline unsigned short read_capi_word(void *m)
|
|||
val = ((unsigned char *)m)[0] | (((unsigned char *)m)[1] << 8);
|
||||
return (val);
|
||||
}
|
||||
static inline unsigned short read_capi_dword(void *m)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
val = ((unsigned char *)m)[0] | (((unsigned char *)m)[1] << 8) |
|
||||
(((unsigned char *)m)[2] << 16) | (((unsigned char *)m)[3] << 24);
|
||||
return (val);
|
||||
}
|
||||
|
||||
/*
|
||||
* definitions for compatibility with older versions of ast*
|
||||
|
|
Loading…
Reference in New Issue