Mercurial > pidgin
diff src/log.c @ 4184:af2eeb7f7cf8
[gaim-migrate @ 4415]
Moves most of the logging functions into their own file, log.c.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Fri, 03 Jan 2003 07:53:15 +0000 |
parents | |
children | 17187504bfc2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/log.c Fri Jan 03 07:53:15 2003 +0000 @@ -0,0 +1,452 @@ +/* --------------------------------------------------- + * Function to remove a log file entry + * --------------------------------------------------- + */ +#include "gaim.h" +#include "core.h" +#include "multi.h" +#include "prpl.h" +#include <sys/stat.h> + +void rm_log(struct log_conversation *a) +{ + struct conversation *cnv = find_conversation(a->name); + + log_conversations = g_list_remove(log_conversations, a); + + save_prefs(); + + if (cnv && !(im_options & OPT_IM_ONE_WINDOW)) + set_convo_title(cnv); +} + +struct log_conversation *find_log_info(const char *name) +{ + char *pname = g_malloc(BUF_LEN); + GList *lc = log_conversations; + struct log_conversation *l; + + + strcpy(pname, normalize(name)); + + while (lc) { + l = (struct log_conversation *)lc->data; + if (!g_strcasecmp(pname, normalize(l->name))) { + g_free(pname); + return l; + } + lc = lc->next; + } + g_free(pname); + return NULL; +} + +void update_log_convs() +{ + GSList *C = connections; + struct gaim_connection *g; + GSList *bcs; + GList *cnv = conversations; + struct conversation *c; + + while (cnv) { + c = (struct conversation *)cnv->data; + if (c->log_button) { + if (c->is_chat) + gtk_widget_set_sensitive(GTK_WIDGET(c->log_button), + ((logging_options & OPT_LOG_CHATS)) ? FALSE : TRUE); + else + gtk_widget_set_sensitive(GTK_WIDGET(c->log_button), + ((logging_options & OPT_LOG_CONVOS)) ? FALSE : TRUE); + } + + cnv = cnv->next; + } + + while (C) { + g = (struct gaim_connection *)C->data; + bcs = g->buddy_chats; + while (bcs) { + c = (struct conversation *)bcs->data; + if (c->log_button) { + if (c->is_chat) + gtk_widget_set_sensitive(GTK_WIDGET(c->log_button), + ((logging_options & OPT_LOG_CHATS)) ? FALSE : + TRUE); + else + gtk_widget_set_sensitive(GTK_WIDGET(c->log_button), + ((logging_options & OPT_LOG_CONVOS)) ? FALSE : + TRUE); + } + + bcs = bcs->next; + } + C = C->next; + } +} + +static void do_save_convo(GtkObject *obj, GtkWidget *wid) +{ + struct conversation *c = gtk_object_get_user_data(obj); + const char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid)); + FILE *f; + if (file_is_dir(filename, wid)) + return; + if (!((!c->is_chat && g_list_find(conversations, c)) || + (c->is_chat && g_slist_find(connections, c->gc) && g_slist_find(c->gc->buddy_chats, c)))) + filename = NULL; + gtk_widget_destroy(wid); + if (!filename) + return; + f = fopen(filename, "w+"); + if (!f) + return; + fprintf(f, "%s", c->history->str); + fclose(f); +} + + +void save_convo(GtkWidget *save, struct conversation *c) +{ + char buf[BUF_LONG]; + GtkWidget *window = gtk_file_selection_new(_("Gaim - Save Conversation")); + g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S "%s.log", gaim_home_dir(), normalize(c->name)); + gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); + gtk_object_set_user_data(GTK_OBJECT(GTK_FILE_SELECTION(window)->ok_button), c); + g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(window)->ok_button), + "clicked", G_CALLBACK(do_save_convo), window); + g_signal_connect_swapped(GTK_OBJECT(GTK_FILE_SELECTION(window)->cancel_button), + "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer)window); + gtk_widget_show(window); +} + +char *html_logize(char *p) +{ + char *temp_p = p; + char *buffer_p; + char *buffer_start; + int num_cr = 0; + int char_len = 0; + + while (*temp_p != '\0') { + char_len++; + if ((*temp_p == '\n') || ((*temp_p == '<') && (*(temp_p + 1) == '!'))) + num_cr++; + ++temp_p; + } + + temp_p = p; + buffer_p = g_malloc(char_len + (4 * num_cr) + 1); + buffer_start = buffer_p; + + while (*temp_p != '\0') { + if (*temp_p == '\n') { + *buffer_p++ = '<'; + *buffer_p++ = 'B'; + *buffer_p++ = 'R'; + *buffer_p++ = '>'; + *buffer_p++ = '\n'; + } else if ((*temp_p == '<') && (*(temp_p + 1) == '!')) { + *buffer_p++ = '&'; + *buffer_p++ = 'l'; + *buffer_p++ = 't'; + *buffer_p++ = ';'; + } else + *buffer_p++ = *temp_p; + ++temp_p; + } + *buffer_p = '\0'; + + return buffer_start; +} + +static FILE *open_gaim_log_file(const char *name, int *flag) +{ + char *buf; + char *buf2; + char log_all_file[256]; + struct stat st; + FILE *fd; +#ifndef _WIN32 + int res; +#endif + gchar *gaim_dir; + + buf = g_malloc(BUF_LONG); + buf2 = g_malloc(BUF_LONG); + gaim_dir = gaim_user_dir(); + + /* Dont log yourself */ + strncpy(log_all_file, gaim_dir, 256); + +#ifndef _WIN32 + stat(log_all_file, &st); + if (!S_ISDIR(st.st_mode)) + unlink(log_all_file); + + fd = fopen(log_all_file, "r"); + + if (!fd) { + res = mkdir(log_all_file, S_IRUSR | S_IWUSR | S_IXUSR); + if (res < 0) { + g_snprintf(buf, BUF_LONG, _("Unable to make directory %s for logging"), + log_all_file); + do_error_dialog(buf, NULL, GAIM_ERROR); + g_free(buf); + g_free(buf2); + return NULL; + } + } else + fclose(fd); + + g_snprintf(log_all_file, 256, "%s" G_DIR_SEPARATOR_S "logs", gaim_dir); + + if (stat(log_all_file, &st) < 0) + *flag = 1; + if (!S_ISDIR(st.st_mode)) + unlink(log_all_file); + + fd = fopen(log_all_file, "r"); + if (!fd) { + res = mkdir(log_all_file, S_IRUSR | S_IWUSR | S_IXUSR); + if (res < 0) { + g_snprintf(buf, BUF_LONG, _("Unable to make directory %s for logging"), + log_all_file); + do_error_dialog(buf, NULL, GAIM_ERROR); + g_free(buf); + g_free(buf2); + return NULL; + } + } else + fclose(fd); +#else /* _WIN32 */ + g_snprintf(log_all_file, 256, "%s" G_DIR_SEPARATOR_S "logs", gaim_dir); + + if( _mkdir(log_all_file) < 0 && errno != EEXIST ) { + g_snprintf(buf, BUF_LONG, _("Unable to make directory %s for logging"), log_all_file); + do_error_dialog(buf, NULL, GAIM_ERROR); + g_free(buf); + g_free(buf2); + return NULL; + } +#endif + + g_snprintf(log_all_file, 256, "%s" G_DIR_SEPARATOR_S "logs" G_DIR_SEPARATOR_S "%s", gaim_dir, name); + if (stat(log_all_file, &st) < 0) + *flag = 1; + + debug_printf("Logging to: \"%s\"\n", log_all_file); + + fd = fopen(log_all_file, "a"); + + g_free(buf); + g_free(buf2); + return fd; +} + +static FILE *open_system_log_file(char *name) +{ + int x; + + if (name) + return open_log_file(name, 2); + else + return open_gaim_log_file("system", &x); +} + +FILE *open_log_file(const char *name, int is_chat) +{ + struct stat st; + char realname[256]; + struct log_conversation *l; + FILE *fd; + int flag = 0; + + if (((is_chat == 2) && !(logging_options & OPT_LOG_INDIVIDUAL)) + || ((is_chat == 1) && !(logging_options & OPT_LOG_CHATS)) + || ((is_chat == 0) && !(logging_options & OPT_LOG_CONVOS))) { + + l = find_log_info(name); + if (!l) + return NULL; + + if (stat(l->filename, &st) < 0) + flag = 1; + + fd = fopen(l->filename, "a"); + + if (flag) { /* is a new file */ + if (logging_options & OPT_LOG_STRIP_HTML) { + fprintf(fd, _("IM Sessions with %s\n"), name); + } else { + fprintf(fd, "<HTML><HEAD><TITLE>"); + fprintf(fd, _("IM Sessions with %s"), name); + fprintf(fd, "</TITLE></HEAD><BODY BGCOLOR=\"ffffff\">\n"); + } + } + + return fd; + } + + g_snprintf(realname, sizeof(realname), "%s.log", normalize(name)); + fd = open_gaim_log_file(realname, &flag); + + if (fd && flag) { /* is a new file */ + if (logging_options & OPT_LOG_STRIP_HTML) { + fprintf(fd, _("IM Sessions with %s\n"), name); + } else { + fprintf(fd, "<HTML><HEAD><TITLE>"); + fprintf(fd, _("IM Sessions with %s"), name); + fprintf(fd, "</TITLE></HEAD><BODY BGCOLOR=\"ffffff\">\n"); + } + } + + return fd; +} + +void system_log(enum log_event what, struct gaim_connection *gc, + struct buddy *who, int why) +{ + FILE *fd; + char text[256], html[256]; + + if ((logging_options & why) != why) + return; + + if (logging_options & OPT_LOG_INDIVIDUAL) { + if (why & OPT_LOG_MY_SIGNON) + fd = open_system_log_file(gc ? gc->username : NULL); + else + fd = open_system_log_file(who->name); + } else + fd = open_system_log_file(NULL); + + if (!fd) + return; + + if (why & OPT_LOG_MY_SIGNON) { + switch (what) { + case log_signon: + g_snprintf(text, sizeof(text), "+++ %s (%s) signed on @ %s", + gc->username, gc->prpl->name, full_date()); + g_snprintf(html, sizeof(html), "<B>%s</B>", text); + break; + case log_signoff: + g_snprintf(text, sizeof(text), "+++ %s (%s) signed off @ %s", + gc->username, gc->prpl->name, full_date()); + g_snprintf(html, sizeof(html), "<I><FONT COLOR=GRAY>%s</FONT></I>", text); + break; + case log_away: + g_snprintf(text, sizeof(text), "+++ %s (%s) changed away state @ %s", + gc->username, gc->prpl->name, full_date()); + g_snprintf(html, sizeof(html), "<FONT COLOR=OLIVE>%s</FONT>", text); + break; + case log_back: + g_snprintf(text, sizeof(text), "+++ %s (%s) came back @ %s", + gc->username, gc->prpl->name, full_date()); + g_snprintf(html, sizeof(html), "%s", text); + break; + case log_idle: + g_snprintf(text, sizeof(text), "+++ %s (%s) became idle @ %s", + gc->username, gc->prpl->name, full_date()); + g_snprintf(html, sizeof(html), "<FONT COLOR=GRAY>%s</FONT>", text); + break; + case log_unidle: + g_snprintf(text, sizeof(text), "+++ %s (%s) returned from idle @ %s", + gc->username, gc->prpl->name, full_date()); + g_snprintf(html, sizeof(html), "%s", text); + break; + case log_quit: + g_snprintf(text, sizeof(text), "+++ Program exit @ %s", full_date()); + g_snprintf(html, sizeof(html), "<I><FONT COLOR=GRAY>%s</FONT></I>", text); + break; + } + } else if (strcmp(who->name, who->show)) { + switch (what) { + case log_signon: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) signed on @ %s", + gc->username, gc->prpl->name, who->show, who->name, full_date()); + g_snprintf(html, sizeof(html), "<B>%s</B>", text); + break; + case log_signoff: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) signed off @ %s", + gc->username, gc->prpl->name, who->show, who->name, full_date()); + g_snprintf(html, sizeof(html), "<I><FONT COLOR=GRAY>%s</FONT></I>", text); + break; + case log_away: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) went away @ %s", + gc->username, gc->prpl->name, who->show, who->name, full_date()); + g_snprintf(html, sizeof(html), "<FONT COLOR=OLIVE>%s</FONT>", text); + break; + case log_back: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) came back @ %s", + gc->username, gc->prpl->name, who->show, who->name, full_date()); + g_snprintf(html, sizeof(html), "%s", text); + break; + case log_idle: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s (%s) became idle @ %s", + gc->username, gc->prpl->name, who->show, who->name, full_date()); + g_snprintf(html, sizeof(html), "<FONT COLOR=GRAY>%s</FONT>", text); + break; + case log_unidle: + g_snprintf(text, sizeof(text), + "%s (%s) reported that %s (%s) returned from idle @ %s", gc->username, + gc->prpl->name, who->show, who->name, full_date()); + g_snprintf(html, sizeof(html), "%s", text); + break; + default: + fclose(fd); + return; + break; + } + } else { + switch (what) { + case log_signon: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s signed on @ %s", + gc->username, gc->prpl->name, who->name, full_date()); + g_snprintf(html, sizeof(html), "<B>%s</B>", text); + break; + case log_signoff: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s signed off @ %s", + gc->username, gc->prpl->name, who->name, full_date()); + g_snprintf(html, sizeof(html), "<I><FONT COLOR=GRAY>%s</FONT></I>", text); + break; + case log_away: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s went away @ %s", + gc->username, gc->prpl->name, who->name, full_date()); + g_snprintf(html, sizeof(html), "<FONT COLOR=OLIVE>%s</FONT>", text); + break; + case log_back: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s came back @ %s", + gc->username, gc->prpl->name, who->name, full_date()); + g_snprintf(html, sizeof(html), "%s", text); + break; + case log_idle: + g_snprintf(text, sizeof(text), "%s (%s) reported that %s became idle @ %s", + gc->username, gc->prpl->name, who->name, full_date()); + g_snprintf(html, sizeof(html), "<FONT COLOR=GRAY>%s</FONT>", text); + break; + case log_unidle: + g_snprintf(text, sizeof(text), + "%s (%s) reported that %s returned from idle @ %s", gc->username, + gc->prpl->name, who->name, full_date()); + g_snprintf(html, sizeof(html), "%s", text); + break; + default: + fclose(fd); + return; + break; + } + } + + if (logging_options & OPT_LOG_STRIP_HTML) { + fprintf(fd, "---- %s ----\n", text); + } else { + if (logging_options & OPT_LOG_INDIVIDUAL) + fprintf(fd, "<HR>%s<BR><HR><BR>\n", html); + else + fprintf(fd, "%s<BR>\n", html); + } + + fclose(fd); +}