Ejemplo n.º 1
0
void
upgrade_weechat_read_hotlist (struct t_infolist *infolist)
{
    const char *plugin_name, *buffer_name;
    char option_name[64];
    struct t_gui_buffer *ptr_buffer;
    struct t_gui_hotlist *new_hotlist;
    struct timeval creation_time;
    void *buf;
    int i, size;

    if (!hotlist_reset)
    {
        gui_hotlist_clear ();
        hotlist_reset = 1;
    }
    plugin_name = infolist_string (infolist, "plugin_name");
    buffer_name = infolist_string (infolist, "buffer_name");
    if (plugin_name && buffer_name)
    {
        ptr_buffer = gui_buffer_search_by_name (plugin_name,
                                                buffer_name);
        if (ptr_buffer)
        {
            buf = infolist_buffer (infolist, "creation_time", &size);
            if (buf)
            {
                memcpy (&creation_time, buf, size);
                new_hotlist = gui_hotlist_add (ptr_buffer,
                                               infolist_integer (infolist, "priority"),
                                               &creation_time);
                if (new_hotlist)
                {
                    for (i = 0; i < GUI_HOTLIST_NUM_PRIORITIES; i++)
                    {
                        snprintf (option_name, sizeof (option_name),
                                  "count_%02d", i);
                        new_hotlist->count[i] = infolist_integer (infolist,
                                                                  option_name);
                    }
                }
            }
        }
    }
}
Ejemplo n.º 2
0
struct t_gui_line *
gui_line_add (struct t_gui_buffer *buffer, time_t date,
              time_t date_printed, const char *tags,
              const char *prefix, const char *message)
{
    struct t_gui_line *new_line;
    struct t_gui_line_data *new_line_data;
    struct t_gui_window *ptr_win;
    char *message_for_signal;
    const char *nick;
    int notify_level, *max_notify_level, lines_removed;
    time_t current_time;

    /*
     * remove line(s) if necessary, according to history options:
     *   max_lines:   if > 0, keep only N lines in buffer
     *   max_minutes: if > 0, keep only lines from last N minutes
     */
    lines_removed = 0;
    current_time = time (NULL);
    while (buffer->own_lines->first_line
           && (((CONFIG_INTEGER(config_history_max_buffer_lines_number) > 0)
                && (buffer->own_lines->lines_count + 1 >
                    CONFIG_INTEGER(config_history_max_buffer_lines_number)))
               || ((CONFIG_INTEGER(config_history_max_buffer_lines_minutes) > 0)
                   && (current_time - buffer->own_lines->first_line->data->date_printed >
                       CONFIG_INTEGER(config_history_max_buffer_lines_minutes) * 60))))
    {
        gui_line_free (buffer, buffer->own_lines->first_line);
        lines_removed++;
    }

    /* create new line */
    new_line = malloc (sizeof (*new_line));
    if (!new_line)
    {
        log_printf (_("Not enough memory for new line"));
        return NULL;
    }

    /* create data for line */
    new_line_data = malloc (sizeof (*(new_line->data)));
    if (!new_line_data)
    {
        free (new_line);
        log_printf (_("Not enough memory for new line"));
        return NULL;
    }
    new_line->data = new_line_data;

    /* fill data in new line */
    new_line->data->buffer = buffer;
    new_line->data->y = -1;
    new_line->data->date = date;
    new_line->data->date_printed = date_printed;
    new_line->data->str_time = gui_chat_get_time_string (date);
    gui_line_tags_alloc (new_line->data, tags);
    new_line->data->refresh_needed = 0;
    new_line->data->prefix = (prefix) ?
        (char *)string_shared_get (prefix) : ((date != 0) ? (char *)string_shared_get ("") : NULL);
    new_line->data->prefix_length = (prefix) ?
        gui_chat_strlen_screen (prefix) : 0;
    new_line->data->message = (message) ? strdup (message) : strdup ("");

    /* get notify level and max notify level for nick in buffer */
    notify_level = gui_line_get_notify_level (new_line);
    max_notify_level = NULL;
    nick = gui_line_get_nick_tag (new_line);
    if (nick)
        max_notify_level = hashtable_get (buffer->hotlist_max_level_nicks, nick);
    if (max_notify_level
        && (*max_notify_level < notify_level))
        notify_level = *max_notify_level;

    if (notify_level == GUI_HOTLIST_HIGHLIGHT)
        new_line->data->highlight = 1;
    else if (max_notify_level && (*max_notify_level < GUI_HOTLIST_HIGHLIGHT))
        new_line->data->highlight = 0;
    else
        new_line->data->highlight = gui_line_has_highlight (new_line);

    /* check if line is filtered or not */
    new_line->data->displayed = gui_filter_check_line (new_line->data);

    /* add line to lines list */
    gui_line_add_to_list (buffer->own_lines, new_line);

    /* update hotlist and/or send signals for line */
    if (new_line->data->displayed)
    {
        if (new_line->data->highlight)
        {
            (void) gui_hotlist_add (buffer, GUI_HOTLIST_HIGHLIGHT, NULL);
            if (!weechat_upgrading)
            {
                message_for_signal = gui_chat_build_string_prefix_message (new_line);
                if (message_for_signal)
                {
                    hook_signal_send ("weechat_highlight",
                                      WEECHAT_HOOK_SIGNAL_STRING,
                                      message_for_signal);
                    free (message_for_signal);
                }
            }
        }
        else
        {
            if (!weechat_upgrading && (notify_level == GUI_HOTLIST_PRIVATE))
            {
                message_for_signal = gui_chat_build_string_prefix_message (new_line);
                if (message_for_signal)
                {
                    hook_signal_send ("weechat_pv",
                                      WEECHAT_HOOK_SIGNAL_STRING,
                                      message_for_signal);
                    free (message_for_signal);
                }
            }
            if (notify_level >= GUI_HOTLIST_MIN)
                (void) gui_hotlist_add (buffer, notify_level, NULL);
        }
    }
    else
    {
        buffer->own_lines->lines_hidden++;
        if (buffer->mixed_lines)
            buffer->mixed_lines->lines_hidden++;
        hook_signal_send ("buffer_lines_hidden",
                          WEECHAT_HOOK_SIGNAL_POINTER, buffer);
    }

    /* add mixed line, if buffer is attached to at least one other buffer */
    if (buffer->mixed_lines)
    {
        gui_line_mixed_add (buffer->mixed_lines, new_line->data);
    }

    /*
     * if some lines were removed, force a full refresh if at least one window
     * is displaying buffer and that number of lines in buffer is lower than
     * window height
     */
    if (lines_removed > 0)
    {
        for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
        {
            if ((ptr_win->buffer == buffer)
                && (buffer->own_lines->lines_count < ptr_win->win_chat_height))
            {
                gui_buffer_ask_chat_refresh (buffer, 2);
                break;
            }
        }
    }

    hook_signal_send ("buffer_line_added",
                      WEECHAT_HOOK_SIGNAL_POINTER, new_line);

    return new_line;
}
Ejemplo n.º 3
0
int
upgrade_weechat_read_cb (void *data,
                         struct t_upgrade_file *upgrade_file,
                         int object_id,
                         struct t_infolist *infolist)
{
    const char *key, *var_name, *type, *name, *group_name, *plugin_name;
    const char *buffer_name;
    char option_name[64], *option_key, *option_var;
    struct t_gui_nick_group *ptr_group;
    struct t_gui_buffer *ptr_buffer;
    struct t_gui_line *new_line;
    struct t_gui_hotlist *new_hotlist;
    struct timeval creation_time;
    void *buf;
    int i, size, index, length;

    /* make C compiler happy */
    (void) data;
    (void) upgrade_file;

    infolist_reset_item_cursor (infolist);
    while (infolist_next (infolist))
    {
        switch (object_id)
        {
            case UPGRADE_WEECHAT_TYPE_HISTORY:
                if (upgrade_current_buffer)
                {
                    gui_history_buffer_add (upgrade_current_buffer,
                                            infolist_string (infolist, "text"));
                }
                else
                {
                    gui_history_global_add (infolist_string (infolist, "text"));
                }
                break;
            case UPGRADE_WEECHAT_TYPE_BUFFER:
                plugin_name = infolist_string (infolist, "plugin_name");
                name = infolist_string (infolist, "name");
                gui_layout_buffer_add (&upgrade_layout_buffers,
                                       &last_upgrade_layout_buffer,
                                       plugin_name, name,
                                       infolist_integer (infolist, "number"));
                if (gui_buffer_is_main (plugin_name, name))
                {
                    /* use WeeChat main buffer */
                    upgrade_current_buffer = gui_buffers;
                }
                else
                {
                    /*
                     * create buffer if it was created by a plugin (ie not
                     * WeeChat main buffer)
                     */
                    upgrade_current_buffer = gui_buffer_new (
                        NULL,
                        infolist_string (infolist, "name"),
                        NULL, NULL,
                        NULL, NULL);
                    if (upgrade_current_buffer)
                    {
                        if (infolist_integer (infolist, "current_buffer"))
                            upgrade_set_current_buffer = upgrade_current_buffer;
                        upgrade_current_buffer->plugin_name_for_upgrade =
                            strdup (infolist_string (infolist, "plugin_name"));
                        gui_buffer_build_full_name (upgrade_current_buffer);
                        upgrade_current_buffer->short_name =
                            (infolist_string (infolist, "short_name")) ?
                            strdup (infolist_string (infolist, "short_name")) : NULL;
                        upgrade_current_buffer->type =
                            infolist_integer (infolist, "type");
                        upgrade_current_buffer->notify =
                            infolist_integer (infolist, "notify");
                        upgrade_current_buffer->nicklist_case_sensitive =
                            infolist_integer (infolist, "nicklist_case_sensitive");
                        upgrade_current_buffer->nicklist_display_groups =
                            infolist_integer (infolist, "nicklist_display_groups");
                        upgrade_current_buffer->title =
                            (infolist_string (infolist, "title")) ?
                            strdup (infolist_string (infolist, "title")) : NULL;
                        upgrade_current_buffer->lines->first_line_not_read =
                            infolist_integer (infolist, "first_line_not_read");
                        upgrade_current_buffer->time_for_each_line =
                            infolist_integer (infolist, "time_for_each_line");
                        upgrade_current_buffer->input =
                            infolist_integer (infolist, "input");
                        upgrade_current_buffer->input_get_unknown_commands =
                            infolist_integer (infolist, "input_get_unknown_commands");
                        if (infolist_integer (infolist, "input_buffer_alloc") > 0)
                        {
                            upgrade_current_buffer->input_buffer =
                                malloc (infolist_integer (infolist, "input_buffer_alloc"));
                            if (upgrade_current_buffer->input_buffer)
                            {
                                upgrade_current_buffer->input_buffer_size =
                                    infolist_integer (infolist, "input_buffer_size");
                                upgrade_current_buffer->input_buffer_length =
                                    infolist_integer (infolist, "input_buffer_length");
                                upgrade_current_buffer->input_buffer_pos =
                                    infolist_integer (infolist, "input_buffer_pos");
                                upgrade_current_buffer->input_buffer_1st_display =
                                    infolist_integer (infolist, "input_buffer_1st_display");
                                if (infolist_string (infolist, "input_buffer"))
                                    strcpy (upgrade_current_buffer->input_buffer,
                                            infolist_string (infolist, "input_buffer"));
                                else
                                    upgrade_current_buffer->input_buffer[0] = '\0';
                            }
                        }
                        upgrade_current_buffer->text_search =
                            infolist_integer (infolist, "text_search");
                        upgrade_current_buffer->text_search_exact =
                            infolist_integer (infolist, "text_search_exact");
                        upgrade_current_buffer->text_search_found =
                            infolist_integer (infolist, "text_search_found");
                        if (infolist_string (infolist, "text_search_input"))
                            upgrade_current_buffer->text_search_input =
                                strdup (infolist_string (infolist, "text_search_input"));
                        gui_buffer_set_highlight_words (upgrade_current_buffer,
                                                        infolist_string (infolist, "highlight_words"));
                        gui_buffer_set_highlight_regex (upgrade_current_buffer,
                                                        infolist_string (infolist, "highlight_regex"));
                        gui_buffer_set_highlight_tags (upgrade_current_buffer,
                                                       infolist_string (infolist, "highlight_tags"));
                        gui_buffer_set_hotlist_max_level_nicks (upgrade_current_buffer,
                                                                infolist_string (infolist, "hotlist_max_level_nicks"));
                        index = 0;
                        while (1)
                        {
                            snprintf (option_name, sizeof (option_name),
                                      "key_%05d", index);
                            key = infolist_string (infolist, option_name);
                            if (!key)
                                break;
                            length = 16 + strlen (key) + 1;
                            option_key = malloc (length);
                            if (option_key)
                            {
                                snprintf (option_key, length, "key_bind_%s", key);
                                snprintf (option_name, sizeof (option_name),
                                          "key_command_%05d", index);
                                gui_buffer_set (upgrade_current_buffer,
                                                option_key,
                                                infolist_string (infolist, option_name));
                                free (option_key);
                            }
                            index++;
                        }
                        index = 0;
                        while (1)
                        {
                            snprintf (option_name, sizeof (option_name),
                                      "localvar_name_%05d", index);
                            var_name = infolist_string (infolist, option_name);
                            if (!var_name)
                                break;
                            length = 32 + strlen (var_name) + 1;
                            option_var = malloc (length);
                            if (option_var)
                            {
                                snprintf (option_var, length, "localvar_set_%s", var_name);
                                snprintf (option_name, sizeof (option_name),
                                          "localvar_value_%05d", index);
                                gui_buffer_set (upgrade_current_buffer,
                                                option_var,
                                                infolist_string (infolist, option_name));
                                free (option_var);
                            }
                            index++;
                        }
                    }
                }
                break;
            case UPGRADE_WEECHAT_TYPE_BUFFER_LINE:
                /* add line to current buffer */
                if (upgrade_current_buffer)
                {
                    switch (upgrade_current_buffer->type)
                    {
                        case GUI_BUFFER_TYPE_FORMATTED:
                            new_line = gui_line_add (
                                upgrade_current_buffer,
                                infolist_time (infolist, "date"),
                                infolist_time (infolist, "date_printed"),
                                infolist_string (infolist, "tags"),
                                infolist_string (infolist, "prefix"),
                                infolist_string (infolist, "message"));
                            if (new_line)
                            {
                                new_line->data->highlight = infolist_integer (infolist, "highlight");
                                if (infolist_integer (infolist, "last_read_line"))
                                    upgrade_current_buffer->lines->last_read_line = new_line;
                            }
                            break;
                        case GUI_BUFFER_TYPE_FREE:
                            gui_line_add_y (
                                upgrade_current_buffer,
                                infolist_integer (infolist, "y"),
                                infolist_string (infolist, "message"));
                            break;
                        case GUI_BUFFER_NUM_TYPES:
                            break;
                    }
                }
                break;
            case UPGRADE_WEECHAT_TYPE_NICKLIST:
                if (upgrade_current_buffer)
                {
                    upgrade_current_buffer->nicklist = 1;
                    ptr_group = NULL;
                    type = infolist_string (infolist, "type");
                    if (type)
                    {
                        if (strcmp (type, "group") == 0)
                        {
                            name = infolist_string (infolist, "name");
                            if (name && (strcmp (name, "root") != 0))
                            {
                                group_name = infolist_string (infolist, "parent_name");
                                if (group_name)
                                    ptr_group = gui_nicklist_search_group (upgrade_current_buffer,
                                                                           NULL,
                                                                           group_name);
                                gui_nicklist_add_group (
                                    upgrade_current_buffer,
                                    ptr_group,
                                    name,
                                    infolist_string (infolist, "color"),
                                    infolist_integer (infolist, "visible"));
                            }
                        }
                        else if (strcmp (type, "nick") == 0)
                        {
                            group_name = infolist_string (infolist, "group_name");
                            if (group_name)
                                ptr_group = gui_nicklist_search_group (upgrade_current_buffer,
                                                                       NULL,
                                                                       group_name);
                            gui_nicklist_add_nick (
                                upgrade_current_buffer,
                                ptr_group,
                                infolist_string (infolist, "name"),
                                infolist_string (infolist, "color"),
                                infolist_string (infolist, "prefix"),
                                infolist_string (infolist, "prefix_color"),
                                infolist_integer (infolist, "visible"));
                        }
                    }
                }
                break;
            case UPGRADE_WEECHAT_TYPE_MISC:
                weechat_first_start_time = infolist_time (infolist, "start_time");
                weechat_upgrade_count = infolist_integer (infolist, "upgrade_count");
                upgrade_set_current_window = infolist_integer (infolist, "current_window_number");
                break;
            case UPGRADE_WEECHAT_TYPE_HOTLIST:
                if (!hotlist_reset)
                {
                    gui_hotlist_clear ();
                    hotlist_reset = 1;
                }
                plugin_name = infolist_string (infolist, "plugin_name");
                buffer_name = infolist_string (infolist, "buffer_name");
                if (plugin_name && buffer_name)
                {
                    ptr_buffer = gui_buffer_search_by_name (plugin_name,
                                                            buffer_name);
                    if (ptr_buffer)
                    {
                        buf = infolist_buffer (infolist, "creation_time", &size);
                        if (buf)
                        {
                            memcpy (&creation_time, buf, size);
                            new_hotlist = gui_hotlist_add (ptr_buffer,
                                                           infolist_integer (infolist, "priority"),
                                                           &creation_time);
                            if (new_hotlist)
                            {
                                for (i = 0; i < GUI_HOTLIST_NUM_PRIORITIES; i++)
                                {
                                    snprintf (option_name, sizeof (option_name),
                                              "count_%02d", i);
                                    new_hotlist->count[i] = infolist_integer (infolist,
                                                                              option_name);
                                }
                            }
                        }
                    }
                }
                break;
            case UPGRADE_WEECHAT_TYPE_LAYOUT_WINDOW:
                gui_layout_window_add (&upgrade_layout_windows,
                                       infolist_integer (infolist, "internal_id"),
                                       gui_layout_window_search_by_id (upgrade_layout_windows,
                                                                       infolist_integer (infolist, "parent_id")),
                                       infolist_integer (infolist, "split_pct"),
                                       infolist_integer (infolist, "split_horiz"),
                                       infolist_string (infolist, "plugin_name"),
                                       infolist_string (infolist, "buffer_name"));
                break;
        }
    }

    return WEECHAT_RC_OK;
}