[asterisk-scf-commits] asterisk-scf/integration/sip.git branch "redirect" created.

Commits to the Asterisk SCF project code repositories asterisk-scf-commits at lists.digium.com
Tue Nov 29 15:46:06 CST 2011


branch "redirect" has been created
        at  4aa216e43cea3860439e9b7adf16f42a430fa3b1 (commit)

- Log -----------------------------------------------------------------
commit 4aa216e43cea3860439e9b7adf16f42a430fa3b1
Author: Mark Michelson <mmichelson at digium.com>
Date:   Mon Oct 31 10:24:55 2011 -0500

    Add a comment explaining something.

diff --git a/src/PJSipSessionModule.cpp b/src/PJSipSessionModule.cpp
index 61809ee..2b0b571 100644
--- a/src/PJSipSessionModule.cpp
+++ b/src/PJSipSessionModule.cpp
@@ -1552,6 +1552,8 @@ protected:
         SessionRouterPrx router =
             SessionRouterPrx::uncheckedCast(asyncResult->getProxy());
 
+        //We default to the STOP state. This way, when the redirection
+        //is successful, PJSIP will not do anything further redirecting.
         pjsip_redirect_op op = PJSIP_REDIRECT_STOP;
 
         try

commit bf884a73730e769375added2f477bc278c79d6ea
Author: Mark Michelson <mmichelson at digium.com>
Date:   Fri Oct 28 13:26:56 2011 -0500

    Add redirecting support to the session manager.
    
    This doesn't add redirecting party info into the forwarded call at this
    point. It will be easier to do once the party-id branch is merged.

diff --git a/src/PJSipSessionModule.cpp b/src/PJSipSessionModule.cpp
index 5e5e8dc..61809ee 100644
--- a/src/PJSipSessionModule.cpp
+++ b/src/PJSipSessionModule.cpp
@@ -1518,37 +1518,73 @@ void PJSipSessionModule::invOnMediaUpdate(pjsip_inv_session *inv, pj_status_t)
 class HandleRedirection : public SipQueueableOperation
 {
 public:
-    HandleRedirection(pjsip_inv_session *inv, const std::vector<pjsip_contact_hdr*>& contacts)
-        : mInv(inv), mContacts(contacts) { }
+    HandleRedirection(pjsip_inv_session *inv,
+            const std::string& contact,
+            const AsteriskSCF::Discovery::SmartProxy<SessionRouterPrx>& router,
+            const SipSessionPtr& session)
+        : mInv(inv), mContact(contact), mRouter(router), mSession(session) { }
 
 protected:
-    SuspendableWorkResult execute (const SuspendableWorkListenerPtr&)
+    SuspendableWorkResult initial(const SuspendableWorkListenerPtr&)
     {
-        for (std::vector<pjsip_contact_hdr*>::iterator iter = mContacts.begin();
-                iter != mContacts.end(); ++iter)
+        try
         {
-            pjsip_sip_uri *sipURI = (pjsip_sip_uri*) pjsip_uri_get_uri((*iter)->uri);
+            SuspendableWorkListenerPtr listener = 0;
+            SipAMICallbackPtr cb(new SipAMICallback(listener, mSession, this, false, true));
+            Ice::CallbackPtr d = Ice::newCallback(cb, &SipAMICallback::callback);
+            mRouter->begin_connectBridgedSessionsWithDestination(
+                    IceUtil::generateUUID(),
+                    mSession->getSessionProxy(),
+                    mContact,
+                    true,
+                    0,
+                    d);
+        }
+        catch (const Ice::CommunicatorDestroyedException&)
+        {
+            pjsip_inv_process_redirect(mInv, PJSIP_REDIRECT_REJECT, NULL);
+        }
+        return Complete;
+    }
+
+    SuspendableWorkResult calledBack(const Ice::AsyncResultPtr& asyncResult)
+    {
+        SessionRouterPrx router =
+            SessionRouterPrx::uncheckedCast(asyncResult->getProxy());
+
+        pjsip_redirect_op op = PJSIP_REDIRECT_STOP;
 
+        try
+        {
+            router->end_connectBridgedSessionsWithDestination(asyncResult);
+        }
+        catch (const std::exception&)
+        {
+            op = PJSIP_REDIRECT_REJECT;
         }
-        pjsip_inv_process_redirect(mInv, PJSIP_REDIRECT_STOP, NULL);
+
+        pjsip_inv_process_redirect(mInv, op, NULL);
+        return Complete;
     }
+
 private:
     pjsip_inv_session *mInv;
-    std::vector<pjsip_contact_hdr*> mContacts;
+    const std::string mContact;
+    AsteriskSCF::Discovery::SmartProxy<SessionRouterPrx> mRouter;
+    SipSessionPtr mSession;
 };
 
-pjsip_redirect_op PJSipSessionModule::invOnRedirected(pjsip_inv_session*, const pjsip_uri*,
+pjsip_redirect_op PJSipSessionModule::invOnRedirected(pjsip_inv_session* inv, const pjsip_uri* uri,
         const pjsip_event*)
 {
-    std::vector<pjsip_contact_hdr *> contacts;
-    pjsip_contact_hdr *contact = (pjsip_contact_hdr *) &rdata->msg_info.msg->hdr;
-    while ((contact = (pjsip_contact_hdr *) pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, contact->next)))
-    {
-        pjsip_contact_hdr *newContact = pjsip_contact_hdr_create(rdata->tp_info.pool);
-        contacts.push_back(newContact);
-    }
+    pjsip_sip_uri *sipURI = (pjsip_sip_uri *) pjsip_uri_get_uri(uri);
+
+    std::string contact(pj_strbuf(&sipURI->user), pj_strlen(&sipURI->user));
+
+    PJSipSessionModInfo *session_mod_info = (PJSipSessionModInfo*) inv->mod_data[mModule.id];
+    SipSessionPtr session = session_mod_info->getSessionPtr();
 
-    enqueueSessionWork(new HandleRedirection(inv, contacts));
+    enqueueSessionWork(new HandleRedirection(inv, contact, mSessionRouter, session), inv);
     return PJSIP_REDIRECT_PENDING;
 }
 

commit 98f8e367eacec34fa09ceb7e8f703dfe9f548200
Author: Mark Michelson <mmichelson at digium.com>
Date:   Thu Oct 27 17:44:16 2011 -0500

    Add initial redirection work.

diff --git a/src/PJSipSessionModule.cpp b/src/PJSipSessionModule.cpp
index 9504d47..5e5e8dc 100644
--- a/src/PJSipSessionModule.cpp
+++ b/src/PJSipSessionModule.cpp
@@ -1515,11 +1515,41 @@ void PJSipSessionModule::invOnMediaUpdate(pjsip_inv_session *inv, pj_status_t)
     enqueueSessionWork(new HandleMediaUpdate(inv, mModule.id, mServiceLocator), inv);
 }
 
+class HandleRedirection : public SipQueueableOperation
+{
+public:
+    HandleRedirection(pjsip_inv_session *inv, const std::vector<pjsip_contact_hdr*>& contacts)
+        : mInv(inv), mContacts(contacts) { }
+
+protected:
+    SuspendableWorkResult execute (const SuspendableWorkListenerPtr&)
+    {
+        for (std::vector<pjsip_contact_hdr*>::iterator iter = mContacts.begin();
+                iter != mContacts.end(); ++iter)
+        {
+            pjsip_sip_uri *sipURI = (pjsip_sip_uri*) pjsip_uri_get_uri((*iter)->uri);
+
+        }
+        pjsip_inv_process_redirect(mInv, PJSIP_REDIRECT_STOP, NULL);
+    }
+private:
+    pjsip_inv_session *mInv;
+    std::vector<pjsip_contact_hdr*> mContacts;
+};
+
 pjsip_redirect_op PJSipSessionModule::invOnRedirected(pjsip_inv_session*, const pjsip_uri*,
         const pjsip_event*)
 {
-    //stub
-    return PJSIP_REDIRECT_REJECT;
+    std::vector<pjsip_contact_hdr *> contacts;
+    pjsip_contact_hdr *contact = (pjsip_contact_hdr *) &rdata->msg_info.msg->hdr;
+    while ((contact = (pjsip_contact_hdr *) pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, contact->next)))
+    {
+        pjsip_contact_hdr *newContact = pjsip_contact_hdr_create(rdata->tp_info.pool);
+        contacts.push_back(newContact);
+    }
+
+    enqueueSessionWork(new HandleRedirection(inv, contacts));
+    return PJSIP_REDIRECT_PENDING;
 }
 
 pjsip_dialog *PJSipSessionModule::uaOnDialogForked(pjsip_dialog*, pjsip_rx_data*)

-----------------------------------------------------------------------


-- 
asterisk-scf/integration/sip.git



More information about the asterisk-scf-commits mailing list