1 /**
2  * @file purple-plugin3.c
3  *
4  * pidgin-sipe
5  *
6  * Copyright (C) 2015-2016 SIPE Project <http://sipe.sourceforge.net/>
7  *
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.
12  *
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.
17  *
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
21  */
22 
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26 
27 #include <glib.h>
28 #include <gmodule.h>
29 
30 /* Flag needed for correct version of PURPLE_INIT_PLUGIN() */
31 #ifndef PURPLE_PLUGINS
32 #define PURPLE_PLUGINS
33 #endif
34 
35 #include "protocol.h"
36 
37 #include "purple-private.h"
38 #include "sipe-common.h"
39 #include "sipe-core.h"
40 
41 #define SIPE_TYPE_PROTOCOL (sipe_protocol_get_type())
42 
43 typedef struct _SipeProtocol {
44 	PurpleProtocol parent;
45 } SipeProtocol;
46 
47 typedef struct _NullProtocolClass {
48 	PurpleProtocolClass parent_class;
49 } SipeProtocolClass;
50 
51 G_MODULE_EXPORT GType sipe_protocol_get_type(void);
52 
53 static void
sipe_protocol_class_init(PurpleProtocolClass * klass)54 sipe_protocol_class_init(PurpleProtocolClass *klass)
55 {
56 	klass->login = sipe_purple_login;
57 	klass->close = sipe_purple_close;
58 	klass->status_types = sipe_purple_status_types;
59 	klass->list_icon = sipe_purple_list_icon;
60 }
61 
62 static void
sipe_protocol_init(PurpleProtocol * protocol)63 sipe_protocol_init(PurpleProtocol *protocol)
64 {
65 	sipe_core_init(LOCALEDIR);
66 
67 	protocol->id = SIPE_PURPLE_PLUGIN_ID;
68 	protocol->name = SIPE_PURPLE_PLUGIN_NAME;
69 	protocol->options = SIPE_PURPLE_PROTOCOL_OPTIONS;
70 	protocol->user_splits = g_list_append(NULL, sipe_purple_user_split());
71 	protocol->account_options = sipe_purple_account_options();
72 }
73 
74 static GList *
get_actions(SIPE_UNUSED_PARAMETER PurpleConnection * gc)75 get_actions(SIPE_UNUSED_PARAMETER PurpleConnection *gc)
76 {
77 	return sipe_purple_actions();
78 }
79 
80 static void
sipe_protocol_client_iface_init(PurpleProtocolClientIface * client_iface)81 sipe_protocol_client_iface_init(PurpleProtocolClientIface *client_iface)
82 {
83 	client_iface->get_actions = get_actions;
84 	client_iface->status_text = sipe_purple_status_text;
85 	client_iface->tooltip_text = sipe_purple_tooltip_text;
86 	client_iface->blist_node_menu = sipe_purple_blist_node_menu;
87 	client_iface->convo_closed = sipe_purple_convo_closed;
88 	client_iface->normalize = purple_normalize_nocase;
89 	client_iface->get_account_text_table = sipe_purple_get_account_text_table;
90 }
91 
92 static void
sipe_protocol_server_iface_init(PurpleProtocolServerIface * server_iface)93 sipe_protocol_server_iface_init(PurpleProtocolServerIface *server_iface)
94 {
95 	server_iface->get_info = sipe_purple_get_info;
96 	server_iface->set_status = sipe_purple_set_status;
97 	server_iface->set_idle = sipe_purple_set_idle;
98 	server_iface->add_buddy = sipe_purple_add_buddy;
99 	server_iface->remove_buddy = sipe_purple_remove_buddy;
100 	server_iface->alias_buddy = sipe_purple_alias_buddy;
101 	server_iface->group_buddy = sipe_purple_group_buddy;
102 	server_iface->rename_group = sipe_purple_group_rename;
103 	server_iface->remove_group = sipe_purple_group_remove;
104 }
105 
106 static int
send_im(PurpleConnection * gc,PurpleMessage * msg)107 send_im(PurpleConnection *gc, PurpleMessage *msg)
108 {
109 	sipe_core_im_send(PURPLE_GC_TO_SIPE_CORE_PUBLIC,
110 			  purple_message_get_recipient(msg),
111 			  purple_message_get_contents(msg));
112 	return 1;
113 }
114 
115 static void
sipe_protocol_im_iface_init(PurpleProtocolIMIface * im_iface)116 sipe_protocol_im_iface_init(PurpleProtocolIMIface *im_iface)
117 {
118 	im_iface->send = send_im;
119 	im_iface->send_typing = sipe_purple_send_typing;
120 }
121 
122 static void
sipe_protocol_chat_iface_init(PurpleProtocolChatIface * chat_iface)123 sipe_protocol_chat_iface_init(PurpleProtocolChatIface *chat_iface)
124 {
125 	chat_iface->info = sipe_purple_chat_info;
126 	chat_iface->info_defaults = sipe_purple_chat_info_defaults;
127 	chat_iface->join = sipe_purple_chat_join;
128 	chat_iface->invite = sipe_purple_chat_invite;
129 	chat_iface->leave = sipe_purple_chat_leave;
130 	chat_iface->send = sipe_purple_chat_send;
131 }
132 
133 static void
sipe_protocol_privacy_iface_init(PurpleProtocolPrivacyIface * privacy_iface)134 sipe_protocol_privacy_iface_init(PurpleProtocolPrivacyIface *privacy_iface)
135 {
136 	privacy_iface->add_permit = sipe_purple_add_permit;
137 	privacy_iface->add_deny = sipe_purple_add_deny;
138 	privacy_iface->rem_permit = sipe_purple_add_deny;
139 	privacy_iface->rem_deny = sipe_purple_add_permit;
140 }
141 
142 static void
sipe_protocol_xfer_iface_init(PurpleProtocolXferIface * xfer_iface)143 sipe_protocol_xfer_iface_init(PurpleProtocolXferIface *xfer_iface)
144 {
145 	xfer_iface->send = sipe_purple_ft_send_file;
146 }
147 
148 static void
sipe_protocol_roomlist_iface_init(PurpleProtocolRoomlistIface * roomlist_iface)149 sipe_protocol_roomlist_iface_init(PurpleProtocolRoomlistIface *roomlist_iface)
150 {
151 	roomlist_iface->get_list = sipe_purple_roomlist_get_list;
152 	roomlist_iface->cancel = sipe_purple_roomlist_cancel;
153 }
154 
155 #ifdef HAVE_VV
156 static void
sipe_protocol_media_iface_init(PurpleProtocolMediaIface * media_iface)157 sipe_protocol_media_iface_init(PurpleProtocolMediaIface *media_iface)
158 {
159 	media_iface->initiate_session = sipe_purple_initiate_media;
160 	media_iface->get_caps = sipe_purple_get_media_caps;
161 }
162 #endif /* HAVE_VV */
163 
164 PURPLE_DEFINE_TYPE_EXTENDED(
165 	SipeProtocol, sipe_protocol, PURPLE_TYPE_PROTOCOL, 0,
166 
167 	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT_IFACE,
168 					  sipe_protocol_client_iface_init)
169 	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER_IFACE,
170 					  sipe_protocol_server_iface_init)
171 	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM_IFACE,
172 					  sipe_protocol_im_iface_init)
173 	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT_IFACE,
174 					  sipe_protocol_chat_iface_init)
175 	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY_IFACE,
176 					  sipe_protocol_privacy_iface_init)
177 	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER_IFACE,
178 					  sipe_protocol_xfer_iface_init)
179 	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST_IFACE,
180 					  sipe_protocol_roomlist_iface_init)
181 #ifdef HAVE_VV
182 	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_MEDIA_IFACE,
183 					  sipe_protocol_media_iface_init)
184 #endif /* HAVE_VV */
185 )
186 
187 static PurplePluginInfo *
plugin_query(SIPE_UNUSED_PARAMETER GError ** error)188 plugin_query(SIPE_UNUSED_PARAMETER GError **error)
189 {
190 	gchar ** authors = g_strsplit(SIPE_PURPLE_PLUGIN_AUTHORS, ", ", -1);
191 	PurplePluginInfo *info = purple_plugin_info_new(
192 			"id", SIPE_PURPLE_PLUGIN_ID,
193 			"name", SIPE_PURPLE_PLUGIN_NAME,
194 			"version", PACKAGE_VERSION,
195 			"category", "Protocol",
196 			"summary", SIPE_PURPLE_PLUGIN_SUMMARY,
197 			"description", SIPE_PURPLE_PLUGIN_DESCRIPTION,
198 			"authors", authors,
199 			"website", PACKAGE_URL,
200 			"abi-version", PURPLE_ABI_VERSION,
201 			"flags", PURPLE_PLUGIN_INFO_FLAGS_AUTO_LOAD,
202 			NULL);
203 
204 	g_strfreev(authors);
205 
206 	return info;
207 }
208 
209 static PurpleProtocol *sipe_protocol = NULL;
210 
211 static gboolean
plugin_load(PurplePlugin * plugin,GError ** error)212 plugin_load(PurplePlugin *plugin, GError **error)
213 {
214 	sipe_protocol_register_type(plugin);
215 
216 	sipe_protocol = purple_protocols_add(SIPE_TYPE_PROTOCOL, error);
217 	if (!sipe_protocol) {
218 		return FALSE;
219 	}
220 
221 	if (!sipe_purple_plugin_load(plugin)) {
222 		return FALSE;
223 	}
224 
225 	return TRUE;
226 }
227 
228 static gboolean
plugin_unload(PurplePlugin * plugin,GError ** error)229 plugin_unload(PurplePlugin *plugin, GError **error)
230 {
231 	sipe_purple_plugin_unload(plugin);
232 
233 	if (!purple_protocols_remove(sipe_protocol, error)) {
234 		return FALSE;
235 	}
236 
237 	return TRUE;
238 }
239 
240 PURPLE_PLUGIN_INIT(sipe, plugin_query, plugin_load, plugin_unload);
241 
242 /*
243   Local Variables:
244   mode: c
245   c-file-style: "bsd"
246   indent-tabs-mode: t
247   tab-width: 8
248   End:
249 */
250