libpurple/protocols.h

branch
soc.2013.gobjectification.plugins
changeset 37017
8e2b68c79fa1
parent 36701
5acd461707ae
child 37021
04c99b24db84
equal deleted inserted replaced
37016:48f85579cc4c 37017:8e2b68c79fa1
194 GType purple_attention_type_get_type(void); 194 GType purple_attention_type_get_type(void);
195 195
196 /** 196 /**
197 * Creates a new #PurpleAttentionType object and sets its mandatory parameters. 197 * Creates a new #PurpleAttentionType object and sets its mandatory parameters.
198 * 198 *
199 * @param ulname A non-localized string that can be used by UIs in need of such 199 * @ulname: A non-localized string that can be used by UIs in need of such
200 * non-localized strings. This should be the same as @a name, 200 * non-localized strings. This should be the same as @a name,
201 * without localization. 201 * without localization.
202 * @param name A localized string that the UI may display for the event. This 202 * @name: A localized string that the UI may display for the event. This
203 * should be the same string as @a ulname, with localization. 203 * should be the same string as @a ulname, with localization.
204 * @param inc_desc A localized description shown when the event is received. 204 * @inc_desc: A localized description shown when the event is received.
205 * @param out_desc A localized description shown when the event is sent. 205 * @out_desc: A localized description shown when the event is sent.
206 * 206 *
207 * @return A pointer to the new object. 207 * Returns: A pointer to the new object.
208 */ 208 */
209 PurpleAttentionType *purple_attention_type_new(const char *ulname, const char *name, 209 PurpleAttentionType *purple_attention_type_new(const char *ulname, const char *name,
210 const char *inc_desc, const char *out_desc); 210 const char *inc_desc, const char *out_desc);
211 211
212 /** 212 /**
213 * Sets the displayed name of the attention-demanding event. 213 * Sets the displayed name of the attention-demanding event.
214 * 214 *
215 * @param type The attention type. 215 * @type: The attention type.
216 * @param name The localized name that will be displayed by UIs. This should be 216 * @name: The localized name that will be displayed by UIs. This should be
217 * the same string given as the unlocalized name, but with 217 * the same string given as the unlocalized name, but with
218 * localization. 218 * localization.
219 */ 219 */
220 void purple_attention_type_set_name(PurpleAttentionType *type, const char *name); 220 void purple_attention_type_set_name(PurpleAttentionType *type, const char *name);
221 221
222 /** 222 /**
223 * Sets the description of the attention-demanding event shown in conversations 223 * Sets the description of the attention-demanding event shown in conversations
224 * when the event is received. 224 * when the event is received.
225 * 225 *
226 * @param type The attention type. 226 * @type: The attention type.
227 * @param desc The localized description for incoming events. 227 * @desc: The localized description for incoming events.
228 */ 228 */
229 void purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const char *desc); 229 void purple_attention_type_set_incoming_desc(PurpleAttentionType *type, const char *desc);
230 230
231 /** 231 /**
232 * Sets the description of the attention-demanding event shown in conversations 232 * Sets the description of the attention-demanding event shown in conversations
233 * when the event is sent. 233 * when the event is sent.
234 * 234 *
235 * @param type The attention type. 235 * @type: The attention type.
236 * @param desc The localized description for outgoing events. 236 * @desc: The localized description for outgoing events.
237 */ 237 */
238 void purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const char *desc); 238 void purple_attention_type_set_outgoing_desc(PurpleAttentionType *type, const char *desc);
239 239
240 /** 240 /**
241 * Sets the name of the icon to display for the attention event; this is optional. 241 * Sets the name of the icon to display for the attention event; this is optional.
242 * 242 *
243 * @param type The attention type. 243 * @type: The attention type.
244 * @param name The icon's name. 244 * @name: The icon's name.
245 * @note Icons are optional for attention events. 245 * @note Icons are optional for attention events.
246 */ 246 */
247 void purple_attention_type_set_icon_name(PurpleAttentionType *type, const char *name); 247 void purple_attention_type_set_icon_name(PurpleAttentionType *type, const char *name);
248 248
249 /** 249 /**
250 * Sets the unlocalized name of the attention event; some UIs may need this, 250 * Sets the unlocalized name of the attention event; some UIs may need this,
251 * thus it is required. 251 * thus it is required.
252 * 252 *
253 * @param type The attention type. 253 * @type: The attention type.
254 * @param ulname The unlocalized name. This should be the same string given as 254 * @ulname: The unlocalized name. This should be the same string given as
255 * the localized name, but without localization. 255 * the localized name, but without localization.
256 */ 256 */
257 void purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const char *ulname); 257 void purple_attention_type_set_unlocalized_name(PurpleAttentionType *type, const char *ulname);
258 258
259 /** 259 /**
260 * Get the attention type's name as displayed by the UI. 260 * Get the attention type's name as displayed by the UI.
261 * 261 *
262 * @param type The attention type. 262 * @type: The attention type.
263 * 263 *
264 * @return The name. 264 * Returns: The name.
265 */ 265 */
266 const char *purple_attention_type_get_name(const PurpleAttentionType *type); 266 const char *purple_attention_type_get_name(const PurpleAttentionType *type);
267 267
268 /** 268 /**
269 * Get the attention type's description shown when the event is received. 269 * Get the attention type's description shown when the event is received.
270 * 270 *
271 * @param type The attention type. 271 * @type: The attention type.
272 * @return The description. 272 * Returns: The description.
273 */ 273 */
274 const char *purple_attention_type_get_incoming_desc(const PurpleAttentionType *type); 274 const char *purple_attention_type_get_incoming_desc(const PurpleAttentionType *type);
275 275
276 /** 276 /**
277 * Get the attention type's description shown when the event is sent. 277 * Get the attention type's description shown when the event is sent.
278 * 278 *
279 * @param type The attention type. 279 * @type: The attention type.
280 * @return The description. 280 * Returns: The description.
281 */ 281 */
282 const char *purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type); 282 const char *purple_attention_type_get_outgoing_desc(const PurpleAttentionType *type);
283 283
284 /** 284 /**
285 * Get the attention type's icon name. 285 * Get the attention type's icon name.
286 * 286 *
287 * @param type The attention type. 287 * @type: The attention type.
288 * @return The icon name or @c NULL if unset/empty. 288 * Returns: The icon name or @c NULL if unset/empty.
289 * @note Icons are optional for attention events. 289 * @note Icons are optional for attention events.
290 */ 290 */
291 const char *purple_attention_type_get_icon_name(const PurpleAttentionType *type); 291 const char *purple_attention_type_get_icon_name(const PurpleAttentionType *type);
292 292
293 /** 293 /**
294 * Get the attention type's unlocalized name; this is useful for some UIs. 294 * Get the attention type's unlocalized name; this is useful for some UIs.
295 * 295 *
296 * @param type The attention type 296 * @type: The attention type
297 * @return The unlocalized name. 297 * Returns: The unlocalized name.
298 */ 298 */
299 const char *purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type); 299 const char *purple_attention_type_get_unlocalized_name(const PurpleAttentionType *type);
300 300
301 /*@}*/ 301 /*@}*/
302 302
312 312
313 /** 313 /**
314 * Allocates and returns a new PurpleProtocolAction. Use this to add actions in 314 * Allocates and returns a new PurpleProtocolAction. Use this to add actions in
315 * a list in the get_actions function of the protocol. 315 * a list in the get_actions function of the protocol.
316 * 316 *
317 * @param label The description of the action to show to the user. 317 * @label: The description of the action to show to the user.
318 * @param callback The callback to call when the user selects this action. 318 * @callback: The callback to call when the user selects this action.
319 */ 319 */
320 PurpleProtocolAction *purple_protocol_action_new(const char* label, 320 PurpleProtocolAction *purple_protocol_action_new(const char* label,
321 PurpleProtocolActionCallback callback); 321 PurpleProtocolActionCallback callback);
322 322
323 /** 323 /**
324 * Frees a PurpleProtocolAction 324 * Frees a PurpleProtocolAction
325 * 325 *
326 * @param action The PurpleProtocolAction to free. 326 * @action: The PurpleProtocolAction to free.
327 */ 327 */
328 void purple_protocol_action_free(PurpleProtocolAction *action); 328 void purple_protocol_action_free(PurpleProtocolAction *action);
329 329
330 /*@}*/ 330 /*@}*/
331 331
349 /** 349 /**
350 * Notifies Purple that our account's idle state and time have changed. 350 * Notifies Purple that our account's idle state and time have changed.
351 * 351 *
352 * This is meant to be called from protocols. 352 * This is meant to be called from protocols.
353 * 353 *
354 * @param account The account. 354 * @account: The account.
355 * @param idle The user's idle state. 355 * @idle: The user's idle state.
356 * @param idle_time The user's idle time. 356 * @idle_time: The user's idle time.
357 */ 357 */
358 void purple_protocol_got_account_idle(PurpleAccount *account, gboolean idle, 358 void purple_protocol_got_account_idle(PurpleAccount *account, gboolean idle,
359 time_t idle_time); 359 time_t idle_time);
360 360
361 /** 361 /**
362 * Notifies Purple of our account's log-in time. 362 * Notifies Purple of our account's log-in time.
363 * 363 *
364 * This is meant to be called from protocols. 364 * This is meant to be called from protocols.
365 * 365 *
366 * @param account The account the user is on. 366 * @account: The account the user is on.
367 * @param login_time The user's log-in time. 367 * @login_time: The user's log-in time.
368 */ 368 */
369 void purple_protocol_got_account_login_time(PurpleAccount *account, 369 void purple_protocol_got_account_login_time(PurpleAccount *account,
370 time_t login_time); 370 time_t login_time);
371 371
372 /** 372 /**
373 * Notifies Purple that our account's status has changed. 373 * Notifies Purple that our account's status has changed.
374 * 374 *
375 * This is meant to be called from protocols. 375 * This is meant to be called from protocols.
376 * 376 *
377 * @param account The account the user is on. 377 * @account: The account the user is on.
378 * @param status_id The status ID. 378 * @status_id: The status ID.
379 * @param ... A NULL-terminated list of attribute IDs and values, 379 * @...: A NULL-terminated list of attribute IDs and values,
380 * beginning with the value for @a attr_id. 380 * beginning with the value for @a attr_id.
381 */ 381 */
382 void purple_protocol_got_account_status(PurpleAccount *account, 382 void purple_protocol_got_account_status(PurpleAccount *account,
383 const char *status_id, ...) 383 const char *status_id, ...)
384 G_GNUC_NULL_TERMINATED; 384 G_GNUC_NULL_TERMINATED;
388 * called after the initial connection. Emits the account-actions-changed 388 * called after the initial connection. Emits the account-actions-changed
389 * signal. 389 * signal.
390 * 390 *
391 * This is meant to be called from protocols. 391 * This is meant to be called from protocols.
392 * 392 *
393 * @param account The account. 393 * @account: The account.
394 * 394 *
395 * @see account-actions-changed 395 * @see account-actions-changed
396 */ 396 */
397 void purple_protocol_got_account_actions(PurpleAccount *account); 397 void purple_protocol_got_account_actions(PurpleAccount *account);
398 398
399 /** 399 /**
400 * Notifies Purple that a buddy's idle state and time have changed. 400 * Notifies Purple that a buddy's idle state and time have changed.
401 * 401 *
402 * This is meant to be called from protocols. 402 * This is meant to be called from protocols.
403 * 403 *
404 * @param account The account the user is on. 404 * @account: The account the user is on.
405 * @param name The name of the buddy. 405 * @name: The name of the buddy.
406 * @param idle The user's idle state. 406 * @idle: The user's idle state.
407 * @param idle_time The user's idle time. This is the time at 407 * @idle_time: The user's idle time. This is the time at
408 * which the user became idle, in seconds since 408 * which the user became idle, in seconds since
409 * the epoch. If the protocol does not know this value 409 * the epoch. If the protocol does not know this value
410 * then it should pass 0. 410 * then it should pass 0.
411 */ 411 */
412 void purple_protocol_got_user_idle(PurpleAccount *account, const char *name, 412 void purple_protocol_got_user_idle(PurpleAccount *account, const char *name,
415 /** 415 /**
416 * Notifies Purple of a buddy's log-in time. 416 * Notifies Purple of a buddy's log-in time.
417 * 417 *
418 * This is meant to be called from protocols. 418 * This is meant to be called from protocols.
419 * 419 *
420 * @param account The account the user is on. 420 * @account: The account the user is on.
421 * @param name The name of the buddy. 421 * @name: The name of the buddy.
422 * @param login_time The user's log-in time. 422 * @login_time: The user's log-in time.
423 */ 423 */
424 void purple_protocol_got_user_login_time(PurpleAccount *account, 424 void purple_protocol_got_user_login_time(PurpleAccount *account,
425 const char *name, time_t login_time); 425 const char *name, time_t login_time);
426 426
427 /** 427 /**
428 * Notifies Purple that a buddy's status has been activated. 428 * Notifies Purple that a buddy's status has been activated.
429 * 429 *
430 * This is meant to be called from protocols. 430 * This is meant to be called from protocols.
431 * 431 *
432 * @param account The account the user is on. 432 * @account: The account the user is on.
433 * @param name The name of the buddy. 433 * @name: The name of the buddy.
434 * @param status_id The status ID. 434 * @status_id: The status ID.
435 * @param ... A NULL-terminated list of attribute IDs and values, 435 * @...: A NULL-terminated list of attribute IDs and values,
436 * beginning with the value for @a attr_id. 436 * beginning with the value for @a attr_id.
437 */ 437 */
438 void purple_protocol_got_user_status(PurpleAccount *account, const char *name, 438 void purple_protocol_got_user_status(PurpleAccount *account, const char *name,
439 const char *status_id, ...) 439 const char *status_id, ...)
440 G_GNUC_NULL_TERMINATED; 440 G_GNUC_NULL_TERMINATED;
442 /** 442 /**
443 * Notifies libpurple that a buddy's status has been deactivated 443 * Notifies libpurple that a buddy's status has been deactivated
444 * 444 *
445 * This is meant to be called from protocols. 445 * This is meant to be called from protocols.
446 * 446 *
447 * @param account The account the user is on. 447 * @account: The account the user is on.
448 * @param name The name of the buddy. 448 * @name: The name of the buddy.
449 * @param status_id The status ID. 449 * @status_id: The status ID.
450 */ 450 */
451 void purple_protocol_got_user_status_deactive(PurpleAccount *account, 451 void purple_protocol_got_user_status_deactive(PurpleAccount *account,
452 const char *name, 452 const char *name,
453 const char *status_id); 453 const char *status_id);
454 454
455 /** 455 /**
456 * Informs the server that our account's status changed. 456 * Informs the server that our account's status changed.
457 * 457 *
458 * @param account The account the user is on. 458 * @account: The account the user is on.
459 * @param old_status The previous status. 459 * @old_status: The previous status.
460 * @param new_status The status that was activated, or deactivated 460 * @new_status: The status that was activated, or deactivated
461 * (in the case of independent statuses). 461 * (in the case of independent statuses).
462 */ 462 */
463 void purple_protocol_change_account_status(PurpleAccount *account, 463 void purple_protocol_change_account_status(PurpleAccount *account,
464 PurpleStatus *old_status, 464 PurpleStatus *old_status,
465 PurpleStatus *new_status); 465 PurpleStatus *new_status);
466 466
467 /** 467 /**
468 * Retrieves the list of stock status types from a protocol. 468 * Retrieves the list of stock status types from a protocol.
469 * 469 *
470 * @param account The account the user is on. 470 * @account: The account the user is on.
471 * @param presence The presence for which we're going to get statuses 471 * @presence: The presence for which we're going to get statuses
472 * 472 *
473 * @return List of statuses 473 * Returns: List of statuses
474 */ 474 */
475 GList *purple_protocol_get_statuses(PurpleAccount *account, 475 GList *purple_protocol_get_statuses(PurpleAccount *account,
476 PurplePresence *presence); 476 PurplePresence *presence);
477 477
478 /** 478 /**
479 * Send an attention request message. 479 * Send an attention request message.
480 * 480 *
481 * @param gc The connection to send the message on. 481 * @gc: The connection to send the message on.
482 * @param who Whose attention to request. 482 * @who: Whose attention to request.
483 * @param type_code An index into the protocol's attention_types list 483 * @type_code: An index into the protocol's attention_types list
484 * determining the type of the attention request command to 484 * determining the type of the attention request command to
485 * send. 0 if protocol only defines one (for example, Yahoo and 485 * send. 0 if protocol only defines one (for example, Yahoo and
486 * MSN), but some protocols define more (MySpaceIM). 486 * MSN), but some protocols define more (MySpaceIM).
487 * 487 *
488 * Note that you can't send arbitrary PurpleAttentionType's, because there is 488 * Note that you can't send arbitrary PurpleAttentionType's, because there is
492 guint type_code); 492 guint type_code);
493 493
494 /** 494 /**
495 * Process an incoming attention message. 495 * Process an incoming attention message.
496 * 496 *
497 * @param gc The connection that received the attention message. 497 * @gc: The connection that received the attention message.
498 * @param who Who requested your attention. 498 * @who: Who requested your attention.
499 * @param type_code An index into the protocol's attention_types list 499 * @type_code: An index into the protocol's attention_types list
500 * determining the type of the attention request command to 500 * determining the type of the attention request command to
501 * send. 501 * send.
502 */ 502 */
503 void purple_protocol_got_attention(PurpleConnection *gc, const char *who, 503 void purple_protocol_got_attention(PurpleConnection *gc, const char *who,
504 guint type_code); 504 guint type_code);
505 505
506 /** 506 /**
507 * Process an incoming attention message in a chat. 507 * Process an incoming attention message in a chat.
508 * 508 *
509 * @param gc The connection that received the attention message. 509 * @gc: The connection that received the attention message.
510 * @param id The chat id. 510 * @id: The chat id.
511 * @param who Who requested your attention. 511 * @who: Who requested your attention.
512 * @param type_code An index into the protocol's attention_types list 512 * @type_code: An index into the protocol's attention_types list
513 * determining the type of the attention request command to 513 * determining the type of the attention request command to
514 * send. 514 * send.
515 */ 515 */
516 void purple_protocol_got_attention_in_chat(PurpleConnection *gc, int id, 516 void purple_protocol_got_attention_in_chat(PurpleConnection *gc, int id,
517 const char *who, guint type_code); 517 const char *who, guint type_code);
518 518
519 /** 519 /**
520 * Determines if the contact supports the given media session type. 520 * Determines if the contact supports the given media session type.
521 * 521 *
522 * @param account The account the user is on. 522 * @account: The account the user is on.
523 * @param who The name of the contact to check capabilities for. 523 * @who: The name of the contact to check capabilities for.
524 * 524 *
525 * @return The media caps the contact supports. 525 * Returns: The media caps the contact supports.
526 */ 526 */
527 PurpleMediaCaps purple_protocol_get_media_caps(PurpleAccount *account, 527 PurpleMediaCaps purple_protocol_get_media_caps(PurpleAccount *account,
528 const char *who); 528 const char *who);
529 529
530 /** 530 /**
531 * Initiates a media session with the given contact. 531 * Initiates a media session with the given contact.
532 * 532 *
533 * @param account The account the user is on. 533 * @account: The account the user is on.
534 * @param who The name of the contact to start a session with. 534 * @who: The name of the contact to start a session with.
535 * @param type The type of media session to start. 535 * @type: The type of media session to start.
536 * 536 *
537 * @return TRUE if the call succeeded else FALSE. (Doesn't imply the media 537 * Returns: TRUE if the call succeeded else FALSE. (Doesn't imply the media
538 * session or stream will be successfully created) 538 * session or stream will be successfully created)
539 */ 539 */
540 gboolean purple_protocol_initiate_media(PurpleAccount *account, 540 gboolean purple_protocol_initiate_media(PurpleAccount *account,
541 const char *who, 541 const char *who,
542 PurpleMediaSessionType type); 542 PurpleMediaSessionType type);
544 /** 544 /**
545 * Signals that the protocol received capabilities for the given contact. 545 * Signals that the protocol received capabilities for the given contact.
546 * 546 *
547 * This function is intended to be used only by protocols. 547 * This function is intended to be used only by protocols.
548 * 548 *
549 * @param account The account the user is on. 549 * @account: The account the user is on.
550 * @param who The name of the contact for which capabilities have been received. 550 * @who: The name of the contact for which capabilities have been received.
551 */ 551 */
552 void purple_protocol_got_media_caps(PurpleAccount *account, const char *who); 552 void purple_protocol_got_media_caps(PurpleAccount *account, const char *who);
553 553
554 /** 554 /**
555 * Gets the safe maximum message size in bytes for the protocol. 555 * Gets the safe maximum message size in bytes for the protocol.
556 * 556 *
557 * @see PurpleProtocol#get_max_message_size 557 * @see PurpleProtocol#get_max_message_size
558 * 558 *
559 * @param protocol The protocol to query. 559 * @protocol: The protocol to query.
560 * 560 *
561 * @return Maximum message size, 0 if unspecified, -1 for infinite. 561 * Returns: Maximum message size, 0 if unspecified, -1 for infinite.
562 */ 562 */
563 gssize 563 gssize
564 purple_protocol_get_max_message_size(PurpleProtocol *protocol); 564 purple_protocol_get_max_message_size(PurpleProtocol *protocol);
565 565
566 /*@}*/ 566 /*@}*/
571 /*@{*/ 571 /*@{*/
572 572
573 /** 573 /**
574 * Finds a protocol by ID. 574 * Finds a protocol by ID.
575 * 575 *
576 * @param id The protocol's ID. 576 * @id: The protocol's ID.
577 */ 577 */
578 PurpleProtocol *purple_protocols_find(const char *id); 578 PurpleProtocol *purple_protocols_find(const char *id);
579 579
580 /** 580 /**
581 * Adds a protocol to the list of protocols. 581 * Adds a protocol to the list of protocols.
582 * 582 *
583 * @param protocol_type The type of the protocol to add. 583 * @protocol_type: The type of the protocol to add.
584 * @param error Return location for a #GError or @c NULL. If provided, this 584 * @error: Return location for a #GError or @c NULL. If provided, this
585 * will be set to the reason if adding fails. 585 * will be set to the reason if adding fails.
586 * 586 *
587 * @return The protocol instance if the protocol was added, else @c NULL. 587 * Returns: The protocol instance if the protocol was added, else @c NULL.
588 */ 588 */
589 PurpleProtocol *purple_protocols_add(GType protocol_type, GError **error); 589 PurpleProtocol *purple_protocols_add(GType protocol_type, GError **error);
590 590
591 /** 591 /**
592 * Removes a protocol from the list of protocols. This will disconnect all 592 * Removes a protocol from the list of protocols. This will disconnect all
593 * connected accounts using this protocol, and free the protocol's user splits 593 * connected accounts using this protocol, and free the protocol's user splits
594 * and protocol options. 594 * and protocol options.
595 * 595 *
596 * @param protocol The protocol to remove. 596 * @protocol: The protocol to remove.
597 * @param error Return location for a #GError or @c NULL. If provided, this 597 * @error: Return location for a #GError or @c NULL. If provided, this
598 * will be set to the reason if removing fails. 598 * will be set to the reason if removing fails.
599 * 599 *
600 * @return TRUE if the protocol was removed, else FALSE. 600 * Returns: TRUE if the protocol was removed, else FALSE.
601 */ 601 */
602 gboolean purple_protocols_remove(PurpleProtocol *protocol, GError **error); 602 gboolean purple_protocols_remove(PurpleProtocol *protocol, GError **error);
603 603
604 /** 604 /**
605 * Returns a list of all loaded protocols. 605 * Returns a list of all loaded protocols.
606 * 606 *
607 * @return A list of all loaded protocols. The list is owned by the caller, and 607 * Returns: A list of all loaded protocols. The list is owned by the caller, and
608 * must be g_list_free()d to avoid leaking the nodes. 608 * must be g_list_free()d to avoid leaking the nodes.
609 */ 609 */
610 GList *purple_protocols_get_all(void); 610 GList *purple_protocols_get_all(void);
611 611
612 /*@}*/ 612 /*@}*/
622 void purple_protocols_init(void); 622 void purple_protocols_init(void);
623 623
624 /** 624 /**
625 * Returns the protocols subsystem handle. 625 * Returns the protocols subsystem handle.
626 * 626 *
627 * @return The protocols subsystem handle. 627 * Returns: The protocols subsystem handle.
628 */ 628 */
629 void *purple_protocols_get_handle(void); 629 void *purple_protocols_get_handle(void);
630 630
631 /** 631 /**
632 * Uninitializes the protocols subsystem. 632 * Uninitializes the protocols subsystem.

mercurial