]> sjero.net Git - linphone/blob - coreapi/presence.c
Merge branch 'dev_sal' of belledonne-communications.com:linphone-private into dev_sal
[linphone] / coreapi / presence.c
1 /*
2 linphone
3 Copyright (C) 2000  Simon MORLAT (simon.morlat@linphone.org)
4
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.
9
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.
14
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.
18 */
19
20 #include "linphonecore.h"
21 #include "private.h"
22
23
24 extern const char *__policy_enum_to_str(LinphoneSubscribePolicy pol);
25
26
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 ;
30         fl->insub=op;
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);
37                 ms_free(tmp);
38         }
39 }
40
41 void linphone_core_reject_subscriber(LinphoneCore *lc, LinphoneFriend *lf){
42         linphone_friend_set_inc_subscribe_policy(lf,LinphoneSPDeny);
43 }
44
45 void linphone_core_notify_all_friends(LinphoneCore *lc, LinphoneOnlineStatus os){
46         MSList *elem;
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;
50                 if (lf->insub){
51                         linphone_friend_notify(lf,os);
52                 }
53         }
54 }
55
56 void linphone_subscription_new(LinphoneCore *lc, SalOp *op, const char *from){
57         LinphoneFriend *lf=NULL;
58         char *tmp;
59         LinphoneAddress *uri;
60         
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){
67                 lf->insub=op;
68                 lf->inc_subscribe_pending=TRUE;
69                 sal_subscribe_accept(op);
70                 linphone_friend_done(lf);       /*this will do all necessary actions */
71         }else{
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);
77                         }
78                         else {
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));
81                         }
82                 }else {
83                         sal_subscribe_accept(op);
84                         linphone_core_add_subscriber(lc,tmp,op);
85                 }
86         }
87         ms_free(tmp);
88 }
89
90 void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeState ss, SalPresenceStatus sal_status){
91         char *tmp;
92         LinphoneFriend *lf;
93         LinphoneAddress *friend=NULL;
94         LinphoneOnlineStatus estatus=LINPHONE_STATUS_OFFLINE;
95         
96         switch(sal_status){
97                 case SalPresenceOffline:
98                         estatus=LINPHONE_STATUS_OFFLINE;
99                 break;
100                 case SalPresenceOnline:
101                         estatus=LINPHONE_STATUS_ONLINE;
102                 break;
103                 case SalPresenceBusy:
104                         estatus=LINPHONE_STATUS_BUSY;
105                 break;
106                 case SalPresenceBerightback:
107                         estatus=LINPHONE_STATUS_AWAY;
108                 break;
109                 case SalPresenceAway:
110                         estatus=LINPHONE_STATUS_AWAY;
111                 break;
112                 case SalPresenceOnthephone:
113                         estatus=LINPHONE_STATUS_ONTHEPHONE;
114                 break;
115                 case SalPresenceOuttolunch:
116                         estatus=LINPHONE_STATUS_OUTTOLUNCH;
117                 break;
118                 case SalPresenceDonotdisturb:
119                         estatus=LINPHONE_STATUS_BUSY;
120                 break;
121                 case SalPresenceMoved:
122                 case SalPresenceAltService:
123                         estatus=LINPHONE_STATUS_AWAY;
124                 break;
125         }
126         lf=linphone_find_friend_by_out_subscribe(lc->friends,op);
127         if (lf!=NULL){
128                 friend=lf->uri;
129                 tmp=linphone_address_as_string(friend);
130                 lf->status=estatus;
131                 lf->subscribe_active=TRUE;
132                 lc->vtable.notify_recv(lc,(LinphoneFriend*)lf);
133                 ms_free(tmp);
134         }else{
135                 ms_message("But this person is not part of our friend list, so we don't care.");
136         }
137         if (ss==SalSubscribeTerminated){
138                 sal_op_release(op);
139                 if (lf){
140                         lf->outsub=NULL;
141                         lf->subscribe_active=FALSE;
142                 }
143         }
144 }
145
146 void linphone_subscription_closed(LinphoneCore *lc, SalOp *op){
147         LinphoneFriend *lf;
148         lf=linphone_find_friend_by_inc_subscribe(lc->friends,op);
149         sal_op_release(op);
150         if (lf!=NULL){
151                 lf->insub=NULL;
152         }else{
153                 ms_warning("Receiving unsuscribe for unknown in-subscribtion from %s", sal_op_get_from(op));
154         }
155 }