[asterisk-scf-commits] asterisk-scf/integration/sip.git branch "master" updated.
Commits to the Asterisk SCF project code repositories
asterisk-scf-commits at lists.digium.com
Mon Nov 15 14:10:53 CST 2010
branch "master" has been updated
via 359f65acbf5d6fe09fe981994321bab50a1c94a6 (commit)
from cff2b66026314f6514041d8ea9c53d6cf00d5eec (commit)
Summary of changes:
src/PJSipDummyModule.h | 20 +-
src/PJSipDummyModuleConstruction.cpp | 56 +-
src/PJSipLoggingModule.cpp | 32 +-
src/PJSipLoggingModule.h | 20 +-
src/PJSipLoggingModuleConstruction.cpp | 56 +-
src/PJSipManager.cpp | 152 ++--
src/PJSipManager.h | 78 +-
src/PJSipModule.cpp | 166 ++--
src/PJSipModule.h | 52 +-
src/PJSipSessionModule.cpp | 1756 +++++++++++++++---------------
src/PJSipSessionModule.h | 96 +-
src/PJSipSessionModuleConstruction.cpp | 124 ++--
src/SipEndpoint.cpp | 330 +++---
src/SipEndpoint.h | 210 ++--
src/SipEndpointFactory.cpp | 42 +-
src/SipEndpointFactory.h | 58 +-
src/SipSession.cpp | 848 +++++++-------
src/SipSession.h | 106 +-
src/SipSessionManagerApp.cpp | 710 ++++++------
src/SipSessionManagerEndpointLocator.cpp | 14 +-
src/SipSessionManagerEndpointLocator.h | 20 +-
src/SipSessionManagerEventPublisher.cpp | 154 ++--
src/SipSessionManagerEventPublisher.h | 22 +-
src/SipStateReplicator.h | 34 +-
src/SipStateReplicatorApp.cpp | 240 ++--
src/SipStateReplicatorListener.cpp | 424 ++++----
26 files changed, 2910 insertions(+), 2910 deletions(-)
- Log -----------------------------------------------------------------
commit 359f65acbf5d6fe09fe981994321bab50a1c94a6
Author: David M. Lee <dlee at digium.com>
Date: Mon Nov 15 14:03:38 2010 -0600
Updated indentation to match the style guide.
diff --git a/src/PJSipDummyModule.h b/src/PJSipDummyModule.h
index ebf7444..02b64fe 100644
--- a/src/PJSipDummyModule.h
+++ b/src/PJSipDummyModule.h
@@ -23,16 +23,16 @@ namespace SipChannelService
class PJSipDummyModule : public PJSipModule
{
public:
- PJSipDummyModule(pjsip_endpoint *endpt);
- pj_status_t load(pjsip_endpoint *endpoint);
- pj_status_t start();
- pj_status_t stop();
- pj_status_t unload();
- pj_bool_t on_rx_request(pjsip_rx_data *rdata);
- pj_bool_t on_rx_response(pjsip_rx_data *rdata);
- pj_status_t on_tx_request(pjsip_tx_data *tdata);
- pj_status_t on_tx_response(pjsip_tx_data *tdata);
- void on_tsx_state(pjsip_transaction *tsx, pjsip_event *event);
+ PJSipDummyModule(pjsip_endpoint *endpt);
+ pj_status_t load(pjsip_endpoint *endpoint);
+ pj_status_t start();
+ pj_status_t stop();
+ pj_status_t unload();
+ pj_bool_t on_rx_request(pjsip_rx_data *rdata);
+ pj_bool_t on_rx_response(pjsip_rx_data *rdata);
+ pj_status_t on_tx_request(pjsip_tx_data *tdata);
+ pj_status_t on_tx_response(pjsip_tx_data *tdata);
+ void on_tsx_state(pjsip_transaction *tsx, pjsip_event *event);
};
};
diff --git a/src/PJSipDummyModuleConstruction.cpp b/src/PJSipDummyModuleConstruction.cpp
index 81299c1..623b3bf 100644
--- a/src/PJSipDummyModuleConstruction.cpp
+++ b/src/PJSipDummyModuleConstruction.cpp
@@ -29,68 +29,68 @@ static PJSipDummyModule *dummyModule;
static pj_status_t dummyLoad(pjsip_endpoint *endpoint)
{
- return dummyModule->load(endpoint);
+ return dummyModule->load(endpoint);
}
static pj_status_t dummyStart()
{
- return dummyModule->unload();
+ return dummyModule->unload();
}
static pj_status_t dummyStop()
{
- return dummyModule->stop();
+ return dummyModule->stop();
}
static pj_status_t dummyUnload()
{
- return dummyModule->unload();
+ return dummyModule->unload();
}
static pj_bool_t dummyOnRxRequest(pjsip_rx_data *rdata)
{
- return dummyModule->on_rx_request(rdata);
+ return dummyModule->on_rx_request(rdata);
}
static pj_bool_t dummyOnRxResponse(pjsip_rx_data *rdata)
{
- return dummyModule->on_rx_response(rdata);
+ return dummyModule->on_rx_response(rdata);
}
static pj_bool_t dummyOnTxRequest(pjsip_tx_data *tdata)
{
- return dummyModule->on_tx_request(tdata);
+ return dummyModule->on_tx_request(tdata);
}
static pj_status_t dummyOnTxResponse(pjsip_tx_data *tdata)
{
- return dummyModule->on_tx_response(tdata);
+ return dummyModule->on_tx_response(tdata);
}
static void dummyOnTsxState(pjsip_transaction *tsx, pjsip_event *event)
{
- return dummyModule->on_tsx_state(tsx, event);
+ return dummyModule->on_tsx_state(tsx, event);
}
PJSipDummyModule::PJSipDummyModule(pjsip_endpoint *endpt)
{
- dummyModule = this;
- char name[] = "Dummy Module";
- mModule.name = pj_str(name);
- mModule.priority = PJSIP_MOD_PRIORITY_APPLICATION;
- /* Note that not all PJSIP module callbacks are required.
- * If you don't wish to have one defined, feel free to set
- * it NULL in this listing and remove the corresponding
- * static function above.
- */
- mModule.load = dummyLoad;
- mModule.start = dummyStart;
- mModule.stop = dummyStop;
- mModule.unload = dummyUnload;
- mModule.on_rx_request = dummyOnRxRequest;
- mModule.on_rx_response = dummyOnRxResponse;
- mModule.on_tx_request = dummyOnTxRequest;
- mModule.on_tx_response = dummyOnTxResponse;
- mModule.on_tsx_state = dummyOnTsxState;
- pjsip_endpt_register_module(endpt, &mModule);
+ dummyModule = this;
+ char name[] = "Dummy Module";
+ mModule.name = pj_str(name);
+ mModule.priority = PJSIP_MOD_PRIORITY_APPLICATION;
+ /* Note that not all PJSIP module callbacks are required.
+ * If you don't wish to have one defined, feel free to set
+ * it NULL in this listing and remove the corresponding
+ * static function above.
+ */
+ mModule.load = dummyLoad;
+ mModule.start = dummyStart;
+ mModule.stop = dummyStop;
+ mModule.unload = dummyUnload;
+ mModule.on_rx_request = dummyOnRxRequest;
+ mModule.on_rx_response = dummyOnRxResponse;
+ mModule.on_tx_request = dummyOnTxRequest;
+ mModule.on_tx_response = dummyOnTxResponse;
+ mModule.on_tsx_state = dummyOnTsxState;
+ pjsip_endpt_register_module(endpt, &mModule);
}
diff --git a/src/PJSipLoggingModule.cpp b/src/PJSipLoggingModule.cpp
index 74fae5b..f5f8b8b 100644
--- a/src/PJSipLoggingModule.cpp
+++ b/src/PJSipLoggingModule.cpp
@@ -32,50 +32,50 @@ namespace SipSessionManager
pj_status_t PJSipLoggingModule::load(pjsip_endpoint *endpt)
{
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
}
pj_status_t PJSipLoggingModule::start()
{
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
}
pj_status_t PJSipLoggingModule::stop()
{
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
}
pj_status_t PJSipLoggingModule::unload()
{
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
}
pj_bool_t PJSipLoggingModule::on_rx_request(pjsip_rx_data *rdata)
{
- lg(Debug) << "Incoming SIP request" << std::endl;
- lg(Debug) << rdata->pkt_info.packet << std::endl;
- return PJ_FALSE;
+ lg(Debug) << "Incoming SIP request" << std::endl;
+ lg(Debug) << rdata->pkt_info.packet << std::endl;
+ return PJ_FALSE;
}
pj_bool_t PJSipLoggingModule::on_rx_response(pjsip_rx_data *rdata)
{
- lg(Debug) << "Incoming SIP response" << std::endl;
- lg(Debug) << rdata->pkt_info.packet << std::endl;
- return PJ_FALSE;
+ lg(Debug) << "Incoming SIP response" << std::endl;
+ lg(Debug) << rdata->pkt_info.packet << std::endl;
+ return PJ_FALSE;
}
pj_status_t PJSipLoggingModule::on_tx_request(pjsip_tx_data *tdata)
{
- lg(Debug) << "Outgoing SIP request" << std::endl;
- lg(Debug) << tdata->buf.start << std::endl;
- return PJ_SUCCESS;
+ lg(Debug) << "Outgoing SIP request" << std::endl;
+ lg(Debug) << tdata->buf.start << std::endl;
+ return PJ_SUCCESS;
}
pj_status_t PJSipLoggingModule::on_tx_response(pjsip_tx_data *tdata)
{
- lg(Debug) << "Outgoing SIP response" << std::endl;
- lg(Debug) << tdata->buf.start << std::endl;
- return PJ_SUCCESS;
+ lg(Debug) << "Outgoing SIP response" << std::endl;
+ lg(Debug) << tdata->buf.start << std::endl;
+ return PJ_SUCCESS;
}
void PJSipLoggingModule::on_tsx_state(pjsip_transaction *tsx, pjsip_event *event)
diff --git a/src/PJSipLoggingModule.h b/src/PJSipLoggingModule.h
index dcfce4c..043187e 100644
--- a/src/PJSipLoggingModule.h
+++ b/src/PJSipLoggingModule.h
@@ -27,16 +27,16 @@ namespace SipSessionManager
class PJSipLoggingModule : public PJSipModule
{
public:
- PJSipLoggingModule(pjsip_endpoint *endpt);
- pj_status_t load(pjsip_endpoint *endpoint);
- pj_status_t start();
- pj_status_t stop();
- pj_status_t unload();
- pj_bool_t on_rx_request(pjsip_rx_data *rdata);
- pj_bool_t on_rx_response(pjsip_rx_data *rdata);
- pj_status_t on_tx_request(pjsip_tx_data *tdata);
- pj_status_t on_tx_response(pjsip_tx_data *tdata);
- void on_tsx_state(pjsip_transaction *tsx, pjsip_event *event);
+ PJSipLoggingModule(pjsip_endpoint *endpt);
+ pj_status_t load(pjsip_endpoint *endpoint);
+ pj_status_t start();
+ pj_status_t stop();
+ pj_status_t unload();
+ pj_bool_t on_rx_request(pjsip_rx_data *rdata);
+ pj_bool_t on_rx_response(pjsip_rx_data *rdata);
+ pj_status_t on_tx_request(pjsip_tx_data *tdata);
+ pj_status_t on_tx_response(pjsip_tx_data *tdata);
+ void on_tsx_state(pjsip_transaction *tsx, pjsip_event *event);
};
};
diff --git a/src/PJSipLoggingModuleConstruction.cpp b/src/PJSipLoggingModuleConstruction.cpp
index 06e5475..99960a3 100644
--- a/src/PJSipLoggingModuleConstruction.cpp
+++ b/src/PJSipLoggingModuleConstruction.cpp
@@ -26,70 +26,70 @@ static PJSipLoggingModule *loggingModule;
static pj_status_t loggingLoad(pjsip_endpoint *endpoint)
{
- return loggingModule->load(endpoint);
+ return loggingModule->load(endpoint);
}
static pj_status_t loggingStart()
{
- return loggingModule->unload();
+ return loggingModule->unload();
}
static pj_status_t loggingStop()
{
- return loggingModule->stop();
+ return loggingModule->stop();
}
static pj_status_t loggingUnload()
{
- return loggingModule->unload();
+ return loggingModule->unload();
}
static pj_bool_t loggingOnRxRequest(pjsip_rx_data *rdata)
{
- return loggingModule->on_rx_request(rdata);
+ return loggingModule->on_rx_request(rdata);
}
static pj_bool_t loggingOnRxResponse(pjsip_rx_data *rdata)
{
- return loggingModule->on_rx_response(rdata);
+ return loggingModule->on_rx_response(rdata);
}
static pj_bool_t loggingOnTxRequest(pjsip_tx_data *tdata)
{
- return loggingModule->on_tx_request(tdata);
+ return loggingModule->on_tx_request(tdata);
}
static pj_status_t loggingOnTxResponse(pjsip_tx_data *tdata)
{
- return loggingModule->on_tx_response(tdata);
+ return loggingModule->on_tx_response(tdata);
}
static void loggingOnTsxState(pjsip_transaction *tsx, pjsip_event *event)
{
- return loggingModule->on_tsx_state(tsx, event);
+ return loggingModule->on_tsx_state(tsx, event);
}
PJSipLoggingModule::PJSipLoggingModule(pjsip_endpoint *endpt)
{
- loggingModule = this;
- char name[] = "Logging Module";
- mModule.name = pj_str(name);
- // This is the highest priority module. We do this
- // so that on outgoing messages, the transport information
- // will have been filled in by the transport layer. This way
- // what we log is exactly the same as what goes out over the
- // wire.
- mModule.priority = 0;
- mModule.load = loggingLoad;
- mModule.start = loggingStart;
- mModule.stop = loggingStop;
- mModule.unload = loggingUnload;
- mModule.on_rx_request = loggingOnRxRequest;
- mModule.on_rx_response = loggingOnRxResponse;
- mModule.on_tx_request = loggingOnTxRequest;
- mModule.on_tx_response = loggingOnTxResponse;
- mModule.on_tsx_state = loggingOnTsxState;
- pjsip_endpt_register_module(endpt, &mModule);
+ loggingModule = this;
+ char name[] = "Logging Module";
+ mModule.name = pj_str(name);
+ // This is the highest priority module. We do this
+ // so that on outgoing messages, the transport information
+ // will have been filled in by the transport layer. This way
+ // what we log is exactly the same as what goes out over the
+ // wire.
+ mModule.priority = 0;
+ mModule.load = loggingLoad;
+ mModule.start = loggingStart;
+ mModule.stop = loggingStop;
+ mModule.unload = loggingUnload;
+ mModule.on_rx_request = loggingOnRxRequest;
+ mModule.on_rx_response = loggingOnRxResponse;
+ mModule.on_tx_request = loggingOnTxRequest;
+ mModule.on_tx_response = loggingOnTxResponse;
+ mModule.on_tsx_state = loggingOnTsxState;
+ pjsip_endpt_register_module(endpt, &mModule);
}
};
diff --git a/src/PJSipManager.cpp b/src/PJSipManager.cpp
index 083911e..4270766 100644
--- a/src/PJSipManager.cpp
+++ b/src/PJSipManager.cpp
@@ -33,110 +33,110 @@ namespace SipSessionManager
static void *monitorThread(void *endpt)
{
- pjsip_endpoint *endpoint = static_cast<pjsip_endpoint *> (endpt);
- for (;;)
- {
- // No timeout is a bad idea in the long run, but for now,
- // let's just go with it.
- pjsip_endpt_handle_events(endpoint, NULL);
- }
-
- return NULL;
+ pjsip_endpoint *endpoint = static_cast<pjsip_endpoint *> (endpt);
+ for (;;)
+ {
+ // No timeout is a bad idea in the long run, but for now,
+ // let's just go with it.
+ pjsip_endpt_handle_events(endpoint, NULL);
+ }
+
+ return NULL;
}
PJSipManager::PJSipManager(Ice::PropertiesPtr props)
{
- pj_status_t status = pj_init();
- if (status != PJ_SUCCESS)
- {
- lg(Error) << "Failed to Initialize PJSIP";
- }
- // The third parameter is just copied from
- // example code from PJLIB. This can be adjusted
- // if necessary.
- pj_caching_pool_init(&mCachingPool, NULL, 1024 * 1024);
- pjsip_endpt_create(&mCachingPool.factory, "SIP", &mEndpoint);
- setTransports(mEndpoint, props);
- mMemoryPool = pj_pool_create(&mCachingPool.factory, "SIP", 1024, 1024, NULL);
- if (!mMemoryPool)
- {
- lg(Error) << "Failed to create a memory pool";
- }
- status = pj_thread_create(mMemoryPool, "SIP", (pj_thread_proc *) &monitorThread,
- mEndpoint, PJ_THREAD_DEFAULT_STACK_SIZE, 0, &mPjThread);
- if (status != PJ_SUCCESS)
- {
- lg(Error) << "Failed to create SIP maintenance thread";
- }
+ pj_status_t status = pj_init();
+ if (status != PJ_SUCCESS)
+ {
+ lg(Error) << "Failed to Initialize PJSIP";
+ }
+ // The third parameter is just copied from
+ // example code from PJLIB. This can be adjusted
+ // if necessary.
+ pj_caching_pool_init(&mCachingPool, NULL, 1024 * 1024);
+ pjsip_endpt_create(&mCachingPool.factory, "SIP", &mEndpoint);
+ setTransports(mEndpoint, props);
+ mMemoryPool = pj_pool_create(&mCachingPool.factory, "SIP", 1024, 1024, NULL);
+ if (!mMemoryPool)
+ {
+ lg(Error) << "Failed to create a memory pool";
+ }
+ status = pj_thread_create(mMemoryPool, "SIP", (pj_thread_proc *) &monitorThread,
+ mEndpoint, PJ_THREAD_DEFAULT_STACK_SIZE, 0, &mPjThread);
+ if (status != PJ_SUCCESS)
+ {
+ lg(Error) << "Failed to create SIP maintenance thread";
+ }
}
void PJSipManager::registerSessionModule(pjsip_endpoint *endpt,
- boost::shared_ptr<SipEndpointFactory> endpointFactoryPtr,
- AsteriskSCF::ProxyWrapper::ProxyWrapper<AsteriskSCF::SessionCommunications::V1::SessionRouterPrx> sessionRouter,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorPrx serviceLocator,
- AsteriskSCF::ProxyWrapper::ProxyWrapper<AsteriskSCF::SIP::V1::SipStateReplicatorPrx> stateReplicator,
- AsteriskSCF::System::Component::V1::ReplicaPtr replica
- )
+ boost::shared_ptr<SipEndpointFactory> endpointFactoryPtr,
+ AsteriskSCF::ProxyWrapper::ProxyWrapper<AsteriskSCF::SessionCommunications::V1::SessionRouterPrx> sessionRouter,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorPrx serviceLocator,
+ AsteriskSCF::ProxyWrapper::ProxyWrapper<AsteriskSCF::SIP::V1::SipStateReplicatorPrx> stateReplicator,
+ AsteriskSCF::System::Component::V1::ReplicaPtr replica
+ )
{
- mSessionModule = new PJSipSessionModule(endpt, endpointFactoryPtr, sessionRouter,
- serviceLocator, stateReplicator, replica);
+ mSessionModule = new PJSipSessionModule(endpt, endpointFactoryPtr, sessionRouter,
+ serviceLocator, stateReplicator, replica);
}
void PJSipManager::registerLoggingModule(pjsip_endpoint *endpt)
{
- mLoggingModule = new PJSipLoggingModule(endpt);
+ mLoggingModule = new PJSipLoggingModule(endpt);
}
pjsip_endpoint *PJSipManager::getEndpoint()
{
- return mEndpoint;
+ return mEndpoint;
}
PJSipSessionModule *PJSipManager::getSessionModule()
{
- return mSessionModule;
+ return mSessionModule;
}
PJSipLoggingModule *PJSipManager::getLoggingModule()
{
- return mLoggingModule;
+ return mLoggingModule;
}
bool PJSipManager::setTransports(pjsip_endpoint *endpoint, Ice::PropertiesPtr props)
{
- //XXX We'll also want to allow for TCP and TLS-specific
- //addresses to be specified.
- pj_sockaddr udpAddr;
- pj_status_t status;
- std::string udpBindAddr = props->getPropertyWithDefault("Sip.Transport.UdpBindAddr", "0.0.0.0:5060");
- pj_str_t udpString;
- pj_cstr(&udpString, udpBindAddr.c_str());
- //UNSPEC family means "you figure out the address family, pjlib!"
- pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &udpString, &udpAddr);
- if (udpAddr.addr.sa_family == pj_AF_INET())
- {
- //XXX The fourth parameter should probably be controlled through
- //configuration. PJSIP reference says it should be the number of
- //processors on the machine.
- //
- status = pjsip_udp_transport_start(endpoint, &udpAddr.ipv4, NULL, 2, &mUdpTransport);
- if (status != PJ_SUCCESS)
- {
- lg(Error) << "Failed to create IPv4 UDP transport. DANG!";
- }
- }
- else if (udpAddr.addr.sa_family == pj_AF_INET6())
- {
- status = pjsip_udp_transport_start6(endpoint, &udpAddr.ipv6, NULL, 2, &mUdpTransport);
- if (status != PJ_SUCCESS)
- {
- lg(Error) << "Failed to create IPv4 UDP transport. DANG!";
- }
- }
- //XXX Note that TCP and TLS stuff should be done here. Also note that
- //currently PJSIP does not have functions for starting IPv6 TCP or
- //TLS transports, so we'll have to modify the code to allow for it.
- return true;
+ //XXX We'll also want to allow for TCP and TLS-specific
+ //addresses to be specified.
+ pj_sockaddr udpAddr;
+ pj_status_t status;
+ std::string udpBindAddr = props->getPropertyWithDefault("Sip.Transport.UdpBindAddr", "0.0.0.0:5060");
+ pj_str_t udpString;
+ pj_cstr(&udpString, udpBindAddr.c_str());
+ //UNSPEC family means "you figure out the address family, pjlib!"
+ pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &udpString, &udpAddr);
+ if (udpAddr.addr.sa_family == pj_AF_INET())
+ {
+ //XXX The fourth parameter should probably be controlled through
+ //configuration. PJSIP reference says it should be the number of
+ //processors on the machine.
+ //
+ status = pjsip_udp_transport_start(endpoint, &udpAddr.ipv4, NULL, 2, &mUdpTransport);
+ if (status != PJ_SUCCESS)
+ {
+ lg(Error) << "Failed to create IPv4 UDP transport. DANG!";
+ }
+ }
+ else if (udpAddr.addr.sa_family == pj_AF_INET6())
+ {
+ status = pjsip_udp_transport_start6(endpoint, &udpAddr.ipv6, NULL, 2, &mUdpTransport);
+ if (status != PJ_SUCCESS)
+ {
+ lg(Error) << "Failed to create IPv4 UDP transport. DANG!";
+ }
+ }
+ //XXX Note that TCP and TLS stuff should be done here. Also note that
+ //currently PJSIP does not have functions for starting IPv6 TCP or
+ //TLS transports, so we'll have to modify the code to allow for it.
+ return true;
}
}; //End namespace SipSessionManager
diff --git a/src/PJSipManager.h b/src/PJSipManager.h
index b9d1e5a..7cc5220 100644
--- a/src/PJSipManager.h
+++ b/src/PJSipManager.h
@@ -45,51 +45,51 @@ namespace SipSessionManager
class PJSipManager
{
public:
- PJSipManager(Ice::PropertiesPtr props);
- /**
- * Get a handle to the PJSipEndpoint for operations
- * that may require it
- */
- pjsip_endpoint *getEndpoint();
+ PJSipManager(Ice::PropertiesPtr props);
+ /**
+ * Get a handle to the PJSipEndpoint for operations
+ * that may require it
+ */
+ pjsip_endpoint *getEndpoint();
- /**
- * Get a reference to the PJSIP session module
- */
- PJSipSessionModule *getSessionModule();
+ /**
+ * Get a reference to the PJSIP session module
+ */
+ PJSipSessionModule *getSessionModule();
- /**
- * Get a reference to the PJSIP logging module
- */
- PJSipLoggingModule *getLoggingModule();
+ /**
+ * Get a reference to the PJSIP logging module
+ */
+ PJSipLoggingModule *getLoggingModule();
- /**
- * Register the PJSipSessionModule, responsible
- * for basic call handling
- */
- void registerSessionModule(pjsip_endpoint *endpt,
- boost::shared_ptr<SipEndpointFactory> endpointFactoryPtr,
- AsteriskSCF::ProxyWrapper::ProxyWrapper<AsteriskSCF::SessionCommunications::V1::SessionRouterPrx> sessionRouter,
- AsteriskSCF::Core::Discovery::V1::ServiceLocatorPrx serviceLocator,
- AsteriskSCF::ProxyWrapper::ProxyWrapper<AsteriskSCF::SIP::V1::SipStateReplicatorPrx> stateReplicator,
- AsteriskSCF::System::Component::V1::ReplicaPtr replica
- );
+ /**
+ * Register the PJSipSessionModule, responsible
+ * for basic call handling
+ */
+ void registerSessionModule(pjsip_endpoint *endpt,
+ boost::shared_ptr<SipEndpointFactory> endpointFactoryPtr,
+ AsteriskSCF::ProxyWrapper::ProxyWrapper<AsteriskSCF::SessionCommunications::V1::SessionRouterPrx> sessionRouter,
+ AsteriskSCF::Core::Discovery::V1::ServiceLocatorPrx serviceLocator,
+ AsteriskSCF::ProxyWrapper::ProxyWrapper<AsteriskSCF::SIP::V1::SipStateReplicatorPrx> stateReplicator,
+ AsteriskSCF::System::Component::V1::ReplicaPtr replica
+ );
- /**
- * Register the PJSipLoggingModule, responsible
- * for logging incoming and outgoing SIP messages
- */
- void registerLoggingModule(pjsip_endpoint *endpt);
+ /**
+ * Register the PJSipLoggingModule, responsible
+ * for logging incoming and outgoing SIP messages
+ */
+ void registerLoggingModule(pjsip_endpoint *endpt);
private:
- static PJSipManager *mInstance;
- pjsip_endpoint *mEndpoint;
- PJSipSessionModule *mSessionModule;
- PJSipLoggingModule *mLoggingModule;
- pj_thread_t *mPjThread;
- pj_caching_pool mCachingPool;
- pj_pool_t *mMemoryPool;
- pjsip_transport *mUdpTransport;
+ static PJSipManager *mInstance;
+ pjsip_endpoint *mEndpoint;
+ PJSipSessionModule *mSessionModule;
+ PJSipLoggingModule *mLoggingModule;
+ pj_thread_t *mPjThread;
+ pj_caching_pool mCachingPool;
+ pj_pool_t *mMemoryPool;
+ pjsip_transport *mUdpTransport;
- bool setTransports(pjsip_endpoint *endpoint, Ice::PropertiesPtr props);
+ bool setTransports(pjsip_endpoint *endpoint, Ice::PropertiesPtr props);
};
}; //End namespace SipSessionManager
diff --git a/src/PJSipModule.cpp b/src/PJSipModule.cpp
index ba4de0a..0b92ec6 100644
--- a/src/PJSipModule.cpp
+++ b/src/PJSipModule.cpp
@@ -37,15 +37,15 @@ const int URI_SIZE = 64;
PJSipDialogModInfo::PJSipDialogModInfo(pjsip_dialog *dialog) : mDialogState(new SipDialogStateItem) , mNeedsReplication(true), mNeedsRemoval(false)
{
- //XXX Is there a way to tell ICE to make the default
- //constructor for SipStateItem set key?
- mDialogState->key = IceUtil::generateUUID();
- updateDialogState(dialog);
+ //XXX Is there a way to tell ICE to make the default
+ //constructor for SipStateItem set key?
+ mDialogState->key = IceUtil::generateUUID();
+ updateDialogState(dialog);
}
PJSipDialogModInfo::~PJSipDialogModInfo()
{
- mDialogState = 0;
+ mDialogState = 0;
}
/**
@@ -58,100 +58,100 @@ PJSipDialogModInfo::~PJSipDialogModInfo()
*/
void PJSipDialogModInfo::updateDialogState(pjsip_dialog *dialog)
{
- mDialogState->mCallId = std::string(pj_strbuf(&dialog->call_id->id), pj_strlen(&dialog->call_id->id));
- mDialogState->mIsDialogEstablished = dialog->state == PJSIP_DIALOG_STATE_ESTABLISHED ? true : false;
- mDialogState->mIsSecure = dialog->secure == PJ_TRUE ? true : false;
-
- mDialogState->mLocalCSeq = dialog->local.cseq;
- mDialogState->mLocalTag = std::string(pj_strbuf(&dialog->local.info->tag), pj_strlen(&dialog->local.info->tag));
- char localUri[URI_SIZE];
- pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, dialog->local.info->uri, localUri, sizeof(localUri));
- mDialogState->mLocalUri = localUri;
-
- mDialogState->mRemoteCSeq = dialog->remote.cseq;
- mDialogState->mRemoteTag = std::string(pj_strbuf(&dialog->remote.info->tag), pj_strlen(&dialog->remote.info->tag));
- char remoteUri[URI_SIZE];
- pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, dialog->remote.info->uri, remoteUri, sizeof(remoteUri));
- mDialogState->mRemoteUri = remoteUri;
-
- //This is a place where the whole "only change what you need" optimization
- //will come in super-handy since we have to erase and rebuild the route set
- //every time. My recollection is that the route set can only be established
- //in the first transaction of a dialog so this is purdy wasteful.
- mDialogState->mRouteSet.erase(mDialogState->mRouteSet.begin(), mDialogState->mRouteSet.end());
- for (pjsip_route_hdr *hdr_iter = dialog->route_set.next; hdr_iter != &dialog->route_set; hdr_iter = hdr_iter->next)
- {
- char routeUri[URI_SIZE];
- pjsip_uri_print(PJSIP_URI_IN_ROUTING_HDR, hdr_iter->name_addr.uri, routeUri, sizeof(routeUri));
-
- //XXX I need to see the order in which the route set is represented
- //in a pjsip dialog. push_back could be completely incorrect here,
- //or it may only be correct depending on whether we're the UAC or UAS.
- //Also, for now we're ignoring the optional display name portion of URIs
- //in the route set. They're not strictly necessary for routing calls correctly.
- mDialogState->mRouteSet.push_back(routeUri);
- }
- //XXX I'm not 100% sure how to get the transport from a pjsip_dialog, so for now,
- //I'll just hardcode this as UDP until we start wanting to actually implement
- //other transports.
- mDialogState->mTransport = "UDP";
- mNeedsReplication = true;
+ mDialogState->mCallId = std::string(pj_strbuf(&dialog->call_id->id), pj_strlen(&dialog->call_id->id));
+ mDialogState->mIsDialogEstablished = dialog->state == PJSIP_DIALOG_STATE_ESTABLISHED ? true : false;
+ mDialogState->mIsSecure = dialog->secure == PJ_TRUE ? true : false;
+
+ mDialogState->mLocalCSeq = dialog->local.cseq;
+ mDialogState->mLocalTag = std::string(pj_strbuf(&dialog->local.info->tag), pj_strlen(&dialog->local.info->tag));
+ char localUri[URI_SIZE];
+ pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, dialog->local.info->uri, localUri, sizeof(localUri));
+ mDialogState->mLocalUri = localUri;
+
+ mDialogState->mRemoteCSeq = dialog->remote.cseq;
+ mDialogState->mRemoteTag = std::string(pj_strbuf(&dialog->remote.info->tag), pj_strlen(&dialog->remote.info->tag));
+ char remoteUri[URI_SIZE];
+ pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, dialog->remote.info->uri, remoteUri, sizeof(remoteUri));
+ mDialogState->mRemoteUri = remoteUri;
+
+ //This is a place where the whole "only change what you need" optimization
+ //will come in super-handy since we have to erase and rebuild the route set
+ //every time. My recollection is that the route set can only be established
+ //in the first transaction of a dialog so this is purdy wasteful.
+ mDialogState->mRouteSet.erase(mDialogState->mRouteSet.begin(), mDialogState->mRouteSet.end());
+ for (pjsip_route_hdr *hdr_iter = dialog->route_set.next; hdr_iter != &dialog->route_set; hdr_iter = hdr_iter->next)
+ {
+ char routeUri[URI_SIZE];
+ pjsip_uri_print(PJSIP_URI_IN_ROUTING_HDR, hdr_iter->name_addr.uri, routeUri, sizeof(routeUri));
+
+ //XXX I need to see the order in which the route set is represented
+ //in a pjsip dialog. push_back could be completely incorrect here,
+ //or it may only be correct depending on whether we're the UAC or UAS.
+ //Also, for now we're ignoring the optional display name portion of URIs
+ //in the route set. They're not strictly necessary for routing calls correctly.
+ mDialogState->mRouteSet.push_back(routeUri);
+ }
+ //XXX I'm not 100% sure how to get the transport from a pjsip_dialog, so for now,
+ //I'll just hardcode this as UDP until we start wanting to actually implement
+ //other transports.
+ mDialogState->mTransport = "UDP";
+ mNeedsReplication = true;
}
PJSipTransactionModInfo::PJSipTransactionModInfo(pjsip_transaction *transaction) : mTransactionState(new SipTransactionStateItem), mNeedsReplication(true), mNeedsRemoval(false)
{
- mTransactionState->key = IceUtil::generateUUID();
- updateTransactionState(transaction);
+ mTransactionState->key = IceUtil::generateUUID();
+ updateTransactionState(transaction);
}
PJSipTransactionModInfo::~PJSipTransactionModInfo()
{
- mTransactionState = 0;
+ mTransactionState = 0;
}
void PJSipTransactionModInfo::updateTransactionState(pjsip_transaction *transaction)
{
- mTransactionState->mBranch = std::string(pj_strbuf(&transaction->branch), pj_strlen(&transaction->branch));
- mTransactionState->mIsClient = (transaction->role == PJSIP_ROLE_UAC || transaction->role == PJSIP_UAC_ROLE) ? true : false;
- mTransactionState->mCurrentState = transactionStateTranslate(transaction->state);
- mNeedsReplication = true;
+ mTransactionState->mBranch = std::string(pj_strbuf(&transaction->branch), pj_strlen(&transaction->branch));
+ mTransactionState->mIsClient = (transaction->role == PJSIP_ROLE_UAC || transaction->role == PJSIP_UAC_ROLE) ? true : false;
+ mTransactionState->mCurrentState = transactionStateTranslate(transaction->state);
+ mNeedsReplication = true;
}
TransactionState PJSipTransactionModInfo::transactionStateTranslate(pjsip_tsx_state_e state)
{
- TransactionState retState;
- switch (state)
- {
- case PJSIP_TSX_STATE_NULL:
- retState = TransactionStateNull;
- break;
- case PJSIP_TSX_STATE_CALLING:
- retState = TransactionStateCalling;
- break;
- case PJSIP_TSX_STATE_TRYING:
- retState = TransactionStateTrying;
- break;
- case PJSIP_TSX_STATE_PROCEEDING:
- retState = TransactionStateProceeding;
- break;
- case PJSIP_TSX_STATE_COMPLETED:
- retState = TransactionStateCompleted;
- break;
- case PJSIP_TSX_STATE_CONFIRMED:
- retState = TransactionStateConfirmed;
- break;
- case PJSIP_TSX_STATE_TERMINATED:
- retState = TransactionStateTerminated;
- break;
- case PJSIP_TSX_STATE_DESTROYED:
- retState = TransactionStateDestroyed;
- break;
- default:
- lg(Error) << "Unknown PJSIP Transaction state encountered: " << state;
- retState = TransactionStateNull;
- break;
- }
- return retState;
+ TransactionState retState;
+ switch (state)
+ {
+ case PJSIP_TSX_STATE_NULL:
+ retState = TransactionStateNull;
+ break;
+ case PJSIP_TSX_STATE_CALLING:
+ retState = TransactionStateCalling;
+ break;
+ case PJSIP_TSX_STATE_TRYING:
+ retState = TransactionStateTrying;
+ break;
+ case PJSIP_TSX_STATE_PROCEEDING:
+ retState = TransactionStateProceeding;
+ break;
+ case PJSIP_TSX_STATE_COMPLETED:
+ retState = TransactionStateCompleted;
+ break;
+ case PJSIP_TSX_STATE_CONFIRMED:
+ retState = TransactionStateConfirmed;
+ break;
+ case PJSIP_TSX_STATE_TERMINATED:
+ retState = TransactionStateTerminated;
+ break;
+ case PJSIP_TSX_STATE_DESTROYED:
+ retState = TransactionStateDestroyed;
+ break;
+ default:
+ lg(Error) << "Unknown PJSIP Transaction state encountered: " << state;
+ retState = TransactionStateNull;
+ break;
+ }
+ return retState;
}
};
diff --git a/src/PJSipModule.h b/src/PJSipModule.h
index d96aa76..c2d5034 100644
--- a/src/PJSipModule.h
+++ b/src/PJSipModule.h
@@ -35,45 +35,45 @@ using namespace AsteriskSCF::SIP::V1;
class PJSipModule
{
public:
- virtual pj_status_t load(pjsip_endpoint *endpoint) = 0;
- virtual pj_status_t start() = 0;
- virtual pj_status_t stop() = 0;
- virtual pj_status_t unload() = 0;
- virtual pj_bool_t on_rx_request(pjsip_rx_data *rdata) = 0;
- virtual pj_bool_t on_rx_response(pjsip_rx_data *rdata) = 0;
- virtual pj_status_t on_tx_request(pjsip_tx_data *tdata) = 0;
- virtual pj_status_t on_tx_response(pjsip_tx_data *tdata) = 0;
- virtual void on_tsx_state(pjsip_transaction *tsx, pjsip_event *event) = 0;
- pjsip_module &getModule() { return mModule; };
+ virtual pj_status_t load(pjsip_endpoint *endpoint) = 0;
+ virtual pj_status_t start() = 0;
+ virtual pj_status_t stop() = 0;
+ virtual pj_status_t unload() = 0;
+ virtual pj_bool_t on_rx_request(pjsip_rx_data *rdata) = 0;
+ virtual pj_bool_t on_rx_response(pjsip_rx_data *rdata) = 0;
+ virtual pj_status_t on_tx_request(pjsip_tx_data *tdata) = 0;
+ virtual pj_status_t on_tx_response(pjsip_tx_data *tdata) = 0;
+ virtual void on_tsx_state(pjsip_transaction *tsx, pjsip_event *event) = 0;
+ pjsip_module &getModule() { return mModule; };
protected:
- PJSipModule() { }
- pjsip_module mModule;
+ PJSipModule() { }
+ pjsip_module mModule;
private:
- const std::string mName;
+ const std::string mName;
};
class PJSipDialogModInfo
{
public:
- PJSipDialogModInfo(pjsip_dialog *dialog);
- ~PJSipDialogModInfo();
- void updateDialogState(pjsip_dialog *dialog);
- SipDialogStateItemPtr mDialogState;
- bool mNeedsReplication;
- bool mNeedsRemoval;
+ PJSipDialogModInfo(pjsip_dialog *dialog);
+ ~PJSipDialogModInfo();
+ void updateDialogState(pjsip_dialog *dialog);
+ SipDialogStateItemPtr mDialogState;
+ bool mNeedsReplication;
+ bool mNeedsRemoval;
};
class PJSipTransactionModInfo
{
public:
- PJSipTransactionModInfo(pjsip_transaction *transaction);
- ~PJSipTransactionModInfo();
- void updateTransactionState(pjsip_transaction *transaction);
- SipTransactionStateItemPtr mTransactionState;
- bool mNeedsReplication;
- bool mNeedsRemoval;
+ PJSipTransactionModInfo(pjsip_transaction *transaction);
+ ~PJSipTransactionModInfo();
+ void updateTransactionState(pjsip_transaction *transaction);
+ SipTransactionStateItemPtr mTransactionState;
+ bool mNeedsReplication;
+ bool mNeedsRemoval;
private:
- TransactionState transactionStateTranslate(pjsip_tsx_state_e state);
+ TransactionState transactionStateTranslate(pjsip_tsx_state_e state);
};
}; //end namespace SipSessionManager
diff --git a/src/PJSipSessionModule.cpp b/src/PJSipSessionModule.cpp
index 64567d6..e770b81 100644
--- a/src/PJSipSessionModule.cpp
+++ b/src/PJSipSessionModule.cpp
@@ -48,603 +48,603 @@ using namespace AsteriskSCF::Media::V1;
using namespace AsteriskSCF::SIP::V1;
PJSipSessionModInfo::PJSipSessionModInfo(pjsip_inv_session *inv_session,
- SipSessionPtr session)
- :
- mSessionState(new SipSessionStateItem),
- mInviteState(new SipInviteSessionStateItem),
- mNeedsReplication(true),
- mNeedsRemoval(false),
- mSession(session)
+ SipSessionPtr session)
+ :
+ mSessionState(new SipSessionStateItem),
+ mInviteState(new SipInviteSessionStateItem),
+ mNeedsReplication(true),
+ mNeedsRemoval(false),
+ mSession(session)
{
- mSessionState->key = IceUtil::generateUUID();
- mInviteState->key = IceUtil::generateUUID();
- mSessionState->mSessionId = mSessionState->key;
- mInviteState->mSessionId = mSessionState->key;
- updateSessionState(inv_session);
+ mSessionState->key = IceUtil::generateUUID();
+ mInviteState->key = IceUtil::generateUUID();
+ mSessionState->mSessionId = mSessionState->key;
+ mInviteState->mSessionId = mSessionState->key;
+ updateSessionState(inv_session);
}
PJSipSessionModInfo::~PJSipSessionModInfo()
{
- if (mSession)
- {
- mSession->destroy();
- mSession = 0;
- }
+ if (mSession)
+ {
+ mSession->destroy();
+ mSession = 0;
+ }
}
void PJSipSessionModInfo::updateSessionState(pjsip_inv_session *inv_session)
{
- boost::unique_lock<boost::shared_mutex> lock(mLock);
- if (mSession)
- {
- mSessionState->mEndpointName = mSession->getEndpoint()->getName();
- mSessionState->mSessionObjectId = mSession->getSessionProxy()->ice_getIdentity();
- mSessionState->mMediaSessionObjectId = mSession->getMediaSessionProxy()->ice_getIdentity();
- mSessionState->mSources = mSession->getSources();
- mSessionState->mSinks = mSession->getSinks();
- mSessionState->mMediaSession = mSession->getHiddenMediaSession();
- mSessionState->mListeners = mSession->getListeners();
- try
- {
- Ice::Current current;
- mSessionState->mBridge = mSession->getBridge(current);
- }
- catch (...)
- {
- mSessionState->mBridge = 0;
- }
- }
-
- //Now we get stuff from the inv_session itself.
- mInviteState->mCancelling = inv_session->cancelling == PJ_TRUE ? true : false;
- mInviteState->mPendingCancel = inv_session->pending_cancel == PJ_TRUE ? true : false;
- mInviteState->mCause = inv_session->cause;
- mInviteState->mCauseText = std::string(pj_strbuf(&inv_session->cause_text), pj_strlen(&inv_session->cause_text));
- mInviteState->mNotify = inv_session->notify == PJ_TRUE ? true : false;
- mInviteState->mLastAckCseq = inv_session->last_ack_cseq;
- mInviteState->mCurrentState = inviteStateTranslate(inv_session->state);
- mNeedsReplication = true;
+ boost::unique_lock<boost::shared_mutex> lock(mLock);
+ if (mSession)
+ {
+ mSessionState->mEndpointName = mSession->getEndpoint()->getName();
+ mSessionState->mSessionObjectId = mSession->getSessionProxy()->ice_getIdentity();
+ mSessionState->mMediaSessionObjectId = mSession->getMediaSessionProxy()->ice_getIdentity();
+ mSessionState->mSources = mSession->getSources();
+ mSessionState->mSinks = mSession->getSinks();
+ mSessionState->mMediaSession = mSession->getHiddenMediaSession();
+ mSessionState->mListeners = mSession->getListeners();
+ try
+ {
+ Ice::Current current;
+ mSessionState->mBridge = mSession->getBridge(current);
+ }
+ catch (...)
+ {
+ mSessionState->mBridge = 0;
+ }
+ }
+
+ //Now we get stuff from the inv_session itself.
+ mInviteState->mCancelling = inv_session->cancelling == PJ_TRUE ? true : false;
+ mInviteState->mPendingCancel = inv_session->pending_cancel == PJ_TRUE ? true : false;
+ mInviteState->mCause = inv_session->cause;
+ mInviteState->mCauseText = std::string(pj_strbuf(&inv_session->cause_text), pj_strlen(&inv_session->cause_text));
+ mInviteState->mNotify = inv_session->notify == PJ_TRUE ? true : false;
+ mInviteState->mLastAckCseq = inv_session->last_ack_cseq;
+ mInviteState->mCurrentState = inviteStateTranslate(inv_session->state);
+ mNeedsReplication = true;
}
SipSessionPtr PJSipSessionModInfo::getSessionPtr()
{
- return mSession;
+ return mSession;
}
void PJSipSessionModInfo::setSessionPtr(SipSessionPtr sessionPtr)
{
- mSession = sessionPtr;
+ mSession = sessionPtr;
}
InviteSessionState PJSipSessionModInfo::inviteStateTranslate(pjsip_inv_state state)
{
- InviteSessionState retState;
- switch (state)
- {
- case PJSIP_INV_STATE_NULL:
- retState = InviteSessionStateNull;
- break;
- case PJSIP_INV_STATE_CALLING:
- retState = InviteSessionStateCalling;
- break;
- case PJSIP_INV_STATE_INCOMING:
- retState = InviteSessionStateIncoming;
- break;
- case PJSIP_INV_STATE_EARLY:
- retState = InviteSessionStateEarly;
- break;
- case PJSIP_INV_STATE_CONNECTING:
- retState = InviteSessionStateConnecting;
- break;
- case PJSIP_INV_STATE_CONFIRMED:
- retState = InviteSessionStateConfirmed;
- break;
- case PJSIP_INV_STATE_DISCONNECTED:
- retState = InviteSessionStateDisconnected;
- break;
- default:
- lg(Warning) << "Unknwon PJSIP INVITE state encountered: " << state;
- retState = InviteSessionStateNull;
- break;
- }
- return retState;
+ InviteSessionState retState;
+ switch (state)
+ {
+ case PJSIP_INV_STATE_NULL:
+ retState = InviteSessionStateNull;
+ break;
+ case PJSIP_INV_STATE_CALLING:
+ retState = InviteSessionStateCalling;
+ break;
+ case PJSIP_INV_STATE_INCOMING:
+ retState = InviteSessionStateIncoming;
+ break;
+ case PJSIP_INV_STATE_EARLY:
+ retState = InviteSessionStateEarly;
+ break;
+ case PJSIP_INV_STATE_CONNECTING:
+ retState = InviteSessionStateConnecting;
+ break;
+ case PJSIP_INV_STATE_CONFIRMED:
+ retState = InviteSessionStateConfirmed;
+ break;
+ case PJSIP_INV_STATE_DISCONNECTED:
+ retState = InviteSessionStateDisconnected;
+ break;
+ default:
+ lg(Warning) << "Unknwon PJSIP INVITE state encountered: " << state;
+ retState = InviteSessionStateNull;
+ break;
+ }
+ return retState;
}
void PJSipSessionModule::replicateState(PJSipDialogModInfo *dlgInfo, PJSipTransactionModInfo *tsxInfo,
- PJSipSessionModInfo *sessionInfo)
+ PJSipSessionModInfo *sessionInfo)
{
- SipStateItemSeq setItems;
- Ice::StringSeq removeItems;
-
- lg(Debug) << "========== Begin State Replication Dump ==========";
-
- if (dlgInfo)
- {
- lg(Debug) << "--- Begin Dialog " << dlgInfo->mDialogState->key;
- lg(Debug) << "Callid: " << dlgInfo->mDialogState->mCallId;
- lg(Debug) << "Is Dialog Established: " << dlgInfo->mDialogState->mIsDialogEstablished;
- lg(Debug) << "Is Secure: " << dlgInfo->mDialogState->mIsSecure;
- lg(Debug) << "Local CSeq: " << dlgInfo->mDialogState->mLocalCSeq;
- lg(Debug) << "Local URI: " << dlgInfo->mDialogState->mLocalUri;
- lg(Debug) << "Remote CSeq: " << dlgInfo->mDialogState->mRemoteCSeq;
- lg(Debug) << "Remote URI: " << dlgInfo->mDialogState->mRemoteUri;
- lg(Debug) << "Transport: " << dlgInfo->mDialogState->mTransport;
- lg(Debug) << "UAC Has 2xx: " << dlgInfo->mDialogState->mUacHas2xx;
- lg(Debug) << "Is Uac: " << dlgInfo->mDialogState->mIsUac;
- if (dlgInfo->mNeedsRemoval == true)
- {
- lg(Debug) << "Removing dialog";
- removeItems.push_back(dlgInfo->mDialogState->key);
- }
- else if (dlgInfo->mNeedsReplication == true)
- {
- lg(Debug) << "Replicating dialog";
- setItems.push_back(dlgInfo->mDialogState);
- dlgInfo->mNeedsReplication = false;
- }
- lg(Debug) << "--- End Dialog " << dlgInfo->mDialogState->key;
- }
- if (sessionInfo)
- {
- boost::shared_lock<boost::shared_mutex> lock(sessionInfo->mLock);
- lg(Debug) << "--- Begin Session " << sessionInfo->mSessionState->key;
- lg(Debug) << "Endpoint name: " << sessionInfo->mSessionState->mEndpointName;
- lg(Debug) << "Session object identity: " << sessionInfo->mSessionState->mSessionObjectId.name;
- lg(Debug) << "Media session object identity: " << sessionInfo->mSessionState->mMediaSessionObjectId.name;
- lg(Debug) << "Media session: " << sessionInfo->mSessionState->mMediaSession;
- lg(Debug) << "Bridge: " << sessionInfo->mSessionState->mBridge;
- lg(Debug) << "--- Begin Invite Session " << sessionInfo->mInviteState->key;
- lg(Debug) << "Current state: " << sessionInfo->mInviteState->mCurrentState;
- lg(Debug) << "Cancelling: " << sessionInfo->mInviteState->mCancelling;
- lg(Debug) << "Pending cancel: " << sessionInfo->mInviteState->mPendingCancel;
- lg(Debug) << "Cause: " << sessionInfo->mInviteState->mCause;
- lg(Debug) << "Cause text: " << sessionInfo->mInviteState->mCauseText;
- lg(Debug) << "Notify: " << sessionInfo->mInviteState->mNotify;
- lg(Debug) << "Last Ack CSeq: " << sessionInfo->mInviteState->mLastAckCseq;
- if (sessionInfo->mNeedsRemoval == true)
- {
- removeItems.push_back(sessionInfo->mInviteState->key);
- removeItems.push_back(sessionInfo->mSessionState->key);
- lg(Debug) << "Removing session and invite session";
- }
- else if (sessionInfo->mNeedsReplication == true)
- {
- setItems.push_back(sessionInfo->mInviteState);
- setItems.insert(setItems.begin(), sessionInfo->mSessionState);
- sessionInfo->mNeedsReplication = false;
- lg(Debug) << "Replicating session and invite session";
- }
- lg(Debug) << "--- End Session and Invite Session";
- }
- if (tsxInfo)
- {
- if (tsxInfo->mNeedsRemoval == true)
- {
- removeItems.push_back(tsxInfo->mTransactionState->key);
- }
- else if (tsxInfo->mNeedsReplication == true)
- {
- setItems.push_back(tsxInfo->mTransactionState);
- tsxInfo->mNeedsReplication = false;
- }
- }
- lg(Debug) << "========== End State Replication Dump ==========";
- if (mReplica->isActive() == true)
- {
- if (setItems.size() != 0 && mStateReplicator)
- {
- Ice::ObjectPrx oneway;
- try
- {
- oneway = mStateReplicator->ice_oneway();
- }
- catch (const Ice::NoEndpointException&)
- {
- lg(Error) << "No endpoint for oneway invocation of setState() for state replication." << std::endl;
- }
-
- AsteriskSCF::SIP::V1::SipStateReplicatorPrx oneWayStateReplicator = AsteriskSCF::SIP::V1::SipStateReplicatorPrx::uncheckedCast(oneway);
-
- try
- {
- oneWayStateReplicator->setState(setItems);
- }
- catch (const Ice::TwowayOnlyException&)
- {
- lg(Error) << "setState() is not oneway." << std::endl;
- }
- }
-
- if (removeItems.size() != 0 && mStateReplicator)
- {
- Ice::ObjectPrx oneway;
- try
- {
- oneway = mStateReplicator->ice_oneway();
- }
- catch (const Ice::NoEndpointException&)
- {
- lg(Error) << "No endpoint for oneway invocation of removeState() for state replication." << std::endl;
- }
-
- AsteriskSCF::SIP::V1::SipStateReplicatorPrx oneWayStateReplicator = AsteriskSCF::SIP::V1::SipStateReplicatorPrx::uncheckedCast(oneway);
-
- try
- {
- oneWayStateReplicator->removeState(removeItems);
- }
- catch (const Ice::TwowayOnlyException&)
- {
- lg(Error) << "removeState() is not oneway." << std::endl;
- }
- }
- }
+ SipStateItemSeq setItems;
+ Ice::StringSeq removeItems;
+
+ lg(Debug) << "========== Begin State Replication Dump ==========";
+
+ if (dlgInfo)
+ {
+ lg(Debug) << "--- Begin Dialog " << dlgInfo->mDialogState->key;
+ lg(Debug) << "Callid: " << dlgInfo->mDialogState->mCallId;
+ lg(Debug) << "Is Dialog Established: " << dlgInfo->mDialogState->mIsDialogEstablished;
+ lg(Debug) << "Is Secure: " << dlgInfo->mDialogState->mIsSecure;
+ lg(Debug) << "Local CSeq: " << dlgInfo->mDialogState->mLocalCSeq;
+ lg(Debug) << "Local URI: " << dlgInfo->mDialogState->mLocalUri;
+ lg(Debug) << "Remote CSeq: " << dlgInfo->mDialogState->mRemoteCSeq;
+ lg(Debug) << "Remote URI: " << dlgInfo->mDialogState->mRemoteUri;
+ lg(Debug) << "Transport: " << dlgInfo->mDialogState->mTransport;
+ lg(Debug) << "UAC Has 2xx: " << dlgInfo->mDialogState->mUacHas2xx;
+ lg(Debug) << "Is Uac: " << dlgInfo->mDialogState->mIsUac;
+ if (dlgInfo->mNeedsRemoval == true)
+ {
+ lg(Debug) << "Removing dialog";
+ removeItems.push_back(dlgInfo->mDialogState->key);
+ }
+ else if (dlgInfo->mNeedsReplication == true)
+ {
+ lg(Debug) << "Replicating dialog";
+ setItems.push_back(dlgInfo->mDialogState);
+ dlgInfo->mNeedsReplication = false;
+ }
+ lg(Debug) << "--- End Dialog " << dlgInfo->mDialogState->key;
+ }
+ if (sessionInfo)
+ {
+ boost::shared_lock<boost::shared_mutex> lock(sessionInfo->mLock);
+ lg(Debug) << "--- Begin Session " << sessionInfo->mSessionState->key;
+ lg(Debug) << "Endpoint name: " << sessionInfo->mSessionState->mEndpointName;
+ lg(Debug) << "Session object identity: " << sessionInfo->mSessionState->mSessionObjectId.name;
+ lg(Debug) << "Media session object identity: " << sessionInfo->mSessionState->mMediaSessionObjectId.name;
+ lg(Debug) << "Media session: " << sessionInfo->mSessionState->mMediaSession;
+ lg(Debug) << "Bridge: " << sessionInfo->mSessionState->mBridge;
+ lg(Debug) << "--- Begin Invite Session " << sessionInfo->mInviteState->key;
+ lg(Debug) << "Current state: " << sessionInfo->mInviteState->mCurrentState;
+ lg(Debug) << "Cancelling: " << sessionInfo->mInviteState->mCancelling;
+ lg(Debug) << "Pending cancel: " << sessionInfo->mInviteState->mPendingCancel;
+ lg(Debug) << "Cause: " << sessionInfo->mInviteState->mCause;
+ lg(Debug) << "Cause text: " << sessionInfo->mInviteState->mCauseText;
+ lg(Debug) << "Notify: " << sessionInfo->mInviteState->mNotify;
+ lg(Debug) << "Last Ack CSeq: " << sessionInfo->mInviteState->mLastAckCseq;
+ if (sessionInfo->mNeedsRemoval == true)
+ {
+ removeItems.push_back(sessionInfo->mInviteState->key);
+ removeItems.push_back(sessionInfo->mSessionState->key);
+ lg(Debug) << "Removing session and invite session";
+ }
+ else if (sessionInfo->mNeedsReplication == true)
+ {
+ setItems.push_back(sessionInfo->mInviteState);
+ setItems.insert(setItems.begin(), sessionInfo->mSessionState);
+ sessionInfo->mNeedsReplication = false;
+ lg(Debug) << "Replicating session and invite session";
+ }
+ lg(Debug) << "--- End Session and Invite Session";
+ }
+ if (tsxInfo)
+ {
+ if (tsxInfo->mNeedsRemoval == true)
+ {
+ removeItems.push_back(tsxInfo->mTransactionState->key);
+ }
+ else if (tsxInfo->mNeedsReplication == true)
+ {
+ setItems.push_back(tsxInfo->mTransactionState);
+ tsxInfo->mNeedsReplication = false;
+ }
+ }
+ lg(Debug) << "========== End State Replication Dump ==========";
+ if (mReplica->isActive() == true)
+ {
+ if (setItems.size() != 0 && mStateReplicator)
+ {
+ Ice::ObjectPrx oneway;
+ try
+ {
+ oneway = mStateReplicator->ice_oneway();
+ }
+ catch (const Ice::NoEndpointException&)
+ {
+ lg(Error) << "No endpoint for oneway invocation of setState() for state replication." << std::endl;
+ }
+
+ AsteriskSCF::SIP::V1::SipStateReplicatorPrx oneWayStateReplicator = AsteriskSCF::SIP::V1::SipStateReplicatorPrx::uncheckedCast(oneway);
+
+ try
+ {
+ oneWayStateReplicator->setState(setItems);
+ }
+ catch (const Ice::TwowayOnlyException&)
+ {
+ lg(Error) << "setState() is not oneway." << std::endl;
+ }
+ }
+
+ if (removeItems.size() != 0 && mStateReplicator)
+ {
+ Ice::ObjectPrx oneway;
+ try
+ {
+ oneway = mStateReplicator->ice_oneway();
+ }
+ catch (const Ice::NoEndpointException&)
+ {
+ lg(Error) << "No endpoint for oneway invocation of removeState() for state replication." << std::endl;
+ }
+
+ AsteriskSCF::SIP::V1::SipStateReplicatorPrx oneWayStateReplicator = AsteriskSCF::SIP::V1::SipStateReplicatorPrx::uncheckedCast(oneway);
+
+ try
+ {
+ oneWayStateReplicator->removeState(removeItems);
+ }
+ catch (const Ice::TwowayOnlyException&)
+ {
+ lg(Error) << "removeState() is not oneway." << std::endl;
+ }
+ }
+ }
}
pj_status_t PJSipSessionModule::load(pjsip_endpoint *endpt)
{
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
}
pj_status_t PJSipSessionModule::start()
{
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
}
pj_status_t PJSipSessionModule::stop()
{
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
}
pj_status_t PJSipSessionModule::unload()
{
- return PJ_SUCCESS;
+ return PJ_SUCCESS;
}
void PJSipSessionModule::handleNewInvite(pjsip_rx_data *rdata)
{
- //What do we do here?
- //
- //First we need to identify who this is coming from.
- //If it's someone we recognize, then we can figure
- //out whether we need to send a 401/407 request.
- //For now, we don't have any sort of configured users,
- //so we skip this step. Instead, we'll skip ahead to
- //creating an endpoint, creating the invite session,
- //sending a 100 trying, finding the remote endpoint
- //to call, and placing a call to it.
-
- //XXX Put caller identification code in here!
-
- //XXX According to pjsip docs, we should call
- //pjsip_inv_verify_request to be sure we can
- //handle the request. For now, just plunge forward.
-
- pjsip_dialog *dlg, *replaced_dlg;
- pjsip_tx_data *tdata;
-
- // If this is an attended transfer and something is amuck... respond accordingly
- if (pjsip_replaces_verify_request(rdata, &replaced_dlg, PJ_FALSE, &tdata) != PJ_SUCCESS)
- {
- return;
- }
-
- //XXX The NULL parameter should be replaced with
- //An appropriate Contact header. Leaving it NULL makes
- //PJSIP create the contact header for responses based
- //on the To header of the incoming Invite.
- if (pjsip_dlg_create_uas(pjsip_ua_instance(), rdata, NULL, &dlg) != PJ_SUCCESS)
- {
- lg(Warning) << "Unable to create UAS dialog on incoming INVITE";
- return;
- }
-
- PJSipDialogModInfo *dlg_mod_info = new PJSipDialogModInfo(dlg);
-
- pjsip_transaction *tsx = pjsip_rdata_get_tsx(rdata);
- PJSipTransactionModInfo *tsx_mod_info = new PJSipTransactionModInfo(tsx);
- tsx->mod_data[mModule.id] = (void *)tsx_mod_info;
-
- //XXX The sdp argument is NULL for now, but can be changed if we
- //know what has been configured for this particular caller.
- pjsip_inv_session *inv_session;
- if (pjsip_inv_create_uas(dlg, rdata, NULL, 0, &inv_session) != PJ_SUCCESS)
- {
- lg(Warning) << "Unable to create INVITE session";
- //Since the inv_session was not created, we need to access the base dialog
- //directly instead. Other failure cases will use pjsip_inv_terminate instead.
- pjsip_dlg_terminate(dlg);
- return;
- }
-
- // Add our own module as a dialog usage
- pjsip_dlg_add_usage(dlg, &mModule, NULL);
-
- if (pjsip_inv_initial_answer(inv_session, rdata, 100, NULL, NULL, &tdata) != PJ_SUCCESS)
- {
- lg(Warning) << "Failed to create 100 Trying response";
- pjsip_inv_terminate(inv_session, 500, PJ_FALSE);
- return;
- }
-
- if (pjsip_inv_send_msg(inv_session, tdata) != PJ_SUCCESS)
- {
- lg(Warning) << "Failed to send 100 Trying response";
- pjsip_inv_terminate(inv_session, 500, PJ_FALSE);
- }
-
- pjsip_uri *from = rdata->msg_info.from->uri;
- std::string callerName("");
- if (PJSIP_URI_SCHEME_IS_SIP(from) || PJSIP_URI_SCHEME_IS_SIPS(from))
- {
- pjsip_sip_uri *sipFrom = (pjsip_sip_uri *)from;
- callerName = std::string(pj_strbuf(&sipFrom->user), pj_strlen(&sipFrom->user));
- lg(Debug) << "Got caller name " << callerName;
- }
- SipEndpointPtr caller = mEndpointFactory->findByName(callerName);
- if (caller == 0)
- {
- lg(Warning) << "Unknown calling endpoint " << callerName;
- pjsip_inv_end_session(inv_session, 403, NULL, &tdata);
- pjsip_inv_send_msg(inv_session, tdata);
- return;
- }
- SipEndpointConfig &config = caller->getConfig();
- if (config.sessionConfig.callDirection != BOTH && config.sessionConfig.callDirection != INBOUND)
- {
- lg(Warning) << "Caller " << callerName << " does not have permission to make inbound calls.";
- pjsip_inv_end_session(inv_session, 403, NULL, &tdata);
- pjsip_inv_send_msg(inv_session, tdata);
- return;
- }
-
- //We've created our calling endpoint. Now we need to look up the destination.
- pjsip_uri *ruri = rdata->msg_info.msg->line.req.uri;
- std::string destination("");
- if (PJSIP_URI_SCHEME_IS_SIP(ruri) || PJSIP_URI_SCHEME_IS_SIPS(ruri))
- {
- pjsip_sip_uri *sipRuri = (pjsip_sip_uri *)ruri;
- //For now, we only know about destination "100" so we'll
- //grab that from the URI to pass to the locator.
- destination = std::string(pj_strbuf(&sipRuri->user), pj_strlen(&sipRuri->user));
- lg(Debug) << "Call is destined for " << destination;
- }
-
- SipSessionPtr session = caller->createSession(destination);
- session->setInviteSession(inv_session);
- session->setDialog(dlg);
- PJSipSessionModInfo *session_mod_info = new PJSipSessionModInfo(inv_session, session);
- dlg_mod_info->mDialogState->mSessionId = session_mod_info->mSessionState->mSessionId;
- tsx_mod_info->mTransactionState->mSessionId = session_mod_info->mSessionState->mSessionId;
-
- inv_session->mod_data[mModule.id] = (void *)session_mod_info;
- dlg->mod_data[mModule.id] = (void *)dlg_mod_info;
-
- lg(Debug) << "Replicating state on reception of new SIP INVITE.";
- replicateState(dlg_mod_info, tsx_mod_info, session_mod_info);
- try
- {
- if (replaced_dlg)
- {
- // For attended transfers we need to contact the routing service which should then (hopefully) replace the other session
- }
- else
- {
- // If this is not an attended transfer we can just route the session as normally
- mSessionRouter->routeSession(session->getSessionProxy(), destination);
- }
- }
- catch (AsteriskSCF::Core::Routing::V1::DestinationNotFoundException&)
- {
- // Destination not found is special since we can actually map it to a good response code, 404
- pjsip_inv_end_session(inv_session, 404, NULL, &tdata);
- pjsip_inv_send_msg(inv_session, tdata);
- return;
- }
- catch (...)
- {
- // Everything else doesn't really map so they just become internal server errors
- pjsip_inv_end_session(inv_session, 500, NULL, &tdata);
- pjsip_inv_send_msg(inv_session, tdata);
- return;
- }
+ //What do we do here?
+ //
+ //First we need to identify who this is coming from.
+ //If it's someone we recognize, then we can figure
+ //out whether we need to send a 401/407 request.
+ //For now, we don't have any sort of configured users,
+ //so we skip this step. Instead, we'll skip ahead to
+ //creating an endpoint, creating the invite session,
+ //sending a 100 trying, finding the remote endpoint
+ //to call, and placing a call to it.
+
+ //XXX Put caller identification code in here!
+
+ //XXX According to pjsip docs, we should call
+ //pjsip_inv_verify_request to be sure we can
+ //handle the request. For now, just plunge forward.
+
+ pjsip_dialog *dlg, *replaced_dlg;
+ pjsip_tx_data *tdata;
+
+ // If this is an attended transfer and something is amuck... respond accordingly
+ if (pjsip_replaces_verify_request(rdata, &replaced_dlg, PJ_FALSE, &tdata) != PJ_SUCCESS)
+ {
+ return;
+ }
+
+ //XXX The NULL parameter should be replaced with
+ //An appropriate Contact header. Leaving it NULL makes
+ //PJSIP create the contact header for responses based
+ //on the To header of the incoming Invite.
+ if (pjsip_dlg_create_uas(pjsip_ua_instance(), rdata, NULL, &dlg) != PJ_SUCCESS)
+ {
+ lg(Warning) << "Unable to create UAS dialog on incoming INVITE";
+ return;
+ }
+
+ PJSipDialogModInfo *dlg_mod_info = new PJSipDialogModInfo(dlg);
+
+ pjsip_transaction *tsx = pjsip_rdata_get_tsx(rdata);
+ PJSipTransactionModInfo *tsx_mod_info = new PJSipTransactionModInfo(tsx);
+ tsx->mod_data[mModule.id] = (void *)tsx_mod_info;
+
+ //XXX The sdp argument is NULL for now, but can be changed if we
+ //know what has been configured for this particular caller.
+ pjsip_inv_session *inv_session;
+ if (pjsip_inv_create_uas(dlg, rdata, NULL, 0, &inv_session) != PJ_SUCCESS)
+ {
+ lg(Warning) << "Unable to create INVITE session";
+ //Since the inv_session was not created, we need to access the base dialog
+ //directly instead. Other failure cases will use pjsip_inv_terminate instead.
+ pjsip_dlg_terminate(dlg);
+ return;
+ }
+
+ // Add our own module as a dialog usage
+ pjsip_dlg_add_usage(dlg, &mModule, NULL);
+
+ if (pjsip_inv_initial_answer(inv_session, rdata, 100, NULL, NULL, &tdata) != PJ_SUCCESS)
+ {
+ lg(Warning) << "Failed to create 100 Trying response";
+ pjsip_inv_terminate(inv_session, 500, PJ_FALSE);
+ return;
+ }
+
+ if (pjsip_inv_send_msg(inv_session, tdata) != PJ_SUCCESS)
+ {
+ lg(Warning) << "Failed to send 100 Trying response";
+ pjsip_inv_terminate(inv_session, 500, PJ_FALSE);
+ }
+
+ pjsip_uri *from = rdata->msg_info.from->uri;
+ std::string callerName("");
+ if (PJSIP_URI_SCHEME_IS_SIP(from) || PJSIP_URI_SCHEME_IS_SIPS(from))
+ {
+ pjsip_sip_uri *sipFrom = (pjsip_sip_uri *)from;
+ callerName = std::string(pj_strbuf(&sipFrom->user), pj_strlen(&sipFrom->user));
+ lg(Debug) << "Got caller name " << callerName;
+ }
+ SipEndpointPtr caller = mEndpointFactory->findByName(callerName);
+ if (caller == 0)
+ {
+ lg(Warning) << "Unknown calling endpoint " << callerName;
+ pjsip_inv_end_session(inv_session, 403, NULL, &tdata);
+ pjsip_inv_send_msg(inv_session, tdata);
+ return;
+ }
+ SipEndpointConfig &config = caller->getConfig();
+ if (config.sessionConfig.callDirection != BOTH && config.sessionConfig.callDirection != INBOUND)
+ {
+ lg(Warning) << "Caller " << callerName << " does not have permission to make inbound calls.";
+ pjsip_inv_end_session(inv_session, 403, NULL, &tdata);
+ pjsip_inv_send_msg(inv_session, tdata);
+ return;
+ }
+
+ //We've created our calling endpoint. Now we need to look up the destination.
+ pjsip_uri *ruri = rdata->msg_info.msg->line.req.uri;
+ std::string destination("");
+ if (PJSIP_URI_SCHEME_IS_SIP(ruri) || PJSIP_URI_SCHEME_IS_SIPS(ruri))
+ {
+ pjsip_sip_uri *sipRuri = (pjsip_sip_uri *)ruri;
+ //For now, we only know about destination "100" so we'll
+ //grab that from the URI to pass to the locator.
+ destination = std::string(pj_strbuf(&sipRuri->user), pj_strlen(&sipRuri->user));
+ lg(Debug) << "Call is destined for " << destination;
+ }
+
+ SipSessionPtr session = caller->createSession(destination);
+ session->setInviteSession(inv_session);
+ session->setDialog(dlg);
+ PJSipSessionModInfo *session_mod_info = new PJSipSessionModInfo(inv_session, session);
+ dlg_mod_info->mDialogState->mSessionId = session_mod_info->mSessionState->mSessionId;
+ tsx_mod_info->mTransactionState->mSessionId = session_mod_info->mSessionState->mSessionId;
+
+ inv_session->mod_data[mModule.id] = (void *)session_mod_info;
+ dlg->mod_data[mModule.id] = (void *)dlg_mod_info;
+
+ lg(Debug) << "Replicating state on reception of new SIP INVITE.";
+ replicateState(dlg_mod_info, tsx_mod_info, session_mod_info);
+ try
+ {
+ if (replaced_dlg)
+ {
+ // For attended transfers we need to contact the routing service which should then (hopefully) replace the other session
+ }
+ else
+ {
+ // If this is not an attended transfer we can just route the session as normally
+ mSessionRouter->routeSession(session->getSessionProxy(), destination);
+ }
+ }
+ catch (AsteriskSCF::Core::Routing::V1::DestinationNotFoundException&)
+ {
+ // Destination not found is special since we can actually map it to a good response code, 404
+ pjsip_inv_end_session(inv_session, 404, NULL, &tdata);
+ pjsip_inv_send_msg(inv_session, tdata);
+ return;
+ }
+ catch (...)
+ {
+ // Everything else doesn't really map so they just become internal server errors
+ pjsip_inv_end_session(inv_session, 500, NULL, &tdata);
+ pjsip_inv_send_msg(inv_session, tdata);
+ return;
+ }
}
void PJSipSessionModule::handleRefer(pjsip_inv_session *inv, pjsip_rx_data *rdata)
{
- const pj_str_t str_refer_to = { (char*)"Refer-To", 8 };
- pjsip_generic_string_hdr *refer_to = static_cast<pjsip_generic_string_hdr *>(pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_refer_to, NULL));
-
- lg(Debug) << "Handling a REFER" << std::endl;
- if (!refer_to)
- {
- // Uh... so they didn't tell us where to REFER this to... yeah no
- lg(Debug) << "handleRefer() sending 400 due to no refer_to. ";
- pjsip_dlg_respond(inv->dlg, rdata, 400, NULL, NULL, NULL);
- return;
- }
-
- // TODO: Add support for subscription
-
- // TODO: Provide method to send back suitable response
-
- // Now parse the URI to get the actual target they want to refer to
- pjsip_uri *target_uri = static_cast<pjsip_uri *>(pjsip_parse_uri(inv->dlg->pool, refer_to->hvalue.ptr, refer_to->hvalue.slen, 0));
-
- // We only support SIP URIs, anything else is rubbish to us
- if (!PJSIP_URI_SCHEME_IS_SIP(target_uri) && !PJSIP_URI_SCHEME_IS_SIPS(target_uri))
- {
- // TODO: Place proper response code in here
- lg(Debug) << "handleRefer() sending 400 due to non-SIP URI. ";
- pjsip_dlg_respond(inv->dlg, rdata, 400, NULL, NULL, NULL);
- return;
- }
-
- pjsip_sip_uri *target_sip_uri = (pjsip_sip_uri *)pjsip_uri_get_uri(target_uri);
-
- // Determine if this is a blind transfer or an attended transfer
- pj_str_t replaces = pj_str((char*)"Replaces");
- pjsip_param *replaces_param = pjsip_param_find(&target_sip_uri->other_param, &replaces);
-
- if (!replaces_param)
- {
- replaces_param = pjsip_param_find(&target_sip_uri->header_param, &replaces);
- }
-
- if (replaces_param)
- {
- pj_str_t to_tag = pj_str((char*)"To-tag");
- pj_str_t from_tag = pj_str((char*)"From-tag");
- pjsip_param *to_tag_param = pjsip_param_find(&target_sip_uri->other_param, &to_tag);
- pjsip_param *from_tag_param = pjsip_param_find(&target_sip_uri->other_param, &from_tag);
- pjsip_dialog *other_dlg = NULL;
-
- if (to_tag_param && from_tag_param)
- {
- other_dlg = pjsip_ua_find_dialog(&replaces_param->value, &to_tag_param->value, &from_tag_param->value, PJ_TRUE);
- }
- else
- {
- // It is possible for the to and from tag value to be present within the Replaces parameter value, so try to parse it out
- std::string replaces_value_tmp = std::string(pj_strbuf(&replaces_param->value), pj_strlen(&replaces_param->value));
- size_t from_tag_pos = replaces_value_tmp.find(";from-tag=");
- size_t to_tag_pos = replaces_value_tmp.find(";to-tag=");
-
- if (from_tag_pos == std::string::npos || to_tag_pos == std::string::npos)
- {
- lg(Debug) << "handleRefer() sending 400 due to From or To missing. ";
- pjsip_dlg_respond(inv->dlg, rdata, 400, NULL, NULL, NULL);
- return;
- }
-
- std::string to_tag_value = replaces_value_tmp.substr(to_tag_pos + 8, from_tag_pos - to_tag_pos - 8);
- std::string from_tag_value = replaces_value_tmp.substr(from_tag_pos + 10);
- std::string replaces_value = replaces_value_tmp.substr(0, to_tag_pos);
-
- pj_str_t to_tag_str = pj_str((char*)to_tag_value.c_str());
- pj_str_t from_tag_str = pj_str((char*)from_tag_value.c_str());
- pj_str_t replaces_tag_str = pj_str((char*)replaces_value.c_str());
-
- other_dlg = pjsip_ua_find_dialog(&replaces_tag_str, &to_tag_str, &from_tag_str, PJ_TRUE);
- }
-
- if (!other_dlg)
- {
- lg(Debug) << "handleRefer() sending PJSIP_SC_CALL_TSX_DOES_NOT_EXIST due to no other_dlg. ";
- pjsip_dlg_respond(inv->dlg, rdata, PJSIP_SC_CALL_TSX_DOES_NOT_EXIST, NULL, NULL, NULL);
- return;
- }
-
- pjsip_inv_session *other_inv = pjsip_dlg_get_inv_session(other_dlg);
-
- if (!other_inv)
- {
- lg(Debug) << "handleRefer() sending PJSIP_SC_CALL_TSX_DOES_NOT_EXIST due to no other_inv. ";
- pjsip_dlg_respond(inv->dlg, rdata, PJSIP_SC_CALL_TSX_DOES_NOT_EXIST, NULL, NULL, NULL);
- pjsip_dlg_dec_lock(other_dlg);
- return;
- }
-
- if (other_inv->state >= PJSIP_INV_STATE_DISCONNECTED)
- {
- lg(Debug) << "handleRefer() sending PJSIP_SC_DECLINE due to state > PJSIP_INV_STATE_DISCONNECTED. ";
-
- pjsip_dlg_respond(inv->dlg, rdata, PJSIP_SC_DECLINE, NULL, NULL, NULL);
- pjsip_dlg_dec_lock(other_dlg);
- return;
- }
-
- if (other_inv->state <= PJSIP_INV_STATE_EARLY && other_inv->role != PJSIP_ROLE_UAC)
- {
- lg(Debug) << "handleRefer() sending PJSIP_SC_CALL_TSX_DOES_NOT_EXIST due to other_inv->state < PJSIP_INV_STATE_EARLY and role not UAC. ";
-
- pjsip_dlg_respond(inv->dlg, rdata, PJSIP_SC_CALL_TSX_DOES_NOT_EXIST, NULL, NULL, NULL);
- pjsip_dlg_dec_lock(other_dlg);
- return;
- }
-
- PJSipSessionModInfo *session_mod_info = (PJSipSessionModInfo*)inv->mod_data[mModule.id];
- SipSessionPtr session = session_mod_info->getSessionPtr();
-
- PJSipSessionModInfo *other_session_mod_info = (PJSipSessionModInfo*)other_inv->mod_data[mModule.id];
- SipSessionPtr other_session = other_session_mod_info->getSessionPtr();
-
- try
- {
- lg(Debug) << "handleRefer() calling router connectBridgedSessions(). " << std::endl;
- mSessionRouter->connectBridgedSessions(session->getSessionProxy(), other_session->getSessionProxy());
- pjsip_dlg_respond(inv->dlg, rdata, 200, NULL, NULL, NULL);
- Ice::Current current;
- lg(Debug) << "handleRefer() calling session->stop(). " << std::endl;
- session->stop(new ResponseCode(16), current);
- }
- catch (const std::exception& e)
- {
- lg(Debug) << "handleRefer() sending 400 due to exception: " << e.what() << std::endl;
- pjsip_dlg_respond(inv->dlg, rdata, 400, NULL, NULL, NULL);
- }
- pjsip_dlg_dec_lock(other_dlg);
- }
- else
- {
- std::string target = std::string(pj_strbuf(&target_sip_uri->user), pj_strlen(&target_sip_uri->user));
-
- // Now that we have the target user we can pass this into routing and go on our marry way
- try
- {
- PJSipSessionModInfo *session_mod_info = (PJSipSessionModInfo*)inv->mod_data[mModule.id];
- SipSessionPtr session = session_mod_info->getSessionPtr();
-
- lg(Debug) << "handleRefer() calling router connectBridgedSessionsWithDestination(). " << std::endl;
- mSessionRouter->connectBridgedSessionsWithDestination(session->getSessionProxy(), target);
- pjsip_dlg_respond(inv->dlg, rdata, 200, NULL, NULL, NULL);
- Ice::Current current;
-
- lg(Debug) << "handleRefer() calling session->stop(). " << std::endl;
- session->stop(new ResponseCode(16), current);
- }
- catch (const AsteriskSCF::Core::Routing::V1::DestinationNotFoundException&)
- {
- lg(Debug) << "handleRefer() sending 404 due to destination not found for target: " << target << std::endl;
-
- pjsip_dlg_respond(inv->dlg, rdata, 404, NULL, NULL, NULL);
- return;
- }
- catch (const std::exception& e)
- {
- lg(Debug) << "handleRefer() sending 400 due to exception: " << e.what() << std::endl;
- pjsip_dlg_respond(inv->dlg, rdata, 400, NULL, NULL, NULL);
- return;
- }
- }
+ const pj_str_t str_refer_to = { (char*)"Refer-To", 8 };
+ pjsip_generic_string_hdr *refer_to = static_cast<pjsip_generic_string_hdr *>(pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_refer_to, NULL));
+
+ lg(Debug) << "Handling a REFER" << std::endl;
+ if (!refer_to)
+ {
+ // Uh... so they didn't tell us where to REFER this to... yeah no
+ lg(Debug) << "handleRefer() sending 400 due to no refer_to. ";
+ pjsip_dlg_respond(inv->dlg, rdata, 400, NULL, NULL, NULL);
+ return;
+ }
+
+ // TODO: Add support for subscription
+
+ // TODO: Provide method to send back suitable response
+
+ // Now parse the URI to get the actual target they want to refer to
+ pjsip_uri *target_uri = static_cast<pjsip_uri *>(pjsip_parse_uri(inv->dlg->pool, refer_to->hvalue.ptr, refer_to->hvalue.slen, 0));
+
+ // We only support SIP URIs, anything else is rubbish to us
+ if (!PJSIP_URI_SCHEME_IS_SIP(target_uri) && !PJSIP_URI_SCHEME_IS_SIPS(target_uri))
+ {
+ // TODO: Place proper response code in here
+ lg(Debug) << "handleRefer() sending 400 due to non-SIP URI. ";
+ pjsip_dlg_respond(inv->dlg, rdata, 400, NULL, NULL, NULL);
+ return;
+ }
+
+ pjsip_sip_uri *target_sip_uri = (pjsip_sip_uri *)pjsip_uri_get_uri(target_uri);
+
+ // Determine if this is a blind transfer or an attended transfer
+ pj_str_t replaces = pj_str((char*)"Replaces");
+ pjsip_param *replaces_param = pjsip_param_find(&target_sip_uri->other_param, &replaces);
+
+ if (!replaces_param)
+ {
+ replaces_param = pjsip_param_find(&target_sip_uri->header_param, &replaces);
+ }
+
+ if (replaces_param)
+ {
+ pj_str_t to_tag = pj_str((char*)"To-tag");
+ pj_str_t from_tag = pj_str((char*)"From-tag");
+ pjsip_param *to_tag_param = pjsip_param_find(&target_sip_uri->other_param, &to_tag);
+ pjsip_param *from_tag_param = pjsip_param_find(&target_sip_uri->other_param, &from_tag);
+ pjsip_dialog *other_dlg = NULL;
+
+ if (to_tag_param && from_tag_param)
+ {
+ other_dlg = pjsip_ua_find_dialog(&replaces_param->value, &to_tag_param->value, &from_tag_param->value, PJ_TRUE);
+ }
+ else
+ {
+ // It is possible for the to and from tag value to be present within the Replaces parameter value, so try to parse it out
+ std::string replaces_value_tmp = std::string(pj_strbuf(&replaces_param->value), pj_strlen(&replaces_param->value));
+ size_t from_tag_pos = replaces_value_tmp.find(";from-tag=");
+ size_t to_tag_pos = replaces_value_tmp.find(";to-tag=");
+
+ if (from_tag_pos == std::string::npos || to_tag_pos == std::string::npos)
+ {
+ lg(Debug) << "handleRefer() sending 400 due to From or To missing. ";
+ pjsip_dlg_respond(inv->dlg, rdata, 400, NULL, NULL, NULL);
+ return;
+ }
+
+ std::string to_tag_value = replaces_value_tmp.substr(to_tag_pos + 8, from_tag_pos - to_tag_pos - 8);
+ std::string from_tag_value = replaces_value_tmp.substr(from_tag_pos + 10);
+ std::string replaces_value = replaces_value_tmp.substr(0, to_tag_pos);
+
+ pj_str_t to_tag_str = pj_str((char*)to_tag_value.c_str());
+ pj_str_t from_tag_str = pj_str((char*)from_tag_value.c_str());
+ pj_str_t replaces_tag_str = pj_str((char*)replaces_value.c_str());
+
+ other_dlg = pjsip_ua_find_dialog(&replaces_tag_str, &to_tag_str, &from_tag_str, PJ_TRUE);
+ }
+
+ if (!other_dlg)
+ {
+ lg(Debug) << "handleRefer() sending PJSIP_SC_CALL_TSX_DOES_NOT_EXIST due to no other_dlg. ";
+ pjsip_dlg_respond(inv->dlg, rdata, PJSIP_SC_CALL_TSX_DOES_NOT_EXIST, NULL, NULL, NULL);
+ return;
+ }
+
+ pjsip_inv_session *other_inv = pjsip_dlg_get_inv_session(other_dlg);
+
+ if (!other_inv)
+ {
+ lg(Debug) << "handleRefer() sending PJSIP_SC_CALL_TSX_DOES_NOT_EXIST due to no other_inv. ";
+ pjsip_dlg_respond(inv->dlg, rdata, PJSIP_SC_CALL_TSX_DOES_NOT_EXIST, NULL, NULL, NULL);
+ pjsip_dlg_dec_lock(other_dlg);
+ return;
+ }
+
+ if (other_inv->state >= PJSIP_INV_STATE_DISCONNECTED)
+ {
+ lg(Debug) << "handleRefer() sending PJSIP_SC_DECLINE due to state > PJSIP_INV_STATE_DISCONNECTED. ";
+
+ pjsip_dlg_respond(inv->dlg, rdata, PJSIP_SC_DECLINE, NULL, NULL, NULL);
+ pjsip_dlg_dec_lock(other_dlg);
+ return;
+ }
+
+ if (other_inv->state <= PJSIP_INV_STATE_EARLY && other_inv->role != PJSIP_ROLE_UAC)
+ {
+ lg(Debug) << "handleRefer() sending PJSIP_SC_CALL_TSX_DOES_NOT_EXIST due to other_inv->state < PJSIP_INV_STATE_EARLY and role not UAC. ";
+
+ pjsip_dlg_respond(inv->dlg, rdata, PJSIP_SC_CALL_TSX_DOES_NOT_EXIST, NULL, NULL, NULL);
+ pjsip_dlg_dec_lock(other_dlg);
+ return;
+ }
+
+ PJSipSessionModInfo *session_mod_info = (PJSipSessionModInfo*)inv->mod_data[mModule.id];
+ SipSessionPtr session = session_mod_info->getSessionPtr();
+
+ PJSipSessionModInfo *other_session_mod_info = (PJSipSessionModInfo*)other_inv->mod_data[mModule.id];
+ SipSessionPtr other_session = other_session_mod_info->getSessionPtr();
+
+ try
+ {
+ lg(Debug) << "handleRefer() calling router connectBridgedSessions(). " << std::endl;
+ mSessionRouter->connectBridgedSessions(session->getSessionProxy(), other_session->getSessionProxy());
+ pjsip_dlg_respond(inv->dlg, rdata, 200, NULL, NULL, NULL);
+ Ice::Current current;
+ lg(Debug) << "handleRefer() calling session->stop(). " << std::endl;
+ session->stop(new ResponseCode(16), current);
... 5230 lines suppressed ...
--
asterisk-scf/integration/sip.git
More information about the asterisk-scf-commits
mailing list