mcabber/src/roster.c
author mikael
Fri, 29 Apr 2005 19:56:28 +0000
changeset 147 7571de4aed73
parent 141 6533a231a65e
child 148 c3624b2a7059
permissions -rw-r--r--
[/trunk] Changeset 159 by mikael * Fix a bug in buddylist_build() * We now lock the current buddy even not when being in chat mode. For example, if we're writing to s.o. and he leaves just before we press enter, we won't write to the wrong buddy... If the current_buddy is a group, we lock it too. * Remove MCABBER_TESTUNIT ifdef in roster.h (test program isn't up-to-date anymore...)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     1
/*
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     2
 * roster.c     -- Local roster implementation
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     3
 * 
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     4
 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net>
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     5
 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
     9
 * your option) any later version.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    10
 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    14
 * General Public License for more details.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    15
 *
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    19
 * USA
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    20
 */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    21
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    22
#include <string.h>
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    23
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    24
#include "roster.h"
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    25
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    26
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    27
/* This is a private structure type for the roster */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    28
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    29
typedef struct {
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
    30
  const char *name;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
    31
  const char *jid;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    32
  guint type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    33
  enum imstatus status;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    34
  guint flags;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    35
  // list: user -> points to his group; group -> points to its users list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    36
  GSList *list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    37
} roster;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    38
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    39
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    40
/* ### Variables ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    41
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    42
static int hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    43
static GSList *groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    44
GList *buddylist;
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
    45
GList *current_buddy;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    46
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    47
#ifdef MCABBER_TESTUNIT
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    48
// Export groups for testing routines
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    49
GSList **pgroups = &groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    50
#endif
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    51
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    52
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    53
/* ### Roster functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    54
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    55
// Comparison function used to search in the roster (compares jids and types)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    56
gint roster_compare_jid_type(roster *a, roster *b) {
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    57
  if (! (a->type & b->type))
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    58
    return -1; // arbitrary (but should be != , of course)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    59
  return strcasecmp(a->jid, b->jid);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    60
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    61
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    62
// Comparison function used to sort the roster (by name)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    63
gint roster_compare_name(roster *a, roster *b) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    64
  return strcasecmp(a->name, b->name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    65
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    66
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    67
// Finds a roster element (user, group, agent...), by jid or name
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    68
// If roster_type is 0, returns match of any type.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    69
// Returns the roster GSList element, or NULL if jid/name not found
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
    70
GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    71
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    72
  GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    73
  GSList *res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    74
  roster sample;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    75
  GCompareFunc comp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    76
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    77
  if (!jidname)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    78
    return NULL;    // should not happen
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    79
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    80
  if (!roster_type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    81
    roster_type = ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_GROUP;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    82
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    83
  sample.type = roster_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    84
  if (type == jidsearch) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    85
    sample.jid = jidname;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    86
    comp = (GCompareFunc)&roster_compare_jid_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    87
  } else if (type == namesearch) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    88
    sample.name = jidname;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    89
    comp = (GCompareFunc)&roster_compare_name;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    90
  } else
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    91
    return NULL;    // should not happen
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    92
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    93
  while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    94
    roster *roster_elt = (roster*)sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    95
    if (roster_type & ROSTER_TYPE_GROUP) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    96
      if ((type == namesearch) && !strcasecmp(jidname, roster_elt->name))
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    97
        return sl_roster_elt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    98
    } else {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    99
      res = g_slist_find_custom(roster_elt->list, &sample, comp);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   100
      if (res)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   101
        return res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   102
    }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   103
    sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   104
  }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   105
  return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   106
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   107
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   108
// Returns pointer to new group, or existing group with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   109
GSList *roster_add_group(const char *name)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   110
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   111
  roster *roster_grp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   112
  // #1 Check name doesn't already exist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   113
  if (!roster_find(name, namesearch, ROSTER_TYPE_GROUP)) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   114
    // #2 Create the group node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   115
    roster_grp = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   116
    roster_grp->name = g_strdup(name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   117
    roster_grp->type = ROSTER_TYPE_GROUP;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   118
    // #3 Insert (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   119
    groups = g_slist_insert_sorted(groups, roster_grp,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   120
            (GCompareFunc)&roster_compare_name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   121
  }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   122
  return roster_find(name, namesearch, ROSTER_TYPE_GROUP);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   123
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   124
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   125
// Returns a pointer to the new user, or existing user with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   126
GSList *roster_add_user(const char *jid, const char *name, const char *group,
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   127
        guint type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   128
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   129
  roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   130
  roster *my_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   131
  GSList *slist;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   132
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   133
  if ((type != ROSTER_TYPE_USER) && (type != ROSTER_TYPE_AGENT)) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   134
    // XXX Error message?
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   135
    return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   136
  }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   137
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   138
  // Let's be arbitrary: default group has an empty name ("").
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   139
  if (!group)  group = "";
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   140
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   141
  // #1 Check this user doesn't already exist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   142
  if ((slist = roster_find(jid, jidsearch, type)) != NULL)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   143
    return slist;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   144
  // #2 add group if necessary
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   145
  slist = roster_add_group(group);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   146
  if (!slist) return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   147
  my_group = (roster*)slist->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   148
  // #3 Create user node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   149
  roster_usr = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   150
  roster_usr->jid   = g_strdup(jid);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   151
  if (name) {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   152
    roster_usr->name  = g_strdup(name);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   153
  } else {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   154
    gchar *p, *str = g_strdup(jid);
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
   155
    p = strstr(str, "/");
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   156
    if (p)  *p = '\0';
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   157
    roster_usr->name = g_strdup(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   158
    g_free(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   159
  }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   160
  roster_usr->type  = type; //ROSTER_TYPE_USER;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   161
  roster_usr->list  = slist;    // (my_group SList element)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   162
  // #4 Insert node (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   163
  my_group->list = g_slist_insert_sorted(my_group->list, roster_usr,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   164
          (GCompareFunc)&roster_compare_name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   165
  return roster_find(jid, jidsearch, type);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   166
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   167
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   168
// Removes user (jid) from roster, frees allocated memory
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   169
void roster_del_user(const char *jid)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   170
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   171
  GSList *sl_user, *sl_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   172
  GSList **sl_group_listptr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   173
  roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   174
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   175
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   176
  if (sl_user == NULL)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   177
    return;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   178
  // Let's free memory (jid, name)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   179
  roster_usr = (roster*)sl_user->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   180
  if (roster_usr->jid)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   181
    g_free((gchar*)roster_usr->jid);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   182
  if (roster_usr->name)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   183
    g_free((gchar*)roster_usr->name);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   184
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   185
  // That's a little complex, we need to dereference twice
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   186
  sl_group = ((roster*)sl_user->data)->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   187
  sl_group_listptr = &((roster*)(sl_group->data))->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   188
  *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   189
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   190
  // We need to rebuild the list
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   191
  if (current_buddy)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   192
    buddylist_build();
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   193
  // TODO What we should do, too, is to check if the deleted node is
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   194
  // current_buddy, in which case we could move current_buddy to the
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   195
  // previous (or next) node.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   196
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   197
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   198
void roster_setstatus(const char *jid, enum imstatus bstat)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   199
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   200
  GSList *sl_user;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   201
  roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   202
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   203
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
   204
  // If we can't find it, we add it
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   205
  if (sl_user == NULL)
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
   206
    sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   207
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   208
  roster_usr = (roster*)sl_user->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   209
  roster_usr->status = bstat;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   210
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   211
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   212
//  roster_setflags()
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   213
// Set one or several flags to value (TRUE/FALSE)
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
   214
void roster_setflags(const char *jid, guint flags, guint value)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   215
{
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   216
  GSList *sl_user;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   217
  roster *roster_usr;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   218
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   219
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   220
  if (sl_user == NULL)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   221
    return;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   222
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   223
  roster_usr = (roster*)sl_user->data;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   224
  if (value)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   225
    roster_usr->flags |= flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   226
  else
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   227
    roster_usr->flags &= ~flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   228
}
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   229
    
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   230
void roster_settype(const char *jid, guint type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   231
{
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   232
  GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   233
  roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   234
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   235
  if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   236
    return;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   237
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   238
  roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   239
  roster_usr->type = type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   240
}
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   241
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   242
enum imstatus roster_getstatus(const char *jid)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   243
{
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   244
  GSList *sl_user;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   245
  roster *roster_usr;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   246
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   247
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   248
  if (sl_user == NULL)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   249
    return offline; // Not in the roster, anyway...
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   250
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   251
  roster_usr = (roster*)sl_user->data;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   252
  return roster_usr->status;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   253
}
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   254
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   255
guint roster_gettype(const char *jid)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   256
{
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   257
  GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   258
  roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   259
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   260
  if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   261
    return 0;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   262
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   263
  roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   264
  return roster_usr->type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   265
}
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   266
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   267
inline guint roster_exists(const char *jidname, enum findwhat type,
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   268
        guint roster_type)
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   269
{
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   270
  if (roster_find(jidname, type, roster_type))
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   271
    return TRUE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   272
  return FALSE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   273
}
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   274
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   275
// char *roster_getgroup(...)   / Or *GSList?  Which use??
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   276
// ... setgroup(char*) ??
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   277
// guchar roster_getflags(...)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   278
// guchar roster_getname(...)   / setname ??
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   279
// roster_del_group?
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   280
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   281
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   282
/* ### BuddyList functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   283
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   284
//  buddylist_set_hide_offline_buddies(hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   285
// "hide" values: 1=hide 0=show_all -1=invert
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   286
void buddylist_set_hide_offline_buddies(int hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   287
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   288
  if (hide < 0)                     // NEG   (invert)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   289
    hide_offline_buddies = !hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   290
  else if (hide == 0)               // FALSE (don't hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   291
    hide_offline_buddies = 0;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   292
  else                              // TRUE  (hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   293
    hide_offline_buddies = 1;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   294
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   295
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   296
inline int buddylist_get_hide_offline_buddies(void)
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   297
{
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   298
  return hide_offline_buddies;
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   299
}
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   300
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   301
//  buddylist_build()
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   302
// Creates the buddylist from the roster entries.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   303
void buddylist_build(void)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   304
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   305
  GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   306
  roster *roster_elt;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   307
  roster *roster_current_buddy = NULL;
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   308
  int shrunk_group;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   309
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   310
  // We need to remember which buddy is selected.
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   311
  if (current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   312
    roster_current_buddy = BUDDATA(current_buddy);
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   313
  current_buddy = NULL;
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   314
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   315
  // Destroy old buddylist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   316
  if (buddylist) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   317
    g_list_free(buddylist);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   318
    buddylist = NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   319
  }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   320
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   321
  // Create the new list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   322
  while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   323
    GSList *sl_roster_usrelt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   324
    roster *roster_usrelt;
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   325
    guint pending_group = FALSE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   326
    roster_elt = (roster*) sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   327
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   328
    // Add the group now unless hide_offline_buddies is set,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   329
    // in which case we'll add it only if an online buddy belongs to it.
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   330
    // We take care to keep the current_buddy in the list, too.
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   331
    if (!hide_offline_buddies || roster_elt == roster_current_buddy)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   332
      buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   333
    else
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   334
      pending_group = TRUE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   335
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   336
    shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   337
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   338
    sl_roster_usrelt = roster_elt->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   339
    while (sl_roster_usrelt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   340
      roster_usrelt = (roster*) sl_roster_usrelt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   341
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   342
      // Buddy will be added if either:
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   343
      // - hide_offline_buddies is FALSE
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   344
      // - buddy is not offline
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   345
      // - buddy has a lock (for example the buddy window is currently open)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   346
      // - buddy has a pending (non-read) message
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   347
      // - group isn't hidden (shrunk)
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   348
      // - this is the current_buddy
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   349
      if (!hide_offline_buddies || roster_usrelt == roster_current_buddy ||
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   350
          (buddy_getstatus((gpointer)roster_usrelt) != offline) ||
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   351
          (buddy_getflags((gpointer)roster_usrelt) &
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   352
               (ROSTER_FLAG_LOCK | ROSTER_FLAG_MSG))) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   353
        // This user should be added.  Maybe the group hasn't been added yet?
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   354
        if (pending_group &&
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   355
            (hide_offline_buddies || roster_usrelt == roster_current_buddy)) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   356
          // It hasn't been done yet
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   357
          buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   358
          pending_group = FALSE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   359
        }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   360
        // Add user
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   361
        // XXX Should we add the user if there is a message and
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   362
        //     the group is shrunk? If so, we'd need to check LOCK flag too,
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   363
        //     perhaps...
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   364
        if (!shrunk_group)
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   365
          buddylist = g_list_append(buddylist, roster_usrelt);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   366
      }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   367
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   368
      sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   369
    }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   370
    sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   371
  }
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   372
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   373
  // Check if we can find our saved current_buddy...
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   374
  if (roster_current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   375
    current_buddy = g_list_find(buddylist, roster_current_buddy);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   376
  // current_buddy initialization
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   377
  if (!current_buddy || (g_list_position(buddylist, current_buddy) == -1))
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   378
    current_buddy = g_list_first(buddylist);
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   379
  // XXX Maybe we should set update_roster to TRUE there?
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   380
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   381
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   382
//  buddy_hide_group(roster, hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   383
// "hide" values: 1=hide 0=show_all -1=invert
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   384
void buddy_hide_group(gpointer rosterdata, int hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   385
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   386
  roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   387
  if (hide > 0)                     // TRUE   (hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   388
    roster->flags |= ROSTER_FLAG_HIDE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   389
  else if (hide < 0)                // NEG    (invert)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   390
    roster->flags ^= ROSTER_FLAG_HIDE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   391
  else                              // FALSE  (don't hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   392
    roster->flags &= ~ROSTER_FLAG_HIDE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   393
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   394
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   395
const char *buddy_getjid(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   396
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   397
  roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   398
  return roster->jid;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   399
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   400
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   401
const char *buddy_getname(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   402
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   403
  roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   404
  return roster->name;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   405
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   406
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   407
guint buddy_gettype(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   408
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   409
  roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   410
  return roster->type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   411
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   412
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   413
enum imstatus buddy_getstatus(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   414
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   415
  roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   416
  return roster->status;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   417
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   418
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   419
//  buddy_setflags()
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   420
// Set one or several flags to value (TRUE/FALSE)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   421
void buddy_setflags(gpointer rosterdata, guint flags, guint value)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   422
{
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   423
  roster *roster = rosterdata;
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   424
  if (value)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   425
    roster->flags |= flags;
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   426
  else
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   427
    roster->flags &= ~flags;
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   428
}
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   429
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   430
guint buddy_getflags(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   431
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   432
  roster *roster = rosterdata;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   433
  return roster->flags;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   434
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   435