| 29 |
29 |
| 30 /**************************************************************************/ |
30 /**************************************************************************/ |
| 31 /** Data Structures */ |
31 /** Data Structures */ |
| 32 /**************************************************************************/ |
32 /**************************************************************************/ |
| 33 |
33 |
| 34 typedef struct _GaimConvWindowUiOps GaimConvWindowUiOps; |
34 |
| 35 typedef struct _GaimConvWindow GaimConvWindow; |
|
| 36 typedef struct _GaimConversationUiOps GaimConversationUiOps; |
35 typedef struct _GaimConversationUiOps GaimConversationUiOps; |
| 37 typedef struct _GaimConversation GaimConversation; |
36 typedef struct _GaimConversation GaimConversation; |
| 38 typedef struct _GaimConvIm GaimConvIm; |
37 typedef struct _GaimConvIm GaimConvIm; |
| 39 typedef struct _GaimConvChat GaimConvChat; |
38 typedef struct _GaimConvChat GaimConvChat; |
| 40 typedef struct _GaimConvChatBuddy GaimConvChatBuddy; |
39 typedef struct _GaimConvChatBuddy GaimConvChatBuddy; |
| 133 GAIM_CBFLAGS_VOICE = 0x0001, /**< Voiced user or "Participant" */ |
132 GAIM_CBFLAGS_VOICE = 0x0001, /**< Voiced user or "Participant" */ |
| 134 GAIM_CBFLAGS_HALFOP = 0x0002, /**< Half-op */ |
133 GAIM_CBFLAGS_HALFOP = 0x0002, /**< Half-op */ |
| 135 GAIM_CBFLAGS_OP = 0x0004, /**< Channel Op or Moderator */ |
134 GAIM_CBFLAGS_OP = 0x0004, /**< Channel Op or Moderator */ |
| 136 GAIM_CBFLAGS_FOUNDER = 0x0008, /**< Channel Founder */ |
135 GAIM_CBFLAGS_FOUNDER = 0x0008, /**< Channel Founder */ |
| 137 GAIM_CBFLAGS_TYPING = 0x0010, /**< Currently typing */ |
136 GAIM_CBFLAGS_TYPING = 0x0010, /**< Currently typing */ |
| 138 |
137 |
| 139 |
138 |
| 140 } GaimConvChatBuddyFlags; |
139 } GaimConvChatBuddyFlags; |
| 141 |
140 |
| 142 #include "account.h" |
141 #include "account.h" |
| 143 #include "buddyicon.h" |
142 #include "buddyicon.h" |
| 144 #include "log.h" |
143 #include "log.h" |
| 145 #include "server.h" |
144 #include "server.h" |
| 146 |
145 |
| 147 /** |
146 /** |
| 148 * Conversation window operations. |
|
| 149 * |
|
| 150 * Any UI representing a window must assign a filled-out gaim_conv_window_ops |
|
| 151 * structure to the GaimConvWindow. |
|
| 152 */ |
|
| 153 struct _GaimConvWindowUiOps |
|
| 154 { |
|
| 155 GaimConversationUiOps *(*get_conversation_ui_ops)(void); |
|
| 156 |
|
| 157 void (*new_window)(GaimConvWindow *win); |
|
| 158 void (*destroy_window)(GaimConvWindow *win); |
|
| 159 |
|
| 160 void (*show)(GaimConvWindow *win); |
|
| 161 void (*hide)(GaimConvWindow *win); |
|
| 162 void (*raise)(GaimConvWindow *win); |
|
| 163 |
|
| 164 void (*switch_conversation)(GaimConvWindow *win, GaimConversation *conv); |
|
| 165 void (*add_conversation)(GaimConvWindow *win, GaimConversation *conv); |
|
| 166 void (*remove_conversation)(GaimConvWindow *win, GaimConversation *conv); |
|
| 167 |
|
| 168 GaimConversation *(*get_active_conversation)(const GaimConvWindow *win); |
|
| 169 gboolean (*has_focus)(GaimConvWindow *win); |
|
| 170 }; |
|
| 171 |
|
| 172 /** |
|
| 173 * Conversation operations and events. |
147 * Conversation operations and events. |
| 174 * |
148 * |
| 175 * Any UI representing a conversation must assign a filled-out |
149 * Any UI representing a conversation must assign a filled-out |
| 176 * GaimConversationUiOps structure to the GaimConversation. |
150 * GaimConversationUiOps structure to the GaimConversation. |
| 177 */ |
151 */ |
| 178 struct _GaimConversationUiOps |
152 struct _GaimConversationUiOps |
| 179 { |
153 { |
| |
154 void (*create_conversation)(GaimConversation *conv); |
| 180 void (*destroy_conversation)(GaimConversation *conv); |
155 void (*destroy_conversation)(GaimConversation *conv); |
| 181 void (*write_chat)(GaimConversation *conv, const char *who, |
156 void (*write_chat)(GaimConversation *conv, const char *who, |
| 182 const char *message, GaimMessageFlags flags, |
157 const char *message, GaimMessageFlags flags, |
| 183 time_t mtime); |
158 time_t mtime); |
| 184 void (*write_im)(GaimConversation *conv, const char *who, |
159 void (*write_im)(GaimConversation *conv, const char *who, |
| 193 const char *new_name, const char *new_alias); |
168 const char *new_name, const char *new_alias); |
| 194 void (*chat_remove_user)(GaimConversation *conv, const char *user); |
169 void (*chat_remove_user)(GaimConversation *conv, const char *user); |
| 195 void (*chat_remove_users)(GaimConversation *conv, GList *users); |
170 void (*chat_remove_users)(GaimConversation *conv, GList *users); |
| 196 void (*chat_update_user)(GaimConversation *conv, const char *user); |
171 void (*chat_update_user)(GaimConversation *conv, const char *user); |
| 197 |
172 |
| 198 void (*update_progress)(GaimConversation *conv, float percent); |
|
| 199 |
173 |
| 200 gboolean (*has_focus)(GaimConversation *conv); |
174 gboolean (*has_focus)(GaimConversation *conv); |
| 201 |
175 |
| 202 /* Custom Smileys */ |
176 /* Custom Smileys */ |
| 203 gboolean (*custom_smiley_add)(GaimConversation *conv, const char *smile); |
177 gboolean (*custom_smiley_add)(GaimConversation *conv, const char *smile); |
| 265 }; |
226 }; |
| 266 |
227 |
| 267 /** |
228 /** |
| 268 * A core representation of a conversation between two or more people. |
229 * A core representation of a conversation between two or more people. |
| 269 * |
230 * |
| 270 * The conversation can be an IM or a chat. Each conversation is kept |
231 * The conversation can be an IM or a chat. |
| 271 * in a GaimConvWindow and has a UI representation. |
|
| 272 */ |
232 */ |
| 273 struct _GaimConversation |
233 struct _GaimConversation |
| 274 { |
234 { |
| 275 GaimConversationType type; /**< The type of conversation. */ |
235 GaimConversationType type; /**< The type of conversation. */ |
| 276 |
236 |
| 277 GaimAccount *account; /**< The user using this conversation. */ |
237 GaimAccount *account; /**< The user using this conversation. */ |
| 278 GaimConvWindow *window; /**< The parent window. */ |
238 |
| 279 |
|
| 280 int conversation_pos; /**< The position in the window's list. */ |
|
| 281 |
239 |
| 282 char *name; /**< The name of the conversation. */ |
240 char *name; /**< The name of the conversation. */ |
| 283 char *title; /**< The window title. */ |
241 char *title; /**< The window title. */ |
| 284 |
242 |
| 285 gboolean logging; /**< The status of logging. */ |
243 gboolean logging; /**< The status of logging. */ |
| 305 |
263 |
| 306 GaimConnectionFlags features; /**< The supported features */ |
264 GaimConnectionFlags features; /**< The supported features */ |
| 307 |
265 |
| 308 }; |
266 }; |
| 309 |
267 |
| 310 typedef void (*GaimConvPlacementFunc)(GaimConversation *); |
|
| 311 |
|
| 312 #ifdef __cplusplus |
268 #ifdef __cplusplus |
| 313 extern "C" { |
269 extern "C" { |
| 314 #endif |
270 #endif |
| 315 |
|
| 316 /**************************************************************************/ |
|
| 317 /** @name Conversation Window API */ |
|
| 318 /**************************************************************************/ |
|
| 319 /*@{*/ |
|
| 320 |
|
| 321 /** |
|
| 322 * Creates a new conversation window. |
|
| 323 * |
|
| 324 * This window is added to the list of windows, but is not shown until |
|
| 325 * gaim_conv_window_show() is called. |
|
| 326 * |
|
| 327 * @return The new conversation window. |
|
| 328 */ |
|
| 329 GaimConvWindow *gaim_conv_window_new(void); |
|
| 330 |
|
| 331 /** |
|
| 332 * Destroys the specified conversation window and all conversations in it. |
|
| 333 * |
|
| 334 * @param win The window to destroy. |
|
| 335 */ |
|
| 336 void gaim_conv_window_destroy(GaimConvWindow *win); |
|
| 337 |
|
| 338 /** |
|
| 339 * Shows the specified conversation window. |
|
| 340 * |
|
| 341 * @param win The window. |
|
| 342 */ |
|
| 343 void gaim_conv_window_show(GaimConvWindow *win); |
|
| 344 |
|
| 345 /** |
|
| 346 * Hides the specified conversation window. |
|
| 347 * |
|
| 348 * @param win The window. |
|
| 349 */ |
|
| 350 void gaim_conv_window_hide(GaimConvWindow *win); |
|
| 351 |
|
| 352 /** |
|
| 353 * Raises the specified conversation window. |
|
| 354 * |
|
| 355 * @param win The window. |
|
| 356 */ |
|
| 357 void gaim_conv_window_raise(GaimConvWindow *win); |
|
| 358 |
|
| 359 /** |
|
| 360 * Sets the specified window's UI window operations structure. |
|
| 361 * |
|
| 362 * @param win The window. |
|
| 363 * @param ops The UI window operations structure. |
|
| 364 */ |
|
| 365 void gaim_conv_window_set_ui_ops(GaimConvWindow *win, |
|
| 366 GaimConvWindowUiOps *ops); |
|
| 367 |
|
| 368 /** |
|
| 369 * Returns the specified window's UI window operations structure. |
|
| 370 * |
|
| 371 * @param win The window. |
|
| 372 * |
|
| 373 * @return The UI window operations structure. |
|
| 374 */ |
|
| 375 GaimConvWindowUiOps *gaim_conv_window_get_ui_ops(const GaimConvWindow *win); |
|
| 376 |
|
| 377 /** |
|
| 378 * Adds a conversation to this window. |
|
| 379 * |
|
| 380 * If the conversation already has a parent window, this will do nothing. |
|
| 381 * |
|
| 382 * @param win The window. |
|
| 383 * @param conv The conversation. |
|
| 384 * |
|
| 385 * @return The new index of the conversation in the window. |
|
| 386 */ |
|
| 387 int gaim_conv_window_add_conversation(GaimConvWindow *win, |
|
| 388 GaimConversation *conv); |
|
| 389 |
|
| 390 /** |
|
| 391 * Removes the conversation from the window. |
|
| 392 * |
|
| 393 * @param win The window. |
|
| 394 * @param conv The conversation. |
|
| 395 * |
|
| 396 * @return The conversation removed. |
|
| 397 */ |
|
| 398 GaimConversation *gaim_conv_window_remove_conversation(GaimConvWindow *win, |
|
| 399 GaimConversation *conv); |
|
| 400 /** |
|
| 401 * Returns the number of conversations in the window. |
|
| 402 * |
|
| 403 * @param win The window. |
|
| 404 * |
|
| 405 * @return The number of conversations. |
|
| 406 */ |
|
| 407 size_t gaim_conv_window_get_conversation_count(const GaimConvWindow *win); |
|
| 408 |
|
| 409 /** |
|
| 410 * Switches the active conversation to the one at the specified index. |
|
| 411 * |
|
| 412 * @param win The window. |
|
| 413 * @param conv The converstion to switch to. |
|
| 414 */ |
|
| 415 void gaim_conv_window_switch_conversation(GaimConvWindow *win, |
|
| 416 GaimConversation *conv); |
|
| 417 |
|
| 418 /** |
|
| 419 * Returns the active conversation in the window. |
|
| 420 * |
|
| 421 * @param win The window. |
|
| 422 * |
|
| 423 * @return The active conversation. |
|
| 424 */ |
|
| 425 GaimConversation *gaim_conv_window_get_active_conversation( |
|
| 426 const GaimConvWindow *win); |
|
| 427 |
|
| 428 /** |
|
| 429 * Determines if a conversation window has focus |
|
| 430 * |
|
| 431 * @param win The window. |
|
| 432 * |
|
| 433 * @return @c TRUE if the conversation window has focus, @c FALSE if |
|
| 434 * it does not or the UI does not have a concept of window focus |
|
| 435 */ |
|
| 436 gboolean gaim_conv_window_has_focus(GaimConvWindow *win); |
|
| 437 |
|
| 438 /** |
|
| 439 * Returns the list of conversations in the specified window. |
|
| 440 * |
|
| 441 * @param win The window. |
|
| 442 * |
|
| 443 * @return The list of conversations. |
|
| 444 */ |
|
| 445 GList *gaim_conv_window_get_conversations(const GaimConvWindow *win); |
|
| 446 |
|
| 447 /** |
|
| 448 * Returns a list of all windows. |
|
| 449 * |
|
| 450 * @return A list of windows. |
|
| 451 */ |
|
| 452 GList *gaim_get_windows(void); |
|
| 453 |
|
| 454 /** |
|
| 455 * Returns the first window containing a conversation of the specified type. |
|
| 456 * |
|
| 457 * @param type The conversation type. |
|
| 458 * |
|
| 459 * @return The window if found, or @c NULL if not found. |
|
| 460 */ |
|
| 461 GaimConvWindow *gaim_get_first_window_with_type(GaimConversationType type); |
|
| 462 /** |
|
| 463 * Returns the last window containing a conversation of the specified type. |
|
| 464 * |
|
| 465 * @param type The conversation type. |
|
| 466 * |
|
| 467 * @return The window if found, or @c NULL if not found. |
|
| 468 */ |
|
| 469 GaimConvWindow *gaim_get_last_window_with_type(GaimConversationType type); |
|
| 470 |
|
| 471 /*@}*/ |
|
| 472 |
271 |
| 473 /**************************************************************************/ |
272 /**************************************************************************/ |
| 474 /** @name Conversation API */ |
273 /** @name Conversation API */ |
| 475 /**************************************************************************/ |
274 /**************************************************************************/ |
| 476 /*@{*/ |
275 /*@{*/ |
| 959 const char *message, GaimMessageFlags flags, |
744 const char *message, GaimMessageFlags flags, |
| 960 time_t mtime); |
745 time_t mtime); |
| 961 |
746 |
| 962 /** |
747 /** |
| 963 * Presents an IM-error to the user |
748 * Presents an IM-error to the user |
| 964 * |
749 * |
| 965 * This is a helper function to find a conversation, write an error to it, and |
750 * This is a helper function to find a conversation, write an error to it, and |
| 966 * raise the window. If a conversation with this user doesn't already exist, |
751 * raise the window. If a conversation with this user doesn't already exist, |
| 967 * the function will return FALSE and the calling function can attempt to present |
752 * the function will return FALSE and the calling function can attempt to present |
| 968 * the error another way (gaim_notify_error, most likely) |
753 * the error another way (gaim_notify_error, most likely) |
| 969 * |
754 * |
| 1373 void gaim_conv_chat_cb_destroy(GaimConvChatBuddy *cb); |
1158 void gaim_conv_chat_cb_destroy(GaimConvChatBuddy *cb); |
| 1374 |
1159 |
| 1375 /*@}*/ |
1160 /*@}*/ |
| 1376 |
1161 |
| 1377 /**************************************************************************/ |
1162 /**************************************************************************/ |
| 1378 /** @name Conversation Placement API */ |
|
| 1379 /**************************************************************************/ |
|
| 1380 /*@{*/ |
|
| 1381 |
|
| 1382 /** |
|
| 1383 * Returns a GList containing the IDs and Names of the registered placement |
|
| 1384 * functions. |
|
| 1385 * |
|
| 1386 * @return The list of IDs and names. |
|
| 1387 */ |
|
| 1388 GList *gaim_conv_placement_get_options(void); |
|
| 1389 |
|
| 1390 /** |
|
| 1391 * Adds a conversation placement function to the list of possible functions. |
|
| 1392 * |
|
| 1393 * @param id The unique ID of the placement function. |
|
| 1394 * @param name The name of the function. |
|
| 1395 * @param fnc A pointer to the function. |
|
| 1396 */ |
|
| 1397 void gaim_conv_placement_add_fnc(const char *id, const char *name, |
|
| 1398 GaimConvPlacementFunc fnc); |
|
| 1399 |
|
| 1400 /** |
|
| 1401 * Removes a conversation placement function from the list of possible |
|
| 1402 * functions. |
|
| 1403 * |
|
| 1404 * @param id The id of the function. |
|
| 1405 */ |
|
| 1406 void gaim_conv_placement_remove_fnc(const char *id); |
|
| 1407 |
|
| 1408 /** |
|
| 1409 * Returns the name of the conversation placement function at the |
|
| 1410 * specified id. |
|
| 1411 * |
|
| 1412 * @param id The id. |
|
| 1413 * |
|
| 1414 * @return The name of the function, or @c NULL if this id is invalid. |
|
| 1415 */ |
|
| 1416 const char *gaim_conv_placement_get_name(const char *id); |
|
| 1417 |
|
| 1418 /** |
|
| 1419 * Returns a pointer to the conversation placement function at the |
|
| 1420 * specified id. |
|
| 1421 * |
|
| 1422 * @param id The id. |
|
| 1423 * |
|
| 1424 * @return A pointer to the function. |
|
| 1425 */ |
|
| 1426 GaimConvPlacementFunc gaim_conv_placement_get_fnc(const char *id); |
|
| 1427 |
|
| 1428 /** |
|
| 1429 * Sets the current conversation placement function. |
|
| 1430 * |
|
| 1431 * @param func The new conversation placement function. |
|
| 1432 */ |
|
| 1433 void gaim_conv_placement_set_current_func(GaimConvPlacementFunc func); |
|
| 1434 |
|
| 1435 /** |
|
| 1436 * Returns the current conversation placement function. |
|
| 1437 * |
|
| 1438 * @return The current conversation placement function. |
|
| 1439 */ |
|
| 1440 GaimConvPlacementFunc gaim_conv_placement_get_current_func(void); |
|
| 1441 |
|
| 1442 /*@}*/ |
|
| 1443 |
|
| 1444 /**************************************************************************/ |
|
| 1445 /** @name UI Registration Functions */ |
|
| 1446 /**************************************************************************/ |
|
| 1447 /*@{*/ |
|
| 1448 |
|
| 1449 /** |
|
| 1450 * Sets the UI operations structure to be used in all gaim conversation |
|
| 1451 * windows. |
|
| 1452 * |
|
| 1453 * @param ops The UI operations structure. |
|
| 1454 */ |
|
| 1455 void gaim_conversations_set_win_ui_ops(GaimConvWindowUiOps *ops); |
|
| 1456 |
|
| 1457 /** |
|
| 1458 * Returns the gaim window UI operations structure to be used in |
|
| 1459 * new windows. |
|
| 1460 * |
|
| 1461 * @return A filled-out GaimConvWindowUiOps structure. |
|
| 1462 */ |
|
| 1463 GaimConvWindowUiOps *gaim_conversations_get_win_ui_ops(void); |
|
| 1464 |
|
| 1465 |
|
| 1466 /*@}*/ |
|
| 1467 |
|
| 1468 /**************************************************************************/ |
|
| 1469 /** @name Conversations Subsystem */ |
1163 /** @name Conversations Subsystem */ |
| 1470 /**************************************************************************/ |
1164 /**************************************************************************/ |
| 1471 /*@{*/ |
1165 /*@{*/ |
| 1472 |
1166 |
| 1473 /** |
1167 /** |