diff libpurple/protocols/novell/nmuserrecord.c @ 15373:5fe8042783c1

Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author Sean Egan <seanegan@gmail.com>
date Sat, 20 Jan 2007 02:32:10 +0000
parents
children 32c366eeeb99
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/novell/nmuserrecord.c	Sat Jan 20 02:32:10 2007 +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;
+}