Blame src/st_list.c.fix-glib-headers

Packit ee6627
Packit ee6627
/*
Packit ee6627
  Meanwhile - Unofficial Lotus Sametime Community Client Library
Packit ee6627
  Copyright (C) 2004  Christopher (siege) O'Brien
Packit ee6627
  
Packit ee6627
  This library is free software; you can redistribute it and/or
Packit ee6627
  modify it under the terms of the GNU Library General Public
Packit ee6627
  License as published by the Free Software Foundation; either
Packit ee6627
  version 2 of the License, or (at your option) any later version.
Packit ee6627
  
Packit ee6627
  This library is distributed in the hope that it will be useful,
Packit ee6627
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ee6627
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit ee6627
  Library General Public License for more details.
Packit ee6627
  
Packit ee6627
  You should have received a copy of the GNU Library General Public
Packit ee6627
  License along with this library; if not, write to the Free
Packit ee6627
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit ee6627
*/
Packit ee6627
Packit ee6627
#include <stdio.h>
Packit ee6627
#include <string.h>
Packit ee6627
#include <glib/gstring.h>
Packit ee6627
Packit ee6627
#include "mw_debug.h"
Packit ee6627
#include "mw_util.h"
Packit ee6627
#include "mw_st_list.h"
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeList {
Packit ee6627
  guint ver_major;
Packit ee6627
  guint ver_minor;
Packit ee6627
  guint ver_micro;
Packit ee6627
Packit ee6627
  GList *groups;
Packit ee6627
};
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeGroup {
Packit ee6627
  struct mwSametimeList *list;
Packit ee6627
Packit ee6627
  enum mwSametimeGroupType type;
Packit ee6627
  char *name;
Packit ee6627
  char *alias;
Packit ee6627
  gboolean open;
Packit ee6627
Packit ee6627
  GList *users;
Packit ee6627
};
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeUser {
Packit ee6627
  struct mwSametimeGroup *group;
Packit ee6627
Packit ee6627
  enum mwSametimeUserType type;
Packit ee6627
  struct mwIdBlock id;
Packit ee6627
  char *name;
Packit ee6627
  char *alias;
Packit ee6627
};
Packit ee6627
Packit ee6627
Packit ee6627
static void user_free(struct mwSametimeUser *u) {
Packit ee6627
  struct mwSametimeGroup *g;
Packit ee6627
Packit ee6627
  g = u->group;
Packit ee6627
  g->users = g_list_remove(g->users, u);
Packit ee6627
Packit ee6627
  mwIdBlock_clear(&u->id);
Packit ee6627
  g_free(u->name);
Packit ee6627
  g_free(u->alias);
Packit ee6627
  g_free(u);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static void group_free(struct mwSametimeGroup *g) {
Packit ee6627
  struct mwSametimeList *l;
Packit ee6627
Packit ee6627
  l = g->list;
Packit ee6627
  l->groups = g_list_remove(l->groups, g);
Packit ee6627
Packit ee6627
  while(g->users)
Packit ee6627
    mwSametimeUser_free(g->users->data);
Packit ee6627
Packit ee6627
  g_free(g->name);
Packit ee6627
  g_free(g->alias);
Packit ee6627
  g_free(g);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static void list_free(struct mwSametimeList *l) {
Packit ee6627
  while(l->groups)
Packit ee6627
    mwSametimeGroup_free(l->groups->data);
Packit ee6627
Packit ee6627
  g_free(l);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeList *
Packit ee6627
mwSametimeList_new() {
Packit ee6627
Packit ee6627
  struct mwSametimeList *stl;
Packit ee6627
Packit ee6627
  stl = g_new0(struct mwSametimeList, 1);
Packit ee6627
  stl->ver_major = ST_LIST_MAJOR;
Packit ee6627
  stl->ver_minor = ST_LIST_MINOR;
Packit ee6627
  stl->ver_micro = ST_LIST_MICRO;
Packit ee6627
Packit ee6627
  return stl;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeList_setMajor(struct mwSametimeList *l, guint v) {
Packit ee6627
  g_return_if_fail(l != NULL);
Packit ee6627
  l->ver_major = v;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
guint mwSametimeList_getMajor(struct mwSametimeList *l) {
Packit ee6627
  g_return_val_if_fail(l != NULL, 0);
Packit ee6627
  return l->ver_major;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeList_setMinor(struct mwSametimeList *l, guint v) {
Packit ee6627
  g_return_if_fail(l != NULL);
Packit ee6627
  l->ver_minor = v;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
guint mwSametimeList_getMinor(struct mwSametimeList *l) {
Packit ee6627
  g_return_val_if_fail(l != NULL, 0);
Packit ee6627
  return l->ver_minor;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeList_setMicro(struct mwSametimeList *l, guint v) {
Packit ee6627
  g_return_if_fail(l != NULL);
Packit ee6627
  l->ver_micro = v;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
guint mwSametimeList_getMicro(struct mwSametimeList *l) {
Packit ee6627
  g_return_val_if_fail(l != NULL, 0);
Packit ee6627
  return l->ver_micro;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
GList *mwSametimeList_getGroups(struct mwSametimeList *l) {
Packit ee6627
  g_return_val_if_fail(l != NULL, NULL);
Packit ee6627
  return g_list_copy(l->groups);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeGroup *
Packit ee6627
mwSametimeList_findGroup(struct mwSametimeList *l,
Packit ee6627
			 const char *name) {
Packit ee6627
  GList *s;
Packit ee6627
Packit ee6627
  g_return_val_if_fail(l != NULL, NULL);
Packit ee6627
  g_return_val_if_fail(name != NULL, NULL);
Packit ee6627
  g_return_val_if_fail(*name != '\0', NULL);
Packit ee6627
Packit ee6627
  for(s = l->groups; s; s = s->next) {
Packit ee6627
    struct mwSametimeGroup *g = s->data;
Packit ee6627
    if(! strcmp(g->name, name)) return g;
Packit ee6627
  }
Packit ee6627
Packit ee6627
  return NULL;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeList_free(struct mwSametimeList *l) {
Packit ee6627
  g_return_if_fail(l != NULL);
Packit ee6627
  list_free(l);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeGroup *
Packit ee6627
mwSametimeGroup_new(struct mwSametimeList *list,
Packit ee6627
		    enum mwSametimeGroupType type,
Packit ee6627
		    const char *name) {
Packit ee6627
  
Packit ee6627
  struct mwSametimeGroup *stg;
Packit ee6627
Packit ee6627
  g_return_val_if_fail(list != NULL, NULL);
Packit ee6627
  g_return_val_if_fail(name != NULL, NULL);
Packit ee6627
  g_return_val_if_fail(*name != '\0', NULL);
Packit ee6627
Packit ee6627
  stg = g_new0(struct mwSametimeGroup, 1);
Packit ee6627
  stg->list = list;
Packit ee6627
  stg->type = type;
Packit ee6627
  stg->name = g_strdup(name);
Packit ee6627
Packit ee6627
  list->groups = g_list_append(list->groups, stg);
Packit ee6627
Packit ee6627
  return stg;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
enum mwSametimeGroupType mwSametimeGroup_getType(struct mwSametimeGroup *g) {
Packit ee6627
  g_return_val_if_fail(g != NULL, mwSametimeGroup_UNKNOWN);
Packit ee6627
  return g->type;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
const char *mwSametimeGroup_getName(struct mwSametimeGroup *g) {
Packit ee6627
  g_return_val_if_fail(g != NULL, NULL);
Packit ee6627
  return g->name;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeGroup_setAlias(struct mwSametimeGroup *g,
Packit ee6627
			      const char *alias) {
Packit ee6627
  g_return_if_fail(g != NULL);
Packit ee6627
Packit ee6627
  g_free(g->alias);
Packit ee6627
  g->alias = g_strdup(alias);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
const char *mwSametimeGroup_getAlias(struct mwSametimeGroup *g) {
Packit ee6627
  g_return_val_if_fail(g != NULL, NULL);
Packit ee6627
  return g->alias;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeGroup_setOpen(struct mwSametimeGroup *g, gboolean open) {
Packit ee6627
  g_return_if_fail(g != NULL);
Packit ee6627
  g->open = open;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
gboolean mwSametimeGroup_isOpen(struct mwSametimeGroup *g) {
Packit ee6627
  g_return_val_if_fail(g != NULL, FALSE);
Packit ee6627
  return g->open;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeList *mwSametimeGroup_getList(struct mwSametimeGroup *g) {
Packit ee6627
  g_return_val_if_fail(g != NULL, NULL);
Packit ee6627
  return g->list;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
GList *mwSametimeGroup_getUsers(struct mwSametimeGroup *g) {
Packit ee6627
  g_return_val_if_fail(g != NULL, NULL);
Packit ee6627
  return g_list_copy(g->users);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeUser *
Packit ee6627
mwSametimeGroup_findUser(struct mwSametimeGroup *g,
Packit ee6627
			 struct mwIdBlock *user) {
Packit ee6627
  GList *s;
Packit ee6627
Packit ee6627
  g_return_val_if_fail(g != NULL, NULL);
Packit ee6627
  g_return_val_if_fail(user != NULL, NULL);
Packit ee6627
Packit ee6627
  for(s = g->users; s; s = s->next) {
Packit ee6627
    struct mwSametimeUser *u = s->data;
Packit ee6627
    if(mwIdBlock_equal(user, &u->id)) return u;
Packit ee6627
  }
Packit ee6627
Packit ee6627
  return NULL;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeGroup_free(struct mwSametimeGroup *g) {
Packit ee6627
  g_return_if_fail(g != NULL);
Packit ee6627
  g_return_if_fail(g->list != NULL);
Packit ee6627
  group_free(g);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeUser *
Packit ee6627
mwSametimeUser_new(struct mwSametimeGroup *group,
Packit ee6627
		   enum mwSametimeUserType type,
Packit ee6627
		   struct mwIdBlock *id) {
Packit ee6627
Packit ee6627
  struct mwSametimeUser *stu;
Packit ee6627
Packit ee6627
  g_return_val_if_fail(group != NULL, NULL);
Packit ee6627
  g_return_val_if_fail(id != NULL, NULL);
Packit ee6627
  
Packit ee6627
  stu = g_new0(struct mwSametimeUser, 1);
Packit ee6627
  stu->group = group;
Packit ee6627
  stu->type = type;
Packit ee6627
  mwIdBlock_clone(&stu->id, id);
Packit ee6627
Packit ee6627
  group->users = g_list_append(group->users, stu);
Packit ee6627
  
Packit ee6627
  return stu;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeGroup *mwSametimeUser_getGroup(struct mwSametimeUser *u) {
Packit ee6627
  g_return_val_if_fail(u != NULL, NULL);
Packit ee6627
  return u->group;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
enum mwSametimeUserType mwSametimeUser_getType(struct mwSametimeUser *u) {
Packit ee6627
  g_return_val_if_fail(u != NULL, mwSametimeUser_UNKNOWN);
Packit ee6627
  return u->type;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
const char *mwSametimeUser_getUser(struct mwSametimeUser *u) {
Packit ee6627
  g_return_val_if_fail(u != NULL, NULL);
Packit ee6627
  return u->id.user;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
const char *mwSametimeUser_getCommunity(struct mwSametimeUser *u) {
Packit ee6627
  g_return_val_if_fail(u != NULL, NULL);
Packit ee6627
  return u->id.community;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeUser_setShortName(struct mwSametimeUser *u, const char *name) {
Packit ee6627
  g_return_if_fail(u != NULL);
Packit ee6627
  g_free(u->name);
Packit ee6627
  u->name = g_strdup(name);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
const char *mwSametimeUser_getShortName(struct mwSametimeUser *u) {
Packit ee6627
  g_return_val_if_fail(u != NULL, NULL);
Packit ee6627
  return u->name;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeUser_setAlias(struct mwSametimeUser *u, const char *alias) {
Packit ee6627
  g_return_if_fail(u != NULL);
Packit ee6627
  g_free(u->alias);
Packit ee6627
  u->alias = g_strdup(alias);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
const char *mwSametimeUser_getAlias(struct mwSametimeUser *u) {
Packit ee6627
  g_return_val_if_fail(u != NULL, NULL);
Packit ee6627
  return u->alias;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeUser_free(struct mwSametimeUser *u) {
Packit ee6627
  g_return_if_fail(u != NULL);
Packit ee6627
  g_return_if_fail(u->group != NULL);
Packit ee6627
  user_free(u);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static void str_replace(char *str, char from, char to) {
Packit ee6627
  if(! str) return;
Packit ee6627
  for(; *str; str++) if(*str == from) *str = to;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static char user_type_to_char(enum mwSametimeUserType type) {
Packit ee6627
  switch(type) {
Packit ee6627
  case mwSametimeUser_NORMAL:    return '1';
Packit ee6627
  case mwSametimeUser_EXTERNAL:  return '2';
Packit ee6627
  case mwSametimeUser_UNKNOWN:
Packit ee6627
  default:                       return '9';
Packit ee6627
  }
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static enum mwSametimeUserType user_char_to_type(char type) {
Packit ee6627
  switch(type) {
Packit ee6627
  case '1':  return mwSametimeUser_NORMAL;
Packit ee6627
  case '2':  return mwSametimeUser_EXTERNAL;
Packit ee6627
  default:   return mwSametimeUser_UNKNOWN;
Packit ee6627
  }
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static void user_put(GString *str, struct mwSametimeUser *u) {
Packit ee6627
  char *id, *name, *alias;
Packit ee6627
  char type;
Packit ee6627
  
Packit ee6627
  id = g_strdup(u->id.user);
Packit ee6627
  name = g_strdup(u->name);
Packit ee6627
  alias = g_strdup(u->alias);
Packit ee6627
  type = user_type_to_char(u->type);
Packit ee6627
Packit ee6627
  if(id) str_replace(id, ' ', ';');
Packit ee6627
  if(name) str_replace(name, ' ', ';');
Packit ee6627
  if(alias) str_replace(alias, ' ', ';');
Packit ee6627
Packit ee6627
  if(!name && alias) {
Packit ee6627
    name = alias;
Packit ee6627
    alias = NULL;
Packit ee6627
  }
Packit ee6627
Packit ee6627
  g_string_append_printf(str, "U %s%c:: %s,%s\r\n",
Packit ee6627
			 id, type, (name? name: ""), (alias? alias: ""));
Packit ee6627
Packit ee6627
  g_free(id);
Packit ee6627
  g_free(name);
Packit ee6627
  g_free(alias);  
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static char group_type_to_char(enum mwSametimeGroupType type) {
Packit ee6627
  switch(type) {
Packit ee6627
  case mwSametimeGroup_NORMAL:   return '2';
Packit ee6627
  case mwSametimeGroup_DYNAMIC:  return '3';
Packit ee6627
  case mwSametimeGroup_UNKNOWN:
Packit ee6627
  default:                       return '9';
Packit ee6627
  }
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static enum mwSametimeGroupType group_char_to_type(char type) {
Packit ee6627
  switch(type) {
Packit ee6627
  case '2':  return mwSametimeGroup_NORMAL;
Packit ee6627
  case '3':  return mwSametimeGroup_DYNAMIC;
Packit ee6627
  default:   return mwSametimeGroup_UNKNOWN;
Packit ee6627
  }
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static void group_put(GString *str, struct mwSametimeGroup *g) {
Packit ee6627
  char *name, *alias;
Packit ee6627
  char type;
Packit ee6627
  GList *gl;
Packit ee6627
Packit ee6627
  name = g_strdup(g->name);
Packit ee6627
  alias = g_strdup((g->alias)? g->alias: name);
Packit ee6627
  type = group_type_to_char(g->type);
Packit ee6627
Packit ee6627
  str_replace(name, ' ', ';');
Packit ee6627
  str_replace(alias, ' ', ';');
Packit ee6627
Packit ee6627
  g_string_append_printf(str, "G %s%c %s %c\r\n",
Packit ee6627
			 name, type, alias, (g->open? 'O':'C'));
Packit ee6627
Packit ee6627
  for(gl = g->users; gl; gl = gl->next) {
Packit ee6627
    user_put(str, gl->data);
Packit ee6627
  }
Packit ee6627
Packit ee6627
  g_free(name);
Packit ee6627
  g_free(alias);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
/** composes a GString with the written contents of a sametime list */
Packit ee6627
static GString *list_store(struct mwSametimeList *l) {
Packit ee6627
  GString *str;
Packit ee6627
  GList *gl;
Packit ee6627
Packit ee6627
  g_return_val_if_fail(l != NULL, NULL);
Packit ee6627
Packit ee6627
  str = g_string_new(NULL);
Packit ee6627
  g_string_append_printf(str, "Version=%u.%u.%u\r\n",
Packit ee6627
			 l->ver_major, l->ver_minor, l->ver_micro);
Packit ee6627
Packit ee6627
  for(gl = l->groups; gl; gl = gl->next) {
Packit ee6627
    group_put(str, gl->data);
Packit ee6627
  }
Packit ee6627
Packit ee6627
  return str;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
char *mwSametimeList_store(struct mwSametimeList *l) {
Packit ee6627
  GString *str;
Packit ee6627
  char *s;
Packit ee6627
Packit ee6627
  g_return_val_if_fail(l != NULL, NULL);
Packit ee6627
Packit ee6627
  str = list_store(l);
Packit ee6627
  s = str->str;
Packit ee6627
  g_string_free(str, FALSE);
Packit ee6627
  return s;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeList_put(struct mwPutBuffer *b, struct mwSametimeList *l) {
Packit ee6627
  GString *str;
Packit ee6627
  guint16 len;
Packit ee6627
Packit ee6627
  g_return_if_fail(l != NULL);
Packit ee6627
  g_return_if_fail(b != NULL);
Packit ee6627
Packit ee6627
  str = list_store(l);
Packit ee6627
  len = (guint16) str->len;
Packit ee6627
  guint16_put(b, len);
Packit ee6627
  mwPutBuffer_write(b, str->str, len);
Packit ee6627
Packit ee6627
  g_string_free(str, TRUE);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static void get_version(const char *line, struct mwSametimeList *l) {
Packit ee6627
  guint major = 0, minor = 0, micro = 0;
Packit ee6627
  int ret;
Packit ee6627
Packit ee6627
  ret = sscanf(line, "Version=%u.%u.%u\n", &major, &minor, µ);
Packit ee6627
  if(ret != 3) {
Packit ee6627
    g_warning("strange sametime list version line:\n%s", line);
Packit ee6627
  }
Packit ee6627
Packit ee6627
  l->ver_major = major;
Packit ee6627
  l->ver_minor = minor;
Packit ee6627
  l->ver_micro = micro;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static struct mwSametimeGroup *get_group(const char *line,
Packit ee6627
					 struct mwSametimeList *l) {
Packit ee6627
  struct mwSametimeGroup *group;
Packit ee6627
  char *name, *alias;
Packit ee6627
  char type = '2', open = 'O';
Packit ee6627
  int ret;
Packit ee6627
Packit ee6627
  ret = strlen(line);
Packit ee6627
  name = g_malloc0(ret);
Packit ee6627
  alias = g_malloc0(ret);
Packit ee6627
Packit ee6627
  ret = sscanf(line, "G %s %s %c\n",
Packit ee6627
	       name, alias, &open;;
Packit ee6627
Packit ee6627
  if(ret < 3) {
Packit ee6627
    g_warning("strange sametime list group line:\n%s", line);
Packit ee6627
  }
Packit ee6627
  
Packit ee6627
  str_replace(name, ';', ' ');
Packit ee6627
  str_replace(alias, ';', ' ');
Packit ee6627
Packit ee6627
  if(name && *name) {
Packit ee6627
    int l = strlen(name)-1;
Packit ee6627
    type = name[l];
Packit ee6627
    name[l] = '\0';
Packit ee6627
  }
Packit ee6627
Packit ee6627
  group = g_new0(struct mwSametimeGroup, 1);
Packit ee6627
  group->list = l;
Packit ee6627
  group->name = name;
Packit ee6627
  group->type = group_char_to_type(type);
Packit ee6627
  group->alias = alias;
Packit ee6627
  group->open = (open == 'O');
Packit ee6627
Packit ee6627
  l->groups = g_list_append(l->groups, group);
Packit ee6627
Packit ee6627
  return group;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static void get_user(const char *line, struct mwSametimeGroup *g) {
Packit ee6627
  struct mwSametimeUser *user;
Packit ee6627
  struct mwIdBlock idb = { 0, 0 };
Packit ee6627
  char *name, *alias = NULL;
Packit ee6627
  char type = '1';
Packit ee6627
  int ret;
Packit ee6627
  
Packit ee6627
  ret = strlen(line);
Packit ee6627
  idb.user = g_malloc0(ret);
Packit ee6627
  name = g_malloc0(ret);
Packit ee6627
Packit ee6627
  ret = sscanf(line, "U %s %s",
Packit ee6627
	       idb.user, name);
Packit ee6627
Packit ee6627
  if(ret < 2) {
Packit ee6627
    g_warning("strange sametime list user line:\n%s", line);
Packit ee6627
  }
Packit ee6627
Packit ee6627
  str_replace(idb.user, ';', ' ');
Packit ee6627
  str_replace(name, ';', ' ');
Packit ee6627
Packit ee6627
  if(idb.user && *idb.user) {
Packit ee6627
    char *tmp = strstr(idb.user, "::");
Packit ee6627
    if(tmp--) {
Packit ee6627
      type = *(tmp);
Packit ee6627
      *tmp = '\0';
Packit ee6627
    }
Packit ee6627
  }
Packit ee6627
Packit ee6627
  if(name && *name) {
Packit ee6627
    char *tmp = strrchr(name, ',');
Packit ee6627
    if(tmp) {
Packit ee6627
      *tmp++ = '\0';
Packit ee6627
      if(*tmp) alias = tmp;
Packit ee6627
    }
Packit ee6627
  }
Packit ee6627
Packit ee6627
  user = g_new0(struct mwSametimeUser, 1);
Packit ee6627
  user->group = g;
Packit ee6627
  user->id.user = idb.user;
Packit ee6627
  user->type = user_char_to_type(type);
Packit ee6627
  user->name = name;
Packit ee6627
  user->alias = g_strdup(alias);
Packit ee6627
  
Packit ee6627
  g->users = g_list_append(g->users, user);
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
/** returns a line from str, and advances str */
Packit ee6627
static char *fetch_line(char **str) {
Packit ee6627
  char *start = *str;
Packit ee6627
  char *end;
Packit ee6627
Packit ee6627
  /* move to first non-whitespace character */
Packit ee6627
  while(*start && g_ascii_isspace(*start)) start++;
Packit ee6627
  if(! *start) return NULL;
Packit ee6627
Packit ee6627
  for(end = start + 1; *end; end++) {
Packit ee6627
    if(*end == '\n' || *end == '\r') {
Packit ee6627
      *(end++) = '\0';
Packit ee6627
      break;
Packit ee6627
    }
Packit ee6627
  }
Packit ee6627
Packit ee6627
  *str = end;
Packit ee6627
  return start;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
static void list_get(const char *lines, struct mwSametimeList *l) {
Packit ee6627
  char *s = (char *) lines;
Packit ee6627
  char *line;
Packit ee6627
Packit ee6627
  struct mwSametimeGroup *g = NULL;
Packit ee6627
  
Packit ee6627
  while( (line = fetch_line(&s)) ) {
Packit ee6627
    switch(*line) {
Packit ee6627
    case 'V':
Packit ee6627
      get_version(line, l);
Packit ee6627
      break;
Packit ee6627
Packit ee6627
    case 'G':
Packit ee6627
      g = get_group(line, l);
Packit ee6627
      break;
Packit ee6627
Packit ee6627
    case 'U':
Packit ee6627
      get_user(line, g);
Packit ee6627
      break;
Packit ee6627
Packit ee6627
    default:
Packit ee6627
      g_warning("unknown sametime list data line:\n%s", line);
Packit ee6627
    }
Packit ee6627
  }  
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
struct mwSametimeList *mwSametimeList_load(const char *data) {
Packit ee6627
  struct mwSametimeList *l;
Packit ee6627
Packit ee6627
  g_return_val_if_fail(data != NULL, NULL);
Packit ee6627
  
Packit ee6627
  l = mwSametimeList_new();
Packit ee6627
  list_get(data, l);
Packit ee6627
Packit ee6627
  return l;
Packit ee6627
}
Packit ee6627
Packit ee6627
Packit ee6627
void mwSametimeList_get(struct mwGetBuffer *b, struct mwSametimeList *l) {
Packit ee6627
  char *str = NULL;
Packit ee6627
Packit ee6627
  g_return_if_fail(l != NULL);
Packit ee6627
  g_return_if_fail(b != NULL);
Packit ee6627
Packit ee6627
  mwString_get(b, &str);
Packit ee6627
  if (str) {
Packit ee6627
    list_get(str, l);
Packit ee6627
    g_free(str);
Packit ee6627
  }
Packit ee6627
}
Packit ee6627