Yattm - unified GTK instant-messaging client logo
   [Generated for version 0.2-17 - Mon Jan 6 19:01:23 GMT+1 2003]

Home - Main Page - Data Structures - File List - Data Fields - Globals

chat_window.h File Reference

#include <gtk/gtk.h>
#include <stdio.h>
#include <time.h>
#include "contact.h"
#include "log_window.h"
#include "service.h"

Include dependency graph for chat_window.h:

Include dependency graph

This graph shows which files directly or indirectly include this file:

Included by dependency graph

Go to the source code of this file.

Data Structures

struct  _chat_window
struct  _chat_window_account

Typedefs

typedef _chat_window chat_window
typedef _chat_window_account chat_window_account

Functions

chat_windoweb_chat_window_new (eb_local_account *local, struct contact *remote)
void eb_chat_window_display_remote_message (eb_local_account *account, eb_account *remote, struct service *serv, gchar *message)
void eb_chat_window_display_status (eb_account *remote, gchar *message)
void eb_chat_window_display_contact (struct contact *remote_contact)
void eb_chat_window_display_account (eb_account *remote_account)
void eb_chat_window_display_error (eb_account *remote, gchar *message)
void eb_log_status_changed (eb_account *ea, gchar *status)
void eb_log_message (FILE *log_file, gchar buff[], gchar *message)
void eb_chat_window_do_timestamp (struct contact *c, gboolean online)
void eb_restore_last_conv (gchar *file_name, chat_window *cw)
void send_message (GtkWidget *widget, gpointer d)

Variables

GList * outgoing_message_filters
GList * incoming_message_filters


Typedef Documentation

typedef struct _chat_window chat_window
 

typedef struct _chat_window_account chat_window_account
 


Function Documentation

void eb_chat_window_display_account eb_account   remote_account
 

Definition at line 2155 of file chat_window.c.

References account::account_contact, contact::chatwindow, eb_chat_window_new(), eb_restore_last_conv(), eb_update_window_title(), _chat_window::entry, find_suitable_local_account(), make_safe_filename(), NAME_MAX, contact::nick, _chat_window::notebook, _chat_window::notebook_child, _chat_window::perfered, account::service_id, set_tab_normal(), and _chat_window::window.

Referenced by account_click().

02156 {
02157   struct contact * remote_contact  = remote_account->account_contact;
02158   eb_local_account * account =find_suitable_local_account(NULL, remote_account->service_id);
02159 
02160   if(!remote_contact->chatwindow || !remote_contact->chatwindow->window)
02161     {
02162       if(remote_contact->chatwindow)
02163     {
02164       g_free(remote_contact->chatwindow);
02165     }
02166 
02167       remote_contact->chatwindow = eb_chat_window_new(account, remote_contact);
02168 
02169       if(remote_contact->chatwindow)
02170     {
02171       gtk_widget_show(remote_contact->chatwindow->window);
02172       if (do_restore_last_conv) 
02173         {
02174           gchar buff[NAME_MAX];
02175           make_safe_filename(buff, remote_contact->nick);
02176           eb_restore_last_conv(buff,remote_contact->chatwindow);    
02177         }
02178           gdk_window_raise(remote_contact->chatwindow->window->window);
02179       gtk_window_set_focus (GTK_WINDOW
02180                 (remote_contact->chatwindow->window),
02181                              remote_contact->chatwindow->entry);
02182     }
02183       else /* Did they get denied because they're in the Unknown group? */
02184     return;
02185     }
02186   else if (remote_contact->chatwindow && remote_contact->chatwindow->window)
02187     {
02188           gdk_window_raise(remote_contact->chatwindow->window->window);
02189       gtk_window_set_focus (GTK_WINDOW
02190                 (remote_contact->chatwindow->window),
02191                              remote_contact->chatwindow->entry);
02192     }       
02193     
02194   eb_update_window_title(remote_contact->chatwindow, FALSE);
02195     
02196   if (remote_contact->chatwindow->notebook != NULL) 
02197   {
02198     int page_num = gtk_notebook_page_num(GTK_NOTEBOOK(remote_contact->chatwindow->notebook),
02199                                      remote_contact->chatwindow->notebook_child);
02200     /* no more icons in the tabs */
02201     /* gtk_widget_hide(remote_contact->chatwindow->talk_pixmap); */
02202     set_tab_normal(GTK_NOTEBOOK(remote_contact->chatwindow->notebook), 
02203            remote_contact->chatwindow->notebook_child);
02204     gtk_notebook_set_page(GTK_NOTEBOOK(remote_contact->chatwindow->notebook), 
02205               page_num);
02206         
02207   } else {
02208     gdk_window_raise(remote_contact->chatwindow->window->window);     
02209     gtk_window_set_focus(GTK_WINDOW(remote_contact->chatwindow->window),
02210              remote_contact->chatwindow->entry);
02211   }
02212     
02213   remote_contact->chatwindow->perfered = remote_account;
02214 }

void eb_chat_window_display_contact struct contact   remote_contact
 

Definition at line 2097 of file chat_window.c.

References contact::chatwindow, eb_chat_window_new(), eb_restore_last_conv(), _chat_window::entry, find_suitable_local_account(), find_suitable_remote_account(), make_safe_filename(), NAME_MAX, contact::nick, _chat_window::notebook, _chat_window::notebook_child, account::service_id, set_tab_normal(), and _chat_window::window.

Referenced by console_session_get_command(), contact_click(), and pounce_contact().

02098 {
02099   eb_account *remote_account =
02100     find_suitable_remote_account (NULL, remote_contact);
02101   eb_local_account *account = NULL;
02102 
02103   if (remote_account)
02104     account = find_suitable_local_account (NULL, remote_account->service_id);
02105 
02106   if (!remote_contact->chatwindow || !remote_contact->chatwindow->window)
02107   {
02108     if (remote_contact->chatwindow)
02109     {
02110       g_free (remote_contact->chatwindow);
02111     }
02112 
02113     remote_contact->chatwindow = eb_chat_window_new (account, remote_contact);
02114 
02115     if (remote_contact->chatwindow)
02116     {
02117       gtk_widget_show (remote_contact->chatwindow->window);
02118       if (do_restore_last_conv)
02119       {
02120     gchar buff[NAME_MAX];
02121     make_safe_filename (buff, remote_contact->nick);
02122     eb_restore_last_conv (buff, remote_contact->chatwindow);
02123       }
02124       gdk_window_raise(remote_contact->chatwindow->window->window);
02125       gtk_window_set_focus (GTK_WINDOW
02126                 (remote_contact->chatwindow->window),
02127                 remote_contact->chatwindow->entry);
02128     }
02129 
02130   } else {
02131     gdk_window_raise(remote_contact->chatwindow->window->window);
02132     gtk_window_set_focus (GTK_WINDOW
02133                 (remote_contact->chatwindow->window),
02134                 remote_contact->chatwindow->entry);
02135   
02136   }
02137 
02138   if (remote_contact->chatwindow->notebook != NULL)
02139   {
02140     int page_num =
02141       gtk_notebook_page_num (GTK_NOTEBOOK
02142                  (remote_contact->chatwindow->notebook),
02143                  remote_contact->chatwindow->notebook_child);
02144     /* no more icons in the tabs */
02145     /* gtk_widget_hide(remote_contact->chatwindow->talk_pixmap); */
02146 
02147     set_tab_normal (GTK_NOTEBOOK (remote_contact->chatwindow->notebook),
02148             remote_contact->chatwindow->notebook_child);
02149 
02150     gtk_notebook_set_page (GTK_NOTEBOOK
02151                (remote_contact->chatwindow->notebook), page_num);
02152   }
02153 }

void eb_chat_window_display_error eb_account   remote,
gchar *    message
 

Definition at line 1871 of file chat_window.c.

References _, account::account_contact, _chat_window::chat, contact::chatwindow, EXT_GTK_TEXT, and gtk_eb_html_add().

01872 {
01873   struct contact * remote_contact = remote->account_contact;
01874 
01875   if(remote_contact->chatwindow)
01876     {
01877       gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat),
01878               _("<b>Error: </b>"), 0,0,0);
01879       gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), message, 0,0,0);
01880       gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), "<br>", 0,0,0);
01881     }
01882 }

void eb_chat_window_display_remote_message eb_local_account   account,
eb_account   remote,
struct service   serv,
gchar *    message
 

Definition at line 1904 of file chat_window.c.

References _, account::account_contact, local_account::alias, _chat_window::away_msg_sent, BUF_SIZE, _chat_window::chat, contact::chatwindow, DBG_CORE, eb_chat_window_new(), eb_debug, eb_log_message(), eb_restore_last_conv(), eb_smilify(), eb_update_window_title(), _chat_window::entry, EXT_GTK_TEXT, _chat_window::first_enabled, FIRSTMSG, _chat_window::fp, service_callbacks::get_color, service_callbacks::get_smileys, contact::group, gtk_eb_html_add(), incoming_message_filters, _chat_window::local_user, make_safe_filename(), _grouplist::name, NAME_MAX, contact::nick, _chat_window::notebook, _chat_window::notebook_child, _chat_window::perfered, play_sound(), RECEIVE, _chat_window::receive_enabled, RUN_SERVICE, service::sc, send_message(), set_tab_red(), _chat_window::sound_enabled, and _chat_window::window.

Referenced by eb_parse_incomming_message().

01908 {
01909   struct contact * remote_contact = remote->account_contact;
01910   gchar buff[BUF_SIZE];
01911   gchar buff2[BUF_SIZE];
01912   struct tm * cur_time;
01913   time_t t;
01914   GList * filter_walk;
01915   gchar * message;
01916   gboolean firstmsg = FALSE; /* init to false so only play if
01917                   * first msg is one received rather
01918                   * than sent */
01919 #ifdef HAVE_ICONV_H
01920   /* 'BUF_SIZE*2' e.g. for 'Latin-x' to 'UTF-8',
01921      which is 1-byte to 2-byte recoding */
01922   char recode_buff[BUF_SIZE*2 + 1];
01923 #endif
01924 
01925 
01926   /* do we need to ignore this user? If so, do it BEFORE filters so they can't DoS us */
01927 
01928   if(!strcasecmp(remote_contact->group->name, _("Ignore") ))
01929     return;
01930 
01931   // Inbound filters here - Meredydd
01932   filter_walk=incoming_message_filters;
01933 
01934   eb_debug(DBG_CORE, "Starting to run incoming filters\n");
01935 
01936   message=strdup(o_message);
01937 
01938   while(filter_walk!=NULL)
01939   {
01940     gchar * (*ofilter)(eb_local_account *, eb_account *, struct contact *, gchar *);
01941 
01942     eb_debug(DBG_CORE, "Running an incoming filter\n");
01943     ofilter=(gchar *(*)(eb_local_account *, eb_account *, struct contact *, gchar *))filter_walk->data;
01944 
01945     message=ofilter(account, remote, remote_contact, message);
01946     if(message==NULL) { return; } // Nothing to clean up (I think...)
01947 
01948     filter_walk=g_list_next(filter_walk);
01949   }
01950 
01951   eb_debug(DBG_CORE, "Finished incoming filters\n");
01952 
01953   // end inbound filters
01954 
01955   
01956   message = eb_smilify(message, serv->sc->get_smileys());
01957 
01958   if(!remote_contact->chatwindow || !remote_contact->chatwindow->window)
01959     {
01960       if(remote_contact->chatwindow)
01961     g_free(remote_contact->chatwindow);
01962 
01963       remote_contact->chatwindow = eb_chat_window_new(account, remote_contact);
01964 
01965       if (!remote_contact->chatwindow)
01966     /* this message is ignored */
01967     return;
01968 
01969       gtk_widget_show(remote_contact->chatwindow->window);
01970       firstmsg = TRUE;        /* chat window created by
01971                    * receive msg, so set to true */
01972       if (do_restore_last_conv){
01973     gchar buff[NAME_MAX];
01974     make_safe_filename(buff, remote_contact->nick);
01975     eb_restore_last_conv(buff,remote_contact->chatwindow);
01976       }
01977     }
01978 
01979   /*for now we will assume the identity that the person in question talked
01980     to us last as */
01981   remote_contact->chatwindow->local_user = account;
01982 
01983   /*also specify that if possible, try to use the same account they used
01984     to last talk to us with */
01985   remote_contact->chatwindow->perfered = remote;
01986 
01987   if (remote_contact->chatwindow->notebook != NULL) {
01988     /* no more icons in the tabs */
01989     /* gtk_widget_show(remote_contact->chatwindow->talk_pixmap); */
01990 
01991     if (gtk_notebook_page_num(GTK_NOTEBOOK(remote_contact->chatwindow->notebook),
01992                   remote_contact->chatwindow->notebook_child) != gtk_notebook_get_current_page(
01993                                                        GTK_NOTEBOOK(remote_contact->chatwindow->notebook)))
01994       {
01995     set_tab_red(GTK_NOTEBOOK(remote_contact->chatwindow->notebook), remote_contact->chatwindow->notebook_child);
01996       }
01997 
01998   } else {
01999     gdk_window_raise(remote_contact->chatwindow->window->window);     
02000     gtk_window_set_focus(GTK_WINDOW(remote_contact->chatwindow->window),
02001              remote_contact->chatwindow->entry);
02002   }
02003 
02004   eb_update_window_title(remote_contact->chatwindow, TRUE);
02005 
02006   if(remote_contact->chatwindow->sound_enabled)
02007     {
02008       if (firstmsg)
02009     {
02010       if (remote_contact->chatwindow->first_enabled)
02011         {
02012           play_sound(FIRSTMSG);
02013           firstmsg = FALSE;
02014         }
02015       else
02016         {
02017           play_sound(RECEIVE);
02018           firstmsg = FALSE;
02019         }
02020     }
02021       else if (remote_contact->chatwindow->receive_enabled)
02022     play_sound(RECEIVE);
02023     }
02024     
02025   /*for grab the focus*/
02026     
02027   if(do_raise_window)
02028     {
02029       gdk_window_raise(remote_contact->chatwindow->window->window);
02030       //    gtk_widget_grab_focus(remote_contact->chatwindow->entry);
02031     }
02032 
02033   if (do_convo_timestamp)
02034     {
02035       gchar * color;
02036 
02037       color=serv->sc->get_color(); // note do not free() afterwards, may be static
02038 
02039       time(&t);
02040       cur_time = localtime(&t);
02041       g_snprintf(buff2, BUF_SIZE, "<FONT COLOR=\"#ff0000\">%d:%.2d:%.2d</FONT> <FONT COLOR=\"%s\">%s:</FONT>",
02042          cur_time->tm_hour, cur_time->tm_min,
02043          cur_time->tm_sec, color, remote_contact->nick);
02044     }
02045   else
02046     {
02047       g_snprintf(buff2, BUF_SIZE, "%s", remote_contact->nick);
02048     }
02049 
02050 #ifdef HAVE_ICONV_H
02051 message = recode_if_needed(message, recode_buff, RECODE_TO_LOCAL);
02052 #endif
02053 
02054   g_snprintf(buff, BUF_SIZE, "<B>%s </B>",buff2);
02055 
02056   gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), buff,0,0,0);
02057   gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), message,do_ignore_back,do_ignore_fore,do_ignore_font);
02058   gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), "<BR>",0,0,0);
02059 
02060   /* Log the message */
02061 
02062   if(do_logging) eb_log_message(remote_contact->chatwindow->fp, buff, message);
02063 
02064   /* If user's away and hasn't yet sent the away message in the last 5 minutes,
02065      send, display, & log his away message.
02066      We might want to give the option of whether or not to always send the message.*/
02067 
02068   if(is_away && (time(NULL) - remote_contact->chatwindow->away_msg_sent) > 300)
02069     {
02070       send_message(NULL, remote_contact->chatwindow);
02071       RUN_SERVICE(account)->send_im(
02072                     account,
02073                     remote,
02074                     gtk_entry_get_text(GTK_ENTRY(away_message)));
02075       time(&t);
02076       cur_time = localtime(&t);
02077       g_snprintf(buff, BUF_SIZE, "<FONT COLOR=\"#0000ff\"><B>%d:%.2d:%.2d %s: </B></FONT>",
02078          cur_time->tm_hour, cur_time->tm_min, cur_time->tm_sec,
02079          account->alias);
02080       gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), buff,0,0,0);
02081       gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), 
02082               gtk_entry_get_text(GTK_ENTRY(away_message)),do_ignore_back,do_ignore_fore,do_ignore_font);
02083       gtk_eb_html_add(EXT_GTK_TEXT(remote_contact->chatwindow->chat), "<br>", 0,0,0);
02084 
02085       /* Note that the time the last away message has been sent */
02086 
02087       remote_contact->chatwindow->away_msg_sent = time(NULL);
02088 
02089       /* Log it */
02090 
02091       if(do_logging) eb_log_message(remote_contact->chatwindow->fp, buff,
02092                     gtk_entry_get_text(GTK_ENTRY(away_message)));
02093     }
02094     free(message);
02095 }

void eb_chat_window_display_status eb_account   remote,
gchar *    message
 

Definition at line 2409 of file chat_window.c.

References contact::chatwindow, find_contact_by_handle(), account::handle, and _chat_window::status_label.

Referenced by eb_update_status().

02411 {
02412   struct contact * remote_contact = find_contact_by_handle(remote->handle);
02413   char * tmp = NULL;
02414 
02415   /* trim @.* part for User is typing */
02416   if (remote_contact == NULL || remote_contact->chatwindow == NULL) {
02417      gchar ** tmp_ct = NULL;
02418      if (strchr (remote->handle,'@') ) {
02419      tmp_ct = g_strsplit (remote->handle,"@",2);
02420      remote_contact = find_contact_by_handle(tmp_ct[0]);
02421      g_strfreev (tmp_ct);
02422      }
02423   }
02424 
02425   if (remote_contact == NULL || remote_contact->chatwindow == NULL)
02426      return;
02427   
02428   if (message != NULL && strlen(message) > 0)
02429      tmp = g_strdup_printf("%s", message);
02430   else
02431      tmp = g_strdup_printf(" ");
02432 
02433   gtk_label_set_text( GTK_LABEL(remote_contact->chatwindow->status_label), tmp );
02434   g_free(tmp);
02435 }

void eb_chat_window_do_timestamp struct contact   c,
gboolean    online
 

Definition at line 1884 of file chat_window.c.

References _, BUF_SIZE, _chat_window::chat, contact::chatwindow, EXT_GTK_TEXT, gtk_eb_html_add(), and contact::nick.

Referenced by contact_login(), and contact_logoff().

01885 {
01886   gchar buff[BUF_SIZE];
01887   time_t my_time = time(NULL);
01888   if(!c || !c->chatwindow)
01889     return;
01890 
01891   if(!do_timestamp)
01892     {
01893       return;
01894     }
01895 
01896   gtk_eb_html_add(EXT_GTK_TEXT(c->chatwindow->chat), "<hr>", 0,0,0);
01897   g_snprintf(buff, BUF_SIZE,_("<b>%s is logged %s @ %s.</b>"),
01898          c->nick, (online?_("in"):_("out")), g_strchomp(asctime(localtime(&my_time))));
01899   gtk_eb_html_add(EXT_GTK_TEXT(c->chatwindow->chat), buff, 0,0,0);
01900   gtk_eb_html_add(EXT_GTK_TEXT(c->chatwindow->chat), "<hr>", 0,0,0);
01901 }

chat_window* eb_chat_window_new eb_local_account   local,
struct contact   remote
 

Definition at line 1320 of file chat_window.c.

References _, add_unknown_callback(), _chat_window::allow_button, allow_offline_on_click(), allow_offline_on_toggle(), _chat_window::away_msg_sent, can_offline_message(), _chat_window::chat, chat_key_press(), chat_notebook_switch_callback(), chat_singleline_key_press(), close_tab_callback(), close_win(), _chat_window::contact, destroy_event(), eb_icon(), _chat_window::entry, EXT_GTK_TEXT, ext_gtk_text_new(), find_tabbed_chat_window(), _chat_window::first_enabled, _chat_window::fp, contact::group, gtk_eb_html_init(), gtkspell_attach(), gtkspell_running(), gtkspell_start(), handle_click(), handle_focus(), ignore_callback(), _chat_window::local_user, make_safe_filename(), _grouplist::name, NAME_MAX, contact::nick, _chat_window::notebook, _chat_window::notebook_child, _chat_window::perfered, _chat_window::receive_enabled, _chat_window::send_enabled, send_file(), send_message(), set_sound_on_click(), set_sound_on_toggle(), show_smileys_callback(), _chat_window::smiley_button, _chat_window::sound_button, _chat_window::sound_enabled, _chat_window::status_label, view_log_callback(), and _chat_window::window.

Referenced by eb_chat_window_display_account(), eb_chat_window_display_contact(), and eb_chat_window_display_remote_message().

01321 {
01322   GtkWidget *vbox;
01323   GtkWidget *hbox;
01324   GtkWidget *scrollwindow;
01325   GtkWidget *toolbar;
01326   GtkWidget *add_button;
01327   GtkWidget *sendf_button;
01328   GtkWidget *send_button;
01329   GtkWidget *view_log_button;
01330   GtkWidget *close_button;
01331   GtkWidget *ignore_button;
01332   GtkWidget *iconwid;
01333   GdkPixmap *icon;
01334   GdkBitmap *mask;
01335   GtkAccelGroup *accel_group;
01336   GtkWidget *menu;
01337   GtkWidget *button;
01338   GtkWidget *separator;
01339   GtkWidget *resize_bar;
01340   gchar buff[NAME_MAX];
01341   chat_window *cw;
01342   chat_window *tab_cw;
01343   GtkPositionType pos;
01344   GtkWidget *contact_label;
01345 
01346   if (do_ignore_unknown)
01347     {
01348       if (!strcmp(_("Unknown"), remote->group->name))
01349     return NULL;
01350     }
01351 
01352   /* first we allocate room for the new chat window */
01353   cw = g_new0(chat_window,1);
01354   cw->contact = remote;
01355   cw->away_msg_sent = 0;
01356   cw->perfered = NULL;
01357   cw->local_user = NULL;
01358 
01359   vbox = gtk_vbox_new(FALSE,0); 
01360            
01361   /* we're doing a tabbed chat */
01362   if (do_tabbed_chat) {
01363     /* look for an already open tabbed chat window */
01364     tab_cw = find_tabbed_chat_window();
01365     if (tab_cw == NULL) {
01366       /* none exists, create one */
01367       cw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
01368       gtk_window_set_wmclass(GTK_WINDOW(cw->window), "yattm-chat", "Yattm");
01369       gtk_window_set_policy(GTK_WINDOW(cw->window), TRUE, TRUE, TRUE);
01370       gtk_widget_realize(cw->window);
01371 
01372       cw->notebook = gtk_notebook_new();
01373         
01374       /* Set tab orientation.... */
01375       pos = GTK_POS_BOTTOM;
01376       switch (do_tabbed_chat_orient)
01377     {
01378     case 1:
01379       pos = GTK_POS_TOP;
01380       break;;
01381         
01382     case 2:
01383       pos = GTK_POS_LEFT;
01384       break;;
01385 
01386     case 3:
01387       pos = GTK_POS_RIGHT;
01388       break;;
01389 
01390     case 0:
01391     default:
01392       pos = GTK_POS_BOTTOM;
01393       break;;
01394     }
01395       gtk_notebook_set_tab_pos(GTK_NOTEBOOK(cw->notebook), pos);
01396       /* End tab orientation */
01397         
01398       gtk_notebook_set_scrollable(GTK_NOTEBOOK(cw->notebook), TRUE);
01399       gtk_container_add(GTK_CONTAINER(cw->window), cw->notebook);
01400 
01401       /* setup a signal handler for the notebook to handle page switches */
01402       gtk_signal_connect(GTK_OBJECT(cw->notebook), "switch-page",
01403              GTK_SIGNAL_FUNC(chat_notebook_switch_callback),
01404              cw);
01405         
01406 
01407       gtk_widget_show(cw->notebook);
01408     } else {
01409       cw->window = tab_cw->window;
01410       cw->notebook = tab_cw->notebook;
01411     }
01412 
01413     /* set up the text and close button */
01414     contact_label = gtk_label_new(remote->nick);
01415     gtk_widget_show(contact_label);
01416 
01417     /* we use vbox as our child. */
01418     gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
01419     cw->notebook_child = vbox;
01420     gtk_notebook_append_page(GTK_NOTEBOOK(cw->notebook), cw->notebook_child, contact_label);
01421     gtk_widget_show(cw->notebook_child);
01422   } else {
01423     /* setup like normal */
01424     cw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
01425 
01426     gtk_window_set_wmclass(GTK_WINDOW(cw->window), "yattm-chat", "Yattm");
01427     gtk_window_set_policy(GTK_WINDOW(cw->window), TRUE, TRUE, TRUE);
01428     gtk_widget_realize(cw->window);
01429 
01430     cw->notebook = NULL;
01431     cw->notebook_child = NULL;
01432     gtk_container_add(GTK_CONTAINER(cw->window), vbox);
01433     gtk_widget_show(vbox);
01434   }
01435 
01436   /* Next line allows making window smaller than orig. size */
01437   cw->chat = ext_gtk_text_new(NULL,NULL);
01438   gtk_eb_html_init(EXT_GTK_TEXT(cw->chat));
01439   scrollwindow = gtk_scrolled_window_new(NULL, EXT_GTK_TEXT(cw->chat)->vadj);
01440   /*    gtk_widget_realize(cw->window); */
01441 
01442   gtk_window_set_title(GTK_WINDOW(cw->window), remote->nick);    
01443     
01444   eb_icon(cw->window->window);  
01445   gtk_widget_set_usize(scrollwindow, 375, 150);
01446   gtk_container_add(GTK_CONTAINER(scrollwindow), cw->chat);
01447   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwindow), 
01448                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
01449   gtk_widget_show(scrollwindow);
01450 
01451   /* Create the bar for resizing chat/window box */
01452 
01453   /*Add stuff for multi-line*/
01454    
01455   if(do_multi_line)
01456     {
01457       resize_bar = gtk_vpaned_new();
01458       gtk_paned_set_gutter_size(GTK_PANED(resize_bar), 20);
01459       gtk_paned_pack1(GTK_PANED(resize_bar), scrollwindow, TRUE, TRUE);
01460       gtk_widget_show(scrollwindow);
01461 
01462       scrollwindow = gtk_scrolled_window_new(NULL, NULL);
01463       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrollwindow), 
01464                      GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
01465         
01466       cw->entry = gtk_text_new(NULL, NULL);
01467      
01468       gtk_widget_set_usize(scrollwindow, 375, 50);
01469       gtk_container_add(GTK_CONTAINER(scrollwindow), cw->entry);
01470       
01471       gtk_text_set_editable(GTK_TEXT(cw->entry), TRUE);
01472       gtk_text_set_word_wrap(GTK_TEXT(cw->entry), TRUE);
01473       gtk_text_set_line_wrap(GTK_TEXT(cw->entry), TRUE);
01474 
01475 #ifdef HAVE_ISPELL
01476       if(do_spell_checking)
01477     {
01478       if(!gtkspell_running())
01479         {
01480           gchar *ispell_cmd[] = { "ispell", "-a", NULL };
01481           gtkspell_start(NULL, ispell_cmd);
01482         }
01483       gtkspell_attach(GTK_TEXT(cw->entry));
01484     }
01485 #endif
01486 
01487       gtk_signal_connect(GTK_OBJECT(cw->entry), "key_press_event",
01488              GTK_SIGNAL_FUNC(chat_key_press),
01489              cw);
01490 
01491       gtk_paned_pack2(GTK_PANED(resize_bar), scrollwindow, FALSE, FALSE);
01492       gtk_widget_show(scrollwindow);
01493       gtk_box_pack_start(GTK_BOX(vbox),resize_bar, TRUE, TRUE, 5);
01494       gtk_widget_show(resize_bar);
01495     }
01496 
01497   /*Or not multi-line*/
01498 
01499   else
01500     {
01501       cw->entry = gtk_entry_new();
01502       gtk_signal_connect(GTK_OBJECT(cw->entry), "key_press_event",
01503              GTK_SIGNAL_FUNC(chat_singleline_key_press),
01504              cw);
01505 
01506       gtk_box_pack_start(GTK_BOX(vbox), scrollwindow, TRUE,TRUE, 5);
01507       gtk_box_pack_start(GTK_BOX(vbox), cw->entry, FALSE,FALSE, 5);
01508     }
01509     
01510   gtk_container_set_border_width(GTK_CONTAINER(cw->window), do_tabbed_chat ? 2 : 5);
01511   /*    gtk_container_add(GTK_CONTAINER(cw->window), vbox); */
01512 
01513   gtk_signal_connect(GTK_OBJECT(cw->entry), "activate",
01514              GTK_SIGNAL_FUNC(send_message), cw);
01515 
01516   gtk_signal_connect(GTK_OBJECT(vbox), "destroy",
01517              GTK_SIGNAL_FUNC(destroy_event), cw);   
01518 
01519   gtk_signal_connect(GTK_OBJECT(cw->chat), "button_press_event",
01520              GTK_SIGNAL_FUNC(handle_click), cw);                        
01521   
01522   gtk_signal_connect(GTK_OBJECT(cw->window), "focus_in_event",
01523              GTK_SIGNAL_FUNC(handle_focus), cw);
01524 
01525   hbox = gtk_hbox_new(FALSE, 0);
01526   gtk_widget_set_usize(hbox, 200, 25);
01527    
01528   toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
01529   gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolbar), GTK_RELIEF_NONE);
01530   gtk_container_set_border_width(GTK_CONTAINER(toolbar), 0);
01531   gtk_toolbar_set_space_size(GTK_TOOLBAR(toolbar), 5);
01532   
01533   /* Adding accelerators to windows*/
01534     
01535   accel_group = gtk_accel_group_new();
01536   gtk_window_add_accel_group(GTK_WINDOW(cw->window), accel_group);
01537   menu = gtk_menu_new();
01538   
01539   /* This is the same as handle_clicks, without showing the menu for
01540      accelerators to hopefully work better now. 
01541   */
01542 
01543   /*Add Contact Selection*/
01544    
01545   if(!strcmp(cw->contact->group->name, _("Unknown")))
01546     {
01547       button = gtk_menu_item_new_with_label(_("Add Contact"));
01548       gtk_signal_connect(GTK_OBJECT(button), "activate",
01549              GTK_SIGNAL_FUNC(add_unknown_callback),
01550              cw);
01551       gtk_menu_append(GTK_MENU(menu), button);
01552     }
01553       
01554   /*Allow Offline Messaging Selection*/
01555    
01556   if(can_offline_message(cw->contact))
01557     {   
01558       button = gtk_menu_item_new_with_label(_("Offline Messaging"));
01559       gtk_signal_connect(GTK_OBJECT(button), "activate",
01560              GTK_SIGNAL_FUNC(allow_offline_on_click),
01561              cw);
01562       gtk_widget_add_accelerator(button, "activate", accel_group, 
01563                  GDK_o, GDK_CONTROL_MASK,
01564                  GTK_ACCEL_VISIBLE);
01565       gtk_menu_append(GTK_MENU(menu), button);
01566     }
01567 
01568   /*Sound Selection*/
01569 
01570   if (cw->sound_enabled)
01571     {
01572       button = gtk_menu_item_new_with_label(_("Disable Sounds"));
01573     }
01574   else
01575     {
01576       button = gtk_menu_item_new_with_label(_("Enable Sounds"));
01577     }
01578        
01579   gtk_signal_connect(GTK_OBJECT(button), "activate",
01580              GTK_SIGNAL_FUNC(set_sound_on_click),
01581              cw); 
01582   gtk_widget_add_accelerator(button, "activate", accel_group, 
01583                  GDK_s, GDK_CONTROL_MASK,
01584                  GTK_ACCEL_VISIBLE);
01585   gtk_menu_append(GTK_MENU(menu), button);
01586 
01587   /* Ignore button section */
01588 
01589   button = gtk_menu_item_new_with_label(_("Ignore Contact"));
01590   gtk_signal_connect(GTK_OBJECT(button), "activate",
01591              GTK_SIGNAL_FUNC(ignore_callback), cw);
01592   gtk_widget_add_accelerator(button, "activate", accel_group,
01593                  GDK_g, GDK_CONTROL_MASK,
01594                  GTK_ACCEL_VISIBLE);
01595   gtk_menu_append(GTK_MENU(menu), button);
01596 
01597   /*Send File Selection*/ 
01598 
01599   button = gtk_menu_item_new_with_label(_("Send File"));
01600   gtk_signal_connect(GTK_OBJECT(button), "activate",
01601              GTK_SIGNAL_FUNC(send_file),
01602              cw);
01603   gtk_widget_add_accelerator(button, "activate", accel_group, 
01604                  GDK_t, GDK_CONTROL_MASK,
01605                  GTK_ACCEL_VISIBLE);
01606   gtk_menu_append(GTK_MENU(menu), button);
01607     
01608   /*Send Selection*/
01609       
01610   button = gtk_menu_item_new_with_label(_("Send Message"));
01611   gtk_signal_connect(GTK_OBJECT(button), "activate",
01612              GTK_SIGNAL_FUNC(send_message),
01613              cw);
01614   gtk_widget_add_accelerator(button, "activate", accel_group, 
01615                  GDK_r, GDK_CONTROL_MASK,
01616                  GTK_ACCEL_VISIBLE);
01617   gtk_menu_append(GTK_MENU(menu), button);
01618 
01619   /*** MIZHI
01620    * view log file selection
01621    */
01622 
01623   button = gtk_menu_item_new_with_label(_("View log"));
01624   gtk_signal_connect(GTK_OBJECT(button), "activate",
01625              GTK_SIGNAL_FUNC(view_log_callback),
01626              cw);
01627   gtk_widget_add_accelerator(button, "activate", accel_group, 
01628                  GDK_l, GDK_CONTROL_MASK,
01629                  GTK_ACCEL_VISIBLE);
01630   gtk_menu_append(GTK_MENU(menu), button);
01631     
01632   /*Close Selection*/
01633 
01634   button = gtk_menu_item_new_with_label(_("Close"));
01635 
01636   gtk_signal_connect(GTK_OBJECT(button), "activate",
01637              GTK_SIGNAL_FUNC(close_win),
01638              cw);
01639 
01640   gtk_widget_add_accelerator(button, "activate", accel_group,
01641                  GDK_q, GDK_CONTROL_MASK,
01642                  GTK_ACCEL_VISIBLE);
01643   gtk_menu_append(GTK_MENU(menu), button);  
01644 
01645   /*This is we decide whether or not the add button should be displayed*/
01646    
01647   if (!strcmp(cw->contact->group->name, _("Unknown")))
01648     {
01649       /*This is the add button*/
01650       icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_book_red_xpm);
01651       iconwid = gtk_pixmap_new(icon , mask);
01652       gtk_widget_show(iconwid);
01653       add_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
01654                        _("Add"),
01655                        _("Add Contact"),
01656                        _("Add"),
01657                        iconwid,
01658                        GTK_SIGNAL_FUNC(add_unknown_callback),
01659                        cw);
01660       gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
01661     }
01662 
01663   /*Decide whether the offline messaging button should be displayed*/
01664 
01665   if(can_offline_message(remote))
01666     {
01667       icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_edit_xpm);
01668       iconwid = gtk_pixmap_new(icon , mask);
01669       gtk_widget_show(iconwid);
01670       cw->allow_button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
01671                             GTK_TOOLBAR_CHILD_TOGGLEBUTTON,
01672                             NULL,
01673                             _("Allow"),
01674                             _("Allow Offline Messaging CTRL+O"),
01675                             _("Allow"),
01676                             iconwid,
01677                             GTK_SIGNAL_FUNC(allow_offline_on_toggle),
01678                             cw);
01679       gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
01680       gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->allow_button), FALSE);
01681     }
01682    
01683   /* smileys */
01684   if(do_smiley == 1) {
01685       icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, smiley_button_xpm);
01686       iconwid = gtk_pixmap_new(icon, mask);
01687       gtk_widget_show(iconwid);
01688       cw->smiley_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
01689                             _("Smiley"),
01690                             _("Insert Smiley"),
01691                             _("Smiley"),
01692                             iconwid,
01693                             GTK_SIGNAL_FUNC(show_smileys_callback),
01694                             cw);
01695       /*Create the separator for the toolbar*/
01696 
01697       gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
01698       separator = gtk_vseparator_new();
01699       gtk_widget_set_usize(GTK_WIDGET(separator), 0, 20);
01700       gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), separator, NULL, NULL);
01701       gtk_widget_show(separator);
01702       gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
01703   }
01704   /*This is the sound toggle button*/
01705 
01706   icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_volume_xpm);
01707   iconwid = gtk_pixmap_new(icon, mask);
01708   gtk_widget_show(iconwid);
01709   cw->sound_button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
01710                         GTK_TOOLBAR_CHILD_TOGGLEBUTTON,
01711                         NULL,
01712                         _("Sound"),
01713                         _("Enable Sounds CTRL+S"),
01714                         _("Sound"),
01715                         iconwid,
01716                         GTK_SIGNAL_FUNC(set_sound_on_toggle),
01717                         cw);
01718   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
01719    
01720   /*Toggle the sound button based on preferences*/
01721 
01722   if (do_play_send)
01723     cw->send_enabled=TRUE;
01724 
01725   if (do_play_receive)
01726     cw->receive_enabled = TRUE;
01727 
01728   if (do_play_first)
01729     cw->first_enabled = TRUE;
01730 
01731   if (do_play_send + do_play_receive + do_play_first > 0)
01732     gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->sound_button), TRUE);
01733   else
01734     gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(cw->sound_button), FALSE);
01735 
01736   /*Create the separator for the toolbar*/
01737 
01738   separator = gtk_vseparator_new();
01739   gtk_widget_set_usize(GTK_WIDGET(separator), 0, 20);
01740   gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), separator, NULL, NULL);
01741   gtk_widget_show(separator);
01742   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
01743    
01744   /*** MIZHI
01745    * create the button for the log viewing functions
01746    */
01747 
01748   icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_search_xpm);
01749   iconwid = gtk_pixmap_new(icon, mask);
01750   gtk_widget_show(iconwid);
01751   view_log_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
01752                         "View",
01753                         _("View Log CTRL+L"),
01754                         "View",
01755                         iconwid,
01756                         GTK_SIGNAL_FUNC(view_log_callback),
01757                         cw);
01758   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 
01759 
01760   /*This is the send file button*/
01761 
01762   icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_open_xpm);
01763   iconwid = gtk_pixmap_new(icon, mask);
01764   gtk_widget_show(iconwid);
01765   sendf_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
01766                      "sendf",
01767                      _("Send File CTRL+T"),
01768                      "sendf",
01769                      iconwid,
01770                      GTK_SIGNAL_FUNC(send_file),
01771                      cw);
01772   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 
01773   
01774   /*This is the ignore button*/
01775 
01776   icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_no_xpm);
01777   iconwid = gtk_pixmap_new(icon, mask);
01778   gtk_widget_show(iconwid); 
01779   ignore_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
01780                       "ignore",
01781                       _("Ignore CTRL+G"), 
01782                       "ignore",
01783                       iconwid, 
01784                       GTK_SIGNAL_FUNC(ignore_callback), 
01785                       cw);
01786   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 
01787 
01788   /*This is the send button*/
01789 
01790   icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, tb_mail_send_xpm);
01791   iconwid = gtk_pixmap_new(icon, mask);
01792   gtk_widget_show(iconwid);
01793   send_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
01794                     "send", 
01795                     _("Send Message CTRL+R"),
01796                     "send",
01797                     iconwid, 
01798                     GTK_SIGNAL_FUNC(send_message),
01799                     cw);
01800   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); 
01801 
01802   /* Vertical separator */
01803 
01804   separator = gtk_vseparator_new();
01805   gtk_widget_set_usize(GTK_WIDGET(separator), 0, 20);
01806   gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), separator, NULL, NULL);
01807   gtk_widget_show(separator);
01808   gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
01809     
01810   /*This is the close button*/
01811 
01812   icon = gdk_pixmap_create_from_xpm_d(cw->window->window, &mask, NULL, cancel_xpm);
01813   iconwid = gtk_pixmap_new(icon, mask);
01814   gtk_widget_show(iconwid);
01815 
01816   if (do_tabbed_chat)
01817     {
01818       close_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
01819                          "close",
01820                          _("Close CTRL+Q"),
01821                          "close",
01822                          iconwid,
01823                          GTK_SIGNAL_FUNC(close_tab_callback),
01824                          cw);
01825     } else {
01826 
01827       close_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
01828                          "close",
01829                          _("Close CTRL+Q"),
01830                          "close",
01831                          iconwid,
01832                          GTK_SIGNAL_FUNC(close_win),
01833                          cw);
01834     }       
01835     
01836   cw->status_label = gtk_label_new(" ");
01837   gtk_box_pack_start(GTK_BOX(hbox), cw->status_label, FALSE, FALSE, 0);
01838   gtk_widget_show(cw->status_label);
01839 
01840   gtk_box_pack_end(GTK_BOX(hbox), toolbar, FALSE, FALSE, 0);
01841   gtk_widget_show(toolbar);
01842    
01843   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
01844   gtk_widget_show(hbox);
01845 
01846   make_safe_filename(buff, remote->nick);
01847 
01848   if ((cw->fp = fopen(buff, "a")) == NULL) 
01849     {
01850       perror(buff);
01851       do_logging=0;
01852     }
01853 
01854   if(do_logging)
01855     {
01856       time_t my_time = time(NULL);
01857       fprintf(cw->fp, _("%sConversation started on %s %s\n"),
01858           (do_strip_html ? "" : "<HR WIDTH=\"100%%\"><P ALIGN=\"CENTER\"><B>"),
01859           g_strchomp(asctime(localtime(&my_time))), (do_strip_html?"":"</B></P>"));
01860       fflush(cw->fp);
01861     }
01862 
01863   gtk_widget_show(cw->chat);
01864   gtk_widget_show(cw->entry);
01865   /*    gtk_widget_show(vbox);
01866     gtk_widget_show(cw->notebook); */
01867 
01868   return cw;
01869 }

void eb_log_message FILE *    log_file,
gchar    buff[],
gchar *    message
 

Definition at line 2227 of file chat_window.c.

References strip_html().

Referenced by eb_chat_window_display_remote_message(), eb_log_status_changed(), and send_message().

02228 {
02229   gchar * my_name = strdup(buff);
02230   gchar * my_message = strdup(message);
02231 
02232   /* Get rid of the HTML if the user doesn't want it */
02233 
02234   if(do_strip_html)
02235     {
02236       strip_html(my_message);
02237       strip_html(my_name);
02238     }
02239 
02240   /* Log the message, using the appropriate formatting */
02241 
02242   fprintf(log_file, "%s %s %s %s\n",
02243       (do_strip_html ? "" : "<P>"), my_name, my_message, (do_strip_html ? "" : "</P>"));
02244   fflush(log_file);
02245 
02246   free(my_message);
02247   free(my_name);
02248 }

void eb_log_status_changed eb_account   ea,
gchar *    status
 

Definition at line 2216 of file chat_window.c.

References account::account_contact, contact::chatwindow, eb_log_message(), _chat_window::fp, and account::handle.

Referenced by buddy_update_status_and_log().

02217 {
02218     if(ea == NULL || ea->account_contact == NULL || 
02219             ea->account_contact->chatwindow == NULL ||
02220             ea->account_contact->chatwindow->fp == NULL)
02221         return;
02222 
02223     eb_log_message(ea->account_contact->chatwindow->fp, ea->handle, 
02224             ((status && status[0])?status:"Available"));
02225 }

void eb_restore_last_conv gchar *    file_name,
chat_window   cw
 

Definition at line 2250 of file chat_window.c.

References _, BUF_SIZE, _chat_window::chat, _chat_window::contact, EXT_GTK_TEXT, gtk_eb_html_add(), contact::nick, and strip_html().

Referenced by eb_chat_window_display_account(), eb_chat_window_display_contact(), and eb_chat_window_display_remote_message().

02251 {
02252   FILE * fp;
02253   gchar buff[1024];
02254   gchar buff2[1024];
02255   gchar *buff3;
02256   gchar color[8];
02257   gchar name[512];
02258   gchar *token;
02259   long location = -1;
02260   long lastlocation = -1;
02261   long beforeget;
02262 
02263   if ( (fp = fopen(file_name, "r")) == NULL)
02264     {
02265       //there must not be a list logfile...
02266       return;
02267     }
02268 
02269 
02270   /*find last conversation */
02271   while(!feof(fp))
02272     {
02273       beforeget = ftell(fp);
02274       fgets(buff, 1024, fp);
02275       if(feof(fp))
02276     {
02277       break;
02278     }
02279       g_strchomp(buff);
02280       if(!strncmp(buff,_("Conversation started"),strlen(_("Conversation started")))
02281      || !strncmp(buff,_("<HR WIDTH=\"100%\"><P ALIGN=\"CENTER\"><B>Conversation started"),strlen(_("<HR WIDTH=\"100%\"><P ALIGN=\"CENTER\"><B>Conversation started"))))
02282     {
02283       lastlocation = location;
02284       location = beforeget;
02285     }
02286     }
02287 
02288   if(lastlocation == -1)
02289     {
02290       if(location == -1 || location == 0)
02291     {
02292       fclose(fp);
02293       return;
02294     }
02295       lastlocation = location;
02296     }
02297   fseek(fp,lastlocation, SEEK_SET);
02298 
02299   /* now we display the log */
02300   while(!feof(fp))
02301     {
02302       fgets(buff,1024,fp);
02303       if(feof(fp))
02304     {
02305       break;
02306     }
02307       g_strchomp(buff);
02308 
02309       if(buff[0] == '<') /*this is html*/
02310     {
02311 
02312       if(!strncmp(buff,"<HR WIDTH=\"100%\">",
02313               strlen("<HR WIDTH=\"100%\">")))
02314         {
02315           gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff+strlen("<HR WIDTH=\"100%\">"),0,0,0);
02316         }
02317       else
02318         {
02319           gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff, 0,0,0);
02320         }
02321 
02322 
02323       gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0);
02324 
02325       if(strlen(buff) > 34 && !strncmp(buff+34,_("ended on"),8))
02326         {
02327           break;
02328         }
02329     }
02330       else if(!strncmp(buff,_("Conversation started"),strlen(_("Conversation started"))))
02331     {
02332       gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<hr>", 0,0,0);
02333       gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff, 0,0,0);
02334       gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0);
02335 
02336     }
02337       else if(!strncmp(buff,_("Conversation ended"),strlen(_("Conversation ended"))))
02338     {
02339 
02340       gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff,0,0,0);
02341       gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0);
02342       gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<hr>",0,0,0);
02343       break;
02344     }
02345       else
02346     {
02347           strip_html(buff); /*better safe than sorry */
02348           strcpy(buff2, buff);
02349 
02350           token = strtok(buff2,":");
02351 
02352           if(token && (strcmp(buff,token) != 0))
02353         {
02354           /* not happy with this if statement at all! */
02355           if(((strlen(token)==3)&&isdigit((int)token[1])&&isdigit(token[2]))
02356          || ((strlen(token)==2) && isdigit((int)token[1])))
02357             {
02358                 /* we must have time stamps */
02359           /* allready have hours */
02360           token = strtok(NULL,":"); /*minutes*/
02361           if(token == NULL) /* we were wrong, this isn't a time stamp */
02362             {
02363               break; /* need to test this */
02364             }
02365           token = strtok(NULL,":"); /*seconds + name*/
02366 
02367           if(token == NULL) /* we were wrong, this isn't a time stamp */
02368             break; /* need to test this */
02369           buff3 = token + strlen(token)+1; /* should be the end
02370                               of the screen name */
02371           token+=3;
02372             }
02373           else
02374         {
02375           /* no time stamps */
02376           buff3 = buff2+strlen(token)+1;
02377           token++;
02378         }
02379           if( !strncmp(token,cw->contact->nick,strlen(cw->contact->nick)))
02380             {
02381                 /* this is the other person */
02382 
02383           strcpy(color,"#ff0000");
02384         }
02385           else
02386         {
02387           /* must be me */
02388           strcpy(color,"#0000ff");
02389         }
02390           strncpy(name,buff,buff3-buff2);
02391           name[buff3-buff2] = '\0';
02392           g_snprintf(buff, BUF_SIZE, "<FONT COLOR=\"%s\"><B>%s </B></FONT>",color, name);
02393           gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff,0,0,0);
02394           gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), buff3,0,0,0);
02395           gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0);
02396         }
02397       else
02398         {
02399           /* hmm, no ':' must be a non start/blank line */
02400           gtk_eb_html_add(EXT_GTK_TEXT(cw->chat),buff2,0,0,0);
02401           gtk_eb_html_add(EXT_GTK_TEXT(cw->chat), "<br>",0,0,0);
02402         }
02403     }
02404     }
02405   fclose(fp);
02406 
02407 }

void send_message GtkWidget *    widget,
gpointer    d
 

Definition at line 395 of file chat_window.c.

References local_account::alias, _chat_window::away_msg_sent, BUF_SIZE, can_offline_message(), _chat_window::chat, local_account::connected, _chat_window::contact, convert_eol(), DBG_CORE, eb_debug, eb_log_message(), eb_smilify(), eb_update_window_title(), _chat_window::entry, EXT_GTK_TEXT, find_suitable_local_account(), find_suitable_remote_account(), _chat_window::fp, GET_CHAT_WINDOW, gtk_eb_html_add(), _chat_window::hist_pos, _chat_window::history, linkify(), _chat_window::local_user, _chat_window::notebook, _chat_window::notebook_child, outgoing_message_filters, _chat_window::perfered, play_sound(), RUN_SERVICE, SEND, _chat_window::send_enabled, contact::send_offline, serv_touch_idle(), account::service_id, local_account::service_id, set_tab_normal(), _chat_window::sound_enabled, and _chat_window::this_msg_in_history.

Referenced by chat_key_press(), console_session_get_command(), eb_chat_window_display_remote_message(), eb_chat_window_new(), handle_click(), and pounce_contact().

00396 {
00397   chat_window * data = (chat_window*)d;
00398   gchar buff[BUF_SIZE];
00399   gchar buff2[BUF_SIZE];
00400   gchar * text, *o_text;
00401   gchar * link_message;
00402   gchar * temp_message;
00403   struct tm * cur_time;
00404   time_t t;
00405 
00406   GList * filter_walk;
00407 
00408 #ifdef HAVE_ICONV_H
00409   /* 'BUF_SIZE*2' e.g. for 'Latin-x' to 'UTF-8',
00410      which is 1-byte to 2-byte recoding */
00411   char recode_buff[BUF_SIZE*2 + 1];
00412 #endif
00413   GET_CHAT_WINDOW(data);
00414 
00415   /*determine what is the best account to send to*/
00416   data->perfered= find_suitable_remote_account(data->perfered, data->contact);
00417   
00418 
00419   if(!data->perfered)
00420     {
00421       /*Eventually this will need to become a dialog box that pops up*/
00422 
00423       if(data->contact->send_offline && can_offline_message(data->contact))
00424     {
00425       data->perfered = can_offline_message(data->contact);
00426     }
00427       else
00428     {
00429       gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<hr>", 0,0,0);
00430       gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<b>Cannot send message - user is offline.</b>", 0, 0, 0);
00431       gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<hr>", 0,0,0);
00432       return;
00433     }
00434     }
00435 
00436   if(data->local_user && data->local_user->service_id != data->perfered->service_id)
00437     {
00438       data->local_user = NULL;
00439     }
00440 
00441   if(data->local_user && !data->local_user->connected)
00442     {
00443       data->local_user = NULL;
00444     }
00445 
00446   /*determine what is the best local account to use*/
00447 
00448   if(!data->local_user)
00449   {
00450     data->local_user =
00451                 find_suitable_local_account(data->local_user, data->perfered->service_id); 
00452   }
00453 
00454   if(!data->local_user) {
00455     return;
00456   }
00457 
00458   eb_update_window_title(data, FALSE);
00459 
00460   text = gtk_editable_get_chars(GTK_EDITABLE (data->entry), 0, -1);
00461 
00462   if(strlen(text) == 0)
00463     return;
00464 
00465   if(data->this_msg_in_history)
00466   {
00467     GList * node=NULL;
00468     GList * node2=NULL;
00469 
00470     for(node=data->history; node!=NULL ; node=node->next)
00471     {
00472       node2=node;
00473     }
00474     free(node2->data);
00475     node2->data=strdup(text);
00476     data->this_msg_in_history=0;
00477   } else {
00478     data->history=g_list_append(data->history, strdup(text));
00479     data->hist_pos=NULL;
00480   }
00481 
00482   temp_message = eb_smilify(strdup(text), RUN_SERVICE(data->local_user)->get_smileys());
00483   link_message = linkify(temp_message);
00484   g_free(temp_message);
00485 
00486   eb_update_window_title(data, FALSE);
00487 
00488   // Outbound filters here - Meredydd
00489   filter_walk=outgoing_message_filters;
00490 
00491   eb_debug(DBG_CORE, "Starting to run outgoing filters\n");
00492 
00493   while(filter_walk!=NULL)
00494   {
00495     gchar * (*ifilter)(eb_local_account *, eb_account *, struct contact *, gchar *);
00496 
00497     eb_debug(DBG_CORE, "Running an outgoing filter\n");
00498 
00499     ifilter=(gchar *(*)(eb_local_account *, eb_account *, struct contact *, gchar *))filter_walk->data;
00500 
00501     text=ifilter(data->local_user, data->perfered, data->contact, text);
00502     
00503     if(text==NULL) { return; } // Urgh, no cleanup, but it does it on strlen(text)==0 too
00504 
00505     filter_walk=g_list_next(filter_walk);
00506   }
00507 
00508   eb_debug(DBG_CORE, "Finished outgoing filters\n");
00509 
00510   // end outbound filters
00511   
00512   o_text = text;
00513   text = convert_eol(text);
00514   g_free(o_text);
00515   
00516 #ifdef HAVE_ICONV_H
00517     if(!eb_services[data->perfered->service_id].can_iconvert)
00518         {
00519         RUN_SERVICE(data->local_user)->send_im(
00520                             data->local_user,
00521                             data->perfered,
00522                             text);
00523         }
00524         else
00525         {
00526         RUN_SERVICE(data->local_user)->send_im(
00527                             data->local_user,
00528                             data->perfered,
00529                      recode_if_needed(text, recode_buff, RECODE_TO_REMOTE) );
00530         }
00531   /* seems like variable 'text' is not used any more down
00532      the function, so we don't have to assign it (BTW it's freed in the end)*/
00533 #else
00534   RUN_SERVICE(data->local_user)->send_im(
00535                      data->local_user,
00536                      data->perfered,
00537                      text);
00538 #endif
00539   serv_touch_idle();
00540 
00541   if(data->sound_enabled && data->send_enabled)
00542     play_sound(SEND);
00543 
00544   if (do_convo_timestamp)
00545     {
00546       time(&t);
00547       cur_time = localtime(&t);
00548       g_snprintf(buff2, BUF_SIZE, "%d:%.2d:%.2d %s", cur_time->tm_hour,
00549          cur_time->tm_min, cur_time->tm_sec,
00550          data->local_user->alias);
00551     }
00552   else
00553     {
00554       g_snprintf(buff2, BUF_SIZE, "%s", data->local_user->alias);
00555     }
00556 
00557   g_snprintf(buff, BUF_SIZE, "<FONT COLOR=\"#0000ff\"><B>%s: </B></FONT>", buff2);
00558 
00559   gtk_eb_html_add(EXT_GTK_TEXT(data->chat), buff, 1, 0, 0);
00560   gtk_eb_html_add(EXT_GTK_TEXT(data->chat), link_message, do_ignore_back, do_ignore_fore, do_ignore_font);
00561   gtk_eb_html_add(EXT_GTK_TEXT(data->chat), "<br>", 0, 0, 0);
00562 
00563   /* If an away message had been sent to this person, reset the away message tracker */
00564   /* It's probably faster to just do the assignment all the time--the test
00565      is there for code clarity. */
00566 
00567   if (data->away_msg_sent)
00568     {
00569       data->away_msg_sent = FALSE;
00570     }
00571 
00572   /* Log the message */
00573 
00574   if(do_logging) eb_log_message(data->fp, buff, link_message);
00575 
00576   gtk_editable_delete_text(GTK_EDITABLE (data->entry), 0, -1);
00577   g_free(link_message);
00578   g_free(text);
00579 
00580 
00581   /* if using tabs, then turn off the chat icon */
00582   if (data->notebook != NULL) {
00583     /* no more icons in the tabs */
00584     /* gtk_widget_hide(data->talk_pixmap); */
00585     /* printf("chat icon is off... \n"); */
00586     set_tab_normal(GTK_NOTEBOOK(data->notebook), data->notebook_child);
00587   }
00588 }


Variable Documentation

GList* incoming_message_filters
 

Definition at line 110 of file chat_window.h.

Referenced by eb_chat_window_display_remote_message().

GList* outgoing_message_filters
 

Definition at line 109 of file chat_window.h.

Referenced by send_message().


Contact: Andy Maloney     [Documentation generated by doxygen]