diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2016-07-20 11:58:12 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2016-07-24 12:31:07 +0200 |
commit | 4745b291158fd5b10255f5cb18fed838c2125af0 (patch) | |
tree | 5ad44b8852287010b7eb230709b85ae84151b333 /src/common | |
parent | ba8bf0e9d535f1c9a4848a243ac1d5c700fbb3e6 (diff) |
NMT: Caller ID support
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/call.c | 53 | ||||
-rw-r--r-- | src/common/call.h | 14 |
2 files changed, 53 insertions, 14 deletions
diff --git a/src/common/call.c b/src/common/call.c index 20ea796..6e7ab2f 100644 --- a/src/common/call.c +++ b/src/common/call.c @@ -491,7 +491,7 @@ dial_after_hangup: call.dialing[0] = '\0'; call_new_state(CALL_SETUP_MT); call.callref = callref; - rc = call_out_setup(callref, call.station_id); + rc = call_out_setup(callref, "", TYPE_NOTAVAIL, call.station_id); if (rc < 0) { PDEBUG(DCALL, DEBUG_NOTICE, "Call rejected, cause %d\n", -rc); call_new_state(CALL_DISCONNECTED); @@ -712,7 +712,7 @@ void call_in_alerting(int callref) } /* Transceiver indicates answer. */ -static void _indicate_answer(int callref, const char *connectid) +static void _indicate_answer(int callref, const char *connect_id) { uint8_t buf[sizeof(struct gsm_mncc)]; struct gsm_mncc *mncc = (struct gsm_mncc *)buf; @@ -721,23 +721,28 @@ static void _indicate_answer(int callref, const char *connectid) mncc->msg_type = MNCC_SETUP_CNF; mncc->callref = callref; mncc->fields |= MNCC_F_CONNECTED; - strncpy(mncc->connected.number, connectid, sizeof(mncc->connected.number) - 1); - mncc->connected.type = 0; + /* copy connected number as subscriber number */ + strncpy(mncc->connected.number, connect_id, sizeof(mncc->connected.number)); + mncc->connected.type = 4; + mncc->connected.plan = 1; + mncc->connected.present = 0; + mncc->connected.screen = 3; + PDEBUG(DMNCC, DEBUG_INFO, "Indicate MNCC answer towards Network\n"); mncc_write(buf, sizeof(struct gsm_mncc)); } -void call_in_answer(int callref, const char *connectid) +void call_in_answer(int callref, const char *connect_id) { if (!callref) { PDEBUG(DCALL, DEBUG_DEBUG, "Ignoring answer, because callref not set. (not for us)\n"); return; } - PDEBUG(DCALL, DEBUG_INFO, "Call has been answered by '%s'\n", connectid); + PDEBUG(DCALL, DEBUG_INFO, "Call has been answered by '%s'\n", connect_id); if (use_mncc_sock) { - _indicate_answer(callref, connectid); + _indicate_answer(callref, connect_id); set_pattern_process(callref, PATTERN_NONE); set_state_process(callref, CALL_CONNECT); return; @@ -749,7 +754,7 @@ void call_in_answer(int callref, const char *connectid) return; } call_new_state(CALL_CONNECT); - strncpy(call.station_id, connectid, call.dial_digits); + strncpy(call.station_id, connect_id, call.dial_digits); call.station_id[call.dial_digits] = '\0'; } @@ -856,6 +861,8 @@ void call_mncc_recv(uint8_t *buf, int length) { struct gsm_mncc *mncc = (struct gsm_mncc *)buf; char number[sizeof(mncc->called.number)]; + char caller_id[sizeof(mncc->calling.number)]; + enum number_type caller_type; int callref; int rc; @@ -870,7 +877,6 @@ void call_mncc_recv(uint8_t *buf, int length) } callref = mncc->callref; - strcpy(number, mncc->called.number); if (is_process_disconnected(callref)) { switch(mncc->msg_type) { @@ -898,7 +904,30 @@ void call_mncc_recv(uint8_t *buf, int length) switch(mncc->msg_type) { case MNCC_SETUP_REQ: - PDEBUG(DMNCC, DEBUG_INFO, "Received MNCC call from Network to '%s'\n", mncc->called.number); + strcpy(number, mncc->called.number); + + /* caller ID conversion */ + strcpy(caller_id, mncc->calling.number); + switch(mncc->calling.type) { + case 1: + caller_type = TYPE_INTERNATIONAL; + break; + case 2: + caller_type = TYPE_NATIONAL; + break; + case 4: + caller_type = TYPE_SUBSCRIBER; + break; + default: /* or 0 */ + caller_type = TYPE_UNKNOWN; + break; + } + if (!caller_id[0]) + caller_type = TYPE_NOTAVAIL; + if (mncc->calling.present == 1) + caller_type = TYPE_ANONYMOUS; + + PDEBUG(DMNCC, DEBUG_INFO, "Received MNCC call from Network to '%s'\n", caller_id); if (mncc->callref >= 0x4000000) { fprintf(stderr, "Invalid callref from network, please fix!\n"); @@ -916,11 +945,11 @@ void call_mncc_recv(uint8_t *buf, int length) mncc_write(buf, sizeof(struct gsm_mncc)); - PDEBUG(DCALL, DEBUG_INFO, "Outgoing call from to '%s'\n", number); + PDEBUG(DCALL, DEBUG_INFO, "Outgoing call from '%s' to '%s'\n", caller_id, number); create_process(callref, CALL_SETUP_MT); - rc = call_out_setup(callref, number); + rc = call_out_setup(callref, caller_id, caller_type, number); if (rc < 0) { PDEBUG(DCALL, DEBUG_NOTICE, "Call rejected, cause %d\n", -rc); if (send_patterns) { diff --git a/src/common/call.h b/src/common/call.h index aa38c97..a540aac 100644 --- a/src/common/call.h +++ b/src/common/call.h @@ -1,4 +1,14 @@ +/* number type, includes presentation info */ +enum number_type { + TYPE_NOTAVAIL, + TYPE_ANONYMOUS, + TYPE_UNKNOWN, + TYPE_SUBSCRIBER, + TYPE_NATIONAL, + TYPE_INTERNATIONAL, +}; + int call_init(const char *station_id, const char *sounddev, int samplerate, int latency, int dial_digits, int loopback); void call_cleanup(void); void process_call(int c); @@ -6,11 +16,11 @@ void process_call(int c); /* received messages */ int call_in_setup(int callref, const char *callerid, const char *dialing); void call_in_alerting(int callref); -void call_in_answer(int callref, const char *connecid); +void call_in_answer(int callref, const char *connect_id); void call_in_release(int callref, int cause); /* send messages */ -int call_out_setup(int callref, char *dialing); +int call_out_setup(int callref, const char *caller_id, enum number_type caller_type, const char *dialing); void call_out_disconnect(int callref, int cause); void call_out_release(int callref, int cause); |