diff src/protocols/novell/nmuser.h @ 8675:9ee2542d1104

[gaim-migrate @ 9428] A GroupWise plugin from Novell. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Sat, 17 Apr 2004 13:55:28 +0000
parents
children 046dd8ef2920
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/protocols/novell/nmuser.h	Sat Apr 17 13:55:28 2004 +0000
@@ -0,0 +1,569 @@
+/*
+ * nmuser.h
+ *
+ * Copyright © 2004 Unpublished Work of Novell, Inc. All Rights Reserved.
+ *
+ * THIS WORK IS AN UNPUBLISHED WORK OF NOVELL, INC. NO PART OF THIS WORK MAY BE
+ * USED, PRACTICED, PERFORMED, COPIED, DISTRIBUTED, REVISED, MODIFIED,
+ * TRANSLATED, ABRIDGED, CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED,
+ * RECAST, TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF NOVELL,
+ * INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT AUTHORIZATION COULD SUBJECT
+ * THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY.
+ * 
+ * AS BETWEEN [GAIM] AND NOVELL, NOVELL GRANTS [GAIM] THE RIGHT TO REPUBLISH
+ * THIS WORK UNDER THE GPL (GNU GENERAL PUBLIC LICENSE) WITH ALL RIGHTS AND
+ * LICENSES THEREUNDER.  IF YOU HAVE RECEIVED THIS WORK DIRECTLY OR INDIRECTLY
+ * FROM [GAIM] AS PART OF SUCH A REPUBLICATION, YOU HAVE ALL RIGHTS AND LICENSES
+ * GRANTED BY [GAIM] UNDER THE GPL.  IN CONNECTION WITH SUCH A REPUBLICATION, IF
+ * ANYTHING IN THIS NOTICE CONFLICTS WITH THE TERMS OF THE GPL, SUCH TERMS
+ * PREVAIL.
+ *
+ */
+
+#ifndef __NM_USER_H__
+#define __NM_USER_H__
+
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef guint32 NMERR_T;
+typedef int NMSTATUS_T;
+
+typedef struct _NMUser NMUser;
+
+typedef enum
+{
+	NMREQUEST_TYPE_LOGIN = 0,
+	NMREQUEST_TYPE_LOGOUT,
+	NMREQUEST_TYPE_SETSTATUS,
+	NMREQUEST_TYPE_GETDETAILS,
+	NMREQUEST_TYPE_CREATECONF,
+	NMREQUEST_TYPE_SENDMESSAGE,
+	NMREQUEST_TYPE_JOINCONF,
+	NMREQUEST_TYPE_LEAVECONF,
+	NMREQUEST_TYPE_REJECTCONF,
+	NMREQUEST_TYPE_SENDTYPING,
+	NMREQUEST_TYPE_CREATECONTACT,
+	NMREQUEST_TYPE_DELETECONTACT
+
+} NMRequestType;
+
+#include "debug.h"
+#include "nmmessage.h"
+#include "nmconference.h"
+#include "nmcontact.h"
+#include "nmuserrecord.h"
+#include "nmfield.h"
+#include "nmevent.h"
+
+/* Callback typedefs */
+typedef void (*nm_response_cb) (NMUser * user, NMERR_T ret_code,
+								gpointer resp_data, gpointer user_data);
+
+typedef void (*nm_event_cb) (NMUser * user, NMEvent * event);
+
+#include "nmrequest.h"
+#include "nmconn.h"
+
+/* This represents user that we are currently logged in as */
+struct _NMUser
+{
+
+	char *name;
+
+	NMSTATUS_T status;
+
+	/* A copy of the login response fields */
+	NMField *fields;
+
+	/* The user record for this user */
+	NMUserRecord *user_record;
+
+	/* Our connection information */
+	NMConn *conn;
+
+	/* Our public IP address */
+	char *address;
+
+	/* This is the contact list */
+	NMFolder *root_folder;
+
+	/* All contacts that we know about hashed by dn */
+	GHashTable *contacts;
+
+	/* All user records hashed by dn */
+	GHashTable *user_records;
+
+	/* DN lookup */
+	GHashTable *display_id_to_dn;
+
+	/* One on one conversations indexed by recipient's dn */
+	GSList *conferences;
+
+	guint32 conference_count;
+
+	/* Called when we receive an event */
+	nm_event_cb evt_callback;
+
+	/* Pending requests. If we need to go to the server to more info
+	 * before processing a request we will queue it up and process when
+	 * we get a response
+	 */
+	GSList *pending_requests;
+
+	/* Pending events. Same as above except for events. */
+	GSList *pending_events;
+
+	/* Generic pointer to data needed by the client
+	 * using the API
+	 */
+	gpointer client_data;
+
+};
+
+
+#define	NM_STATUS_UNKNOWN			0
+#define	NM_STATUS_OFFLINE			1
+#define NM_STATUS_AVAILABLE			2
+#define	NM_STATUS_BUSY				3
+#define	NM_STATUS_AWAY				4
+#define	NM_STATUS_AWAY_IDLE			5
+#define	NM_STATUS_INVALID			6
+
+#define NMERR_BASE							0x2000L
+#define NM_OK								0L
+#define NMERR_BAD_PARM						(NMERR_BASE + 0x0001)
+#define NMERR_TCP_WRITE						(NMERR_BASE + 0x0002)
+#define NMERR_TCP_READ						(NMERR_BASE + 0x0003)
+#define NMERR_PROTOCOL						(NMERR_BASE + 0x0004)
+#define NMERR_SSL_REDIRECT					(NMERR_BASE + 0x0005)
+#define NMERR_CONFERENCE_NOT_FOUND 			(NMERR_BASE + 0x0006)
+#define NMERR_CONFERENCE_NOT_INSTANTIATED 	(NMERR_BASE + 0x0007)
+#define NMERR_FOLDER_EXISTS					(NMERR_BASE + 0x0008)
+
+
+/** 
+ *	Initialize the user that we are going to login to the system as.
+ *
+ *	@param	name			The userid of the user
+ *	@param	server			IP Address of server
+ *	@param	port			Port to connect to on the server
+ *  @param 	data			Client data to associate with the user
+ *	@param	event_callback	Function to call when we recieve an event
+ *
+ *	@return The initialized user object. Must be freed by calling
+ *			nm_deinitialize_user
+ */
+NMUser *nm_initialize_user(const char *name, const char *server, int port,
+						   gpointer data, nm_event_cb event_callback);
+
+
+/** 
+ *	Free up resources associated with the user object.
+ *
+ *  @param	user	The user to deinitialize
+ */
+void nm_deinitialize_user(NMUser * user);
+
+/** 
+ *	Send a login request to the server.
+ *
+ *	The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The User to login -- must be initialized
+ *	@param	pwd			The password of the user
+ *  @param  my_addr		The address of the client machine
+ *  @param	user_agent	String describing the client (eg. "Gaim/0.76 (Linux; 2.4.20)")
+ *	@param	callback	Function to call when we get the response from the server
+ *  @param 	data		User defined data to be passed to the callback function
+ * 
+ *
+ *	@return	NM_OK if login is sent successfully, error otherwise.
+ */
+NMERR_T nm_send_login(NMUser * user, const char *pwd, const char *my_addr,
+					  const char *user_agent, nm_response_cb callback,
+					  gpointer data);
+
+/** 
+ *	Send a set status request to the server.
+ *
+ *	The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	dn			The DN of the user (if known, or NULL if not known)
+ *	@param	address		IP Address of server
+ *	@param	callback	Function to call when we get the response from the server
+ *
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_set_status(NMUser * user, int status, const char *text,
+						   const char *auto_resp, nm_response_cb callback,
+						   gpointer data);
+
+/** 
+ *	Send a create conference to the server.
+ *
+ *	The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	conference	Conference to create
+ *	@param	callback	Function to call when we get the response from the server
+ *	@param	data		User defined data to be passed to the callback function
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_create_conference(NMUser * user, NMConference * conference,
+								  nm_response_cb callback, gpointer data);
+
+/** 
+ *	Tell server we have left the conference.
+ * 
+ *	The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	conference	Conference the user is leaving
+ *	@param	callback	Function to call when we get the response from the server
+ *	@param	data		User defined data to be passed to the callback function
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_leave_conference(NMUser * user, NMConference * conference,
+								 nm_response_cb callback, gpointer data);
+
+/** 
+ *	Send a join conference request to the server.
+ *
+ *	The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	conference	Conference the user is joining
+ *	@param	callback	Function to call when we get the response from the server
+ *	@param	data		User defined data to be passed to the callback function
+ *
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_join_conference(NMUser * user, NMConference * conference,
+								nm_response_cb callback, gpointer data);
+
+/** 
+ *	Send a conference reject request to the server.
+ *
+ *	The response data sent to the callback will be NULL. 
+ *
+ *  @param	user		The logged in User
+ *	@param	conference	Conference the user is rejecting
+ *	@param	callback	Function to call when we get the response from the server
+ *	@param	data		User defined data to be passed to the callback function
+ *
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_reject_conference(NMUser * user, NMConference * conference,
+								  nm_response_cb callback, gpointer data);
+
+/** 
+ *	Get details for a user from the server.
+ * 
+ *	The response data sent to the callback will be an NMUserRecord which should be
+ *  freed with nm_release_user_record
+ *
+ *  @param	user		The logged in User
+ *	@param	name		Userid or DN of the user to look up
+ *	@param	callback	Function to call when we get the response from the server
+ *	@param	data		User defined data to be passed to the callback function
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_get_details(NMUser * user, const char *name,
+							nm_response_cb callback, gpointer data);
+
+/** 
+ *	Get details for multiple users from the server.
+ * 
+ *	The response data to the callback will be a list of NMUserRecord, which should be
+ *	freed (each user record should be released with nm_release_user_record and the 
+ *  list should be freed)
+ *
+ *  @param	user		The logged in User
+ *	@param	name		Userid or DN of the user to look up
+ *	@param	callback	Function to call when we get the response from the server
+ *	@param	data		User defined data to be passed to the callback function
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_multiple_get_details(NMUser *user, GSList *names,
+									 nm_response_cb callback, gpointer data);
+
+/** 
+ *	Send a message.
+ *
+ *  The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	message		The message to send.
+ *	@param	callback	Function to call when we get the response from the server
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_message(NMUser * user, NMMessage * message,
+						nm_response_cb callback);
+
+/** 
+ *	Sends a typing event to the server.
+ *
+ *  The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	conf		The conference that corresponds to the typing event
+ *	@param	typing		TRUE if the user is typing
+ *						FALSE if the user has stopped typing
+ *	@param	callback	Function to call when we get the response from the server
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_typing(NMUser * user, NMConference * conf,
+					   gboolean typing, nm_response_cb callback);
+
+/** 
+ *	Send a create contact request to the server.
+ *
+ *  The given folder should already exist on the server. If not,
+ *  the call will fail.
+ *
+ *  The response data sent to the callback will be a NMContact which should
+ *  be released with nm_release_contact
+ *
+ *  @param	user		The logged in User
+ *	@param	folder		The folder that the contact should be created in
+ *	@param	contact		The contact to add
+ *	@param	callback	Function to call when we get the response from the server
+ *	@param	data		User defined data
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_create_contact(NMUser * user, NMFolder * folder,
+							   NMContact * contact, nm_response_cb callback,
+							   gpointer data);
+
+/** 
+ *	Send a remove contact request to the server.
+ *
+ *  The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	folder		The folder to remove contact from
+ *	@param	contact		The contact to remove
+ *	@param	callback	Function to call when we get the response from the server
+ *  @param	data		User defined data
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_remove_contact(NMUser * user, NMFolder * folder,
+							   NMContact * contact, nm_response_cb callback,
+							   gpointer data);
+
+/** 
+ *	Send a create folder request to the server.
+ *
+ *  The response data sent to the callback will be a NMFolder which should be
+ *  released with nm_release_folder
+ *
+ *  @param	user		The logged in User
+ *	@param	name		The name of the folder to create
+ *	@param	callback	Function to call when we get the response from the server
+ *  @param	data		User defined data
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_create_folder(NMUser * user, const char *name,
+							  nm_response_cb callback, gpointer data);
+
+/** 
+ *	Send a delete folder request to the server.
+ *
+ *  The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	folder		The name of the folder to remove
+ *	@param	callback	Function to call when we get the response from the server
+ *  @param	data		User defined data
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_remove_folder(NMUser * user, NMFolder * folder,
+							  nm_response_cb callback, gpointer data);
+
+/** 
+ *	Send a rename contact request to the server.
+ *
+ *	The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	contact		The contact to rename
+ *  @param	new_name	The new display name for the contact
+ *	@param	callback	Function to call when we get the response from the server
+ *  @param	data		User defined data
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_rename_contact(NMUser * user, NMContact * contact,
+							   const char *new_name, nm_response_cb callback,
+							   gpointer data);
+
+/** 
+ *	Send a rename folder request to the server.
+ *
+ *	The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	folder		The folder to rename
+ *  @param	new_name	The new name of the folder
+ *	@param	callback	Function to call when we get the response from the server
+ *  @param	data		User defined data
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_rename_folder(NMUser * user, NMFolder * folder,
+							  const char *new_name, nm_response_cb callback,
+							  gpointer data);
+
+/** 
+ *	Send a move contact request to the server.
+ *
+ *	The response data sent to the callback will be NULL.
+ *
+ *  @param	user		The logged in User
+ *	@param	contact		The contact to move
+ *  @param	folder	    The folder to move the contact to
+ *	@param	callback	Function to call when we get the response from the server
+ *  @param	data		User defined data
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_move_contact(NMUser * user, NMContact * contact,
+							 NMFolder * folder, nm_response_cb callback,
+							 gpointer data);
+
+/** 
+ *	Send a get status request to the server.
+ *
+ * 	The response data sent to the callback will be a NMUserRecord.
+ *
+ *  @param	user		The logged in User
+ *	@param	contact		The contact to move
+ *  @param	folder	    The folder to move the contact to
+ *	@param	callback	Function to call when we get the response from the server
+ *  @param	data		User defined data
+ *
+ *	@return	NM_OK if successfully sent, error otherwise
+ */
+NMERR_T nm_send_get_status(NMUser * user, NMUserRecord * user_record,
+						   nm_response_cb callback, gpointer data);
+
+/** 
+ *	Reads a response/event from the server and processes it.
+ *
+ *  @param	user	The logged in User
+ */
+NMERR_T nm_process_new_data(NMUser * user);
+
+/** 
+ *	Return the root folder of the contact list
+ *
+ *  @param	user	The logged in User
+ *
+ *	@return	Root folder
+ */
+NMFolder *nm_get_root_folder(NMUser * user);
+
+/** 
+ *	Create the contact list based on the login fields
+ *
+ *  @param	user	The logged in User
+ *
+ */
+NMERR_T nm_create_contact_list(NMUser * user);
+
+void nm_destroy_contact_list(NMUser * user);
+
+void nm_user_add_contact(NMUser * user, NMContact * contact);
+
+void nm_user_add_user_record(NMUser * user, NMUserRecord * user_record);
+
+NMContact *nm_find_contact(NMUser * user, const char *dn);
+
+GList *nm_find_contacts(NMUser * user, const char *dn);
+
+NMUserRecord *nm_find_user_record(NMUser * user, const char *dn);
+
+NMFolder *nm_find_folder(NMUser * user, const char *name);
+
+NMFolder *nm_find_folder_by_id(NMUser * user, int object_id);
+
+NMConference *nm_find_conversation(NMUser * user, const char *who);
+
+void nm_conference_list_add(NMUser * user, NMConference * conf);
+
+void nm_conference_list_remove(NMUser * user, NMConference * conf);
+
+void nm_conference_list_free(NMUser * user);
+
+NMConference *nm_conference_list_find(NMUser * user, const char *guid);
+
+const char *nm_lookup_dn(NMUser * user, const char *display_id);
+
+nm_event_cb nm_user_get_event_callback(NMUser * user);
+
+NMConn *nm_user_get_conn(NMUser * user);
+
+/** Some utility functions **/
+
+/**
+ * Check to see if the conference GUIDs are equivalent.	
+ *
+ * @param guid1	First guid to compare
+ * @param guid2 Second guid to compare
+ *
+ * @return 		TRUE if conference GUIDs are equivalent, FALSE otherwise.
+ *
+ */
+gboolean nm_are_guids_equal(const char *guid1, const char *guid2);
+
+
+/**
+ * Case insensitive compare for utf8 strings
+ *
+ * @param guid1	First string to compare
+ * @param guid2 Second string to compare
+ *
+ * @return 		-1 if str1 < str2, 0 if str1 = str2, 1 if str1 > str2
+ *
+ */
+gint nm_utf8_strcasecmp(gconstpointer str1, gconstpointer str2);
+
+/**
+ * Compare UTF8 strings for equality only (case insensitive)
+ *
+ * @param guid1	First string to compare
+ * @param guid2 Second string to compare
+ *
+ * @return 		TRUE if strings are equal, FALSE otherwise
+ *
+ */
+gboolean nm_utf8_str_equal(gconstpointer str1, gconstpointer str2);
+
+/**
+ * Convert a fully typed LDAP DN to dotted, untype notation
+ * e.g. cn=mike,o=novell -> mike.novell
+ *
+ * @param typed	Fully typed dn
+ *
+ * @return 		Dotted equivalent of typed (must be freed).
+ *
+ */
+char *nm_typed_to_dotted(const char *typed);
+
+#endif