mcabber/src/roster.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 27 Aug 2005 11:21:27 +0200
changeset 403 17aa60c6dc63
parent 393 f8f3c7493457
child 425 03f1e37759a6
permissions -rw-r--r--
Allow a different server name than the jid domain name Sync libjabber with upstream (centericq). The libjabber patch is from Ian Johannesen. This allows connecting to Google Talk, for example.
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
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
     3
 *
72
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
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
    22
#define _GNU_SOURCE     /* for strcasestr() */
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    23
#include <string.h>
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    24
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    25
#include "roster.h"
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    26
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    27
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    28
/* This is a private structure type for the roster */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    29
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    30
typedef struct {
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
    31
  const gchar *name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
    32
  const gchar *jid;
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
    33
  const gchar *status_msg;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    34
  guint type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    35
  enum imstatus status;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    36
  guint flags;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    37
  // list: user -> points to his group; group -> points to its users list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    38
  GSList *list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    39
} roster;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    40
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    41
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    42
/* ### Variables ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    43
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    44
static int hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    45
static GSList *groups;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
    46
static GSList *unread_list;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    47
GList *buddylist;
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
    48
GList *current_buddy;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
    49
GList *alternate_buddy;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    50
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    51
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    52
/* ### Roster functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    53
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    54
// Comparison function used to search in the roster (compares jids and types)
336
eb994ee40029 Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents: 331
diff changeset
    55
static gint roster_compare_jid_type(roster *a, roster *b) {
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    56
  if (! (a->type & b->type))
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    57
    return -1; // arbitrary (but should be != , of course)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    58
  return strcasecmp(a->jid, b->jid);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    59
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    60
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    61
// Comparison function used to sort the roster (by name)
336
eb994ee40029 Make some functions static
Mikael Berthe <mikael@lilotux.net>
parents: 331
diff changeset
    62
static gint roster_compare_name(roster *a, roster *b) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    63
  return strcasecmp(a->name, b->name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    64
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    65
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    66
// Finds a roster element (user, group, agent...), by jid or name
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    67
// If roster_type is 0, returns match of any type.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    68
// Returns the roster GSList element, or NULL if jid/name not found
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
    69
GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    70
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    71
  GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    72
  GSList *res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    73
  roster sample;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    74
  GCompareFunc comp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    75
192
62bc2992216b [/trunk] Changeset 204 by mikael
mikael
parents: 166
diff changeset
    76
  if (!jidname) return NULL;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    77
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    78
  if (!roster_type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    79
    roster_type = ROSTER_TYPE_USER|ROSTER_TYPE_AGENT|ROSTER_TYPE_GROUP;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
    80
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    81
  sample.type = roster_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    82
  if (type == jidsearch) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    83
    sample.jid = jidname;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    84
    comp = (GCompareFunc)&roster_compare_jid_type;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    85
  } else if (type == namesearch) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    86
    sample.name = jidname;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    87
    comp = (GCompareFunc)&roster_compare_name;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    88
  } else
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    89
    return NULL;    // should not happen
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    90
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    91
  while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    92
    roster *roster_elt = (roster*)sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    93
    if (roster_type & ROSTER_TYPE_GROUP) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    94
      if ((type == namesearch) && !strcasecmp(jidname, roster_elt->name))
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    95
        return sl_roster_elt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    96
    } else {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    97
      res = g_slist_find_custom(roster_elt->list, &sample, comp);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    98
      if (res)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
    99
        return res;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   100
    }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   101
    sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   102
  }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   103
  return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   104
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   105
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   106
// Returns pointer to new group, or existing group with that name
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   107
GSList *roster_add_group(const char *name)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   108
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   109
  roster *roster_grp;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   110
  // #1 Check name doesn't already exist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   111
  if (!roster_find(name, namesearch, ROSTER_TYPE_GROUP)) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   112
    // #2 Create the group node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   113
    roster_grp = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   114
    roster_grp->name = g_strdup(name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   115
    roster_grp->type = ROSTER_TYPE_GROUP;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   116
    // #3 Insert (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   117
    groups = g_slist_insert_sorted(groups, roster_grp,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   118
            (GCompareFunc)&roster_compare_name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   119
  }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   120
  return roster_find(name, namesearch, ROSTER_TYPE_GROUP);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   121
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   122
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   123
// 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
   124
GSList *roster_add_user(const char *jid, const char *name, const char *group,
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   125
        guint type)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   126
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   127
  roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   128
  roster *my_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   129
  GSList *slist;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   130
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   131
  if ((type != ROSTER_TYPE_USER) && (type != ROSTER_TYPE_AGENT)) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   132
    // XXX Error message?
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   133
    return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   134
  }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   135
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   136
  // Let's be arbitrary: default group has an empty name ("").
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   137
  if (!group)  group = "";
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   138
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   139
  // #1 Check this user doesn't already exist
192
62bc2992216b [/trunk] Changeset 204 by mikael
mikael
parents: 166
diff changeset
   140
  slist = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
62bc2992216b [/trunk] Changeset 204 by mikael
mikael
parents: 166
diff changeset
   141
  if (slist) return slist;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   142
  // #2 add group if necessary
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   143
  slist = roster_add_group(group);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   144
  if (!slist) return NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   145
  my_group = (roster*)slist->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   146
  // #3 Create user node
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   147
  roster_usr = g_new0(roster, 1);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   148
  roster_usr->jid   = g_strdup(jid);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   149
  if (name) {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   150
    roster_usr->name  = g_strdup(name);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   151
  } else {
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   152
    gchar *p, *str = g_strdup(jid);
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
   153
    p = strstr(str, "/");
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   154
    if (p)  *p = '\0';
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   155
    roster_usr->name = g_strdup(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   156
    g_free(str);
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   157
  }
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   158
  roster_usr->type  = type; //ROSTER_TYPE_USER;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   159
  roster_usr->list  = slist;    // (my_group SList element)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   160
  // #4 Insert node (sorted)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   161
  my_group->list = g_slist_insert_sorted(my_group->list, roster_usr,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   162
          (GCompareFunc)&roster_compare_name);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   163
  return roster_find(jid, jidsearch, type);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   164
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   165
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   166
// Removes user (jid) from roster, frees allocated memory
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   167
void roster_del_user(const char *jid)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   168
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   169
  GSList *sl_user, *sl_group;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   170
  GSList **sl_group_listptr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   171
  roster *roster_usr;
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
   172
  GSList *node;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   173
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   174
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   175
  if (sl_user == NULL)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   176
    return;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   177
  roster_usr = (roster*)sl_user->data;
246
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
   178
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
   179
  // Remove (if present) from unread messages list
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
   180
  node = g_slist_find(unread_list, roster_usr);
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
   181
  if (node) unread_list = g_slist_delete_link(unread_list, node);
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
   182
57f9005b8844 [/trunk] Changeset 259 by mikael
mikael
parents: 236
diff changeset
   183
  // Let's free memory (jid, name, status message)
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   184
  if (roster_usr->jid)        g_free((gchar*)roster_usr->jid);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   185
  if (roster_usr->name)       g_free((gchar*)roster_usr->name);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   186
  if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg);
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   187
  g_free(roster_usr);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   188
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   189
  // That's a little complex, we need to dereference twice
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   190
  sl_group = ((roster*)sl_user->data)->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   191
  sl_group_listptr = &((roster*)(sl_group->data))->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   192
  *sl_group_listptr = g_slist_delete_link(*sl_group_listptr, sl_user);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   193
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   194
  // We need to rebuild the list
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   195
  if (current_buddy)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   196
    buddylist_build();
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   197
  // TODO What we could do, too, is to check if the deleted node is
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   198
  // current_buddy, in which case we could move current_buddy to the
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   199
  // previous (or next) node.
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   200
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   201
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   202
// Free all roster data and call buddylist_build() to free the buddylist.
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   203
void roster_free(void)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   204
{
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   205
  GSList *sl_grp = groups;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   206
301
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
   207
  // Free unread_list
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
   208
  if (unread_list) {
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
   209
    g_slist_free(unread_list);
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
   210
    unread_list = NULL;
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
   211
  }
efcbd3c1ad15 Free unread_list when the roster is freed
Mikael Berthe <mikael@lilotux.net>
parents: 265
diff changeset
   212
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   213
  // Walk through groups
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   214
  while (sl_grp) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   215
    roster *roster_grp = (roster*)sl_grp->data;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   216
    GSList *sl_usr = roster_grp->list;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   217
    // Walk through this group users
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   218
    while (sl_usr) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   219
      roster *roster_usr = (roster*)sl_usr->data;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   220
      // Free name and jid
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   221
      if (roster_usr->jid)        g_free((gchar*)roster_usr->jid);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   222
      if (roster_usr->name)       g_free((gchar*)roster_usr->name);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   223
      if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg);
214
9484ba81ec53 [/trunk] Changeset 226 by mikael
mikael
parents: 212
diff changeset
   224
      g_free(roster_usr);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   225
      sl_usr = g_slist_next(sl_usr);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   226
    }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   227
    // Free group's users list
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   228
    if (roster_grp->list)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   229
      g_slist_free(roster_grp->list);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   230
    // Free group's name and jid
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   231
    if (roster_grp->jid)  g_free((gchar*)roster_grp->jid);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   232
    if (roster_grp->name) g_free((gchar*)roster_grp->name);
214
9484ba81ec53 [/trunk] Changeset 226 by mikael
mikael
parents: 212
diff changeset
   233
    g_free(roster_grp);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   234
    sl_grp = g_slist_next(sl_grp);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   235
  }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   236
  // Free groups list
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   237
  if (groups) {
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   238
    g_slist_free(groups);
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   239
    groups = NULL;
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   240
    // Update (i.e. free) buddylist
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   241
    if (buddylist)
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   242
      buddylist_build();
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   243
  }
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   244
}
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 148
diff changeset
   245
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   246
void roster_setstatus(const char *jid, enum imstatus bstat,
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   247
        const char *status_msg)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   248
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   249
  GSList *sl_user;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   250
  roster *roster_usr;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   251
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   252
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
   253
  // If we can't find it, we add it
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   254
  if (sl_user == NULL)
92
c6270994fb6e [/trunk] Changeset 106 by mikael
mikael
parents: 90
diff changeset
   255
    sl_user = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_USER);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   256
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   257
  roster_usr = (roster*)sl_user->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   258
  roster_usr->status = bstat;
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   259
  if (roster_usr->status_msg) {
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   260
    g_free((gchar*)roster_usr->status_msg);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   261
    roster_usr->status_msg = NULL;
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   262
  }
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   263
  if (status_msg)
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   264
    roster_usr->status_msg = g_strdup(status_msg);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   265
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   266
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   267
//  roster_setflags()
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   268
// Set one or several flags to value (TRUE/FALSE)
80
7fb661f19a77 [/trunk] Changeset 94 by mikael
mikael
parents: 78
diff changeset
   269
void roster_setflags(const char *jid, guint flags, guint value)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   270
{
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   271
  GSList *sl_user;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   272
  roster *roster_usr;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   273
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   274
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   275
  if (sl_user == NULL)
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   276
    return;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   277
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   278
  roster_usr = (roster*)sl_user->data;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   279
  if (value)
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   280
    roster_usr->flags |= flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   281
  else
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   282
    roster_usr->flags &= ~flags;
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   283
}
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   284
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   285
//  roster_msg_setflag()
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   286
// Set the ROSTER_FLAG_MSG to the given value for the given jid.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   287
// It will update the buddy's group message flag.
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   288
// Update the unread messages list too.
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   289
void roster_msg_setflag(const char *jid, guint value)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   290
{
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   291
  GSList *sl_user;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   292
  roster *roster_usr, *roster_grp;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   293
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   294
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   295
  if (sl_user == NULL)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   296
    return;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   297
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   298
  roster_usr = (roster*)sl_user->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   299
  roster_grp = (roster*)roster_usr->list->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   300
  if (value) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   301
    // Message flag is TRUE.  This is easy, we just have to set both flags
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   302
    // to TRUE...
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   303
    roster_usr->flags |= ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   304
    roster_grp->flags |= ROSTER_FLAG_MSG; // group
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   305
    // Append the roster_usr to unread_list, but avoid duplicates
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   306
    if (!g_slist_find(unread_list, roster_usr))
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   307
      unread_list = g_slist_append(unread_list, roster_usr);
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   308
  } else {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   309
    // Message flag is FALSE.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   310
    guint msg = FALSE;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   311
    roster_usr->flags &= ~ROSTER_FLAG_MSG;
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   312
    if (unread_list) {
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   313
      GSList *node = g_slist_find(unread_list, roster_usr);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   314
      if (node) unread_list = g_slist_delete_link(unread_list, node);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   315
    }
148
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   316
    // For the group value we need to watch all buddies in this group;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   317
    // if one is flagged, then the group will be flagged.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   318
    // I will re-use sl_user and roster_usr here, as they aren't used
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   319
    // anymore.
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   320
    sl_user = roster_grp->list;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   321
    while (sl_user) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   322
      roster_usr = (roster*)sl_user->data;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   323
      if (roster_usr->flags & ROSTER_FLAG_MSG) {
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   324
        msg = TRUE;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   325
        break;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   326
      }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   327
      sl_user = g_slist_next(sl_user);
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   328
    }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   329
    if (!msg)
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   330
      roster_grp->flags &= ~ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   331
    else
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   332
      roster_grp->flags |= ROSTER_FLAG_MSG;
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   333
      // Actually the "else" part is useless, because the group
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   334
      // ROSTER_FLAG_MSG should already be set...
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   335
  }
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   336
}
c3624b2a7059 [/trunk] Changeset 160 by mikael
mikael
parents: 147
diff changeset
   337
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   338
void roster_settype(const char *jid, guint type)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   339
{
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   340
  GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   341
  roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   342
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   343
  if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   344
    return;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   345
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   346
  roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   347
  roster_usr->type = type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   348
}
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   349
90
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   350
enum imstatus roster_getstatus(const char *jid)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   351
{
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   352
  GSList *sl_user;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   353
  roster *roster_usr;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   354
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   355
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   356
  if (sl_user == NULL)
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   357
    return offline; // Not in the roster, anyway...
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   358
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   359
  roster_usr = (roster*)sl_user->data;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   360
  return roster_usr->status;
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   361
}
ac48ace7ee19 [/trunk] Changeset 104 by mikael
mikael
parents: 89
diff changeset
   362
318
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   363
const char *roster_getstatusmsg(const char *jid)
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   364
{
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   365
  GSList *sl_user;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   366
  roster *roster_usr;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   367
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   368
  sl_user = roster_find(jid, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_AGENT);
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   369
  if (sl_user == NULL)
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   370
    return offline; // Not in the roster, anyway...
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   371
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   372
  roster_usr = (roster*)sl_user->data;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   373
  return roster_usr->status_msg;
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   374
}
45076d02eeef The /status command can specify a status message
Mikael Berthe <mikael@lilotux.net>
parents: 301
diff changeset
   375
89
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   376
guint roster_gettype(const char *jid)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   377
{
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   378
  GSList *sl_user;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   379
  roster *roster_usr;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   380
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   381
  if ((sl_user = roster_find(jid, jidsearch, 0)) == NULL)
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   382
    return 0;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   383
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   384
  roster_usr = (roster*)sl_user->data;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   385
  return roster_usr->type;
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   386
}
d39f15683c34 [/trunk] Changeset 103 by mikael
mikael
parents: 81
diff changeset
   387
141
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   388
inline guint roster_exists(const char *jidname, enum findwhat type,
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   389
        guint roster_type)
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   390
{
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   391
  if (roster_find(jidname, type, roster_type))
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   392
    return TRUE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   393
  return FALSE;
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   394
}
6533a231a65e [/trunk] Changeset 153 by mikael
mikael
parents: 128
diff changeset
   395
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   396
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   397
/* ### BuddyList functions ### */
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   398
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   399
//  buddylist_set_hide_offline_buddies(hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   400
// "hide" values: 1=hide 0=show_all -1=invert
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   401
void buddylist_set_hide_offline_buddies(int hide)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   402
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   403
  if (hide < 0)                     // NEG   (invert)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   404
    hide_offline_buddies = !hide_offline_buddies;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   405
  else if (hide == 0)               // FALSE (don't hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   406
    hide_offline_buddies = 0;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   407
  else                              // TRUE  (hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   408
    hide_offline_buddies = 1;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   409
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   410
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   411
inline int buddylist_get_hide_offline_buddies(void)
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   412
{
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   413
  return hide_offline_buddies;
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   414
}
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 119
diff changeset
   415
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   416
//  buddylist_build()
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   417
// Creates the buddylist from the roster entries.
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   418
void buddylist_build(void)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   419
{
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   420
  GSList *sl_roster_elt = groups;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   421
  roster *roster_elt;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   422
  roster *roster_current_buddy = NULL;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
   423
  roster *roster_alternate_buddy = NULL;
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   424
  int shrunk_group;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   425
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   426
  // We need to remember which buddy is selected.
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   427
  if (current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   428
    roster_current_buddy = BUDDATA(current_buddy);
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   429
  current_buddy = NULL;
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
   430
  if (alternate_buddy)
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
   431
    roster_alternate_buddy = BUDDATA(alternate_buddy);
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
   432
  alternate_buddy = NULL;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   433
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   434
  // Destroy old buddylist
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   435
  if (buddylist) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   436
    g_list_free(buddylist);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   437
    buddylist = NULL;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   438
  }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   439
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   440
  // Create the new list
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   441
  while (sl_roster_elt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   442
    GSList *sl_roster_usrelt;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   443
    roster *roster_usrelt;
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   444
    guint pending_group = FALSE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   445
    roster_elt = (roster*) sl_roster_elt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   446
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   447
    // Add the group now unless hide_offline_buddies is set,
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   448
    // 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
   449
    // We take care to keep the current_buddy in the list, too.
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   450
    if (!hide_offline_buddies || roster_elt == roster_current_buddy)
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   451
      buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   452
    else
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   453
      pending_group = TRUE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   454
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   455
    shrunk_group = roster_elt->flags & ROSTER_FLAG_HIDE;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   456
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   457
    sl_roster_usrelt = roster_elt->list;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   458
    while (sl_roster_usrelt) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   459
      roster_usrelt = (roster*) sl_roster_usrelt->data;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   460
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   461
      // Buddy will be added if either:
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   462
      // - hide_offline_buddies is FALSE
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   463
      // - buddy is not offline
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   464
      // - buddy has a lock (for example the buddy window is currently open)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   465
      // - buddy has a pending (non-read) message
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   466
      // - group isn't hidden (shrunk)
147
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   467
      // - this is the current_buddy
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   468
      if (!hide_offline_buddies || roster_usrelt == roster_current_buddy ||
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   469
          (buddy_getstatus((gpointer)roster_usrelt) != offline) ||
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   470
          (buddy_getflags((gpointer)roster_usrelt) &
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   471
               (ROSTER_FLAG_LOCK | ROSTER_FLAG_MSG))) {
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   472
        // 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
   473
        if (pending_group &&
7571de4aed73 [/trunk] Changeset 159 by mikael
mikael
parents: 141
diff changeset
   474
            (hide_offline_buddies || roster_usrelt == roster_current_buddy)) {
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   475
          // It hasn't been done yet
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   476
          buddylist = g_list_append(buddylist, roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   477
          pending_group = FALSE;
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   478
        }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   479
        // Add user
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   480
        // XXX Should we add the user if there is a message and
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   481
        //     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
   482
        //     perhaps...
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   483
        if (!shrunk_group)
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   484
          buddylist = g_list_append(buddylist, roster_usrelt);
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   485
      }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   486
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   487
      sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   488
    }
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   489
    sl_roster_elt = g_slist_next(sl_roster_elt);
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   490
  }
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   491
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   492
  // Check if we can find our saved current_buddy...
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   493
  if (roster_current_buddy)
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   494
    current_buddy = g_list_find(buddylist, roster_current_buddy);
330
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
   495
  if (roster_alternate_buddy)
a9013124ede6 Add "/roster alternate"
Mikael Berthe <mikael@lilotux.net>
parents: 318
diff changeset
   496
    alternate_buddy = g_list_find(buddylist, roster_alternate_buddy);
78
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   497
  // current_buddy initialization
d001d8fb876d [/trunk] Changeset 92 by mikael
mikael
parents: 72
diff changeset
   498
  if (!current_buddy || (g_list_position(buddylist, current_buddy) == -1))
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 80
diff changeset
   499
    current_buddy = g_list_first(buddylist);
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 120
diff changeset
   500
  // XXX Maybe we should set update_roster to TRUE there?
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   501
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   502
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   503
//  buddy_hide_group(roster, hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   504
// "hide" values: 1=hide 0=show_all -1=invert
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   505
void buddy_hide_group(gpointer rosterdata, int hide)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   506
{
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   507
  roster *roster_usr = rosterdata;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   508
  if (hide > 0)                     // TRUE   (hide)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   509
    roster_usr->flags |= ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   510
  else if (hide < 0)                // NEG    (invert)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   511
    roster_usr->flags ^= ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   512
  else                              // FALSE  (don't hide)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   513
    roster_usr->flags &= ~ROSTER_FLAG_HIDE;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   514
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   515
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   516
const char *buddy_getjid(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   517
{
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   518
  roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   519
  return roster_usr->jid;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   520
}
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   521
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   522
//  buddy_setgroup()
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   523
// Change the group of current buddy
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   524
//
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   525
// Warning!  This function changes current_buddy!
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   526
// Warning!  Old buddy is deleted, so you can't acces to its jid/name after
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   527
//           calling this function.
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   528
void buddy_setgroup(gpointer rosterdata, char *newgroupname)
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   529
{
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   530
  roster *roster_usr = rosterdata;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   531
  GSList **sl_group;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   532
  GSList *sl_clone;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   533
  roster *roster_clone;
331
1510dda4ad71 Don't loose alternate_buddy when the buddy is moved ("/move")
Mikael Berthe <mikael@lilotux.net>
parents: 330
diff changeset
   534
  int is_alternate;
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   535
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   536
  // A group has no group :)
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   537
  if (roster_usr->type & ROSTER_TYPE_GROUP) return;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   538
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   539
  // Remove the buddy from current group
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   540
  sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   541
  *sl_group = g_slist_remove(*sl_group, rosterdata);
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 364
diff changeset
   542
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   543
  // Add the buddy to its new group; actually we "clone" this buddy...
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   544
  sl_clone = roster_add_user(roster_usr->jid, roster_usr->name,
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   545
          newgroupname, roster_usr->type);
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   546
  roster_clone = (roster*)sl_clone->data;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   547
  roster_clone->status = roster_usr->status;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   548
  roster_clone->flags  = roster_usr->flags;
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   549
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   550
  // Free old buddy
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   551
  if (roster_usr->jid)        g_free((gchar*)roster_usr->jid);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   552
  if (roster_usr->name)       g_free((gchar*)roster_usr->name);
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   553
  if (roster_usr->status_msg) g_free((gchar*)roster_usr->status_msg);
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   554
  g_free(roster_usr);
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   555
212
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
   556
  // If new new group is folded, the curren_buddy will be lost, and the
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
   557
  // chat window won't be correctly refreshed.  So we make sure it isn't...
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
   558
  ((roster*)((GSList*)roster_clone->list)->data)->flags &= ~ROSTER_FLAG_HIDE;
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
   559
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
   560
  // Little trick to have current_body pointing to the cloned buddy
331
1510dda4ad71 Don't loose alternate_buddy when the buddy is moved ("/move")
Mikael Berthe <mikael@lilotux.net>
parents: 330
diff changeset
   561
  is_alternate = (alternate_buddy == current_buddy);
212
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
   562
  buddylist = g_list_append(buddylist, roster_clone);
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
   563
  current_buddy = g_list_find(buddylist, roster_clone);
331
1510dda4ad71 Don't loose alternate_buddy when the buddy is moved ("/move")
Mikael Berthe <mikael@lilotux.net>
parents: 330
diff changeset
   564
  if (is_alternate)
1510dda4ad71 Don't loose alternate_buddy when the buddy is moved ("/move")
Mikael Berthe <mikael@lilotux.net>
parents: 330
diff changeset
   565
    alternate_buddy = current_buddy;
212
465d98d2f8e3 [/trunk] Changeset 224 by mikael
mikael
parents: 210
diff changeset
   566
210
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   567
  buddylist_build();
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   568
}
f64818ba3503 [/trunk] Changeset 222 by mikael
mikael
parents: 209
diff changeset
   569
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   570
void buddy_setname(gpointer rosterdata, char *newname)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   571
{
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   572
  roster *roster_usr = rosterdata;
209
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
   573
  GSList **sl_group;
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   574
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   575
  // TODO For groups, we need to check for unicity
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   576
  // However, renaming a group boils down to moving all its buddies to
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   577
  // another group, so calling this function is not really necessary...
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   578
  if (roster_usr->type & ROSTER_TYPE_GROUP) return;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   579
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   580
  if (roster_usr->name) {
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   581
    g_free((gchar*)roster_usr->name);
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   582
    roster_usr->name = NULL;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   583
  }
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   584
  if (newname)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   585
    roster_usr->name = g_strdup(newname);
209
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
   586
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
   587
  // We need to resort the group list
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
   588
  sl_group = &((roster*)((GSList*)roster_usr->list)->data)->list;
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
   589
  *sl_group = g_slist_sort(*sl_group, (GCompareFunc)&roster_compare_name);
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
   590
353a4f8a3f61 [/trunk] Changeset 221 by mikael
mikael
parents: 207
diff changeset
   591
  buddylist_build();
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   592
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   593
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   594
const char *buddy_getname(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   595
{
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   596
  roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   597
  return roster_usr->name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   598
}
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   599
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   600
//  buddy_getgroupname()
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   601
// Returns a pointer on buddy's group name.
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   602
const char *buddy_getgroupname(gpointer rosterdata)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   603
{
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   604
  roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   605
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   606
  if (roster_usr->type & ROSTER_TYPE_GROUP)
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   607
    return roster_usr->name;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   608
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   609
  // This is a user
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   610
  return ((roster*)((GSList*)roster_usr->list)->data)->name;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   611
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   612
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   613
//  buddy_getgroup()
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   614
// Returns a pointer on buddy's group.
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   615
gpointer buddy_getgroup(gpointer rosterdata)
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   616
{
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   617
  roster *roster_usr = rosterdata;
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   618
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   619
  if (roster_usr->type & ROSTER_TYPE_GROUP)
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   620
    return rosterdata;
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   621
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   622
  // This is a user
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   623
  return (gpointer)((GSList*)roster_usr->list)->data;
166
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   624
}
aa5b635520ef [/trunk] Changeset 178 by mikael
mikael
parents: 164
diff changeset
   625
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   626
guint buddy_gettype(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   627
{
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   628
  roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   629
  return roster_usr->type;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   630
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   631
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   632
enum imstatus buddy_getstatus(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   633
{
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   634
  roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   635
  return roster_usr->status;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   636
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   637
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   638
const char *buddy_getstatusmsg(gpointer rosterdata)
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   639
{
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   640
  roster *roster_usr = rosterdata;
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   641
  return roster_usr->status_msg;
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   642
}
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 214
diff changeset
   643
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   644
//  buddy_setflags()
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   645
// Set one or several flags to value (TRUE/FALSE)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   646
void buddy_setflags(gpointer rosterdata, guint flags, guint value)
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   647
{
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   648
  roster *roster_usr = rosterdata;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   649
  if (value)
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   650
    roster_usr->flags |= flags;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   651
  else
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   652
    roster_usr->flags &= ~flags;
119
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   653
}
d7fbd5293385 [/trunk] Changeset 132 by mikael
mikael
parents: 92
diff changeset
   654
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   655
guint buddy_getflags(gpointer rosterdata)
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   656
{
207
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   657
  roster *roster_usr = rosterdata;
41fafa0ecfd8 [/trunk] Changeset 219 by mikael
mikael
parents: 192
diff changeset
   658
  return roster_usr->flags;
72
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   659
}
9b7f0d313e33 [/trunk] Changeset 86 by mikael
mikael
parents:
diff changeset
   660
265
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   661
//  buddy_search(string)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   662
// Look for a buddy whose name or jid contains string.
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   663
// Search begins at current_buddy; if no match is found in the the buddylist,
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   664
// return NULL;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   665
GList *buddy_search(char *string)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   666
{
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   667
  GList *buddy = current_buddy;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   668
  roster *roster_usr;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   669
  if (!buddylist || !current_buddy) return NULL;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   670
  for (;;) {
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   671
    buddy = g_list_next(buddy);
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   672
    if (!buddy)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   673
      buddy = buddylist;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   674
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   675
    roster_usr = (roster*)buddy->data;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   676
    if (roster_usr->jid && strcasestr(roster_usr->jid, string))
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   677
      return buddy;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   678
    if (roster_usr->name && strcasestr(roster_usr->name, string))
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   679
      return buddy;
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   680
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   681
    if (buddy == current_buddy)
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   682
      return NULL; // Back to the beginning, and no match found
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   683
  }
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   684
}
49e9e02dd6d0 Add "/roster search" command
mikael@frmp8452
parents: 246
diff changeset
   685
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   686
//  compl_list(type)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   687
// Returns a list of jid's or groups.  (For commands completion)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   688
// type: ROSTER_TYPE_USER (jid's) or ROSTER_TYPE_GROUP (group names)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   689
// The list should be freed by the caller after use.
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   690
GSList *compl_list(guint type)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   691
{
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   692
  GSList *list = NULL;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   693
  GList  *buddy = buddylist;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   694
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   695
  for ( ; buddy ; buddy = g_list_next(buddy)) {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   696
    guint btype = buddy_gettype(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   697
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   698
    if (type == ROSTER_TYPE_GROUP) { // (group names)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   699
      if (btype == ROSTER_TYPE_GROUP) {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   700
        const char *bname = buddy_getname(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   701
        if ((bname) && (*bname))
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   702
          list = g_slist_append(list, g_strdup(bname));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   703
      }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   704
    } else { // ROSTER_TYPE_USER (jid)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   705
        const char *bjid = buddy_getjid(BUDDATA(buddy));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   706
        if (bjid)
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   707
          list = g_slist_append(list, g_strdup(bjid));
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   708
    }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   709
  }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   710
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   711
  return list;
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   712
}
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 221
diff changeset
   713
236
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   714
//  unread_msg(rosterdata)
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   715
// Return the next buddy with an unread message.  If the parameter is NULL,
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   716
// return the first buddy with an unread message.
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   717
gpointer unread_msg(gpointer rosterdata)
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   718
{
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   719
  GSList *unread, *next_unread;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   720
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   721
  if (!unread_list) return NULL;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   722
  // First unread message
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   723
  if (!rosterdata) return unread_list->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   724
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   725
  unread = g_slist_find(unread_list, rosterdata);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   726
  if (!unread) return unread_list->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   727
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   728
  next_unread = g_slist_next(unread);
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   729
  if (next_unread) return next_unread->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   730
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   731
  return unread_list->data;
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   732
}
72fd1273f2b7 [/trunk] Changeset 249 by mikael
mikael
parents: 225
diff changeset
   733