2
* @file backend-iface.c Interface for media backend
8
* Purple is the legal property of its developers, whose names are too numerous
9
* to list here. Please refer to the COPYRIGHT file distributed with this
10
* source distribution.
12
* This program is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation; either version 2 of the License, or
15
* (at your option) any later version.
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
22
* You should have received a copy of the GNU General Public License
23
* along with this program; if not, write to the Free Software
24
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
27
#include "backend-iface.h"
29
#include "marshallers.h"
36
ACTIVE_CANDIDATE_PAIR,
40
static guint purple_media_backend_signals[LAST_SIGNAL] = {0};
43
purple_media_backend_base_init(gpointer iface)
45
static gboolean is_initialized = FALSE;
50
g_object_interface_install_property(iface,
51
g_param_spec_string("conference-type",
53
"The type of conference that this backend "
54
"has been created to provide.",
56
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
57
g_object_interface_install_property(iface,
58
g_param_spec_object("media",
60
"The media object that this backend is bound to.",
62
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
64
purple_media_backend_signals[S_ERROR] =
65
g_signal_new("error", G_TYPE_FROM_CLASS(iface),
66
G_SIGNAL_RUN_LAST, 0, NULL, NULL,
67
g_cclosure_marshal_VOID__STRING,
68
G_TYPE_NONE, 1, G_TYPE_STRING);
69
purple_media_backend_signals[CANDIDATES_PREPARED] =
70
g_signal_new("candidates-prepared",
71
G_TYPE_FROM_CLASS(iface),
72
G_SIGNAL_RUN_LAST, 0, NULL, NULL,
73
purple_smarshal_VOID__STRING_STRING,
74
G_TYPE_NONE, 2, G_TYPE_STRING,
76
purple_media_backend_signals[CODECS_CHANGED] =
77
g_signal_new("codecs-changed",
78
G_TYPE_FROM_CLASS(iface),
79
G_SIGNAL_RUN_LAST, 0, NULL, NULL,
80
g_cclosure_marshal_VOID__STRING,
81
G_TYPE_NONE, 1, G_TYPE_STRING);
82
purple_media_backend_signals[NEW_CANDIDATE] =
83
g_signal_new("new-candidate",
84
G_TYPE_FROM_CLASS(iface),
85
G_SIGNAL_RUN_LAST, 0, NULL, NULL,
86
purple_smarshal_VOID__POINTER_POINTER_OBJECT,
87
G_TYPE_NONE, 3, G_TYPE_POINTER,
88
G_TYPE_POINTER, PURPLE_TYPE_MEDIA_CANDIDATE);
89
purple_media_backend_signals[ACTIVE_CANDIDATE_PAIR] =
90
g_signal_new("active-candidate-pair",
91
G_TYPE_FROM_CLASS(iface),
92
G_SIGNAL_RUN_LAST, 0, NULL, NULL,
93
purple_smarshal_VOID__STRING_STRING_OBJECT_OBJECT,
94
G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_STRING,
95
PURPLE_TYPE_MEDIA_CANDIDATE,
96
PURPLE_TYPE_MEDIA_CANDIDATE);
98
is_initialized = TRUE;
102
purple_media_backend_get_type(void)
104
static GType iface_type = 0;
105
if (iface_type == 0) {
106
static const GTypeInfo info = {
107
sizeof(PurpleMediaBackendIface),
108
purple_media_backend_base_init,
119
iface_type = g_type_register_static (G_TYPE_INTERFACE,
120
"PurpleMediaBackend", &info, 0);
127
purple_media_backend_add_stream(PurpleMediaBackend *self,
128
const gchar *sess_id, const gchar *who,
129
PurpleMediaSessionType type, gboolean initiator,
130
const gchar *transmitter,
131
guint num_params, GParameter *params)
133
g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), FALSE);
134
return PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->add_stream(self,
135
sess_id, who, type, initiator, transmitter,
140
purple_media_backend_add_remote_candidates(PurpleMediaBackend *self,
141
const gchar *sess_id, const gchar *participant,
142
GList *remote_candidates)
144
g_return_if_fail(PURPLE_IS_MEDIA_BACKEND(self));
145
PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->add_remote_candidates(self,
146
sess_id, participant, remote_candidates);
150
purple_media_backend_codecs_ready(PurpleMediaBackend *self,
151
const gchar *sess_id)
153
g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), FALSE);
154
return PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->codecs_ready(self,
159
purple_media_backend_get_codecs(PurpleMediaBackend *self,
160
const gchar *sess_id)
162
g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), NULL);
163
return PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->get_codecs(self,
168
purple_media_backend_get_local_candidates(PurpleMediaBackend *self,
169
const gchar *sess_id, const gchar *participant)
171
g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), NULL);
172
return PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->
173
get_local_candidates(self,
174
sess_id, participant);
178
purple_media_backend_set_remote_codecs(PurpleMediaBackend *self,
179
const gchar *sess_id, const gchar *participant,
182
g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), FALSE);
183
return PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->set_remote_codecs(
184
self, sess_id, participant, codecs);
188
purple_media_backend_set_send_codec(PurpleMediaBackend *self,
189
const gchar *sess_id, PurpleMediaCodec *codec)
191
g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), FALSE);
192
return PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->set_send_codec(self,
197
purple_media_backend_set_params(PurpleMediaBackend *self,
198
guint num_params, GParameter *params)
200
g_return_if_fail(PURPLE_IS_MEDIA_BACKEND(self));
201
PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->set_params(self, num_params, params);
205
purple_media_backend_get_available_params(PurpleMediaBackend *self)
207
static const gchar *NULL_ARRAY[] = { NULL };
209
g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND(self), NULL_ARRAY);
210
return PURPLE_MEDIA_BACKEND_GET_INTERFACE(self)->get_available_params();