3 Copyright (C) 2000 Simon MORLAT (simon.morlat@linphone.org)
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #include "linphonecore.h"
24 extern const char *__policy_enum_to_str(LinphoneSubscribePolicy pol);
27 void linphone_core_add_subscriber(LinphoneCore *lc, const char *subscriber, SalOp *op){
28 LinphoneFriend *fl=linphone_friend_new_with_addr(subscriber);
29 if (fl==NULL) return ;
31 linphone_friend_set_inc_subscribe_policy(fl,LinphoneSPAccept);
32 fl->inc_subscribe_pending=TRUE;
33 lc->subscribers=ms_list_append(lc->subscribers,(void *)fl);
34 if (lc->vtable.new_unknown_subscriber!=NULL) {
35 char *tmp=linphone_address_as_string(fl->uri);
36 lc->vtable.new_unknown_subscriber(lc,fl,tmp);
41 void linphone_core_reject_subscriber(LinphoneCore *lc, LinphoneFriend *lf){
42 linphone_friend_set_inc_subscribe_policy(lf,LinphoneSPDeny);
45 void linphone_core_notify_all_friends(LinphoneCore *lc, LinphoneOnlineStatus os){
47 ms_message("Notifying all friends that we are in status %i",os);
48 for(elem=lc->friends;elem!=NULL;elem=elem->next){
49 LinphoneFriend *lf=(LinphoneFriend *)elem->data;
51 linphone_friend_notify(lf,os);
56 void linphone_subscription_new(LinphoneCore *lc, SalOp *op, const char *from){
57 LinphoneFriend *lf=NULL;
61 uri=linphone_address_new(from);
62 linphone_address_clean(uri);
63 tmp=linphone_address_as_string(uri);
64 ms_message("Receiving new subscription from %s.",from);
65 /* check if we answer to this subscription */
66 if (linphone_find_friend(lc->friends,uri,&lf)!=NULL){
68 lf->inc_subscribe_pending=TRUE;
69 sal_subscribe_accept(op);
70 linphone_friend_done(lf); /*this will do all necessary actions */
72 /* check if this subscriber is in our black list */
73 if (linphone_find_friend(lc->subscribers,uri,&lf)){
74 if (lf->pol==LinphoneSPDeny){
75 ms_message("Rejecting %s because we already rejected it once.",from);
76 sal_subscribe_decline(op);
79 /* else it is in wait for approval state, because otherwise it is in the friend list.*/
80 ms_message("New subscriber found in friend list, in %s state.",__policy_enum_to_str(lf->pol));
83 sal_subscribe_accept(op);
84 linphone_core_add_subscriber(lc,tmp,op);
87 linphone_address_destroy(uri);
91 void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeState ss, SalPresenceStatus sal_status){
94 LinphoneAddress *friend=NULL;
95 LinphoneOnlineStatus estatus=LINPHONE_STATUS_OFFLINE;
98 case SalPresenceOffline:
99 estatus=LINPHONE_STATUS_OFFLINE;
101 case SalPresenceOnline:
102 estatus=LINPHONE_STATUS_ONLINE;
104 case SalPresenceBusy:
105 estatus=LINPHONE_STATUS_BUSY;
107 case SalPresenceBerightback:
108 estatus=LINPHONE_STATUS_AWAY;
110 case SalPresenceAway:
111 estatus=LINPHONE_STATUS_AWAY;
113 case SalPresenceOnthephone:
114 estatus=LINPHONE_STATUS_ONTHEPHONE;
116 case SalPresenceOuttolunch:
117 estatus=LINPHONE_STATUS_OUTTOLUNCH;
119 case SalPresenceDonotdisturb:
120 estatus=LINPHONE_STATUS_BUSY;
122 case SalPresenceMoved:
123 case SalPresenceAltService:
124 estatus=LINPHONE_STATUS_AWAY;
127 lf=linphone_find_friend_by_out_subscribe(lc->friends,op);
130 tmp=linphone_address_as_string(friend);
132 lf->subscribe_active=TRUE;
133 lc->vtable.notify_presence_recv(lc,(LinphoneFriend*)lf);
136 ms_message("But this person is not part of our friend list, so we don't care.");
138 if (ss==SalSubscribeTerminated){
142 lf->subscribe_active=FALSE;
147 void linphone_subscription_closed(LinphoneCore *lc, SalOp *op){
149 lf=linphone_find_friend_by_inc_subscribe(lc->friends,op);
154 ms_warning("Receiving unsuscribe for unknown in-subscribtion from %s", sal_op_get_from(op));