Blame src/st_list.c

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