[ekiga] Added SIP support for auto-answer.
- From: Damien Sandras <dsandras src gnome org>
- To: svn-commits-list gnome org
- Subject: [ekiga] Added SIP support for auto-answer.
- Date: Sun, 17 May 2009 13:59:57 -0400 (EDT)
commit 03b0fc153db1007297a72691f7593fda36c6f2f9
Author: Damien Sandras <dsandras seconix com>
Date: Fri May 1 19:21:33 2009 +0200
Added SIP support for auto-answer.
If the incoming INVITE contains ;ring-answer=0 in the Alert-Info SIP
header, then the call will be auto-answered. It works like most brands
of IP phones nowadays.
---
lib/engine/components/opal/sip-endpoint.cpp | 36 +++++++++++++++++++++++++-
lib/engine/components/opal/sip-endpoint.h | 3 ++
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/lib/engine/components/opal/sip-endpoint.cpp b/lib/engine/components/opal/sip-endpoint.cpp
index 2db63c6..de033e8 100644
--- a/lib/engine/components/opal/sip-endpoint.cpp
+++ b/lib/engine/components/opal/sip-endpoint.cpp
@@ -106,7 +106,7 @@ Opal::Sip::EndPoint::EndPoint (Opal::CallManager & _manager,
bank = smart.get ();
}
-
+ auto_answer_call = false;
protocol_name = "sip";
uri_prefix = "sip:";
listen_port = (_listen_port > 0 ? _listen_port : 5060);
@@ -966,7 +966,12 @@ Opal::Sip::EndPoint::OnIncomingConnection (OpalConnection &connection,
if (!forward_uri.empty () && manager.get_forward_on_no_answer ())
call->set_no_answer_forward (manager.get_reject_delay (), forward_uri);
- else
+ else if (auto_answer_call) {
+ call->answer ();
+ auto_answer_call = false;
+ std::cout << "Should auto answer" << std::endl << std::flush;
+ }
+ else // Pending
call->set_reject_delay (manager.get_reject_delay ());
}
@@ -977,6 +982,33 @@ Opal::Sip::EndPoint::OnIncomingConnection (OpalConnection &connection,
}
+PBoolean
+Opal::Sip::EndPoint::OnReceivedINVITE (OpalTransport & /*transport*/,
+ SIP_PDU * pdu)
+{
+ if (pdu == NULL)
+ return true;
+
+ PString str;
+ int appearance;
+
+ pdu->GetMIME ().GetAlertInfo (str, appearance);
+ static const char ringanswer[] = ";ring-answer=";
+ int autoanswer = -1;
+ PINDEX end = str.Find ('>');
+ PINDEX pos = str.Find (ringanswer, end);
+
+ if (pos != P_MAX_INDEX) {
+ autoanswer = str.Mid (pos+sizeof (ringanswer)).AsUnsigned();
+ }
+
+ if (autoanswer > 0)
+ std::cout << "Auto-Answer" << std::endl << std::flush;
+
+ return true;
+}
+
+
bool
Opal::Sip::EndPoint::OnReceivedMESSAGE (OpalTransport & transport,
SIP_PDU & pdu)
diff --git a/lib/engine/components/opal/sip-endpoint.h b/lib/engine/components/opal/sip-endpoint.h
index f401f06..5a4d061 100644
--- a/lib/engine/components/opal/sip-endpoint.h
+++ b/lib/engine/components/opal/sip-endpoint.h
@@ -176,6 +176,8 @@ namespace Opal {
void OnDialogInfoReceived (const SIPDialogNotification & info);
+ PBoolean OnReceivedINVITE (OpalTransport & transport, SIP_PDU * pdu);
+
bool OnReceivedMESSAGE (OpalTransport & transport,
SIP_PDU & pdu);
@@ -232,6 +234,7 @@ namespace Opal {
std::string outbound_proxy;
unsigned listen_port;
+ bool auto_answer_call;
gmref_ptr<SIP::Dialect> dialect;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]