]> sjero.net Git - linphone/blob - linphone/oRTP/src/rtpsignaltable.c
14d8587b99048af29a98c6e5eafe6dff8a9e5de2
[linphone] / linphone / oRTP / src / rtpsignaltable.c
1 /*
2   The oRTP library is an RTP (Realtime Transport Protocol - rfc1889) stack.
3   Copyright (C) 2001  Simon MORLAT simon.morlat@linphone.org
4
5   This library is free software; you can redistribute it and/or
6   modify it under the terms of the GNU Lesser General Public
7   License as published by the Free Software Foundation; either
8   version 2.1 of the License, or (at your option) any later version.
9
10   This library 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 GNU
13   Lesser General Public License for more details.
14
15   You should have received a copy of the GNU Lesser General Public
16   License along with this library; if not, write to the Free Software
17   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20
21
22 #include <ortp/rtpsession.h>
23 #include "utils.h"
24
25
26 void rtp_signal_table_init(RtpSignalTable *table,RtpSession *session, const char *signal_name)
27 {
28         memset(table,0,sizeof(RtpSignalTable));
29         table->session=session;
30         table->signal_name=signal_name;
31         session->signal_tables=o_list_append(session->signal_tables,(void*)table);
32 }
33
34 int rtp_signal_table_add(RtpSignalTable *table,RtpCallback cb, unsigned long user_data)
35 {
36         int i;
37         
38         for (i=0;i<RTP_CALLBACK_TABLE_MAX_ENTRIES;i++){
39                 if (table->callback[i]==NULL){
40                         table->callback[i]=cb;
41                         table->user_data[i]=user_data;
42                         table->count++;
43                         return 0;
44                 }
45         }
46         return -1;
47 }
48
49 void rtp_signal_table_emit(RtpSignalTable *table)
50 {
51         int i,c;
52         
53         for (i=0,c=0;c<table->count;i++){
54                 if (table->callback[i]!=NULL){
55                         c++;    /*I like it*/
56                         table->callback[i](table->session,table->user_data[i]);
57                 }
58         }
59 }
60
61 void rtp_signal_table_emit2(RtpSignalTable *table,unsigned long arg)
62 {
63         int i,c;
64         
65         for (i=0,c=0;c<table->count;i++){
66                 if (table->callback[i]!=NULL){
67                         c++;    /*I like it*/
68                         table->callback[i](table->session,arg,table->user_data[i]);
69                 }
70         }
71 }
72
73 void rtp_signal_table_emit3(RtpSignalTable *table, unsigned long arg1, unsigned long arg2)
74 {
75         int i,c;
76         
77         for (i=0,c=0;c<table->count;i++){
78                 if (table->callback[i]!=NULL){
79                         c++;    /*I like it*/
80                         table->callback[i](table->session,arg1,arg2,table->user_data[i]);
81                 }
82         }
83 }
84
85 int rtp_signal_table_remove_by_callback(RtpSignalTable *table,RtpCallback cb)
86 {
87         int i;
88         
89         for (i=0;i<RTP_CALLBACK_TABLE_MAX_ENTRIES;i++){
90                 if (table->callback[i]==cb){
91                         table->callback[i]=NULL;
92                         table->user_data[i]=0;
93                         table->count--;
94                         return 0;
95                 }
96         }
97         return -1;
98 }