Mercurial > pidgin.yaz
diff libgaim/protocols/novell/nmuserrecord.c @ 14192:60b1bc8dbf37
[gaim-migrate @ 16863]
Renamed 'core' to 'libgaim'
committer: Tailor Script <tailor@pidgin.im>
author | Evan Schoenberg <evan.s@dreskin.net> |
---|---|
date | Sat, 19 Aug 2006 01:50:10 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgaim/protocols/novell/nmuserrecord.c Sat Aug 19 01:50:10 2006 +0000 @@ -0,0 +1,561 @@ +/* + * nmuserrecord.c + * + * Copyright (c) 2004 Novell, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <glib.h> +#include <string.h> +#include "nmuserrecord.h" +#include "nmfield.h" +#include "nmuser.h" + +struct _NMUserRecord +{ + NMSTATUS_T status; + char *status_text; + char *dn; + char *cn; + char *display_id; + char *fname; + char *lname; + char *full_name; + NMField *fields; + gboolean auth_attr; + gpointer data; + int ref_count; +}; + +struct _NMProperty +{ + char *tag; + char *value; +}; + +static int count = 0; + +/* API functions */ + +NMUserRecord * +nm_create_user_record() +{ + NMUserRecord *user_record = g_new0(NMUserRecord, 1); + + user_record->ref_count = 1; + + gaim_debug(GAIM_DEBUG_INFO, "novell", "Creating user_record, total=%d\n", + count++); + + return user_record; +} + +static char * +_get_attribute_value(NMField *field) +{ + char *value = NULL; + + if (field->ptr_value == NULL) + return NULL; + + if (field->type == NMFIELD_TYPE_UTF8 || field->type == NMFIELD_TYPE_DN) { + + value = (char *)field->ptr_value; + + } else if (field->type == NMFIELD_TYPE_MV) { + + /* Need to handle multi-valued returns, for now + * just pick the first value and return it + */ + NMField *tmp = (NMField *)field->ptr_value; + if ((tmp != NULL) && + ((tmp->type == NMFIELD_TYPE_UTF8) || + (tmp->type == NMFIELD_TYPE_DN))) { + + value = (char *)tmp->ptr_value; + + } else { + return NULL; + } + + } else { + return NULL; + } + + return g_strdup(value); +} +/* + * This creates a user_record for the reference list the + * field array that is passed in should be a + * NM_A_FA_USER_DETAILS array. + */ +NMUserRecord * +nm_create_user_record_from_fields(NMField * details) +{ + NMUserRecord *user_record; + NMField *field, *fields = details; + + if (details == NULL) { + return NULL; + } + + if (details->type == NMFIELD_TYPE_ARRAY) { + if (details->ptr_value == NULL) + return NULL; + fields = (NMField *) details->ptr_value; + } + + user_record = nm_create_user_record(); + + if ((field = nm_locate_field(NM_A_SZ_AUTH_ATTRIBUTE, fields))) { + + if (field->ptr_value) { + user_record->display_id = _get_attribute_value(field); + user_record->auth_attr = TRUE; + } + } + + if ((field = nm_locate_field(NM_A_SZ_DN, fields))) { + + if (field->ptr_value) { + user_record->dn = _get_attribute_value(field); + } + } + + if ((field = nm_locate_field("CN", fields))) { + + if (field->ptr_value) { + user_record->cn = _get_attribute_value(field); + } + } + + if ((field = nm_locate_field("Given Name", fields))) { + + if (field->ptr_value) { + user_record->fname = _get_attribute_value(field); + } + } + + if ((field = nm_locate_field("Surname", fields))) { + + if (field->ptr_value) { + user_record->lname = _get_attribute_value(field); + } + } + + if ((field = nm_locate_field("Full Name", fields))) { + + if (field->ptr_value) { + user_record->full_name = _get_attribute_value(field); + } + } + + if ((field = nm_locate_field(NM_A_SZ_STATUS, fields))) { + + if (field->ptr_value) + user_record->status = atoi((char *) field->ptr_value); + + } + + if ((field = nm_locate_field(NM_A_SZ_MESSAGE_BODY, fields))) { + + if (field->ptr_value) + user_record->status_text = g_strdup((char *) field->ptr_value); + + } + + user_record->fields = nm_copy_field_array(fields); + + return user_record; +} + +void +nm_user_record_copy(NMUserRecord * dest, NMUserRecord * src) +{ + if (dest == NULL || src == NULL) + return; + + dest->status = src->status; + + /* Copy status text */ + if (dest->status_text) { + g_free(dest->status_text); + dest->status_text = NULL; + } + + if (src->status_text) + dest->status_text = g_strdup(src->status_text); + + /* Copy DN */ + if (dest->dn) { + g_free(dest->dn); + dest->dn = NULL; + } + + if (src->dn) + dest->dn = g_strdup(src->dn); + + /* Copy CN */ + if (dest->cn) { + g_free(dest->cn); + dest->cn = NULL; + } + + if (src->cn) + dest->cn = g_strdup(src->cn); + + /* Copy display id */ + if (dest->display_id) { + g_free(dest->display_id); + dest->display_id = NULL; + } + + if (src->display_id) + dest->display_id = g_strdup(src->display_id); + + /* Copy first name */ + if (dest->fname) { + g_free(dest->fname); + dest->fname = NULL; + } + + if (src->fname) + dest->fname = g_strdup(src->fname); + + /* Copy last name */ + if (dest->lname) { + g_free(dest->lname); + dest->lname = NULL; + } + + if (src->lname) + dest->lname = g_strdup(src->lname); + + /* Copy full name */ + if (dest->full_name) { + g_free(dest->full_name); + dest->full_name = NULL; + } + + if (src->full_name) + dest->full_name = g_strdup(src->full_name); + + /* Copy fields */ + if (src->fields) { + + if (dest->fields) { + nm_free_fields(&dest->fields); + } + + dest->fields = nm_copy_field_array(src->fields); + } + + /* Copy data */ + dest->data = src->data; +} + +void +nm_user_record_add_ref(NMUserRecord * user_record) +{ + if (user_record) + user_record->ref_count++; +} + +void +nm_release_user_record(NMUserRecord * user_record) +{ + if (--(user_record->ref_count) == 0) { + + gaim_debug(GAIM_DEBUG_INFO, "novell", + "Releasing user_record, total=%d\n", --count); + + if (user_record->dn) { + g_free(user_record->dn); + } + + if (user_record->cn) { + g_free(user_record->cn); + } + + if (user_record->display_id) { + g_free(user_record->display_id); + } + + if (user_record->fname) { + g_free(user_record->fname); + } + + if (user_record->lname) { + g_free(user_record->lname); + } + + if (user_record->full_name) { + g_free(user_record->full_name); + } + + if (user_record->status_text) { + g_free(user_record->status_text); + } + + nm_free_fields(&user_record->fields); + + g_free(user_record); + } +} + +/* UserRecord API */ + +NMSTATUS_T +nm_user_record_get_status(NMUserRecord * user_record) +{ + if (user_record == NULL) + return (NMSTATUS_T) - 1; + + return user_record->status; + +} + +const char * +nm_user_record_get_status_text(NMUserRecord * user_record) +{ + if (user_record == NULL) + return NULL; + + return user_record->status_text; +} + +void +nm_user_record_set_dn(NMUserRecord * user_record, const char *dn) +{ + if (user_record != NULL && dn != NULL) { + if (user_record->dn) + g_free(user_record->dn); + + user_record->dn = g_strdup(dn); + } +} + +const char * +nm_user_record_get_dn(NMUserRecord * user_record) +{ + if (user_record == NULL) + return NULL; + + return user_record->dn; +} + +void +nm_user_record_set_userid(NMUserRecord * user_record, const char *userid) +{ + if (user_record != NULL && userid != NULL) { + if (user_record->cn) + g_free(user_record->cn); + + user_record->cn = g_strdup(userid); + } +} + +const char * +nm_user_record_get_userid(NMUserRecord * user_record) +{ + if (user_record == NULL) + return NULL; + + return user_record->cn; +} + +void +nm_user_record_set_display_id(NMUserRecord * user_record, const char *display_id) +{ + if (user_record != NULL && display_id != NULL) { + if (user_record->display_id) + g_free(user_record->display_id); + + user_record->display_id = g_strdup(display_id); + } +} + +const char * +nm_user_record_get_display_id(NMUserRecord * user_record) +{ + if (user_record == NULL) + return NULL; + + if (user_record->display_id == NULL) { + user_record->display_id = nm_typed_to_dotted(user_record->dn); + } + + return user_record->display_id; +} + +const char * +nm_user_record_get_full_name(NMUserRecord * user_record) +{ + if (user_record == NULL) + return NULL; + + if (user_record->full_name == NULL) { + if (user_record->fname && user_record->lname) { + user_record->full_name = g_strdup_printf("%s %s", + user_record->fname, + user_record->lname); + + } + } + + return user_record->full_name; +} + +const char * +nm_user_record_get_first_name(NMUserRecord * user_record) +{ + if (user_record == NULL) + return NULL; + + return user_record->fname; + +} + +const char * +nm_user_record_get_last_name(NMUserRecord * user_record) +{ + if (user_record == NULL) + return NULL; + + return user_record->lname; +} + +gpointer +nm_user_record_get_data(NMUserRecord * user_record) +{ + if (user_record == NULL) + return NULL; + + return user_record->data; +} + +void +nm_user_record_set_data(NMUserRecord * user_record, gpointer data) +{ + if (user_record == NULL) + return; + + user_record->data = data; +} + +void +nm_user_record_set_status(NMUserRecord * user_record, + int status, const char *text) +{ + if (user_record == NULL) + return; + + user_record->status = status; + + if (user_record->status_text) { + g_free(user_record->status_text); + user_record->status_text = NULL; + } + + if (text) + user_record->status_text = g_strdup(text); +} + +gboolean +nm_user_record_get_auth_attr(NMUserRecord *user_record) +{ + if (user_record == NULL) + return FALSE; + + return user_record->auth_attr; +} + +int +nm_user_record_get_property_count(NMUserRecord * user_record) +{ + NMField *locate, *fields; + + int count = 0; + + if (user_record && user_record->fields) { + locate = nm_locate_field(NM_A_FA_INFO_DISPLAY_ARRAY, + (NMField *) user_record->fields); + if (locate && (fields = (NMField *) (locate->ptr_value))) { + count = (int) nm_count_fields(fields); + } + } + return count; +} + +NMProperty * +nm_user_record_get_property(NMUserRecord * user_record, int index) +{ + NMProperty *property = NULL; + NMField *field = NULL, *fields, *locate; + + if (user_record && user_record->fields) { + locate = nm_locate_field(NM_A_FA_INFO_DISPLAY_ARRAY, + (NMField *) user_record->fields); + if (locate && (fields = (NMField *) (locate->ptr_value))) { + int max = nm_count_fields(fields); + + if (index < max) { + if (user_record) { + field = &fields[index]; + if (field && field->tag && field->ptr_value) { + property = g_new0(NMProperty, 1); + property->tag = g_strdup(field->tag); + property->value = _get_attribute_value(field); + } + } + } + } + } + + return property; +} + +void +nm_release_property(NMProperty * property) +{ + if (property) { + if (property->tag) + g_free(property->tag); + + if (property->value) + g_free(property->value); + + g_free(property); + } +} + +const char * +nm_property_get_tag(NMProperty * property) +{ + if (property) + return property->tag; + else + return NULL; +} + +const char * +nm_property_get_value(NMProperty * property) +{ + if (property) + return property->value; + else + return NULL; +}