Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
liblinphone
Commits
47da8088
Commit
47da8088
authored
Oct 09, 2017
by
Ghislain MARY
Browse files
Improve handling of conference event package subscription/notification.
parent
9831f4dc
Changes
11
Hide whitespace changes
Inline
Side-by-side
coreapi/chat.c
View file @
47da8088
...
...
@@ -138,6 +138,7 @@ LinphoneChatRoom * linphone_core_create_client_group_chat_room(LinphoneCore *lc,
LinphoneChatRoom
*
_linphone_core_join_client_group_chat_room
(
LinphoneCore
*
lc
,
const
LinphonePrivate
::
Address
&
addr
)
{
LinphoneChatRoom
*
cr
=
_linphone_client_group_chat_room_new
(
lc
,
addr
.
asString
().
c_str
(),
nullptr
);
L_GET_CPP_PTR_FROM_C_OBJECT
(
cr
)
->
join
();
_linphone_core_add_group_chat_room
(
lc
,
L_GET_CPP_PTR_FROM_C_OBJECT
(
cr
)
->
getConferenceAddress
()
->
asStringUriOnly
().
c_str
(),
linphone_chat_room_ref
(
cr
));
lc
->
chatrooms
=
bctbx_list_append
(
lc
->
chatrooms
,
cr
);
return
cr
;
}
...
...
coreapi/linphonecore.c
View file @
47da8088
...
...
@@ -45,6 +45,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "mediastreamer2/msjpegwriter.h"
#include "mediastreamer2/msogl.h"
#include "mediastreamer2/msvolume.h"
#include "chat/client-group-chat-room-p.h"
#include "conference/remote-conference-event-handler.h"
// For migration purpose.
...
...
@@ -2115,11 +2116,13 @@ static void linphone_core_internal_notify_received(LinphoneCore *lc, LinphoneEve
ms_message
(
"Notify presence for list %p"
,
list
);
linphone_friend_list_notify_presence_received
(
list
,
lev
,
body
);
}
}
else
if
(
strcmp
(
notified_event
,
"Conference"
)
==
0
)
{
LinphonePrivate
::
RemoteConferenceEventHandler
*
handler
=
reinterpret_cast
<
LinphonePrivate
::
RemoteConferenceEventHandler
*>
(
linphone_event_get_user_data
(
lev
));
if
(
handler
)
handler
->
notifyReceived
(
reinterpret_cast
<
char
*>
(
linphone_content_get_buffer
(
body
)));
}
else
if
(
strcmp
(
notified_event
,
"conference"
)
==
0
)
{
const
LinphoneAddress
*
resource
=
linphone_event_get_resource
(
lev
);
char
*
resourceUri
=
linphone_address_as_string_uri_only
(
resource
);
LinphoneChatRoom
*
cr
=
_linphone_core_find_group_chat_room
(
lc
,
resourceUri
);
bctbx_free
(
resourceUri
);
if
(
cr
)
L_GET_PRIVATE_FROM_C_OBJECT
(
cr
,
ClientGroupChatRoom
)
->
notifyReceived
(
linphone_content_get_string_buffer
(
body
));
}
}
...
...
@@ -2251,6 +2254,7 @@ static void linphone_core_init(LinphoneCore * lc, LinphoneCoreCbs *cbs, LpConfig
linphone_configuring_terminated
(
lc
,
LinphoneConfiguringSkipped
,
NULL
);
}
// else linphone_core_start will be called after the remote provisioning (see linphone_core_iterate)
lc
->
bw_controller
=
ms_bandwidth_controller_new
();
lc
->
group_chat_rooms
=
bctbx_mmap_cchar_new
();
}
LinphoneCore
*
_linphone_core_new_with_config
(
LinphoneCoreCbs
*
cbs
,
struct
_LpConfig
*
config
,
void
*
userdata
)
{
...
...
@@ -5946,6 +5950,8 @@ static void linphone_core_uninit(LinphoneCore *lc)
}
lc
->
chatrooms
=
bctbx_list_free_with_data
(
lc
->
chatrooms
,
(
MSIterateFunc
)
linphone_chat_room_release
);
if
(
lc
->
group_chat_rooms
)
bctbx_mmap_cchar_delete_with_data
(
lc
->
group_chat_rooms
,
(
void
(
*
)(
void
*
))
linphone_chat_room_unref
);
linphone_core_set_state
(
lc
,
LinphoneGlobalShutdown
,
"Shutting down"
);
#ifdef VIDEO_ENABLED
...
...
@@ -7077,6 +7083,32 @@ const char * linphone_core_get_conference_factory_uri(const LinphoneCore *lc) {
return
lp_config_get_string
(
linphone_core_get_config
(
lc
),
"misc"
,
"conference_factory_uri"
,
nullptr
);
}
bool_t
_linphone_core_has_group_chat_room
(
const
LinphoneCore
*
lc
,
const
char
*
id
)
{
bool_t
result
;
bctbx_iterator_t
*
it
=
bctbx_map_cchar_find_key
(
lc
->
group_chat_rooms
,
id
);
bctbx_iterator_t
*
endit
=
bctbx_map_cchar_end
(
lc
->
group_chat_rooms
);
result
=
!
bctbx_iterator_cchar_equals
(
it
,
endit
);
bctbx_iterator_cchar_delete
(
endit
);
bctbx_iterator_cchar_delete
(
it
);
return
result
;
}
void
_linphone_core_add_group_chat_room
(
LinphoneCore
*
lc
,
const
char
*
id
,
LinphoneChatRoom
*
cr
)
{
bctbx_pair_t
*
pair
=
reinterpret_cast
<
bctbx_pair_t
*>
(
bctbx_pair_cchar_new
(
id
,
linphone_chat_room_ref
(
cr
)));
bctbx_map_cchar_insert_and_delete
(
lc
->
group_chat_rooms
,
pair
);
}
LinphoneChatRoom
*
_linphone_core_find_group_chat_room
(
const
LinphoneCore
*
lc
,
const
char
*
id
)
{
LinphoneChatRoom
*
result
=
nullptr
;
bctbx_iterator_t
*
it
=
bctbx_map_cchar_find_key
(
lc
->
group_chat_rooms
,
id
);
bctbx_iterator_t
*
endit
=
bctbx_map_cchar_end
(
lc
->
group_chat_rooms
);
if
(
!
bctbx_iterator_cchar_equals
(
it
,
endit
))
result
=
reinterpret_cast
<
LinphoneChatRoom
*>
(
bctbx_pair_cchar_get_second
(
bctbx_iterator_cchar_get_pair
(
it
)));
bctbx_iterator_cchar_delete
(
endit
);
bctbx_iterator_cchar_delete
(
it
);
return
result
;
}
void
linphone_core_set_tls_cert
(
LinphoneCore
*
lc
,
const
char
*
tls_cert
)
{
if
(
lc
->
tls_cert
)
{
ms_free
(
lc
->
tls_cert
);
...
...
coreapi/private.h
View file @
47da8088
...
...
@@ -449,6 +449,8 @@ bool_t linphone_core_incompatible_security(LinphoneCore *lc, SalMediaDescription
extern
LinphonePrivate
::
Sal
::
Callbacks
linphone_sal_callbacks
;
LINPHONE_PUBLIC
bool_t
linphone_core_rtcp_enabled
(
const
LinphoneCore
*
lc
);
LINPHONE_PUBLIC
bool_t
linphone_core_symmetric_rtp_enabled
(
LinphoneCore
*
lc
);
bool_t
_linphone_core_has_group_chat_room
(
const
LinphoneCore
*
lc
,
const
char
*
id
);
void
_linphone_core_add_group_chat_room
(
LinphoneCore
*
lc
,
const
char
*
id
,
LinphoneChatRoom
*
cr
);
void
linphone_core_queue_task
(
LinphoneCore
*
lc
,
belle_sip_source_func_t
task_fun
,
void
*
data
,
const
char
*
task_description
);
...
...
@@ -832,6 +834,7 @@ struct _LinphoneCore
MSList
*
queued_calls
;
/* used by the autoreplier */
MSList
*
call_logs
;
MSList
*
chatrooms
;
bctbx_map_t
*
group_chat_rooms
;
int
max_call_logs
;
int
missed_calls
;
VideoPreview
*
previewstream
;
...
...
coreapi/tester_utils.h
View file @
47da8088
...
...
@@ -94,6 +94,7 @@ LINPHONE_PUBLIC mblk_t *_linphone_call_stats_get_received_rtcp (const LinphoneCa
LINPHONE_PUBLIC
LinphoneQualityReporting
*
linphone_call_log_get_quality_reporting
(
LinphoneCallLog
*
call_log
);
LINPHONE_PUBLIC
reporting_session_report_t
**
linphone_quality_reporting_get_reports
(
LinphoneQualityReporting
*
qreporting
);
LINPHONE_PUBLIC
LinphoneChatRoom
*
_linphone_core_find_group_chat_room
(
const
LinphoneCore
*
lc
,
const
char
*
id
);
LINPHONE_PUBLIC
bctbx_list_t
*
linphone_chat_room_get_transient_messages
(
const
LinphoneChatRoom
*
cr
);
LINPHONE_PUBLIC
MSList
*
linphone_core_fetch_friends_from_db
(
LinphoneCore
*
lc
,
LinphoneFriendList
*
list
);
...
...
src/chat/client-group-chat-room-p.h
View file @
47da8088
...
...
@@ -38,6 +38,7 @@ public:
virtual
~
ClientGroupChatRoomPrivate
()
=
default
;
std
::
shared_ptr
<
CallSession
>
createSession
();
void
notifyReceived
(
std
::
string
body
);
private:
L_DECLARE_PUBLIC
(
ClientGroupChatRoom
);
...
...
src/chat/client-group-chat-room.cpp
View file @
47da8088
...
...
@@ -50,6 +50,11 @@ shared_ptr<CallSession> ClientGroupChatRoomPrivate::createSession () {
return
session
;
}
void
ClientGroupChatRoomPrivate
::
notifyReceived
(
string
body
)
{
L_Q
();
q
->
eventHandler
->
notifyReceived
(
body
);
}
// =============================================================================
ClientGroupChatRoom
::
ClientGroupChatRoom
(
LinphoneCore
*
core
,
const
Address
&
me
,
const
string
&
uri
,
const
string
&
subject
)
...
...
@@ -169,6 +174,7 @@ void ClientGroupChatRoom::onConferenceCreated (const Address &addr) {
L_D
();
conferenceAddress
=
addr
;
d
->
setState
(
ChatRoom
::
State
::
Created
);
_linphone_core_add_group_chat_room
(
d
->
core
,
addr
.
asStringUriOnly
().
c_str
(),
L_GET_C_BACK_PTR
(
this
));
}
void
ClientGroupChatRoom
::
onConferenceTerminated
(
const
Address
&
addr
)
{
...
...
src/conference/conference.cpp
View file @
47da8088
...
...
@@ -189,9 +189,11 @@ shared_ptr<Participant> Conference::findParticipant (const shared_ptr<const Call
}
bool
Conference
::
isMe
(
const
Address
&
addr
)
const
{
Address
cleanedAddress
=
me
->
getAddress
();
cleanedAddress
.
setPort
(
0
);
return
addr
.
equal
(
cleanedAddress
);
Address
cleanedMe
=
me
->
getAddress
();
cleanedMe
.
setPort
(
0
);
Address
cleanedAddr
=
addr
;
cleanedAddr
.
setPort
(
0
);
return
cleanedAddr
.
equal
(
cleanedMe
);
}
LINPHONE_END_NAMESPACE
src/conference/conference.h
View file @
47da8088
...
...
@@ -46,6 +46,9 @@ public:
LinphoneCore
*
getCore
()
const
{
return
core
;
}
std
::
shared_ptr
<
Participant
>
findParticipant
(
const
Address
&
addr
)
const
;
std
::
shared_ptr
<
Participant
>
findParticipant
(
const
std
::
shared_ptr
<
const
CallSession
>
&
session
)
const
;
public:
/* ConferenceInterface */
void
addParticipant
(
const
Address
&
addr
,
const
CallSessionParams
*
params
,
bool
hasMedia
)
override
;
...
...
@@ -81,8 +84,6 @@ private:
protected:
explicit
Conference
(
LinphoneCore
*
core
,
const
Address
&
myAddress
,
CallListener
*
listener
=
nullptr
);
std
::
shared_ptr
<
Participant
>
findParticipant
(
const
Address
&
addr
)
const
;
std
::
shared_ptr
<
Participant
>
findParticipant
(
const
std
::
shared_ptr
<
const
CallSession
>
&
session
)
const
;
bool
isMe
(
const
Address
&
addr
)
const
;
protected:
...
...
src/conference/local-conference-event-handler.cpp
View file @
47da8088
...
...
@@ -18,7 +18,7 @@
*/
#include "conference/local-conference.h"
#include "conference/participant.h"
#include "conference/participant
-p
.h"
#include "local-conference-event-handler.h"
#include "object/object-p.h"
...
...
@@ -78,15 +78,15 @@ void LocalConferenceEventHandlerPrivate::notifyFullState (string notify, Linphon
void
LocalConferenceEventHandlerPrivate
::
notifyAllExcept
(
string
notify
,
const
Address
&
addr
)
{
for
(
const
auto
&
participant
:
conf
->
getParticipants
())
{
if
(
addr
!=
participant
->
getAddress
())
{
this
->
sendNotify
(
notify
,
addr
);
}
if
(
participant
->
getPrivate
()
->
isSubscribedToConferenceEventPackage
()
&&
(
addr
!=
participant
->
getAddress
()))
sendNotify
(
notify
,
addr
);
}
}
void
LocalConferenceEventHandlerPrivate
::
notifyAll
(
string
notify
)
{
for
(
const
auto
&
participant
:
conf
->
getParticipants
())
{
this
->
sendNotify
(
notify
,
participant
->
getAddress
());
if
(
participant
->
getPrivate
()
->
isSubscribedToConferenceEventPackage
())
sendNotify
(
notify
,
participant
->
getAddress
());
}
}
...
...
@@ -199,7 +199,17 @@ LocalConferenceEventHandler::~LocalConferenceEventHandler () {
void
LocalConferenceEventHandler
::
subscribeReceived
(
LinphoneEvent
*
lev
)
{
L_D
();
d
->
notifyFullState
(
d
->
createNotifyFullState
(),
lev
);
const
LinphoneAddress
*
lAddr
=
linphone_event_get_from
(
lev
);
char
*
addrStr
=
linphone_address_as_string
(
lAddr
);
shared_ptr
<
Participant
>
participant
=
d
->
conf
->
findParticipant
(
Address
(
addrStr
));
bctbx_free
(
addrStr
);
if
(
participant
)
{
if
(
linphone_event_get_subscription_state
(
lev
)
==
LinphoneSubscriptionActive
)
{
participant
->
getPrivate
()
->
subscribeToConferenceEventPackage
(
true
);
d
->
notifyFullState
(
d
->
createNotifyFullState
(),
lev
);
}
else
if
(
linphone_event_get_subscription_state
(
lev
)
==
LinphoneSubscriptionTerminated
)
participant
->
getPrivate
()
->
subscribeToConferenceEventPackage
(
false
);
}
}
void
LocalConferenceEventHandler
::
notifyParticipantAdded
(
const
Address
&
addr
)
{
...
...
src/conference/participant-p.h
View file @
47da8088
...
...
@@ -41,12 +41,15 @@ public:
std
::
shared_ptr
<
CallSession
>
createSession
(
const
Conference
&
conference
,
const
CallSessionParams
*
params
,
bool
hasMedia
,
CallSessionListener
*
listener
);
std
::
shared_ptr
<
CallSession
>
getSession
()
const
{
return
session
;
}
bool
isSubscribedToConferenceEventPackage
()
const
{
return
_isSubscribedToConferenceEventPackage
;
}
void
subscribeToConferenceEventPackage
(
bool
value
)
{
_isSubscribedToConferenceEventPackage
=
value
;
}
void
removeSession
()
{
session
=
nullptr
;
}
void
setAddress
(
const
Address
&
newAddr
)
{
addr
=
newAddr
;
}
private:
Address
addr
;
bool
isAdmin
=
false
;
bool
_isSubscribedToConferenceEventPackage
=
false
;
std
::
shared_ptr
<
CallSession
>
session
;
L_DECLARE_PUBLIC
(
Participant
);
...
...
src/conference/participant.h
View file @
47da8088
...
...
@@ -39,6 +39,8 @@ class Participant : public Object {
friend
class
ClientGroupChatRoomPrivate
;
friend
class
Conference
;
friend
class
LocalConference
;
friend
class
LocalConferenceEventHandler
;
friend
class
LocalConferenceEventHandlerPrivate
;
friend
class
MediaSessionPrivate
;
friend
class
RemoteConference
;
...
...
Write
Preview
Markdown
is supported
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