Mercurial > pidgin.yaz
diff libpurple/protocols/novell/nmuser.h @ 15374: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/nmuser.h Sat Jan 20 02:32:10 2007 +0000 @@ -0,0 +1,692 @@ +/* + * nmuser.h + * + * 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 + * + */ + +#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; + + /* Privacy settings */ + gboolean privacy_locked; + gboolean default_deny; + GSList *allow_list; + GSList *deny_list; + + /* 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; + + /* Have the privacy lists been synched yet */ + gboolean privacy_synched; + + /* Has the contact list been synched */ + gboolean clist_synched; +}; + +#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_SERVER_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) + +/* Errors that are returned from the server */ +#define NMERR_SERVER_BASE 0xD100L +#define NMERR_ACCESS_DENIED (NMERR_SERVER_BASE + 0x0006) +#define NMERR_NOT_SUPPORTED (NMERR_SERVER_BASE + 0x000A) +#define NMERR_PASSWORD_EXPIRED (NMERR_SERVER_BASE + 0x000B) +#define NMERR_PASSWORD_INVALID (NMERR_SERVER_BASE + 0x000C) +#define NMERR_USER_NOT_FOUND (NMERR_SERVER_BASE + 0x000D) +#define NMERR_USER_DISABLED (NMERR_SERVER_BASE + 0x0010) +#define NMERR_DIRECTORY_FAILURE (NMERR_SERVER_BASE + 0x0011) +#define NMERR_HOST_NOT_FOUND (NMERR_SERVER_BASE + 0x0019) +#define NMERR_ADMIN_LOCKED (NMERR_SERVER_BASE + 0x001C) +#define NMERR_DUPLICATE_PARTICIPANT (NMERR_SERVER_BASE + 0x001F) +#define NMERR_SERVER_BUSY (NMERR_SERVER_BASE + 0x0023) +#define NMERR_OBJECT_NOT_FOUND (NMERR_SERVER_BASE + 0x0024) +#define NMERR_DIRECTORY_UPDATE (NMERR_SERVER_BASE + 0x0025) +#define NMERR_DUPLICATE_FOLDER (NMERR_SERVER_BASE + 0x0026) +#define NMERR_DUPLICATE_CONTACT (NMERR_SERVER_BASE + 0x0027) +#define NMERR_USER_NOT_ALLOWED (NMERR_SERVER_BASE + 0x0028) +#define NMERR_TOO_MANY_CONTACTS (NMERR_SERVER_BASE + 0x0029) +#define NMERR_CONFERENCE_NOT_FOUND_2 (NMERR_SERVER_BASE + 0x002B) +#define NMERR_TOO_MANY_FOLDERS (NMERR_SERVER_BASE + 0x002C) +#define NMERR_SERVER_PROTOCOL (NMERR_SERVER_BASE + 0x0030) +#define NMERR_CONVERSATION_INVITE (NMERR_SERVER_BASE + 0x0035) +#define NMERR_USER_BLOCKED (NMERR_SERVER_BASE + 0x0039) +#define NMERR_MASTER_ARCHIVE_MISSING (NMERR_SERVER_BASE + 0x003A) +#define NMERR_PASSWORD_EXPIRED_2 (NMERR_SERVER_BASE + 0x0042) +#define NMERR_CREDENTIALS_MISSING (NMERR_SERVER_BASE + 0x0046) +#define NMERR_AUTHENTICATION_FAILED (NMERR_SERVER_BASE + 0x0049) +#define NMERR_EVAL_CONNECTION_LIMIT (NMERR_SERVER_BASE + 0x004A) + +/** + * 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 receive 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 add_participants Add participant list on 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); + + +/** + * Send a conference invitation 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 user_record The user to invite + * @param message The invite message if there is one, NULL otherwise + * @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_conference_invite(NMUser *user, NMConference *conference, NMUserRecord *user_record, + const char *message, nm_response_cb callback, gpointer data); + +/** + * Get details for a more than one 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 names Link list of user id's or dn's + * @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); + +/** + * 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); + +/** + * 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); + +/** + * Send a request to add an item to the allow or deny list. + * + * @param user The logged in User + * @param who The userid or DN of the user to add to list + * @param allow_list TRUE if adding to allow list, FALSE if adding to deny list + * @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_privacy_item(NMUser *user, const char *who, gboolean is_allowed, + nm_response_cb callback, gpointer data); + +/** + * Send a request to remove an item from the allow or deny list. + * + * @param user The logged in User + * @param who The userid or DN of the user to add to list + * @param allow_list TRUE if removing from allow list, FALSE if removing from deny list + * @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_privacy_item(NMUser *user, const char *dn, gboolean allow_list, + nm_response_cb callback, gpointer data); + +/** + * Send a request to change the default privacy setting to deny all or allow all + * + * @param user The logged in User + * @param default_deny TRUE if default should be changed to deny all + * @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_set_privacy_default(NMUser *user, gboolean default_deny, + nm_response_cb callback, gpointer data); + +/** + * Send a ping to the server + * + * @param user The logged in User + * @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_keepalive(NMUser *user, 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); + +gboolean nm_user_is_privacy_locked(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); + +/** + * Return a string representation of the error code. + * + * @param error NMERR_T to convert to string + * + * @return String representation. + */ +const char *nm_error_to_string (NMERR_T err); + +#endif