Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
savoirfairelinux
jami-daemon
Commits
9df4c619
Commit
9df4c619
authored
Aug 21, 2013
by
Patrick Keroulas
Browse files
* #28472 : add presenceSubcribe confirm functions, unhardacode variables.
parent
c44e5251
Changes
10
Hide whitespace changes
Inline
Side-by-side
daemon/src/client/callmanager.h
View file @
9df4c619
...
...
@@ -180,7 +180,7 @@ class CallManager
void
sipCallStateChanged
(
const
std
::
string
&
,
const
std
::
string
&
,
const
int32_t
&
);
#endif // __ANDROID__
/* Presence subscription */
/* Presence subscription
/Notification.
*/
void
subscribePresence
(
const
std
::
string
&
accountID
,
const
std
::
string
&
buddySipUri
);
void
unsubscribePresence
(
const
std
::
string
&
accountID
,
const
std
::
string
&
buddySipUri
);
void
sendPresence
(
const
std
::
string
&
accountID
,
const
std
::
string
&
status
,
const
std
::
string
&
note
);
...
...
daemon/src/client/dbus/callmanager-introspec.xml
View file @
9df4c619
...
...
@@ -840,7 +840,7 @@
</method>
<method
name=
"confirmPresenceSubscription"
tp:name-for-bindings=
"confirmPresenceSubscription"
>
<arg
type=
"b"
name=
"confirm"
/>
<arg
type=
"b"
name=
"confirm"
direction=
"in"
/>
</method>
<signal
name=
"newPresenceNotification"
tp:name-for-bindings=
"newPresenceNotification"
>
...
...
daemon/src/client/dbus/callmanager.cpp
View file @
9df4c619
...
...
@@ -438,7 +438,6 @@ CallManager::unsubscribePresence(const std::string& accountID, const std::string
}
void
CallManager
::
sendPresence
(
const
std
::
string
&
accountID
,
const
std
::
string
&
status
,
const
std
::
string
&
note
)
{
DEBUG
(
"sendPresence (acc:%s, status:%s)."
,
accountID
.
c_str
(),
status
.
c_str
());
...
...
@@ -446,9 +445,8 @@ CallManager::sendPresence(const std::string& accountID, const std::string& statu
}
void
CallManager
::
confirmPresenceSubscription
(
const
bool
&
confirm
)
{
DEBUG
(
"confirmPresenceSubscription :
%s"
,
confirm
);
DEBUG
(
"confirmPresenceSubscription :
"
);
Manager
::
instance
().
confirmPresenceSubscription
(
confirm
);
}
daemon/src/sip/presence_subscription.cpp
View file @
9df4c619
...
...
@@ -50,7 +50,7 @@ void pres_evsub_on_srv_state(pjsip_evsub *sub, pjsip_event *event) {
SIPPresence
*
pres
=
Manager
::
instance
().
getSipAccount
(
"IP2IP"
)
->
getPresence
();
pres
->
lock
();
PresenceSubscription
*
presenceSub
=
(
PresenceSubscription
*
)
pjsip_evsub_get_mod_data
(
sub
,
pres
->
getModId
());
WARN
(
"Presence server subscription to %s is %s"
,
presenceSub
->
remote
,
pjsip_evsub_get_state_name
(
sub
));
DEBUG
(
"Presence server subscription to %s is %s"
,
presenceSub
->
remote
,
pjsip_evsub_get_state_name
(
sub
));
if
(
presenceSub
)
{
pjsip_evsub_state
state
;
...
...
@@ -152,7 +152,9 @@ pj_bool_t pres_on_rx_subscribe_request(pjsip_rx_data *rdata) {
pjsip_evsub_set_mod_data
(
sub
,
pres
->
getModId
(),
presenceSub
);
/* Need client approvement.*/
pres
->
reportNewServerSubscription
(
presenceSub
);
//pres->reportNewServerSubscription(presenceSub);
pres
->
addServerSubscription
(
presenceSub
);
/* Capture the value of Expires header. */
expires_hdr
=
(
pjsip_expires_hdr
*
)
pjsip_msg_find_hdr
(
rdata
->
msg_info
.
msg
,
PJSIP_H_EXPIRES
,
NULL
);
...
...
@@ -195,7 +197,7 @@ pj_bool_t pres_on_rx_subscribe_request(pjsip_rx_data *rdata) {
tdata
=
NULL
;
status
=
pjsip_pres_notify
(
sub
,
ev_state
,
&
stateStr
,
&
reason
,
&
tdata
);
if
(
status
==
PJ_SUCCESS
)
{
pres
_process_msg_data
(
tdata
,
&
msg_data
);
pres
->
fillDoc
(
tdata
,
&
msg_data
);
status
=
pjsip_pres_send_request
(
sub
,
tdata
);
}
...
...
@@ -211,24 +213,13 @@ pj_bool_t pres_on_rx_subscribe_request(pjsip_rx_data *rdata) {
PresenceSubscription
::
PresenceSubscription
(
SIPPresence
*
pres
,
pjsip_evsub
*
evsub
,
char
*
r
,
pjsip_dialog
*
d
)
:
sub
(
evsub
)
,
pres_
(
pres
)
PresenceSubscription
::
PresenceSubscription
(
SIPPresence
*
pres
,
pjsip_evsub
*
evsub
,
char
*
r
,
pjsip_dialog
*
d
)
:
pres_
(
pres
)
,
sub
(
evsub
)
,
remote
(
r
)
,
dlg
(
d
)
,
expires
(
-
1
)
{
}
{}
void
PresenceSubscription
::
setExpires
(
int
ms
)
{
...
...
@@ -273,7 +264,7 @@ void PresenceSubscription::init(){
pj_str_t
stateStr
=
pj_str
(
""
);
pj_status_t
status
=
pjsip_pres_notify
(
sub
,
ev_state
,
&
stateStr
,
&
reason
,
&
tdata
);
if
(
status
==
PJ_SUCCESS
)
{
pres_
process_msg_data
(
tdata
,
&
msg_data
);
pres_
->
fillDoc
(
tdata
,
&
msg_data
);
status
=
pjsip_pres_send_request
(
sub
,
tdata
);
}
...
...
@@ -298,7 +289,7 @@ void PresenceSubscription::notify() {
if
(
pjsip_pres_current_notify
(
sub
,
&
tdata
)
==
PJ_SUCCESS
)
{
// add msg header and send
pres_
process_msg_data
(
tdata
,
NULL
);
pres_
->
fillDoc
(
tdata
,
NULL
);
pjsip_pres_send_request
(
sub
,
tdata
);
}
else
{
...
...
daemon/src/sip/presence_subscription.h
View file @
9df4c619
...
...
@@ -75,7 +75,6 @@ public:
int
getExpires
();
bool
matches
(
PresenceSubscription
*
s
);
bool
isActive
();
//SIPPresence * getPresence();
/**
* Send the tirst notification.
...
...
daemon/src/sip/sipbuddy.cpp
View file @
9df4c619
...
...
@@ -57,14 +57,14 @@
int
modId
;
static
void
buddy_timer_cb
(
pj_timer_heap_t
*
th
,
pj_timer_entry
*
entry
)
{
void
buddy_timer_cb
(
pj_timer_heap_t
*
th
,
pj_timer_entry
*
entry
)
{
(
void
)
th
;
SIPBuddy
*
b
=
(
SIPBuddy
*
)
entry
->
user_data
;
b
->
reportPresence
();
}
/* Callback called when *client* subscription state has changed. */
static
void
buddy_evsub_on_state
(
pjsip_evsub
*
sub
,
pjsip_event
*
event
)
{
void
buddy_evsub_on_state
(
pjsip_evsub
*
sub
,
pjsip_event
*
event
)
{
SIPBuddy
*
buddy
;
PJ_UNUSED_ARG
(
event
);
...
...
@@ -194,7 +194,7 @@ static void buddy_evsub_on_state(pjsip_evsub *sub, pjsip_event *event) {
}
/* Callback when transaction state has changed. */
static
void
buddy_evsub_on_tsx_state
(
pjsip_evsub
*
sub
,
pjsip_transaction
*
tsx
,
pjsip_event
*
event
)
{
void
buddy_evsub_on_tsx_state
(
pjsip_evsub
*
sub
,
pjsip_transaction
*
tsx
,
pjsip_event
*
event
)
{
SIPBuddy
*
buddy
;
pjsip_contact_hdr
*
contact_hdr
;
...
...
@@ -346,7 +346,7 @@ void SIPBuddy::accept() {
acc
->
getPresence
()
->
addBuddy
(
this
);
}
pj_status_t
SIPBuddy
::
reportPresence
()
{
void
SIPBuddy
::
reportPresence
()
{
//incLock();
/* callback*/
...
...
@@ -377,7 +377,7 @@ pj_status_t SIPBuddy::updateSubscription() {
WARN
(
"Buddy %s: unsubscribing.."
,
uri
.
ptr
);
retStatus
=
pjsip_pres_initiate
(
sub
,
0
,
&
tdata
);
if
(
retStatus
==
PJ_SUCCESS
)
{
pres_process_msg_data
(
tdata
,
NULL
);
acc
->
getPresence
()
->
fillDoc
(
tdata
,
NULL
);
/*if (tdata->msg->type == PJSIP_REQUEST_MSG) {
const pj_str_t STR_USER_AGENT = {"User-Agent", 10};
pj_str_t ua = pj_str(strdup(acc->getUserAgentName().c_str()));
...
...
@@ -409,7 +409,7 @@ pj_status_t SIPBuddy::updateSubscription() {
//subscribe
pjsip_evsub_user
pres_callback
;
// pj_pool_t *tmp_pool = NULL;
// pj_pool_t *tmp_pool = NULL;
// related to "contact field. TODO: check if this is necessary"
pjsip_tx_data
*
tdata
;
pj_status_t
status
;
...
...
@@ -480,7 +480,6 @@ pj_status_t SIPBuddy::updateSubscription() {
*/
if (acc->cfg.transport_id != PJSUA_INVALID_ID) {
pjsip_tpselector tp_sel;
pjsua_init_tpselector(acc->cfg.transport_id, &tp_sel);
pjsip_dlg_set_transport(buddy->dlg, &tp_sel);
}
...
...
@@ -492,7 +491,7 @@ pj_status_t SIPBuddy::updateSubscription() {
/* Set credentials */
if (acc->cred_cnt) {
pjsip_auth_clt_set_credentials(&buddy->dlg->auth_sess
,
pjsip_auth_clt_set_credentials(&buddy->dlg->auth_sess
acc->cred_cnt, acc->cred);
}
...
...
daemon/src/sip/sipbuddy.h
View file @
9df4c619
...
...
@@ -137,7 +137,7 @@ class SIPBuddy {
* Callback after a presence notification was received.
* Tranfert info to the SIP account.
*/
pj_status_t
reportPresence
();
void
reportPresence
();
/**
* Process the un/subscribe request transmission.
*/
...
...
daemon/src/sip/sippresence.cpp
View file @
9df4c619
...
...
@@ -41,54 +41,22 @@
#include
"presence_subscription.h"
#include
"sipvoiplink.h"
/**
* Generic function.
* Fill the header.
*/
void
pres_process_msg_data
(
pjsip_tx_data
*
tdata
,
const
pres_msg_data
*
msg_data
){
if
(
tdata
->
msg
->
type
==
PJSIP_REQUEST_MSG
)
{
const
pj_str_t
STR_USER_AGENT
=
pj_str
(
"User-Agent"
);
pjsip_hdr
*
h
;
pj_str_t
ua
=
pj_str
(
"SFLPhone"
);
h
=
(
pjsip_hdr
*
)
pjsip_generic_string_hdr_create
(
tdata
->
pool
,
&
STR_USER_AGENT
,
&
ua
);
pjsip_msg_add_hdr
(
tdata
->
msg
,
h
);
}
if
(
msg_data
==
NULL
)
return
;
const
pjsip_hdr
*
hdr
;
hdr
=
msg_data
->
hdr_list
.
next
;
while
(
hdr
&&
hdr
!=
&
msg_data
->
hdr_list
)
{
pjsip_hdr
*
new_hdr
;
new_hdr
=
(
pjsip_hdr
*
)
pjsip_hdr_clone
(
tdata
->
pool
,
hdr
);
DEBUG
(
"adding header"
,
new_hdr
->
name
.
ptr
);
pjsip_msg_add_hdr
(
tdata
->
msg
,
new_hdr
);
hdr
=
hdr
->
next
;
}
if
(
msg_data
->
content_type
.
slen
&&
msg_data
->
msg_body
.
slen
)
{
pjsip_msg_body
*
body
;
pj_str_t
type
=
pj_str
(
"application"
);
pj_str_t
subtype
=
pj_str
(
"pidf+xml"
);
body
=
pjsip_msg_body_create
(
tdata
->
pool
,
&
type
,
&
subtype
,
&
msg_data
->
msg_body
);
tdata
->
msg
->
body
=
body
;
}
}
/*TODO : clean this*/
static
pj_caching_pool
cp
;
SIPPresence
::
SIPPresence
(
SIPAccount
*
acc
)
:
acc_
(
acc
)
,
pres_status_data
()
:
pres_status_data
()
,
online_status
()
,
rpid
({
PJRPID_ELEMENT_TYPE_PERSON
,
pj_str
(
"20"
),
pj_str
(
"20"
),
/*TODO : unhardcode this*/
PJRPID_ACTIVITY_BUSY
,
pj_str
(
""
)})
,
publish_sess
()
,
publish_state
()
,
publish_enabled
(
true
)
,
acc_
(
acc
)
,
newPresenceSubscription_
(
NULL
)
,
serverSubscriptions_
()
,
buddies_
()
...
...
@@ -110,7 +78,10 @@ SIPPresence::SIPPresence(SIPAccount *acc)
}
SIPPresence
::~
SIPPresence
(){}
SIPPresence
::~
SIPPresence
(){
/*TODO free buddy/subcriber lists and the pool*/
}
SIPAccount
*
SIPPresence
::
getAccount
(){
return
acc_
;
...
...
@@ -124,11 +95,15 @@ int SIPPresence::getModId(){
return
((
SIPVoIPLink
*
)
(
acc_
->
getVoIPLink
()))
->
getModId
();
}
pj_pool_t
*
SIPPresence
::
getPool
(){
return
pool_
;
}
void
SIPPresence
::
updateStatus
(
const
std
::
string
&
status
,
const
std
::
string
&
note
){
pjrpid_element
rpid
=
{
PJRPID_ELEMENT_TYPE_PERSON
,
pj_str
(
"20"
),
PJRPID_ACTIVITY_UNKNOWN
,
pj_str
(
strdup
(
note
.
c_str
()))};
pj_str
(
strdup
(
note
.
c_str
()))};
/*TODO : del strdup*/
/* fill activity if user not available. */
if
(
note
==
"away"
)
...
...
@@ -207,7 +182,7 @@ void SIPPresence::reportNewServerSubscription(PresenceSubscription *s){
}
void
SIPPresence
::
confirmNewServerSubscription
(
const
bool
&
confirm
){
if
(
newPresenceSubscription_
!
=
NULL
)
if
(
newPresenceSubscription_
=
NULL
)
return
;
if
(
confirm
){
...
...
@@ -268,3 +243,44 @@ bool SIPPresence::isLocked()
{
return
mutex_owner_
==
pj_thread_this
();
}
void
SIPPresence
::
fillDoc
(
pjsip_tx_data
*
tdata
,
const
pres_msg_data
*
msg_data
)
{
if
(
tdata
->
msg
->
type
==
PJSIP_REQUEST_MSG
)
{
const
pj_str_t
STR_USER_AGENT
=
pj_str
(
"User-Agent"
);
std
::
string
useragent
(
acc_
->
getUserAgentName
());
pj_str_t
pJuseragent
=
pj_str
((
char
*
)
useragent
.
c_str
());
pjsip_hdr
*
h
=
(
pjsip_hdr
*
)
pjsip_generic_string_hdr_create
(
tdata
->
pool
,
&
STR_USER_AGENT
,
&
pJuseragent
);
pjsip_msg_add_hdr
(
tdata
->
msg
,
h
);
/*pjsip_hdr hdr_list;
pj_list_init(&hdr_list);
std::string useragent(account->getUserAgentName());
pj_str_t pJuseragent = pj_str((char*) useragent.c_str());
const pj_str_t STR_USER_AGENT = { (char*) "User-Agent", 10 };
pjsip_generic_string_hdr *h = pjsip_generic_string_hdr_create(pool_, &STR_USER_AGENT, &pJuseragent);
*/
}
if
(
msg_data
==
NULL
)
return
;
const
pjsip_hdr
*
hdr
;
hdr
=
msg_data
->
hdr_list
.
next
;
while
(
hdr
&&
hdr
!=
&
msg_data
->
hdr_list
)
{
pjsip_hdr
*
new_hdr
;
new_hdr
=
(
pjsip_hdr
*
)
pjsip_hdr_clone
(
tdata
->
pool
,
hdr
);
DEBUG
(
"adding header"
,
new_hdr
->
name
.
ptr
);
pjsip_msg_add_hdr
(
tdata
->
msg
,
new_hdr
);
hdr
=
hdr
->
next
;
}
if
(
msg_data
->
content_type
.
slen
&&
msg_data
->
msg_body
.
slen
)
{
pjsip_msg_body
*
body
;
pj_str_t
type
=
pj_str
(
"application"
);
pj_str_t
subtype
=
pj_str
(
"pidf+xml"
);
body
=
pjsip_msg_body_create
(
tdata
->
pool
,
&
type
,
&
subtype
,
&
msg_data
->
msg_body
);
tdata
->
msg
->
body
=
body
;
}
}
daemon/src/sip/sippresence.h
View file @
9df4c619
...
...
@@ -84,7 +84,7 @@ struct pres_msg_data
};
extern
void
pres_process_msg_data
(
pjsip_tx_data
*
tdata
,
const
pres_msg_data
*
msg_data
);
//
extern void pres_process_msg_data(pjsip_tx_data *tdata, const pres_msg_data *msg_data);
class
SIPAccount
;
...
...
@@ -127,6 +127,14 @@ public:
* Return presence module ID which is actually the same as the VOIP link
*/
int
getModId
();
/**
* Return a pool for generic functions.
*/
pj_pool_t
*
getPool
();
/**
* Fill xml document, the header and the body
*/
void
fillDoc
(
pjsip_tx_data
*
tdata
,
const
pres_msg_data
*
msg_data
);
/**
* Modify the presence data
* @param status is basically "open" or "close"
...
...
daemon/src/sip/sippublish.cpp
View file @
9df4c619
...
...
@@ -32,6 +32,7 @@
#include
<pjsip/sip_endpoint.h>
#include
"sippresence.h"
#include
"sip_utils.h"
#include
"sippublish.h"
#include
"logger.h"
#include
"sipvoiplink.h"
...
...
@@ -95,7 +96,7 @@ pj_status_t pres_send_publish(SIPPresence * pres, pj_bool_t active)
contactWithAngles
.
erase
(
contactWithAngles
.
find
(
'>'
));
int
semicolon
=
contactWithAngles
.
find_first_of
(
":"
);
std
::
string
contactWithoutAngles
=
contactWithAngles
.
substr
(
semicolon
+
1
);
pj_str_t
contt
=
pj_str
(
strdup
(
contactWithoutAngles
.
c_str
()));
//
pj_str_t cont
ac
t = pj_str(strdup(contactWithoutAngles.c_str()));
// pj_memcpy(&pres_status_data.info[0].contact, &contt, sizeof(pj_str_t));;
/* Create PUBLISH request */
...
...
@@ -148,7 +149,7 @@ pj_status_t pres_send_publish(SIPPresence * pres, pj_bool_t active)
pjsip_media_type_init
(
&
msg_data
.
multipart_ctype
,
NULL
,
NULL
);
pj_list_init
(
&
msg_data
.
multipart_parts
);
pres
_process_msg_data
(
tdata
,
&
msg_data
);
pres
->
fillDoc
(
tdata
,
&
msg_data
);
/* Set Via sent-by */
...
...
@@ -227,9 +228,8 @@ pj_status_t pres_publish(SIPPresence *pres)
}
/* Set route-set */
//pjsip_publishc_set_route_set(pres->publish_sess, &acc->route_set);
//if (acc->hasServiceRoute())
// pjsip_regc_set_route_set(regc, sip_utils::createRouteSet(acc->getServiceRoute(), pool_));
if
(
acc
->
hasServiceRoute
())
pjsip_regc_set_route_set
(
acc
->
getRegistrationInfo
(),
sip_utils
::
createRouteSet
(
acc
->
getServiceRoute
(),
pres
->
getPool
()));
/* Send initial PUBLISH request */
status
=
pres_send_publish
(
pres
,
PJ_TRUE
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment