X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=remote.cpp;h=cb6e528da1b6891470465a18937baf60759077de;hp=ceb3ebc34067f1365c838eb0fab374bd3da4fa03;hb=034d3a91404addedc1c7a3494862c79532b0b878;hpb=68ccf0448d7b69c8223e5e8b066e8cd9ee0803f0 diff --git a/remote.cpp b/remote.cpp index ceb3ebc..cb6e528 100644 --- a/remote.cpp +++ b/remote.cpp @@ -24,6 +24,7 @@ Premote::Premote(int type, char *portname, struct port_settings *settings, struc p_r_ref = new_remote++; SCPY(p_r_remote_app, interface->remote_app); p_r_tones = (interface->is_tones == IS_YES); + p_r_earlyb = (interface->is_earlyb == IS_YES); /* send new ref to remote socket */ memset(¶m, 0, sizeof(union parameter)); @@ -80,9 +81,11 @@ int Premote::message_epoint(unsigned int epoint_id, int message_type, union para else SCPY(param->setup.dialinginfo.context, "lcr"); } - /* screen */ + memcpy(&p_dialinginfo, ¶m->setup.dialinginfo, sizeof(p_dialinginfo)); + memcpy(&p_capainfo, ¶m->setup.capainfo, sizeof(p_capainfo)); memcpy(&p_callerinfo, ¶m->setup.callerinfo, sizeof(p_callerinfo)); memcpy(&p_redirinfo, ¶m->setup.redirinfo, sizeof(p_redirinfo)); + /* screen */ do_screen(1, p_callerinfo.id, sizeof(p_callerinfo.id), &p_callerinfo.ntype, &p_callerinfo.present, p_interface_name); do_screen(1, p_callerinfo.id2, sizeof(p_callerinfo.id2), &p_callerinfo.ntype2, &p_callerinfo.present2, p_interface_name); do_screen(1, p_redirinfo.id, sizeof(p_redirinfo.id), &p_redirinfo.ntype, &p_redirinfo.present, p_interface_name); @@ -101,6 +104,7 @@ int Premote::message_epoint(unsigned int epoint_id, int message_type, union para break; case MESSAGE_CONNECT: + memcpy(&p_connectinfo, ¶m->connectinfo, sizeof(p_connectinfo)); new_state(PORT_STATE_CONNECT); break; @@ -136,8 +140,28 @@ void Premote::message_remote(int message_type, union parameter *param) switch (message_type) { case MESSAGE_TRAFFIC: + if (p_dov_rx) + dov_rx(param->traffic.data, param->traffic.len); + /* record audio */ + if (p_record) + record(param->traffic.data, param->traffic.len, 0); // from down + if (p_tap) + tap(param->traffic.data, param->traffic.len, 0); // from down bridge_tx(param->traffic.data, param->traffic.len); - break; + if (p_tone_name[0]) { + read_audio(param->traffic.data, param->traffic.len); + /* record audio */ + if (p_record) + record(param->traffic.data, param->traffic.len, 1); // from up + if (p_tap) + tap(param->traffic.data, param->traffic.len, 1); // from up + admin_message_from_lcr(p_r_remote_id, p_r_ref, MESSAGE_TRAFFIC, param); + } else if (p_dov_tx) { + /* use receeived traffic to trigger sending DOV */ + dov_tx(param->traffic.data, param->traffic.len); + admin_message_from_lcr(p_r_remote_id, p_r_ref, MESSAGE_TRAFFIC, param); + } + return; case MESSAGE_SETUP: interface = getinterfacebyname(p_interface_name); @@ -168,6 +192,11 @@ void Premote::message_remote(int message_type, union parameter *param) epointlist_new(epoint->ep_serial); + memcpy(&p_dialinginfo, ¶m->setup.dialinginfo, sizeof(p_dialinginfo)); + memcpy(&p_capainfo, ¶m->setup.capainfo, sizeof(p_capainfo)); + memcpy(&p_callerinfo, ¶m->setup.callerinfo, sizeof(p_callerinfo)); + memcpy(&p_redirinfo, ¶m->setup.redirinfo, sizeof(p_redirinfo)); + new_state(PORT_STATE_IN_SETUP); break; @@ -180,6 +209,7 @@ void Premote::message_remote(int message_type, union parameter *param) break; case MESSAGE_CONNECT: + memcpy(&p_connectinfo, ¶m->connectinfo, sizeof(p_connectinfo)); new_state(PORT_STATE_CONNECT); break; @@ -209,12 +239,24 @@ int Premote::bridge_rx(unsigned char *data, int len) { union parameter newparam; int l; - - /* don't send tones, if not enabled or not connected */ - if (!p_r_tones - && p_state != PORT_STATE_CONNECT) + int ret; + + if ((ret = Port::bridge_rx(data, len))) + return ret; + + /* send tones, if connected, or if early audio is enabled in proceeding/alerting state */ + if (p_state != PORT_STATE_CONNECT + && !(p_r_earlyb + && (p_state == PORT_STATE_OUT_PROCEEDING + || p_state == PORT_STATE_OUT_ALERTING)) + && !(p_r_tones + && (p_state == PORT_STATE_IN_PROCEEDING + || p_state == PORT_STATE_IN_ALERTING))) return 0; + if (p_tone_name[0]) + return 0; + memset(&newparam, 0, sizeof(union parameter)); /* split, if exeeds data size */ while(len) { @@ -223,6 +265,11 @@ int Premote::bridge_rx(unsigned char *data, int len) len -= l; memcpy(newparam.traffic.data, data, l); data += l; + /* record audio */ + if (p_record) + record(data, len, 1); // from up + if (p_tap) + tap(data, len, 1); // from up admin_message_from_lcr(p_r_remote_id, p_r_ref, MESSAGE_TRAFFIC, &newparam); }