2 * @file telepathy-protocol.c
6 * Copyright (C) 2012 SIPE Project <http://sipe.sourceforge.net/>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include <dbus/dbus-protocol.h>
30 #include <glib-object.h>
31 #include <telepathy-glib/base-connection-manager.h>
32 #include <telepathy-glib/base-protocol.h>
33 #include <telepathy-glib/simple-password-manager.h>
34 #include <telepathy-glib/telepathy-glib.h>
36 #include "sipe-backend.h"
37 #include "sipe-common.h"
38 #include "sipe-core.h"
41 #include "telepathy-private.h"
45 * Protocol class - data structures
47 typedef struct _SipeProtocolClass
{
48 TpBaseProtocolClass parent_class
;
51 typedef struct _SipeProtocol
{
52 TpBaseProtocol parent
;
56 * Protocol class - type macros
58 static GType
sipe_protocol_get_type(void) G_GNUC_CONST
;
59 #define SIPE_TYPE_PROTOCOL \
60 (sipe_protocol_get_type())
61 #define SIPE_PROTOCOL(obj) \
62 (G_TYPE_CHECK_INSTANCE_CAST((obj), SIPE_TYPE_PROTOCOL, \
67 * Protocol class - type definition
69 G_DEFINE_TYPE(SipeProtocol
,
71 TP_TYPE_BASE_PROTOCOL
)
74 * Protocol class - instance methods
77 * @TODO: parameter filtering doesn't seem to work: these functions aren't
78 * called at all - why?
80 static gboolean
parameter_filter_account(SIPE_UNUSED_PARAMETER
const TpCMParamSpec
*paramspec
,
84 const gchar
*str
= g_value_get_string(value
);
87 (strchr(str
, '@') == NULL
)) {
88 g_set_error(error
, TP_ERROR
, TP_ERROR_INVALID_HANDLE
,
89 _("User name should be a valid SIP URI\nExample: user@company.com"));
95 static const TpCMParamSpec
*get_parameters(SIPE_UNUSED_PARAMETER TpBaseProtocol
*self
)
97 /* ISO C99 Designated Initializers silences -Wmissing-field-initializers */
98 #define SIPE_PROTOCOL_PARAMETER(_name, _dtype, _gtype, _flags, _default, _filter) \
106 .filter = (_filter), \
107 .filter_data = NULL, \
108 .setter_data = NULL, \
111 static const TpCMParamSpec
const sipe_parameters
[] = {
112 SIPE_PROTOCOL_PARAMETER("account",
113 DBUS_TYPE_STRING_AS_STRING
,
115 TP_CONN_MGR_PARAM_FLAG_REQUIRED
,
117 parameter_filter_account
),
118 SIPE_PROTOCOL_PARAMETER("login",
119 DBUS_TYPE_STRING_AS_STRING
,
121 TP_CONN_MGR_PARAM_FLAG_REQUIRED
,
123 tp_cm_param_filter_string_nonempty
),
124 SIPE_PROTOCOL_PARAMETER("password",
125 DBUS_TYPE_STRING_AS_STRING
,
127 TP_CONN_MGR_PARAM_FLAG_SECRET
,
129 NULL
/* can be empty */),
130 SIPE_PROTOCOL_PARAMETER("server",
131 DBUS_TYPE_STRING_AS_STRING
,
135 NULL
/* can be empty */),
136 SIPE_PROTOCOL_PARAMETER("port",
137 DBUS_TYPE_UINT16_AS_STRING
,
139 TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT
,
142 /* @TODO: this should be combo auto/ssl/tcp */
143 SIPE_PROTOCOL_PARAMETER("transport",
144 DBUS_TYPE_STRING_AS_STRING
,
146 TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT
,
148 tp_cm_param_filter_string_nonempty
),
149 SIPE_PROTOCOL_PARAMETER("useragent",
150 DBUS_TYPE_STRING_AS_STRING
,
154 NULL
/* can be empty */),
155 /* @TODO: this should be combo ntlm/krb5/tls-dsk */
156 SIPE_PROTOCOL_PARAMETER("authentication",
157 DBUS_TYPE_STRING_AS_STRING
,
159 TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT
,
161 tp_cm_param_filter_string_nonempty
),
162 SIPE_PROTOCOL_PARAMETER(NULL
, NULL
, 0, 0, NULL
, NULL
)
165 return(sipe_parameters
);
168 /* non-static, because it is re-used by connection object */
169 gchar
*sipe_telepathy_protocol_normalize_contact(SIPE_UNUSED_PARAMETER TpBaseProtocol
*self
,
170 const gchar
*contact
,
173 gchar
*uri
= sip_uri_if_valid(contact
);
175 SIPE_DEBUG_INFO_NOFORMAT("SipeProtocol::normalize_contact");
178 g_set_error(error
, TP_ERROR
, TP_ERROR_INVALID_HANDLE
,
179 _("User name should be a valid SIP URI\nExample: user@company.com"));
183 static gchar
*identify_account(SIPE_UNUSED_PARAMETER TpBaseProtocol
*self
,
185 SIPE_UNUSED_PARAMETER GError
**error
)
187 SIPE_DEBUG_INFO_NOFORMAT("SipeProtocol::identify_account");
189 return(g_strdup(tp_asv_get_string(asv
, "account")));
192 static GStrv
get_interfaces(SIPE_UNUSED_PARAMETER TpBaseProtocol
*base
)
194 SIPE_DEBUG_INFO_NOFORMAT("SipeProtocol::get_interfaces");
196 return(g_new0(gchar
*, 1));
199 static void get_connection_details(SIPE_UNUSED_PARAMETER TpBaseProtocol
*self
,
200 GStrv
*connection_interfaces
,
201 GType
**channel_managers
,
203 gchar
**english_name
,
206 SIPE_DEBUG_INFO_NOFORMAT("SipeProtocol::get_connection_details");
208 if (connection_interfaces
) {
209 static const gchar
* const interfaces
[] = {
213 *connection_interfaces
= g_strdupv((GStrv
) interfaces
);
215 if (channel_managers
) {
218 TP_TYPE_SIMPLE_PASSWORD_MANAGER
,
219 SIPE_TYPE_SEARCH_MANAGER
,
222 *channel_managers
= g_memdup(types
, sizeof(types
));
225 *icon_name
= g_strdup("im-" SIPE_TELEPATHY_DOMAIN
);
227 *english_name
= g_strdup("Office Communicator");
229 *vcard_field
= g_strdup("x-" SIPE_TELEPATHY_DOMAIN
);
232 static GStrv
dup_authentication_types(SIPE_UNUSED_PARAMETER TpBaseProtocol
*self
)
234 static const gchar
* const types
[] = {
239 SIPE_DEBUG_INFO_NOFORMAT("SipeProtocol::dup_authentication_types");
241 return(g_strdupv((GStrv
) types
));
245 * Protocol class - type implementation
247 static void sipe_protocol_class_init(SipeProtocolClass
*klass
)
249 TpBaseProtocolClass
*base_class
= TP_BASE_PROTOCOL_CLASS(klass
);
251 SIPE_DEBUG_INFO_NOFORMAT("SipeProtocol::class_init");
253 base_class
->get_parameters
= get_parameters
;
254 base_class
->new_connection
= sipe_telepathy_connection_new
;
255 base_class
->normalize_contact
= sipe_telepathy_protocol_normalize_contact
;
256 base_class
->identify_account
= identify_account
;
257 base_class
->get_interfaces
= get_interfaces
;
258 base_class
->get_connection_details
= get_connection_details
;
259 base_class
->dup_authentication_types
= dup_authentication_types
;
262 static void sipe_protocol_init(SIPE_UNUSED_PARAMETER SipeProtocol
*self
)
264 SIPE_DEBUG_INFO_NOFORMAT("SipeProtocol::init");
267 /* add protocol to connection manager */
268 void sipe_telepathy_protocol_init(TpBaseConnectionManager
*cm
)
270 TpBaseProtocol
*protocol
= g_object_new(SIPE_TYPE_PROTOCOL
,
271 "name", SIPE_TELEPATHY_DOMAIN
,
273 tp_base_connection_manager_add_protocol(cm
, protocol
);
274 g_object_unref(protocol
);