struct t_infolist * irc_info_get_infolist_cb (void *data, const char *infolist_name, void *pointer, const char *arguments) { struct t_infolist *ptr_infolist; struct t_irc_server *ptr_server; struct t_irc_channel *ptr_channel; struct t_irc_nick *ptr_nick; struct t_irc_ignore *ptr_ignore; char **argv; int argc; /* make C compiler happy */ (void) data; if (!infolist_name || !infolist_name[0]) return NULL; if (weechat_strcasecmp (infolist_name, "irc_server") == 0) { if (pointer && !irc_server_valid (pointer)) return NULL; ptr_infolist = weechat_infolist_new (); if (ptr_infolist) { if (pointer) { /* build list with only one server */ if (!irc_server_add_to_infolist (ptr_infolist, pointer)) { weechat_infolist_free (ptr_infolist); return NULL; } return ptr_infolist; } else { /* build list with all servers matching arguments */ for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) { if (!arguments || !arguments[0] || weechat_string_match (ptr_server->name, arguments, 0)) { if (!irc_server_add_to_infolist (ptr_infolist, ptr_server)) { weechat_infolist_free (ptr_infolist); return NULL; } } } return ptr_infolist; } } } else if (weechat_strcasecmp (infolist_name, "irc_channel") == 0) { if (arguments && arguments[0]) { ptr_server = irc_server_search (arguments); if (ptr_server) { if (pointer && !irc_channel_valid (ptr_server, pointer)) return NULL; ptr_infolist = weechat_infolist_new (); if (ptr_infolist) { if (pointer) { /* build list with only one channel */ if (!irc_channel_add_to_infolist (ptr_infolist, pointer)) { weechat_infolist_free (ptr_infolist); return NULL; } return ptr_infolist; } else { /* build list with all channels of server */ for (ptr_channel = ptr_server->channels; ptr_channel; ptr_channel = ptr_channel->next_channel) { if (!irc_channel_add_to_infolist (ptr_infolist, ptr_channel)) { weechat_infolist_free (ptr_infolist); return NULL; } } return ptr_infolist; } } } } } else if (weechat_strcasecmp (infolist_name, "irc_nick") == 0) { if (arguments && arguments[0]) { ptr_server = NULL; ptr_channel = NULL; argv = weechat_string_split (arguments, ",", 0, 0, &argc); if (argv) { if (argc >= 2) { ptr_server = irc_server_search (argv[0]); if (!ptr_server) { weechat_string_free_split (argv); return NULL; } ptr_channel = irc_channel_search (ptr_server, argv[1]); if (!ptr_channel) { weechat_string_free_split (argv); return NULL; } if (!pointer && (argc >= 3)) { pointer = irc_nick_search (ptr_channel, argv[2]); if (!pointer) { weechat_string_free_split (argv); return NULL; } } } weechat_string_free_split (argv); if (ptr_server && ptr_channel) { if (pointer && !irc_nick_valid (ptr_channel, pointer)) return NULL; ptr_infolist = weechat_infolist_new (); if (ptr_infolist) { if (pointer) { /* build list with only one nick */ if (!irc_nick_add_to_infolist (ptr_infolist, pointer)) { weechat_infolist_free (ptr_infolist); return NULL; } return ptr_infolist; } else { /* build list with all nicks of channel */ for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick) { if (!irc_nick_add_to_infolist (ptr_infolist, ptr_nick)) { weechat_infolist_free (ptr_infolist); return NULL; } } return ptr_infolist; } } } } } } else if (weechat_strcasecmp (infolist_name, "irc_ignore") == 0) { if (pointer && !irc_ignore_valid (pointer)) return NULL; ptr_infolist = weechat_infolist_new (); if (ptr_infolist) { if (pointer) { /* build list with only one ignore */ if (!irc_ignore_add_to_infolist (ptr_infolist, pointer)) { weechat_infolist_free (ptr_infolist); return NULL; } return ptr_infolist; } else { /* build list with all ignore */ for (ptr_ignore = irc_ignore_list; ptr_ignore; ptr_ignore = ptr_ignore->next_ignore) { if (!irc_ignore_add_to_infolist (ptr_infolist, ptr_ignore)) { weechat_infolist_free (ptr_infolist); return NULL; } } return ptr_infolist; } } } return NULL; }
int irc_upgrade_save_all_data (struct t_upgrade_file *upgrade_file) { struct t_infolist *infolist; struct t_irc_server *ptr_server; struct t_irc_channel *ptr_channel; struct t_irc_nick *ptr_nick; struct t_irc_redirect *ptr_redirect; struct t_irc_redirect_pattern *ptr_redirect_pattern; struct t_irc_notify *ptr_notify; struct t_irc_raw_message *ptr_raw_message; int rc; for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server) { /* save server */ infolist = weechat_infolist_new (); if (!infolist) return 0; if (!irc_server_add_to_infolist (infolist, ptr_server)) { weechat_infolist_free (infolist); return 0; } rc = weechat_upgrade_write_object (upgrade_file, IRC_UPGRADE_TYPE_SERVER, infolist); weechat_infolist_free (infolist); if (!rc) return 0; /* save server channels and nicks */ for (ptr_channel = ptr_server->channels; ptr_channel; ptr_channel = ptr_channel->next_channel) { /* save channel */ infolist = weechat_infolist_new (); if (!infolist) return 0; if (!irc_channel_add_to_infolist (infolist, ptr_channel)) { weechat_infolist_free (infolist); return 0; } rc = weechat_upgrade_write_object (upgrade_file, IRC_UPGRADE_TYPE_CHANNEL, infolist); weechat_infolist_free (infolist); if (!rc) return 0; for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick) { /* save nick */ infolist = weechat_infolist_new (); if (!infolist) return 0; if (!irc_nick_add_to_infolist (infolist, ptr_nick)) { weechat_infolist_free (infolist); return 0; } rc = weechat_upgrade_write_object (upgrade_file, IRC_UPGRADE_TYPE_NICK, infolist); weechat_infolist_free (infolist); if (!rc) return 0; } } /* save server redirects */ for (ptr_redirect = ptr_server->redirects; ptr_redirect; ptr_redirect = ptr_redirect->next_redirect) { infolist = weechat_infolist_new (); if (!infolist) return 0; if (!irc_redirect_add_to_infolist (infolist, ptr_redirect)) { weechat_infolist_free (infolist); return 0; } rc = weechat_upgrade_write_object (upgrade_file, IRC_UPGRADE_TYPE_REDIRECT, infolist); weechat_infolist_free (infolist); if (!rc) return 0; } /* save server notify list */ for (ptr_notify = ptr_server->notify_list; ptr_notify; ptr_notify = ptr_notify->next_notify) { infolist = weechat_infolist_new (); if (!infolist) return 0; if (!irc_notify_add_to_infolist (infolist, ptr_notify)) { weechat_infolist_free (infolist); return 0; } rc = weechat_upgrade_write_object (upgrade_file, IRC_UPGRADE_TYPE_NOTIFY, infolist); weechat_infolist_free (infolist); if (!rc) return 0; } } /* save raw messages */ for (ptr_raw_message = irc_raw_messages; ptr_raw_message; ptr_raw_message = ptr_raw_message->next_message) { infolist = weechat_infolist_new (); if (!infolist) return 0; if (!irc_raw_add_to_infolist (infolist, ptr_raw_message)) { weechat_infolist_free (infolist); return 0; } rc = weechat_upgrade_write_object (upgrade_file, IRC_UPGRADE_TYPE_RAW_MESSAGE, infolist); weechat_infolist_free (infolist); if (!rc) return 0; } /* save redirect patterns */ for (ptr_redirect_pattern = irc_redirect_patterns; ptr_redirect_pattern; ptr_redirect_pattern = ptr_redirect_pattern->next_redirect) { /* save only temporary patterns (created by other plugins/scripts) */ if (ptr_redirect_pattern->temp_pattern) { infolist = weechat_infolist_new (); if (!infolist) return 0; if (!irc_redirect_pattern_add_to_infolist (infolist, ptr_redirect_pattern)) { weechat_infolist_free (infolist); return 0; } rc = weechat_upgrade_write_object (upgrade_file, IRC_UPGRADE_TYPE_REDIRECT_PATTERN, infolist); weechat_infolist_free (infolist); if (!rc) return 0; } } return 1; }
struct t_infolist * irc_info_infolist_irc_channel_cb (void *data, const char *infolist_name, void *pointer, const char *arguments) { struct t_infolist *ptr_infolist; struct t_irc_server *ptr_server; struct t_irc_channel *ptr_channel; char **argv; int argc; /* make C compiler happy */ (void) data; (void) infolist_name; if (!arguments || !arguments[0]) return NULL; ptr_server = NULL; ptr_channel = NULL; argv = dogechat_string_split (arguments, ",", 0, 0, &argc); if (!argv) return NULL; if (argc >= 1) { ptr_server = irc_server_search (argv[0]); if (!ptr_server) { dogechat_string_free_split (argv); return NULL; } if (!pointer && (argc >= 2)) { pointer = irc_channel_search (ptr_server, argv[1]); if (!pointer) { dogechat_string_free_split (argv); return NULL; } } } dogechat_string_free_split (argv); if (!ptr_server) return NULL; if (pointer && !irc_channel_valid (ptr_server, pointer)) return NULL; ptr_infolist = dogechat_infolist_new (); if (!ptr_infolist) return NULL; if (pointer) { /* build list with only one channel */ if (!irc_channel_add_to_infolist (ptr_infolist, pointer)) { dogechat_infolist_free (ptr_infolist); return NULL; } return ptr_infolist; } else { /* build list with all channels of server */ for (ptr_channel = ptr_server->channels; ptr_channel; ptr_channel = ptr_channel->next_channel) { if (!irc_channel_add_to_infolist (ptr_infolist, ptr_channel)) { dogechat_infolist_free (ptr_infolist); return NULL; } } return ptr_infolist; } return NULL; }