Merged default into xdg-dirs
[pidgin-git.git] / libpurple / conversation.h
blob2a528b65330790af725a7a2df86be2bfed552c8b
1 /* purple
3 * Purple is the legal property of its developers, whose names are too numerous
4 * to list here. Please refer to the COPYRIGHT file distributed with this
5 * source distribution.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
22 #ifndef _PURPLE_CONVERSATION_H_
23 #define _PURPLE_CONVERSATION_H_
24 /**
25 * SECTION:conversation
26 * @section_id: libpurple-conversation
27 * @short_description: Conversation base class <filename>conversation.h</filename>
28 * @title: Conversation Base Class
30 * This is the base class for the conversation abstraction on Libpurple.
32 * The present API manages the common functionallity for both kinds of conversations
33 * @PurpleIMConversation and @PurpleChatConversation.
36 #define PURPLE_TYPE_CONVERSATION (purple_conversation_get_type())
37 #define PURPLE_CONVERSATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_CONVERSATION, PurpleConversation))
38 #define PURPLE_CONVERSATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_CONVERSATION, PurpleConversationClass))
39 #define PURPLE_IS_CONVERSATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_CONVERSATION))
40 #define PURPLE_IS_CONVERSATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_CONVERSATION))
41 #define PURPLE_CONVERSATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_CONVERSATION, PurpleConversationClass))
43 #define PURPLE_TYPE_CONVERSATION_UI_OPS (purple_conversation_ui_ops_get_type())
45 #define PURPLE_TYPE_CONVERSATION_MESSAGE (purple_conversation_message_get_type())
47 /**************************************************************************/
48 /* Data Structures */
49 /**************************************************************************/
51 typedef struct _PurpleConversation PurpleConversation;
52 typedef struct _PurpleConversationClass PurpleConversationClass;
54 typedef struct _PurpleConversationUiOps PurpleConversationUiOps;
56 /**
57 * PurpleConversationUpdateType:
58 * @PURPLE_CONVERSATION_UPDATE_ADD: The buddy associated with the
59 * conversation was added.
60 * @PURPLE_CONVERSATION_UPDATE_REMOVE: The buddy associated with the
61 * conversation was removed.
62 * @PURPLE_CONVERSATION_UPDATE_ACCOUNT: The purple_account was changed.
63 * @PURPLE_CONVERSATION_UPDATE_TYPING: The typing state was updated.
64 * @PURPLE_CONVERSATION_UPDATE_UNSEEN: The unseen state was updated.
65 * @PURPLE_CONVERSATION_UPDATE_LOGGING: Logging for this conversation was
66 * enabled or disabled.
67 * @PURPLE_CONVERSATION_UPDATE_TOPIC: The topic for a chat was updated.
68 * @PURPLE_CONVERSATION_UPDATE_E2EE: The End-to-end encryption state was
69 * updated.
70 * @PURPLE_CONVERSATION_ACCOUNT_ONLINE: One of the user's accounts went online.
71 * @PURPLE_CONVERSATION_ACCOUNT_OFFLINE: One of the user's accounts went
72 * offline.
73 * @PURPLE_CONVERSATION_UPDATE_AWAY: The other user went away.
74 * @PURPLE_CONVERSATION_UPDATE_ICON: The other user's buddy icon changed.
75 * @PURPLE_CONVERSATION_UPDATE_NAME: The name of the conversation was changed.
76 * @PURPLE_CONVERSATION_UPDATE_TITLE: The title of the conversation was updated.
77 * @PURPLE_CONVERSATION_UPDATE_CHATLEFT: The user left a chat.
78 * @PURPLE_CONVERSATION_UPDATE_FEATURES: The features for a chat have changed.
80 * Conversation update type.
82 typedef enum
84 PURPLE_CONVERSATION_UPDATE_ADD = 0,
85 PURPLE_CONVERSATION_UPDATE_REMOVE,
86 PURPLE_CONVERSATION_UPDATE_ACCOUNT,
87 PURPLE_CONVERSATION_UPDATE_TYPING,
88 PURPLE_CONVERSATION_UPDATE_UNSEEN,
89 PURPLE_CONVERSATION_UPDATE_LOGGING,
90 PURPLE_CONVERSATION_UPDATE_TOPIC,
91 PURPLE_CONVERSATION_UPDATE_E2EE,
94 * XXX These need to go when we implement a more generic core/UI event
95 * system.
97 PURPLE_CONVERSATION_ACCOUNT_ONLINE,
98 PURPLE_CONVERSATION_ACCOUNT_OFFLINE,
99 PURPLE_CONVERSATION_UPDATE_AWAY,
100 PURPLE_CONVERSATION_UPDATE_ICON,
101 PURPLE_CONVERSATION_UPDATE_NAME,
102 PURPLE_CONVERSATION_UPDATE_TITLE,
103 PURPLE_CONVERSATION_UPDATE_CHATLEFT,
105 PURPLE_CONVERSATION_UPDATE_FEATURES
107 } PurpleConversationUpdateType;
110 * PurpleMessageFlags:
111 * @PURPLE_MESSAGE_SEND: Outgoing message.
112 * @PURPLE_MESSAGE_RECV: Incoming message.
113 * @PURPLE_MESSAGE_SYSTEM: System message.
114 * @PURPLE_MESSAGE_AUTO_RESP: Auto response.
115 * @PURPLE_MESSAGE_ACTIVE_ONLY: Hint to the UI that this message should not be
116 * shown in conversations which are only open for
117 * internal UI purposes (e.g. for contact-aware
118 * conversations).
119 * @PURPLE_MESSAGE_NICK: Contains your nick.
120 * @PURPLE_MESSAGE_NO_LOG: Do not log.
121 * @PURPLE_MESSAGE_ERROR: Error message.
122 * @PURPLE_MESSAGE_DELAYED: Delayed message.
123 * @PURPLE_MESSAGE_RAW: "Raw" message - don't apply formatting
124 * @PURPLE_MESSAGE_IMAGES: Message contains images
125 * @PURPLE_MESSAGE_NOTIFY: Message is a notification
126 * @PURPLE_MESSAGE_NO_LINKIFY: Message should not be auto-linkified
127 * @PURPLE_MESSAGE_INVISIBLE: Message should not be displayed
129 * Flags applicable to a message. Most will have send, recv or system.
131 typedef enum /*< flags >*/
133 PURPLE_MESSAGE_SEND = 0x0001,
134 PURPLE_MESSAGE_RECV = 0x0002,
135 PURPLE_MESSAGE_SYSTEM = 0x0004,
136 PURPLE_MESSAGE_AUTO_RESP = 0x0008,
137 PURPLE_MESSAGE_ACTIVE_ONLY = 0x0010,
138 PURPLE_MESSAGE_NICK = 0x0020,
139 PURPLE_MESSAGE_NO_LOG = 0x0040,
140 PURPLE_MESSAGE_ERROR = 0x0200,
141 PURPLE_MESSAGE_DELAYED = 0x0400,
142 PURPLE_MESSAGE_RAW = 0x0800,
143 PURPLE_MESSAGE_IMAGES = 0x1000,
144 PURPLE_MESSAGE_NOTIFY = 0x2000,
145 PURPLE_MESSAGE_NO_LINKIFY = 0x4000,
146 PURPLE_MESSAGE_INVISIBLE = 0x8000
147 } PurpleMessageFlags;
149 #include <glib.h>
150 #include <glib-object.h>
151 #include "message.h"
153 /**************************************************************************/
154 /* PurpleConversation */
155 /**************************************************************************/
157 * PurpleConversation:
158 * @ui_data: The UI data associated with this conversation. This is a
159 * convenience field provided to the UIs -- it is not used by the
160 * libpurple core.
162 * A core representation of a conversation between two or more people.
164 * The conversation can be an IM or a chat.
166 * Note: When a conversation is destroyed with the last g_object_unref(), the
167 * specified conversation is removed from the parent window. If this
168 * conversation is the only one contained in the parent window, that
169 * window is also destroyed.
171 struct _PurpleConversation
173 GObject gparent;
175 /*< public >*/
176 gpointer ui_data;
180 * PurpleConversationClass:
181 * @write_message: Writes a message to a chat or IM conversation. See
182 * purple_conversation_write_message().
184 * Base class for all #PurpleConversation's
186 struct _PurpleConversationClass {
187 GObjectClass parent_class;
189 void (*write_message)(PurpleConversation *conv, PurpleMessage *msg);
191 /*< private >*/
192 void (*_purple_reserved1)(void);
193 void (*_purple_reserved2)(void);
194 void (*_purple_reserved3)(void);
195 void (*_purple_reserved4)(void);
198 #include "account.h"
199 #include "buddyicon.h"
200 #include "e2ee.h"
201 #include "log.h"
202 #include "smiley-list.h"
204 /**************************************************************************/
205 /* PurpleConversationUiOps */
206 /**************************************************************************/
208 * PurpleConversationUiOps:
209 * @create_conversation: Called when @conv is created (but before the
210 * <link linkend="conversations-conversation-created"><literal>"conversation-created"</literal></link>
211 * signal is emitted).
212 * @destroy_conversation: Called just before @conv is freed.
213 * @write_chat: Write a message to a chat. If this field is %NULL, libpurple
214 * will fall back to using @write_conv.
215 * See purple_conversation_write_message().
216 * @write_im: Write a message to an IM conversation. If this field is %NULL,
217 * libpurple will fall back to using @write_conv.
218 * See purple_conversation_write_message().
219 * @write_conv: Write a message to a conversation. This is used rather than the
220 * chat- or im-specific ops for errors, system messages (such as "x
221 * is now know as y"), and as the fallback if @write_im and
222 * @write_chat are not implemented. It should be implemented, or
223 * the UI will miss conversation error messages and your users will
224 * hate you. See purple_conversation_write_message().
225 * @chat_add_users: Add @cbuddies to a chat.
226 * <sbr/>@cbuddies: A GList of #PurpleChatUser structs.
227 * <sbr/>@new_arrivals: Whether join notices should be shown.
228 * (Join notices are actually written to
229 * the conversation by
230 * purple_chat_conversation_add_users())
231 * @chat_rename_user: Rename the user in this chat named @old_name to @new_name.
232 * (The rename message is written to the conversation by
233 * libpurple.) See purple_chat_conversation_rename_user().
234 * <sbr/>@new_alias: @new_name's new alias, if they have one.
235 * @chat_remove_users: Remove @users from a chat @chat.
236 * See purple_chat_conversation_remove_users().
237 * @chat_update_user: Called when a user's flags are changed.
238 * See purple_chat_user_set_flags().
239 * @present: Present this conversation to the user; for example, by displaying
240 * the IM dialog.
241 * @has_focus: If this UI has a concept of focus (as in a windowing system) and
242 * this conversation has the focus, return %TRUE; otherwise, return
243 * %FALSE.
244 * @send_confirm: Prompt the user for confirmation to send @message. This
245 * function should arrange for the message to be sent if the user
246 * accepts. If this field is %NULL, libpurple will fall back to
247 * using purple_request_action().
249 * Conversation operations and events.
251 * Any UI representing a conversation must assign a filled-out
252 * #PurpleConversationUiOps structure to the #PurpleConversation.
254 struct _PurpleConversationUiOps
256 void (*create_conversation)(PurpleConversation *conv);
257 void (*destroy_conversation)(PurpleConversation *conv);
259 void (*write_chat)(PurpleChatConversation *chat, PurpleMessage *msg);
260 void (*write_im)(PurpleIMConversation *im, PurpleMessage *msg);
261 void (*write_conv)(PurpleConversation *conv, PurpleMessage *msg);
263 void (*chat_add_users)(PurpleChatConversation *chat,
264 GList *cbuddies,
265 gboolean new_arrivals);
267 void (*chat_rename_user)(PurpleChatConversation *chat, const char *old_name,
268 const char *new_name, const char *new_alias);
270 void (*chat_remove_users)(PurpleChatConversation *chat, GList *users);
272 void (*chat_update_user)(PurpleChatUser *cb);
274 void (*present)(PurpleConversation *conv);
275 gboolean (*has_focus)(PurpleConversation *conv);
277 void (*send_confirm)(PurpleConversation *conv, const char *message);
279 /*< private >*/
280 void (*_purple_reserved1)(void);
281 void (*_purple_reserved2)(void);
282 void (*_purple_reserved3)(void);
283 void (*_purple_reserved4)(void);
286 G_BEGIN_DECLS
288 /**************************************************************************/
289 /* Conversation API */
290 /**************************************************************************/
293 * purple_conversation_get_type:
295 * Returns: The #GType for the Conversation object.
297 GType purple_conversation_get_type(void);
300 * purple_conversation_ui_ops_get_type:
302 * Returns: The #GType for the #PurpleConversationUiOps boxed structure.
304 GType purple_conversation_ui_ops_get_type(void);
307 * purple_conversation_present:
308 * @conv: The conversation to present
310 * Present a conversation to the user. This allows core code to initiate a
311 * conversation by displaying the IM dialog.
313 void purple_conversation_present(PurpleConversation *conv);
316 * purple_conversation_set_ui_ops:
317 * @conv: The conversation.
318 * @ops: The UI conversation operations structure.
320 * Sets the specified conversation's UI operations structure.
322 void purple_conversation_set_ui_ops(PurpleConversation *conv,
323 PurpleConversationUiOps *ops);
326 * purple_conversation_get_ui_ops:
327 * @conv: The conversation.
329 * Returns the specified conversation's UI operations structure.
331 * Returns: The operations structure.
333 PurpleConversationUiOps *purple_conversation_get_ui_ops(const PurpleConversation *conv);
336 * purple_conversation_set_account:
337 * @conv: The conversation.
338 * @account: The purple_account.
340 * Sets the specified conversation's purple_account.
342 * This purple_account represents the user using purple, not the person the user
343 * is having a conversation/chat/flame with.
345 void purple_conversation_set_account(PurpleConversation *conv,
346 PurpleAccount *account);
349 * purple_conversation_get_account:
350 * @conv: The conversation.
352 * Returns the specified conversation's purple_account.
354 * This purple_account represents the user using purple, not the person the user
355 * is having a conversation/chat/flame with.
357 * Returns: (transfer none): The conversation's purple_account.
359 PurpleAccount *purple_conversation_get_account(const PurpleConversation *conv);
362 * purple_conversation_get_connection:
363 * @conv: The conversation.
365 * Returns the specified conversation's purple_connection.
367 * Returns: (transfer none): The conversation's purple_connection.
369 PurpleConnection *purple_conversation_get_connection(const PurpleConversation *conv);
372 * purple_conversation_set_title:
373 * @conv: The conversation.
374 * @title: The title.
376 * Sets the specified conversation's title.
378 void purple_conversation_set_title(PurpleConversation *conv, const char *title);
381 * purple_conversation_get_title:
382 * @conv: The conversation.
384 * Returns the specified conversation's title.
386 * Returns: The title.
388 const char *purple_conversation_get_title(const PurpleConversation *conv);
391 * purple_conversation_autoset_title:
392 * @conv: The conversation.
394 * Automatically sets the specified conversation's title.
396 * This function takes OPT_IM_ALIAS_TAB into account, as well as the
397 * user's alias.
399 void purple_conversation_autoset_title(PurpleConversation *conv);
402 * purple_conversation_set_name:
403 * @conv: The conversation.
404 * @name: The conversation's name.
406 * Sets the specified conversation's name.
408 void purple_conversation_set_name(PurpleConversation *conv, const char *name);
411 * purple_conversation_get_name:
412 * @conv: The conversation.
414 * Returns the specified conversation's name.
416 * Returns: The conversation's name. If the conversation is an IM with a
417 * PurpleBuddy, then it's the name of the PurpleBuddy.
419 const char *purple_conversation_get_name(const PurpleConversation *conv);
422 * purple_conversation_set_e2ee_state:
423 * @conv: The conversation.
424 * @state: The E2EE state.
426 * Sets current E2EE state for the conversation.
428 void
429 purple_conversation_set_e2ee_state(PurpleConversation *conv,
430 PurpleE2eeState *state);
433 * purple_conversation_get_e2ee_state:
434 * @conv: The conversation.
436 * Gets current conversation's E2EE state.
438 * Returns: Current E2EE state for conversation.
440 PurpleE2eeState *
441 purple_conversation_get_e2ee_state(PurpleConversation *conv);
444 * purple_conversation_set_logging:
445 * @conv: The conversation.
446 * @log: %TRUE if logging should be enabled, or %FALSE otherwise.
448 * Enables or disables logging for this conversation.
450 void purple_conversation_set_logging(PurpleConversation *conv, gboolean log);
453 * purple_conversation_is_logging:
454 * @conv: The conversation.
456 * Returns whether or not logging is enabled for this conversation.
458 * Returns: %TRUE if logging is enabled, or %FALSE otherwise.
460 gboolean purple_conversation_is_logging(const PurpleConversation *conv);
463 * purple_conversation_close_logs:
464 * @conv: The conversation.
466 * Closes any open logs for this conversation.
468 * Note that new logs will be opened as necessary (e.g. upon receipt of a
469 * message, if the conversation has logging enabled. To disable logging for
470 * the remainder of the conversation, use purple_conversation_set_logging().
472 void purple_conversation_close_logs(PurpleConversation *conv);
475 * purple_conversation_write_message:
476 * @conv: The conversation.
477 * @msg: The message to write.
479 * Writes to a chat or an IM.
481 void purple_conversation_write_message(PurpleConversation *conv,
482 PurpleMessage *msg);
485 * purple_conversation_write_system_message:
486 * @conv: The conversation.
487 * @message: The message to write.
488 * @flags: The message flags (you don't need to set %PURPLE_MESSAGE_SYSTEM.
490 * Wites a system message to a chat or an IM.
492 void purple_conversation_write_system_message(PurpleConversation *conv,
493 const gchar *message, PurpleMessageFlags flags);
496 * purple_conversation_send:
497 * @conv: The conversation.
498 * @message: The message to send.
500 * Sends a message to this conversation. This function calls
501 * purple_conversation_send_with_flags() with no additional flags.
503 void purple_conversation_send(PurpleConversation *conv, const char *message);
506 * purple_conversation_send_with_flags:
507 * @conv: The conversation.
508 * @message: The message to send.
509 * @flags: The PurpleMessageFlags flags to use in addition to
510 * PURPLE_MESSAGE_SEND.
512 * Sends a message to this conversation with specified flags.
514 void purple_conversation_send_with_flags(PurpleConversation *conv, const char *message,
515 PurpleMessageFlags flags);
518 * purple_conversation_set_features:
519 * @conv: The conversation
520 * @features: Bitset defining supported features
522 * Set the features as supported for the given conversation.
524 void purple_conversation_set_features(PurpleConversation *conv,
525 PurpleConnectionFlags features);
529 * purple_conversation_get_features:
530 * @conv: The conversation
532 * Get the features supported by the given conversation.
534 PurpleConnectionFlags purple_conversation_get_features(PurpleConversation *conv);
537 * purple_conversation_has_focus:
538 * @conv: The conversation.
540 * Determines if a conversation has focus
542 * Returns: %TRUE if the conversation has focus, %FALSE if
543 * it does not or the UI does not have a concept of conversation focus
545 gboolean purple_conversation_has_focus(PurpleConversation *conv);
548 * purple_conversation_update:
549 * @conv: The conversation.
550 * @type: The update type.
552 * Updates the visual status and UI of a conversation.
554 void purple_conversation_update(PurpleConversation *conv, PurpleConversationUpdateType type);
557 * purple_conversation_get_message_history:
558 * @conv: The conversation
560 * Retrieve the message history of a conversation.
562 * Returns: (element-type PurpleMessage) (transfer none):
563 * A GList of PurpleMessage's. You must not modify the
564 * list or the data within. The list contains the newest message at
565 * the beginning, and the oldest message at the end.
567 GList *purple_conversation_get_message_history(PurpleConversation *conv);
570 * purple_conversation_clear_message_history:
571 * @conv: The conversation
573 * Clear the message history of a conversation.
575 void purple_conversation_clear_message_history(PurpleConversation *conv);
578 * purple_conversation_set_ui_data:
579 * @conv: The conversation.
580 * @ui_data: A pointer to associate with this conversation.
582 * Set the UI data associated with this conversation.
584 void purple_conversation_set_ui_data(PurpleConversation *conv, gpointer ui_data);
587 * purple_conversation_get_ui_data:
588 * @conv: The conversation.
590 * Get the UI data associated with this conversation.
592 * Returns: (transfer none): The UI data associated with this conversation.
593 * This is a convenience field provided to the UIs--it is not
594 * used by the libpurple core.
596 gpointer purple_conversation_get_ui_data(const PurpleConversation *conv);
599 * purple_conversation_send_confirm:
600 * @conv: The conversation.
601 * @message: The message to send.
603 * Sends a message to a conversation after confirming with
604 * the user.
606 * This function is intended for use in cases where the user
607 * hasn't explicitly and knowingly caused a message to be sent.
608 * The confirmation ensures that the user isn't sending a
609 * message by mistake.
611 void purple_conversation_send_confirm(PurpleConversation *conv, const char *message);
614 * purple_conversation_get_extended_menu:
615 * @conv: The conversation.
617 * Retrieves the extended menu items for the conversation.
619 * Returns: (element-type PurpleMenuAction):
620 * A list of PurpleMenuAction items, harvested by the
621 * chat-extended-menu signal. The list and the menuaction
622 * items should be freed by the caller.
624 GList * purple_conversation_get_extended_menu(PurpleConversation *conv);
627 * purple_conversation_do_command:
628 * @conv: The conversation.
629 * @cmdline: The entire command including the arguments.
630 * @markup: %NULL, or the formatted command line.
631 * @error: If the command failed errormsg is filled in with the appropriate error
632 * message, if not %NULL. It must be freed by the caller with g_free().
634 * Perform a command in a conversation. Similar to purple_cmd_do_command().
636 * Returns: %TRUE if the command was executed successfully, %FALSE otherwise.
638 gboolean purple_conversation_do_command(PurpleConversation *conv,
639 const gchar *cmdline, const gchar *markup, gchar **error);
642 * purple_conversation_get_max_message_size:
643 * @conv: The conversation to query.
645 * Gets the maximum message size in bytes for the conversation.
647 * See #PurpleProtocolClientIface's <literal>get_max_message_size</literal>.
649 * Returns: Maximum message size, 0 if unspecified, -1 for infinite.
651 gssize
652 purple_conversation_get_max_message_size(PurpleConversation *conv);
655 * purple_conversation_add_smiley:
656 * @conv: The conversation that receives new smiley.
657 * @smiley: The smiley.
659 * Adds a smiley to the list of smileys that belong to this conversation.
661 void purple_conversation_add_smiley(PurpleConversation *conv, PurpleSmiley *smiley);
664 * purple_conversation_get_smiley:
665 * @conv: The conversation.
666 * @shortcut: The shortcut.
668 * Lookups for the smiley previously added to this conversation.
670 * Returns: (transfer none): The smiley, or %NULL if it doesn't exists.
672 PurpleSmiley *purple_conversation_get_smiley(PurpleConversation *conv, const gchar *shortcut);
675 * purple_conversation_get_remote_smileys:
676 * @conv: The conversation.
678 * Get all remote smileys previously added to this conversation.
680 * Returns: (transfer none): The list of remote smileys.
682 PurpleSmileyList *
683 purple_conversation_get_remote_smileys(PurpleConversation *conv);
685 /**************************************************************************/
686 /* Conversation Helper API */
687 /**************************************************************************/
690 * purple_conversation_present_error:
691 * @who: The user this error is about
692 * @account: The account this error is on
693 * @what: The error
695 * Presents an IM-error to the user
697 * This is a helper function to find a conversation, write an error to it, and
698 * raise the window. If a conversation with this user doesn't already exist,
699 * the function will return FALSE and the calling function can attempt to present
700 * the error another way (purple_notify_error, most likely)
702 * Returns: TRUE if the error was presented, else FALSE
704 gboolean purple_conversation_present_error(const char *who, PurpleAccount *account, const char *what);
706 G_END_DECLS
708 #endif /* _PURPLE_CONVERSATION_H_ */