# HG changeset patch # User Myhailo Danylenko # Date 1249157111 -10800 # Node ID 05328c643696e6ef331e9a1e7d93c4e905b51d5b # Parent 1253cacc0f21c830264d1f2e1ed73817f5f5402c Mcabber-lm includes moved into a project tree diff -r 1253cacc0f21 -r 05328c643696 CMakeLists.txt --- a/CMakeLists.txt Thu Jul 30 14:33:22 2009 +0300 +++ b/CMakeLists.txt Sat Aug 01 23:05:11 2009 +0300 @@ -22,7 +22,7 @@ option(DEBUG "Enable debugging output" ON) option(LLM_CONNECTION_ENABLE "Enable exposing of mcabber loudmouth connection to lua" ON) option(LLM_LOG_HANDLER "Enable registration of log messages handler for lua-loudmouth library's messages" ON) -set(MCABBER_INCLUDE_DIR "/home/isbear/src/mcabber/hglm/mcabber/src" CACHE FILEPATH "Path to mcabber headers") +set(MCABBER_INCLUDE_DIR "${mcabber-lua_SOURCE_DIR}/include" CACHE FILEPATH "Path to mcabber headers") set(ML_SOURCE_PRIORITY G_PRIORITY_HIGH_IDLE CACHE STRING "Glib event source priority for timeout and bgread") set(ML_BGREAD_BUFFER 4096 CACHE STRING "Background pipe reading buffer size") @@ -86,7 +86,7 @@ if(PERL_FOUND) install(FILES ${mcabber-lua_BINARY_DIR}/mcabber-lua.html DESTINATION share/doc/${CPACK_PACKAGE_NAME}) endif() -install(DIRECTORY examples DESTINATION share/doc/${CPACK_PACKAGE_NAME}) +install(DIRECTORY examples DESTINATION share/doc/${CPACK_PACKAGE_NAME} PATTERN "*~" EXCLUDE) install(FILES README DESTINATION share/doc/${CPACK_PACKAGE_NAME}) install(FILES TODO DESTINATION share/doc/${CPACK_PACKAGE_NAME}) install(FILES COPYING DESTINATION share/doc/${CPACK_PACKAGE_NAME}) diff -r 1253cacc0f21 -r 05328c643696 include/caps.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/caps.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,22 @@ +#ifndef __CAPS_H__ +#define __CAPS_H__ 1 + +#include + +void caps_init(void); +void caps_free(void); +void caps_add(char *hash); +int caps_has_hash(const char *hash); +void caps_set_identity(char *hash, + const char *category, + const char *name, + const char *type); +void caps_add_feature(char *hash, const char *feature); +int caps_has_feature(char *hash, char *feature); +void caps_foreach_feature(const char *hash, GFunc func, gpointer user_data); + +char *caps_generate(void); + +#endif /* __CAPS_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/commands.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/commands.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,39 @@ +#ifndef __COMMANDS_H__ +#define __COMMANDS_H__ 1 + +#include + +#include "config.h" + +// Command structure +typedef struct { + char name[32]; + const char *help; + guint completion_flags[2]; + void (*func)(char *); +#ifdef MODULES_ENABLE + gpointer userdata; +#endif +} cmd; + +void cmd_init(void); +cmd *cmd_get(const char *command); +int process_line(const char *line); +int process_command(const char *line, guint iscmd); +char *expandalias(const char *line); +#ifdef MODULES_ENABLE +void cmd_deinit(void); +gpointer cmd_del(const char *name); +void cmd_add(const char *name, const char *help, guint flags1, guint flags2, void (*f)(char*), gpointer userdata); +#endif + +extern char *mcabber_version(void); +extern void mcabber_set_terminate_ui(void); + +void cmd_room_whois(gpointer bud, char *nick_locale, guint interactive); +void cmd_room_leave(gpointer bud, char *arg); +void cmd_setstatus(const char *recipient, const char *arg); + +#endif /* __COMMANDS_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/compl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/compl.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,47 @@ +#ifndef __COMPL_H__ +#define __COMPL_H__ 1 + +#include + +#include "config.h" + +#define COMPL_CMD (1U<<0) +#define COMPL_JID (1U<<1) +#define COMPL_URLJID (1U<<2) // Not implemented yet +#define COMPL_NAME (1U<<3) // Not implemented yet +#define COMPL_STATUS (1U<<4) +#define COMPL_FILENAME (1U<<5) // Not implemented yet +#define COMPL_ROSTER (1U<<6) +#define COMPL_BUFFER (1U<<7) +#define COMPL_GROUP (1U<<8) +#define COMPL_GROUPNAME (1U<<9) +#define COMPL_MULTILINE (1U<<10) +#define COMPL_ROOM (1U<<11) +#define COMPL_RESOURCE (1U<<12) +#define COMPL_AUTH (1U<<13) +#define COMPL_REQUEST (1U<<14) +#define COMPL_EVENTS (1U<<15) +#define COMPL_EVENTSID (1U<<16) +#define COMPL_PGP (1U<<17) +#define COMPL_COLOR (1U<<18) +#define COMPL_OTR (1U<<19) +#define COMPL_OTRPOLICY (1U<<20) +#ifdef MODULES_ENABLE +#define COMPL_MAX_BUILTIN (1U<<20) + +guint compl_new_category (void); +void compl_del_category (guint id); +#endif + +void compl_add_category_word(guint, const char *command); +void compl_del_category_word(guint categ, const char *word); +GSList *compl_get_category_list(guint cat_flags, guint *dynlist); + +guint new_completion(char *prefix, GSList *compl_cat); +void done_completion(void); +guint cancel_completion(void); +const char *complete(void); + +#endif /* __COMPL_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/events.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/events.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,50 @@ +#ifndef __EVENTS_H__ +#define __EVENTS_H__ 1 + +#include "xmpp.h" +#include "config.h" // MODULES_ENABLE + + +#define EVS_DEFAULT_TIMEOUT 90 +#define EVS_MAX_TIMEOUT 432000 + +#define EVS_CONTEXT_TIMEOUT 0U +#define EVS_CONTEXT_CANCEL 1U +#define EVS_CONTEXT_USER 2U + +typedef enum { + EVS_TYPE_SUBSCRIPTION = 1, + EVS_TYPE_INVITATION = 2, +#ifdef MODULES_ENABLE + EVS_TYPE_USER = 3, +#endif +} evs_type; + +/* Common structure for events (evs) and IQ requests (iqs) */ +typedef struct { + char *id; + time_t ts_create; + time_t ts_expire; + guint8 type; + gpointer data; + int (*callback)(); + char *desc; +} eviqs; + +typedef struct { + char* to; + char* from; + char* passwd; + char* reason; +} event_muc_invitation; + +eviqs *evs_new(guint8 type, time_t timeout); +int evs_del(const char *evid); +int evs_callback(const char *evid, guint evcontext); +gboolean evs_check_timeout(); +void evs_display_list(void); +GSList *evs_geteventslist(int forcompl); + +#endif /* __EVENTS_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/fifo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/fifo.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,11 @@ +#ifndef __FIFO_H__ +#define __FIFO_H__ 1 + +int fifo_init(const char *fifo_path); +void fifo_deinit(void); +void fifo_read(void); +int fifo_get_fd(void); + +#endif /* __FIFO_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/hbuf.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/hbuf.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,59 @@ +#ifndef __HBUF_H__ +#define __HBUF_H__ 1 + +#include +#include + +// With current implementation a message must fit in a hbuf block, +// so we shouldn't choose a too small size. +#define HBB_BLOCKSIZE 8192 // > 20 please + +// Flags: +// - ALLOC: the ptr data has been allocated, it can be freed +// - PERSISTENT: this is a new history line +#define HBB_FLAG_ALLOC 1 +#define HBB_FLAG_PERSISTENT 2 + +#define HBB_PREFIX_IN (1U<<0) +#define HBB_PREFIX_OUT (1U<<1) +#define HBB_PREFIX_STATUS (1U<<2) +#define HBB_PREFIX_AUTH (1U<<3) +#define HBB_PREFIX_INFO (1U<<4) +#define HBB_PREFIX_ERR (1U<<5) +#define HBB_PREFIX_NOFLAG (1U<<6) +#define HBB_PREFIX_HLIGHT_OUT (1U<<7) +#define HBB_PREFIX_HLIGHT (1U<<8) +#define HBB_PREFIX_NONE (1U<<9) +#define HBB_PREFIX_SPECIAL (1U<<10) +#define HBB_PREFIX_PGPCRYPT (1U<<11) +#define HBB_PREFIX_OTRCRYPT (1U<<12) +#define HBB_PREFIX_CONT (1U<<13) +#define HBB_PREFIX_RECEIPT (1U<<14) + +typedef struct { + time_t timestamp; + guint flags; + unsigned mucnicklen; + char *text; +} hbb_line; + +void hbuf_add_line(GList **p_hbuf, const char *text, time_t timestamp, + guint prefix_flags, guint width, guint maxhbufblocks, + unsigned mucnicklen, gpointer xep184); +void hbuf_free(GList **p_hbuf); +void hbuf_rebuild(GList **p_hbuf, unsigned int width); +GList *hbuf_previous_persistent(GList *l_line); + +hbb_line **hbuf_get_lines(GList *hbuf, unsigned int n); +GList *hbuf_search(GList *hbuf, int direction, const char *string); +GList *hbuf_jump_date(GList *hbuf, time_t t); +GList *hbuf_jump_percent(GList *hbuf, int pc); +gboolean hbuf_remove_receipt(GList *hbuf, gpointer xep184); + +void hbuf_dump_to_file(GList *hbuf, const char *filename); + +guint hbuf_get_blocks_number(GList *p_hbuf); + +#endif /* __HBUF_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/help.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/help.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,8 @@ +#ifndef __HELP_H__ +#define __HELP_H__ 1 + +int help_process(char *string); + +#endif /* __HELP_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/hgcset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/hgcset.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,1 @@ + diff -r 1253cacc0f21 -r 05328c643696 include/histolog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/histolog.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,20 @@ +#ifndef __HISTOLOG_H__ +#define __HISTOLOG_H__ 1 + +#include + +#include "xmpp.h" + +void hlog_enable(guint enable, const char *root_dir, guint loadfile); +char *hlog_get_log_jid(const char *bjid); +void hlog_read_history(const char *bjid, GList **p_buddyhbuf, guint width); +void hlog_write_message(const char *bjid, time_t timestamp, int sent, + const char *msg); +void hlog_write_status(const char *bjid, time_t timestamp, + enum imstatus status, const char *status_msg); +void hlog_save_state(void); +void hlog_load_state(void); + +#endif /* __HISTOLOG_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/hooks.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/hooks.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,48 @@ +#ifndef __HOOKS_H__ +#define __HOOKS_H__ 1 + +#include +#include +#include "xmpp.h" + +// These two defines are used by hk_message_{in,out} arguments +#define ENCRYPTED_PGP 1 +#define ENCRYPTED_OTR 2 + +#include "config.h" +#ifdef MODULES_ENABLE +#include + +typedef struct { + const char *name; + const char *value; +} hk_arg_t; + +typedef void (*hk_handler_t) (hk_arg_t *args, gpointer userdata); + +void hk_add_handler (hk_handler_t handler, gpointer userdata); +void hk_del_handler (hk_handler_t handler, gpointer userdata); +#endif + +void hk_mainloop(void); +void hk_message_in(const char *bjid, const char *resname, + time_t timestamp, const char *msg, LmMessageSubType type, + guint encrypted); +void hk_message_out(const char *bjid, const char *nickname, + time_t timestamp, const char *msg, + guint encrypted, gpointer xep184); +void hk_statuschange(const char *bjid, const char *resname, gchar prio, + time_t timestamp, enum imstatus status, + char const *status_msg); +void hk_mystatuschange(time_t timestamp, + enum imstatus old_status, + enum imstatus new_status, const char *msg); + +void hook_execute_internal(const char *hookname); + +void hk_ext_cmd_init(const char *command); +void hk_ext_cmd(const char *bjid, guchar type, guchar info, const char *data); + +#endif /* __HOOKS_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/logprint.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/logprint.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,20 @@ +#ifndef __LOGPRINT_H__ +#define __LOGPRINT_H__ 1 + +// Flags for scr_LogPrint() +#define LPRINT_NORMAL 1U // Display in log window +#define LPRINT_LOG 2U // Log to file (if enabled) +#define LPRINT_DEBUG 4U // Debug message (log if enabled) +#define LPRINT_NOTUTF8 8U // Do not convert from UTF-8 to locale + +// For convenience... +#define LPRINT_LOGNORM (LPRINT_NORMAL|LPRINT_LOG) + +void scr_print_logwindow(const char *string); +void scr_LogPrint(unsigned int flag, const char *fmt, ...); + +void scr_DoUpdate(void); + +#endif /* __LOGPRINT_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/nohtml.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/nohtml.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,9 @@ +#ifndef __NOHTML_H__ +#define __NOHTML_H__ 1 + +char *html_strip(const char *buf); +char *html_escape(const char *text); + +#endif /* __NOHTML_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/otr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/otr.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,40 @@ +#ifndef __OTR_H__ +#define __OTR_H__ 1 + +#ifdef HAVE_LIBOTR + +#include +#include +#include + +enum otr_policy { + plain, + opportunistic, + manual, + always +}; + +void otr_init(const char *jid); +void otr_terminate(void); + +void otr_establish (const char * buddy); +void otr_disconnect (const char * buddy); +void otr_fingerprint(const char * buddy, const char * trust); +void otr_print_info (const char * buddy); + +void otr_smp_query (const char * buddy, const char * secret); +void otr_smp_respond(const char * buddy, const char * secret); +void otr_smp_abort (const char * buddy); + +void otr_key (void); + +int otr_receive (char **otr_data, const char * buddy, int * free_msg); +int otr_send (char **msg, const char *buddy); + +#endif /* HAVE_LIBOTR */ + +int otr_enabled (void); + +#endif /* __OTR_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/pgp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/pgp.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,29 @@ +#ifndef __PGP_H__ +#define __PGP_H__ 1 + +#include + +#ifdef HAVE_GPGME + +#define GPGME_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_USER_1 +#include + +int gpg_init(const char *priv_key, const char *passphrase); +void gpg_terminate(void); +void gpg_set_passphrase(const char *passphrase); +void gpg_set_private_key(const char *priv_keyid); +char *gpg_verify(const char *gpg_data, const char *text, + gpgme_sigsum_t *sigsum); +char *gpg_sign(const char *gpg_data); +char *gpg_decrypt(const char *gpg_data); +char *gpg_encrypt(const char *gpg_data, const char *keyid); + +int gpg_test_passphrase(void); + +#endif /* HAVE_GPGME */ + +int gpg_enabled(void); + +#endif /* __PGP_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/roster.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/roster.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,248 @@ +#ifndef __ROSTER_H__ +#define __ROSTER_H__ 1 + +#include +#include + +#include "pgp.h" + +#ifndef SPECIAL_BUFFER_STATUS_ID +#define SPECIAL_BUFFER_STATUS_ID "[status]" +#endif + +enum imstatus { + offline, + available, + freeforchat, + dontdisturb, + notavail, + away, + invisible, + imstatus_size +}; + +extern char imstatus2char[]; // Should match enum above + +enum imrole { + role_none, + role_moderator, + role_participant, + role_visitor, + imrole_size +}; + +extern char *strrole[]; // Should match enum above + +enum imaffiliation { + affil_none, + affil_owner, + affil_admin, + affil_member, + affil_outcast, + imaffiliation_size +}; + +extern char *straffil[]; // Should match enum above + +enum subscr { + sub_none = 0, + sub_pending = 1, + sub_to = 1 << 1, + sub_from = 1 << 2, + sub_both = sub_to|sub_from, + sub_remove = 1 << 3 +}; + +enum findwhat { + jidsearch, + namesearch +}; + +extern char *strprintstatus[]; + +// Note: do not change the ordering as these values are visible +// to the user (option 'muc_print_status')! +enum room_printstatus { + status_default, + status_none, + status_in_and_out, + status_all +}; + +extern char *strautowhois[]; + +enum room_autowhois { + autowhois_default, + autowhois_off, + autowhois_on +}; + +struct role_affil { + enum { type_role, type_affil } type; + union { + enum imrole role; + enum imaffiliation affil; + } val; +}; + +// Roster_type is a set of flags, so values should be 2^n +#define ROSTER_TYPE_USER 1U +#define ROSTER_TYPE_GROUP (1U<<1) +#define ROSTER_TYPE_AGENT (1U<<2) +#define ROSTER_TYPE_ROOM (1U<<3) +#define ROSTER_TYPE_SPECIAL (1U<<4) + +// Flags: +#define ROSTER_FLAG_MSG 1U // Message not read +#define ROSTER_FLAG_HIDE (1U<<1) // Group hidden (or buddy window closed) +#define ROSTER_FLAG_LOCK (1U<<2) // Node should not be removed from buddylist +#define ROSTER_FLAG_USRLOCK (1U<<3) // Node should not be removed from buddylist +// ROSTER_FLAG_LOCAL (1U<<4) // Buddy not on server's roster (??) + +#define JEP0022 +#define JEP0085 + +struct jep0022 { + guint support; + guint last_state_sent; + gchar *last_msgid_sent; + guint last_state_rcvd; + gchar *last_msgid_rcvd; +}; +struct jep0085 { + guint support; + guint last_state_sent; + guint last_state_rcvd; +}; + +enum chatstate_support { + CHATSTATES_SUPPORT_UNKNOWN = 0, + CHATSTATES_SUPPORT_PROBED, + CHATSTATES_SUPPORT_NONE, + CHATSTATES_SUPPORT_OK +}; + +struct pgp_data { + gchar *sign_keyid; // KeyId used by the contact to sign their presence/msg +#ifdef HAVE_GPGME + gpgme_sigsum_t last_sigsum; // Last signature summary +#endif +}; + +/* Message event and chat state flags */ +#define ROSTER_EVENT_NONE 0U +/* JEP-22 Message Events */ +#define ROSTER_EVENT_OFFLINE (1U<<0) +#define ROSTER_EVENT_DELIVERED (1U<<1) +#define ROSTER_EVENT_DISPLAYED (1U<<2) +/* JEP-22 & JEP-85 */ +#define ROSTER_EVENT_COMPOSING (1U<<3) +/* JEP-85 Chat State Notifications */ +#define ROSTER_EVENT_ACTIVE (1U<<4) +#define ROSTER_EVENT_PAUSED (1U<<5) +#define ROSTER_EVENT_INACTIVE (1U<<6) +#define ROSTER_EVENT_GONE (1U<<7) + +extern GList *buddylist; +extern GList *current_buddy; +extern GList *alternate_buddy; + +// Macros... + +#define BUDDATA(glist_node) ((glist_node)->data) +#define CURRENT_JID buddy_getjid(BUDDATA(current_buddy)) + +// Prototypes... +void roster_init(void); +GSList *roster_add_group(const char *name); +GSList *roster_add_user(const char *jid, const char *name, const char *group, + guint type, enum subscr esub, gint on_server); +GSList *roster_find(const char *jidname, enum findwhat type, guint roster_type); +void roster_del_user(const char *jid); +void roster_free(void); +void roster_setstatus(const char *jid, const char *resname, gchar prio, + enum imstatus bstat, const char *status_msg, + time_t timestamp, + enum imrole role, enum imaffiliation affil, + const char *realjid); +void roster_setflags(const char *jid, guint flags, guint value); +void roster_msg_setflag(const char *jid, guint special, guint value); +const char *roster_getname(const char *jid); +const char *roster_getnickname(const char *jid); +void roster_settype(const char *jid, guint type); +enum imstatus roster_getstatus(const char *jid, const char *resname); +const char *roster_getstatusmsg(const char *jid, const char *resname); +guint roster_gettype(const char *jid); +guint roster_getsubscription(const char *jid); +void roster_unsubscribed(const char *jid); + +void buddylist_build(void); +void buddy_hide_group(gpointer rosterdata, int hide); +void buddylist_set_hide_offline_buddies(int hide); +int buddylist_isset_filter(void); +int buddylist_is_status_filtered(enum imstatus status); +void buddylist_set_filter(guchar); +guchar buddylist_get_filter(void); +const char *buddy_getjid(gpointer rosterdata); +void buddy_setname(gpointer rosterdata, char *newname); +const char *buddy_getname(gpointer rosterdata); +void buddy_setnickname(gpointer rosterdata, const char *newname); +const char *buddy_getnickname(gpointer rosterdata); +void buddy_setinsideroom(gpointer rosterdata, guint inside); +guint buddy_getinsideroom(gpointer rosterdata); +void buddy_settopic(gpointer rosterdata, const char *newtopic); +const char *buddy_gettopic(gpointer rosterdata); +void buddy_setprintstatus(gpointer rosterdata, enum room_printstatus); +enum room_printstatus buddy_getprintstatus(gpointer rosterdata); +void buddy_setautowhois(gpointer rosterdata, enum room_autowhois); +enum room_autowhois buddy_getautowhois(gpointer rosterdata); +void buddy_settype(gpointer rosterdata, guint type); +guint buddy_gettype(gpointer rosterdata); +guint buddy_getsubscription(gpointer rosterdata); +void buddy_setgroup(gpointer rosterdata, char *newgroupname); +const char *buddy_getgroupname(gpointer rosterdata); +gpointer buddy_getgroup(gpointer rosterdata); +enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname); +const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname); +time_t buddy_getstatustime(gpointer rosterdata, const char *resname); +gchar buddy_getresourceprio(gpointer rosterdata, const char *resname); +//int buddy_isresource(gpointer rosterdata); +GSList *buddy_getresources(gpointer rosterdata); +GSList *buddy_getresources_locale(gpointer rosterdata); +void buddy_resource_setname(gpointer rosterdata, const char *resname, + const char *newname); +void buddy_resource_setevents(gpointer rosterdata, const char *resname, + guint event); +guint buddy_resource_getevents(gpointer rosterdata, const char *resname); +void buddy_resource_setcaps(gpointer rosterdata, const char *resname, + const char *caps); +char *buddy_resource_getcaps(gpointer rosterdata, const char *resname); +struct jep0022 *buddy_resource_jep22(gpointer rosterdata, const char *resname); +struct jep0085 *buddy_resource_jep85(gpointer rosterdata, const char *resname); +struct pgp_data *buddy_resource_pgp(gpointer rosterdata, const char *resname); +enum imrole buddy_getrole(gpointer rosterdata, const char *resname); +enum imaffiliation buddy_getaffil(gpointer rosterdata, const char *resname); +const char *buddy_getrjid(gpointer rosterdata, const char *resname); +void buddy_del_all_resources(gpointer rosterdata); +void buddy_setflags(gpointer rosterdata, guint flags, guint value); +guint buddy_getflags(gpointer rosterdata); +void buddy_setonserverflag(gpointer rosterdata, guint onserver); +guint buddy_getonserverflag(gpointer rosterdata); +GList *buddy_search_jid(const char *jid); +GList *buddy_search(char *string); +void foreach_buddy(guint roster_type, + void (*pfunc)(gpointer rosterdata, void *param), + void *param); +void foreach_group_member(gpointer groupdata, + void (*pfunc)(gpointer rosterdata, void *param), + void *param); +gpointer unread_msg(gpointer rosterdata); + +void unread_jid_add(const char *jid); +GList *unread_jid_get_list(void); + +GSList *compl_list(guint type); + +#endif /* __ROSTER_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/screen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/screen.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,187 @@ +#ifndef __SCREEN_H__ +#define __SCREEN_H__ 1 + +#include + +#if HAVE_NCURSESW_NCURSES_H +# include +# include +#elif HAVE_NCURSES_NCURSES_H +# include +# include +#else +# include +# include +#endif + +#ifdef WITH_ASPELL +void spellcheck_init(void); +void spellcheck_deinit(void); +//static void spellcheck(char*, char*); +#endif + +#include "hbuf.h" +#include "logprint.h" +#include "roster.h" + +#define INPUTLINE_LENGTH 1024 + +// Only used in screen.c; this is the maximum line number +// in a multi-line message. Should be < 1000 +// Note: message length is limited by the HBB_BLOCKSIZE size too +#define MULTILINE_MAX_LINE_NUMBER 299 + +// When chatstates are enabled, timeout (in seconds) before "composing" +// becomes "paused" because of user inactivity. +// Warning: setting this very low will cause more network traffic. +#define COMPOSING_TIMEOUT 6L + +enum colors { + COLOR_GENERAL = 3, + COLOR_MSGOUT, + COLOR_MSGHL, + COLOR_STATUS, + COLOR_ROSTER, + COLOR_ROSTERSEL, + COLOR_ROSTERSELNMSG, + COLOR_ROSTERNMSG, + COLOR_INFO, + COLOR_MSGIN, + COLOR_max +}; + +int COLOR_ATTRIB[COLOR_max]; + +extern int update_roster; + +typedef struct { + int value; + int utf8; + enum { + MKEY_META = 1, + MKEY_EQUIV, + MKEY_CTRL_PGUP, + MKEY_CTRL_PGDOWN, + MKEY_SHIFT_PGUP, + MKEY_SHIFT_PGDOWN, + MKEY_CTRL_SHIFT_PGUP, + MKEY_CTRL_SHIFT_PGDOWN, + MKEY_CTRL_HOME, + MKEY_CTRL_END, + MKEY_CTRL_INS, + MKEY_CTRL_DEL, + MKEY_CTRL_SHIFT_HOME, + MKEY_CTRL_SHIFT_END, + MKEY_MOUSE + } mcode; +} keycode; + +typedef enum { + MC_ALL, + MC_PRESET, + MC_OFF, + MC_REMOVE +} muccoltype; + +void scr_init_bindings(void); + +void scr_Getch(keycode *kcode); +void process_key(keycode kcode); + +void scr_InitLocaleCharSet(void); +void scr_InitCurses(void); +void scr_TerminateCurses(void); +void scr_DrawMainWindow(unsigned int fullinit); +void scr_DrawRoster(void); +void scr_UpdateMainStatus(int forceupdate); +void scr_UpdateChatStatus(int forceupdate); +void scr_RosterVisibility(int status); +void scr_WriteIncomingMessage(const char *jidfrom, const char *text, + time_t timestamp, guint prefix, + unsigned mucnicklen); +void scr_WriteOutgoingMessage(const char *jidto, const char *text, + guint prefix, gpointer xep184); +void scr_RemoveReceiptFlag(const char *jidto, gpointer xep184); +void scr_ShowBuddyWindow(void); +int scr_BuddyBufferExists(const char *jid); +void scr_UpdateBuddyWindow(void); +void scr_set_chatmode(int enable); +int scr_get_chatmode(void); +void scr_set_multimode(int enable, char *subject); +int scr_get_multimode(void); +void scr_setmsgflag_if_needed(const char *jid, int special); +void scr_append_multiline(const char *line); +const char *scr_get_multiline(void); +const char *scr_get_multimode_subj(void); + +guint scr_getprefixwidth(void); +void scr_line_prefix(hbb_line *line, char *prefix, guint preflen); + +void scr_Beep(void); + +bool Autoaway; + +void scr_CheckAutoAway(int activity); + +#if defined JEP0022 || defined JEP0085 +gboolean scr_ChatStatesTimeout(); +#endif +int chatstates_disabled; + +// For commands... +void scr_RosterTop(void); +void scr_RosterBottom(void); +void scr_RosterUpDown(int updown, unsigned int n); +void scr_RosterPrevGroup(void); +void scr_RosterNextGroup(void); +void scr_RosterSearch(char *); +void scr_RosterJumpJid(char *); +void scr_RosterDisplay(const char *); +void scr_BufferTopBottom(int topbottom); +void scr_BufferClear(void); +void scr_BufferScrollLock(int lock); +void scr_BufferPurge(int, const char*); +void scr_BufferPurgeAll(int); +void scr_BufferSearch(int direction, const char *text); +void scr_BufferPercent(int pc); +void scr_BufferDate(time_t t); +void scr_BufferDump(const char *file); +void scr_RosterUnreadMessage(int); +void scr_RosterJumpAlternate(void); +void scr_BufferScrollUpDown(int updown, unsigned int nblines); +bool scr_RosterColor(const char *status, const char *wildcard, + const char *color); +void scr_RosterClearColor(void); +void scr_MucColor(const char *muc, muccoltype type); +void scr_MucNickColor(const char *nick, const char *color); +void scr_BufferList(void); + +void readline_transpose_chars(void); +void readline_forward_kill_word(void); +void readline_backward_kill_word(void); +void readline_backward_word(void); +void readline_forward_word(void); +void readline_updowncase_word(int); +void readline_capitalize_word(void); +void readline_backward_char(void); +void readline_forward_char(void); +int readline_accept_line(int down_history); +void readline_cancel_completion(void); +void readline_do_completion(void); +void readline_refresh_screen(void); +void readline_disable_chat_mode(void); +void readline_hist_beginning_search_bwd(void); +void readline_hist_beginning_search_fwd(void); +void readline_hist_prev(void); +void readline_hist_next(void); +void readline_backward_kill_char(void); +void readline_forward_kill_char(void); +void readline_iline_start(void); +void readline_iline_end(void); +void readline_backward_kill_iline(void); +void readline_forward_kill_iline(void); +void readline_send_multiline(void); + +#endif + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/settings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/settings.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,65 @@ +#ifndef __SETTINGS_H__ +#define __SETTINGS_H__ 1 + +#include +#include + +#include "roster.h" + +#ifndef isblank +# define isblank(c) ((c) == 0x20 || (c) == 0x09) +#endif + + +#define SETTINGS_TYPE_OPTION 1 +#define SETTINGS_TYPE_ALIAS 2 +#define SETTINGS_TYPE_BINDING 3 +#ifdef HAVE_LIBOTR +#define SETTINGS_TYPE_OTR 4 +#endif + +#ifndef COMMAND_CHAR +#define COMMAND_CHAR '/' +#endif +#ifndef COMMAND_CHARSTR +#define COMMAND_CHARSTR "/" +#endif + +#define settings_opt_get(k) settings_get(SETTINGS_TYPE_OPTION, k) +#define settings_opt_get_int(k) settings_get_int(SETTINGS_TYPE_OPTION, k) + +#define mkcmdstr(cmd) COMMAND_CHARSTR cmd + +void settings_init(void); +int cfg_read_file(char *filename, guint mainfile); +guint parse_assigment(gchar *assignment, gchar **pkey, gchar **pval); +void settings_set(guint type, const gchar *key, const gchar *value); +void settings_del(guint type, const gchar *key); +const gchar *settings_get(guint type, const gchar *key); +int settings_get_int(guint type, const gchar *key); +const gchar *settings_get_status_msg(enum imstatus status); +void settings_foreach(guint type, + void (*pfunc)(char *k, char *v, void *param), + void *param); + +void settings_pgp_setdisabled(const char *bjid, guint value); +guint settings_pgp_getdisabled(const char *bjid); +void settings_pgp_setforce(const char *bjid, guint value); +guint settings_pgp_getforce(const char *bjid); +void settings_pgp_setkeyid(const char *bjid, const char *keyid); +const char *settings_pgp_getkeyid(const char *bjid); + +#ifdef HAVE_LIBOTR +guint settings_otr_getpolicy(const char *bjid); +void settings_otr_setpolicy(const char *bjid, guint value); +#endif + +guint get_max_history_blocks(void); + +char *default_muc_nickname(const char *roomid); + +const gchar *isbound(int key); + +#endif /* __SETTINGS_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/utf8.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/utf8.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,49 @@ +#ifndef __UTF8_H__ +#define __UTF8_H__ 1 + +#include + +#if defined HAVE_UNICODE && defined HAVE_WCHAR_H && defined HAVE_WCTYPE_H +# define UNICODE +#endif + +#ifdef HAVE_WCHAR_H +# include +# define get_char_width(c) (utf8_mode ? wcwidth(get_char(c)) : 1) +#else +# define wcwidth(c) 1 +# define get_char_width(c) 1 +#endif + +#ifdef HAVE_WCTYPE_H +# include + +/* The following bit is a hack for Solaris 8&9 systems that don't have + * iswblank(). + * For now i made sure it comes after wctype.h so it doesn't create + * problems (wctype.h has calls to iswblank() before wctype() is declared). + * (Sebastian Kayser) + */ +# ifndef HAVE_ISWBLANK +# define iswblank(wc) iswctype(wc, wctype("blank")) +# endif + +#else +# define iswblank(c) (c == ' ') +# define iswalnum(c) isalnum(c) +# define iswprint(c) isprint(c) +# define towupper(c) toupper(c) +# define towlower(c) tolower(c) +# define iswalpha(c) isalpha(c) +#endif + +extern int utf8_mode; + +char *prev_char(char *str, const char *limit); +char *next_char(char *str); +unsigned get_char(const char *str); +char *put_char(char *str, unsigned c); + +#endif /* __UTF8_H__ */ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/utils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/utils.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,56 @@ +#ifndef __UTILS_H__ +#define __UTILS_H__ 1 + +#include + +extern const char *LocaleCharSet; + +#define to_utf8(s) ((s) ? g_locale_to_utf8((s), -1, NULL,NULL,NULL) : NULL) +#define from_utf8(s) ((s) ? g_convert_with_fallback((s), -1, LocaleCharSet, \ + "UTF-8", NULL,NULL,NULL,NULL) : NULL) + +#define JID_RESOURCE_SEPARATOR '/' +#define JID_RESOURCE_SEPARATORSTR "/" +#define JID_DOMAIN_SEPARATOR '@' +#define JID_DOMAIN_SEPARATORSTR "@" + +char *jidtodisp(const char *fjid); +char *compose_jid(const char *username, const char *servername, + const char *resource); +gboolean jid_equal(const char *jid1, const char *jid2); + +void fingerprint_to_hex(const unsigned char *fpr, char hex[49]); +gboolean hex_to_fingerprint(const char * hex, char fpr[16]); + +void ut_InitDebug(int level, const char *file); +void ut_WriteLog(unsigned int flag, const char *data); + +char *expand_filename(const char *fname); + +int checkset_perm(const char *name, unsigned int setmode); + +const char *ut_get_tmpdir(void); + +int to_iso8601(char *dststr, time_t timestamp); +time_t from_iso8601(const char *timestamp, int utc); + +int check_jid_syntax(const char *fjid); + +void mc_strtolower(char *str); + +void strip_arg_special_chars(char *s); +char **split_arg(const char *arg, unsigned int n, int dontstriplast); +void free_arg_lst(char **arglst); + +void replace_nl_with_dots(char *bufstr); +char *ut_expand_tabs(const char *text); + +#if !defined (HAVE_STRCASESTR) +char *strcasestr(const char *haystack, const char *needle); +#endif + +int startswith(const char *str, const char *word, guint ignore_case); + +#endif // __UTILS_H__ + +/* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ diff -r 1253cacc0f21 -r 05328c643696 include/xmpp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/xmpp.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,89 @@ +#ifndef __XMPP_H__ +#define __XMPP_H__ 1 + +#include +#include "roster.h" + +enum iqreq_type { + iqreq_none, + iqreq_version, + iqreq_time, + iqreq_last, + iqreq_vcard +}; + +struct annotation { + time_t cdate; + time_t mdate; + gchar *jid; + gchar *text; +}; + +struct bookmark { + gchar *roomjid; + gchar *name; + gchar *nick; + guint autojoin; + /* enum room_printstatus pstatus; */ + /* enum room_autowhois awhois; */ +}; + +extern LmConnection* lconnection; +extern LmSSL* lssl; +extern GMainLoop *main_loop; + +typedef struct { + char *subject; + char *body; + time_t timestamp; + char *jid; +} unread_message_t; + +extern GSList *unread_messages; + +void xmpp_connect(void); +void xmpp_disconnect(void); + +void xmpp_room_join(const char *room, const char *nickname, const char *passwd); +int xmpp_room_setattrib(const char *roomid, const char *fjid, + const char *nick, struct role_affil ra, + const char *reason); +void xmpp_room_invite(const char *room, const char *fjid, const char *reason); +void xmpp_room_unlock(const char *room); +void xmpp_room_destroy(const char *room, const char *venue, const char *reason); + +void xmpp_addbuddy(const char *bjid, const char *name, const char *group); +void xmpp_updatebuddy(const char *bjid, const char *name, const char *group); +void xmpp_delbuddy(const char *bjid); + +void xmpp_send_msg(const char *fjid, const char *text, int type, + const char *subject, gboolean otrinject, gint *encrypted, + LmMessageSubType type_overwrite, gpointer *xep184); + +void xmpp_send_s10n(const char *bjid, LmMessageSubType type); + +enum imstatus xmpp_getstatus(void); +const char *xmpp_getstatusmsg(void); +void xmpp_setprevstatus(void); + +void xmpp_setstatus(enum imstatus st, const char *recipient, + const char *msg, int do_not_sign); + +void xmpp_send_chatstate(gpointer buddy, guint chatstate); + +GSList *xmpp_get_all_storage_bookmarks(void); +GSList *xmpp_get_all_storage_rosternotes(void); +void xmpp_set_storage_bookmark(const char *roomid, const char *name, + const char *nick, const char *passwd, + int autojoin, enum room_printstatus pstatus, + enum room_autowhois awhois); +struct annotation *xmpp_get_storage_rosternotes(const char *barejid, + int silent); +void xmpp_set_storage_rosternotes(const char *barejid, const char *note); +guint xmpp_is_bookmarked(const char *bjid); +const char *xmpp_get_bookmark_nick(const char *bjid); + +void xmpp_request(const char *fjid, enum iqreq_type reqtype); +void request_vcard(const char *bjid); +void xmpp_request_storage(const gchar *storage); +#endif /* __XMPP_H__ */ diff -r 1253cacc0f21 -r 05328c643696 include/xmpp_defines.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/xmpp_defines.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,80 @@ +#ifndef __XMPP_DEFINES_H__ +#define __XMPP_DEFINES_H__ 1 + +#define MCABBER_CAPS_NODE "http://mcabber.com/caps" + +#define NS_CLIENT "jabber:client" +#define NS_SERVER "jabber:server" +#define NS_DIALBACK "jabber:server:dialback" +#define NS_AUTH "jabber:iq:auth" +#define NS_AUTH_CRYPT "jabber:iq:auth:crypt" +#define NS_REGISTER "jabber:iq:register" +#define NS_ROSTER "jabber:iq:roster" +#define NS_OFFLINE "jabber:x:offline" +#define NS_AGENT "jabber:iq:agent" +#define NS_AGENTS "jabber:iq:agents" +#define NS_DELAY "jabber:x:delay" +#define NS_VERSION "jabber:iq:version" +#define NS_TIME "jabber:iq:time" +#define NS_VCARD "vcard-temp" +#define NS_PRIVATE "jabber:iq:private" +#define NS_SEARCH "jabber:iq:search" +#define NS_OOB "jabber:iq:oob" +#define NS_XOOB "jabber:x:oob" +#define NS_ADMIN "jabber:iq:admin" +#define NS_FILTER "jabber:iq:filter" +#define NS_AUTH_0K "jabber:iq:auth:0k" +#define NS_BROWSE "jabber:iq:browse" +#define NS_EVENT "jabber:x:event" +#define NS_CONFERENCE "jabber:iq:conference" +#define NS_SIGNED "jabber:x:signed" +#define NS_ENCRYPTED "jabber:x:encrypted" +#define NS_GATEWAY "jabber:iq:gateway" +#define NS_LAST "jabber:iq:last" +#define NS_ENVELOPE "jabber:x:envelope" +#define NS_EXPIRE "jabber:x:expire" +#define NS_XHTML "http://www.w3.org/1999/xhtml" +#define NS_DISCO_INFO "http://jabber.org/protocol/disco#info" +#define NS_DISCO_ITEMS "http://jabber.org/protocol/disco#items" +#define NS_IQ_AUTH "http://jabber.org/features/iq-auth" +#define NS_REGISTER_FEATURE "http://jabber.org/features/iq-register" + +#define NS_CAPS "http://jabber.org/protocol/caps" +#define NS_CHATSTATES "http://jabber.org/protocol/chatstates" +#define NS_COMMANDS "http://jabber.org/protocol/commands" +#define NS_MUC "http://jabber.org/protocol/muc" + +#define NS_XDBGINSERT "jabber:xdb:ginsert" +#define NS_XDBNSLIST "jabber:xdb:nslist" + +#define NS_XMPP_STANZAS "urn:ietf:params:xml:ns:xmpp-stanzas" +#define NS_XMPP_TLS "urn:ietf:params:xml:ns:xmpp-tls" +#define NS_XMPP_STREAMS "urn:ietf:params:xml:ns:xmpp-streams" + +#define NS_XMPP_DELAY "urn:xmpp:delay" +#define NS_XMPP_TIME "urn:xmpp:time" +#define NS_PING "urn:xmpp:ping" +#define NS_RECEIPTS "urn:xmpp:receipts" + +#define NS_JABBERD_STOREDPRESENCE "http://jabberd.org/ns/storedpresence" +#define NS_JABBERD_HISTORY "http://jabberd.org/ns/history" + +#define XMPP_ERROR_REDIRECT 302 +#define XMPP_ERROR_BAD_REQUEST 400 +#define XMPP_ERROR_NOT_AUTHORIZED 401 +#define XMPP_ERROR_PAYMENT_REQUIRED 402 +#define XMPP_ERROR_FORBIDDEN 403 +#define XMPP_ERROR_NOT_FOUND 404 +#define XMPP_ERROR_NOT_ALLOWED 405 +#define XMPP_ERROR_NOT_ACCEPTABLE 406 +#define XMPP_ERROR_REGISTRATION_REQUIRED 407 +#define XMPP_ERROR_REQUEST_TIMEOUT 408 +#define XMPP_ERROR_CONFLICT 409 +#define XMPP_ERROR_INTERNAL_SERVER_ERROR 500 +#define XMPP_ERROR_NOT_IMPLEMENTED 501 +#define XMPP_ERROR_REMOTE_SERVER_ERROR 502 +#define XMPP_ERROR_SERVICE_UNAVAILABLE 503 +#define XMPP_ERROR_REMOTE_SERVER_TIMEOUT 504 +#define XMPP_ERROR_DISCONNECTED 510 + +#endif diff -r 1253cacc0f21 -r 05328c643696 include/xmpp_helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/xmpp_helper.h Sat Aug 01 23:05:11 2009 +0300 @@ -0,0 +1,28 @@ +#ifndef __XMPPHELPER_H__ +#define __XMPPHELPER_H__ 1 + +extern time_t iqlast; /* last message/status change time */ + +struct T_presence { + enum imstatus st; + const char *msg; +}; + +#include "config.h" +#ifdef MODULES_ENABLE +void xmpp_add_feature (const char *xmlns); +void xmpp_del_feature (const char *xmlns); +#endif + +LmMessageNode * lm_message_node_new(const gchar *name, const gchar *xmlns); +const gchar* lm_message_node_get_child_value(LmMessageNode * node, + const gchar *child); +void lm_message_node_hide(LmMessageNode * node); +void lm_message_node_insert_childnode(LmMessageNode * node, + LmMessageNode *child); +void lm_message_node_deep_ref(LmMessageNode * node); + +/* XEP-0115 (Entity Capabilities) node */ +const char *entity_version(enum imstatus status); + +#endif