1 #ifndef _PURPLECOMPAT_H_
2 #define _PURPLECOMPAT_H_
3 
4 #include <glib.h>
5 #include "version.h"
6 
7 #if PURPLE_VERSION_CHECK(3, 0, 0)
8 #include <glib-object.h>
9 
10 #define purple_conversation_set_data(conv, key, value)  g_object_set_data(G_OBJECT(conv), key, value)
11 #define purple_conversation_get_data(conv, key)         g_object_get_data(G_OBJECT(conv), key)
12 
13 #define purple_xfer_ref                 g_object_ref
14 
15 #define purple_xfer_unref               g_object_unref
16 #define purple_circular_buffer_destroy  g_object_unref
17 #define purple_hash_destroy             g_object_unref
18 #define purple_message_destroy          g_object_unref
19 #define purple_buddy_destroy            g_object_unref
20 
21 #define PURPLE_TYPE_STRING  G_TYPE_STRING
22 
23 #define purple_protocol_action_get_connection(action)  ((action)->connection)
24 
25 #define purple_chat_user_set_alias(cb, alias)  g_object_set((cb), "alias", (alias), NULL)
26 #define purple_chat_get_alias(chat)  g_object_get_data(G_OBJECT(chat), "alias")
27 
28 //TODO remove this when dx adds this to the PurpleMessageFlags enum
29 #define PURPLE_MESSAGE_REMOTE_SEND  0x10000
30 
31 #else /*!PURPLE_VERSION_CHECK(3, 0, 0)*/
32 
33 #include "connection.h"
34 
35 #define purple_blist_find_buddy        purple_find_buddy
36 #define purple_blist_find_group        purple_find_group
37 #define purple_blist_find_buddies      purple_find_buddies
38 #define PURPLE_IS_BUDDY                PURPLE_BLIST_NODE_IS_BUDDY
39 #define PURPLE_IS_CHAT                 PURPLE_BLIST_NODE_IS_CHAT
40 #define purple_chat_get_name_only      purple_chat_get_name
41 #define purple_chat_set_alias          purple_blist_alias_chat
42 #define purple_chat_get_alias(chat)    ((chat)->alias)
43 #define purple_buddy_set_server_alias  purple_blist_server_alias_buddy
44 #define purple_buddy_get_local_alias   purple_buddy_get_local_buddy_alias
45 static inline void
purple_blist_node_set_transient(PurpleBlistNode * node,gboolean transient)46 purple_blist_node_set_transient(PurpleBlistNode *node, gboolean transient)
47 {
48 	PurpleBlistNodeFlags old_flags = purple_blist_node_get_flags(node);
49 	PurpleBlistNodeFlags new_flags;
50 
51 	if (transient)
52 		new_flags = old_flags | PURPLE_BLIST_NODE_FLAG_NO_SAVE;
53 	else
54 		new_flags = old_flags & ~PURPLE_BLIST_NODE_FLAG_NO_SAVE;
55 
56 	purple_blist_node_set_flags(node, new_flags);
57 }
58 
59 #define PURPLE_CMD_FLAG_PROTOCOL_ONLY  PURPLE_CMD_FLAG_PRPL_ONLY
60 
61 #define PURPLE_TYPE_CONNECTION	purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION)
62 #define PURPLE_IS_CONNECTION	PURPLE_CONNECTION_IS_VALID
63 
64 #define PURPLE_CONNECTION_DISCONNECTED     PURPLE_DISCONNECTED
65 #define PURPLE_CONNECTION_DISCONNECTING    4
66 #define PURPLE_CONNECTION_CONNECTING       PURPLE_CONNECTING
67 #define PURPLE_CONNECTION_CONNECTED        PURPLE_CONNECTED
68 #define PURPLE_CONNECTION_FLAG_HTML        PURPLE_CONNECTION_HTML
69 #define PURPLE_CONNECTION_FLAG_NO_BGCOLOR  PURPLE_CONNECTION_NO_BGCOLOR
70 #define PURPLE_CONNECTION_FLAG_NO_FONTSIZE PURPLE_CONNECTION_NO_FONTSIZE
71 #define PURPLE_CONNECTION_FLAG_NO_IMAGES   PURPLE_CONNECTION_NO_IMAGES
72 
73 #define purple_request_cpar_from_connection(a)  purple_connection_get_account(a), NULL, NULL
74 #define purple_connection_get_protocol          purple_connection_get_prpl
75 #define purple_connection_error                 purple_connection_error_reason
76 #define purple_connection_is_disconnecting(c)   (purple_connection_get_state(c) == PURPLE_DISCONNECTED || purple_connection_get_state(c) == PURPLE_CONNECTION_DISCONNECTING)
77 #define purple_connection_set_flags(pc, f)      ((pc)->flags = (f))
78 #define purple_connection_get_flags(pc)         ((pc)->flags)
79 
80 #define PurpleConversationUpdateType       PurpleConvUpdateType
81 #define PURPLE_CONVERSATION_UPDATE_TOPIC   PURPLE_CONV_UPDATE_TOPIC
82 #define PURPLE_CONVERSATION_UPDATE_UNSEEN  PURPLE_CONV_UPDATE_UNSEEN
83 #define PurpleChatConversation             PurpleConvChat
84 #define PurpleIMConversation               PurpleConvIm
85 #define purple_conversations_find_chat_with_account(id, account) \
86 		PURPLE_CONV_CHAT(purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, id, account))
87 #define purple_conversations_find_chat(pc, id)  PURPLE_CONV_CHAT(purple_find_chat(pc, id))
88 #define purple_conversations_get_all            purple_get_conversations
89 #define purple_conversation_get_connection      purple_conversation_get_gc
90 #define purple_conversation_present_error       purple_conv_present_error
91 #define purple_chat_conversation_get_id         purple_conv_chat_get_id
92 #define purple_chat_conversation_get_topic      purple_conv_chat_get_topic
93 #define purple_chat_conversation_set_topic      purple_conv_chat_set_topic
94 #define purple_conversations_find_im_with_account(name, account)  \
95 		PURPLE_CONV_IM(purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, account))
96 #define purple_im_conversation_new(account, from) PURPLE_CONV_IM(purple_conversation_new(PURPLE_CONV_TYPE_IM, account, from))
97 #define PURPLE_CONVERSATION(chatorim)         ((chatorim) == NULL ? NULL : (chatorim)->conv)
98 #define PURPLE_IM_CONVERSATION(conv)          PURPLE_CONV_IM(conv)
99 #define PURPLE_CHAT_CONVERSATION(conv)        PURPLE_CONV_CHAT(conv)
100 #define PURPLE_IS_IM_CONVERSATION(conv)       (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM)
101 #define PURPLE_IS_CHAT_CONVERSATION(conv)     (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT)
102 #define purple_chat_conversation_add_user     purple_conv_chat_add_user
103 #define purple_chat_conversation_has_left     purple_conv_chat_has_left
104 #define purple_chat_conversation_leave        purple_conv_chat_left
105 #define purple_chat_conversation_remove_user  purple_conv_chat_remove_user
106 #define purple_chat_conversation_clear_users  purple_conv_chat_clear_users
107 
108 #define PurpleMessage  PurpleConvMessage
109 #define purple_message_get_contents(msg)    ((msg)->what)
110 #define purple_message_set_time(msg, time)  ((msg)->when = (time))
111 #define purple_conversation_write_message(conv, msg)  purple_conversation_write((conv), (msg)->who, (msg)->what, (msg)->flags, (msg)->when)
112 static inline PurpleMessage *
purple_message_new_outgoing(const gchar * who,const gchar * contents,PurpleMessageFlags flags)113 purple_message_new_outgoing(const gchar *who, const gchar *contents, PurpleMessageFlags flags)
114 {
115 	PurpleMessage *message = g_new0(PurpleMessage, 1);
116 
117 	message->who = g_strdup(who);
118 	message->what = g_strdup(contents);
119 	message->flags = flags | PURPLE_MESSAGE_SEND;
120 	message->when = time(NULL);
121 
122 	return message;
123 }
124 static inline PurpleMessage *
purple_message_new_incoming(const gchar * who,const gchar * contents,PurpleMessageFlags flags,guint64 timestamp)125 purple_message_new_incoming(const gchar *who, const gchar *contents, PurpleMessageFlags flags, guint64 timestamp)
126 {
127 	PurpleMessage *message = g_new0(PurpleMessage, 1);
128 
129 	message->who = g_strdup(who);
130 	message->what = g_strdup(contents);
131 	message->flags = flags | PURPLE_MESSAGE_RECV;
132 	message->when = timestamp;
133 
134 	return message;
135 }
136 static inline PurpleMessage *
purple_message_new_system(const gchar * contents,PurpleMessageFlags flags)137 purple_message_new_system(const gchar *contents, PurpleMessageFlags flags)
138 {
139 	PurpleMessage *message = g_new0(PurpleMessage, 1);
140 
141 	message->what = g_strdup(contents);
142 	message->flags = flags | PURPLE_MESSAGE_SYSTEM;
143 	message->when = time(NULL);
144 
145 	return message;
146 }
147 static inline void
purple_message_destroy(PurpleMessage * message)148 purple_message_destroy(PurpleMessage *message)
149 {
150 	g_free(message->who);
151 	g_free(message->what);
152 	g_free(message);
153 }
154 #if	!PURPLE_VERSION_CHECK(2, 12, 0)
155 #	define PURPLE_MESSAGE_REMOTE_SEND  0x10000
156 #endif
157 
158 #define purple_conversation_write_system_message(conv, msg, flags)  purple_conversation_write((conv), NULL, (msg), (flags) | PURPLE_MESSAGE_SYSTEM, time(NULL));
159 
160 #define PurpleProtocolChatEntry  struct proto_chat_entry
161 #define PurpleChatUserFlags  PurpleConvChatBuddyFlags
162 #define PURPLE_CHAT_USER_NONE     PURPLE_CBFLAGS_NONE
163 #define PURPLE_CHAT_USER_OP       PURPLE_CBFLAGS_OP
164 #define PURPLE_CHAT_USER_FOUNDER  PURPLE_CBFLAGS_FOUNDER
165 #define PURPLE_CHAT_USER_TYPING   PURPLE_CBFLAGS_TYPING
166 #define PURPLE_CHAT_USER_AWAY     PURPLE_CBFLAGS_AWAY
167 #define PURPLE_CHAT_USER_HALFOP   PURPLE_CBFLAGS_HALFOP
168 #define PURPLE_CHAT_USER_VOICE    PURPLE_CBFLAGS_VOICE
169 #define PURPLE_CHAT_USER_TYPING   PURPLE_CBFLAGS_TYPING
170 #define PurpleChatUser  PurpleConvChatBuddy
171 
172 static inline PurpleChatUser *
purple_chat_conversation_find_user(PurpleChatConversation * chat,const char * name)173 purple_chat_conversation_find_user(PurpleChatConversation *chat, const char *name)
174 {
175 	PurpleChatUser *cb = purple_conv_chat_cb_find(chat, name);
176 
177 	if (cb != NULL) {
178 		g_dataset_set_data(cb, "chat", chat);
179 	}
180 
181 	return cb;
182 }
183 #define purple_chat_user_get_flags(cb)     purple_conv_chat_user_get_flags(g_dataset_get_data((cb), "chat"), (cb)->name)
184 #define purple_chat_user_set_flags(cb, f)  purple_conv_chat_user_set_flags(g_dataset_get_data((cb), "chat"), (cb)->name, (f))
185 #define purple_chat_user_set_alias(cb, a)  ((cb)->alias = (a))
186 
187 #define PurpleIMTypingState	PurpleTypingState
188 #define PURPLE_IM_NOT_TYPING	PURPLE_NOT_TYPING
189 #define PURPLE_IM_TYPING	PURPLE_TYPING
190 #define PURPLE_IM_TYPED		PURPLE_TYPED
191 
192 #define purple_media_set_protocol_data  purple_media_set_prpl_data
193 #if	PURPLE_VERSION_CHECK(2, 10, 12)
194 // Handle ABI breakage
195 #	define PURPLE_MEDIA_NETWORK_PROTOCOL_TCP  PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_PASSIVE
196 #endif
197 
198 #undef purple_notify_error
199 #define purple_notify_error(handle, title, primary, secondary, cpar)   \
200 	purple_notify_message((handle), PURPLE_NOTIFY_MSG_ERROR, (title), \
201 						(primary), (secondary), NULL, NULL)
202 #undef purple_notify_warning
203 #define purple_notify_warning(handle, title, primary, secondary, cpar)   \
204 	purple_notify_message((handle), PURPLE_NOTIFY_MSG_WARNING, (title), \
205 						(primary), (secondary), NULL, NULL)
206 #define purple_notify_user_info_add_pair_html  purple_notify_user_info_add_pair
207 
208 #define PurpleProtocolAction                           PurplePluginAction
209 #define purple_protocol_action_get_connection(action)  ((PurpleConnection *) (action)->context)
210 #define purple_protocol_action_new                     purple_plugin_action_new
211 #define purple_protocol_get_id                         purple_plugin_get_id
212 
213 #define purple_protocol_got_user_status		purple_prpl_got_user_status
214 #define purple_protocol_got_user_idle       purple_prpl_got_user_idle
215 
216 #define purple_account_privacy_deny_add     purple_privacy_deny_add
217 #define purple_account_privacy_deny_remove  purple_privacy_deny_remove
218 #define purple_account_set_password(account, password, dummy1, dummy2) \
219 		purple_account_set_password(account, password);
220 #define purple_account_set_private_alias    purple_account_set_alias
221 #define purple_account_get_private_alias    purple_account_get_alias
222 
223 #define purple_proxy_info_get_proxy_type        purple_proxy_info_get_type
224 
225 #define purple_serv_got_im                         serv_got_im
226 #define purple_serv_got_typing                     serv_got_typing
227 #define purple_serv_got_alias                      serv_got_alias
228 #define purple_serv_got_chat_in                    serv_got_chat_in
229 #define purple_serv_got_chat_left                  serv_got_chat_left
230 #define purple_serv_got_joined_chat(pc, id, name)  PURPLE_CONV_CHAT(serv_got_joined_chat(pc, id, name))
231 
232 #define purple_status_get_status_type  purple_status_get_type
233 
234 #define PurpleXmlNode                xmlnode
235 #define purple_xmlnode_new           xmlnode_new
236 #define purple_xmlnode_new_child     xmlnode_new_child
237 #define purple_xmlnode_from_str      xmlnode_from_str
238 #define purple_xmlnode_to_str        xmlnode_to_str
239 #define purple_xmlnode_get_child     xmlnode_get_child
240 #define purple_xmlnode_get_next_twin xmlnode_get_next_twin
241 #define purple_xmlnode_get_data      xmlnode_get_data
242 #define purple_xmlnode_get_attrib    xmlnode_get_attrib
243 #define purple_xmlnode_set_attrib    xmlnode_set_attrib
244 #define purple_xmlnode_insert_data   xmlnode_insert_data
245 #define purple_xmlnode_free          xmlnode_free
246 
247 #define purple_xfer_set_protocol_data(xfer, proto_data)  ((xfer)->data = (proto_data))
248 #define purple_xfer_get_protocol_data(xfer)              ((xfer)->data)
249 #define purple_xfer_get_xfer_type                        purple_xfer_get_type
250 #define purple_xfer_protocol_ready                       purple_xfer_prpl_ready
251 #if !PURPLE_VERSION_CHECK(2, 10, 12) && !FEDORA
252 static inline gboolean
purple_xfer_write_file(PurpleXfer * xfer,const guchar * buffer,gsize size)253 purple_xfer_write_file(PurpleXfer *xfer, const guchar *buffer, gsize size) {
254 	PurpleXferUiOps *ui_ops = purple_xfer_get_ui_ops(xfer);
255 	purple_xfer_set_bytes_sent(xfer, purple_xfer_get_bytes_sent(xfer) +
256 		(ui_ops && ui_ops->ui_write ? ui_ops->ui_write(xfer, buffer, size) : fwrite(buffer, 1, size, xfer->dest_fp)));
257 	return TRUE;
258 }
259 static inline gssize
purple_xfer_read_file(PurpleXfer * xfer,guchar * buffer,gsize size)260 purple_xfer_read_file(PurpleXfer *xfer, guchar *buffer, gsize size) {
261 	PurpleXferUiOps *ui_ops = purple_xfer_get_ui_ops(xfer);
262 	gssize got_len = (ui_ops && ui_ops->ui_read ? ui_ops->ui_read(xfer, &buffer, size) : fread(buffer, 1, size, xfer->dest_fp));
263 	purple_xfer_set_bytes_sent(xfer, purple_xfer_get_bytes_sent(xfer) + got_len);
264 	return got_len;
265 }
266 #endif
267 #define PURPLE_XFER_TYPE_RECEIVE  PURPLE_XFER_RECEIVE
268 #define PURPLE_XFER_TYPE_SEND     PURPLE_XFER_SEND
269 
270 // Kinda gross, since we can technically use the glib mainloop from purple2
271 #define g_timeout_add_seconds  purple_timeout_add_seconds
272 #define g_timeout_add          purple_timeout_add
273 #define g_source_remove        purple_timeout_remove
274 
275 #endif
276 
277 #endif /*_PURPLECOMPAT_H_*/
278