[ekiga] Added SIP support for auto-answer.



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]